2 * Copyright (C) 2000 Deep Blue Solutions Ltd
3 * Copyright (C) 2002 Shane Nay (shane@minirl.com)
4 * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
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.
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.
17 #include <linux/platform_device.h>
18 #include <linux/mtd/mtd.h>
19 #include <linux/mtd/map.h>
20 #include <linux/mtd/partitions.h>
21 #include <linux/mtd/physmap.h>
22 #include <linux/i2c.h>
23 #include <linux/irq.h>
24 #include <mach/common.h>
25 #include <mach/hardware.h>
26 #include <asm/mach-types.h>
27 #include <asm/mach/arch.h>
28 #include <asm/mach/time.h>
29 #include <asm/mach/map.h>
30 #include <linux/gpio.h>
31 #include <mach/iomux-mx27.h>
32 #include <mach/mxc_nand.h>
33 #include <linux/i2c/pca953x.h>
35 #include "devices-imx27.h"
37 static const int mxt_td60_pins
[] __initconst
= {
123 static const struct mxc_nand_platform_data
124 mxt_td60_nand_board_info __initconst
= {
129 static const struct imxi2c_platform_data mxt_td60_i2c0_data __initconst
= {
134 static int mxt_td60_pca9557_setup(struct i2c_client
*client
,
135 unsigned gpio_base
, unsigned ngpio
,
138 static int mxt_td60_gpio_value
[] = {
139 -1, -1, -1, -1, -1, -1, -1, 1
143 for (n
= 0; n
< ARRAY_SIZE(mxt_td60_gpio_value
); ++n
) {
144 gpio_request(gpio_base
+ n
, "MXT_TD60 GPIO Exp");
145 if (mxt_td60_gpio_value
[n
] < 0)
146 gpio_direction_input(gpio_base
+ n
);
148 gpio_direction_output(gpio_base
+ n
,
149 mxt_td60_gpio_value
[n
]);
150 gpio_export(gpio_base
+ n
, 0);
156 static struct pca953x_platform_data mxt_td60_pca9557_pdata
= {
157 .gpio_base
= 240, /* place PCA9557 after all MX27 gpio pins */
158 .invert
= 0, /* Do not invert */
159 .setup
= mxt_td60_pca9557_setup
,
162 static struct i2c_board_info mxt_td60_i2c_devices
[] = {
164 I2C_BOARD_INFO("pca9557", 0x18),
165 .platform_data
= &mxt_td60_pca9557_pdata
,
169 static const struct imxi2c_platform_data mxt_td60_i2c1_data __initconst
= {
173 static struct i2c_board_info mxt_td60_i2c2_devices
[] = {
176 static struct imx_fb_videomode mxt_td60_modes
[] = {
179 .name
= "Chimei LW700AT9003",
186 .right_margin
= 0x68,
188 .upper_margin
= 0x0f,
189 .lower_margin
= 0x0f,
196 static const struct imx_fb_platform_data mxt_td60_fb_data __initconst
= {
197 .mode
= mxt_td60_modes
,
198 .num_modes
= ARRAY_SIZE(mxt_td60_modes
),
201 * - HSYNC active high
202 * - VSYNC active high
203 * - clk notenabled while idle
205 * - data not inverted
206 * - data enable low active
207 * - enable sharp mode
214 static int mxt_td60_sdhc1_init(struct device
*dev
, irq_handler_t detect_irq
,
217 return request_irq(IRQ_GPIOF(8), detect_irq
, IRQF_TRIGGER_FALLING
,
218 "sdhc1-card-detect", data
);
221 static void mxt_td60_sdhc1_exit(struct device
*dev
, void *data
)
223 free_irq(IRQ_GPIOF(8), data
);
226 static const struct imxmmc_platform_data sdhc1_pdata __initconst
= {
227 .init
= mxt_td60_sdhc1_init
,
228 .exit
= mxt_td60_sdhc1_exit
,
231 static const struct imxuart_platform_data uart_pdata __initconst
= {
232 .flags
= IMXUART_HAVE_RTSCTS
,
235 static void __init
mxt_td60_board_init(void)
237 mxc_gpio_setup_multiple_pins(mxt_td60_pins
, ARRAY_SIZE(mxt_td60_pins
),
240 imx27_add_imx_uart0(&uart_pdata
);
241 imx27_add_imx_uart1(&uart_pdata
);
242 imx27_add_imx_uart2(&uart_pdata
);
243 imx27_add_mxc_nand(&mxt_td60_nand_board_info
);
245 i2c_register_board_info(0, mxt_td60_i2c_devices
,
246 ARRAY_SIZE(mxt_td60_i2c_devices
));
248 i2c_register_board_info(1, mxt_td60_i2c2_devices
,
249 ARRAY_SIZE(mxt_td60_i2c2_devices
));
251 imx27_add_imx_i2c(0, &mxt_td60_i2c0_data
);
252 imx27_add_imx_i2c(1, &mxt_td60_i2c1_data
);
253 imx27_add_imx_fb(&mxt_td60_fb_data
);
254 imx27_add_mxc_mmc(0, &sdhc1_pdata
);
258 static void __init
mxt_td60_timer_init(void)
260 mx27_clocks_init(26000000);
263 static struct sys_timer mxt_td60_timer
= {
264 .init
= mxt_td60_timer_init
,
267 MACHINE_START(MXT_TD60
, "Maxtrack i-MXT TD60")
268 /* maintainer: Maxtrack Industrial */
269 .boot_params
= MX27_PHYS_OFFSET
+ 0x100,
270 .map_io
= mx27_map_io
,
271 .init_irq
= mx27_init_irq
,
272 .init_machine
= mxt_td60_board_init
,
273 .timer
= &mxt_td60_timer
,