diff options
31 files changed, 173 insertions, 143 deletions
diff --git a/Documentation/devicetree/bindings/sound/da7218.txt b/Documentation/devicetree/bindings/sound/da7218.txt index 5ca5a709b6aa..3ab9dfef38d1 100644 --- a/Documentation/devicetree/bindings/sound/da7218.txt +++ b/Documentation/devicetree/bindings/sound/da7218.txt | |||
| @@ -73,7 +73,7 @@ Example: | |||
| 73 | compatible = "dlg,da7218"; | 73 | compatible = "dlg,da7218"; |
| 74 | reg = <0x1a>; | 74 | reg = <0x1a>; |
| 75 | interrupt-parent = <&gpio6>; | 75 | interrupt-parent = <&gpio6>; |
| 76 | interrupts = <11 IRQ_TYPE_LEVEL_HIGH>; | 76 | interrupts = <11 IRQ_TYPE_LEVEL_LOW>; |
| 77 | wakeup-source; | 77 | wakeup-source; |
| 78 | 78 | ||
| 79 | VDD-supply = <®_audio>; | 79 | VDD-supply = <®_audio>; |
diff --git a/Documentation/devicetree/bindings/sound/da7219.txt b/Documentation/devicetree/bindings/sound/da7219.txt index cf61681826b6..5b54d2d045c3 100644 --- a/Documentation/devicetree/bindings/sound/da7219.txt +++ b/Documentation/devicetree/bindings/sound/da7219.txt | |||
| @@ -77,7 +77,7 @@ Example: | |||
| 77 | reg = <0x1a>; | 77 | reg = <0x1a>; |
| 78 | 78 | ||
| 79 | interrupt-parent = <&gpio6>; | 79 | interrupt-parent = <&gpio6>; |
| 80 | interrupts = <11 IRQ_TYPE_LEVEL_HIGH>; | 80 | interrupts = <11 IRQ_TYPE_LEVEL_LOW>; |
| 81 | 81 | ||
| 82 | VDD-supply = <®_audio>; | 82 | VDD-supply = <®_audio>; |
| 83 | VDDMIC-supply = <®_audio>; | 83 | VDDMIC-supply = <®_audio>; |
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index 038a180d3f81..cbe818eda336 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c | |||
| @@ -325,7 +325,7 @@ static int hdac_component_master_match(struct device *dev, void *data) | |||
| 325 | */ | 325 | */ |
| 326 | int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *aops) | 326 | int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *aops) |
| 327 | { | 327 | { |
| 328 | if (WARN_ON(!hdac_acomp)) | 328 | if (!hdac_acomp) |
| 329 | return -ENODEV; | 329 | return -ENODEV; |
| 330 | 330 | ||
| 331 | hdac_acomp->audio_ops = aops; | 331 | hdac_acomp->audio_ops = aops; |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index a81aacf684b2..37e1cf8218ff 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -271,6 +271,8 @@ enum { | |||
| 271 | CXT_FIXUP_HP_SPECTRE, | 271 | CXT_FIXUP_HP_SPECTRE, |
| 272 | CXT_FIXUP_HP_GATE_MIC, | 272 | CXT_FIXUP_HP_GATE_MIC, |
| 273 | CXT_FIXUP_MUTE_LED_GPIO, | 273 | CXT_FIXUP_MUTE_LED_GPIO, |
| 274 | CXT_FIXUP_HEADSET_MIC, | ||
| 275 | CXT_FIXUP_HP_MIC_NO_PRESENCE, | ||
| 274 | }; | 276 | }; |
| 275 | 277 | ||
| 276 | /* for hda_fixup_thinkpad_acpi() */ | 278 | /* for hda_fixup_thinkpad_acpi() */ |
| @@ -350,6 +352,18 @@ static void cxt_fixup_headphone_mic(struct hda_codec *codec, | |||
| 350 | } | 352 | } |
| 351 | } | 353 | } |
| 352 | 354 | ||
| 355 | static void cxt_fixup_headset_mic(struct hda_codec *codec, | ||
| 356 | const struct hda_fixup *fix, int action) | ||
| 357 | { | ||
| 358 | struct conexant_spec *spec = codec->spec; | ||
| 359 | |||
| 360 | switch (action) { | ||
| 361 | case HDA_FIXUP_ACT_PRE_PROBE: | ||
| 362 | spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; | ||
| 363 | break; | ||
| 364 | } | ||
| 365 | } | ||
| 366 | |||
| 353 | /* OPLC XO 1.5 fixup */ | 367 | /* OPLC XO 1.5 fixup */ |
| 354 | 368 | ||
| 355 | /* OLPC XO-1.5 supports DC input mode (e.g. for use with analog sensors) | 369 | /* OLPC XO-1.5 supports DC input mode (e.g. for use with analog sensors) |
| @@ -880,6 +894,19 @@ static const struct hda_fixup cxt_fixups[] = { | |||
| 880 | .type = HDA_FIXUP_FUNC, | 894 | .type = HDA_FIXUP_FUNC, |
| 881 | .v.func = cxt_fixup_mute_led_gpio, | 895 | .v.func = cxt_fixup_mute_led_gpio, |
| 882 | }, | 896 | }, |
| 897 | [CXT_FIXUP_HEADSET_MIC] = { | ||
| 898 | .type = HDA_FIXUP_FUNC, | ||
| 899 | .v.func = cxt_fixup_headset_mic, | ||
| 900 | }, | ||
| 901 | [CXT_FIXUP_HP_MIC_NO_PRESENCE] = { | ||
| 902 | .type = HDA_FIXUP_PINS, | ||
| 903 | .v.pins = (const struct hda_pintbl[]) { | ||
| 904 | { 0x1a, 0x02a1113c }, | ||
| 905 | { } | ||
| 906 | }, | ||
| 907 | .chained = true, | ||
| 908 | .chain_id = CXT_FIXUP_HEADSET_MIC, | ||
| 909 | }, | ||
| 883 | }; | 910 | }; |
| 884 | 911 | ||
| 885 | static const struct snd_pci_quirk cxt5045_fixups[] = { | 912 | static const struct snd_pci_quirk cxt5045_fixups[] = { |
| @@ -934,6 +961,8 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { | |||
| 934 | SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), | 961 | SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), |
| 935 | SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), | 962 | SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), |
| 936 | SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO), | 963 | SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO), |
| 964 | SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE), | ||
| 965 | SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE), | ||
| 937 | SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN), | 966 | SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN), |
| 938 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT_FIXUP_OLPC_XO), | 967 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT_FIXUP_OLPC_XO), |
| 939 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), | 968 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6a4db00511ab..8fd2d9c62c96 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -324,8 +324,12 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
| 324 | case 0x10ec0292: | 324 | case 0x10ec0292: |
| 325 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); | 325 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); |
| 326 | break; | 326 | break; |
| 327 | case 0x10ec0215: | ||
| 328 | case 0x10ec0225: | 327 | case 0x10ec0225: |
| 328 | case 0x10ec0295: | ||
| 329 | case 0x10ec0299: | ||
| 330 | alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000); | ||
| 331 | /* fallthrough */ | ||
| 332 | case 0x10ec0215: | ||
| 329 | case 0x10ec0233: | 333 | case 0x10ec0233: |
| 330 | case 0x10ec0236: | 334 | case 0x10ec0236: |
| 331 | case 0x10ec0255: | 335 | case 0x10ec0255: |
| @@ -336,10 +340,8 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
| 336 | case 0x10ec0286: | 340 | case 0x10ec0286: |
| 337 | case 0x10ec0288: | 341 | case 0x10ec0288: |
| 338 | case 0x10ec0285: | 342 | case 0x10ec0285: |
| 339 | case 0x10ec0295: | ||
| 340 | case 0x10ec0298: | 343 | case 0x10ec0298: |
| 341 | case 0x10ec0289: | 344 | case 0x10ec0289: |
| 342 | case 0x10ec0299: | ||
| 343 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); | 345 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); |
| 344 | break; | 346 | break; |
| 345 | case 0x10ec0275: | 347 | case 0x10ec0275: |
| @@ -6328,6 +6330,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 6328 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 6330 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
| 6329 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 6331 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
| 6330 | SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), | 6332 | SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
| 6333 | SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), | ||
| 6331 | SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 6334 | SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
| 6332 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), | 6335 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), |
| 6333 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), | 6336 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), |
| @@ -6586,6 +6589,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
| 6586 | {0x1b, 0x01011020}, | 6589 | {0x1b, 0x01011020}, |
| 6587 | {0x21, 0x02211010}), | 6590 | {0x21, 0x02211010}), |
| 6588 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 6591 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
| 6592 | {0x12, 0x90a60130}, | ||
| 6593 | {0x14, 0x90170110}, | ||
| 6594 | {0x1b, 0x01011020}, | ||
| 6595 | {0x21, 0x0221101f}), | ||
| 6596 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
| 6589 | {0x12, 0x90a60160}, | 6597 | {0x12, 0x90a60160}, |
| 6590 | {0x14, 0x90170120}, | 6598 | {0x14, 0x90170120}, |
| 6591 | {0x21, 0x02211030}), | 6599 | {0x21, 0x02211030}), |
diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c index 9f521a55d610..b5e41df6bb3a 100644 --- a/sound/soc/amd/acp-pcm-dma.c +++ b/sound/soc/amd/acp-pcm-dma.c | |||
| @@ -1051,6 +1051,11 @@ static int acp_audio_probe(struct platform_device *pdev) | |||
| 1051 | struct resource *res; | 1051 | struct resource *res; |
| 1052 | const u32 *pdata = pdev->dev.platform_data; | 1052 | const u32 *pdata = pdev->dev.platform_data; |
| 1053 | 1053 | ||
| 1054 | if (!pdata) { | ||
| 1055 | dev_err(&pdev->dev, "Missing platform data\n"); | ||
| 1056 | return -ENODEV; | ||
| 1057 | } | ||
| 1058 | |||
| 1054 | audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data), | 1059 | audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data), |
| 1055 | GFP_KERNEL); | 1060 | GFP_KERNEL); |
| 1056 | if (audio_drv_data == NULL) | 1061 | if (audio_drv_data == NULL) |
| @@ -1058,6 +1063,8 @@ static int acp_audio_probe(struct platform_device *pdev) | |||
| 1058 | 1063 | ||
| 1059 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1064 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1060 | audio_drv_data->acp_mmio = devm_ioremap_resource(&pdev->dev, res); | 1065 | audio_drv_data->acp_mmio = devm_ioremap_resource(&pdev->dev, res); |
| 1066 | if (IS_ERR(audio_drv_data->acp_mmio)) | ||
| 1067 | return PTR_ERR(audio_drv_data->acp_mmio); | ||
| 1061 | 1068 | ||
| 1062 | /* The following members gets populated in device 'open' | 1069 | /* The following members gets populated in device 'open' |
| 1063 | * function. Till then interrupts are disabled in 'acp_init' | 1070 | * function. Till then interrupts are disabled in 'acp_init' |
diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig index 4a56f3dfba51..dcee145dd179 100644 --- a/sound/soc/atmel/Kconfig +++ b/sound/soc/atmel/Kconfig | |||
| @@ -64,7 +64,7 @@ config SND_AT91_SOC_SAM9X5_WM8731 | |||
| 64 | config SND_ATMEL_SOC_CLASSD | 64 | config SND_ATMEL_SOC_CLASSD |
| 65 | tristate "Atmel ASoC driver for boards using CLASSD" | 65 | tristate "Atmel ASoC driver for boards using CLASSD" |
| 66 | depends on ARCH_AT91 || COMPILE_TEST | 66 | depends on ARCH_AT91 || COMPILE_TEST |
| 67 | select SND_ATMEL_SOC_DMA | 67 | select SND_SOC_GENERIC_DMAENGINE_PCM |
| 68 | select REGMAP_MMIO | 68 | select REGMAP_MMIO |
| 69 | help | 69 | help |
| 70 | Say Y if you want to add support for Atmel ASoC driver for boards using | 70 | Say Y if you want to add support for Atmel ASoC driver for boards using |
diff --git a/sound/soc/codecs/da7218.c b/sound/soc/codecs/da7218.c index b2d42ec1dcd9..56564ce90cb6 100644 --- a/sound/soc/codecs/da7218.c +++ b/sound/soc/codecs/da7218.c | |||
| @@ -2520,7 +2520,7 @@ static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) | |||
| 2520 | } | 2520 | } |
| 2521 | 2521 | ||
| 2522 | if (da7218->dev_id == DA7218_DEV_ID) { | 2522 | if (da7218->dev_id == DA7218_DEV_ID) { |
| 2523 | hpldet_np = of_find_node_by_name(np, "da7218_hpldet"); | 2523 | hpldet_np = of_get_child_by_name(np, "da7218_hpldet"); |
| 2524 | if (!hpldet_np) | 2524 | if (!hpldet_np) |
| 2525 | return pdata; | 2525 | return pdata; |
| 2526 | 2526 | ||
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c index 5f3c42c4f74a..066ea2f4ce7b 100644 --- a/sound/soc/codecs/msm8916-wcd-analog.c +++ b/sound/soc/codecs/msm8916-wcd-analog.c | |||
| @@ -267,7 +267,7 @@ | |||
| 267 | #define MSM8916_WCD_ANALOG_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ | 267 | #define MSM8916_WCD_ANALOG_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ |
| 268 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) | 268 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) |
| 269 | #define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ | 269 | #define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ |
| 270 | SNDRV_PCM_FMTBIT_S24_LE) | 270 | SNDRV_PCM_FMTBIT_S32_LE) |
| 271 | 271 | ||
| 272 | static int btn_mask = SND_JACK_BTN_0 | SND_JACK_BTN_1 | | 272 | static int btn_mask = SND_JACK_BTN_0 | SND_JACK_BTN_1 | |
| 273 | SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_BTN_4; | 273 | SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_BTN_4; |
diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c index a10a724eb448..13354d6304a8 100644 --- a/sound/soc/codecs/msm8916-wcd-digital.c +++ b/sound/soc/codecs/msm8916-wcd-digital.c | |||
| @@ -194,7 +194,7 @@ | |||
| 194 | SNDRV_PCM_RATE_32000 | \ | 194 | SNDRV_PCM_RATE_32000 | \ |
| 195 | SNDRV_PCM_RATE_48000) | 195 | SNDRV_PCM_RATE_48000) |
| 196 | #define MSM8916_WCD_DIGITAL_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ | 196 | #define MSM8916_WCD_DIGITAL_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ |
| 197 | SNDRV_PCM_FMTBIT_S24_LE) | 197 | SNDRV_PCM_FMTBIT_S32_LE) |
| 198 | 198 | ||
| 199 | struct msm8916_wcd_digital_priv { | 199 | struct msm8916_wcd_digital_priv { |
| 200 | struct clk *ahbclk, *mclk; | 200 | struct clk *ahbclk, *mclk; |
| @@ -645,7 +645,7 @@ static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream, | |||
| 645 | RX_I2S_CTL_RX_I2S_MODE_MASK, | 645 | RX_I2S_CTL_RX_I2S_MODE_MASK, |
| 646 | RX_I2S_CTL_RX_I2S_MODE_16); | 646 | RX_I2S_CTL_RX_I2S_MODE_16); |
| 647 | break; | 647 | break; |
| 648 | case SNDRV_PCM_FORMAT_S24_LE: | 648 | case SNDRV_PCM_FORMAT_S32_LE: |
| 649 | snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL, | 649 | snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL, |
| 650 | TX_I2S_CTL_TX_I2S_MODE_MASK, | 650 | TX_I2S_CTL_TX_I2S_MODE_MASK, |
| 651 | TX_I2S_CTL_TX_I2S_MODE_32); | 651 | TX_I2S_CTL_TX_I2S_MODE_32); |
diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c index 714ce17da717..e853a6dfd33b 100644 --- a/sound/soc/codecs/nau8825.c +++ b/sound/soc/codecs/nau8825.c | |||
| @@ -905,6 +905,7 @@ static int nau8825_adc_event(struct snd_soc_dapm_widget *w, | |||
| 905 | 905 | ||
| 906 | switch (event) { | 906 | switch (event) { |
| 907 | case SND_SOC_DAPM_POST_PMU: | 907 | case SND_SOC_DAPM_POST_PMU: |
| 908 | msleep(125); | ||
| 908 | regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, | 909 | regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, |
| 909 | NAU8825_ENABLE_ADC, NAU8825_ENABLE_ADC); | 910 | NAU8825_ENABLE_ADC, NAU8825_ENABLE_ADC); |
| 910 | break; | 911 | break; |
diff --git a/sound/soc/codecs/rt5514-spi.c b/sound/soc/codecs/rt5514-spi.c index 2df91db765ac..64bf26cec20d 100644 --- a/sound/soc/codecs/rt5514-spi.c +++ b/sound/soc/codecs/rt5514-spi.c | |||
| @@ -289,6 +289,8 @@ static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform) | |||
| 289 | dev_err(&rt5514_spi->dev, | 289 | dev_err(&rt5514_spi->dev, |
| 290 | "%s Failed to reguest IRQ: %d\n", __func__, | 290 | "%s Failed to reguest IRQ: %d\n", __func__, |
| 291 | ret); | 291 | ret); |
| 292 | else | ||
| 293 | device_init_wakeup(rt5514_dsp->dev, true); | ||
| 292 | } | 294 | } |
| 293 | 295 | ||
| 294 | return 0; | 296 | return 0; |
| @@ -456,8 +458,6 @@ static int rt5514_spi_probe(struct spi_device *spi) | |||
| 456 | return ret; | 458 | return ret; |
| 457 | } | 459 | } |
| 458 | 460 | ||
| 459 | device_init_wakeup(&spi->dev, true); | ||
| 460 | |||
| 461 | return 0; | 461 | return 0; |
| 462 | } | 462 | } |
| 463 | 463 | ||
| @@ -482,10 +482,13 @@ static int __maybe_unused rt5514_resume(struct device *dev) | |||
| 482 | if (device_may_wakeup(dev)) | 482 | if (device_may_wakeup(dev)) |
| 483 | disable_irq_wake(irq); | 483 | disable_irq_wake(irq); |
| 484 | 484 | ||
| 485 | if (rt5514_dsp->substream) { | 485 | if (rt5514_dsp) { |
| 486 | rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf, sizeof(buf)); | 486 | if (rt5514_dsp->substream) { |
| 487 | if (buf[0] & RT5514_IRQ_STATUS_BIT) | 487 | rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf, |
| 488 | rt5514_schedule_copy(rt5514_dsp); | 488 | sizeof(buf)); |
| 489 | if (buf[0] & RT5514_IRQ_STATUS_BIT) | ||
| 490 | rt5514_schedule_copy(rt5514_dsp); | ||
| 491 | } | ||
| 489 | } | 492 | } |
| 490 | 493 | ||
| 491 | return 0; | 494 | return 0; |
diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c index 2a5b5d74e697..2dd6e9f990a4 100644 --- a/sound/soc/codecs/rt5514.c +++ b/sound/soc/codecs/rt5514.c | |||
| @@ -496,7 +496,7 @@ static const struct snd_soc_dapm_widget rt5514_dapm_widgets[] = { | |||
| 496 | SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0), | 496 | SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0), |
| 497 | SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0), | 497 | SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0), |
| 498 | 498 | ||
| 499 | SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0, | 499 | SND_SOC_DAPM_SUPPLY_S("DMIC CLK", 1, SND_SOC_NOPM, 0, 0, |
| 500 | rt5514_set_dmic_clk, SND_SOC_DAPM_PRE_PMU), | 500 | rt5514_set_dmic_clk, SND_SOC_DAPM_PRE_PMU), |
| 501 | 501 | ||
| 502 | SND_SOC_DAPM_SUPPLY("ADC CLK", RT5514_CLK_CTRL1, | 502 | SND_SOC_DAPM_SUPPLY("ADC CLK", RT5514_CLK_CTRL1, |
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index f020d2d1eef4..edc152c8a1fe 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c | |||
| @@ -3823,6 +3823,8 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
| 3823 | regmap_read(regmap, RT5645_VENDOR_ID, &val); | 3823 | regmap_read(regmap, RT5645_VENDOR_ID, &val); |
| 3824 | rt5645->v_id = val & 0xff; | 3824 | rt5645->v_id = val & 0xff; |
| 3825 | 3825 | ||
| 3826 | regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080); | ||
| 3827 | |||
| 3826 | ret = regmap_register_patch(rt5645->regmap, init_list, | 3828 | ret = regmap_register_patch(rt5645->regmap, init_list, |
| 3827 | ARRAY_SIZE(init_list)); | 3829 | ARRAY_SIZE(init_list)); |
| 3828 | if (ret != 0) | 3830 | if (ret != 0) |
diff --git a/sound/soc/codecs/rt5663.c b/sound/soc/codecs/rt5663.c index b036c9dc0c8c..d329bf719d80 100644 --- a/sound/soc/codecs/rt5663.c +++ b/sound/soc/codecs/rt5663.c | |||
| @@ -1560,6 +1560,10 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert) | |||
| 1560 | RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN); | 1560 | RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN); |
| 1561 | snd_soc_update_bits(codec, RT5663_IRQ_1, | 1561 | snd_soc_update_bits(codec, RT5663_IRQ_1, |
| 1562 | RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); | 1562 | RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); |
| 1563 | snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, | ||
| 1564 | RT5663_EM_JD_MASK, RT5663_EM_JD_RST); | ||
| 1565 | snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, | ||
| 1566 | RT5663_EM_JD_MASK, RT5663_EM_JD_NOR); | ||
| 1563 | 1567 | ||
| 1564 | while (true) { | 1568 | while (true) { |
| 1565 | regmap_read(rt5663->regmap, RT5663_INT_ST_2, &val); | 1569 | regmap_read(rt5663->regmap, RT5663_INT_ST_2, &val); |
diff --git a/sound/soc/codecs/rt5663.h b/sound/soc/codecs/rt5663.h index c5a9b69579ad..03adc8004ba9 100644 --- a/sound/soc/codecs/rt5663.h +++ b/sound/soc/codecs/rt5663.h | |||
| @@ -1029,6 +1029,10 @@ | |||
| 1029 | #define RT5663_POL_EXT_JD_SHIFT 10 | 1029 | #define RT5663_POL_EXT_JD_SHIFT 10 |
| 1030 | #define RT5663_POL_EXT_JD_EN (0x1 << 10) | 1030 | #define RT5663_POL_EXT_JD_EN (0x1 << 10) |
| 1031 | #define RT5663_POL_EXT_JD_DIS (0x0 << 10) | 1031 | #define RT5663_POL_EXT_JD_DIS (0x0 << 10) |
| 1032 | #define RT5663_EM_JD_MASK (0x1 << 7) | ||
| 1033 | #define RT5663_EM_JD_SHIFT 7 | ||
| 1034 | #define RT5663_EM_JD_NOR (0x1 << 7) | ||
| 1035 | #define RT5663_EM_JD_RST (0x0 << 7) | ||
| 1032 | 1036 | ||
| 1033 | /* DACREF LDO Control (0x0112)*/ | 1037 | /* DACREF LDO Control (0x0112)*/ |
| 1034 | #define RT5663_PWR_LDO_DACREFL_MASK (0x1 << 9) | 1038 | #define RT5663_PWR_LDO_DACREFL_MASK (0x1 << 9) |
diff --git a/sound/soc/codecs/tlv320aic31xx.h b/sound/soc/codecs/tlv320aic31xx.h index 730fb2058869..1ff3edb7bbb6 100644 --- a/sound/soc/codecs/tlv320aic31xx.h +++ b/sound/soc/codecs/tlv320aic31xx.h | |||
| @@ -116,7 +116,7 @@ struct aic31xx_pdata { | |||
| 116 | /* INT2 interrupt control */ | 116 | /* INT2 interrupt control */ |
| 117 | #define AIC31XX_INT2CTRL AIC31XX_REG(0, 49) | 117 | #define AIC31XX_INT2CTRL AIC31XX_REG(0, 49) |
| 118 | /* GPIO1 control */ | 118 | /* GPIO1 control */ |
| 119 | #define AIC31XX_GPIO1 AIC31XX_REG(0, 50) | 119 | #define AIC31XX_GPIO1 AIC31XX_REG(0, 51) |
| 120 | 120 | ||
| 121 | #define AIC31XX_DACPRB AIC31XX_REG(0, 60) | 121 | #define AIC31XX_DACPRB AIC31XX_REG(0, 60) |
| 122 | /* ADC Instruction Set Register */ | 122 | /* ADC Instruction Set Register */ |
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index c482b2e7a7d2..cfe72b9d4356 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c | |||
| @@ -232,7 +232,7 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec) | |||
| 232 | struct twl4030_codec_data *pdata = dev_get_platdata(codec->dev); | 232 | struct twl4030_codec_data *pdata = dev_get_platdata(codec->dev); |
| 233 | struct device_node *twl4030_codec_node = NULL; | 233 | struct device_node *twl4030_codec_node = NULL; |
| 234 | 234 | ||
| 235 | twl4030_codec_node = of_find_node_by_name(codec->dev->parent->of_node, | 235 | twl4030_codec_node = of_get_child_by_name(codec->dev->parent->of_node, |
| 236 | "codec"); | 236 | "codec"); |
| 237 | 237 | ||
| 238 | if (!pdata && twl4030_codec_node) { | 238 | if (!pdata && twl4030_codec_node) { |
| @@ -241,9 +241,11 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec) | |||
| 241 | GFP_KERNEL); | 241 | GFP_KERNEL); |
| 242 | if (!pdata) { | 242 | if (!pdata) { |
| 243 | dev_err(codec->dev, "Can not allocate memory\n"); | 243 | dev_err(codec->dev, "Can not allocate memory\n"); |
| 244 | of_node_put(twl4030_codec_node); | ||
| 244 | return NULL; | 245 | return NULL; |
| 245 | } | 246 | } |
| 246 | twl4030_setup_pdata_of(pdata, twl4030_codec_node); | 247 | twl4030_setup_pdata_of(pdata, twl4030_codec_node); |
| 248 | of_node_put(twl4030_codec_node); | ||
| 247 | } | 249 | } |
| 248 | 250 | ||
| 249 | return pdata; | 251 | return pdata; |
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c index 65c059b5ffd7..66e32f5d2917 100644 --- a/sound/soc/codecs/wm_adsp.c +++ b/sound/soc/codecs/wm_adsp.c | |||
| @@ -1733,7 +1733,7 @@ static int wm_adsp_load(struct wm_adsp *dsp) | |||
| 1733 | le64_to_cpu(footer->timestamp)); | 1733 | le64_to_cpu(footer->timestamp)); |
| 1734 | 1734 | ||
| 1735 | while (pos < firmware->size && | 1735 | while (pos < firmware->size && |
| 1736 | pos - firmware->size > sizeof(*region)) { | 1736 | sizeof(*region) < firmware->size - pos) { |
| 1737 | region = (void *)&(firmware->data[pos]); | 1737 | region = (void *)&(firmware->data[pos]); |
| 1738 | region_name = "Unknown"; | 1738 | region_name = "Unknown"; |
| 1739 | reg = 0; | 1739 | reg = 0; |
| @@ -1782,8 +1782,8 @@ static int wm_adsp_load(struct wm_adsp *dsp) | |||
| 1782 | regions, le32_to_cpu(region->len), offset, | 1782 | regions, le32_to_cpu(region->len), offset, |
| 1783 | region_name); | 1783 | region_name); |
| 1784 | 1784 | ||
| 1785 | if ((pos + le32_to_cpu(region->len) + sizeof(*region)) > | 1785 | if (le32_to_cpu(region->len) > |
| 1786 | firmware->size) { | 1786 | firmware->size - pos - sizeof(*region)) { |
| 1787 | adsp_err(dsp, | 1787 | adsp_err(dsp, |
| 1788 | "%s.%d: %s region len %d bytes exceeds file length %zu\n", | 1788 | "%s.%d: %s region len %d bytes exceeds file length %zu\n", |
| 1789 | file, regions, region_name, | 1789 | file, regions, region_name, |
| @@ -2253,7 +2253,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp) | |||
| 2253 | 2253 | ||
| 2254 | blocks = 0; | 2254 | blocks = 0; |
| 2255 | while (pos < firmware->size && | 2255 | while (pos < firmware->size && |
| 2256 | pos - firmware->size > sizeof(*blk)) { | 2256 | sizeof(*blk) < firmware->size - pos) { |
| 2257 | blk = (void *)(&firmware->data[pos]); | 2257 | blk = (void *)(&firmware->data[pos]); |
| 2258 | 2258 | ||
| 2259 | type = le16_to_cpu(blk->type); | 2259 | type = le16_to_cpu(blk->type); |
| @@ -2327,8 +2327,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp) | |||
| 2327 | } | 2327 | } |
| 2328 | 2328 | ||
| 2329 | if (reg) { | 2329 | if (reg) { |
| 2330 | if ((pos + le32_to_cpu(blk->len) + sizeof(*blk)) > | 2330 | if (le32_to_cpu(blk->len) > |
| 2331 | firmware->size) { | 2331 | firmware->size - pos - sizeof(*blk)) { |
| 2332 | adsp_err(dsp, | 2332 | adsp_err(dsp, |
| 2333 | "%s.%d: %s region len %d bytes exceeds file length %zu\n", | 2333 | "%s.%d: %s region len %d bytes exceeds file length %zu\n", |
| 2334 | file, blocks, region_name, | 2334 | file, blocks, region_name, |
diff --git a/sound/soc/fsl/fsl_asrc.h b/sound/soc/fsl/fsl_asrc.h index 0f163abe4ba3..52c27a358933 100644 --- a/sound/soc/fsl/fsl_asrc.h +++ b/sound/soc/fsl/fsl_asrc.h | |||
| @@ -260,8 +260,8 @@ | |||
| 260 | #define ASRFSTi_OUTPUT_FIFO_SHIFT 12 | 260 | #define ASRFSTi_OUTPUT_FIFO_SHIFT 12 |
| 261 | #define ASRFSTi_OUTPUT_FIFO_MASK (((1 << ASRFSTi_OUTPUT_FIFO_WIDTH) - 1) << ASRFSTi_OUTPUT_FIFO_SHIFT) | 261 | #define ASRFSTi_OUTPUT_FIFO_MASK (((1 << ASRFSTi_OUTPUT_FIFO_WIDTH) - 1) << ASRFSTi_OUTPUT_FIFO_SHIFT) |
| 262 | #define ASRFSTi_IAEi_SHIFT 11 | 262 | #define ASRFSTi_IAEi_SHIFT 11 |
| 263 | #define ASRFSTi_IAEi_MASK (1 << ASRFSTi_OAFi_SHIFT) | 263 | #define ASRFSTi_IAEi_MASK (1 << ASRFSTi_IAEi_SHIFT) |
| 264 | #define ASRFSTi_IAEi (1 << ASRFSTi_OAFi_SHIFT) | 264 | #define ASRFSTi_IAEi (1 << ASRFSTi_IAEi_SHIFT) |
| 265 | #define ASRFSTi_INPUT_FIFO_WIDTH 7 | 265 | #define ASRFSTi_INPUT_FIFO_WIDTH 7 |
| 266 | #define ASRFSTi_INPUT_FIFO_SHIFT 0 | 266 | #define ASRFSTi_INPUT_FIFO_SHIFT 0 |
| 267 | #define ASRFSTi_INPUT_FIFO_MASK ((1 << ASRFSTi_INPUT_FIFO_WIDTH) - 1) | 267 | #define ASRFSTi_INPUT_FIFO_MASK ((1 << ASRFSTi_INPUT_FIFO_WIDTH) - 1) |
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index f2f51e06e22c..424bafaf51ef 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/ctype.h> | 38 | #include <linux/ctype.h> |
| 39 | #include <linux/device.h> | 39 | #include <linux/device.h> |
| 40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
| 41 | #include <linux/mutex.h> | ||
| 41 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
| 42 | #include <linux/spinlock.h> | 43 | #include <linux/spinlock.h> |
| 43 | #include <linux/of.h> | 44 | #include <linux/of.h> |
| @@ -265,6 +266,8 @@ struct fsl_ssi_private { | |||
| 265 | 266 | ||
| 266 | u32 fifo_watermark; | 267 | u32 fifo_watermark; |
| 267 | u32 dma_maxburst; | 268 | u32 dma_maxburst; |
| 269 | |||
| 270 | struct mutex ac97_reg_lock; | ||
| 268 | }; | 271 | }; |
| 269 | 272 | ||
| 270 | /* | 273 | /* |
| @@ -1260,11 +1263,13 @@ static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg, | |||
| 1260 | if (reg > 0x7f) | 1263 | if (reg > 0x7f) |
| 1261 | return; | 1264 | return; |
| 1262 | 1265 | ||
| 1266 | mutex_lock(&fsl_ac97_data->ac97_reg_lock); | ||
| 1267 | |||
| 1263 | ret = clk_prepare_enable(fsl_ac97_data->clk); | 1268 | ret = clk_prepare_enable(fsl_ac97_data->clk); |
| 1264 | if (ret) { | 1269 | if (ret) { |
| 1265 | pr_err("ac97 write clk_prepare_enable failed: %d\n", | 1270 | pr_err("ac97 write clk_prepare_enable failed: %d\n", |
| 1266 | ret); | 1271 | ret); |
| 1267 | return; | 1272 | goto ret_unlock; |
| 1268 | } | 1273 | } |
| 1269 | 1274 | ||
| 1270 | lreg = reg << 12; | 1275 | lreg = reg << 12; |
| @@ -1278,6 +1283,9 @@ static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg, | |||
| 1278 | udelay(100); | 1283 | udelay(100); |
| 1279 | 1284 | ||
| 1280 | clk_disable_unprepare(fsl_ac97_data->clk); | 1285 | clk_disable_unprepare(fsl_ac97_data->clk); |
| 1286 | |||
| 1287 | ret_unlock: | ||
| 1288 | mutex_unlock(&fsl_ac97_data->ac97_reg_lock); | ||
| 1281 | } | 1289 | } |
| 1282 | 1290 | ||
| 1283 | static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97, | 1291 | static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97, |
| @@ -1285,16 +1293,18 @@ static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97, | |||
| 1285 | { | 1293 | { |
| 1286 | struct regmap *regs = fsl_ac97_data->regs; | 1294 | struct regmap *regs = fsl_ac97_data->regs; |
| 1287 | 1295 | ||
| 1288 | unsigned short val = -1; | 1296 | unsigned short val = 0; |
| 1289 | u32 reg_val; | 1297 | u32 reg_val; |
| 1290 | unsigned int lreg; | 1298 | unsigned int lreg; |
| 1291 | int ret; | 1299 | int ret; |
| 1292 | 1300 | ||
| 1301 | mutex_lock(&fsl_ac97_data->ac97_reg_lock); | ||
| 1302 | |||
| 1293 | ret = clk_prepare_enable(fsl_ac97_data->clk); | 1303 | ret = clk_prepare_enable(fsl_ac97_data->clk); |
| 1294 | if (ret) { | 1304 | if (ret) { |
| 1295 | pr_err("ac97 read clk_prepare_enable failed: %d\n", | 1305 | pr_err("ac97 read clk_prepare_enable failed: %d\n", |
| 1296 | ret); | 1306 | ret); |
| 1297 | return -1; | 1307 | goto ret_unlock; |
| 1298 | } | 1308 | } |
| 1299 | 1309 | ||
| 1300 | lreg = (reg & 0x7f) << 12; | 1310 | lreg = (reg & 0x7f) << 12; |
| @@ -1309,6 +1319,8 @@ static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97, | |||
| 1309 | 1319 | ||
| 1310 | clk_disable_unprepare(fsl_ac97_data->clk); | 1320 | clk_disable_unprepare(fsl_ac97_data->clk); |
| 1311 | 1321 | ||
| 1322 | ret_unlock: | ||
| 1323 | mutex_unlock(&fsl_ac97_data->ac97_reg_lock); | ||
| 1312 | return val; | 1324 | return val; |
| 1313 | } | 1325 | } |
| 1314 | 1326 | ||
| @@ -1458,12 +1470,6 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
| 1458 | sizeof(fsl_ssi_ac97_dai)); | 1470 | sizeof(fsl_ssi_ac97_dai)); |
| 1459 | 1471 | ||
| 1460 | fsl_ac97_data = ssi_private; | 1472 | fsl_ac97_data = ssi_private; |
| 1461 | |||
| 1462 | ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev); | ||
| 1463 | if (ret) { | ||
| 1464 | dev_err(&pdev->dev, "could not set AC'97 ops\n"); | ||
| 1465 | return ret; | ||
| 1466 | } | ||
| 1467 | } else { | 1473 | } else { |
| 1468 | /* Initialize this copy of the CPU DAI driver structure */ | 1474 | /* Initialize this copy of the CPU DAI driver structure */ |
| 1469 | memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, | 1475 | memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, |
| @@ -1574,6 +1580,15 @@ static int fsl_ssi_probe(struct platform_device *pdev) | |||
| 1574 | return ret; | 1580 | return ret; |
| 1575 | } | 1581 | } |
| 1576 | 1582 | ||
| 1583 | if (fsl_ssi_is_ac97(ssi_private)) { | ||
| 1584 | mutex_init(&ssi_private->ac97_reg_lock); | ||
| 1585 | ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev); | ||
| 1586 | if (ret) { | ||
| 1587 | dev_err(&pdev->dev, "could not set AC'97 ops\n"); | ||
| 1588 | goto error_ac97_ops; | ||
| 1589 | } | ||
| 1590 | } | ||
| 1591 | |||
| 1577 | ret = devm_snd_soc_register_component(&pdev->dev, &fsl_ssi_component, | 1592 | ret = devm_snd_soc_register_component(&pdev->dev, &fsl_ssi_component, |
| 1578 | &ssi_private->cpu_dai_drv, 1); | 1593 | &ssi_private->cpu_dai_drv, 1); |
| 1579 | if (ret) { | 1594 | if (ret) { |
| @@ -1657,6 +1672,13 @@ error_sound_card: | |||
| 1657 | fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); | 1672 | fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); |
| 1658 | 1673 | ||
| 1659 | error_asoc_register: | 1674 | error_asoc_register: |
| 1675 | if (fsl_ssi_is_ac97(ssi_private)) | ||
| 1676 | snd_soc_set_ac97_ops(NULL); | ||
| 1677 | |||
| 1678 | error_ac97_ops: | ||
| 1679 | if (fsl_ssi_is_ac97(ssi_private)) | ||
| 1680 | mutex_destroy(&ssi_private->ac97_reg_lock); | ||
| 1681 | |||
| 1660 | if (ssi_private->soc->imx) | 1682 | if (ssi_private->soc->imx) |
| 1661 | fsl_ssi_imx_clean(pdev, ssi_private); | 1683 | fsl_ssi_imx_clean(pdev, ssi_private); |
| 1662 | 1684 | ||
| @@ -1675,8 +1697,10 @@ static int fsl_ssi_remove(struct platform_device *pdev) | |||
| 1675 | if (ssi_private->soc->imx) | 1697 | if (ssi_private->soc->imx) |
| 1676 | fsl_ssi_imx_clean(pdev, ssi_private); | 1698 | fsl_ssi_imx_clean(pdev, ssi_private); |
| 1677 | 1699 | ||
| 1678 | if (fsl_ssi_is_ac97(ssi_private)) | 1700 | if (fsl_ssi_is_ac97(ssi_private)) { |
| 1679 | snd_soc_set_ac97_ops(NULL); | 1701 | snd_soc_set_ac97_ops(NULL); |
| 1702 | mutex_destroy(&ssi_private->ac97_reg_lock); | ||
| 1703 | } | ||
| 1680 | 1704 | ||
| 1681 | return 0; | 1705 | return 0; |
| 1682 | } | 1706 | } |
diff --git a/sound/soc/intel/boards/kbl_rt5663_max98927.c b/sound/soc/intel/boards/kbl_rt5663_max98927.c index 6f9a8bcf20f3..6dcad0a8a0d0 100644 --- a/sound/soc/intel/boards/kbl_rt5663_max98927.c +++ b/sound/soc/intel/boards/kbl_rt5663_max98927.c | |||
| @@ -101,7 +101,7 @@ static const struct snd_soc_dapm_route kabylake_map[] = { | |||
| 101 | { "ssp0 Tx", NULL, "spk_out" }, | 101 | { "ssp0 Tx", NULL, "spk_out" }, |
| 102 | 102 | ||
| 103 | { "AIF Playback", NULL, "ssp1 Tx" }, | 103 | { "AIF Playback", NULL, "ssp1 Tx" }, |
| 104 | { "ssp1 Tx", NULL, "hs_out" }, | 104 | { "ssp1 Tx", NULL, "codec1_out" }, |
| 105 | 105 | ||
| 106 | { "hs_in", NULL, "ssp1 Rx" }, | 106 | { "hs_in", NULL, "ssp1 Rx" }, |
| 107 | { "ssp1 Rx", NULL, "AIF Capture" }, | 107 | { "ssp1 Rx", NULL, "AIF Capture" }, |
diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c index 6072164f2d43..271ae3c2c535 100644 --- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c +++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c | |||
| @@ -109,7 +109,7 @@ static const struct snd_soc_dapm_route kabylake_map[] = { | |||
| 109 | { "ssp0 Tx", NULL, "spk_out" }, | 109 | { "ssp0 Tx", NULL, "spk_out" }, |
| 110 | 110 | ||
| 111 | { "AIF Playback", NULL, "ssp1 Tx" }, | 111 | { "AIF Playback", NULL, "ssp1 Tx" }, |
| 112 | { "ssp1 Tx", NULL, "hs_out" }, | 112 | { "ssp1 Tx", NULL, "codec1_out" }, |
| 113 | 113 | ||
| 114 | { "hs_in", NULL, "ssp1 Rx" }, | 114 | { "hs_in", NULL, "ssp1 Rx" }, |
| 115 | { "ssp1 Rx", NULL, "AIF Capture" }, | 115 | { "ssp1 Rx", NULL, "AIF Capture" }, |
diff --git a/sound/soc/intel/skylake/skl-nhlt.c b/sound/soc/intel/skylake/skl-nhlt.c index d14c50a60289..3eaac41090ca 100644 --- a/sound/soc/intel/skylake/skl-nhlt.c +++ b/sound/soc/intel/skylake/skl-nhlt.c | |||
| @@ -119,11 +119,16 @@ static bool skl_check_ep_match(struct device *dev, struct nhlt_endpoint *epnt, | |||
| 119 | 119 | ||
| 120 | if ((epnt->virtual_bus_id == instance_id) && | 120 | if ((epnt->virtual_bus_id == instance_id) && |
| 121 | (epnt->linktype == link_type) && | 121 | (epnt->linktype == link_type) && |
| 122 | (epnt->direction == dirn) && | 122 | (epnt->direction == dirn)) { |
| 123 | (epnt->device_type == dev_type)) | 123 | /* do not check dev_type for DMIC link type */ |
| 124 | return true; | 124 | if (epnt->linktype == NHLT_LINK_DMIC) |
| 125 | else | 125 | return true; |
| 126 | return false; | 126 | |
| 127 | if (epnt->device_type == dev_type) | ||
| 128 | return true; | ||
| 129 | } | ||
| 130 | |||
| 131 | return false; | ||
| 127 | } | 132 | } |
| 128 | 133 | ||
| 129 | struct nhlt_specific_cfg | 134 | struct nhlt_specific_cfg |
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c index a072bcf209d2..81923da18ac2 100644 --- a/sound/soc/intel/skylake/skl-topology.c +++ b/sound/soc/intel/skylake/skl-topology.c | |||
| @@ -2908,7 +2908,7 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt, | |||
| 2908 | break; | 2908 | break; |
| 2909 | 2909 | ||
| 2910 | default: | 2910 | default: |
| 2911 | dev_warn(bus->dev, "Control load not supported %d:%d:%d\n", | 2911 | dev_dbg(bus->dev, "Control load not supported %d:%d:%d\n", |
| 2912 | hdr->ops.get, hdr->ops.put, hdr->ops.info); | 2912 | hdr->ops.get, hdr->ops.put, hdr->ops.info); |
| 2913 | break; | 2913 | break; |
| 2914 | } | 2914 | } |
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c index ee5055d47d13..a89fe9b6463b 100644 --- a/sound/soc/rockchip/rockchip_spdif.c +++ b/sound/soc/rockchip/rockchip_spdif.c | |||
| @@ -322,26 +322,30 @@ static int rk_spdif_probe(struct platform_device *pdev) | |||
| 322 | spdif->mclk = devm_clk_get(&pdev->dev, "mclk"); | 322 | spdif->mclk = devm_clk_get(&pdev->dev, "mclk"); |
| 323 | if (IS_ERR(spdif->mclk)) { | 323 | if (IS_ERR(spdif->mclk)) { |
| 324 | dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n"); | 324 | dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n"); |
| 325 | return PTR_ERR(spdif->mclk); | 325 | ret = PTR_ERR(spdif->mclk); |
| 326 | goto err_disable_hclk; | ||
| 326 | } | 327 | } |
| 327 | 328 | ||
| 328 | ret = clk_prepare_enable(spdif->mclk); | 329 | ret = clk_prepare_enable(spdif->mclk); |
| 329 | if (ret) { | 330 | if (ret) { |
| 330 | dev_err(spdif->dev, "clock enable failed %d\n", ret); | 331 | dev_err(spdif->dev, "clock enable failed %d\n", ret); |
| 331 | return ret; | 332 | goto err_disable_clocks; |
| 332 | } | 333 | } |
| 333 | 334 | ||
| 334 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 335 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 335 | regs = devm_ioremap_resource(&pdev->dev, res); | 336 | regs = devm_ioremap_resource(&pdev->dev, res); |
| 336 | if (IS_ERR(regs)) | 337 | if (IS_ERR(regs)) { |
| 337 | return PTR_ERR(regs); | 338 | ret = PTR_ERR(regs); |
| 339 | goto err_disable_clocks; | ||
| 340 | } | ||
| 338 | 341 | ||
| 339 | spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs, | 342 | spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs, |
| 340 | &rk_spdif_regmap_config); | 343 | &rk_spdif_regmap_config); |
| 341 | if (IS_ERR(spdif->regmap)) { | 344 | if (IS_ERR(spdif->regmap)) { |
| 342 | dev_err(&pdev->dev, | 345 | dev_err(&pdev->dev, |
| 343 | "Failed to initialise managed register map\n"); | 346 | "Failed to initialise managed register map\n"); |
| 344 | return PTR_ERR(spdif->regmap); | 347 | ret = PTR_ERR(spdif->regmap); |
| 348 | goto err_disable_clocks; | ||
| 345 | } | 349 | } |
| 346 | 350 | ||
| 347 | spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR; | 351 | spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR; |
| @@ -373,6 +377,10 @@ static int rk_spdif_probe(struct platform_device *pdev) | |||
| 373 | 377 | ||
| 374 | err_pm_runtime: | 378 | err_pm_runtime: |
| 375 | pm_runtime_disable(&pdev->dev); | 379 | pm_runtime_disable(&pdev->dev); |
| 380 | err_disable_clocks: | ||
| 381 | clk_disable_unprepare(spdif->mclk); | ||
| 382 | err_disable_hclk: | ||
| 383 | clk_disable_unprepare(spdif->hclk); | ||
| 376 | 384 | ||
| 377 | return ret; | 385 | return ret; |
| 378 | } | 386 | } |
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index 8ddb08714faa..4672688cac32 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c | |||
| @@ -222,7 +222,7 @@ int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod, | |||
| 222 | NULL, &val, NULL); | 222 | NULL, &val, NULL); |
| 223 | 223 | ||
| 224 | val = val << shift; | 224 | val = val << shift; |
| 225 | mask = 0xffff << shift; | 225 | mask = 0x0f1f << shift; |
| 226 | 226 | ||
| 227 | rsnd_mod_bset(adg_mod, CMDOUT_TIMSEL, mask, val); | 227 | rsnd_mod_bset(adg_mod, CMDOUT_TIMSEL, mask, val); |
| 228 | 228 | ||
| @@ -250,7 +250,7 @@ int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod, | |||
| 250 | 250 | ||
| 251 | in = in << shift; | 251 | in = in << shift; |
| 252 | out = out << shift; | 252 | out = out << shift; |
| 253 | mask = 0xffff << shift; | 253 | mask = 0x0f1f << shift; |
| 254 | 254 | ||
| 255 | switch (id / 2) { | 255 | switch (id / 2) { |
| 256 | case 0: | 256 | case 0: |
| @@ -380,7 +380,7 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate) | |||
| 380 | ckr = 0x80000000; | 380 | ckr = 0x80000000; |
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | rsnd_mod_bset(adg_mod, BRGCKR, 0x80FF0000, adg->ckr | ckr); | 383 | rsnd_mod_bset(adg_mod, BRGCKR, 0x80770000, adg->ckr | ckr); |
| 384 | rsnd_mod_write(adg_mod, BRRA, adg->rbga); | 384 | rsnd_mod_write(adg_mod, BRRA, adg->rbga); |
| 385 | rsnd_mod_write(adg_mod, BRRB, adg->rbgb); | 385 | rsnd_mod_write(adg_mod, BRRB, adg->rbgb); |
| 386 | 386 | ||
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index c70eb2097816..f12a88a21dfa 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c | |||
| @@ -1332,8 +1332,8 @@ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd) | |||
| 1332 | 1332 | ||
| 1333 | return snd_pcm_lib_preallocate_pages_for_all( | 1333 | return snd_pcm_lib_preallocate_pages_for_all( |
| 1334 | rtd->pcm, | 1334 | rtd->pcm, |
| 1335 | SNDRV_DMA_TYPE_CONTINUOUS, | 1335 | SNDRV_DMA_TYPE_DEV, |
| 1336 | snd_dma_continuous_data(GFP_KERNEL), | 1336 | rtd->card->snd_card->dev, |
| 1337 | PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); | 1337 | PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); |
| 1338 | } | 1338 | } |
| 1339 | 1339 | ||
diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c index fd557abfe390..4d750bdf8e24 100644 --- a/sound/soc/sh/rcar/dma.c +++ b/sound/soc/sh/rcar/dma.c | |||
| @@ -26,10 +26,7 @@ | |||
| 26 | struct rsnd_dmaen { | 26 | struct rsnd_dmaen { |
| 27 | struct dma_chan *chan; | 27 | struct dma_chan *chan; |
| 28 | dma_cookie_t cookie; | 28 | dma_cookie_t cookie; |
| 29 | dma_addr_t dma_buf; | ||
| 30 | unsigned int dma_len; | 29 | unsigned int dma_len; |
| 31 | unsigned int dma_period; | ||
| 32 | unsigned int dma_cnt; | ||
| 33 | }; | 30 | }; |
| 34 | 31 | ||
| 35 | struct rsnd_dmapp { | 32 | struct rsnd_dmapp { |
| @@ -71,38 +68,10 @@ static struct rsnd_mod mem = { | |||
| 71 | /* | 68 | /* |
| 72 | * Audio DMAC | 69 | * Audio DMAC |
| 73 | */ | 70 | */ |
| 74 | #define rsnd_dmaen_sync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 1) | ||
| 75 | #define rsnd_dmaen_unsync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 0) | ||
| 76 | static void __rsnd_dmaen_sync(struct rsnd_dmaen *dmaen, struct rsnd_dai_stream *io, | ||
| 77 | int i, int sync) | ||
| 78 | { | ||
| 79 | struct device *dev = dmaen->chan->device->dev; | ||
| 80 | enum dma_data_direction dir; | ||
| 81 | int is_play = rsnd_io_is_play(io); | ||
| 82 | dma_addr_t buf; | ||
| 83 | int len, max; | ||
| 84 | size_t period; | ||
| 85 | |||
| 86 | len = dmaen->dma_len; | ||
| 87 | period = dmaen->dma_period; | ||
| 88 | max = len / period; | ||
| 89 | i = i % max; | ||
| 90 | buf = dmaen->dma_buf + (period * i); | ||
| 91 | |||
| 92 | dir = is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE; | ||
| 93 | |||
| 94 | if (sync) | ||
| 95 | dma_sync_single_for_device(dev, buf, period, dir); | ||
| 96 | else | ||
| 97 | dma_sync_single_for_cpu(dev, buf, period, dir); | ||
| 98 | } | ||
| 99 | |||
| 100 | static void __rsnd_dmaen_complete(struct rsnd_mod *mod, | 71 | static void __rsnd_dmaen_complete(struct rsnd_mod *mod, |
| 101 | struct rsnd_dai_stream *io) | 72 | struct rsnd_dai_stream *io) |
| 102 | { | 73 | { |
| 103 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 74 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
| 104 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); | ||
| 105 | struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); | ||
| 106 | bool elapsed = false; | 75 | bool elapsed = false; |
| 107 | unsigned long flags; | 76 | unsigned long flags; |
| 108 | 77 | ||
| @@ -115,22 +84,9 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod, | |||
| 115 | */ | 84 | */ |
| 116 | spin_lock_irqsave(&priv->lock, flags); | 85 | spin_lock_irqsave(&priv->lock, flags); |
| 117 | 86 | ||
| 118 | if (rsnd_io_is_working(io)) { | 87 | if (rsnd_io_is_working(io)) |
| 119 | rsnd_dmaen_unsync(dmaen, io, dmaen->dma_cnt); | ||
| 120 | |||
| 121 | /* | ||
| 122 | * Next period is already started. | ||
| 123 | * Let's sync Next Next period | ||
| 124 | * see | ||
| 125 | * rsnd_dmaen_start() | ||
| 126 | */ | ||
| 127 | rsnd_dmaen_sync(dmaen, io, dmaen->dma_cnt + 2); | ||
| 128 | |||
| 129 | elapsed = true; | 88 | elapsed = true; |
| 130 | 89 | ||
| 131 | dmaen->dma_cnt++; | ||
| 132 | } | ||
| 133 | |||
| 134 | spin_unlock_irqrestore(&priv->lock, flags); | 90 | spin_unlock_irqrestore(&priv->lock, flags); |
| 135 | 91 | ||
| 136 | if (elapsed) | 92 | if (elapsed) |
| @@ -165,14 +121,8 @@ static int rsnd_dmaen_stop(struct rsnd_mod *mod, | |||
| 165 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); | 121 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); |
| 166 | struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); | 122 | struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); |
| 167 | 123 | ||
| 168 | if (dmaen->chan) { | 124 | if (dmaen->chan) |
| 169 | int is_play = rsnd_io_is_play(io); | ||
| 170 | |||
| 171 | dmaengine_terminate_all(dmaen->chan); | 125 | dmaengine_terminate_all(dmaen->chan); |
| 172 | dma_unmap_single(dmaen->chan->device->dev, | ||
| 173 | dmaen->dma_buf, dmaen->dma_len, | ||
| 174 | is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
| 175 | } | ||
| 176 | 126 | ||
| 177 | return 0; | 127 | return 0; |
| 178 | } | 128 | } |
| @@ -237,11 +187,7 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, | |||
| 237 | struct device *dev = rsnd_priv_to_dev(priv); | 187 | struct device *dev = rsnd_priv_to_dev(priv); |
| 238 | struct dma_async_tx_descriptor *desc; | 188 | struct dma_async_tx_descriptor *desc; |
| 239 | struct dma_slave_config cfg = {}; | 189 | struct dma_slave_config cfg = {}; |
| 240 | dma_addr_t buf; | ||
| 241 | size_t len; | ||
| 242 | size_t period; | ||
| 243 | int is_play = rsnd_io_is_play(io); | 190 | int is_play = rsnd_io_is_play(io); |
| 244 | int i; | ||
| 245 | int ret; | 191 | int ret; |
| 246 | 192 | ||
| 247 | cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; | 193 | cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; |
| @@ -258,19 +204,10 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, | |||
| 258 | if (ret < 0) | 204 | if (ret < 0) |
| 259 | return ret; | 205 | return ret; |
| 260 | 206 | ||
| 261 | len = snd_pcm_lib_buffer_bytes(substream); | ||
| 262 | period = snd_pcm_lib_period_bytes(substream); | ||
| 263 | buf = dma_map_single(dmaen->chan->device->dev, | ||
| 264 | substream->runtime->dma_area, | ||
| 265 | len, | ||
| 266 | is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
| 267 | if (dma_mapping_error(dmaen->chan->device->dev, buf)) { | ||
| 268 | dev_err(dev, "dma map failed\n"); | ||
| 269 | return -EIO; | ||
| 270 | } | ||
| 271 | |||
| 272 | desc = dmaengine_prep_dma_cyclic(dmaen->chan, | 207 | desc = dmaengine_prep_dma_cyclic(dmaen->chan, |
| 273 | buf, len, period, | 208 | substream->runtime->dma_addr, |
| 209 | snd_pcm_lib_buffer_bytes(substream), | ||
| 210 | snd_pcm_lib_period_bytes(substream), | ||
| 274 | is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM, | 211 | is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM, |
| 275 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 212 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
| 276 | 213 | ||
| @@ -282,18 +219,7 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, | |||
| 282 | desc->callback = rsnd_dmaen_complete; | 219 | desc->callback = rsnd_dmaen_complete; |
| 283 | desc->callback_param = rsnd_mod_get(dma); | 220 | desc->callback_param = rsnd_mod_get(dma); |
| 284 | 221 | ||
| 285 | dmaen->dma_buf = buf; | 222 | dmaen->dma_len = snd_pcm_lib_buffer_bytes(substream); |
| 286 | dmaen->dma_len = len; | ||
| 287 | dmaen->dma_period = period; | ||
| 288 | dmaen->dma_cnt = 0; | ||
| 289 | |||
| 290 | /* | ||
| 291 | * synchronize this and next period | ||
| 292 | * see | ||
| 293 | * __rsnd_dmaen_complete() | ||
| 294 | */ | ||
| 295 | for (i = 0; i < 2; i++) | ||
| 296 | rsnd_dmaen_sync(dmaen, io, i); | ||
| 297 | 223 | ||
| 298 | dmaen->cookie = dmaengine_submit(desc); | 224 | dmaen->cookie = dmaengine_submit(desc); |
| 299 | if (dmaen->cookie < 0) { | 225 | if (dmaen->cookie < 0) { |
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index fece1e5f582f..cbf3bf312d23 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c | |||
| @@ -446,25 +446,29 @@ static bool rsnd_ssi_pointer_update(struct rsnd_mod *mod, | |||
| 446 | int byte) | 446 | int byte) |
| 447 | { | 447 | { |
| 448 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); | 448 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); |
| 449 | bool ret = false; | ||
| 450 | int byte_pos; | ||
| 449 | 451 | ||
| 450 | ssi->byte_pos += byte; | 452 | byte_pos = ssi->byte_pos + byte; |
| 451 | 453 | ||
| 452 | if (ssi->byte_pos >= ssi->next_period_byte) { | 454 | if (byte_pos >= ssi->next_period_byte) { |
| 453 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 455 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
| 454 | 456 | ||
| 455 | ssi->period_pos++; | 457 | ssi->period_pos++; |
| 456 | ssi->next_period_byte += ssi->byte_per_period; | 458 | ssi->next_period_byte += ssi->byte_per_period; |
| 457 | 459 | ||
| 458 | if (ssi->period_pos >= runtime->periods) { | 460 | if (ssi->period_pos >= runtime->periods) { |
| 459 | ssi->byte_pos = 0; | 461 | byte_pos = 0; |
| 460 | ssi->period_pos = 0; | 462 | ssi->period_pos = 0; |
| 461 | ssi->next_period_byte = ssi->byte_per_period; | 463 | ssi->next_period_byte = ssi->byte_per_period; |
| 462 | } | 464 | } |
| 463 | 465 | ||
| 464 | return true; | 466 | ret = true; |
| 465 | } | 467 | } |
| 466 | 468 | ||
| 467 | return false; | 469 | WRITE_ONCE(ssi->byte_pos, byte_pos); |
| 470 | |||
| 471 | return ret; | ||
| 468 | } | 472 | } |
| 469 | 473 | ||
| 470 | /* | 474 | /* |
| @@ -838,7 +842,7 @@ static int rsnd_ssi_pointer(struct rsnd_mod *mod, | |||
| 838 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); | 842 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); |
| 839 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 843 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
| 840 | 844 | ||
| 841 | *pointer = bytes_to_frames(runtime, ssi->byte_pos); | 845 | *pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos)); |
| 842 | 846 | ||
| 843 | return 0; | 847 | return 0; |
| 844 | } | 848 | } |
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c index 4d948757d300..6ff8a36c2c82 100644 --- a/sound/soc/sh/rcar/ssiu.c +++ b/sound/soc/sh/rcar/ssiu.c | |||
| @@ -125,6 +125,7 @@ static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod, | |||
| 125 | { | 125 | { |
| 126 | int hdmi = rsnd_ssi_hdmi_port(io); | 126 | int hdmi = rsnd_ssi_hdmi_port(io); |
| 127 | int ret; | 127 | int ret; |
| 128 | u32 mode = 0; | ||
| 128 | 129 | ||
| 129 | ret = rsnd_ssiu_init(mod, io, priv); | 130 | ret = rsnd_ssiu_init(mod, io, priv); |
| 130 | if (ret < 0) | 131 | if (ret < 0) |
| @@ -136,9 +137,11 @@ static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod, | |||
| 136 | * see | 137 | * see |
| 137 | * rsnd_ssi_config_init() | 138 | * rsnd_ssi_config_init() |
| 138 | */ | 139 | */ |
| 139 | rsnd_mod_write(mod, SSI_MODE, 0x1); | 140 | mode = 0x1; |
| 140 | } | 141 | } |
| 141 | 142 | ||
| 143 | rsnd_mod_write(mod, SSI_MODE, mode); | ||
| 144 | |||
| 142 | if (rsnd_ssi_use_busif(io)) { | 145 | if (rsnd_ssi_use_busif(io)) { |
| 143 | rsnd_mod_write(mod, SSI_BUSIF_ADINR, | 146 | rsnd_mod_write(mod, SSI_BUSIF_ADINR, |
| 144 | rsnd_get_adinr_bit(mod, io) | | 147 | rsnd_get_adinr_bit(mod, io) | |
