Skip to content

Commit fcc14c9

Browse files
tinghan-shenmathieupoirier
authored andcommitted
remoteproc: mediatek: Revise SCP rproc initialization flow for multi-core SCP
This is the 2nd preliminary step for probing multi-core SCP. Initialization of configuration and L1TCM registers is extracted to only performed once on multi-core SCP. The rest of remoteproc initialization procedure is similar for both single and multi-core SCP and is applied to each core. Signed-off-by: Tinghan Shen <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Tested-by: AngeloGioacchino Del Regno <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent 9ea1666 commit fcc14c9

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

drivers/remoteproc/mtk_scp.c

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -854,21 +854,17 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
854854
}
855855
}
856856

857-
static int scp_probe(struct platform_device *pdev)
857+
static int scp_rproc_init(struct platform_device *pdev,
858+
struct mtk_scp_of_cluster *scp_cluster)
858859
{
859860
struct device *dev = &pdev->dev;
860861
struct device_node *np = dev->of_node;
861862
struct mtk_scp *scp;
862-
struct mtk_scp_of_cluster *scp_cluster;
863863
struct rproc *rproc;
864864
struct resource *res;
865865
const char *fw_name = "scp.img";
866866
int ret, i;
867867

868-
scp_cluster = devm_kzalloc(dev, sizeof(*scp_cluster), GFP_KERNEL);
869-
if (!scp_cluster)
870-
return -ENOMEM;
871-
872868
ret = rproc_of_parse_firmware(dev, 0, &fw_name);
873869
if (ret < 0 && ret != -EINVAL)
874870
return ret;
@@ -893,24 +889,6 @@ static int scp_probe(struct platform_device *pdev)
893889
scp->sram_size = resource_size(res);
894890
scp->sram_phys = res->start;
895891

896-
/* l1tcm is an optional memory region */
897-
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
898-
scp->cluster->l1tcm_base = devm_ioremap_resource(dev, res);
899-
if (IS_ERR(scp->cluster->l1tcm_base)) {
900-
ret = PTR_ERR(scp->cluster->l1tcm_base);
901-
if (ret != -EINVAL) {
902-
return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
903-
}
904-
} else {
905-
scp->cluster->l1tcm_size = resource_size(res);
906-
scp->cluster->l1tcm_phys = res->start;
907-
}
908-
909-
scp->cluster->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
910-
if (IS_ERR(scp->cluster->reg_base))
911-
return dev_err_probe(dev, PTR_ERR(scp->cluster->reg_base),
912-
"Failed to parse and map cfg memory\n");
913-
914892
ret = scp->data->scp_clk_get(scp);
915893
if (ret)
916894
return ret;
@@ -962,6 +940,43 @@ static int scp_probe(struct platform_device *pdev)
962940
return ret;
963941
}
964942

943+
static int scp_probe(struct platform_device *pdev)
944+
{
945+
struct device *dev = &pdev->dev;
946+
struct mtk_scp_of_cluster *scp_cluster;
947+
struct resource *res;
948+
int ret;
949+
950+
scp_cluster = devm_kzalloc(dev, sizeof(*scp_cluster), GFP_KERNEL);
951+
if (!scp_cluster)
952+
return -ENOMEM;
953+
954+
scp_cluster->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
955+
if (IS_ERR(scp_cluster->reg_base))
956+
return dev_err_probe(dev, PTR_ERR(scp_cluster->reg_base),
957+
"Failed to parse and map cfg memory\n");
958+
959+
/* l1tcm is an optional memory region */
960+
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
961+
scp_cluster->l1tcm_base = devm_ioremap_resource(dev, res);
962+
if (IS_ERR(scp_cluster->l1tcm_base)) {
963+
ret = PTR_ERR(scp_cluster->l1tcm_base);
964+
if (ret != -EINVAL)
965+
return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
966+
967+
scp_cluster->l1tcm_base = NULL;
968+
} else {
969+
scp_cluster->l1tcm_size = resource_size(res);
970+
scp_cluster->l1tcm_phys = res->start;
971+
}
972+
973+
ret = scp_rproc_init(pdev, scp_cluster);
974+
if (ret)
975+
return ret;
976+
977+
return 0;
978+
}
979+
965980
static void scp_remove(struct platform_device *pdev)
966981
{
967982
struct mtk_scp *scp = platform_get_drvdata(pdev);

0 commit comments

Comments
 (0)