| From: Stefan Potyra <Stefan.Potyra@elektrobit.com> |
| Date: Wed, 2 May 2018 10:55:31 +0200 |
| Subject: w1: mxc_w1: Enable clock before calling clk_get_rate() on it |
| |
| commit 955bc61328dc0a297fb3baccd84e9d3aee501ed8 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: a5fd9139f74c ("w1: add 1-wire master driver for i.MX27 / i.MX31") |
| Signed-off-by: Stefan Potyra <Stefan.Potyra@elektrobit.com> |
| Acked-by: Evgeniy Polyakov <zbr@ioremap.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/w1/masters/mxc_w1.c | 20 +++++++++++++------- |
| 1 file changed, 13 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/w1/masters/mxc_w1.c |
| +++ b/drivers/w1/masters/mxc_w1.c |
| @@ -111,6 +111,10 @@ static int mxc_w1_probe(struct platform_ |
| if (IS_ERR(mdev->clk)) |
| return PTR_ERR(mdev->clk); |
| |
| + err = clk_prepare_enable(mdev->clk); |
| + if (err) |
| + return err; |
| + |
| clkrate = clk_get_rate(mdev->clk); |
| if (clkrate < 10000000) |
| dev_warn(&pdev->dev, |
| @@ -124,12 +128,10 @@ static int mxc_w1_probe(struct platform_ |
| |
| res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| mdev->regs = devm_ioremap_resource(&pdev->dev, res); |
| - if (IS_ERR(mdev->regs)) |
| - return PTR_ERR(mdev->regs); |
| - |
| - err = clk_prepare_enable(mdev->clk); |
| - if (err) |
| - return err; |
| + if (IS_ERR(mdev->regs)) { |
| + err = PTR_ERR(mdev->regs); |
| + goto out_disable_clk; |
| + } |
| |
| writeb(clkdiv - 1, mdev->regs + MXC_W1_TIME_DIVIDER); |
| |
| @@ -141,8 +143,12 @@ static int mxc_w1_probe(struct platform_ |
| |
| err = w1_add_master_device(&mdev->bus_master); |
| if (err) |
| - clk_disable_unprepare(mdev->clk); |
| + goto out_disable_clk; |
| + |
| + return 0; |
| |
| +out_disable_clk: |
| + clk_disable_unprepare(mdev->clk); |
| return err; |
| } |
| |