clk: si5341: free unused memory on probe failure
authorClaudiu Beznea <claudiu.beznea@microchip.com>
Tue, 30 May 2023 09:39:10 +0000 (12:39 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Jul 2023 14:21:33 +0000 (16:21 +0200)
[ Upstream commit 267ad94b13c53d8c99a336f0841b1fa1595b1d0f ]

Pointers from synth_clock_names[] should be freed at the end of probe
either on probe success or failure path.

Fixes: b7bbf6ec4940 ("clk: si5341: Allow different output VDD_SEL values")
Fixes: 9b13ff4340df ("clk: si5341: Add sysfs properties to allow checking/resetting device faults")
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Link: https://lore.kernel.org/r/20230530093913.1656095-6-claudiu.beznea@microchip.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clk/clk-si5341.c

index b2cf7ed..c7d8cbd 100644 (file)
@@ -1744,7 +1744,7 @@ static int si5341_probe(struct i2c_client *client)
                if (err) {
                        dev_err(&client->dev,
                                "output %u registration failed\n", i);
-                       goto cleanup;
+                       goto free_clk_names;
                }
                if (config[i].always_on)
                        clk_prepare(data->clk[i].hw.clk);
@@ -1754,7 +1754,7 @@ static int si5341_probe(struct i2c_client *client)
                        data);
        if (err) {
                dev_err(&client->dev, "unable to add clk provider\n");
-               goto cleanup;
+               goto free_clk_names;
        }
 
        if (initialization_required) {
@@ -1762,11 +1762,11 @@ static int si5341_probe(struct i2c_client *client)
                regcache_cache_only(data->regmap, false);
                err = regcache_sync(data->regmap);
                if (err < 0)
-                       goto cleanup;
+                       goto free_clk_names;
 
                err = si5341_finalize_defaults(data);
                if (err < 0)
-                       goto cleanup;
+                       goto free_clk_names;
        }
 
        /* wait for device to report input clock present and PLL lock */
@@ -1775,21 +1775,19 @@ static int si5341_probe(struct i2c_client *client)
               10000, 250000);
        if (err) {
                dev_err(&client->dev, "Error waiting for input clock or PLL lock\n");
-               goto cleanup;
+               goto free_clk_names;
        }
 
        /* clear sticky alarm bits from initialization */
        err = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0);
        if (err) {
                dev_err(&client->dev, "unable to clear sticky status\n");
-               goto cleanup;
+               goto free_clk_names;
        }
 
        err = sysfs_create_files(&client->dev.kobj, si5341_attributes);
-       if (err) {
+       if (err)
                dev_err(&client->dev, "unable to create sysfs files\n");
-               goto cleanup;
-       }
 
 free_clk_names:
        /* Free the names, clk framework makes copies */