Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: ti: Don't reference clk_init_data after registration

A future patch is going to change semantics of clk_register() so that
clk_hw::init is guaranteed to be NULL after a clk is registered. Avoid
referencing this member here so that we don't run into NULL pointer
exceptions.

Cc: Tero Kristo <t-kristo@ti.com>
Cc: Tony Lindgren <tony@atomide.com>
Reported-by: "kernelci.org bot" <bot@kernelci.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lkml.kernel.org/r/20190815221249.53235-1-sboyd@kernel.org

+10 -8
+5 -4
drivers/clk/ti/apll.c
··· 140 140 struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw); 141 141 struct dpll_data *ad = clk_hw->dpll_data; 142 142 struct clk *clk; 143 + const struct clk_init_data *init = clk_hw->hw.init; 143 144 144 145 clk = of_clk_get(node, 0); 145 146 if (IS_ERR(clk)) { ··· 169 168 clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, node->name); 170 169 if (!IS_ERR(clk)) { 171 170 of_clk_add_provider(node, of_clk_src_simple_get, clk); 172 - kfree(clk_hw->hw.init->parent_names); 173 - kfree(clk_hw->hw.init); 171 + kfree(init->parent_names); 172 + kfree(init); 174 173 return; 175 174 } 176 175 177 176 cleanup: 178 177 kfree(clk_hw->dpll_data); 179 - kfree(clk_hw->hw.init->parent_names); 180 - kfree(clk_hw->hw.init); 178 + kfree(init->parent_names); 179 + kfree(init); 181 180 kfree(clk_hw); 182 181 } 183 182
+5 -4
drivers/clk/ti/dpll.c
··· 165 165 struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw); 166 166 struct dpll_data *dd = clk_hw->dpll_data; 167 167 struct clk *clk; 168 + const struct clk_init_data *init = hw->init; 168 169 169 170 clk = of_clk_get(node, 0); 170 171 if (IS_ERR(clk)) { ··· 197 196 198 197 if (!IS_ERR(clk)) { 199 198 of_clk_add_provider(node, of_clk_src_simple_get, clk); 200 - kfree(clk_hw->hw.init->parent_names); 201 - kfree(clk_hw->hw.init); 199 + kfree(init->parent_names); 200 + kfree(init); 202 201 return; 203 202 } 204 203 205 204 cleanup: 206 205 kfree(clk_hw->dpll_data); 207 - kfree(clk_hw->hw.init->parent_names); 208 - kfree(clk_hw->hw.init); 206 + kfree(init->parent_names); 207 + kfree(init); 209 208 kfree(clk_hw); 210 209 } 211 210