xref: /openbmc/linux/arch/sh/boards/mach-ecovec24/setup.c (revision 907050a33d3b6a9f37e2ceca764b60f8e3922466)
14138b740SKuninori Morimoto /*
24138b740SKuninori Morimoto  * Copyright (C) 2009 Renesas Solutions Corp.
34138b740SKuninori Morimoto  *
44138b740SKuninori Morimoto  * Kuninori Morimoto <morimoto.kuninori@renesas.com>
54138b740SKuninori Morimoto  *
64138b740SKuninori Morimoto  * This file is subject to the terms and conditions of the GNU General Public
74138b740SKuninori Morimoto  * License.  See the file "COPYING" in the main directory of this archive
84138b740SKuninori Morimoto  * for more details.
94138b740SKuninori Morimoto  */
104138b740SKuninori Morimoto 
114138b740SKuninori Morimoto #include <linux/init.h>
124138b740SKuninori Morimoto #include <linux/device.h>
134138b740SKuninori Morimoto #include <linux/platform_device.h>
144138b740SKuninori Morimoto #include <linux/mtd/physmap.h>
154138b740SKuninori Morimoto #include <linux/gpio.h>
164138b740SKuninori Morimoto #include <linux/interrupt.h>
1735a35408SKuninori Morimoto #include <linux/io.h>
1835a35408SKuninori Morimoto #include <linux/delay.h>
19*907050a3SKuninori Morimoto #include <linux/usb/r8a66597.h>
204138b740SKuninori Morimoto #include <asm/heartbeat.h>
2135a35408SKuninori Morimoto #include <asm/sh_eth.h>
224138b740SKuninori Morimoto #include <cpu/sh7724.h>
234138b740SKuninori Morimoto 
244138b740SKuninori Morimoto /*
25b7056bc1SKuninori Morimoto  *  Address      Interface        BusWidth
26b7056bc1SKuninori Morimoto  *-----------------------------------------
27b7056bc1SKuninori Morimoto  *  0x0000_0000  uboot            16bit
28b7056bc1SKuninori Morimoto  *  0x0004_0000  Linux romImage   16bit
29b7056bc1SKuninori Morimoto  *  0x0014_0000  MTD for Linux    16bit
30b7056bc1SKuninori Morimoto  *  0x0400_0000  Internal I/O     16/32bit
31b7056bc1SKuninori Morimoto  *  0x0800_0000  DRAM             32bit
32b7056bc1SKuninori Morimoto  *  0x1800_0000  MFI              16bit
334138b740SKuninori Morimoto  */
344138b740SKuninori Morimoto 
354138b740SKuninori Morimoto /* Heartbeat */
364138b740SKuninori Morimoto static unsigned char led_pos[] = { 0, 1, 2, 3 };
374138b740SKuninori Morimoto static struct heartbeat_data heartbeat_data = {
384138b740SKuninori Morimoto 	.regsize = 8,
394138b740SKuninori Morimoto 	.nr_bits = 4,
404138b740SKuninori Morimoto 	.bit_pos = led_pos,
414138b740SKuninori Morimoto };
424138b740SKuninori Morimoto 
434138b740SKuninori Morimoto static struct resource heartbeat_resources[] = {
444138b740SKuninori Morimoto 	[0] = {
454138b740SKuninori Morimoto 		.start  = 0xA405012C, /* PTG */
464138b740SKuninori Morimoto 		.end    = 0xA405012E - 1,
474138b740SKuninori Morimoto 		.flags  = IORESOURCE_MEM,
484138b740SKuninori Morimoto 	},
494138b740SKuninori Morimoto };
504138b740SKuninori Morimoto 
514138b740SKuninori Morimoto static struct platform_device heartbeat_device = {
524138b740SKuninori Morimoto 	.name           = "heartbeat",
534138b740SKuninori Morimoto 	.id             = -1,
544138b740SKuninori Morimoto 	.dev = {
554138b740SKuninori Morimoto 		.platform_data = &heartbeat_data,
564138b740SKuninori Morimoto 	},
574138b740SKuninori Morimoto 	.num_resources  = ARRAY_SIZE(heartbeat_resources),
584138b740SKuninori Morimoto 	.resource       = heartbeat_resources,
594138b740SKuninori Morimoto };
604138b740SKuninori Morimoto 
614138b740SKuninori Morimoto /* MTD */
624138b740SKuninori Morimoto static struct mtd_partition nor_flash_partitions[] = {
634138b740SKuninori Morimoto 	{
64b7056bc1SKuninori Morimoto 		.name = "boot loader",
654138b740SKuninori Morimoto 		.offset = 0,
66b7056bc1SKuninori Morimoto 		.size = (5 * 1024 * 1024),
674138b740SKuninori Morimoto 		.mask_flags = MTD_CAP_ROM,
684138b740SKuninori Morimoto 	}, {
694138b740SKuninori Morimoto 		.name = "free-area",
704138b740SKuninori Morimoto 		.offset = MTDPART_OFS_APPEND,
714138b740SKuninori Morimoto 		.size = MTDPART_SIZ_FULL,
724138b740SKuninori Morimoto 	},
734138b740SKuninori Morimoto };
744138b740SKuninori Morimoto 
754138b740SKuninori Morimoto static struct physmap_flash_data nor_flash_data = {
764138b740SKuninori Morimoto 	.width		= 2,
774138b740SKuninori Morimoto 	.parts		= nor_flash_partitions,
784138b740SKuninori Morimoto 	.nr_parts	= ARRAY_SIZE(nor_flash_partitions),
794138b740SKuninori Morimoto };
804138b740SKuninori Morimoto 
814138b740SKuninori Morimoto static struct resource nor_flash_resources[] = {
824138b740SKuninori Morimoto 	[0] = {
834138b740SKuninori Morimoto 		.name	= "NOR Flash",
844138b740SKuninori Morimoto 		.start	= 0x00000000,
854138b740SKuninori Morimoto 		.end	= 0x03ffffff,
864138b740SKuninori Morimoto 		.flags	= IORESOURCE_MEM,
874138b740SKuninori Morimoto 	}
884138b740SKuninori Morimoto };
894138b740SKuninori Morimoto 
904138b740SKuninori Morimoto static struct platform_device nor_flash_device = {
914138b740SKuninori Morimoto 	.name		= "physmap-flash",
924138b740SKuninori Morimoto 	.resource	= nor_flash_resources,
934138b740SKuninori Morimoto 	.num_resources	= ARRAY_SIZE(nor_flash_resources),
944138b740SKuninori Morimoto 	.dev		= {
954138b740SKuninori Morimoto 		.platform_data = &nor_flash_data,
964138b740SKuninori Morimoto 	},
974138b740SKuninori Morimoto };
984138b740SKuninori Morimoto 
9935a35408SKuninori Morimoto /* SH Eth */
10035a35408SKuninori Morimoto #define SH_ETH_ADDR	(0xA4600000)
10135a35408SKuninori Morimoto #define SH_ETH_MAHR	(SH_ETH_ADDR + 0x1C0)
10235a35408SKuninori Morimoto #define SH_ETH_MALR	(SH_ETH_ADDR + 0x1C8)
10335a35408SKuninori Morimoto static struct resource sh_eth_resources[] = {
10435a35408SKuninori Morimoto 	[0] = {
10535a35408SKuninori Morimoto 		.start = SH_ETH_ADDR,
10635a35408SKuninori Morimoto 		.end   = SH_ETH_ADDR + 0x1FC,
10735a35408SKuninori Morimoto 		.flags = IORESOURCE_MEM,
10835a35408SKuninori Morimoto 	},
10935a35408SKuninori Morimoto 	[1] = {
11035a35408SKuninori Morimoto 		.start = 91,
11135a35408SKuninori Morimoto 		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
11235a35408SKuninori Morimoto 	},
11335a35408SKuninori Morimoto };
11435a35408SKuninori Morimoto 
11535a35408SKuninori Morimoto struct sh_eth_plat_data sh_eth_plat = {
11635a35408SKuninori Morimoto 	.phy = 0x1f, /* SMSC LAN8700 */
11735a35408SKuninori Morimoto 	.edmac_endian = EDMAC_LITTLE_ENDIAN,
11835a35408SKuninori Morimoto };
11935a35408SKuninori Morimoto 
12035a35408SKuninori Morimoto static struct platform_device sh_eth_device = {
12135a35408SKuninori Morimoto 	.name = "sh-eth",
12235a35408SKuninori Morimoto 	.id	= 0,
12335a35408SKuninori Morimoto 	.dev = {
12435a35408SKuninori Morimoto 		.platform_data = &sh_eth_plat,
12535a35408SKuninori Morimoto 	},
12635a35408SKuninori Morimoto 	.num_resources = ARRAY_SIZE(sh_eth_resources),
12735a35408SKuninori Morimoto 	.resource = sh_eth_resources,
12835a35408SKuninori Morimoto };
12935a35408SKuninori Morimoto 
130*907050a3SKuninori Morimoto /* USB0 host */
131*907050a3SKuninori Morimoto void usb0_port_power(int port, int power)
132*907050a3SKuninori Morimoto {
133*907050a3SKuninori Morimoto 	gpio_set_value(GPIO_PTB4, power);
134*907050a3SKuninori Morimoto }
135*907050a3SKuninori Morimoto 
136*907050a3SKuninori Morimoto static struct r8a66597_platdata usb0_host_data = {
137*907050a3SKuninori Morimoto 	.on_chip = 1,
138*907050a3SKuninori Morimoto 	.port_power = usb0_port_power,
139*907050a3SKuninori Morimoto };
140*907050a3SKuninori Morimoto 
141*907050a3SKuninori Morimoto static struct resource usb0_host_resources[] = {
142*907050a3SKuninori Morimoto 	[0] = {
143*907050a3SKuninori Morimoto 		.start	= 0xa4d80000,
144*907050a3SKuninori Morimoto 		.end	= 0xa4d80124 - 1,
145*907050a3SKuninori Morimoto 		.flags	= IORESOURCE_MEM,
146*907050a3SKuninori Morimoto 	},
147*907050a3SKuninori Morimoto 	[1] = {
148*907050a3SKuninori Morimoto 		.start	= 65,
149*907050a3SKuninori Morimoto 		.end	= 65,
150*907050a3SKuninori Morimoto 		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
151*907050a3SKuninori Morimoto 	},
152*907050a3SKuninori Morimoto };
153*907050a3SKuninori Morimoto 
154*907050a3SKuninori Morimoto static struct platform_device usb0_host_device = {
155*907050a3SKuninori Morimoto 	.name		= "r8a66597_hcd",
156*907050a3SKuninori Morimoto 	.id		= 0,
157*907050a3SKuninori Morimoto 	.dev = {
158*907050a3SKuninori Morimoto 		.dma_mask		= NULL,         /*  not use dma */
159*907050a3SKuninori Morimoto 		.coherent_dma_mask	= 0xffffffff,
160*907050a3SKuninori Morimoto 		.platform_data		= &usb0_host_data,
161*907050a3SKuninori Morimoto 	},
162*907050a3SKuninori Morimoto 	.num_resources	= ARRAY_SIZE(usb0_host_resources),
163*907050a3SKuninori Morimoto 	.resource	= usb0_host_resources,
164*907050a3SKuninori Morimoto };
165*907050a3SKuninori Morimoto 
166*907050a3SKuninori Morimoto /*
167*907050a3SKuninori Morimoto  * USB1
168*907050a3SKuninori Morimoto  *
169*907050a3SKuninori Morimoto  * CN5 can use both host/function,
170*907050a3SKuninori Morimoto  * and we can determine it by checking PTB[3]
171*907050a3SKuninori Morimoto  *
172*907050a3SKuninori Morimoto  * This time only USB1 host is supported.
173*907050a3SKuninori Morimoto  */
174*907050a3SKuninori Morimoto void usb1_port_power(int port, int power)
175*907050a3SKuninori Morimoto {
176*907050a3SKuninori Morimoto 	if (!gpio_get_value(GPIO_PTB3)) {
177*907050a3SKuninori Morimoto 		printk(KERN_ERR "USB1 function is not supported\n");
178*907050a3SKuninori Morimoto 		return;
179*907050a3SKuninori Morimoto 	}
180*907050a3SKuninori Morimoto 
181*907050a3SKuninori Morimoto 	gpio_set_value(GPIO_PTB5, power);
182*907050a3SKuninori Morimoto }
183*907050a3SKuninori Morimoto 
184*907050a3SKuninori Morimoto static struct r8a66597_platdata usb1_host_data = {
185*907050a3SKuninori Morimoto 	.on_chip = 1,
186*907050a3SKuninori Morimoto 	.port_power = usb1_port_power,
187*907050a3SKuninori Morimoto };
188*907050a3SKuninori Morimoto 
189*907050a3SKuninori Morimoto static struct resource usb1_host_resources[] = {
190*907050a3SKuninori Morimoto 	[0] = {
191*907050a3SKuninori Morimoto 		.start	= 0xa4d90000,
192*907050a3SKuninori Morimoto 		.end	= 0xa4d90124 - 1,
193*907050a3SKuninori Morimoto 		.flags	= IORESOURCE_MEM,
194*907050a3SKuninori Morimoto 	},
195*907050a3SKuninori Morimoto 	[1] = {
196*907050a3SKuninori Morimoto 		.start	= 66,
197*907050a3SKuninori Morimoto 		.end	= 66,
198*907050a3SKuninori Morimoto 		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
199*907050a3SKuninori Morimoto 	},
200*907050a3SKuninori Morimoto };
201*907050a3SKuninori Morimoto 
202*907050a3SKuninori Morimoto static struct platform_device usb1_host_device = {
203*907050a3SKuninori Morimoto 	.name		= "r8a66597_hcd",
204*907050a3SKuninori Morimoto 	.id		= 1,
205*907050a3SKuninori Morimoto 	.dev = {
206*907050a3SKuninori Morimoto 		.dma_mask		= NULL,         /*  not use dma */
207*907050a3SKuninori Morimoto 		.coherent_dma_mask	= 0xffffffff,
208*907050a3SKuninori Morimoto 		.platform_data		= &usb1_host_data,
209*907050a3SKuninori Morimoto 	},
210*907050a3SKuninori Morimoto 	.num_resources	= ARRAY_SIZE(usb1_host_resources),
211*907050a3SKuninori Morimoto 	.resource	= usb1_host_resources,
212*907050a3SKuninori Morimoto };
213*907050a3SKuninori Morimoto 
2144138b740SKuninori Morimoto static struct platform_device *ecovec_devices[] __initdata = {
2154138b740SKuninori Morimoto 	&heartbeat_device,
2164138b740SKuninori Morimoto 	&nor_flash_device,
21735a35408SKuninori Morimoto 	&sh_eth_device,
218*907050a3SKuninori Morimoto 	&usb0_host_device,
219*907050a3SKuninori Morimoto 	&usb1_host_device, /* USB1 host support */
2204138b740SKuninori Morimoto };
2214138b740SKuninori Morimoto 
2224138b740SKuninori Morimoto static int __init devices_setup(void)
2234138b740SKuninori Morimoto {
2244138b740SKuninori Morimoto 	/* enable SCIFA0 */
2254138b740SKuninori Morimoto 	gpio_request(GPIO_FN_SCIF0_TXD, NULL);
2264138b740SKuninori Morimoto 	gpio_request(GPIO_FN_SCIF0_RXD, NULL);
2274138b740SKuninori Morimoto 
2284138b740SKuninori Morimoto 	/* enable debug LED */
2294138b740SKuninori Morimoto 	gpio_request(GPIO_PTG0, NULL);
2304138b740SKuninori Morimoto 	gpio_request(GPIO_PTG1, NULL);
2314138b740SKuninori Morimoto 	gpio_request(GPIO_PTG2, NULL);
2324138b740SKuninori Morimoto 	gpio_request(GPIO_PTG3, NULL);
233b7056bc1SKuninori Morimoto 	gpio_direction_output(GPIO_PTG0, 0);
234b7056bc1SKuninori Morimoto 	gpio_direction_output(GPIO_PTG1, 0);
235b7056bc1SKuninori Morimoto 	gpio_direction_output(GPIO_PTG2, 0);
236b7056bc1SKuninori Morimoto 	gpio_direction_output(GPIO_PTG3, 0);
2374138b740SKuninori Morimoto 
23835a35408SKuninori Morimoto 	/* enable SH-Eth */
23935a35408SKuninori Morimoto 	gpio_request(GPIO_PTA1, NULL);
24035a35408SKuninori Morimoto 	gpio_direction_output(GPIO_PTA1, 1);
24135a35408SKuninori Morimoto 	mdelay(20);
24235a35408SKuninori Morimoto 
24335a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_RXD0,    NULL);
24435a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_RXD1,    NULL);
24535a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_TXD0,    NULL);
24635a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_TXD1,    NULL);
24735a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_REF_CLK, NULL);
24835a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_TX_EN,   NULL);
24935a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_RX_ER,   NULL);
25035a35408SKuninori Morimoto 	gpio_request(GPIO_FN_RMII_CRS_DV,  NULL);
25135a35408SKuninori Morimoto 	gpio_request(GPIO_FN_MDIO,         NULL);
25235a35408SKuninori Morimoto 	gpio_request(GPIO_FN_MDC,          NULL);
25335a35408SKuninori Morimoto 	gpio_request(GPIO_FN_LNKSTA,       NULL);
25435a35408SKuninori Morimoto 
255*907050a3SKuninori Morimoto 	/* enable USB */
256*907050a3SKuninori Morimoto 	gpio_request(GPIO_PTB3,  NULL);
257*907050a3SKuninori Morimoto 	gpio_request(GPIO_PTB4,  NULL);
258*907050a3SKuninori Morimoto 	gpio_request(GPIO_PTB5,  NULL);
259*907050a3SKuninori Morimoto 	gpio_direction_input(GPIO_PTB3);
260*907050a3SKuninori Morimoto 	gpio_direction_output(GPIO_PTB4, 0);
261*907050a3SKuninori Morimoto 	gpio_direction_output(GPIO_PTB5, 0);
262*907050a3SKuninori Morimoto 	ctrl_outw(0x0600, 0xa40501d4);
263*907050a3SKuninori Morimoto 	ctrl_outw(0x0600, 0xa4050192);
264*907050a3SKuninori Morimoto 
2654138b740SKuninori Morimoto 	return platform_add_devices(ecovec_devices,
2664138b740SKuninori Morimoto 				    ARRAY_SIZE(ecovec_devices));
2674138b740SKuninori Morimoto }
2684138b740SKuninori Morimoto device_initcall(devices_setup);
2694138b740SKuninori Morimoto 
2704138b740SKuninori Morimoto static struct sh_machine_vector mv_ecovec __initmv = {
2714138b740SKuninori Morimoto 	.mv_name	= "R0P7724 (EcoVec)",
2724138b740SKuninori Morimoto };
273