mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
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 <tinghan.shen@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20230901080935.14571-7-tinghan.shen@mediatek.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
This commit is contained in:
parent
9ea166698f
commit
fcc14c9cd5
|
|
@ -854,21 +854,17 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
|
|||
}
|
||||
}
|
||||
|
||||
static int scp_probe(struct platform_device *pdev)
|
||||
static int scp_rproc_init(struct platform_device *pdev,
|
||||
struct mtk_scp_of_cluster *scp_cluster)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct mtk_scp *scp;
|
||||
struct mtk_scp_of_cluster *scp_cluster;
|
||||
struct rproc *rproc;
|
||||
struct resource *res;
|
||||
const char *fw_name = "scp.img";
|
||||
int ret, i;
|
||||
|
||||
scp_cluster = devm_kzalloc(dev, sizeof(*scp_cluster), GFP_KERNEL);
|
||||
if (!scp_cluster)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = rproc_of_parse_firmware(dev, 0, &fw_name);
|
||||
if (ret < 0 && ret != -EINVAL)
|
||||
return ret;
|
||||
|
|
@ -893,24 +889,6 @@ static int scp_probe(struct platform_device *pdev)
|
|||
scp->sram_size = resource_size(res);
|
||||
scp->sram_phys = res->start;
|
||||
|
||||
/* l1tcm is an optional memory region */
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
|
||||
scp->cluster->l1tcm_base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(scp->cluster->l1tcm_base)) {
|
||||
ret = PTR_ERR(scp->cluster->l1tcm_base);
|
||||
if (ret != -EINVAL) {
|
||||
return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
|
||||
}
|
||||
} else {
|
||||
scp->cluster->l1tcm_size = resource_size(res);
|
||||
scp->cluster->l1tcm_phys = res->start;
|
||||
}
|
||||
|
||||
scp->cluster->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
|
||||
if (IS_ERR(scp->cluster->reg_base))
|
||||
return dev_err_probe(dev, PTR_ERR(scp->cluster->reg_base),
|
||||
"Failed to parse and map cfg memory\n");
|
||||
|
||||
ret = scp->data->scp_clk_get(scp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -962,6 +940,43 @@ static int scp_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int scp_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct mtk_scp_of_cluster *scp_cluster;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
scp_cluster = devm_kzalloc(dev, sizeof(*scp_cluster), GFP_KERNEL);
|
||||
if (!scp_cluster)
|
||||
return -ENOMEM;
|
||||
|
||||
scp_cluster->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
|
||||
if (IS_ERR(scp_cluster->reg_base))
|
||||
return dev_err_probe(dev, PTR_ERR(scp_cluster->reg_base),
|
||||
"Failed to parse and map cfg memory\n");
|
||||
|
||||
/* l1tcm is an optional memory region */
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
|
||||
scp_cluster->l1tcm_base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(scp_cluster->l1tcm_base)) {
|
||||
ret = PTR_ERR(scp_cluster->l1tcm_base);
|
||||
if (ret != -EINVAL)
|
||||
return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
|
||||
|
||||
scp_cluster->l1tcm_base = NULL;
|
||||
} else {
|
||||
scp_cluster->l1tcm_size = resource_size(res);
|
||||
scp_cluster->l1tcm_phys = res->start;
|
||||
}
|
||||
|
||||
ret = scp_rproc_init(pdev, scp_cluster);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void scp_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_scp *scp = platform_get_drvdata(pdev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user