2010-05-03 11:03:52 +04:00
/*
* Copyright ( C ) ST - Ericsson SA 2010
*
* Author : Rabin Vincent < rabin . vincent @ stericsson . com > for ST - Ericsson
* License terms : GNU General Public License ( GPL ) version 2
*/
# include <linux/kernel.h>
# include <linux/platform_device.h>
# include <linux/interrupt.h>
# include <linux/io.h>
2010-05-03 11:25:52 +04:00
# include <linux/gpio.h>
2010-05-03 11:03:52 +04:00
# include <linux/amba/bus.h>
2010-05-28 02:21:26 +04:00
# include <plat/ste_dma40.h>
2010-05-03 11:03:52 +04:00
# include <mach/hardware.h>
# include <mach/setup.h>
2010-05-28 02:21:26 +04:00
# include "ste-dma40-db8500.h"
static struct resource dma40_resources [ ] = {
[ 0 ] = {
. start = U8500_DMA_BASE ,
2010-06-21 01:26:14 +04:00
. end = U8500_DMA_BASE + SZ_4K - 1 ,
2010-05-28 02:21:26 +04:00
. flags = IORESOURCE_MEM ,
2010-06-21 01:26:14 +04:00
. name = " base " ,
2010-05-28 02:21:26 +04:00
} ,
[ 1 ] = {
. start = U8500_DMA_LCPA_BASE ,
2010-06-21 01:26:14 +04:00
. end = U8500_DMA_LCPA_BASE + 2 * SZ_1K - 1 ,
2010-05-28 02:21:26 +04:00
. flags = IORESOURCE_MEM ,
2010-06-21 01:26:14 +04:00
. name = " lcpa " ,
2010-05-28 02:21:26 +04:00
} ,
[ 2 ] = {
2010-07-26 14:09:27 +04:00
. start = IRQ_DB8500_DMA ,
. end = IRQ_DB8500_DMA ,
2010-06-21 01:26:14 +04:00
. flags = IORESOURCE_IRQ ,
}
2010-05-28 02:21:26 +04:00
} ;
/* Default configuration for physcial memcpy */
struct stedma40_chan_cfg dma40_memcpy_conf_phy = {
2010-10-12 17:00:51 +04:00
. mode = STEDMA40_MODE_PHYSICAL ,
2010-05-28 02:21:26 +04:00
. dir = STEDMA40_MEM_TO_MEM ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. src_info . psize = STEDMA40_PSIZE_PHY_1 ,
2010-06-21 01:26:22 +04:00
. src_info . flow_ctrl = STEDMA40_NO_FLOW_CTRL ,
2010-05-28 02:21:26 +04:00
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . psize = STEDMA40_PSIZE_PHY_1 ,
2010-06-21 01:26:22 +04:00
. dst_info . flow_ctrl = STEDMA40_NO_FLOW_CTRL ,
2010-05-28 02:21:26 +04:00
} ;
/* Default configuration for logical memcpy */
struct stedma40_chan_cfg dma40_memcpy_conf_log = {
. dir = STEDMA40_MEM_TO_MEM ,
. src_info . data_width = STEDMA40_BYTE_WIDTH ,
. src_info . psize = STEDMA40_PSIZE_LOG_1 ,
2010-06-21 01:26:22 +04:00
. src_info . flow_ctrl = STEDMA40_NO_FLOW_CTRL ,
2010-05-28 02:21:26 +04:00
. dst_info . data_width = STEDMA40_BYTE_WIDTH ,
. dst_info . psize = STEDMA40_PSIZE_LOG_1 ,
2010-06-21 01:26:22 +04:00
. dst_info . flow_ctrl = STEDMA40_NO_FLOW_CTRL ,
2010-05-28 02:21:26 +04:00
} ;
/*
* Mapping between destination event lines and physical device address .
* The event line is tied to a device and therefor the address is constant .
*/
2011-01-21 20:21:50 +03:00
static const dma_addr_t dma40_tx_map [ DB8500_DMA_NR_DEV ] = {
/* MUSB - these will be runtime-reconfigured */
[ DB8500_DMA_DEV39_USB_OTG_OEP_8 ] = - 1 ,
[ DB8500_DMA_DEV16_USB_OTG_OEP_7_15 ] = - 1 ,
[ DB8500_DMA_DEV17_USB_OTG_OEP_6_14 ] = - 1 ,
[ DB8500_DMA_DEV18_USB_OTG_OEP_5_13 ] = - 1 ,
[ DB8500_DMA_DEV19_USB_OTG_OEP_4_12 ] = - 1 ,
[ DB8500_DMA_DEV36_USB_OTG_OEP_3_11 ] = - 1 ,
[ DB8500_DMA_DEV37_USB_OTG_OEP_2_10 ] = - 1 ,
[ DB8500_DMA_DEV38_USB_OTG_OEP_1_9 ] = - 1 ,
} ;
2010-05-28 02:21:26 +04:00
/* Mapping between source event lines and physical device address */
2011-01-21 20:21:50 +03:00
static const dma_addr_t dma40_rx_map [ DB8500_DMA_NR_DEV ] = {
/* MUSB - these will be runtime-reconfigured */
[ DB8500_DMA_DEV39_USB_OTG_IEP_8 ] = - 1 ,
[ DB8500_DMA_DEV16_USB_OTG_IEP_7_15 ] = - 1 ,
[ DB8500_DMA_DEV17_USB_OTG_IEP_6_14 ] = - 1 ,
[ DB8500_DMA_DEV18_USB_OTG_IEP_5_13 ] = - 1 ,
[ DB8500_DMA_DEV19_USB_OTG_IEP_4_12 ] = - 1 ,
[ DB8500_DMA_DEV36_USB_OTG_IEP_3_11 ] = - 1 ,
[ DB8500_DMA_DEV37_USB_OTG_IEP_2_10 ] = - 1 ,
[ DB8500_DMA_DEV38_USB_OTG_IEP_1_9 ] = - 1 ,
} ;
2010-05-28 02:21:26 +04:00
/* Reserved event lines for memcpy only */
static int dma40_memcpy_event [ ] = {
2010-09-29 19:01:08 +04:00
DB8500_DMA_MEMCPY_TX_0 ,
DB8500_DMA_MEMCPY_TX_1 ,
DB8500_DMA_MEMCPY_TX_2 ,
DB8500_DMA_MEMCPY_TX_3 ,
DB8500_DMA_MEMCPY_TX_4 ,
DB8500_DMA_MEMCPY_TX_5 ,
2010-05-28 02:21:26 +04:00
} ;
static struct stedma40_platform_data dma40_plat_data = {
2010-09-29 19:01:08 +04:00
. dev_len = DB8500_DMA_NR_DEV ,
2010-05-28 02:21:26 +04:00
. dev_rx = dma40_rx_map ,
. dev_tx = dma40_tx_map ,
. memcpy = dma40_memcpy_event ,
. memcpy_len = ARRAY_SIZE ( dma40_memcpy_event ) ,
. memcpy_conf_phy = & dma40_memcpy_conf_phy ,
. memcpy_conf_log = & dma40_memcpy_conf_log ,
2010-06-21 01:26:45 +04:00
. disabled_channels = { - 1 } ,
2010-05-28 02:21:26 +04:00
} ;
struct platform_device u8500_dma40_device = {
. dev = {
. platform_data = & dma40_plat_data ,
} ,
. name = " dma40 " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( dma40_resources ) ,
. resource = dma40_resources
} ;
void dma40_u8500ed_fixup ( void )
{
dma40_plat_data . memcpy = NULL ;
dma40_plat_data . memcpy_len = 0 ;
dma40_resources [ 0 ] . start = U8500_DMA_BASE_ED ;
dma40_resources [ 0 ] . end = U8500_DMA_BASE_ED + SZ_4K - 1 ;
2010-06-23 05:06:42 +04:00
dma40_resources [ 1 ] . start = U8500_DMA_LCPA_BASE_ED ;
dma40_resources [ 1 ] . end = U8500_DMA_LCPA_BASE_ED + 2 * SZ_1K - 1 ;
2010-05-28 02:21:26 +04:00
}
2010-09-30 06:43:09 +04:00
struct resource keypad_resources [ ] = {
[ 0 ] = {
. start = U8500_SKE_BASE ,
. end = U8500_SKE_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = IRQ_DB8500_KB ,
. end = IRQ_DB8500_KB ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
2010-12-03 18:05:36 +03:00
struct platform_device u8500_ske_keypad_device = {
2010-09-30 06:43:09 +04:00
. name = " nmk-ske-keypad " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( keypad_resources ) ,
. resource = keypad_resources ,
} ;