1/* 2 * Copyright (C) 2010 Eric Benard - eric@eukrea.com 3 * Copyright (C) 2009 Sascha Hauer, Pengutronix 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (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 of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 */ 19 20#include <linux/types.h> 21#include <linux/init.h> 22 23#include <linux/platform_device.h> 24#include <linux/mtd/physmap.h> 25#include <linux/memory.h> 26#include <linux/gpio.h> 27#include <linux/interrupt.h> 28#include <linux/delay.h> 29#include <linux/i2c.h> 30#include <linux/i2c/tsc2007.h> 31#include <linux/usb/otg.h> 32#include <linux/usb/ulpi.h> 33#include <linux/fsl_devices.h> 34 35#include <asm/mach-types.h> 36#include <asm/mach/arch.h> 37#include <asm/mach/time.h> 38#include <asm/mach/map.h> 39 40#include <mach/eukrea-baseboards.h> 41#include <mach/hardware.h> 42#include <mach/common.h> 43#include <mach/iomux-mx35.h> 44#include <mach/mxc_nand.h> 45#include <mach/mxc_ehci.h> 46#include <mach/ulpi.h> 47 48#include "devices-imx35.h" 49#include "devices.h" 50 51static const struct imxuart_platform_data uart_pdata __initconst = { 52 .flags = IMXUART_HAVE_RTSCTS, 53}; 54 55static const struct imxi2c_platform_data 56eukrea_cpuimx35_i2c0_data __initconst = { 57 .bitrate = 50000, 58}; 59 60#define TSC2007_IRQGPIO (2 * 32 + 2) 61static int ts_get_pendown_state(void) 62{ 63 int val = 0; 64 gpio_free(TSC2007_IRQGPIO); 65 gpio_request(TSC2007_IRQGPIO, NULL); 66 gpio_direction_input(TSC2007_IRQGPIO); 67 68 val = gpio_get_value(TSC2007_IRQGPIO); 69 70 gpio_free(TSC2007_IRQGPIO); 71 gpio_request(TSC2007_IRQGPIO, NULL); 72 73 return val ? 0 : 1; 74} 75 76static int ts_init(void) 77{ 78 gpio_request(TSC2007_IRQGPIO, NULL); 79 return 0; 80} 81 82static struct tsc2007_platform_data tsc2007_info = { 83 .model = 2007, 84 .x_plate_ohms = 180, 85 .get_pendown_state = ts_get_pendown_state, 86 .init_platform_hw = ts_init, 87}; 88 89static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = { 90 { 91 I2C_BOARD_INFO("pcf8563", 0x51), 92 }, { 93 I2C_BOARD_INFO("tsc2007", 0x48), 94 .type = "tsc2007", 95 .platform_data = &tsc2007_info, 96 .irq = gpio_to_irq(TSC2007_IRQGPIO), 97 }, 98}; 99 100static struct platform_device *devices[] __initdata = { 101 &mxc_fec_device, 102 &imx_wdt_device0, 103}; 104 105static struct pad_desc eukrea_cpuimx35_pads[] = { 106 /* UART1 */ 107 MX35_PAD_CTS1__UART1_CTS, 108 MX35_PAD_RTS1__UART1_RTS, 109 MX35_PAD_TXD1__UART1_TXD_MUX, 110 MX35_PAD_RXD1__UART1_RXD_MUX, 111 /* FEC */ 112 MX35_PAD_FEC_TX_CLK__FEC_TX_CLK, 113 MX35_PAD_FEC_RX_CLK__FEC_RX_CLK, 114 MX35_PAD_FEC_RX_DV__FEC_RX_DV, 115 MX35_PAD_FEC_COL__FEC_COL, 116 MX35_PAD_FEC_RDATA0__FEC_RDATA_0, 117 MX35_PAD_FEC_TDATA0__FEC_TDATA_0, 118 MX35_PAD_FEC_TX_EN__FEC_TX_EN, 119 MX35_PAD_FEC_MDC__FEC_MDC, 120 MX35_PAD_FEC_MDIO__FEC_MDIO, 121 MX35_PAD_FEC_TX_ERR__FEC_TX_ERR, 122 MX35_PAD_FEC_RX_ERR__FEC_RX_ERR, 123 MX35_PAD_FEC_CRS__FEC_CRS, 124 MX35_PAD_FEC_RDATA1__FEC_RDATA_1, 125 MX35_PAD_FEC_TDATA1__FEC_TDATA_1, 126 MX35_PAD_FEC_RDATA2__FEC_RDATA_2, 127 MX35_PAD_FEC_TDATA2__FEC_TDATA_2, 128 MX35_PAD_FEC_RDATA3__FEC_RDATA_3, 129 MX35_PAD_FEC_TDATA3__FEC_TDATA_3, 130 /* I2C1 */ 131 MX35_PAD_I2C1_CLK__I2C1_SCL, 132 MX35_PAD_I2C1_DAT__I2C1_SDA, 133 /* TSC2007 IRQ */ 134 MX35_PAD_ATA_DA2__GPIO3_2, 135}; 136 137static const struct mxc_nand_platform_data 138eukrea_cpuimx35_nand_board_info __initconst = { 139 .width = 1, 140 .hw_ecc = 1, 141 .flash_bbt = 1, 142}; 143 144static struct mxc_usbh_platform_data otg_pdata = { 145 .portsc = MXC_EHCI_MODE_UTMI, 146 .flags = MXC_EHCI_INTERFACE_DIFF_UNI, 147}; 148 149static struct mxc_usbh_platform_data usbh1_pdata = { 150 .portsc = MXC_EHCI_MODE_SERIAL, 151 .flags = MXC_EHCI_INTERFACE_SINGLE_UNI | MXC_EHCI_INTERNAL_PHY | 152 MXC_EHCI_IPPUE_DOWN, 153}; 154 155static struct fsl_usb2_platform_data otg_device_pdata = { 156 .operating_mode = FSL_USB2_DR_DEVICE, 157 .phy_mode = FSL_USB2_PHY_UTMI, 158}; 159 160static int otg_mode_host; 161 162static int __init eukrea_cpuimx35_otg_mode(char *options) 163{ 164 if (!strcmp(options, "host")) 165 otg_mode_host = 1; 166 else if (!strcmp(options, "device")) 167 otg_mode_host = 0; 168 else 169 pr_info("otg_mode neither \"host\" nor \"device\". " 170 "Defaulting to device\n"); 171 return 0; 172} 173__setup("otg_mode=", eukrea_cpuimx35_otg_mode); 174 175/* 176 * Board specific initialization. 177 */ 178static void __init mxc_board_init(void) 179{ 180 mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads, 181 ARRAY_SIZE(eukrea_cpuimx35_pads)); 182 183 platform_add_devices(devices, ARRAY_SIZE(devices)); 184 185 imx35_add_imx_uart0(&uart_pdata); 186 imx35_add_mxc_nand(&eukrea_cpuimx35_nand_board_info); 187 188 i2c_register_board_info(0, eukrea_cpuimx35_i2c_devices, 189 ARRAY_SIZE(eukrea_cpuimx35_i2c_devices)); 190 imx35_add_imx_i2c0(&eukrea_cpuimx35_i2c0_data); 191 192#if defined(CONFIG_USB_ULPI) 193 if (otg_mode_host) { 194 otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, 195 ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT); 196 197 mxc_register_device(&mxc_otg_host, &otg_pdata); 198 } 199 mxc_register_device(&mxc_usbh1, &usbh1_pdata); 200#endif 201 if (!otg_mode_host) 202 mxc_register_device(&mxc_otg_udc_device, &otg_device_pdata); 203 204#ifdef CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD 205 eukrea_mbimxsd35_baseboard_init(); 206#endif 207} 208 209static void __init eukrea_cpuimx35_timer_init(void) 210{ 211 mx35_clocks_init(); 212} 213 214struct sys_timer eukrea_cpuimx35_timer = { 215 .init = eukrea_cpuimx35_timer_init, 216}; 217 218MACHINE_START(EUKREA_CPUIMX35, "Eukrea CPUIMX35") 219 /* Maintainer: Eukrea Electromatique */ 220 .phys_io = MX35_AIPS1_BASE_ADDR, 221 .io_pg_offst = ((MX35_AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc, 222 .boot_params = MX3x_PHYS_OFFSET + 0x100, 223 .map_io = mx35_map_io, 224 .init_irq = mx35_init_irq, 225 .init_machine = mxc_board_init, 226 .timer = &eukrea_cpuimx35_timer, 227MACHINE_END 228