]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
remoteproc: imx_rproc: Introduce start/stop/detect_mode ops for imx_rproc_dcfg
authorPeng Fan <peng.fan@nxp.com>
Wed, 10 Sep 2025 07:11:45 +0000 (15:11 +0800)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Mon, 15 Sep 2025 16:03:02 +0000 (10:03 -0600)
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. Allow each platform to provide its own
implementation of start/stop/detect_mode operations, and prepare to
eliminate the need for multiple switch-case statements.

Improve code readability and maintainability by encapsulating
platform-specific behavior.

No functional changes.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/20250910-imx-rproc-cleanup-v2-1-10386685b8a9@nxp.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
drivers/remoteproc/imx_rproc.c
drivers/remoteproc/imx_rproc.h

index a6eef0080ca9e46efe60dcb3878b9efdbdc0f08e..5cdc5045e57566e817170ed3c708dad6108d2e46 100644 (file)
@@ -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;
index cfd38d37e1467d1d9e6f89be146c0b53262b92a0..3a9adaaf048b396102feeb45488cd2ff125a807a 100644 (file)
@@ -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 */