diff options
Diffstat (limited to 'arch/arm/mach-omap2/board-igep0020.c')
| -rw-r--r-- | arch/arm/mach-omap2/board-igep0020.c | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c new file mode 100644 index 000000000000..fa62e80c13b7 --- /dev/null +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
| @@ -0,0 +1,251 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 Integration Software and Electronic Engineering. | ||
| 3 | * | ||
| 4 | * Modified from mach-omap2/board-generic.c | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/platform_device.h> | ||
| 14 | #include <linux/delay.h> | ||
| 15 | #include <linux/err.h> | ||
| 16 | #include <linux/clk.h> | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/gpio.h> | ||
| 19 | #include <linux/interrupt.h> | ||
| 20 | |||
| 21 | #include <linux/regulator/machine.h> | ||
| 22 | #include <linux/i2c/twl4030.h> | ||
| 23 | |||
| 24 | #include <asm/mach-types.h> | ||
| 25 | #include <asm/mach/arch.h> | ||
| 26 | |||
| 27 | #include <plat/board.h> | ||
| 28 | #include <plat/common.h> | ||
| 29 | #include <plat/gpmc.h> | ||
| 30 | #include <plat/mux.h> | ||
| 31 | #include <plat/usb.h> | ||
| 32 | |||
| 33 | #include "mmc-twl4030.h" | ||
| 34 | |||
| 35 | #define IGEP2_SMSC911X_CS 5 | ||
| 36 | #define IGEP2_SMSC911X_GPIO 176 | ||
| 37 | #define IGEP2_GPIO_USBH_NRESET 24 | ||
| 38 | #define IGEP2_GPIO_LED0_RED 26 | ||
| 39 | #define IGEP2_GPIO_LED0_GREEN 27 | ||
| 40 | #define IGEP2_GPIO_LED1_RED 28 | ||
| 41 | |||
| 42 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | ||
| 43 | |||
| 44 | #include <linux/smsc911x.h> | ||
| 45 | |||
| 46 | static struct smsc911x_platform_config igep2_smsc911x_config = { | ||
| 47 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
| 48 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
| 49 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS , | ||
| 50 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
| 51 | }; | ||
| 52 | |||
| 53 | static struct resource igep2_smsc911x_resources[] = { | ||
| 54 | { | ||
| 55 | .flags = IORESOURCE_MEM, | ||
| 56 | }, | ||
| 57 | { | ||
| 58 | .start = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO), | ||
| 59 | .end = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO), | ||
| 60 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | ||
| 61 | }, | ||
| 62 | }; | ||
| 63 | |||
| 64 | static struct platform_device igep2_smsc911x_device = { | ||
| 65 | .name = "smsc911x", | ||
| 66 | .id = 0, | ||
| 67 | .num_resources = ARRAY_SIZE(igep2_smsc911x_resources), | ||
| 68 | .resource = igep2_smsc911x_resources, | ||
| 69 | .dev = { | ||
| 70 | .platform_data = &igep2_smsc911x_config, | ||
| 71 | }, | ||
| 72 | }; | ||
| 73 | |||
| 74 | static inline void __init igep2_init_smsc911x(void) | ||
| 75 | { | ||
| 76 | unsigned long cs_mem_base; | ||
| 77 | |||
| 78 | if (gpmc_cs_request(IGEP2_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) { | ||
| 79 | pr_err("IGEP v2: Failed request for GPMC mem for smsc911x\n"); | ||
| 80 | gpmc_cs_free(IGEP2_SMSC911X_CS); | ||
| 81 | return; | ||
| 82 | } | ||
| 83 | |||
| 84 | igep2_smsc911x_resources[0].start = cs_mem_base + 0x0; | ||
| 85 | igep2_smsc911x_resources[0].end = cs_mem_base + 0xff; | ||
| 86 | |||
| 87 | if ((gpio_request(IGEP2_SMSC911X_GPIO, "SMSC911X IRQ") == 0) && | ||
| 88 | (gpio_direction_input(IGEP2_SMSC911X_GPIO) == 0)) { | ||
| 89 | gpio_export(IGEP2_SMSC911X_GPIO, 0); | ||
| 90 | } else { | ||
| 91 | pr_err("IGEP v2: Could not obtain gpio for for SMSC911X IRQ\n"); | ||
| 92 | return; | ||
| 93 | } | ||
| 94 | |||
| 95 | platform_device_register(&igep2_smsc911x_device); | ||
| 96 | } | ||
| 97 | |||
| 98 | #else | ||
| 99 | static inline void __init igep2_init_smsc911x(void) { } | ||
| 100 | #endif | ||
| 101 | |||
| 102 | static struct omap_board_config_kernel igep2_config[] __initdata = { | ||
| 103 | }; | ||
| 104 | |||
| 105 | static struct regulator_consumer_supply igep2_vmmc1_supply = { | ||
| 106 | .supply = "vmmc", | ||
| 107 | }; | ||
| 108 | |||
| 109 | /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ | ||
| 110 | static struct regulator_init_data igep2_vmmc1 = { | ||
| 111 | .constraints = { | ||
| 112 | .min_uV = 1850000, | ||
| 113 | .max_uV = 3150000, | ||
| 114 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
| 115 | | REGULATOR_MODE_STANDBY, | ||
| 116 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | ||
| 117 | | REGULATOR_CHANGE_MODE | ||
| 118 | | REGULATOR_CHANGE_STATUS, | ||
| 119 | }, | ||
| 120 | .num_consumer_supplies = 1, | ||
| 121 | .consumer_supplies = &igep2_vmmc1_supply, | ||
| 122 | }; | ||
| 123 | |||
| 124 | static struct twl4030_hsmmc_info mmc[] = { | ||
| 125 | { | ||
| 126 | .mmc = 1, | ||
| 127 | .wires = 4, | ||
| 128 | .gpio_cd = -EINVAL, | ||
| 129 | .gpio_wp = -EINVAL, | ||
| 130 | }, | ||
| 131 | { | ||
| 132 | .mmc = 2, | ||
| 133 | .wires = 4, | ||
| 134 | .gpio_cd = -EINVAL, | ||
| 135 | .gpio_wp = -EINVAL, | ||
| 136 | }, | ||
| 137 | {} /* Terminator */ | ||
| 138 | }; | ||
| 139 | |||
| 140 | static int igep2_twl_gpio_setup(struct device *dev, | ||
| 141 | unsigned gpio, unsigned ngpio) | ||
| 142 | { | ||
| 143 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | ||
| 144 | mmc[0].gpio_cd = gpio + 0; | ||
| 145 | twl4030_mmc_init(mmc); | ||
| 146 | |||
| 147 | /* link regulators to MMC adapters ... we "know" the | ||
| 148 | * regulators will be set up only *after* we return. | ||
| 149 | */ | ||
| 150 | igep2_vmmc1_supply.dev = mmc[0].dev; | ||
| 151 | |||
| 152 | return 0; | ||
| 153 | }; | ||
| 154 | |||
| 155 | static struct twl4030_gpio_platform_data igep2_gpio_data = { | ||
| 156 | .gpio_base = OMAP_MAX_GPIO_LINES, | ||
| 157 | .irq_base = TWL4030_GPIO_IRQ_BASE, | ||
| 158 | .irq_end = TWL4030_GPIO_IRQ_END, | ||
| 159 | .use_leds = false, | ||
| 160 | .setup = igep2_twl_gpio_setup, | ||
| 161 | }; | ||
| 162 | |||
| 163 | static struct twl4030_usb_data igep2_usb_data = { | ||
| 164 | .usb_mode = T2_USB_MODE_ULPI, | ||
| 165 | }; | ||
| 166 | |||
| 167 | static void __init igep2_init_irq(void) | ||
| 168 | { | ||
| 169 | omap_board_config = igep2_config; | ||
| 170 | omap_board_config_size = ARRAY_SIZE(igep2_config); | ||
| 171 | omap2_init_common_hw(NULL, NULL); | ||
| 172 | omap_init_irq(); | ||
| 173 | omap_gpio_init(); | ||
| 174 | } | ||
| 175 | |||
| 176 | static struct twl4030_platform_data igep2_twldata = { | ||
| 177 | .irq_base = TWL4030_IRQ_BASE, | ||
| 178 | .irq_end = TWL4030_IRQ_END, | ||
| 179 | |||
| 180 | /* platform_data for children goes here */ | ||
| 181 | .usb = &igep2_usb_data, | ||
| 182 | .gpio = &igep2_gpio_data, | ||
| 183 | .vmmc1 = &igep2_vmmc1, | ||
| 184 | |||
| 185 | }; | ||
| 186 | |||
| 187 | static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = { | ||
| 188 | { | ||
| 189 | I2C_BOARD_INFO("twl4030", 0x48), | ||
| 190 | .flags = I2C_CLIENT_WAKE, | ||
| 191 | .irq = INT_34XX_SYS_NIRQ, | ||
| 192 | .platform_data = &igep2_twldata, | ||
| 193 | }, | ||
| 194 | }; | ||
| 195 | |||
| 196 | static int __init igep2_i2c_init(void) | ||
| 197 | { | ||
| 198 | omap_register_i2c_bus(1, 2600, igep2_i2c_boardinfo, | ||
| 199 | ARRAY_SIZE(igep2_i2c_boardinfo)); | ||
| 200 | /* Bus 3 is attached to the DVI port where devices like the pico DLP | ||
| 201 | * projector don't work reliably with 400kHz */ | ||
| 202 | omap_register_i2c_bus(3, 100, NULL, 0); | ||
| 203 | return 0; | ||
| 204 | } | ||
| 205 | |||
| 206 | static void __init igep2_init(void) | ||
| 207 | { | ||
| 208 | igep2_i2c_init(); | ||
| 209 | omap_serial_init(); | ||
| 210 | usb_musb_init(); | ||
| 211 | |||
| 212 | igep2_init_smsc911x(); | ||
| 213 | |||
| 214 | /* GPIO userspace leds */ | ||
| 215 | if ((gpio_request(IGEP2_GPIO_LED0_RED, "GPIO_LED0_RED") == 0) && | ||
| 216 | (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) { | ||
| 217 | gpio_export(IGEP2_GPIO_LED0_RED, 0); | ||
| 218 | gpio_set_value(IGEP2_GPIO_LED0_RED, 0); | ||
| 219 | } else | ||
| 220 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n"); | ||
| 221 | |||
| 222 | if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "GPIO_LED0_GREEN") == 0) && | ||
| 223 | (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) { | ||
| 224 | gpio_export(IGEP2_GPIO_LED0_GREEN, 0); | ||
| 225 | gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0); | ||
| 226 | } else | ||
| 227 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); | ||
| 228 | |||
| 229 | if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_LED1_RED") == 0) && | ||
| 230 | (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) { | ||
| 231 | gpio_export(IGEP2_GPIO_LED1_RED, 0); | ||
| 232 | gpio_set_value(IGEP2_GPIO_LED1_RED, 0); | ||
| 233 | } else | ||
| 234 | pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n"); | ||
| 235 | } | ||
| 236 | |||
| 237 | static void __init igep2_map_io(void) | ||
| 238 | { | ||
| 239 | omap2_set_globals_343x(); | ||
| 240 | omap2_map_common_io(); | ||
| 241 | } | ||
| 242 | |||
| 243 | MACHINE_START(IGEP0020, "IGEP v2 board") | ||
| 244 | .phys_io = 0x48000000, | ||
| 245 | .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc, | ||
| 246 | .boot_params = 0x80000100, | ||
| 247 | .map_io = igep2_map_io, | ||
| 248 | .init_irq = igep2_init_irq, | ||
| 249 | .init_machine = igep2_init, | ||
| 250 | .timer = &omap_timer, | ||
| 251 | MACHINE_END | ||
