Commit e6ef46cb authored by Stefan Potyra's avatar Stefan Potyra Committed by Greg Kroah-Hartman

w1: mxc_w1: Enable clock before calling clk_get_rate() on it

commit 955bc613 upstream.

According to the API, you may only call clk_get_rate() after actually
enabling it.

Found by Linux Driver Verification project (linuxtesting.org).

Fixes: a5fd9139 ("w1: add 1-wire master driver for i.MX27 / i.MX31")
Signed-off-by: default avatarStefan Potyra <Stefan.Potyra@elektrobit.com>
Acked-by: default avatarEvgeniy Polyakov <zbr@ioremap.net>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0667483a
...@@ -112,6 +112,10 @@ static int mxc_w1_probe(struct platform_device *pdev) ...@@ -112,6 +112,10 @@ static int mxc_w1_probe(struct platform_device *pdev)
if (IS_ERR(mdev->clk)) if (IS_ERR(mdev->clk))
return PTR_ERR(mdev->clk); return PTR_ERR(mdev->clk);
err = clk_prepare_enable(mdev->clk);
if (err)
return err;
clkrate = clk_get_rate(mdev->clk); clkrate = clk_get_rate(mdev->clk);
if (clkrate < 10000000) if (clkrate < 10000000)
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
...@@ -125,12 +129,10 @@ static int mxc_w1_probe(struct platform_device *pdev) ...@@ -125,12 +129,10 @@ static int mxc_w1_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mdev->regs = devm_ioremap_resource(&pdev->dev, res); mdev->regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(mdev->regs)) if (IS_ERR(mdev->regs)) {
return PTR_ERR(mdev->regs); err = PTR_ERR(mdev->regs);
goto out_disable_clk;
err = clk_prepare_enable(mdev->clk); }
if (err)
return err;
/* Software reset 1-Wire module */ /* Software reset 1-Wire module */
writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET); writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET);
...@@ -146,8 +148,12 @@ static int mxc_w1_probe(struct platform_device *pdev) ...@@ -146,8 +148,12 @@ static int mxc_w1_probe(struct platform_device *pdev)
err = w1_add_master_device(&mdev->bus_master); err = w1_add_master_device(&mdev->bus_master);
if (err) if (err)
clk_disable_unprepare(mdev->clk); goto out_disable_clk;
return 0;
out_disable_clk:
clk_disable_unprepare(mdev->clk);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment