aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek VaĊĦut <marek.vasut@gmail.com>2008-07-07 12:25:46 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-07-10 07:15:31 -0400
commitb5e4ad57eeffef0ac274413f83be4ef903719ea4 (patch)
tree46f39439864a273809f8f603466c24d9095d3d65
parentf974a8ec96571535ee07880a023bcce0e3f2c76b (diff)
[ARM] 5153/1: Add support for PalmTX handheld computer
PalmTX is PXA27x based device with wifi, bluetooth, touchscreen, sdio slot, irda, keypad, nand flash, pxa framebuffer, serial and usb gadget interface. Supported by this patch is pxafb, touchscreen, irda, keypad and sdio slot. Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--MAINTAINERS6
-rw-r--r--arch/arm/mach-pxa/Kconfig14
-rw-r--r--arch/arm/mach-pxa/Makefile1
-rw-r--r--arch/arm/mach-pxa/palmtx.c342
-rw-r--r--include/asm-arm/arch-pxa/palmtx.h106
5 files changed, 469 insertions, 0 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 8f0ec46a7096..5375740cac64 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -571,6 +571,12 @@ P: Dirk Opfer
571M: dirk@opfer-online.de 571M: dirk@opfer-online.de
572S: Maintained 572S: Maintained
573 573
574ARM/PALMTX SUPPORT
575P: Marek Vasut
576M: marek.vasut@gmail.com
577W: http://hackndev.com
578S: Maintained
579
574ARM/PLEB SUPPORT 580ARM/PLEB SUPPORT
575P: Peter Chubb 581P: Peter Chubb
576M: pleb@gelato.unsw.edu.au 582M: pleb@gelato.unsw.edu.au
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig
index faa2c3f6c1af..2793076bd33a 100644
--- a/arch/arm/mach-pxa/Kconfig
+++ b/arch/arm/mach-pxa/Kconfig
@@ -199,6 +199,20 @@ config MACH_PCM027
199 select IWMMXT 199 select IWMMXT
200 select PXA_SSP 200 select PXA_SSP
201 201
202config ARCH_PXA_PALM
203 bool "PXA based Palm PDAs"
204 select HAVE_PWM
205
206config MACH_PALMTX
207 bool "Palm T|X"
208 default y
209 depends on ARCH_PXA_PALM
210 select PXA27x
211 select IWMMXT
212 help
213 Say Y here if you intend to run this kernel on a Palm T|X
214 handheld computer.
215
202config MACH_PCM990_BASEBOARD 216config MACH_PCM990_BASEBOARD
203 bool "PHYTEC PCM-990 development board" 217 bool "PHYTEC PCM-990 development board"
204 select HAVE_PWM 218 select HAVE_PWM
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile
index c4dfbe87fc4e..d7dc3a76e33c 100644
--- a/arch/arm/mach-pxa/Makefile
+++ b/arch/arm/mach-pxa/Makefile
@@ -37,6 +37,7 @@ obj-$(CONFIG_MACH_TOSA) += tosa.o
37obj-$(CONFIG_MACH_EM_X270) += em-x270.o 37obj-$(CONFIG_MACH_EM_X270) += em-x270.o
38obj-$(CONFIG_MACH_MAGICIAN) += magician.o 38obj-$(CONFIG_MACH_MAGICIAN) += magician.o
39obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o 39obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o
40obj-$(CONFIG_MACH_PALMTX)+= palmtx.o
40 41
41ifeq ($(CONFIG_MACH_ZYLONITE),y) 42ifeq ($(CONFIG_MACH_ZYLONITE),y)
42 obj-y += zylonite.o 43 obj-y += zylonite.o
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
new file mode 100644
index 000000000000..ae8973279c20
--- /dev/null
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -0,0 +1,342 @@
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/pwm_backlight.h>
26#include <linux/gpio.h>
27
28#include <asm/mach-types.h>
29#include <asm/mach/arch.h>
30#include <asm/mach/map.h>
31
32#include <asm/arch/audio.h>
33#include <asm/arch/palmtx.h>
34#include <asm/arch/mmc.h>
35#include <asm/arch/pxafb.h>
36#include <asm/arch/pxa-regs.h>
37#include <asm/arch/mfp-pxa27x.h>
38#include <asm/arch/irda.h>
39#include <asm/arch/pxa27x_keypad.h>
40#include <asm/arch/udc.h>
41
42#include "generic.h"
43#include "devices.h"
44
45/******************************************************************************
46 * Pin configuration
47 ******************************************************************************/
48static unsigned long palmtx_pin_config[] __initdata = {
49 /* MMC */
50 GPIO32_MMC_CLK,
51 GPIO92_MMC_DAT_0,
52 GPIO109_MMC_DAT_1,
53 GPIO110_MMC_DAT_2,
54 GPIO111_MMC_DAT_3,
55 GPIO112_MMC_CMD,
56
57 /* AC97 */
58 GPIO28_AC97_BITCLK,
59 GPIO29_AC97_SDATA_IN_0,
60 GPIO30_AC97_SDATA_OUT,
61 GPIO31_AC97_SYNC,
62
63 /* IrDA */
64 GPIO46_FICP_RXD,
65 GPIO47_FICP_TXD,
66
67 /* PWM */
68 GPIO16_PWM0_OUT,
69
70 /* USB */
71 GPIO13_GPIO,
72};
73
74/******************************************************************************
75 * SD/MMC card controller
76 ******************************************************************************/
77static int palmtx_mci_init(struct device *dev, irq_handler_t palmtx_detect_int,
78 void *data)
79{
80 int err = 0;
81
82 /* Setup an interrupt for detecting card insert/remove events */
83 err = request_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, palmtx_detect_int,
84 IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
85 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
86 "SD/MMC card detect", data);
87 if (err) {
88 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
89 __func__);
90 return err;
91 }
92
93 err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER");
94 if (err)
95 goto pwr_err;
96
97 err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY");
98 if (err)
99 goto ro_err;
100
101 printk(KERN_DEBUG "%s: irq registered\n", __func__);
102
103 return 0;
104
105ro_err:
106 gpio_free(GPIO_NR_PALMTX_SD_POWER);
107pwr_err:
108 free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data);
109 return err;
110}
111
112static void palmtx_mci_exit(struct device *dev, void *data)
113{
114 gpio_free(GPIO_NR_PALMTX_SD_READONLY);
115 gpio_free(GPIO_NR_PALMTX_SD_POWER);
116 free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data);
117}
118
119static void palmtx_mci_power(struct device *dev, unsigned int vdd)
120{
121 struct pxamci_platform_data *p_d = dev->platform_data;
122 gpio_set_value(GPIO_NR_PALMTX_SD_POWER, p_d->ocr_mask & (1 << vdd));
123}
124
125static int palmtx_mci_get_ro(struct device *dev)
126{
127 return gpio_get_value(GPIO_NR_PALMTX_SD_READONLY);
128}
129
130static struct pxamci_platform_data palmtx_mci_platform_data = {
131 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
132 .setpower = palmtx_mci_power,
133 .get_ro = palmtx_mci_get_ro,
134 .init = palmtx_mci_init,
135 .exit = palmtx_mci_exit,
136};
137
138/******************************************************************************
139 * GPIO keyboard
140 ******************************************************************************/
141static unsigned int palmtx_matrix_keys[] = {
142 KEY(0, 0, KEY_POWER),
143 KEY(0, 1, KEY_F1),
144 KEY(0, 2, KEY_ENTER),
145
146 KEY(1, 0, KEY_F2),
147 KEY(1, 1, KEY_F3),
148 KEY(1, 2, KEY_F4),
149
150 KEY(2, 0, KEY_UP),
151 KEY(2, 2, KEY_DOWN),
152
153 KEY(3, 0, KEY_RIGHT),
154 KEY(3, 2, KEY_LEFT),
155
156};
157
158static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
159 .matrix_key_rows = 4,
160 .matrix_key_cols = 3,
161 .matrix_key_map = palmtx_matrix_keys,
162 .matrix_key_map_size = ARRAY_SIZE(palmtx_matrix_keys),
163
164 .debounce_interval = 30,
165};
166
167/******************************************************************************
168 * GPIO keys
169 ******************************************************************************/
170static struct gpio_keys_button palmtx_pxa_buttons[] = {
171 {KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
172};
173
174static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
175 .buttons = palmtx_pxa_buttons,
176 .nbuttons = ARRAY_SIZE(palmtx_pxa_buttons),
177};
178
179static struct platform_device palmtx_pxa_keys = {
180 .name = "gpio-keys",
181 .id = -1,
182 .dev = {
183 .platform_data = &palmtx_pxa_keys_data,
184 },
185};
186
187/******************************************************************************
188 * Backlight
189 ******************************************************************************/
190static int palmtx_backlight_init(struct device *dev)
191{
192 int ret;
193
194 ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER");
195 if (ret)
196 goto err;
197 ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER");
198 if (ret)
199 goto err2;
200
201 return 0;
202err2:
203 gpio_free(GPIO_NR_PALMTX_BL_POWER);
204err:
205 return ret;
206}
207
208static int palmtx_backlight_notify(int brightness)
209{
210 gpio_set_value(GPIO_NR_PALMTX_BL_POWER, brightness);
211 gpio_set_value(GPIO_NR_PALMTX_LCD_POWER, brightness);
212 return brightness;
213}
214
215static void palmtx_backlight_exit(struct device *dev)
216{
217 gpio_free(GPIO_NR_PALMTX_BL_POWER);
218 gpio_free(GPIO_NR_PALMTX_LCD_POWER);
219}
220
221static struct platform_pwm_backlight_data palmtx_backlight_data = {
222 .pwm_id = 0,
223 .max_brightness = PALMTX_MAX_INTENSITY,
224 .dft_brightness = PALMTX_MAX_INTENSITY,
225 .pwm_period_ns = PALMTX_PERIOD_NS,
226 .init = palmtx_backlight_init,
227 .notify = palmtx_backlight_notify,
228 .exit = palmtx_backlight_exit,
229};
230
231static struct platform_device palmtx_backlight = {
232 .name = "pwm-backlight",
233 .dev = {
234 .parent = &pxa27x_device_pwm0.dev,
235 .platform_data = &palmtx_backlight_data,
236 },
237};
238
239/******************************************************************************
240 * IrDA
241 ******************************************************************************/
242static void palmtx_irda_transceiver_mode(struct device *dev, int mode)
243{
244 gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF);
245 pxa2xx_transceiver_mode(dev, mode);
246}
247
248static struct pxaficp_platform_data palmtx_ficp_platform_data = {
249 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
250 .transceiver_mode = palmtx_irda_transceiver_mode,
251};
252
253/******************************************************************************
254 * UDC
255 ******************************************************************************/
256static void palmtx_udc_command(int cmd)
257{
258 gpio_set_value(GPIO_NR_PALMTX_USB_POWER, !cmd);
259 udelay(50);
260 gpio_set_value(GPIO_NR_PALMTX_USB_PULLUP, !cmd);
261}
262
263static struct pxa2xx_udc_mach_info palmtx_udc_info __initdata = {
264 .gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N,
265 .gpio_vbus_inverted = 1,
266 .udc_command = palmtx_udc_command,
267};
268
269/******************************************************************************
270 * Framebuffer
271 ******************************************************************************/
272static struct pxafb_mode_info palmtx_lcd_modes[] = {
273{
274 .pixclock = 57692,
275 .xres = 320,
276 .yres = 480,
277 .bpp = 16,
278
279 .left_margin = 32,
280 .right_margin = 1,
281 .upper_margin = 7,
282 .lower_margin = 1,
283
284 .hsync_len = 4,
285 .vsync_len = 1,
286},
287};
288
289static struct pxafb_mach_info palmtx_lcd_screen = {
290 .modes = palmtx_lcd_modes,
291 .num_modes = ARRAY_SIZE(palmtx_lcd_modes),
292 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
293};
294
295/******************************************************************************
296 * Machine init
297 ******************************************************************************/
298static struct platform_device *devices[] __initdata = {
299#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
300 &palmtx_pxa_keys,
301#endif
302 &palmtx_backlight,
303};
304
305static struct map_desc palmtx_io_desc[] __initdata = {
306{
307 .virtual = PALMTX_PCMCIA_VIRT,
308 .pfn = __phys_to_pfn(PALMTX_PCMCIA_PHYS),
309 .length = PALMTX_PCMCIA_SIZE,
310 .type = MT_DEVICE
311},
312};
313
314static void __init palmtx_map_io(void)
315{
316 pxa_map_io();
317 iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
318}
319
320static void __init palmtx_init(void)
321{
322 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
323
324 set_pxa_fb_info(&palmtx_lcd_screen);
325 pxa_set_mci_info(&palmtx_mci_platform_data);
326 pxa_set_udc_info(&palmtx_udc_info);
327 pxa_set_ac97_info(NULL);
328 pxa_set_ficp_info(&palmtx_ficp_platform_data);
329 pxa_set_keypad_info(&palmtx_keypad_platform_data);
330
331 platform_add_devices(devices, ARRAY_SIZE(devices));
332}
333
334MACHINE_START(PALMTX, "Palm T|X")
335 .phys_io = PALMTX_PHYS_IO_START,
336 .io_pg_offst = io_p2v(0x40000000),
337 .boot_params = 0xa0000100,
338 .map_io = palmtx_map_io,
339 .init_irq = pxa27x_init_irq,
340 .timer = &pxa_timer,
341 .init_machine = palmtx_init
342MACHINE_END
diff --git a/include/asm-arm/arch-pxa/palmtx.h b/include/asm-arm/arch-pxa/palmtx.h
new file mode 100644
index 000000000000..1e8bccbda510
--- /dev/null
+++ b/include/asm-arm/arch-pxa/palmtx.h
@@ -0,0 +1,106 @@
1/*
2 * GPIOs and interrupts for Palm T|X Handheld Computer
3 *
4 * Based on palmld-gpio.h by Alex Osborne
5 *
6 * Authors: Marek Vasut <marek.vasut@gmail.com>
7 * Cristiano P. <cristianop@users.sourceforge.net>
8 * Jan Herman <2hp@seznam.cz>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15
16#ifndef _INCLUDE_PALMTX_H_
17#define _INCLUDE_PALMTX_H_
18
19/** HERE ARE GPIOs **/
20
21/* GPIOs */
22#define GPIO_NR_PALMTX_GPIO_RESET 1
23
24#define GPIO_NR_PALMTX_POWER_DETECT 12 /* 90 */
25#define GPIO_NR_PALMTX_HOTSYNC_BUTTON_N 10
26#define GPIO_NR_PALMTX_EARPHONE_DETECT 107
27
28/* SD/MMC */
29#define GPIO_NR_PALMTX_SD_DETECT_N 14
30#define GPIO_NR_PALMTX_SD_POWER 114 /* probably */
31#define GPIO_NR_PALMTX_SD_READONLY 115 /* probably */
32
33/* TOUCHSCREEN */
34#define GPIO_NR_PALMTX_WM9712_IRQ 27
35
36/* IRDA - disable GPIO connected to SD pin of tranceiver (TFBS4710?) ? */
37#define GPIO_NR_PALMTX_IR_DISABLE 40
38
39/* USB */
40#define GPIO_NR_PALMTX_USB_DETECT_N 13
41#define GPIO_NR_PALMTX_USB_POWER 95
42#define GPIO_NR_PALMTX_USB_PULLUP 93
43
44/* LCD/BACKLIGHT */
45#define GPIO_NR_PALMTX_BL_POWER 84
46#define GPIO_NR_PALMTX_LCD_POWER 96
47
48/* LCD BORDER */
49#define GPIO_NR_PALMTX_BORDER_SWITCH 98
50#define GPIO_NR_PALMTX_BORDER_SELECT 22
51
52/* BLUETOOTH */
53#define GPIO_NR_PALMTX_BT_POWER 17
54#define GPIO_NR_PALMTX_BT_RESET 83
55
56/* PCMCIA (WiFi) */
57#define GPIO_NR_PALMTX_PCMCIA_POWER1 94
58#define GPIO_NR_PALMTX_PCMCIA_POWER2 108
59#define GPIO_NR_PALMTX_PCMCIA_RESET 79
60#define GPIO_NR_PALMTX_PCMCIA_READY 116
61
62/* NAND Flash ... this GPIO may be incorrect! */
63#define GPIO_NR_PALMTX_NAND_BUFFER_DIR 79
64
65/* INTERRUPTS */
66#define IRQ_GPIO_PALMTX_SD_DETECT_N IRQ_GPIO(GPIO_NR_PALMTX_SD_DETECT_N)
67#define IRQ_GPIO_PALMTX_WM9712_IRQ IRQ_GPIO(GPIO_NR_PALMTX_WM9712_IRQ)
68#define IRQ_GPIO_PALMTX_USB_DETECT IRQ_GPIO(GPIO_NR_PALMTX_USB_DETECT)
69#define IRQ_GPIO_PALMTX_GPIO_RESET IRQ_GPIO(GPIO_NR_PALMTX_GPIO_RESET)
70
71/** HERE ARE INIT VALUES **/
72
73/* Various addresses */
74#define PALMTX_PCMCIA_PHYS 0x28000000
75#define PALMTX_PCMCIA_VIRT 0xf0000000
76#define PALMTX_PCMCIA_SIZE 0x100000
77
78#define PALMTX_PHYS_RAM_START 0xa0000000
79#define PALMTX_PHYS_IO_START 0x40000000
80
81#define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */
82#define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */
83
84/* TOUCHSCREEN */
85#define AC97_LINK_FRAME 21
86
87
88/* BATTERY */
89#define PALMTX_BAT_MAX_VOLTAGE 4000 /* 4.00v current voltage */
90#define PALMTX_BAT_MIN_VOLTAGE 3550 /* 3.55v critical voltage */
91#define PALMTX_BAT_MAX_CURRENT 0 /* unknokn */
92#define PALMTX_BAT_MIN_CURRENT 0 /* unknown */
93#define PALMTX_BAT_MAX_CHARGE 1 /* unknown */
94#define PALMTX_BAT_MIN_CHARGE 1 /* unknown */
95#define PALMTX_MAX_LIFE_MINS 360 /* on-life in minutes */
96
97#define PALMTX_BAT_MEASURE_DELAY (HZ * 1)
98
99/* BACKLIGHT */
100#define PALMTX_MAX_INTENSITY 0xFE
101#define PALMTX_DEFAULT_INTENSITY 0x7E
102#define PALMTX_LIMIT_MASK 0x7F
103#define PALMTX_PRESCALER 0x3F
104#define PALMTX_PERIOD_NS 3500
105
106#endif