Commit ba038611 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven

clk: renesas: div6: Combine clock-private and parent array allocation

Make div6_clock.parents[] a flexible array member, and use the new
struct_size() helper, to combine the allocation of the clock-private
structure and array of parent clocks.
Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent d2e4cb45
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
* @div: divisor value (1-64) * @div: divisor value (1-64)
* @src_shift: Shift to access the register bits to select the parent clock * @src_shift: Shift to access the register bits to select the parent clock
* @src_width: Number of register bits to select the parent clock (may be 0) * @src_width: Number of register bits to select the parent clock (may be 0)
* @parents: Array to map from valid parent clocks indices to hardware indices
* @nb: Notifier block to save/restore clock state for system resume * @nb: Notifier block to save/restore clock state for system resume
* @parents: Array to map from valid parent clocks indices to hardware indices
*/ */
struct div6_clock { struct div6_clock {
struct clk_hw hw; struct clk_hw hw;
...@@ -39,8 +39,8 @@ struct div6_clock { ...@@ -39,8 +39,8 @@ struct div6_clock {
unsigned int div; unsigned int div;
u32 src_shift; u32 src_shift;
u32 src_width; u32 src_width;
u8 *parents;
struct notifier_block nb; struct notifier_block nb;
u8 parents[];
}; };
#define to_div6_clock(_hw) container_of(_hw, struct div6_clock, hw) #define to_div6_clock(_hw) container_of(_hw, struct div6_clock, hw)
...@@ -221,17 +221,10 @@ struct clk * __init cpg_div6_register(const char *name, ...@@ -221,17 +221,10 @@ struct clk * __init cpg_div6_register(const char *name,
struct clk *clk; struct clk *clk;
unsigned int i; unsigned int i;
clock = kzalloc(sizeof(*clock), GFP_KERNEL); clock = kzalloc(struct_size(clock, parents, num_parents), GFP_KERNEL);
if (!clock) if (!clock)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
clock->parents = kmalloc_array(num_parents, sizeof(*clock->parents),
GFP_KERNEL);
if (!clock->parents) {
clk = ERR_PTR(-ENOMEM);
goto free_clock;
}
clock->reg = reg; clock->reg = reg;
/* /*
...@@ -259,7 +252,7 @@ struct clk * __init cpg_div6_register(const char *name, ...@@ -259,7 +252,7 @@ struct clk * __init cpg_div6_register(const char *name,
pr_err("%s: invalid number of parents for DIV6 clock %s\n", pr_err("%s: invalid number of parents for DIV6 clock %s\n",
__func__, name); __func__, name);
clk = ERR_PTR(-EINVAL); clk = ERR_PTR(-EINVAL);
goto free_parents; goto free_clock;
} }
/* Filter out invalid parents */ /* Filter out invalid parents */
...@@ -282,7 +275,7 @@ struct clk * __init cpg_div6_register(const char *name, ...@@ -282,7 +275,7 @@ struct clk * __init cpg_div6_register(const char *name,
clk = clk_register(NULL, &clock->hw); clk = clk_register(NULL, &clock->hw);
if (IS_ERR(clk)) if (IS_ERR(clk))
goto free_parents; goto free_clock;
if (notifiers) { if (notifiers) {
clock->nb.notifier_call = cpg_div6_clock_notifier_call; clock->nb.notifier_call = cpg_div6_clock_notifier_call;
...@@ -291,8 +284,6 @@ struct clk * __init cpg_div6_register(const char *name, ...@@ -291,8 +284,6 @@ struct clk * __init cpg_div6_register(const char *name,
return clk; return clk;
free_parents:
kfree(clock->parents);
free_clock: free_clock:
kfree(clock); kfree(clock);
return clk; return clk;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment