1/* 2 * LogicPD i.MX31 SOM-LV development board support 3 * 4 * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de> 5 * 6 * based on code for other MX31 boards, 7 * 8 * Copyright 2005-2007 Freescale Semiconductor 9 * Copyright (c) 2009 Alberto Panizzo <maramaopercheseimorto@gmail.com> 10 * Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 */ 22 23#include <linux/kernel.h> 24#include <linux/types.h> 25#include <linux/init.h> 26#include <linux/gpio.h> 27#include <linux/leds.h> 28#include <linux/platform_device.h> 29 30#include <asm/mach-types.h> 31#include <asm/mach/arch.h> 32#include <asm/mach/map.h> 33 34#include <mach/hardware.h> 35#include <mach/common.h> 36#include <mach/iomux-mx3.h> 37#include <mach/board-mx31lite.h> 38#include <mach/mmc.h> 39 40#include "devices-imx31.h" 41#include "devices.h" 42 43/* 44 * This file contains board-specific initialization routines for the 45 * LogicPD i.MX31 SOM-LV development board, aka 'LiteKit'. 46 * If you design an own baseboard for the module, use this file as base 47 * for support code. 48 */ 49 50static unsigned int litekit_db_board_pins[] __initdata = { 51 /* UART1 */ 52 MX31_PIN_CTS1__CTS1, 53 MX31_PIN_RTS1__RTS1, 54 MX31_PIN_TXD1__TXD1, 55 MX31_PIN_RXD1__RXD1, 56 /* SPI 0 */ 57 MX31_PIN_CSPI1_SCLK__SCLK, 58 MX31_PIN_CSPI1_MOSI__MOSI, 59 MX31_PIN_CSPI1_MISO__MISO, 60 MX31_PIN_CSPI1_SPI_RDY__SPI_RDY, 61 MX31_PIN_CSPI1_SS0__SS0, 62 MX31_PIN_CSPI1_SS1__SS1, 63 MX31_PIN_CSPI1_SS2__SS2, 64 /* SDHC1 */ 65 MX31_PIN_SD1_DATA0__SD1_DATA0, 66 MX31_PIN_SD1_DATA1__SD1_DATA1, 67 MX31_PIN_SD1_DATA2__SD1_DATA2, 68 MX31_PIN_SD1_DATA3__SD1_DATA3, 69 MX31_PIN_SD1_CLK__SD1_CLK, 70 MX31_PIN_SD1_CMD__SD1_CMD, 71}; 72 73/* UART */ 74static const struct imxuart_platform_data uart_pdata __initconst = { 75 .flags = IMXUART_HAVE_RTSCTS, 76}; 77 78/* MMC */ 79 80static int gpio_det, gpio_wp; 81 82#define MMC_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ 83 PAD_CTL_ODE_CMOS) 84 85static int mxc_mmc1_get_ro(struct device *dev) 86{ 87 return gpio_get_value(IOMUX_TO_GPIO(MX31_PIN_GPIO1_6)); 88} 89 90static int mxc_mmc1_init(struct device *dev, 91 irq_handler_t detect_irq, void *data) 92{ 93 int ret; 94 95 gpio_det = IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1); 96 gpio_wp = IOMUX_TO_GPIO(MX31_PIN_GPIO1_6); 97 98 mxc_iomux_set_pad(MX31_PIN_SD1_DATA0, 99 MMC_PAD_CFG | PAD_CTL_PUE_PUD | PAD_CTL_100K_PU); 100 mxc_iomux_set_pad(MX31_PIN_SD1_DATA1, 101 MMC_PAD_CFG | PAD_CTL_PUE_PUD | PAD_CTL_100K_PU); 102 mxc_iomux_set_pad(MX31_PIN_SD1_DATA2, 103 MMC_PAD_CFG | PAD_CTL_PUE_PUD | PAD_CTL_100K_PU); 104 mxc_iomux_set_pad(MX31_PIN_SD1_DATA3, 105 MMC_PAD_CFG | PAD_CTL_PUE_PUD | PAD_CTL_100K_PU); 106 mxc_iomux_set_pad(MX31_PIN_SD1_CMD, 107 MMC_PAD_CFG | PAD_CTL_PUE_PUD | PAD_CTL_100K_PU); 108 mxc_iomux_set_pad(MX31_PIN_SD1_CLK, MMC_PAD_CFG); 109 110 ret = gpio_request(gpio_det, "MMC detect"); 111 if (ret) 112 return ret; 113 114 ret = gpio_request(gpio_wp, "MMC w/p"); 115 if (ret) 116 goto exit_free_det; 117 118 gpio_direction_input(gpio_det); 119 gpio_direction_input(gpio_wp); 120 121 ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_DCD_DCE1), detect_irq, 122 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 123 "MMC detect", data); 124 if (ret) 125 goto exit_free_wp; 126 127 return 0; 128 129exit_free_wp: 130 gpio_free(gpio_wp); 131 132exit_free_det: 133 gpio_free(gpio_det); 134 135 return ret; 136} 137 138static void mxc_mmc1_exit(struct device *dev, void *data) 139{ 140 gpio_free(gpio_det); 141 gpio_free(gpio_wp); 142 free_irq(IOMUX_TO_IRQ(MX31_PIN_DCD_DCE1), data); 143} 144 145static struct imxmmc_platform_data mmc_pdata = { 146 .get_ro = mxc_mmc1_get_ro, 147 .init = mxc_mmc1_init, 148 .exit = mxc_mmc1_exit, 149}; 150 151/* SPI */ 152 153static int spi_internal_chipselect[] = { 154 MXC_SPI_CS(0), 155 MXC_SPI_CS(1), 156 MXC_SPI_CS(2), 157}; 158 159static const struct spi_imx_master spi0_pdata __initconst = { 160 .chipselect = spi_internal_chipselect, 161 .num_chipselect = ARRAY_SIZE(spi_internal_chipselect), 162}; 163 164/* GPIO LEDs */ 165 166static struct gpio_led litekit_leds[] = { 167 { 168 .name = "GPIO0", 169 .gpio = IOMUX_TO_GPIO(MX31_PIN_COMPARE), 170 .active_low = 1, 171 .default_state = LEDS_GPIO_DEFSTATE_OFF, 172 }, 173 { 174 .name = "GPIO1", 175 .gpio = IOMUX_TO_GPIO(MX31_PIN_CAPTURE), 176 .active_low = 1, 177 .default_state = LEDS_GPIO_DEFSTATE_OFF, 178 } 179}; 180 181static struct gpio_led_platform_data litekit_led_platform_data = { 182 .leds = litekit_leds, 183 .num_leds = ARRAY_SIZE(litekit_leds), 184}; 185 186static struct platform_device litekit_led_device = { 187 .name = "leds-gpio", 188 .id = -1, 189 .dev = { 190 .platform_data = &litekit_led_platform_data, 191 }, 192}; 193 194void __init mx31lite_db_init(void) 195{ 196 mxc_iomux_setup_multiple_pins(litekit_db_board_pins, 197 ARRAY_SIZE(litekit_db_board_pins), 198 "development board pins"); 199 imx31_add_imx_uart0(&uart_pdata); 200 mxc_register_device(&mxcsdhc_device0, &mmc_pdata); 201 imx31_add_spi_imx0(&spi0_pdata); 202 platform_device_register(&litekit_led_device); 203 mxc_register_device(&imx_wdt_device0, NULL); 204 mxc_register_device(&imx_rtc_device0, NULL); 205} 206