Simplify the logic in imx_rproc_start(), imx_rproc_stop() and
imx_rproc_detect_mode(), introduce start, stop and detect_mode ops for the
imx_rproc_dcfg structure. Allows each platform to provide its own
implementation of start/stop/detect_mode operations, and prepares to
eliminate the need for multiple switch-case statements.
Improves code readability and maintainability by encapsulating
platform-specific behavior.
No functional changes.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
drivers/remoteproc/imx_rproc.c | 15 +++++++++++++++
drivers/remoteproc/imx_rproc.h | 7 +++++++
2 files changed, 22 insertions(+)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index a6eef0080ca9e46efe60dcb3878b9efdbdc0f08e..5cdc5045e57566e817170ed3c708dad6108d2e46 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 cfd38d37e1467d1d9e6f89be146c0b53262b92a0..3a9adaaf048b396102feeb45488cd2ff125a807a 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 */
--
2.37.1
On Mon, Sep 08, 2025 at 09:07:34PM +0800, Peng Fan wrote: > Simplify the logic in imx_rproc_start(), imx_rproc_stop() and > imx_rproc_detect_mode(), introduce start, stop and detect_mode ops for the > imx_rproc_dcfg structure. Allows each platform to provide its own > implementation of start/stop/detect_mode operations, and prepares to > eliminate the need for multiple switch-case statements. > Nit: s/Allows/Allow s/prepares/prepare > Improves code readability and maintainability by encapsulating s/Improves/Improve Reviewed-by: Frank Li <Frank.Li@nxp.com> > platform-specific behavior. > > No functional changes. > > Signed-off-by: Peng Fan <peng.fan@nxp.com> > --- > drivers/remoteproc/imx_rproc.c | 15 +++++++++++++++ > drivers/remoteproc/imx_rproc.h | 7 +++++++ > 2 files changed, 22 insertions(+) > > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index a6eef0080ca9e46efe60dcb3878b9efdbdc0f08e..5cdc5045e57566e817170ed3c708dad6108d2e46 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 cfd38d37e1467d1d9e6f89be146c0b53262b92a0..3a9adaaf048b396102feeb45488cd2ff125a807a 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 */ > > -- > 2.37.1 >
© 2016 - 2025 Red Hat, Inc.