123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673 |
- /*
- * linux/arch/arm/mach-omap2/mcbsp.c
- *
- * Copyright (C) 2008 Instituto Nokia de Tecnologia
- * Contact: Eduardo Valentin <eduardo.valentin@indt.org.br>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Multichannel mode not supported.
- */
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/clk.h>
- #include <linux/err.h>
- #include <linux/io.h>
- #include <linux/platform_device.h>
- #include <linux/slab.h>
- #include <mach/irqs.h>
- #include <plat/dma.h>
- #include <plat/cpu.h>
- #include <plat/mcbsp.h>
- #include "control.h"
- /* McBSP internal signal muxing functions */
- void omap2_mcbsp1_mux_clkr_src(u8 mux)
- {
- u32 v;
- v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
- if (mux == CLKR_SRC_CLKR)
- v &= ~OMAP2_MCBSP1_CLKR_MASK;
- else if (mux == CLKR_SRC_CLKX)
- v |= OMAP2_MCBSP1_CLKR_MASK;
- omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
- }
- EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src);
- void omap2_mcbsp1_mux_fsr_src(u8 mux)
- {
- u32 v;
- v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
- if (mux == FSR_SRC_FSR)
- v &= ~OMAP2_MCBSP1_FSR_MASK;
- else if (mux == FSR_SRC_FSX)
- v |= OMAP2_MCBSP1_FSR_MASK;
- omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
- }
- EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
- /* McBSP CLKS source switching function */
- int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
- {
- struct omap_mcbsp *mcbsp;
- struct clk *fck_src;
- char *fck_src_name;
- int r;
- if (!omap_mcbsp_check_valid_id(id)) {
- pr_err("%s: Invalid id (%d)\n", __func__, id + 1);
- return -EINVAL;
- }
- mcbsp = id_to_mcbsp_ptr(id);
- if (fck_src_id == MCBSP_CLKS_PAD_SRC)
- fck_src_name = "pad_fck";
- else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
- fck_src_name = "prcm_fck";
- else
- return -EINVAL;
- fck_src = clk_get(mcbsp->dev, fck_src_name);
- if (IS_ERR_OR_NULL(fck_src)) {
- pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks",
- fck_src_name);
- return -EINVAL;
- }
- clk_disable(mcbsp->fclk);
- r = clk_set_parent(mcbsp->fclk, fck_src);
- if (IS_ERR_VALUE(r)) {
- pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n",
- "clks", fck_src_name);
- clk_put(fck_src);
- return -EINVAL;
- }
- clk_enable(mcbsp->fclk);
- clk_put(fck_src);
- return 0;
- }
- EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
- /* Platform data */
- #ifdef CONFIG_SOC_OMAP2420
- struct resource omap2420_mcbsp_res[][6] = {
- {
- {
- .start = OMAP24XX_MCBSP1_BASE,
- .end = OMAP24XX_MCBSP1_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP1_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP1_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP1_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP1_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP24XX_MCBSP2_BASE,
- .end = OMAP24XX_MCBSP2_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP2_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP2_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP2_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP2_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- };
- #define OMAP2420_MCBSP_RES_SZ ARRAY_SIZE(omap2420_mcbsp_res[1])
- #define OMAP2420_MCBSP_COUNT ARRAY_SIZE(omap2420_mcbsp_res)
- #else
- #define omap2420_mcbsp_res NULL
- #define OMAP2420_MCBSP_RES_SZ 0
- #define OMAP2420_MCBSP_COUNT 0
- #endif
- #define omap2420_mcbsp_pdata NULL
- #ifdef CONFIG_SOC_OMAP2430
- struct resource omap2430_mcbsp_res[][6] = {
- {
- {
- .start = OMAP24XX_MCBSP1_BASE,
- .end = OMAP24XX_MCBSP1_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP1_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP1_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP1_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP1_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP24XX_MCBSP2_BASE,
- .end = OMAP24XX_MCBSP2_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP2_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP2_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP2_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP2_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP2430_MCBSP3_BASE,
- .end = OMAP2430_MCBSP3_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP3_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP3_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP3_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP3_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP2430_MCBSP4_BASE,
- .end = OMAP2430_MCBSP4_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP4_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP4_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP4_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP4_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP2430_MCBSP5_BASE,
- .end = OMAP2430_MCBSP5_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP5_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP5_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP5_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP5_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- };
- #define OMAP2430_MCBSP_RES_SZ ARRAY_SIZE(omap2430_mcbsp_res[1])
- #define OMAP2430_MCBSP_COUNT ARRAY_SIZE(omap2430_mcbsp_res)
- #else
- #define omap2430_mcbsp_res NULL
- #define OMAP2430_MCBSP_RES_SZ 0
- #define OMAP2430_MCBSP_COUNT 0
- #endif
- #define omap2430_mcbsp_pdata NULL
- #ifdef CONFIG_ARCH_OMAP3
- struct resource omap34xx_mcbsp_res[][7] = {
- {
- {
- .start = OMAP34XX_MCBSP1_BASE,
- .end = OMAP34XX_MCBSP1_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP1_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP1_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP1_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP1_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP34XX_MCBSP2_BASE,
- .end = OMAP34XX_MCBSP2_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "sidetone",
- .start = OMAP34XX_MCBSP2_ST_BASE,
- .end = OMAP34XX_MCBSP2_ST_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP2_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP2_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP2_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP2_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP34XX_MCBSP3_BASE,
- .end = OMAP34XX_MCBSP3_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "sidetone",
- .start = OMAP34XX_MCBSP3_ST_BASE,
- .end = OMAP34XX_MCBSP3_ST_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP3_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP3_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP3_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP3_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP34XX_MCBSP4_BASE,
- .end = OMAP34XX_MCBSP4_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP4_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP4_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP4_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP4_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP34XX_MCBSP5_BASE,
- .end = OMAP34XX_MCBSP5_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = INT_24XX_MCBSP5_IRQ_RX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = INT_24XX_MCBSP5_IRQ_TX,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP24XX_DMA_MCBSP5_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP24XX_DMA_MCBSP5_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- };
- static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
- {
- .buffer_size = 0x80, /* The FIFO has 128 locations */
- },
- {
- .buffer_size = 0x500, /* The FIFO has 1024 + 256 locations */
- },
- {
- .buffer_size = 0x80, /* The FIFO has 128 locations */
- },
- {
- .buffer_size = 0x80, /* The FIFO has 128 locations */
- },
- {
- .buffer_size = 0x80, /* The FIFO has 128 locations */
- },
- };
- #define OMAP34XX_MCBSP_RES_SZ ARRAY_SIZE(omap34xx_mcbsp_res[1])
- #define OMAP34XX_MCBSP_COUNT ARRAY_SIZE(omap34xx_mcbsp_res)
- #else
- #define omap34xx_mcbsp_pdata NULL
- #define omap34XX_mcbsp_res NULL
- #define OMAP34XX_MCBSP_RES_SZ 0
- #define OMAP34XX_MCBSP_COUNT 0
- #endif
- struct resource omap44xx_mcbsp_res[][6] = {
- {
- {
- .name = "mpu",
- .start = OMAP44XX_MCBSP1_BASE,
- .end = OMAP44XX_MCBSP1_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "dma",
- .start = OMAP44XX_MCBSP1_DMA_BASE,
- .end = OMAP44XX_MCBSP1_DMA_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = 0,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = OMAP44XX_IRQ_MCBSP1,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP44XX_DMA_MCBSP1_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP44XX_DMA_MCBSP1_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .name = "mpu",
- .start = OMAP44XX_MCBSP2_BASE,
- .end = OMAP44XX_MCBSP2_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "dma",
- .start = OMAP44XX_MCBSP2_DMA_BASE,
- .end = OMAP44XX_MCBSP2_DMA_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = 0,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = OMAP44XX_IRQ_MCBSP2,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP44XX_DMA_MCBSP2_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP44XX_DMA_MCBSP2_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .name = "mpu",
- .start = OMAP44XX_MCBSP3_BASE,
- .end = OMAP44XX_MCBSP3_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "dma",
- .start = OMAP44XX_MCBSP3_DMA_BASE,
- .end = OMAP44XX_MCBSP3_DMA_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = 0,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = OMAP44XX_IRQ_MCBSP3,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP44XX_DMA_MCBSP3_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP44XX_DMA_MCBSP3_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- {
- {
- .start = OMAP44XX_MCBSP4_BASE,
- .end = OMAP44XX_MCBSP4_BASE + SZ_256,
- .flags = IORESOURCE_MEM,
- },
- {
- .name = "rx",
- .start = 0,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "tx",
- .start = OMAP44XX_IRQ_MCBSP4,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "rx",
- .start = OMAP44XX_DMA_MCBSP4_RX,
- .flags = IORESOURCE_DMA,
- },
- {
- .name = "tx",
- .start = OMAP44XX_DMA_MCBSP4_TX,
- .flags = IORESOURCE_DMA,
- },
- },
- };
- #define omap44xx_mcbsp_pdata NULL
- #define OMAP44XX_MCBSP_RES_SZ ARRAY_SIZE(omap44xx_mcbsp_res[1])
- #define OMAP44XX_MCBSP_COUNT ARRAY_SIZE(omap44xx_mcbsp_res)
- static int __init omap2_mcbsp_init(void)
- {
- if (cpu_is_omap2420())
- omap_mcbsp_count = OMAP2420_MCBSP_COUNT;
- else if (cpu_is_omap2430())
- omap_mcbsp_count = OMAP2430_MCBSP_COUNT;
- else if (cpu_is_omap34xx())
- omap_mcbsp_count = OMAP34XX_MCBSP_COUNT;
- else if (cpu_is_omap44xx())
- omap_mcbsp_count = OMAP44XX_MCBSP_COUNT;
- mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
- GFP_KERNEL);
- if (!mcbsp_ptr)
- return -ENOMEM;
- if (cpu_is_omap2420())
- omap_mcbsp_register_board_cfg(omap2420_mcbsp_res[0],
- OMAP2420_MCBSP_RES_SZ,
- omap2420_mcbsp_pdata,
- OMAP2420_MCBSP_COUNT);
- if (cpu_is_omap2430())
- omap_mcbsp_register_board_cfg(omap2430_mcbsp_res[0],
- OMAP2420_MCBSP_RES_SZ,
- omap2430_mcbsp_pdata,
- OMAP2430_MCBSP_COUNT);
- if (cpu_is_omap34xx())
- omap_mcbsp_register_board_cfg(omap34xx_mcbsp_res[0],
- OMAP34XX_MCBSP_RES_SZ,
- omap34xx_mcbsp_pdata,
- OMAP34XX_MCBSP_COUNT);
- if (cpu_is_omap44xx())
- omap_mcbsp_register_board_cfg(omap44xx_mcbsp_res[0],
- OMAP44XX_MCBSP_RES_SZ,
- omap44xx_mcbsp_pdata,
- OMAP44XX_MCBSP_COUNT);
- return omap_mcbsp_init();
- }
- arch_initcall(omap2_mcbsp_init);
|