aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/davinci/davinci-mcasp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
-rw-r--r--sound/soc/davinci/davinci-mcasp.c91
1 files changed, 56 insertions, 35 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index b24720894af6..8566238db2a5 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -422,7 +422,7 @@ static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream)
422static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, 422static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
423 unsigned int fmt) 423 unsigned int fmt)
424{ 424{
425 struct davinci_audio_dev *dev = cpu_dai->private_data; 425 struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
426 void __iomem *base = dev->base; 426 void __iomem *base = dev->base;
427 427
428 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 428 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
@@ -434,17 +434,21 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
434 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 434 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
435 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 435 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
436 436
437 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x7 << 26)); 437 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
438 ACLKX | AHCLKX | AFSX);
438 break; 439 break;
439 case SND_SOC_DAIFMT_CBM_CFS: 440 case SND_SOC_DAIFMT_CBM_CFS:
440 /* codec is clock master and frame slave */ 441 /* codec is clock master and frame slave */
441 mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); 442 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
442 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE); 443 mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
443 444
444 mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 445 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
445 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 446 mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
446 447
447 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x2d << 26)); 448 mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
449 ACLKX | ACLKR);
450 mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
451 AFSX | AFSR);
448 break; 452 break;
449 case SND_SOC_DAIFMT_CBM_CFM: 453 case SND_SOC_DAIFMT_CBM_CFM:
450 /* codec is clock and frame master */ 454 /* codec is clock and frame master */
@@ -454,7 +458,8 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
454 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); 458 mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
455 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); 459 mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
456 460
457 mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, (0x3f << 26)); 461 mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
462 ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
458 break; 463 break;
459 464
460 default: 465 default:
@@ -644,7 +649,7 @@ static void davinci_hw_param(struct davinci_audio_dev *dev, int stream)
644 mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask); 649 mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask);
645 mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD); 650 mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD);
646 651
647 if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) 652 if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32))
648 mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, 653 mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG,
649 FSXMOD(dev->tdm_slots), FSXMOD(0x1FF)); 654 FSXMOD(dev->tdm_slots), FSXMOD(0x1FF));
650 else 655 else
@@ -660,7 +665,7 @@ static void davinci_hw_param(struct davinci_audio_dev *dev, int stream)
660 AHCLKRE); 665 AHCLKRE);
661 mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask); 666 mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask);
662 667
663 if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) 668 if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32))
664 mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, 669 mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG,
665 FSRMOD(dev->tdm_slots), FSRMOD(0x1FF)); 670 FSRMOD(dev->tdm_slots), FSRMOD(0x1FF));
666 else 671 else
@@ -709,7 +714,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
709 struct snd_pcm_hw_params *params, 714 struct snd_pcm_hw_params *params,
710 struct snd_soc_dai *cpu_dai) 715 struct snd_soc_dai *cpu_dai)
711{ 716{
712 struct davinci_audio_dev *dev = cpu_dai->private_data; 717 struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
713 struct davinci_pcm_dma_params *dma_params = 718 struct davinci_pcm_dma_params *dma_params =
714 &dev->dma_params[substream->stream]; 719 &dev->dma_params[substream->stream];
715 int word_length; 720 int word_length;
@@ -761,8 +766,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
761static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, 766static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
762 int cmd, struct snd_soc_dai *cpu_dai) 767 int cmd, struct snd_soc_dai *cpu_dai)
763{ 768{
764 struct snd_soc_pcm_runtime *rtd = substream->private_data; 769 struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
765 struct davinci_audio_dev *dev = rtd->dai->cpu_dai->private_data;
766 int ret = 0; 770 int ret = 0;
767 771
768 switch (cmd) { 772 switch (cmd) {
@@ -797,17 +801,26 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
797 return ret; 801 return ret;
798} 802}
799 803
804static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
805 struct snd_soc_dai *dai)
806{
807 struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai);
808
809 snd_soc_dai_set_dma_data(dai, substream, dev->dma_params);
810 return 0;
811}
812
800static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { 813static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
814 .startup = davinci_mcasp_startup,
801 .trigger = davinci_mcasp_trigger, 815 .trigger = davinci_mcasp_trigger,
802 .hw_params = davinci_mcasp_hw_params, 816 .hw_params = davinci_mcasp_hw_params,
803 .set_fmt = davinci_mcasp_set_dai_fmt, 817 .set_fmt = davinci_mcasp_set_dai_fmt,
804 818
805}; 819};
806 820
807struct snd_soc_dai davinci_mcasp_dai[] = { 821static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
808 { 822 {
809 .name = "davinci-i2s", 823 .name = "davinci-mcasp.0",
810 .id = 0,
811 .playback = { 824 .playback = {
812 .channels_min = 2, 825 .channels_min = 2,
813 .channels_max = 2, 826 .channels_max = 2,
@@ -828,8 +841,7 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
828 841
829 }, 842 },
830 { 843 {
831 .name = "davinci-dit", 844 "davinci-mcasp.1",
832 .id = 1,
833 .playback = { 845 .playback = {
834 .channels_min = 1, 846 .channels_min = 1,
835 .channels_max = 384, 847 .channels_max = 384,
@@ -840,7 +852,6 @@ struct snd_soc_dai davinci_mcasp_dai[] = {
840 }, 852 },
841 853
842}; 854};
843EXPORT_SYMBOL_GPL(davinci_mcasp_dai);
844 855
845static int davinci_mcasp_probe(struct platform_device *pdev) 856static int davinci_mcasp_probe(struct platform_device *pdev)
846{ 857{
@@ -862,7 +873,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
862 } 873 }
863 874
864 ioarea = request_mem_region(mem->start, 875 ioarea = request_mem_region(mem->start,
865 (mem->end - mem->start) + 1, pdev->name); 876 resource_size(mem), pdev->name);
866 if (!ioarea) { 877 if (!ioarea) {
867 dev_err(&pdev->dev, "Audio region already claimed\n"); 878 dev_err(&pdev->dev, "Audio region already claimed\n");
868 ret = -EBUSY; 879 ret = -EBUSY;
@@ -879,7 +890,13 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
879 clk_enable(dev->clk); 890 clk_enable(dev->clk);
880 dev->clk_active = 1; 891 dev->clk_active = 1;
881 892
882 dev->base = (void __iomem *)IO_ADDRESS(mem->start); 893 dev->base = ioremap(mem->start, resource_size(mem));
894 if (!dev->base) {
895 dev_err(&pdev->dev, "ioremap failed\n");
896 ret = -ENOMEM;
897 goto err_release_clk;
898 }
899
883 dev->op_mode = pdata->op_mode; 900 dev->op_mode = pdata->op_mode;
884 dev->tdm_slots = pdata->tdm_slots; 901 dev->tdm_slots = pdata->tdm_slots;
885 dev->num_serializer = pdata->num_serializer; 902 dev->num_serializer = pdata->num_serializer;
@@ -892,14 +909,16 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
892 dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; 909 dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
893 dma_data->asp_chan_q = pdata->asp_chan_q; 910 dma_data->asp_chan_q = pdata->asp_chan_q;
894 dma_data->ram_chan_q = pdata->ram_chan_q; 911 dma_data->ram_chan_q = pdata->ram_chan_q;
912 dma_data->sram_size = pdata->sram_size_playback;
895 dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset + 913 dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
896 io_v2p(dev->base)); 914 mem->start);
897 915
898 /* first TX, then RX */ 916 /* first TX, then RX */
899 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); 917 res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
900 if (!res) { 918 if (!res) {
901 dev_err(&pdev->dev, "no DMA resource\n"); 919 dev_err(&pdev->dev, "no DMA resource\n");
902 goto err_release_region; 920 ret = -ENODEV;
921 goto err_iounmap;
903 } 922 }
904 923
905 dma_data->channel = res->start; 924 dma_data->channel = res->start;
@@ -907,28 +926,32 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
907 dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]; 926 dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
908 dma_data->asp_chan_q = pdata->asp_chan_q; 927 dma_data->asp_chan_q = pdata->asp_chan_q;
909 dma_data->ram_chan_q = pdata->ram_chan_q; 928 dma_data->ram_chan_q = pdata->ram_chan_q;
929 dma_data->sram_size = pdata->sram_size_capture;
910 dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset + 930 dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
911 io_v2p(dev->base)); 931 mem->start);
912 932
913 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 933 res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
914 if (!res) { 934 if (!res) {
915 dev_err(&pdev->dev, "no DMA resource\n"); 935 dev_err(&pdev->dev, "no DMA resource\n");
916 goto err_release_region; 936 ret = -ENODEV;
937 goto err_iounmap;
917 } 938 }
918 939
919 dma_data->channel = res->start; 940 dma_data->channel = res->start;
920 davinci_mcasp_dai[pdata->op_mode].private_data = dev; 941 dev_set_drvdata(&pdev->dev, dev);
921 davinci_mcasp_dai[pdata->op_mode].capture.dma_data = dev->dma_params; 942 ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]);
922 davinci_mcasp_dai[pdata->op_mode].playback.dma_data = dev->dma_params;
923 davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev;
924 ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]);
925 943
926 if (ret != 0) 944 if (ret != 0)
927 goto err_release_region; 945 goto err_iounmap;
928 return 0; 946 return 0;
929 947
948err_iounmap:
949 iounmap(dev->base);
950err_release_clk:
951 clk_disable(dev->clk);
952 clk_put(dev->clk);
930err_release_region: 953err_release_region:
931 release_mem_region(mem->start, (mem->end - mem->start) + 1); 954 release_mem_region(mem->start, resource_size(mem));
932err_release_data: 955err_release_data:
933 kfree(dev); 956 kfree(dev);
934 957
@@ -937,18 +960,16 @@ err_release_data:
937 960
938static int davinci_mcasp_remove(struct platform_device *pdev) 961static int davinci_mcasp_remove(struct platform_device *pdev)
939{ 962{
940 struct snd_platform_data *pdata = pdev->dev.platform_data; 963 struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev);
941 struct davinci_audio_dev *dev;
942 struct resource *mem; 964 struct resource *mem;
943 965
944 snd_soc_unregister_dai(&davinci_mcasp_dai[pdata->op_mode]); 966 snd_soc_unregister_dai(&pdev->dev);
945 dev = davinci_mcasp_dai[pdata->op_mode].private_data;
946 clk_disable(dev->clk); 967 clk_disable(dev->clk);
947 clk_put(dev->clk); 968 clk_put(dev->clk);
948 dev->clk = NULL; 969 dev->clk = NULL;
949 970
950 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 971 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
951 release_mem_region(mem->start, (mem->end - mem->start) + 1); 972 release_mem_region(mem->start, resource_size(mem));
952 973
953 kfree(dev); 974 kfree(dev);
954 975