Path: blob/master/arch/arm/mach-imx/mach-mx27_3ds.c
10819 views
/*1* Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.2*3* Author: Fabio Estevam <[email protected]>4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*/1516/*17* This machine is known as:18* - i.MX27 3-Stack Development System19* - i.MX27 Platform Development Kit (i.MX27 PDK)20*/2122#include <linux/platform_device.h>23#include <linux/gpio.h>24#include <linux/irq.h>25#include <linux/usb/otg.h>26#include <linux/usb/ulpi.h>27#include <linux/delay.h>28#include <linux/mfd/mc13783.h>29#include <linux/spi/spi.h>30#include <linux/regulator/machine.h>3132#include <asm/mach-types.h>33#include <asm/mach/arch.h>34#include <asm/mach/time.h>35#include <mach/hardware.h>36#include <mach/common.h>37#include <mach/iomux-mx27.h>38#include <mach/ulpi.h>39#include <mach/irqs.h>40#include <mach/3ds_debugboard.h>4142#include "devices-imx27.h"4344#define SD1_EN_GPIO (GPIO_PORTB + 25)45#define OTG_PHY_RESET_GPIO (GPIO_PORTB + 23)46#define SPI2_SS0 (GPIO_PORTD + 21)47#define EXPIO_PARENT_INT (MXC_INTERNAL_IRQS + GPIO_PORTC + 28)4849static const int mx27pdk_pins[] __initconst = {50/* UART1 */51PE12_PF_UART1_TXD,52PE13_PF_UART1_RXD,53PE14_PF_UART1_CTS,54PE15_PF_UART1_RTS,55/* FEC */56PD0_AIN_FEC_TXD0,57PD1_AIN_FEC_TXD1,58PD2_AIN_FEC_TXD2,59PD3_AIN_FEC_TXD3,60PD4_AOUT_FEC_RX_ER,61PD5_AOUT_FEC_RXD1,62PD6_AOUT_FEC_RXD2,63PD7_AOUT_FEC_RXD3,64PD8_AF_FEC_MDIO,65PD9_AIN_FEC_MDC,66PD10_AOUT_FEC_CRS,67PD11_AOUT_FEC_TX_CLK,68PD12_AOUT_FEC_RXD0,69PD13_AOUT_FEC_RX_DV,70PD14_AOUT_FEC_RX_CLK,71PD15_AOUT_FEC_COL,72PD16_AIN_FEC_TX_ER,73PF23_AIN_FEC_TX_EN,74/* SDHC1 */75PE18_PF_SD1_D0,76PE19_PF_SD1_D1,77PE20_PF_SD1_D2,78PE21_PF_SD1_D3,79PE22_PF_SD1_CMD,80PE23_PF_SD1_CLK,81SD1_EN_GPIO | GPIO_GPIO | GPIO_OUT,82/* OTG */83OTG_PHY_RESET_GPIO | GPIO_GPIO | GPIO_OUT,84PC7_PF_USBOTG_DATA5,85PC8_PF_USBOTG_DATA6,86PC9_PF_USBOTG_DATA0,87PC10_PF_USBOTG_DATA2,88PC11_PF_USBOTG_DATA1,89PC12_PF_USBOTG_DATA4,90PC13_PF_USBOTG_DATA3,91PE0_PF_USBOTG_NXT,92PE1_PF_USBOTG_STP,93PE2_PF_USBOTG_DIR,94PE24_PF_USBOTG_CLK,95PE25_PF_USBOTG_DATA7,96/* CSPI2 */97PD22_PF_CSPI2_SCLK,98PD23_PF_CSPI2_MISO,99PD24_PF_CSPI2_MOSI,100/* I2C1 */101PD17_PF_I2C_DATA,102PD18_PF_I2C_CLK,103};104105static const struct imxuart_platform_data uart_pdata __initconst = {106.flags = IMXUART_HAVE_RTSCTS,107};108109/*110* Matrix keyboard111*/112113static const uint32_t mx27_3ds_keymap[] = {114KEY(0, 0, KEY_UP),115KEY(0, 1, KEY_DOWN),116KEY(1, 0, KEY_RIGHT),117KEY(1, 1, KEY_LEFT),118KEY(1, 2, KEY_ENTER),119KEY(2, 0, KEY_F6),120KEY(2, 1, KEY_F8),121KEY(2, 2, KEY_F9),122KEY(2, 3, KEY_F10),123};124125static const struct matrix_keymap_data mx27_3ds_keymap_data __initconst = {126.keymap = mx27_3ds_keymap,127.keymap_size = ARRAY_SIZE(mx27_3ds_keymap),128};129130static int mx27_3ds_sdhc1_init(struct device *dev, irq_handler_t detect_irq,131void *data)132{133return request_irq(IRQ_GPIOB(26), detect_irq, IRQF_TRIGGER_FALLING |134IRQF_TRIGGER_RISING, "sdhc1-card-detect", data);135}136137static void mx27_3ds_sdhc1_exit(struct device *dev, void *data)138{139free_irq(IRQ_GPIOB(26), data);140}141142static const struct imxmmc_platform_data sdhc1_pdata __initconst = {143.init = mx27_3ds_sdhc1_init,144.exit = mx27_3ds_sdhc1_exit,145};146147static void mx27_3ds_sdhc1_enable_level_translator(void)148{149/* Turn on TXB0108 OE pin */150gpio_request(SD1_EN_GPIO, "sd1_enable");151gpio_direction_output(SD1_EN_GPIO, 1);152}153154155static int otg_phy_init(void)156{157gpio_request(OTG_PHY_RESET_GPIO, "usb-otg-reset");158gpio_direction_output(OTG_PHY_RESET_GPIO, 0);159mdelay(1);160gpio_set_value(OTG_PHY_RESET_GPIO, 1);161return 0;162}163164static int mx27_3ds_otg_init(struct platform_device *pdev)165{166return mx27_initialize_usb_hw(pdev->id, MXC_EHCI_INTERFACE_DIFF_UNI);167}168169static struct mxc_usbh_platform_data otg_pdata __initdata = {170.init = mx27_3ds_otg_init,171.portsc = MXC_EHCI_MODE_ULPI,172};173174static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {175.operating_mode = FSL_USB2_DR_DEVICE,176.phy_mode = FSL_USB2_PHY_ULPI,177};178179static int otg_mode_host;180181static int __init mx27_3ds_otg_mode(char *options)182{183if (!strcmp(options, "host"))184otg_mode_host = 1;185else if (!strcmp(options, "device"))186otg_mode_host = 0;187else188pr_info("otg_mode neither \"host\" nor \"device\". "189"Defaulting to device\n");190return 0;191}192__setup("otg_mode=", mx27_3ds_otg_mode);193194/* Regulators */195static struct regulator_consumer_supply vmmc1_consumers[] = {196REGULATOR_SUPPLY("lcd_2v8", NULL),197};198199static struct regulator_init_data vmmc1_init = {200.constraints = {201.min_uV = 2800000,202.max_uV = 2800000,203.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,204},205.num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),206.consumer_supplies = vmmc1_consumers,207};208209static struct regulator_consumer_supply vgen_consumers[] = {210REGULATOR_SUPPLY("vdd_lcdio", NULL),211};212213static struct regulator_init_data vgen_init = {214.constraints = {215.min_uV = 1800000,216.max_uV = 1800000,217.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,218},219.num_consumer_supplies = ARRAY_SIZE(vgen_consumers),220.consumer_supplies = vgen_consumers,221};222223static struct mc13xxx_regulator_init_data mx27_3ds_regulators[] = {224{225.id = MC13783_REG_VMMC1,226.init_data = &vmmc1_init,227}, {228.id = MC13783_REG_VGEN,229.init_data = &vgen_init,230},231};232233/* MC13783 */234static struct mc13xxx_platform_data mc13783_pdata = {235.regulators = {236.regulators = mx27_3ds_regulators,237.num_regulators = ARRAY_SIZE(mx27_3ds_regulators),238239},240.flags = MC13783_USE_REGULATOR,241};242243/* SPI */244static int spi2_internal_chipselect[] = {SPI2_SS0};245246static const struct spi_imx_master spi2_pdata __initconst = {247.chipselect = spi2_internal_chipselect,248.num_chipselect = ARRAY_SIZE(spi2_internal_chipselect),249};250251static struct spi_board_info mx27_3ds_spi_devs[] __initdata = {252{253.modalias = "mc13783",254.max_speed_hz = 1000000,255.bus_num = 1,256.chip_select = 0, /* SS0 */257.platform_data = &mc13783_pdata,258.irq = IRQ_GPIOC(14),259.mode = SPI_CS_HIGH,260},261};262263static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = {264.bitrate = 100000,265};266267static void __init mx27pdk_init(void)268{269mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins),270"mx27pdk");271mx27_3ds_sdhc1_enable_level_translator();272imx27_add_imx_uart0(&uart_pdata);273imx27_add_fec(NULL);274imx27_add_imx_keypad(&mx27_3ds_keymap_data);275imx27_add_mxc_mmc(0, &sdhc1_pdata);276imx27_add_imx2_wdt(NULL);277otg_phy_init();278279if (otg_mode_host) {280otg_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |281ULPI_OTG_DRVVBUS_EXT);282283if (otg_pdata.otg)284imx27_add_mxc_ehci_otg(&otg_pdata);285}286287if (!otg_mode_host)288imx27_add_fsl_usb2_udc(&otg_device_pdata);289290imx27_add_spi_imx1(&spi2_pdata);291spi_register_board_info(mx27_3ds_spi_devs,292ARRAY_SIZE(mx27_3ds_spi_devs));293294if (mxc_expio_init(MX27_CS5_BASE_ADDR, EXPIO_PARENT_INT))295pr_warn("Init of the debugboard failed, all devices on the debugboard are unusable.\n");296imx27_add_imx_i2c(0, &mx27_3ds_i2c0_data);297}298299static void __init mx27pdk_timer_init(void)300{301mx27_clocks_init(26000000);302}303304static struct sys_timer mx27pdk_timer = {305.init = mx27pdk_timer_init,306};307308MACHINE_START(MX27_3DS, "Freescale MX27PDK")309/* maintainer: Freescale Semiconductor, Inc. */310.boot_params = MX27_PHYS_OFFSET + 0x100,311.map_io = mx27_map_io,312.init_early = imx27_init_early,313.init_irq = mx27_init_irq,314.timer = &mx27pdk_timer,315.init_machine = mx27pdk_init,316MACHINE_END317318319