1/* 2 * linux/arch/arm/mach-omap2/board-2430sdp.c 3 * 4 * Copyright (C) 2006 Texas Instruments 5 * 6 * Modified from mach-omap2/board-generic.c 7 * 8 * Initial Code : Based on a patch from Komal Shah and Richard Woodruff 9 * Updated the Code for 2430 SDP : Syed Mohammed Khasim 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16#include <linux/kernel.h> 17#include <linux/init.h> 18#include <linux/platform_device.h> 19#include <linux/mtd/mtd.h> 20#include <linux/mtd/partitions.h> 21#include <linux/mtd/physmap.h> 22#include <linux/mmc/host.h> 23#include <linux/delay.h> 24#include <linux/i2c/twl.h> 25#include <linux/regulator/machine.h> 26#include <linux/err.h> 27#include <linux/clk.h> 28#include <linux/io.h> 29#include <linux/gpio.h> 30 31#include <mach/hardware.h> 32#include <asm/mach-types.h> 33#include <asm/mach/arch.h> 34#include <asm/mach/map.h> 35 36#include <plat/board.h> 37#include "common.h" 38#include <plat/gpmc.h> 39#include <plat/usb.h> 40#include <plat/gpmc-smc91x.h> 41 42#include <video/omapdss.h> 43#include <video/omap-panel-generic-dpi.h> 44 45#include "mux.h" 46#include "hsmmc.h" 47#include "common-board-devices.h" 48 49#define SDP2430_CS0_BASE 0x04000000 50#define SECONDARY_LCD_GPIO 147 51 52static struct mtd_partition sdp2430_partitions[] = { 53 /* bootloader (U-Boot, etc) in first sector */ 54 { 55 .name = "bootloader", 56 .offset = 0, 57 .size = SZ_256K, 58 .mask_flags = MTD_WRITEABLE, /* force read-only */ 59 }, 60 /* bootloader params in the next sector */ 61 { 62 .name = "params", 63 .offset = MTDPART_OFS_APPEND, 64 .size = SZ_128K, 65 .mask_flags = 0, 66 }, 67 /* kernel */ 68 { 69 .name = "kernel", 70 .offset = MTDPART_OFS_APPEND, 71 .size = SZ_2M, 72 .mask_flags = 0 73 }, 74 /* file system */ 75 { 76 .name = "filesystem", 77 .offset = MTDPART_OFS_APPEND, 78 .size = MTDPART_SIZ_FULL, 79 .mask_flags = 0 80 } 81}; 82 83static struct physmap_flash_data sdp2430_flash_data = { 84 .width = 2, 85 .parts = sdp2430_partitions, 86 .nr_parts = ARRAY_SIZE(sdp2430_partitions), 87}; 88 89static struct resource sdp2430_flash_resource = { 90 .start = SDP2430_CS0_BASE, 91 .end = SDP2430_CS0_BASE + SZ_64M - 1, 92 .flags = IORESOURCE_MEM, 93}; 94 95static struct platform_device sdp2430_flash_device = { 96 .name = "physmap-flash", 97 .id = 0, 98 .dev = { 99 .platform_data = &sdp2430_flash_data, 100 }, 101 .num_resources = 1, 102 .resource = &sdp2430_flash_resource, 103}; 104 105static struct platform_device *sdp2430_devices[] __initdata = { 106 &sdp2430_flash_device, 107}; 108 109/* LCD */ 110#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 111#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 112 113static int sdp2430_panel_enable_lcd(struct omap_dss_device *dssdev) 114{ 115 gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 1); 116 gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 1); 117 118 return 0; 119} 120 121static void sdp2430_panel_disable_lcd(struct omap_dss_device *dssdev) 122{ 123 gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 0); 124 gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 0); 125} 126 127static struct panel_generic_dpi_data sdp2430_panel_data = { 128 .name = "nec_nl2432dr22-11b", 129 .platform_enable = sdp2430_panel_enable_lcd, 130 .platform_disable = sdp2430_panel_disable_lcd, 131}; 132 133static struct omap_dss_device sdp2430_lcd_device = { 134 .name = "lcd", 135 .driver_name = "generic_dpi_panel", 136 .type = OMAP_DISPLAY_TYPE_DPI, 137 .phy.dpi.data_lines = 16, 138 .data = &sdp2430_panel_data, 139}; 140 141static struct omap_dss_device *sdp2430_dss_devices[] = { 142 &sdp2430_lcd_device, 143}; 144 145static struct omap_dss_board_info sdp2430_dss_data = { 146 .num_devices = ARRAY_SIZE(sdp2430_dss_devices), 147 .devices = sdp2430_dss_devices, 148 .default_device = &sdp2430_lcd_device, 149}; 150 151static void __init sdp2430_display_init(void) 152{ 153 int r; 154 155 static struct gpio gpios[] __initdata = { 156 { SDP2430_LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, 157 "LCD reset" }, 158 { SDP2430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW, 159 "LCD Backlight" }, 160 }; 161 162 r = gpio_request_array(gpios, ARRAY_SIZE(gpios)); 163 if (r) { 164 pr_err("Cannot request LCD GPIOs, error %d\n", r); 165 return; 166 } 167 168 omap_display_init(&sdp2430_dss_data); 169} 170 171#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91x_MODULE) 172 173static struct omap_smc91x_platform_data board_smc91x_data = { 174 .cs = 5, 175 .gpio_irq = 149, 176 .flags = GPMC_MUX_ADD_DATA | GPMC_TIMINGS_SMC91C96 | 177 IORESOURCE_IRQ_LOWLEVEL, 178 179}; 180 181static void __init board_smc91x_init(void) 182{ 183 omap_mux_init_gpio(149, OMAP_PIN_INPUT); 184 gpmc_smc91x_init(&board_smc91x_data); 185} 186 187#else 188 189static inline void board_smc91x_init(void) 190{ 191} 192 193#endif 194 195static struct regulator_consumer_supply sdp2430_vmmc1_supplies[] = { 196 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), 197}; 198 199/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ 200static struct regulator_init_data sdp2430_vmmc1 = { 201 .constraints = { 202 .min_uV = 1850000, 203 .max_uV = 3150000, 204 .valid_modes_mask = REGULATOR_MODE_NORMAL 205 | REGULATOR_MODE_STANDBY, 206 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE 207 | REGULATOR_CHANGE_MODE 208 | REGULATOR_CHANGE_STATUS, 209 }, 210 .num_consumer_supplies = ARRAY_SIZE(sdp2430_vmmc1_supplies), 211 .consumer_supplies = &sdp2430_vmmc1_supplies[0], 212}; 213 214static struct twl4030_gpio_platform_data sdp2430_gpio_data = { 215 .gpio_base = OMAP_MAX_GPIO_LINES, 216 .irq_base = TWL4030_GPIO_IRQ_BASE, 217 .irq_end = TWL4030_GPIO_IRQ_END, 218}; 219 220static struct twl4030_platform_data sdp2430_twldata = { 221 .irq_base = TWL4030_IRQ_BASE, 222 .irq_end = TWL4030_IRQ_END, 223 224 /* platform_data for children goes here */ 225 .gpio = &sdp2430_gpio_data, 226 .vmmc1 = &sdp2430_vmmc1, 227}; 228 229static struct i2c_board_info __initdata sdp2430_i2c1_boardinfo[] = { 230 { 231 I2C_BOARD_INFO("isp1301_omap", 0x2D), 232 .flags = I2C_CLIENT_WAKE, 233 }, 234}; 235 236static int __init omap2430_i2c_init(void) 237{ 238 sdp2430_i2c1_boardinfo[0].irq = gpio_to_irq(78); 239 omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, 240 ARRAY_SIZE(sdp2430_i2c1_boardinfo)); 241 omap_pmic_init(2, 100, "twl4030", INT_24XX_SYS_NIRQ, 242 &sdp2430_twldata); 243 return 0; 244} 245 246static struct omap2_hsmmc_info mmc[] __initdata = { 247 { 248 .mmc = 1, 249 .caps = MMC_CAP_4_BIT_DATA, 250 .gpio_cd = -EINVAL, 251 .gpio_wp = -EINVAL, 252 .ext_clock = 1, 253 }, 254 {} /* Terminator */ 255}; 256 257static struct omap_usb_config sdp2430_usb_config __initdata = { 258 .otg = 1, 259#ifdef CONFIG_USB_GADGET_OMAP 260 .hmc_mode = 0x0, 261#elif defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 262 .hmc_mode = 0x1, 263#endif 264 .pins[0] = 3, 265}; 266 267#ifdef CONFIG_OMAP_MUX 268static struct omap_board_mux board_mux[] __initdata = { 269 { .reg_offset = OMAP_MUX_TERMINATOR }, 270}; 271#endif 272 273static void __init omap_2430sdp_init(void) 274{ 275 omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC); 276 277 omap2430_i2c_init(); 278 279 platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices)); 280 omap_serial_init(); 281 omap_sdrc_init(NULL, NULL); 282 omap_hsmmc_init(mmc); 283 omap2_usbfs_init(&sdp2430_usb_config); 284 285 omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); 286 usb_musb_init(NULL); 287 288 board_smc91x_init(); 289 290 /* Turn off secondary LCD backlight */ 291 gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW, 292 "Secondary LCD backlight"); 293 294 sdp2430_display_init(); 295} 296 297MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") 298 /* Maintainer: Syed Khasim - Texas Instruments Inc */ 299 .atag_offset = 0x100, 300 .reserve = omap_reserve, 301 .map_io = omap243x_map_io, 302 .init_early = omap2430_init_early, 303 .init_irq = omap2_init_irq, 304 .handle_irq = omap2_intc_handle_irq, 305 .init_machine = omap_2430sdp_init, 306 .timer = &omap2_timer, 307 .restart = omap_prcm_restart, 308MACHINE_END 309