History

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

Pull sound fixes from Takashi Iwai: "Well, this one became unpleasantly larger than previous pull requests, but it's a kind of usual pattern: now it contains a collection of ASoC fixes, and nothing to worry too much. The fixes for ASoC core (DAPM, DPCM, topology) are all small and just covering corner cases. The rest changes are driver-specific, many of which are for x86 platforms and new drivers like STM32, in addition to the usual fixups for HD-audio" * tag 'sound-5.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (66 commits) ASoC: wcd9335: Fix missing regmap requirement ALSA: hda: Fix racy display power access ASoC: pcm: fix error handling when try_module_get() fails. ASoC: stm32: sai: fix master clock management ASoC: Intel: kbl: fix wrong number of channels ALSA: hda - Add two more machines to the power_save_blacklist ASoC: pcm: update module refcount if module_get_upon_open is set ASoC: core: conditionally increase module refcount on component open ASoC: stm32: fix sai driver name initialisation ASoC: topology: Use the correct dobj to free enum control values and texts ALSA: seq: Fix OOB-reads from strlcpy ASoC: intel: skylake: add remove() callback for component driver ASoC: cs35l35: Disable regulators on driver removal ALSA: xen-front: Do not use stream buffer size before it is set ASoC: rockchip: pdm: change dma burst to 8 ASoC: rockchip: pdm: fix regmap_ops hang issue ASoC: simple-card: don't select DPCM via simple-audio-card ASoC: audio-graph-card: don't select DPCM via audio-graph-card ASoC: tlv320aic32x4: Change author's name ALSA: hda/realtek - Add quirk for Tuxedo XC 1509 ...

Linus Torvalds committed 7 years ago

Commit 372686e2 parents f2a7346 9b0dcd050 files · +734 −262Browse files

Unified · Split

50 files
  1. include/sound/soc.h +9 −2
  2. include/uapi/sound/asound.h +1 −0
  3. sound/core/seq/seq_clientmgr.c +3 −3
  4. sound/hda/ext/hdac_ext_bus.c +0 −1
  5. sound/hda/hdac_bus.c +1 −0
  6. sound/hda/hdac_component.c +5 −1
  7. sound/pci/hda/hda_intel.c +4 −0
  8. sound/pci/hda/patch_realtek.c +51 −21
  9. sound/soc/codecs/Kconfig +1 −0
  10. sound/soc/codecs/ab8500-codec.c +1 −0
  11. sound/soc/codecs/cs35l35.c +11 −0
  12. sound/soc/codecs/cs4270.c +1 −0
  13. sound/soc/codecs/hdac_hda.c +39 −14
  14. sound/soc/codecs/hdac_hda.h +1 −0
  15. sound/soc/codecs/hdmi-codec.c +59 −62
  16. sound/soc/codecs/nau8810.c +2 −2
  17. sound/soc/codecs/nau8824.c +38 −8
  18. sound/soc/codecs/rt5682.c +25 −31
  19. sound/soc/codecs/tlv320aic32x4-i2c.c +2 −2
  20. sound/soc/codecs/tlv320aic32x4-spi.c +2 −2
  21. sound/soc/codecs/tlv320aic32x4.c +2 −0
  22. sound/soc/codecs/tlv320aic3x.c +3 −1
  23. sound/soc/codecs/wm_adsp.c +33 −7
  24. sound/soc/codecs/wm_adsp.h +1 −0
  25. sound/soc/fsl/fsl_asrc.c +14 −0
  26. sound/soc/fsl/fsl_esai.c +37 −10
  27. sound/soc/generic/audio-graph-card.c +8 −3
  28. sound/soc/generic/simple-card.c +9 −3
  29. sound/soc/intel/atom/sst-mfld-platform-pcm.c +8 −0
  30. sound/soc/intel/boards/cht_bsw_max98090_ti.c +41 −6
  31. sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c +1 −1
  32. sound/soc/intel/skylake/skl-messages.c +1 −0
  33. sound/soc/intel/skylake/skl-pcm.c +22 −6
  34. sound/soc/mediatek/common/mtk-btcvsd.c +68 −1
  35. sound/soc/mediatek/mt8183/mt8183-afe-clk.c +4 −0
  36. sound/soc/rockchip/rockchip_pdm.c +3 −1
  37. sound/soc/samsung/i2s.c +6 −4
  38. sound/soc/samsung/odroid.c +2 −2
  39. sound/soc/sh/rcar/core.c +2 −0
  40. sound/soc/sh/rcar/rsnd.h +5 −0
  41. sound/soc/sh/rcar/src.c +7 −14
  42. sound/soc/soc-core.c +4 −2
  43. sound/soc/soc-dapm.c +11 −0
  44. sound/soc/soc-pcm.c +55 −11
  45. sound/soc/soc-topology.c +4 −3
  46. sound/soc/stm/stm32_adfsdm.c +34 −4
  47. sound/soc/stm/stm32_i2s.c +1 −2
  48. sound/soc/stm/stm32_sai.c +5 −3
  49. sound/soc/stm/stm32_sai_sub.c +86 −28
  50. sound/xen/xen_snd_front_alsa.c +1 −1
