xref: /openbmc/linux/arch/sh/kernel/cpu/sh2/setup-sh7619.c (revision 9b17e48cd4df4e129976c37660cf9ec644c66059)
19d4436a6SYoshinori Sato /*
29d4436a6SYoshinori Sato  * SH7619 Setup
39d4436a6SYoshinori Sato  *
49d4436a6SYoshinori Sato  *  Copyright (C) 2006  Yoshinori Sato
55dece2bbSPaul Mundt  *  Copyright (C) 2009  Paul Mundt
69d4436a6SYoshinori Sato  *
79d4436a6SYoshinori Sato  * This file is subject to the terms and conditions of the GNU General Public
89d4436a6SYoshinori Sato  * License.  See the file "COPYING" in the main directory of this archive
99d4436a6SYoshinori Sato  * for more details.
109d4436a6SYoshinori Sato  */
119d4436a6SYoshinori Sato #include <linux/platform_device.h>
129d4436a6SYoshinori Sato #include <linux/init.h>
139d4436a6SYoshinori Sato #include <linux/serial.h>
1496de1a8fSPaul Mundt #include <linux/serial_sci.h>
1506a64f91SSergei Shtylyov #include <linux/sh_eth.h>
1646a12f74SPaul Mundt #include <linux/sh_timer.h>
17698aa99dSMagnus Damm #include <linux/io.h>
189d4436a6SYoshinori Sato 
190dc3fc04SMagnus Damm enum {
200dc3fc04SMagnus Damm 	UNUSED = 0,
210dc3fc04SMagnus Damm 
220dc3fc04SMagnus Damm 	/* interrupt sources */
230dc3fc04SMagnus Damm 	IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
240dc3fc04SMagnus Damm 	WDT, EDMAC, CMT0, CMT1,
255dece2bbSPaul Mundt 	SCIF0, SCIF1, SCIF2,
260dc3fc04SMagnus Damm 	HIF_HIFI, HIF_HIFBI,
270dc3fc04SMagnus Damm 	DMAC0, DMAC1, DMAC2, DMAC3,
280dc3fc04SMagnus Damm 	SIOF,
290dc3fc04SMagnus Damm };
300dc3fc04SMagnus Damm 
310dc3fc04SMagnus Damm static struct intc_vect vectors[] __initdata = {
320dc3fc04SMagnus Damm 	INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),
330dc3fc04SMagnus Damm 	INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),
340dc3fc04SMagnus Damm 	INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81),
350dc3fc04SMagnus Damm 	INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83),
360dc3fc04SMagnus Damm 	INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85),
370dc3fc04SMagnus Damm 	INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87),
385dece2bbSPaul Mundt 	INTC_IRQ(SCIF0, 88), INTC_IRQ(SCIF0, 89),
395dece2bbSPaul Mundt 	INTC_IRQ(SCIF0, 90), INTC_IRQ(SCIF0, 91),
405dece2bbSPaul Mundt 	INTC_IRQ(SCIF1, 92), INTC_IRQ(SCIF1, 93),
415dece2bbSPaul Mundt 	INTC_IRQ(SCIF1, 94), INTC_IRQ(SCIF1, 95),
425dece2bbSPaul Mundt 	INTC_IRQ(SCIF2, 96), INTC_IRQ(SCIF2, 97),
435dece2bbSPaul Mundt 	INTC_IRQ(SCIF2, 98), INTC_IRQ(SCIF2, 99),
440dc3fc04SMagnus Damm 	INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101),
450dc3fc04SMagnus Damm 	INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105),
460dc3fc04SMagnus Damm 	INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107),
470dc3fc04SMagnus Damm 	INTC_IRQ(SIOF, 108),
480dc3fc04SMagnus Damm };
490dc3fc04SMagnus Damm 
500dc3fc04SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = {
510dc3fc04SMagnus Damm 	{ 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
520dc3fc04SMagnus Damm 	{ 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } },
530dc3fc04SMagnus Damm 	{ 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } },
540dc3fc04SMagnus Damm 	{ 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } },
550dc3fc04SMagnus Damm 	{ 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } },
560dc3fc04SMagnus Damm 	{ 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } },
570dc3fc04SMagnus Damm 	{ 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } },
580dc3fc04SMagnus Damm };
590dc3fc04SMagnus Damm 
605dece2bbSPaul Mundt static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL,
617f3edee8SMagnus Damm 			 NULL, prio_registers, NULL);
620dc3fc04SMagnus Damm 
63632fd800SMagnus Damm static struct plat_sci_port scif0_platform_data = {
649d4436a6SYoshinori Sato 	.flags		= UPF_BOOT_AUTOCONF,
6500b9de9cSPaul Mundt 	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE,
669d4436a6SYoshinori Sato 	.type		= PORT_SCIF,
67d850acf9SLaurent Pinchart };
68d850acf9SLaurent Pinchart 
69d850acf9SLaurent Pinchart static struct resource scif0_resources[] = {
70d850acf9SLaurent Pinchart 	DEFINE_RES_MEM(0xf8400000, 0x100),
71d850acf9SLaurent Pinchart 	DEFINE_RES_IRQ(88),
72632fd800SMagnus Damm };
73632fd800SMagnus Damm 
74632fd800SMagnus Damm static struct platform_device scif0_device = {
75632fd800SMagnus Damm 	.name		= "sh-sci",
76632fd800SMagnus Damm 	.id		= 0,
77d850acf9SLaurent Pinchart 	.resource	= scif0_resources,
78d850acf9SLaurent Pinchart 	.num_resources	= ARRAY_SIZE(scif0_resources),
79632fd800SMagnus Damm 	.dev		= {
80632fd800SMagnus Damm 		.platform_data	= &scif0_platform_data,
81632fd800SMagnus Damm 	},
82632fd800SMagnus Damm };
83632fd800SMagnus Damm 
84632fd800SMagnus Damm static struct plat_sci_port scif1_platform_data = {
859d4436a6SYoshinori Sato 	.flags		= UPF_BOOT_AUTOCONF,
8600b9de9cSPaul Mundt 	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE,
879d4436a6SYoshinori Sato 	.type		= PORT_SCIF,
88d850acf9SLaurent Pinchart };
89d850acf9SLaurent Pinchart 
90d850acf9SLaurent Pinchart static struct resource scif1_resources[] = {
91d850acf9SLaurent Pinchart 	DEFINE_RES_MEM(0xf8410000, 0x100),
92d850acf9SLaurent Pinchart 	DEFINE_RES_IRQ(92),
93632fd800SMagnus Damm };
94632fd800SMagnus Damm 
95632fd800SMagnus Damm static struct platform_device scif1_device = {
96632fd800SMagnus Damm 	.name		= "sh-sci",
97632fd800SMagnus Damm 	.id		= 1,
98d850acf9SLaurent Pinchart 	.resource	= scif1_resources,
99d850acf9SLaurent Pinchart 	.num_resources	= ARRAY_SIZE(scif1_resources),
100632fd800SMagnus Damm 	.dev		= {
101632fd800SMagnus Damm 		.platform_data	= &scif1_platform_data,
102632fd800SMagnus Damm 	},
103632fd800SMagnus Damm };
104632fd800SMagnus Damm 
105632fd800SMagnus Damm static struct plat_sci_port scif2_platform_data = {
1069d4436a6SYoshinori Sato 	.flags		= UPF_BOOT_AUTOCONF,
10700b9de9cSPaul Mundt 	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE,
1089d4436a6SYoshinori Sato 	.type		= PORT_SCIF,
109d850acf9SLaurent Pinchart };
110d850acf9SLaurent Pinchart 
111d850acf9SLaurent Pinchart static struct resource scif2_resources[] = {
112d850acf9SLaurent Pinchart 	DEFINE_RES_MEM(0xf8420000, 0x100),
113d850acf9SLaurent Pinchart 	DEFINE_RES_IRQ(96),
1149d4436a6SYoshinori Sato };
1159d4436a6SYoshinori Sato 
116632fd800SMagnus Damm static struct platform_device scif2_device = {
1179d4436a6SYoshinori Sato 	.name		= "sh-sci",
118632fd800SMagnus Damm 	.id		= 2,
119d850acf9SLaurent Pinchart 	.resource	= scif2_resources,
120d850acf9SLaurent Pinchart 	.num_resources	= ARRAY_SIZE(scif2_resources),
1219d4436a6SYoshinori Sato 	.dev		= {
122632fd800SMagnus Damm 		.platform_data	= &scif2_platform_data,
1239d4436a6SYoshinori Sato 	},
1249d4436a6SYoshinori Sato };
1259d4436a6SYoshinori Sato 
12606a64f91SSergei Shtylyov static struct sh_eth_plat_data eth_platform_data = {
12706a64f91SSergei Shtylyov 	.phy		= 1,
12806a64f91SSergei Shtylyov 	.edmac_endian	= EDMAC_LITTLE_ENDIAN,
1290bf2bbd2SSergei Shtylyov 	.phy_interface	= PHY_INTERFACE_MODE_MII,
13006a64f91SSergei Shtylyov };
13106a64f91SSergei Shtylyov 
132d88a3ea6SYoshinori Sato static struct resource eth_resources[] = {
133d88a3ea6SYoshinori Sato 	[0] = {
134d88a3ea6SYoshinori Sato 		.start = 0xfb000000,
13506a64f91SSergei Shtylyov 		.end = 0xfb0001c7,
136d88a3ea6SYoshinori Sato 		.flags = IORESOURCE_MEM,
137d88a3ea6SYoshinori Sato 	},
138d88a3ea6SYoshinori Sato 	[1] = {
139d88a3ea6SYoshinori Sato 		.start = 85,
140d88a3ea6SYoshinori Sato 		.end = 85,
141d88a3ea6SYoshinori Sato 		.flags = IORESOURCE_IRQ,
142d88a3ea6SYoshinori Sato 	},
143d88a3ea6SYoshinori Sato };
144d88a3ea6SYoshinori Sato 
145d88a3ea6SYoshinori Sato static struct platform_device eth_device = {
146c18a79abSSergei Shtylyov 	.name = "sh7619-ether",
147d88a3ea6SYoshinori Sato 	.id = -1,
148d88a3ea6SYoshinori Sato 	.dev = {
14906a64f91SSergei Shtylyov 		.platform_data = &eth_platform_data,
150d88a3ea6SYoshinori Sato 	},
151d88a3ea6SYoshinori Sato 	.num_resources = ARRAY_SIZE(eth_resources),
152d88a3ea6SYoshinori Sato 	.resource = eth_resources,
153d88a3ea6SYoshinori Sato };
154d88a3ea6SYoshinori Sato 
155*9b17e48cSLaurent Pinchart static struct sh_timer_config cmt_platform_data = {
156*9b17e48cSLaurent Pinchart 	.channels_mask = 3,
157698aa99dSMagnus Damm };
158698aa99dSMagnus Damm 
159*9b17e48cSLaurent Pinchart static struct resource cmt_resources[] = {
160*9b17e48cSLaurent Pinchart 	DEFINE_RES_MEM(0xf84a0070, 0x10),
161*9b17e48cSLaurent Pinchart 	DEFINE_RES_IRQ(86),
162*9b17e48cSLaurent Pinchart 	DEFINE_RES_IRQ(87),
163698aa99dSMagnus Damm };
164698aa99dSMagnus Damm 
165*9b17e48cSLaurent Pinchart static struct platform_device cmt_device = {
166*9b17e48cSLaurent Pinchart 	.name		= "sh-cmt-16",
167698aa99dSMagnus Damm 	.id		= 0,
168698aa99dSMagnus Damm 	.dev = {
169*9b17e48cSLaurent Pinchart 		.platform_data	= &cmt_platform_data,
170698aa99dSMagnus Damm 	},
171*9b17e48cSLaurent Pinchart 	.resource	= cmt_resources,
172*9b17e48cSLaurent Pinchart 	.num_resources	= ARRAY_SIZE(cmt_resources),
173698aa99dSMagnus Damm };
174698aa99dSMagnus Damm 
1759d4436a6SYoshinori Sato static struct platform_device *sh7619_devices[] __initdata = {
176632fd800SMagnus Damm 	&scif0_device,
177632fd800SMagnus Damm 	&scif1_device,
178632fd800SMagnus Damm 	&scif2_device,
179d88a3ea6SYoshinori Sato 	&eth_device,
180*9b17e48cSLaurent Pinchart 	&cmt_device,
1819d4436a6SYoshinori Sato };
1829d4436a6SYoshinori Sato 
1839d4436a6SYoshinori Sato static int __init sh7619_devices_setup(void)
1849d4436a6SYoshinori Sato {
1859d4436a6SYoshinori Sato 	return platform_add_devices(sh7619_devices,
1869d4436a6SYoshinori Sato 				    ARRAY_SIZE(sh7619_devices));
1879d4436a6SYoshinori Sato }
188ba9a6337SMagnus Damm arch_initcall(sh7619_devices_setup);
189780a1568SYoshinori Sato 
19090015c89SMagnus Damm void __init plat_irq_setup(void)
191780a1568SYoshinori Sato {
1920dc3fc04SMagnus Damm 	register_intc_controller(&intc_desc);
193780a1568SYoshinori Sato }
194698aa99dSMagnus Damm 
195698aa99dSMagnus Damm static struct platform_device *sh7619_early_devices[] __initdata = {
196632fd800SMagnus Damm 	&scif0_device,
197632fd800SMagnus Damm 	&scif1_device,
198632fd800SMagnus Damm 	&scif2_device,
199*9b17e48cSLaurent Pinchart 	&cmt_device,
200698aa99dSMagnus Damm };
201698aa99dSMagnus Damm 
202698aa99dSMagnus Damm #define STBCR3 0xf80a0000
203698aa99dSMagnus Damm 
204698aa99dSMagnus Damm void __init plat_early_device_setup(void)
205698aa99dSMagnus Damm {
206698aa99dSMagnus Damm 	/* enable CMT clock */
207698aa99dSMagnus Damm 	__raw_writeb(__raw_readb(STBCR3) & ~0x10, STBCR3);
208698aa99dSMagnus Damm 
209698aa99dSMagnus Damm 	early_platform_add_devices(sh7619_early_devices,
210698aa99dSMagnus Damm 				   ARRAY_SIZE(sh7619_early_devices));
211698aa99dSMagnus Damm }
212