1/* 2 * Copyright (C) 2008 Valentin Longchamp, EPFL Mobots group 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 15#include <linux/delay.h> 16#include <linux/dma-mapping.h> 17#include <linux/gfp.h> 18#include <linux/gpio.h> 19#include <linux/init.h> 20#include <linux/interrupt.h> 21#include <linux/moduleparam.h> 22#include <linux/leds.h> 23#include <linux/memory.h> 24#include <linux/mtd/physmap.h> 25#include <linux/mtd/partitions.h> 26#include <linux/platform_device.h> 27#include <linux/regulator/machine.h> 28#include <linux/mfd/mc13783.h> 29#include <linux/spi/spi.h> 30#include <linux/types.h> 31#include <linux/memblock.h> 32#include <linux/clk.h> 33#include <linux/io.h> 34#include <linux/err.h> 35#include <linux/input.h> 36 37#include <linux/usb/otg.h> 38#include <linux/usb/ulpi.h> 39 40#include <asm/mach-types.h> 41#include <asm/mach/arch.h> 42#include <asm/mach/time.h> 43#include <asm/mach/map.h> 44#include <asm/memblock.h> 45#include <linux/platform_data/asoc-imx-ssi.h> 46 47#include "board-mx31moboard.h" 48#include "common.h" 49#include "devices-imx31.h" 50#include "ehci.h" 51#include "hardware.h" 52#include "iomux-mx3.h" 53#include "ulpi.h" 54 55static unsigned int moboard_pins[] = { 56 /* UART0 */ 57 MX31_PIN_TXD1__TXD1, MX31_PIN_RXD1__RXD1, 58 MX31_PIN_CTS1__GPIO2_7, 59 /* UART4 */ 60 MX31_PIN_PC_RST__CTS5, MX31_PIN_PC_VS2__RTS5, 61 MX31_PIN_PC_BVD2__TXD5, MX31_PIN_PC_BVD1__RXD5, 62 /* I2C0 */ 63 MX31_PIN_I2C_DAT__I2C1_SDA, MX31_PIN_I2C_CLK__I2C1_SCL, 64 /* I2C1 */ 65 MX31_PIN_DCD_DTE1__I2C2_SDA, MX31_PIN_RI_DTE1__I2C2_SCL, 66 /* SDHC1 */ 67 MX31_PIN_SD1_DATA3__SD1_DATA3, MX31_PIN_SD1_DATA2__SD1_DATA2, 68 MX31_PIN_SD1_DATA1__SD1_DATA1, MX31_PIN_SD1_DATA0__SD1_DATA0, 69 MX31_PIN_SD1_CLK__SD1_CLK, MX31_PIN_SD1_CMD__SD1_CMD, 70 MX31_PIN_ATA_CS0__GPIO3_26, MX31_PIN_ATA_CS1__GPIO3_27, 71 /* USB reset */ 72 MX31_PIN_GPIO1_0__GPIO1_0, 73 /* USB OTG */ 74 MX31_PIN_USBOTG_DATA0__USBOTG_DATA0, 75 MX31_PIN_USBOTG_DATA1__USBOTG_DATA1, 76 MX31_PIN_USBOTG_DATA2__USBOTG_DATA2, 77 MX31_PIN_USBOTG_DATA3__USBOTG_DATA3, 78 MX31_PIN_USBOTG_DATA4__USBOTG_DATA4, 79 MX31_PIN_USBOTG_DATA5__USBOTG_DATA5, 80 MX31_PIN_USBOTG_DATA6__USBOTG_DATA6, 81 MX31_PIN_USBOTG_DATA7__USBOTG_DATA7, 82 MX31_PIN_USBOTG_CLK__USBOTG_CLK, MX31_PIN_USBOTG_DIR__USBOTG_DIR, 83 MX31_PIN_USBOTG_NXT__USBOTG_NXT, MX31_PIN_USBOTG_STP__USBOTG_STP, 84 MX31_PIN_USB_OC__GPIO1_30, 85 /* USB H2 */ 86 MX31_PIN_USBH2_DATA0__USBH2_DATA0, 87 MX31_PIN_USBH2_DATA1__USBH2_DATA1, 88 MX31_PIN_STXD3__USBH2_DATA2, MX31_PIN_SRXD3__USBH2_DATA3, 89 MX31_PIN_SCK3__USBH2_DATA4, MX31_PIN_SFS3__USBH2_DATA5, 90 MX31_PIN_STXD6__USBH2_DATA6, MX31_PIN_SRXD6__USBH2_DATA7, 91 MX31_PIN_USBH2_CLK__USBH2_CLK, MX31_PIN_USBH2_DIR__USBH2_DIR, 92 MX31_PIN_USBH2_NXT__USBH2_NXT, MX31_PIN_USBH2_STP__USBH2_STP, 93 MX31_PIN_SCK6__GPIO1_25, 94 /* LEDs */ 95 MX31_PIN_SVEN0__GPIO2_0, MX31_PIN_STX0__GPIO2_1, 96 MX31_PIN_SRX0__GPIO2_2, MX31_PIN_SIMPD0__GPIO2_3, 97 /* SPI1 */ 98 MX31_PIN_CSPI2_MOSI__MOSI, MX31_PIN_CSPI2_MISO__MISO, 99 MX31_PIN_CSPI2_SCLK__SCLK, MX31_PIN_CSPI2_SPI_RDY__SPI_RDY, 100 MX31_PIN_CSPI2_SS0__SS0, MX31_PIN_CSPI2_SS2__SS2, 101 /* Atlas IRQ */ 102 MX31_PIN_GPIO1_3__GPIO1_3, 103 /* SPI2 */ 104 MX31_PIN_CSPI3_MOSI__MOSI, MX31_PIN_CSPI3_MISO__MISO, 105 MX31_PIN_CSPI3_SCLK__SCLK, MX31_PIN_CSPI3_SPI_RDY__SPI_RDY, 106 MX31_PIN_CSPI2_SS1__CSPI3_SS1, 107 /* SSI */ 108 MX31_PIN_STXD4__STXD4, MX31_PIN_SRXD4__SRXD4, 109 MX31_PIN_SCK4__SCK4, MX31_PIN_SFS4__SFS4, 110}; 111 112static struct physmap_flash_data mx31moboard_flash_data = { 113 .width = 2, 114}; 115 116static struct resource mx31moboard_flash_resource = { 117 .start = 0xa0000000, 118 .end = 0xa1ffffff, 119 .flags = IORESOURCE_MEM, 120}; 121 122static struct platform_device mx31moboard_flash = { 123 .name = "physmap-flash", 124 .id = 0, 125 .dev = { 126 .platform_data = &mx31moboard_flash_data, 127 }, 128 .resource = &mx31moboard_flash_resource, 129 .num_resources = 1, 130}; 131 132static void __init moboard_uart0_init(void) 133{ 134 if (!gpio_request(IOMUX_TO_GPIO(MX31_PIN_CTS1), "uart0-cts-hack")) { 135 gpio_direction_output(IOMUX_TO_GPIO(MX31_PIN_CTS1), 0); 136 gpio_free(IOMUX_TO_GPIO(MX31_PIN_CTS1)); 137 } 138} 139 140static const struct imxuart_platform_data uart0_pdata __initconst = { 141}; 142 143static const struct imxuart_platform_data uart4_pdata __initconst = { 144 .flags = IMXUART_HAVE_RTSCTS, 145}; 146 147static const struct imxi2c_platform_data moboard_i2c0_data __initconst = { 148 .bitrate = 400000, 149}; 150 151static const struct imxi2c_platform_data moboard_i2c1_data __initconst = { 152 .bitrate = 100000, 153}; 154 155static int moboard_spi1_cs[] = { 156 MXC_SPI_CS(0), 157 MXC_SPI_CS(2), 158}; 159 160static const struct spi_imx_master moboard_spi1_pdata __initconst = { 161 .chipselect = moboard_spi1_cs, 162 .num_chipselect = ARRAY_SIZE(moboard_spi1_cs), 163}; 164 165static struct regulator_consumer_supply sdhc_consumers[] = { 166 { 167 .dev_name = "imx31-mmc.0", 168 .supply = "sdhc0_vcc", 169 }, 170 { 171 .dev_name = "imx31-mmc.1", 172 .supply = "sdhc1_vcc", 173 }, 174}; 175 176static struct regulator_init_data sdhc_vreg_data = { 177 .constraints = { 178 .min_uV = 2700000, 179 .max_uV = 3000000, 180 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 181 REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, 182 .valid_modes_mask = REGULATOR_MODE_NORMAL | 183 REGULATOR_MODE_FAST, 184 .always_on = 0, 185 .boot_on = 1, 186 }, 187 .num_consumer_supplies = ARRAY_SIZE(sdhc_consumers), 188 .consumer_supplies = sdhc_consumers, 189}; 190 191static struct regulator_consumer_supply cam_consumers[] = { 192 { 193 .dev_name = "mx3_camera.0", 194 .supply = "cam_vcc", 195 }, 196}; 197 198static struct regulator_init_data cam_vreg_data = { 199 .constraints = { 200 .min_uV = 2700000, 201 .max_uV = 3000000, 202 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | 203 REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS, 204 .valid_modes_mask = REGULATOR_MODE_NORMAL | 205 REGULATOR_MODE_FAST, 206 .always_on = 0, 207 .boot_on = 1, 208 }, 209 .num_consumer_supplies = ARRAY_SIZE(cam_consumers), 210 .consumer_supplies = cam_consumers, 211}; 212 213static struct mc13xxx_regulator_init_data moboard_regulators[] = { 214 { 215 .id = MC13783_REG_VMMC1, 216 .init_data = &sdhc_vreg_data, 217 }, 218 { 219 .id = MC13783_REG_VCAM, 220 .init_data = &cam_vreg_data, 221 }, 222}; 223 224static struct mc13xxx_led_platform_data moboard_led[] = { 225 { 226 .id = MC13783_LED_R1, 227 .name = "coreboard-led-4:red", 228 }, 229 { 230 .id = MC13783_LED_G1, 231 .name = "coreboard-led-4:green", 232 }, 233 { 234 .id = MC13783_LED_B1, 235 .name = "coreboard-led-4:blue", 236 }, 237 { 238 .id = MC13783_LED_R2, 239 .name = "coreboard-led-5:red", 240 }, 241 { 242 .id = MC13783_LED_G2, 243 .name = "coreboard-led-5:green", 244 }, 245 { 246 .id = MC13783_LED_B2, 247 .name = "coreboard-led-5:blue", 248 }, 249}; 250 251static struct mc13xxx_leds_platform_data moboard_leds = { 252 .num_leds = ARRAY_SIZE(moboard_led), 253 .led = moboard_led, 254 .led_control[0] = MC13783_LED_C0_ENABLE | MC13783_LED_C0_ABMODE(0), 255 .led_control[1] = MC13783_LED_C1_SLEWLIM, 256 .led_control[2] = MC13783_LED_C2_SLEWLIM, 257 .led_control[3] = MC13783_LED_C3_PERIOD(0) | 258 MC13783_LED_C3_CURRENT_R1(2) | 259 MC13783_LED_C3_CURRENT_G1(2) | 260 MC13783_LED_C3_CURRENT_B1(2), 261 .led_control[4] = MC13783_LED_C4_PERIOD(0) | 262 MC13783_LED_C4_CURRENT_R2(3) | 263 MC13783_LED_C4_CURRENT_G2(3) | 264 MC13783_LED_C4_CURRENT_B2(3), 265}; 266 267static struct mc13xxx_buttons_platform_data moboard_buttons = { 268 .b1on_flags = MC13783_BUTTON_DBNC_750MS | MC13783_BUTTON_ENABLE | 269 MC13783_BUTTON_POL_INVERT, 270 .b1on_key = KEY_POWER, 271}; 272 273static struct mc13xxx_codec_platform_data moboard_codec = { 274 .dac_ssi_port = MC13783_SSI1_PORT, 275 .adc_ssi_port = MC13783_SSI1_PORT, 276}; 277 278static struct mc13xxx_platform_data moboard_pmic = { 279 .regulators = { 280 .regulators = moboard_regulators, 281 .num_regulators = ARRAY_SIZE(moboard_regulators), 282 }, 283 .leds = &moboard_leds, 284 .buttons = &moboard_buttons, 285 .codec = &moboard_codec, 286 .flags = MC13XXX_USE_RTC | MC13XXX_USE_ADC | MC13XXX_USE_CODEC, 287}; 288 289static struct imx_ssi_platform_data moboard_ssi_pdata = { 290 .flags = IMX_SSI_DMA | IMX_SSI_NET, 291}; 292 293static struct spi_board_info moboard_spi_board_info[] __initdata = { 294 { 295 .modalias = "mc13783", 296 /* irq number is run-time assigned */ 297 .max_speed_hz = 300000, 298 .bus_num = 1, 299 .chip_select = 0, 300 .platform_data = &moboard_pmic, 301 .mode = SPI_CS_HIGH, 302 }, 303}; 304 305static int moboard_spi2_cs[] = { 306 MXC_SPI_CS(1), 307}; 308 309static const struct spi_imx_master moboard_spi2_pdata __initconst = { 310 .chipselect = moboard_spi2_cs, 311 .num_chipselect = ARRAY_SIZE(moboard_spi2_cs), 312}; 313 314#define SDHC1_CD IOMUX_TO_GPIO(MX31_PIN_ATA_CS0) 315#define SDHC1_WP IOMUX_TO_GPIO(MX31_PIN_ATA_CS1) 316 317static int moboard_sdhc1_get_ro(struct device *dev) 318{ 319 return !gpio_get_value(SDHC1_WP); 320} 321 322static int moboard_sdhc1_init(struct device *dev, irq_handler_t detect_irq, 323 void *data) 324{ 325 int ret; 326 327 ret = gpio_request(SDHC1_CD, "sdhc-detect"); 328 if (ret) 329 return ret; 330 331 gpio_direction_input(SDHC1_CD); 332 333 ret = gpio_request(SDHC1_WP, "sdhc-wp"); 334 if (ret) 335 goto err_gpio_free; 336 gpio_direction_input(SDHC1_WP); 337 338 ret = request_irq(gpio_to_irq(SDHC1_CD), detect_irq, 339 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 340 "sdhc1-card-detect", data); 341 if (ret) 342 goto err_gpio_free_2; 343 344 return 0; 345 346err_gpio_free_2: 347 gpio_free(SDHC1_WP); 348err_gpio_free: 349 gpio_free(SDHC1_CD); 350 351 return ret; 352} 353 354static void moboard_sdhc1_exit(struct device *dev, void *data) 355{ 356 free_irq(gpio_to_irq(SDHC1_CD), data); 357 gpio_free(SDHC1_WP); 358 gpio_free(SDHC1_CD); 359} 360 361static const struct imxmmc_platform_data sdhc1_pdata __initconst = { 362 .get_ro = moboard_sdhc1_get_ro, 363 .init = moboard_sdhc1_init, 364 .exit = moboard_sdhc1_exit, 365}; 366 367/* 368 * this pin is dedicated for all mx31moboard systems, so we do it here 369 */ 370#define USB_RESET_B IOMUX_TO_GPIO(MX31_PIN_GPIO1_0) 371#define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ 372 PAD_CTL_ODE_CMOS) 373 374#define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC) 375#define USBH2_EN_B IOMUX_TO_GPIO(MX31_PIN_SCK6) 376 377static void usb_xcvr_reset(void) 378{ 379 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, USB_PAD_CFG | PAD_CTL_100K_PD); 380 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, USB_PAD_CFG | PAD_CTL_100K_PD); 381 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, USB_PAD_CFG | PAD_CTL_100K_PD); 382 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, USB_PAD_CFG | PAD_CTL_100K_PD); 383 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, USB_PAD_CFG | PAD_CTL_100K_PD); 384 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, USB_PAD_CFG | PAD_CTL_100K_PD); 385 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, USB_PAD_CFG | PAD_CTL_100K_PD); 386 mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, USB_PAD_CFG | PAD_CTL_100K_PD); 387 mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, USB_PAD_CFG | PAD_CTL_100K_PU); 388 mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, USB_PAD_CFG | PAD_CTL_100K_PU); 389 mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, USB_PAD_CFG | PAD_CTL_100K_PU); 390 mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, USB_PAD_CFG | PAD_CTL_100K_PU); 391 392 mxc_iomux_set_gpr(MUX_PGP_UH2, true); 393 mxc_iomux_set_pad(MX31_PIN_USBH2_CLK, USB_PAD_CFG | PAD_CTL_100K_PU); 394 mxc_iomux_set_pad(MX31_PIN_USBH2_DIR, USB_PAD_CFG | PAD_CTL_100K_PU); 395 mxc_iomux_set_pad(MX31_PIN_USBH2_NXT, USB_PAD_CFG | PAD_CTL_100K_PU); 396 mxc_iomux_set_pad(MX31_PIN_USBH2_STP, USB_PAD_CFG | PAD_CTL_100K_PU); 397 mxc_iomux_set_pad(MX31_PIN_USBH2_DATA0, USB_PAD_CFG | PAD_CTL_100K_PD); 398 mxc_iomux_set_pad(MX31_PIN_USBH2_DATA1, USB_PAD_CFG | PAD_CTL_100K_PD); 399 mxc_iomux_set_pad(MX31_PIN_SRXD6, USB_PAD_CFG | PAD_CTL_100K_PD); 400 mxc_iomux_set_pad(MX31_PIN_STXD6, USB_PAD_CFG | PAD_CTL_100K_PD); 401 mxc_iomux_set_pad(MX31_PIN_SFS3, USB_PAD_CFG | PAD_CTL_100K_PD); 402 mxc_iomux_set_pad(MX31_PIN_SCK3, USB_PAD_CFG | PAD_CTL_100K_PD); 403 mxc_iomux_set_pad(MX31_PIN_SRXD3, USB_PAD_CFG | PAD_CTL_100K_PD); 404 mxc_iomux_set_pad(MX31_PIN_STXD3, USB_PAD_CFG | PAD_CTL_100K_PD); 405 406 gpio_request(OTG_EN_B, "usb-udc-en"); 407 gpio_direction_output(OTG_EN_B, 0); 408 gpio_request(USBH2_EN_B, "usbh2-en"); 409 gpio_direction_output(USBH2_EN_B, 0); 410 411 gpio_request(USB_RESET_B, "usb-reset"); 412 gpio_direction_output(USB_RESET_B, 0); 413 mdelay(1); 414 gpio_set_value(USB_RESET_B, 1); 415 mdelay(1); 416} 417 418static int moboard_usbh2_init_hw(struct platform_device *pdev) 419{ 420 return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED); 421} 422 423static struct mxc_usbh_platform_data usbh2_pdata __initdata = { 424 .init = moboard_usbh2_init_hw, 425 .portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT, 426}; 427 428static int __init moboard_usbh2_init(void) 429{ 430 struct platform_device *pdev; 431 432 usbh2_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS | 433 ULPI_OTG_DRVVBUS_EXT); 434 if (!usbh2_pdata.otg) 435 return -ENODEV; 436 437 pdev = imx31_add_mxc_ehci_hs(2, &usbh2_pdata); 438 439 return PTR_ERR_OR_ZERO(pdev); 440} 441 442static const struct gpio_led mx31moboard_leds[] __initconst = { 443 { 444 .name = "coreboard-led-0:red:running", 445 .default_trigger = "heartbeat", 446 .gpio = IOMUX_TO_GPIO(MX31_PIN_SVEN0), 447 }, { 448 .name = "coreboard-led-1:red", 449 .gpio = IOMUX_TO_GPIO(MX31_PIN_STX0), 450 }, { 451 .name = "coreboard-led-2:red", 452 .gpio = IOMUX_TO_GPIO(MX31_PIN_SRX0), 453 }, { 454 .name = "coreboard-led-3:red", 455 .gpio = IOMUX_TO_GPIO(MX31_PIN_SIMPD0), 456 }, 457}; 458 459static const struct gpio_led_platform_data mx31moboard_led_pdata __initconst = { 460 .num_leds = ARRAY_SIZE(mx31moboard_leds), 461 .leds = mx31moboard_leds, 462}; 463 464static struct platform_device *devices[] __initdata = { 465 &mx31moboard_flash, 466}; 467 468static struct mx3_camera_pdata camera_pdata __initdata = { 469 .flags = MX3_CAMERA_DATAWIDTH_8 | MX3_CAMERA_DATAWIDTH_10, 470 .mclk_10khz = 4800, 471}; 472 473static phys_addr_t mx3_camera_base __initdata; 474#define MX3_CAMERA_BUF_SIZE SZ_4M 475 476static int __init mx31moboard_init_cam(void) 477{ 478 int dma, ret = -ENOMEM; 479 struct platform_device *pdev; 480 481 imx31_add_ipu_core(); 482 483 pdev = imx31_alloc_mx3_camera(&camera_pdata); 484 if (IS_ERR(pdev)) 485 return PTR_ERR(pdev); 486 487 dma = dma_declare_coherent_memory(&pdev->dev, 488 mx3_camera_base, mx3_camera_base, 489 MX3_CAMERA_BUF_SIZE, 490 DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); 491 if (!(dma & DMA_MEMORY_MAP)) 492 goto err; 493 494 ret = platform_device_add(pdev); 495 if (ret) 496err: 497 platform_device_put(pdev); 498 499 return ret; 500 501} 502 503static void mx31moboard_poweroff(void) 504{ 505 struct clk *clk = clk_get_sys("imx2-wdt.0", NULL); 506 507 if (!IS_ERR(clk)) 508 clk_prepare_enable(clk); 509 510 mxc_iomux_mode(MX31_PIN_WATCHDOG_RST__WATCHDOG_RST); 511 512 __raw_writew(1 << 6 | 1 << 2, MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); 513} 514 515static int mx31moboard_baseboard; 516core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444); 517 518/* 519 * Board specific initialization. 520 */ 521static void __init mx31moboard_init(void) 522{ 523 imx31_soc_init(); 524 525 mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins), 526 "moboard"); 527 528 platform_add_devices(devices, ARRAY_SIZE(devices)); 529 gpio_led_register_device(-1, &mx31moboard_led_pdata); 530 531 imx31_add_imx2_wdt(); 532 533 moboard_uart0_init(); 534 imx31_add_imx_uart0(&uart0_pdata); 535 imx31_add_imx_uart4(&uart4_pdata); 536 537 imx31_add_imx_i2c0(&moboard_i2c0_data); 538 imx31_add_imx_i2c1(&moboard_i2c1_data); 539 540 imx31_add_spi_imx1(&moboard_spi1_pdata); 541 imx31_add_spi_imx2(&moboard_spi2_pdata); 542 543 gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3), "pmic-irq"); 544 gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3)); 545 moboard_spi_board_info[0].irq = 546 gpio_to_irq(IOMUX_TO_GPIO(MX31_PIN_GPIO1_3)); 547 spi_register_board_info(moboard_spi_board_info, 548 ARRAY_SIZE(moboard_spi_board_info)); 549 550 imx31_add_mxc_mmc(0, &sdhc1_pdata); 551 552 mx31moboard_init_cam(); 553 554 usb_xcvr_reset(); 555 556 moboard_usbh2_init(); 557 558 imx31_add_imx_ssi(0, &moboard_ssi_pdata); 559 560 imx_add_platform_device("imx_mc13783", 0, NULL, 0, NULL, 0); 561 562 pm_power_off = mx31moboard_poweroff; 563 564 switch (mx31moboard_baseboard) { 565 case MX31NOBOARD: 566 break; 567 case MX31DEVBOARD: 568 mx31moboard_devboard_init(); 569 break; 570 case MX31MARXBOT: 571 mx31moboard_marxbot_init(); 572 break; 573 case MX31SMARTBOT: 574 case MX31EYEBOT: 575 mx31moboard_smartbot_init(mx31moboard_baseboard); 576 break; 577 default: 578 printk(KERN_ERR "Illegal mx31moboard_baseboard type %d\n", 579 mx31moboard_baseboard); 580 } 581} 582 583static void __init mx31moboard_timer_init(void) 584{ 585 mx31_clocks_init(26000000); 586} 587 588static void __init mx31moboard_reserve(void) 589{ 590 /* reserve 4 MiB for mx3-camera */ 591 mx3_camera_base = arm_memblock_steal(MX3_CAMERA_BUF_SIZE, 592 MX3_CAMERA_BUF_SIZE); 593} 594 595MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard") 596 /* Maintainer: Philippe Retornaz, EPFL Mobots group */ 597 .atag_offset = 0x100, 598 .reserve = mx31moboard_reserve, 599 .map_io = mx31_map_io, 600 .init_early = imx31_init_early, 601 .init_irq = mx31_init_irq, 602 .init_time = mx31moboard_timer_init, 603 .init_machine = mx31moboard_init, 604 .restart = mxc_restart, 605MACHINE_END 606