PageRenderTime 38ms CodeModel.GetById 15ms app.highlight 19ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/arm/mach-pxa/palmtx.c

https://github.com/AICP/kernel_asus_grouper
C | 373 lines | 281 code | 45 blank | 47 comment | 9 complexity | 406dc16759858f5f8da4a85d661d50cc MD5 | raw file
  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/nand.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 <mach/pxa27x.h>
 41#include <mach/audio.h>
 42#include <mach/palmtx.h>
 43#include <mach/mmc.h>
 44#include <mach/pxafb.h>
 45#include <mach/irda.h>
 46#include <plat/pxa27x_keypad.h>
 47#include <mach/udc.h>
 48#include <mach/palmasoc.h>
 49#include <mach/palm27x.h>
 50
 51#include "generic.h"
 52#include "devices.h"
 53
 54/******************************************************************************
 55 * Pin configuration
 56 ******************************************************************************/
 57static 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)
134static struct mtd_partition palmtx_partitions[] = {
135	{
136		.name		= "Flash",
137		.offset		= 0x00000000,
138		.size		= MTDPART_SIZ_FULL,
139		.mask_flags	= 0
140	}
141};
142
143static 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
151static struct resource palmtx_flash_resource = {
152	.start	= PXA_CS0_PHYS,
153	.end	= PXA_CS0_PHYS + SZ_8M - 1,
154	.flags	= IORESOURCE_MEM,
155};
156
157static 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
167static void __init palmtx_nor_init(void)
168{
169	platform_device_register(&palmtx_flash);
170}
171#else
172static 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)
179static 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
195static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
196	.matrix_key_rows	= 4,
197	.matrix_key_cols	= 3,
198	.matrix_key_map		= palmtx_matrix_keys,
199	.matrix_key_map_size	= ARRAY_SIZE(palmtx_matrix_keys),
200
201	.debounce_interval	= 30,
202};
203
204static void __init palmtx_kpc_init(void)
205{
206	pxa_set_keypad_info(&palmtx_keypad_platform_data);
207}
208#else
209static inline void palmtx_kpc_init(void) {}
210#endif
211
212/******************************************************************************
213 * GPIO keys
214 ******************************************************************************/
215#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
216static struct gpio_keys_button palmtx_pxa_buttons[] = {
217	{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
218};
219
220static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
221	.buttons	= palmtx_pxa_buttons,
222	.nbuttons	= ARRAY_SIZE(palmtx_pxa_buttons),
223};
224
225static struct platform_device palmtx_pxa_keys = {
226	.name	= "gpio-keys",
227	.id	= -1,
228	.dev	= {
229		.platform_data = &palmtx_pxa_keys_data,
230	},
231};
232
233static void __init palmtx_keys_init(void)
234{
235	platform_device_register(&palmtx_pxa_keys);
236}
237#else
238static inline void palmtx_keys_init(void) {}
239#endif
240
241/******************************************************************************
242 * NAND Flash
243 ******************************************************************************/
244#if defined(CONFIG_MTD_NAND_PLATFORM) || \
245	defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
246static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
247				 unsigned int ctrl)
248{
249	struct nand_chip *this = mtd->priv;
250	unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;
251
252	if (cmd == NAND_CMD_NONE)
253		return;
254
255	if (ctrl & NAND_CLE)
256		writeb(cmd, PALMTX_NAND_CLE_VIRT);
257	else if (ctrl & NAND_ALE)
258		writeb(cmd, PALMTX_NAND_ALE_VIRT);
259	else
260		writeb(cmd, nandaddr);
261}
262
263static struct mtd_partition palmtx_partition_info[] = {
264	[0] = {
265		.name	= "palmtx-0",
266		.offset	= 0,
267		.size	= MTDPART_SIZ_FULL
268	},
269};
270
271static const char *palmtx_part_probes[] = { "cmdlinepart", NULL };
272
273struct platform_nand_data palmtx_nand_platdata = {
274	.chip	= {
275		.nr_chips		= 1,
276		.chip_offset		= 0,
277		.nr_partitions		= ARRAY_SIZE(palmtx_partition_info),
278		.partitions		= palmtx_partition_info,
279		.chip_delay		= 20,
280		.part_probe_types 	= palmtx_part_probes,
281	},
282	.ctrl	= {
283		.cmd_ctrl	= palmtx_nand_cmd_ctl,
284	},
285};
286
287static struct resource palmtx_nand_resource[] = {
288	[0]	= {
289		.start	= PXA_CS1_PHYS,
290		.end	= PXA_CS1_PHYS + SZ_1M - 1,
291		.flags	= IORESOURCE_MEM,
292	},
293};
294
295static struct platform_device palmtx_nand = {
296	.name		= "gen_nand",
297	.num_resources	= ARRAY_SIZE(palmtx_nand_resource),
298	.resource	= palmtx_nand_resource,
299	.id		= -1,
300	.dev		= {
301		.platform_data	= &palmtx_nand_platdata,
302	}
303};
304
305static void __init palmtx_nand_init(void)
306{
307	platform_device_register(&palmtx_nand);
308}
309#else
310static inline void palmtx_nand_init(void) {}
311#endif
312
313/******************************************************************************
314 * Machine init
315 ******************************************************************************/
316static struct map_desc palmtx_io_desc[] __initdata = {
317{
318	.virtual	= PALMTX_PCMCIA_VIRT,
319	.pfn		= __phys_to_pfn(PALMTX_PCMCIA_PHYS),
320	.length		= PALMTX_PCMCIA_SIZE,
321	.type		= MT_DEVICE,
322}, {
323	.virtual	= PALMTX_NAND_ALE_VIRT,
324	.pfn		= __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
325	.length		= SZ_1M,
326	.type		= MT_DEVICE,
327}, {
328	.virtual	= PALMTX_NAND_CLE_VIRT,
329	.pfn		= __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
330	.length		= SZ_1M,
331	.type		= MT_DEVICE,
332}
333};
334
335static void __init palmtx_map_io(void)
336{
337	pxa27x_map_io();
338	iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
339}
340
341static void __init palmtx_init(void)
342{
343	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
344	pxa_set_ffuart_info(NULL);
345	pxa_set_btuart_info(NULL);
346	pxa_set_stuart_info(NULL);
347
348	palm27x_mmc_init(GPIO_NR_PALMTX_SD_DETECT_N, GPIO_NR_PALMTX_SD_READONLY,
349			GPIO_NR_PALMTX_SD_POWER, 0);
350	palm27x_pm_init(PALMTX_STR_BASE);
351	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
352	palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
353			GPIO_NR_PALMTX_USB_PULLUP, 1);
354	palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
355	palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
356			GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
357	palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
358	palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
359	palm27x_pmic_init();
360	palmtx_kpc_init();
361	palmtx_keys_init();
362	palmtx_nor_init();
363	palmtx_nand_init();
364}
365
366MACHINE_START(PALMTX, "Palm T|X")
367	.boot_params	= 0xa0000100,
368	.map_io		= palmtx_map_io,
369	.init_irq	= pxa27x_init_irq,
370	.handle_irq	= pxa27x_handle_irq,
371	.timer		= &pxa_timer,
372	.init_machine	= palmtx_init
373MACHINE_END