Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
palmtx.c
Go to the documentation of this file.
1 /*
2  * Hardware definitions for PalmTX
3  *
4  * Author: Marek Vasut <[email protected]>
5  *
6  * Based on work of:
7  * Alex Osborne <[email protected]>
8  * Cristiano P. <[email protected]>
9  * Jan Herman <[email protected]>
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>
47 #include <mach/udc.h>
49 #include <mach/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 */
65  GPIO14_GPIO, /* SD detect */
66  GPIO114_GPIO, /* SD power */
67  GPIO115_GPIO, /* SD r/o switch */
68 
69  /* AC97 */
76 
77  /* IrDA */
78  GPIO40_GPIO, /* ir disable */
81 
82  /* PWM */
84 
85  /* USB */
86  GPIO13_GPIO, /* usb detect */
87  GPIO93_GPIO, /* usb power */
88 
89  /* PCMCIA */
100  GPIO94_GPIO, /* wifi power 1 */
101  GPIO108_GPIO, /* wifi power 2 */
102  GPIO116_GPIO, /* wifi ready */
103 
104  /* MATRIX KEYPAD */
112 
113  /* LCD */
115 
116  /* FFUART */
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 
167 static void __init palmtx_nor_init(void)
168 {
169  platform_device_register(&palmtx_flash);
170 }
171 #else
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 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 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 
204 static void __init palmtx_kpc_init(void)
205 {
206  pxa_set_keypad_info(&palmtx_keypad_platform_data);
207 }
208 #else
209 static 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)
216 static struct gpio_keys_button palmtx_pxa_buttons[] = {
217  {KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
218 };
219 
220 static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
221  .buttons = palmtx_pxa_buttons,
222  .nbuttons = ARRAY_SIZE(palmtx_pxa_buttons),
223 };
224 
225 static 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 
233 static void __init palmtx_keys_init(void)
234 {
235  platform_device_register(&palmtx_pxa_keys);
236 }
237 #else
238 static 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)
246 static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
247  unsigned int ctrl)
248 {
249  struct nand_chip *this = mtd->priv;
250  char __iomem *nandaddr = this->IO_ADDR_W;
251 
252  if (cmd == NAND_CMD_NONE)
253  return;
254 
255  if (ctrl & NAND_CLE)
257  else if (ctrl & NAND_ALE)
259  else
260  writeb(cmd, nandaddr);
261 }
262 
263 static struct mtd_partition palmtx_partition_info[] = {
264  [0] = {
265  .name = "palmtx-0",
266  .offset = 0,
267  .size = MTDPART_SIZ_FULL
268  },
269 };
270 
271 struct platform_nand_data palmtx_nand_platdata = {
272  .chip = {
273  .nr_chips = 1,
274  .chip_offset = 0,
275  .nr_partitions = ARRAY_SIZE(palmtx_partition_info),
276  .partitions = palmtx_partition_info,
277  .chip_delay = 20,
278  },
279  .ctrl = {
280  .cmd_ctrl = palmtx_nand_cmd_ctl,
281  },
282 };
283 
284 static struct resource palmtx_nand_resource[] = {
285  [0] = {
286  .start = PXA_CS1_PHYS,
287  .end = PXA_CS1_PHYS + SZ_1M - 1,
288  .flags = IORESOURCE_MEM,
289  },
290 };
291 
292 static struct platform_device palmtx_nand = {
293  .name = "gen_nand",
294  .num_resources = ARRAY_SIZE(palmtx_nand_resource),
295  .resource = palmtx_nand_resource,
296  .id = -1,
297  .dev = {
298  .platform_data = &palmtx_nand_platdata,
299  }
300 };
301 
302 static void __init palmtx_nand_init(void)
303 {
304  platform_device_register(&palmtx_nand);
305 }
306 #else
307 static inline void palmtx_nand_init(void) {}
308 #endif
309 
310 /******************************************************************************
311  * Machine init
312  ******************************************************************************/
313 static struct map_desc palmtx_io_desc[] __initdata = {
314 {
315  .virtual = (unsigned long)PALMTX_PCMCIA_VIRT,
317  .length = PALMTX_PCMCIA_SIZE,
318  .type = MT_DEVICE,
319 }, {
320  .virtual = (unsigned long)PALMTX_NAND_ALE_VIRT,
322  .length = SZ_1M,
323  .type = MT_DEVICE,
324 }, {
325  .virtual = (unsigned long)PALMTX_NAND_CLE_VIRT,
327  .length = SZ_1M,
328  .type = MT_DEVICE,
329 }
330 };
331 
332 static void __init palmtx_map_io(void)
333 {
334  pxa27x_map_io();
335  iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
336 }
337 
338 static void __init palmtx_init(void)
339 {
340  pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
344 
347  palm27x_pm_init(PALMTX_STR_BASE);
348  palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
349  palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
351  palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
355  palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
356  palm27x_pmic_init();
357  palmtx_kpc_init();
358  palmtx_keys_init();
359  palmtx_nor_init();
360  palmtx_nand_init();
361 }
362 
363 MACHINE_START(PALMTX, "Palm T|X")
364  .atag_offset = 0x100,
365  .map_io = palmtx_map_io,
366  .nr_irqs = PXA_NR_IRQS,
367  .init_irq = pxa27x_init_irq,
368  .handle_irq = pxa27x_handle_irq,
369  .timer = &pxa_timer,
370  .init_machine = palmtx_init,
371  .restart = pxa_restart,