diff options
Diffstat (limited to 'arch/arm/mach-s3c24xx/common.c')
| -rw-r--r-- | arch/arm/mach-s3c24xx/common.c | 284 | 
1 files changed, 262 insertions, 22 deletions
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c index 457261c9843..c0763b83774 100644 --- a/arch/arm/mach-s3c24xx/common.c +++ b/arch/arm/mach-s3c24xx/common.c @@ -27,10 +27,12 @@  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/serial_core.h> +#include <linux/serial_s3c.h>  #include <clocksource/samsung_pwm.h>  #include <linux/platform_device.h>  #include <linux/delay.h>  #include <linux/io.h> +#include <linux/platform_data/dma-s3c24xx.h>  #include <mach/hardware.h>  #include <mach/regs-clock.h> @@ -43,7 +45,7 @@  #include <asm/mach/map.h>  #include <mach/regs-gpio.h> -#include <plat/regs-serial.h> +#include <mach/dma.h>  #include <plat/cpu.h>  #include <plat/devs.h> @@ -51,6 +53,7 @@  #include <plat/cpu-freq.h>  #include <plat/pll.h>  #include <plat/pwm-core.h> +#include <plat/watchdog-reset.h>  #include "common.h" @@ -71,7 +74,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32410000,  		.idmask		= 0xffffffff,  		.map_io		= s3c2410_map_io, -		.init_clocks	= s3c2410_init_clocks,  		.init_uarts	= s3c2410_init_uarts,  		.init		= s3c2410_init,  		.name		= name_s3c2410 @@ -80,7 +82,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32410002,  		.idmask		= 0xffffffff,  		.map_io		= s3c2410_map_io, -		.init_clocks	= s3c2410_init_clocks,  		.init_uarts	= s3c2410_init_uarts,  		.init		= s3c2410a_init,  		.name		= name_s3c2410a @@ -89,7 +90,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32440000,  		.idmask		= 0xffffffff,  		.map_io		= s3c2440_map_io, -		.init_clocks	= s3c244x_init_clocks,  		.init_uarts	= s3c244x_init_uarts,  		.init		= s3c2440_init,  		.name		= name_s3c2440 @@ -98,7 +98,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32440001,  		.idmask		= 0xffffffff,  		.map_io		= s3c2440_map_io, -		.init_clocks	= s3c244x_init_clocks,  		.init_uarts	= s3c244x_init_uarts,  		.init		= s3c2440_init,  		.name		= name_s3c2440a @@ -107,7 +106,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32440aaa,  		.idmask		= 0xffffffff,  		.map_io		= s3c2442_map_io, -		.init_clocks	= s3c244x_init_clocks,  		.init_uarts	= s3c244x_init_uarts,  		.init		= s3c2442_init,  		.name		= name_s3c2442 @@ -116,7 +114,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32440aab,  		.idmask		= 0xffffffff,  		.map_io		= s3c2442_map_io, -		.init_clocks	= s3c244x_init_clocks,  		.init_uarts	= s3c244x_init_uarts,  		.init		= s3c2442_init,  		.name		= name_s3c2442b @@ -125,7 +122,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32412001,  		.idmask		= 0xffffffff,  		.map_io		= s3c2412_map_io, -		.init_clocks	= s3c2412_init_clocks,  		.init_uarts	= s3c2412_init_uarts,  		.init		= s3c2412_init,  		.name		= name_s3c2412, @@ -134,7 +130,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32412003,  		.idmask		= 0xffffffff,  		.map_io		= s3c2412_map_io, -		.init_clocks	= s3c2412_init_clocks,  		.init_uarts	= s3c2412_init_uarts,  		.init		= s3c2412_init,  		.name		= name_s3c2412, @@ -143,7 +138,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32450003,  		.idmask		= 0xffffffff,  		.map_io		= s3c2416_map_io, -		.init_clocks	= s3c2416_init_clocks,  		.init_uarts	= s3c2416_init_uarts,  		.init		= s3c2416_init,  		.name		= name_s3c2416, @@ -152,7 +146,6 @@ static struct cpu_table cpu_ids[] __initdata = {  		.idcode		= 0x32443001,  		.idmask		= 0xffffffff,  		.map_io		= s3c2443_map_io, -		.init_clocks	= s3c2443_init_clocks,  		.init_uarts	= s3c2443_init_uarts,  		.init		= s3c2443_init,  		.name		= name_s3c2443, @@ -238,7 +231,6 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)  	} else {  		samsung_cpu_id = s3c24xx_read_idcode_v4();  	} -	s3c24xx_init_cpu();  	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); @@ -315,17 +307,265 @@ struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = {  	},  }; -/* initialise all the clocks */ +#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 + +#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), }, +}; + +static struct s3c24xx_dma_platdata s3c2410_dma_platdata = { +	.num_phy_channels = 4, +	.channels = s3c2410_dma_channels, +	.num_channels = DMACH_MAX, +}; + +struct platform_device s3c2410_device_dma = { +	.name		= "s3c2410-dma", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(s3c2410_dma_resource), +	.resource	= s3c2410_dma_resource, +	.dev	= { +		.platform_data	= &s3c2410_dma_platdata, +	}, +}; +#endif + +#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 }, +}; + +static struct s3c24xx_dma_platdata s3c2412_dma_platdata = { +	.num_phy_channels = 4, +	.channels = s3c2412_dma_channels, +	.num_channels = DMACH_MAX, +}; + +struct platform_device s3c2412_device_dma = { +	.name		= "s3c2412-dma", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(s3c2410_dma_resource), +	.resource	= s3c2410_dma_resource, +	.dev	= { +		.platform_data	= &s3c2412_dma_platdata, +	}, +}; +#endif + +#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), }, +}; + +static struct s3c24xx_dma_platdata s3c2440_dma_platdata = { +	.num_phy_channels = 4, +	.channels = s3c2440_dma_channels, +	.num_channels = DMACH_MAX, +}; + +struct platform_device s3c2440_device_dma = { +	.name		= "s3c2410-dma", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(s3c2410_dma_resource), +	.resource	= s3c2410_dma_resource, +	.dev	= { +		.platform_data	= &s3c2440_dma_platdata, +	}, +}; +#endif -void __init_or_cpufreq s3c24xx_setup_clocks(unsigned long fclk, -					   unsigned long hclk, -					   unsigned long pclk) +#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) +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 }, +}; + +static struct s3c24xx_dma_platdata s3c2443_dma_platdata = { +	.num_phy_channels = 6, +	.channels = s3c2443_dma_channels, +	.num_channels = DMACH_MAX, +}; + +struct platform_device s3c2443_device_dma = { +	.name		= "s3c2443-dma", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(s3c2443_dma_resource), +	.resource	= s3c2443_dma_resource, +	.dev	= { +		.platform_data	= &s3c2443_dma_platdata, +	}, +}; +#endif + +#if defined(CONFIG_COMMON_CLK) && defined(CONFIG_CPU_S3C2410) +void __init s3c2410_init_clocks(int xtal)  { -	clk_upll.rate = s3c24xx_get_pll(__raw_readl(S3C2410_UPLLCON), -					clk_xtal.rate); +	s3c2410_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR); +	samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); +} +#endif -	clk_mpll.rate = fclk; -	clk_h.rate = hclk; -	clk_p.rate = pclk; -	clk_f.rate = fclk; +#ifdef CONFIG_CPU_S3C2412 +void __init s3c2412_init_clocks(int xtal) +{ +	s3c2412_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR);  } +#endif + +#ifdef CONFIG_CPU_S3C2416 +void __init s3c2416_init_clocks(int xtal) +{ +	s3c2443_common_clk_init(NULL, xtal, 0, S3C24XX_VA_CLKPWR); +} +#endif + +#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); +	samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); +} +#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); +	samsung_wdt_reset_init(S3C24XX_VA_WATCHDOG); +} +#endif + +#ifdef CONFIG_CPU_S3C2443 +void __init s3c2443_init_clocks(int xtal) +{ +	s3c2443_common_clk_init(NULL, xtal, 1, S3C24XX_VA_CLKPWR); +} +#endif + +#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  | 
