From a3cc38e65d9c45f7628535a4b7777d9956896fd4 Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Mon, 25 Apr 2022 16:49:08 +0800 Subject: [PATCH] spi: rockchip: Add sclk_in gate support Change-Id: If757c7e23f8e9791991a2e4e4eb769a8c3d56eeb Signed-off-by: Jon Lin --- drivers/spi/spi-rockchip.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index f744c64f1646..c62fe66d3c33 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -173,6 +173,7 @@ struct rockchip_spi { struct clk *spiclk; struct clk *apb_pclk; + struct clk *sclk_in; void __iomem *regs; dma_addr_t dma_addr_rx; @@ -800,6 +801,13 @@ static int rockchip_spi_probe(struct platform_device *pdev) goto err_put_ctlr; } + rs->sclk_in = devm_clk_get_optional(&pdev->dev, "sclk_in"); + if (IS_ERR(rs->sclk_in)) { + dev_err(&pdev->dev, "Failed to get sclk_in\n"); + ret = PTR_ERR(rs->sclk_in); + goto err_put_ctlr; + } + ret = clk_prepare_enable(rs->apb_pclk); if (ret < 0) { dev_err(&pdev->dev, "Failed to enable apb_pclk\n"); @@ -812,16 +820,22 @@ static int rockchip_spi_probe(struct platform_device *pdev) goto err_disable_apbclk; } + ret = clk_prepare_enable(rs->sclk_in); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to enable sclk_in\n"); + goto err_disable_spiclk; + } + spi_enable_chip(rs, false); ret = platform_get_irq(pdev, 0); if (ret < 0) - goto err_disable_spiclk; + goto err_disable_sclk_in; ret = devm_request_threaded_irq(&pdev->dev, ret, rockchip_spi_isr, NULL, IRQF_ONESHOT, dev_name(&pdev->dev), ctlr); if (ret) - goto err_disable_spiclk; + goto err_disable_sclk_in; rs->dev = &pdev->dev; rs->freq = clk_get_rate(rs->spiclk); @@ -847,7 +861,7 @@ static int rockchip_spi_probe(struct platform_device *pdev) if (!rs->fifo_len) { dev_err(&pdev->dev, "Failed to get fifo length\n"); ret = -EINVAL; - goto err_disable_spiclk; + goto err_disable_sclk_in; } pm_runtime_set_active(&pdev->dev); @@ -947,6 +961,8 @@ err_free_dma_tx: dma_release_channel(ctlr->dma_tx); err_disable_pm_runtime: pm_runtime_disable(&pdev->dev); +err_disable_sclk_in: + clk_disable_unprepare(rs->sclk_in); err_disable_spiclk: clk_disable_unprepare(rs->spiclk); err_disable_apbclk: @@ -964,6 +980,7 @@ static int rockchip_spi_remove(struct platform_device *pdev) pm_runtime_get_sync(&pdev->dev); + clk_disable_unprepare(rs->sclk_in); clk_disable_unprepare(rs->spiclk); clk_disable_unprepare(rs->apb_pclk);