1/* 2 * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved. 3 * 4 * Author: Fabio Estevam <fabio.estevam@freescale.com> 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 as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 */ 16 17/* 18 * This machine is known as: 19 * - i.MX27 3-Stack Development System 20 * - i.MX27 Platform Development Kit (i.MX27 PDK) 21 */ 22 23#include <linux/platform_device.h> 24#include <linux/gpio.h> 25#include <linux/irq.h> 26#include <linux/usb/otg.h> 27#include <linux/usb/ulpi.h> 28#include <linux/delay.h> 29#include <linux/mfd/mc13783.h> 30#include <linux/spi/spi.h> 31#include <linux/regulator/machine.h> 32#include <linux/spi/l4f00242t03.h> 33 34#include <media/soc_camera.h> 35 36#include <asm/mach-types.h> 37#include <asm/mach/arch.h> 38#include <asm/mach/time.h> 39 40#include "3ds_debugboard.h" 41#include "common.h" 42#include "devices-imx27.h" 43#include "ehci.h" 44#include "hardware.h" 45#include "iomux-mx27.h" 46#include "ulpi.h" 47 48#define SD1_EN_GPIO IMX_GPIO_NR(2, 25) 49#define OTG_PHY_RESET_GPIO IMX_GPIO_NR(2, 23) 50#define SPI2_SS0 IMX_GPIO_NR(4, 21) 51#define PMIC_INT IMX_GPIO_NR(3, 14) 52#define SPI1_SS0 IMX_GPIO_NR(4, 28) 53#define SD1_CD IMX_GPIO_NR(2, 26) 54#define LCD_RESET IMX_GPIO_NR(1, 3) 55#define LCD_ENABLE IMX_GPIO_NR(1, 31) 56#define CSI_PWRDWN IMX_GPIO_NR(4, 19) 57#define CSI_RESET IMX_GPIO_NR(3, 6) 58 59static const int mx27pdk_pins[] __initconst = { 60 /* UART1 */ 61 PE12_PF_UART1_TXD, 62 PE13_PF_UART1_RXD, 63 PE14_PF_UART1_CTS, 64 PE15_PF_UART1_RTS, 65 /* FEC */ 66 PD0_AIN_FEC_TXD0, 67 PD1_AIN_FEC_TXD1, 68 PD2_AIN_FEC_TXD2, 69 PD3_AIN_FEC_TXD3, 70 PD4_AOUT_FEC_RX_ER, 71 PD5_AOUT_FEC_RXD1, 72 PD6_AOUT_FEC_RXD2, 73 PD7_AOUT_FEC_RXD3, 74 PD8_AF_FEC_MDIO, 75 PD9_AIN_FEC_MDC, 76 PD10_AOUT_FEC_CRS, 77 PD11_AOUT_FEC_TX_CLK, 78 PD12_AOUT_FEC_RXD0, 79 PD13_AOUT_FEC_RX_DV, 80 PD14_AOUT_FEC_RX_CLK, 81 PD15_AOUT_FEC_COL, 82 PD16_AIN_FEC_TX_ER, 83 PF23_AIN_FEC_TX_EN, 84 /* SDHC1 */ 85 PE18_PF_SD1_D0, 86 PE19_PF_SD1_D1, 87 PE20_PF_SD1_D2, 88 PE21_PF_SD1_D3, 89 PE22_PF_SD1_CMD, 90 PE23_PF_SD1_CLK, 91 SD1_EN_GPIO | GPIO_GPIO | GPIO_OUT, 92 /* OTG */ 93 OTG_PHY_RESET_GPIO | GPIO_GPIO | GPIO_OUT, 94 PC7_PF_USBOTG_DATA5, 95 PC8_PF_USBOTG_DATA6, 96 PC9_PF_USBOTG_DATA0, 97 PC10_PF_USBOTG_DATA2, 98 PC11_PF_USBOTG_DATA1, 99 PC12_PF_USBOTG_DATA4, 100 PC13_PF_USBOTG_DATA3, 101 PE0_PF_USBOTG_NXT, 102 PE1_PF_USBOTG_STP, 103 PE2_PF_USBOTG_DIR, 104 PE24_PF_USBOTG_CLK, 105 PE25_PF_USBOTG_DATA7, 106 /* CSPI1 */ 107 PD31_PF_CSPI1_MOSI, 108 PD30_PF_CSPI1_MISO, 109 PD29_PF_CSPI1_SCLK, 110 PD25_PF_CSPI1_RDY, 111 SPI1_SS0 | GPIO_GPIO | GPIO_OUT, 112 /* CSPI2 */ 113 PD22_PF_CSPI2_SCLK, 114 PD23_PF_CSPI2_MISO, 115 PD24_PF_CSPI2_MOSI, 116 SPI2_SS0 | GPIO_GPIO | GPIO_OUT, 117 /* I2C1 */ 118 PD17_PF_I2C_DATA, 119 PD18_PF_I2C_CLK, 120 /* PMIC INT */ 121 PMIC_INT | GPIO_GPIO | GPIO_IN, 122 /* LCD */ 123 PA5_PF_LSCLK, 124 PA6_PF_LD0, 125 PA7_PF_LD1, 126 PA8_PF_LD2, 127 PA9_PF_LD3, 128 PA10_PF_LD4, 129 PA11_PF_LD5, 130 PA12_PF_LD6, 131 PA13_PF_LD7, 132 PA14_PF_LD8, 133 PA15_PF_LD9, 134 PA16_PF_LD10, 135 PA17_PF_LD11, 136 PA18_PF_LD12, 137 PA19_PF_LD13, 138 PA20_PF_LD14, 139 PA21_PF_LD15, 140 PA22_PF_LD16, 141 PA23_PF_LD17, 142 PA28_PF_HSYNC, 143 PA29_PF_VSYNC, 144 PA30_PF_CONTRAST, 145 LCD_ENABLE | GPIO_GPIO | GPIO_OUT, 146 LCD_RESET | GPIO_GPIO | GPIO_OUT, 147 /* CSI */ 148 PB10_PF_CSI_D0, 149 PB11_PF_CSI_D1, 150 PB12_PF_CSI_D2, 151 PB13_PF_CSI_D3, 152 PB14_PF_CSI_D4, 153 PB15_PF_CSI_MCLK, 154 PB16_PF_CSI_PIXCLK, 155 PB17_PF_CSI_D5, 156 PB18_PF_CSI_D6, 157 PB19_PF_CSI_D7, 158 PB20_PF_CSI_VSYNC, 159 PB21_PF_CSI_HSYNC, 160 CSI_PWRDWN | GPIO_GPIO | GPIO_OUT, 161 CSI_RESET | GPIO_GPIO | GPIO_OUT, 162 /* SSI4 */ 163 PC16_PF_SSI4_FS, 164 PC17_PF_SSI4_RXD, 165 PC18_PF_SSI4_TXD, 166 PC19_PF_SSI4_CLK, 167}; 168 169static struct gpio mx27_3ds_camera_gpios[] = { 170 { CSI_PWRDWN, GPIOF_OUT_INIT_HIGH, "camera-power" }, 171 { CSI_RESET, GPIOF_OUT_INIT_HIGH, "camera-reset" }, 172}; 173 174static const struct imxuart_platform_data uart_pdata __initconst = { 175 .flags = IMXUART_HAVE_RTSCTS, 176}; 177 178/* 179 * Matrix keyboard 180 */ 181 182static const uint32_t mx27_3ds_keymap[] = { 183 KEY(0, 0, KEY_UP), 184 KEY(0, 1, KEY_DOWN), 185 KEY(1, 0, KEY_RIGHT), 186 KEY(1, 1, KEY_LEFT), 187 KEY(1, 2, KEY_ENTER), 188 KEY(2, 0, KEY_F6), 189 KEY(2, 1, KEY_F8), 190 KEY(2, 2, KEY_F9), 191 KEY(2, 3, KEY_F10), 192}; 193 194static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = { 195 .keymap = mx27_3ds_keymap, 196 .keymap_size = ARRAY_SIZE(mx27_3ds_keymap), 197}; 198 199static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq, 200 void *data) 201{ 202 return request_irq(gpio_to_irq(SD1_CD), detect_irq, 203 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "sdhc1-card-detect", data); 204} 205 206static void mx27_3ds_sdhc1_exit(struct device *dev, void *data) 207{ 208 free_irq(gpio_to_irq(SD1_CD), data); 209} 210 211static const struct imxmmc_platform_data sdhc1_pdata __initconst = { 212 .init = mx27_3ds_sdhc1_init, 213 .exit = mx27_3ds_sdhc1_exit, 214}; 215 216static void mx27_3ds_sdhc1_enable_level_translator(void) 217{ 218 /* Turn on TXB0108 OE pin */ 219 gpio_request(SD1_EN_GPIO, "sd1_enable"); 220 gpio_direction_output(SD1_EN_GPIO, 1); 221} 222 223 224static int otg_phy_init(void) 225{ 226 gpio_request(OTG_PHY_RESET_GPIO, "usb-otg-reset"); 227 gpio_direction_output(OTG_PHY_RESET_GPIO, 0); 228 mdelay(1); 229 gpio_set_value(OTG_PHY_RESET_GPIO, 1); 230 return 0; 231} 232 233static int mx27_3ds_otg_init(struct platform_device *pdev) 234{ 235 return mx27_initialize_usb_hw(pdev->id, MXC_EHCI_INTERFACE_DIFF_UNI); 236} 237 238static struct mxc_usbh_platform_data otg_pdata __initdata = { 239 .init = mx27_3ds_otg_init, 240 .portsc = MXC_EHCI_MODE_ULPI, 241}; 242 243static const struct fsl_usb2_platform_data otg_device_pdata __initconst = { 244 .operating_mode = FSL_USB2_DR_DEVICE, 245 .phy_mode = FSL_USB2_PHY_ULPI, 246}; 247 248static bool otg_mode_host __initdata; 249 250static int __init mx27_3ds_otg_mode(char *options) 251{ 252 if (!strcmp(options, "host")) 253 otg_mode_host = true; 254 else if (!strcmp(options, "device")) 255 otg_mode_host = false; 256 else 257 pr_info("otg_mode neither \"host\" nor \"device\". " 258 "Defaulting to device\n"); 259 return 1; 260} 261__setup("otg_mode=", mx27_3ds_otg_mode); 262 263/* Regulators */ 264static struct regulator_init_data gpo_init = { 265 .constraints = { 266 .boot_on = 1, 267 .always_on = 1, 268 } 269}; 270 271static struct regulator_consumer_supply vmmc1_consumers[] = { 272 REGULATOR_SUPPLY("vcore", "spi0.0"), 273 REGULATOR_SUPPLY("cmos_2v8", "soc-camera-pdrv.0"), 274}; 275 276static struct regulator_init_data vmmc1_init = { 277 .constraints = { 278 .min_uV = 2800000, 279 .max_uV = 2800000, 280 .apply_uV = 1, 281 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 282 REGULATOR_CHANGE_STATUS, 283 }, 284 .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers), 285 .consumer_supplies = vmmc1_consumers, 286}; 287 288static struct regulator_consumer_supply vgen_consumers[] = { 289 REGULATOR_SUPPLY("vdd", "spi0.0"), 290}; 291 292static struct regulator_init_data vgen_init = { 293 .constraints = { 294 .min_uV = 1800000, 295 .max_uV = 1800000, 296 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 297 }, 298 .num_consumer_supplies = ARRAY_SIZE(vgen_consumers), 299 .consumer_supplies = vgen_consumers, 300}; 301 302static struct regulator_consumer_supply vvib_consumers[] = { 303 REGULATOR_SUPPLY("cmos_vcore", "soc-camera-pdrv.0"), 304}; 305 306static struct regulator_init_data vvib_init = { 307 .constraints = { 308 .min_uV = 1300000, 309 .max_uV = 1300000, 310 .apply_uV = 1, 311 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 312 REGULATOR_CHANGE_STATUS, 313 }, 314 .num_consumer_supplies = ARRAY_SIZE(vvib_consumers), 315 .consumer_supplies = vvib_consumers, 316}; 317 318static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = { 319 { 320 .id = MC13783_REG_VMMC1, 321 .init_data = &vmmc1_init, 322 }, { 323 .id = MC13783_REG_VGEN, 324 .init_data = &vgen_init, 325 }, { 326 .id = MC13783_REG_GPO1, /* Turn on 1.8V */ 327 .init_data = &gpo_init, 328 }, { 329 .id = MC13783_REG_GPO3, /* Turn on 3.3V */ 330 .init_data = &gpo_init, 331 }, { 332 .id = MC13783_REG_VVIB, /* Power OV2640 */ 333 .init_data = &vvib_init, 334 }, 335}; 336 337/* MC13783 */ 338static struct mc13xxx_codec_platform_data mx27_3ds_codec = { 339 .dac_ssi_port = MC13783_SSI1_PORT, 340 .adc_ssi_port = MC13783_SSI1_PORT, 341}; 342 343static struct mc13xxx_platform_data mc13783_pdata = { 344 .regulators = { 345 .regulators = mx27_3ds_regulators, 346 .num_regulators = ARRAY_SIZE(mx27_3ds_regulators), 347 348 }, 349 .flags = MC13XXX_USE_TOUCHSCREEN | MC13XXX_USE_RTC | 350 MC13XXX_USE_CODEC, 351 .codec = &mx27_3ds_codec, 352}; 353 354static struct imx_ssi_platform_data mx27_3ds_ssi_pdata = { 355 .flags = IMX_SSI_DMA | IMX_SSI_NET, 356}; 357 358/* SPI */ 359static int spi1_chipselect[] = {SPI1_SS0}; 360 361static const struct spi_imx_master spi1_pdata __initconst = { 362 .chipselect = spi1_chipselect, 363 .num_chipselect = ARRAY_SIZE(spi1_chipselect), 364}; 365 366static int spi2_chipselect[] = {SPI2_SS0}; 367 368static const struct spi_imx_master spi2_pdata __initconst = { 369 .chipselect = spi2_chipselect, 370 .num_chipselect = ARRAY_SIZE(spi2_chipselect), 371}; 372 373static int mx27_3ds_camera_power(struct device *dev, int on) 374{ 375 /* enable or disable the camera */ 376 pr_debug("%s: %s the camera\n", __func__, on ? "ENABLE" : "DISABLE"); 377 gpio_set_value(CSI_PWRDWN, on ? 0 : 1); 378 379 if (!on) 380 goto out; 381 382 /* If enabled, give a reset impulse */ 383 gpio_set_value(CSI_RESET, 0); 384 msleep(20); 385 gpio_set_value(CSI_RESET, 1); 386 msleep(100); 387 388out: 389 return 0; 390} 391 392static struct i2c_board_info mx27_3ds_i2c_camera = { 393 I2C_BOARD_INFO("ov2640", 0x30), 394}; 395 396static struct regulator_bulk_data mx27_3ds_camera_regs[] = { 397 { .supply = "cmos_vcore" }, 398 { .supply = "cmos_2v8" }, 399}; 400 401static struct soc_camera_link iclink_ov2640 = { 402 .bus_id = 0, 403 .board_info = &mx27_3ds_i2c_camera, 404 .i2c_adapter_id = 0, 405 .power = mx27_3ds_camera_power, 406 .regulators = mx27_3ds_camera_regs, 407 .num_regulators = ARRAY_SIZE(mx27_3ds_camera_regs), 408}; 409 410static struct platform_device mx27_3ds_ov2640 = { 411 .name = "soc-camera-pdrv", 412 .id = 0, 413 .dev = { 414 .platform_data = &iclink_ov2640, 415 }, 416}; 417 418static struct imx_fb_videomode mx27_3ds_modes[] = { 419 { /* 480x640 @ 60 Hz */ 420 .mode = { 421 .name = "Epson-VGA", 422 .refresh = 60, 423 .xres = 480, 424 .yres = 640, 425 .pixclock = 41701, 426 .left_margin = 20, 427 .right_margin = 41, 428 .upper_margin = 10, 429 .lower_margin = 5, 430 .hsync_len = 20, 431 .vsync_len = 10, 432 .sync = FB_SYNC_OE_ACT_HIGH | 433 FB_SYNC_CLK_INVERT, 434 .vmode = FB_VMODE_NONINTERLACED, 435 .flag = 0, 436 }, 437 .bpp = 16, 438 .pcr = 0xFAC08B82, 439 }, 440}; 441 442static const struct imx_fb_platform_data mx27_3ds_fb_data __initconst = { 443 .mode = mx27_3ds_modes, 444 .num_modes = ARRAY_SIZE(mx27_3ds_modes), 445 .pwmr = 0x00A903FF, 446 .lscr1 = 0x00120300, 447 .dmacr = 0x00020010, 448}; 449 450/* LCD */ 451static struct l4f00242t03_pdata mx27_3ds_lcd_pdata = { 452 .reset_gpio = LCD_RESET, 453 .data_enable_gpio = LCD_ENABLE, 454}; 455 456static struct spi_board_info mx27_3ds_spi_devs[] __initdata = { 457 { 458 .modalias = "mc13783", 459 .max_speed_hz = 1000000, 460 .bus_num = 1, 461 .chip_select = 0, /* SS0 */ 462 .platform_data = &mc13783_pdata, 463 /* irq number is run-time assigned */ 464 .mode = SPI_CS_HIGH, 465 }, { 466 .modalias = "l4f00242t03", 467 .max_speed_hz = 5000000, 468 .bus_num = 0, 469 .chip_select = 0, /* SS0 */ 470 .platform_data = &mx27_3ds_lcd_pdata, 471 }, 472}; 473 474static struct platform_device *devices[] __initdata = { 475 &mx27_3ds_ov2640, 476}; 477 478static const struct mx2_camera_platform_data mx27_3ds_cam_pdata __initconst = { 479 .clk = 26000000, 480}; 481 482static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = { 483 .bitrate = 100000, 484}; 485 486static void __init mx27pdk_init(void) 487{ 488 int ret; 489 imx27_soc_init(); 490 491 mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins), 492 "mx27pdk"); 493 mx27_3ds_sdhc1_enable_level_translator(); 494 imx27_add_imx_uart0(&uart_pdata); 495 imx27_add_fec(NULL); 496 imx27_add_imx_keypad(&mx27_3ds_keymap_data); 497 imx27_add_mxc_mmc(0, &sdhc1_pdata); 498 imx27_add_imx2_wdt(); 499 otg_phy_init(); 500 501 if (otg_mode_host) { 502 otg_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS | 503 ULPI_OTG_DRVVBUS_EXT); 504 505 if (otg_pdata.otg) 506 imx27_add_mxc_ehci_otg(&otg_pdata); 507 } 508 509 if (!otg_mode_host) 510 imx27_add_fsl_usb2_udc(&otg_device_pdata); 511 512 imx27_add_spi_imx1(&spi2_pdata); 513 imx27_add_spi_imx0(&spi1_pdata); 514 mx27_3ds_spi_devs[0].irq = gpio_to_irq(PMIC_INT); 515 spi_register_board_info(mx27_3ds_spi_devs, 516 ARRAY_SIZE(mx27_3ds_spi_devs)); 517 518 if (mxc_expio_init(MX27_CS5_BASE_ADDR, IMX_GPIO_NR(3, 28))) 519 pr_warn("Init of the debugboard failed, all devices on the debugboard are unusable.\n"); 520 imx27_add_imx_i2c(0, &mx27_3ds_i2c0_data); 521 platform_add_devices(devices, ARRAY_SIZE(devices)); 522 imx27_add_imx_fb(&mx27_3ds_fb_data); 523 524 ret = gpio_request_array(mx27_3ds_camera_gpios, 525 ARRAY_SIZE(mx27_3ds_camera_gpios)); 526 if (ret) { 527 pr_err("Failed to request camera gpios"); 528 iclink_ov2640.power = NULL; 529 } 530 531 imx27_add_mx2_camera(&mx27_3ds_cam_pdata); 532 imx27_add_imx_ssi(0, &mx27_3ds_ssi_pdata); 533 534 imx_add_platform_device("imx_mc13783", 0, NULL, 0, NULL, 0); 535} 536 537static void __init mx27pdk_timer_init(void) 538{ 539 mx27_clocks_init(26000000); 540} 541 542MACHINE_START(MX27_3DS, "Freescale MX27PDK") 543 /* maintainer: Freescale Semiconductor, Inc. */ 544 .atag_offset = 0x100, 545 .map_io = mx27_map_io, 546 .init_early = imx27_init_early, 547 .init_irq = mx27_init_irq, 548 .init_time = mx27pdk_timer_init, 549 .init_machine = mx27pdk_init, 550 .restart = mxc_restart, 551MACHINE_END 552