18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-omap1/board-innovator.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Board specific inits for OMAP-1510 and OMAP-1610 Innovator 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2001 RidgeRun, Inc. 88c2ecf20Sopenharmony_ci * Author: Greg Lonnon <glonnon@ridgerun.com> 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Copyright (C) 2002 MontaVista Software, Inc. 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6 138c2ecf20Sopenharmony_ci * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com> 148c2ecf20Sopenharmony_ci */ 158c2ecf20Sopenharmony_ci#include <linux/gpio.h> 168c2ecf20Sopenharmony_ci#include <linux/kernel.h> 178c2ecf20Sopenharmony_ci#include <linux/init.h> 188c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 198c2ecf20Sopenharmony_ci#include <linux/delay.h> 208c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 218c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 228c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 238c2ecf20Sopenharmony_ci#include <linux/input.h> 248c2ecf20Sopenharmony_ci#include <linux/smc91x.h> 258c2ecf20Sopenharmony_ci#include <linux/omapfb.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 288c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 298c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <mach/mux.h> 328c2ecf20Sopenharmony_ci#include "flash.h" 338c2ecf20Sopenharmony_ci#include <mach/tc.h> 348c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-omap.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include <mach/hardware.h> 378c2ecf20Sopenharmony_ci#include <mach/usb.h> 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#include "iomap.h" 408c2ecf20Sopenharmony_ci#include "common.h" 418c2ecf20Sopenharmony_ci#include "mmc.h" 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */ 448c2ecf20Sopenharmony_ci#define INNOVATOR1610_ETHR_START 0x04000300 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic const unsigned int innovator_keymap[] = { 478c2ecf20Sopenharmony_ci KEY(0, 0, KEY_F1), 488c2ecf20Sopenharmony_ci KEY(3, 0, KEY_DOWN), 498c2ecf20Sopenharmony_ci KEY(1, 1, KEY_F2), 508c2ecf20Sopenharmony_ci KEY(2, 1, KEY_RIGHT), 518c2ecf20Sopenharmony_ci KEY(0, 2, KEY_F3), 528c2ecf20Sopenharmony_ci KEY(1, 2, KEY_F4), 538c2ecf20Sopenharmony_ci KEY(2, 2, KEY_UP), 548c2ecf20Sopenharmony_ci KEY(2, 3, KEY_ENTER), 558c2ecf20Sopenharmony_ci KEY(3, 3, KEY_LEFT), 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistatic struct mtd_partition innovator_partitions[] = { 598c2ecf20Sopenharmony_ci /* bootloader (U-Boot, etc) in first sector */ 608c2ecf20Sopenharmony_ci { 618c2ecf20Sopenharmony_ci .name = "bootloader", 628c2ecf20Sopenharmony_ci .offset = 0, 638c2ecf20Sopenharmony_ci .size = SZ_128K, 648c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* force read-only */ 658c2ecf20Sopenharmony_ci }, 668c2ecf20Sopenharmony_ci /* bootloader params in the next sector */ 678c2ecf20Sopenharmony_ci { 688c2ecf20Sopenharmony_ci .name = "params", 698c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 708c2ecf20Sopenharmony_ci .size = SZ_128K, 718c2ecf20Sopenharmony_ci .mask_flags = 0, 728c2ecf20Sopenharmony_ci }, 738c2ecf20Sopenharmony_ci /* kernel */ 748c2ecf20Sopenharmony_ci { 758c2ecf20Sopenharmony_ci .name = "kernel", 768c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 778c2ecf20Sopenharmony_ci .size = SZ_2M, 788c2ecf20Sopenharmony_ci .mask_flags = 0 798c2ecf20Sopenharmony_ci }, 808c2ecf20Sopenharmony_ci /* rest of flash1 is a file system */ 818c2ecf20Sopenharmony_ci { 828c2ecf20Sopenharmony_ci .name = "rootfs", 838c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 848c2ecf20Sopenharmony_ci .size = SZ_16M - SZ_2M - 2 * SZ_128K, 858c2ecf20Sopenharmony_ci .mask_flags = 0 868c2ecf20Sopenharmony_ci }, 878c2ecf20Sopenharmony_ci /* file system */ 888c2ecf20Sopenharmony_ci { 898c2ecf20Sopenharmony_ci .name = "filesystem", 908c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 918c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL, 928c2ecf20Sopenharmony_ci .mask_flags = 0 938c2ecf20Sopenharmony_ci } 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic struct physmap_flash_data innovator_flash_data = { 978c2ecf20Sopenharmony_ci .width = 2, 988c2ecf20Sopenharmony_ci .set_vpp = omap1_set_vpp, 998c2ecf20Sopenharmony_ci .parts = innovator_partitions, 1008c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(innovator_partitions), 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic struct resource innovator_flash_resource = { 1048c2ecf20Sopenharmony_ci .start = OMAP_CS0_PHYS, 1058c2ecf20Sopenharmony_ci .end = OMAP_CS0_PHYS + SZ_32M - 1, 1068c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1078c2ecf20Sopenharmony_ci}; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic struct platform_device innovator_flash_device = { 1108c2ecf20Sopenharmony_ci .name = "physmap-flash", 1118c2ecf20Sopenharmony_ci .id = 0, 1128c2ecf20Sopenharmony_ci .dev = { 1138c2ecf20Sopenharmony_ci .platform_data = &innovator_flash_data, 1148c2ecf20Sopenharmony_ci }, 1158c2ecf20Sopenharmony_ci .num_resources = 1, 1168c2ecf20Sopenharmony_ci .resource = &innovator_flash_resource, 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic struct resource innovator_kp_resources[] = { 1208c2ecf20Sopenharmony_ci [0] = { 1218c2ecf20Sopenharmony_ci .start = INT_KEYBOARD, 1228c2ecf20Sopenharmony_ci .end = INT_KEYBOARD, 1238c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 1248c2ecf20Sopenharmony_ci }, 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cistatic const struct matrix_keymap_data innovator_keymap_data = { 1288c2ecf20Sopenharmony_ci .keymap = innovator_keymap, 1298c2ecf20Sopenharmony_ci .keymap_size = ARRAY_SIZE(innovator_keymap), 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistatic struct omap_kp_platform_data innovator_kp_data = { 1338c2ecf20Sopenharmony_ci .rows = 8, 1348c2ecf20Sopenharmony_ci .cols = 8, 1358c2ecf20Sopenharmony_ci .keymap_data = &innovator_keymap_data, 1368c2ecf20Sopenharmony_ci .delay = 4, 1378c2ecf20Sopenharmony_ci}; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_cistatic struct platform_device innovator_kp_device = { 1408c2ecf20Sopenharmony_ci .name = "omap-keypad", 1418c2ecf20Sopenharmony_ci .id = -1, 1428c2ecf20Sopenharmony_ci .dev = { 1438c2ecf20Sopenharmony_ci .platform_data = &innovator_kp_data, 1448c2ecf20Sopenharmony_ci }, 1458c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(innovator_kp_resources), 1468c2ecf20Sopenharmony_ci .resource = innovator_kp_resources, 1478c2ecf20Sopenharmony_ci}; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistatic struct smc91x_platdata innovator_smc91x_info = { 1508c2ecf20Sopenharmony_ci .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 1518c2ecf20Sopenharmony_ci .leda = RPC_LED_100_10, 1528c2ecf20Sopenharmony_ci .ledb = RPC_LED_TX_RX, 1538c2ecf20Sopenharmony_ci}; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 1588c2ecf20Sopenharmony_ci#include <linux/spi/ads7846.h> 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci/* Only FPGA needs to be mapped here. All others are done with ioremap */ 1628c2ecf20Sopenharmony_cistatic struct map_desc innovator1510_io_desc[] __initdata = { 1638c2ecf20Sopenharmony_ci { 1648c2ecf20Sopenharmony_ci .virtual = OMAP1510_FPGA_BASE, 1658c2ecf20Sopenharmony_ci .pfn = __phys_to_pfn(OMAP1510_FPGA_START), 1668c2ecf20Sopenharmony_ci .length = OMAP1510_FPGA_SIZE, 1678c2ecf20Sopenharmony_ci .type = MT_DEVICE 1688c2ecf20Sopenharmony_ci } 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_cistatic struct resource innovator1510_smc91x_resources[] = { 1728c2ecf20Sopenharmony_ci [0] = { 1738c2ecf20Sopenharmony_ci .start = OMAP1510_FPGA_ETHR_START, /* Physical */ 1748c2ecf20Sopenharmony_ci .end = OMAP1510_FPGA_ETHR_START + 0xf, 1758c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1768c2ecf20Sopenharmony_ci }, 1778c2ecf20Sopenharmony_ci [1] = { 1788c2ecf20Sopenharmony_ci .start = OMAP1510_INT_ETHER, 1798c2ecf20Sopenharmony_ci .end = OMAP1510_INT_ETHER, 1808c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, 1818c2ecf20Sopenharmony_ci }, 1828c2ecf20Sopenharmony_ci}; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_smc91x_device = { 1858c2ecf20Sopenharmony_ci .name = "smc91x", 1868c2ecf20Sopenharmony_ci .id = 0, 1878c2ecf20Sopenharmony_ci .dev = { 1888c2ecf20Sopenharmony_ci .platform_data = &innovator_smc91x_info, 1898c2ecf20Sopenharmony_ci }, 1908c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(innovator1510_smc91x_resources), 1918c2ecf20Sopenharmony_ci .resource = innovator1510_smc91x_resources, 1928c2ecf20Sopenharmony_ci}; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_lcd_device = { 1958c2ecf20Sopenharmony_ci .name = "lcd_inn1510", 1968c2ecf20Sopenharmony_ci .id = -1, 1978c2ecf20Sopenharmony_ci}; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_spi_device = { 2008c2ecf20Sopenharmony_ci .name = "spi_inn1510", 2018c2ecf20Sopenharmony_ci .id = -1, 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic struct platform_device *innovator1510_devices[] __initdata = { 2058c2ecf20Sopenharmony_ci &innovator_flash_device, 2068c2ecf20Sopenharmony_ci &innovator1510_smc91x_device, 2078c2ecf20Sopenharmony_ci &innovator_kp_device, 2088c2ecf20Sopenharmony_ci &innovator1510_lcd_device, 2098c2ecf20Sopenharmony_ci &innovator1510_spi_device, 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistatic int innovator_get_pendown_state(void) 2138c2ecf20Sopenharmony_ci{ 2148c2ecf20Sopenharmony_ci return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5)); 2158c2ecf20Sopenharmony_ci} 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_cistatic const struct ads7846_platform_data innovator1510_ts_info = { 2188c2ecf20Sopenharmony_ci .model = 7846, 2198c2ecf20Sopenharmony_ci .vref_delay_usecs = 100, /* internal, no capacitor */ 2208c2ecf20Sopenharmony_ci .x_plate_ohms = 419, 2218c2ecf20Sopenharmony_ci .y_plate_ohms = 486, 2228c2ecf20Sopenharmony_ci .get_pendown_state = innovator_get_pendown_state, 2238c2ecf20Sopenharmony_ci}; 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic struct spi_board_info __initdata innovator1510_boardinfo[] = { { 2268c2ecf20Sopenharmony_ci /* FPGA (bus "10") CS0 has an ads7846e */ 2278c2ecf20Sopenharmony_ci .modalias = "ads7846", 2288c2ecf20Sopenharmony_ci .platform_data = &innovator1510_ts_info, 2298c2ecf20Sopenharmony_ci .irq = OMAP1510_INT_FPGA_TS, 2308c2ecf20Sopenharmony_ci .max_speed_hz = 120000 /* max sample rate at 3V */ 2318c2ecf20Sopenharmony_ci * 26 /* command + data + overhead */, 2328c2ecf20Sopenharmony_ci .bus_num = 10, 2338c2ecf20Sopenharmony_ci .chip_select = 0, 2348c2ecf20Sopenharmony_ci} }; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci#endif /* CONFIG_ARCH_OMAP15XX */ 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_cistatic struct resource innovator1610_smc91x_resources[] = { 2418c2ecf20Sopenharmony_ci [0] = { 2428c2ecf20Sopenharmony_ci .start = INNOVATOR1610_ETHR_START, /* Physical */ 2438c2ecf20Sopenharmony_ci .end = INNOVATOR1610_ETHR_START + 0xf, 2448c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2458c2ecf20Sopenharmony_ci }, 2468c2ecf20Sopenharmony_ci [1] = { 2478c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, 2488c2ecf20Sopenharmony_ci }, 2498c2ecf20Sopenharmony_ci}; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic struct platform_device innovator1610_smc91x_device = { 2528c2ecf20Sopenharmony_ci .name = "smc91x", 2538c2ecf20Sopenharmony_ci .id = 0, 2548c2ecf20Sopenharmony_ci .dev = { 2558c2ecf20Sopenharmony_ci .platform_data = &innovator_smc91x_info, 2568c2ecf20Sopenharmony_ci }, 2578c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(innovator1610_smc91x_resources), 2588c2ecf20Sopenharmony_ci .resource = innovator1610_smc91x_resources, 2598c2ecf20Sopenharmony_ci}; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_cistatic struct platform_device innovator1610_lcd_device = { 2628c2ecf20Sopenharmony_ci .name = "inn1610_lcd", 2638c2ecf20Sopenharmony_ci .id = -1, 2648c2ecf20Sopenharmony_ci}; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_cistatic struct platform_device *innovator1610_devices[] __initdata = { 2678c2ecf20Sopenharmony_ci &innovator_flash_device, 2688c2ecf20Sopenharmony_ci &innovator1610_smc91x_device, 2698c2ecf20Sopenharmony_ci &innovator_kp_device, 2708c2ecf20Sopenharmony_ci &innovator1610_lcd_device, 2718c2ecf20Sopenharmony_ci}; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci#endif /* CONFIG_ARCH_OMAP16XX */ 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_cistatic void __init innovator_init_smc91x(void) 2768c2ecf20Sopenharmony_ci{ 2778c2ecf20Sopenharmony_ci if (cpu_is_omap1510()) { 2788c2ecf20Sopenharmony_ci __raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1, 2798c2ecf20Sopenharmony_ci OMAP1510_FPGA_RST); 2808c2ecf20Sopenharmony_ci udelay(750); 2818c2ecf20Sopenharmony_ci } else { 2828c2ecf20Sopenharmony_ci if (gpio_request(0, "SMC91x irq") < 0) { 2838c2ecf20Sopenharmony_ci printk("Error requesting gpio 0 for smc91x irq\n"); 2848c2ecf20Sopenharmony_ci return; 2858c2ecf20Sopenharmony_ci } 2868c2ecf20Sopenharmony_ci } 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX 2908c2ecf20Sopenharmony_cistatic struct omap_usb_config innovator1510_usb_config __initdata = { 2918c2ecf20Sopenharmony_ci /* for bundled non-standard host and peripheral cables */ 2928c2ecf20Sopenharmony_ci .hmc_mode = 4, 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci .register_host = 1, 2958c2ecf20Sopenharmony_ci .pins[1] = 6, 2968c2ecf20Sopenharmony_ci .pins[2] = 6, /* Conflicts with UART2 */ 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci .register_dev = 1, 2998c2ecf20Sopenharmony_ci .pins[0] = 2, 3008c2ecf20Sopenharmony_ci}; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_cistatic const struct omap_lcd_config innovator1510_lcd_config __initconst = { 3038c2ecf20Sopenharmony_ci .ctrl_name = "internal", 3048c2ecf20Sopenharmony_ci}; 3058c2ecf20Sopenharmony_ci#endif 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX 3088c2ecf20Sopenharmony_cistatic struct omap_usb_config h2_usb_config __initdata = { 3098c2ecf20Sopenharmony_ci /* usb1 has a Mini-AB port and external isp1301 transceiver */ 3108c2ecf20Sopenharmony_ci .otg = 2, 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_OMAP) 3138c2ecf20Sopenharmony_ci .hmc_mode = 19, /* 0:host(off) 1:dev|otg 2:disabled */ 3148c2ecf20Sopenharmony_ci /* .hmc_mode = 21,*/ /* 0:host(off) 1:dev(loopback) 2:host(loopback) */ 3158c2ecf20Sopenharmony_ci#elif IS_ENABLED(CONFIG_USB_OHCI_HCD) 3168c2ecf20Sopenharmony_ci /* NONSTANDARD CABLE NEEDED (B-to-Mini-B) */ 3178c2ecf20Sopenharmony_ci .hmc_mode = 20, /* 1:dev|otg(off) 1:host 2:disabled */ 3188c2ecf20Sopenharmony_ci#endif 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci .pins[1] = 3, 3218c2ecf20Sopenharmony_ci}; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_cistatic const struct omap_lcd_config innovator1610_lcd_config __initconst = { 3248c2ecf20Sopenharmony_ci .ctrl_name = "internal", 3258c2ecf20Sopenharmony_ci}; 3268c2ecf20Sopenharmony_ci#endif 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_MMC_OMAP) 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_cistatic int mmc_set_power(struct device *dev, int slot, int power_on, 3318c2ecf20Sopenharmony_ci int vdd) 3328c2ecf20Sopenharmony_ci{ 3338c2ecf20Sopenharmony_ci if (power_on) 3348c2ecf20Sopenharmony_ci __raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) | (1 << 3), 3358c2ecf20Sopenharmony_ci OMAP1510_FPGA_POWER); 3368c2ecf20Sopenharmony_ci else 3378c2ecf20Sopenharmony_ci __raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) & ~(1 << 3), 3388c2ecf20Sopenharmony_ci OMAP1510_FPGA_POWER); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci return 0; 3418c2ecf20Sopenharmony_ci} 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci/* 3448c2ecf20Sopenharmony_ci * Innovator could use the following functions tested: 3458c2ecf20Sopenharmony_ci * - mmc_get_wp that uses OMAP_MPUIO(3) 3468c2ecf20Sopenharmony_ci * - mmc_get_cover_state that uses FPGA F4 UIO43 3478c2ecf20Sopenharmony_ci */ 3488c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data mmc1_data = { 3498c2ecf20Sopenharmony_ci .nr_slots = 1, 3508c2ecf20Sopenharmony_ci .slots[0] = { 3518c2ecf20Sopenharmony_ci .set_power = mmc_set_power, 3528c2ecf20Sopenharmony_ci .wires = 4, 3538c2ecf20Sopenharmony_ci .name = "mmcblk", 3548c2ecf20Sopenharmony_ci }, 3558c2ecf20Sopenharmony_ci}; 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC]; 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_cistatic void __init innovator_mmc_init(void) 3608c2ecf20Sopenharmony_ci{ 3618c2ecf20Sopenharmony_ci mmc_data[0] = &mmc1_data; 3628c2ecf20Sopenharmony_ci omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC); 3638c2ecf20Sopenharmony_ci} 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci#else 3668c2ecf20Sopenharmony_cistatic inline void innovator_mmc_init(void) 3678c2ecf20Sopenharmony_ci{ 3688c2ecf20Sopenharmony_ci} 3698c2ecf20Sopenharmony_ci#endif 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_cistatic void __init innovator_init(void) 3728c2ecf20Sopenharmony_ci{ 3738c2ecf20Sopenharmony_ci if (cpu_is_omap1510()) 3748c2ecf20Sopenharmony_ci omap1510_fpga_init_irq(); 3758c2ecf20Sopenharmony_ci innovator_init_smc91x(); 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX 3788c2ecf20Sopenharmony_ci if (cpu_is_omap1510()) { 3798c2ecf20Sopenharmony_ci unsigned char reg; 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci /* mux pins for uarts */ 3828c2ecf20Sopenharmony_ci omap_cfg_reg(UART1_TX); 3838c2ecf20Sopenharmony_ci omap_cfg_reg(UART1_RTS); 3848c2ecf20Sopenharmony_ci omap_cfg_reg(UART2_TX); 3858c2ecf20Sopenharmony_ci omap_cfg_reg(UART2_RTS); 3868c2ecf20Sopenharmony_ci omap_cfg_reg(UART3_TX); 3878c2ecf20Sopenharmony_ci omap_cfg_reg(UART3_RX); 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci reg = __raw_readb(OMAP1510_FPGA_POWER); 3908c2ecf20Sopenharmony_ci reg |= OMAP1510_FPGA_PCR_COM1_EN; 3918c2ecf20Sopenharmony_ci __raw_writeb(reg, OMAP1510_FPGA_POWER); 3928c2ecf20Sopenharmony_ci udelay(10); 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci reg = __raw_readb(OMAP1510_FPGA_POWER); 3958c2ecf20Sopenharmony_ci reg |= OMAP1510_FPGA_PCR_COM2_EN; 3968c2ecf20Sopenharmony_ci __raw_writeb(reg, OMAP1510_FPGA_POWER); 3978c2ecf20Sopenharmony_ci udelay(10); 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ci platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices)); 4008c2ecf20Sopenharmony_ci spi_register_board_info(innovator1510_boardinfo, 4018c2ecf20Sopenharmony_ci ARRAY_SIZE(innovator1510_boardinfo)); 4028c2ecf20Sopenharmony_ci } 4038c2ecf20Sopenharmony_ci#endif 4048c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX 4058c2ecf20Sopenharmony_ci if (!cpu_is_omap1510()) { 4068c2ecf20Sopenharmony_ci innovator1610_smc91x_resources[1].start = gpio_to_irq(0); 4078c2ecf20Sopenharmony_ci innovator1610_smc91x_resources[1].end = gpio_to_irq(0); 4088c2ecf20Sopenharmony_ci platform_add_devices(innovator1610_devices, ARRAY_SIZE(innovator1610_devices)); 4098c2ecf20Sopenharmony_ci } 4108c2ecf20Sopenharmony_ci#endif 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX 4138c2ecf20Sopenharmony_ci if (cpu_is_omap1510()) { 4148c2ecf20Sopenharmony_ci omap1_usb_init(&innovator1510_usb_config); 4158c2ecf20Sopenharmony_ci omapfb_set_lcd_config(&innovator1510_lcd_config); 4168c2ecf20Sopenharmony_ci } 4178c2ecf20Sopenharmony_ci#endif 4188c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX 4198c2ecf20Sopenharmony_ci if (cpu_is_omap1610()) { 4208c2ecf20Sopenharmony_ci omap1_usb_init(&h2_usb_config); 4218c2ecf20Sopenharmony_ci omapfb_set_lcd_config(&innovator1610_lcd_config); 4228c2ecf20Sopenharmony_ci } 4238c2ecf20Sopenharmony_ci#endif 4248c2ecf20Sopenharmony_ci omap_serial_init(); 4258c2ecf20Sopenharmony_ci omap_register_i2c_bus(1, 100, NULL, 0); 4268c2ecf20Sopenharmony_ci innovator_mmc_init(); 4278c2ecf20Sopenharmony_ci} 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci/* 4308c2ecf20Sopenharmony_ci * REVISIT: Assume 15xx for now, we don't want to do revision check 4318c2ecf20Sopenharmony_ci * until later on. The right way to fix this is to set up a different 4328c2ecf20Sopenharmony_ci * machine_id for 16xx Innovator, or use device tree. 4338c2ecf20Sopenharmony_ci */ 4348c2ecf20Sopenharmony_cistatic void __init innovator_map_io(void) 4358c2ecf20Sopenharmony_ci{ 4368c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX 4378c2ecf20Sopenharmony_ci omap15xx_map_io(); 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ci iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc)); 4408c2ecf20Sopenharmony_ci udelay(10); /* Delay needed for FPGA */ 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci /* Dump the Innovator FPGA rev early - useful info for support. */ 4438c2ecf20Sopenharmony_ci pr_debug("Innovator FPGA Rev %d.%d Board Rev %d\n", 4448c2ecf20Sopenharmony_ci __raw_readb(OMAP1510_FPGA_REV_HIGH), 4458c2ecf20Sopenharmony_ci __raw_readb(OMAP1510_FPGA_REV_LOW), 4468c2ecf20Sopenharmony_ci __raw_readb(OMAP1510_FPGA_BOARD_REV)); 4478c2ecf20Sopenharmony_ci#endif 4488c2ecf20Sopenharmony_ci} 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_ciMACHINE_START(OMAP_INNOVATOR, "TI-Innovator") 4518c2ecf20Sopenharmony_ci /* Maintainer: MontaVista Software, Inc. */ 4528c2ecf20Sopenharmony_ci .atag_offset = 0x100, 4538c2ecf20Sopenharmony_ci .map_io = innovator_map_io, 4548c2ecf20Sopenharmony_ci .init_early = omap1_init_early, 4558c2ecf20Sopenharmony_ci .init_irq = omap1_init_irq, 4568c2ecf20Sopenharmony_ci .handle_irq = omap1_handle_irq, 4578c2ecf20Sopenharmony_ci .init_machine = innovator_init, 4588c2ecf20Sopenharmony_ci .init_late = omap1_init_late, 4598c2ecf20Sopenharmony_ci .init_time = omap1_timer_init, 4608c2ecf20Sopenharmony_ci .restart = omap1_restart, 4618c2ecf20Sopenharmony_ciMACHINE_END 462