At Fri, 12 Sep 2008 03:04:39 -0300, Herton Ronaldo Krzesinski wrote: > > On Friday 12 September 2008 02:43:02 Herton Ronaldo Krzesinski wrote: > > Fixes the following oopses and other likewise possible ones: > > > > Ouch, just pasted the oopses for reference and forgot a real changelog, it can > be like this: > > --- > > ALSA: hda: fix oopses in snd-hda-intel after digital slave support additions > > Many places fail to check if codec has slave_dig_outs entries (the most common > case is not having any entry), leading to various possible oopses in hda_codec > code. My bad. I should have been more careful, but I couldn't test enough as I was in a conference. Anyway, applied now on sound-2.6 git tree. Thanks! Takashi > > > > > Signed-off-by: Herton Ronaldo Krzesinski <herton@xxxxxxxxxxxxxxx> > > > > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c > > index 696d77e..531364d 100644 > > --- a/sound/pci/hda/hda_codec.c > > +++ b/sound/pci/hda/hda_codec.c > > @@ -1462,14 +1462,15 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, > > AC_VERB_SET_DIGI_CONVERT_2, > > val >> 8); > > > > - for (d = codec->slave_dig_outs; *d; d++) { > > - snd_hda_codec_write_cache(codec, *d, 0, > > + if (codec->slave_dig_outs) > > + for (d = codec->slave_dig_outs; *d; d++) { > > + snd_hda_codec_write_cache(codec, *d, 0, > > AC_VERB_SET_DIGI_CONVERT_1, > > val & 0xff); > > - snd_hda_codec_write_cache(codec, *d, 0, > > + snd_hda_codec_write_cache(codec, *d, 0, > > AC_VERB_SET_DIGI_CONVERT_2, > > val >> 8); > > - } > > + } > > } > > > > mutex_unlock(&codec->spdif_mutex); > > @@ -1507,8 +1508,9 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, > > AC_VERB_SET_DIGI_CONVERT_1, > > val & 0xff); > > > > - for (d = codec->slave_dig_outs; *d; d++) > > - snd_hda_codec_write_cache(codec, *d, 0, > > + if (codec->slave_dig_outs) > > + for (d = codec->slave_dig_outs; *d; d++) > > + snd_hda_codec_write_cache(codec, *d, 0, > > AC_VERB_SET_DIGI_CONVERT_1, > > val & 0xff); > > /* unmute amp switch (if any) */ > > @@ -1664,8 +1666,9 @@ static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol, > > snd_hda_codec_write_cache(codec, nid, 0, > > AC_VERB_SET_DIGI_CONVERT_1, val); > > > > - for (d = codec->slave_dig_outs; *d; d++) > > - snd_hda_codec_write_cache(codec, *d, 0, > > + if (codec->slave_dig_outs) > > + for (d = codec->slave_dig_outs; *d; d++) > > + snd_hda_codec_write_cache(codec, *d, 0, > > AC_VERB_SET_DIGI_CONVERT_1, val); > > } > > mutex_unlock(&codec->spdif_mutex); > > @@ -2617,9 +2620,10 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid, > > snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, > > codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff); > > > > - for (d = codec->slave_dig_outs; *d; d++) > > - snd_hda_codec_write(codec, *d, 0, > > - AC_VERB_SET_DIGI_CONVERT_1, > > + if (codec->slave_dig_outs) > > + for (d = codec->slave_dig_outs; *d; d++) > > + snd_hda_codec_write(codec, *d, 0, > > + AC_VERB_SET_DIGI_CONVERT_1, > > codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff); > > } > > snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); > > @@ -2628,9 +2632,10 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid, > > snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, > > codec->spdif_ctls & 0xff); > > > > - for (d = codec->slave_dig_outs; *d; d++) > > - snd_hda_codec_write(codec, *d, 0, > > - AC_VERB_SET_DIGI_CONVERT_1, > > + if (codec->slave_dig_outs) > > + for (d = codec->slave_dig_outs; *d; d++) > > + snd_hda_codec_write(codec, *d, 0, > > + AC_VERB_SET_DIGI_CONVERT_1, > > codec->spdif_ctls & 0xff); > > } > > > > > > > > > > -- > []'s > Herton > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@xxxxxxxxxxxxxxxx > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel