Path: blob/master/arch/arm/mach-omap1/board-innovator.c
10817 views
/*1* linux/arch/arm/mach-omap1/board-innovator.c2*3* Board specific inits for OMAP-1510 and OMAP-1610 Innovator4*5* Copyright (C) 2001 RidgeRun, Inc.6* Author: Greg Lonnon <[email protected]>7*8* Copyright (C) 2002 MontaVista Software, Inc.9*10* Separated FPGA interrupts from innovator1510.c and cleaned up for 2.611* Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <[email protected]>12*13* This program is free software; you can redistribute it and/or modify14* it under the terms of the GNU General Public License version 2 as15* published by the Free Software Foundation.16*/1718#include <linux/kernel.h>19#include <linux/init.h>20#include <linux/platform_device.h>21#include <linux/delay.h>22#include <linux/mtd/mtd.h>23#include <linux/mtd/partitions.h>24#include <linux/mtd/physmap.h>25#include <linux/input.h>26#include <linux/smc91x.h>2728#include <mach/hardware.h>29#include <asm/mach-types.h>30#include <asm/mach/arch.h>31#include <asm/mach/map.h>3233#include <plat/mux.h>34#include <plat/flash.h>35#include <plat/fpga.h>36#include <mach/gpio.h>37#include <plat/tc.h>38#include <plat/usb.h>39#include <plat/keypad.h>40#include <plat/common.h>41#include <plat/mmc.h>4243/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */44#define INNOVATOR1610_ETHR_START 0x040003004546static const unsigned int innovator_keymap[] = {47KEY(0, 0, KEY_F1),48KEY(3, 0, KEY_DOWN),49KEY(1, 1, KEY_F2),50KEY(2, 1, KEY_RIGHT),51KEY(0, 2, KEY_F3),52KEY(1, 2, KEY_F4),53KEY(2, 2, KEY_UP),54KEY(2, 3, KEY_ENTER),55KEY(3, 3, KEY_LEFT),56};5758static struct mtd_partition innovator_partitions[] = {59/* bootloader (U-Boot, etc) in first sector */60{61.name = "bootloader",62.offset = 0,63.size = SZ_128K,64.mask_flags = MTD_WRITEABLE, /* force read-only */65},66/* bootloader params in the next sector */67{68.name = "params",69.offset = MTDPART_OFS_APPEND,70.size = SZ_128K,71.mask_flags = 0,72},73/* kernel */74{75.name = "kernel",76.offset = MTDPART_OFS_APPEND,77.size = SZ_2M,78.mask_flags = 079},80/* rest of flash1 is a file system */81{82.name = "rootfs",83.offset = MTDPART_OFS_APPEND,84.size = SZ_16M - SZ_2M - 2 * SZ_128K,85.mask_flags = 086},87/* file system */88{89.name = "filesystem",90.offset = MTDPART_OFS_APPEND,91.size = MTDPART_SIZ_FULL,92.mask_flags = 093}94};9596static struct physmap_flash_data innovator_flash_data = {97.width = 2,98.set_vpp = omap1_set_vpp,99.parts = innovator_partitions,100.nr_parts = ARRAY_SIZE(innovator_partitions),101};102103static struct resource innovator_flash_resource = {104.start = OMAP_CS0_PHYS,105.end = OMAP_CS0_PHYS + SZ_32M - 1,106.flags = IORESOURCE_MEM,107};108109static struct platform_device innovator_flash_device = {110.name = "physmap-flash",111.id = 0,112.dev = {113.platform_data = &innovator_flash_data,114},115.num_resources = 1,116.resource = &innovator_flash_resource,117};118119static struct resource innovator_kp_resources[] = {120[0] = {121.start = INT_KEYBOARD,122.end = INT_KEYBOARD,123.flags = IORESOURCE_IRQ,124},125};126127static const struct matrix_keymap_data innovator_keymap_data = {128.keymap = innovator_keymap,129.keymap_size = ARRAY_SIZE(innovator_keymap),130};131132static struct omap_kp_platform_data innovator_kp_data = {133.rows = 8,134.cols = 8,135.keymap_data = &innovator_keymap_data,136.delay = 4,137};138139static struct platform_device innovator_kp_device = {140.name = "omap-keypad",141.id = -1,142.dev = {143.platform_data = &innovator_kp_data,144},145.num_resources = ARRAY_SIZE(innovator_kp_resources),146.resource = innovator_kp_resources,147};148149static struct smc91x_platdata innovator_smc91x_info = {150.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,151.leda = RPC_LED_100_10,152.ledb = RPC_LED_TX_RX,153};154155#ifdef CONFIG_ARCH_OMAP15XX156157#include <linux/spi/spi.h>158#include <linux/spi/ads7846.h>159160161/* Only FPGA needs to be mapped here. All others are done with ioremap */162static struct map_desc innovator1510_io_desc[] __initdata = {163{164.virtual = OMAP1510_FPGA_BASE,165.pfn = __phys_to_pfn(OMAP1510_FPGA_START),166.length = OMAP1510_FPGA_SIZE,167.type = MT_DEVICE168}169};170171static struct resource innovator1510_smc91x_resources[] = {172[0] = {173.start = OMAP1510_FPGA_ETHR_START, /* Physical */174.end = OMAP1510_FPGA_ETHR_START + 0xf,175.flags = IORESOURCE_MEM,176},177[1] = {178.start = OMAP1510_INT_ETHER,179.end = OMAP1510_INT_ETHER,180.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,181},182};183184static struct platform_device innovator1510_smc91x_device = {185.name = "smc91x",186.id = 0,187.dev = {188.platform_data = &innovator_smc91x_info,189},190.num_resources = ARRAY_SIZE(innovator1510_smc91x_resources),191.resource = innovator1510_smc91x_resources,192};193194static struct platform_device innovator1510_lcd_device = {195.name = "lcd_inn1510",196.id = -1,197};198199static struct platform_device innovator1510_spi_device = {200.name = "spi_inn1510",201.id = -1,202};203204static struct platform_device *innovator1510_devices[] __initdata = {205&innovator_flash_device,206&innovator1510_smc91x_device,207&innovator_kp_device,208&innovator1510_lcd_device,209&innovator1510_spi_device,210};211212static int innovator_get_pendown_state(void)213{214return !(fpga_read(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));215}216217static const struct ads7846_platform_data innovator1510_ts_info = {218.model = 7846,219.vref_delay_usecs = 100, /* internal, no capacitor */220.x_plate_ohms = 419,221.y_plate_ohms = 486,222.get_pendown_state = innovator_get_pendown_state,223};224225static struct spi_board_info __initdata innovator1510_boardinfo[] = { {226/* FPGA (bus "10") CS0 has an ads7846e */227.modalias = "ads7846",228.platform_data = &innovator1510_ts_info,229.irq = OMAP1510_INT_FPGA_TS,230.max_speed_hz = 120000 /* max sample rate at 3V */231* 26 /* command + data + overhead */,232.bus_num = 10,233.chip_select = 0,234} };235236#endif /* CONFIG_ARCH_OMAP15XX */237238#ifdef CONFIG_ARCH_OMAP16XX239240static struct resource innovator1610_smc91x_resources[] = {241[0] = {242.start = INNOVATOR1610_ETHR_START, /* Physical */243.end = INNOVATOR1610_ETHR_START + 0xf,244.flags = IORESOURCE_MEM,245},246[1] = {247.start = OMAP_GPIO_IRQ(0),248.end = OMAP_GPIO_IRQ(0),249.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,250},251};252253static struct platform_device innovator1610_smc91x_device = {254.name = "smc91x",255.id = 0,256.dev = {257.platform_data = &innovator_smc91x_info,258},259.num_resources = ARRAY_SIZE(innovator1610_smc91x_resources),260.resource = innovator1610_smc91x_resources,261};262263static struct platform_device innovator1610_lcd_device = {264.name = "inn1610_lcd",265.id = -1,266};267268static struct platform_device *innovator1610_devices[] __initdata = {269&innovator_flash_device,270&innovator1610_smc91x_device,271&innovator_kp_device,272&innovator1610_lcd_device,273};274275#endif /* CONFIG_ARCH_OMAP16XX */276277static void __init innovator_init_smc91x(void)278{279if (cpu_is_omap1510()) {280fpga_write(fpga_read(OMAP1510_FPGA_RST) & ~1,281OMAP1510_FPGA_RST);282udelay(750);283} else {284if (gpio_request(0, "SMC91x irq") < 0) {285printk("Error requesting gpio 0 for smc91x irq\n");286return;287}288}289}290291static void __init innovator_init_irq(void)292{293omap1_init_common_hw();294omap_init_irq();295}296297#ifdef CONFIG_ARCH_OMAP15XX298static struct omap_usb_config innovator1510_usb_config __initdata = {299/* for bundled non-standard host and peripheral cables */300.hmc_mode = 4,301302.register_host = 1,303.pins[1] = 6,304.pins[2] = 6, /* Conflicts with UART2 */305306.register_dev = 1,307.pins[0] = 2,308};309310static struct omap_lcd_config innovator1510_lcd_config __initdata = {311.ctrl_name = "internal",312};313#endif314315#ifdef CONFIG_ARCH_OMAP16XX316static struct omap_usb_config h2_usb_config __initdata = {317/* usb1 has a Mini-AB port and external isp1301 transceiver */318.otg = 2,319320#ifdef CONFIG_USB_GADGET_OMAP321.hmc_mode = 19, /* 0:host(off) 1:dev|otg 2:disabled */322/* .hmc_mode = 21,*/ /* 0:host(off) 1:dev(loopback) 2:host(loopback) */323#elif defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)324/* NONSTANDARD CABLE NEEDED (B-to-Mini-B) */325.hmc_mode = 20, /* 1:dev|otg(off) 1:host 2:disabled */326#endif327328.pins[1] = 3,329};330331static struct omap_lcd_config innovator1610_lcd_config __initdata = {332.ctrl_name = "internal",333};334#endif335336#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)337338static int mmc_set_power(struct device *dev, int slot, int power_on,339int vdd)340{341if (power_on)342fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3),343OMAP1510_FPGA_POWER);344else345fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3),346OMAP1510_FPGA_POWER);347348return 0;349}350351/*352* Innovator could use the following functions tested:353* - mmc_get_wp that uses OMAP_MPUIO(3)354* - mmc_get_cover_state that uses FPGA F4 UIO43355*/356static struct omap_mmc_platform_data mmc1_data = {357.nr_slots = 1,358.slots[0] = {359.set_power = mmc_set_power,360.wires = 4,361.name = "mmcblk",362},363};364365static struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];366367static void __init innovator_mmc_init(void)368{369mmc_data[0] = &mmc1_data;370omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);371}372373#else374static inline void innovator_mmc_init(void)375{376}377#endif378379static struct omap_board_config_kernel innovator_config[] = {380{ OMAP_TAG_LCD, NULL },381};382383static void __init innovator_init(void)384{385if (cpu_is_omap1510())386omap1510_fpga_init_irq();387innovator_init_smc91x();388389#ifdef CONFIG_ARCH_OMAP15XX390if (cpu_is_omap1510()) {391unsigned char reg;392393/* mux pins for uarts */394omap_cfg_reg(UART1_TX);395omap_cfg_reg(UART1_RTS);396omap_cfg_reg(UART2_TX);397omap_cfg_reg(UART2_RTS);398omap_cfg_reg(UART3_TX);399omap_cfg_reg(UART3_RX);400401reg = fpga_read(OMAP1510_FPGA_POWER);402reg |= OMAP1510_FPGA_PCR_COM1_EN;403fpga_write(reg, OMAP1510_FPGA_POWER);404udelay(10);405406reg = fpga_read(OMAP1510_FPGA_POWER);407reg |= OMAP1510_FPGA_PCR_COM2_EN;408fpga_write(reg, OMAP1510_FPGA_POWER);409udelay(10);410411platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices));412spi_register_board_info(innovator1510_boardinfo,413ARRAY_SIZE(innovator1510_boardinfo));414}415#endif416#ifdef CONFIG_ARCH_OMAP16XX417if (!cpu_is_omap1510()) {418platform_add_devices(innovator1610_devices, ARRAY_SIZE(innovator1610_devices));419}420#endif421422#ifdef CONFIG_ARCH_OMAP15XX423if (cpu_is_omap1510()) {424omap1_usb_init(&innovator1510_usb_config);425innovator_config[1].data = &innovator1510_lcd_config;426}427#endif428#ifdef CONFIG_ARCH_OMAP16XX429if (cpu_is_omap1610()) {430omap1_usb_init(&h2_usb_config);431innovator_config[1].data = &innovator1610_lcd_config;432}433#endif434omap_board_config = innovator_config;435omap_board_config_size = ARRAY_SIZE(innovator_config);436omap_serial_init();437omap_register_i2c_bus(1, 100, NULL, 0);438innovator_mmc_init();439}440441static void __init innovator_map_io(void)442{443omap1_map_common_io();444445#ifdef CONFIG_ARCH_OMAP15XX446if (cpu_is_omap1510()) {447iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc));448udelay(10); /* Delay needed for FPGA */449450/* Dump the Innovator FPGA rev early - useful info for support. */451printk("Innovator FPGA Rev %d.%d Board Rev %d\n",452fpga_read(OMAP1510_FPGA_REV_HIGH),453fpga_read(OMAP1510_FPGA_REV_LOW),454fpga_read(OMAP1510_FPGA_BOARD_REV));455}456#endif457}458459MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")460/* Maintainer: MontaVista Software, Inc. */461.boot_params = 0x10000100,462.map_io = innovator_map_io,463.reserve = omap_reserve,464.init_irq = innovator_init_irq,465.init_machine = innovator_init,466.timer = &omap_timer,467MACHINE_END468469470