mcbsp.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * linux/arch/arm/mach-omap2/mcbsp.c
  3. *
  4. * Copyright (C) 2008 Instituto Nokia de Tecnologia
  5. * Contact: Eduardo Valentin <eduardo.valentin@indt.org.br>
  6. *
  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
  9. * published by the Free Software Foundation.
  10. *
  11. * Multichannel mode not supported.
  12. */
  13. #include <linux/module.h>
  14. #include <linux/init.h>
  15. #include <linux/clk.h>
  16. #include <linux/err.h>
  17. #include <linux/io.h>
  18. #include <linux/platform_device.h>
  19. #include <mach/irqs.h>
  20. #include <mach/dma.h>
  21. #include <mach/irqs.h>
  22. #include <mach/mux.h>
  23. #include <mach/cpu.h>
  24. #include <mach/mcbsp.h>
  25. static void omap2_mcbsp2_mux_setup(void)
  26. {
  27. omap_cfg_reg(Y15_24XX_MCBSP2_CLKX);
  28. omap_cfg_reg(R14_24XX_MCBSP2_FSX);
  29. omap_cfg_reg(W15_24XX_MCBSP2_DR);
  30. omap_cfg_reg(V15_24XX_MCBSP2_DX);
  31. omap_cfg_reg(V14_24XX_GPIO117);
  32. /*
  33. * TODO: Need to add MUX settings for OMAP 2430 SDP
  34. */
  35. }
  36. static void omap2_mcbsp_request(unsigned int id)
  37. {
  38. if (cpu_is_omap2420() && (id == OMAP_MCBSP2))
  39. omap2_mcbsp2_mux_setup();
  40. }
  41. static struct omap_mcbsp_ops omap2_mcbsp_ops = {
  42. .request = omap2_mcbsp_request,
  43. };
  44. #ifdef CONFIG_ARCH_OMAP2420
  45. static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
  46. {
  47. .phys_base = OMAP24XX_MCBSP1_BASE,
  48. .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
  49. .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
  50. .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
  51. .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
  52. .ops = &omap2_mcbsp_ops,
  53. },
  54. {
  55. .phys_base = OMAP24XX_MCBSP2_BASE,
  56. .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
  57. .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
  58. .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
  59. .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
  60. .ops = &omap2_mcbsp_ops,
  61. },
  62. };
  63. #define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
  64. #else
  65. #define omap2420_mcbsp_pdata NULL
  66. #define OMAP2420_MCBSP_PDATA_SZ 0
  67. #endif
  68. #ifdef CONFIG_ARCH_OMAP2430
  69. static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
  70. {
  71. .phys_base = OMAP24XX_MCBSP1_BASE,
  72. .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
  73. .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
  74. .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
  75. .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
  76. .ops = &omap2_mcbsp_ops,
  77. },
  78. {
  79. .phys_base = OMAP24XX_MCBSP2_BASE,
  80. .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
  81. .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
  82. .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
  83. .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
  84. .ops = &omap2_mcbsp_ops,
  85. },
  86. {
  87. .phys_base = OMAP2430_MCBSP3_BASE,
  88. .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
  89. .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
  90. .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
  91. .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
  92. .ops = &omap2_mcbsp_ops,
  93. },
  94. {
  95. .phys_base = OMAP2430_MCBSP4_BASE,
  96. .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
  97. .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
  98. .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
  99. .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
  100. .ops = &omap2_mcbsp_ops,
  101. },
  102. {
  103. .phys_base = OMAP2430_MCBSP5_BASE,
  104. .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
  105. .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
  106. .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
  107. .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
  108. .ops = &omap2_mcbsp_ops,
  109. },
  110. };
  111. #define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
  112. #else
  113. #define omap2430_mcbsp_pdata NULL
  114. #define OMAP2430_MCBSP_PDATA_SZ 0
  115. #endif
  116. #ifdef CONFIG_ARCH_OMAP34XX
  117. static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
  118. {
  119. .phys_base = OMAP34XX_MCBSP1_BASE,
  120. .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
  121. .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
  122. .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
  123. .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
  124. .ops = &omap2_mcbsp_ops,
  125. },
  126. {
  127. .phys_base = OMAP34XX_MCBSP2_BASE,
  128. .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
  129. .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
  130. .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
  131. .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
  132. .ops = &omap2_mcbsp_ops,
  133. },
  134. {
  135. .phys_base = OMAP34XX_MCBSP3_BASE,
  136. .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
  137. .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
  138. .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
  139. .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
  140. .ops = &omap2_mcbsp_ops,
  141. },
  142. {
  143. .phys_base = OMAP34XX_MCBSP4_BASE,
  144. .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
  145. .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
  146. .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
  147. .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
  148. .ops = &omap2_mcbsp_ops,
  149. },
  150. {
  151. .phys_base = OMAP34XX_MCBSP5_BASE,
  152. .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
  153. .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
  154. .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
  155. .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
  156. .ops = &omap2_mcbsp_ops,
  157. },
  158. };
  159. #define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
  160. #else
  161. #define omap34xx_mcbsp_pdata NULL
  162. #define OMAP34XX_MCBSP_PDATA_SZ 0
  163. #endif
  164. static int __init omap2_mcbsp_init(void)
  165. {
  166. if (cpu_is_omap2420())
  167. omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
  168. if (cpu_is_omap2430())
  169. omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ;
  170. if (cpu_is_omap34xx())
  171. omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ;
  172. mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
  173. GFP_KERNEL);
  174. if (!mcbsp_ptr)
  175. return -ENOMEM;
  176. if (cpu_is_omap2420())
  177. omap_mcbsp_register_board_cfg(omap2420_mcbsp_pdata,
  178. OMAP2420_MCBSP_PDATA_SZ);
  179. if (cpu_is_omap2430())
  180. omap_mcbsp_register_board_cfg(omap2430_mcbsp_pdata,
  181. OMAP2430_MCBSP_PDATA_SZ);
  182. if (cpu_is_omap34xx())
  183. omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata,
  184. OMAP34XX_MCBSP_PDATA_SZ);
  185. return omap_mcbsp_init();
  186. }
  187. arch_initcall(omap2_mcbsp_init);