mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 15:02:40 -04:00
Merge existing fixes from asoc/for-5.16 into new branch
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <sound/hdaudio.h>
|
||||
#include <sound/hda_i915.h>
|
||||
#include <sound/hda_codec.h>
|
||||
#include <sound/hda_register.h>
|
||||
#include "../sof-priv.h"
|
||||
#include "hda.h"
|
||||
|
||||
@@ -21,6 +23,18 @@
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
static void update_codec_wake_enable(struct hdac_bus *bus, unsigned int addr, bool link_power)
|
||||
{
|
||||
unsigned int mask = snd_hdac_chip_readw(bus, WAKEEN);
|
||||
|
||||
if (link_power)
|
||||
mask &= ~BIT(addr);
|
||||
else
|
||||
mask |= BIT(addr);
|
||||
|
||||
snd_hdac_chip_updatew(bus, WAKEEN, STATESTS_INT_MASK, mask);
|
||||
}
|
||||
|
||||
static void sof_hda_bus_link_power(struct hdac_device *codec, bool enable)
|
||||
{
|
||||
struct hdac_bus *bus = codec->bus;
|
||||
@@ -41,6 +55,9 @@ static void sof_hda_bus_link_power(struct hdac_device *codec, bool enable)
|
||||
*/
|
||||
if (codec->addr == HDA_IDISP_ADDR && !enable)
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
|
||||
/* WAKEEN needs to be set for disabled links */
|
||||
update_codec_wake_enable(bus, codec->addr, enable);
|
||||
}
|
||||
|
||||
static const struct hdac_bus_ops bus_core_ops = {
|
||||
|
||||
@@ -622,8 +622,7 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
||||
hda_dsp_ipc_int_disable(sdev);
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
if (runtime_suspend)
|
||||
hda_codec_jack_wake_enable(sdev, true);
|
||||
hda_codec_jack_wake_enable(sdev, runtime_suspend);
|
||||
|
||||
/* power down all hda link */
|
||||
snd_hdac_ext_bus_link_power_down_all(bus);
|
||||
|
||||
@@ -810,6 +810,20 @@ skip_soundwire:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hda_check_for_state_change(struct snd_sof_dev *sdev)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
unsigned int codec_mask;
|
||||
|
||||
codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||
if (codec_mask) {
|
||||
hda_codec_jack_check(sdev);
|
||||
snd_hdac_chip_writew(bus, STATESTS, codec_mask);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static irqreturn_t hda_dsp_interrupt_handler(int irq, void *context)
|
||||
{
|
||||
struct snd_sof_dev *sdev = context;
|
||||
@@ -851,6 +865,8 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
|
||||
if (hda_sdw_check_wakeen_irq(sdev))
|
||||
hda_sdw_process_wakeen(sdev);
|
||||
|
||||
hda_check_for_state_change(sdev);
|
||||
|
||||
/* enable GIE interrupt */
|
||||
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
|
||||
SOF_HDA_INTCTL,
|
||||
|
||||
Reference in New Issue
Block a user