]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
firmware: cs_dsp: Remove unused struct list_head from cs_dsp_coeff_ctl
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Mon, 16 Jun 2025 10:30:52 +0000 (11:30 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 16 Jun 2025 12:26:44 +0000 (13:26 +0100)
Remove two unused pointers from struct cs_dsp_coeff_ctl by taking the
struct list_head out of struct cs_dsp_alg_region. On a x86_64 build
this saves 16 bytes per control.

Each cs_dsp_coeff_ctl instance needs to keep information about the
algorithm region it refers to. This is done by embedding an instance
of struct cs_dsp_alg_region. But cs_dsp_alg_region was also used to
store entries in a list of algorithm regions, and so had a struct
list_head object for that purpose. This list_head object is not used
with the embedded object in struct cs_dsp_alg_region so was just
wasted bytes.

A new struct cs_dsp_alg_region_list_item has been defined for creating
the list of algorithm regions. It contains a struct cs_dsp_alg_region
and a struct list_head.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://patch.msgid.link/20250616103052.66537-1-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/firmware/cirrus/cs_dsp.c
include/linux/firmware/cirrus/cs_dsp.h

index 560724ce21aa3d0b16455f2ed2cb893ece32aa6f..f51047d8ea64f571bbf55f6317460287200bc5ce 100644 (file)
@@ -311,6 +311,11 @@ static const struct cs_dsp_ops cs_dsp_adsp2_ops[];
 static const struct cs_dsp_ops cs_dsp_halo_ops;
 static const struct cs_dsp_ops cs_dsp_halo_ao_ops;
 
+struct cs_dsp_alg_region_list_item {
+       struct list_head list;
+       struct cs_dsp_alg_region alg_region;
+};
+
 struct cs_dsp_buf {
        struct list_head list;
        void *buf;
@@ -1752,13 +1757,13 @@ static void *cs_dsp_read_algs(struct cs_dsp *dsp, size_t n_algs,
 struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
                                                 int type, unsigned int id)
 {
-       struct cs_dsp_alg_region *alg_region;
+       struct cs_dsp_alg_region_list_item *item;
 
        lockdep_assert_held(&dsp->pwr_lock);
 
-       list_for_each_entry(alg_region, &dsp->alg_regions, list) {
-               if (id == alg_region->alg && type == alg_region->type)
-                       return alg_region;
+       list_for_each_entry(item, &dsp->alg_regions, list) {
+               if (id == item->alg_region.alg && type == item->alg_region.type)
+                       return &item->alg_region;
        }
 
        return NULL;
@@ -1769,35 +1774,35 @@ static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,
                                                      int type, __be32 id,
                                                      __be32 ver, __be32 base)
 {
-       struct cs_dsp_alg_region *alg_region;
+       struct cs_dsp_alg_region_list_item *item;
 
-       alg_region = kzalloc(sizeof(*alg_region), GFP_KERNEL);
-       if (!alg_region)
+       item = kzalloc(sizeof(*item), GFP_KERNEL);
+       if (!item)
                return ERR_PTR(-ENOMEM);
 
-       alg_region->type = type;
-       alg_region->alg = be32_to_cpu(id);
-       alg_region->ver = be32_to_cpu(ver);
-       alg_region->base = be32_to_cpu(base);
+       item->alg_region.type = type;
+       item->alg_region.alg = be32_to_cpu(id);
+       item->alg_region.ver = be32_to_cpu(ver);
+       item->alg_region.base = be32_to_cpu(base);
 
-       list_add_tail(&alg_region->list, &dsp->alg_regions);
+       list_add_tail(&item->list, &dsp->alg_regions);
 
        if (dsp->wmfw_ver > 0)
-               cs_dsp_ctl_fixup_base(dsp, alg_region);
+               cs_dsp_ctl_fixup_base(dsp, &item->alg_region);
 
-       return alg_region;
+       return &item->alg_region;
 }
 
 static void cs_dsp_free_alg_regions(struct cs_dsp *dsp)
 {
-       struct cs_dsp_alg_region *alg_region;
+       struct cs_dsp_alg_region_list_item *item;
 
        while (!list_empty(&dsp->alg_regions)) {
-               alg_region = list_first_entry(&dsp->alg_regions,
-                                             struct cs_dsp_alg_region,
-                                             list);
-               list_del(&alg_region->list);
-               kfree(alg_region);
+               item = list_first_entry(&dsp->alg_regions,
+                                       struct cs_dsp_alg_region_list_item,
+                                       list);
+               list_del(&item->list);
+               kfree(item);
        }
 }
 
index 7cae703b3137cf1c80efaf3840edd3f206b91033..a66eb7624730c43e116ceaaba0bf18f011aec3e1 100644 (file)
@@ -64,14 +64,12 @@ struct cs_dsp_region {
 
 /**
  * struct cs_dsp_alg_region - Describes a logical algorithm region in DSP address space
- * @list:      List node for internal use
  * @alg:       Algorithm id
  * @ver:       Expected algorithm version
  * @type:      Memory region type
  * @base:      Address of region
  */
 struct cs_dsp_alg_region {
-       struct list_head list;
        unsigned int alg;
        unsigned int ver;
        int type;