mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
firmware: cs_dsp: Remove unused struct list_head from cs_dsp_coeff_ctl
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>
This commit is contained in:
parent
000d8b9420
commit
e7af416aeb
@ -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_ops;
|
||||||
static const struct cs_dsp_ops cs_dsp_halo_ao_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 cs_dsp_buf {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
void *buf;
|
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,
|
struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
|
||||||
int type, unsigned int id)
|
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);
|
lockdep_assert_held(&dsp->pwr_lock);
|
||||||
|
|
||||||
list_for_each_entry(alg_region, &dsp->alg_regions, list) {
|
list_for_each_entry(item, &dsp->alg_regions, list) {
|
||||||
if (id == alg_region->alg && type == alg_region->type)
|
if (id == item->alg_region.alg && type == item->alg_region.type)
|
||||||
return alg_region;
|
return &item->alg_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1769,35 +1774,35 @@ static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,
|
|||||||
int type, __be32 id,
|
int type, __be32 id,
|
||||||
__be32 ver, __be32 base)
|
__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);
|
item = kzalloc(sizeof(*item), GFP_KERNEL);
|
||||||
if (!alg_region)
|
if (!item)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
alg_region->type = type;
|
item->alg_region.type = type;
|
||||||
alg_region->alg = be32_to_cpu(id);
|
item->alg_region.alg = be32_to_cpu(id);
|
||||||
alg_region->ver = be32_to_cpu(ver);
|
item->alg_region.ver = be32_to_cpu(ver);
|
||||||
alg_region->base = be32_to_cpu(base);
|
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)
|
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)
|
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)) {
|
while (!list_empty(&dsp->alg_regions)) {
|
||||||
alg_region = list_first_entry(&dsp->alg_regions,
|
item = list_first_entry(&dsp->alg_regions,
|
||||||
struct cs_dsp_alg_region,
|
struct cs_dsp_alg_region_list_item,
|
||||||
list);
|
list);
|
||||||
list_del(&alg_region->list);
|
list_del(&item->list);
|
||||||
kfree(alg_region);
|
kfree(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,14 +64,12 @@ struct cs_dsp_region {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* struct cs_dsp_alg_region - Describes a logical algorithm region in DSP address space
|
* struct cs_dsp_alg_region - Describes a logical algorithm region in DSP address space
|
||||||
* @list: List node for internal use
|
|
||||||
* @alg: Algorithm id
|
* @alg: Algorithm id
|
||||||
* @ver: Expected algorithm version
|
* @ver: Expected algorithm version
|
||||||
* @type: Memory region type
|
* @type: Memory region type
|
||||||
* @base: Address of region
|
* @base: Address of region
|
||||||
*/
|
*/
|
||||||
struct cs_dsp_alg_region {
|
struct cs_dsp_alg_region {
|
||||||
struct list_head list;
|
|
||||||
unsigned int alg;
|
unsigned int alg;
|
||||||
unsigned int ver;
|
unsigned int ver;
|
||||||
int type;
|
int type;
|
||||||
|
Loading…
Reference in New Issue
Block a user