sound fixes for 5.10-rc3
Quite a bunch of small fixes that have been gathered since the last PR including the changes like below: - HD-audio runtime PM fixes and refactoring - HD-audio and USB-audio quirks - SOF warning fix - Various ASoC device-specific fixes for Intel, Qualcomm, etc -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAl+lBp8OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+4ow//c6D1ittkffwcR85+Jv12i4tfod9s14De6gAP zghry/En4gkP66IPBzdZ+YAUzDtig3ePCYjVf3OH5iliefOJfnEzMKrD7TiNpSFm wYnnJPt3hY+FcyWnhf7F3+iZDBOJB8hDxb2x8JQGWNicOlJJ+CZ5pcry99W50zFW Q0BLrcmORQk3yBMLrV5IgRAZkvDymKoJBjHrGj3eUxqBPMshlgNXJ0dhp10hmvGr W+RAK8JfteJpho580zmSHGdmkPTeqGbfxktPY0i+iyQ2Z164+ZRXruuDr4XDxXeU VwXZjI3zFjdgac6H7zBD+AAK5jvOQ+vHgQW3TSjJvMDUZ6k5dvmaG/z2BHljIbAV RA0Dz1TWg+5ZmIIGo9nTCuUP8YWgtAcPVdmJ5lf/rEJRrqMBydjh0ty0D1YWHFCj W0omcOQbUs4Kl0vA6iP2GpZKDGixiv6oA8KLVoI2Zs5LPvLODLJtPi1KeQglZ4SC q+hw5wFrzNJWgBlHr2TDvUh25xMVKl0FB91HDFKtLF9B0DplZh1xRWwGYhIxqppa blUBK/KG3qGM8dvDb5niWMuDvfJEapQNLpuemGMrTTCqQSWXNTD5ID1DnlYZSOW6 DuzpaBMFGTBklTZ6GMxv7xE7gq32hDzzAjcaDKLLpIcsioXT9eDYH3En5kPJX9cu jF8Mkys= =5Iuz -----END PGP SIGNATURE----- Merge tag 'sound-5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Quite a bunch of small fixes that have been gathered since the last pull, including changes like below: - HD-audio runtime PM fixes and refactoring - HD-audio and USB-audio quirks - SOF warning fix - Various ASoC device-specific fixes for Intel, Qualcomm, etc" * tag 'sound-5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (26 commits) ALSA: usb-audio: Add implicit feedback quirk for Qu-16 ASoC: mchp-spdiftx: Do not set Validity bit(s) ALSA: usb-audio: Add implicit feedback quirk for MODX ALSA: usb-audio: add usb vendor id as DSD-capable for Khadas devices ALSA: hda/realtek - Enable headphone for ASUS TM420 ALSA: hda: prevent undefined shift in snd_hdac_ext_bus_get_link() ASoC: qcom: lpass-cpu: Fix clock disable failure ASoC: qcom: lpass-sc7180: Fix MI2S bitwidth field bit positions ASoC: codecs: wcd9335: Set digital gain range correctly ASoC: codecs: wcd934x: Set digital gain range correctly ALSA: hda: Reinstate runtime_allow() for all hda controllers ALSA: hda: Separate runtime and system suspend ALSA: hda: Refactor codec PM to use direct-complete optimization ALSA: hda/realtek - Fixed HP headset Mic can't be detected ALSA: usb-audio: Add implicit feedback quirk for Zoom UAC-2 ALSA: make snd_kcontrol_new name a normal string ALSA: fix kernel-doc markups ASoC: SOF: loader: handle all SOF_IPC_EXT types ASoC: cs42l51: manage mclk shutdown delay ASoC: qcom: sdm845: set driver name correctly ...
This commit is contained in:
commit
bb72bbe8f6
|
@ -42,7 +42,7 @@ struct snd_kcontrol_new {
|
|||
snd_ctl_elem_iface_t iface; /* interface identifier */
|
||||
unsigned int device; /* device/client number */
|
||||
unsigned int subdevice; /* subdevice (substream) number */
|
||||
const unsigned char *name; /* ASCII name of item */
|
||||
const char *name; /* ASCII name of item */
|
||||
unsigned int index; /* index of item */
|
||||
unsigned int access; /* access rights */
|
||||
unsigned int count; /* count of same elements */
|
||||
|
|
|
@ -332,7 +332,8 @@ void __snd_printk(unsigned int level, const char *file, int line,
|
|||
#define snd_BUG() WARN(1, "BUG?\n")
|
||||
|
||||
/**
|
||||
* Suppress high rates of output when CONFIG_SND_DEBUG is enabled.
|
||||
* snd_printd_ratelimit - Suppress high rates of output when
|
||||
* CONFIG_SND_DEBUG is enabled.
|
||||
*/
|
||||
#define snd_printd_ratelimit() printk_ratelimit()
|
||||
|
||||
|
|
|
@ -1284,8 +1284,8 @@ snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_pcm_sgbuf_chunk_size - Compute the max size that fits within the contig.
|
||||
* page from the given size
|
||||
* snd_pcm_sgbuf_get_chunk_size - Compute the max size that fits within the
|
||||
* contig. page from the given size
|
||||
* @substream: PCM substream
|
||||
* @ofs: byte offset
|
||||
* @size: byte size to examine
|
||||
|
|
|
@ -144,7 +144,7 @@ struct snd_compr_metadata {
|
|||
__u32 value[8];
|
||||
} __attribute__((packed, aligned(4)));
|
||||
|
||||
/**
|
||||
/*
|
||||
* compress path ioctl definitions
|
||||
* SNDRV_COMPRESS_GET_CAPS: Query capability of DSP
|
||||
* SNDRV_COMPRESS_GET_CODEC_CAPS: Query capability of a codec
|
||||
|
|
|
@ -1925,8 +1925,8 @@ EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
|
|||
|
||||
#ifdef CONFIG_COMPAT
|
||||
/**
|
||||
* snd_ctl_unregister_ioctl - de-register the device-specific compat 32bit
|
||||
* control-ioctls
|
||||
* snd_ctl_unregister_ioctl_compat - de-register the device-specific compat
|
||||
* 32bit control-ioctls
|
||||
* @fcn: ioctl callback function to unregister
|
||||
*/
|
||||
int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn)
|
||||
|
|
|
@ -356,7 +356,8 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
|
|||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
|
||||
|
||||
/**
|
||||
* snd_dmaengine_pcm_release_chan_close - Close a dmaengine based PCM substream and release channel
|
||||
* snd_dmaengine_pcm_close_release_chan - Close a dmaengine based PCM
|
||||
* substream and release channel
|
||||
* @substream: PCM substream
|
||||
*
|
||||
* Releases the DMA channel associated with the PCM substream.
|
||||
|
|
|
@ -490,7 +490,7 @@ void snd_pcm_set_ops(struct snd_pcm *pcm, int direction,
|
|||
EXPORT_SYMBOL(snd_pcm_set_ops);
|
||||
|
||||
/**
|
||||
* snd_pcm_sync - set the PCM sync id
|
||||
* snd_pcm_set_sync - set the PCM sync id
|
||||
* @substream: the pcm substream
|
||||
*
|
||||
* Sets the PCM sync identifier for the card.
|
||||
|
|
|
@ -112,7 +112,7 @@ void snd_pcm_stream_lock(struct snd_pcm_substream *substream)
|
|||
EXPORT_SYMBOL_GPL(snd_pcm_stream_lock);
|
||||
|
||||
/**
|
||||
* snd_pcm_stream_lock - Unlock the PCM stream
|
||||
* snd_pcm_stream_unlock - Unlock the PCM stream
|
||||
* @substream: PCM substream
|
||||
*
|
||||
* This unlocks the PCM stream that has been locked via snd_pcm_stream_lock().
|
||||
|
@ -595,7 +595,7 @@ static void snd_pcm_sync_stop(struct snd_pcm_substream *substream)
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_pcm_hw_param_choose - choose a configuration defined by @params
|
||||
* snd_pcm_hw_params_choose - choose a configuration defined by @params
|
||||
* @pcm: PCM instance
|
||||
* @params: the hw_params instance
|
||||
*
|
||||
|
|
|
@ -148,6 +148,8 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
|
|||
return NULL;
|
||||
if (bus->idx != bus_idx)
|
||||
return NULL;
|
||||
if (addr < 0 || addr > 31)
|
||||
return NULL;
|
||||
|
||||
list_for_each_entry(hlink, &bus->hlink_list, list) {
|
||||
for (i = 0; i < HDA_MAX_CODECS; i++) {
|
||||
|
|
|
@ -2934,7 +2934,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
|
|||
snd_hdac_leave_pm(&codec->core);
|
||||
}
|
||||
|
||||
static int hda_codec_runtime_suspend(struct device *dev)
|
||||
static int hda_codec_suspend(struct device *dev)
|
||||
{
|
||||
struct hda_codec *codec = dev_to_hda_codec(dev);
|
||||
unsigned int state;
|
||||
|
@ -2953,7 +2953,7 @@ static int hda_codec_runtime_suspend(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hda_codec_runtime_resume(struct device *dev)
|
||||
static int hda_codec_resume(struct device *dev)
|
||||
{
|
||||
struct hda_codec *codec = dev_to_hda_codec(dev);
|
||||
|
||||
|
@ -2967,57 +2967,70 @@ static int hda_codec_runtime_resume(struct device *dev)
|
|||
pm_runtime_mark_last_busy(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hda_codec_runtime_suspend(struct device *dev)
|
||||
{
|
||||
return hda_codec_suspend(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_runtime_resume(struct device *dev)
|
||||
{
|
||||
return hda_codec_resume(dev);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int hda_codec_force_resume(struct device *dev)
|
||||
static int hda_codec_pm_prepare(struct device *dev)
|
||||
{
|
||||
return pm_runtime_suspended(dev);
|
||||
}
|
||||
|
||||
static void hda_codec_pm_complete(struct device *dev)
|
||||
{
|
||||
struct hda_codec *codec = dev_to_hda_codec(dev);
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_force_resume(dev);
|
||||
/* schedule jackpoll work for jack detection update */
|
||||
if (codec->jackpoll_interval ||
|
||||
(pm_runtime_suspended(dev) && hda_codec_need_resume(codec)))
|
||||
schedule_delayed_work(&codec->jackpoll_work,
|
||||
codec->jackpoll_interval);
|
||||
return ret;
|
||||
if (pm_runtime_suspended(dev) && (codec->jackpoll_interval ||
|
||||
hda_codec_need_resume(codec) || codec->forced_resume))
|
||||
pm_request_resume(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_suspend(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_SUSPEND;
|
||||
return pm_runtime_force_suspend(dev);
|
||||
return hda_codec_suspend(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_resume(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_RESUME;
|
||||
return hda_codec_force_resume(dev);
|
||||
return hda_codec_resume(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_freeze(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_FREEZE;
|
||||
return pm_runtime_force_suspend(dev);
|
||||
return hda_codec_suspend(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_thaw(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_THAW;
|
||||
return hda_codec_force_resume(dev);
|
||||
return hda_codec_resume(dev);
|
||||
}
|
||||
|
||||
static int hda_codec_pm_restore(struct device *dev)
|
||||
{
|
||||
dev->power.power_state = PMSG_RESTORE;
|
||||
return hda_codec_force_resume(dev);
|
||||
return hda_codec_resume(dev);
|
||||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
/* referred in hda_bind.c */
|
||||
const struct dev_pm_ops hda_codec_driver_pm = {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.prepare = hda_codec_pm_prepare,
|
||||
.complete = hda_codec_pm_complete,
|
||||
.suspend = hda_codec_pm_suspend,
|
||||
.resume = hda_codec_pm_resume,
|
||||
.freeze = hda_codec_pm_freeze,
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
/* 24 unused */
|
||||
#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
|
||||
#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
|
||||
#define AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP (1 << 27) /* Workaround for spurious wakeups after suspend */
|
||||
/* 27 unused */
|
||||
#define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */
|
||||
#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */
|
||||
#define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */
|
||||
|
@ -143,6 +143,7 @@ struct azx {
|
|||
unsigned int align_buffer_size:1;
|
||||
unsigned int region_requested:1;
|
||||
unsigned int disabled:1; /* disabled by vga_switcheroo */
|
||||
unsigned int pm_prepared:1;
|
||||
|
||||
/* GTS present */
|
||||
unsigned int gts_present:1;
|
||||
|
|
|
@ -297,8 +297,7 @@ enum {
|
|||
/* PCH for HSW/BDW; with runtime PM */
|
||||
/* no i915 binding for this as HSW/BDW has another controller for HDMI */
|
||||
#define AZX_DCAPS_INTEL_PCH \
|
||||
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\
|
||||
AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME)
|
||||
|
||||
/* HSW HDMI */
|
||||
#define AZX_DCAPS_INTEL_HASWELL \
|
||||
|
@ -985,7 +984,7 @@ static void __azx_runtime_suspend(struct azx *chip)
|
|||
display_power(chip, false);
|
||||
}
|
||||
|
||||
static void __azx_runtime_resume(struct azx *chip, bool from_rt)
|
||||
static void __azx_runtime_resume(struct azx *chip)
|
||||
{
|
||||
struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
|
||||
struct hdac_bus *bus = azx_bus(chip);
|
||||
|
@ -1002,7 +1001,8 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt)
|
|||
azx_init_pci(chip);
|
||||
hda_intel_init_chip(chip, true);
|
||||
|
||||
if (from_rt) {
|
||||
/* Avoid codec resume if runtime resume is for system suspend */
|
||||
if (!chip->pm_prepared) {
|
||||
list_for_each_codec(codec, &chip->bus) {
|
||||
if (codec->relaxed_resume)
|
||||
continue;
|
||||
|
@ -1018,6 +1018,29 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int azx_prepare(struct device *dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip;
|
||||
|
||||
chip = card->private_data;
|
||||
chip->pm_prepared = 1;
|
||||
|
||||
/* HDA controller always requires different WAKEEN for runtime suspend
|
||||
* and system suspend, so don't use direct-complete here.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void azx_complete(struct device *dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip;
|
||||
|
||||
chip = card->private_data;
|
||||
chip->pm_prepared = 0;
|
||||
}
|
||||
|
||||
static int azx_suspend(struct device *dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
|
@ -1029,15 +1052,7 @@ static int azx_suspend(struct device *dev)
|
|||
|
||||
chip = card->private_data;
|
||||
bus = azx_bus(chip);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
/* An ugly workaround: direct call of __azx_runtime_suspend() and
|
||||
* __azx_runtime_resume() for old Intel platforms that suffer from
|
||||
* spurious wakeups after S3 suspend
|
||||
*/
|
||||
if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
__azx_runtime_suspend(chip);
|
||||
else
|
||||
pm_runtime_force_suspend(dev);
|
||||
__azx_runtime_suspend(chip);
|
||||
if (bus->irq >= 0) {
|
||||
free_irq(bus->irq, chip);
|
||||
bus->irq = -1;
|
||||
|
@ -1066,11 +1081,7 @@ static int azx_resume(struct device *dev)
|
|||
if (azx_acquire_irq(chip, 1) < 0)
|
||||
return -EIO;
|
||||
|
||||
if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
__azx_runtime_resume(chip, false);
|
||||
else
|
||||
pm_runtime_force_resume(dev);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
||||
__azx_runtime_resume(chip);
|
||||
|
||||
trace_azx_resume(chip);
|
||||
return 0;
|
||||
|
@ -1118,10 +1129,7 @@ static int azx_runtime_suspend(struct device *dev)
|
|||
chip = card->private_data;
|
||||
|
||||
/* enable controller wake up event */
|
||||
if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) {
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
|
||||
STATESTS_INT_MASK);
|
||||
}
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) | STATESTS_INT_MASK);
|
||||
|
||||
__azx_runtime_suspend(chip);
|
||||
trace_azx_runtime_suspend(chip);
|
||||
|
@ -1132,18 +1140,14 @@ static int azx_runtime_resume(struct device *dev)
|
|||
{
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip;
|
||||
bool from_rt = snd_power_get_state(card) == SNDRV_CTL_POWER_D0;
|
||||
|
||||
if (!azx_is_pm_ready(card))
|
||||
return 0;
|
||||
chip = card->private_data;
|
||||
__azx_runtime_resume(chip, from_rt);
|
||||
__azx_runtime_resume(chip);
|
||||
|
||||
/* disable controller Wake Up event*/
|
||||
if (from_rt) {
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
|
||||
~STATESTS_INT_MASK);
|
||||
}
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) & ~STATESTS_INT_MASK);
|
||||
|
||||
trace_azx_runtime_resume(chip);
|
||||
return 0;
|
||||
|
@ -1177,6 +1181,8 @@ static int azx_runtime_idle(struct device *dev)
|
|||
static const struct dev_pm_ops azx_pm = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.prepare = azx_prepare,
|
||||
.complete = azx_complete,
|
||||
.freeze_noirq = azx_freeze_noirq,
|
||||
.thaw_noirq = azx_thaw_noirq,
|
||||
#endif
|
||||
|
@ -2356,6 +2362,7 @@ static int azx_probe_continue(struct azx *chip)
|
|||
|
||||
if (azx_has_pm_runtime(chip)) {
|
||||
pm_runtime_use_autosuspend(&pci->dev);
|
||||
pm_runtime_allow(&pci->dev);
|
||||
pm_runtime_put_autosuspend(&pci->dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -6008,6 +6008,27 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
|
|||
snd_hda_override_wcaps(codec, 0x03, 0);
|
||||
}
|
||||
|
||||
static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
|
||||
{
|
||||
switch (codec->core.vendor_id) {
|
||||
case 0x10ec0274:
|
||||
case 0x10ec0294:
|
||||
case 0x10ec0225:
|
||||
case 0x10ec0295:
|
||||
case 0x10ec0299:
|
||||
alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
|
||||
alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
|
||||
break;
|
||||
case 0x10ec0235:
|
||||
case 0x10ec0236:
|
||||
case 0x10ec0255:
|
||||
case 0x10ec0256:
|
||||
alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
|
||||
alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc295_fixup_chromebook(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
|
@ -6018,16 +6039,7 @@ static void alc295_fixup_chromebook(struct hda_codec *codec,
|
|||
spec->ultra_low_power = true;
|
||||
break;
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
switch (codec->core.vendor_id) {
|
||||
case 0x10ec0295:
|
||||
alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
|
||||
alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
|
||||
break;
|
||||
case 0x10ec0236:
|
||||
alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
|
||||
alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
|
||||
break;
|
||||
}
|
||||
alc_combo_jack_hp_jd_restart(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -6083,6 +6095,16 @@ static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
|
|||
alc_write_coef_idx(codec, 0x65, 0x0);
|
||||
}
|
||||
|
||||
static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
alc_combo_jack_hp_jd_restart(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* for hda_fixup_thinkpad_acpi() */
|
||||
#include "thinkpad_helper.c"
|
||||
|
||||
|
@ -6277,6 +6299,8 @@ enum {
|
|||
ALC256_FIXUP_INTEL_NUC8_RUGGED,
|
||||
ALC255_FIXUP_XIAOMI_HEADSET_MIC,
|
||||
ALC274_FIXUP_HP_MIC,
|
||||
ALC274_FIXUP_HP_HEADSET_MIC,
|
||||
ALC256_FIXUP_ASUS_HPE,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -7664,6 +7688,23 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
{ }
|
||||
},
|
||||
},
|
||||
[ALC274_FIXUP_HP_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc274_fixup_hp_headset_mic,
|
||||
.chained = true,
|
||||
.chain_id = ALC274_FIXUP_HP_MIC
|
||||
},
|
||||
[ALC256_FIXUP_ASUS_HPE] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* Set EAPD high */
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -7815,7 +7856,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x874e, "HP", ALC274_FIXUP_HP_MIC),
|
||||
SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
|
||||
|
@ -7848,6 +7888,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
|
||||
SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
|
||||
|
@ -8339,6 +8380,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x1a, 0x90a70130},
|
||||
{0x1b, 0x90170110},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
|
||||
{0x17, 0x90170110},
|
||||
{0x19, 0x03a11030},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
|
||||
{0x12, 0x90a60130},
|
||||
{0x14, 0x90170110},
|
||||
|
|
|
@ -487,7 +487,6 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
|
|||
}
|
||||
mchp_spdiftx_channel_status_write(dev);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
mr |= SPDIFTX_MR_VALID1 | SPDIFTX_MR_VALID2;
|
||||
|
||||
if (dev->gclk_enabled) {
|
||||
clk_disable_unprepare(dev->gclk);
|
||||
|
|
|
@ -254,8 +254,28 @@ static const struct snd_soc_dapm_widget cs42l51_dapm_widgets[] = {
|
|||
&cs42l51_adcr_mux_controls),
|
||||
};
|
||||
|
||||
static int mclk_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
|
||||
struct cs42l51_private *cs42l51 = snd_soc_component_get_drvdata(comp);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
return clk_prepare_enable(cs42l51->mclk_handle);
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
/* Delay mclk shutdown to fulfill power-down sequence requirements */
|
||||
msleep(20);
|
||||
clk_disable_unprepare(cs42l51->mclk_handle);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget cs42l51_dapm_mclk_widgets[] = {
|
||||
SND_SOC_DAPM_CLOCK_SUPPLY("MCLK")
|
||||
SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, mclk_event,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route cs42l51_routes[] = {
|
||||
|
|
|
@ -618,7 +618,7 @@ static const char * const sb_tx8_mux_text[] = {
|
|||
"ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192"
|
||||
};
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
|
||||
static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
|
||||
|
|
|
@ -551,7 +551,7 @@ struct wcd_iir_filter_ctl {
|
|||
struct soc_bytes_ext bytes_ext;
|
||||
};
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
|
||||
static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
|
||||
|
|
|
@ -1026,6 +1026,8 @@ static struct snd_soc_dai_driver wsa881x_dais[] = {
|
|||
.id = 0,
|
||||
.playback = {
|
||||
.stream_name = "SPKR Playback",
|
||||
.rates = SNDRV_PCM_RATE_48000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rate_max = 48000,
|
||||
.rate_min = 48000,
|
||||
.channels_min = 1,
|
||||
|
|
|
@ -15,22 +15,6 @@ config SND_SOC_INTEL_SST_TOPLEVEL
|
|||
|
||||
if SND_SOC_INTEL_SST_TOPLEVEL
|
||||
|
||||
config SND_SST_IPC
|
||||
tristate
|
||||
# This option controls the IPC core for HiFi2 platforms
|
||||
|
||||
config SND_SST_IPC_PCI
|
||||
tristate
|
||||
select SND_SST_IPC
|
||||
# This option controls the PCI-based IPC for HiFi2 platforms
|
||||
# (Medfield, Merrifield).
|
||||
|
||||
config SND_SST_IPC_ACPI
|
||||
tristate
|
||||
select SND_SST_IPC
|
||||
# This option controls the ACPI-based IPC for HiFi2 platforms
|
||||
# (Baytrail, Cherrytrail)
|
||||
|
||||
config SND_SOC_INTEL_SST
|
||||
tristate
|
||||
|
||||
|
@ -57,7 +41,6 @@ config SND_SST_ATOM_HIFI2_PLATFORM
|
|||
config SND_SST_ATOM_HIFI2_PLATFORM_PCI
|
||||
tristate "PCI HiFi2 (Merrifield) Platforms"
|
||||
depends on X86 && PCI
|
||||
select SND_SST_IPC_PCI
|
||||
select SND_SST_ATOM_HIFI2_PLATFORM
|
||||
help
|
||||
If you have a Intel Merrifield/Edison platform, then
|
||||
|
@ -70,7 +53,6 @@ config SND_SST_ATOM_HIFI2_PLATFORM_ACPI
|
|||
tristate "ACPI HiFi2 (Baytrail, Cherrytrail) Platforms"
|
||||
default ACPI
|
||||
depends on X86 && ACPI && PCI
|
||||
select SND_SST_IPC_ACPI
|
||||
select SND_SST_ATOM_HIFI2_PLATFORM
|
||||
select SND_SOC_ACPI_INTEL_MATCH
|
||||
select IOSF_MBI
|
||||
|
|
|
@ -6,4 +6,4 @@ snd-soc-sst-atom-hifi2-platform-objs := sst-mfld-platform-pcm.o \
|
|||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += snd-soc-sst-atom-hifi2-platform.o
|
||||
|
||||
# DSP driver
|
||||
obj-$(CONFIG_SND_SST_IPC) += sst/
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += sst/
|
||||
|
|
|
@ -3,6 +3,6 @@ snd-intel-sst-core-objs := sst.o sst_ipc.o sst_stream.o sst_drv_interface.o sst_
|
|||
snd-intel-sst-pci-objs += sst_pci.o
|
||||
snd-intel-sst-acpi-objs += sst_acpi.o
|
||||
|
||||
obj-$(CONFIG_SND_SST_IPC) += snd-intel-sst-core.o
|
||||
obj-$(CONFIG_SND_SST_IPC_PCI) += snd-intel-sst-pci.o
|
||||
obj-$(CONFIG_SND_SST_IPC_ACPI) += snd-intel-sst-acpi.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM) += snd-intel-sst-core.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI) += snd-intel-sst-pci.o
|
||||
obj-$(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) += snd-intel-sst-acpi.o
|
||||
|
|
|
@ -401,17 +401,40 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
|
|||
struct snd_interval *chan = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
struct snd_soc_dpcm *dpcm = container_of(
|
||||
params, struct snd_soc_dpcm, hw_params);
|
||||
struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
|
||||
struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
|
||||
struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;
|
||||
|
||||
/*
|
||||
* The following loop will be called only for playback stream
|
||||
* In this platform, there is only one playback device on every SSP
|
||||
*/
|
||||
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
|
||||
rtd_dpcm = dpcm;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* This following loop will be called only for capture stream
|
||||
* In this platform, there is only one capture device on every SSP
|
||||
*/
|
||||
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) {
|
||||
rtd_dpcm = dpcm;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!rtd_dpcm)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* The above 2 loops are mutually exclusive based on the stream direction,
|
||||
* thus rtd_dpcm variable will never be overwritten
|
||||
*/
|
||||
|
||||
/*
|
||||
* The ADSP will convert the FE rate to 48k, stereo, 24 bit
|
||||
*/
|
||||
if (!strcmp(fe_dai_link->name, "Kbl Audio Port") ||
|
||||
!strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") ||
|
||||
!strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) {
|
||||
if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") ||
|
||||
!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") ||
|
||||
!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {
|
||||
rate->min = rate->max = 48000;
|
||||
chan->min = chan->max = 2;
|
||||
snd_mask_none(fmt);
|
||||
|
@ -421,7 +444,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
|
|||
* The speaker on the SSP0 supports S16_LE and not S24_LE.
|
||||
* thus changing the mask here
|
||||
*/
|
||||
if (!strcmp(be_dai_link->name, "SSP0-Codec"))
|
||||
if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec"))
|
||||
snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -267,9 +267,12 @@ static int catpt_dsp_select_lpclock(struct catpt_dev *cdev, bool lp, bool waiti)
|
|||
reg, (reg & CATPT_ISD_DCPWM),
|
||||
500, 10000);
|
||||
if (ret) {
|
||||
dev_err(cdev->dev, "await WAITI timeout\n");
|
||||
mutex_unlock(&cdev->clk_mutex);
|
||||
return ret;
|
||||
dev_warn(cdev->dev, "await WAITI timeout\n");
|
||||
/* no signal - only high clock selection allowed */
|
||||
if (lp) {
|
||||
mutex_unlock(&cdev->clk_mutex);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -667,7 +667,17 @@ static int catpt_dai_pcm_new(struct snd_soc_pcm_runtime *rtm,
|
|||
break;
|
||||
}
|
||||
|
||||
/* see if this is a new configuration */
|
||||
if (!memcmp(&cdev->devfmt[devfmt.iface], &devfmt, sizeof(devfmt)))
|
||||
return 0;
|
||||
|
||||
pm_runtime_get_sync(cdev->dev);
|
||||
|
||||
ret = catpt_ipc_set_device_format(cdev, &devfmt);
|
||||
|
||||
pm_runtime_mark_last_busy(cdev->dev);
|
||||
pm_runtime_put_autosuspend(cdev->dev);
|
||||
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
|
||||
|
|
|
@ -630,15 +630,34 @@ static struct snd_soc_codec_conf mt8183_da7219_rt1015_codec_conf[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new mt8183_da7219_rt1015_snd_controls[] = {
|
||||
SOC_DAPM_PIN_SWITCH("Left Spk"),
|
||||
SOC_DAPM_PIN_SWITCH("Right Spk"),
|
||||
};
|
||||
|
||||
static const
|
||||
struct snd_soc_dapm_widget mt8183_da7219_rt1015_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SPK("Left Spk", NULL),
|
||||
SND_SOC_DAPM_SPK("Right Spk", NULL),
|
||||
SND_SOC_DAPM_PINCTRL("TDM_OUT_PINCTRL",
|
||||
"aud_tdm_out_on", "aud_tdm_out_off"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route mt8183_da7219_rt1015_dapm_routes[] = {
|
||||
{"Left Spk", NULL, "Left SPO"},
|
||||
{"Right Spk", NULL, "Right SPO"},
|
||||
{"I2S Playback", NULL, "TDM_OUT_PINCTRL"},
|
||||
};
|
||||
|
||||
static struct snd_soc_card mt8183_da7219_rt1015_card = {
|
||||
.name = "mt8183_da7219_rt1015",
|
||||
.owner = THIS_MODULE,
|
||||
.controls = mt8183_da7219_max98357_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(mt8183_da7219_max98357_snd_controls),
|
||||
.dapm_widgets = mt8183_da7219_max98357_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_max98357_dapm_widgets),
|
||||
.dapm_routes = mt8183_da7219_max98357_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(mt8183_da7219_max98357_dapm_routes),
|
||||
.controls = mt8183_da7219_rt1015_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(mt8183_da7219_rt1015_snd_controls),
|
||||
.dapm_widgets = mt8183_da7219_rt1015_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_rt1015_dapm_widgets),
|
||||
.dapm_routes = mt8183_da7219_rt1015_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(mt8183_da7219_rt1015_dapm_routes),
|
||||
.dai_link = mt8183_da7219_dai_links,
|
||||
.num_links = ARRAY_SIZE(mt8183_da7219_dai_links),
|
||||
.aux_dev = &mt8183_da7219_max98357_headset_dev,
|
||||
|
|
|
@ -80,6 +80,12 @@ static int lpass_cpu_daiops_startup(struct snd_pcm_substream *substream,
|
|||
dev_err(dai->dev, "error in enabling mi2s osr clk: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = clk_prepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -88,9 +94,8 @@ static void lpass_cpu_daiops_shutdown(struct snd_pcm_substream *substream,
|
|||
{
|
||||
struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
clk_disable_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
|
||||
clk_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
}
|
||||
|
||||
static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,
|
||||
|
@ -303,10 +308,10 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
|
|||
dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
|
||||
ret);
|
||||
|
||||
ret = clk_prepare_enable(drvdata->mi2s_bit_clk[id]);
|
||||
ret = clk_enable(drvdata->mi2s_bit_clk[id]);
|
||||
if (ret) {
|
||||
dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
|
||||
clk_disable_unprepare(drvdata->mi2s_osr_clk[id]);
|
||||
clk_disable(drvdata->mi2s_osr_clk[id]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -324,6 +329,7 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
|
|||
if (ret)
|
||||
dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
|
||||
ret);
|
||||
clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ static struct lpass_variant sc7180_data = {
|
|||
.micmode = REG_FIELD_ID(0x1000, 4, 8, 3, 0x1000),
|
||||
.micmono = REG_FIELD_ID(0x1000, 3, 3, 3, 0x1000),
|
||||
.wssrc = REG_FIELD_ID(0x1000, 2, 2, 3, 0x1000),
|
||||
.bitwidth = REG_FIELD_ID(0x1000, 0, 0, 3, 0x1000),
|
||||
.bitwidth = REG_FIELD_ID(0x1000, 0, 1, 3, 0x1000),
|
||||
|
||||
.rdma_dyncclk = REG_FIELD_ID(0xC000, 21, 21, 5, 0x1000),
|
||||
.rdma_bursten = REG_FIELD_ID(0xC000, 20, 20, 5, 0x1000),
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "qdsp6/q6afe.h"
|
||||
#include "../codecs/rt5663.h"
|
||||
|
||||
#define DRIVER_NAME "sdm845"
|
||||
#define DEFAULT_SAMPLE_RATE_48K 48000
|
||||
#define DEFAULT_MCLK_RATE 24576000
|
||||
#define TDM_BCLK_RATE 6144000
|
||||
|
@ -552,6 +553,7 @@ static int sdm845_snd_platform_probe(struct platform_device *pdev)
|
|||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
card->driver_name = DRIVER_NAME;
|
||||
card->dapm_widgets = sdm845_snd_widgets;
|
||||
card->num_dapm_widgets = ARRAY_SIZE(sdm845_snd_widgets);
|
||||
card->dev = dev;
|
||||
|
|
|
@ -2341,7 +2341,7 @@ struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_soc_unregister_dai - Unregister DAIs from the ASoC core
|
||||
* snd_soc_unregister_dais - Unregister DAIs from the ASoC core
|
||||
*
|
||||
* @component: The component for which the DAIs should be unregistered
|
||||
*/
|
||||
|
|
|
@ -1276,7 +1276,7 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget,
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_get_connected_widgets - query audio path and it's widgets.
|
||||
* snd_soc_dapm_dai_get_connected_widgets - query audio path and it's widgets.
|
||||
* @dai: the soc DAI.
|
||||
* @stream: stream direction.
|
||||
* @list: list of active widgets for this stream.
|
||||
|
|
|
@ -118,6 +118,11 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
|
|||
case SOF_IPC_EXT_CC_INFO:
|
||||
ret = get_cc_info(sdev, ext_hdr);
|
||||
break;
|
||||
case SOF_IPC_EXT_UNUSED:
|
||||
case SOF_IPC_EXT_PROBE_INFO:
|
||||
case SOF_IPC_EXT_USER_ABI_INFO:
|
||||
/* They are supported but we don't do anything here */
|
||||
break;
|
||||
default:
|
||||
dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n",
|
||||
ext_hdr->type, ext_hdr->hdr.size);
|
||||
|
|
|
@ -336,6 +336,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|||
switch (subs->stream->chip->usb_id) {
|
||||
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
|
||||
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
|
||||
case USB_ID(0x22f0, 0x0006): /* Allen&Heath Qu-16 */
|
||||
ep = 0x81;
|
||||
ifnum = 3;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
|
@ -345,6 +346,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|||
ifnum = 2;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
case USB_ID(0x2466, 0x8003): /* Fractal Audio Axe-Fx II */
|
||||
case USB_ID(0x0499, 0x172a): /* Yamaha MODX */
|
||||
ep = 0x86;
|
||||
ifnum = 2;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
|
@ -352,6 +354,10 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|||
ep = 0x81;
|
||||
ifnum = 2;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
case USB_ID(0x1686, 0xf029): /* Zoom UAC-2 */
|
||||
ep = 0x82;
|
||||
ifnum = 2;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
case USB_ID(0x1397, 0x0001): /* Behringer UFX1604 */
|
||||
case USB_ID(0x1397, 0x0002): /* Behringer UFX1204 */
|
||||
ep = 0x81;
|
||||
|
|
|
@ -1800,6 +1800,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
|||
case 0x278b: /* Rotel? */
|
||||
case 0x292b: /* Gustard/Ess based devices */
|
||||
case 0x2ab6: /* T+A devices */
|
||||
case 0x3353: /* Khadas devices */
|
||||
case 0x3842: /* EVGA */
|
||||
case 0xc502: /* HiBy devices */
|
||||
if (fp->dsd_raw)
|
||||
|
|
Loading…
Reference in New Issue