Commit 59983c74 authored by Stephan Gerhold's avatar Stephan Gerhold Committed by Bjorn Andersson

remoteproc: qcom_q6v5_mss: Create platform device for BAM-DMUX

The modem remoteproc on older Qualcomm SoCs (e.g. MSM8916 and MSM8974)
implements the BAM-DMUX protocol to allow access to the network data
channels of the modem. The hardware/firmware resources required to
implement the BAM-DMUX driver are described in an extra node in the
device tree (with the compatible "qcom,bam-dmux").

This node logically belongs below the modem remoteproc, so that both
control interfaces (rpmsg_wwan_ctrl) and network interfaces (bam_dmux)
have a common parent.

Unlike other child devices of the modem remoteproc, the bam-dmux device
currently does not follow the state of the remoteproc (i.e. it is not
added/removed when the remoteproc is started/stopped). However, this is
an implementation detail of the bam_dmux driver in Linux that might
change in the future.

To be flexible for future changes, create a standard platform device
specifically only for "qcom,bam-dmux", rather than populating all child
nodes. This is also more consistent with the way the other child nodes
are handled in the driver.

Note: of_platform_device_create() and of_node_put() have NULL-checks
internally, so there is no need to check if the "qcom,bam-dmux" node
actually exists in the device tree.
Signed-off-by: default avatarStephan Gerhold <stephan@gerhold.net>
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220228225400.146555-2-stephan@gerhold.net
parent 358b586f
No related merge requests found
...@@ -218,6 +218,7 @@ struct q6v5 { ...@@ -218,6 +218,7 @@ struct q6v5 {
struct qcom_rproc_subdev smd_subdev; struct qcom_rproc_subdev smd_subdev;
struct qcom_rproc_ssr ssr_subdev; struct qcom_rproc_ssr ssr_subdev;
struct qcom_sysmon *sysmon; struct qcom_sysmon *sysmon;
struct platform_device *bam_dmux;
bool need_mem_protection; bool need_mem_protection;
bool has_alt_reset; bool has_alt_reset;
bool has_mba_logs; bool has_mba_logs;
...@@ -1849,6 +1850,7 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc) ...@@ -1849,6 +1850,7 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc)
static int q6v5_probe(struct platform_device *pdev) static int q6v5_probe(struct platform_device *pdev)
{ {
const struct rproc_hexagon_res *desc; const struct rproc_hexagon_res *desc;
struct device_node *node;
struct q6v5 *qproc; struct q6v5 *qproc;
struct rproc *rproc; struct rproc *rproc;
const char *mba_image; const char *mba_image;
...@@ -1992,6 +1994,10 @@ static int q6v5_probe(struct platform_device *pdev) ...@@ -1992,6 +1994,10 @@ static int q6v5_probe(struct platform_device *pdev)
if (ret) if (ret)
goto remove_sysmon_subdev; goto remove_sysmon_subdev;
node = of_get_compatible_child(pdev->dev.of_node, "qcom,bam-dmux");
qproc->bam_dmux = of_platform_device_create(node, NULL, &pdev->dev);
of_node_put(node);
return 0; return 0;
remove_sysmon_subdev: remove_sysmon_subdev:
...@@ -2013,6 +2019,8 @@ static int q6v5_remove(struct platform_device *pdev) ...@@ -2013,6 +2019,8 @@ static int q6v5_remove(struct platform_device *pdev)
struct q6v5 *qproc = platform_get_drvdata(pdev); struct q6v5 *qproc = platform_get_drvdata(pdev);
struct rproc *rproc = qproc->rproc; struct rproc *rproc = qproc->rproc;
if (qproc->bam_dmux)
of_platform_device_destroy(&qproc->bam_dmux->dev, NULL);
rproc_del(rproc); rproc_del(rproc);
qcom_q6v5_deinit(&qproc->q6v5); qcom_q6v5_deinit(&qproc->q6v5);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment