Simplify allocation by using kzalloc_flex with a flexible array member to combine allocations.
Add __counted_by for extra runtime analysis. Move the counting variable assignment right after allocation as required ny __counted_by. Signed-off-by: Rosen Penev <[email protected]> --- drivers/clk/samsung/clk.c | 28 ++++++---------------------- drivers/clk/samsung/clk.h | 2 +- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c index 91e5cdbc79d7..12028f13e8e8 100644 --- a/drivers/clk/samsung/clk.c +++ b/drivers/clk/samsung/clk.c @@ -48,23 +48,6 @@ void samsung_clk_restore(void __iomem *base, } } -struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump( - const unsigned long *rdump, - unsigned long nr_rdump) -{ - struct samsung_clk_reg_dump *rd; - unsigned int i; - - rd = kzalloc_objs(*rd, nr_rdump); - if (!rd) - return NULL; - - for (i = 0; i < nr_rdump; ++i) - rd[i].offset = rdump[i]; - - return rd; -} - /** * samsung_clk_init() - Create and initialize a clock provider object * @dev: CMU device to enable runtime PM, or NULL if RPM is not needed @@ -430,21 +413,22 @@ void samsung_clk_extended_sleep_init(void __iomem *reg_base, unsigned long nr_rsuspend) { struct samsung_clock_reg_cache *reg_cache; + int i; - reg_cache = kzalloc_obj(struct samsung_clock_reg_cache); + reg_cache = kzalloc_flex(*reg_cache, rdump, nr_rdump); if (!reg_cache) panic("could not allocate register reg_cache.\n"); - reg_cache->rdump = samsung_clk_alloc_reg_dump(rdump, nr_rdump); - if (!reg_cache->rdump) - panic("could not allocate register dump storage.\n"); + reg_cache->rd_num = nr_rdump; + + for (i = 0; i < nr_rdump; ++i) + reg_cache->rdump[i].offset = rdump[i]; if (list_empty(&clock_reg_cache_list)) register_syscore(&samsung_clk_syscore); reg_cache->reg_base = reg_base; reg_cache->sysreg = sysreg; - reg_cache->rd_num = nr_rdump; reg_cache->rsuspend = rsuspend; reg_cache->rsuspend_num = nr_rsuspend; list_add_tail(®_cache->node, &clock_reg_cache_list); diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index b1192ca03db5..098f27a6290d 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h @@ -324,10 +324,10 @@ struct samsung_clock_reg_cache { struct list_head node; void __iomem *reg_base; struct regmap *sysreg; - struct samsung_clk_reg_dump *rdump; unsigned int rd_num; const struct samsung_clk_reg_dump *rsuspend; unsigned int rsuspend_num; + struct samsung_clk_reg_dump rdump[] __counted_by(rd_num); }; /** -- 2.53.0

