Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

remoteproc: imx_rproc: Simplify IMX_RPROC_SMC switch case

Introduce imx_rproc_arm_smc_{start, stop, detect_mode}() helper functions
for all i.MX variants using IMX_RPROC_SMC to manage remote processors.

This allows the removal of the IMX_RPROC_SMC switch-case blocks from
imx_rproc_start(), imx_rproc_stop(), and imx_rproc_detect_mode(), resulting
in cleaner and more maintainable code.

Since this is the last switch in imx_rproc_{start,stop}{}, remove
the switch-case.

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-5-10386685b8a9@nxp.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>

authored by

Peng Fan and committed by
Mathieu Poirier
ecadd767 b7ea858a

+43 -26
+43 -26
drivers/remoteproc/imx_rproc.c
··· 285 285 { 0x80000000, 0x80000000, 0x60000000, 0 }, 286 286 }; 287 287 288 + static int imx_rproc_arm_smc_start(struct rproc *rproc) 289 + { 290 + struct arm_smccc_res res; 291 + 292 + arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_START, 0, 0, 0, 0, 0, 0, &res); 293 + 294 + return res.a0; 295 + } 296 + 288 297 static int imx_rproc_mmio_start(struct rproc *rproc) 289 298 { 290 299 struct imx_rproc *priv = rproc->priv; ··· 317 308 struct imx_rproc *priv = rproc->priv; 318 309 const struct imx_rproc_dcfg *dcfg = priv->dcfg; 319 310 struct device *dev = priv->dev; 320 - struct arm_smccc_res res; 321 311 int ret; 322 312 323 313 ret = imx_rproc_xtr_mbox_init(rproc, true); ··· 328 320 goto start_ret; 329 321 } 330 322 331 - switch (dcfg->method) { 332 - case IMX_RPROC_SMC: 333 - arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_START, 0, 0, 0, 0, 0, 0, &res); 334 - ret = res.a0; 335 - break; 336 - default: 337 - return -EOPNOTSUPP; 338 - } 323 + return -EOPNOTSUPP; 339 324 340 325 start_ret: 341 326 if (ret) 342 327 dev_err(dev, "Failed to enable remote core!\n"); 343 328 344 329 return ret; 330 + } 331 + 332 + static int imx_rproc_arm_smc_stop(struct rproc *rproc) 333 + { 334 + struct imx_rproc *priv = rproc->priv; 335 + struct arm_smccc_res res; 336 + 337 + arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_STOP, 0, 0, 0, 0, 0, 0, &res); 338 + if (res.a1) 339 + dev_info(priv->dev, "Not in wfi, force stopped\n"); 340 + 341 + return res.a0; 345 342 } 346 343 347 344 static int imx_rproc_mmio_stop(struct rproc *rproc) ··· 378 365 struct imx_rproc *priv = rproc->priv; 379 366 const struct imx_rproc_dcfg *dcfg = priv->dcfg; 380 367 struct device *dev = priv->dev; 381 - struct arm_smccc_res res; 382 368 int ret; 383 369 384 370 if (dcfg->ops && dcfg->ops->stop) { ··· 385 373 goto stop_ret; 386 374 } 387 375 388 - switch (dcfg->method) { 389 - case IMX_RPROC_SMC: 390 - arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_STOP, 0, 0, 0, 0, 0, 0, &res); 391 - ret = res.a0; 392 - if (res.a1) 393 - dev_info(dev, "Not in wfi, force stopped\n"); 394 - break; 395 - default: 396 - return -EOPNOTSUPP; 397 - } 376 + return -EOPNOTSUPP; 398 377 399 378 stop_ret: 400 379 if (ret) ··· 870 867 return 0; 871 868 } 872 869 870 + static int imx_rproc_arm_smc_detect_mode(struct rproc *rproc) 871 + { 872 + struct imx_rproc *priv = rproc->priv; 873 + struct arm_smccc_res res; 874 + 875 + arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_STARTED, 0, 0, 0, 0, 0, 0, &res); 876 + if (res.a0) 877 + priv->rproc->state = RPROC_DETACHED; 878 + 879 + return 0; 880 + } 881 + 873 882 static int imx_rproc_mmio_detect_mode(struct rproc *rproc) 874 883 { 875 884 const struct regmap_config config = { .name = "imx-rproc" }; ··· 996 981 static int imx_rproc_detect_mode(struct imx_rproc *priv) 997 982 { 998 983 const struct imx_rproc_dcfg *dcfg = priv->dcfg; 999 - struct arm_smccc_res res; 1000 984 1001 985 if (dcfg->ops && dcfg->ops->detect_mode) 1002 986 return dcfg->ops->detect_mode(priv->rproc); ··· 1003 989 switch (dcfg->method) { 1004 990 case IMX_RPROC_NONE: 1005 991 priv->rproc->state = RPROC_DETACHED; 1006 - return 0; 1007 - case IMX_RPROC_SMC: 1008 - arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_STARTED, 0, 0, 0, 0, 0, 0, &res); 1009 - if (res.a0) 1010 - priv->rproc->state = RPROC_DETACHED; 1011 992 return 0; 1012 993 default: 1013 994 break; ··· 1179 1170 destroy_workqueue(priv->workqueue); 1180 1171 } 1181 1172 1173 + static const struct imx_rproc_plat_ops imx_rproc_ops_arm_smc = { 1174 + .start = imx_rproc_arm_smc_start, 1175 + .stop = imx_rproc_arm_smc_stop, 1176 + .detect_mode = imx_rproc_arm_smc_detect_mode, 1177 + }; 1178 + 1182 1179 static const struct imx_rproc_plat_ops imx_rproc_ops_mmio = { 1183 1180 .start = imx_rproc_mmio_start, 1184 1181 .stop = imx_rproc_mmio_stop, ··· 1214 1199 .att = imx_rproc_att_imx8mn, 1215 1200 .att_size = ARRAY_SIZE(imx_rproc_att_imx8mn), 1216 1201 .method = IMX_RPROC_SMC, 1202 + .ops = &imx_rproc_ops_arm_smc, 1217 1203 }; 1218 1204 1219 1205 static const struct imx_rproc_dcfg imx_rproc_cfg_imx8mq = { ··· 1281 1265 .att = imx_rproc_att_imx93, 1282 1266 .att_size = ARRAY_SIZE(imx_rproc_att_imx93), 1283 1267 .method = IMX_RPROC_SMC, 1268 + .ops = &imx_rproc_ops_arm_smc, 1284 1269 }; 1285 1270 1286 1271 static const struct of_device_id imx_rproc_of_match[] = {