remoteproc: imx_rproc: Introduce start/stop/detect_mode ops for imx_rproc_dcfg

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>
This commit is contained in:
Peng Fan 2025-09-10 15:11:45 +08:00 committed by Mathieu Poirier
parent 2433961962
commit ff24e5b26d
2 changed files with 22 additions and 0 deletions

View 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;

View 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 */