Message ID | 20210803075922.11611-6-tinghan.shen@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Mediatek MT8195 SCP support | expand |
On Tue, Aug 03, 2021 at 03:59:22PM +0800, Tinghan Shen wrote: > The SCP clock design is changed on mt8195 that doesn't need to control > SCP clock on kernel side. > > Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com> > --- > drivers/remoteproc/mtk_common.h | 1 + > drivers/remoteproc/mtk_scp.c | 48 +++++++++++++++++++++++++++++---- > 2 files changed, 44 insertions(+), 5 deletions(-) > Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> > diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h > index 61901f5efa05..5ff3867c72f3 100644 > --- a/drivers/remoteproc/mtk_common.h > +++ b/drivers/remoteproc/mtk_common.h > @@ -72,6 +72,7 @@ struct scp_ipi_desc { > struct mtk_scp; > > struct mtk_scp_of_data { > + int (*scp_clk_get)(struct mtk_scp *scp); > int (*scp_before_load)(struct mtk_scp *scp); > void (*scp_irq_handler)(struct mtk_scp *scp); > void (*scp_reset_assert)(struct mtk_scp *scp); > diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c > index 9679cc26895e..36e48cf58ed6 100644 > --- a/drivers/remoteproc/mtk_scp.c > +++ b/drivers/remoteproc/mtk_scp.c > @@ -312,6 +312,32 @@ static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp, > return -ENOENT; > } > > +static int mt8183_scp_clk_get(struct mtk_scp *scp) > +{ > + struct device *dev = scp->dev; > + int ret = 0; > + > + scp->clk = devm_clk_get(dev, "main"); > + if (IS_ERR(scp->clk)) { > + dev_err(dev, "Failed to get clock\n"); > + ret = PTR_ERR(scp->clk); > + } > + > + return ret; > +} > + > +static int mt8192_scp_clk_get(struct mtk_scp *scp) > +{ > + return mt8183_scp_clk_get(scp); > +} > + > +static int mt8195_scp_clk_get(struct mtk_scp *scp) > +{ > + scp->clk = NULL; > + > + return 0; > +} > + > static int mt8183_scp_before_load(struct mtk_scp *scp) > { > /* Clear SCP to host interrupt */ > @@ -785,12 +811,9 @@ static int scp_probe(struct platform_device *pdev) > if (ret) > goto destroy_mutex; > > - scp->clk = devm_clk_get(dev, "main"); > - if (IS_ERR(scp->clk)) { > - dev_err(dev, "Failed to get clock\n"); > - ret = PTR_ERR(scp->clk); > + ret = scp->data->scp_clk_get(scp); > + if (ret) > goto release_dev_mem; > - } > > /* register SCP initialization IPI */ > ret = scp_ipi_register(scp, SCP_IPI_INIT, scp_init_ipi_handler, scp); > @@ -852,6 +875,7 @@ static int scp_remove(struct platform_device *pdev) > } > > static const struct mtk_scp_of_data mt8183_of_data = { > + .scp_clk_get = mt8183_scp_clk_get, > .scp_before_load = mt8183_scp_before_load, > .scp_irq_handler = mt8183_scp_irq_handler, > .scp_reset_assert = mt8183_scp_reset_assert, > @@ -864,6 +888,19 @@ static const struct mtk_scp_of_data mt8183_of_data = { > }; > > static const struct mtk_scp_of_data mt8192_of_data = { > + .scp_clk_get = mt8192_scp_clk_get, > + .scp_before_load = mt8192_scp_before_load, > + .scp_irq_handler = mt8192_scp_irq_handler, > + .scp_reset_assert = mt8192_scp_reset_assert, > + .scp_reset_deassert = mt8192_scp_reset_deassert, > + .scp_stop = mt8192_scp_stop, > + .scp_da_to_va = mt8192_scp_da_to_va, > + .host_to_scp_reg = MT8192_GIPC_IN_SET, > + .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT, > +}; > + > +static const struct mtk_scp_of_data mt8195_of_data = { > + .scp_clk_get = mt8195_scp_clk_get, > .scp_before_load = mt8192_scp_before_load, > .scp_irq_handler = mt8192_scp_irq_handler, > .scp_reset_assert = mt8192_scp_reset_assert, > @@ -877,6 +914,7 @@ static const struct mtk_scp_of_data mt8192_of_data = { > static const struct of_device_id mtk_scp_of_match[] = { > { .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data }, > { .compatible = "mediatek,mt8192-scp", .data = &mt8192_of_data }, > + { .compatible = "mediatek,mt8195-scp", .data = &mt8195_of_data }, > {}, > }; > MODULE_DEVICE_TABLE(of, mtk_scp_of_match); > -- > 2.18.0 >
diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h index 61901f5efa05..5ff3867c72f3 100644 --- a/drivers/remoteproc/mtk_common.h +++ b/drivers/remoteproc/mtk_common.h @@ -72,6 +72,7 @@ struct scp_ipi_desc { struct mtk_scp; struct mtk_scp_of_data { + int (*scp_clk_get)(struct mtk_scp *scp); int (*scp_before_load)(struct mtk_scp *scp); void (*scp_irq_handler)(struct mtk_scp *scp); void (*scp_reset_assert)(struct mtk_scp *scp); diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c index 9679cc26895e..36e48cf58ed6 100644 --- a/drivers/remoteproc/mtk_scp.c +++ b/drivers/remoteproc/mtk_scp.c @@ -312,6 +312,32 @@ static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp, return -ENOENT; } +static int mt8183_scp_clk_get(struct mtk_scp *scp) +{ + struct device *dev = scp->dev; + int ret = 0; + + scp->clk = devm_clk_get(dev, "main"); + if (IS_ERR(scp->clk)) { + dev_err(dev, "Failed to get clock\n"); + ret = PTR_ERR(scp->clk); + } + + return ret; +} + +static int mt8192_scp_clk_get(struct mtk_scp *scp) +{ + return mt8183_scp_clk_get(scp); +} + +static int mt8195_scp_clk_get(struct mtk_scp *scp) +{ + scp->clk = NULL; + + return 0; +} + static int mt8183_scp_before_load(struct mtk_scp *scp) { /* Clear SCP to host interrupt */ @@ -785,12 +811,9 @@ static int scp_probe(struct platform_device *pdev) if (ret) goto destroy_mutex; - scp->clk = devm_clk_get(dev, "main"); - if (IS_ERR(scp->clk)) { - dev_err(dev, "Failed to get clock\n"); - ret = PTR_ERR(scp->clk); + ret = scp->data->scp_clk_get(scp); + if (ret) goto release_dev_mem; - } /* register SCP initialization IPI */ ret = scp_ipi_register(scp, SCP_IPI_INIT, scp_init_ipi_handler, scp); @@ -852,6 +875,7 @@ static int scp_remove(struct platform_device *pdev) } static const struct mtk_scp_of_data mt8183_of_data = { + .scp_clk_get = mt8183_scp_clk_get, .scp_before_load = mt8183_scp_before_load, .scp_irq_handler = mt8183_scp_irq_handler, .scp_reset_assert = mt8183_scp_reset_assert, @@ -864,6 +888,19 @@ static const struct mtk_scp_of_data mt8183_of_data = { }; static const struct mtk_scp_of_data mt8192_of_data = { + .scp_clk_get = mt8192_scp_clk_get, + .scp_before_load = mt8192_scp_before_load, + .scp_irq_handler = mt8192_scp_irq_handler, + .scp_reset_assert = mt8192_scp_reset_assert, + .scp_reset_deassert = mt8192_scp_reset_deassert, + .scp_stop = mt8192_scp_stop, + .scp_da_to_va = mt8192_scp_da_to_va, + .host_to_scp_reg = MT8192_GIPC_IN_SET, + .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT, +}; + +static const struct mtk_scp_of_data mt8195_of_data = { + .scp_clk_get = mt8195_scp_clk_get, .scp_before_load = mt8192_scp_before_load, .scp_irq_handler = mt8192_scp_irq_handler, .scp_reset_assert = mt8192_scp_reset_assert, @@ -877,6 +914,7 @@ static const struct mtk_scp_of_data mt8192_of_data = { static const struct of_device_id mtk_scp_of_match[] = { { .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data }, { .compatible = "mediatek,mt8192-scp", .data = &mt8192_of_data }, + { .compatible = "mediatek,mt8195-scp", .data = &mt8195_of_data }, {}, }; MODULE_DEVICE_TABLE(of, mtk_scp_of_match);
The SCP clock design is changed on mt8195 that doesn't need to control SCP clock on kernel side. Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com> --- drivers/remoteproc/mtk_common.h | 1 + drivers/remoteproc/mtk_scp.c | 48 +++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 5 deletions(-)