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