diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-omap2/mcbsp.c | 51 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/mcbsp.h | 11 | ||||
-rw-r--r-- | arch/arm/plat-omap/mcbsp.c | 3 |
3 files changed, 62 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index 4c9c999dfa4a..51abcedfde83 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -52,6 +52,54 @@ void omap2_mcbsp1_mux_fsr_src(u8 mux) | |||
52 | } | 52 | } |
53 | EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src); | 53 | EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src); |
54 | 54 | ||
55 | /* McBSP CLKS source switching function */ | ||
56 | |||
57 | int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id) | ||
58 | { | ||
59 | struct omap_mcbsp *mcbsp; | ||
60 | struct clk *fck_src; | ||
61 | char *fck_src_name; | ||
62 | int r; | ||
63 | |||
64 | if (!omap_mcbsp_check_valid_id(id)) { | ||
65 | pr_err("%s: Invalid id (%d)\n", __func__, id + 1); | ||
66 | return -EINVAL; | ||
67 | } | ||
68 | mcbsp = id_to_mcbsp_ptr(id); | ||
69 | |||
70 | if (fck_src_id == MCBSP_CLKS_PAD_SRC) | ||
71 | fck_src_name = "pad_fck"; | ||
72 | else if (fck_src_id == MCBSP_CLKS_PRCM_SRC) | ||
73 | fck_src_name = "prcm_fck"; | ||
74 | else | ||
75 | return -EINVAL; | ||
76 | |||
77 | fck_src = clk_get(mcbsp->dev, fck_src_name); | ||
78 | if (IS_ERR_OR_NULL(fck_src)) { | ||
79 | pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks", | ||
80 | fck_src_name); | ||
81 | return -EINVAL; | ||
82 | } | ||
83 | |||
84 | clk_disable(mcbsp->fclk); | ||
85 | |||
86 | r = clk_set_parent(mcbsp->fclk, fck_src); | ||
87 | if (IS_ERR_VALUE(r)) { | ||
88 | pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n", | ||
89 | "clks", fck_src_name); | ||
90 | clk_put(fck_src); | ||
91 | return -EINVAL; | ||
92 | } | ||
93 | |||
94 | clk_enable(mcbsp->fclk); | ||
95 | |||
96 | clk_put(fck_src); | ||
97 | |||
98 | return 0; | ||
99 | } | ||
100 | EXPORT_SYMBOL(omap2_mcbsp_set_clks_src); | ||
101 | |||
102 | |||
55 | /* Platform data */ | 103 | /* Platform data */ |
56 | 104 | ||
57 | #ifdef CONFIG_ARCH_OMAP2420 | 105 | #ifdef CONFIG_ARCH_OMAP2420 |
@@ -190,18 +238,21 @@ static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = { | |||
190 | .dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX, | 238 | .dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX, |
191 | .dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX, | 239 | .dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX, |
192 | .tx_irq = OMAP44XX_IRQ_MCBSP2, | 240 | .tx_irq = OMAP44XX_IRQ_MCBSP2, |
241 | /* XXX .ops ? */ | ||
193 | }, | 242 | }, |
194 | { | 243 | { |
195 | .phys_base = OMAP44XX_MCBSP3_BASE, | 244 | .phys_base = OMAP44XX_MCBSP3_BASE, |
196 | .dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX, | 245 | .dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX, |
197 | .dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX, | 246 | .dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX, |
198 | .tx_irq = OMAP44XX_IRQ_MCBSP3, | 247 | .tx_irq = OMAP44XX_IRQ_MCBSP3, |
248 | /* XXX .ops ? */ | ||
199 | }, | 249 | }, |
200 | { | 250 | { |
201 | .phys_base = OMAP44XX_MCBSP4_BASE, | 251 | .phys_base = OMAP44XX_MCBSP4_BASE, |
202 | .dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX, | 252 | .dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX, |
203 | .dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX, | 253 | .dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX, |
204 | .tx_irq = OMAP44XX_IRQ_MCBSP4, | 254 | .tx_irq = OMAP44XX_IRQ_MCBSP4, |
255 | /* XXX .ops ? */ | ||
205 | }, | 256 | }, |
206 | }; | 257 | }; |
207 | #define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata) | 258 | #define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata) |
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h index 886d0e610aa7..4da6f94ae8e8 100644 --- a/arch/arm/plat-omap/include/plat/mcbsp.h +++ b/arch/arm/plat-omap/include/plat/mcbsp.h | |||
@@ -320,6 +320,10 @@ | |||
320 | #define FSR_SRC_FSR 0 | 320 | #define FSR_SRC_FSR 0 |
321 | #define FSR_SRC_FSX 1 | 321 | #define FSR_SRC_FSX 1 |
322 | 322 | ||
323 | /* McBSP functional clock sources */ | ||
324 | #define MCBSP_CLKS_PAD_SRC 0 | ||
325 | #define MCBSP_CLKS_PRCM_SRC 1 | ||
326 | |||
323 | /* we don't do multichannel for now */ | 327 | /* we don't do multichannel for now */ |
324 | struct omap_mcbsp_reg_cfg { | 328 | struct omap_mcbsp_reg_cfg { |
325 | u16 spcr2; | 329 | u16 spcr2; |
@@ -406,6 +410,7 @@ struct omap_mcbsp_spi_cfg { | |||
406 | struct omap_mcbsp_ops { | 410 | struct omap_mcbsp_ops { |
407 | void (*request)(unsigned int); | 411 | void (*request)(unsigned int); |
408 | void (*free)(unsigned int); | 412 | void (*free)(unsigned int); |
413 | int (*set_clks_src)(u8, u8); | ||
409 | }; | 414 | }; |
410 | 415 | ||
411 | struct omap_mcbsp_platform_data { | 416 | struct omap_mcbsp_platform_data { |
@@ -472,6 +477,9 @@ struct omap_mcbsp { | |||
472 | extern struct omap_mcbsp **mcbsp_ptr; | 477 | extern struct omap_mcbsp **mcbsp_ptr; |
473 | extern int omap_mcbsp_count, omap_mcbsp_cache_size; | 478 | extern int omap_mcbsp_count, omap_mcbsp_cache_size; |
474 | 479 | ||
480 | #define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count) | ||
481 | #define id_to_mcbsp_ptr(id) mcbsp_ptr[id]; | ||
482 | |||
475 | int omap_mcbsp_init(void); | 483 | int omap_mcbsp_init(void); |
476 | void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, | 484 | void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, |
477 | int size); | 485 | int size); |
@@ -509,6 +517,9 @@ int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int leng | |||
509 | int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word); | 517 | int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word); |
510 | int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word); | 518 | int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word); |
511 | 519 | ||
520 | |||
521 | /* McBSP functional clock source changing function */ | ||
522 | extern int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id); | ||
512 | /* SPI specific API */ | 523 | /* SPI specific API */ |
513 | void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * spi_cfg); | 524 | void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * spi_cfg); |
514 | 525 | ||
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index 9836fb5dc013..09f8c2871334 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -81,9 +81,6 @@ static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg) | |||
81 | #define MCBSP_READ_CACHE(mcbsp, reg) \ | 81 | #define MCBSP_READ_CACHE(mcbsp, reg) \ |
82 | omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1) | 82 | omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1) |
83 | 83 | ||
84 | #define omap_mcbsp_check_valid_id(id) (id < omap_mcbsp_count) | ||
85 | #define id_to_mcbsp_ptr(id) mcbsp_ptr[id]; | ||
86 | |||
87 | #define MCBSP_ST_READ(mcbsp, reg) \ | 84 | #define MCBSP_ST_READ(mcbsp, reg) \ |
88 | omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg) | 85 | omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg) |
89 | #define MCBSP_ST_WRITE(mcbsp, reg, val) \ | 86 | #define MCBSP_ST_WRITE(mcbsp, reg, val) \ |