aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Potyra <Stefan.Potyra@elektrobit.com>2018-05-02 04:55:31 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-05-14 10:32:00 -0400
commit955bc61328dc0a297fb3baccd84e9d3aee501ed8 (patch)
treebd102bfd117485fe861ff3d0f9aeee93d35dcf00
parentbd23a7269834dc7c1f93e83535d16ebc44b75eba (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.c20
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
155out_disable_clk:
156 clk_disable_unprepare(mdev->clk);
151 return err; 157 return err;
152} 158}
153 159