1/* 2 * linux/arch/arm/mach-omap2/board-am3517evm.c 3 * 4 * Copyright (C) 2009 Texas Instruments Incorporated 5 * Author: Ranjith Lohithakshan <ranjithl@ti.com> 6 * 7 * Based on mach-omap2/board-omap3evm.c 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the 11 * Free Software Foundation version 2. 12 * 13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 14 * whether express or implied; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 */ 18 19#include <linux/kernel.h> 20#include <linux/init.h> 21#include <linux/clk.h> 22#include <linux/platform_device.h> 23#include <linux/gpio.h> 24#include <linux/i2c/pca953x.h> 25#include <linux/can/platform/ti_hecc.h> 26#include <linux/davinci_emac.h> 27#include <linux/mmc/host.h> 28 29#include <mach/hardware.h> 30#include <mach/am35xx.h> 31#include <asm/mach-types.h> 32#include <asm/mach/arch.h> 33#include <asm/mach/map.h> 34 35#include <plat/board.h> 36#include "common.h" 37#include <plat/usb.h> 38#include <video/omapdss.h> 39#include <video/omap-panel-generic-dpi.h> 40#include <video/omap-panel-dvi.h> 41 42#include "am35xx-emac.h" 43#include "mux.h" 44#include "control.h" 45#include "hsmmc.h" 46 47#define LCD_PANEL_PWR 176 48#define LCD_PANEL_BKLIGHT_PWR 182 49#define LCD_PANEL_PWM 181 50 51static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = { 52 { 53 I2C_BOARD_INFO("s35390a", 0x30), 54 }, 55}; 56 57/* 58 * RTC - S35390A 59 */ 60#define GPIO_RTCS35390A_IRQ 55 61 62static void __init am3517_evm_rtc_init(void) 63{ 64 int r; 65 66 omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP); 67 68 r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq"); 69 if (r < 0) { 70 printk(KERN_WARNING "failed to request GPIO#%d\n", 71 GPIO_RTCS35390A_IRQ); 72 return; 73 } 74 75 am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ); 76} 77 78/* 79 * I2C GPIO Expander - TCA6416 80 */ 81 82/* Mounted on Base-Board */ 83static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = { 84 .gpio_base = OMAP_MAX_GPIO_LINES, 85}; 86static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = { 87 { 88 I2C_BOARD_INFO("tlv320aic23", 0x1A), 89 }, 90 { 91 I2C_BOARD_INFO("tca6416", 0x21), 92 .platform_data = &am3517evm_gpio_expander_info_0, 93 }, 94}; 95 96/* Mounted on UI Card */ 97static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = { 98 .gpio_base = OMAP_MAX_GPIO_LINES + 16, 99}; 100static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = { 101 .gpio_base = OMAP_MAX_GPIO_LINES + 32, 102}; 103static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo[] = { 104 { 105 I2C_BOARD_INFO("tca6416", 0x20), 106 .platform_data = &am3517evm_ui_gpio_expander_info_1, 107 }, 108 { 109 I2C_BOARD_INFO("tca6416", 0x21), 110 .platform_data = &am3517evm_ui_gpio_expander_info_2, 111 }, 112}; 113 114static int __init am3517_evm_i2c_init(void) 115{ 116 omap_register_i2c_bus(1, 400, NULL, 0); 117 omap_register_i2c_bus(2, 400, am3517evm_i2c2_boardinfo, 118 ARRAY_SIZE(am3517evm_i2c2_boardinfo)); 119 omap_register_i2c_bus(3, 400, am3517evm_i2c3_boardinfo, 120 ARRAY_SIZE(am3517evm_i2c3_boardinfo)); 121 122 return 0; 123} 124 125static int lcd_enabled; 126static int dvi_enabled; 127 128#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ 129 defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) 130static struct gpio am3517_evm_dss_gpios[] __initdata = { 131 /* GPIO 182 = LCD Backlight Power */ 132 { LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" }, 133 /* GPIO 181 = LCD Panel PWM */ 134 { LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, 135 /* GPIO 176 = LCD Panel Power enable pin */ 136 { LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" }, 137}; 138 139static void __init am3517_evm_display_init(void) 140{ 141 int r; 142 143 omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP); 144 omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN); 145 omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN); 146 147 r = gpio_request_array(am3517_evm_dss_gpios, 148 ARRAY_SIZE(am3517_evm_dss_gpios)); 149 if (r) { 150 printk(KERN_ERR "failed to get DSS panel control GPIOs\n"); 151 return; 152 } 153 154 printk(KERN_INFO "Display initialized successfully\n"); 155} 156#else 157static void __init am3517_evm_display_init(void) {} 158#endif 159 160static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev) 161{ 162 if (dvi_enabled) { 163 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); 164 return -EINVAL; 165 } 166 gpio_set_value(LCD_PANEL_PWR, 1); 167 lcd_enabled = 1; 168 169 return 0; 170} 171 172static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev) 173{ 174 gpio_set_value(LCD_PANEL_PWR, 0); 175 lcd_enabled = 0; 176} 177 178static struct panel_generic_dpi_data lcd_panel = { 179 .name = "sharp_lq", 180 .platform_enable = am3517_evm_panel_enable_lcd, 181 .platform_disable = am3517_evm_panel_disable_lcd, 182}; 183 184static struct omap_dss_device am3517_evm_lcd_device = { 185 .type = OMAP_DISPLAY_TYPE_DPI, 186 .name = "lcd", 187 .driver_name = "generic_dpi_panel", 188 .data = &lcd_panel, 189 .phy.dpi.data_lines = 16, 190}; 191 192static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev) 193{ 194 return 0; 195} 196 197static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev) 198{ 199} 200 201static struct omap_dss_device am3517_evm_tv_device = { 202 .type = OMAP_DISPLAY_TYPE_VENC, 203 .name = "tv", 204 .driver_name = "venc", 205 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, 206 .platform_enable = am3517_evm_panel_enable_tv, 207 .platform_disable = am3517_evm_panel_disable_tv, 208}; 209 210static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev) 211{ 212 if (lcd_enabled) { 213 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n"); 214 return -EINVAL; 215 } 216 dvi_enabled = 1; 217 218 return 0; 219} 220 221static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev) 222{ 223 dvi_enabled = 0; 224} 225 226static struct panel_dvi_platform_data dvi_panel = { 227 .platform_enable = am3517_evm_panel_enable_dvi, 228 .platform_disable = am3517_evm_panel_disable_dvi, 229}; 230 231static struct omap_dss_device am3517_evm_dvi_device = { 232 .type = OMAP_DISPLAY_TYPE_DPI, 233 .name = "dvi", 234 .driver_name = "dvi", 235 .data = &dvi_panel, 236 .phy.dpi.data_lines = 24, 237}; 238 239static struct omap_dss_device *am3517_evm_dss_devices[] = { 240 &am3517_evm_lcd_device, 241 &am3517_evm_tv_device, 242 &am3517_evm_dvi_device, 243}; 244 245static struct omap_dss_board_info am3517_evm_dss_data = { 246 .num_devices = ARRAY_SIZE(am3517_evm_dss_devices), 247 .devices = am3517_evm_dss_devices, 248 .default_device = &am3517_evm_lcd_device, 249}; 250 251/* 252 * Board initialization 253 */ 254 255static struct omap_musb_board_data musb_board_data = { 256 .interface_type = MUSB_INTERFACE_ULPI, 257 .mode = MUSB_OTG, 258 .power = 500, 259 .set_phy_power = am35x_musb_phy_power, 260 .clear_irq = am35x_musb_clear_irq, 261 .set_mode = am35x_set_mode, 262 .reset = am35x_musb_reset, 263}; 264 265static __init void am3517_evm_musb_init(void) 266{ 267 u32 devconf2; 268 269 /* 270 * Set up USB clock/mode in the DEVCONF2 register. 271 */ 272 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); 273 274 /* USB2.0 PHY reference clock is 13 MHz */ 275 devconf2 &= ~(CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE); 276 devconf2 |= CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN 277 | CONF2_DATPOL; 278 279 omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); 280 281 usb_musb_init(&musb_board_data); 282} 283 284static const struct usbhs_omap_board_data usbhs_bdata __initconst = { 285 .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, 286#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ 287 defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) 288 .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, 289#else 290 .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 291#endif 292 .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, 293 294 .phy_reset = true, 295 .reset_gpio_port[0] = 57, 296 .reset_gpio_port[1] = -EINVAL, 297 .reset_gpio_port[2] = -EINVAL 298}; 299 300#ifdef CONFIG_OMAP_MUX 301static struct omap_board_mux board_mux[] __initdata = { 302 /* USB OTG DRVVBUS offset = 0x212 */ 303 OMAP3_MUX(SAD2D_MCAD23, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN), 304 { .reg_offset = OMAP_MUX_TERMINATOR }, 305}; 306#endif 307 308 309static struct resource am3517_hecc_resources[] = { 310 { 311 .start = AM35XX_IPSS_HECC_BASE, 312 .end = AM35XX_IPSS_HECC_BASE + 0x3FFF, 313 .flags = IORESOURCE_MEM, 314 }, 315 { 316 .start = INT_35XX_HECC0_IRQ, 317 .end = INT_35XX_HECC0_IRQ, 318 .flags = IORESOURCE_IRQ, 319 }, 320}; 321 322static struct platform_device am3517_hecc_device = { 323 .name = "ti_hecc", 324 .id = -1, 325 .num_resources = ARRAY_SIZE(am3517_hecc_resources), 326 .resource = am3517_hecc_resources, 327}; 328 329static struct ti_hecc_platform_data am3517_evm_hecc_pdata = { 330 .scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET, 331 .scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET, 332 .hecc_ram_offset = AM35XX_HECC_RAM_OFFSET, 333 .mbx_offset = AM35XX_HECC_MBOX_OFFSET, 334 .int_line = AM35XX_HECC_INT_LINE, 335 .version = AM35XX_HECC_VERSION, 336}; 337 338static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata) 339{ 340 am3517_hecc_device.dev.platform_data = pdata; 341 platform_device_register(&am3517_hecc_device); 342} 343 344static struct omap_board_config_kernel am3517_evm_config[] __initdata = { 345}; 346 347static struct omap2_hsmmc_info mmc[] = { 348 { 349 .mmc = 1, 350 .caps = MMC_CAP_4_BIT_DATA, 351 .gpio_cd = 127, 352 .gpio_wp = 126, 353 }, 354 { 355 .mmc = 2, 356 .caps = MMC_CAP_4_BIT_DATA, 357 .gpio_cd = 128, 358 .gpio_wp = 129, 359 }, 360 {} /* Terminator */ 361}; 362 363 364static void __init am3517_evm_init(void) 365{ 366 omap_board_config = am3517_evm_config; 367 omap_board_config_size = ARRAY_SIZE(am3517_evm_config); 368 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 369 370 am3517_evm_i2c_init(); 371 omap_display_init(&am3517_evm_dss_data); 372 omap_serial_init(); 373 omap_sdrc_init(NULL, NULL); 374 375 /* Configure GPIO for EHCI port */ 376 omap_mux_init_gpio(57, OMAP_PIN_OUTPUT); 377 usbhs_init(&usbhs_bdata); 378 am3517_evm_hecc_init(&am3517_evm_hecc_pdata); 379 /* DSS */ 380 am3517_evm_display_init(); 381 382 /* RTC - S35390A */ 383 am3517_evm_rtc_init(); 384 385 i2c_register_board_info(1, am3517evm_i2c1_boardinfo, 386 ARRAY_SIZE(am3517evm_i2c1_boardinfo)); 387 /*Ethernet*/ 388 am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1); 389 390 /* MUSB */ 391 am3517_evm_musb_init(); 392 393 /* MMC init function */ 394 omap_hsmmc_init(mmc); 395} 396 397MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") 398 .atag_offset = 0x100, 399 .reserve = omap_reserve, 400 .map_io = omap3_map_io, 401 .init_early = am35xx_init_early, 402 .init_irq = omap3_init_irq, 403 .handle_irq = omap3_intc_handle_irq, 404 .init_machine = am3517_evm_init, 405 .timer = &omap3_timer, 406 .restart = omap_prcm_restart, 407MACHINE_END 408