On Wed, 2017-02-08 at 10:47 +0100, Vincent Abriou wrote: > While unregistering the hdmi-codec, the hdmi device list must be > cleaned up. It avoid kernel page fault when registering again the > hdmi-codec. > > Cc: Liam Girdwood <lgirdwood@xxxxxxxxx> > Cc: Mark Brown <broonie@xxxxxxxxxx> > Cc: Jaroslav Kysela <perex@xxxxxxxx> > Cc: Takashi Iwai <tiwai@xxxxxxxx> > Cc: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx> > Cc: Jyri Sarha <jsarha@xxxxxx> > Cc: Arnaud Pouliquen <arnaud.pouliquen@xxxxxx> > Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> > > Signed-off-by: Vincent Abriou <vincent.abriou@xxxxxx> > --- > v2: > - add mutex to protect hdmi_device_list from concurrent accesses > - use of internal dev variable in the hdmi_codec_remove function > > sound/soc/codecs/hdmi-codec.c | 25 ++++++++++++++++++++++--- > 1 file changed, 22 insertions(+), 3 deletions(-) > > diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c > index dc6715a..8c5ae1f 100644 > --- a/sound/soc/codecs/hdmi-codec.c > +++ b/sound/soc/codecs/hdmi-codec.c > @@ -32,6 +32,7 @@ struct hdmi_device { > }; > #define pos_to_hdmi_device(pos) container_of((pos), struct hdmi_device, list) > LIST_HEAD(hdmi_device_list); > +static DEFINE_MUTEX(hdmi_mutex); > > #define DAI_NAME_SIZE 16 > > @@ -794,6 +795,7 @@ static int hdmi_codec_probe(struct platform_device *pdev) > return -ENOMEM; > > hd = NULL; > + mutex_lock(&hdmi_mutex); > list_for_each(pos, &hdmi_device_list) { > struct hdmi_device *tmp = pos_to_hdmi_device(pos); > > @@ -805,13 +807,16 @@ static int hdmi_codec_probe(struct platform_device *pdev) > > if (!hd) { > hd = devm_kzalloc(dev, sizeof(*hd), GFP_KERNEL); > - if (!hd) > + if (!hd) { > + mutex_unlock(&hdmi_mutex); > return -ENOMEM; > + } > > hd->dev = dev->parent; > > list_add_tail(&hd->list, &hdmi_device_list); > } > + mutex_unlock(&hdmi_mutex); > > if (hd->cnt >= ARRAY_SIZE(hdmi_dai_name)) { > dev_err(dev, "too many hdmi codec are deteced\n"); > @@ -853,11 +858,25 @@ static int hdmi_codec_probe(struct platform_device *pdev) > > static int hdmi_codec_remove(struct platform_device *pdev) > { > + struct device *dev = &pdev->dev; > + struct list_head *pos; > struct hdmi_codec_priv *hcp; > > - hcp = dev_get_drvdata(&pdev->dev); > + mutex_lock(&hdmi_mutex); > + list_for_each(pos, &hdmi_device_list) { > + struct hdmi_device *tmp = pos_to_hdmi_device(pos); > + > + if (tmp->dev == dev->parent) { > + list_del(pos); > + break; > + } > + } > + mutex_unlock(&hdmi_mutex); > + > + hcp = dev_get_drvdata(dev); > kfree(hcp->chmap_info); > - snd_soc_unregister_codec(&pdev->dev); > + snd_soc_unregister_codec(dev); > + > return 0; > } Reviewed-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> regards Philipp _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel