Commit 16f0596f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-5.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "A couple of small fixes are found in the ALSA core side at this time;
  a fix in the new LED handling code and a long-standing (and likely no
  one would notice) ioctl bug.

  The rest are usual HD-audio fixes, mostly device-specific quirks but
  also one major regression fix that was introduced in 5.13"

* tag 'sound-5.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda: update the power_state during the direct-complete
  ALSA: timer: Fix master timer notification
  ALSA: control led: fix memory leak in snd_ctl_led_register
  ALSA: hda: Fix for mute key LED for HP Pavilion 15-CK0xx
  ALSA: hda/cirrus: Set Initial DMIC volume to -26 dB
  ALSA: hda: Fix a regression in Capture Switch mixer read
  ALSA: hda: Add AlderLake-M PCI ID
parents 3a3c5ab3 b8b90c17
...@@ -17,6 +17,9 @@ MODULE_LICENSE("GPL"); ...@@ -17,6 +17,9 @@ MODULE_LICENSE("GPL");
#define MAX_LED (((SNDRV_CTL_ELEM_ACCESS_MIC_LED - SNDRV_CTL_ELEM_ACCESS_SPK_LED) \ #define MAX_LED (((SNDRV_CTL_ELEM_ACCESS_MIC_LED - SNDRV_CTL_ELEM_ACCESS_SPK_LED) \
>> SNDRV_CTL_ELEM_ACCESS_LED_SHIFT) + 1) >> SNDRV_CTL_ELEM_ACCESS_LED_SHIFT) + 1)
#define to_led_card_dev(_dev) \
container_of(_dev, struct snd_ctl_led_card, dev)
enum snd_ctl_led_mode { enum snd_ctl_led_mode {
MODE_FOLLOW_MUTE = 0, MODE_FOLLOW_MUTE = 0,
MODE_FOLLOW_ROUTE, MODE_FOLLOW_ROUTE,
...@@ -371,6 +374,21 @@ static void snd_ctl_led_disconnect(struct snd_card *card) ...@@ -371,6 +374,21 @@ static void snd_ctl_led_disconnect(struct snd_card *card)
snd_ctl_led_refresh(); snd_ctl_led_refresh();
} }
static void snd_ctl_led_card_release(struct device *dev)
{
struct snd_ctl_led_card *led_card = to_led_card_dev(dev);
kfree(led_card);
}
static void snd_ctl_led_release(struct device *dev)
{
}
static void snd_ctl_led_dev_release(struct device *dev)
{
}
/* /*
* sysfs * sysfs
*/ */
...@@ -663,6 +681,7 @@ static void snd_ctl_led_sysfs_add(struct snd_card *card) ...@@ -663,6 +681,7 @@ static void snd_ctl_led_sysfs_add(struct snd_card *card)
led_card->number = card->number; led_card->number = card->number;
led_card->led = led; led_card->led = led;
device_initialize(&led_card->dev); device_initialize(&led_card->dev);
led_card->dev.release = snd_ctl_led_card_release;
if (dev_set_name(&led_card->dev, "card%d", card->number) < 0) if (dev_set_name(&led_card->dev, "card%d", card->number) < 0)
goto cerr; goto cerr;
led_card->dev.parent = &led->dev; led_card->dev.parent = &led->dev;
...@@ -681,7 +700,6 @@ static void snd_ctl_led_sysfs_add(struct snd_card *card) ...@@ -681,7 +700,6 @@ static void snd_ctl_led_sysfs_add(struct snd_card *card)
put_device(&led_card->dev); put_device(&led_card->dev);
cerr2: cerr2:
printk(KERN_ERR "snd_ctl_led: unable to add card%d", card->number); printk(KERN_ERR "snd_ctl_led: unable to add card%d", card->number);
kfree(led_card);
} }
} }
...@@ -700,8 +718,7 @@ static void snd_ctl_led_sysfs_remove(struct snd_card *card) ...@@ -700,8 +718,7 @@ static void snd_ctl_led_sysfs_remove(struct snd_card *card)
snprintf(link_name, sizeof(link_name), "led-%s", led->name); snprintf(link_name, sizeof(link_name), "led-%s", led->name);
sysfs_remove_link(&card->ctl_dev.kobj, link_name); sysfs_remove_link(&card->ctl_dev.kobj, link_name);
sysfs_remove_link(&led_card->dev.kobj, "card"); sysfs_remove_link(&led_card->dev.kobj, "card");
device_del(&led_card->dev); device_unregister(&led_card->dev);
kfree(led_card);
led->cards[card->number] = NULL; led->cards[card->number] = NULL;
} }
} }
...@@ -723,6 +740,7 @@ static int __init snd_ctl_led_init(void) ...@@ -723,6 +740,7 @@ static int __init snd_ctl_led_init(void)
device_initialize(&snd_ctl_led_dev); device_initialize(&snd_ctl_led_dev);
snd_ctl_led_dev.class = sound_class; snd_ctl_led_dev.class = sound_class;
snd_ctl_led_dev.release = snd_ctl_led_dev_release;
dev_set_name(&snd_ctl_led_dev, "ctl-led"); dev_set_name(&snd_ctl_led_dev, "ctl-led");
if (device_add(&snd_ctl_led_dev)) { if (device_add(&snd_ctl_led_dev)) {
put_device(&snd_ctl_led_dev); put_device(&snd_ctl_led_dev);
...@@ -733,15 +751,16 @@ static int __init snd_ctl_led_init(void) ...@@ -733,15 +751,16 @@ static int __init snd_ctl_led_init(void)
INIT_LIST_HEAD(&led->controls); INIT_LIST_HEAD(&led->controls);
device_initialize(&led->dev); device_initialize(&led->dev);
led->dev.parent = &snd_ctl_led_dev; led->dev.parent = &snd_ctl_led_dev;
led->dev.release = snd_ctl_led_release;
led->dev.groups = snd_ctl_led_dev_attr_groups; led->dev.groups = snd_ctl_led_dev_attr_groups;
dev_set_name(&led->dev, led->name); dev_set_name(&led->dev, led->name);
if (device_add(&led->dev)) { if (device_add(&led->dev)) {
put_device(&led->dev); put_device(&led->dev);
for (; group > 0; group--) { for (; group > 0; group--) {
led = &snd_ctl_leds[group - 1]; led = &snd_ctl_leds[group - 1];
device_del(&led->dev); device_unregister(&led->dev);
} }
device_del(&snd_ctl_led_dev); device_unregister(&snd_ctl_led_dev);
return -ENOMEM; return -ENOMEM;
} }
} }
...@@ -767,9 +786,9 @@ static void __exit snd_ctl_led_exit(void) ...@@ -767,9 +786,9 @@ static void __exit snd_ctl_led_exit(void)
} }
for (group = 0; group < MAX_LED; group++) { for (group = 0; group < MAX_LED; group++) {
led = &snd_ctl_leds[group]; led = &snd_ctl_leds[group];
device_del(&led->dev); device_unregister(&led->dev);
} }
device_del(&snd_ctl_led_dev); device_unregister(&snd_ctl_led_dev);
snd_ctl_led_clean(NULL); snd_ctl_led_clean(NULL);
} }
......
...@@ -520,9 +520,10 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event) ...@@ -520,9 +520,10 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
return; return;
if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)
return; return;
event += 10; /* convert to SNDRV_TIMER_EVENT_MXXX */
list_for_each_entry(ts, &ti->slave_active_head, active_list) list_for_each_entry(ts, &ti->slave_active_head, active_list)
if (ts->ccallback) if (ts->ccallback)
ts->ccallback(ts, event + 100, &tstamp, resolution); ts->ccallback(ts, event, &tstamp, resolution);
} }
/* start/continue a master timer */ /* start/continue a master timer */
......
...@@ -331,6 +331,10 @@ static const struct config_entry config_table[] = { ...@@ -331,6 +331,10 @@ static const struct config_entry config_table[] = {
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x51c8, .device = 0x51c8,
}, },
{
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
.device = 0x51cc,
},
#endif #endif
}; };
......
...@@ -2917,6 +2917,7 @@ static int hda_codec_runtime_resume(struct device *dev) ...@@ -2917,6 +2917,7 @@ static int hda_codec_runtime_resume(struct device *dev)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int hda_codec_pm_prepare(struct device *dev) static int hda_codec_pm_prepare(struct device *dev)
{ {
dev->power.power_state = PMSG_SUSPEND;
return pm_runtime_suspended(dev); return pm_runtime_suspended(dev);
} }
...@@ -2924,6 +2925,10 @@ static void hda_codec_pm_complete(struct device *dev) ...@@ -2924,6 +2925,10 @@ static void hda_codec_pm_complete(struct device *dev)
{ {
struct hda_codec *codec = dev_to_hda_codec(dev); struct hda_codec *codec = dev_to_hda_codec(dev);
/* If no other pm-functions are called between prepare() and complete() */
if (dev->power.power_state.event == PM_EVENT_SUSPEND)
dev->power.power_state = PMSG_RESUME;
if (pm_runtime_suspended(dev) && (codec->jackpoll_interval || if (pm_runtime_suspended(dev) && (codec->jackpoll_interval ||
hda_codec_need_resume(codec) || codec->forced_resume)) hda_codec_need_resume(codec) || codec->forced_resume))
pm_request_resume(dev); pm_request_resume(dev);
......
...@@ -3520,6 +3520,7 @@ static int cap_sw_put(struct snd_kcontrol *kcontrol, ...@@ -3520,6 +3520,7 @@ static int cap_sw_put(struct snd_kcontrol *kcontrol,
static const struct snd_kcontrol_new cap_sw_temp = { static const struct snd_kcontrol_new cap_sw_temp = {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Capture Switch", .name = "Capture Switch",
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = cap_sw_info, .info = cap_sw_info,
.get = cap_sw_get, .get = cap_sw_get,
.put = cap_sw_put, .put = cap_sw_put,
......
...@@ -2485,6 +2485,9 @@ static const struct pci_device_id azx_ids[] = { ...@@ -2485,6 +2485,9 @@ static const struct pci_device_id azx_ids[] = {
/* Alderlake-P */ /* Alderlake-P */
{ PCI_DEVICE(0x8086, 0x51c8), { PCI_DEVICE(0x8086, 0x51c8),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
/* Alderlake-M */
{ PCI_DEVICE(0x8086, 0x51cc),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
/* Elkhart Lake */ /* Elkhart Lake */
{ PCI_DEVICE(0x8086, 0x4b55), { PCI_DEVICE(0x8086, 0x4b55),
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
......
...@@ -2206,10 +2206,9 @@ static void cs8409_cs42l42_fixups(struct hda_codec *codec, ...@@ -2206,10 +2206,9 @@ static void cs8409_cs42l42_fixups(struct hda_codec *codec,
break; break;
case HDA_FIXUP_ACT_PROBE: case HDA_FIXUP_ACT_PROBE:
/* Set initial volume on Bullseye to -26 dB */ /* Set initial DMIC volume to -26 dB */
if (codec->fixup_id == CS8409_BULLSEYE) snd_hda_codec_amp_init_stereo(codec, CS8409_CS42L42_DMIC_ADC_PIN_NID,
snd_hda_codec_amp_init_stereo(codec, CS8409_CS42L42_DMIC_ADC_PIN_NID, HDA_INPUT, 0, 0xff, 0x19);
HDA_INPUT, 0, 0xff, 0x19);
snd_hda_gen_add_kctl(&spec->gen, snd_hda_gen_add_kctl(&spec->gen,
NULL, &cs8409_cs42l42_hp_volume_mixer); NULL, &cs8409_cs42l42_hp_volume_mixer);
snd_hda_gen_add_kctl(&spec->gen, snd_hda_gen_add_kctl(&spec->gen,
......
...@@ -8303,6 +8303,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -8303,6 +8303,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN), SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment