lkml.org 
[lkml]   [2019]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.1 187/219] ALSA: hda: Fix a headphone detection issue when using SOF
    Date
    From: Rander Wang <rander.wang@linux.intel.com>

    [ Upstream commit 7c2b3629d09ddec810dc4c1d3a6657c32def8f71 ]

    To save power, the hda hdmi driver in ASoC invokes snd_hdac_ext_bus_link_put
    to disable CORB/RIRB buffers DMA if there is no user of bus and invokes
    snd_hdac_ext_bus_link_get to set up CORB/RIRB buffers when it is used.
    Unsolicited responses is disabled in snd_hdac_bus_stop_cmd_io called by
    snd_hdac_ext_bus_link_put , but it is not enabled in snd_hdac_bus_init_cmd_io
    called by snd_hdac_ext_bus_link_get. So for put-get sequence, Unsolicited
    responses is disabled and headphone can't be detected by hda codecs.

    Now unsolicited responses is only enabled in snd_hdac_bus_reset_link
    which resets controller. The function is only called for setup of
    controller. This patch enables Unsolicited responses after RIRB is
    initialized in snd_hdac_bus_init_cmd_io which works together with
    snd_hdac_bus_reset_link to set up controller.

    Tested legacy hda driver and SOF driver on intel whiskeylake.

    Reviewed-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/hda/hdac_controller.c | 5 ++---
    1 file changed, 2 insertions(+), 3 deletions(-)

    diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
    index b2e9454f5816..6a190f0d2803 100644
    --- a/sound/hda/hdac_controller.c
    +++ b/sound/hda/hdac_controller.c
    @@ -78,6 +78,8 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
    snd_hdac_chip_writew(bus, RINTCNT, 1);
    /* enable rirb dma and response irq */
    snd_hdac_chip_writeb(bus, RIRBCTL, AZX_RBCTL_DMA_EN | AZX_RBCTL_IRQ_EN);
    + /* Accept unsolicited responses */
    + snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL);
    spin_unlock_irq(&bus->reg_lock);
    }
    EXPORT_SYMBOL_GPL(snd_hdac_bus_init_cmd_io);
    @@ -414,9 +416,6 @@ int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset)
    return -EBUSY;
    }

    - /* Accept unsolicited responses */
    - snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL);
    -
    /* detect codecs */
    if (!bus->codec_mask) {
    bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS);
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-15 17:45    [W:4.206 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site