diff options
| author | Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> | 2018-12-07 06:10:15 -0500 |
|---|---|---|
| committer | Stephen Boyd <sboyd@kernel.org> | 2019-02-06 13:35:03 -0500 |
| commit | 8144e1e8cacf30b74e331120edc368270b0ec1c0 (patch) | |
| tree | 0c88627945c3b596f1ea7306a6a8c80864316a5d | |
| parent | 3eee6c7d119cd8563ad25898f94d6c1b514da548 (diff) | |
clk: clk-max77686: Clean clkdev lookup leak and use devm
clk-max77686 never clean clkdev lookup at remove. This can cause
oops if clk-max77686 is removed and inserted again. Fix leak by
using new devm clkdev lookup registration. Simplify also error
path by using new devm_of_clk_add_hw_provider.
Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
| -rw-r--r-- | drivers/clk/clk-max77686.c | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/drivers/clk/clk-max77686.c b/drivers/clk/clk-max77686.c index 22c937644c93..3727d5472450 100644 --- a/drivers/clk/clk-max77686.c +++ b/drivers/clk/clk-max77686.c | |||
| @@ -235,8 +235,9 @@ static int max77686_clk_probe(struct platform_device *pdev) | |||
| 235 | return ret; | 235 | return ret; |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | ret = clk_hw_register_clkdev(&max_clk_data->hw, | 238 | ret = devm_clk_hw_register_clkdev(dev, &max_clk_data->hw, |
| 239 | max_clk_data->clk_idata.name, NULL); | 239 | max_clk_data->clk_idata.name, |
| 240 | NULL); | ||
| 240 | if (ret < 0) { | 241 | if (ret < 0) { |
| 241 | dev_err(dev, "Failed to clkdev register: %d\n", ret); | 242 | dev_err(dev, "Failed to clkdev register: %d\n", ret); |
| 242 | return ret; | 243 | return ret; |
| @@ -244,8 +245,8 @@ static int max77686_clk_probe(struct platform_device *pdev) | |||
| 244 | } | 245 | } |
| 245 | 246 | ||
| 246 | if (parent->of_node) { | 247 | if (parent->of_node) { |
| 247 | ret = of_clk_add_hw_provider(parent->of_node, of_clk_max77686_get, | 248 | ret = devm_of_clk_add_hw_provider(dev, of_clk_max77686_get, |
| 248 | drv_data); | 249 | drv_data); |
| 249 | 250 | ||
| 250 | if (ret < 0) { | 251 | if (ret < 0) { |
| 251 | dev_err(dev, "Failed to register OF clock provider: %d\n", | 252 | dev_err(dev, "Failed to register OF clock provider: %d\n", |
| @@ -261,27 +262,11 @@ static int max77686_clk_probe(struct platform_device *pdev) | |||
| 261 | 1 << MAX77802_CLOCK_LOW_JITTER_SHIFT); | 262 | 1 << MAX77802_CLOCK_LOW_JITTER_SHIFT); |
| 262 | if (ret < 0) { | 263 | if (ret < 0) { |
| 263 | dev_err(dev, "Failed to config low-jitter: %d\n", ret); | 264 | dev_err(dev, "Failed to config low-jitter: %d\n", ret); |
| 264 | goto remove_of_clk_provider; | 265 | return ret; |
| 265 | } | 266 | } |
| 266 | } | 267 | } |
| 267 | 268 | ||
| 268 | return 0; | 269 | return 0; |
| 269 | |||
| 270 | remove_of_clk_provider: | ||
| 271 | if (parent->of_node) | ||
| 272 | of_clk_del_provider(parent->of_node); | ||
| 273 | |||
| 274 | return ret; | ||
| 275 | } | ||
| 276 | |||
| 277 | static int max77686_clk_remove(struct platform_device *pdev) | ||
| 278 | { | ||
| 279 | struct device *parent = pdev->dev.parent; | ||
| 280 | |||
| 281 | if (parent->of_node) | ||
| 282 | of_clk_del_provider(parent->of_node); | ||
| 283 | |||
| 284 | return 0; | ||
| 285 | } | 270 | } |
| 286 | 271 | ||
| 287 | static const struct platform_device_id max77686_clk_id[] = { | 272 | static const struct platform_device_id max77686_clk_id[] = { |
| @@ -297,7 +282,6 @@ static struct platform_driver max77686_clk_driver = { | |||
| 297 | .name = "max77686-clk", | 282 | .name = "max77686-clk", |
| 298 | }, | 283 | }, |
| 299 | .probe = max77686_clk_probe, | 284 | .probe = max77686_clk_probe, |
| 300 | .remove = max77686_clk_remove, | ||
| 301 | .id_table = max77686_clk_id, | 285 | .id_table = max77686_clk_id, |
| 302 | }; | 286 | }; |
| 303 | 287 | ||
