| OLD | NEW |
| 1 /* | 1 /* |
| 2 * ALSA SoC I2S (McBSP) Audio Layer for TI DAVINCI processor | 2 * ALSA SoC I2S (McBSP) Audio Layer for TI DAVINCI processor |
| 3 * | 3 * |
| 4 * Author: Vladimir Barinov, <vbarinov@embeddedalley.com> | 4 * Author: Vladimir Barinov, <vbarinov@embeddedalley.com> |
| 5 * Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com> | 5 * Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com> |
| 6 * | 6 * |
| 7 * This program is free software; you can redistribute it and/or modify | 7 * This program is free software; you can redistribute it and/or modify |
| 8 * it under the terms of the GNU General Public License version 2 as | 8 * it under the terms of the GNU General Public License version 2 as |
| 9 * published by the Free Software Foundation. | 9 * published by the Free Software Foundation. |
| 10 */ | 10 */ |
| (...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 enum dma_event_q asp_chan_q = EVENTQ_0; | 651 enum dma_event_q asp_chan_q = EVENTQ_0; |
| 652 enum dma_event_q ram_chan_q = EVENTQ_1; | 652 enum dma_event_q ram_chan_q = EVENTQ_1; |
| 653 int ret; | 653 int ret; |
| 654 | 654 |
| 655 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 655 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 656 if (!mem) { | 656 if (!mem) { |
| 657 dev_err(&pdev->dev, "no mem resource?\n"); | 657 dev_err(&pdev->dev, "no mem resource?\n"); |
| 658 return -ENODEV; | 658 return -ENODEV; |
| 659 } | 659 } |
| 660 | 660 |
| 661 » ioarea = request_mem_region(mem->start, (mem->end - mem->start) + 1, | 661 » ioarea = request_mem_region(mem->start, resource_size(mem), |
| 662 pdev->name); | 662 pdev->name); |
| 663 if (!ioarea) { | 663 if (!ioarea) { |
| 664 dev_err(&pdev->dev, "McBSP region already claimed\n"); | 664 dev_err(&pdev->dev, "McBSP region already claimed\n"); |
| 665 return -EBUSY; | 665 return -EBUSY; |
| 666 } | 666 } |
| 667 | 667 |
| 668 dev = kzalloc(sizeof(struct davinci_mcbsp_dev), GFP_KERNEL); | 668 dev = kzalloc(sizeof(struct davinci_mcbsp_dev), GFP_KERNEL); |
| 669 if (!dev) { | 669 if (!dev) { |
| 670 ret = -ENOMEM; | 670 ret = -ENOMEM; |
| 671 goto err_release_region; | 671 goto err_release_region; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 687 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q = asp_chan_q; | 687 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q = asp_chan_q; |
| 688 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q = ram_chan_q; | 688 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q = ram_chan_q; |
| 689 | 689 |
| 690 dev->clk = clk_get(&pdev->dev, NULL); | 690 dev->clk = clk_get(&pdev->dev, NULL); |
| 691 if (IS_ERR(dev->clk)) { | 691 if (IS_ERR(dev->clk)) { |
| 692 ret = -ENODEV; | 692 ret = -ENODEV; |
| 693 goto err_free_mem; | 693 goto err_free_mem; |
| 694 } | 694 } |
| 695 clk_enable(dev->clk); | 695 clk_enable(dev->clk); |
| 696 | 696 |
| 697 » dev->base = (void __iomem *)IO_ADDRESS(mem->start); | 697 » dev->base = ioremap(mem->start, resource_size(mem)); |
| 698 » if (!dev->base) { |
| 699 » » dev_err(&pdev->dev, "ioremap failed\n"); |
| 700 » » ret = -ENOMEM; |
| 701 » » goto err_release_clk; |
| 702 » } |
| 698 | 703 |
| 699 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr = | 704 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr = |
| 700 » (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); | 705 » (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG); |
| 701 | 706 |
| 702 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = | 707 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = |
| 703 » (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); | 708 » (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG); |
| 704 | 709 |
| 705 /* first TX, then RX */ | 710 /* first TX, then RX */ |
| 706 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 711 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
| 707 if (!res) { | 712 if (!res) { |
| 708 dev_err(&pdev->dev, "no DMA resource\n"); | 713 dev_err(&pdev->dev, "no DMA resource\n"); |
| 709 ret = -ENXIO; | 714 ret = -ENXIO; |
| 710 » » goto err_free_mem; | 715 » » goto err_iounmap; |
| 711 } | 716 } |
| 712 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start; | 717 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start; |
| 713 | 718 |
| 714 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 719 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); |
| 715 if (!res) { | 720 if (!res) { |
| 716 dev_err(&pdev->dev, "no DMA resource\n"); | 721 dev_err(&pdev->dev, "no DMA resource\n"); |
| 717 ret = -ENXIO; | 722 ret = -ENXIO; |
| 718 » » goto err_free_mem; | 723 » » goto err_iounmap; |
| 719 } | 724 } |
| 720 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; | 725 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; |
| 721 dev->dev = &pdev->dev; | 726 dev->dev = &pdev->dev; |
| 722 | 727 |
| 723 dev_set_drvdata(&pdev->dev, dev); | 728 dev_set_drvdata(&pdev->dev, dev); |
| 724 | 729 |
| 725 ret = snd_soc_register_dai(&pdev->dev, &davinci_i2s_dai); | 730 ret = snd_soc_register_dai(&pdev->dev, &davinci_i2s_dai); |
| 726 if (ret != 0) | 731 if (ret != 0) |
| 727 » » goto err_free_mem; | 732 » » goto err_iounmap; |
| 728 | 733 |
| 729 return 0; | 734 return 0; |
| 730 | 735 |
| 736 err_iounmap: |
| 737 iounmap(dev->base); |
| 738 err_release_clk: |
| 739 clk_disable(dev->clk); |
| 740 clk_put(dev->clk); |
| 731 err_free_mem: | 741 err_free_mem: |
| 732 kfree(dev); | 742 kfree(dev); |
| 733 err_release_region: | 743 err_release_region: |
| 734 » release_mem_region(mem->start, (mem->end - mem->start) + 1); | 744 » release_mem_region(mem->start, resource_size(mem)); |
| 735 | 745 |
| 736 return ret; | 746 return ret; |
| 737 } | 747 } |
| 738 | 748 |
| 739 static int davinci_i2s_remove(struct platform_device *pdev) | 749 static int davinci_i2s_remove(struct platform_device *pdev) |
| 740 { | 750 { |
| 741 struct davinci_mcbsp_dev *dev = dev_get_drvdata(&pdev->dev); | 751 struct davinci_mcbsp_dev *dev = dev_get_drvdata(&pdev->dev); |
| 742 struct resource *mem; | 752 struct resource *mem; |
| 743 | 753 |
| 744 snd_soc_unregister_dai(&pdev->dev); | 754 snd_soc_unregister_dai(&pdev->dev); |
| 745 clk_disable(dev->clk); | 755 clk_disable(dev->clk); |
| 746 clk_put(dev->clk); | 756 clk_put(dev->clk); |
| 747 dev->clk = NULL; | 757 dev->clk = NULL; |
| 748 kfree(dev); | 758 kfree(dev); |
| 749 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 759 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 750 » release_mem_region(mem->start, (mem->end - mem->start) + 1); | 760 » release_mem_region(mem->start, resource_size(mem)); |
| 751 | 761 |
| 752 return 0; | 762 return 0; |
| 753 } | 763 } |
| 754 | 764 |
| 755 static struct platform_driver davinci_mcbsp_driver = { | 765 static struct platform_driver davinci_mcbsp_driver = { |
| 756 .probe = davinci_i2s_probe, | 766 .probe = davinci_i2s_probe, |
| 757 .remove = davinci_i2s_remove, | 767 .remove = davinci_i2s_remove, |
| 758 .driver = { | 768 .driver = { |
| 759 .name = "davinci-mcbsp", | 769 .name = "davinci-mcbsp", |
| 760 .owner = THIS_MODULE, | 770 .owner = THIS_MODULE, |
| 761 }, | 771 }, |
| 762 }; | 772 }; |
| 763 | 773 |
| 764 static int __init davinci_i2s_init(void) | 774 static int __init davinci_i2s_init(void) |
| 765 { | 775 { |
| 766 return platform_driver_register(&davinci_mcbsp_driver); | 776 return platform_driver_register(&davinci_mcbsp_driver); |
| 767 } | 777 } |
| 768 module_init(davinci_i2s_init); | 778 module_init(davinci_i2s_init); |
| 769 | 779 |
| 770 static void __exit davinci_i2s_exit(void) | 780 static void __exit davinci_i2s_exit(void) |
| 771 { | 781 { |
| 772 platform_driver_unregister(&davinci_mcbsp_driver); | 782 platform_driver_unregister(&davinci_mcbsp_driver); |
| 773 } | 783 } |
| 774 module_exit(davinci_i2s_exit); | 784 module_exit(davinci_i2s_exit); |
| 775 | 785 |
| 776 MODULE_AUTHOR("Vladimir Barinov"); | 786 MODULE_AUTHOR("Vladimir Barinov"); |
| 777 MODULE_DESCRIPTION("TI DAVINCI I2S (McBSP) SoC Interface"); | 787 MODULE_DESCRIPTION("TI DAVINCI I2S (McBSP) SoC Interface"); |
| 778 MODULE_LICENSE("GPL"); | 788 MODULE_LICENSE("GPL"); |
| OLD | NEW |