diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2012-03-15 15:12:38 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-15 20:41:28 -0700 |
commit | 3d1a984fed3b70b11a358b56faf32219e093479d (patch) | |
tree | 4b48ed4504eac463eaa9289ae7f9f781b9520e74 /drivers/spi | |
parent | ce8ac37e4e3384b4eb8b54f0d1e76da5780c77fa (diff) |
spi: tegra: Make sure SCLK frequency to be in minimum require value.
Making sure that SCLK frequency should be maintain on minimum
require value during spi transfer. This is require to proper
functioning of spi controller.
bug 949393
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/89526
Cherry-picked from commit
7d83f658b39b2ab1a5105eec7649246fddea7325
Change-Id: I60fa0fef98e5f2882c646c29e1773194deddd6da
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/90296
Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-tegra.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c index a5c916663217..6810f611c55c 100644 --- a/drivers/spi/spi-tegra.c +++ b/drivers/spi/spi-tegra.c @@ -178,6 +178,7 @@ struct spi_tegra_data { char port_name[32]; struct clk *clk; + struct clk *sclk; void __iomem *base; phys_addr_t phys; unsigned irq; @@ -1267,13 +1268,20 @@ static int __init spi_tegra_probe(struct platform_device *pdev) goto fail_irq_req; } - tspi->clk = clk_get(&pdev->dev, NULL); + tspi->clk = clk_get(&pdev->dev, "spi"); if (IS_ERR(tspi->clk)) { dev_err(&pdev->dev, "can not get clock\n"); ret = PTR_ERR(tspi->clk); goto fail_clk_get; } + tspi->sclk = clk_get(&pdev->dev, "sclk"); + if (IS_ERR(tspi->sclk)) { + dev_err(&pdev->dev, "can not get sclock\n"); + ret = PTR_ERR(tspi->sclk); + goto fail_sclk_get; + } + INIT_LIST_HEAD(&tspi->queue); if (pdata) { @@ -1434,6 +1442,9 @@ fail_rx_buf_alloc: tegra_dma_free_channel(tspi->rx_dma); fail_rx_dma_alloc: pm_runtime_disable(&pdev->dev); + clk_put(tspi->sclk); +fail_sclk_get: + clk_put(tspi->clk); fail_clk_get: free_irq(tspi->irq, tspi); fail_irq_req: @@ -1472,6 +1483,7 @@ static int __devexit spi_tegra_remove(struct platform_device *pdev) } pm_runtime_disable(&pdev->dev); + clk_put(tspi->sclk); clk_put(tspi->clk); iounmap(tspi->base); @@ -1588,6 +1600,7 @@ static int tegra_spi_runtime_idle(struct device *dev) tspi = spi_master_get_devdata(master); clk_disable(tspi->clk); + clk_disable(tspi->sclk); return 0; } @@ -1598,6 +1611,7 @@ static int tegra_spi_runtime_resume(struct device *dev) master = dev_get_drvdata(dev); tspi = spi_master_get_devdata(master); + clk_enable(tspi->sclk); clk_enable(tspi->clk); return 0; } |