1 /*
2  * Hardware definitions for PalmTX
3  *
4  * Author:     Marek Vasut <marek.vasut@gmail.com>
5  *
6  * Based on work of:
7  *		Alex Osborne <ato@meshy.org>
8  *		Cristiano P. <cristianop@users.sourceforge.net>
9  *		Jan Herman <2hp@seznam.cz>
10  *		Michal Hrusecky
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 version 2 as
14  * published by the Free Software Foundation.
15  *
16  * (find more info at www.hackndev.com)
17  *
18  */
19 
20 #include <linux/platform_device.h>
21 #include <linux/delay.h>
22 #include <linux/irq.h>
23 #include <linux/gpio_keys.h>
24 #include <linux/input.h>
25 #include <linux/pda_power.h>
26 #include <linux/pwm_backlight.h>
27 #include <linux/gpio.h>
28 #include <linux/wm97xx.h>
29 #include <linux/power_supply.h>
30 #include <linux/usb/gpio_vbus.h>
31 #include <linux/mtd/rawnand.h>
32 #include <linux/mtd/partitions.h>
33 #include <linux/mtd/mtd.h>
34 #include <linux/mtd/physmap.h>
35 
36 #include <asm/mach-types.h>
37 #include <asm/mach/arch.h>
38 #include <asm/mach/map.h>
39 
40 #include "pxa27x.h"
41 #include <mach/audio.h>
42 #include <mach/palmtx.h>
43 #include <linux/platform_data/mmc-pxamci.h>
44 #include <linux/platform_data/video-pxafb.h>
45 #include <linux/platform_data/irda-pxaficp.h>
46 #include <linux/platform_data/keypad-pxa27x.h>
47 #include "udc.h"
48 #include <linux/platform_data/asoc-palm27x.h>
49 #include "palm27x.h"
50 
51 #include "generic.h"
52 #include "devices.h"
53 
54 /******************************************************************************
55  * Pin configuration
56  ******************************************************************************/
57 static unsigned long palmtx_pin_config[] __initdata = {
58 	/* MMC */
59 	GPIO32_MMC_CLK,
60 	GPIO92_MMC_DAT_0,
61 	GPIO109_MMC_DAT_1,
62 	GPIO110_MMC_DAT_2,
63 	GPIO111_MMC_DAT_3,
64 	GPIO112_MMC_CMD,
65 	GPIO14_GPIO,	/* SD detect */
66 	GPIO114_GPIO,	/* SD power */
67 	GPIO115_GPIO,	/* SD r/o switch */
68 
69 	/* AC97 */
70 	GPIO28_AC97_BITCLK,
71 	GPIO29_AC97_SDATA_IN_0,
72 	GPIO30_AC97_SDATA_OUT,
73 	GPIO31_AC97_SYNC,
74 	GPIO89_AC97_SYSCLK,
75 	GPIO95_AC97_nRESET,
76 
77 	/* IrDA */
78 	GPIO40_GPIO,	/* ir disable */
79 	GPIO46_FICP_RXD,
80 	GPIO47_FICP_TXD,
81 
82 	/* PWM */
83 	GPIO16_PWM0_OUT,
84 
85 	/* USB */
86 	GPIO13_GPIO,	/* usb detect */
87 	GPIO93_GPIO,	/* usb power */
88 
89 	/* PCMCIA */
90 	GPIO48_nPOE,
91 	GPIO49_nPWE,
92 	GPIO50_nPIOR,
93 	GPIO51_nPIOW,
94 	GPIO85_nPCE_1,
95 	GPIO54_nPCE_2,
96 	GPIO79_PSKTSEL,
97 	GPIO55_nPREG,
98 	GPIO56_nPWAIT,
99 	GPIO57_nIOIS16,
100 	GPIO94_GPIO,	/* wifi power 1 */
101 	GPIO108_GPIO,	/* wifi power 2 */
102 	GPIO116_GPIO,	/* wifi ready */
103 
104 	/* MATRIX KEYPAD */
105 	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
106 	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
107 	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
108 	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
109 	GPIO103_KP_MKOUT_0,
110 	GPIO104_KP_MKOUT_1,
111 	GPIO105_KP_MKOUT_2,
112 
113 	/* LCD */
114 	GPIOxx_LCD_TFT_16BPP,
115 
116 	/* FFUART */
117 	GPIO34_FFUART_RXD,
118 	GPIO39_FFUART_TXD,
119 
120 	/* NAND */
121 	GPIO15_nCS_1,
122 	GPIO18_RDY,
123 
124 	/* MISC. */
125 	GPIO10_GPIO,	/* hotsync button */
126 	GPIO12_GPIO,	/* power detect */
127 	GPIO107_GPIO,	/* earphone detect */
128 };
129 
130 /******************************************************************************
131  * NOR Flash
132  ******************************************************************************/
133 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
134 static struct mtd_partition palmtx_partitions[] = {
135 	{
136 		.name		= "Flash",
137 		.offset		= 0x00000000,
138 		.size		= MTDPART_SIZ_FULL,
139 		.mask_flags	= 0
140 	}
141 };
142 
143 static struct physmap_flash_data palmtx_flash_data[] = {
144 	{
145 		.width		= 2,			/* bankwidth in bytes */
146 		.parts		= palmtx_partitions,
147 		.nr_parts	= ARRAY_SIZE(palmtx_partitions)
148 	}
149 };
150 
151 static struct resource palmtx_flash_resource = {
152 	.start	= PXA_CS0_PHYS,
153 	.end	= PXA_CS0_PHYS + SZ_8M - 1,
154 	.flags	= IORESOURCE_MEM,
155 };
156 
157 static struct platform_device palmtx_flash = {
158 	.name		= "physmap-flash",
159 	.id		= 0,
160 	.resource	= &palmtx_flash_resource,
161 	.num_resources	= 1,
162 	.dev 		= {
163 		.platform_data = palmtx_flash_data,
164 	},
165 };
166 
palmtx_nor_init(void)167 static void __init palmtx_nor_init(void)
168 {
169 	platform_device_register(&palmtx_flash);
170 }
171 #else
palmtx_nor_init(void)172 static inline void palmtx_nor_init(void) {}
173 #endif
174 
175 /******************************************************************************
176  * GPIO keyboard
177  ******************************************************************************/
178 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
179 static const unsigned int palmtx_matrix_keys[] = {
180 	KEY(0, 0, KEY_POWER),
181 	KEY(0, 1, KEY_F1),
182 	KEY(0, 2, KEY_ENTER),
183 
184 	KEY(1, 0, KEY_F2),
185 	KEY(1, 1, KEY_F3),
186 	KEY(1, 2, KEY_F4),
187 
188 	KEY(2, 0, KEY_UP),
189 	KEY(2, 2, KEY_DOWN),
190 
191 	KEY(3, 0, KEY_RIGHT),
192 	KEY(3, 2, KEY_LEFT),
193 };
194 
195 static struct matrix_keymap_data palmtx_matrix_keymap_data = {
196 	.keymap			= palmtx_matrix_keys,
197 	.keymap_size		= ARRAY_SIZE(palmtx_matrix_keys),
198 };
199 
200 static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
201 	.matrix_key_rows	= 4,
202 	.matrix_key_cols	= 3,
203 	.matrix_keymap_data	= &palmtx_matrix_keymap_data,
204 
205 	.debounce_interval	= 30,
206 };
207 
palmtx_kpc_init(void)208 static void __init palmtx_kpc_init(void)
209 {
210 	pxa_set_keypad_info(&palmtx_keypad_platform_data);
211 }
212 #else
palmtx_kpc_init(void)213 static inline void palmtx_kpc_init(void) {}
214 #endif
215 
216 /******************************************************************************
217  * GPIO keys
218  ******************************************************************************/
219 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
220 static struct gpio_keys_button palmtx_pxa_buttons[] = {
221 	{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
222 };
223 
224 static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
225 	.buttons	= palmtx_pxa_buttons,
226 	.nbuttons	= ARRAY_SIZE(palmtx_pxa_buttons),
227 };
228 
229 static struct platform_device palmtx_pxa_keys = {
230 	.name	= "gpio-keys",
231 	.id	= -1,
232 	.dev	= {
233 		.platform_data = &palmtx_pxa_keys_data,
234 	},
235 };
236 
palmtx_keys_init(void)237 static void __init palmtx_keys_init(void)
238 {
239 	platform_device_register(&palmtx_pxa_keys);
240 }
241 #else
palmtx_keys_init(void)242 static inline void palmtx_keys_init(void) {}
243 #endif
244 
245 /******************************************************************************
246  * NAND Flash
247  ******************************************************************************/
248 #if defined(CONFIG_MTD_NAND_PLATFORM) || \
249 	defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
palmtx_nand_cmd_ctl(struct mtd_info * mtd,int cmd,unsigned int ctrl)250 static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
251 				 unsigned int ctrl)
252 {
253 	struct nand_chip *this = mtd_to_nand(mtd);
254 	char __iomem *nandaddr = this->IO_ADDR_W;
255 
256 	if (cmd == NAND_CMD_NONE)
257 		return;
258 
259 	if (ctrl & NAND_CLE)
260 		writeb(cmd, PALMTX_NAND_CLE_VIRT);
261 	else if (ctrl & NAND_ALE)
262 		writeb(cmd, PALMTX_NAND_ALE_VIRT);
263 	else
264 		writeb(cmd, nandaddr);
265 }
266 
267 static struct mtd_partition palmtx_partition_info[] = {
268 	[0] = {
269 		.name	= "palmtx-0",
270 		.offset	= 0,
271 		.size	= MTDPART_SIZ_FULL
272 	},
273 };
274 
275 struct platform_nand_data palmtx_nand_platdata = {
276 	.chip	= {
277 		.nr_chips		= 1,
278 		.chip_offset		= 0,
279 		.nr_partitions		= ARRAY_SIZE(palmtx_partition_info),
280 		.partitions		= palmtx_partition_info,
281 		.chip_delay		= 20,
282 	},
283 	.ctrl	= {
284 		.cmd_ctrl	= palmtx_nand_cmd_ctl,
285 	},
286 };
287 
288 static struct resource palmtx_nand_resource[] = {
289 	[0]	= {
290 		.start	= PXA_CS1_PHYS,
291 		.end	= PXA_CS1_PHYS + SZ_1M - 1,
292 		.flags	= IORESOURCE_MEM,
293 	},
294 };
295 
296 static struct platform_device palmtx_nand = {
297 	.name		= "gen_nand",
298 	.num_resources	= ARRAY_SIZE(palmtx_nand_resource),
299 	.resource	= palmtx_nand_resource,
300 	.id		= -1,
301 	.dev		= {
302 		.platform_data	= &palmtx_nand_platdata,
303 	}
304 };
305 
palmtx_nand_init(void)306 static void __init palmtx_nand_init(void)
307 {
308 	platform_device_register(&palmtx_nand);
309 }
310 #else
palmtx_nand_init(void)311 static inline void palmtx_nand_init(void) {}
312 #endif
313 
314 /******************************************************************************
315  * Machine init
316  ******************************************************************************/
317 static struct map_desc palmtx_io_desc[] __initdata = {
318 {
319 	.virtual	= (unsigned long)PALMTX_PCMCIA_VIRT,
320 	.pfn		= __phys_to_pfn(PALMTX_PCMCIA_PHYS),
321 	.length		= PALMTX_PCMCIA_SIZE,
322 	.type		= MT_DEVICE,
323 }, {
324 	.virtual	= (unsigned long)PALMTX_NAND_ALE_VIRT,
325 	.pfn		= __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
326 	.length		= SZ_1M,
327 	.type		= MT_DEVICE,
328 }, {
329 	.virtual	= (unsigned long)PALMTX_NAND_CLE_VIRT,
330 	.pfn		= __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
331 	.length		= SZ_1M,
332 	.type		= MT_DEVICE,
333 }
334 };
335 
palmtx_map_io(void)336 static void __init palmtx_map_io(void)
337 {
338 	pxa27x_map_io();
339 	iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
340 }
341 
palmtx_init(void)342 static void __init palmtx_init(void)
343 {
344 	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
345 	pxa_set_ffuart_info(NULL);
346 	pxa_set_btuart_info(NULL);
347 	pxa_set_stuart_info(NULL);
348 
349 	palm27x_mmc_init(GPIO_NR_PALMTX_SD_DETECT_N, GPIO_NR_PALMTX_SD_READONLY,
350 			GPIO_NR_PALMTX_SD_POWER, 0);
351 	palm27x_pm_init(PALMTX_STR_BASE);
352 	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
353 	palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
354 			GPIO_NR_PALMTX_USB_PULLUP, 1);
355 	palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
356 	palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
357 			GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
358 	palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
359 	palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
360 	palm27x_pmic_init();
361 	palmtx_kpc_init();
362 	palmtx_keys_init();
363 	palmtx_nor_init();
364 	palmtx_nand_init();
365 }
366 
367 MACHINE_START(PALMTX, "Palm T|X")
368 	.atag_offset	= 0x100,
369 	.map_io		= palmtx_map_io,
370 	.nr_irqs	= PXA_NR_IRQS,
371 	.init_irq	= pxa27x_init_irq,
372 	.handle_irq	= pxa27x_handle_irq,
373 	.init_time	= pxa_timer_init,
374 	.init_machine	= palmtx_init,
375 	.restart	= pxa_restart,
376 MACHINE_END
377