diff options
author | Stefan Potyra <Stefan.Potyra@elektrobit.com> | 2018-04-26 09:28:02 +0200 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-04-26 12:41:22 +0100 |
commit | 0d7412ed1f5dc0858eb4f29650a8c9c5cce8b285 (patch) | |
tree | d075e8c26ade988fe75d33ff9528c4ac724feae1 /drivers/spi | |
parent | b6a4b39152b574af8e4264292fe8fa5368fa1d74 (diff) | |
download | linux-stable-0d7412ed1f5dc0858eb4f29650a8c9c5cce8b285.tar.gz linux-stable-0d7412ed1f5dc0858eb4f29650a8c9c5cce8b285.tar.bz2 linux-stable-0d7412ed1f5dc0858eb4f29650a8c9c5cce8b285.zip |
spi/bcm63xx-hspi: Enable the clock before calling clk_get_rate().
Enable the clock prior to calling clk_get_rate(), because clk_get_rate()
should only be called if the clock is enabled.
Additionally, prepare/enable the pll_clk before calling clk_get_rate()
for the same reason.
Found by Linux Driver Verification project (linuxtesting.org).
Fixes: 142168eba9dc ("spi: bcm63xx-hsspi: add bcm63xx HSSPI driver")
Signed-off-by: Stefan Potyra <Stefan.Potyra@elektrobit.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-bcm63xx-hsspi.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c index cbcba614b253..c23849f7aa7b 100644 --- a/drivers/spi/spi-bcm63xx-hsspi.c +++ b/drivers/spi/spi-bcm63xx-hsspi.c @@ -352,22 +352,31 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) if (IS_ERR(clk)) return PTR_ERR(clk); + ret = clk_prepare_enable(clk); + if (ret) + return ret; + rate = clk_get_rate(clk); if (!rate) { struct clk *pll_clk = devm_clk_get(dev, "pll"); - if (IS_ERR(pll_clk)) - return PTR_ERR(pll_clk); + if (IS_ERR(pll_clk)) { + ret = PTR_ERR(pll_clk); + goto out_disable_clk; + } + + ret = clk_prepare_enable(pll_clk); + if (ret) + goto out_disable_clk; rate = clk_get_rate(pll_clk); - if (!rate) - return -EINVAL; + clk_disable_unprepare(pll_clk); + if (!rate) { + ret = -EINVAL; + goto out_disable_clk; + } } - ret = clk_prepare_enable(clk); - if (ret) - return ret; - master = spi_alloc_master(&pdev->dev, sizeof(*bs)); if (!master) { ret = -ENOMEM; |