include/sound/soc.h+9−2
@@ -802,8 +802,13 @@ struct snd_soc_component_driver { · 801 unmodified lines
802 int probe_order;802 int probe_order;
803 int remove_order;803 int remove_order;
804 804
805 /* signal if the module handling the component cannot be removed */805 /*
806 unsigned int ignore_module_refcount:1;806 * signal if the module handling the component should not be removed
807 * if a pcm is open. Setting this would prevent the module
808 * refcount being incremented in probe() but allow it be incremented
809 * when a pcm is opened and decremented when it is closed.
810 */
811 unsigned int module_get_upon_open:1;
807 812
808 /* bits */813 /* bits */
809 unsigned int idle_bias_on:1;814 unsigned int idle_bias_on:1;
@@ -1083,6 +1088,8 @@ struct snd_soc_card { · 273 unmodified lines
1083 struct mutex mutex;1088 struct mutex mutex;
1084 struct mutex dapm_mutex;1089 struct mutex dapm_mutex;
1085 1090
1091 spinlock_t dpcm_lock;
1092
1086 bool instantiated;1093 bool instantiated;
1087 bool topology_shortname_created;1094 bool topology_shortname_created;
1088 1095
include/uapi/sound/asound.h+1−0
@@ -32,6 +32,7 @@ · 31 unmodified lines
32 32
33#ifndef __KERNEL__33#ifndef __KERNEL__
34#include <stdlib.h>34#include <stdlib.h>
35#include <time.h>
35#endif36#endif
36 37
37/*38/*
sound/core/seq/seq_clientmgr.c+3−3
@@ -1252,7 +1252,7 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client, · 1251 unmodified lines
1252 1252
1253 /* fill the info fields */1253 /* fill the info fields */
1254 if (client_info->name[0])1254 if (client_info->name[0])
1255 strlcpy(client->name, client_info->name, sizeof(client->name));1255 strscpy(client->name, client_info->name, sizeof(client->name));
1256 1256
1257 client->filter = client_info->filter;1257 client->filter = client_info->filter;
1258 client->event_lost = client_info->event_lost;1258 client->event_lost = client_info->event_lost;
@@ -1530,7 +1530,7 @@ static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, void *arg) · 271 unmodified lines
1530 /* set queue name */1530 /* set queue name */
1531 if (!info->name[0])1531 if (!info->name[0])
1532 snprintf(info->name, sizeof(info->name), "Queue-%d", q->queue);1532 snprintf(info->name, sizeof(info->name), "Queue-%d", q->queue);
1533 strlcpy(q->name, info->name, sizeof(q->name));1533 strscpy(q->name, info->name, sizeof(q->name));
1534 snd_use_lock_free(&q->use_lock);1534 snd_use_lock_free(&q->use_lock);
1535 1535
1536 return 0;1536 return 0;
@@ -1592,7 +1592,7 @@ static int snd_seq_ioctl_set_queue_info(struct snd_seq_client *client, · 55 unmodified lines
1592 queuefree(q);1592 queuefree(q);
1593 return -EPERM;1593 return -EPERM;
1594 }1594 }
1595 strlcpy(q->name, info->name, sizeof(q->name));1595 strscpy(q->name, info->name, sizeof(q->name));
1596 queuefree(q);1596 queuefree(q);
1597 1597
1598 return 0;1598 return 0;
sound/hda/ext/hdac_ext_bus.c+0−1
@@ -107,7 +107,6 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, · 106 unmodified lines
107 INIT_LIST_HEAD(&bus->hlink_list);107 INIT_LIST_HEAD(&bus->hlink_list);
108 bus->idx = idx++;108 bus->idx = idx++;
109 109
110 mutex_init(&bus->lock);
111 bus->cmd_dma_state = true;110 bus->cmd_dma_state = true;
112 111
113 return 0;112 return 0;
sound/hda/hdac_bus.c+1−0
@@ -38,6 +38,7 @@ int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev, · 37 unmodified lines
38 INIT_WORK(&bus->unsol_work, snd_hdac_bus_process_unsol_events);38 INIT_WORK(&bus->unsol_work, snd_hdac_bus_process_unsol_events);
39 spin_lock_init(&bus->reg_lock);39 spin_lock_init(&bus->reg_lock);
40 mutex_init(&bus->cmd_mutex);40 mutex_init(&bus->cmd_mutex);
41 mutex_init(&bus->lock);
41 bus->irq = -1;42 bus->irq = -1;
42 return 0;43 return 0;
43}44}
sound/hda/hdac_component.c+5−1
@@ -69,13 +69,15 @@ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable) · 68 unmodified lines
69 69
70 dev_dbg(bus->dev, "display power %s\n",70 dev_dbg(bus->dev, "display power %s\n",
71 enable ? "enable" : "disable");71 enable ? "enable" : "disable");
72
73 mutex_lock(&bus->lock);
72 if (enable)74 if (enable)
73 set_bit(idx, &bus->display_power_status);75 set_bit(idx, &bus->display_power_status);
74 else76 else
75 clear_bit(idx, &bus->display_power_status);77 clear_bit(idx, &bus->display_power_status);
76 78
77 if (!acomp || !acomp->ops)79 if (!acomp || !acomp->ops)
78 return;80 goto unlock;
79 81
80 if (bus->display_power_status) {82 if (bus->display_power_status) {
81 if (!bus->display_power_active) {83 if (!bus->display_power_active) {
@@ -92,6 +94,8 @@ void snd_hdac_display_power(struct hdac_bus *bus, unsigned int idx, bool enable) · 10 unmodified lines
92 bus->display_power_active = false;94 bus->display_power_active = false;
93 }95 }
94 }96 }
97 unlock:
98 mutex_unlock(&bus->lock);
95}99}
96EXPORT_SYMBOL_GPL(snd_hdac_display_power);100EXPORT_SYMBOL_GPL(snd_hdac_display_power);
97 101
sound/pci/hda/hda_intel.c+4−0
@@ -2142,6 +2142,8 @@ static struct snd_pci_quirk power_save_blacklist[] = { · 2141 unmodified lines
2142 SND_PCI_QUIRK(0x8086, 0x2040, "Intel DZ77BH-55K", 0),2142 SND_PCI_QUIRK(0x8086, 0x2040, "Intel DZ77BH-55K", 0),
2143 /* https://bugzilla.kernel.org/show_bug.cgi?id=199607 */2143 /* https://bugzilla.kernel.org/show_bug.cgi?id=199607 */
2144 SND_PCI_QUIRK(0x8086, 0x2057, "Intel NUC5i7RYB", 0),2144 SND_PCI_QUIRK(0x8086, 0x2057, "Intel NUC5i7RYB", 0),
2145 /* https://bugs.launchpad.net/bugs/1821663 */
2146 SND_PCI_QUIRK(0x8086, 0x2064, "Intel SDP 8086:2064", 0),
2145 /* https://bugzilla.redhat.com/show_bug.cgi?id=1520902 */2147 /* https://bugzilla.redhat.com/show_bug.cgi?id=1520902 */
2146 SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),2148 SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),
2147 /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */2149 /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
@@ -2150,6 +2152,8 @@ static struct snd_pci_quirk power_save_blacklist[] = { · 2 unmodified lines
2150 SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),2152 SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),
2151 /* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */2153 /* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
2152 SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0),2154 SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0),
2155 /* https://bugs.launchpad.net/bugs/1821663 */
2156 SND_PCI_QUIRK(0x1631, 0xe017, "Packard Bell NEC IMEDIA 5204", 0),
2153 {}2157 {}
2154};2158};
2155#endif /* CONFIG_PM */2159#endif /* CONFIG_PM */
sound/pci/hda/patch_realtek.c+51−21
@@ -1864,8 +1864,8 @@ enum { · 1863 unmodified lines
1864 ALC887_FIXUP_BASS_CHMAP,1864 ALC887_FIXUP_BASS_CHMAP,
1865 ALC1220_FIXUP_GB_DUAL_CODECS,1865 ALC1220_FIXUP_GB_DUAL_CODECS,
1866 ALC1220_FIXUP_CLEVO_P950,1866 ALC1220_FIXUP_CLEVO_P950,
1867 ALC1220_FIXUP_SYSTEM76_ORYP5,1867 ALC1220_FIXUP_CLEVO_PB51ED,
1868 ALC1220_FIXUP_SYSTEM76_ORYP5_PINS,1868 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1869};1869};
1870 1870
1871static void alc889_fixup_coef(struct hda_codec *codec,1871static void alc889_fixup_coef(struct hda_codec *codec,
@@ -2070,7 +2070,7 @@ static void alc1220_fixup_clevo_p950(struct hda_codec *codec, · 198 unmodified lines
2070static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,2070static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2071 const struct hda_fixup *fix, int action);2071 const struct hda_fixup *fix, int action);
2072 2072
2073static void alc1220_fixup_system76_oryp5(struct hda_codec *codec,2073static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2074 const struct hda_fixup *fix,2074 const struct hda_fixup *fix,
2075 int action)2075 int action)
2076{2076{
@@ -2322,18 +2322,18 @@ static const struct hda_fixup alc882_fixups[] = { · 245 unmodified lines
2322 .type = HDA_FIXUP_FUNC,2322 .type = HDA_FIXUP_FUNC,
2323 .v.func = alc1220_fixup_clevo_p950,2323 .v.func = alc1220_fixup_clevo_p950,
2324 },2324 },
2325 [ALC1220_FIXUP_SYSTEM76_ORYP5] = {2325 [ALC1220_FIXUP_CLEVO_PB51ED] = {
2326 .type = HDA_FIXUP_FUNC,2326 .type = HDA_FIXUP_FUNC,
2327 .v.func = alc1220_fixup_system76_oryp5,2327 .v.func = alc1220_fixup_clevo_pb51ed,
2328 },2328 },
2329 [ALC1220_FIXUP_SYSTEM76_ORYP5_PINS] = {2329 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2330 .type = HDA_FIXUP_PINS,2330 .type = HDA_FIXUP_PINS,
2331 .v.pins = (const struct hda_pintbl[]) {2331 .v.pins = (const struct hda_pintbl[]) {
2332 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */2332 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2333 {}2333 {}
2334 },2334 },
2335 .chained = true,2335 .chained = true,
2336 .chain_id = ALC1220_FIXUP_SYSTEM76_ORYP5,2336 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2337 },2337 },
2338};2338};
2339 2339
@@ -2411,8 +2411,9 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { · 71 unmodified lines
2411 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),2411 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2412 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),2412 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2413 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),2413 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2414 SND_PCI_QUIRK(0x1558, 0x96e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_SYSTEM76_ORYP5_PINS),2414 SND_PCI_QUIRK(0x1558, 0x96e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2415 SND_PCI_QUIRK(0x1558, 0x97e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_SYSTEM76_ORYP5_PINS),2415 SND_PCI_QUIRK(0x1558, 0x97e1, "System76 Oryx Pro (oryp5)", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2416 SND_PCI_QUIRK(0x1558, 0x65d1, "Tuxedo Book XC1509", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2416 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),2417 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2417 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),2418 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2418 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),2419 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
@@ -5491,7 +5492,7 @@ static void alc_headset_btn_callback(struct hda_codec *codec, · 3072 unmodified lines
5491 jack->jack->button_state = report;5492 jack->jack->button_state = report;
5492}5493}
5493 5494
5494static void alc295_fixup_chromebook(struct hda_codec *codec,5495static void alc_fixup_headset_jack(struct hda_codec *codec,
5495 const struct hda_fixup *fix, int action)5496 const struct hda_fixup *fix, int action)
5496{5497{
5497 5498
@@ -5501,16 +5502,6 @@ static void alc295_fixup_chromebook(struct hda_codec *codec, · 3 unmodified lines
5501 alc_headset_btn_callback);5502 alc_headset_btn_callback);
5502 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,5503 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
5503 SND_JACK_HEADSET, alc_headset_btn_keymap);5504 SND_JACK_HEADSET, alc_headset_btn_keymap);
5504 switch (codec->core.vendor_id) {
5505 case 0x10ec0295:
5506 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5507 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5508 break;
5509 case 0x10ec0236:
5510 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5511 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5512 break;
5513 }
5514 break;5505 break;
5515 case HDA_FIXUP_ACT_INIT:5506 case HDA_FIXUP_ACT_INIT:
5516 switch (codec->core.vendor_id) {5507 switch (codec->core.vendor_id) {
@@ -5531,6 +5522,25 @@ static void alc295_fixup_chromebook(struct hda_codec *codec, · 14 unmodified lines
5531 }5522 }
5532}5523}
5533 5524
5525static void alc295_fixup_chromebook(struct hda_codec *codec,
5526 const struct hda_fixup *fix, int action)
5527{
5528 switch (action) {
5529 case HDA_FIXUP_ACT_INIT:
5530 switch (codec->core.vendor_id) {
5531 case 0x10ec0295:
5532 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5533 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5534 break;
5535 case 0x10ec0236:
5536 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5537 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5538 break;
5539 }
5540 break;
5541 }
5542}
5543
5534static void alc_fixup_disable_mic_vref(struct hda_codec *codec,5544static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
5535 const struct hda_fixup *fix, int action)5545 const struct hda_fixup *fix, int action)
5536{5546{
@@ -5663,6 +5673,7 @@ enum { · 126 unmodified lines
5663 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,5673 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
5664 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,5674 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
5665 ALC233_FIXUP_LENOVO_MULTI_CODECS,5675 ALC233_FIXUP_LENOVO_MULTI_CODECS,
5676 ALC233_FIXUP_ACER_HEADSET_MIC,
5666 ALC294_FIXUP_LENOVO_MIC_LOCATION,5677 ALC294_FIXUP_LENOVO_MIC_LOCATION,
5667 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,5678 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
5668 ALC700_FIXUP_INTEL_REFERENCE,5679 ALC700_FIXUP_INTEL_REFERENCE,
@@ -5684,6 +5695,7 @@ enum { · 15 unmodified lines
5684 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,5695 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
5685 ALC255_FIXUP_ACER_HEADSET_MIC,5696 ALC255_FIXUP_ACER_HEADSET_MIC,
5686 ALC295_FIXUP_CHROME_BOOK,5697 ALC295_FIXUP_CHROME_BOOK,
5698 ALC225_FIXUP_HEADSET_JACK,
5687 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,5699 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
5688 ALC225_FIXUP_WYSE_AUTO_MUTE,5700 ALC225_FIXUP_WYSE_AUTO_MUTE,
5689 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,5701 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
@@ -6490,6 +6502,16 @@ static const struct hda_fixup alc269_fixups[] = { · 800 unmodified lines
6490 .type = HDA_FIXUP_FUNC,6502 .type = HDA_FIXUP_FUNC,
6491 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,6503 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6492 },6504 },
6505 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
6506 .type = HDA_FIXUP_VERBS,
6507 .v.verbs = (const struct hda_verb[]) {
6508 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
6509 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
6510 { }
6511 },
6512 .chained = true,
6513 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6514 },
6493 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {6515 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6494 .type = HDA_FIXUP_PINS,6516 .type = HDA_FIXUP_PINS,
6495 .v.pins = (const struct hda_pintbl[]) {6517 .v.pins = (const struct hda_pintbl[]) {
@@ -6635,6 +6657,12 @@ static const struct hda_fixup alc269_fixups[] = { · 139 unmodified lines
6635 [ALC295_FIXUP_CHROME_BOOK] = {6657 [ALC295_FIXUP_CHROME_BOOK] = {
6636 .type = HDA_FIXUP_FUNC,6658 .type = HDA_FIXUP_FUNC,
6637 .v.func = alc295_fixup_chromebook,6659 .v.func = alc295_fixup_chromebook,
6660 .chained = true,
6661 .chain_id = ALC225_FIXUP_HEADSET_JACK
6662 },
6663 [ALC225_FIXUP_HEADSET_JACK] = {
6664 .type = HDA_FIXUP_FUNC,
6665 .v.func = alc_fixup_headset_jack,
6638 },6666 },
6639 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {6667 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
6640 .type = HDA_FIXUP_PINS,6668 .type = HDA_FIXUP_PINS,
@@ -6737,6 +6765,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { · 96 unmodified lines
6737 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),6765 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6738 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),6766 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6739 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),6767 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6768 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
6740 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),6769 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
6741 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),6770 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
6742 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),6771 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
@@ -7132,7 +7161,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = { · 389 unmodified lines
7132 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},7161 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7133 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},7162 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7134 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},7163 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
7135 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-sense-combo"},7164 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7165 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
7136 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},7166 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
7137 {}7167 {}
7138};7168};
sound/soc/codecs/Kconfig+1−0
@@ -1151,6 +1151,7 @@ config SND_SOC_WCD9335 · 1150 unmodified lines
1151 tristate "WCD9335 Codec"1151 tristate "WCD9335 Codec"
1152 depends on SLIMBUS1152 depends on SLIMBUS
1153 select REGMAP_SLIMBUS1153 select REGMAP_SLIMBUS
1154 select REGMAP_IRQ
1154 help1155 help
1155 The WCD9335 is a standalone Hi-Fi audio CODEC IC, supports1156 The WCD9335 is a standalone Hi-Fi audio CODEC IC, supports
1156 Qualcomm Technologies, Inc. (QTI) multimedia solutions,1157 Qualcomm Technologies, Inc. (QTI) multimedia solutions,
sound/soc/codecs/ab8500-codec.c+1−0
@@ -2129,6 +2129,7 @@ static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) · 2128 unmodified lines
2129 dev_err(dai->component->dev,2129 dev_err(dai->component->dev,
2130 "%s: ERROR: The device is either a master or a slave.\n",2130 "%s: ERROR: The device is either a master or a slave.\n",
2131 __func__);2131 __func__);
2132 /* fall through */
2132 default:2133 default:
2133 dev_err(dai->component->dev,2134 dev_err(dai->component->dev,
2134 "%s: ERROR: Unsupporter master mask 0x%x\n",2135 "%s: ERROR: Unsupporter master mask 0x%x\n",
sound/soc/codecs/cs35l35.c+11−0
@@ -1635,6 +1635,16 @@ err: · 1634 unmodified lines
1635 return ret;1635 return ret;
1636}1636}
1637 1637
1638static int cs35l35_i2c_remove(struct i2c_client *i2c_client)
1639{
1640 struct cs35l35_private *cs35l35 = i2c_get_clientdata(i2c_client);
1641
1642 regulator_bulk_disable(cs35l35->num_supplies, cs35l35->supplies);
1643 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0);
1644
1645 return 0;
1646}
1647
1638static const struct of_device_id cs35l35_of_match[] = {1648static const struct of_device_id cs35l35_of_match[] = {
1639 {.compatible = "cirrus,cs35l35"},1649 {.compatible = "cirrus,cs35l35"},
1640 {},1650 {},
@@ -1655,6 +1665,7 @@ static struct i2c_driver cs35l35_i2c_driver = { · 14 unmodified lines
1655 },1665 },
1656 .id_table = cs35l35_id,1666 .id_table = cs35l35_id,
1657 .probe = cs35l35_i2c_probe,1667 .probe = cs35l35_i2c_probe,
1668 .remove = cs35l35_i2c_remove,
1658};1669};
1659 1670
1660module_i2c_driver(cs35l35_i2c_driver);1671module_i2c_driver(cs35l35_i2c_driver);
sound/soc/codecs/cs4270.c+1−0
@@ -642,6 +642,7 @@ static const struct regmap_config cs4270_regmap = { · 641 unmodified lines
642 .reg_defaults = cs4270_reg_defaults,642 .reg_defaults = cs4270_reg_defaults,
643 .num_reg_defaults = ARRAY_SIZE(cs4270_reg_defaults),643 .num_reg_defaults = ARRAY_SIZE(cs4270_reg_defaults),
644 .cache_type = REGCACHE_RBTREE,644 .cache_type = REGCACHE_RBTREE,
645 .write_flag_mask = CS4270_I2C_INCR,
645 646
646 .readable_reg = cs4270_reg_is_readable,647 .readable_reg = cs4270_reg_is_readable,
647 .volatile_reg = cs4270_reg_is_volatile,648 .volatile_reg = cs4270_reg_is_volatile,
sound/soc/codecs/hdac_hda.c+39−14
@@ -38,6 +38,9 @@ static void hdac_hda_dai_close(struct snd_pcm_substream *substream, · 37 unmodified lines
38 struct snd_soc_dai *dai);38 struct snd_soc_dai *dai);
39static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream,39static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream,
40 struct snd_soc_dai *dai);40 struct snd_soc_dai *dai);
41static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
42 struct snd_pcm_hw_params *params,
43 struct snd_soc_dai *dai);
41static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,44static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
42 struct snd_soc_dai *dai);45 struct snd_soc_dai *dai);
43static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,46static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,
@@ -50,6 +53,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = { · 6 unmodified lines
50 .startup = hdac_hda_dai_open,53 .startup = hdac_hda_dai_open,
51 .shutdown = hdac_hda_dai_close,54 .shutdown = hdac_hda_dai_close,
52 .prepare = hdac_hda_dai_prepare,55 .prepare = hdac_hda_dai_prepare,
56 .hw_params = hdac_hda_dai_hw_params,
53 .hw_free = hdac_hda_dai_hw_free,57 .hw_free = hdac_hda_dai_hw_free,
54 .set_tdm_slot = hdac_hda_dai_set_tdm_slot,58 .set_tdm_slot = hdac_hda_dai_set_tdm_slot,
55};59};
@@ -139,6 +143,39 @@ static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai, · 83 unmodified lines
139 return 0;143 return 0;
140}144}
141 145
146static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
147 struct snd_pcm_hw_params *params,
148 struct snd_soc_dai *dai)
149{
150 struct snd_soc_component *component = dai->component;
151 struct hdac_hda_priv *hda_pvt;
152 unsigned int format_val;
153 unsigned int maxbps;
154
155 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
156 maxbps = dai->driver->playback.sig_bits;
157 else
158 maxbps = dai->driver->capture.sig_bits;
159
160 hda_pvt = snd_soc_component_get_drvdata(component);
161 format_val = snd_hdac_calc_stream_format(params_rate(params),
162 params_channels(params),
163 params_format(params),
164 maxbps,
165 0);
166 if (!format_val) {
167 dev_err(dai->dev,
168 "invalid format_val, rate=%d, ch=%d, format=%d, maxbps=%d\n",
169 params_rate(params), params_channels(params),
170 params_format(params), maxbps);
171
172 return -EINVAL;
173 }
174
175 hda_pvt->pcm[dai->id].format_val[substream->stream] = format_val;
176 return 0;
177}
178
142static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,179static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
143 struct snd_soc_dai *dai)180 struct snd_soc_dai *dai)
144{181{
@@ -162,10 +199,9 @@ static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream, · 17 unmodified lines
162 struct snd_soc_dai *dai)199 struct snd_soc_dai *dai)
163{200{
164 struct snd_soc_component *component = dai->component;201 struct snd_soc_component *component = dai->component;
202 struct hda_pcm_stream *hda_stream;
165 struct hdac_hda_priv *hda_pvt;203 struct hdac_hda_priv *hda_pvt;
166 struct snd_pcm_runtime *runtime = substream->runtime;
167 struct hdac_device *hdev;204 struct hdac_device *hdev;
168 struct hda_pcm_stream *hda_stream;
169 unsigned int format_val;205 unsigned int format_val;
170 struct hda_pcm *pcm;206 struct hda_pcm *pcm;
171 unsigned int stream;207 unsigned int stream;
@@ -179,19 +215,8 @@ static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream, · 7 unmodified lines
179 215
180 hda_stream = &pcm->stream[substream->stream];216 hda_stream = &pcm->stream[substream->stream];
181 217
182 format_val = snd_hdac_calc_stream_format(runtime->rate,
183 runtime->channels,
184 runtime->format,
185 hda_stream->maxbps,
186 0);
187 if (!format_val) {
188 dev_err(&hdev->dev,
189 "invalid format_val, rate=%d, ch=%d, format=%d\n",
190 runtime->rate, runtime->channels, runtime->format);
191 return -EINVAL;
192 }
193
194 stream = hda_pvt->pcm[dai->id].stream_tag[substream->stream];218 stream = hda_pvt->pcm[dai->id].stream_tag[substream->stream];
219 format_val = hda_pvt->pcm[dai->id].format_val[substream->stream];
195 220
196 ret = snd_hda_codec_prepare(&hda_pvt->codec, hda_stream,221 ret = snd_hda_codec_prepare(&hda_pvt->codec, hda_stream,
197 stream, format_val, substream);222 stream, format_val, substream);
sound/soc/codecs/hdac_hda.h+1−0
@@ -8,6 +8,7 @@ · 7 unmodified lines
8 8
9struct hdac_hda_pcm {9struct hdac_hda_pcm {
10 int stream_tag[2];10 int stream_tag[2];
11 unsigned int format_val[2];
11};12};
12 13
13struct hdac_hda_priv {14struct hdac_hda_priv {
sound/soc/codecs/hdmi-codec.c+59−62
@@ -484,9 +484,6 @@ static int hdmi_codec_hw_params(struct snd_pcm_substream *substream, · 483 unmodified lines
484 params_width(params), params_rate(params),484 params_width(params), params_rate(params),
485 params_channels(params));485 params_channels(params));
486 486
487 if (params_width(params) > 24)
488 params->msbits = 24;
489
490 ret = snd_pcm_create_iec958_consumer_hw_params(params, hp.iec.status,487 ret = snd_pcm_create_iec958_consumer_hw_params(params, hp.iec.status,
491 sizeof(hp.iec.status));488 sizeof(hp.iec.status));
492 if (ret < 0) {489 if (ret < 0) {
@@ -529,73 +526,71 @@ static int hdmi_codec_set_fmt(struct snd_soc_dai *dai, · 36 unmodified lines
529{526{
530 struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);527 struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
531 struct hdmi_codec_daifmt cf = { 0 };528 struct hdmi_codec_daifmt cf = { 0 };
532 int ret = 0;
533 529
534 dev_dbg(dai->dev, "%s()\n", __func__);530 dev_dbg(dai->dev, "%s()\n", __func__);
535 531
536 if (dai->id == DAI_ID_SPDIF) {532 if (dai->id == DAI_ID_SPDIF)
537 cf.fmt = HDMI_SPDIF;533 return 0;
538 } else {534
539 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {535 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
540 case SND_SOC_DAIFMT_CBM_CFM:536 case SND_SOC_DAIFMT_CBM_CFM:
541 cf.bit_clk_master = 1;537 cf.bit_clk_master = 1;
542 cf.frame_clk_master = 1;538 cf.frame_clk_master = 1;
543 break;539 break;
544 case SND_SOC_DAIFMT_CBS_CFM:540 case SND_SOC_DAIFMT_CBS_CFM:
545 cf.frame_clk_master = 1;541 cf.frame_clk_master = 1;
546 break;542 break;
547 case SND_SOC_DAIFMT_CBM_CFS:543 case SND_SOC_DAIFMT_CBM_CFS:
548 cf.bit_clk_master = 1;544 cf.bit_clk_master = 1;
549 break;545 break;
550 case SND_SOC_DAIFMT_CBS_CFS:546 case SND_SOC_DAIFMT_CBS_CFS:
551 break;547 break;
552 default:548 default:
553 return -EINVAL;549 return -EINVAL;
554 }550 }
555 551
556 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {552 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
557 case SND_SOC_DAIFMT_NB_NF:553 case SND_SOC_DAIFMT_NB_NF:
558 break;554 break;
559 case SND_SOC_DAIFMT_NB_IF:555 case SND_SOC_DAIFMT_NB_IF:
560 cf.frame_clk_inv = 1;556 cf.frame_clk_inv = 1;
561 break;557 break;
562 case SND_SOC_DAIFMT_IB_NF:558 case SND_SOC_DAIFMT_IB_NF:
563 cf.bit_clk_inv = 1;559 cf.bit_clk_inv = 1;
564 break;560 break;
565 case SND_SOC_DAIFMT_IB_IF:561 case SND_SOC_DAIFMT_IB_IF:
566 cf.frame_clk_inv = 1;562 cf.frame_clk_inv = 1;
567 cf.bit_clk_inv = 1;563 cf.bit_clk_inv = 1;
568 break;564 break;
569 }565 }
570 566
571 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {567 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
572 case SND_SOC_DAIFMT_I2S:568 case SND_SOC_DAIFMT_I2S:
573 cf.fmt = HDMI_I2S;569 cf.fmt = HDMI_I2S;
574 break;570 break;
575 case SND_SOC_DAIFMT_DSP_A:571 case SND_SOC_DAIFMT_DSP_A:
576 cf.fmt = HDMI_DSP_A;572 cf.fmt = HDMI_DSP_A;
577 break;573 break;
578 case SND_SOC_DAIFMT_DSP_B:574 case SND_SOC_DAIFMT_DSP_B:
579 cf.fmt = HDMI_DSP_B;575 cf.fmt = HDMI_DSP_B;
580 break;576 break;
581 case SND_SOC_DAIFMT_RIGHT_J:577 case SND_SOC_DAIFMT_RIGHT_J:
582 cf.fmt = HDMI_RIGHT_J;578 cf.fmt = HDMI_RIGHT_J;
583 break;579 break;
584 case SND_SOC_DAIFMT_LEFT_J:580 case SND_SOC_DAIFMT_LEFT_J:
585 cf.fmt = HDMI_LEFT_J;581 cf.fmt = HDMI_LEFT_J;
586 break;582 break;
587 case SND_SOC_DAIFMT_AC97:583 case SND_SOC_DAIFMT_AC97:
588 cf.fmt = HDMI_AC97;584 cf.fmt = HDMI_AC97;
589 break;585 break;
590 default:586 default:
591 dev_err(dai->dev, "Invalid DAI interface format\n");587 dev_err(dai->dev, "Invalid DAI interface format\n");
592 return -EINVAL;588 return -EINVAL;
593 }
594 }589 }
595 590
596 hcp->daifmt[dai->id] = cf;591 hcp->daifmt[dai->id] = cf;
597 592
598 return ret;593 return 0;
599}594}
600 595
601static int hdmi_codec_digital_mute(struct snd_soc_dai *dai, int mute)596static int hdmi_codec_digital_mute(struct snd_soc_dai *dai, int mute)
@@ -792,8 +787,10 @@ static int hdmi_codec_probe(struct platform_device *pdev) · 190 unmodified lines
792 i++;787 i++;
793 }788 }
794 789
795 if (hcd->spdif)790 if (hcd->spdif) {
796 hcp->daidrv[i] = hdmi_spdif_dai;791 hcp->daidrv[i] = hdmi_spdif_dai;
792 hcp->daifmt[DAI_ID_SPDIF].fmt = HDMI_SPDIF;
793 }
797 794
798 dev_set_drvdata(dev, hcp);795 dev_set_drvdata(dev, hcp);
799 796
sound/soc/codecs/nau8810.c+2−2
@@ -411,9 +411,9 @@ static const struct snd_soc_dapm_widget nau8810_dapm_widgets[] = { · 410 unmodified lines
411 SND_SOC_DAPM_MIXER("Mono Mixer", NAU8810_REG_POWER3,411 SND_SOC_DAPM_MIXER("Mono Mixer", NAU8810_REG_POWER3,
412 NAU8810_MOUTMX_EN_SFT, 0, &nau8810_mono_mixer_controls[0],412 NAU8810_MOUTMX_EN_SFT, 0, &nau8810_mono_mixer_controls[0],
413 ARRAY_SIZE(nau8810_mono_mixer_controls)),413 ARRAY_SIZE(nau8810_mono_mixer_controls)),
414 SND_SOC_DAPM_DAC("DAC", "HiFi Playback", NAU8810_REG_POWER3,414 SND_SOC_DAPM_DAC("DAC", "Playback", NAU8810_REG_POWER3,
415 NAU8810_DAC_EN_SFT, 0),415 NAU8810_DAC_EN_SFT, 0),
416 SND_SOC_DAPM_ADC("ADC", "HiFi Capture", NAU8810_REG_POWER2,416 SND_SOC_DAPM_ADC("ADC", "Capture", NAU8810_REG_POWER2,
417 NAU8810_ADC_EN_SFT, 0),417 NAU8810_ADC_EN_SFT, 0),
418 SND_SOC_DAPM_PGA("SpkN Out", NAU8810_REG_POWER3,418 SND_SOC_DAPM_PGA("SpkN Out", NAU8810_REG_POWER3,
419 NAU8810_NSPK_EN_SFT, 0, NULL, 0),419 NAU8810_NSPK_EN_SFT, 0, NULL, 0),
sound/soc/codecs/nau8824.c+38−8
@@ -681,8 +681,8 @@ static const struct snd_soc_dapm_widget nau8824_dapm_widgets[] = { · 680 unmodified lines
681 SND_SOC_DAPM_ADC("ADCR", NULL, NAU8824_REG_ANALOG_ADC_2,681 SND_SOC_DAPM_ADC("ADCR", NULL, NAU8824_REG_ANALOG_ADC_2,
682 NAU8824_ADCR_EN_SFT, 0),682 NAU8824_ADCR_EN_SFT, 0),
683 683
684 SND_SOC_DAPM_AIF_OUT("AIFTX", "HiFi Capture", 0, SND_SOC_NOPM, 0, 0),684 SND_SOC_DAPM_AIF_OUT("AIFTX", "Capture", 0, SND_SOC_NOPM, 0, 0),
685 SND_SOC_DAPM_AIF_IN("AIFRX", "HiFi Playback", 0, SND_SOC_NOPM, 0, 0),685 SND_SOC_DAPM_AIF_IN("AIFRX", "Playback", 0, SND_SOC_NOPM, 0, 0),
686 686
687 SND_SOC_DAPM_DAC("DACL", NULL, NAU8824_REG_RDAC,687 SND_SOC_DAPM_DAC("DACL", NULL, NAU8824_REG_RDAC,
688 NAU8824_DACL_EN_SFT, 0),688 NAU8824_DACL_EN_SFT, 0),
@@ -831,6 +831,36 @@ static void nau8824_int_status_clear_all(struct regmap *regmap) · 142 unmodified lines
831 }831 }
832}832}
833 833
834static void nau8824_dapm_disable_pin(struct nau8824 *nau8824, const char *pin)
835{
836 struct snd_soc_dapm_context *dapm = nau8824->dapm;
837 const char *prefix = dapm->component->name_prefix;
838 char prefixed_pin[80];
839
840 if (prefix) {
841 snprintf(prefixed_pin, sizeof(prefixed_pin), "%s %s",
842 prefix, pin);
843 snd_soc_dapm_disable_pin(dapm, prefixed_pin);
844 } else {
845 snd_soc_dapm_disable_pin(dapm, pin);
846 }
847}
848
849static void nau8824_dapm_enable_pin(struct nau8824 *nau8824, const char *pin)
850{
851 struct snd_soc_dapm_context *dapm = nau8824->dapm;
852 const char *prefix = dapm->component->name_prefix;
853 char prefixed_pin[80];
854
855 if (prefix) {
856 snprintf(prefixed_pin, sizeof(prefixed_pin), "%s %s",
857 prefix, pin);
858 snd_soc_dapm_force_enable_pin(dapm, prefixed_pin);
859 } else {
860 snd_soc_dapm_force_enable_pin(dapm, pin);
861 }
862}
863
834static void nau8824_eject_jack(struct nau8824 *nau8824)864static void nau8824_eject_jack(struct nau8824 *nau8824)
835{865{
836 struct snd_soc_dapm_context *dapm = nau8824->dapm;866 struct snd_soc_dapm_context *dapm = nau8824->dapm;
@@ -839,8 +869,8 @@ static void nau8824_eject_jack(struct nau8824 *nau8824) · 2 unmodified lines
839 /* Clear all interruption status */869 /* Clear all interruption status */
840 nau8824_int_status_clear_all(regmap);870 nau8824_int_status_clear_all(regmap);
841 871
842 snd_soc_dapm_disable_pin(dapm, "SAR");872 nau8824_dapm_disable_pin(nau8824, "SAR");
843 snd_soc_dapm_disable_pin(dapm, "MICBIAS");873 nau8824_dapm_disable_pin(nau8824, "MICBIAS");
844 snd_soc_dapm_sync(dapm);874 snd_soc_dapm_sync(dapm);
845 875
846 /* Enable the insertion interruption, disable the ejection876 /* Enable the insertion interruption, disable the ejection
@@ -870,8 +900,8 @@ static void nau8824_jdet_work(struct work_struct *work) · 23 unmodified lines
870 struct regmap *regmap = nau8824->regmap;900 struct regmap *regmap = nau8824->regmap;
871 int adc_value, event = 0, event_mask = 0;901 int adc_value, event = 0, event_mask = 0;
872 902
873 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");903 nau8824_dapm_enable_pin(nau8824, "MICBIAS");
874 snd_soc_dapm_force_enable_pin(dapm, "SAR");904 nau8824_dapm_enable_pin(nau8824, "SAR");
875 snd_soc_dapm_sync(dapm);905 snd_soc_dapm_sync(dapm);
876 906
877 msleep(100);907 msleep(100);
@@ -882,8 +912,8 @@ static void nau8824_jdet_work(struct work_struct *work) · 4 unmodified lines
882 if (adc_value < HEADSET_SARADC_THD) {912 if (adc_value < HEADSET_SARADC_THD) {
883 event |= SND_JACK_HEADPHONE;913 event |= SND_JACK_HEADPHONE;
884 914
885 snd_soc_dapm_disable_pin(dapm, "SAR");915 nau8824_dapm_disable_pin(nau8824, "SAR");
886 snd_soc_dapm_disable_pin(dapm, "MICBIAS");916 nau8824_dapm_disable_pin(nau8824, "MICBIAS");
887 snd_soc_dapm_sync(dapm);917 snd_soc_dapm_sync(dapm);
888 } else {918 } else {
889 event |= SND_JACK_HEADSET;919 event |= SND_JACK_HEADSET;
sound/soc/codecs/rt5682.c+25−31
@@ -910,13 +910,21 @@ static int rt5682_headset_detect(struct snd_soc_component *component, · 909 unmodified lines
910 int jack_insert)910 int jack_insert)
911{911{
912 struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);912 struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
913 struct snd_soc_dapm_context *dapm =
914 snd_soc_component_get_dapm(component);
915 unsigned int val, count;913 unsigned int val, count;
916 914
917 if (jack_insert) {915 if (jack_insert) {
918 snd_soc_dapm_force_enable_pin(dapm, "CBJ Power");916
919 snd_soc_dapm_sync(dapm);917 snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
918 RT5682_PWR_VREF2 | RT5682_PWR_MB,
919 RT5682_PWR_VREF2 | RT5682_PWR_MB);
920 snd_soc_component_update_bits(component,
921 RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0);
922 usleep_range(15000, 20000);
923 snd_soc_component_update_bits(component,
924 RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2);
925 snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
926 RT5682_PWR_CBJ, RT5682_PWR_CBJ);
927
920 snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,928 snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
921 RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);929 RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
922 930
@@ -944,8 +952,10 @@ static int rt5682_headset_detect(struct snd_soc_component *component, · 21 unmodified lines
944 rt5682_enable_push_button_irq(component, false);952 rt5682_enable_push_button_irq(component, false);
945 snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,953 snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
946 RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);954 RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
947 snd_soc_dapm_disable_pin(dapm, "CBJ Power");955 snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1,
948 snd_soc_dapm_sync(dapm);956 RT5682_PWR_VREF2 | RT5682_PWR_MB, 0);
957 snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3,
958 RT5682_PWR_CBJ, 0);
949 959
950 rt5682->jack_type = 0;960 rt5682->jack_type = 0;
951 }961 }
@@ -1198,7 +1208,7 @@ static int set_filter_clk(struct snd_soc_dapm_widget *w, · 246 unmodified lines
1198 struct snd_soc_component *component =1208 struct snd_soc_component *component =
1199 snd_soc_dapm_to_component(w->dapm);1209 snd_soc_dapm_to_component(w->dapm);
1200 struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);1210 struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
1201 int ref, val, reg, sft, mask, idx = -EINVAL;1211 int ref, val, reg, idx = -EINVAL;
1202 static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};1212 static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};
1203 static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};1213 static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};
1204 1214
@@ -1212,15 +1222,10 @@ static int set_filter_clk(struct snd_soc_dapm_widget *w, · 7 unmodified lines
1212 1222
1213 idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f));1223 idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f));
1214 1224
1215 if (w->shift == RT5682_PWR_ADC_S1F_BIT) {1225 if (w->shift == RT5682_PWR_ADC_S1F_BIT)
1216 reg = RT5682_PLL_TRACK_3;1226 reg = RT5682_PLL_TRACK_3;
1217 sft = RT5682_ADC_OSR_SFT;1227 else
1218 mask = RT5682_ADC_OSR_MASK;
1219 } else {
1220 reg = RT5682_PLL_TRACK_2;1228 reg = RT5682_PLL_TRACK_2;
1221 sft = RT5682_DAC_OSR_SFT;
1222 mask = RT5682_DAC_OSR_MASK;
1223 }
1224 1229
1225 snd_soc_component_update_bits(component, reg,1230 snd_soc_component_update_bits(component, reg,
1226 RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT);1231 RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT);
@@ -1232,7 +1237,8 @@ static int set_filter_clk(struct snd_soc_dapm_widget *w, · 5 unmodified lines
1232 }1237 }
1233 1238
1234 snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,1239 snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1,
1235 mask, idx << sft);1240 RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK,
1241 (idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT));
1236 1242
1237 return 0;1243 return 0;
1238}1244}
@@ -1591,8 +1597,6 @@ static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = { · 352 unmodified lines
1591 0, NULL, 0),1597 0, NULL, 0),
1592 SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0,1598 SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0,
1593 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),1599 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1594 SND_SOC_DAPM_SUPPLY("Vref2", RT5682_PWR_ANLG_1, RT5682_PWR_VREF2_BIT, 0,
1595 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1596 1600
1597 /* ASRC */1601 /* ASRC */
1598 SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1,1602 SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1,
@@ -1627,9 +1631,6 @@ static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = { · 28 unmodified lines
1627 SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,1631 SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
1628 0, 0, NULL, 0),1632 0, 0, NULL, 0),
1629 1633
1630 SND_SOC_DAPM_SUPPLY("CBJ Power", RT5682_PWR_ANLG_3,
1631 RT5682_PWR_CBJ_BIT, 0, NULL, 0),
1632
1633 /* REC Mixer */1634 /* REC Mixer */
1634 SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix,1635 SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix,
1635 ARRAY_SIZE(rt5682_rec1_l_mix)),1636 ARRAY_SIZE(rt5682_rec1_l_mix)),
@@ -1792,17 +1793,13 @@ static const struct snd_soc_dapm_route rt5682_dapm_routes[] = { · 156 unmodified lines
1792 1793
1793 /*Vref*/1794 /*Vref*/
1794 {"MICBIAS1", NULL, "Vref1"},1795 {"MICBIAS1", NULL, "Vref1"},
1795 {"MICBIAS1", NULL, "Vref2"},
1796 {"MICBIAS2", NULL, "Vref1"},1796 {"MICBIAS2", NULL, "Vref1"},
1797 {"MICBIAS2", NULL, "Vref2"},
1798 1797
1799 {"CLKDET SYS", NULL, "CLKDET"},1798 {"CLKDET SYS", NULL, "CLKDET"},
1800 1799
1801 {"IN1P", NULL, "LDO2"},1800 {"IN1P", NULL, "LDO2"},
1802 1801
1803 {"BST1 CBJ", NULL, "IN1P"},1802 {"BST1 CBJ", NULL, "IN1P"},
1804 {"BST1 CBJ", NULL, "CBJ Power"},
1805 {"CBJ Power", NULL, "Vref2"},
1806 1803
1807 {"RECMIX1L", "CBJ Switch", "BST1 CBJ"},1804 {"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
1808 {"RECMIX1L", NULL, "RECMIX1L Power"},1805 {"RECMIX1L", NULL, "RECMIX1L Power"},
@@ -1912,9 +1909,7 @@ static const struct snd_soc_dapm_route rt5682_dapm_routes[] = { · 103 unmodified lines
1912 {"HP Amp", NULL, "Capless"},1909 {"HP Amp", NULL, "Capless"},
1913 {"HP Amp", NULL, "Charge Pump"},1910 {"HP Amp", NULL, "Charge Pump"},
1914 {"HP Amp", NULL, "CLKDET SYS"},1911 {"HP Amp", NULL, "CLKDET SYS"},
1915 {"HP Amp", NULL, "CBJ Power"},
1916 {"HP Amp", NULL, "Vref1"},1912 {"HP Amp", NULL, "Vref1"},
1917 {"HP Amp", NULL, "Vref2"},
1918 {"HPOL Playback", "Switch", "HP Amp"},1913 {"HPOL Playback", "Switch", "HP Amp"},
1919 {"HPOR Playback", "Switch", "HP Amp"},1914 {"HPOR Playback", "Switch", "HP Amp"},
1920 {"HPOL", NULL, "HPOL Playback"},1915 {"HPOL", NULL, "HPOL Playback"},
@@ -2303,16 +2298,13 @@ static int rt5682_set_bias_level(struct snd_soc_component *component, · 382 unmodified lines
2303 switch (level) {2298 switch (level) {
2304 case SND_SOC_BIAS_PREPARE:2299 case SND_SOC_BIAS_PREPARE:
2305 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,2300 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2306 RT5682_PWR_MB | RT5682_PWR_BG,2301 RT5682_PWR_BG, RT5682_PWR_BG);
2307 RT5682_PWR_MB | RT5682_PWR_BG);
2308 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,2302 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2309 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO,2303 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO,
2310 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO);2304 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO);
2311 break;2305 break;
2312 2306
2313 case SND_SOC_BIAS_STANDBY:2307 case SND_SOC_BIAS_STANDBY:
2314 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2315 RT5682_PWR_MB, RT5682_PWR_MB);
2316 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,2308 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2317 RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL);2309 RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL);
2318 break;2310 break;
@@ -2320,7 +2312,7 @@ static int rt5682_set_bias_level(struct snd_soc_component *component, · 1 unmodified line
2320 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,2312 regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1,
2321 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0);2313 RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0);
2322 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,2314 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1,
2323 RT5682_PWR_MB | RT5682_PWR_BG, 0);2315 RT5682_PWR_BG, 0);
2324 break;2316 break;
2325 2317
2326 default:2318 default:
@@ -2363,6 +2355,8 @@ static int rt5682_resume(struct snd_soc_component *component) · 36 unmodified lines
2363 regcache_cache_only(rt5682->regmap, false);2355 regcache_cache_only(rt5682->regmap, false);
2364 regcache_sync(rt5682->regmap);2356 regcache_sync(rt5682->regmap);
2365 2357
2358 rt5682_irq(0, rt5682);
2359
2366 return 0;2360 return 0;
2367}2361}
2368#else2362#else
sound/soc/codecs/tlv320aic32x4-i2c.c+2−2
@@ -3,7 +3,7 @@ · 2 unmodified lines
3 *3 *
4 * Copyright 2011 NW Digital Radio4 * Copyright 2011 NW Digital Radio
5 *5 *
6 * Author: Jeremy McDermond <nh6z@nh6z.net>6 * Author: Annaliese McDermond <nh6z@nh6z.net>
7 *7 *
8 * Based on sound/soc/codecs/wm8974 and TI driver for kernel 2.6.27.8 * Based on sound/soc/codecs/wm8974 and TI driver for kernel 2.6.27.
9 *9 *
@@ -72,5 +72,5 @@ static struct i2c_driver aic32x4_i2c_driver = { · 62 unmodified lines
72module_i2c_driver(aic32x4_i2c_driver);72module_i2c_driver(aic32x4_i2c_driver);
73 73
74MODULE_DESCRIPTION("ASoC TLV320AIC32x4 codec driver I2C");74MODULE_DESCRIPTION("ASoC TLV320AIC32x4 codec driver I2C");
75MODULE_AUTHOR("Jeremy McDermond <nh6z@nh6z.net>");75MODULE_AUTHOR("Annaliese McDermond <nh6z@nh6z.net>");
76MODULE_LICENSE("GPL");76MODULE_LICENSE("GPL");
sound/soc/codecs/tlv320aic32x4-spi.c+2−2
@@ -3,7 +3,7 @@ · 2 unmodified lines
3 *3 *
4 * Copyright 2011 NW Digital Radio4 * Copyright 2011 NW Digital Radio
5 *5 *
6 * Author: Jeremy McDermond <nh6z@nh6z.net>6 * Author: Annaliese McDermond <nh6z@nh6z.net>
7 *7 *
8 * Based on sound/soc/codecs/wm8974 and TI driver for kernel 2.6.27.8 * Based on sound/soc/codecs/wm8974 and TI driver for kernel 2.6.27.
9 *9 *
@@ -74,5 +74,5 @@ static struct spi_driver aic32x4_spi_driver = { · 64 unmodified lines
74module_spi_driver(aic32x4_spi_driver);74module_spi_driver(aic32x4_spi_driver);
75 75
76MODULE_DESCRIPTION("ASoC TLV320AIC32x4 codec driver SPI");76MODULE_DESCRIPTION("ASoC TLV320AIC32x4 codec driver SPI");
77MODULE_AUTHOR("Jeremy McDermond <nh6z@nh6z.net>");77MODULE_AUTHOR("Annaliese McDermond <nh6z@nh6z.net>");
78MODULE_LICENSE("GPL");78MODULE_LICENSE("GPL");
sound/soc/codecs/tlv320aic32x4.c+2−0
@@ -490,6 +490,8 @@ static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = { · 489 unmodified lines
490 SND_SOC_DAPM_INPUT("IN2_R"),490 SND_SOC_DAPM_INPUT("IN2_R"),
491 SND_SOC_DAPM_INPUT("IN3_L"),491 SND_SOC_DAPM_INPUT("IN3_L"),
492 SND_SOC_DAPM_INPUT("IN3_R"),492 SND_SOC_DAPM_INPUT("IN3_R"),
493 SND_SOC_DAPM_INPUT("CM_L"),
494 SND_SOC_DAPM_INPUT("CM_R"),
493};495};
494 496
495static const struct snd_soc_dapm_route aic32x4_dapm_routes[] = {497static const struct snd_soc_dapm_route aic32x4_dapm_routes[] = {
sound/soc/codecs/tlv320aic3x.c+3−1
@@ -1609,7 +1609,6 @@ static int aic3x_probe(struct snd_soc_component *component) · 1608 unmodified lines
1609 struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component);1609 struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component);
1610 int ret, i;1610 int ret, i;
1611 1611
1612 INIT_LIST_HEAD(&aic3x->list);
1613 aic3x->component = component;1612 aic3x->component = component;
1614 1613
1615 for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) {1614 for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) {
@@ -1873,6 +1872,7 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, · 257 unmodified lines
1873 if (ret != 0)1872 if (ret != 0)
1874 goto err_gpio;1873 goto err_gpio;
1875 1874
1875 INIT_LIST_HEAD(&aic3x->list);
1876 list_add(&aic3x->list, &reset_list);1876 list_add(&aic3x->list, &reset_list);
1877 1877
1878 return 0;1878 return 0;
@@ -1889,6 +1889,8 @@ static int aic3x_i2c_remove(struct i2c_client *client) · 10 unmodified lines
1889{1889{
1890 struct aic3x_priv *aic3x = i2c_get_clientdata(client);1890 struct aic3x_priv *aic3x = i2c_get_clientdata(client);
1891 1891
1892 list_del(&aic3x->list);
1893
1892 if (gpio_is_valid(aic3x->gpio_reset) &&1894 if (gpio_is_valid(aic3x->gpio_reset) &&
1893 !aic3x_is_shared_reset(aic3x)) {1895 !aic3x_is_shared_reset(aic3x)) {
1894 gpio_set_value(aic3x->gpio_reset, 0);1896 gpio_set_value(aic3x->gpio_reset, 0);
sound/soc/codecs/wm_adsp.c+33−7
@@ -2905,6 +2905,8 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w, · 2904 unmodified lines
2905 if (wm_adsp_fw[dsp->fw].num_caps != 0)2905 if (wm_adsp_fw[dsp->fw].num_caps != 0)
2906 wm_adsp_buffer_free(dsp);2906 wm_adsp_buffer_free(dsp);
2907 2907
2908 dsp->fatal_error = false;
2909
2908 mutex_unlock(&dsp->pwr_lock);2910 mutex_unlock(&dsp->pwr_lock);
2909 2911
2910 adsp_dbg(dsp, "Execution stopped\n");2912 adsp_dbg(dsp, "Execution stopped\n");
@@ -3000,6 +3002,9 @@ static int wm_adsp_compr_attach(struct wm_adsp_compr *compr) · 89 unmodified lines
3000{3002{
3001 struct wm_adsp_compr_buf *buf = NULL, *tmp;3003 struct wm_adsp_compr_buf *buf = NULL, *tmp;
3002 3004
3005 if (compr->dsp->fatal_error)
3006 return -EINVAL;
3007
3003 list_for_each_entry(tmp, &compr->dsp->buffer_list, list) {3008 list_for_each_entry(tmp, &compr->dsp->buffer_list, list) {
3004 if (!tmp->name || !strcmp(compr->name, tmp->name)) {3009 if (!tmp->name || !strcmp(compr->name, tmp->name)) {
3005 buf = tmp;3010 buf = tmp;
@@ -3535,11 +3540,11 @@ static int wm_adsp_buffer_get_error(struct wm_adsp_compr_buf *buf) · 529 unmodified lines
3535 3540
3536 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(error), &buf->error);3541 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(error), &buf->error);
3537 if (ret < 0) {3542 if (ret < 0) {
3538 adsp_err(buf->dsp, "Failed to check buffer error: %d\n", ret);3543 compr_err(buf, "Failed to check buffer error: %d\n", ret);
3539 return ret;3544 return ret;
3540 }3545 }
3541 if (buf->error != 0) {3546 if (buf->error != 0) {
3542 adsp_err(buf->dsp, "Buffer error occurred: %d\n", buf->error);3547 compr_err(buf, "Buffer error occurred: %d\n", buf->error);
3543 return -EIO;3548 return -EIO;
3544 }3549 }
3545 3550
@@ -3571,8 +3576,6 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) · 25 unmodified lines
3571 if (ret < 0)3576 if (ret < 0)
3572 break;3577 break;
3573 3578
3574 wm_adsp_buffer_clear(compr->buf);
3575
3576 /* Trigger the IRQ at one fragment of data */3579 /* Trigger the IRQ at one fragment of data */
3577 ret = wm_adsp_buffer_write(compr->buf,3580 ret = wm_adsp_buffer_write(compr->buf,
3578 HOST_BUFFER_FIELD(high_water_mark),3581 HOST_BUFFER_FIELD(high_water_mark),
@@ -3584,6 +3587,8 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd) · 5 unmodified lines
3584 }3587 }
3585 break;3588 break;
3586 case SNDRV_PCM_TRIGGER_STOP:3589 case SNDRV_PCM_TRIGGER_STOP:
3590 if (wm_adsp_compr_attached(compr))
3591 wm_adsp_buffer_clear(compr->buf);
3587 break;3592 break;
3588 default:3593 default:
3589 ret = -EINVAL;3594 ret = -EINVAL;
@@ -3917,22 +3922,40 @@ int wm_adsp2_lock(struct wm_adsp *dsp, unsigned int lock_regions) · 327 unmodified lines
3917}3922}
3918EXPORT_SYMBOL_GPL(wm_adsp2_lock);3923EXPORT_SYMBOL_GPL(wm_adsp2_lock);
3919 3924
3925static void wm_adsp_fatal_error(struct wm_adsp *dsp)
3926{
3927 struct wm_adsp_compr *compr;
3928
3929 dsp->fatal_error = true;
3930
3931 list_for_each_entry(compr, &dsp->compr_list, list) {
3932 if (compr->stream) {
3933 snd_compr_stop_error(compr->stream,
3934 SNDRV_PCM_STATE_XRUN);
3935 snd_compr_fragment_elapsed(compr->stream);
3936 }
3937 }
3938}
3939
3920irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp)3940irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp)
3921{3941{
3922 unsigned int val;3942 unsigned int val;
3923 struct regmap *regmap = dsp->regmap;3943 struct regmap *regmap = dsp->regmap;
3924 int ret = 0;3944 int ret = 0;
3925 3945
3946 mutex_lock(&dsp->pwr_lock);
3947
3926 ret = regmap_read(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, &val);3948 ret = regmap_read(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL, &val);
3927 if (ret) {3949 if (ret) {
3928 adsp_err(dsp,3950 adsp_err(dsp,
3929 "Failed to read Region Lock Ctrl register: %d\n", ret);3951 "Failed to read Region Lock Ctrl register: %d\n", ret);
3930 return IRQ_HANDLED;3952 goto error;
3931 }3953 }
3932 3954
3933 if (val & ADSP2_WDT_TIMEOUT_STS_MASK) {3955 if (val & ADSP2_WDT_TIMEOUT_STS_MASK) {
3934 adsp_err(dsp, "watchdog timeout error\n");3956 adsp_err(dsp, "watchdog timeout error\n");
3935 wm_adsp_stop_watchdog(dsp);3957 wm_adsp_stop_watchdog(dsp);
3958 wm_adsp_fatal_error(dsp);
3936 }3959 }
3937 3960
3938 if (val & (ADSP2_SLAVE_ERR_MASK | ADSP2_REGION_LOCK_ERR_MASK)) {3961 if (val & (ADSP2_SLAVE_ERR_MASK | ADSP2_REGION_LOCK_ERR_MASK)) {
@@ -3946,7 +3969,7 @@ irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp) · 7 unmodified lines
3946 adsp_err(dsp,3969 adsp_err(dsp,
3947 "Failed to read Bus Err Addr register: %d\n",3970 "Failed to read Bus Err Addr register: %d\n",
3948 ret);3971 ret);
3949 return IRQ_HANDLED;3972 goto error;
3950 }3973 }
3951 3974
3952 adsp_err(dsp, "bus error address = 0x%x\n",3975 adsp_err(dsp, "bus error address = 0x%x\n",
@@ -3959,7 +3982,7 @@ irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp) · 6 unmodified lines
3959 adsp_err(dsp,3982 adsp_err(dsp,
3960 "Failed to read Pmem Xmem Err Addr register: %d\n",3983 "Failed to read Pmem Xmem Err Addr register: %d\n",
3961 ret);3984 ret);
3962 return IRQ_HANDLED;3985 goto error;
3963 }3986 }
3964 3987
3965 adsp_err(dsp, "xmem error address = 0x%x\n",3988 adsp_err(dsp, "xmem error address = 0x%x\n",
@@ -3972,6 +3995,9 @@ irqreturn_t wm_adsp2_bus_error(struct wm_adsp *dsp) · 6 unmodified lines
3972 regmap_update_bits(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL,3995 regmap_update_bits(regmap, dsp->base + ADSP2_LOCK_REGION_CTRL,
3973 ADSP2_CTRL_ERR_EINT, ADSP2_CTRL_ERR_EINT);3996 ADSP2_CTRL_ERR_EINT, ADSP2_CTRL_ERR_EINT);
3974 3997
3998error:
3999 mutex_unlock(&dsp->pwr_lock);
4000
3975 return IRQ_HANDLED;4001 return IRQ_HANDLED;
3976}4002}
3977EXPORT_SYMBOL_GPL(wm_adsp2_bus_error);4003EXPORT_SYMBOL_GPL(wm_adsp2_bus_error);
sound/soc/codecs/wm_adsp.h+1−0
@@ -85,6 +85,7 @@ struct wm_adsp { · 84 unmodified lines
85 bool preloaded;85 bool preloaded;
86 bool booted;86 bool booted;
87 bool running;87 bool running;
88 bool fatal_error;
88 89
89 struct list_head ctl_list;90 struct list_head ctl_list;
90 91
sound/soc/fsl/fsl_asrc.c+14−0
@@ -445,6 +445,19 @@ struct dma_chan *fsl_asrc_get_dma_channel(struct fsl_asrc_pair *pair, bool dir) · 444 unmodified lines
445}445}
446EXPORT_SYMBOL_GPL(fsl_asrc_get_dma_channel);446EXPORT_SYMBOL_GPL(fsl_asrc_get_dma_channel);
447 447
448static int fsl_asrc_dai_startup(struct snd_pcm_substream *substream,
449 struct snd_soc_dai *dai)
450{
451 struct fsl_asrc *asrc_priv = snd_soc_dai_get_drvdata(dai);
452
453 /* Odd channel number is not valid for older ASRC (channel_bits==3) */
454 if (asrc_priv->channel_bits == 3)
455 snd_pcm_hw_constraint_step(substream->runtime, 0,
456 SNDRV_PCM_HW_PARAM_CHANNELS, 2);
457
458 return 0;
459}
460
448static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,461static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,
449 struct snd_pcm_hw_params *params,462 struct snd_pcm_hw_params *params,
450 struct snd_soc_dai *dai)463 struct snd_soc_dai *dai)
@@ -539,6 +552,7 @@ static int fsl_asrc_dai_trigger(struct snd_pcm_substream *substream, int cmd, · 88 unmodified lines
539}552}
540 553
541static const struct snd_soc_dai_ops fsl_asrc_dai_ops = {554static const struct snd_soc_dai_ops fsl_asrc_dai_ops = {
555 .startup = fsl_asrc_dai_startup,
542 .hw_params = fsl_asrc_dai_hw_params,556 .hw_params = fsl_asrc_dai_hw_params,
543 .hw_free = fsl_asrc_dai_hw_free,557 .hw_free = fsl_asrc_dai_hw_free,
544 .trigger = fsl_asrc_dai_trigger,558 .trigger = fsl_asrc_dai_trigger,
sound/soc/fsl/fsl_esai.c+37−10
@@ -54,6 +54,8 @@ struct fsl_esai { · 53 unmodified lines
54 u32 fifo_depth;54 u32 fifo_depth;
55 u32 slot_width;55 u32 slot_width;
56 u32 slots;56 u32 slots;
57 u32 tx_mask;
58 u32 rx_mask;
57 u32 hck_rate[2];59 u32 hck_rate[2];
58 u32 sck_rate[2];60 u32 sck_rate[2];
59 bool hck_dir[2];61 bool hck_dir[2];
@@ -361,21 +363,13 @@ static int fsl_esai_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, · 301 unmodified lines
361 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR,363 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR,
362 ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots));364 ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots));
363 365
364 regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMA,
365 ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(tx_mask));
366 regmap_update_bits(esai_priv->regmap, REG_ESAI_TSMB,
367 ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(tx_mask));
368
369 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR,366 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR,
370 ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots));367 ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(slots));
371 368
372 regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMA,
373 ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(rx_mask));
374 regmap_update_bits(esai_priv->regmap, REG_ESAI_RSMB,
375 ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(rx_mask));
376
377 esai_priv->slot_width = slot_width;369 esai_priv->slot_width = slot_width;
378 esai_priv->slots = slots;370 esai_priv->slots = slots;
371 esai_priv->tx_mask = tx_mask;
372 esai_priv->rx_mask = rx_mask;
379 373
380 return 0;374 return 0;
381}375}
@@ -596,6 +590,7 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, · 214 unmodified lines
596 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;590 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
597 u8 i, channels = substream->runtime->channels;591 u8 i, channels = substream->runtime->channels;
598 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots);592 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots);
593 u32 mask;
599 594
600 switch (cmd) {595 switch (cmd) {
601 case SNDRV_PCM_TRIGGER_START:596 case SNDRV_PCM_TRIGGER_START:
@@ -608,15 +603,38 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd, · 6 unmodified lines
608 for (i = 0; tx && i < channels; i++)603 for (i = 0; tx && i < channels; i++)
609 regmap_write(esai_priv->regmap, REG_ESAI_ETDR, 0x0);604 regmap_write(esai_priv->regmap, REG_ESAI_ETDR, 0x0);
610 605
606 /*
607 * When set the TE/RE in the end of enablement flow, there
608 * will be channel swap issue for multi data line case.
609 * In order to workaround this issue, we switch the bit
610 * enablement sequence to below sequence
611 * 1) clear the xSMB & xSMA: which is done in probe and
612 * stop state.
613 * 2) set TE/RE
614 * 3) set xSMB
615 * 4) set xSMA: xSMA is the last one in this flow, which
616 * will trigger esai to start.
617 */
611 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx),618 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx),
612 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK,619 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK,
613 tx ? ESAI_xCR_TE(pins) : ESAI_xCR_RE(pins));620 tx ? ESAI_xCR_TE(pins) : ESAI_xCR_RE(pins));
621 mask = tx ? esai_priv->tx_mask : esai_priv->rx_mask;
622
623 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMB(tx),
624 ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(mask));
625 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMA(tx),
626 ESAI_xSMA_xS_MASK, ESAI_xSMA_xS(mask));
627
614 break;628 break;
615 case SNDRV_PCM_TRIGGER_SUSPEND:629 case SNDRV_PCM_TRIGGER_SUSPEND:
616 case SNDRV_PCM_TRIGGER_STOP:630 case SNDRV_PCM_TRIGGER_STOP:
617 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:631 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
618 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx),632 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx),
619 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK, 0);633 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK, 0);
634 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMA(tx),
635 ESAI_xSMA_xS_MASK, 0);
636 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMB(tx),
637 ESAI_xSMB_xS_MASK, 0);
620 638
621 /* Disable and reset FIFO */639 /* Disable and reset FIFO */
622 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx),640 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx),
@@ -906,6 +924,15 @@ static int fsl_esai_probe(struct platform_device *pdev) · 283 unmodified lines
906 return ret;924 return ret;
907 }925 }
908 926
927 esai_priv->tx_mask = 0xFFFFFFFF;
928 esai_priv->rx_mask = 0xFFFFFFFF;
929
930 /* Clear the TSMA, TSMB, RSMA, RSMB */
931 regmap_write(esai_priv->regmap, REG_ESAI_TSMA, 0);
932 regmap_write(esai_priv->regmap, REG_ESAI_TSMB, 0);
933 regmap_write(esai_priv->regmap, REG_ESAI_RSMA, 0);
934 regmap_write(esai_priv->regmap, REG_ESAI_RSMB, 0);
935
909 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,936 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
910 &fsl_esai_dai, 1);937 &fsl_esai_dai, 1);
911 if (ret) {938 if (ret) {
sound/soc/generic/audio-graph-card.c+8−3
@@ -20,6 +20,8 @@ · 19 unmodified lines
20#include <linux/string.h>20#include <linux/string.h>
21#include <sound/simple_card_utils.h>21#include <sound/simple_card_utils.h>
22 22
23#define DPCM_SELECTABLE 1
24
23struct graph_priv {25struct graph_priv {
24 struct snd_soc_card snd_card;26 struct snd_soc_card snd_card;
25 struct graph_dai_props {27 struct graph_dai_props {
@@ -440,6 +442,7 @@ static int graph_for_each_link(struct graph_priv *priv, · 414 unmodified lines
440 struct device_node *codec_port;442 struct device_node *codec_port;
441 struct device_node *codec_port_old = NULL;443 struct device_node *codec_port_old = NULL;
442 struct asoc_simple_card_data adata;444 struct asoc_simple_card_data adata;
445 uintptr_t dpcm_selectable = (uintptr_t)of_device_get_match_data(dev);
443 int rc, ret;446 int rc, ret;
444 447
445 /* loop for all listed CPU port */448 /* loop for all listed CPU port */
@@ -470,8 +473,9 @@ static int graph_for_each_link(struct graph_priv *priv, · 24 unmodified lines
470 * if Codec port has many endpoints,473 * if Codec port has many endpoints,
471 * or has convert-xxx property474 * or has convert-xxx property
472 */475 */
473 if ((of_get_child_count(codec_port) > 1) ||476 if (dpcm_selectable &&
474 adata.convert_rate || adata.convert_channels)477 ((of_get_child_count(codec_port) > 1) ||
478 adata.convert_rate || adata.convert_channels))
475 ret = func_dpcm(priv, cpu_ep, codec_ep, li,479 ret = func_dpcm(priv, cpu_ep, codec_ep, li,
476 (codec_port_old == codec_port));480 (codec_port_old == codec_port));
477 /* else normal sound */481 /* else normal sound */
@@ -732,7 +736,8 @@ static int graph_remove(struct platform_device *pdev) · 254 unmodified lines
732 736
733static const struct of_device_id graph_of_match[] = {737static const struct of_device_id graph_of_match[] = {
734 { .compatible = "audio-graph-card", },738 { .compatible = "audio-graph-card", },
735 { .compatible = "audio-graph-scu-card", },739 { .compatible = "audio-graph-scu-card",
740 .data = (void *)DPCM_SELECTABLE },
736 {},741 {},
737};742};
738MODULE_DEVICE_TABLE(of, graph_of_match);743MODULE_DEVICE_TABLE(of, graph_of_match);
sound/soc/generic/simple-card.c+9−3
@@ -9,12 +9,15 @@ · 8 unmodified lines
9#include <linux/device.h>9#include <linux/device.h>
10#include <linux/module.h>10#include <linux/module.h>
11#include <linux/of.h>11#include <linux/of.h>
12#include <linux/of_device.h>
12#include <linux/platform_device.h>13#include <linux/platform_device.h>
13#include <linux/string.h>14#include <linux/string.h>
14#include <sound/simple_card.h>15#include <sound/simple_card.h>
15#include <sound/soc-dai.h>16#include <sound/soc-dai.h>
16#include <sound/soc.h>17#include <sound/soc.h>
17 18
19#define DPCM_SELECTABLE 1
20
18struct simple_priv {21struct simple_priv {
19 struct snd_soc_card snd_card;22 struct snd_soc_card snd_card;
20 struct simple_dai_props {23 struct simple_dai_props {
@@ -441,6 +444,7 @@ static int simple_for_each_link(struct simple_priv *priv, · 420 unmodified lines
441 struct device *dev = simple_priv_to_dev(priv);444 struct device *dev = simple_priv_to_dev(priv);
442 struct device_node *top = dev->of_node;445 struct device_node *top = dev->of_node;
443 struct device_node *node;446 struct device_node *node;
447 uintptr_t dpcm_selectable = (uintptr_t)of_device_get_match_data(dev);
444 bool is_top = 0;448 bool is_top = 0;
445 int ret = 0;449 int ret = 0;
446 450
@@ -480,8 +484,9 @@ static int simple_for_each_link(struct simple_priv *priv, · 33 unmodified lines
480 * if it has many CPUs,484 * if it has many CPUs,
481 * or has convert-xxx property485 * or has convert-xxx property
482 */486 */
483 if (num > 2 ||487 if (dpcm_selectable &&
484 adata.convert_rate || adata.convert_channels)488 (num > 2 ||
489 adata.convert_rate || adata.convert_channels))
485 ret = func_dpcm(priv, np, codec, li, is_top);490 ret = func_dpcm(priv, np, codec, li, is_top);
486 /* else normal sound */491 /* else normal sound */
487 else492 else
@@ -822,7 +827,8 @@ static int simple_remove(struct platform_device *pdev) · 334 unmodified lines
822 827
823static const struct of_device_id simple_of_match[] = {828static const struct of_device_id simple_of_match[] = {
824 { .compatible = "simple-audio-card", },829 { .compatible = "simple-audio-card", },
825 { .compatible = "simple-scu-audio-card", },830 { .compatible = "simple-scu-audio-card",
831 .data = (void *)DPCM_SELECTABLE },
826 {},832 {},
827};833};
828MODULE_DEVICE_TABLE(of, simple_of_match);834MODULE_DEVICE_TABLE(of, simple_of_match);
sound/soc/intel/atom/sst-mfld-platform-pcm.c+8−0
@@ -706,9 +706,17 @@ static int sst_soc_probe(struct snd_soc_component *component) · 705 unmodified lines
706 return sst_dsp_init_v2_dpcm(component);706 return sst_dsp_init_v2_dpcm(component);
707}707}
708 708
709static void sst_soc_remove(struct snd_soc_component *component)
710{
711 struct sst_data *drv = dev_get_drvdata(component->dev);
712
713 drv->soc_card = NULL;
714}
715
709static const struct snd_soc_component_driver sst_soc_platform_drv = {716static const struct snd_soc_component_driver sst_soc_platform_drv = {
710 .name = DRV_NAME,717 .name = DRV_NAME,
711 .probe = sst_soc_probe,718 .probe = sst_soc_probe,
719 .remove = sst_soc_remove,
712 .ops = &sst_platform_ops,720 .ops = &sst_platform_ops,
713 .compr_ops = &sst_platform_compr_ops,721 .compr_ops = &sst_platform_compr_ops,
714 .pcm_new = sst_pcm_new,722 .pcm_new = sst_pcm_new,
sound/soc/intel/boards/cht_bsw_max98090_ti.c+41−6
@@ -43,6 +43,7 @@ struct cht_mc_private { · 42 unmodified lines
43 struct clk *mclk;43 struct clk *mclk;
44 struct snd_soc_jack jack;44 struct snd_soc_jack jack;
45 bool ts3a227e_present;45 bool ts3a227e_present;
46 int quirks;
46};47};
47 48
48static int platform_clock_control(struct snd_soc_dapm_widget *w,49static int platform_clock_control(struct snd_soc_dapm_widget *w,
@@ -54,6 +55,10 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w, · 5 unmodified lines
54 struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card);55 struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card);
55 int ret;56 int ret;
56 57
58 /* See the comment in snd_cht_mc_probe() */
59 if (ctx->quirks & QUIRK_PMC_PLT_CLK_0)
60 return 0;
61
57 codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI);62 codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI);
58 if (!codec_dai) {63 if (!codec_dai) {
59 dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n");64 dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n");
@@ -223,6 +228,10 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) · 163 unmodified lines
223 "jack detection gpios not added, error %d\n", ret);228 "jack detection gpios not added, error %d\n", ret);
224 }229 }
225 230
231 /* See the comment in snd_cht_mc_probe() */
232 if (ctx->quirks & QUIRK_PMC_PLT_CLK_0)
233 return 0;
234
226 /*235 /*
227 * The firmware might enable the clock at236 * The firmware might enable the clock at
228 * boot (this information may or may not237 * boot (this information may or may not
@@ -423,16 +432,15 @@ static int snd_cht_mc_probe(struct platform_device *pdev) · 194 unmodified lines
423 const char *mclk_name;432 const char *mclk_name;
424 struct snd_soc_acpi_mach *mach;433 struct snd_soc_acpi_mach *mach;
425 const char *platform_name;434 const char *platform_name;
426 int quirks = 0;
427
428 dmi_id = dmi_first_match(cht_max98090_quirk_table);
429 if (dmi_id)
430 quirks = (unsigned long)dmi_id->driver_data;
431 435
432 drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL);436 drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL);
433 if (!drv)437 if (!drv)
434 return -ENOMEM;438 return -ENOMEM;
435 439
440 dmi_id = dmi_first_match(cht_max98090_quirk_table);
441 if (dmi_id)
442 drv->quirks = (unsigned long)dmi_id->driver_data;
443
436 drv->ts3a227e_present = acpi_dev_found("104C227E");444 drv->ts3a227e_present = acpi_dev_found("104C227E");
437 if (!drv->ts3a227e_present) {445 if (!drv->ts3a227e_present) {
438 /* no need probe TI jack detection chip */446 /* no need probe TI jack detection chip */
@@ -458,7 +466,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) · 19 unmodified lines
458 snd_soc_card_cht.dev = &pdev->dev;466 snd_soc_card_cht.dev = &pdev->dev;
459 snd_soc_card_set_drvdata(&snd_soc_card_cht, drv);467 snd_soc_card_set_drvdata(&snd_soc_card_cht, drv);
460 468
461 if (quirks & QUIRK_PMC_PLT_CLK_0)469 if (drv->quirks & QUIRK_PMC_PLT_CLK_0)
462 mclk_name = "pmc_plt_clk_0";470 mclk_name = "pmc_plt_clk_0";
463 else471 else
464 mclk_name = "pmc_plt_clk_3";472 mclk_name = "pmc_plt_clk_3";
@@ -471,6 +479,21 @@ static int snd_cht_mc_probe(struct platform_device *pdev) · 6 unmodified lines
471 return PTR_ERR(drv->mclk);479 return PTR_ERR(drv->mclk);
472 }480 }
473 481
482 /*
483 * Boards which have the MAX98090's clk connected to clk_0 do not seem
484 * to like it if we muck with the clock. If we disable the clock when
485 * it is unused we get "max98090 i2c-193C9890:00: PLL unlocked" errors
486 * and the PLL never seems to lock again.
487 * So for these boards we enable it here once and leave it at that.
488 */
489 if (drv->quirks & QUIRK_PMC_PLT_CLK_0) {
490 ret_val = clk_prepare_enable(drv->mclk);
491 if (ret_val < 0) {
492 dev_err(&pdev->dev, "MCLK enable error: %d\n", ret_val);
493 return ret_val;
494 }
495 }
496
474 ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cht);497 ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cht);
475 if (ret_val) {498 if (ret_val) {
476 dev_err(&pdev->dev,499 dev_err(&pdev->dev,
@@ -481,11 +504,23 @@ static int snd_cht_mc_probe(struct platform_device *pdev) · 4 unmodified lines
481 return ret_val;504 return ret_val;
482}505}
483 506
507static int snd_cht_mc_remove(struct platform_device *pdev)
508{
509 struct snd_soc_card *card = platform_get_drvdata(pdev);
510 struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card);
511
512 if (ctx->quirks & QUIRK_PMC_PLT_CLK_0)
513 clk_disable_unprepare(ctx->mclk);
514
515 return 0;
516}
517
484static struct platform_driver snd_cht_mc_driver = {518static struct platform_driver snd_cht_mc_driver = {
485 .driver = {519 .driver = {
486 .name = "cht-bsw-max98090",520 .name = "cht-bsw-max98090",
487 },521 },
488 .probe = snd_cht_mc_probe,522 .probe = snd_cht_mc_probe,
523 .remove = snd_cht_mc_remove,
489};524};
490 525
491module_platform_driver(snd_cht_mc_driver)526module_platform_driver(snd_cht_mc_driver)
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c+1−1
@@ -405,7 +405,7 @@ static const struct snd_pcm_hw_constraint_list constraints_dmic_channels = { · 404 unmodified lines
405};405};
406 406
407static const unsigned int dmic_2ch[] = {407static const unsigned int dmic_2ch[] = {
408 4,408 2,
409};409};
410 410
411static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {411static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {
sound/soc/intel/skylake/skl-messages.c+1−0
@@ -483,6 +483,7 @@ static void skl_set_base_module_format(struct skl_sst *ctx, · 482 unmodified lines
483 base_cfg->audio_fmt.bit_depth = format->bit_depth;483 base_cfg->audio_fmt.bit_depth = format->bit_depth;
484 base_cfg->audio_fmt.valid_bit_depth = format->valid_bit_depth;484 base_cfg->audio_fmt.valid_bit_depth = format->valid_bit_depth;
485 base_cfg->audio_fmt.ch_cfg = format->ch_cfg;485 base_cfg->audio_fmt.ch_cfg = format->ch_cfg;
486 base_cfg->audio_fmt.sample_type = format->sample_type;
486 487
487 dev_dbg(ctx->dev, "bit_depth=%x valid_bd=%x ch_config=%x\n",488 dev_dbg(ctx->dev, "bit_depth=%x valid_bd=%x ch_config=%x\n",
488 format->bit_depth, format->valid_bit_depth,489 format->bit_depth, format->valid_bit_depth,
sound/soc/intel/skylake/skl-pcm.c+22−6
@@ -181,6 +181,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params) · 180 unmodified lines
181 struct hdac_stream *hstream;181 struct hdac_stream *hstream;
182 struct hdac_ext_stream *stream;182 struct hdac_ext_stream *stream;
183 struct hdac_ext_link *link;183 struct hdac_ext_link *link;
184 unsigned char stream_tag;
184 185
185 hstream = snd_hdac_get_stream(bus, params->stream,186 hstream = snd_hdac_get_stream(bus, params->stream,
186 params->link_dma_id + 1);187 params->link_dma_id + 1);
@@ -199,10 +200,13 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params) · 12 unmodified lines
199 200
200 snd_hdac_ext_link_stream_setup(stream, format_val);201 snd_hdac_ext_link_stream_setup(stream, format_val);
201 202
202 list_for_each_entry(link, &bus->hlink_list, list) {203 stream_tag = hstream->stream_tag;
203 if (link->index == params->link_index)204 if (stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) {
204 snd_hdac_ext_link_set_stream_id(link,205 list_for_each_entry(link, &bus->hlink_list, list) {
205 hstream->stream_tag);206 if (link->index == params->link_index)
207 snd_hdac_ext_link_set_stream_id(link,
208 stream_tag);
209 }
206 }210 }
207 211
208 stream->link_prepared = 1;212 stream->link_prepared = 1;
@@ -645,6 +649,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream, · 436 unmodified lines
645 struct hdac_ext_stream *link_dev =649 struct hdac_ext_stream *link_dev =
646 snd_soc_dai_get_dma_data(dai, substream);650 snd_soc_dai_get_dma_data(dai, substream);
647 struct hdac_ext_link *link;651 struct hdac_ext_link *link;
652 unsigned char stream_tag;
648 653
649 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);654 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
650 655
@@ -654,7 +659,11 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream, · 3 unmodified lines
654 if (!link)659 if (!link)
655 return -EINVAL;660 return -EINVAL;
656 661
657 snd_hdac_ext_link_clear_stream_id(link, hdac_stream(link_dev)->stream_tag);662 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
663 stream_tag = hdac_stream(link_dev)->stream_tag;
664 snd_hdac_ext_link_clear_stream_id(link, stream_tag);
665 }
666
658 snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);667 snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);
659 return 0;668 return 0;
660}669}
@@ -1453,13 +1462,20 @@ static int skl_platform_soc_probe(struct snd_soc_component *component) · 792 unmodified lines
1453 return 0;1462 return 0;
1454}1463}
1455 1464
1465static void skl_pcm_remove(struct snd_soc_component *component)
1466{
1467 /* remove topology */
1468 snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL);
1469}
1470
1456static const struct snd_soc_component_driver skl_component = {1471static const struct snd_soc_component_driver skl_component = {
1457 .name = "pcm",1472 .name = "pcm",
1458 .probe = skl_platform_soc_probe,1473 .probe = skl_platform_soc_probe,
1474 .remove = skl_pcm_remove,
1459 .ops = &skl_platform_ops,1475 .ops = &skl_platform_ops,
1460 .pcm_new = skl_pcm_new,1476 .pcm_new = skl_pcm_new,
1461 .pcm_free = skl_pcm_free,1477 .pcm_free = skl_pcm_free,
1462 .ignore_module_refcount = 1, /* do not increase the refcount in core */1478 .module_get_upon_open = 1, /* increment refcount when a pcm is opened */
1463};1479};
1464 1480
1465int skl_platform_register(struct device *dev)1481int skl_platform_register(struct device *dev)
sound/soc/mediatek/common/mtk-btcvsd.c+68−1
@@ -49,6 +49,7 @@ enum bt_sco_state { · 48 unmodified lines
49 BT_SCO_STATE_IDLE,49 BT_SCO_STATE_IDLE,
50 BT_SCO_STATE_RUNNING,50 BT_SCO_STATE_RUNNING,
51 BT_SCO_STATE_ENDING,51 BT_SCO_STATE_ENDING,
52 BT_SCO_STATE_LOOPBACK,
52};53};
53 54
54enum bt_sco_direct {55enum bt_sco_direct {
@@ -486,7 +487,8 @@ static irqreturn_t mtk_btcvsd_snd_irq_handler(int irq_id, void *dev) · 431 unmodified lines
486 if (bt->rx->state != BT_SCO_STATE_RUNNING &&487 if (bt->rx->state != BT_SCO_STATE_RUNNING &&
487 bt->rx->state != BT_SCO_STATE_ENDING &&488 bt->rx->state != BT_SCO_STATE_ENDING &&
488 bt->tx->state != BT_SCO_STATE_RUNNING &&489 bt->tx->state != BT_SCO_STATE_RUNNING &&
489 bt->tx->state != BT_SCO_STATE_ENDING) {490 bt->tx->state != BT_SCO_STATE_ENDING &&
491 bt->tx->state != BT_SCO_STATE_LOOPBACK) {
490 dev_warn(bt->dev, "%s(), in idle state: rx->state: %d, tx->state: %d\n",492 dev_warn(bt->dev, "%s(), in idle state: rx->state: %d, tx->state: %d\n",
491 __func__, bt->rx->state, bt->tx->state);493 __func__, bt->rx->state, bt->tx->state);
492 goto irq_handler_exit;494 goto irq_handler_exit;
@@ -512,6 +514,42 @@ static irqreturn_t mtk_btcvsd_snd_irq_handler(int irq_id, void *dev) · 19 unmodified lines
512 buf_cnt_tx = btsco_packet_info[packet_type][2];514 buf_cnt_tx = btsco_packet_info[packet_type][2];
513 buf_cnt_rx = btsco_packet_info[packet_type][3];515 buf_cnt_rx = btsco_packet_info[packet_type][3];
514 516
517 if (bt->tx->state == BT_SCO_STATE_LOOPBACK) {
518 u8 *src, *dst;
519 unsigned long connsys_addr_rx, ap_addr_rx;
520 unsigned long connsys_addr_tx, ap_addr_tx;
521
522 connsys_addr_rx = *bt->bt_reg_pkt_r;
523 ap_addr_rx = (unsigned long)bt->bt_sram_bank2_base +
524 (connsys_addr_rx & 0xFFFF);
525
526 connsys_addr_tx = *bt->bt_reg_pkt_w;
527 ap_addr_tx = (unsigned long)bt->bt_sram_bank2_base +
528 (connsys_addr_tx & 0xFFFF);
529
530 if (connsys_addr_tx == 0xdeadfeed ||
531 connsys_addr_rx == 0xdeadfeed) {
532 /* bt return 0xdeadfeed if read reg during bt sleep */
533 dev_warn(bt->dev, "%s(), connsys_addr_tx == 0xdeadfeed\n",
534 __func__);
535 goto irq_handler_exit;
536 }
537
538 src = (u8 *)ap_addr_rx;
539 dst = (u8 *)ap_addr_tx;
540
541 mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_BT2ARM, src,
542 bt->tx->temp_packet_buf,
543 packet_length,
544 packet_num);
545 mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_ARM2BT,
546 bt->tx->temp_packet_buf, dst,
547 packet_length,
548 packet_num);
549 bt->rx->rw_cnt++;
550 bt->tx->rw_cnt++;
551 }
552
515 if (bt->rx->state == BT_SCO_STATE_RUNNING ||553 if (bt->rx->state == BT_SCO_STATE_RUNNING ||
516 bt->rx->state == BT_SCO_STATE_ENDING) {554 bt->rx->state == BT_SCO_STATE_ENDING) {
517 if (bt->rx->xrun) {555 if (bt->rx->xrun) {
@@ -1067,6 +1105,33 @@ static int btcvsd_band_set(struct snd_kcontrol *kcontrol, · 549 unmodified lines
1067 return 0;1105 return 0;
1068}1106}
1069 1107
1108static int btcvsd_loopback_get(struct snd_kcontrol *kcontrol,
1109 struct snd_ctl_elem_value *ucontrol)
1110{
1111 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1112 struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1113 bool lpbk_en = bt->tx->state == BT_SCO_STATE_LOOPBACK;
1114
1115 ucontrol->value.integer.value[0] = lpbk_en;
1116 return 0;
1117}
1118
1119static int btcvsd_loopback_set(struct snd_kcontrol *kcontrol,
1120 struct snd_ctl_elem_value *ucontrol)
1121{
1122 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1123 struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1124
1125 if (ucontrol->value.integer.value[0]) {
1126 mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_LOOPBACK);
1127 mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_LOOPBACK);
1128 } else {
1129 mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_RUNNING);
1130 mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_RUNNING);
1131 }
1132 return 0;
1133}
1134
1070static int btcvsd_tx_mute_get(struct snd_kcontrol *kcontrol,1135static int btcvsd_tx_mute_get(struct snd_kcontrol *kcontrol,
1071 struct snd_ctl_elem_value *ucontrol)1136 struct snd_ctl_elem_value *ucontrol)
1072{1137{
@@ -1202,6 +1267,8 @@ static int btcvsd_tx_timestamp_get(struct snd_kcontrol *kcontrol, · 129 unmodified lines
1202static const struct snd_kcontrol_new mtk_btcvsd_snd_controls[] = {1267static const struct snd_kcontrol_new mtk_btcvsd_snd_controls[] = {
1203 SOC_ENUM_EXT("BTCVSD Band", btcvsd_enum[0],1268 SOC_ENUM_EXT("BTCVSD Band", btcvsd_enum[0],
1204 btcvsd_band_get, btcvsd_band_set),1269 btcvsd_band_get, btcvsd_band_set),
1270 SOC_SINGLE_BOOL_EXT("BTCVSD Loopback Switch", 0,
1271 btcvsd_loopback_get, btcvsd_loopback_set),
1205 SOC_SINGLE_BOOL_EXT("BTCVSD Tx Mute Switch", 0,1272 SOC_SINGLE_BOOL_EXT("BTCVSD Tx Mute Switch", 0,
1206 btcvsd_tx_mute_get, btcvsd_tx_mute_set),1273 btcvsd_tx_mute_get, btcvsd_tx_mute_set),
1207 SOC_SINGLE_BOOL_EXT("BTCVSD Tx Irq Received Switch", 0,1274 SOC_SINGLE_BOOL_EXT("BTCVSD Tx Irq Received Switch", 0,
sound/soc/mediatek/mt8183/mt8183-afe-clk.c+4−0
@@ -605,6 +605,10 @@ void mt8183_mck_disable(struct mtk_base_afe *afe, int mck_id) · 604 unmodified lines
605 int m_sel_id = mck_div[mck_id].m_sel_id;605 int m_sel_id = mck_div[mck_id].m_sel_id;
606 int div_clk_id = mck_div[mck_id].div_clk_id;606 int div_clk_id = mck_div[mck_id].div_clk_id;
607 607
608 /* i2s5 mck not support */
609 if (mck_id == MT8183_I2S5_MCK)
610 return;
611
608 clk_disable_unprepare(afe_priv->clk[div_clk_id]);612 clk_disable_unprepare(afe_priv->clk[div_clk_id]);
609 if (m_sel_id >= 0)613 if (m_sel_id >= 0)
610 clk_disable_unprepare(afe_priv->clk[m_sel_id]);614 clk_disable_unprepare(afe_priv->clk[m_sel_id]);
sound/soc/rockchip/rockchip_pdm.c+3−1
@@ -24,7 +24,7 @@ · 23 unmodified lines
24 24
25#include "rockchip_pdm.h"25#include "rockchip_pdm.h"
26 26
27#define PDM_DMA_BURST_SIZE (16) /* size * width: 16*4 = 64 bytes */27#define PDM_DMA_BURST_SIZE (8) /* size * width: 8*4 = 32 bytes */
28 28
29struct rk_pdm_dev {29struct rk_pdm_dev {
30 struct device *dev;30 struct device *dev;
@@ -208,7 +208,9 @@ static int rockchip_pdm_set_fmt(struct snd_soc_dai *cpu_dai, · 177 unmodified lines
208 return -EINVAL;208 return -EINVAL;
209 }209 }
210 210
211 pm_runtime_get_sync(cpu_dai->dev);
211 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, mask, val);212 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, mask, val);
213 pm_runtime_put(cpu_dai->dev);
212 214
213 return 0;215 return 0;
214}216}
sound/soc/samsung/i2s.c+6−4
@@ -1130,11 +1130,11 @@ static const struct snd_soc_dapm_widget samsung_i2s_widgets[] = { · 1129 unmodified lines
1130};1130};
1131 1131
1132static const struct snd_soc_dapm_route samsung_i2s_dapm_routes[] = {1132static const struct snd_soc_dapm_route samsung_i2s_dapm_routes[] = {
1133 { "Playback Mixer", NULL, "Primary" },1133 { "Playback Mixer", NULL, "Primary Playback" },
1134 { "Playback Mixer", NULL, "Secondary" },1134 { "Playback Mixer", NULL, "Secondary Playback" },
1135 1135
1136 { "Mixer DAI TX", NULL, "Playback Mixer" },1136 { "Mixer DAI TX", NULL, "Playback Mixer" },
1137 { "Playback Mixer", NULL, "Mixer DAI RX" },1137 { "Primary Capture", NULL, "Mixer DAI RX" },
1138};1138};
1139 1139
1140static const struct snd_soc_component_driver samsung_i2s_component = {1140static const struct snd_soc_component_driver samsung_i2s_component = {
@@ -1155,7 +1155,8 @@ static int i2s_alloc_dais(struct samsung_i2s_priv *priv, · 14 unmodified lines
1155 int num_dais)1155 int num_dais)
1156{1156{
1157 static const char *dai_names[] = { "samsung-i2s", "samsung-i2s-sec" };1157 static const char *dai_names[] = { "samsung-i2s", "samsung-i2s-sec" };
1158 static const char *stream_names[] = { "Primary", "Secondary" };1158 static const char *stream_names[] = { "Primary Playback",
1159 "Secondary Playback" };
1159 struct snd_soc_dai_driver *dai_drv;1160 struct snd_soc_dai_driver *dai_drv;
1160 struct i2s_dai *dai;1161 struct i2s_dai *dai;
1161 int i;1162 int i;
@@ -1201,6 +1202,7 @@ static int i2s_alloc_dais(struct samsung_i2s_priv *priv, · 39 unmodified lines
1201 dai_drv->capture.channels_max = 2;1202 dai_drv->capture.channels_max = 2;
1202 dai_drv->capture.rates = i2s_dai_data->pcm_rates;1203 dai_drv->capture.rates = i2s_dai_data->pcm_rates;
1203 dai_drv->capture.formats = SAMSUNG_I2S_FMTS;1204 dai_drv->capture.formats = SAMSUNG_I2S_FMTS;
1205 dai_drv->capture.stream_name = "Primary Capture";
1204 1206
1205 return 0;1207 return 0;
1206}1208}
sound/soc/samsung/odroid.c+2−2
@@ -91,11 +91,11 @@ static int odroid_card_be_hw_params(struct snd_pcm_substream *substream, · 90 unmodified lines
91 return ret;91 return ret;
92 92
93 /*93 /*
94 * We add 1 to the rclk_freq value in order to avoid too low clock94 * We add 2 to the rclk_freq value in order to avoid too low clock
95 * frequency values due to the EPLL output frequency not being exact95 * frequency values due to the EPLL output frequency not being exact
96 * multiple of the audio sampling rate.96 * multiple of the audio sampling rate.
97 */97 */
98 rclk_freq = params_rate(params) * rfs + 1;98 rclk_freq = params_rate(params) * rfs + 2;
99 99
100 ret = clk_set_rate(priv->sclk_i2s, rclk_freq);100 ret = clk_set_rate(priv->sclk_i2s, rclk_freq);
101 if (ret < 0)101 if (ret < 0)
sound/soc/sh/rcar/core.c+2−0
@@ -110,6 +110,8 @@ static const struct of_device_id rsnd_of_match[] = { · 109 unmodified lines
110 { .compatible = "renesas,rcar_sound-gen1", .data = (void *)RSND_GEN1 },110 { .compatible = "renesas,rcar_sound-gen1", .data = (void *)RSND_GEN1 },
111 { .compatible = "renesas,rcar_sound-gen2", .data = (void *)RSND_GEN2 },111 { .compatible = "renesas,rcar_sound-gen2", .data = (void *)RSND_GEN2 },
112 { .compatible = "renesas,rcar_sound-gen3", .data = (void *)RSND_GEN3 },112 { .compatible = "renesas,rcar_sound-gen3", .data = (void *)RSND_GEN3 },
113 /* Special Handling */
114 { .compatible = "renesas,rcar_sound-r8a77990", .data = (void *)(RSND_GEN3 | RSND_SOC_E) },
113 {},115 {},
114};116};
115MODULE_DEVICE_TABLE(of, rsnd_of_match);117MODULE_DEVICE_TABLE(of, rsnd_of_match);
sound/soc/sh/rcar/rsnd.h+5−0
@@ -607,6 +607,8 @@ struct rsnd_priv { · 606 unmodified lines
607#define RSND_GEN1 (1 << 0)607#define RSND_GEN1 (1 << 0)
608#define RSND_GEN2 (2 << 0)608#define RSND_GEN2 (2 << 0)
609#define RSND_GEN3 (3 << 0)609#define RSND_GEN3 (3 << 0)
610#define RSND_SOC_MASK (0xFF << 4)
611#define RSND_SOC_E (1 << 4) /* E1/E2/E3 */
610 612
611 /*613 /*
612 * below value will be filled on rsnd_gen_probe()614 * below value will be filled on rsnd_gen_probe()
@@ -679,6 +681,9 @@ struct rsnd_priv { · 66 unmodified lines
679#define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1)681#define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1)
680#define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2)682#define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2)
681#define rsnd_is_gen3(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN3)683#define rsnd_is_gen3(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN3)
684#define rsnd_is_e3(priv) (((priv)->flags & \
685 (RSND_GEN_MASK | RSND_SOC_MASK)) == \
686 (RSND_GEN3 | RSND_SOC_E))
682 687
683#define rsnd_flags_has(p, f) ((p)->flags & (f))688#define rsnd_flags_has(p, f) ((p)->flags & (f))
684#define rsnd_flags_set(p, f) ((p)->flags |= (f))689#define rsnd_flags_set(p, f) ((p)->flags |= (f))
sound/soc/sh/rcar/src.c+7−14
@@ -14,7 +14,6 @@ · 13 unmodified lines
14 */14 */
15 15
16#include "rsnd.h"16#include "rsnd.h"
17#include <linux/sys_soc.h>
18 17
19#define SRC_NAME "src"18#define SRC_NAME "src"
20 19
@@ -135,7 +134,7 @@ unsigned int rsnd_src_get_rate(struct rsnd_priv *priv, · 114 unmodified lines
135 return rate;134 return rate;
136}135}
137 136
138const static u32 bsdsr_table_pattern1[] = {137static const u32 bsdsr_table_pattern1[] = {
139 0x01800000, /* 6 - 1/6 */138 0x01800000, /* 6 - 1/6 */
140 0x01000000, /* 6 - 1/4 */139 0x01000000, /* 6 - 1/4 */
141 0x00c00000, /* 6 - 1/3 */140 0x00c00000, /* 6 - 1/3 */
@@ -144,7 +143,7 @@ const static u32 bsdsr_table_pattern1[] = { · 2 unmodified lines
144 0x00400000, /* 6 - 1 */143 0x00400000, /* 6 - 1 */
145};144};
146 145
147const static u32 bsdsr_table_pattern2[] = {146static const u32 bsdsr_table_pattern2[] = {
148 0x02400000, /* 6 - 1/6 */147 0x02400000, /* 6 - 1/6 */
149 0x01800000, /* 6 - 1/4 */148 0x01800000, /* 6 - 1/4 */
150 0x01200000, /* 6 - 1/3 */149 0x01200000, /* 6 - 1/3 */
@@ -153,7 +152,7 @@ const static u32 bsdsr_table_pattern2[] = { · 2 unmodified lines
153 0x00600000, /* 6 - 1 */152 0x00600000, /* 6 - 1 */
154};153};
155 154
156const static u32 bsisr_table[] = {155static const u32 bsisr_table[] = {
157 0x00100060, /* 6 - 1/6 */156 0x00100060, /* 6 - 1/6 */
158 0x00100040, /* 6 - 1/4 */157 0x00100040, /* 6 - 1/4 */
159 0x00100030, /* 6 - 1/3 */158 0x00100030, /* 6 - 1/3 */
@@ -162,7 +161,7 @@ const static u32 bsisr_table[] = { · 2 unmodified lines
162 0x00100020, /* 6 - 1 */161 0x00100020, /* 6 - 1 */
163};162};
164 163
165const static u32 chan288888[] = {164static const u32 chan288888[] = {
166 0x00000006, /* 1 to 2 */165 0x00000006, /* 1 to 2 */
167 0x000001fe, /* 1 to 8 */166 0x000001fe, /* 1 to 8 */
168 0x000001fe, /* 1 to 8 */167 0x000001fe, /* 1 to 8 */
@@ -171,7 +170,7 @@ const static u32 chan288888[] = { · 2 unmodified lines
171 0x000001fe, /* 1 to 8 */170 0x000001fe, /* 1 to 8 */
172};171};
173 172
174const static u32 chan244888[] = {173static const u32 chan244888[] = {
175 0x00000006, /* 1 to 2 */174 0x00000006, /* 1 to 2 */
176 0x0000001e, /* 1 to 4 */175 0x0000001e, /* 1 to 4 */
177 0x0000001e, /* 1 to 4 */176 0x0000001e, /* 1 to 4 */
@@ -180,7 +179,7 @@ const static u32 chan244888[] = { · 2 unmodified lines
180 0x000001fe, /* 1 to 8 */179 0x000001fe, /* 1 to 8 */
181};180};
182 181
183const static u32 chan222222[] = {182static const u32 chan222222[] = {
184 0x00000006, /* 1 to 2 */183 0x00000006, /* 1 to 2 */
185 0x00000006, /* 1 to 2 */184 0x00000006, /* 1 to 2 */
186 0x00000006, /* 1 to 2 */185 0x00000006, /* 1 to 2 */
@@ -189,18 +188,12 @@ const static u32 chan222222[] = { · 2 unmodified lines
189 0x00000006, /* 1 to 2 */188 0x00000006, /* 1 to 2 */
190};189};
191 190
192static const struct soc_device_attribute ov_soc[] = {
193 { .soc_id = "r8a77990" }, /* E3 */
194 { /* sentinel */ }
195};
196
197static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,191static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
198 struct rsnd_mod *mod)192 struct rsnd_mod *mod)
199{193{
200 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);194 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
201 struct device *dev = rsnd_priv_to_dev(priv);195 struct device *dev = rsnd_priv_to_dev(priv);
202 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);196 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
203 const struct soc_device_attribute *soc = soc_device_match(ov_soc);
204 int is_play = rsnd_io_is_play(io);197 int is_play = rsnd_io_is_play(io);
205 int use_src = 0;198 int use_src = 0;
206 u32 fin, fout;199 u32 fin, fout;
@@ -307,7 +300,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io, · 100 unmodified lines
307 /*300 /*
308 * E3 need to overwrite301 * E3 need to overwrite
309 */302 */
310 if (soc)303 if (rsnd_is_e3(priv))
311 switch (rsnd_mod_id(mod)) {304 switch (rsnd_mod_id(mod)) {
312 case 0:305 case 0:
313 case 4:306 case 4:
sound/soc/soc-core.c+4−2
@@ -947,7 +947,7 @@ static void soc_cleanup_component(struct snd_soc_component *component) · 946 unmodified lines
947 snd_soc_dapm_free(snd_soc_component_get_dapm(component));947 snd_soc_dapm_free(snd_soc_component_get_dapm(component));
948 soc_cleanup_component_debugfs(component);948 soc_cleanup_component_debugfs(component);
949 component->card = NULL;949 component->card = NULL;
950 if (!component->driver->ignore_module_refcount)950 if (!component->driver->module_get_upon_open)
951 module_put(component->dev->driver->owner);951 module_put(component->dev->driver->owner);
952}952}
953 953
@@ -1381,7 +1381,7 @@ static int soc_probe_component(struct snd_soc_card *card, · 427 unmodified lines
1381 return 0;1381 return 0;
1382 }1382 }
1383 1383
1384 if (!component->driver->ignore_module_refcount &&1384 if (!component->driver->module_get_upon_open &&
1385 !try_module_get(component->dev->driver->owner))1385 !try_module_get(component->dev->driver->owner))
1386 return -ENODEV;1386 return -ENODEV;
1387 1387
@@ -2797,6 +2797,7 @@ int snd_soc_register_card(struct snd_soc_card *card) · 1409 unmodified lines
2797 2797
2798 ret = soc_init_dai_link(card, link);2798 ret = soc_init_dai_link(card, link);
2799 if (ret) {2799 if (ret) {
2800 soc_cleanup_platform(card);
2800 dev_err(card->dev, "ASoC: failed to init link %s\n",2801 dev_err(card->dev, "ASoC: failed to init link %s\n",
2801 link->name);2802 link->name);
2802 mutex_unlock(&client_mutex);2803 mutex_unlock(&client_mutex);
@@ -2819,6 +2820,7 @@ int snd_soc_register_card(struct snd_soc_card *card) · 16 unmodified lines
2819 card->instantiated = 0;2820 card->instantiated = 0;
2820 mutex_init(&card->mutex);2821 mutex_init(&card->mutex);
2821 mutex_init(&card->dapm_mutex);2822 mutex_init(&card->dapm_mutex);
2823 spin_lock_init(&card->dpcm_lock);
2822 2824
2823 return snd_soc_bind_card(card);2825 return snd_soc_bind_card(card);
2824}2826}
sound/soc/soc-dapm.c+11−0
@@ -3650,6 +3650,13 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, · 3649 unmodified lines
3650 case snd_soc_dapm_dac:3650 case snd_soc_dapm_dac:
3651 case snd_soc_dapm_aif_in:3651 case snd_soc_dapm_aif_in:
3652 case snd_soc_dapm_pga:3652 case snd_soc_dapm_pga:
3653 case snd_soc_dapm_buffer:
3654 case snd_soc_dapm_scheduler:
3655 case snd_soc_dapm_effect:
3656 case snd_soc_dapm_src:
3657 case snd_soc_dapm_asrc:
3658 case snd_soc_dapm_encoder:
3659 case snd_soc_dapm_decoder:
3653 case snd_soc_dapm_out_drv:3660 case snd_soc_dapm_out_drv:
3654 case snd_soc_dapm_micbias:3661 case snd_soc_dapm_micbias:
3655 case snd_soc_dapm_line:3662 case snd_soc_dapm_line:
@@ -3957,6 +3964,10 @@ snd_soc_dapm_free_kcontrol(struct snd_soc_card *card, · 301 unmodified lines
3957 int count;3964 int count;
3958 3965
3959 devm_kfree(card->dev, (void *)*private_value);3966 devm_kfree(card->dev, (void *)*private_value);
3967
3968 if (!w_param_text)
3969 return;
3970
3960 for (count = 0 ; count < num_params; count++)3971 for (count = 0 ; count < num_params; count++)
3961 devm_kfree(card->dev, (void *)w_param_text[count]);3972 devm_kfree(card->dev, (void *)w_param_text[count]);
3962 devm_kfree(card->dev, w_param_text);3973 devm_kfree(card->dev, w_param_text);
sound/soc/soc-pcm.c+55−11
@@ -15,6 +15,7 @@ · 14 unmodified lines
15#include <linux/delay.h>15#include <linux/delay.h>
16#include <linux/pinctrl/consumer.h>16#include <linux/pinctrl/consumer.h>
17#include <linux/pm_runtime.h>17#include <linux/pm_runtime.h>
18#include <linux/module.h>
18#include <linux/slab.h>19#include <linux/slab.h>
19#include <linux/workqueue.h>20#include <linux/workqueue.h>
20#include <linux/export.h>21#include <linux/export.h>
@@ -463,6 +464,9 @@ static int soc_pcm_components_close(struct snd_pcm_substream *substream, · 442 unmodified lines
463 continue;464 continue;
464 465
465 component->driver->ops->close(substream);466 component->driver->ops->close(substream);
467
468 if (component->driver->module_get_upon_open)
469 module_put(component->dev->driver->owner);
466 }470 }
467 471
468 return 0;472 return 0;
@@ -513,6 +517,12 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) · 44 unmodified lines
513 !component->driver->ops->open)517 !component->driver->ops->open)
514 continue;518 continue;
515 519
520 if (component->driver->module_get_upon_open &&
521 !try_module_get(component->dev->driver->owner)) {
522 ret = -ENODEV;
523 goto module_err;
524 }
525
516 ret = component->driver->ops->open(substream);526 ret = component->driver->ops->open(substream);
517 if (ret < 0) {527 if (ret < 0) {
518 dev_err(component->dev,528 dev_err(component->dev,
@@ -628,7 +638,7 @@ codec_dai_err: · 109 unmodified lines
628 638
629component_err:639component_err:
630 soc_pcm_components_close(substream, component);640 soc_pcm_components_close(substream, component);
631 641module_err:
632 if (cpu_dai->driver->ops->shutdown)642 if (cpu_dai->driver->ops->shutdown)
633 cpu_dai->driver->ops->shutdown(substream, cpu_dai);643 cpu_dai->driver->ops->shutdown(substream, cpu_dai);
634out:644out:
@@ -954,10 +964,13 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, · 319 unmodified lines
954 codec_params = *params;964 codec_params = *params;
955 965
956 /* fixup params based on TDM slot masks */966 /* fixup params based on TDM slot masks */
957 if (codec_dai->tx_mask)967 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
968 codec_dai->tx_mask)
958 soc_pcm_codec_params_fixup(&codec_params,969 soc_pcm_codec_params_fixup(&codec_params,
959 codec_dai->tx_mask);970 codec_dai->tx_mask);
960 if (codec_dai->rx_mask)971
972 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
973 codec_dai->rx_mask)
961 soc_pcm_codec_params_fixup(&codec_params,974 soc_pcm_codec_params_fixup(&codec_params,
962 codec_dai->rx_mask);975 codec_dai->rx_mask);
963 976
@@ -1213,6 +1226,7 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, · 249 unmodified lines
1213 struct snd_soc_pcm_runtime *be, int stream)1226 struct snd_soc_pcm_runtime *be, int stream)
1214{1227{
1215 struct snd_soc_dpcm *dpcm;1228 struct snd_soc_dpcm *dpcm;
1229 unsigned long flags;
1216 1230
1217 /* only add new dpcms */1231 /* only add new dpcms */
1218 for_each_dpcm_be(fe, stream, dpcm) {1232 for_each_dpcm_be(fe, stream, dpcm) {
@@ -1228,8 +1242,10 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe, · 9 unmodified lines
1228 dpcm->fe = fe;1242 dpcm->fe = fe;
1229 be->dpcm[stream].runtime = fe->dpcm[stream].runtime;1243 be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
1230 dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;1244 dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
1245 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1231 list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);1246 list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
1232 list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);1247 list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
1248 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1233 1249
1234 dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n",1250 dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n",
1235 stream ? "capture" : "playback", fe->dai_link->name,1251 stream ? "capture" : "playback", fe->dai_link->name,
@@ -1275,6 +1291,7 @@ static void dpcm_be_reparent(struct snd_soc_pcm_runtime *fe, · 39 unmodified lines
1275void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)1291void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream)
1276{1292{
1277 struct snd_soc_dpcm *dpcm, *d;1293 struct snd_soc_dpcm *dpcm, *d;
1294 unsigned long flags;
1278 1295
1279 for_each_dpcm_be_safe(fe, stream, dpcm, d) {1296 for_each_dpcm_be_safe(fe, stream, dpcm, d) {
1280 dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n",1297 dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n",
@@ -1294,8 +1311,10 @@ void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream) · 13 unmodified lines
1294#ifdef CONFIG_DEBUG_FS1311#ifdef CONFIG_DEBUG_FS
1295 debugfs_remove(dpcm->debugfs_state);1312 debugfs_remove(dpcm->debugfs_state);
1296#endif1313#endif
1314 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1297 list_del(&dpcm->list_be);1315 list_del(&dpcm->list_be);
1298 list_del(&dpcm->list_fe);1316 list_del(&dpcm->list_fe);
1317 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1299 kfree(dpcm);1318 kfree(dpcm);
1300 }1319 }
1301}1320}
@@ -1547,10 +1566,13 @@ int dpcm_process_paths(struct snd_soc_pcm_runtime *fe, · 245 unmodified lines
1547void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)1566void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream)
1548{1567{
1549 struct snd_soc_dpcm *dpcm;1568 struct snd_soc_dpcm *dpcm;
1569 unsigned long flags;
1550 1570
1571 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
1551 for_each_dpcm_be(fe, stream, dpcm)1572 for_each_dpcm_be(fe, stream, dpcm)
1552 dpcm->be->dpcm[stream].runtime_update =1573 dpcm->be->dpcm[stream].runtime_update =
1553 SND_SOC_DPCM_UPDATE_NO;1574 SND_SOC_DPCM_UPDATE_NO;
1575 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
1554}1576}
1555 1577
1556static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,1578static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
@@ -1899,10 +1921,15 @@ static int dpcm_apply_symmetry(struct snd_pcm_substream *fe_substream, · 342 unmodified lines
1899 struct snd_soc_pcm_runtime *be = dpcm->be;1921 struct snd_soc_pcm_runtime *be = dpcm->be;
1900 struct snd_pcm_substream *be_substream =1922 struct snd_pcm_substream *be_substream =
1901 snd_soc_dpcm_get_substream(be, stream);1923 snd_soc_dpcm_get_substream(be, stream);
1902 struct snd_soc_pcm_runtime *rtd = be_substream->private_data;1924 struct snd_soc_pcm_runtime *rtd;
1903 struct snd_soc_dai *codec_dai;1925 struct snd_soc_dai *codec_dai;
1904 int i;1926 int i;
1905 1927
1928 /* A backend may not have the requested substream */
1929 if (!be_substream)
1930 continue;
1931
1932 rtd = be_substream->private_data;
1906 if (rtd->dai_link->be_hw_params_fixup)1933 if (rtd->dai_link->be_hw_params_fixup)
1907 continue;1934 continue;
1908 1935
@@ -2571,6 +2598,7 @@ static int dpcm_run_update_startup(struct snd_soc_pcm_runtime *fe, int stream) · 662 unmodified lines
2571 struct snd_soc_dpcm *dpcm;2598 struct snd_soc_dpcm *dpcm;
2572 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];2599 enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream];
2573 int ret;2600 int ret;
2601 unsigned long flags;
2574 2602
2575 dev_dbg(fe->dev, "ASoC: runtime %s open on FE %s\n",2603 dev_dbg(fe->dev, "ASoC: runtime %s open on FE %s\n",
2576 stream ? "capture" : "playback", fe->dai_link->name);2604 stream ? "capture" : "playback", fe->dai_link->name);
@@ -2640,11 +2668,13 @@ close: · 63 unmodified lines
2640 dpcm_be_dai_shutdown(fe, stream);2668 dpcm_be_dai_shutdown(fe, stream);
2641disconnect:2669disconnect:
2642 /* disconnect any non started BEs */2670 /* disconnect any non started BEs */
2671 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
2643 for_each_dpcm_be(fe, stream, dpcm) {2672 for_each_dpcm_be(fe, stream, dpcm) {
2644 struct snd_soc_pcm_runtime *be = dpcm->be;2673 struct snd_soc_pcm_runtime *be = dpcm->be;
2645 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)2674 if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
2646 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;2675 dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
2647 }2676 }
2677 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
2648 2678
2649 return ret;2679 return ret;
2650}2680}
@@ -3221,7 +3251,10 @@ int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, · 570 unmodified lines
3221{3251{
3222 struct snd_soc_dpcm *dpcm;3252 struct snd_soc_dpcm *dpcm;
3223 int state;3253 int state;
3254 int ret = 1;
3255 unsigned long flags;
3224 3256
3257 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3225 for_each_dpcm_fe(be, stream, dpcm) {3258 for_each_dpcm_fe(be, stream, dpcm) {
3226 3259
3227 if (dpcm->fe == fe)3260 if (dpcm->fe == fe)
@@ -3230,12 +3263,15 @@ int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe, · 2 unmodified lines
3230 state = dpcm->fe->dpcm[stream].state;3263 state = dpcm->fe->dpcm[stream].state;
3231 if (state == SND_SOC_DPCM_STATE_START ||3264 if (state == SND_SOC_DPCM_STATE_START ||
3232 state == SND_SOC_DPCM_STATE_PAUSED ||3265 state == SND_SOC_DPCM_STATE_PAUSED ||
3233 state == SND_SOC_DPCM_STATE_SUSPEND)3266 state == SND_SOC_DPCM_STATE_SUSPEND) {
3234 return 0;3267 ret = 0;
3268 break;
3269 }
3235 }3270 }
3271 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3236 3272
3237 /* it's safe to free/stop this BE DAI */3273 /* it's safe to free/stop this BE DAI */
3238 return 1;3274 return ret;
3239}3275}
3240EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);3276EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);
3241 3277
@@ -3248,7 +3284,10 @@ int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, · 6 unmodified lines
3248{3284{
3249 struct snd_soc_dpcm *dpcm;3285 struct snd_soc_dpcm *dpcm;
3250 int state;3286 int state;
3287 int ret = 1;
3288 unsigned long flags;
3251 3289
3290 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3252 for_each_dpcm_fe(be, stream, dpcm) {3291 for_each_dpcm_fe(be, stream, dpcm) {
3253 3292
3254 if (dpcm->fe == fe)3293 if (dpcm->fe == fe)
@@ -3258,12 +3297,15 @@ int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, · 3 unmodified lines
3258 if (state == SND_SOC_DPCM_STATE_START ||3297 if (state == SND_SOC_DPCM_STATE_START ||
3259 state == SND_SOC_DPCM_STATE_PAUSED ||3298 state == SND_SOC_DPCM_STATE_PAUSED ||
3260 state == SND_SOC_DPCM_STATE_SUSPEND ||3299 state == SND_SOC_DPCM_STATE_SUSPEND ||
3261 state == SND_SOC_DPCM_STATE_PREPARE)3300 state == SND_SOC_DPCM_STATE_PREPARE) {
3262 return 0;3301 ret = 0;
3302 break;
3303 }
3263 }3304 }
3305 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3264 3306
3265 /* it's safe to change hw_params */3307 /* it's safe to change hw_params */
3266 return 1;3308 return ret;
3267}3309}
3268EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);3310EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);
3269 3311
@@ -3302,6 +3344,7 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe, · 32 unmodified lines
3302 struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;3344 struct snd_pcm_hw_params *params = &fe->dpcm[stream].hw_params;
3303 struct snd_soc_dpcm *dpcm;3345 struct snd_soc_dpcm *dpcm;
3304 ssize_t offset = 0;3346 ssize_t offset = 0;
3347 unsigned long flags;
3305 3348
3306 /* FE state */3349 /* FE state */
3307 offset += snprintf(buf + offset, size - offset,3350 offset += snprintf(buf + offset, size - offset,
@@ -3329,6 +3372,7 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe, · 21 unmodified lines
3329 goto out;3372 goto out;
3330 }3373 }
3331 3374
3375 spin_lock_irqsave(&fe->card->dpcm_lock, flags);
3332 for_each_dpcm_be(fe, stream, dpcm) {3376 for_each_dpcm_be(fe, stream, dpcm) {
3333 struct snd_soc_pcm_runtime *be = dpcm->be;3377 struct snd_soc_pcm_runtime *be = dpcm->be;
3334 params = &dpcm->hw_params;3378 params = &dpcm->hw_params;
@@ -3349,7 +3393,7 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe, · 14 unmodified lines
3349 params_channels(params),3393 params_channels(params),
3350 params_rate(params));3394 params_rate(params));
3351 }3395 }
3352 3396 spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
3353out:3397out:
3354 return offset;3398 return offset;
3355}3399}
sound/soc/soc-topology.c+4−3
@@ -482,10 +482,11 @@ static void remove_widget(struct snd_soc_component *comp, · 481 unmodified lines
482 482
483 snd_ctl_remove(card, kcontrol);483 snd_ctl_remove(card, kcontrol);
484 484
485 kfree(dobj->control.dvalues);485 /* free enum kcontrol's dvalues and dtexts */
486 kfree(se->dobj.control.dvalues);
486 for (j = 0; j < se->items; j++)487 for (j = 0; j < se->items; j++)
487 kfree(dobj->control.dtexts[j]);488 kfree(se->dobj.control.dtexts[j]);
488 kfree(dobj->control.dtexts);489 kfree(se->dobj.control.dtexts);
489 490
490 kfree(se);491 kfree(se);
491 kfree(w->kcontrol_news[i].name);492 kfree(w->kcontrol_news[i].name);
sound/soc/stm/stm32_adfsdm.c+34−4
@@ -9,6 +9,7 @@ · 8 unmodified lines
9 9
10#include <linux/clk.h>10#include <linux/clk.h>
11#include <linux/module.h>11#include <linux/module.h>
12#include <linux/mutex.h>
12#include <linux/platform_device.h>13#include <linux/platform_device.h>
13#include <linux/slab.h>14#include <linux/slab.h>
14 15
@@ -37,6 +38,8 @@ struct stm32_adfsdm_priv { · 22 unmodified lines
37 /* PCM buffer */38 /* PCM buffer */
38 unsigned char *pcm_buff;39 unsigned char *pcm_buff;
39 unsigned int pos;40 unsigned int pos;
41
42 struct mutex lock; /* protect against race condition on iio state */
40};43};
41 44
42static const struct snd_pcm_hardware stm32_adfsdm_pcm_hw = {45static const struct snd_pcm_hardware stm32_adfsdm_pcm_hw = {
@@ -62,10 +65,12 @@ static void stm32_adfsdm_shutdown(struct snd_pcm_substream *substream, · 19 unmodified lines
62{65{
63 struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);66 struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);
64 67
68 mutex_lock(&priv->lock);
65 if (priv->iio_active) {69 if (priv->iio_active) {
66 iio_channel_stop_all_cb(priv->iio_cb);70 iio_channel_stop_all_cb(priv->iio_cb);
67 priv->iio_active = false;71 priv->iio_active = false;
68 }72 }
73 mutex_unlock(&priv->lock);
69}74}
70 75
71static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream,76static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream,
@@ -74,13 +79,19 @@ static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream, · 2 unmodified lines
74 struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);79 struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);
75 int ret;80 int ret;
76 81
82 mutex_lock(&priv->lock);
83 if (priv->iio_active) {
84 iio_channel_stop_all_cb(priv->iio_cb);
85 priv->iio_active = false;
86 }
87
77 ret = iio_write_channel_attribute(priv->iio_ch,88 ret = iio_write_channel_attribute(priv->iio_ch,
78 substream->runtime->rate, 0,89 substream->runtime->rate, 0,
79 IIO_CHAN_INFO_SAMP_FREQ);90 IIO_CHAN_INFO_SAMP_FREQ);
80 if (ret < 0) {91 if (ret < 0) {
81 dev_err(dai->dev, "%s: Failed to set %d sampling rate\n",92 dev_err(dai->dev, "%s: Failed to set %d sampling rate\n",
82 __func__, substream->runtime->rate);93 __func__, substream->runtime->rate);
83 return ret;94 goto out;
84 }95 }
85 96
86 if (!priv->iio_active) {97 if (!priv->iio_active) {
@@ -92,6 +103,9 @@ static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream, · 5 unmodified lines
92 __func__, ret);103 __func__, ret);
93 }104 }
94 105
106out:
107 mutex_unlock(&priv->lock);
108
95 return ret;109 return ret;
96}110}
97 111
@@ -291,6 +305,7 @@ MODULE_DEVICE_TABLE(of, stm32_adfsdm_of_match); · 193 unmodified lines
291static int stm32_adfsdm_probe(struct platform_device *pdev)305static int stm32_adfsdm_probe(struct platform_device *pdev)
292{306{
293 struct stm32_adfsdm_priv *priv;307 struct stm32_adfsdm_priv *priv;
308 struct snd_soc_component *component;
294 int ret;309 int ret;
295 310
296 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);311 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
@@ -299,6 +314,7 @@ static int stm32_adfsdm_probe(struct platform_device *pdev) · 2 unmodified lines
299 314
300 priv->dev = &pdev->dev;315 priv->dev = &pdev->dev;
301 priv->dai_drv = stm32_adfsdm_dai;316 priv->dai_drv = stm32_adfsdm_dai;
317 mutex_init(&priv->lock);
302 318
303 dev_set_drvdata(&pdev->dev, priv);319 dev_set_drvdata(&pdev->dev, priv);
304 320
@@ -317,9 +333,15 @@ static int stm32_adfsdm_probe(struct platform_device *pdev) · 12 unmodified lines
317 if (IS_ERR(priv->iio_cb))333 if (IS_ERR(priv->iio_cb))
318 return PTR_ERR(priv->iio_cb);334 return PTR_ERR(priv->iio_cb);
319 335
320 ret = devm_snd_soc_register_component(&pdev->dev,336 component = devm_kzalloc(&pdev->dev, sizeof(*component), GFP_KERNEL);
321 &stm32_adfsdm_soc_platform,337 if (!component)
322 NULL, 0);338 return -ENOMEM;
339#ifdef CONFIG_DEBUG_FS
340 component->debugfs_prefix = "pcm";
341#endif
342
343 ret = snd_soc_add_component(&pdev->dev, component,
344 &stm32_adfsdm_soc_platform, NULL, 0);
323 if (ret < 0)345 if (ret < 0)
324 dev_err(&pdev->dev, "%s: Failed to register PCM platform\n",346 dev_err(&pdev->dev, "%s: Failed to register PCM platform\n",
325 __func__);347 __func__);
@@ -327,12 +349,20 @@ static int stm32_adfsdm_probe(struct platform_device *pdev) · 1 unmodified line
327 return ret;349 return ret;
328}350}
329 351
352static int stm32_adfsdm_remove(struct platform_device *pdev)
353{
354 snd_soc_unregister_component(&pdev->dev);
355
356 return 0;
357}
358
330static struct platform_driver stm32_adfsdm_driver = {359static struct platform_driver stm32_adfsdm_driver = {
331 .driver = {360 .driver = {
332 .name = STM32_ADFSDM_DRV_NAME,361 .name = STM32_ADFSDM_DRV_NAME,
333 .of_match_table = stm32_adfsdm_of_match,362 .of_match_table = stm32_adfsdm_of_match,
334 },363 },
335 .probe = stm32_adfsdm_probe,364 .probe = stm32_adfsdm_probe,
365 .remove = stm32_adfsdm_remove,
336};366};
337 367
338module_platform_driver(stm32_adfsdm_driver);368module_platform_driver(stm32_adfsdm_driver);
sound/soc/stm/stm32_i2s.c+1−2
@@ -281,7 +281,6 @@ static bool stm32_i2s_readable_reg(struct device *dev, unsigned int reg) · 280 unmodified lines
281 case STM32_I2S_CFG2_REG:281 case STM32_I2S_CFG2_REG:
282 case STM32_I2S_IER_REG:282 case STM32_I2S_IER_REG:
283 case STM32_I2S_SR_REG:283 case STM32_I2S_SR_REG:
284 case STM32_I2S_TXDR_REG:
285 case STM32_I2S_RXDR_REG:284 case STM32_I2S_RXDR_REG:
286 case STM32_I2S_CGFR_REG:285 case STM32_I2S_CGFR_REG:
287 return true;286 return true;
@@ -293,7 +292,7 @@ static bool stm32_i2s_readable_reg(struct device *dev, unsigned int reg) · 5 unmodified lines
293static bool stm32_i2s_volatile_reg(struct device *dev, unsigned int reg)292static bool stm32_i2s_volatile_reg(struct device *dev, unsigned int reg)
294{293{
295 switch (reg) {294 switch (reg) {
296 case STM32_I2S_TXDR_REG:295 case STM32_I2S_SR_REG:
297 case STM32_I2S_RXDR_REG:296 case STM32_I2S_RXDR_REG:
298 return true;297 return true;
299 default:298 default:
sound/soc/stm/stm32_sai.c+5−3
@@ -105,6 +105,7 @@ static int stm32_sai_set_sync(struct stm32_sai_data *sai_client, · 104 unmodified lines
105 if (!pdev) {105 if (!pdev) {
106 dev_err(&sai_client->pdev->dev,106 dev_err(&sai_client->pdev->dev,
107 "Device not found for node %pOFn\n", np_provider);107 "Device not found for node %pOFn\n", np_provider);
108 of_node_put(np_provider);
108 return -ENODEV;109 return -ENODEV;
109 }110 }
110 111
@@ -113,19 +114,20 @@ static int stm32_sai_set_sync(struct stm32_sai_data *sai_client, · 2 unmodified lines
113 dev_err(&sai_client->pdev->dev,114 dev_err(&sai_client->pdev->dev,
114 "SAI sync provider data not found\n");115 "SAI sync provider data not found\n");
115 ret = -EINVAL;116 ret = -EINVAL;
116 goto out_put_dev;117 goto error;
117 }118 }
118 119
119 /* Configure sync client */120 /* Configure sync client */
120 ret = stm32_sai_sync_conf_client(sai_client, synci);121 ret = stm32_sai_sync_conf_client(sai_client, synci);
121 if (ret < 0)122 if (ret < 0)
122 goto out_put_dev;123 goto error;
123 124
124 /* Configure sync provider */125 /* Configure sync provider */
125 ret = stm32_sai_sync_conf_provider(sai_provider, synco);126 ret = stm32_sai_sync_conf_provider(sai_provider, synco);
126 127
127out_put_dev:128error:
128 put_device(&pdev->dev);129 put_device(&pdev->dev);
130 of_node_put(np_provider);
129 return ret;131 return ret;
130}132}
131 133
sound/soc/stm/stm32_sai_sub.c+86−28
@@ -70,6 +70,7 @@ · 69 unmodified lines
70#define SAI_IEC60958_STATUS_BYTES 2470#define SAI_IEC60958_STATUS_BYTES 24
71 71
72#define SAI_MCLK_NAME_LEN 3272#define SAI_MCLK_NAME_LEN 32
73#define SAI_RATE_11K 11025
73 74
74/**75/**
75 * struct stm32_sai_sub_data - private data of SAI sub block (block A or B)76 * struct stm32_sai_sub_data - private data of SAI sub block (block A or B)
@@ -100,8 +101,9 @@ · 24 unmodified lines
100 * @slot_mask: rx or tx active slots mask. set at init or at runtime101 * @slot_mask: rx or tx active slots mask. set at init or at runtime
101 * @data_size: PCM data width. corresponds to PCM substream width.102 * @data_size: PCM data width. corresponds to PCM substream width.
102 * @spdif_frm_cnt: S/PDIF playback frame counter103 * @spdif_frm_cnt: S/PDIF playback frame counter
103 * @snd_aes_iec958: iec958 data104 * @iec958: iec958 data
104 * @ctrl_lock: control lock105 * @ctrl_lock: control lock
106 * @irq_lock: prevent race condition with IRQ
105 */107 */
106struct stm32_sai_sub_data {108struct stm32_sai_sub_data {
107 struct platform_device *pdev;109 struct platform_device *pdev;
@@ -133,6 +135,7 @@ struct stm32_sai_sub_data { · 25 unmodified lines
133 unsigned int spdif_frm_cnt;135 unsigned int spdif_frm_cnt;
134 struct snd_aes_iec958 iec958;136 struct snd_aes_iec958 iec958;
135 struct mutex ctrl_lock; /* protect resources accessed by controls */137 struct mutex ctrl_lock; /* protect resources accessed by controls */
138 spinlock_t irq_lock; /* used to prevent race condition with IRQ */
136};139};
137 140
138enum stm32_sai_fifo_th {141enum stm32_sai_fifo_th {
@@ -307,6 +310,25 @@ static int stm32_sai_set_clk_div(struct stm32_sai_sub_data *sai, · 168 unmodified lines
307 return ret;310 return ret;
308}311}
309 312
313static int stm32_sai_set_parent_clock(struct stm32_sai_sub_data *sai,
314 unsigned int rate)
315{
316 struct platform_device *pdev = sai->pdev;
317 struct clk *parent_clk = sai->pdata->clk_x8k;
318 int ret;
319
320 if (!(rate % SAI_RATE_11K))
321 parent_clk = sai->pdata->clk_x11k;
322
323 ret = clk_set_parent(sai->sai_ck, parent_clk);
324 if (ret)
325 dev_err(&pdev->dev, " Error %d setting sai_ck parent clock. %s",
326 ret, ret == -EBUSY ?
327 "Active stream rates conflict\n" : "\n");
328
329 return ret;
330}
331
310static long stm32_sai_mclk_round_rate(struct clk_hw *hw, unsigned long rate,332static long stm32_sai_mclk_round_rate(struct clk_hw *hw, unsigned long rate,
311 unsigned long *prate)333 unsigned long *prate)
312{334{
@@ -474,8 +496,10 @@ static irqreturn_t stm32_sai_isr(int irq, void *devid) · 161 unmodified lines
474 status = SNDRV_PCM_STATE_XRUN;496 status = SNDRV_PCM_STATE_XRUN;
475 }497 }
476 498
477 if (status != SNDRV_PCM_STATE_RUNNING)499 spin_lock(&sai->irq_lock);
500 if (status != SNDRV_PCM_STATE_RUNNING && sai->substream)
478 snd_pcm_stop_xrun(sai->substream);501 snd_pcm_stop_xrun(sai->substream);
502 spin_unlock(&sai->irq_lock);
479 503
480 return IRQ_HANDLED;504 return IRQ_HANDLED;
481}505}
@@ -486,25 +510,29 @@ static int stm32_sai_set_sysclk(struct snd_soc_dai *cpu_dai, · 4 unmodified lines
486 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);510 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
487 int ret;511 int ret;
488 512
489 if (dir == SND_SOC_CLOCK_OUT) {513 if (dir == SND_SOC_CLOCK_OUT && sai->sai_mclk) {
490 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX,514 ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX,
491 SAI_XCR1_NODIV,515 SAI_XCR1_NODIV,
492 (unsigned int)~SAI_XCR1_NODIV);516 (unsigned int)~SAI_XCR1_NODIV);
493 if (ret < 0)517 if (ret < 0)
494 return ret;518 return ret;
495 519
496 dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq);520 /* If master clock is used, set parent clock now */
497 sai->mclk_rate = freq;521 ret = stm32_sai_set_parent_clock(sai, freq);
522 if (ret)
523 return ret;
498 524
499 if (sai->sai_mclk) {525 ret = clk_set_rate_exclusive(sai->sai_mclk, freq);
500 ret = clk_set_rate_exclusive(sai->sai_mclk,526 if (ret) {
501 sai->mclk_rate);527 dev_err(cpu_dai->dev,
502 if (ret) {528 ret == -EBUSY ?
503 dev_err(cpu_dai->dev,529 "Active streams have incompatible rates" :
504 "Could not set mclk rate\n");530 "Could not set mclk rate\n");
505 return ret;531 return ret;
506 }
507 }532 }
533
534 dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq);
535 sai->mclk_rate = freq;
508 }536 }
509 537
510 return 0;538 return 0;
@@ -679,8 +707,19 @@ static int stm32_sai_startup(struct snd_pcm_substream *substream, · 168 unmodified lines
679{707{
680 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);708 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
681 int imr, cr2, ret;709 int imr, cr2, ret;
710 unsigned long flags;
682 711
712 spin_lock_irqsave(&sai->irq_lock, flags);
683 sai->substream = substream;713 sai->substream = substream;
714 spin_unlock_irqrestore(&sai->irq_lock, flags);
715
716 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
717 snd_pcm_hw_constraint_mask64(substream->runtime,
718 SNDRV_PCM_HW_PARAM_FORMAT,
719 SNDRV_PCM_FMTBIT_S32_LE);
720 snd_pcm_hw_constraint_single(substream->runtime,
721 SNDRV_PCM_HW_PARAM_CHANNELS, 2);
722 }
684 723
685 ret = clk_prepare_enable(sai->sai_ck);724 ret = clk_prepare_enable(sai->sai_ck);
686 if (ret < 0) {725 if (ret < 0) {
@@ -898,14 +937,16 @@ static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai, · 211 unmodified lines
898 struct snd_pcm_hw_params *params)937 struct snd_pcm_hw_params *params)
899{938{
900 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);939 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
901 int div = 0;940 int div = 0, cr1 = 0;
902 int sai_clk_rate, mclk_ratio, den;941 int sai_clk_rate, mclk_ratio, den;
903 unsigned int rate = params_rate(params);942 unsigned int rate = params_rate(params);
943 int ret;
904 944
905 if (!(rate % 11025))945 if (!sai->sai_mclk) {
906 clk_set_parent(sai->sai_ck, sai->pdata->clk_x11k);946 ret = stm32_sai_set_parent_clock(sai, rate);
907 else947 if (ret)
908 clk_set_parent(sai->sai_ck, sai->pdata->clk_x8k);948 return ret;
949 }
909 sai_clk_rate = clk_get_rate(sai->sai_ck);950 sai_clk_rate = clk_get_rate(sai->sai_ck);
910 951
911 if (STM_SAI_IS_F4(sai->pdata)) {952 if (STM_SAI_IS_F4(sai->pdata)) {
@@ -943,13 +984,19 @@ static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai, · 31 unmodified lines
943 } else {984 } else {
944 if (sai->mclk_rate) {985 if (sai->mclk_rate) {
945 mclk_ratio = sai->mclk_rate / rate;986 mclk_ratio = sai->mclk_rate / rate;
946 if ((mclk_ratio != 512) &&987 if (mclk_ratio == 512) {
947 (mclk_ratio != 256)) {988 cr1 = SAI_XCR1_OSR;
989 } else if (mclk_ratio != 256) {
948 dev_err(cpu_dai->dev,990 dev_err(cpu_dai->dev,
949 "Wrong mclk ratio %d\n",991 "Wrong mclk ratio %d\n",
950 mclk_ratio);992 mclk_ratio);
951 return -EINVAL;993 return -EINVAL;
952 }994 }
995
996 regmap_update_bits(sai->regmap,
997 STM_SAI_CR1_REGX,
998 SAI_XCR1_OSR, cr1);
999
953 div = stm32_sai_get_clk_div(sai, sai_clk_rate,1000 div = stm32_sai_get_clk_div(sai, sai_clk_rate,
954 sai->mclk_rate);1001 sai->mclk_rate);
955 if (div < 0)1002 if (div < 0)
@@ -1051,28 +1098,36 @@ static void stm32_sai_shutdown(struct snd_pcm_substream *substream, · 95 unmodified lines
1051 struct snd_soc_dai *cpu_dai)1098 struct snd_soc_dai *cpu_dai)
1052{1099{
1053 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);1100 struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
1101 unsigned long flags;
1054 1102
1055 regmap_update_bits(sai->regmap, STM_SAI_IMR_REGX, SAI_XIMR_MASK, 0);1103 regmap_update_bits(sai->regmap, STM_SAI_IMR_REGX, SAI_XIMR_MASK, 0);
1056 1104
1057 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_NODIV,1105 regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_NODIV,
1058 SAI_XCR1_NODIV);1106 SAI_XCR1_NODIV);
1059 1107
1060 clk_disable_unprepare(sai->sai_ck);1108 /* Release mclk rate only if rate was actually set */
1109 if (sai->mclk_rate) {
1110 clk_rate_exclusive_put(sai->sai_mclk);
1111 sai->mclk_rate = 0;
1112 }
1061 1113
1062 clk_rate_exclusive_put(sai->sai_mclk);1114 clk_disable_unprepare(sai->sai_ck);
1063 1115
1116 spin_lock_irqsave(&sai->irq_lock, flags);
1064 sai->substream = NULL;1117 sai->substream = NULL;
1118 spin_unlock_irqrestore(&sai->irq_lock, flags);
1065}1119}
1066 1120
1067static int stm32_sai_pcm_new(struct snd_soc_pcm_runtime *rtd,1121static int stm32_sai_pcm_new(struct snd_soc_pcm_runtime *rtd,
1068 struct snd_soc_dai *cpu_dai)1122 struct snd_soc_dai *cpu_dai)
1069{1123{
1070 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);1124 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
1125 struct snd_kcontrol_new knew = iec958_ctls;
1071 1126
1072 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {1127 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) {
1073 dev_dbg(&sai->pdev->dev, "%s: register iec controls", __func__);1128 dev_dbg(&sai->pdev->dev, "%s: register iec controls", __func__);
1074 return snd_ctl_add(rtd->pcm->card,1129 knew.device = rtd->pcm->device;
1075 snd_ctl_new1(&iec958_ctls, sai));1130 return snd_ctl_add(rtd->pcm->card, snd_ctl_new1(&knew, sai));
1076 }1131 }
1077 1132
1078 return 0;1133 return 0;
@@ -1081,7 +1136,7 @@ static int stm32_sai_pcm_new(struct snd_soc_pcm_runtime *rtd, · 2 unmodified lines
1081static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai)1136static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai)
1082{1137{
1083 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);1138 struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev);
1084 int cr1 = 0, cr1_mask;1139 int cr1 = 0, cr1_mask, ret;
1085 1140
1086 sai->cpu_dai = cpu_dai;1141 sai->cpu_dai = cpu_dai;
1087 1142
@@ -1111,8 +1166,10 @@ static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai) · 23 unmodified lines
1111 /* Configure synchronization */1166 /* Configure synchronization */
1112 if (sai->sync == SAI_SYNC_EXTERNAL) {1167 if (sai->sync == SAI_SYNC_EXTERNAL) {
1113 /* Configure synchro client and provider */1168 /* Configure synchro client and provider */
1114 sai->pdata->set_sync(sai->pdata, sai->np_sync_provider,1169 ret = sai->pdata->set_sync(sai->pdata, sai->np_sync_provider,
1115 sai->synco, sai->synci);1170 sai->synco, sai->synci);
1171 if (ret)
1172 return ret;
1116 }1173 }
1117 1174
1118 cr1_mask |= SAI_XCR1_SYNCEN_MASK;1175 cr1_mask |= SAI_XCR1_SYNCEN_MASK;
@@ -1392,7 +1449,6 @@ static int stm32_sai_sub_dais_init(struct platform_device *pdev, · 273 unmodified lines
1392 if (!sai->cpu_dai_drv)1449 if (!sai->cpu_dai_drv)
1393 return -ENOMEM;1450 return -ENOMEM;
1394 1451
1395 sai->cpu_dai_drv->name = dev_name(&pdev->dev);
1396 if (STM_SAI_IS_PLAYBACK(sai)) {1452 if (STM_SAI_IS_PLAYBACK(sai)) {
1397 memcpy(sai->cpu_dai_drv, &stm32_sai_playback_dai,1453 memcpy(sai->cpu_dai_drv, &stm32_sai_playback_dai,
1398 sizeof(stm32_sai_playback_dai));1454 sizeof(stm32_sai_playback_dai));
@@ -1402,6 +1458,7 @@ static int stm32_sai_sub_dais_init(struct platform_device *pdev, · 3 unmodified lines
1402 sizeof(stm32_sai_capture_dai));1458 sizeof(stm32_sai_capture_dai));
1403 sai->cpu_dai_drv->capture.stream_name = sai->cpu_dai_drv->name;1459 sai->cpu_dai_drv->capture.stream_name = sai->cpu_dai_drv->name;
1404 }1460 }
1461 sai->cpu_dai_drv->name = dev_name(&pdev->dev);
1405 1462
1406 return 0;1463 return 0;
1407}1464}
@@ -1424,6 +1481,7 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) · 16 unmodified lines
1424 1481
1425 sai->pdev = pdev;1482 sai->pdev = pdev;
1426 mutex_init(&sai->ctrl_lock);1483 mutex_init(&sai->ctrl_lock);
1484 spin_lock_init(&sai->irq_lock);
1427 platform_set_drvdata(pdev, sai);1485 platform_set_drvdata(pdev, sai);
1428 1486
1429 sai->pdata = dev_get_drvdata(pdev->dev.parent);1487 sai->pdata = dev_get_drvdata(pdev->dev.parent);
sound/xen/xen_snd_front_alsa.c+1−1
@@ -441,7 +441,7 @@ static int shbuf_setup_backstore(struct xen_snd_front_pcm_stream_info *stream, · 440 unmodified lines
441{441{
442 int i;442 int i;
443 443
444 stream->buffer = alloc_pages_exact(stream->buffer_sz, GFP_KERNEL);444 stream->buffer = alloc_pages_exact(buffer_sz, GFP_KERNEL);
445 if (!stream->buffer)445 if (!stream->buffer)
446 return -ENOMEM;446 return -ENOMEM;
447 447