2008-07-03 13:24:40 +04:00
/*
* 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>
2009-01-15 14:09:51 +03:00
# include <mach/irqs.h>
2009-10-20 20:40:47 +04:00
# include <plat/dma.h>
# include <plat/mux.h>
# include <plat/cpu.h>
# include <plat/mcbsp.h>
2008-07-03 13:24:40 +04:00
static void omap2_mcbsp2_mux_setup ( void )
{
omap_cfg_reg ( Y15_24XX_MCBSP2_CLKX ) ;
omap_cfg_reg ( R14_24XX_MCBSP2_FSX ) ;
omap_cfg_reg ( W15_24XX_MCBSP2_DR ) ;
omap_cfg_reg ( V15_24XX_MCBSP2_DX ) ;
omap_cfg_reg ( V14_24XX_GPIO117 ) ;
/*
* TODO : Need to add MUX settings for OMAP 2430 SDP
*/
}
static void omap2_mcbsp_request ( unsigned int id )
{
if ( cpu_is_omap2420 ( ) & & ( id = = OMAP_MCBSP2 ) )
omap2_mcbsp2_mux_setup ( ) ;
}
static struct omap_mcbsp_ops omap2_mcbsp_ops = {
. request = omap2_mcbsp_request ,
} ;
2008-10-08 11:01:40 +04:00
# ifdef CONFIG_ARCH_OMAP2420
static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata [ ] = {
2008-07-03 13:24:40 +04:00
{
2008-09-04 02:46:18 +04:00
. phys_base = OMAP24XX_MCBSP1_BASE ,
2008-07-03 13:24:40 +04:00
. dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX ,
. rx_irq = INT_24XX_MCBSP1_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP1_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
2008-09-04 02:46:18 +04:00
. phys_base = OMAP24XX_MCBSP2_BASE ,
2008-07-03 13:24:40 +04:00
. dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX ,
. rx_irq = INT_24XX_MCBSP2_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP2_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
} ;
2008-10-08 11:01:40 +04:00
# define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
2010-02-15 21:03:33 +03:00
# define OMAP2420_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
2008-07-03 13:24:40 +04:00
# else
2008-10-08 11:01:40 +04:00
# define omap2420_mcbsp_pdata NULL
# define OMAP2420_MCBSP_PDATA_SZ 0
2010-02-15 21:03:33 +03:00
# define OMAP2420_MCBSP_REG_NUM 0
2008-10-08 11:01:40 +04:00
# endif
# ifdef CONFIG_ARCH_OMAP2430
static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata [ ] = {
{
. phys_base = OMAP24XX_MCBSP1_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX ,
. rx_irq = INT_24XX_MCBSP1_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP1_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP24XX_MCBSP2_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX ,
. rx_irq = INT_24XX_MCBSP2_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP2_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP2430_MCBSP3_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX ,
. rx_irq = INT_24XX_MCBSP3_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP3_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP2430_MCBSP4_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX ,
. rx_irq = INT_24XX_MCBSP4_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP4_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP2430_MCBSP5_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX ,
. rx_irq = INT_24XX_MCBSP5_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP5_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
} ;
# define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
2010-02-15 21:03:33 +03:00
# define OMAP2430_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
2008-10-08 11:01:40 +04:00
# else
# define omap2430_mcbsp_pdata NULL
# define OMAP2430_MCBSP_PDATA_SZ 0
2010-02-15 21:03:33 +03:00
# define OMAP2430_MCBSP_REG_NUM 0
2008-07-03 13:24:40 +04:00
# endif
2010-02-12 23:26:48 +03:00
# ifdef CONFIG_ARCH_OMAP3
2008-07-03 13:24:40 +04:00
static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata [ ] = {
{
2008-09-04 02:46:18 +04:00
. phys_base = OMAP34XX_MCBSP1_BASE ,
2008-07-03 13:24:40 +04:00
. dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX ,
. rx_irq = INT_24XX_MCBSP1_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP1_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
2009-08-20 17:18:12 +04:00
. buffer_size = 0x6F ,
2008-07-03 13:24:40 +04:00
} ,
{
2008-09-04 02:46:18 +04:00
. phys_base = OMAP34XX_MCBSP2_BASE ,
2008-07-03 13:24:40 +04:00
. dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX ,
. rx_irq = INT_24XX_MCBSP2_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP2_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
2009-08-20 17:18:11 +04:00
. buffer_size = 0x3FF ,
2008-07-03 13:24:40 +04:00
} ,
2008-10-08 11:01:40 +04:00
{
. phys_base = OMAP34XX_MCBSP3_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX ,
. rx_irq = INT_24XX_MCBSP3_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP3_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
2009-08-20 17:18:12 +04:00
. buffer_size = 0x6F ,
2008-10-08 11:01:40 +04:00
} ,
{
. phys_base = OMAP34XX_MCBSP4_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX ,
. rx_irq = INT_24XX_MCBSP4_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP4_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
2009-08-20 17:18:12 +04:00
. buffer_size = 0x6F ,
2008-10-08 11:01:40 +04:00
} ,
{
. phys_base = OMAP34XX_MCBSP5_BASE ,
. dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX ,
. dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX ,
. rx_irq = INT_24XX_MCBSP5_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP5_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
2009-08-20 17:18:12 +04:00
. buffer_size = 0x6F ,
2008-10-08 11:01:40 +04:00
} ,
2008-07-03 13:24:40 +04:00
} ;
# define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
2010-02-15 21:03:33 +03:00
# define OMAP34XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
2008-07-03 13:24:40 +04:00
# else
# define omap34xx_mcbsp_pdata NULL
# define OMAP34XX_MCBSP_PDATA_SZ 0
2010-02-15 21:03:33 +03:00
# define OMAP34XX_MCBSP_REG_NUM 0
2008-07-03 13:24:40 +04:00
# endif
2009-07-28 17:27:10 +04:00
static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata [ ] = {
{
. phys_base = OMAP44XX_MCBSP1_BASE ,
. dma_rx_sync = OMAP44XX_DMA_MCBSP1_RX ,
. dma_tx_sync = OMAP44XX_DMA_MCBSP1_TX ,
. rx_irq = INT_24XX_MCBSP1_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP1_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP44XX_MCBSP2_BASE ,
. dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX ,
. dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX ,
. rx_irq = INT_24XX_MCBSP2_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP2_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP44XX_MCBSP3_BASE ,
. dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX ,
. dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX ,
. rx_irq = INT_24XX_MCBSP3_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP3_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
{
. phys_base = OMAP44XX_MCBSP4_BASE ,
. dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX ,
. dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX ,
. rx_irq = INT_24XX_MCBSP4_IRQ_RX ,
. tx_irq = INT_24XX_MCBSP4_IRQ_TX ,
. ops = & omap2_mcbsp_ops ,
} ,
} ;
# define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata)
2010-02-15 21:03:33 +03:00
# define OMAP44XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
2009-07-28 17:27:10 +04:00
2008-10-08 11:01:39 +04:00
static int __init omap2_mcbsp_init ( void )
2008-07-03 13:24:40 +04:00
{
2010-02-15 21:03:33 +03:00
if ( cpu_is_omap2420 ( ) ) {
2008-10-08 11:01:40 +04:00
omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ ;
2010-02-15 21:03:33 +03:00
omap_mcbsp_cache_size = OMAP2420_MCBSP_REG_NUM * sizeof ( u16 ) ;
} else if ( cpu_is_omap2430 ( ) ) {
2008-10-08 11:01:40 +04:00
omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ ;
2010-02-15 21:03:33 +03:00
omap_mcbsp_cache_size = OMAP2430_MCBSP_REG_NUM * sizeof ( u32 ) ;
} else if ( cpu_is_omap34xx ( ) ) {
2008-10-08 11:01:39 +04:00
omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ ;
2010-02-15 21:03:33 +03:00
omap_mcbsp_cache_size = OMAP34XX_MCBSP_REG_NUM * sizeof ( u32 ) ;
} else if ( cpu_is_omap44xx ( ) ) {
2009-07-28 17:27:10 +04:00
omap_mcbsp_count = OMAP44XX_MCBSP_PDATA_SZ ;
2010-02-15 21:03:33 +03:00
omap_mcbsp_cache_size = OMAP44XX_MCBSP_REG_NUM * sizeof ( u32 ) ;
}
2008-10-08 11:01:39 +04:00
mcbsp_ptr = kzalloc ( omap_mcbsp_count * sizeof ( struct omap_mcbsp * ) ,
GFP_KERNEL ) ;
if ( ! mcbsp_ptr )
return - ENOMEM ;
2008-10-08 11:01:40 +04:00
if ( cpu_is_omap2420 ( ) )
omap_mcbsp_register_board_cfg ( omap2420_mcbsp_pdata ,
OMAP2420_MCBSP_PDATA_SZ ) ;
if ( cpu_is_omap2430 ( ) )
omap_mcbsp_register_board_cfg ( omap2430_mcbsp_pdata ,
OMAP2430_MCBSP_PDATA_SZ ) ;
2008-10-08 11:01:40 +04:00
if ( cpu_is_omap34xx ( ) )
omap_mcbsp_register_board_cfg ( omap34xx_mcbsp_pdata ,
OMAP34XX_MCBSP_PDATA_SZ ) ;
2009-07-28 17:27:10 +04:00
if ( cpu_is_omap44xx ( ) )
omap_mcbsp_register_board_cfg ( omap44xx_mcbsp_pdata ,
OMAP44XX_MCBSP_PDATA_SZ ) ;
2008-07-03 13:24:40 +04:00
return omap_mcbsp_init ( ) ;
}
arch_initcall ( omap2_mcbsp_init ) ;