aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/arizona.c6
-rw-r--r--sound/soc/davinci/davinci-mcasp.c14
-rw-r--r--sound/soc/fsl/Kconfig1
-rw-r--r--sound/soc/fsl/fsl_esai.c2
-rw-r--r--sound/soc/intel/sst-acpi.c4
-rw-r--r--sound/soc/intel/sst-baytrail-ipc.c10
-rw-r--r--sound/soc/intel/sst-baytrail-ipc.h1
-rw-r--r--sound/soc/intel/sst-baytrail-pcm.c43
-rw-r--r--sound/soc/pxa/pxa-ssp.c4
9 files changed, 34 insertions, 51 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 2f2e91ac690f..4dfab9573a95 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -1278,6 +1278,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
1278 else 1278 else
1279 rates = &arizona_48k_bclk_rates[0]; 1279 rates = &arizona_48k_bclk_rates[0];
1280 1280
1281 wl = snd_pcm_format_width(params_format(params));
1282
1281 if (tdm_slots) { 1283 if (tdm_slots) {
1282 arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n", 1284 arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
1283 tdm_slots, tdm_width); 1285 tdm_slots, tdm_width);
@@ -1285,6 +1287,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
1285 channels = tdm_slots; 1287 channels = tdm_slots;
1286 } else { 1288 } else {
1287 bclk_target = snd_soc_params_to_bclk(params); 1289 bclk_target = snd_soc_params_to_bclk(params);
1290 tdm_width = wl;
1288 } 1291 }
1289 1292
1290 if (chan_limit && chan_limit < channels) { 1293 if (chan_limit && chan_limit < channels) {
@@ -1319,8 +1322,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
1319 arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n", 1322 arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n",
1320 rates[bclk], rates[bclk] / lrclk); 1323 rates[bclk], rates[bclk] / lrclk);
1321 1324
1322 wl = snd_pcm_format_width(params_format(params)); 1325 frame = wl << ARIZONA_AIF1TX_WL_SHIFT | tdm_width;
1323 frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl;
1324 1326
1325 reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame); 1327 reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
1326 1328
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index c28508da34cf..6a6b2ff7d7d7 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -403,7 +403,8 @@ out:
403 return ret; 403 return ret;
404} 404}
405 405
406static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) 406static int __davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
407 int div, bool explicit)
407{ 408{
408 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai); 409 struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
409 410
@@ -420,7 +421,8 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
420 ACLKXDIV(div - 1), ACLKXDIV_MASK); 421 ACLKXDIV(div - 1), ACLKXDIV_MASK);
421 mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, 422 mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
422 ACLKRDIV(div - 1), ACLKRDIV_MASK); 423 ACLKRDIV(div - 1), ACLKRDIV_MASK);
423 mcasp->bclk_div = div; 424 if (explicit)
425 mcasp->bclk_div = div;
424 break; 426 break;
425 427
426 case 2: /* BCLK/LRCLK ratio */ 428 case 2: /* BCLK/LRCLK ratio */
@@ -434,6 +436,12 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
434 return 0; 436 return 0;
435} 437}
436 438
439static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
440 int div)
441{
442 return __davinci_mcasp_set_clkdiv(dai, div_id, div, 1);
443}
444
437static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id, 445static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
438 unsigned int freq, int dir) 446 unsigned int freq, int dir)
439{ 447{
@@ -738,7 +746,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
738 "Inaccurate BCLK: %u Hz / %u != %u Hz\n", 746 "Inaccurate BCLK: %u Hz / %u != %u Hz\n",
739 mcasp->sysclk_freq, div, bclk_freq); 747 mcasp->sysclk_freq, div, bclk_freq);
740 } 748 }
741 davinci_mcasp_set_clkdiv(cpu_dai, 1, div); 749 __davinci_mcasp_set_clkdiv(cpu_dai, 1, div, 0);
742 } 750 }
743 751
744 ret = mcasp_common_hw_param(mcasp, substream->stream, 752 ret = mcasp_common_hw_param(mcasp, substream->stream,
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index f54a8fc99291..f3012b645b51 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -49,7 +49,6 @@ config SND_SOC_FSL_ESAI
49 tristate "Enhanced Serial Audio Interface (ESAI) module support" 49 tristate "Enhanced Serial Audio Interface (ESAI) module support"
50 select REGMAP_MMIO 50 select REGMAP_MMIO
51 select SND_SOC_IMX_PCM_DMA if SND_IMX_SOC != n 51 select SND_SOC_IMX_PCM_DMA if SND_IMX_SOC != n
52 select SND_SOC_FSL_UTILS
53 help 52 help
54 Say Y if you want to add Enhanced Synchronous Audio Interface 53 Say Y if you want to add Enhanced Synchronous Audio Interface
55 (ESAI) support for the Freescale CPUs. 54 (ESAI) support for the Freescale CPUs.
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index 72d154e7dd03..a3b29ed84963 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -18,7 +18,6 @@
18 18
19#include "fsl_esai.h" 19#include "fsl_esai.h"
20#include "imx-pcm.h" 20#include "imx-pcm.h"
21#include "fsl_utils.h"
22 21
23#define FSL_ESAI_RATES SNDRV_PCM_RATE_8000_192000 22#define FSL_ESAI_RATES SNDRV_PCM_RATE_8000_192000
24#define FSL_ESAI_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ 23#define FSL_ESAI_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
@@ -607,7 +606,6 @@ static struct snd_soc_dai_ops fsl_esai_dai_ops = {
607 .hw_params = fsl_esai_hw_params, 606 .hw_params = fsl_esai_hw_params,
608 .set_sysclk = fsl_esai_set_dai_sysclk, 607 .set_sysclk = fsl_esai_set_dai_sysclk,
609 .set_fmt = fsl_esai_set_dai_fmt, 608 .set_fmt = fsl_esai_set_dai_fmt,
610 .xlate_tdm_slot_mask = fsl_asoc_xlate_tdm_slot_mask,
611 .set_tdm_slot = fsl_esai_set_dai_tdm_slot, 609 .set_tdm_slot = fsl_esai_set_dai_tdm_slot,
612}; 610};
613 611
diff --git a/sound/soc/intel/sst-acpi.c b/sound/soc/intel/sst-acpi.c
index 42edc6f4fc4a..03d0a166b635 100644
--- a/sound/soc/intel/sst-acpi.c
+++ b/sound/soc/intel/sst-acpi.c
@@ -246,8 +246,8 @@ static struct sst_acpi_desc sst_acpi_broadwell_desc = {
246}; 246};
247 247
248static struct sst_acpi_mach baytrail_machines[] = { 248static struct sst_acpi_mach baytrail_machines[] = {
249 { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-i2s_master" }, 249 { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
250 { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-i2s_master" }, 250 { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
251 {} 251 {}
252}; 252};
253 253
diff --git a/sound/soc/intel/sst-baytrail-ipc.c b/sound/soc/intel/sst-baytrail-ipc.c
index 67673a2c0f41..b4ad98c43e5c 100644
--- a/sound/soc/intel/sst-baytrail-ipc.c
+++ b/sound/soc/intel/sst-baytrail-ipc.c
@@ -817,7 +817,7 @@ static struct sst_dsp_device byt_dev = {
817 .ops = &sst_byt_ops, 817 .ops = &sst_byt_ops,
818}; 818};
819 819
820int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata) 820int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata)
821{ 821{
822 struct sst_byt *byt = pdata->dsp; 822 struct sst_byt *byt = pdata->dsp;
823 823
@@ -826,14 +826,6 @@ int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata)
826 sst_byt_drop_all(byt); 826 sst_byt_drop_all(byt);
827 dev_dbg(byt->dev, "dsp in reset\n"); 827 dev_dbg(byt->dev, "dsp in reset\n");
828 828
829 return 0;
830}
831EXPORT_SYMBOL_GPL(sst_byt_dsp_suspend_noirq);
832
833int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata)
834{
835 struct sst_byt *byt = pdata->dsp;
836
837 dev_dbg(byt->dev, "free all blocks and unload fw\n"); 829 dev_dbg(byt->dev, "free all blocks and unload fw\n");
838 sst_fw_unload(byt->fw); 830 sst_fw_unload(byt->fw);
839 831
diff --git a/sound/soc/intel/sst-baytrail-ipc.h b/sound/soc/intel/sst-baytrail-ipc.h
index 06a4d202689b..8faff6dcf25d 100644
--- a/sound/soc/intel/sst-baytrail-ipc.h
+++ b/sound/soc/intel/sst-baytrail-ipc.h
@@ -66,7 +66,6 @@ int sst_byt_get_dsp_position(struct sst_byt *byt,
66int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata); 66int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata);
67void sst_byt_dsp_free(struct device *dev, struct sst_pdata *pdata); 67void sst_byt_dsp_free(struct device *dev, struct sst_pdata *pdata);
68struct sst_dsp *sst_byt_get_dsp(struct sst_byt *byt); 68struct sst_dsp *sst_byt_get_dsp(struct sst_byt *byt);
69int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata);
70int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata); 69int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata);
71int sst_byt_dsp_boot(struct device *dev, struct sst_pdata *pdata); 70int sst_byt_dsp_boot(struct device *dev, struct sst_pdata *pdata);
72int sst_byt_dsp_wait_for_ready(struct device *dev, struct sst_pdata *pdata); 71int sst_byt_dsp_wait_for_ready(struct device *dev, struct sst_pdata *pdata);
diff --git a/sound/soc/intel/sst-baytrail-pcm.c b/sound/soc/intel/sst-baytrail-pcm.c
index 599401c0c655..eab1c7d85187 100644
--- a/sound/soc/intel/sst-baytrail-pcm.c
+++ b/sound/soc/intel/sst-baytrail-pcm.c
@@ -59,6 +59,9 @@ struct sst_byt_priv_data {
59 59
60 /* DAI data */ 60 /* DAI data */
61 struct sst_byt_pcm_data pcm[BYT_PCM_COUNT]; 61 struct sst_byt_pcm_data pcm[BYT_PCM_COUNT];
62
63 /* flag indicating is stream context restore needed after suspend */
64 bool restore_stream;
62}; 65};
63 66
64/* this may get called several times by oss emulation */ 67/* this may get called several times by oss emulation */
@@ -184,7 +187,10 @@ static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
184 sst_byt_stream_start(byt, pcm_data->stream, 0); 187 sst_byt_stream_start(byt, pcm_data->stream, 0);
185 break; 188 break;
186 case SNDRV_PCM_TRIGGER_RESUME: 189 case SNDRV_PCM_TRIGGER_RESUME:
187 schedule_work(&pcm_data->work); 190 if (pdata->restore_stream == true)
191 schedule_work(&pcm_data->work);
192 else
193 sst_byt_stream_resume(byt, pcm_data->stream);
188 break; 194 break;
189 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 195 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
190 sst_byt_stream_resume(byt, pcm_data->stream); 196 sst_byt_stream_resume(byt, pcm_data->stream);
@@ -193,6 +199,7 @@ static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
193 sst_byt_stream_stop(byt, pcm_data->stream); 199 sst_byt_stream_stop(byt, pcm_data->stream);
194 break; 200 break;
195 case SNDRV_PCM_TRIGGER_SUSPEND: 201 case SNDRV_PCM_TRIGGER_SUSPEND:
202 pdata->restore_stream = false;
196 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 203 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
197 sst_byt_stream_pause(byt, pcm_data->stream); 204 sst_byt_stream_pause(byt, pcm_data->stream);
198 break; 205 break;
@@ -404,26 +411,10 @@ static const struct snd_soc_component_driver byt_dai_component = {
404}; 411};
405 412
406#ifdef CONFIG_PM 413#ifdef CONFIG_PM
407static int sst_byt_pcm_dev_suspend_noirq(struct device *dev)
408{
409 struct sst_pdata *sst_pdata = dev_get_platdata(dev);
410 int ret;
411
412 dev_dbg(dev, "suspending noirq\n");
413
414 /* at this point all streams will be stopped and context saved */
415 ret = sst_byt_dsp_suspend_noirq(dev, sst_pdata);
416 if (ret < 0) {
417 dev_err(dev, "failed to suspend %d\n", ret);
418 return ret;
419 }
420
421 return ret;
422}
423
424static int sst_byt_pcm_dev_suspend_late(struct device *dev) 414static int sst_byt_pcm_dev_suspend_late(struct device *dev)
425{ 415{
426 struct sst_pdata *sst_pdata = dev_get_platdata(dev); 416 struct sst_pdata *sst_pdata = dev_get_platdata(dev);
417 struct sst_byt_priv_data *priv_data = dev_get_drvdata(dev);
427 int ret; 418 int ret;
428 419
429 dev_dbg(dev, "suspending late\n"); 420 dev_dbg(dev, "suspending late\n");
@@ -434,34 +425,30 @@ static int sst_byt_pcm_dev_suspend_late(struct device *dev)
434 return ret; 425 return ret;
435 } 426 }
436 427
428 priv_data->restore_stream = true;
429
437 return ret; 430 return ret;
438} 431}
439 432
440static int sst_byt_pcm_dev_resume_early(struct device *dev) 433static int sst_byt_pcm_dev_resume_early(struct device *dev)
441{ 434{
442 struct sst_pdata *sst_pdata = dev_get_platdata(dev); 435 struct sst_pdata *sst_pdata = dev_get_platdata(dev);
436 int ret;
443 437
444 dev_dbg(dev, "resume early\n"); 438 dev_dbg(dev, "resume early\n");
445 439
446 /* load fw and boot DSP */ 440 /* load fw and boot DSP */
447 return sst_byt_dsp_boot(dev, sst_pdata); 441 ret = sst_byt_dsp_boot(dev, sst_pdata);
448} 442 if (ret)
449 443 return ret;
450static int sst_byt_pcm_dev_resume(struct device *dev)
451{
452 struct sst_pdata *sst_pdata = dev_get_platdata(dev);
453
454 dev_dbg(dev, "resume\n");
455 444
456 /* wait for FW to finish booting */ 445 /* wait for FW to finish booting */
457 return sst_byt_dsp_wait_for_ready(dev, sst_pdata); 446 return sst_byt_dsp_wait_for_ready(dev, sst_pdata);
458} 447}
459 448
460static const struct dev_pm_ops sst_byt_pm_ops = { 449static const struct dev_pm_ops sst_byt_pm_ops = {
461 .suspend_noirq = sst_byt_pcm_dev_suspend_noirq,
462 .suspend_late = sst_byt_pcm_dev_suspend_late, 450 .suspend_late = sst_byt_pcm_dev_suspend_late,
463 .resume_early = sst_byt_pcm_dev_resume_early, 451 .resume_early = sst_byt_pcm_dev_resume_early,
464 .resume = sst_byt_pcm_dev_resume,
465}; 452};
466 453
467#define SST_BYT_PM_OPS (&sst_byt_pm_ops) 454#define SST_BYT_PM_OPS (&sst_byt_pm_ops)
diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c
index 0109f6c2334e..a8e097433074 100644
--- a/sound/soc/pxa/pxa-ssp.c
+++ b/sound/soc/pxa/pxa-ssp.c
@@ -765,9 +765,7 @@ static int pxa_ssp_remove(struct snd_soc_dai *dai)
765 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \ 765 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \
766 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) 766 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
767 767
768#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 768#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
769 SNDRV_PCM_FMTBIT_S24_LE | \
770 SNDRV_PCM_FMTBIT_S32_LE)
771 769
772static const struct snd_soc_dai_ops pxa_ssp_dai_ops = { 770static const struct snd_soc_dai_ops pxa_ssp_dai_ops = {
773 .startup = pxa_ssp_startup, 771 .startup = pxa_ssp_startup,