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: Stephan Gerhold <stephan@gerhold.net> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Link: https://lore.kernel.org/r/20220228225400.146555-2-stephan@gerhold.net
This commit is contained in:
parent
358b586fb3
commit
59983c74fc
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue