xref: /openbmc/linux/arch/sh/boards/mach-se/770x/setup.c (revision da2014a2b080e7f3024a4eb6917d47069ad9620b)
1*da2014a2SPaul Mundt /*
2*da2014a2SPaul Mundt  * linux/arch/sh/boards/se/770x/setup.c
3*da2014a2SPaul Mundt  *
4*da2014a2SPaul Mundt  * Copyright (C) 2000  Kazumoto Kojima
5*da2014a2SPaul Mundt  *
6*da2014a2SPaul Mundt  * Hitachi SolutionEngine Support.
7*da2014a2SPaul Mundt  *
8*da2014a2SPaul Mundt  */
9*da2014a2SPaul Mundt #include <linux/init.h>
10*da2014a2SPaul Mundt #include <linux/platform_device.h>
11*da2014a2SPaul Mundt #include <asm/machvec.h>
12*da2014a2SPaul Mundt #include <asm/se.h>
13*da2014a2SPaul Mundt #include <asm/io.h>
14*da2014a2SPaul Mundt #include <asm/smc37c93x.h>
15*da2014a2SPaul Mundt #include <asm/heartbeat.h>
16*da2014a2SPaul Mundt 
17*da2014a2SPaul Mundt /*
18*da2014a2SPaul Mundt  * Configure the Super I/O chip
19*da2014a2SPaul Mundt  */
20*da2014a2SPaul Mundt static void __init smsc_config(int index, int data)
21*da2014a2SPaul Mundt {
22*da2014a2SPaul Mundt 	outb_p(index, INDEX_PORT);
23*da2014a2SPaul Mundt 	outb_p(data, DATA_PORT);
24*da2014a2SPaul Mundt }
25*da2014a2SPaul Mundt 
26*da2014a2SPaul Mundt /* XXX: Another candidate for a more generic cchip machine vector */
27*da2014a2SPaul Mundt static void __init smsc_setup(char **cmdline_p)
28*da2014a2SPaul Mundt {
29*da2014a2SPaul Mundt 	outb_p(CONFIG_ENTER, CONFIG_PORT);
30*da2014a2SPaul Mundt 	outb_p(CONFIG_ENTER, CONFIG_PORT);
31*da2014a2SPaul Mundt 
32*da2014a2SPaul Mundt 	/* FDC */
33*da2014a2SPaul Mundt 	smsc_config(CURRENT_LDN_INDEX, LDN_FDC);
34*da2014a2SPaul Mundt 	smsc_config(ACTIVATE_INDEX, 0x01);
35*da2014a2SPaul Mundt 	smsc_config(IRQ_SELECT_INDEX, 6); /* IRQ6 */
36*da2014a2SPaul Mundt 
37*da2014a2SPaul Mundt 	/* AUXIO (GPIO): to use IDE1 */
38*da2014a2SPaul Mundt 	smsc_config(CURRENT_LDN_INDEX, LDN_AUXIO);
39*da2014a2SPaul Mundt 	smsc_config(GPIO46_INDEX, 0x00); /* nIOROP */
40*da2014a2SPaul Mundt 	smsc_config(GPIO47_INDEX, 0x00); /* nIOWOP */
41*da2014a2SPaul Mundt 
42*da2014a2SPaul Mundt 	/* COM1 */
43*da2014a2SPaul Mundt 	smsc_config(CURRENT_LDN_INDEX, LDN_COM1);
44*da2014a2SPaul Mundt 	smsc_config(ACTIVATE_INDEX, 0x01);
45*da2014a2SPaul Mundt 	smsc_config(IO_BASE_HI_INDEX, 0x03);
46*da2014a2SPaul Mundt 	smsc_config(IO_BASE_LO_INDEX, 0xf8);
47*da2014a2SPaul Mundt 	smsc_config(IRQ_SELECT_INDEX, 4); /* IRQ4 */
48*da2014a2SPaul Mundt 
49*da2014a2SPaul Mundt 	/* COM2 */
50*da2014a2SPaul Mundt 	smsc_config(CURRENT_LDN_INDEX, LDN_COM2);
51*da2014a2SPaul Mundt 	smsc_config(ACTIVATE_INDEX, 0x01);
52*da2014a2SPaul Mundt 	smsc_config(IO_BASE_HI_INDEX, 0x02);
53*da2014a2SPaul Mundt 	smsc_config(IO_BASE_LO_INDEX, 0xf8);
54*da2014a2SPaul Mundt 	smsc_config(IRQ_SELECT_INDEX, 3); /* IRQ3 */
55*da2014a2SPaul Mundt 
56*da2014a2SPaul Mundt 	/* RTC */
57*da2014a2SPaul Mundt 	smsc_config(CURRENT_LDN_INDEX, LDN_RTC);
58*da2014a2SPaul Mundt 	smsc_config(ACTIVATE_INDEX, 0x01);
59*da2014a2SPaul Mundt 	smsc_config(IRQ_SELECT_INDEX, 8); /* IRQ8 */
60*da2014a2SPaul Mundt 
61*da2014a2SPaul Mundt 	/* XXX: PARPORT, KBD, and MOUSE will come here... */
62*da2014a2SPaul Mundt 	outb_p(CONFIG_EXIT, CONFIG_PORT);
63*da2014a2SPaul Mundt }
64*da2014a2SPaul Mundt 
65*da2014a2SPaul Mundt 
66*da2014a2SPaul Mundt static struct resource cf_ide_resources[] = {
67*da2014a2SPaul Mundt 	[0] = {
68*da2014a2SPaul Mundt 		.start  = PA_MRSHPC_IO + 0x1f0,
69*da2014a2SPaul Mundt 		.end    = PA_MRSHPC_IO + 0x1f0 + 8,
70*da2014a2SPaul Mundt 		.flags  = IORESOURCE_MEM,
71*da2014a2SPaul Mundt 	},
72*da2014a2SPaul Mundt 	[1] = {
73*da2014a2SPaul Mundt 		.start  = PA_MRSHPC_IO + 0x1f0 + 0x206,
74*da2014a2SPaul Mundt 		.end    = PA_MRSHPC_IO + 0x1f0 + 8 + 0x206 + 8,
75*da2014a2SPaul Mundt 		.flags  = IORESOURCE_MEM,
76*da2014a2SPaul Mundt 	},
77*da2014a2SPaul Mundt 	[2] = {
78*da2014a2SPaul Mundt 		.start  = IRQ_CFCARD,
79*da2014a2SPaul Mundt 		.flags  = IORESOURCE_IRQ,
80*da2014a2SPaul Mundt 	},
81*da2014a2SPaul Mundt };
82*da2014a2SPaul Mundt 
83*da2014a2SPaul Mundt static struct platform_device cf_ide_device  = {
84*da2014a2SPaul Mundt 	.name           = "pata_platform",
85*da2014a2SPaul Mundt 	.id             = -1,
86*da2014a2SPaul Mundt 	.num_resources  = ARRAY_SIZE(cf_ide_resources),
87*da2014a2SPaul Mundt 	.resource       = cf_ide_resources,
88*da2014a2SPaul Mundt };
89*da2014a2SPaul Mundt 
90*da2014a2SPaul Mundt static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
91*da2014a2SPaul Mundt 
92*da2014a2SPaul Mundt static struct heartbeat_data heartbeat_data = {
93*da2014a2SPaul Mundt 	.bit_pos	= heartbeat_bit_pos,
94*da2014a2SPaul Mundt 	.nr_bits	= ARRAY_SIZE(heartbeat_bit_pos),
95*da2014a2SPaul Mundt 	.regsize	= 16,
96*da2014a2SPaul Mundt };
97*da2014a2SPaul Mundt 
98*da2014a2SPaul Mundt static struct resource heartbeat_resources[] = {
99*da2014a2SPaul Mundt 	[0] = {
100*da2014a2SPaul Mundt 		.start	= PA_LED,
101*da2014a2SPaul Mundt 		.end	= PA_LED,
102*da2014a2SPaul Mundt 		.flags	= IORESOURCE_MEM,
103*da2014a2SPaul Mundt 	},
104*da2014a2SPaul Mundt };
105*da2014a2SPaul Mundt 
106*da2014a2SPaul Mundt static struct platform_device heartbeat_device = {
107*da2014a2SPaul Mundt 	.name		= "heartbeat",
108*da2014a2SPaul Mundt 	.id		= -1,
109*da2014a2SPaul Mundt 	.dev	= {
110*da2014a2SPaul Mundt 		.platform_data	= &heartbeat_data,
111*da2014a2SPaul Mundt 	},
112*da2014a2SPaul Mundt 	.num_resources	= ARRAY_SIZE(heartbeat_resources),
113*da2014a2SPaul Mundt 	.resource	= heartbeat_resources,
114*da2014a2SPaul Mundt };
115*da2014a2SPaul Mundt 
116*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\
117*da2014a2SPaul Mundt 	defined(CONFIG_CPU_SUBTYPE_SH7712)
118*da2014a2SPaul Mundt /* SH771X Ethernet driver */
119*da2014a2SPaul Mundt static struct resource sh_eth0_resources[] = {
120*da2014a2SPaul Mundt 	[0] = {
121*da2014a2SPaul Mundt 		.start = SH_ETH0_BASE,
122*da2014a2SPaul Mundt 		.end = SH_ETH0_BASE + 0x1B8,
123*da2014a2SPaul Mundt 		.flags = IORESOURCE_MEM,
124*da2014a2SPaul Mundt 	},
125*da2014a2SPaul Mundt 	[1] = {
126*da2014a2SPaul Mundt 		.start = SH_ETH0_IRQ,
127*da2014a2SPaul Mundt 		.end = SH_ETH0_IRQ,
128*da2014a2SPaul Mundt 		.flags = IORESOURCE_IRQ,
129*da2014a2SPaul Mundt 	},
130*da2014a2SPaul Mundt };
131*da2014a2SPaul Mundt 
132*da2014a2SPaul Mundt static struct platform_device sh_eth0_device = {
133*da2014a2SPaul Mundt 	.name = "sh-eth",
134*da2014a2SPaul Mundt 	.id	= 0,
135*da2014a2SPaul Mundt 	.dev = {
136*da2014a2SPaul Mundt 		.platform_data = PHY_ID,
137*da2014a2SPaul Mundt 	},
138*da2014a2SPaul Mundt 	.num_resources = ARRAY_SIZE(sh_eth0_resources),
139*da2014a2SPaul Mundt 	.resource = sh_eth0_resources,
140*da2014a2SPaul Mundt };
141*da2014a2SPaul Mundt 
142*da2014a2SPaul Mundt static struct resource sh_eth1_resources[] = {
143*da2014a2SPaul Mundt 	[0] = {
144*da2014a2SPaul Mundt 		.start = SH_ETH1_BASE,
145*da2014a2SPaul Mundt 		.end = SH_ETH1_BASE + 0x1B8,
146*da2014a2SPaul Mundt 		.flags = IORESOURCE_MEM,
147*da2014a2SPaul Mundt 	},
148*da2014a2SPaul Mundt 	[1] = {
149*da2014a2SPaul Mundt 		.start = SH_ETH1_IRQ,
150*da2014a2SPaul Mundt 		.end = SH_ETH1_IRQ,
151*da2014a2SPaul Mundt 		.flags = IORESOURCE_IRQ,
152*da2014a2SPaul Mundt 	},
153*da2014a2SPaul Mundt };
154*da2014a2SPaul Mundt 
155*da2014a2SPaul Mundt static struct platform_device sh_eth1_device = {
156*da2014a2SPaul Mundt 	.name = "sh-eth",
157*da2014a2SPaul Mundt 	.id	= 1,
158*da2014a2SPaul Mundt 	.dev = {
159*da2014a2SPaul Mundt 		.platform_data = PHY_ID,
160*da2014a2SPaul Mundt 	},
161*da2014a2SPaul Mundt 	.num_resources = ARRAY_SIZE(sh_eth1_resources),
162*da2014a2SPaul Mundt 	.resource = sh_eth1_resources,
163*da2014a2SPaul Mundt };
164*da2014a2SPaul Mundt #endif
165*da2014a2SPaul Mundt 
166*da2014a2SPaul Mundt static struct platform_device *se_devices[] __initdata = {
167*da2014a2SPaul Mundt 	&heartbeat_device,
168*da2014a2SPaul Mundt 	&cf_ide_device,
169*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\
170*da2014a2SPaul Mundt 	defined(CONFIG_CPU_SUBTYPE_SH7712)
171*da2014a2SPaul Mundt 	&sh_eth0_device,
172*da2014a2SPaul Mundt 	&sh_eth1_device,
173*da2014a2SPaul Mundt #endif
174*da2014a2SPaul Mundt };
175*da2014a2SPaul Mundt 
176*da2014a2SPaul Mundt static int __init se_devices_setup(void)
177*da2014a2SPaul Mundt {
178*da2014a2SPaul Mundt 	return platform_add_devices(se_devices, ARRAY_SIZE(se_devices));
179*da2014a2SPaul Mundt }
180*da2014a2SPaul Mundt device_initcall(se_devices_setup);
181*da2014a2SPaul Mundt 
182*da2014a2SPaul Mundt /*
183*da2014a2SPaul Mundt  * The Machine Vector
184*da2014a2SPaul Mundt  */
185*da2014a2SPaul Mundt static struct sh_machine_vector mv_se __initmv = {
186*da2014a2SPaul Mundt 	.mv_name		= "SolutionEngine",
187*da2014a2SPaul Mundt 	.mv_setup		= smsc_setup,
188*da2014a2SPaul Mundt #if defined(CONFIG_CPU_SH4)
189*da2014a2SPaul Mundt 	.mv_nr_irqs		= 48,
190*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7708)
191*da2014a2SPaul Mundt 	.mv_nr_irqs		= 32,
192*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7709)
193*da2014a2SPaul Mundt 	.mv_nr_irqs		= 61,
194*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
195*da2014a2SPaul Mundt 	.mv_nr_irqs		= 86,
196*da2014a2SPaul Mundt #elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
197*da2014a2SPaul Mundt 	.mv_nr_irqs             = 104,
198*da2014a2SPaul Mundt #endif
199*da2014a2SPaul Mundt 
200*da2014a2SPaul Mundt 	.mv_inb			= se_inb,
201*da2014a2SPaul Mundt 	.mv_inw			= se_inw,
202*da2014a2SPaul Mundt 	.mv_inl			= se_inl,
203*da2014a2SPaul Mundt 	.mv_outb		= se_outb,
204*da2014a2SPaul Mundt 	.mv_outw		= se_outw,
205*da2014a2SPaul Mundt 	.mv_outl		= se_outl,
206*da2014a2SPaul Mundt 
207*da2014a2SPaul Mundt 	.mv_inb_p		= se_inb_p,
208*da2014a2SPaul Mundt 	.mv_inw_p		= se_inw,
209*da2014a2SPaul Mundt 	.mv_inl_p		= se_inl,
210*da2014a2SPaul Mundt 	.mv_outb_p		= se_outb_p,
211*da2014a2SPaul Mundt 	.mv_outw_p		= se_outw,
212*da2014a2SPaul Mundt 	.mv_outl_p		= se_outl,
213*da2014a2SPaul Mundt 
214*da2014a2SPaul Mundt 	.mv_insb		= se_insb,
215*da2014a2SPaul Mundt 	.mv_insw		= se_insw,
216*da2014a2SPaul Mundt 	.mv_insl		= se_insl,
217*da2014a2SPaul Mundt 	.mv_outsb		= se_outsb,
218*da2014a2SPaul Mundt 	.mv_outsw		= se_outsw,
219*da2014a2SPaul Mundt 	.mv_outsl		= se_outsl,
220*da2014a2SPaul Mundt 
221*da2014a2SPaul Mundt 	.mv_init_irq		= init_se_IRQ,
222*da2014a2SPaul Mundt };
223