diff options
| author | Takashi Iwai <tiwai@suse.de> | 2010-04-07 03:54:41 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2010-04-07 03:54:41 -0400 |
| commit | 7445c995b06f2a999541ccf127886d24a2a7d012 (patch) | |
| tree | 940cb9cce2e2e3dcbbe3502bf720fd10481769af | |
| parent | 1172234cbe94658c16bc83e50ca57b5a47085209 (diff) | |
| parent | 5f712b2b73a9fc87fcc52124cfe8adefaa0c92f5 (diff) | |
Merge branch 'fix/asoc' into for-linus
28 files changed, 252 insertions, 146 deletions
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 061f16d4c878..0a0b019d41ad 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h | |||
| @@ -219,7 +219,6 @@ struct snd_soc_dai { | |||
| 219 | struct snd_soc_codec *codec; | 219 | struct snd_soc_codec *codec; |
| 220 | unsigned int active; | 220 | unsigned int active; |
| 221 | unsigned char pop_wait:1; | 221 | unsigned char pop_wait:1; |
| 222 | void *dma_data; | ||
| 223 | 222 | ||
| 224 | /* DAI private data */ | 223 | /* DAI private data */ |
| 225 | void *private_data; | 224 | void *private_data; |
| @@ -230,4 +229,21 @@ struct snd_soc_dai { | |||
| 230 | struct list_head list; | 229 | struct list_head list; |
| 231 | }; | 230 | }; |
| 232 | 231 | ||
| 232 | static inline void *snd_soc_dai_get_dma_data(const struct snd_soc_dai *dai, | ||
| 233 | const struct snd_pcm_substream *ss) | ||
| 234 | { | ||
| 235 | return (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | ||
| 236 | dai->playback.dma_data : dai->capture.dma_data; | ||
| 237 | } | ||
| 238 | |||
| 239 | static inline void snd_soc_dai_set_dma_data(struct snd_soc_dai *dai, | ||
| 240 | const struct snd_pcm_substream *ss, | ||
| 241 | void *data) | ||
| 242 | { | ||
| 243 | if (ss->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
| 244 | dai->playback.dma_data = data; | ||
| 245 | else | ||
| 246 | dai->capture.dma_data = data; | ||
| 247 | } | ||
| 248 | |||
| 233 | #endif | 249 | #endif |
diff --git a/include/sound/soc.h b/include/sound/soc.h index 5d234a8c2506..a57fbfcd4c8f 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
| @@ -375,6 +375,7 @@ struct snd_soc_pcm_stream { | |||
| 375 | unsigned int channels_min; /* min channels */ | 375 | unsigned int channels_min; /* min channels */ |
| 376 | unsigned int channels_max; /* max channels */ | 376 | unsigned int channels_max; /* max channels */ |
| 377 | unsigned int active:1; /* stream is in use */ | 377 | unsigned int active:1; /* stream is in use */ |
| 378 | void *dma_data; /* used by platform code */ | ||
| 378 | }; | 379 | }; |
| 379 | 380 | ||
| 380 | /* SoC audio ops */ | 381 | /* SoC audio ops */ |
diff --git a/sound/soc/atmel/atmel-pcm.c b/sound/soc/atmel/atmel-pcm.c index 9ef6b96373f5..3e6628c8e665 100644 --- a/sound/soc/atmel/atmel-pcm.c +++ b/sound/soc/atmel/atmel-pcm.c | |||
| @@ -180,7 +180,7 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 180 | snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); | 180 | snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); |
| 181 | runtime->dma_bytes = params_buffer_bytes(params); | 181 | runtime->dma_bytes = params_buffer_bytes(params); |
| 182 | 182 | ||
| 183 | prtd->params = rtd->dai->cpu_dai->dma_data; | 183 | prtd->params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); |
| 184 | prtd->params->dma_intr_handler = atmel_pcm_dma_irq; | 184 | prtd->params->dma_intr_handler = atmel_pcm_dma_irq; |
| 185 | 185 | ||
| 186 | prtd->dma_buffer = runtime->dma_addr; | 186 | prtd->dma_buffer = runtime->dma_addr; |
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index e588e63f18d2..0b59806905d1 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c | |||
| @@ -363,12 +363,12 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
| 363 | ssc_p->dma_params[dir] = dma_params; | 363 | ssc_p->dma_params[dir] = dma_params; |
| 364 | 364 | ||
| 365 | /* | 365 | /* |
| 366 | * The cpu_dai->dma_data field is only used to communicate the | 366 | * The snd_soc_pcm_stream->dma_data field is only used to communicate |
| 367 | * appropriate DMA parameters to the pcm driver hw_params() | 367 | * the appropriate DMA parameters to the pcm driver hw_params() |
| 368 | * function. It should not be used for other purposes | 368 | * function. It should not be used for other purposes |
| 369 | * as it is common to all substreams. | 369 | * as it is common to all substreams. |
| 370 | */ | 370 | */ |
| 371 | rtd->dai->cpu_dai->dma_data = dma_params; | 371 | snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_params); |
| 372 | 372 | ||
| 373 | channels = params_channels(params); | 373 | channels = params_channels(params); |
| 374 | 374 | ||
diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c index a1bbe16b7f96..bcfa53271673 100644 --- a/sound/soc/codecs/ac97.c +++ b/sound/soc/codecs/ac97.c | |||
| @@ -80,9 +80,11 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, | |||
| 80 | static int ac97_soc_probe(struct platform_device *pdev) | 80 | static int ac97_soc_probe(struct platform_device *pdev) |
| 81 | { | 81 | { |
| 82 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 82 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); |
| 83 | struct snd_soc_card *card = socdev->card; | ||
| 83 | struct snd_soc_codec *codec; | 84 | struct snd_soc_codec *codec; |
| 84 | struct snd_ac97_bus *ac97_bus; | 85 | struct snd_ac97_bus *ac97_bus; |
| 85 | struct snd_ac97_template ac97_template; | 86 | struct snd_ac97_template ac97_template; |
| 87 | int i; | ||
| 86 | int ret = 0; | 88 | int ret = 0; |
| 87 | 89 | ||
| 88 | printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION); | 90 | printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION); |
| @@ -102,12 +104,6 @@ static int ac97_soc_probe(struct platform_device *pdev) | |||
| 102 | INIT_LIST_HEAD(&codec->dapm_widgets); | 104 | INIT_LIST_HEAD(&codec->dapm_widgets); |
| 103 | INIT_LIST_HEAD(&codec->dapm_paths); | 105 | INIT_LIST_HEAD(&codec->dapm_paths); |
| 104 | 106 | ||
| 105 | ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); | ||
| 106 | if (ret < 0) { | ||
| 107 | printk(KERN_ERR "ASoC: failed to init gen ac97 glue\n"); | ||
| 108 | goto err; | ||
| 109 | } | ||
| 110 | |||
| 111 | /* register pcms */ | 107 | /* register pcms */ |
| 112 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 108 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); |
| 113 | if (ret < 0) | 109 | if (ret < 0) |
| @@ -123,6 +119,13 @@ static int ac97_soc_probe(struct platform_device *pdev) | |||
| 123 | if (ret < 0) | 119 | if (ret < 0) |
| 124 | goto bus_err; | 120 | goto bus_err; |
| 125 | 121 | ||
| 122 | for (i = 0; i < card->num_links; i++) { | ||
| 123 | if (card->dai_link[i].codec_dai->ac97_control) { | ||
| 124 | snd_ac97_dev_add_pdata(codec->ac97, | ||
| 125 | card->dai_link[i].cpu_dai->ac97_pdata); | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 126 | return 0; | 129 | return 0; |
| 127 | 130 | ||
| 128 | bus_err: | 131 | bus_err: |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 29f3771c33a4..f8355ac76a42 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
| @@ -3007,34 +3007,39 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec, | |||
| 3007 | break; | 3007 | break; |
| 3008 | 3008 | ||
| 3009 | case SND_SOC_BIAS_OFF: | 3009 | case SND_SOC_BIAS_OFF: |
| 3010 | /* Switch over to startup biases */ | 3010 | if (codec->bias_level == SND_SOC_BIAS_STANDBY) { |
| 3011 | snd_soc_update_bits(codec, WM8994_ANTIPOP_2, | 3011 | /* Switch over to startup biases */ |
| 3012 | WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | | 3012 | snd_soc_update_bits(codec, WM8994_ANTIPOP_2, |
| 3013 | WM8994_VMID_BUF_ENA | | 3013 | WM8994_BIAS_SRC | |
| 3014 | WM8994_VMID_RAMP_MASK, | 3014 | WM8994_STARTUP_BIAS_ENA | |
| 3015 | WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | | 3015 | WM8994_VMID_BUF_ENA | |
| 3016 | WM8994_VMID_BUF_ENA | | 3016 | WM8994_VMID_RAMP_MASK, |
| 3017 | (1 << WM8994_VMID_RAMP_SHIFT)); | 3017 | WM8994_BIAS_SRC | |
| 3018 | 3018 | WM8994_STARTUP_BIAS_ENA | | |
| 3019 | /* Disable main biases */ | 3019 | WM8994_VMID_BUF_ENA | |
| 3020 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, | 3020 | (1 << WM8994_VMID_RAMP_SHIFT)); |
| 3021 | WM8994_BIAS_ENA | WM8994_VMID_SEL_MASK, 0); | ||
| 3022 | 3021 | ||
| 3023 | /* Discharge line */ | 3022 | /* Disable main biases */ |
| 3024 | snd_soc_update_bits(codec, WM8994_ANTIPOP_1, | 3023 | snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, |
| 3025 | WM8994_LINEOUT1_DISCH | | 3024 | WM8994_BIAS_ENA | |
| 3026 | WM8994_LINEOUT2_DISCH, | 3025 | WM8994_VMID_SEL_MASK, 0); |
| 3027 | WM8994_LINEOUT1_DISCH | | ||
| 3028 | WM8994_LINEOUT2_DISCH); | ||
| 3029 | 3026 | ||
| 3030 | msleep(5); | 3027 | /* Discharge line */ |
| 3028 | snd_soc_update_bits(codec, WM8994_ANTIPOP_1, | ||
| 3029 | WM8994_LINEOUT1_DISCH | | ||
| 3030 | WM8994_LINEOUT2_DISCH, | ||
| 3031 | WM8994_LINEOUT1_DISCH | | ||
| 3032 | WM8994_LINEOUT2_DISCH); | ||
| 3031 | 3033 | ||
| 3032 | /* Switch off startup biases */ | 3034 | msleep(5); |
| 3033 | snd_soc_update_bits(codec, WM8994_ANTIPOP_2, | ||
| 3034 | WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | | ||
| 3035 | WM8994_VMID_BUF_ENA | | ||
| 3036 | WM8994_VMID_RAMP_MASK, 0); | ||
| 3037 | 3035 | ||
| 3036 | /* Switch off startup biases */ | ||
| 3037 | snd_soc_update_bits(codec, WM8994_ANTIPOP_2, | ||
| 3038 | WM8994_BIAS_SRC | | ||
| 3039 | WM8994_STARTUP_BIAS_ENA | | ||
| 3040 | WM8994_VMID_BUF_ENA | | ||
| 3041 | WM8994_VMID_RAMP_MASK, 0); | ||
| 3042 | } | ||
| 3038 | break; | 3043 | break; |
| 3039 | } | 3044 | } |
| 3040 | codec->bias_level = level; | 3045 | codec->bias_level = level; |
| @@ -3401,7 +3406,7 @@ struct snd_soc_dai wm8994_dai[] = { | |||
| 3401 | .rates = WM8994_RATES, | 3406 | .rates = WM8994_RATES, |
| 3402 | .formats = WM8994_FORMATS, | 3407 | .formats = WM8994_FORMATS, |
| 3403 | }, | 3408 | }, |
| 3404 | .playback = { | 3409 | .capture = { |
| 3405 | .stream_name = "AIF3 Capture", | 3410 | .stream_name = "AIF3 Capture", |
| 3406 | .channels_min = 2, | 3411 | .channels_min = 2, |
| 3407 | .channels_max = 2, | 3412 | .channels_max = 2, |
| @@ -3730,11 +3735,12 @@ static int wm8994_codec_probe(struct platform_device *pdev) | |||
| 3730 | case 3: | 3735 | case 3: |
| 3731 | wm8994->hubs.dcs_codes = -5; | 3736 | wm8994->hubs.dcs_codes = -5; |
| 3732 | wm8994->hubs.hp_startup_mode = 1; | 3737 | wm8994->hubs.hp_startup_mode = 1; |
| 3738 | wm8994->hubs.dcs_readback_mode = 1; | ||
| 3733 | break; | 3739 | break; |
| 3734 | default: | 3740 | default: |
| 3741 | wm8994->hubs.dcs_readback_mode = 1; | ||
| 3735 | break; | 3742 | break; |
| 3736 | } | 3743 | } |
| 3737 | |||
| 3738 | 3744 | ||
| 3739 | /* Remember if AIFnLRCLK is configured as a GPIO. This should be | 3745 | /* Remember if AIFnLRCLK is configured as a GPIO. This should be |
| 3740 | * configured on init - if a system wants to do this dynamically | 3746 | * configured on init - if a system wants to do this dynamically |
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 486bdd21a98a..e1f225a3ac46 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c | |||
| @@ -62,21 +62,27 @@ static const char *speaker_mode_text[] = { | |||
| 62 | static const struct soc_enum speaker_mode = | 62 | static const struct soc_enum speaker_mode = |
| 63 | SOC_ENUM_SINGLE(WM8993_SPKMIXR_ATTENUATION, 8, 2, speaker_mode_text); | 63 | SOC_ENUM_SINGLE(WM8993_SPKMIXR_ATTENUATION, 8, 2, speaker_mode_text); |
| 64 | 64 | ||
| 65 | static void wait_for_dc_servo(struct snd_soc_codec *codec) | 65 | static void wait_for_dc_servo(struct snd_soc_codec *codec, unsigned int op) |
| 66 | { | 66 | { |
| 67 | unsigned int reg; | 67 | unsigned int reg; |
| 68 | int count = 0; | 68 | int count = 0; |
| 69 | unsigned int val; | ||
| 70 | |||
| 71 | val = op | WM8993_DCS_ENA_CHAN_0 | WM8993_DCS_ENA_CHAN_1; | ||
| 72 | |||
| 73 | /* Trigger the command */ | ||
| 74 | snd_soc_write(codec, WM8993_DC_SERVO_0, val); | ||
| 69 | 75 | ||
| 70 | dev_dbg(codec->dev, "Waiting for DC servo...\n"); | 76 | dev_dbg(codec->dev, "Waiting for DC servo...\n"); |
| 71 | 77 | ||
| 72 | do { | 78 | do { |
| 73 | count++; | 79 | count++; |
| 74 | msleep(1); | 80 | msleep(1); |
| 75 | reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_0); | 81 | reg = snd_soc_read(codec, WM8993_DC_SERVO_0); |
| 76 | dev_dbg(codec->dev, "DC servo: %x\n", reg); | 82 | dev_dbg(codec->dev, "DC servo: %x\n", reg); |
| 77 | } while (reg & WM8993_DCS_DATAPATH_BUSY && count < 400); | 83 | } while (reg & op && count < 400); |
| 78 | 84 | ||
| 79 | if (reg & WM8993_DCS_DATAPATH_BUSY) | 85 | if (reg & op) |
| 80 | dev_err(codec->dev, "Timed out waiting for DC Servo\n"); | 86 | dev_err(codec->dev, "Timed out waiting for DC Servo\n"); |
| 81 | } | 87 | } |
| 82 | 88 | ||
| @@ -86,51 +92,58 @@ static void wait_for_dc_servo(struct snd_soc_codec *codec) | |||
| 86 | static void calibrate_dc_servo(struct snd_soc_codec *codec) | 92 | static void calibrate_dc_servo(struct snd_soc_codec *codec) |
| 87 | { | 93 | { |
| 88 | struct wm_hubs_data *hubs = codec->private_data; | 94 | struct wm_hubs_data *hubs = codec->private_data; |
| 89 | u16 reg, dcs_cfg; | 95 | u16 reg, reg_l, reg_r, dcs_cfg; |
| 90 | 96 | ||
| 91 | /* Set for 32 series updates */ | 97 | /* Set for 32 series updates */ |
| 92 | snd_soc_update_bits(codec, WM8993_DC_SERVO_1, | 98 | snd_soc_update_bits(codec, WM8993_DC_SERVO_1, |
| 93 | WM8993_DCS_SERIES_NO_01_MASK, | 99 | WM8993_DCS_SERIES_NO_01_MASK, |
| 94 | 32 << WM8993_DCS_SERIES_NO_01_SHIFT); | 100 | 32 << WM8993_DCS_SERIES_NO_01_SHIFT); |
| 95 | 101 | wait_for_dc_servo(codec, | |
| 96 | /* Enable the DC servo. Write all bits to avoid triggering startup | 102 | WM8993_DCS_TRIG_SERIES_0 | WM8993_DCS_TRIG_SERIES_1); |
| 97 | * or write calibration. | ||
| 98 | */ | ||
| 99 | snd_soc_update_bits(codec, WM8993_DC_SERVO_0, | ||
| 100 | 0xFFFF, | ||
| 101 | WM8993_DCS_ENA_CHAN_0 | | ||
| 102 | WM8993_DCS_ENA_CHAN_1 | | ||
| 103 | WM8993_DCS_TRIG_SERIES_1 | | ||
| 104 | WM8993_DCS_TRIG_SERIES_0); | ||
| 105 | |||
| 106 | wait_for_dc_servo(codec); | ||
| 107 | 103 | ||
| 108 | /* Apply correction to DC servo result */ | 104 | /* Apply correction to DC servo result */ |
| 109 | if (hubs->dcs_codes) { | 105 | if (hubs->dcs_codes) { |
| 110 | dev_dbg(codec->dev, "Applying %d code DC servo correction\n", | 106 | dev_dbg(codec->dev, "Applying %d code DC servo correction\n", |
| 111 | hubs->dcs_codes); | 107 | hubs->dcs_codes); |
| 112 | 108 | ||
| 109 | /* Different chips in the family support different | ||
| 110 | * readback methods. | ||
| 111 | */ | ||
| 112 | switch (hubs->dcs_readback_mode) { | ||
| 113 | case 0: | ||
| 114 | reg_l = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) | ||
| 115 | & WM8993_DCS_INTEG_CHAN_0_MASK;; | ||
| 116 | reg_r = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) | ||
| 117 | & WM8993_DCS_INTEG_CHAN_1_MASK; | ||
| 118 | break; | ||
| 119 | case 1: | ||
| 120 | reg = snd_soc_read(codec, WM8993_DC_SERVO_3); | ||
| 121 | reg_l = (reg & WM8993_DCS_DAC_WR_VAL_1_MASK) | ||
| 122 | >> WM8993_DCS_DAC_WR_VAL_1_SHIFT; | ||
| 123 | reg_r = reg & WM8993_DCS_DAC_WR_VAL_0_MASK; | ||
| 124 | break; | ||
| 125 | default: | ||
| 126 | WARN(1, "Unknown DCS readback method"); | ||
| 127 | break; | ||
| 128 | } | ||
| 129 | |||
| 113 | /* HPOUT1L */ | 130 | /* HPOUT1L */ |
| 114 | reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_1) & | 131 | if (reg_l + hubs->dcs_codes > 0 && |
| 115 | WM8993_DCS_INTEG_CHAN_0_MASK;; | 132 | reg_l + hubs->dcs_codes < 0xff) |
| 116 | reg += hubs->dcs_codes; | 133 | reg_l += hubs->dcs_codes; |
| 117 | dcs_cfg = reg << WM8993_DCS_DAC_WR_VAL_1_SHIFT; | 134 | dcs_cfg = reg_l << WM8993_DCS_DAC_WR_VAL_1_SHIFT; |
| 118 | 135 | ||
| 119 | /* HPOUT1R */ | 136 | /* HPOUT1R */ |
| 120 | reg = snd_soc_read(codec, WM8993_DC_SERVO_READBACK_2) & | 137 | if (reg_r + hubs->dcs_codes > 0 && |
| 121 | WM8993_DCS_INTEG_CHAN_1_MASK; | 138 | reg_r + hubs->dcs_codes < 0xff) |
| 122 | reg += hubs->dcs_codes; | 139 | reg_r += hubs->dcs_codes; |
| 123 | dcs_cfg |= reg; | 140 | dcs_cfg |= reg_r; |
| 124 | 141 | ||
| 125 | /* Do it */ | 142 | /* Do it */ |
| 126 | snd_soc_write(codec, WM8993_DC_SERVO_3, dcs_cfg); | 143 | snd_soc_write(codec, WM8993_DC_SERVO_3, dcs_cfg); |
| 127 | snd_soc_update_bits(codec, WM8993_DC_SERVO_0, | 144 | wait_for_dc_servo(codec, |
| 128 | WM8993_DCS_TRIG_DAC_WR_0 | | 145 | WM8993_DCS_TRIG_DAC_WR_0 | |
| 129 | WM8993_DCS_TRIG_DAC_WR_1, | 146 | WM8993_DCS_TRIG_DAC_WR_1); |
| 130 | WM8993_DCS_TRIG_DAC_WR_0 | | ||
| 131 | WM8993_DCS_TRIG_DAC_WR_1); | ||
| 132 | |||
| 133 | wait_for_dc_servo(codec); | ||
| 134 | } | 147 | } |
| 135 | } | 148 | } |
| 136 | 149 | ||
| @@ -141,10 +154,16 @@ static int wm8993_put_dc_servo(struct snd_kcontrol *kcontrol, | |||
| 141 | struct snd_ctl_elem_value *ucontrol) | 154 | struct snd_ctl_elem_value *ucontrol) |
| 142 | { | 155 | { |
| 143 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 156 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 157 | struct wm_hubs_data *hubs = codec->private_data; | ||
| 144 | int ret; | 158 | int ret; |
| 145 | 159 | ||
| 146 | ret = snd_soc_put_volsw_2r(kcontrol, ucontrol); | 160 | ret = snd_soc_put_volsw_2r(kcontrol, ucontrol); |
| 147 | 161 | ||
| 162 | /* If we're applying an offset correction then updating the | ||
| 163 | * callibration would be likely to introduce further offsets. */ | ||
| 164 | if (hubs->dcs_codes) | ||
| 165 | return ret; | ||
| 166 | |||
| 148 | /* Only need to do this if the outputs are active */ | 167 | /* Only need to do this if the outputs are active */ |
| 149 | if (snd_soc_read(codec, WM8993_POWER_MANAGEMENT_1) | 168 | if (snd_soc_read(codec, WM8993_POWER_MANAGEMENT_1) |
| 150 | & (WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA)) | 169 | & (WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA)) |
diff --git a/sound/soc/codecs/wm_hubs.h b/sound/soc/codecs/wm_hubs.h index 420104fe9c90..e51c16683589 100644 --- a/sound/soc/codecs/wm_hubs.h +++ b/sound/soc/codecs/wm_hubs.h | |||
| @@ -21,6 +21,7 @@ extern const unsigned int wm_hubs_spkmix_tlv[]; | |||
| 21 | /* This *must* be the first element of the codec->private_data struct */ | 21 | /* This *must* be the first element of the codec->private_data struct */ |
| 22 | struct wm_hubs_data { | 22 | struct wm_hubs_data { |
| 23 | int dcs_codes; | 23 | int dcs_codes; |
| 24 | int dcs_readback_mode; | ||
| 24 | int hp_startup_mode; | 25 | int hp_startup_mode; |
| 25 | }; | 26 | }; |
| 26 | 27 | ||
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index 6362ca05506e..4aad7ecc90a2 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c | |||
| @@ -585,7 +585,8 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
| 585 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; | 585 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; |
| 586 | 586 | ||
| 587 | davinci_i2s_dai.private_data = dev; | 587 | davinci_i2s_dai.private_data = dev; |
| 588 | davinci_i2s_dai.dma_data = dev->dma_params; | 588 | davinci_i2s_dai.capture.dma_data = dev->dma_params; |
| 589 | davinci_i2s_dai.playback.dma_data = dev->dma_params; | ||
| 589 | ret = snd_soc_register_dai(&davinci_i2s_dai); | 590 | ret = snd_soc_register_dai(&davinci_i2s_dai); |
| 590 | if (ret != 0) | 591 | if (ret != 0) |
| 591 | goto err_free_mem; | 592 | goto err_free_mem; |
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index ab6518d86f18..c056bfbe0340 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -917,7 +917,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
| 917 | 917 | ||
| 918 | dma_data->channel = res->start; | 918 | dma_data->channel = res->start; |
| 919 | davinci_mcasp_dai[pdata->op_mode].private_data = dev; | 919 | davinci_mcasp_dai[pdata->op_mode].private_data = dev; |
| 920 | davinci_mcasp_dai[pdata->op_mode].dma_data = dev->dma_params; | 920 | davinci_mcasp_dai[pdata->op_mode].capture.dma_data = dev->dma_params; |
| 921 | davinci_mcasp_dai[pdata->op_mode].playback.dma_data = dev->dma_params; | ||
| 921 | davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; | 922 | davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; |
| 922 | ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); | 923 | ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); |
| 923 | 924 | ||
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index 80c7fdf2f521..2dc406f42fe7 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c | |||
| @@ -649,8 +649,10 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream) | |||
| 649 | struct snd_pcm_hardware *ppcm; | 649 | struct snd_pcm_hardware *ppcm; |
| 650 | int ret = 0; | 650 | int ret = 0; |
| 651 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 651 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 652 | struct davinci_pcm_dma_params *pa = rtd->dai->cpu_dai->dma_data; | 652 | struct davinci_pcm_dma_params *pa; |
| 653 | struct davinci_pcm_dma_params *params; | 653 | struct davinci_pcm_dma_params *params; |
| 654 | |||
| 655 | pa = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 654 | if (!pa) | 656 | if (!pa) |
| 655 | return -ENODEV; | 657 | return -ENODEV; |
| 656 | params = &pa[substream->stream]; | 658 | params = &pa[substream->stream]; |
diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c index 19452e44afdc..c78c000e2afe 100644 --- a/sound/soc/imx/imx-pcm-dma-mx2.c +++ b/sound/soc/imx/imx-pcm-dma-mx2.c | |||
| @@ -83,11 +83,13 @@ static void snd_imx_dma_err_callback(int channel, void *data, int err) | |||
| 83 | static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream) | 83 | static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream) |
| 84 | { | 84 | { |
| 85 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 85 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 86 | struct imx_pcm_dma_params *dma_params = rtd->dai->cpu_dai->dma_data; | 86 | struct imx_pcm_dma_params *dma_params; |
| 87 | struct snd_pcm_runtime *runtime = substream->runtime; | 87 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 88 | struct imx_pcm_runtime_data *iprtd = runtime->private_data; | 88 | struct imx_pcm_runtime_data *iprtd = runtime->private_data; |
| 89 | int ret; | 89 | int ret; |
| 90 | 90 | ||
| 91 | dma_params = snd_soc_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 92 | |||
| 91 | iprtd->dma = imx_dma_request_by_prio(DRV_NAME, DMA_PRIO_HIGH); | 93 | iprtd->dma = imx_dma_request_by_prio(DRV_NAME, DMA_PRIO_HIGH); |
| 92 | if (iprtd->dma < 0) { | 94 | if (iprtd->dma < 0) { |
| 93 | pr_err("Failed to claim the audio DMA\n"); | 95 | pr_err("Failed to claim the audio DMA\n"); |
| @@ -192,10 +194,12 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream) | |||
| 192 | { | 194 | { |
| 193 | struct snd_pcm_runtime *runtime = substream->runtime; | 195 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 194 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 196 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 195 | struct imx_pcm_dma_params *dma_params = rtd->dai->cpu_dai->dma_data; | 197 | struct imx_pcm_dma_params *dma_params; |
| 196 | struct imx_pcm_runtime_data *iprtd = runtime->private_data; | 198 | struct imx_pcm_runtime_data *iprtd = runtime->private_data; |
| 197 | int err; | 199 | int err; |
| 198 | 200 | ||
| 201 | dma_params = snd_soc_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 202 | |||
| 199 | iprtd->substream = substream; | 203 | iprtd->substream = substream; |
| 200 | iprtd->buf = (unsigned int *)substream->dma_buffer.area; | 204 | iprtd->buf = (unsigned int *)substream->dma_buffer.area; |
| 201 | iprtd->period_cnt = 0; | 205 | iprtd->period_cnt = 0; |
diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 56f46a75d297..28e55c7b14b4 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c | |||
| @@ -234,17 +234,20 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream, | |||
| 234 | struct snd_soc_dai *cpu_dai) | 234 | struct snd_soc_dai *cpu_dai) |
| 235 | { | 235 | { |
| 236 | struct imx_ssi *ssi = cpu_dai->private_data; | 236 | struct imx_ssi *ssi = cpu_dai->private_data; |
| 237 | struct imx_pcm_dma_params *dma_data; | ||
| 237 | u32 reg, sccr; | 238 | u32 reg, sccr; |
| 238 | 239 | ||
| 239 | /* Tx/Rx config */ | 240 | /* Tx/Rx config */ |
| 240 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 241 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 241 | reg = SSI_STCCR; | 242 | reg = SSI_STCCR; |
| 242 | cpu_dai->dma_data = &ssi->dma_params_tx; | 243 | dma_data = &ssi->dma_params_tx; |
| 243 | } else { | 244 | } else { |
| 244 | reg = SSI_SRCCR; | 245 | reg = SSI_SRCCR; |
| 245 | cpu_dai->dma_data = &ssi->dma_params_rx; | 246 | dma_data = &ssi->dma_params_rx; |
| 246 | } | 247 | } |
| 247 | 248 | ||
| 249 | snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); | ||
| 250 | |||
| 248 | sccr = readl(ssi->base + reg) & ~SSI_STCCR_WL_MASK; | 251 | sccr = readl(ssi->base + reg) & ~SSI_STCCR_WL_MASK; |
| 249 | 252 | ||
| 250 | /* DAI data (word) size */ | 253 | /* DAI data (word) size */ |
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index e814a9591f78..8ad9dc901007 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
| @@ -297,7 +297,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
| 297 | omap_mcbsp_dai_dma_params[id][substream->stream].sync_mode = sync_mode; | 297 | omap_mcbsp_dai_dma_params[id][substream->stream].sync_mode = sync_mode; |
| 298 | omap_mcbsp_dai_dma_params[id][substream->stream].data_type = | 298 | omap_mcbsp_dai_dma_params[id][substream->stream].data_type = |
| 299 | OMAP_DMA_DATA_TYPE_S16; | 299 | OMAP_DMA_DATA_TYPE_S16; |
| 300 | cpu_dai->dma_data = &omap_mcbsp_dai_dma_params[id][substream->stream]; | 300 | |
| 301 | snd_soc_dai_set_dma_data(cpu_dai, substream, | ||
| 302 | &omap_mcbsp_dai_dma_params[id][substream->stream]); | ||
| 301 | 303 | ||
| 302 | if (mcbsp_data->configured) { | 304 | if (mcbsp_data->configured) { |
| 303 | /* McBSP already configured by another stream */ | 305 | /* McBSP already configured by another stream */ |
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index 25f19e4728bf..b7f4f7e015f3 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c | |||
| @@ -150,7 +150,8 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, | |||
| 150 | int stream = substream->stream; | 150 | int stream = substream->stream; |
| 151 | int channels, err, link_mask = 0; | 151 | int channels, err, link_mask = 0; |
| 152 | 152 | ||
| 153 | cpu_dai->dma_data = &omap_mcpdm_dai_dma_params[stream]; | 153 | snd_soc_dai_set_dma_data(cpu_dai, substream, |
| 154 | &omap_mcpdm_dai_dma_params[stream]); | ||
| 154 | 155 | ||
| 155 | channels = params_channels(params); | 156 | channels = params_channels(params); |
| 156 | switch (channels) { | 157 | switch (channels) { |
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index 825db385f01f..39456447132c 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c | |||
| @@ -60,12 +60,11 @@ static void omap_pcm_dma_irq(int ch, u16 stat, void *data) | |||
| 60 | struct omap_runtime_data *prtd = runtime->private_data; | 60 | struct omap_runtime_data *prtd = runtime->private_data; |
| 61 | unsigned long flags; | 61 | unsigned long flags; |
| 62 | 62 | ||
| 63 | if ((cpu_is_omap1510()) && | 63 | if ((cpu_is_omap1510())) { |
| 64 | (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) { | ||
| 65 | /* | 64 | /* |
| 66 | * OMAP1510 doesn't fully support DMA progress counter | 65 | * OMAP1510 doesn't fully support DMA progress counter |
| 67 | * and there is no software emulation implemented yet, | 66 | * and there is no software emulation implemented yet, |
| 68 | * so have to maintain our own playback progress counter | 67 | * so have to maintain our own progress counters |
| 69 | * that can be used by omap_pcm_pointer() instead. | 68 | * that can be used by omap_pcm_pointer() instead. |
| 70 | */ | 69 | */ |
| 71 | spin_lock_irqsave(&prtd->lock, flags); | 70 | spin_lock_irqsave(&prtd->lock, flags); |
| @@ -100,9 +99,11 @@ static int omap_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 100 | struct snd_pcm_runtime *runtime = substream->runtime; | 99 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 101 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 100 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 102 | struct omap_runtime_data *prtd = runtime->private_data; | 101 | struct omap_runtime_data *prtd = runtime->private_data; |
| 103 | struct omap_pcm_dma_data *dma_data = rtd->dai->cpu_dai->dma_data; | 102 | struct omap_pcm_dma_data *dma_data; |
| 104 | int err = 0; | 103 | int err = 0; |
| 105 | 104 | ||
| 105 | dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 106 | |||
| 106 | /* return if this is a bufferless transfer e.g. | 107 | /* return if this is a bufferless transfer e.g. |
| 107 | * codec <--> BT codec or GSM modem -- lg FIXME */ | 108 | * codec <--> BT codec or GSM modem -- lg FIXME */ |
| 108 | if (!dma_data) | 109 | if (!dma_data) |
| @@ -189,8 +190,7 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream) | |||
| 189 | dma_params.frame_count = runtime->periods; | 190 | dma_params.frame_count = runtime->periods; |
| 190 | omap_set_dma_params(prtd->dma_ch, &dma_params); | 191 | omap_set_dma_params(prtd->dma_ch, &dma_params); |
| 191 | 192 | ||
| 192 | if ((cpu_is_omap1510()) && | 193 | if ((cpu_is_omap1510())) |
| 193 | (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) | ||
| 194 | omap_enable_dma_irq(prtd->dma_ch, OMAP_DMA_FRAME_IRQ | | 194 | omap_enable_dma_irq(prtd->dma_ch, OMAP_DMA_FRAME_IRQ | |
| 195 | OMAP_DMA_LAST_IRQ | OMAP_DMA_BLOCK_IRQ); | 195 | OMAP_DMA_LAST_IRQ | OMAP_DMA_BLOCK_IRQ); |
| 196 | else | 196 | else |
| @@ -248,14 +248,15 @@ static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream) | |||
| 248 | dma_addr_t ptr; | 248 | dma_addr_t ptr; |
| 249 | snd_pcm_uframes_t offset; | 249 | snd_pcm_uframes_t offset; |
| 250 | 250 | ||
| 251 | if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { | 251 | if (cpu_is_omap1510()) { |
| 252 | offset = prtd->period_index * runtime->period_size; | ||
| 253 | } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { | ||
| 252 | ptr = omap_get_dma_dst_pos(prtd->dma_ch); | 254 | ptr = omap_get_dma_dst_pos(prtd->dma_ch); |
| 253 | offset = bytes_to_frames(runtime, ptr - runtime->dma_addr); | 255 | offset = bytes_to_frames(runtime, ptr - runtime->dma_addr); |
| 254 | } else if (!(cpu_is_omap1510())) { | 256 | } else { |
| 255 | ptr = omap_get_dma_src_pos(prtd->dma_ch); | 257 | ptr = omap_get_dma_src_pos(prtd->dma_ch); |
| 256 | offset = bytes_to_frames(runtime, ptr - runtime->dma_addr); | 258 | offset = bytes_to_frames(runtime, ptr - runtime->dma_addr); |
| 257 | } else | 259 | } |
| 258 | offset = prtd->period_index * runtime->period_size; | ||
| 259 | 260 | ||
| 260 | if (offset >= runtime->buffer_size) | 261 | if (offset >= runtime->buffer_size) |
| 261 | offset = 0; | 262 | offset = 0; |
diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index 9e95e5117c88..6959c5199160 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c | |||
| @@ -121,10 +121,9 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream, | |||
| 121 | ssp_disable(ssp); | 121 | ssp_disable(ssp); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | if (cpu_dai->dma_data) { | 124 | kfree(snd_soc_dai_get_dma_data(cpu_dai, substream)); |
| 125 | kfree(cpu_dai->dma_data); | 125 | snd_soc_dai_set_dma_data(cpu_dai, substream, NULL); |
| 126 | cpu_dai->dma_data = NULL; | 126 | |
| 127 | } | ||
| 128 | return ret; | 127 | return ret; |
| 129 | } | 128 | } |
| 130 | 129 | ||
| @@ -141,10 +140,8 @@ static void pxa_ssp_shutdown(struct snd_pcm_substream *substream, | |||
| 141 | clk_disable(ssp->clk); | 140 | clk_disable(ssp->clk); |
| 142 | } | 141 | } |
| 143 | 142 | ||
| 144 | if (cpu_dai->dma_data) { | 143 | kfree(snd_soc_dai_get_dma_data(cpu_dai, substream)); |
| 145 | kfree(cpu_dai->dma_data); | 144 | snd_soc_dai_set_dma_data(cpu_dai, substream, NULL); |
| 146 | cpu_dai->dma_data = NULL; | ||
| 147 | } | ||
| 148 | } | 145 | } |
| 149 | 146 | ||
| 150 | #ifdef CONFIG_PM | 147 | #ifdef CONFIG_PM |
| @@ -569,19 +566,23 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, | |||
| 569 | u32 sspsp; | 566 | u32 sspsp; |
| 570 | int width = snd_pcm_format_physical_width(params_format(params)); | 567 | int width = snd_pcm_format_physical_width(params_format(params)); |
| 571 | int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf; | 568 | int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf; |
| 569 | struct pxa2xx_pcm_dma_params *dma_data; | ||
| 570 | |||
| 571 | dma_data = snd_soc_dai_get_dma_data(dai, substream); | ||
| 572 | 572 | ||
| 573 | /* generate correct DMA params */ | 573 | /* generate correct DMA params */ |
| 574 | if (cpu_dai->dma_data) | 574 | kfree(dma_data); |
| 575 | kfree(cpu_dai->dma_data); | ||
| 576 | 575 | ||
| 577 | /* Network mode with one active slot (ttsa == 1) can be used | 576 | /* Network mode with one active slot (ttsa == 1) can be used |
| 578 | * to force 16-bit frame width on the wire (for S16_LE), even | 577 | * to force 16-bit frame width on the wire (for S16_LE), even |
| 579 | * with two channels. Use 16-bit DMA transfers for this case. | 578 | * with two channels. Use 16-bit DMA transfers for this case. |
| 580 | */ | 579 | */ |
| 581 | cpu_dai->dma_data = ssp_get_dma_params(ssp, | 580 | dma_data = ssp_get_dma_params(ssp, |
| 582 | ((chn == 2) && (ttsa != 1)) || (width == 32), | 581 | ((chn == 2) && (ttsa != 1)) || (width == 32), |
| 583 | substream->stream == SNDRV_PCM_STREAM_PLAYBACK); | 582 | substream->stream == SNDRV_PCM_STREAM_PLAYBACK); |
| 584 | 583 | ||
| 584 | snd_soc_dai_set_dma_data(dai, substream, dma_data); | ||
| 585 | |||
| 585 | /* we can only change the settings if the port is not in use */ | 586 | /* we can only change the settings if the port is not in use */ |
| 586 | if (ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) | 587 | if (ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) |
| 587 | return 0; | 588 | return 0; |
diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c index e9ae7b3a7e00..d314115e3dd7 100644 --- a/sound/soc/pxa/pxa2xx-ac97.c +++ b/sound/soc/pxa/pxa2xx-ac97.c | |||
| @@ -122,11 +122,14 @@ static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream, | |||
| 122 | { | 122 | { |
| 123 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 123 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 124 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 124 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 125 | struct pxa2xx_pcm_dma_params *dma_data; | ||
| 125 | 126 | ||
| 126 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 127 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 127 | cpu_dai->dma_data = &pxa2xx_ac97_pcm_stereo_out; | 128 | dma_data = &pxa2xx_ac97_pcm_stereo_out; |
| 128 | else | 129 | else |
| 129 | cpu_dai->dma_data = &pxa2xx_ac97_pcm_stereo_in; | 130 | dma_data = &pxa2xx_ac97_pcm_stereo_in; |
| 131 | |||
| 132 | snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); | ||
| 130 | 133 | ||
| 131 | return 0; | 134 | return 0; |
| 132 | } | 135 | } |
| @@ -137,11 +140,14 @@ static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream, | |||
| 137 | { | 140 | { |
| 138 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 141 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 139 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 142 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 143 | struct pxa2xx_pcm_dma_params *dma_data; | ||
| 140 | 144 | ||
| 141 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 145 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 142 | cpu_dai->dma_data = &pxa2xx_ac97_pcm_aux_mono_out; | 146 | dma_data = &pxa2xx_ac97_pcm_aux_mono_out; |
| 143 | else | 147 | else |
| 144 | cpu_dai->dma_data = &pxa2xx_ac97_pcm_aux_mono_in; | 148 | dma_data = &pxa2xx_ac97_pcm_aux_mono_in; |
| 149 | |||
| 150 | snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); | ||
| 145 | 151 | ||
| 146 | return 0; | 152 | return 0; |
| 147 | } | 153 | } |
| @@ -156,7 +162,8 @@ static int pxa2xx_ac97_hw_mic_params(struct snd_pcm_substream *substream, | |||
| 156 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 162 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 157 | return -ENODEV; | 163 | return -ENODEV; |
| 158 | else | 164 | else |
| 159 | cpu_dai->dma_data = &pxa2xx_ac97_pcm_mic_mono_in; | 165 | snd_soc_dai_set_dma_data(cpu_dai, substream, |
| 166 | &pxa2xx_ac97_pcm_mic_mono_in); | ||
| 160 | 167 | ||
| 161 | return 0; | 168 | return 0; |
| 162 | } | 169 | } |
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 6b8f655d1ad8..c1a5275721e4 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c | |||
| @@ -164,6 +164,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 164 | { | 164 | { |
| 165 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 165 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 166 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 166 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 167 | struct pxa2xx_pcm_dma_params *dma_data; | ||
| 167 | 168 | ||
| 168 | BUG_ON(IS_ERR(clk_i2s)); | 169 | BUG_ON(IS_ERR(clk_i2s)); |
| 169 | clk_enable(clk_i2s); | 170 | clk_enable(clk_i2s); |
| @@ -171,9 +172,11 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 171 | pxa_i2s_wait(); | 172 | pxa_i2s_wait(); |
| 172 | 173 | ||
| 173 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 174 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 174 | cpu_dai->dma_data = &pxa2xx_i2s_pcm_stereo_out; | 175 | dma_data = &pxa2xx_i2s_pcm_stereo_out; |
| 175 | else | 176 | else |
| 176 | cpu_dai->dma_data = &pxa2xx_i2s_pcm_stereo_in; | 177 | dma_data = &pxa2xx_i2s_pcm_stereo_in; |
| 178 | |||
| 179 | snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); | ||
| 177 | 180 | ||
| 178 | /* is port used by another stream */ | 181 | /* is port used by another stream */ |
| 179 | if (!(SACR0 & SACR0_ENB)) { | 182 | if (!(SACR0 & SACR0_ENB)) { |
diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c index d38e39575f51..adc7e6f15f93 100644 --- a/sound/soc/pxa/pxa2xx-pcm.c +++ b/sound/soc/pxa/pxa2xx-pcm.c | |||
| @@ -25,9 +25,11 @@ static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 25 | struct snd_pcm_runtime *runtime = substream->runtime; | 25 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 26 | struct pxa2xx_runtime_data *prtd = runtime->private_data; | 26 | struct pxa2xx_runtime_data *prtd = runtime->private_data; |
| 27 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 27 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 28 | struct pxa2xx_pcm_dma_params *dma = rtd->dai->cpu_dai->dma_data; | 28 | struct pxa2xx_pcm_dma_params *dma; |
| 29 | int ret; | 29 | int ret; |
| 30 | 30 | ||
| 31 | dma = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 32 | |||
| 31 | /* return if this is a bufferless transfer e.g. | 33 | /* return if this is a bufferless transfer e.g. |
| 32 | * codec <--> BT codec or GSM modem -- lg FIXME */ | 34 | * codec <--> BT codec or GSM modem -- lg FIXME */ |
| 33 | if (!dma) | 35 | if (!dma) |
diff --git a/sound/soc/s3c24xx/s3c-ac97.c b/sound/soc/s3c24xx/s3c-ac97.c index ee8ed9d7e703..ecf4fd04ae96 100644 --- a/sound/soc/s3c24xx/s3c-ac97.c +++ b/sound/soc/s3c24xx/s3c-ac97.c | |||
| @@ -224,11 +224,14 @@ static int s3c_ac97_hw_params(struct snd_pcm_substream *substream, | |||
| 224 | { | 224 | { |
| 225 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 225 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 226 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 226 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 227 | struct s3c_dma_params *dma_data; | ||
| 227 | 228 | ||
| 228 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 229 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 229 | cpu_dai->dma_data = &s3c_ac97_pcm_out; | 230 | dma_data = &s3c_ac97_pcm_out; |
| 230 | else | 231 | else |
| 231 | cpu_dai->dma_data = &s3c_ac97_pcm_in; | 232 | dma_data = &s3c_ac97_pcm_in; |
| 233 | |||
| 234 | snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); | ||
| 232 | 235 | ||
| 233 | return 0; | 236 | return 0; |
| 234 | } | 237 | } |
| @@ -238,8 +241,8 @@ static int s3c_ac97_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 238 | { | 241 | { |
| 239 | u32 ac_glbctrl; | 242 | u32 ac_glbctrl; |
| 240 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 243 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 241 | int channel = ((struct s3c_dma_params *) | 244 | struct s3c_dma_params *dma_data = |
| 242 | rtd->dai->cpu_dai->dma_data)->channel; | 245 | snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); |
| 243 | 246 | ||
| 244 | ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); | 247 | ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); |
| 245 | if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) | 248 | if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) |
| @@ -265,7 +268,7 @@ static int s3c_ac97_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 265 | 268 | ||
| 266 | writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL); | 269 | writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL); |
| 267 | 270 | ||
| 268 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); | 271 | s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED); |
| 269 | 272 | ||
| 270 | return 0; | 273 | return 0; |
| 271 | } | 274 | } |
| @@ -280,7 +283,7 @@ static int s3c_ac97_hw_mic_params(struct snd_pcm_substream *substream, | |||
| 280 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 283 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 281 | return -ENODEV; | 284 | return -ENODEV; |
| 282 | else | 285 | else |
| 283 | cpu_dai->dma_data = &s3c_ac97_mic_in; | 286 | snd_soc_dai_set_dma_data(cpu_dai, substream, &s3c_ac97_mic_in); |
| 284 | 287 | ||
| 285 | return 0; | 288 | return 0; |
| 286 | } | 289 | } |
| @@ -290,8 +293,8 @@ static int s3c_ac97_mic_trigger(struct snd_pcm_substream *substream, | |||
| 290 | { | 293 | { |
| 291 | u32 ac_glbctrl; | 294 | u32 ac_glbctrl; |
| 292 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 295 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 293 | int channel = ((struct s3c_dma_params *) | 296 | struct s3c_dma_params *dma_data = |
| 294 | rtd->dai->cpu_dai->dma_data)->channel; | 297 | snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); |
| 295 | 298 | ||
| 296 | ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); | 299 | ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); |
| 297 | ac_glbctrl &= ~S3C_AC97_GLBCTRL_MICINTM_MASK; | 300 | ac_glbctrl &= ~S3C_AC97_GLBCTRL_MICINTM_MASK; |
| @@ -311,7 +314,7 @@ static int s3c_ac97_mic_trigger(struct snd_pcm_substream *substream, | |||
| 311 | 314 | ||
| 312 | writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL); | 315 | writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL); |
| 313 | 316 | ||
| 314 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); | 317 | s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED); |
| 315 | 318 | ||
| 316 | return 0; | 319 | return 0; |
| 317 | } | 320 | } |
diff --git a/sound/soc/s3c24xx/s3c-dma.c b/sound/soc/s3c24xx/s3c-dma.c index 7725e26d6c91..1b61c23ff300 100644 --- a/sound/soc/s3c24xx/s3c-dma.c +++ b/sound/soc/s3c24xx/s3c-dma.c | |||
| @@ -145,10 +145,12 @@ static int s3c_dma_hw_params(struct snd_pcm_substream *substream, | |||
| 145 | struct snd_pcm_runtime *runtime = substream->runtime; | 145 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 146 | struct s3c24xx_runtime_data *prtd = runtime->private_data; | 146 | struct s3c24xx_runtime_data *prtd = runtime->private_data; |
| 147 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 147 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 148 | struct s3c_dma_params *dma = rtd->dai->cpu_dai->dma_data; | ||
| 149 | unsigned long totbytes = params_buffer_bytes(params); | 148 | unsigned long totbytes = params_buffer_bytes(params); |
| 149 | struct s3c_dma_params *dma = | ||
| 150 | snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); | ||
| 150 | int ret = 0; | 151 | int ret = 0; |
| 151 | 152 | ||
| 153 | |||
| 152 | pr_debug("Entered %s\n", __func__); | 154 | pr_debug("Entered %s\n", __func__); |
| 153 | 155 | ||
| 154 | /* return if this is a bufferless transfer e.g. | 156 | /* return if this is a bufferless transfer e.g. |
diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index e994d8374fe6..88515946b6c0 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c | |||
| @@ -339,14 +339,17 @@ static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 339 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 339 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 340 | struct snd_soc_dai_link *dai = rtd->dai; | 340 | struct snd_soc_dai_link *dai = rtd->dai; |
| 341 | struct s3c_i2sv2_info *i2s = to_info(dai->cpu_dai); | 341 | struct s3c_i2sv2_info *i2s = to_info(dai->cpu_dai); |
| 342 | struct s3c_dma_params *dma_data; | ||
| 342 | u32 iismod; | 343 | u32 iismod; |
| 343 | 344 | ||
| 344 | pr_debug("Entered %s\n", __func__); | 345 | pr_debug("Entered %s\n", __func__); |
| 345 | 346 | ||
| 346 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 347 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 347 | dai->cpu_dai->dma_data = i2s->dma_playback; | 348 | dma_data = i2s->dma_playback; |
| 348 | else | 349 | else |
| 349 | dai->cpu_dai->dma_data = i2s->dma_capture; | 350 | dma_data = i2s->dma_capture; |
| 351 | |||
| 352 | snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data); | ||
| 350 | 353 | ||
| 351 | /* Working copies of register */ | 354 | /* Working copies of register */ |
| 352 | iismod = readl(i2s->regs + S3C2412_IISMOD); | 355 | iismod = readl(i2s->regs + S3C2412_IISMOD); |
| @@ -394,8 +397,8 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 394 | int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); | 397 | int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); |
| 395 | unsigned long irqs; | 398 | unsigned long irqs; |
| 396 | int ret = 0; | 399 | int ret = 0; |
| 397 | int channel = ((struct s3c_dma_params *) | 400 | struct s3c_dma_params *dma_data = |
| 398 | rtd->dai->cpu_dai->dma_data)->channel; | 401 | snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); |
| 399 | 402 | ||
| 400 | pr_debug("Entered %s\n", __func__); | 403 | pr_debug("Entered %s\n", __func__); |
| 401 | 404 | ||
| @@ -431,7 +434,7 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 431 | * of the auto reload mechanism of S3C24XX. | 434 | * of the auto reload mechanism of S3C24XX. |
| 432 | * This call won't bother S3C64XX. | 435 | * This call won't bother S3C64XX. |
| 433 | */ | 436 | */ |
| 434 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); | 437 | s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED); |
| 435 | 438 | ||
| 436 | break; | 439 | break; |
| 437 | 440 | ||
diff --git a/sound/soc/s3c24xx/s3c-pcm.c b/sound/soc/s3c24xx/s3c-pcm.c index a98f40c3cd29..326f0a9e7e30 100644 --- a/sound/soc/s3c24xx/s3c-pcm.c +++ b/sound/soc/s3c24xx/s3c-pcm.c | |||
| @@ -178,6 +178,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 178 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 178 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 179 | struct snd_soc_dai_link *dai = rtd->dai; | 179 | struct snd_soc_dai_link *dai = rtd->dai; |
| 180 | struct s3c_pcm_info *pcm = to_info(dai->cpu_dai); | 180 | struct s3c_pcm_info *pcm = to_info(dai->cpu_dai); |
| 181 | struct s3c_dma_params *dma_data; | ||
| 181 | void __iomem *regs = pcm->regs; | 182 | void __iomem *regs = pcm->regs; |
| 182 | struct clk *clk; | 183 | struct clk *clk; |
| 183 | int sclk_div, sync_div; | 184 | int sclk_div, sync_div; |
| @@ -187,9 +188,11 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 187 | dev_dbg(pcm->dev, "Entered %s\n", __func__); | 188 | dev_dbg(pcm->dev, "Entered %s\n", __func__); |
| 188 | 189 | ||
| 189 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 190 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 190 | dai->cpu_dai->dma_data = pcm->dma_playback; | 191 | dma_data = pcm->dma_playback; |
| 191 | else | 192 | else |
| 192 | dai->cpu_dai->dma_data = pcm->dma_capture; | 193 | dma_data = pcm->dma_capture; |
| 194 | |||
| 195 | snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data); | ||
| 193 | 196 | ||
| 194 | /* Strictly check for sample size */ | 197 | /* Strictly check for sample size */ |
| 195 | switch (params_format(params)) { | 198 | switch (params_format(params)) { |
diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c index 0bc5950b9f02..c3ac890a3986 100644 --- a/sound/soc/s3c24xx/s3c24xx-i2s.c +++ b/sound/soc/s3c24xx/s3c24xx-i2s.c | |||
| @@ -242,14 +242,17 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 242 | struct snd_soc_dai *dai) | 242 | struct snd_soc_dai *dai) |
| 243 | { | 243 | { |
| 244 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 244 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 245 | struct s3c_dma_params *dma_data; | ||
| 245 | u32 iismod; | 246 | u32 iismod; |
| 246 | 247 | ||
| 247 | pr_debug("Entered %s\n", __func__); | 248 | pr_debug("Entered %s\n", __func__); |
| 248 | 249 | ||
| 249 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 250 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 250 | rtd->dai->cpu_dai->dma_data = &s3c24xx_i2s_pcm_stereo_out; | 251 | dma_data = &s3c24xx_i2s_pcm_stereo_out; |
| 251 | else | 252 | else |
| 252 | rtd->dai->cpu_dai->dma_data = &s3c24xx_i2s_pcm_stereo_in; | 253 | dma_data = &s3c24xx_i2s_pcm_stereo_in; |
| 254 | |||
| 255 | snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_data); | ||
| 253 | 256 | ||
| 254 | /* Working copies of register */ | 257 | /* Working copies of register */ |
| 255 | iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); | 258 | iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); |
| @@ -258,13 +261,11 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 258 | switch (params_format(params)) { | 261 | switch (params_format(params)) { |
| 259 | case SNDRV_PCM_FORMAT_S8: | 262 | case SNDRV_PCM_FORMAT_S8: |
| 260 | iismod &= ~S3C2410_IISMOD_16BIT; | 263 | iismod &= ~S3C2410_IISMOD_16BIT; |
| 261 | ((struct s3c_dma_params *) | 264 | dma_data->dma_size = 1; |
| 262 | rtd->dai->cpu_dai->dma_data)->dma_size = 1; | ||
| 263 | break; | 265 | break; |
| 264 | case SNDRV_PCM_FORMAT_S16_LE: | 266 | case SNDRV_PCM_FORMAT_S16_LE: |
| 265 | iismod |= S3C2410_IISMOD_16BIT; | 267 | iismod |= S3C2410_IISMOD_16BIT; |
| 266 | ((struct s3c_dma_params *) | 268 | dma_data->dma_size = 2; |
| 267 | rtd->dai->cpu_dai->dma_data)->dma_size = 2; | ||
| 268 | break; | 269 | break; |
| 269 | default: | 270 | default: |
| 270 | return -EINVAL; | 271 | return -EINVAL; |
| @@ -280,8 +281,8 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 280 | { | 281 | { |
| 281 | int ret = 0; | 282 | int ret = 0; |
| 282 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 283 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 283 | int channel = ((struct s3c_dma_params *) | 284 | struct s3c_dma_params *dma_data = |
| 284 | rtd->dai->cpu_dai->dma_data)->channel; | 285 | snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); |
| 285 | 286 | ||
| 286 | pr_debug("Entered %s\n", __func__); | 287 | pr_debug("Entered %s\n", __func__); |
| 287 | 288 | ||
| @@ -300,7 +301,7 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | |||
| 300 | else | 301 | else |
| 301 | s3c24xx_snd_txctrl(1); | 302 | s3c24xx_snd_txctrl(1); |
| 302 | 303 | ||
| 303 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); | 304 | s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED); |
| 304 | break; | 305 | break; |
| 305 | case SNDRV_PCM_TRIGGER_STOP: | 306 | case SNDRV_PCM_TRIGGER_STOP: |
| 306 | case SNDRV_PCM_TRIGGER_SUSPEND: | 307 | case SNDRV_PCM_TRIGGER_SUSPEND: |
diff --git a/sound/soc/s6000/s6000-i2s.c b/sound/soc/s6000/s6000-i2s.c index c5cda187ecab..fa23854c5f3a 100644 --- a/sound/soc/s6000/s6000-i2s.c +++ b/sound/soc/s6000/s6000-i2s.c | |||
| @@ -518,7 +518,8 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) | |||
| 518 | 518 | ||
| 519 | s6000_i2s_dai.dev = &pdev->dev; | 519 | s6000_i2s_dai.dev = &pdev->dev; |
| 520 | s6000_i2s_dai.private_data = dev; | 520 | s6000_i2s_dai.private_data = dev; |
| 521 | s6000_i2s_dai.dma_data = &dev->dma_params; | 521 | s6000_i2s_dai.capture.dma_data = &dev->dma_params; |
| 522 | s6000_i2s_dai.playback.dma_data = &dev->dma_params; | ||
| 522 | 523 | ||
| 523 | dev->sifbase = sifmem->start; | 524 | dev->sifbase = sifmem->start; |
| 524 | dev->scbbase = mmio; | 525 | dev->scbbase = mmio; |
diff --git a/sound/soc/s6000/s6000-pcm.c b/sound/soc/s6000/s6000-pcm.c index 1d61109e09fa..9c7f7f00cebb 100644 --- a/sound/soc/s6000/s6000-pcm.c +++ b/sound/soc/s6000/s6000-pcm.c | |||
| @@ -58,13 +58,15 @@ static void s6000_pcm_enqueue_dma(struct snd_pcm_substream *substream) | |||
| 58 | struct snd_pcm_runtime *runtime = substream->runtime; | 58 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 59 | struct s6000_runtime_data *prtd = runtime->private_data; | 59 | struct s6000_runtime_data *prtd = runtime->private_data; |
| 60 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 60 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 61 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 61 | struct s6000_pcm_dma_params *par; |
| 62 | int channel; | 62 | int channel; |
| 63 | unsigned int period_size; | 63 | unsigned int period_size; |
| 64 | unsigned int dma_offset; | 64 | unsigned int dma_offset; |
| 65 | dma_addr_t dma_pos; | 65 | dma_addr_t dma_pos; |
| 66 | dma_addr_t src, dst; | 66 | dma_addr_t src, dst; |
| 67 | 67 | ||
| 68 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 69 | |||
| 68 | period_size = snd_pcm_lib_period_bytes(substream); | 70 | period_size = snd_pcm_lib_period_bytes(substream); |
| 69 | dma_offset = prtd->period * period_size; | 71 | dma_offset = prtd->period * period_size; |
| 70 | dma_pos = runtime->dma_addr + dma_offset; | 72 | dma_pos = runtime->dma_addr + dma_offset; |
| @@ -101,7 +103,8 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data) | |||
| 101 | { | 103 | { |
| 102 | struct snd_pcm *pcm = data; | 104 | struct snd_pcm *pcm = data; |
| 103 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; | 105 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; |
| 104 | struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data; | 106 | struct s6000_pcm_dma_params *params = |
| 107 | snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 105 | struct s6000_runtime_data *prtd; | 108 | struct s6000_runtime_data *prtd; |
| 106 | unsigned int has_xrun; | 109 | unsigned int has_xrun; |
| 107 | int i, ret = IRQ_NONE; | 110 | int i, ret = IRQ_NONE; |
| @@ -172,11 +175,13 @@ static int s6000_pcm_start(struct snd_pcm_substream *substream) | |||
| 172 | { | 175 | { |
| 173 | struct s6000_runtime_data *prtd = substream->runtime->private_data; | 176 | struct s6000_runtime_data *prtd = substream->runtime->private_data; |
| 174 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 177 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 175 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 178 | struct s6000_pcm_dma_params *par; |
| 176 | unsigned long flags; | 179 | unsigned long flags; |
| 177 | int srcinc; | 180 | int srcinc; |
| 178 | u32 dma; | 181 | u32 dma; |
| 179 | 182 | ||
| 183 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 184 | |||
| 180 | spin_lock_irqsave(&prtd->lock, flags); | 185 | spin_lock_irqsave(&prtd->lock, flags); |
| 181 | 186 | ||
| 182 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 187 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| @@ -212,10 +217,12 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream) | |||
| 212 | { | 217 | { |
| 213 | struct s6000_runtime_data *prtd = substream->runtime->private_data; | 218 | struct s6000_runtime_data *prtd = substream->runtime->private_data; |
| 214 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 219 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 215 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 220 | struct s6000_pcm_dma_params *par; |
| 216 | unsigned long flags; | 221 | unsigned long flags; |
| 217 | u32 channel; | 222 | u32 channel; |
| 218 | 223 | ||
| 224 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 225 | |||
| 219 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 226 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 220 | channel = par->dma_out; | 227 | channel = par->dma_out; |
| 221 | else | 228 | else |
| @@ -236,9 +243,11 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream) | |||
| 236 | static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | 243 | static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd) |
| 237 | { | 244 | { |
| 238 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 245 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 239 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 246 | struct s6000_pcm_dma_params *par; |
| 240 | int ret; | 247 | int ret; |
| 241 | 248 | ||
| 249 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 250 | |||
| 242 | ret = par->trigger(substream, cmd, 0); | 251 | ret = par->trigger(substream, cmd, 0); |
| 243 | if (ret < 0) | 252 | if (ret < 0) |
| 244 | return ret; | 253 | return ret; |
| @@ -275,13 +284,15 @@ static int s6000_pcm_prepare(struct snd_pcm_substream *substream) | |||
| 275 | static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream) | 284 | static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream) |
| 276 | { | 285 | { |
| 277 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 286 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 278 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 287 | struct s6000_pcm_dma_params *par; |
| 279 | struct snd_pcm_runtime *runtime = substream->runtime; | 288 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 280 | struct s6000_runtime_data *prtd = runtime->private_data; | 289 | struct s6000_runtime_data *prtd = runtime->private_data; |
| 281 | unsigned long flags; | 290 | unsigned long flags; |
| 282 | unsigned int offset; | 291 | unsigned int offset; |
| 283 | dma_addr_t count; | 292 | dma_addr_t count; |
| 284 | 293 | ||
| 294 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 295 | |||
| 285 | spin_lock_irqsave(&prtd->lock, flags); | 296 | spin_lock_irqsave(&prtd->lock, flags); |
| 286 | 297 | ||
| 287 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 298 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| @@ -305,11 +316,12 @@ static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream) | |||
| 305 | static int s6000_pcm_open(struct snd_pcm_substream *substream) | 316 | static int s6000_pcm_open(struct snd_pcm_substream *substream) |
| 306 | { | 317 | { |
| 307 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 318 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 308 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 319 | struct s6000_pcm_dma_params *par; |
| 309 | struct snd_pcm_runtime *runtime = substream->runtime; | 320 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 310 | struct s6000_runtime_data *prtd; | 321 | struct s6000_runtime_data *prtd; |
| 311 | int ret; | 322 | int ret; |
| 312 | 323 | ||
| 324 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 313 | snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware); | 325 | snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware); |
| 314 | 326 | ||
| 315 | ret = snd_pcm_hw_constraint_step(runtime, 0, | 327 | ret = snd_pcm_hw_constraint_step(runtime, 0, |
| @@ -364,7 +376,7 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 364 | struct snd_pcm_hw_params *hw_params) | 376 | struct snd_pcm_hw_params *hw_params) |
| 365 | { | 377 | { |
| 366 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 378 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 367 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 379 | struct s6000_pcm_dma_params *par; |
| 368 | int ret; | 380 | int ret; |
| 369 | ret = snd_pcm_lib_malloc_pages(substream, | 381 | ret = snd_pcm_lib_malloc_pages(substream, |
| 370 | params_buffer_bytes(hw_params)); | 382 | params_buffer_bytes(hw_params)); |
| @@ -373,6 +385,8 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 373 | return ret; | 385 | return ret; |
| 374 | } | 386 | } |
| 375 | 387 | ||
| 388 | par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 389 | |||
| 376 | if (par->same_rate) { | 390 | if (par->same_rate) { |
| 377 | spin_lock(&par->lock); | 391 | spin_lock(&par->lock); |
| 378 | if (par->rate == -1 || | 392 | if (par->rate == -1 || |
| @@ -392,7 +406,8 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 392 | static int s6000_pcm_hw_free(struct snd_pcm_substream *substream) | 406 | static int s6000_pcm_hw_free(struct snd_pcm_substream *substream) |
| 393 | { | 407 | { |
| 394 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; | 408 | struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; |
| 395 | struct s6000_pcm_dma_params *par = soc_runtime->dai->cpu_dai->dma_data; | 409 | struct s6000_pcm_dma_params *par = |
| 410 | snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 396 | 411 | ||
| 397 | spin_lock(&par->lock); | 412 | spin_lock(&par->lock); |
| 398 | par->in_use &= ~(1 << substream->stream); | 413 | par->in_use &= ~(1 << substream->stream); |
| @@ -417,7 +432,8 @@ static struct snd_pcm_ops s6000_pcm_ops = { | |||
| 417 | static void s6000_pcm_free(struct snd_pcm *pcm) | 432 | static void s6000_pcm_free(struct snd_pcm *pcm) |
| 418 | { | 433 | { |
| 419 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; | 434 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; |
| 420 | struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data; | 435 | struct s6000_pcm_dma_params *params = |
| 436 | snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 421 | 437 | ||
| 422 | free_irq(params->irq, pcm); | 438 | free_irq(params->irq, pcm); |
| 423 | snd_pcm_lib_preallocate_free_for_all(pcm); | 439 | snd_pcm_lib_preallocate_free_for_all(pcm); |
| @@ -429,9 +445,11 @@ static int s6000_pcm_new(struct snd_card *card, | |||
| 429 | struct snd_soc_dai *dai, struct snd_pcm *pcm) | 445 | struct snd_soc_dai *dai, struct snd_pcm *pcm) |
| 430 | { | 446 | { |
| 431 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; | 447 | struct snd_soc_pcm_runtime *runtime = pcm->private_data; |
| 432 | struct s6000_pcm_dma_params *params = runtime->dai->cpu_dai->dma_data; | 448 | struct s6000_pcm_dma_params *params; |
| 433 | int res; | 449 | int res; |
| 434 | 450 | ||
| 451 | params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); | ||
| 452 | |||
| 435 | if (!card->dev->dma_mask) | 453 | if (!card->dev->dma_mask) |
| 436 | card->dev->dma_mask = &s6000_pcm_dmamask; | 454 | card->dev->dma_mask = &s6000_pcm_dmamask; |
| 437 | if (!card->dev->coherent_dma_mask) | 455 | if (!card->dev->coherent_dma_mask) |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index c8b0556ef431..d0efd5eaaa0b 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -1548,7 +1548,8 @@ int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid) | |||
| 1548 | mutex_unlock(&codec->mutex); | 1548 | mutex_unlock(&codec->mutex); |
| 1549 | return ret; | 1549 | return ret; |
| 1550 | } | 1550 | } |
| 1551 | if (card->dai_link[i].codec_dai->ac97_control) { | 1551 | /* Check for codec->ac97 to handle the ac97.c fun */ |
| 1552 | if (card->dai_link[i].codec_dai->ac97_control && codec->ac97) { | ||
| 1552 | snd_ac97_dev_add_pdata(codec->ac97, | 1553 | snd_ac97_dev_add_pdata(codec->ac97, |
| 1553 | card->dai_link[i].cpu_dai->ac97_pdata); | 1554 | card->dai_link[i].cpu_dai->ac97_pdata); |
| 1554 | } | 1555 | } |
