diff options
author | Leilk Liu <leilk.liu@mediatek.com> | 2015-08-31 09:18:57 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-08-31 10:26:50 -0400 |
commit | adcbcfea15d62fab5ba40ac28f9d2a590cc5e5e8 (patch) | |
tree | 5c9d4db20afeb1b95bc03efb49ba3237c4023bcd /drivers/spi/spi-mt65xx.c | |
parent | ca9f26a27949ba3b295e4f0841c0bec9ef440141 (diff) |
spi: mediatek: fix spi clock usage error
spi clock manages flow:
CLK_TOP_SYSPLL3_D2 ---> CLK_TOP_SPI_SEL ---> CLK_PERI_SPI0
(source clock) (clock mux) (clock gate)
spi driver should choose source clock by clock mux, then enable
clock gate.
Signed-off-by: Leilk Liu <leilk.liu@mediatek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-mt65xx.c')
-rw-r--r-- | drivers/spi/spi-mt65xx.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index b609b1cbdcba..6fbb5e5132b0 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c | |||
@@ -85,7 +85,7 @@ struct mtk_spi { | |||
85 | void __iomem *base; | 85 | void __iomem *base; |
86 | u32 state; | 86 | u32 state; |
87 | u32 pad_sel; | 87 | u32 pad_sel; |
88 | struct clk *spi_clk, *parent_clk; | 88 | struct clk *parent_clk, *sel_clk, *spi_clk; |
89 | struct spi_transfer *cur_transfer; | 89 | struct spi_transfer *cur_transfer; |
90 | u32 xfer_len; | 90 | u32 xfer_len; |
91 | struct scatterlist *tx_sgl, *rx_sgl; | 91 | struct scatterlist *tx_sgl, *rx_sgl; |
@@ -576,17 +576,24 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
576 | goto err_put_master; | 576 | goto err_put_master; |
577 | } | 577 | } |
578 | 578 | ||
579 | mdata->spi_clk = devm_clk_get(&pdev->dev, "spi-clk"); | 579 | mdata->parent_clk = devm_clk_get(&pdev->dev, "parent-clk"); |
580 | if (IS_ERR(mdata->spi_clk)) { | 580 | if (IS_ERR(mdata->parent_clk)) { |
581 | ret = PTR_ERR(mdata->parent_clk); | ||
582 | dev_err(&pdev->dev, "failed to get parent-clk: %d\n", ret); | ||
583 | goto err_put_master; | ||
584 | } | ||
585 | |||
586 | mdata->sel_clk = devm_clk_get(&pdev->dev, "sel-clk"); | ||
587 | if (IS_ERR(mdata->sel_clk)) { | ||
581 | ret = PTR_ERR(mdata->spi_clk); | 588 | ret = PTR_ERR(mdata->spi_clk); |
582 | dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret); | 589 | dev_err(&pdev->dev, "failed to get sel-clk: %d\n", ret); |
583 | goto err_put_master; | 590 | goto err_put_master; |
584 | } | 591 | } |
585 | 592 | ||
586 | mdata->parent_clk = devm_clk_get(&pdev->dev, "parent-clk"); | 593 | mdata->spi_clk = devm_clk_get(&pdev->dev, "spi-clk"); |
587 | if (IS_ERR(mdata->parent_clk)) { | 594 | if (IS_ERR(mdata->spi_clk)) { |
588 | ret = PTR_ERR(mdata->parent_clk); | 595 | ret = PTR_ERR(mdata->parent_clk); |
589 | dev_err(&pdev->dev, "failed to get parent-clk: %d\n", ret); | 596 | dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret); |
590 | goto err_put_master; | 597 | goto err_put_master; |
591 | } | 598 | } |
592 | 599 | ||
@@ -596,7 +603,7 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
596 | goto err_put_master; | 603 | goto err_put_master; |
597 | } | 604 | } |
598 | 605 | ||
599 | ret = clk_set_parent(mdata->spi_clk, mdata->parent_clk); | 606 | ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); |
600 | if (ret < 0) { | 607 | if (ret < 0) { |
601 | dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); | 608 | dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); |
602 | goto err_disable_clk; | 609 | goto err_disable_clk; |