lkml.org 
[lkml]   [2023]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v8 05/11] remoteproc: mediatek: Extract remoteproc initialization flow
    On Fri, Mar 03, 2023 at 04:33:49PM +0800, Tinghan Shen wrote:
    > This is the preparation for probing multi-core SCP. The remoteproc
    > initialization flow is similar on cores and is reuesd to avoid
    > redundant code.
    >
    > The registers of config and l1tcm are shared for multi-core
    > SCP. Reuse the mapped addresses for all cores.
    >
    > Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
    > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
    > ---
    > drivers/remoteproc/mtk_scp.c | 62 ++++++++++++++++++++++++------------
    > 1 file changed, 42 insertions(+), 20 deletions(-)
    >
    > diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
    > index a3b9bc158cd9..bdb5d87eeaa3 100644
    > --- a/drivers/remoteproc/mtk_scp.c
    > +++ b/drivers/remoteproc/mtk_scp.c
    > @@ -23,6 +23,13 @@
    > #define MAX_CODE_SIZE 0x500000
    > #define SECTION_NAME_IPI_BUFFER ".ipi_buffer"
    >
    > +struct mtk_scp_of_regs {
    > + void __iomem *reg_base;
    > + void __iomem *l1tcm_base;
    > + size_t l1tcm_size;
    > + phys_addr_t l1tcm_phys;
    > +};
    > +
    > /**
    > * scp_get() - get a reference to SCP.
    > *
    > @@ -855,7 +862,8 @@ 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_regs *of_regs)
    > {
    > struct device *dev = &pdev->dev;
    > struct device_node *np = dev->of_node;
    > @@ -879,6 +887,11 @@ static int scp_probe(struct platform_device *pdev)
    > scp->data = of_device_get_match_data(dev);
    > platform_set_drvdata(pdev, scp);
    >
    > + scp->reg_base = of_regs->reg_base;
    > + scp->l1tcm_base = of_regs->l1tcm_base;
    > + scp->l1tcm_size = of_regs->l1tcm_size;
    > + scp->l1tcm_phys = of_regs->l1tcm_phys;
    > +
    > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
    > scp->sram_base = devm_ioremap_resource(dev, res);
    > if (IS_ERR(scp->sram_base))
    > @@ -888,24 +901,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->l1tcm_base = devm_ioremap_resource(dev, res);
    > - if (IS_ERR(scp->l1tcm_base)) {
    > - ret = PTR_ERR(scp->l1tcm_base);
    > - if (ret != -EINVAL) {
    > - return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
    > - }
    > - } else {
    > - scp->l1tcm_size = resource_size(res);
    > - scp->l1tcm_phys = res->start;
    > - }
    > -
    > - scp->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
    > - if (IS_ERR(scp->reg_base))
    > - return dev_err_probe(dev, PTR_ERR(scp->reg_base),
    > - "Failed to parse and map cfg memory\n");
    > -
    > ret = scp->data->scp_clk_get(scp);
    > if (ret)
    > return ret;
    > @@ -933,7 +928,6 @@ static int scp_probe(struct platform_device *pdev)
    > ret = devm_request_threaded_irq(dev, platform_get_irq(pdev, 0), NULL,
    > scp_irq_handler, IRQF_ONESHOT,
    > pdev->name, scp);
    > -
    > if (ret) {
    > dev_err(dev, "failed to request irq\n");
    > goto remove_subdev;
    > @@ -957,6 +951,34 @@ static int scp_probe(struct platform_device *pdev)
    > return ret;
    > }
    >
    > +static int scp_probe(struct platform_device *pdev)
    > +{
    > + struct device *dev = &pdev->dev;
    > + struct resource *res;
    > + struct mtk_scp_of_regs scp_regs;
    > + int ret;
    > +

    struct device *dev = &pdev->dev;
    struct mtk_scp_of_regs scp_regs;
    struct resource *res;
    int ret;

    > + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
    > + scp_regs.reg_base = devm_ioremap_resource(dev, res);
    > + if (IS_ERR(scp_regs.reg_base))
    > + return dev_err_probe(dev, PTR_ERR(scp_regs.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_regs.l1tcm_base = devm_ioremap_resource(dev, res);
    > + if (IS_ERR(scp_regs.l1tcm_base)) {
    > + ret = PTR_ERR(scp_regs.l1tcm_base);
    > + if (ret != -EINVAL)
    > + return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
    > + } else {
    > + scp_regs.l1tcm_size = resource_size(res);
    > + scp_regs.l1tcm_phys = res->start;
    > + }
    > +
    > + return scp_rproc_init(pdev, &scp_regs);
    > +}
    > +
    > static int scp_remove(struct platform_device *pdev)
    > {
    > struct mtk_scp *scp = platform_get_drvdata(pdev);
    > --
    > 2.18.0
    >

    \
     
     \ /
      Last update: 2023-03-27 01:01    [W:4.168 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site