spi: orion: Fix clock resource by adding an optional bus clock
On Armada 7K/8K we need to explicitly enable the bus clock. The bus clock is optional because not all the SoCs need them but at least for Armada 7K/8K it is actually mandatory. The binding documentation is updating accordingly as well as mentioning the mandatory clock which was also missing. Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
4fbd8d194f
commit
92ae112e47
2 changed files with 23 additions and 0 deletions
|
@ -18,8 +18,17 @@ Required properties:
|
||||||
The eight register sets following the control registers refer to
|
The eight register sets following the control registers refer to
|
||||||
chip-select lines 0 through 7 respectively.
|
chip-select lines 0 through 7 respectively.
|
||||||
- cell-index : Which of multiple SPI controllers is this.
|
- cell-index : Which of multiple SPI controllers is this.
|
||||||
|
- clocks : pointers to the reference clocks for this device, the first
|
||||||
|
one is the one used for the clock on the spi bus, the
|
||||||
|
second one is optional and is the clock used for the
|
||||||
|
functional part of the controller
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- interrupts : Is currently not used.
|
- interrupts : Is currently not used.
|
||||||
|
- clock-names : names of used clocks, mandatory if the second clock is
|
||||||
|
used, the name must be "core", and "axi" (the latter
|
||||||
|
is only for Armada 7K/8K).
|
||||||
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
spi@10600 {
|
spi@10600 {
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct orion_spi {
|
||||||
struct spi_master *master;
|
struct spi_master *master;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
|
struct clk *axi_clk;
|
||||||
const struct orion_spi_dev *devdata;
|
const struct orion_spi_dev *devdata;
|
||||||
|
|
||||||
struct orion_direct_acc direct_access[ORION_NUM_CHIPSELECTS];
|
struct orion_direct_acc direct_access[ORION_NUM_CHIPSELECTS];
|
||||||
|
@ -634,6 +635,14 @@ static int orion_spi_probe(struct platform_device *pdev)
|
||||||
if (status)
|
if (status)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* The following clock is only used by some SoCs */
|
||||||
|
spi->axi_clk = devm_clk_get(&pdev->dev, "axi");
|
||||||
|
if (IS_ERR(spi->axi_clk) &&
|
||||||
|
PTR_ERR(spi->axi_clk) == -EPROBE_DEFER)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
if (!IS_ERR(spi->axi_clk))
|
||||||
|
clk_prepare_enable(spi->axi_clk);
|
||||||
|
|
||||||
tclk_hz = clk_get_rate(spi->clk);
|
tclk_hz = clk_get_rate(spi->clk);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -725,6 +734,7 @@ static int orion_spi_probe(struct platform_device *pdev)
|
||||||
out_rel_pm:
|
out_rel_pm:
|
||||||
pm_runtime_disable(&pdev->dev);
|
pm_runtime_disable(&pdev->dev);
|
||||||
out_rel_clk:
|
out_rel_clk:
|
||||||
|
clk_disable_unprepare(spi->axi_clk);
|
||||||
clk_disable_unprepare(spi->clk);
|
clk_disable_unprepare(spi->clk);
|
||||||
out:
|
out:
|
||||||
spi_master_put(master);
|
spi_master_put(master);
|
||||||
|
@ -738,6 +748,7 @@ static int orion_spi_remove(struct platform_device *pdev)
|
||||||
struct orion_spi *spi = spi_master_get_devdata(master);
|
struct orion_spi *spi = spi_master_get_devdata(master);
|
||||||
|
|
||||||
pm_runtime_get_sync(&pdev->dev);
|
pm_runtime_get_sync(&pdev->dev);
|
||||||
|
clk_disable_unprepare(spi->axi_clk);
|
||||||
clk_disable_unprepare(spi->clk);
|
clk_disable_unprepare(spi->clk);
|
||||||
|
|
||||||
spi_unregister_master(master);
|
spi_unregister_master(master);
|
||||||
|
@ -754,6 +765,7 @@ static int orion_spi_runtime_suspend(struct device *dev)
|
||||||
struct spi_master *master = dev_get_drvdata(dev);
|
struct spi_master *master = dev_get_drvdata(dev);
|
||||||
struct orion_spi *spi = spi_master_get_devdata(master);
|
struct orion_spi *spi = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
clk_disable_unprepare(spi->axi_clk);
|
||||||
clk_disable_unprepare(spi->clk);
|
clk_disable_unprepare(spi->clk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -763,6 +775,8 @@ static int orion_spi_runtime_resume(struct device *dev)
|
||||||
struct spi_master *master = dev_get_drvdata(dev);
|
struct spi_master *master = dev_get_drvdata(dev);
|
||||||
struct orion_spi *spi = spi_master_get_devdata(master);
|
struct orion_spi *spi = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
if (!IS_ERR(spi->axi_clk))
|
||||||
|
clk_prepare_enable(spi->axi_clk);
|
||||||
return clk_prepare_enable(spi->clk);
|
return clk_prepare_enable(spi->clk);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue