lkml.org 
[lkml]   [2018]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v5 3/9] 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_parent_hw_provider.

    Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
    Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
    ---
    drivers/clk/clk-max77686.c | 29 +++++++----------------------
    1 file changed, 7 insertions(+), 22 deletions(-)

    diff --git a/drivers/clk/clk-max77686.c b/drivers/clk/clk-max77686.c
    index 22c937644c93..e65925d5e412 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)
    return ret;
    }

    - ret = clk_hw_register_clkdev(&max_clk_data->hw,
    - max_clk_data->clk_idata.name, NULL);
    + ret = devm_clk_hw_register_clkdev(dev, &max_clk_data->hw,
    + max_clk_data->clk_idata.name,
    + NULL);
    if (ret < 0) {
    dev_err(dev, "Failed to clkdev register: %d\n", ret);
    return ret;
    @@ -244,8 +245,9 @@ static int max77686_clk_probe(struct platform_device *pdev)
    }

    if (parent->of_node) {
    - ret = of_clk_add_hw_provider(parent->of_node, of_clk_max77686_get,
    - drv_data);
    + ret = devm_of_clk_add_parent_hw_provider(dev,
    + of_clk_max77686_get,
    + drv_data);

    if (ret < 0) {
    dev_err(dev, "Failed to register OF clock provider: %d\n",
    @@ -261,27 +263,11 @@ static int max77686_clk_probe(struct platform_device *pdev)
    1 << MAX77802_CLOCK_LOW_JITTER_SHIFT);
    if (ret < 0) {
    dev_err(dev, "Failed to config low-jitter: %d\n", ret);
    - goto remove_of_clk_provider;
    + return ret;
    }
    }

    return 0;
    -
    -remove_of_clk_provider:
    - if (parent->of_node)
    - of_clk_del_provider(parent->of_node);
    -
    - return ret;
    -}
    -
    -static int max77686_clk_remove(struct platform_device *pdev)
    -{
    - struct device *parent = pdev->dev.parent;
    -
    - if (parent->of_node)
    - of_clk_del_provider(parent->of_node);
    -
    - return 0;
    }

    static const struct platform_device_id max77686_clk_id[] = {
    @@ -297,7 +283,6 @@ static struct platform_driver max77686_clk_driver = {
    .name = "max77686-clk",
    },
    .probe = max77686_clk_probe,
    - .remove = max77686_clk_remove,
    .id_table = max77686_clk_id,
    };

    --
    2.14.3

    --
    Matti Vaittinen
    ROHM Semiconductors

    ~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~

    \
     
     \ /
      Last update: 2018-12-03 13:20    [W:3.279 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site