diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh2a/setup-sh7203.c')
| -rw-r--r-- | arch/sh/kernel/cpu/sh2a/setup-sh7203.c | 154 | 
1 files changed, 154 insertions, 0 deletions
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c index 820dfb2e865..62e3039d239 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c @@ -11,6 +11,8 @@  #include <linux/init.h>  #include <linux/serial.h>  #include <linux/serial_sci.h> +#include <linux/sh_timer.h> +#include <linux/io.h>  enum {  	UNUSED = 0, @@ -205,6 +207,132 @@ static struct platform_device sci_device = {  	},  }; +static struct sh_timer_config cmt0_platform_data = { +	.name = "CMT0", +	.channel_offset = 0x02, +	.timer_bit = 0, +	.clk = "peripheral_clk", +	.clockevent_rating = 125, +	.clocksource_rating = 0, /* disabled due to code generation issues */ +}; + +static struct resource cmt0_resources[] = { +	[0] = { +		.name	= "CMT0", +		.start	= 0xfffec002, +		.end	= 0xfffec007, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 142, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device cmt0_device = { +	.name		= "sh_cmt", +	.id		= 0, +	.dev = { +		.platform_data	= &cmt0_platform_data, +	}, +	.resource	= cmt0_resources, +	.num_resources	= ARRAY_SIZE(cmt0_resources), +}; + +static struct sh_timer_config cmt1_platform_data = { +	.name = "CMT1", +	.channel_offset = 0x08, +	.timer_bit = 1, +	.clk = "peripheral_clk", +	.clockevent_rating = 125, +	.clocksource_rating = 0, /* disabled due to code generation issues */ +}; + +static struct resource cmt1_resources[] = { +	[0] = { +		.name	= "CMT1", +		.start	= 0xfffec008, +		.end	= 0xfffec00d, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 143, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device cmt1_device = { +	.name		= "sh_cmt", +	.id		= 1, +	.dev = { +		.platform_data	= &cmt1_platform_data, +	}, +	.resource	= cmt1_resources, +	.num_resources	= ARRAY_SIZE(cmt1_resources), +}; + +static struct sh_timer_config mtu2_0_platform_data = { +	.name = "MTU2_0", +	.channel_offset = -0x80, +	.timer_bit = 0, +	.clk = "peripheral_clk", +	.clockevent_rating = 200, +}; + +static struct resource mtu2_0_resources[] = { +	[0] = { +		.name	= "MTU2_0", +		.start	= 0xfffe4300, +		.end	= 0xfffe4326, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 146, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device mtu2_0_device = { +	.name		= "sh_mtu2", +	.id		= 0, +	.dev = { +		.platform_data	= &mtu2_0_platform_data, +	}, +	.resource	= mtu2_0_resources, +	.num_resources	= ARRAY_SIZE(mtu2_0_resources), +}; + +static struct sh_timer_config mtu2_1_platform_data = { +	.name = "MTU2_1", +	.channel_offset = -0x100, +	.timer_bit = 1, +	.clk = "peripheral_clk", +	.clockevent_rating = 200, +}; + +static struct resource mtu2_1_resources[] = { +	[0] = { +		.name	= "MTU2_1", +		.start	= 0xfffe4380, +		.end	= 0xfffe4390, +		.flags	= IORESOURCE_MEM, +	}, +	[1] = { +		.start	= 153, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device mtu2_1_device = { +	.name		= "sh_mtu2", +	.id		= 1, +	.dev = { +		.platform_data	= &mtu2_1_platform_data, +	}, +	.resource	= mtu2_1_resources, +	.num_resources	= ARRAY_SIZE(mtu2_1_resources), +}; +  static struct resource rtc_resources[] = {  	[0] = {  		.start	= 0xffff2000, @@ -227,6 +355,10 @@ static struct platform_device rtc_device = {  static struct platform_device *sh7203_devices[] __initdata = {  	&sci_device, +	&cmt0_device, +	&cmt1_device, +	&mtu2_0_device, +	&mtu2_1_device,  	&rtc_device,  }; @@ -241,3 +373,25 @@ void __init plat_irq_setup(void)  {  	register_intc_controller(&intc_desc);  } + +static struct platform_device *sh7203_early_devices[] __initdata = { +	&cmt0_device, +	&cmt1_device, +	&mtu2_0_device, +	&mtu2_1_device, +}; + +#define STBCR3 0xfffe0408 +#define STBCR4 0xfffe040c + +void __init plat_early_device_setup(void) +{ +	/* enable CMT clock */ +	__raw_writeb(__raw_readb(STBCR4) & ~0x04, STBCR4); + +	/* enable MTU2 clock */ +	__raw_writeb(__raw_readb(STBCR3) & ~0x20, STBCR3); + +	early_platform_add_devices(sh7203_early_devices, +				   ARRAY_SIZE(sh7203_early_devices)); +}  |