diff options
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 91 |
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) | |||
422 | static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 422 | static 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, | |||
761 | static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, | 766 | static 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 | ||
804 | static 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 | |||
800 | static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { | 813 | static 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 | ||
807 | struct snd_soc_dai davinci_mcasp_dai[] = { | 821 | static 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 | }; |
843 | EXPORT_SYMBOL_GPL(davinci_mcasp_dai); | ||
844 | 855 | ||
845 | static int davinci_mcasp_probe(struct platform_device *pdev) | 856 | static 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 | ||
948 | err_iounmap: | ||
949 | iounmap(dev->base); | ||
950 | err_release_clk: | ||
951 | clk_disable(dev->clk); | ||
952 | clk_put(dev->clk); | ||
930 | err_release_region: | 953 | err_release_region: |
931 | release_mem_region(mem->start, (mem->end - mem->start) + 1); | 954 | release_mem_region(mem->start, resource_size(mem)); |
932 | err_release_data: | 955 | err_release_data: |
933 | kfree(dev); | 956 | kfree(dev); |
934 | 957 | ||
@@ -937,18 +960,16 @@ err_release_data: | |||
937 | 960 | ||
938 | static int davinci_mcasp_remove(struct platform_device *pdev) | 961 | static 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 | ||