On Wed, 12 Jun 2019 13:55:09 +0200, Kai Vehmanen wrote: > > In display codecs supported by hdac_hdmi, the connection indices are > shared by all converters. At boot and resume from suspend, > the connection state may be reset to default values. > > In case of multiple connected pins (multiple monitors connected > with audio capability), routing and mute status of pins that > are not connected to any PCM, may interfere with other pins. > E.g. after resume from S3 with multiple monitors, unless > all converters are in active use, playback to some PCMs may > be muted due to the default settings of unrelated converters. > > Avoid this by ensuring all pin:cvt selections are correct > in codec whenever a converter is enabled for playback. > > Signed-off-by: Kai Vehmanen <kai.vehmanen@xxxxxxxxxxxxxxx> > --- > sound/soc/codecs/hdac_hdmi.c | 41 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c > index 660e0587f3999..bb87240d2fb22 100644 > --- a/sound/soc/codecs/hdac_hdmi.c > +++ b/sound/soc/codecs/hdac_hdmi.c > @@ -546,6 +546,39 @@ static struct hdac_hdmi_port *hdac_hdmi_get_port_from_cvt( > return NULL; > } > > +/** > + * Go through all converters and ensure connection is set to > + * the correct pin as set via kcontrols. > + */ > +static void hdac_hdmi_verify_connect_sel_all_pins(struct hdac_device *hdev) > +{ > + struct hdac_hdmi_port *port; > + struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev); > + struct hdac_hdmi_cvt *cvt; > + int cvt_idx = 0; > + int curr; > + > + list_for_each_entry(cvt, &hdmi->cvt_list, head) { > + port = hdac_hdmi_get_port_from_cvt(hdev, hdmi, cvt); > + if (port && port->pin) { > + curr = snd_hdac_codec_read(hdev, port->pin->nid, > + 0, AC_VERB_GET_CONNECT_SEL, > + 0); > + if (curr != cvt_idx) { > + snd_hdac_codec_write(hdev, > + port->pin->nid, 0, > + AC_VERB_SET_CONNECT_SEL, > + cvt_idx); > + dev_dbg(&hdev->dev, > + "%s: %s set connect %d -> %d\n", > + __func__, cvt->name, port->pin->nid, > + cvt_idx); You can simply restore all pins without reading. The read costs much more time than writes. thanks, Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel