Blame view

arch/arm/mach-pxa/palmtreo.c 13.9 KB
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
1
  /*
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
2
3
4
5
   * Hardware definitions for Palm Treo smartphones
   *
   * currently supported:
   *     Palm Treo 680 (GSM)
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
6
   *     Palm Centro 685 (GSM)
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   *
   * Author:     Tomas Cech <sleep_walker@suse.cz>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * (find more info at www.hackndev.com)
   *
   */
  
  #include <linux/platform_device.h>
  #include <linux/delay.h>
  #include <linux/irq.h>
  #include <linux/gpio_keys.h>
  #include <linux/input.h>
8d717a52d   Russell King   ARM: Convert plat...
23
  #include <linux/memblock.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
24
25
26
  #include <linux/pda_power.h>
  #include <linux/pwm_backlight.h>
  #include <linux/gpio.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
27
  #include <linux/power_supply.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
28
29
30
31
32
33
34
35
36
  #include <linux/w1-gpio.h>
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  
  #include <mach/pxa27x.h>
  #include <mach/pxa27x-udc.h>
  #include <mach/audio.h>
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
37
  #include <mach/palmtreo.h>
293b2da1b   Arnd Bergmann   ARM: pxa: move pl...
38
39
40
41
  #include <linux/platform_data/mmc-pxamci.h>
  #include <linux/platform_data/video-pxafb.h>
  #include <linux/platform_data/irda-pxaficp.h>
  #include <linux/platform_data/keypad-pxa27x.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
42
  #include <mach/udc.h>
293b2da1b   Arnd Bergmann   ARM: pxa: move pl...
43
  #include <linux/platform_data/usb-ohci-pxa27x.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
44
  #include <mach/pxa2xx-regs.h>
293b2da1b   Arnd Bergmann   ARM: pxa: move pl...
45
46
  #include <linux/platform_data/asoc-palm27x.h>
  #include <linux/platform_data/camera-pxa.h>
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
47
  #include <mach/palm27x.h>
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
48
49
50
51
52
53
54
55
56
  
  #include <sound/pxa2xx-lib.h>
  
  #include "generic.h"
  #include "devices.h"
  
  /******************************************************************************
   * Pin configuration
   ******************************************************************************/
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
57
  static unsigned long treo_pin_config[] __initdata = {
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
58
59
60
61
62
63
64
  	/* MMC */
  	GPIO32_MMC_CLK,
  	GPIO92_MMC_DAT_0,
  	GPIO109_MMC_DAT_1,
  	GPIO110_MMC_DAT_2,
  	GPIO111_MMC_DAT_3,
  	GPIO112_MMC_CMD,
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  	GPIO113_GPIO,				/* SD detect */
  
  	/* AC97 */
  	GPIO28_AC97_BITCLK,
  	GPIO29_AC97_SDATA_IN_0,
  	GPIO30_AC97_SDATA_OUT,
  	GPIO31_AC97_SYNC,
  	GPIO89_AC97_SYSCLK,
  	GPIO95_AC97_nRESET,
  
  	/* IrDA */
  	GPIO46_FICP_RXD,
  	GPIO47_FICP_TXD,
  
  	/* PWM */
  	GPIO16_PWM0_OUT,
  
  	/* USB */
  	GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,	/* usb detect */
  
  	/* MATRIX KEYPAD */
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
86
87
88
89
  	GPIO101_KP_MKIN_1,
  	GPIO102_KP_MKIN_2,
  	GPIO97_KP_MKIN_3,
  	GPIO98_KP_MKIN_4,
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
90
91
92
93
94
95
96
97
98
99
  	GPIO91_KP_MKIN_6,
  	GPIO13_KP_MKIN_7,
  	GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH,
  	GPIO104_KP_MKOUT_1,
  	GPIO105_KP_MKOUT_2,
  	GPIO106_KP_MKOUT_3,
  	GPIO107_KP_MKOUT_4,
  	GPIO108_KP_MKOUT_5,
  	GPIO96_KP_MKOUT_6,
  	GPIO93_KP_DKIN_0 | WAKEUP_ON_LEVEL_HIGH,	/* Hotsync button */
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
  	/* Quick Capture Interface */
  	GPIO84_CIF_FV,
  	GPIO85_CIF_LV,
  	GPIO53_CIF_MCLK,
  	GPIO54_CIF_PCLK,
  	GPIO81_CIF_DD_0,
  	GPIO55_CIF_DD_1,
  	GPIO51_CIF_DD_2,
  	GPIO50_CIF_DD_3,
  	GPIO52_CIF_DD_4,
  	GPIO48_CIF_DD_5,
  	GPIO17_CIF_DD_6,
  	GPIO12_CIF_DD_7,
  
  	/* I2C */
  	GPIO117_I2C_SCL,
  	GPIO118_I2C_SDA,
  
  	/* GSM */
  	GPIO14_GPIO | WAKEUP_ON_EDGE_BOTH,	/* GSM host wake up */
  	GPIO34_FFUART_RXD,
  	GPIO35_FFUART_CTS,
  	GPIO39_FFUART_TXD,
  	GPIO41_FFUART_RTS,
  
  	/* MISC. */
  	GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,	/* external power detect */
  	GPIO15_GPIO | WAKEUP_ON_EDGE_BOTH,	/* silent switch */
  	GPIO116_GPIO,				/* headphone detect */
  	GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH,	/* bluetooth host wake up */
  };
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
131
132
133
134
135
136
137
  #ifdef CONFIG_MACH_TREO680
  static unsigned long treo680_pin_config[] __initdata = {
  	GPIO33_GPIO,    /* SD read only */
  
  	/* MATRIX KEYPAD - different wake up source */
  	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
  	GPIO99_KP_MKIN_5,
2c33727a6   Mike Dunn   ARM: palmtreo: fi...
138
139
140
141
142
143
  
  	/* LCD... L_BIAS alt fn not configured on Treo680; is GPIO instead */
  	GPIOxx_LCD_16BPP,
  	GPIO74_LCD_FCLK,
  	GPIO75_LCD_LCLK,
  	GPIO76_LCD_PCLK,
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
144
145
  };
  #endif /* CONFIG_MACH_TREO680 */
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
146
147
148
149
150
151
152
153
154
155
156
157
  #ifdef CONFIG_MACH_CENTRO
  static unsigned long centro685_pin_config[] __initdata = {
  	/* Bluetooth attached to BT UART*/
  	MFP_CFG_OUT(GPIO80, AF0, DRIVE_LOW),    /* power: LOW = off */
  	GPIO42_BTUART_RXD,
  	GPIO43_BTUART_TXD,
  	GPIO44_BTUART_CTS,
  	GPIO45_BTUART_RTS,
  
  	/* MATRIX KEYPAD - different wake up source */
  	GPIO100_KP_MKIN_0,
  	GPIO99_KP_MKIN_5 | WAKEUP_ON_LEVEL_HIGH,
2c33727a6   Mike Dunn   ARM: palmtreo: fi...
158
159
160
  
  	/* LCD */
  	GPIOxx_LCD_TFT_16BPP,
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
161
162
  };
  #endif /* CONFIG_MACH_CENTRO */
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
163
  /******************************************************************************
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
164
165
   * GPIO keyboard
   ******************************************************************************/
747f3449f   Mike Dunn   ARM: palmtreo: re...
166
  #if IS_ENABLED(CONFIG_KEYBOARD_PXA27x)
0a085a948   Chao Xie   Input: pxa27x-key...
167
  static const unsigned int treo680_matrix_keys[] = {
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  	KEY(0, 0, KEY_F8),		/* Red/Off/Power */
  	KEY(0, 1, KEY_LEFT),
  	KEY(0, 2, KEY_LEFTCTRL),	/* Alternate */
  	KEY(0, 3, KEY_L),
  	KEY(0, 4, KEY_A),
  	KEY(0, 5, KEY_Q),
  	KEY(0, 6, KEY_P),
  
  	KEY(1, 0, KEY_RIGHTCTRL),	/* Menu */
  	KEY(1, 1, KEY_RIGHT),
  	KEY(1, 2, KEY_LEFTSHIFT),	/* Left shift */
  	KEY(1, 3, KEY_Z),
  	KEY(1, 4, KEY_S),
  	KEY(1, 5, KEY_W),
  
  	KEY(2, 0, KEY_F1),		/* Phone */
  	KEY(2, 1, KEY_UP),
  	KEY(2, 2, KEY_0),
  	KEY(2, 3, KEY_X),
  	KEY(2, 4, KEY_D),
  	KEY(2, 5, KEY_E),
  
  	KEY(3, 0, KEY_F10),		/* Calendar */
  	KEY(3, 1, KEY_DOWN),
  	KEY(3, 2, KEY_SPACE),
  	KEY(3, 3, KEY_C),
  	KEY(3, 4, KEY_F),
  	KEY(3, 5, KEY_R),
  
  	KEY(4, 0, KEY_F12),		/* Mail */
  	KEY(4, 1, KEY_KPENTER),
  	KEY(4, 2, KEY_RIGHTALT),	/* Alt */
  	KEY(4, 3, KEY_V),
  	KEY(4, 4, KEY_G),
  	KEY(4, 5, KEY_T),
  
  	KEY(5, 0, KEY_F9),		/* Home */
  	KEY(5, 1, KEY_PAGEUP),		/* Side up */
  	KEY(5, 2, KEY_DOT),
  	KEY(5, 3, KEY_B),
  	KEY(5, 4, KEY_H),
  	KEY(5, 5, KEY_Y),
  
  	KEY(6, 0, KEY_TAB),		/* Side Activate */
  	KEY(6, 1, KEY_PAGEDOWN),	/* Side down */
  	KEY(6, 2, KEY_ENTER),
  	KEY(6, 3, KEY_N),
  	KEY(6, 4, KEY_J),
  	KEY(6, 5, KEY_U),
  
  	KEY(7, 0, KEY_F6),		/* Green/Call */
  	KEY(7, 1, KEY_O),
  	KEY(7, 2, KEY_BACKSPACE),
  	KEY(7, 3, KEY_M),
  	KEY(7, 4, KEY_K),
  	KEY(7, 5, KEY_I),
  };
0a085a948   Chao Xie   Input: pxa27x-key...
225
  static const unsigned int centro_matrix_keys[] = {
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  	KEY(0, 0, KEY_F9),		/* Home */
  	KEY(0, 1, KEY_LEFT),
  	KEY(0, 2, KEY_LEFTCTRL),	/* Alternate */
  	KEY(0, 3, KEY_L),
  	KEY(0, 4, KEY_A),
  	KEY(0, 5, KEY_Q),
  	KEY(0, 6, KEY_P),
  
  	KEY(1, 0, KEY_RIGHTCTRL),	/* Menu */
  	KEY(1, 1, KEY_RIGHT),
  	KEY(1, 2, KEY_LEFTSHIFT),	/* Left shift */
  	KEY(1, 3, KEY_Z),
  	KEY(1, 4, KEY_S),
  	KEY(1, 5, KEY_W),
  
  	KEY(2, 0, KEY_F1),		/* Phone */
  	KEY(2, 1, KEY_UP),
  	KEY(2, 2, KEY_0),
  	KEY(2, 3, KEY_X),
  	KEY(2, 4, KEY_D),
  	KEY(2, 5, KEY_E),
  
  	KEY(3, 0, KEY_F10),		/* Calendar */
  	KEY(3, 1, KEY_DOWN),
  	KEY(3, 2, KEY_SPACE),
  	KEY(3, 3, KEY_C),
  	KEY(3, 4, KEY_F),
  	KEY(3, 5, KEY_R),
  
  	KEY(4, 0, KEY_F12),		/* Mail */
  	KEY(4, 1, KEY_KPENTER),
  	KEY(4, 2, KEY_RIGHTALT),	/* Alt */
  	KEY(4, 3, KEY_V),
  	KEY(4, 4, KEY_G),
  	KEY(4, 5, KEY_T),
  
  	KEY(5, 0, KEY_F8),		/* Red/Off/Power */
  	KEY(5, 1, KEY_PAGEUP),		/* Side up */
  	KEY(5, 2, KEY_DOT),
  	KEY(5, 3, KEY_B),
  	KEY(5, 4, KEY_H),
  	KEY(5, 5, KEY_Y),
  
  	KEY(6, 0, KEY_TAB),		/* Side Activate */
  	KEY(6, 1, KEY_PAGEDOWN),	/* Side down */
  	KEY(6, 2, KEY_ENTER),
  	KEY(6, 3, KEY_N),
  	KEY(6, 4, KEY_J),
  	KEY(6, 5, KEY_U),
  
  	KEY(7, 0, KEY_F6),		/* Green/Call */
  	KEY(7, 1, KEY_O),
  	KEY(7, 2, KEY_BACKSPACE),
  	KEY(7, 3, KEY_M),
  	KEY(7, 4, KEY_K),
  	KEY(7, 5, KEY_I),
  };
0a085a948   Chao Xie   Input: pxa27x-key...
283
284
285
286
287
288
289
290
291
  static struct matrix_keymap_data treo680_matrix_keymap_data = {
  	.keymap			= treo680_matrix_keys,
  	.keymap_size		= ARRAY_SIZE(treo680_matrix_keys),
  };
  
  static struct matrix_keymap_data centro_matrix_keymap_data = {
  	.keymap			= centro_matrix_keys,
  	.keymap_size		= ARRAY_SIZE(centro_matrix_keys),
  };
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
292
  static struct pxa27x_keypad_platform_data treo680_keypad_pdata = {
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
293
294
  	.matrix_key_rows	= 8,
  	.matrix_key_cols	= 7,
0a085a948   Chao Xie   Input: pxa27x-key...
295
  	.matrix_keymap_data	= &treo680_matrix_keymap_data,
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
296
297
298
299
300
  	.direct_key_map		= { KEY_CONNECT },
  	.direct_key_num		= 1,
  
  	.debounce_interval	= 30,
  };
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
301

31620e21a   Marek Vasut   [ARM] pxa/palm: F...
302
  static void __init palmtreo_kpc_init(void)
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
303
  {
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
304
  	static struct pxa27x_keypad_platform_data *data = &treo680_keypad_pdata;
28d7a9468   Tomáš Čech   [ARM] pxa/treo680...
305

0a085a948   Chao Xie   Input: pxa27x-key...
306
307
  	if (machine_is_centro())
  		data->matrix_keymap_data = &centro_matrix_keymap_data;
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
308

31620e21a   Marek Vasut   [ARM] pxa/palm: F...
309
  	pxa_set_keypad_info(&treo680_keypad_pdata);
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
310
  }
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
311
312
313
  #else
  static inline void palmtreo_kpc_init(void) {}
  #endif
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
314
315
316
317
  
  /******************************************************************************
   * USB host
   ******************************************************************************/
747f3449f   Mike Dunn   ARM: palmtreo: re...
318
  #if IS_ENABLED(CONFIG_USB_OHCI_HCD)
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
319
320
321
322
323
  static struct pxaohci_platform_data treo680_ohci_info = {
  	.port_mode    = PMM_PERPORT_MODE,
  	.flags        = ENABLE_PORT1 | ENABLE_PORT3,
  	.power_budget = 0,
  };
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
324
  static void __init palmtreo_uhc_init(void)
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
325
  {
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
326
327
  	if (machine_is_treo680())
  		pxa_set_ohci_info(&treo680_ohci_info);
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
328
  }
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
329
330
331
  #else
  static inline void palmtreo_uhc_init(void) {}
  #endif
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
332
333
334
335
  
  /******************************************************************************
   * Vibra and LEDs
   ******************************************************************************/
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
336
  static struct gpio_led treo680_gpio_leds[] = {
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
337
338
339
340
341
342
343
344
  	{
  		.name			= "treo680:vibra:vibra",
  		.default_trigger	= "none",
  		.gpio			= GPIO_NR_TREO680_VIBRATE_EN,
  	},
  	{
  		.name			= "treo680:green:led",
  		.default_trigger	= "mmc0",
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
345
  		.gpio			= GPIO_NR_TREO_GREEN_LED,
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
346
347
  	},
  	{
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
348
  		.name			= "treo680:white:keybbl",
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
349
350
351
352
  		.default_trigger	= "none",
  		.gpio			= GPIO_NR_TREO680_KEYB_BL,
  	},
  };
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
353
354
355
  static struct gpio_led_platform_data treo680_gpio_led_info = {
  	.leds		= treo680_gpio_leds,
  	.num_leds	= ARRAY_SIZE(treo680_gpio_leds),
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
356
  };
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  static struct gpio_led centro_gpio_leds[] = {
  	{
  		.name			= "centro:vibra:vibra",
  		.default_trigger	= "none",
  		.gpio			= GPIO_NR_CENTRO_VIBRATE_EN,
  	},
  	{
  		.name			= "centro:green:led",
  		.default_trigger	= "mmc0",
  		.gpio			= GPIO_NR_TREO_GREEN_LED,
  	},
  	{
  		.name			= "centro:white:keybbl",
  		.default_trigger	= "none",
  		.active_low		= 1,
  		.gpio			= GPIO_NR_CENTRO_KEYB_BL,
  	},
  };
  
  static struct gpio_led_platform_data centro_gpio_led_info = {
  	.leds		= centro_gpio_leds,
  	.num_leds	= ARRAY_SIZE(centro_gpio_leds),
  };
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
380
  static struct platform_device palmtreo_leds = {
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
381
382
  	.name   = "leds-gpio",
  	.id     = -1,
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
383
  };
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
384

31620e21a   Marek Vasut   [ARM] pxa/palm: F...
385
  static void __init palmtreo_leds_init(void)
28d7a9468   Tomáš Čech   [ARM] pxa/treo680...
386
  {
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
387
388
  	if (machine_is_centro())
  		palmtreo_leds.dev.platform_data = &centro_gpio_led_info;
6a639bb83   Mike Dunn   ARM: palmtreo: fi...
389
390
  	else if (machine_is_treo680())
  		palmtreo_leds.dev.platform_data = &treo680_gpio_led_info;
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
391

31620e21a   Marek Vasut   [ARM] pxa/palm: F...
392
  	platform_device_register(&palmtreo_leds);
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
393
394
395
  }
  
  /******************************************************************************
8b8842bfc   Mike Dunn   ARM: palmtreo: ad...
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
   * diskonchip docg4 flash
   ******************************************************************************/
  #if defined(CONFIG_MACH_TREO680)
  /* REVISIT: does the centro have this device also? */
  #if IS_ENABLED(CONFIG_MTD_NAND_DOCG4)
  static struct resource docg4_resources[] = {
  	{
  		.start	= 0x00000000,
  		.end	= 0x00001FFF,
  		.flags	= IORESOURCE_MEM,
  	},
  };
  
  static struct platform_device treo680_docg4_flash = {
  	.name   = "docg4",
  	.id     = -1,
  	.resource = docg4_resources,
  	.num_resources = ARRAY_SIZE(docg4_resources),
  };
  
  static void __init treo680_docg4_flash_init(void)
  {
  	platform_device_register(&treo680_docg4_flash);
  }
  #else
  static inline void treo680_docg4_flash_init(void) {}
  #endif
  #endif
  
  /******************************************************************************
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
426
427
   * Machine init
   ******************************************************************************/
