cpufreq: tegra20: Release clocks properly
authorDmitry Osipenko <digetx@gmail.com>
Fri, 18 May 2018 20:06:36 +0000 (23:06 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 21 May 2018 11:44:24 +0000 (13:44 +0200)
Properly put requested clocks in the module init/exit code.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/tegra20-cpufreq.c

index 4b09a8b..ea186d3 100644 (file)
@@ -161,24 +161,45 @@ static struct cpufreq_driver tegra_cpufreq_driver = {
 
 static int __init tegra_cpufreq_init(void)
 {
+       int err;
+
        cpu_clk = clk_get_sys(NULL, "cclk");
        if (IS_ERR(cpu_clk))
                return PTR_ERR(cpu_clk);
 
        pll_x_clk = clk_get_sys(NULL, "pll_x");
-       if (IS_ERR(pll_x_clk))
-               return PTR_ERR(pll_x_clk);
+       if (IS_ERR(pll_x_clk)) {
+               err = PTR_ERR(pll_x_clk);
+               goto put_cpu;
+       }
 
        pll_p_clk = clk_get_sys(NULL, "pll_p");
-       if (IS_ERR(pll_p_clk))
-               return PTR_ERR(pll_p_clk);
+       if (IS_ERR(pll_p_clk)) {
+               err = PTR_ERR(pll_p_clk);
+               goto put_pll_x;
+       }
+
+       err = cpufreq_register_driver(&tegra_cpufreq_driver);
+       if (err)
+               goto put_pll_p;
+
+       return 0;
+
+put_pll_p:
+       clk_put(pll_p_clk);
+put_pll_x:
+       clk_put(pll_x_clk);
+put_cpu:
+       clk_put(cpu_clk);
 
-       return cpufreq_register_driver(&tegra_cpufreq_driver);
+       return err;
 }
 
 static void __exit tegra_cpufreq_exit(void)
 {
        cpufreq_unregister_driver(&tegra_cpufreq_driver);
+       clk_put(pll_p_clk);
+       clk_put(pll_x_clk);
        clk_put(cpu_clk);
 }