diff options
Diffstat (limited to 'sound/soc/au1x/psc-ac97.c')
-rw-r--r-- | sound/soc/au1x/psc-ac97.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index d0db66f24a00..172eefd38b2d 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c | |||
@@ -41,14 +41,14 @@ | |||
41 | (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3BE) | 41 | (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3BE) |
42 | 42 | ||
43 | #define AC97PCR_START(stype) \ | 43 | #define AC97PCR_START(stype) \ |
44 | ((stype) == PCM_TX ? PSC_AC97PCR_TS : PSC_AC97PCR_RS) | 44 | ((stype) == SNDRV_PCM_STREAM_PLAYBACK ? PSC_AC97PCR_TS : PSC_AC97PCR_RS) |
45 | #define AC97PCR_STOP(stype) \ | 45 | #define AC97PCR_STOP(stype) \ |
46 | ((stype) == PCM_TX ? PSC_AC97PCR_TP : PSC_AC97PCR_RP) | 46 | ((stype) == SNDRV_PCM_STREAM_PLAYBACK ? PSC_AC97PCR_TP : PSC_AC97PCR_RP) |
47 | #define AC97PCR_CLRFIFO(stype) \ | 47 | #define AC97PCR_CLRFIFO(stype) \ |
48 | ((stype) == PCM_TX ? PSC_AC97PCR_TC : PSC_AC97PCR_RC) | 48 | ((stype) == SNDRV_PCM_STREAM_PLAYBACK ? PSC_AC97PCR_TC : PSC_AC97PCR_RC) |
49 | 49 | ||
50 | #define AC97STAT_BUSY(stype) \ | 50 | #define AC97STAT_BUSY(stype) \ |
51 | ((stype) == PCM_TX ? PSC_AC97STAT_TB : PSC_AC97STAT_RB) | 51 | ((stype) == SNDRV_PCM_STREAM_PLAYBACK ? PSC_AC97STAT_TB : PSC_AC97STAT_RB) |
52 | 52 | ||
53 | /* instance data. There can be only one, MacLeod!!!! */ | 53 | /* instance data. There can be only one, MacLeod!!!! */ |
54 | static struct au1xpsc_audio_data *au1xpsc_ac97_workdata; | 54 | static struct au1xpsc_audio_data *au1xpsc_ac97_workdata; |
@@ -215,7 +215,7 @@ static int au1xpsc_ac97_hw_params(struct snd_pcm_substream *substream, | |||
215 | { | 215 | { |
216 | struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); | 216 | struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); |
217 | unsigned long r, ro, stat; | 217 | unsigned long r, ro, stat; |
218 | int chans, t, stype = SUBSTREAM_TYPE(substream); | 218 | int chans, t, stype = substream->stream; |
219 | 219 | ||
220 | chans = params_channels(params); | 220 | chans = params_channels(params); |
221 | 221 | ||
@@ -235,7 +235,7 @@ static int au1xpsc_ac97_hw_params(struct snd_pcm_substream *substream, | |||
235 | r |= PSC_AC97CFG_SET_LEN(params->msbits); | 235 | r |= PSC_AC97CFG_SET_LEN(params->msbits); |
236 | 236 | ||
237 | /* channels: enable slots for front L/R channel */ | 237 | /* channels: enable slots for front L/R channel */ |
238 | if (stype == PCM_TX) { | 238 | if (stype == SNDRV_PCM_STREAM_PLAYBACK) { |
239 | r &= ~PSC_AC97CFG_TXSLOT_MASK; | 239 | r &= ~PSC_AC97CFG_TXSLOT_MASK; |
240 | r |= PSC_AC97CFG_TXSLOT_ENA(3); | 240 | r |= PSC_AC97CFG_TXSLOT_ENA(3); |
241 | r |= PSC_AC97CFG_TXSLOT_ENA(4); | 241 | r |= PSC_AC97CFG_TXSLOT_ENA(4); |
@@ -294,7 +294,7 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, | |||
294 | int cmd, struct snd_soc_dai *dai) | 294 | int cmd, struct snd_soc_dai *dai) |
295 | { | 295 | { |
296 | struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); | 296 | struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); |
297 | int ret, stype = SUBSTREAM_TYPE(substream); | 297 | int ret, stype = substream->stream; |
298 | 298 | ||
299 | ret = 0; | 299 | ret = 0; |
300 | 300 | ||
@@ -324,12 +324,21 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, | |||
324 | return ret; | 324 | return ret; |
325 | } | 325 | } |
326 | 326 | ||
327 | static int au1xpsc_ac97_startup(struct snd_pcm_substream *substream, | ||
328 | struct snd_soc_dai *dai) | ||
329 | { | ||
330 | struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); | ||
331 | snd_soc_dai_set_dma_data(dai, substream, &pscdata->dmaids[0]); | ||
332 | return 0; | ||
333 | } | ||
334 | |||
327 | static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) | 335 | static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) |
328 | { | 336 | { |
329 | return au1xpsc_ac97_workdata ? 0 : -ENODEV; | 337 | return au1xpsc_ac97_workdata ? 0 : -ENODEV; |
330 | } | 338 | } |
331 | 339 | ||
332 | static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { | 340 | static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { |
341 | .startup = au1xpsc_ac97_startup, | ||
333 | .trigger = au1xpsc_ac97_trigger, | 342 | .trigger = au1xpsc_ac97_trigger, |
334 | .hw_params = au1xpsc_ac97_hw_params, | 343 | .hw_params = au1xpsc_ac97_hw_params, |
335 | }; | 344 | }; |
@@ -379,6 +388,16 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) | |||
379 | if (!wd->mmio) | 388 | if (!wd->mmio) |
380 | goto out1; | 389 | goto out1; |
381 | 390 | ||
391 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
392 | if (!r) | ||
393 | goto out2; | ||
394 | wd->dmaids[SNDRV_PCM_STREAM_PLAYBACK] = r->start; | ||
395 | |||
396 | r = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
397 | if (!r) | ||
398 | goto out2; | ||
399 | wd->dmaids[SNDRV_PCM_STREAM_CAPTURE] = r->start; | ||
400 | |||
382 | /* configuration: max dma trigger threshold, enable ac97 */ | 401 | /* configuration: max dma trigger threshold, enable ac97 */ |
383 | wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | | 402 | wd->cfg = PSC_AC97CFG_RT_FIFO8 | PSC_AC97CFG_TT_FIFO8 | |
384 | PSC_AC97CFG_DE_ENABLE; | 403 | PSC_AC97CFG_DE_ENABLE; |
@@ -401,15 +420,13 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) | |||
401 | 420 | ||
402 | ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); | 421 | ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); |
403 | if (ret) | 422 | if (ret) |
404 | goto out1; | 423 | goto out2; |
405 | 424 | ||
406 | wd->dmapd = au1xpsc_pcm_add(pdev); | 425 | au1xpsc_ac97_workdata = wd; |
407 | if (wd->dmapd) { | 426 | return 0; |
408 | au1xpsc_ac97_workdata = wd; | ||
409 | return 0; | ||
410 | } | ||
411 | 427 | ||
412 | snd_soc_unregister_dai(&pdev->dev); | 428 | out2: |
429 | iounmap(wd->mmio); | ||
413 | out1: | 430 | out1: |
414 | release_mem_region(r->start, resource_size(r)); | 431 | release_mem_region(r->start, resource_size(r)); |
415 | out0: | 432 | out0: |
@@ -422,9 +439,6 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) | |||
422 | struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); | 439 | struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); |
423 | struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 440 | struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
424 | 441 | ||
425 | if (wd->dmapd) | ||
426 | au1xpsc_pcm_destroy(wd->dmapd); | ||
427 | |||
428 | snd_soc_unregister_dai(&pdev->dev); | 442 | snd_soc_unregister_dai(&pdev->dev); |
429 | 443 | ||
430 | /* disable PSC completely */ | 444 | /* disable PSC completely */ |