98c672cf1   Russell King   ARM: Move platfor...
428
429
  static void __init treo_reserve(void)
  {
8d717a52d   Russell King   ARM: Convert plat...
430
431
  	memblock_reserve(0xa0000000, 0x1000);
  	memblock_reserve(0xa2000000, 0x1000);
98c672cf1   Russell King   ARM: Move platfor...
432
  }
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
433
  static void __init palmphone_common_init(void)
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
434
  {
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
435
  	pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config));
cc155c6f2   Russell King   [ARM] pxa: allow ...
436
437
438
  	pxa_set_ffuart_info(NULL);
  	pxa_set_btuart_info(NULL);
  	pxa_set_stuart_info(NULL);
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
439
440
441
442
443
444
445
446
447
448
449
  	palm27x_pm_init(TREO_STR_BASE);
  	palm27x_lcd_init(GPIO_NR_TREO_BL_POWER, &palm_320x320_new_lcd_mode);
  	palm27x_udc_init(GPIO_NR_TREO_USB_DETECT, GPIO_NR_TREO_USB_PULLUP, 1);
  	palm27x_irda_init(GPIO_NR_TREO_IR_EN);
  	palm27x_ac97_init(-1, -1, -1, 95);
  	palm27x_pwm_init(GPIO_NR_TREO_BL_POWER, -1);
  	palm27x_power_init(GPIO_NR_TREO_POWER_DETECT, -1);
  	palm27x_pmic_init();
  	palmtreo_kpc_init();
  	palmtreo_uhc_init();
  	palmtreo_leds_init();
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
450
  }
0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
451
  #ifdef CONFIG_MACH_TREO680
2c33727a6   Mike Dunn   ARM: palmtreo: fi...
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
  void __init treo680_gpio_init(void)
  {
  	unsigned int gpio;
  
  	/* drive all three lcd gpios high initially */
  	const unsigned long lcd_flags = GPIOF_INIT_HIGH | GPIOF_DIR_OUT;
  
  	/*
  	 * LCD GPIO initialization...
  	 */
  
  	/*
  	 * This is likely the power to the lcd.  Toggling it low/high appears to
  	 * turn the lcd off/on.  Can be toggled after lcd is initialized without
  	 * any apparent adverse effects to the lcd operation.  Note that this
  	 * gpio line is used by the lcd controller as the L_BIAS signal, but
  	 * treo680 configures it as gpio.
  	 */
  	gpio = GPIO_NR_TREO680_LCD_POWER;
  	if (gpio_request_one(gpio, lcd_flags, "LCD power") < 0)
  		goto fail;
  
  	/*
  	 * These two are called "enables", for lack of a better understanding.
  	 * If either of these are toggled after the lcd is initialized, the
  	 * image becomes degraded.  N.B. The IPL shipped with the treo
  	 * configures GPIO_NR_TREO680_LCD_EN_N as output and drives it high.  If
  	 * the IPL is ever reprogrammed, this initialization may be need to be
  	 * revisited.
  	 */
  	gpio = GPIO_NR_TREO680_LCD_EN;
  	if (gpio_request_one(gpio, lcd_flags, "LCD enable") < 0)
  		goto fail;
  	gpio = GPIO_NR_TREO680_LCD_EN_N;
  	if (gpio_request_one(gpio, lcd_flags, "LCD enable_n") < 0)
  		goto fail;
  
  	/* driving this low turns LCD on */
  	gpio_set_value(GPIO_NR_TREO680_LCD_EN_N, 0);
  
  	return;
   fail:
  	pr_err("gpio %d initialization failed
  ", gpio);
  	gpio_free(GPIO_NR_TREO680_LCD_POWER);
  	gpio_free(GPIO_NR_TREO680_LCD_EN);
  	gpio_free(GPIO_NR_TREO680_LCD_EN_N);
  }
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
500
501
  static void __init treo680_init(void)
  {
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
502
  	pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config));
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
503
  	palmphone_common_init();
