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...@nxp.com> > platform-specific behavior. > > No functional changes. > > Signed-off-by: Peng Fan <peng....@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 >