mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-21 01:54:51 +08:00
Merge series "ASoC: wcd9335: Firx some resources leak in the probe and remove function" from Christophe JAILLET <christophe.jaillet@wanadoo.fr>:
The first 2 patches are sraightforward and look logical to me. However, the 3rd one in purely speculative. It is based on the fact that a comment states that we enable some irqs on some slave ports. That said, it writes 0xFF in some registers. So, I guess that we should disable these irqs when the driver is removed. That said, writing 0x00 at the same place looks logical to me. This cis untested and NOT based on any documentation. Just a blind fix. Review with care. You'll be warned :) Christophe JAILLET (3): ASoC: wcd9335: Fix a double irq free in the remove function ASoC: wcd9335: Fix a memory leak in the error handling path of the probe function ASoC: wcd9335: Disable irq on slave ports in the remove function sound/soc/codecs/wcd9335.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) -- 2.30.2
This commit is contained in:
commit
52c64e5f7b
@ -4076,6 +4076,16 @@ static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wcd9335_teardown_irqs(struct wcd9335_codec *wcd)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* disable interrupts on all slave ports */
|
||||
for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
|
||||
regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
|
||||
0x00);
|
||||
}
|
||||
|
||||
static void wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec *wcd,
|
||||
bool ccl_flag)
|
||||
{
|
||||
@ -4844,6 +4854,7 @@ static void wcd9335_codec_init(struct snd_soc_component *component)
|
||||
static int wcd9335_codec_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
snd_soc_component_init_regmap(component, wcd->regmap);
|
||||
@ -4861,7 +4872,15 @@ static int wcd9335_codec_probe(struct snd_soc_component *component)
|
||||
for (i = 0; i < NUM_CODEC_DAIS; i++)
|
||||
INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
|
||||
|
||||
return wcd9335_setup_irqs(wcd);
|
||||
ret = wcd9335_setup_irqs(wcd);
|
||||
if (ret)
|
||||
goto free_clsh_ctrl;
|
||||
|
||||
return 0;
|
||||
|
||||
free_clsh_ctrl:
|
||||
wcd_clsh_ctrl_free(wcd->clsh_ctrl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wcd9335_codec_remove(struct snd_soc_component *comp)
|
||||
@ -4869,7 +4888,7 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)
|
||||
struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
|
||||
|
||||
wcd_clsh_ctrl_free(wcd->clsh_ctrl);
|
||||
free_irq(regmap_irq_get_virq(wcd->irq_data, WCD9335_IRQ_SLIMBUS), wcd);
|
||||
wcd9335_teardown_irqs(wcd);
|
||||
}
|
||||
|
||||
static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
|
||||
|
Loading…
Reference in New Issue
Block a user