diff options
author | Stefan Potyra <Stefan.Potyra@elektrobit.com> | 2018-05-02 04:55:31 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-05-14 10:32:00 -0400 |
commit | 955bc61328dc0a297fb3baccd84e9d3aee501ed8 (patch) | |
tree | bd102bfd117485fe861ff3d0f9aeee93d35dcf00 | |
parent | bd23a7269834dc7c1f93e83535d16ebc44b75eba (diff) |
w1: mxc_w1: Enable clock before calling clk_get_rate() on it
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>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/w1/masters/mxc_w1.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/w1/masters/mxc_w1.c b/drivers/w1/masters/mxc_w1.c index 74f2e6e6202a..8851d441e5fd 100644 --- a/drivers/w1/masters/mxc_w1.c +++ b/drivers/w1/masters/mxc_w1.c | |||
@@ -112,6 +112,10 @@ static int mxc_w1_probe(struct platform_device *pdev) | |||
112 | if (IS_ERR(mdev->clk)) | 112 | if (IS_ERR(mdev->clk)) |
113 | return PTR_ERR(mdev->clk); | 113 | return PTR_ERR(mdev->clk); |
114 | 114 | ||
115 | err = clk_prepare_enable(mdev->clk); | ||
116 | if (err) | ||
117 | return err; | ||
118 | |||
115 | clkrate = clk_get_rate(mdev->clk); | 119 | clkrate = clk_get_rate(mdev->clk); |
116 | if (clkrate < 10000000) | 120 | if (clkrate < 10000000) |
117 | dev_warn(&pdev->dev, | 121 | dev_warn(&pdev->dev, |
@@ -125,12 +129,10 @@ static int mxc_w1_probe(struct platform_device *pdev) | |||
125 | 129 | ||
126 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 130 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
127 | mdev->regs = devm_ioremap_resource(&pdev->dev, res); | 131 | mdev->regs = devm_ioremap_resource(&pdev->dev, res); |
128 | if (IS_ERR(mdev->regs)) | 132 | if (IS_ERR(mdev->regs)) { |
129 | return PTR_ERR(mdev->regs); | 133 | err = PTR_ERR(mdev->regs); |
130 | 134 | goto out_disable_clk; | |
131 | err = clk_prepare_enable(mdev->clk); | 135 | } |
132 | if (err) | ||
133 | return err; | ||
134 | 136 | ||
135 | /* Software reset 1-Wire module */ | 137 | /* Software reset 1-Wire module */ |
136 | writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET); | 138 | writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET); |
@@ -146,8 +148,12 @@ static int mxc_w1_probe(struct platform_device *pdev) | |||
146 | 148 | ||
147 | err = w1_add_master_device(&mdev->bus_master); | 149 | err = w1_add_master_device(&mdev->bus_master); |
148 | if (err) | 150 | if (err) |
149 | clk_disable_unprepare(mdev->clk); | 151 | goto out_disable_clk; |
150 | 152 | ||
153 | return 0; | ||
154 | |||
155 | out_disable_clk: | ||
156 | clk_disable_unprepare(mdev->clk); | ||
151 | return err; | 157 | return err; |
152 | } | 158 | } |
153 | 159 | ||