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_MMIO switch case

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

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

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

authored by

Peng Fan and committed by
Mathieu Poirier
e14168bf 11a8d3cb

+86 -62
+86 -62
drivers/remoteproc/imx_rproc.c
··· 285 285 { 0x80000000, 0x80000000, 0x60000000, 0 }, 286 286 }; 287 287 288 + static int imx_rproc_mmio_start(struct rproc *rproc) 289 + { 290 + struct imx_rproc *priv = rproc->priv; 291 + const struct imx_rproc_dcfg *dcfg = priv->dcfg; 292 + 293 + if (priv->gpr) 294 + return regmap_clear_bits(priv->gpr, dcfg->gpr_reg, dcfg->gpr_wait); 295 + 296 + return regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask, dcfg->src_start); 297 + } 298 + 288 299 static int imx_rproc_start(struct rproc *rproc) 289 300 { 290 301 struct imx_rproc *priv = rproc->priv; ··· 314 303 } 315 304 316 305 switch (dcfg->method) { 317 - case IMX_RPROC_MMIO: 318 - if (priv->gpr) { 319 - ret = regmap_clear_bits(priv->gpr, dcfg->gpr_reg, 320 - dcfg->gpr_wait); 321 - } else { 322 - ret = regmap_update_bits(priv->regmap, dcfg->src_reg, 323 - dcfg->src_mask, 324 - dcfg->src_start); 325 - } 326 - break; 327 306 case IMX_RPROC_SMC: 328 307 arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_START, 0, 0, 0, 0, 0, 0, &res); 329 308 ret = res.a0; ··· 332 331 return ret; 333 332 } 334 333 334 + static int imx_rproc_mmio_stop(struct rproc *rproc) 335 + { 336 + struct imx_rproc *priv = rproc->priv; 337 + const struct imx_rproc_dcfg *dcfg = priv->dcfg; 338 + int ret; 339 + 340 + if (priv->gpr) { 341 + ret = regmap_set_bits(priv->gpr, dcfg->gpr_reg, dcfg->gpr_wait); 342 + if (ret) { 343 + dev_err(priv->dev, "Failed to quiescence M4 platform!\n"); 344 + return ret; 345 + } 346 + } 347 + 348 + return regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask, dcfg->src_stop); 349 + } 350 + 335 351 static int imx_rproc_stop(struct rproc *rproc) 336 352 { 337 353 struct imx_rproc *priv = rproc->priv; ··· 363 345 } 364 346 365 347 switch (dcfg->method) { 366 - case IMX_RPROC_MMIO: 367 - if (priv->gpr) { 368 - ret = regmap_set_bits(priv->gpr, dcfg->gpr_reg, 369 - dcfg->gpr_wait); 370 - if (ret) { 371 - dev_err(priv->dev, 372 - "Failed to quiescence M4 platform!\n"); 373 - return ret; 374 - } 375 - } 376 - 377 - ret = regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask, 378 - dcfg->src_stop); 379 - break; 380 348 case IMX_RPROC_SMC: 381 349 arm_smccc_smc(IMX_SIP_RPROC, IMX_SIP_RPROC_STOP, 0, 0, 0, 0, 0, 0, &res); 382 350 ret = res.a0; ··· 859 855 return 0; 860 856 } 861 857 862 - static int imx_rproc_detect_mode(struct imx_rproc *priv) 858 + static int imx_rproc_mmio_detect_mode(struct rproc *rproc) 863 859 { 864 - struct regmap_config config = { .name = "imx-rproc" }; 860 + const struct regmap_config config = { .name = "imx-rproc" }; 861 + struct imx_rproc *priv = rproc->priv; 865 862 const struct imx_rproc_dcfg *dcfg = priv->dcfg; 866 863 struct device *dev = priv->dev; 867 864 struct regmap *regmap; 865 + u32 val; 866 + int ret; 867 + 868 + priv->gpr = syscon_regmap_lookup_by_phandle(dev->of_node, "fsl,iomuxc-gpr"); 869 + if (IS_ERR(priv->gpr)) 870 + priv->gpr = NULL; 871 + 872 + regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); 873 + if (IS_ERR(regmap)) { 874 + dev_err(dev, "failed to find syscon\n"); 875 + return PTR_ERR(regmap); 876 + } 877 + 878 + priv->regmap = regmap; 879 + regmap_attach_dev(dev, regmap, &config); 880 + 881 + if (priv->gpr) { 882 + ret = regmap_read(priv->gpr, dcfg->gpr_reg, &val); 883 + if (val & dcfg->gpr_wait) { 884 + /* 885 + * After cold boot, the CM indicates its in wait 886 + * state, but not fully powered off. Power it off 887 + * fully so firmware can be loaded into it. 888 + */ 889 + imx_rproc_stop(priv->rproc); 890 + return 0; 891 + } 892 + } 893 + 894 + ret = regmap_read(regmap, dcfg->src_reg, &val); 895 + if (ret) { 896 + dev_err(dev, "Failed to read src\n"); 897 + return ret; 898 + } 899 + 900 + if ((val & dcfg->src_mask) != dcfg->src_stop) 901 + priv->rproc->state = RPROC_DETACHED; 902 + 903 + return 0; 904 + } 905 + 906 + static int imx_rproc_detect_mode(struct imx_rproc *priv) 907 + { 908 + const struct imx_rproc_dcfg *dcfg = priv->dcfg; 909 + struct device *dev = priv->dev; 868 910 struct arm_smccc_res res; 869 911 int ret; 870 - u32 val; 871 912 u8 pt; 872 913 873 914 if (dcfg->ops && dcfg->ops->detect_mode) ··· 985 936 default: 986 937 break; 987 938 } 988 - 989 - priv->gpr = syscon_regmap_lookup_by_phandle(dev->of_node, "fsl,iomuxc-gpr"); 990 - if (IS_ERR(priv->gpr)) 991 - priv->gpr = NULL; 992 - 993 - regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon"); 994 - if (IS_ERR(regmap)) { 995 - dev_err(dev, "failed to find syscon\n"); 996 - return PTR_ERR(regmap); 997 - } 998 - 999 - priv->regmap = regmap; 1000 - regmap_attach_dev(dev, regmap, &config); 1001 - 1002 - if (priv->gpr) { 1003 - ret = regmap_read(priv->gpr, dcfg->gpr_reg, &val); 1004 - if (val & dcfg->gpr_wait) { 1005 - /* 1006 - * After cold boot, the CM indicates its in wait 1007 - * state, but not fully powered off. Power it off 1008 - * fully so firmware can be loaded into it. 1009 - */ 1010 - imx_rproc_stop(priv->rproc); 1011 - return 0; 1012 - } 1013 - } 1014 - 1015 - ret = regmap_read(regmap, dcfg->src_reg, &val); 1016 - if (ret) { 1017 - dev_err(dev, "Failed to read src\n"); 1018 - return ret; 1019 - } 1020 - 1021 - if ((val & dcfg->src_mask) != dcfg->src_stop) 1022 - priv->rproc->state = RPROC_DETACHED; 1023 939 1024 940 return 0; 1025 941 } ··· 1157 1143 destroy_workqueue(priv->workqueue); 1158 1144 } 1159 1145 1146 + static const struct imx_rproc_plat_ops imx_rproc_ops_mmio = { 1147 + .start = imx_rproc_mmio_start, 1148 + .stop = imx_rproc_mmio_stop, 1149 + .detect_mode = imx_rproc_mmio_detect_mode, 1150 + }; 1151 + 1160 1152 static const struct imx_rproc_dcfg imx_rproc_cfg_imx8mn_mmio = { 1161 1153 .src_reg = IMX7D_SRC_SCR, 1162 1154 .src_mask = IMX7D_M4_RST_MASK, ··· 1173 1153 .att = imx_rproc_att_imx8mn, 1174 1154 .att_size = ARRAY_SIZE(imx_rproc_att_imx8mn), 1175 1155 .method = IMX_RPROC_MMIO, 1156 + .ops = &imx_rproc_ops_mmio, 1176 1157 }; 1177 1158 1178 1159 static const struct imx_rproc_dcfg imx_rproc_cfg_imx8mn = { ··· 1190 1169 .att = imx_rproc_att_imx8mq, 1191 1170 .att_size = ARRAY_SIZE(imx_rproc_att_imx8mq), 1192 1171 .method = IMX_RPROC_MMIO, 1172 + .ops = &imx_rproc_ops_mmio, 1193 1173 }; 1194 1174 1195 1175 static const struct imx_rproc_dcfg imx_rproc_cfg_imx8qm = { ··· 1226 1204 .att = imx_rproc_att_imx7d, 1227 1205 .att_size = ARRAY_SIZE(imx_rproc_att_imx7d), 1228 1206 .method = IMX_RPROC_MMIO, 1207 + .ops = &imx_rproc_ops_mmio, 1229 1208 }; 1230 1209 1231 1210 static const struct imx_rproc_dcfg imx_rproc_cfg_imx6sx = { ··· 1237 1214 .att = imx_rproc_att_imx6sx, 1238 1215 .att_size = ARRAY_SIZE(imx_rproc_att_imx6sx), 1239 1216 .method = IMX_RPROC_MMIO, 1217 + .ops = &imx_rproc_ops_mmio, 1240 1218 }; 1241 1219 1242 1220 static const struct imx_rproc_dcfg imx_rproc_cfg_imx93 = {