Commit eea07023 authored by Bjorn Andersson's avatar Bjorn Andersson

remoteproc: qcom: adsp: Allow defining GLINK edge

Introduce the GLINK subdev, which allows the definition of a GLINK edge
as child of a remoteproc.
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent f8ff9777
...@@ -83,6 +83,7 @@ config QCOM_ADSP_PIL ...@@ -83,6 +83,7 @@ config QCOM_ADSP_PIL
depends on OF && ARCH_QCOM depends on OF && ARCH_QCOM
depends on QCOM_SMEM depends on QCOM_SMEM
depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n) depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
select MFD_SYSCON select MFD_SYSCON
select QCOM_MDT_LOADER select QCOM_MDT_LOADER
select QCOM_RPROC_COMMON select QCOM_RPROC_COMMON
......
...@@ -71,6 +71,7 @@ struct qcom_adsp { ...@@ -71,6 +71,7 @@ struct qcom_adsp {
void *mem_region; void *mem_region;
size_t mem_size; size_t mem_size;
struct qcom_rproc_glink glink_subdev;
struct qcom_rproc_subdev smd_subdev; struct qcom_rproc_subdev smd_subdev;
}; };
...@@ -401,6 +402,7 @@ static int adsp_probe(struct platform_device *pdev) ...@@ -401,6 +402,7 @@ static int adsp_probe(struct platform_device *pdev)
goto free_rproc; goto free_rproc;
} }
qcom_add_glink_subdev(rproc, &adsp->glink_subdev);
qcom_add_smd_subdev(rproc, &adsp->smd_subdev); qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
ret = rproc_add(rproc); ret = rproc_add(rproc);
...@@ -422,6 +424,7 @@ static int adsp_remove(struct platform_device *pdev) ...@@ -422,6 +424,7 @@ static int adsp_remove(struct platform_device *pdev)
qcom_smem_state_put(adsp->state); qcom_smem_state_put(adsp->state);
rproc_del(adsp->rproc); rproc_del(adsp->rproc);
qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev); qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
rproc_free(adsp->rproc); rproc_free(adsp->rproc);
......
...@@ -19,11 +19,13 @@ ...@@ -19,11 +19,13 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/remoteproc.h> #include <linux/remoteproc.h>
#include <linux/rpmsg/qcom_glink.h>
#include <linux/rpmsg/qcom_smd.h> #include <linux/rpmsg/qcom_smd.h>
#include "remoteproc_internal.h" #include "remoteproc_internal.h"
#include "qcom_common.h" #include "qcom_common.h"
#define to_glink_subdev(d) container_of(d, struct qcom_rproc_glink, subdev)
#define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev) #define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev)
/** /**
...@@ -45,6 +47,53 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc, ...@@ -45,6 +47,53 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
} }
EXPORT_SYMBOL_GPL(qcom_mdt_find_rsc_table); EXPORT_SYMBOL_GPL(qcom_mdt_find_rsc_table);
static int glink_subdev_probe(struct rproc_subdev *subdev)
{
struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
glink->edge = qcom_glink_smem_register(glink->dev, glink->node);
return IS_ERR(glink->edge) ? PTR_ERR(glink->edge) : 0;
}
static void glink_subdev_remove(struct rproc_subdev *subdev)
{
struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
qcom_glink_smem_unregister(glink->edge);
glink->edge = NULL;
}
/**
* qcom_add_glink_subdev() - try to add a GLINK subdevice to rproc
* @rproc: rproc handle to parent the subdevice
* @glink: reference to a GLINK subdev context
*/
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
{
struct device *dev = &rproc->dev;
glink->node = of_get_child_by_name(dev->parent->of_node, "glink-edge");
if (!glink->node)
return;
glink->dev = dev;
rproc_add_subdev(rproc, &glink->subdev, glink_subdev_probe, glink_subdev_remove);
}
EXPORT_SYMBOL_GPL(qcom_add_glink_subdev);
/**
* qcom_remove_glink_subdev() - remove a GLINK subdevice from rproc
* @rproc: rproc handle
* @glink: reference to a GLINK subdev context
*/
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
{
rproc_remove_subdev(rproc, &glink->subdev);
of_node_put(glink->node);
}
EXPORT_SYMBOL_GPL(qcom_remove_glink_subdev);
static int smd_subdev_probe(struct rproc_subdev *subdev) static int smd_subdev_probe(struct rproc_subdev *subdev)
{ {
struct qcom_rproc_subdev *smd = to_smd_subdev(subdev); struct qcom_rproc_subdev *smd = to_smd_subdev(subdev);
......
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
#include <linux/remoteproc.h> #include <linux/remoteproc.h>
#include "remoteproc_internal.h" #include "remoteproc_internal.h"
struct qcom_rproc_glink {
struct rproc_subdev subdev;
struct device *dev;
struct device_node *node;
struct qcom_glink *edge;
};
struct qcom_rproc_subdev { struct qcom_rproc_subdev {
struct rproc_subdev subdev; struct rproc_subdev subdev;
...@@ -16,6 +24,9 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc, ...@@ -16,6 +24,9 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
const struct firmware *fw, const struct firmware *fw,
int *tablesz); int *tablesz);
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd); void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd); void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
......
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