xref: /openbmc/linux/arch/sh/kernel/cpu/sh3/setup-sh7710.c (revision d850acf975bee46e43c3cd80d2d287010195c63b)
1e5723e0eSPaul Mundt /*
2ac919986SMagnus Damm  * SH3 Setup code for SH7710, SH7712
3e5723e0eSPaul Mundt  *
456d604deSPaul Mundt  *  Copyright (C) 2006 - 2009  Paul Mundt
59465a54fSNobuhiro Iwamatsu  *  Copyright (C) 2007  Nobuhiro Iwamatsu
6e5723e0eSPaul Mundt  *
7e5723e0eSPaul Mundt  * This file is subject to the terms and conditions of the GNU General Public
8e5723e0eSPaul Mundt  * License.  See the file "COPYING" in the main directory of this archive
9e5723e0eSPaul Mundt  * for more details.
10e5723e0eSPaul Mundt  */
11e5723e0eSPaul Mundt #include <linux/platform_device.h>
12e5723e0eSPaul Mundt #include <linux/init.h>
1328b146c8SMagnus Damm #include <linux/irq.h>
14e5723e0eSPaul Mundt #include <linux/serial.h>
1596de1a8fSPaul Mundt #include <linux/serial_sci.h>
16e5ad0089SMagnus Damm #include <linux/sh_timer.h>
175d0af769SPaul Mundt #include <linux/sh_intc.h>
18ad89f87aSPaul Mundt #include <asm/rtc.h>
19e5723e0eSPaul Mundt 
2028b146c8SMagnus Damm enum {
2128b146c8SMagnus Damm 	UNUSED = 0,
2228b146c8SMagnus Damm 
2328b146c8SMagnus Damm 	/* interrupt sources */
2428b146c8SMagnus Damm 	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5,
2556d604deSPaul Mundt 	DMAC1, SCIF0, SCIF1, DMAC2, IPSEC,
2628b146c8SMagnus Damm 	EDMAC0, EDMAC1, EDMAC2,
2756d604deSPaul Mundt 	SIOF0, SIOF1,
2828b146c8SMagnus Damm 
2956d604deSPaul Mundt 	TMU0, TMU1, TMU2,
3056d604deSPaul Mundt 	RTC, WDT, REF,
3128b146c8SMagnus Damm };
3228b146c8SMagnus Damm 
335c37e025SMagnus Damm static struct intc_vect vectors[] __initdata = {
34a276e588SMagnus Damm 	/* IRQ0->5 are handled in setup-sh3.c */
3556d604deSPaul Mundt 	INTC_VECT(DMAC1, 0x800), INTC_VECT(DMAC1, 0x820),
3656d604deSPaul Mundt 	INTC_VECT(DMAC1, 0x840), INTC_VECT(DMAC1, 0x860),
3756d604deSPaul Mundt 	INTC_VECT(SCIF0, 0x880), INTC_VECT(SCIF0, 0x8a0),
3856d604deSPaul Mundt 	INTC_VECT(SCIF0, 0x8c0), INTC_VECT(SCIF0, 0x8e0),
3956d604deSPaul Mundt 	INTC_VECT(SCIF1, 0x900), INTC_VECT(SCIF1, 0x920),
4056d604deSPaul Mundt 	INTC_VECT(SCIF1, 0x940), INTC_VECT(SCIF1, 0x960),
4156d604deSPaul Mundt 	INTC_VECT(DMAC2, 0xb80), INTC_VECT(DMAC2, 0xba0),
42ac919986SMagnus Damm #ifdef CONFIG_CPU_SUBTYPE_SH7710
4328b146c8SMagnus Damm 	INTC_VECT(IPSEC, 0xbe0),
44ac919986SMagnus Damm #endif
4528b146c8SMagnus Damm 	INTC_VECT(EDMAC0, 0xc00), INTC_VECT(EDMAC1, 0xc20),
4628b146c8SMagnus Damm 	INTC_VECT(EDMAC2, 0xc40),
4756d604deSPaul Mundt 	INTC_VECT(SIOF0, 0xe00), INTC_VECT(SIOF0, 0xe20),
4856d604deSPaul Mundt 	INTC_VECT(SIOF0, 0xe40), INTC_VECT(SIOF0, 0xe60),
4956d604deSPaul Mundt 	INTC_VECT(SIOF1, 0xe80), INTC_VECT(SIOF1, 0xea0),
5056d604deSPaul Mundt 	INTC_VECT(SIOF1, 0xec0), INTC_VECT(SIOF1, 0xee0),
5128b146c8SMagnus Damm 	INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
5228b146c8SMagnus Damm 	INTC_VECT(TMU2, 0x440),
5356d604deSPaul Mundt 	INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0),
5456d604deSPaul Mundt 	INTC_VECT(RTC, 0x4c0),
5528b146c8SMagnus Damm 	INTC_VECT(WDT, 0x560),
5628b146c8SMagnus Damm 	INTC_VECT(REF, 0x580),
5728b146c8SMagnus Damm };
5828b146c8SMagnus Damm 
595c37e025SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = {
606ef5fb2cSMagnus Damm 	{ 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
616ef5fb2cSMagnus Damm 	{ 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } },
626ef5fb2cSMagnus Damm 	{ 0xa4000016, 0, 16, 4, /* IPRC */ { IRQ3, IRQ2, IRQ1, IRQ0 } },
636ef5fb2cSMagnus Damm 	{ 0xa4000018, 0, 16, 4, /* IPRD */ { 0, 0, IRQ5, IRQ4 } },
646ef5fb2cSMagnus Damm 	{ 0xa400001a, 0, 16, 4, /* IPRE */ { DMAC1, SCIF0, SCIF1 } },
65995d538aSMagnus Damm 	{ 0xa4080000, 0, 16, 4, /* IPRF */ { IPSEC, DMAC2 } },
666ef5fb2cSMagnus Damm 	{ 0xa4080002, 0, 16, 4, /* IPRG */ { EDMAC0, EDMAC1, EDMAC2 } },
676ef5fb2cSMagnus Damm 	{ 0xa4080004, 0, 16, 4, /* IPRH */ { 0, 0, 0, SIOF0 } },
686ef5fb2cSMagnus Damm 	{ 0xa4080006, 0, 16, 4, /* IPRI */ { 0, 0, SIOF1 } },
6928b146c8SMagnus Damm };
7028b146c8SMagnus Damm 
7156d604deSPaul Mundt static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, NULL,
727f3edee8SMagnus Damm 			 NULL, prio_registers, NULL);
7328b146c8SMagnus Damm 
7428b146c8SMagnus Damm static struct resource rtc_resources[] = {
7528b146c8SMagnus Damm 	[0] =	{
7628b146c8SMagnus Damm 		.start	= 0xa413fec0,
7728b146c8SMagnus Damm 		.end	= 0xa413fec0 + 0x1e,
7828b146c8SMagnus Damm 		.flags  = IORESOURCE_IO,
7928b146c8SMagnus Damm 	},
8028b146c8SMagnus Damm 	[1] =	{
815d0af769SPaul Mundt 		.start  = evt2irq(0x480),
8228b146c8SMagnus Damm 		.flags	= IORESOURCE_IRQ,
8328b146c8SMagnus Damm 	},
8428b146c8SMagnus Damm };
8528b146c8SMagnus Damm 
86ad89f87aSPaul Mundt static struct sh_rtc_platform_info rtc_info = {
87ad89f87aSPaul Mundt 	.capabilities	= RTC_CAP_4_DIGIT_YEAR,
88ad89f87aSPaul Mundt };
89ad89f87aSPaul Mundt 
9028b146c8SMagnus Damm static struct platform_device rtc_device = {
9128b146c8SMagnus Damm 	.name		= "sh-rtc",
9228b146c8SMagnus Damm 	.id		= -1,
9328b146c8SMagnus Damm 	.num_resources	= ARRAY_SIZE(rtc_resources),
9428b146c8SMagnus Damm 	.resource	= rtc_resources,
95ad89f87aSPaul Mundt 	.dev		= {
96ad89f87aSPaul Mundt 		.platform_data = &rtc_info,
97ad89f87aSPaul Mundt 	},
9828b146c8SMagnus Damm };
9928b146c8SMagnus Damm 
10044658dfbSMagnus Damm static struct plat_sci_port scif0_platform_data = {
101e5723e0eSPaul Mundt 	.flags		= UPF_BOOT_AUTOCONF,
10200b9de9cSPaul Mundt 	.scscr		= SCSCR_TE | SCSCR_RE | SCSCR_REIE |
10300b9de9cSPaul Mundt 			  SCSCR_CKE1 | SCSCR_CKE0,
10426c92f37SPaul Mundt 	.scbrr_algo_id	= SCBRR_ALGO_2,
105e5723e0eSPaul Mundt 	.type		= PORT_SCIF,
106*d850acf9SLaurent Pinchart };
107*d850acf9SLaurent Pinchart 
108*d850acf9SLaurent Pinchart static struct resource scif0_resources[] = {
109*d850acf9SLaurent Pinchart 	DEFINE_RES_MEM(0xa4400000, 0x100),
110*d850acf9SLaurent Pinchart 	DEFINE_RES_IRQ(evt2irq(0x880)),
11144658dfbSMagnus Damm };
11244658dfbSMagnus Damm 
11344658dfbSMagnus Damm static struct platform_device scif0_device = {
11444658dfbSMagnus Damm 	.name		= "sh-sci",
11544658dfbSMagnus Damm 	.id		= 0,
116*d850acf9SLaurent Pinchart 	.resource	= scif0_resources,
117*d850acf9SLaurent Pinchart 	.num_resources	= ARRAY_SIZE(scif0_resources),
11844658dfbSMagnus Damm 	.dev		= {
11944658dfbSMagnus Damm 		.platform_data	= &scif0_platform_data,
12044658dfbSMagnus Damm 	},
12144658dfbSMagnus Damm };
12244658dfbSMagnus Damm 
12344658dfbSMagnus Damm static struct plat_sci_port scif1_platform_data = {
1249465a54fSNobuhiro Iwamatsu 	.flags		= UPF_BOOT_AUTOCONF,
12500b9de9cSPaul Mundt 	.scscr		= SCSCR_TE | SCSCR_RE | SCSCR_REIE |
12600b9de9cSPaul Mundt 			  SCSCR_CKE1 | SCSCR_CKE0,
12726c92f37SPaul Mundt 	.scbrr_algo_id	= SCBRR_ALGO_2,
1289465a54fSNobuhiro Iwamatsu 	.type		= PORT_SCIF,
129*d850acf9SLaurent Pinchart };
130*d850acf9SLaurent Pinchart 
131*d850acf9SLaurent Pinchart static struct resource scif1_resources[] = {
132*d850acf9SLaurent Pinchart 	DEFINE_RES_MEM(0xa4410000, 0x100),
133*d850acf9SLaurent Pinchart 	DEFINE_RES_IRQ(evt2irq(0x900)),
134e5723e0eSPaul Mundt };
135e5723e0eSPaul Mundt 
13644658dfbSMagnus Damm static struct platform_device scif1_device = {
137e5723e0eSPaul Mundt 	.name		= "sh-sci",
13844658dfbSMagnus Damm 	.id		= 1,
139*d850acf9SLaurent Pinchart 	.resource	= scif1_resources,
140*d850acf9SLaurent Pinchart 	.num_resources	= ARRAY_SIZE(scif1_resources),
141e5723e0eSPaul Mundt 	.dev		= {
14244658dfbSMagnus Damm 		.platform_data	= &scif1_platform_data,
143e5723e0eSPaul Mundt 	},
144e5723e0eSPaul Mundt };
145e5723e0eSPaul Mundt 
146e5ad0089SMagnus Damm static struct sh_timer_config tmu0_platform_data = {
147e5ad0089SMagnus Damm 	.channel_offset = 0x02,
148e5ad0089SMagnus Damm 	.timer_bit = 0,
149e5ad0089SMagnus Damm 	.clockevent_rating = 200,
150e5ad0089SMagnus Damm };
151e5ad0089SMagnus Damm 
152e5ad0089SMagnus Damm static struct resource tmu0_resources[] = {
153e5ad0089SMagnus Damm 	[0] = {
154e5ad0089SMagnus Damm 		.start	= 0xa412fe94,
155e5ad0089SMagnus Damm 		.end	= 0xa412fe9f,
156e5ad0089SMagnus Damm 		.flags	= IORESOURCE_MEM,
157e5ad0089SMagnus Damm 	},
158e5ad0089SMagnus Damm 	[1] = {
1595d0af769SPaul Mundt 		.start	= evt2irq(0x400),
160e5ad0089SMagnus Damm 		.flags	= IORESOURCE_IRQ,
161e5ad0089SMagnus Damm 	},
162e5ad0089SMagnus Damm };
163e5ad0089SMagnus Damm 
164e5ad0089SMagnus Damm static struct platform_device tmu0_device = {
165e5ad0089SMagnus Damm 	.name		= "sh_tmu",
166e5ad0089SMagnus Damm 	.id		= 0,
167e5ad0089SMagnus Damm 	.dev = {
168e5ad0089SMagnus Damm 		.platform_data	= &tmu0_platform_data,
169e5ad0089SMagnus Damm 	},
170e5ad0089SMagnus Damm 	.resource	= tmu0_resources,
171e5ad0089SMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu0_resources),
172e5ad0089SMagnus Damm };
173e5ad0089SMagnus Damm 
174e5ad0089SMagnus Damm static struct sh_timer_config tmu1_platform_data = {
175e5ad0089SMagnus Damm 	.channel_offset = 0xe,
176e5ad0089SMagnus Damm 	.timer_bit = 1,
177e5ad0089SMagnus Damm 	.clocksource_rating = 200,
178e5ad0089SMagnus Damm };
179e5ad0089SMagnus Damm 
180e5ad0089SMagnus Damm static struct resource tmu1_resources[] = {
181e5ad0089SMagnus Damm 	[0] = {
182e5ad0089SMagnus Damm 		.start	= 0xa412fea0,
183e5ad0089SMagnus Damm 		.end	= 0xa412feab,
184e5ad0089SMagnus Damm 		.flags	= IORESOURCE_MEM,
185e5ad0089SMagnus Damm 	},
186e5ad0089SMagnus Damm 	[1] = {
1875d0af769SPaul Mundt 		.start	= evt2irq(0x420),
188e5ad0089SMagnus Damm 		.flags	= IORESOURCE_IRQ,
189e5ad0089SMagnus Damm 	},
190e5ad0089SMagnus Damm };
191e5ad0089SMagnus Damm 
192e5ad0089SMagnus Damm static struct platform_device tmu1_device = {
193e5ad0089SMagnus Damm 	.name		= "sh_tmu",
194e5ad0089SMagnus Damm 	.id		= 1,
195e5ad0089SMagnus Damm 	.dev = {
196e5ad0089SMagnus Damm 		.platform_data	= &tmu1_platform_data,
197e5ad0089SMagnus Damm 	},
198e5ad0089SMagnus Damm 	.resource	= tmu1_resources,
199e5ad0089SMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu1_resources),
200e5ad0089SMagnus Damm };
201e5ad0089SMagnus Damm 
202e5ad0089SMagnus Damm static struct sh_timer_config tmu2_platform_data = {
203e5ad0089SMagnus Damm 	.channel_offset = 0x1a,
204e5ad0089SMagnus Damm 	.timer_bit = 2,
205e5ad0089SMagnus Damm };
206e5ad0089SMagnus Damm 
207e5ad0089SMagnus Damm static struct resource tmu2_resources[] = {
208e5ad0089SMagnus Damm 	[0] = {
209e5ad0089SMagnus Damm 		.start	= 0xa412feac,
210e5ad0089SMagnus Damm 		.end	= 0xa412feb5,
211e5ad0089SMagnus Damm 		.flags	= IORESOURCE_MEM,
212e5ad0089SMagnus Damm 	},
213e5ad0089SMagnus Damm 	[1] = {
2145d0af769SPaul Mundt 		.start	= evt2irq(0x440),
215e5ad0089SMagnus Damm 		.flags	= IORESOURCE_IRQ,
216e5ad0089SMagnus Damm 	},
217e5ad0089SMagnus Damm };
218e5ad0089SMagnus Damm 
219e5ad0089SMagnus Damm static struct platform_device tmu2_device = {
220e5ad0089SMagnus Damm 	.name		= "sh_tmu",
221e5ad0089SMagnus Damm 	.id		= 2,
222e5ad0089SMagnus Damm 	.dev = {
223e5ad0089SMagnus Damm 		.platform_data	= &tmu2_platform_data,
224e5ad0089SMagnus Damm 	},
225e5ad0089SMagnus Damm 	.resource	= tmu2_resources,
226e5ad0089SMagnus Damm 	.num_resources	= ARRAY_SIZE(tmu2_resources),
227e5ad0089SMagnus Damm };
228e5ad0089SMagnus Damm 
229e5723e0eSPaul Mundt static struct platform_device *sh7710_devices[] __initdata = {
23044658dfbSMagnus Damm 	&scif0_device,
23144658dfbSMagnus Damm 	&scif1_device,
232e5ad0089SMagnus Damm 	&tmu0_device,
233e5ad0089SMagnus Damm 	&tmu1_device,
234e5ad0089SMagnus Damm 	&tmu2_device,
23528b146c8SMagnus Damm 	&rtc_device,
236e5723e0eSPaul Mundt };
237e5723e0eSPaul Mundt 
238e5723e0eSPaul Mundt static int __init sh7710_devices_setup(void)
239e5723e0eSPaul Mundt {
240e5723e0eSPaul Mundt 	return platform_add_devices(sh7710_devices,
241e5723e0eSPaul Mundt 				    ARRAY_SIZE(sh7710_devices));
242e5723e0eSPaul Mundt }
243ba9a6337SMagnus Damm arch_initcall(sh7710_devices_setup);
2449465a54fSNobuhiro Iwamatsu 
245e5ad0089SMagnus Damm static struct platform_device *sh7710_early_devices[] __initdata = {
24644658dfbSMagnus Damm 	&scif0_device,
24744658dfbSMagnus Damm 	&scif1_device,
248e5ad0089SMagnus Damm 	&tmu0_device,
249e5ad0089SMagnus Damm 	&tmu1_device,
250e5ad0089SMagnus Damm 	&tmu2_device,
251e5ad0089SMagnus Damm };
252e5ad0089SMagnus Damm 
253e5ad0089SMagnus Damm void __init plat_early_device_setup(void)
254e5ad0089SMagnus Damm {
255e5ad0089SMagnus Damm 	early_platform_add_devices(sh7710_early_devices,
256e5ad0089SMagnus Damm 				   ARRAY_SIZE(sh7710_early_devices));
257e5ad0089SMagnus Damm }
258e5ad0089SMagnus Damm 
25990015c89SMagnus Damm void __init plat_irq_setup(void)
2609465a54fSNobuhiro Iwamatsu {
26128b146c8SMagnus Damm 	register_intc_controller(&intc_desc);
262a276e588SMagnus Damm 	plat_irq_setup_sh3();
2639465a54fSNobuhiro Iwamatsu }
264