diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-31 20:00:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-31 20:00:25 -0400 |
commit | c6fd4fc708306b7d7187c324ea0a889eda411ebb (patch) | |
tree | b958972e32659e888b3df975143bdc3b85847583 | |
parent | 5e49e0beb6a56c459b330b4c010edffbffe209be (diff) | |
parent | 649ccd08534ee26deb2e5b08509800d0e95167f5 (diff) |
Merge tag 'sound-4.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"This became a relative big update as it includes the collected ASoC
fixes. There are a few fixes in ASoC core side, mostly for DAPM and
the new topology API. The rest are various ASoC driver-specific
fixes, as well as the usual HD-audio and USB-audio quirks"
* tag 'sound-4.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (29 commits)
ALSA: hda - Fix MacBook Pro 5,2 quirk
ALSA: hda - Fix race between PM ops and HDA init/probe
ALSA: usb-audio: add dB range mapping for some devices
ALSA: hda - Apply a fixup to Dell Vostro 5480
ALSA: hda - Add pin quirk for the headset mic jack detection on Dell laptop
ALSA: hda - Apply fixup for another Toshiba Satellite S50D
ALSA: fireworks: add support for AudioFire2 quirk
ALSA: hda - Fix the headset mic that will not work on Dell desktop machine
ALSA: hda - fix cs4210_spdif_automute()
ASoC: pcm1681: Fix setting de-emphasis sampling rate selection
ASoC: ssm4567: Keep TDM_BCLKS in ssm4567_set_dai_fmt
ASoC: sgtl5000: Fix up define for SGTL5000_SMALL_POP
ASoC: dapm: Don't add prefix to widget stream name
ASoC: rt5645: Check if codec is initialized in workqueue handler
ASoC: Intel: Get correct usage_count value to load firmware
ASoC: topology: Fix to add dapm mixer info
ASoC: zx: spdif: Fix devm_ioremap_resource return value check
ASoC: zx: i2s: Fix devm_ioremap_resource return value check
ASoC: mediatek: Use platform_of_node for machine drivers
ASoC: Free card DAPM context on snd_soc_instantiate_card() error path
...
27 files changed, 164 insertions, 69 deletions
diff --git a/Documentation/devicetree/bindings/sound/mt8173-max98090.txt b/Documentation/devicetree/bindings/sound/mt8173-max98090.txt index 829bd26d17f8..519e97c8f1b8 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-max98090.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-max98090.txt | |||
@@ -3,11 +3,13 @@ MT8173 with MAX98090 CODEC | |||
3 | Required properties: | 3 | Required properties: |
4 | - compatible : "mediatek,mt8173-max98090" | 4 | - compatible : "mediatek,mt8173-max98090" |
5 | - mediatek,audio-codec: the phandle of the MAX98090 audio codec | 5 | - mediatek,audio-codec: the phandle of the MAX98090 audio codec |
6 | - mediatek,platform: the phandle of MT8173 ASoC platform | ||
6 | 7 | ||
7 | Example: | 8 | Example: |
8 | 9 | ||
9 | sound { | 10 | sound { |
10 | compatible = "mediatek,mt8173-max98090"; | 11 | compatible = "mediatek,mt8173-max98090"; |
11 | mediatek,audio-codec = <&max98090>; | 12 | mediatek,audio-codec = <&max98090>; |
13 | mediatek,platform = <&afe>; | ||
12 | }; | 14 | }; |
13 | 15 | ||
diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt index 61e98c976bd4..f205ce9e31dd 100644 --- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt +++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt | |||
@@ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS | |||
3 | Required properties: | 3 | Required properties: |
4 | - compatible : "mediatek,mt8173-rt5650-rt5676" | 4 | - compatible : "mediatek,mt8173-rt5650-rt5676" |
5 | - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs | 5 | - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs |
6 | - mediatek,platform: the phandle of MT8173 ASoC platform | ||
6 | 7 | ||
7 | Example: | 8 | Example: |
8 | 9 | ||
9 | sound { | 10 | sound { |
10 | compatible = "mediatek,mt8173-rt5650-rt5676"; | 11 | compatible = "mediatek,mt8173-rt5650-rt5676"; |
11 | mediatek,audio-codec = <&rt5650 &rt5676>; | 12 | mediatek,audio-codec = <&rt5650 &rt5676>; |
13 | mediatek,platform = <&afe>; | ||
12 | }; | 14 | }; |
13 | 15 | ||
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h index 12215205ab8d..785c5ca0994b 100644 --- a/include/uapi/sound/asoc.h +++ b/include/uapi/sound/asoc.h | |||
@@ -110,7 +110,7 @@ | |||
110 | 110 | ||
111 | /* | 111 | /* |
112 | * Block Header. | 112 | * Block Header. |
113 | * This header preceeds all object and object arrays below. | 113 | * This header precedes all object and object arrays below. |
114 | */ | 114 | */ |
115 | struct snd_soc_tplg_hdr { | 115 | struct snd_soc_tplg_hdr { |
116 | __le32 magic; /* magic number */ | 116 | __le32 magic; /* magic number */ |
@@ -222,7 +222,7 @@ struct snd_soc_tplg_stream_config { | |||
222 | /* | 222 | /* |
223 | * Manifest. List totals for each payload type. Not used in parsing, but will | 223 | * Manifest. List totals for each payload type. Not used in parsing, but will |
224 | * be passed to the component driver before any other objects in order for any | 224 | * be passed to the component driver before any other objects in order for any |
225 | * global componnent resource allocations. | 225 | * global component resource allocations. |
226 | * | 226 | * |
227 | * File block representation for manifest :- | 227 | * File block representation for manifest :- |
228 | * +-----------------------------------+----+ | 228 | * +-----------------------------------+----+ |
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c index 2682e7e3e5c9..c670db4eee70 100644 --- a/sound/firewire/fireworks/fireworks.c +++ b/sound/firewire/fireworks/fireworks.c | |||
@@ -248,6 +248,8 @@ efw_probe(struct fw_unit *unit, | |||
248 | err = get_hardware_info(efw); | 248 | err = get_hardware_info(efw); |
249 | if (err < 0) | 249 | if (err < 0) |
250 | goto error; | 250 | goto error; |
251 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2) | ||
252 | efw->is_af2 = true; | ||
251 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) | 253 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) |
252 | efw->is_af9 = true; | 254 | efw->is_af9 = true; |
253 | 255 | ||
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h index 4f0201a95222..c33252b7bc84 100644 --- a/sound/firewire/fireworks/fireworks.h +++ b/sound/firewire/fireworks/fireworks.h | |||
@@ -70,6 +70,7 @@ struct snd_efw { | |||
70 | bool resp_addr_changable; | 70 | bool resp_addr_changable; |
71 | 71 | ||
72 | /* for quirks */ | 72 | /* for quirks */ |
73 | bool is_af2; | ||
73 | bool is_af9; | 74 | bool is_af9; |
74 | u32 firmware_version; | 75 | u32 firmware_version; |
75 | 76 | ||
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c index c55db1bddc80..a0762dd6231e 100644 --- a/sound/firewire/fireworks/fireworks_stream.c +++ b/sound/firewire/fireworks/fireworks_stream.c | |||
@@ -172,6 +172,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) | |||
172 | efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; | 172 | efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; |
173 | /* Fireworks reset dbc at bus reset. */ | 173 | /* Fireworks reset dbc at bus reset. */ |
174 | efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; | 174 | efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; |
175 | /* AudioFire2 starts packets with non-zero dbc. */ | ||
176 | if (efw->is_af2) | ||
177 | efw->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK; | ||
175 | /* AudioFire9 always reports wrong dbs. */ | 178 | /* AudioFire9 always reports wrong dbs. */ |
176 | if (efw->is_af9) | 179 | if (efw->is_af9) |
177 | efw->tx_stream.flags |= CIP_WRONG_DBS; | 180 | efw->tx_stream.flags |= CIP_WRONG_DBS; |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 735bdcb04ce8..c38c68f57938 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -867,7 +867,7 @@ static int azx_suspend(struct device *dev) | |||
867 | 867 | ||
868 | chip = card->private_data; | 868 | chip = card->private_data; |
869 | hda = container_of(chip, struct hda_intel, chip); | 869 | hda = container_of(chip, struct hda_intel, chip); |
870 | if (chip->disabled || hda->init_failed) | 870 | if (chip->disabled || hda->init_failed || !chip->running) |
871 | return 0; | 871 | return 0; |
872 | 872 | ||
873 | bus = azx_bus(chip); | 873 | bus = azx_bus(chip); |
@@ -902,7 +902,7 @@ static int azx_resume(struct device *dev) | |||
902 | 902 | ||
903 | chip = card->private_data; | 903 | chip = card->private_data; |
904 | hda = container_of(chip, struct hda_intel, chip); | 904 | hda = container_of(chip, struct hda_intel, chip); |
905 | if (chip->disabled || hda->init_failed) | 905 | if (chip->disabled || hda->init_failed || !chip->running) |
906 | return 0; | 906 | return 0; |
907 | 907 | ||
908 | if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL | 908 | if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL |
@@ -1027,7 +1027,7 @@ static int azx_runtime_idle(struct device *dev) | |||
1027 | return 0; | 1027 | return 0; |
1028 | 1028 | ||
1029 | if (!power_save_controller || !azx_has_pm_runtime(chip) || | 1029 | if (!power_save_controller || !azx_has_pm_runtime(chip) || |
1030 | azx_bus(chip)->codec_powered) | 1030 | azx_bus(chip)->codec_powered || !chip->running) |
1031 | return -EBUSY; | 1031 | return -EBUSY; |
1032 | 1032 | ||
1033 | return 0; | 1033 | return 0; |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 25ccf781fbe7..584a0343ab0c 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -999,9 +999,7 @@ static void cs4210_spdif_automute(struct hda_codec *codec, | |||
999 | 999 | ||
1000 | spec->spdif_present = spdif_present; | 1000 | spec->spdif_present = spdif_present; |
1001 | /* SPDIF TX on/off */ | 1001 | /* SPDIF TX on/off */ |
1002 | if (spdif_present) | 1002 | snd_hda_set_pin_ctl(codec, spdif_pin, spdif_present ? PIN_OUT : 0); |
1003 | snd_hda_set_pin_ctl(codec, spdif_pin, | ||
1004 | spdif_present ? PIN_OUT : 0); | ||
1005 | 1003 | ||
1006 | cs_automute(codec); | 1004 | cs_automute(codec); |
1007 | } | 1005 | } |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 742fc626f9e1..c456c04e0928 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -2222,7 +2222,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
2222 | SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), | 2222 | SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), |
2223 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), | 2223 | SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), |
2224 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), | 2224 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), |
2225 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), | 2225 | SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF), |
2226 | 2226 | ||
2227 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), | 2227 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), |
2228 | SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), | 2228 | SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), |
@@ -5185,6 +5185,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5185 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5185 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5186 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5186 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5187 | SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13), | 5187 | SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13), |
5188 | SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK), | ||
5188 | SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 5189 | SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
5189 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5190 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5190 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5191 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
@@ -5398,8 +5399,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | |||
5398 | {0x19, 0x411111f0}, \ | 5399 | {0x19, 0x411111f0}, \ |
5399 | {0x1a, 0x411111f0}, \ | 5400 | {0x1a, 0x411111f0}, \ |
5400 | {0x1b, 0x411111f0}, \ | 5401 | {0x1b, 0x411111f0}, \ |
5401 | {0x1d, 0x40700001}, \ | ||
5402 | {0x1e, 0x411111f0}, \ | ||
5403 | {0x21, 0x02211020} | 5402 | {0x21, 0x02211020} |
5404 | 5403 | ||
5405 | #define ALC282_STANDARD_PINS \ | 5404 | #define ALC282_STANDARD_PINS \ |
@@ -5473,6 +5472,28 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
5473 | {0x1e, 0x411111f0}, | 5472 | {0x1e, 0x411111f0}, |
5474 | {0x21, 0x0221103f}), | 5473 | {0x21, 0x0221103f}), |
5475 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 5474 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
5475 | {0x12, 0x40000000}, | ||
5476 | {0x14, 0x90170150}, | ||
5477 | {0x17, 0x411111f0}, | ||
5478 | {0x18, 0x411111f0}, | ||
5479 | {0x19, 0x411111f0}, | ||
5480 | {0x1a, 0x411111f0}, | ||
5481 | {0x1b, 0x02011020}, | ||
5482 | {0x1d, 0x4054c029}, | ||
5483 | {0x1e, 0x411111f0}, | ||
5484 | {0x21, 0x0221105f}), | ||
5485 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5486 | {0x12, 0x40000000}, | ||
5487 | {0x14, 0x90170110}, | ||
5488 | {0x17, 0x411111f0}, | ||
5489 | {0x18, 0x411111f0}, | ||
5490 | {0x19, 0x411111f0}, | ||
5491 | {0x1a, 0x411111f0}, | ||
5492 | {0x1b, 0x01014020}, | ||
5493 | {0x1d, 0x4054c029}, | ||
5494 | {0x1e, 0x411111f0}, | ||
5495 | {0x21, 0x0221101f}), | ||
5496 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5476 | {0x12, 0x90a60160}, | 5497 | {0x12, 0x90a60160}, |
5477 | {0x14, 0x90170120}, | 5498 | {0x14, 0x90170120}, |
5478 | {0x17, 0x90170140}, | 5499 | {0x17, 0x90170140}, |
@@ -5534,10 +5555,19 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
5534 | {0x21, 0x02211030}), | 5555 | {0x21, 0x02211030}), |
5535 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 5556 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
5536 | ALC256_STANDARD_PINS, | 5557 | ALC256_STANDARD_PINS, |
5537 | {0x13, 0x40000000}), | 5558 | {0x13, 0x40000000}, |
5559 | {0x1d, 0x40700001}, | ||
5560 | {0x1e, 0x411111f0}), | ||
5538 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 5561 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
5539 | ALC256_STANDARD_PINS, | 5562 | ALC256_STANDARD_PINS, |
5540 | {0x13, 0x411111f0}), | 5563 | {0x13, 0x411111f0}, |
5564 | {0x1d, 0x40700001}, | ||
5565 | {0x1e, 0x411111f0}), | ||
5566 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5567 | ALC256_STANDARD_PINS, | ||
5568 | {0x13, 0x411111f0}, | ||
5569 | {0x1d, 0x4077992d}, | ||
5570 | {0x1e, 0x411111ff}), | ||
5541 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | 5571 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, |
5542 | {0x12, 0x90a60130}, | 5572 | {0x12, 0x90a60130}, |
5543 | {0x13, 0x40000000}, | 5573 | {0x13, 0x40000000}, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index dcc7fe91244c..9d947aef2c8b 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -2920,7 +2920,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { | |||
2920 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a, | 2920 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a, |
2921 | "HP Mini", STAC_92HD83XXX_HP_LED), | 2921 | "HP Mini", STAC_92HD83XXX_HP_LED), |
2922 | SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP), | 2922 | SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP), |
2923 | SND_PCI_QUIRK(PCI_VENDOR_ID_TOSHIBA, 0xfa91, | 2923 | /* match both for 0xfa91 and 0xfa93 */ |
2924 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91, | ||
2924 | "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), | 2925 | "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), |
2925 | {} /* terminator */ | 2926 | {} /* terminator */ |
2926 | }; | 2927 | }; |
diff --git a/sound/soc/codecs/pcm1681.c b/sound/soc/codecs/pcm1681.c index 477e13d30971..e7ba557979cb 100644 --- a/sound/soc/codecs/pcm1681.c +++ b/sound/soc/codecs/pcm1681.c | |||
@@ -102,7 +102,7 @@ static int pcm1681_set_deemph(struct snd_soc_codec *codec) | |||
102 | 102 | ||
103 | if (val != -1) { | 103 | if (val != -1) { |
104 | regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL, | 104 | regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL, |
105 | PCM1681_DEEMPH_RATE_MASK, val); | 105 | PCM1681_DEEMPH_RATE_MASK, val << 3); |
106 | enable = 1; | 106 | enable = 1; |
107 | } else | 107 | } else |
108 | enable = 0; | 108 | enable = 0; |
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index 9ce311e088fc..e9cc3aae5366 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c | |||
@@ -2943,6 +2943,9 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645) | |||
2943 | { | 2943 | { |
2944 | int val, btn_type, gpio_state = 0, report = 0; | 2944 | int val, btn_type, gpio_state = 0, report = 0; |
2945 | 2945 | ||
2946 | if (!rt5645->codec) | ||
2947 | return -EINVAL; | ||
2948 | |||
2946 | switch (rt5645->pdata.jd_mode) { | 2949 | switch (rt5645->pdata.jd_mode) { |
2947 | case 0: /* Not using rt5645 JD */ | 2950 | case 0: /* Not using rt5645 JD */ |
2948 | if (rt5645->gpiod_hp_det) { | 2951 | if (rt5645->gpiod_hp_det) { |
diff --git a/sound/soc/codecs/sgtl5000.h b/sound/soc/codecs/sgtl5000.h index bd7a344bf8c5..1c317de26176 100644 --- a/sound/soc/codecs/sgtl5000.h +++ b/sound/soc/codecs/sgtl5000.h | |||
@@ -275,7 +275,7 @@ | |||
275 | #define SGTL5000_BIAS_CTRL_MASK 0x000e | 275 | #define SGTL5000_BIAS_CTRL_MASK 0x000e |
276 | #define SGTL5000_BIAS_CTRL_SHIFT 1 | 276 | #define SGTL5000_BIAS_CTRL_SHIFT 1 |
277 | #define SGTL5000_BIAS_CTRL_WIDTH 3 | 277 | #define SGTL5000_BIAS_CTRL_WIDTH 3 |
278 | #define SGTL5000_SMALL_POP 0 | 278 | #define SGTL5000_SMALL_POP 1 |
279 | 279 | ||
280 | /* | 280 | /* |
281 | * SGTL5000_CHIP_MIC_CTRL | 281 | * SGTL5000_CHIP_MIC_CTRL |
diff --git a/sound/soc/codecs/ssm4567.c b/sound/soc/codecs/ssm4567.c index 938d2cb6d78b..84a4f5ad8064 100644 --- a/sound/soc/codecs/ssm4567.c +++ b/sound/soc/codecs/ssm4567.c | |||
@@ -315,7 +315,13 @@ static int ssm4567_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
315 | if (invert_fclk) | 315 | if (invert_fclk) |
316 | ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC; | 316 | ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC; |
317 | 317 | ||
318 | return regmap_write(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1, ctrl1); | 318 | return regmap_update_bits(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1, |
319 | SSM4567_SAI_CTRL_1_BCLK | | ||
320 | SSM4567_SAI_CTRL_1_FSYNC | | ||
321 | SSM4567_SAI_CTRL_1_LJ | | ||
322 | SSM4567_SAI_CTRL_1_TDM | | ||
323 | SSM4567_SAI_CTRL_1_PDM, | ||
324 | ctrl1); | ||
319 | } | 325 | } |
320 | 326 | ||
321 | static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) | 327 | static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) |
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index c7647e066cfd..c0b940e2019f 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
@@ -633,7 +633,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, | |||
633 | sub *= 100000; | 633 | sub *= 100000; |
634 | do_div(sub, freq); | 634 | do_div(sub, freq); |
635 | 635 | ||
636 | if (sub < savesub) { | 636 | if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) { |
637 | baudrate = tmprate; | 637 | baudrate = tmprate; |
638 | savesub = sub; | 638 | savesub = sub; |
639 | pm = i; | 639 | pm = i; |
diff --git a/sound/soc/intel/Makefile b/sound/soc/intel/Makefile index 3853ec2ddbc7..6de5d5cd3280 100644 --- a/sound/soc/intel/Makefile +++ b/sound/soc/intel/Makefile | |||
@@ -7,4 +7,4 @@ obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/ | |||
7 | obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/ | 7 | obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/ |
8 | 8 | ||
9 | # Machine support | 9 | # Machine support |
10 | obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/ | 10 | obj-$(CONFIG_SND_SOC) += boards/ |
diff --git a/sound/soc/intel/atom/sst/sst_drv_interface.c b/sound/soc/intel/atom/sst/sst_drv_interface.c index 620da1d1b9e3..0e0e4d9c021f 100644 --- a/sound/soc/intel/atom/sst/sst_drv_interface.c +++ b/sound/soc/intel/atom/sst/sst_drv_interface.c | |||
@@ -42,6 +42,11 @@ | |||
42 | #define MIN_FRAGMENT_SIZE (50 * 1024) | 42 | #define MIN_FRAGMENT_SIZE (50 * 1024) |
43 | #define MAX_FRAGMENT_SIZE (1024 * 1024) | 43 | #define MAX_FRAGMENT_SIZE (1024 * 1024) |
44 | #define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1) | 44 | #define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1) |
45 | #ifdef CONFIG_PM | ||
46 | #define GET_USAGE_COUNT(dev) (atomic_read(&dev->power.usage_count)) | ||
47 | #else | ||
48 | #define GET_USAGE_COUNT(dev) 1 | ||
49 | #endif | ||
45 | 50 | ||
46 | int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id) | 51 | int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id) |
47 | { | 52 | { |
@@ -141,15 +146,9 @@ static int sst_power_control(struct device *dev, bool state) | |||
141 | int ret = 0; | 146 | int ret = 0; |
142 | int usage_count = 0; | 147 | int usage_count = 0; |
143 | 148 | ||
144 | #ifdef CONFIG_PM | ||
145 | usage_count = atomic_read(&dev->power.usage_count); | ||
146 | #else | ||
147 | usage_count = 1; | ||
148 | #endif | ||
149 | |||
150 | if (state == true) { | 149 | if (state == true) { |
151 | ret = pm_runtime_get_sync(dev); | 150 | ret = pm_runtime_get_sync(dev); |
152 | 151 | usage_count = GET_USAGE_COUNT(dev); | |
153 | dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count); | 152 | dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count); |
154 | if (ret < 0) { | 153 | if (ret < 0) { |
155 | dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret); | 154 | dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret); |
@@ -164,6 +163,7 @@ static int sst_power_control(struct device *dev, bool state) | |||
164 | } | 163 | } |
165 | } | 164 | } |
166 | } else { | 165 | } else { |
166 | usage_count = GET_USAGE_COUNT(dev); | ||
167 | dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count); | 167 | dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count); |
168 | return sst_pm_runtime_put(ctx); | 168 | return sst_pm_runtime_put(ctx); |
169 | } | 169 | } |
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index d604ee80eda4..70f832114a5a 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c | |||
@@ -69,12 +69,12 @@ static const struct snd_soc_dapm_route cht_audio_map[] = { | |||
69 | {"Headphone", NULL, "HPR"}, | 69 | {"Headphone", NULL, "HPR"}, |
70 | {"Ext Spk", NULL, "SPKL"}, | 70 | {"Ext Spk", NULL, "SPKL"}, |
71 | {"Ext Spk", NULL, "SPKR"}, | 71 | {"Ext Spk", NULL, "SPKR"}, |
72 | {"AIF1 Playback", NULL, "ssp2 Tx"}, | 72 | {"HiFi Playback", NULL, "ssp2 Tx"}, |
73 | {"ssp2 Tx", NULL, "codec_out0"}, | 73 | {"ssp2 Tx", NULL, "codec_out0"}, |
74 | {"ssp2 Tx", NULL, "codec_out1"}, | 74 | {"ssp2 Tx", NULL, "codec_out1"}, |
75 | {"codec_in0", NULL, "ssp2 Rx" }, | 75 | {"codec_in0", NULL, "ssp2 Rx" }, |
76 | {"codec_in1", NULL, "ssp2 Rx" }, | 76 | {"codec_in1", NULL, "ssp2 Rx" }, |
77 | {"ssp2 Rx", NULL, "AIF1 Capture"}, | 77 | {"ssp2 Rx", NULL, "HiFi Capture"}, |
78 | }; | 78 | }; |
79 | 79 | ||
80 | static const struct snd_kcontrol_new cht_mc_controls[] = { | 80 | static const struct snd_kcontrol_new cht_mc_controls[] = { |
diff --git a/sound/soc/mediatek/mt8173-max98090.c b/sound/soc/mediatek/mt8173-max98090.c index 4d44b5803e55..2d2536af141f 100644 --- a/sound/soc/mediatek/mt8173-max98090.c +++ b/sound/soc/mediatek/mt8173-max98090.c | |||
@@ -103,7 +103,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
103 | .name = "MAX98090 Playback", | 103 | .name = "MAX98090 Playback", |
104 | .stream_name = "MAX98090 Playback", | 104 | .stream_name = "MAX98090 Playback", |
105 | .cpu_dai_name = "DL1", | 105 | .cpu_dai_name = "DL1", |
106 | .platform_name = "11220000.mt8173-afe-pcm", | ||
107 | .codec_name = "snd-soc-dummy", | 106 | .codec_name = "snd-soc-dummy", |
108 | .codec_dai_name = "snd-soc-dummy-dai", | 107 | .codec_dai_name = "snd-soc-dummy-dai", |
109 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 108 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
@@ -114,7 +113,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
114 | .name = "MAX98090 Capture", | 113 | .name = "MAX98090 Capture", |
115 | .stream_name = "MAX98090 Capture", | 114 | .stream_name = "MAX98090 Capture", |
116 | .cpu_dai_name = "VUL", | 115 | .cpu_dai_name = "VUL", |
117 | .platform_name = "11220000.mt8173-afe-pcm", | ||
118 | .codec_name = "snd-soc-dummy", | 116 | .codec_name = "snd-soc-dummy", |
119 | .codec_dai_name = "snd-soc-dummy-dai", | 117 | .codec_dai_name = "snd-soc-dummy-dai", |
120 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 118 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
@@ -125,7 +123,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = { | |||
125 | { | 123 | { |
126 | .name = "Codec", | 124 | .name = "Codec", |
127 | .cpu_dai_name = "I2S", | 125 | .cpu_dai_name = "I2S", |
128 | .platform_name = "11220000.mt8173-afe-pcm", | ||
129 | .no_pcm = 1, | 126 | .no_pcm = 1, |
130 | .codec_dai_name = "HiFi", | 127 | .codec_dai_name = "HiFi", |
131 | .init = mt8173_max98090_init, | 128 | .init = mt8173_max98090_init, |
@@ -152,9 +149,21 @@ static struct snd_soc_card mt8173_max98090_card = { | |||
152 | static int mt8173_max98090_dev_probe(struct platform_device *pdev) | 149 | static int mt8173_max98090_dev_probe(struct platform_device *pdev) |
153 | { | 150 | { |
154 | struct snd_soc_card *card = &mt8173_max98090_card; | 151 | struct snd_soc_card *card = &mt8173_max98090_card; |
155 | struct device_node *codec_node; | 152 | struct device_node *codec_node, *platform_node; |
156 | int ret, i; | 153 | int ret, i; |
157 | 154 | ||
155 | platform_node = of_parse_phandle(pdev->dev.of_node, | ||
156 | "mediatek,platform", 0); | ||
157 | if (!platform_node) { | ||
158 | dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); | ||
159 | return -EINVAL; | ||
160 | } | ||
161 | for (i = 0; i < card->num_links; i++) { | ||
162 | if (mt8173_max98090_dais[i].platform_name) | ||
163 | continue; | ||
164 | mt8173_max98090_dais[i].platform_of_node = platform_node; | ||
165 | } | ||
166 | |||
158 | codec_node = of_parse_phandle(pdev->dev.of_node, | 167 | codec_node = of_parse_phandle(pdev->dev.of_node, |
159 | "mediatek,audio-codec", 0); | 168 | "mediatek,audio-codec", 0); |
160 | if (!codec_node) { | 169 | if (!codec_node) { |
diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c index 094055323059..6f52eca05e26 100644 --- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c +++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c | |||
@@ -138,7 +138,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
138 | .name = "rt5650_rt5676 Playback", | 138 | .name = "rt5650_rt5676 Playback", |
139 | .stream_name = "rt5650_rt5676 Playback", | 139 | .stream_name = "rt5650_rt5676 Playback", |
140 | .cpu_dai_name = "DL1", | 140 | .cpu_dai_name = "DL1", |
141 | .platform_name = "11220000.mt8173-afe-pcm", | ||
142 | .codec_name = "snd-soc-dummy", | 141 | .codec_name = "snd-soc-dummy", |
143 | .codec_dai_name = "snd-soc-dummy-dai", | 142 | .codec_dai_name = "snd-soc-dummy-dai", |
144 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 143 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
@@ -149,7 +148,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
149 | .name = "rt5650_rt5676 Capture", | 148 | .name = "rt5650_rt5676 Capture", |
150 | .stream_name = "rt5650_rt5676 Capture", | 149 | .stream_name = "rt5650_rt5676 Capture", |
151 | .cpu_dai_name = "VUL", | 150 | .cpu_dai_name = "VUL", |
152 | .platform_name = "11220000.mt8173-afe-pcm", | ||
153 | .codec_name = "snd-soc-dummy", | 151 | .codec_name = "snd-soc-dummy", |
154 | .codec_dai_name = "snd-soc-dummy-dai", | 152 | .codec_dai_name = "snd-soc-dummy-dai", |
155 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, | 153 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
@@ -161,7 +159,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = { | |||
161 | { | 159 | { |
162 | .name = "Codec", | 160 | .name = "Codec", |
163 | .cpu_dai_name = "I2S", | 161 | .cpu_dai_name = "I2S", |
164 | .platform_name = "11220000.mt8173-afe-pcm", | ||
165 | .no_pcm = 1, | 162 | .no_pcm = 1, |
166 | .codecs = mt8173_rt5650_rt5676_codecs, | 163 | .codecs = mt8173_rt5650_rt5676_codecs, |
167 | .num_codecs = 2, | 164 | .num_codecs = 2, |
@@ -209,7 +206,21 @@ static struct snd_soc_card mt8173_rt5650_rt5676_card = { | |||
209 | static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) | 206 | static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) |
210 | { | 207 | { |
211 | struct snd_soc_card *card = &mt8173_rt5650_rt5676_card; | 208 | struct snd_soc_card *card = &mt8173_rt5650_rt5676_card; |
212 | int ret; | 209 | struct device_node *platform_node; |
210 | int i, ret; | ||
211 | |||
212 | platform_node = of_parse_phandle(pdev->dev.of_node, | ||
213 | "mediatek,platform", 0); | ||
214 | if (!platform_node) { | ||
215 | dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); | ||
216 | return -EINVAL; | ||
217 | } | ||
218 | |||
219 | for (i = 0; i < card->num_links; i++) { | ||
220 | if (mt8173_rt5650_rt5676_dais[i].platform_name) | ||
221 | continue; | ||
222 | mt8173_rt5650_rt5676_dais[i].platform_of_node = platform_node; | ||
223 | } | ||
213 | 224 | ||
214 | mt8173_rt5650_rt5676_codecs[0].of_node = | 225 | mt8173_rt5650_rt5676_codecs[0].of_node = |
215 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); | 226 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); |
diff --git a/sound/soc/mediatek/mtk-afe-pcm.c b/sound/soc/mediatek/mtk-afe-pcm.c index cc228db5fb76..9863da73dfe0 100644 --- a/sound/soc/mediatek/mtk-afe-pcm.c +++ b/sound/soc/mediatek/mtk-afe-pcm.c | |||
@@ -1199,6 +1199,8 @@ err_pm_disable: | |||
1199 | static int mtk_afe_pcm_dev_remove(struct platform_device *pdev) | 1199 | static int mtk_afe_pcm_dev_remove(struct platform_device *pdev) |
1200 | { | 1200 | { |
1201 | pm_runtime_disable(&pdev->dev); | 1201 | pm_runtime_disable(&pdev->dev); |
1202 | if (!pm_runtime_status_suspended(&pdev->dev)) | ||
1203 | mtk_afe_runtime_suspend(&pdev->dev); | ||
1202 | snd_soc_unregister_component(&pdev->dev); | 1204 | snd_soc_unregister_component(&pdev->dev); |
1203 | snd_soc_unregister_platform(&pdev->dev); | 1205 | snd_soc_unregister_platform(&pdev->dev); |
1204 | return 0; | 1206 | return 0; |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 3a4a5c0e3f97..0e1e69c7abd5 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -1716,6 +1716,7 @@ card_probe_error: | |||
1716 | if (card->remove) | 1716 | if (card->remove) |
1717 | card->remove(card); | 1717 | card->remove(card); |
1718 | 1718 | ||
1719 | snd_soc_dapm_free(&card->dapm); | ||
1719 | soc_cleanup_card_debugfs(card); | 1720 | soc_cleanup_card_debugfs(card); |
1720 | snd_card_free(card->snd_card); | 1721 | snd_card_free(card->snd_card); |
1721 | 1722 | ||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index aa327c92480c..e0de8072c514 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -358,9 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
358 | data->widget = | 358 | data->widget = |
359 | snd_soc_dapm_new_control_unlocked(widget->dapm, | 359 | snd_soc_dapm_new_control_unlocked(widget->dapm, |
360 | &template); | 360 | &template); |
361 | kfree(name); | ||
361 | if (!data->widget) { | 362 | if (!data->widget) { |
362 | ret = -ENOMEM; | 363 | ret = -ENOMEM; |
363 | goto err_name; | 364 | goto err_data; |
364 | } | 365 | } |
365 | } | 366 | } |
366 | break; | 367 | break; |
@@ -389,11 +390,12 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
389 | 390 | ||
390 | data->value = template.on_val; | 391 | data->value = template.on_val; |
391 | 392 | ||
392 | data->widget = snd_soc_dapm_new_control(widget->dapm, | 393 | data->widget = snd_soc_dapm_new_control_unlocked( |
393 | &template); | 394 | widget->dapm, &template); |
395 | kfree(name); | ||
394 | if (!data->widget) { | 396 | if (!data->widget) { |
395 | ret = -ENOMEM; | 397 | ret = -ENOMEM; |
396 | goto err_name; | 398 | goto err_data; |
397 | } | 399 | } |
398 | 400 | ||
399 | snd_soc_dapm_add_path(widget->dapm, data->widget, | 401 | snd_soc_dapm_add_path(widget->dapm, data->widget, |
@@ -408,8 +410,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
408 | 410 | ||
409 | return 0; | 411 | return 0; |
410 | 412 | ||
411 | err_name: | ||
412 | kfree(name); | ||
413 | err_data: | 413 | err_data: |
414 | kfree(data); | 414 | kfree(data); |
415 | return ret; | 415 | return ret; |
@@ -418,8 +418,6 @@ err_data: | |||
418 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) | 418 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) |
419 | { | 419 | { |
420 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); | 420 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); |
421 | if (data->widget) | ||
422 | kfree(data->widget->name); | ||
423 | kfree(data->wlist); | 421 | kfree(data->wlist); |
424 | kfree(data); | 422 | kfree(data); |
425 | } | 423 | } |
@@ -1952,6 +1950,7 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
1952 | size_t count, loff_t *ppos) | 1950 | size_t count, loff_t *ppos) |
1953 | { | 1951 | { |
1954 | struct snd_soc_dapm_widget *w = file->private_data; | 1952 | struct snd_soc_dapm_widget *w = file->private_data; |
1953 | struct snd_soc_card *card = w->dapm->card; | ||
1955 | char *buf; | 1954 | char *buf; |
1956 | int in, out; | 1955 | int in, out; |
1957 | ssize_t ret; | 1956 | ssize_t ret; |
@@ -1961,6 +1960,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
1961 | if (!buf) | 1960 | if (!buf) |
1962 | return -ENOMEM; | 1961 | return -ENOMEM; |
1963 | 1962 | ||
1963 | mutex_lock(&card->dapm_mutex); | ||
1964 | |||
1964 | /* Supply widgets are not handled by is_connected_{input,output}_ep() */ | 1965 | /* Supply widgets are not handled by is_connected_{input,output}_ep() */ |
1965 | if (w->is_supply) { | 1966 | if (w->is_supply) { |
1966 | in = 0; | 1967 | in = 0; |
@@ -2007,6 +2008,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
2007 | p->sink->name); | 2008 | p->sink->name); |
2008 | } | 2009 | } |
2009 | 2010 | ||
2011 | mutex_unlock(&card->dapm_mutex); | ||
2012 | |||
2010 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); | 2013 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); |
2011 | 2014 | ||
2012 | kfree(buf); | 2015 | kfree(buf); |
@@ -2281,11 +2284,15 @@ static ssize_t dapm_widget_show(struct device *dev, | |||
2281 | struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); | 2284 | struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); |
2282 | int i, count = 0; | 2285 | int i, count = 0; |
2283 | 2286 | ||
2287 | mutex_lock(&rtd->card->dapm_mutex); | ||
2288 | |||
2284 | for (i = 0; i < rtd->num_codecs; i++) { | 2289 | for (i = 0; i < rtd->num_codecs; i++) { |
2285 | struct snd_soc_codec *codec = rtd->codec_dais[i]->codec; | 2290 | struct snd_soc_codec *codec = rtd->codec_dais[i]->codec; |
2286 | count += dapm_widget_show_codec(codec, buf + count); | 2291 | count += dapm_widget_show_codec(codec, buf + count); |
2287 | } | 2292 | } |
2288 | 2293 | ||
2294 | mutex_unlock(&rtd->card->dapm_mutex); | ||
2295 | |||
2289 | return count; | 2296 | return count; |
2290 | } | 2297 | } |
2291 | 2298 | ||
@@ -3334,16 +3341,10 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, | |||
3334 | } | 3341 | } |
3335 | 3342 | ||
3336 | prefix = soc_dapm_prefix(dapm); | 3343 | prefix = soc_dapm_prefix(dapm); |
3337 | if (prefix) { | 3344 | if (prefix) |
3338 | w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); | 3345 | w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); |
3339 | if (widget->sname) | 3346 | else |
3340 | w->sname = kasprintf(GFP_KERNEL, "%s %s", prefix, | ||
3341 | widget->sname); | ||
3342 | } else { | ||
3343 | w->name = kasprintf(GFP_KERNEL, "%s", widget->name); | 3347 | w->name = kasprintf(GFP_KERNEL, "%s", widget->name); |
3344 | if (widget->sname) | ||
3345 | w->sname = kasprintf(GFP_KERNEL, "%s", widget->sname); | ||
3346 | } | ||
3347 | if (w->name == NULL) { | 3348 | if (w->name == NULL) { |
3348 | kfree(w); | 3349 | kfree(w); |
3349 | return NULL; | 3350 | return NULL; |
@@ -3792,7 +3793,7 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card) | |||
3792 | break; | 3793 | break; |
3793 | } | 3794 | } |
3794 | 3795 | ||
3795 | if (!w->sname || !strstr(w->sname, dai_w->name)) | 3796 | if (!w->sname || !strstr(w->sname, dai_w->sname)) |
3796 | continue; | 3797 | continue; |
3797 | 3798 | ||
3798 | if (dai_w->id == snd_soc_dapm_dai_in) { | 3799 | if (dai_w->id == snd_soc_dapm_dai_in) { |
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index d0960683c409..59ac211f8fe7 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c | |||
@@ -144,7 +144,7 @@ static const struct snd_soc_tplg_kcontrol_ops io_ops[] = { | |||
144 | {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, | 144 | {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, |
145 | snd_soc_put_strobe, NULL}, | 145 | snd_soc_put_strobe, NULL}, |
146 | {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, | 146 | {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, |
147 | snd_soc_dapm_put_volsw, NULL}, | 147 | snd_soc_dapm_put_volsw, snd_soc_info_volsw}, |
148 | {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, | 148 | {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, |
149 | snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, | 149 | snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, |
150 | {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, | 150 | {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, |
@@ -580,27 +580,26 @@ static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, | |||
580 | } | 580 | } |
581 | 581 | ||
582 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, | 582 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, |
583 | struct snd_kcontrol_new *kc, u32 tlv_size) | 583 | struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_tlv *tplg_tlv) |
584 | { | 584 | { |
585 | struct snd_soc_tplg_ctl_tlv *tplg_tlv; | ||
586 | struct snd_ctl_tlv *tlv; | 585 | struct snd_ctl_tlv *tlv; |
586 | int size; | ||
587 | 587 | ||
588 | if (tlv_size == 0) | 588 | if (tplg_tlv->count == 0) |
589 | return 0; | 589 | return 0; |
590 | 590 | ||
591 | tplg_tlv = (struct snd_soc_tplg_ctl_tlv *) tplg->pos; | 591 | size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) & |
592 | tplg->pos += tlv_size; | 592 | ~(sizeof(unsigned int) - 1)); |
593 | 593 | tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL); | |
594 | tlv = kzalloc(sizeof(*tlv) + tlv_size, GFP_KERNEL); | ||
595 | if (tlv == NULL) | 594 | if (tlv == NULL) |
596 | return -ENOMEM; | 595 | return -ENOMEM; |
597 | 596 | ||
598 | dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", | 597 | dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", |
599 | tplg_tlv->numid, tplg_tlv->size); | 598 | tplg_tlv->numid, size); |
600 | 599 | ||
601 | tlv->numid = tplg_tlv->numid; | 600 | tlv->numid = tplg_tlv->numid; |
602 | tlv->length = tplg_tlv->size; | 601 | tlv->length = size; |
603 | memcpy(tlv->tlv, tplg_tlv + 1, tplg_tlv->size); | 602 | memcpy(&tlv->tlv[0], tplg_tlv->data, size); |
604 | kc->tlv.p = (void *)tlv; | 603 | kc->tlv.p = (void *)tlv; |
605 | 604 | ||
606 | return 0; | 605 | return 0; |
@@ -773,7 +772,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, | |||
773 | } | 772 | } |
774 | 773 | ||
775 | /* create any TLV data */ | 774 | /* create any TLV data */ |
776 | soc_tplg_create_tlv(tplg, &kc, mc->hdr.tlv_size); | 775 | soc_tplg_create_tlv(tplg, &kc, &mc->tlv); |
777 | 776 | ||
778 | /* register control here */ | 777 | /* register control here */ |
779 | err = soc_tplg_add_kcontrol(tplg, &kc, | 778 | err = soc_tplg_add_kcontrol(tplg, &kc, |
diff --git a/sound/soc/zte/zx296702-i2s.c b/sound/soc/zte/zx296702-i2s.c index 98d96e1b17e0..1930c42e1f55 100644 --- a/sound/soc/zte/zx296702-i2s.c +++ b/sound/soc/zte/zx296702-i2s.c | |||
@@ -393,9 +393,9 @@ static int zx_i2s_probe(struct platform_device *pdev) | |||
393 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 393 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
394 | zx_i2s->mapbase = res->start; | 394 | zx_i2s->mapbase = res->start; |
395 | zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res); | 395 | zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res); |
396 | if (!zx_i2s->reg_base) { | 396 | if (IS_ERR(zx_i2s->reg_base)) { |
397 | dev_err(&pdev->dev, "ioremap failed!\n"); | 397 | dev_err(&pdev->dev, "ioremap failed!\n"); |
398 | return -EIO; | 398 | return PTR_ERR(zx_i2s->reg_base); |
399 | } | 399 | } |
400 | 400 | ||
401 | writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL); | 401 | writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL); |
diff --git a/sound/soc/zte/zx296702-spdif.c b/sound/soc/zte/zx296702-spdif.c index 11a0e46a1156..26265ce4caca 100644 --- a/sound/soc/zte/zx296702-spdif.c +++ b/sound/soc/zte/zx296702-spdif.c | |||
@@ -322,9 +322,9 @@ static int zx_spdif_probe(struct platform_device *pdev) | |||
322 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 322 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
323 | zx_spdif->mapbase = res->start; | 323 | zx_spdif->mapbase = res->start; |
324 | zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res); | 324 | zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res); |
325 | if (!zx_spdif->reg_base) { | 325 | if (IS_ERR(zx_spdif->reg_base)) { |
326 | dev_err(&pdev->dev, "ioremap failed!\n"); | 326 | dev_err(&pdev->dev, "ioremap failed!\n"); |
327 | return -EIO; | 327 | return PTR_ERR(zx_spdif->reg_base); |
328 | } | 328 | } |
329 | 329 | ||
330 | zx_spdif_dev_init(zx_spdif->reg_base); | 330 | zx_spdif_dev_init(zx_spdif->reg_base); |
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c index e5000da9e9d7..6a803eff87f7 100644 --- a/sound/usb/mixer_maps.c +++ b/sound/usb/mixer_maps.c | |||
@@ -341,6 +341,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = { | |||
341 | { 0 } | 341 | { 0 } |
342 | }; | 342 | }; |
343 | 343 | ||
344 | /* Bose companion 5, the dB conversion factor is 16 instead of 256 */ | ||
345 | static struct usbmix_dB_map bose_companion5_dB = {-5006, -6}; | ||
346 | static struct usbmix_name_map bose_companion5_map[] = { | ||
347 | { 3, NULL, .dB = &bose_companion5_dB }, | ||
348 | { 0 } /* terminator */ | ||
349 | }; | ||
350 | |||
351 | /* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */ | ||
352 | static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000}; | ||
353 | static struct usbmix_name_map dragonfly_1_2_map[] = { | ||
354 | { 7, NULL, .dB = &dragonfly_1_2_dB }, | ||
355 | { 0 } /* terminator */ | ||
356 | }; | ||
357 | |||
344 | /* | 358 | /* |
345 | * Control map entries | 359 | * Control map entries |
346 | */ | 360 | */ |
@@ -451,6 +465,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { | |||
451 | .id = USB_ID(0x25c4, 0x0003), | 465 | .id = USB_ID(0x25c4, 0x0003), |
452 | .map = scms_usb3318_map, | 466 | .map = scms_usb3318_map, |
453 | }, | 467 | }, |
468 | { | ||
469 | /* Bose Companion 5 */ | ||
470 | .id = USB_ID(0x05a7, 0x1020), | ||
471 | .map = bose_companion5_map, | ||
472 | }, | ||
473 | { | ||
474 | /* Dragonfly DAC 1.2 */ | ||
475 | .id = USB_ID(0x21b4, 0x0081), | ||
476 | .map = dragonfly_1_2_map, | ||
477 | }, | ||
454 | { 0 } /* terminator */ | 478 | { 0 } /* terminator */ |
455 | }; | 479 | }; |
456 | 480 | ||