diff options
author | Hebbar, Gururaja <gururaja.hebbar@ti.com> | 2012-09-03 04:10:40 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-09-05 20:20:33 -0400 |
commit | e5ec69da24803c68f5c035662a68d367359a4132 (patch) | |
tree | 4d9986ae6f6f0ce4b9c32c316317696463f86c52 /sound/soc | |
parent | 85da89f562579b001831b71d49946bfa0a93529d (diff) |
ASoC: Davinci: McASP: add support new McASP IP Variant
The OMAP2+ variant of McASP is different from Davinci variant w.r.to
some register offset.
Changes
- Add new MCASP_VERSION_3 to identify new variant. New DT compatible
"ti,omap2-mcasp-audio" to identify version 3 controller.
- The register offsets are handled depending on the version.
Note:
DMA parameters (dma fifo offset) are not updated and will be done later.
Signed-off-by: Hebbar, Gururaja <gururaja.hebbar@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 86 |
1 files changed, 73 insertions, 13 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index c3eae1d8e077..714e51e5be5b 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -111,6 +111,10 @@ | |||
111 | #define DAVINCI_MCASP_WFIFOSTS (0x1014) | 111 | #define DAVINCI_MCASP_WFIFOSTS (0x1014) |
112 | #define DAVINCI_MCASP_RFIFOCTL (0x1018) | 112 | #define DAVINCI_MCASP_RFIFOCTL (0x1018) |
113 | #define DAVINCI_MCASP_RFIFOSTS (0x101C) | 113 | #define DAVINCI_MCASP_RFIFOSTS (0x101C) |
114 | #define MCASP_VER3_WFIFOCTL (0x1000) | ||
115 | #define MCASP_VER3_WFIFOSTS (0x1004) | ||
116 | #define MCASP_VER3_RFIFOCTL (0x1008) | ||
117 | #define MCASP_VER3_RFIFOSTS (0x100C) | ||
114 | 118 | ||
115 | /* | 119 | /* |
116 | * DAVINCI_MCASP_PWREMUMGT_REG - Power Down and Emulation Management | 120 | * DAVINCI_MCASP_PWREMUMGT_REG - Power Down and Emulation Management |
@@ -384,18 +388,36 @@ static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) | |||
384 | { | 388 | { |
385 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | 389 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
386 | if (dev->txnumevt) { /* enable FIFO */ | 390 | if (dev->txnumevt) { /* enable FIFO */ |
387 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | 391 | switch (dev->version) { |
392 | case MCASP_VERSION_3: | ||
393 | mcasp_clr_bits(dev->base + MCASP_VER3_WFIFOCTL, | ||
388 | FIFO_ENABLE); | 394 | FIFO_ENABLE); |
389 | mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | 395 | mcasp_set_bits(dev->base + MCASP_VER3_WFIFOCTL, |
390 | FIFO_ENABLE); | 396 | FIFO_ENABLE); |
397 | break; | ||
398 | default: | ||
399 | mcasp_clr_bits(dev->base + | ||
400 | DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
401 | mcasp_set_bits(dev->base + | ||
402 | DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
403 | } | ||
391 | } | 404 | } |
392 | mcasp_start_tx(dev); | 405 | mcasp_start_tx(dev); |
393 | } else { | 406 | } else { |
394 | if (dev->rxnumevt) { /* enable FIFO */ | 407 | if (dev->rxnumevt) { /* enable FIFO */ |
395 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | 408 | switch (dev->version) { |
409 | case MCASP_VERSION_3: | ||
410 | mcasp_clr_bits(dev->base + MCASP_VER3_RFIFOCTL, | ||
396 | FIFO_ENABLE); | 411 | FIFO_ENABLE); |
397 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | 412 | mcasp_set_bits(dev->base + MCASP_VER3_RFIFOCTL, |
398 | FIFO_ENABLE); | 413 | FIFO_ENABLE); |
414 | break; | ||
415 | default: | ||
416 | mcasp_clr_bits(dev->base + | ||
417 | DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
418 | mcasp_set_bits(dev->base + | ||
419 | DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
420 | } | ||
399 | } | 421 | } |
400 | mcasp_start_rx(dev); | 422 | mcasp_start_rx(dev); |
401 | } | 423 | } |
@@ -416,14 +438,31 @@ static void mcasp_stop_tx(struct davinci_audio_dev *dev) | |||
416 | static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) | 438 | static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) |
417 | { | 439 | { |
418 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | 440 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
419 | if (dev->txnumevt) /* disable FIFO */ | 441 | if (dev->txnumevt) { /* disable FIFO */ |
420 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | 442 | switch (dev->version) { |
443 | case MCASP_VERSION_3: | ||
444 | mcasp_clr_bits(dev->base + MCASP_VER3_WFIFOCTL, | ||
421 | FIFO_ENABLE); | 445 | FIFO_ENABLE); |
446 | break; | ||
447 | default: | ||
448 | mcasp_clr_bits(dev->base + | ||
449 | DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
450 | } | ||
451 | } | ||
422 | mcasp_stop_tx(dev); | 452 | mcasp_stop_tx(dev); |
423 | } else { | 453 | } else { |
424 | if (dev->rxnumevt) /* disable FIFO */ | 454 | if (dev->rxnumevt) { /* disable FIFO */ |
425 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | 455 | switch (dev->version) { |
456 | case MCASP_VERSION_3: | ||
457 | mcasp_clr_bits(dev->base + MCASP_VER3_RFIFOCTL, | ||
426 | FIFO_ENABLE); | 458 | FIFO_ENABLE); |
459 | break; | ||
460 | |||
461 | default: | ||
462 | mcasp_clr_bits(dev->base + | ||
463 | DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
464 | } | ||
465 | } | ||
427 | mcasp_stop_rx(dev); | 466 | mcasp_stop_rx(dev); |
428 | } | 467 | } |
429 | } | 468 | } |
@@ -622,20 +661,37 @@ static void davinci_hw_common_param(struct davinci_audio_dev *dev, int stream) | |||
622 | if (dev->txnumevt * tx_ser > 64) | 661 | if (dev->txnumevt * tx_ser > 64) |
623 | dev->txnumevt = 1; | 662 | dev->txnumevt = 1; |
624 | 663 | ||
625 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, tx_ser, | 664 | switch (dev->version) { |
665 | case MCASP_VERSION_3: | ||
666 | mcasp_mod_bits(dev->base + MCASP_VER3_WFIFOCTL, tx_ser, | ||
626 | NUMDMA_MASK); | 667 | NUMDMA_MASK); |
627 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | 668 | mcasp_mod_bits(dev->base + MCASP_VER3_WFIFOCTL, |
628 | ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK); | 669 | ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK); |
670 | break; | ||
671 | default: | ||
672 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | ||
673 | tx_ser, NUMDMA_MASK); | ||
674 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | ||
675 | ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK); | ||
676 | } | ||
629 | } | 677 | } |
630 | 678 | ||
631 | if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { | 679 | if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { |
632 | if (dev->rxnumevt * rx_ser > 64) | 680 | if (dev->rxnumevt * rx_ser > 64) |
633 | dev->rxnumevt = 1; | 681 | dev->rxnumevt = 1; |
634 | 682 | switch (dev->version) { | |
635 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, rx_ser, | 683 | case MCASP_VERSION_3: |
684 | mcasp_mod_bits(dev->base + MCASP_VER3_RFIFOCTL, rx_ser, | ||
636 | NUMDMA_MASK); | 685 | NUMDMA_MASK); |
637 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | 686 | mcasp_mod_bits(dev->base + MCASP_VER3_RFIFOCTL, |
687 | ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK); | ||
688 | break; | ||
689 | default: | ||
690 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | ||
691 | rx_ser, NUMDMA_MASK); | ||
692 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | ||
638 | ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK); | 693 | ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK); |
694 | } | ||
639 | } | 695 | } |
640 | } | 696 | } |
641 | 697 | ||
@@ -874,6 +930,10 @@ static const struct of_device_id mcasp_dt_ids[] = { | |||
874 | .compatible = "ti,da830-mcasp-audio", | 930 | .compatible = "ti,da830-mcasp-audio", |
875 | .data = (void *)MCASP_VERSION_2, | 931 | .data = (void *)MCASP_VERSION_2, |
876 | }, | 932 | }, |
933 | { | ||
934 | .compatible = "ti,omap2-mcasp-audio", | ||
935 | .data = (void *)MCASP_VERSION_3, | ||
936 | }, | ||
877 | { /* sentinel */ } | 937 | { /* sentinel */ } |
878 | }; | 938 | }; |
879 | MODULE_DEVICE_TABLE(of, mcasp_dt_ids); | 939 | MODULE_DEVICE_TABLE(of, mcasp_dt_ids); |