2 * linux/arch/arm/mach-omap2/mcbsp.c
4 * Copyright (C) 2008 Instituto Nokia de Tecnologia
5 * Contact: Eduardo Valentin <eduardo.valentin@indt.org.br>
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.
11 * Multichannel mode not supported.
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/clk.h>
16 #include <linux/err.h>
18 #include <linux/platform_device.h>
23 #include <mach/mcbsp.h>
25 const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
27 static void omap2_mcbsp2_mux_setup(void)
29 omap_cfg_reg(Y15_24XX_MCBSP2_CLKX);
30 omap_cfg_reg(R14_24XX_MCBSP2_FSX);
31 omap_cfg_reg(W15_24XX_MCBSP2_DR);
32 omap_cfg_reg(V15_24XX_MCBSP2_DX);
33 omap_cfg_reg(V14_24XX_GPIO117);
35 * TODO: Need to add MUX settings for OMAP 2430 SDP
39 static void omap2_mcbsp_request(unsigned int id)
41 if (cpu_is_omap2420() && (id == OMAP_MCBSP2))
42 omap2_mcbsp2_mux_setup();
45 static struct omap_mcbsp_ops omap2_mcbsp_ops = {
46 .request = omap2_mcbsp_request,
49 #ifdef CONFIG_ARCH_OMAP2420
50 static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
52 .phys_base = OMAP24XX_MCBSP1_BASE,
53 .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
54 .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
55 .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
56 .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
57 .ops = &omap2_mcbsp_ops,
58 .clk_names = clk_names,
62 .phys_base = OMAP24XX_MCBSP2_BASE,
63 .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
64 .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
65 .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
66 .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
67 .ops = &omap2_mcbsp_ops,
68 .clk_names = clk_names,
72 #define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
74 #define omap2420_mcbsp_pdata NULL
75 #define OMAP2420_MCBSP_PDATA_SZ 0
78 #ifdef CONFIG_ARCH_OMAP2430
79 static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
81 .phys_base = OMAP24XX_MCBSP1_BASE,
82 .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
83 .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
84 .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
85 .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
86 .ops = &omap2_mcbsp_ops,
87 .clk_names = clk_names,
91 .phys_base = OMAP24XX_MCBSP2_BASE,
92 .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
93 .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
94 .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
95 .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
96 .ops = &omap2_mcbsp_ops,
97 .clk_names = clk_names,
101 .phys_base = OMAP2430_MCBSP3_BASE,
102 .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
103 .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
104 .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
105 .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
106 .ops = &omap2_mcbsp_ops,
107 .clk_names = clk_names,
111 .phys_base = OMAP2430_MCBSP4_BASE,
112 .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
113 .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
114 .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
115 .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
116 .ops = &omap2_mcbsp_ops,
117 .clk_names = clk_names,
121 .phys_base = OMAP2430_MCBSP5_BASE,
122 .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
123 .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
124 .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
125 .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
126 .ops = &omap2_mcbsp_ops,
127 .clk_names = clk_names,
131 #define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
133 #define omap2430_mcbsp_pdata NULL
134 #define OMAP2430_MCBSP_PDATA_SZ 0
137 #ifdef CONFIG_ARCH_OMAP34XX
138 static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
140 .phys_base = OMAP34XX_MCBSP1_BASE,
141 .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
142 .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
143 .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
144 .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
145 .ops = &omap2_mcbsp_ops,
146 .clk_names = clk_names,
150 .phys_base = OMAP34XX_MCBSP2_BASE,
151 .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
152 .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
153 .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
154 .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
155 .ops = &omap2_mcbsp_ops,
156 .clk_names = clk_names,
160 .phys_base = OMAP34XX_MCBSP3_BASE,
161 .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
162 .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
163 .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
164 .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
165 .ops = &omap2_mcbsp_ops,
166 .clk_names = clk_names,
170 .phys_base = OMAP34XX_MCBSP4_BASE,
171 .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
172 .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
173 .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
174 .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
175 .ops = &omap2_mcbsp_ops,
176 .clk_names = clk_names,
180 .phys_base = OMAP34XX_MCBSP5_BASE,
181 .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
182 .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
183 .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
184 .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
185 .ops = &omap2_mcbsp_ops,
186 .clk_names = clk_names,
190 #define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
192 #define omap34xx_mcbsp_pdata NULL
193 #define OMAP34XX_MCBSP_PDATA_SZ 0
196 static int __init omap2_mcbsp_init(void)
198 if (cpu_is_omap2420())
199 omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
200 if (cpu_is_omap2430())
201 omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ;
202 if (cpu_is_omap34xx())
203 omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ;
205 mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
210 if (cpu_is_omap2420())
211 omap_mcbsp_register_board_cfg(omap2420_mcbsp_pdata,
212 OMAP2420_MCBSP_PDATA_SZ);
213 if (cpu_is_omap2430())
214 omap_mcbsp_register_board_cfg(omap2430_mcbsp_pdata,
215 OMAP2430_MCBSP_PDATA_SZ);
216 if (cpu_is_omap34xx())
217 omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata,
218 OMAP34XX_MCBSP_PDATA_SZ);
220 return omap_mcbsp_init();
222 arch_initcall(omap2_mcbsp_init);