2c33727a6   Mike Dunn   ARM: palmtreo: fi...
504
  	treo680_gpio_init();
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
505
506
  	palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, GPIO_NR_TREO680_SD_READONLY,
  			GPIO_NR_TREO680_SD_POWER, 0);
8b8842bfc   Mike Dunn   ARM: palmtreo: ad...
507
  	treo680_docg4_flash_init();
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
508
  }
0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
509
  #endif
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
510

0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
511
  #ifdef CONFIG_MACH_CENTRO
31620e21a   Marek Vasut   [ARM] pxa/palm: F...
512
513
514
515
516
517
  static void __init centro_init(void)
  {
  	pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
  	palmphone_common_init();
  	palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, -1,
  			GPIO_NR_CENTRO_SD_POWER, 1);
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
518
  }
0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
519
  #endif
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
520

0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
521
  #ifdef CONFIG_MACH_TREO680
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
522
  MACHINE_START(TREO680, "Palm Treo 680")
7375aba67   Nicolas Pitre   ARM: mach-pxa: co...
523
  	.atag_offset    = 0x100,
851982c1b   Marek Vasut   ARM: pxa: Introdu...
524
  	.map_io         = pxa27x_map_io,
98c672cf1   Russell King   ARM: Move platfor...
525
  	.reserve	= treo_reserve,
4e611091f   Rob Herring   ARM: pxa: remove ...
526
  	.nr_irqs	= PXA_NR_IRQS,
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
527
  	.init_irq       = pxa27x_init_irq,
8a97ae2f5   Eric Miao   ARM: pxa: enable ...
528
  	.handle_irq       = pxa27x_handle_irq,
6bb27d734   Stephen Warren   ARM: delete struc...
529
  	.init_time	= pxa_timer_init,
bb2ae8f03   Tomáš Čech   [ARM] pxa/treo: g...
530
  	.init_machine   = treo680_init,
271a74fc8   Russell King   ARM: restart: pxa...
531
  	.restart	= pxa_restart,
e6c3f4b89   Tomas 'Sleep_Walker' Cech   [ARM] pxa/treo680...
532
  MACHINE_END
0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
533
  #endif
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
534

0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
535
  #ifdef CONFIG_MACH_CENTRO
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
536
  MACHINE_START(CENTRO, "Palm Centro 685")
7375aba67   Nicolas Pitre   ARM: mach-pxa: co...
537
  	.atag_offset    = 0x100,
851982c1b   Marek Vasut   ARM: pxa: Introdu...
538
  	.map_io         = pxa27x_map_io,
98c672cf1   Russell King   ARM: Move platfor...
539
  	.reserve	= treo_reserve,
4e611091f   Rob Herring   ARM: pxa: remove ...
540
  	.nr_irqs	= PXA_NR_IRQS,
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
541
  	.init_irq       = pxa27x_init_irq,
8a97ae2f5   Eric Miao   ARM: pxa: enable ...
542
  	.handle_irq       = pxa27x_handle_irq,
6bb27d734   Stephen Warren   ARM: delete struc...
543
  	.init_time	= pxa_timer_init,
f165eb77f   Russell King   Merge branch 'dev...
544
  	.init_machine	= centro_init,
271a74fc8   Russell King   ARM: restart: pxa...
545
  	.restart	= pxa_restart,
d0a92fd3b   Tomáš Čech   [ARM] pxa/treo: a...
546
  MACHINE_END
0c82cc5d7   Arnd Bergmann   ARM: pxa: allow s...
547
  #endif