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....@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


Reply via email to