diff options
| -rw-r--r-- | drivers/remoteproc/imx_rproc.c | 15 | ||||
| -rw-r--r-- | drivers/remoteproc/imx_rproc.h | 7 |
2 files changed, 22 insertions, 0 deletions
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index a6eef0080ca9..5cdc5045e575 100644 --- a/drivers/remoteproc/imx_rproc.c +++ b/drivers/remoteproc/imx_rproc.c @@ -376,6 +376,11 @@ static int imx_rproc_start(struct rproc *rproc) if (ret) return ret; + if (dcfg->ops && dcfg->ops->start) { + ret = dcfg->ops->start(rproc); + goto start_ret; + } + switch (dcfg->method) { case IMX_RPROC_MMIO: if (priv->gpr) { @@ -398,6 +403,7 @@ static int imx_rproc_start(struct rproc *rproc) return -EOPNOTSUPP; } +start_ret: if (ret) dev_err(dev, "Failed to enable remote core!\n"); @@ -412,6 +418,11 @@ static int imx_rproc_stop(struct rproc *rproc) struct arm_smccc_res res; int ret; + if (dcfg->ops && dcfg->ops->stop) { + ret = dcfg->ops->stop(rproc); + goto stop_ret; + } + switch (dcfg->method) { case IMX_RPROC_MMIO: if (priv->gpr) { @@ -440,6 +451,7 @@ static int imx_rproc_stop(struct rproc *rproc) return -EOPNOTSUPP; } +stop_ret: if (ret) dev_err(dev, "Failed to stop remote core\n"); else @@ -933,6 +945,9 @@ static int imx_rproc_detect_mode(struct imx_rproc *priv) u32 val; u8 pt; + if (dcfg->ops && dcfg->ops->detect_mode) + return dcfg->ops->detect_mode(priv->rproc); + switch (dcfg->method) { case IMX_RPROC_NONE: priv->rproc->state = RPROC_DETACHED; diff --git a/drivers/remoteproc/imx_rproc.h b/drivers/remoteproc/imx_rproc.h index cfd38d37e146..3a9adaaf048b 100644 --- a/drivers/remoteproc/imx_rproc.h +++ b/drivers/remoteproc/imx_rproc.h @@ -31,6 +31,12 @@ enum imx_rproc_method { /* dcfg flags */ #define IMX_RPROC_NEED_SYSTEM_OFF BIT(0) +struct imx_rproc_plat_ops { + int (*start)(struct rproc *rproc); + int (*stop)(struct rproc *rproc); + int (*detect_mode)(struct rproc *rproc); +}; + struct imx_rproc_dcfg { u32 src_reg; u32 src_mask; @@ -42,6 +48,7 @@ struct imx_rproc_dcfg { size_t att_size; enum imx_rproc_method method; u32 flags; + const struct imx_rproc_plat_ops *ops; }; #endif /* _IMX_RPROC_H */ |
