2007-02-11 18:31:01 +01:00
/* linux/arch/arm/plat-s3c24xx/cpu.c
2005-04-16 15:20:36 -07:00
*
* Copyright ( c ) 2004 - 2005 Simtec Electronics
* http : //www.simtec.co.uk/products/SWLINUX/
* Ben Dooks < ben @ simtec . co . uk >
*
2012-05-12 16:22:17 +09:00
* Common code for S3C24XX machines
2005-04-16 15:20:36 -07:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2016-08-04 11:56:12 +02:00
# include <linux/dma-mapping.h>
2005-04-16 15:20:36 -07:00
# include <linux/init.h>
# include <linux/module.h>
# include <linux/interrupt.h>
# include <linux/ioport.h>
2006-12-17 23:22:26 +01:00
# include <linux/serial_core.h>
2014-02-14 10:32:45 +09:00
# include <linux/serial_s3c.h>
2013-04-12 21:17:22 +02:00
# include <clocksource/samsung_pwm.h>
2005-10-29 19:07:23 +01:00
# include <linux/platform_device.h>
2008-04-16 00:15:20 +01:00
# include <linux/delay.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2013-10-08 06:42:10 +09:00
# include <linux/platform_data/dma-s3c24xx.h>
2016-09-22 20:51:15 +02:00
# include <linux/dmaengine.h>
2005-04-16 15:20:36 -07:00
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2011-08-03 11:34:59 -04:00
# include <mach/regs-clock.h>
2005-04-16 15:20:36 -07:00
# include <asm/irq.h>
2008-04-16 00:15:20 +01:00
# include <asm/cacheflush.h>
2012-03-28 18:30:01 +01:00
# include <asm/system_info.h>
2012-03-29 23:22:44 -07:00
# include <asm/system_misc.h>
2005-04-16 15:20:36 -07:00
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2008-08-05 16:14:15 +01:00
# include <mach/regs-gpio.h>
2013-10-08 06:42:10 +09:00
# include <mach/dma.h>
2005-04-16 15:20:36 -07:00
2008-10-07 22:26:09 +01:00
# include <plat/cpu.h>
# include <plat/devs.h>
2012-05-12 16:22:18 +09:00
# include <plat/cpu-freq.h>
2013-04-12 21:17:22 +02:00
# include <plat/pwm-core.h>
2005-04-16 15:20:36 -07:00
2013-02-08 10:31:28 -08:00
# include "common.h"
2005-04-16 15:20:36 -07:00
/* table of supported CPUs */
static const char name_s3c2410 [ ] = " S3C2410 " ;
2006-06-24 21:21:27 +01:00
static const char name_s3c2412 [ ] = " S3C2412 " ;
2010-04-30 16:32:26 +09:00
static const char name_s3c2416 [ ] = " S3C2416/S3C2450 " ;
2005-04-16 15:20:36 -07:00
static const char name_s3c2440 [ ] = " S3C2440 " ;
2006-06-18 23:06:41 +01:00
static const char name_s3c2442 [ ] = " S3C2442 " ;
2009-09-22 21:40:39 +01:00
static const char name_s3c2442b [ ] = " S3C2442B " ;
2007-02-16 12:12:31 +01:00
static const char name_s3c2443 [ ] = " S3C2443 " ;
2005-04-16 15:20:36 -07:00
static const char name_s3c2410a [ ] = " S3C2410A " ;
static const char name_s3c2440a [ ] = " S3C2440A " ;
static struct cpu_table cpu_ids [ ] __initdata = {
{
. idcode = 0x32410000 ,
. idmask = 0xffffffff ,
. map_io = s3c2410_map_io ,
. init_uarts = s3c2410_init_uarts ,
. init = s3c2410_init ,
. name = name_s3c2410
} ,
{
. idcode = 0x32410002 ,
. idmask = 0xffffffff ,
. map_io = s3c2410_map_io ,
. init_uarts = s3c2410_init_uarts ,
2009-07-30 23:23:38 +01:00
. init = s3c2410a_init ,
2005-04-16 15:20:36 -07:00
. name = name_s3c2410a
} ,
{
. idcode = 0x32440000 ,
. idmask = 0xffffffff ,
2010-12-01 08:29:23 +02:00
. map_io = s3c2440_map_io ,
2006-06-18 23:06:41 +01:00
. init_uarts = s3c244x_init_uarts ,
2005-04-16 15:20:36 -07:00
. init = s3c2440_init ,
. name = name_s3c2440
} ,
{
. idcode = 0x32440001 ,
. idmask = 0xffffffff ,
2010-12-01 08:29:23 +02:00
. map_io = s3c2440_map_io ,
2006-06-18 23:06:41 +01:00
. init_uarts = s3c244x_init_uarts ,
2005-04-16 15:20:36 -07:00
. init = s3c2440_init ,
. name = name_s3c2440a
2006-02-01 21:24:24 +00:00
} ,
2006-06-18 23:06:41 +01:00
{
. idcode = 0x32440aaa ,
. idmask = 0xffffffff ,
2010-12-01 08:29:23 +02:00
. map_io = s3c2442_map_io ,
2006-06-18 23:06:41 +01:00
. init_uarts = s3c244x_init_uarts ,
. init = s3c2442_init ,
. name = name_s3c2442
} ,
2009-09-22 21:40:39 +01:00
{
. idcode = 0x32440aab ,
. idmask = 0xffffffff ,
2010-12-01 08:29:23 +02:00
. map_io = s3c2442_map_io ,
2009-09-22 21:40:39 +01:00
. init_uarts = s3c244x_init_uarts ,
. init = s3c2442_init ,
. name = name_s3c2442b
} ,
2006-06-24 21:21:27 +01:00
{
. idcode = 0x32412001 ,
. idmask = 0xffffffff ,
. map_io = s3c2412_map_io ,
. init_uarts = s3c2412_init_uarts ,
. init = s3c2412_init ,
. name = name_s3c2412 ,
} ,
2006-09-20 20:39:15 +01:00
{ /* a newer version of the s3c2412 */
. idcode = 0x32412003 ,
. idmask = 0xffffffff ,
. map_io = s3c2412_map_io ,
. init_uarts = s3c2412_init_uarts ,
. init = s3c2412_init ,
. name = name_s3c2412 ,
} ,
2010-04-28 18:09:01 +09:00
{ /* a strange version of the s3c2416 */
. idcode = 0x32450003 ,
. idmask = 0xffffffff ,
. map_io = s3c2416_map_io ,
. init_uarts = s3c2416_init_uarts ,
. init = s3c2416_init ,
. name = name_s3c2416 ,
} ,
2007-02-16 12:12:31 +01:00
{
. idcode = 0x32443001 ,
. idmask = 0xffffffff ,
. map_io = s3c2443_map_io ,
. init_uarts = s3c2443_init_uarts ,
. init = s3c2443_init ,
. name = name_s3c2443 ,
} ,
2005-04-16 15:20:36 -07:00
} ;
/* minimal IO mapping */
static struct map_desc s3c_iodesc [ ] __initdata = {
IODESC_ENT ( GPIO ) ,
IODESC_ENT ( IRQ ) ,
IODESC_ENT ( MEMCTRL ) ,
IODESC_ENT ( UART )
} ;
2008-10-21 14:06:31 +01:00
/* read cpu identificaiton code */
2005-04-16 15:20:36 -07:00
2006-06-24 21:21:27 +01:00
static unsigned long s3c24xx_read_idcode_v5 ( void )
{
2010-04-28 18:00:07 +09:00
# if defined(CONFIG_CPU_S3C2416)
/* s3c2416 is v5, with S3C24XX_GSTATUS1 instead of S3C2412_GSTATUS1 */
u32 gs = __raw_readl ( S3C24XX_GSTATUS1 ) ;
/* test for s3c2416 or similar device */
if ( ( gs > > 16 ) = = 0x3245 )
return gs ;
# endif
2006-06-24 21:21:27 +01:00
# if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
return __raw_readl ( S3C2412_GSTATUS1 ) ;
# else
return 1UL ; /* don't look like an 2400 */
# endif
}
static unsigned long s3c24xx_read_idcode_v4 ( void )
{
return __raw_readl ( S3C2410_GSTATUS1 ) ;
}
2011-08-03 11:34:59 -04:00
static void s3c24xx_default_idle ( void )
{
2013-01-18 08:58:23 -08:00
unsigned long tmp = 0 ;
2011-08-03 11:34:59 -04:00
int i ;
/* idle the system by using the idle mode which will wait for an
* interrupt to happen before restarting the system .
*/
/* Warning: going into idle state upsets jtag scanning */
__raw_writel ( __raw_readl ( S3C2410_CLKCON ) | S3C2410_CLKCON_IDLE ,
S3C2410_CLKCON ) ;
/* the samsung port seems to do a loop and then unset idle.. */
for ( i = 0 ; i < 50 ; i + + )
tmp + = __raw_readl ( S3C2410_CLKCON ) ; /* ensure loop not optimised out */
/* this bit is not cleared on re-start... */
__raw_writel ( __raw_readl ( S3C2410_CLKCON ) & ~ S3C2410_CLKCON_IDLE ,
S3C2410_CLKCON ) ;
}
2013-04-12 21:17:22 +02:00
static struct samsung_pwm_variant s3c24xx_pwm_variant = {
. bits = 16 ,
. div_base = 1 ,
. has_tint_cstat = false ,
. tclk_mask = ( 1 < < 4 ) ,
} ;
2005-04-16 15:20:36 -07:00
void __init s3c24xx_init_io ( struct map_desc * mach_desc , int size )
{
2011-08-03 11:34:59 -04:00
arm_pm_idle = s3c24xx_default_idle ;
2005-04-16 15:20:36 -07:00
/* initialise the io descriptors we need for initialisation */
2008-10-21 14:06:31 +01:00
iotable_init ( mach_desc , size ) ;
2005-04-16 15:20:36 -07:00
iotable_init ( s3c_iodesc , ARRAY_SIZE ( s3c_iodesc ) ) ;
2006-06-24 21:21:27 +01:00
if ( cpu_architecture ( ) > = CPU_ARCH_ARMv5 ) {
2011-08-20 02:18:18 +09:00
samsung_cpu_id = s3c24xx_read_idcode_v5 ( ) ;
2006-06-24 21:21:27 +01:00
} else {
2011-08-20 02:18:18 +09:00
samsung_cpu_id = s3c24xx_read_idcode_v4 ( ) ;
2006-06-24 21:21:27 +01:00
}
2006-02-01 21:24:24 +00:00
2011-08-20 02:18:18 +09:00
s3c_init_cpu ( samsung_cpu_id , cpu_ids , ARRAY_SIZE ( cpu_ids ) ) ;
2013-04-12 21:17:22 +02:00
samsung_pwm_set_platdata ( & s3c24xx_pwm_variant ) ;
2006-06-18 23:04:05 +01:00
}
2012-05-12 16:22:17 +09:00
2013-04-28 02:25:01 +02:00
void __init samsung_set_timer_source ( unsigned int event , unsigned int source )
{
s3c24xx_pwm_variant . output_mask = BIT ( SAMSUNG_PWM_NUM ) - 1 ;
s3c24xx_pwm_variant . output_mask & = ~ ( BIT ( event ) | BIT ( source ) ) ;
}
void __init samsung_timer_init ( void )
{
unsigned int timer_irqs [ SAMSUNG_PWM_NUM ] = {
IRQ_TIMER0 , IRQ_TIMER1 , IRQ_TIMER2 , IRQ_TIMER3 , IRQ_TIMER4 ,
} ;
samsung_pwm_clocksource_init ( S3C_VA_TIMER ,
timer_irqs , & s3c24xx_pwm_variant ) ;
}
2012-05-12 16:22:17 +09:00
/* Serial port registrations */
2013-04-11 02:04:48 +02:00
# define S3C2410_PA_UART0 (S3C24XX_PA_UART)
# define S3C2410_PA_UART1 (S3C24XX_PA_UART + 0x4000 )
# define S3C2410_PA_UART2 (S3C24XX_PA_UART + 0x8000 )
# define S3C2443_PA_UART3 (S3C24XX_PA_UART + 0xC000 )
2012-05-12 16:22:17 +09:00
static struct resource s3c2410_uart0_resource [ ] = {
2012-05-12 16:24:59 +09:00
[ 0 ] = DEFINE_RES_MEM ( S3C2410_PA_UART0 , SZ_16K ) ,
[ 1 ] = DEFINE_RES_NAMED ( IRQ_S3CUART_RX0 , \
IRQ_S3CUART_ERR0 - IRQ_S3CUART_RX0 + 1 , \
NULL , IORESOURCE_IRQ )
2012-05-12 16:22:17 +09:00
} ;
static struct resource s3c2410_uart1_resource [ ] = {
2012-05-12 16:24:59 +09:00
[ 0 ] = DEFINE_RES_MEM ( S3C2410_PA_UART1 , SZ_16K ) ,
[ 1 ] = DEFINE_RES_NAMED ( IRQ_S3CUART_RX1 , \
IRQ_S3CUART_ERR1 - IRQ_S3CUART_RX1 + 1 , \
NULL , IORESOURCE_IRQ )
2012-05-12 16:22:17 +09:00
} ;
static struct resource s3c2410_uart2_resource [ ] = {
2012-05-12 16:24:59 +09:00
[ 0 ] = DEFINE_RES_MEM ( S3C2410_PA_UART2 , SZ_16K ) ,
[ 1 ] = DEFINE_RES_NAMED ( IRQ_S3CUART_RX2 , \
IRQ_S3CUART_ERR2 - IRQ_S3CUART_RX2 + 1 , \
NULL , IORESOURCE_IRQ )
2012-05-12 16:22:17 +09:00
} ;
static struct resource s3c2410_uart3_resource [ ] = {
2012-05-12 16:24:59 +09:00
[ 0 ] = DEFINE_RES_MEM ( S3C2443_PA_UART3 , SZ_16K ) ,
[ 1 ] = DEFINE_RES_NAMED ( IRQ_S3CUART_RX3 , \
IRQ_S3CUART_ERR3 - IRQ_S3CUART_RX3 + 1 , \
NULL , IORESOURCE_IRQ )
2012-05-12 16:22:17 +09:00
} ;
struct s3c24xx_uart_resources s3c2410_uart_resources [ ] __initdata = {
[ 0 ] = {
. resources = s3c2410_uart0_resource ,
. nr_resources = ARRAY_SIZE ( s3c2410_uart0_resource ) ,
} ,
[ 1 ] = {
. resources = s3c2410_uart1_resource ,
. nr_resources = ARRAY_SIZE ( s3c2410_uart1_resource ) ,
} ,
[ 2 ] = {
. resources = s3c2410_uart2_resource ,
. nr_resources = ARRAY_SIZE ( s3c2410_uart2_resource ) ,
} ,
[ 3 ] = {
. resources = s3c2410_uart3_resource ,
. nr_resources = ARRAY_SIZE ( s3c2410_uart3_resource ) ,
} ,
} ;
2012-05-12 16:22:18 +09:00
2016-08-04 11:56:12 +02:00
# define s3c24xx_device_dma_mask (*((u64[]) { DMA_BIT_MASK(32) }))
2013-10-08 06:42:10 +09:00
# if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \
defined ( CONFIG_CPU_S3C2440 ) | | defined ( CONFIG_CPU_S3C2442 )
static struct resource s3c2410_dma_resource [ ] = {
[ 0 ] = DEFINE_RES_MEM ( S3C24XX_PA_DMA , S3C24XX_SZ_DMA ) ,
[ 1 ] = DEFINE_RES_IRQ ( IRQ_DMA0 ) ,
[ 2 ] = DEFINE_RES_IRQ ( IRQ_DMA1 ) ,
[ 3 ] = DEFINE_RES_IRQ ( IRQ_DMA2 ) ,
[ 4 ] = DEFINE_RES_IRQ ( IRQ_DMA3 ) ,
} ;
# endif
2013-10-21 05:32:48 +09:00
# if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2442)
static struct s3c24xx_dma_channel s3c2410_dma_channels [ DMACH_MAX ] = {
[ DMACH_XD0 ] = { S3C24XX_DMA_AHB , true , S3C24XX_DMA_CHANREQ ( 0 , 0 ) , } ,
[ DMACH_XD1 ] = { S3C24XX_DMA_AHB , true , S3C24XX_DMA_CHANREQ ( 0 , 1 ) , } ,
[ DMACH_SDI ] = { S3C24XX_DMA_APB , false , S3C24XX_DMA_CHANREQ ( 2 , 0 ) |
S3C24XX_DMA_CHANREQ ( 2 , 2 ) |
S3C24XX_DMA_CHANREQ ( 1 , 3 ) ,
} ,
[ DMACH_SPI0 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 3 , 1 ) , } ,
[ DMACH_SPI1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 2 , 3 ) , } ,
[ DMACH_UART0 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 1 , 0 ) , } ,
[ DMACH_UART1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 1 , 1 ) , } ,
[ DMACH_UART2 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 0 , 3 ) , } ,
[ DMACH_TIMER ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 3 , 0 ) |
S3C24XX_DMA_CHANREQ ( 3 , 2 ) |
S3C24XX_DMA_CHANREQ ( 3 , 3 ) ,
} ,
[ DMACH_I2S_IN ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 2 , 1 ) |
S3C24XX_DMA_CHANREQ ( 1 , 2 ) ,
} ,
[ DMACH_I2S_OUT ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 0 , 2 ) , } ,
[ DMACH_USB_EP1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 0 ) , } ,
[ DMACH_USB_EP2 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 1 ) , } ,
[ DMACH_USB_EP3 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 2 ) , } ,
[ DMACH_USB_EP4 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 3 ) , } ,
} ;
2016-11-04 10:45:53 +01:00
static const struct dma_slave_map s3c2410_dma_slave_map [ ] = {
{ " s3c2410-sdi " , " rx-tx " , ( void * ) DMACH_SDI } ,
{ " s3c2410-spi.0 " , " rx " , ( void * ) DMACH_SPI0_RX } ,
{ " s3c2410-spi.0 " , " tx " , ( void * ) DMACH_SPI0_TX } ,
{ " s3c2410-spi.1 " , " rx " , ( void * ) DMACH_SPI1_RX } ,
{ " s3c2410-spi.1 " , " tx " , ( void * ) DMACH_SPI1_TX } ,
/*
* The DMA request source [ 1 ] ( DMACH_UARTx_SRC2 ) are
* not used in the UART driver .
*/
{ " s3c2410-uart.0 " , " rx " , ( void * ) DMACH_UART0 } ,
{ " s3c2410-uart.0 " , " tx " , ( void * ) DMACH_UART0 } ,
{ " s3c2410-uart.1 " , " rx " , ( void * ) DMACH_UART1 } ,
{ " s3c2410-uart.1 " , " tx " , ( void * ) DMACH_UART1 } ,
{ " s3c2410-uart.2 " , " rx " , ( void * ) DMACH_UART2 } ,
{ " s3c2410-uart.2 " , " tx " , ( void * ) DMACH_UART2 } ,
{ " s3c24xx-iis " , " rx " , ( void * ) DMACH_I2S_IN } ,
{ " s3c24xx-iis " , " tx " , ( void * ) DMACH_I2S_OUT } ,
{ " s3c-hsudc " , " rx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " tx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " rx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " tx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " rx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " tx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " rx3 " , ( void * ) DMACH_USB_EP4 } ,
{ " s3c-hsudc " , " tx3 " , ( void * ) DMACH_USB_EP4 }
} ;
2013-10-21 05:32:48 +09:00
static struct s3c24xx_dma_platdata s3c2410_dma_platdata = {
. num_phy_channels = 4 ,
. channels = s3c2410_dma_channels ,
. num_channels = DMACH_MAX ,
2016-11-04 10:45:53 +01:00
. slave_map = s3c2410_dma_slave_map ,
. slavecnt = ARRAY_SIZE ( s3c2410_dma_slave_map ) ,
2013-10-21 05:32:48 +09:00
} ;
struct platform_device s3c2410_device_dma = {
. name = " s3c2410-dma " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c2410_dma_resource ) ,
. resource = s3c2410_dma_resource ,
. dev = {
2016-08-04 11:56:12 +02:00
. dma_mask = & s3c24xx_device_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & s3c2410_dma_platdata ,
2013-10-21 05:32:48 +09:00
} ,
} ;
# endif
2013-10-08 06:42:10 +09:00
# ifdef CONFIG_CPU_S3C2412
static struct s3c24xx_dma_channel s3c2412_dma_channels [ DMACH_MAX ] = {
[ DMACH_XD0 ] = { S3C24XX_DMA_AHB , true , 17 } ,
[ DMACH_XD1 ] = { S3C24XX_DMA_AHB , true , 18 } ,
[ DMACH_SDI ] = { S3C24XX_DMA_APB , false , 10 } ,
[ DMACH_SPI0_RX ] = { S3C24XX_DMA_APB , true , 1 } ,
[ DMACH_SPI0_TX ] = { S3C24XX_DMA_APB , true , 0 } ,
[ DMACH_SPI1_RX ] = { S3C24XX_DMA_APB , true , 3 } ,
[ DMACH_SPI1_TX ] = { S3C24XX_DMA_APB , true , 2 } ,
[ DMACH_UART0 ] = { S3C24XX_DMA_APB , true , 19 } ,
[ DMACH_UART1 ] = { S3C24XX_DMA_APB , true , 21 } ,
[ DMACH_UART2 ] = { S3C24XX_DMA_APB , true , 23 } ,
[ DMACH_UART0_SRC2 ] = { S3C24XX_DMA_APB , true , 20 } ,
[ DMACH_UART1_SRC2 ] = { S3C24XX_DMA_APB , true , 22 } ,
[ DMACH_UART2_SRC2 ] = { S3C24XX_DMA_APB , true , 24 } ,
[ DMACH_TIMER ] = { S3C24XX_DMA_APB , true , 9 } ,
[ DMACH_I2S_IN ] = { S3C24XX_DMA_APB , true , 5 } ,
[ DMACH_I2S_OUT ] = { S3C24XX_DMA_APB , true , 4 } ,
[ DMACH_USB_EP1 ] = { S3C24XX_DMA_APB , true , 13 } ,
[ DMACH_USB_EP2 ] = { S3C24XX_DMA_APB , true , 14 } ,
[ DMACH_USB_EP3 ] = { S3C24XX_DMA_APB , true , 15 } ,
[ DMACH_USB_EP4 ] = { S3C24XX_DMA_APB , true , 16 } ,
} ;
2016-11-04 10:45:53 +01:00
static const struct dma_slave_map s3c2412_dma_slave_map [ ] = {
{ " s3c2412-sdi " , " rx-tx " , ( void * ) DMACH_SDI } ,
{ " s3c2412-spi.0 " , " rx " , ( void * ) DMACH_SPI0_RX } ,
{ " s3c2412-spi.0 " , " tx " , ( void * ) DMACH_SPI0_TX } ,
{ " s3c2412-spi.1 " , " rx " , ( void * ) DMACH_SPI1_RX } ,
{ " s3c2412-spi.1 " , " tx " , ( void * ) DMACH_SPI1_TX } ,
{ " s3c2440-uart.0 " , " rx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.0 " , " tx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.1 " , " rx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.1 " , " tx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.2 " , " rx " , ( void * ) DMACH_UART2 } ,
{ " s3c2440-uart.2 " , " tx " , ( void * ) DMACH_UART2 } ,
{ " s3c2412-iis " , " rx " , ( void * ) DMACH_I2S_IN } ,
{ " s3c2412-iis " , " tx " , ( void * ) DMACH_I2S_OUT } ,
{ " s3c-hsudc " , " rx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " tx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " rx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " tx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " rx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " tx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " rx3 " , ( void * ) DMACH_USB_EP4 } ,
{ " s3c-hsudc " , " tx3 " , ( void * ) DMACH_USB_EP4 }
} ;
2013-10-08 06:42:10 +09:00
static struct s3c24xx_dma_platdata s3c2412_dma_platdata = {
. num_phy_channels = 4 ,
. channels = s3c2412_dma_channels ,
. num_channels = DMACH_MAX ,
2016-11-04 10:45:53 +01:00
. slave_map = s3c2412_dma_slave_map ,
. slavecnt = ARRAY_SIZE ( s3c2412_dma_slave_map ) ,
2013-10-08 06:42:10 +09:00
} ;
struct platform_device s3c2412_device_dma = {
. name = " s3c2412-dma " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c2410_dma_resource ) ,
. resource = s3c2410_dma_resource ,
. dev = {
2016-08-04 11:56:12 +02:00
. dma_mask = & s3c24xx_device_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & s3c2412_dma_platdata ,
2013-10-08 06:42:10 +09:00
} ,
} ;
# endif
2013-10-21 05:32:48 +09:00
# if defined(CONFIG_CPU_S3C2440)
static struct s3c24xx_dma_channel s3c2440_dma_channels [ DMACH_MAX ] = {
[ DMACH_XD0 ] = { S3C24XX_DMA_AHB , true , S3C24XX_DMA_CHANREQ ( 0 , 0 ) , } ,
[ DMACH_XD1 ] = { S3C24XX_DMA_AHB , true , S3C24XX_DMA_CHANREQ ( 0 , 1 ) , } ,
[ DMACH_SDI ] = { S3C24XX_DMA_APB , false , S3C24XX_DMA_CHANREQ ( 2 , 0 ) |
S3C24XX_DMA_CHANREQ ( 6 , 1 ) |
S3C24XX_DMA_CHANREQ ( 2 , 2 ) |
S3C24XX_DMA_CHANREQ ( 1 , 3 ) ,
} ,
[ DMACH_SPI0 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 3 , 1 ) , } ,
[ DMACH_SPI1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 2 , 3 ) , } ,
[ DMACH_UART0 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 1 , 0 ) , } ,
[ DMACH_UART1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 1 , 1 ) , } ,
[ DMACH_UART2 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 0 , 3 ) , } ,
[ DMACH_TIMER ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 3 , 0 ) |
S3C24XX_DMA_CHANREQ ( 3 , 2 ) |
S3C24XX_DMA_CHANREQ ( 3 , 3 ) ,
} ,
[ DMACH_I2S_IN ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 2 , 1 ) |
S3C24XX_DMA_CHANREQ ( 1 , 2 ) ,
} ,
[ DMACH_I2S_OUT ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 5 , 0 ) |
S3C24XX_DMA_CHANREQ ( 0 , 2 ) ,
} ,
[ DMACH_PCM_IN ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 6 , 0 ) |
S3C24XX_DMA_CHANREQ ( 5 , 2 ) ,
} ,
[ DMACH_PCM_OUT ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 5 , 1 ) |
S3C24XX_DMA_CHANREQ ( 6 , 3 ) ,
} ,
[ DMACH_MIC_IN ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 6 , 2 ) |
S3C24XX_DMA_CHANREQ ( 5 , 3 ) ,
} ,
[ DMACH_USB_EP1 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 0 ) , } ,
[ DMACH_USB_EP2 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 1 ) , } ,
[ DMACH_USB_EP3 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 2 ) , } ,
[ DMACH_USB_EP4 ] = { S3C24XX_DMA_APB , true , S3C24XX_DMA_CHANREQ ( 4 , 3 ) , } ,
} ;
2016-09-22 20:51:15 +02:00
static const struct dma_slave_map s3c2440_dma_slave_map [ ] = {
/* TODO: DMACH_XD0 */
/* TODO: DMACH_XD1 */
{ " s3c2440-sdi " , " rx-tx " , ( void * ) DMACH_SDI } ,
{ " s3c2410-spi.0 " , " rx " , ( void * ) DMACH_SPI0 } ,
{ " s3c2410-spi.0 " , " tx " , ( void * ) DMACH_SPI0 } ,
{ " s3c2410-spi.1 " , " rx " , ( void * ) DMACH_SPI1 } ,
{ " s3c2410-spi.1 " , " tx " , ( void * ) DMACH_SPI1 } ,
{ " s3c2440-uart.0 " , " rx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.0 " , " tx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.1 " , " rx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.1 " , " tx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.2 " , " rx " , ( void * ) DMACH_UART2 } ,
{ " s3c2440-uart.2 " , " tx " , ( void * ) DMACH_UART2 } ,
{ " s3c2440-uart.3 " , " rx " , ( void * ) DMACH_UART3 } ,
{ " s3c2440-uart.3 " , " tx " , ( void * ) DMACH_UART3 } ,
/* TODO: DMACH_TIMER */
{ " s3c24xx-iis " , " rx " , ( void * ) DMACH_I2S_IN } ,
{ " s3c24xx-iis " , " tx " , ( void * ) DMACH_I2S_OUT } ,
{ " samsung-ac97 " , " rx " , ( void * ) DMACH_PCM_IN } ,
{ " samsung-ac97 " , " tx " , ( void * ) DMACH_PCM_OUT } ,
{ " samsung-ac97 " , " rx " , ( void * ) DMACH_MIC_IN } ,
{ " s3c-hsudc " , " rx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " rx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " rx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " rx3 " , ( void * ) DMACH_USB_EP4 } ,
{ " s3c-hsudc " , " tx0 " , ( void * ) DMACH_USB_EP1 } ,
{ " s3c-hsudc " , " tx1 " , ( void * ) DMACH_USB_EP2 } ,
{ " s3c-hsudc " , " tx2 " , ( void * ) DMACH_USB_EP3 } ,
{ " s3c-hsudc " , " tx3 " , ( void * ) DMACH_USB_EP4 }
} ;
2013-10-21 05:32:48 +09:00
static struct s3c24xx_dma_platdata s3c2440_dma_platdata = {
. num_phy_channels = 4 ,
. channels = s3c2440_dma_channels ,
. num_channels = DMACH_MAX ,
2016-09-22 20:51:15 +02:00
. slave_map = s3c2440_dma_slave_map ,
. slavecnt = ARRAY_SIZE ( s3c2440_dma_slave_map ) ,
2013-10-21 05:32:48 +09:00
} ;
struct platform_device s3c2440_device_dma = {
. name = " s3c2410-dma " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c2410_dma_resource ) ,
. resource = s3c2410_dma_resource ,
. dev = {
2016-08-04 11:56:12 +02:00
. dma_mask = & s3c24xx_device_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & s3c2440_dma_platdata ,
2013-10-21 05:32:48 +09:00
} ,
} ;
# endif
2014-02-14 07:35:12 +09:00
# if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
2013-10-08 06:42:10 +09:00
static struct resource s3c2443_dma_resource [ ] = {
[ 0 ] = DEFINE_RES_MEM ( S3C24XX_PA_DMA , S3C24XX_SZ_DMA ) ,
[ 1 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA0 ) ,
[ 2 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA1 ) ,
[ 3 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA2 ) ,
[ 4 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA3 ) ,
[ 5 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA4 ) ,
[ 6 ] = DEFINE_RES_IRQ ( IRQ_S3C2443_DMA5 ) ,
} ;
static struct s3c24xx_dma_channel s3c2443_dma_channels [ DMACH_MAX ] = {
[ DMACH_XD0 ] = { S3C24XX_DMA_AHB , true , 17 } ,
[ DMACH_XD1 ] = { S3C24XX_DMA_AHB , true , 18 } ,
[ DMACH_SDI ] = { S3C24XX_DMA_APB , false , 10 } ,
[ DMACH_SPI0_RX ] = { S3C24XX_DMA_APB , true , 1 } ,
[ DMACH_SPI0_TX ] = { S3C24XX_DMA_APB , true , 0 } ,
[ DMACH_SPI1_RX ] = { S3C24XX_DMA_APB , true , 3 } ,
[ DMACH_SPI1_TX ] = { S3C24XX_DMA_APB , true , 2 } ,
[ DMACH_UART0 ] = { S3C24XX_DMA_APB , true , 19 } ,
[ DMACH_UART1 ] = { S3C24XX_DMA_APB , true , 21 } ,
[ DMACH_UART2 ] = { S3C24XX_DMA_APB , true , 23 } ,
[ DMACH_UART3 ] = { S3C24XX_DMA_APB , true , 25 } ,
[ DMACH_UART0_SRC2 ] = { S3C24XX_DMA_APB , true , 20 } ,
[ DMACH_UART1_SRC2 ] = { S3C24XX_DMA_APB , true , 22 } ,
[ DMACH_UART2_SRC2 ] = { S3C24XX_DMA_APB , true , 24 } ,
[ DMACH_UART3_SRC2 ] = { S3C24XX_DMA_APB , true , 26 } ,
[ DMACH_TIMER ] = { S3C24XX_DMA_APB , true , 9 } ,
[ DMACH_I2S_IN ] = { S3C24XX_DMA_APB , true , 5 } ,
[ DMACH_I2S_OUT ] = { S3C24XX_DMA_APB , true , 4 } ,
[ DMACH_PCM_IN ] = { S3C24XX_DMA_APB , true , 28 } ,
[ DMACH_PCM_OUT ] = { S3C24XX_DMA_APB , true , 27 } ,
[ DMACH_MIC_IN ] = { S3C24XX_DMA_APB , true , 29 } ,
} ;
2016-11-04 10:45:53 +01:00
static const struct dma_slave_map s3c2443_dma_slave_map [ ] = {
{ " s3c2440-sdi " , " rx-tx " , ( void * ) DMACH_SDI } ,
{ " s3c2443-spi.0 " , " rx " , ( void * ) DMACH_SPI0_RX } ,
{ " s3c2443-spi.0 " , " tx " , ( void * ) DMACH_SPI0_TX } ,
{ " s3c2443-spi.1 " , " rx " , ( void * ) DMACH_SPI1_RX } ,
{ " s3c2443-spi.1 " , " tx " , ( void * ) DMACH_SPI1_TX } ,
{ " s3c2440-uart.0 " , " rx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.0 " , " tx " , ( void * ) DMACH_UART0 } ,
{ " s3c2440-uart.1 " , " rx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.1 " , " tx " , ( void * ) DMACH_UART1 } ,
{ " s3c2440-uart.2 " , " rx " , ( void * ) DMACH_UART2 } ,
{ " s3c2440-uart.2 " , " tx " , ( void * ) DMACH_UART2 } ,
{ " s3c2440-uart.3 " , " rx " , ( void * ) DMACH_UART3 } ,
{ " s3c2440-uart.3 " , " tx " , ( void * ) DMACH_UART3 } ,
{ " s3c24xx-iis " , " rx " , ( void * ) DMACH_I2S_IN } ,
{ " s3c24xx-iis " , " tx " , ( void * ) DMACH_I2S_OUT } ,
} ;
2013-10-08 06:42:10 +09:00
static struct s3c24xx_dma_platdata s3c2443_dma_platdata = {
. num_phy_channels = 6 ,
. channels = s3c2443_dma_channels ,
. num_channels = DMACH_MAX ,
2016-11-04 10:45:53 +01:00
. slave_map = s3c2443_dma_slave_map ,
. slavecnt = ARRAY_SIZE ( s3c2443_dma_slave_map ) ,
2013-10-08 06:42:10 +09:00
} ;
struct platform_device s3c2443_device_dma = {
. name = " s3c2443-dma " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c2443_dma_resource ) ,
. resource = s3c2443_dma_resource ,
. dev = {
2016-08-04 11:56:12 +02:00
. dma_mask = & s3c24xx_device_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & s3c2443_dma_platdata ,
2013-10-08 06:42:10 +09:00
} ,
} ;
# endif
2014-02-19 09:26:21 +09:00
2014-05-09 05:49:14 +09:00
# if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2410)
void __init s3c2410_init_clocks ( int xtal )
{
s3c2410_common_clk_init ( NULL , xtal , 0 , S3C24XX_VA_CLKPWR ) ;
}
# endif
2014-02-25 09:50:44 +09:00
# ifdef CONFIG_CPU_S3C2412
void __init s3c2412_init_clocks ( int xtal )
{
s3c2412_common_clk_init ( NULL , xtal , 0 , S3C24XX_VA_CLKPWR ) ;
}
# endif
2014-02-19 09:26:21 +09:00
# ifdef CONFIG_CPU_S3C2416
void __init s3c2416_init_clocks ( int xtal )
{
s3c2443_common_clk_init ( NULL , xtal , 0 , S3C24XX_VA_CLKPWR ) ;
}
# endif
2014-05-09 05:49:14 +09:00
# if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2440)
void __init s3c2440_init_clocks ( int xtal )
{
s3c2410_common_clk_init ( NULL , xtal , 1 , S3C24XX_VA_CLKPWR ) ;
}
# endif
# if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2442)
void __init s3c2442_init_clocks ( int xtal )
{
s3c2410_common_clk_init ( NULL , xtal , 2 , S3C24XX_VA_CLKPWR ) ;
}
# endif
2014-02-19 09:26:21 +09:00
# ifdef CONFIG_CPU_S3C2443
void __init s3c2443_init_clocks ( int xtal )
{
s3c2443_common_clk_init ( NULL , xtal , 1 , S3C24XX_VA_CLKPWR ) ;
}
# endif
2014-05-09 05:48:57 +09:00
# if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2440) || \
defined ( CONFIG_CPU_S3C2442 )
static struct resource s3c2410_dclk_resource [ ] = {
[ 0 ] = DEFINE_RES_MEM ( 0x56000084 , 0x4 ) ,
} ;
struct platform_device s3c2410_device_dclk = {
. name = " s3c2410-dclk " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c2410_dclk_resource ) ,
. resource = s3c2410_dclk_resource ,
} ;
# endif