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-10-14 15:57:59 +04:00
# include <linux/amba/pl022.h>
2010-05-03 11:03:52 +04:00
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 .
2010-10-14 15:57:59 +04:00
* The event line is tied to a device and therefore the address is constant .
* When the address comes from a primecell it will be configured in runtime
* and we set the address to - 1 as a placeholder .
2010-05-28 02:21:26 +04:00
*/
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-10-14 15:57:59 +04:00
/* PrimeCells - run-time configured */
[ DB8500_DMA_DEV0_SPI0_TX ] = - 1 ,
[ DB8500_DMA_DEV1_SD_MMC0_TX ] = - 1 ,
[ DB8500_DMA_DEV2_SD_MMC1_TX ] = - 1 ,
[ DB8500_DMA_DEV3_SD_MMC2_TX ] = - 1 ,
[ DB8500_DMA_DEV8_SSP0_TX ] = - 1 ,
[ DB8500_DMA_DEV9_SSP1_TX ] = - 1 ,
[ DB8500_DMA_DEV11_UART2_TX ] = - 1 ,
[ DB8500_DMA_DEV12_UART1_TX ] = - 1 ,
[ DB8500_DMA_DEV13_UART0_TX ] = - 1 ,
[ DB8500_DMA_DEV28_SD_MM2_TX ] = - 1 ,
[ DB8500_DMA_DEV29_SD_MM0_TX ] = - 1 ,
[ DB8500_DMA_DEV32_SD_MM1_TX ] = - 1 ,
[ DB8500_DMA_DEV33_SPI2_TX ] = - 1 ,
[ DB8500_DMA_DEV35_SPI1_TX ] = - 1 ,
[ DB8500_DMA_DEV40_SPI3_TX ] = - 1 ,
[ DB8500_DMA_DEV41_SD_MM3_TX ] = - 1 ,
[ DB8500_DMA_DEV42_SD_MM4_TX ] = - 1 ,
[ DB8500_DMA_DEV43_SD_MM5_TX ] = - 1 ,
2012-01-30 18:18:22 +04:00
[ DB8500_DMA_DEV14_MSP2_TX ] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET ,
[ DB8500_DMA_DEV30_MSP1_TX ] = U8500_MSP1_BASE + MSP_TX_RX_REG_OFFSET ,
[ DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX ] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET ,
2012-05-10 12:14:06 +04:00
[ DB8500_DMA_DEV48_CAC1_TX ] = U8500_CRYP1_BASE + CRYP1_TX_REG_OFFSET ,
[ DB8500_DMA_DEV50_HAC1_TX ] = U8500_HASH1_BASE + HASH1_TX_REG_OFFSET ,
2011-01-21 20:21:50 +03:00
} ;
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-10-14 15:57:59 +04:00
/* PrimeCells */
[ DB8500_DMA_DEV0_SPI0_RX ] = - 1 ,
[ DB8500_DMA_DEV1_SD_MMC0_RX ] = - 1 ,
[ DB8500_DMA_DEV2_SD_MMC1_RX ] = - 1 ,
[ DB8500_DMA_DEV3_SD_MMC2_RX ] = - 1 ,
[ DB8500_DMA_DEV8_SSP0_RX ] = - 1 ,
[ DB8500_DMA_DEV9_SSP1_RX ] = - 1 ,
[ DB8500_DMA_DEV11_UART2_RX ] = - 1 ,
[ DB8500_DMA_DEV12_UART1_RX ] = - 1 ,
[ DB8500_DMA_DEV13_UART0_RX ] = - 1 ,
[ DB8500_DMA_DEV28_SD_MM2_RX ] = - 1 ,
[ DB8500_DMA_DEV29_SD_MM0_RX ] = - 1 ,
[ DB8500_DMA_DEV32_SD_MM1_RX ] = - 1 ,
[ DB8500_DMA_DEV33_SPI2_RX ] = - 1 ,
[ DB8500_DMA_DEV35_SPI1_RX ] = - 1 ,
[ DB8500_DMA_DEV40_SPI3_RX ] = - 1 ,
[ DB8500_DMA_DEV41_SD_MM3_RX ] = - 1 ,
[ DB8500_DMA_DEV42_SD_MM4_RX ] = - 1 ,
[ DB8500_DMA_DEV43_SD_MM5_RX ] = - 1 ,
2012-01-30 18:18:22 +04:00
[ DB8500_DMA_DEV14_MSP2_RX ] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET ,
[ DB8500_DMA_DEV30_MSP3_RX ] = U8500_MSP3_BASE + MSP_TX_RX_REG_OFFSET ,
[ DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX ] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET ,
2012-05-10 12:14:06 +04:00
[ DB8500_DMA_DEV48_CAC1_RX ] = U8500_CRYP1_BASE + CRYP1_RX_REG_OFFSET ,
2011-01-21 20:21:50 +03:00
} ;
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
} ;
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 ,
} ;