diff options
| -rw-r--r-- | arch/arm/mach-davinci/board-da850-evm.c | 24 | ||||
| -rw-r--r-- | include/linux/platform_data/davinci_asp.h | 4 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-evm.c | 5 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 152 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.h | 15 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-pcm.c | 53 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-pcm.h | 2 |
7 files changed, 158 insertions, 97 deletions
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 32ee3f89596..d9bc3fa7bb2 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
| @@ -762,16 +762,19 @@ static u8 da850_iis_serializer_direction[] = { | |||
| 762 | }; | 762 | }; |
| 763 | 763 | ||
| 764 | static struct snd_platform_data da850_evm_snd_data = { | 764 | static struct snd_platform_data da850_evm_snd_data = { |
| 765 | .tx_dma_offset = 0x2000, | 765 | .tx_dma_offset = 0x2000, |
| 766 | .rx_dma_offset = 0x2000, | 766 | .rx_dma_offset = 0x2000, |
| 767 | .op_mode = DAVINCI_MCASP_IIS_MODE, | 767 | .op_mode = DAVINCI_MCASP_IIS_MODE, |
| 768 | .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction), | 768 | .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction), |
| 769 | .tdm_slots = 2, | 769 | .tdm_slots = 2, |
| 770 | .serial_dir = da850_iis_serializer_direction, | 770 | .serial_dir = da850_iis_serializer_direction, |
| 771 | .asp_chan_q = EVENTQ_0, | 771 | .asp_chan_q = EVENTQ_0, |
| 772 | .version = MCASP_VERSION_2, | 772 | .ram_chan_q = EVENTQ_1, |
| 773 | .txnumevt = 1, | 773 | .version = MCASP_VERSION_2, |
| 774 | .rxnumevt = 1, | 774 | .txnumevt = 1, |
| 775 | .rxnumevt = 1, | ||
| 776 | .sram_size_playback = SZ_8K, | ||
| 777 | .sram_size_capture = SZ_8K, | ||
| 775 | }; | 778 | }; |
| 776 | 779 | ||
| 777 | static const short da850_evm_mcasp_pins[] __initconst = { | 780 | static const short da850_evm_mcasp_pins[] __initconst = { |
| @@ -1509,6 +1512,7 @@ static __init void da850_evm_init(void) | |||
| 1509 | pr_warning("da850_evm_init: mcasp mux setup failed: %d\n", | 1512 | pr_warning("da850_evm_init: mcasp mux setup failed: %d\n", |
| 1510 | ret); | 1513 | ret); |
| 1511 | 1514 | ||
| 1515 | da850_evm_snd_data.sram_pool = sram_get_gen_pool(); | ||
| 1512 | da8xx_register_mcasp(0, &da850_evm_snd_data); | 1516 | da8xx_register_mcasp(0, &da850_evm_snd_data); |
| 1513 | 1517 | ||
| 1514 | ret = davinci_cfg_reg_list(da850_lcdcntl_pins); | 1518 | ret = davinci_cfg_reg_list(da850_lcdcntl_pins); |
diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/platform_data/davinci_asp.h index d0c5825876f..8db5ae03b6e 100644 --- a/include/linux/platform_data/davinci_asp.h +++ b/include/linux/platform_data/davinci_asp.h | |||
| @@ -16,12 +16,13 @@ | |||
| 16 | #ifndef __DAVINCI_ASP_H | 16 | #ifndef __DAVINCI_ASP_H |
| 17 | #define __DAVINCI_ASP_H | 17 | #define __DAVINCI_ASP_H |
| 18 | 18 | ||
| 19 | #include <linux/genalloc.h> | ||
| 20 | |||
| 19 | struct snd_platform_data { | 21 | struct snd_platform_data { |
| 20 | u32 tx_dma_offset; | 22 | u32 tx_dma_offset; |
| 21 | u32 rx_dma_offset; | 23 | u32 rx_dma_offset; |
| 22 | int asp_chan_q; /* event queue number for ASP channel */ | 24 | int asp_chan_q; /* event queue number for ASP channel */ |
| 23 | int ram_chan_q; /* event queue number for RAM channel */ | 25 | int ram_chan_q; /* event queue number for RAM channel */ |
| 24 | unsigned int codec_fmt; | ||
| 25 | /* | 26 | /* |
| 26 | * Allowing this is more efficient and eliminates left and right swaps | 27 | * Allowing this is more efficient and eliminates left and right swaps |
| 27 | * caused by underruns, but will swap the left and right channels | 28 | * caused by underruns, but will swap the left and right channels |
| @@ -30,6 +31,7 @@ struct snd_platform_data { | |||
| 30 | unsigned enable_channel_combine:1; | 31 | unsigned enable_channel_combine:1; |
| 31 | unsigned sram_size_playback; | 32 | unsigned sram_size_playback; |
| 32 | unsigned sram_size_capture; | 33 | unsigned sram_size_capture; |
| 34 | struct gen_pool *sram_pool; | ||
| 33 | 35 | ||
| 34 | /* | 36 | /* |
| 35 | * If McBSP peripheral gets the clock from an external pin, | 37 | * If McBSP peripheral gets the clock from an external pin, |
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 6fac5af1329..d55e6477bff 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c | |||
| @@ -71,6 +71,11 @@ static int evm_hw_params(struct snd_pcm_substream *substream, | |||
| 71 | if (ret < 0) | 71 | if (ret < 0) |
| 72 | return ret; | 72 | return ret; |
| 73 | 73 | ||
| 74 | /* set the CPU system clock */ | ||
| 75 | ret = snd_soc_dai_set_sysclk(cpu_dai, 0, sysclk, SND_SOC_CLOCK_OUT); | ||
| 76 | if (ret < 0) | ||
| 77 | return ret; | ||
| 78 | |||
| 74 | return 0; | 79 | return 0; |
| 75 | } | 80 | } |
| 76 | 81 | ||
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 714e51e5be5..55e2bf652be 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -199,6 +199,7 @@ | |||
| 199 | #define ACLKXE BIT(5) | 199 | #define ACLKXE BIT(5) |
| 200 | #define TX_ASYNC BIT(6) | 200 | #define TX_ASYNC BIT(6) |
| 201 | #define ACLKXPOL BIT(7) | 201 | #define ACLKXPOL BIT(7) |
| 202 | #define ACLKXDIV_MASK 0x1f | ||
| 202 | 203 | ||
| 203 | /* | 204 | /* |
| 204 | * DAVINCI_MCASP_ACLKRCTL_REG Receive Clock Control Register Bits | 205 | * DAVINCI_MCASP_ACLKRCTL_REG Receive Clock Control Register Bits |
| @@ -207,6 +208,7 @@ | |||
| 207 | #define ACLKRE BIT(5) | 208 | #define ACLKRE BIT(5) |
| 208 | #define RX_ASYNC BIT(6) | 209 | #define RX_ASYNC BIT(6) |
| 209 | #define ACLKRPOL BIT(7) | 210 | #define ACLKRPOL BIT(7) |
| 211 | #define ACLKRDIV_MASK 0x1f | ||
| 210 | 212 | ||
| 211 | /* | 213 | /* |
| 212 | * DAVINCI_MCASP_AHCLKXCTL_REG - High Frequency Transmit Clock Control | 214 | * DAVINCI_MCASP_AHCLKXCTL_REG - High Frequency Transmit Clock Control |
| @@ -215,6 +217,7 @@ | |||
| 215 | #define AHCLKXDIV(val) (val) | 217 | #define AHCLKXDIV(val) (val) |
| 216 | #define AHCLKXPOL BIT(14) | 218 | #define AHCLKXPOL BIT(14) |
| 217 | #define AHCLKXE BIT(15) | 219 | #define AHCLKXE BIT(15) |
| 220 | #define AHCLKXDIV_MASK 0xfff | ||
| 218 | 221 | ||
| 219 | /* | 222 | /* |
| 220 | * DAVINCI_MCASP_AHCLKRCTL_REG - High Frequency Receive Clock Control | 223 | * DAVINCI_MCASP_AHCLKRCTL_REG - High Frequency Receive Clock Control |
| @@ -223,6 +226,7 @@ | |||
| 223 | #define AHCLKRDIV(val) (val) | 226 | #define AHCLKRDIV(val) (val) |
| 224 | #define AHCLKRPOL BIT(14) | 227 | #define AHCLKRPOL BIT(14) |
| 225 | #define AHCLKRE BIT(15) | 228 | #define AHCLKRE BIT(15) |
| 229 | #define AHCLKRDIV_MASK 0xfff | ||
| 226 | 230 | ||
| 227 | /* | 231 | /* |
| 228 | * DAVINCI_MCASP_XRSRCTL_BASE_REG - Serializer Control Register Bits | 232 | * DAVINCI_MCASP_XRSRCTL_BASE_REG - Serializer Control Register Bits |
| @@ -473,6 +477,23 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 473 | struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); | 477 | struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); |
| 474 | void __iomem *base = dev->base; | 478 | void __iomem *base = dev->base; |
| 475 | 479 | ||
| 480 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | ||
| 481 | case SND_SOC_DAIFMT_DSP_B: | ||
| 482 | case SND_SOC_DAIFMT_AC97: | ||
| 483 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR); | ||
| 484 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR); | ||
| 485 | break; | ||
| 486 | default: | ||
| 487 | /* configure a full-word SYNC pulse (LRCLK) */ | ||
| 488 | mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR); | ||
| 489 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR); | ||
| 490 | |||
| 491 | /* make 1st data bit occur one ACLK cycle after the frame sync */ | ||
| 492 | mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, FSXDLY(1)); | ||
| 493 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RXFMT_REG, FSRDLY(1)); | ||
| 494 | break; | ||
| 495 | } | ||
| 496 | |||
| 476 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 497 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
| 477 | case SND_SOC_DAIFMT_CBS_CFS: | 498 | case SND_SOC_DAIFMT_CBS_CFS: |
| 478 | /* codec is clock and frame slave */ | 499 | /* codec is clock and frame slave */ |
| @@ -482,8 +503,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 482 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); | 503 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); |
| 483 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); | 504 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); |
| 484 | 505 | ||
| 485 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, | 506 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, ACLKX | AFSX); |
| 486 | ACLKX | AHCLKX | AFSX); | ||
| 487 | break; | 507 | break; |
| 488 | case SND_SOC_DAIFMT_CBM_CFS: | 508 | case SND_SOC_DAIFMT_CBM_CFS: |
| 489 | /* codec is clock master and frame slave */ | 509 | /* codec is clock master and frame slave */ |
| @@ -554,59 +574,75 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 554 | return 0; | 574 | return 0; |
| 555 | } | 575 | } |
| 556 | 576 | ||
| 557 | static int davinci_config_channel_size(struct davinci_audio_dev *dev, | 577 | static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) |
| 558 | int channel_size) | ||
| 559 | { | 578 | { |
| 560 | u32 fmt = 0; | 579 | struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai); |
| 561 | u32 mask, rotate; | ||
| 562 | |||
| 563 | switch (channel_size) { | ||
| 564 | case DAVINCI_AUDIO_WORD_8: | ||
| 565 | fmt = 0x03; | ||
| 566 | rotate = 6; | ||
| 567 | mask = 0x000000ff; | ||
| 568 | break; | ||
| 569 | 580 | ||
| 570 | case DAVINCI_AUDIO_WORD_12: | 581 | switch (div_id) { |
| 571 | fmt = 0x05; | 582 | case 0: /* MCLK divider */ |
| 572 | rotate = 5; | ||
