xref: /OK3568_Linux_fs/kernel/arch/arm/mach-pxa/palmtc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/arch/arm/mach-pxa/palmtc.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Support for the Palm Tungsten|C
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author:	Marek Vasut <marek.vasut@gmail.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Based on work of:
10*4882a593Smuzhiyun  *		Petr Blaha <p3t3@centrum.cz>
11*4882a593Smuzhiyun  *		Chetan S. Kumar <shivakumar.chetan@gmail.com>
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/platform_device.h>
15*4882a593Smuzhiyun #include <linux/delay.h>
16*4882a593Smuzhiyun #include <linux/irq.h>
17*4882a593Smuzhiyun #include <linux/input.h>
18*4882a593Smuzhiyun #include <linux/pwm.h>
19*4882a593Smuzhiyun #include <linux/pwm_backlight.h>
20*4882a593Smuzhiyun #include <linux/gpio/machine.h>
21*4882a593Smuzhiyun #include <linux/input/matrix_keypad.h>
22*4882a593Smuzhiyun #include <linux/ucb1400.h>
23*4882a593Smuzhiyun #include <linux/power_supply.h>
24*4882a593Smuzhiyun #include <linux/gpio_keys.h>
25*4882a593Smuzhiyun #include <linux/mtd/physmap.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <asm/mach-types.h>
28*4882a593Smuzhiyun #include <asm/mach/arch.h>
29*4882a593Smuzhiyun #include <asm/mach/map.h>
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #include "pxa25x.h"
32*4882a593Smuzhiyun #include <mach/audio.h>
33*4882a593Smuzhiyun #include <mach/palmtc.h>
34*4882a593Smuzhiyun #include <linux/platform_data/mmc-pxamci.h>
35*4882a593Smuzhiyun #include <linux/platform_data/video-pxafb.h>
36*4882a593Smuzhiyun #include <linux/platform_data/irda-pxaficp.h>
37*4882a593Smuzhiyun #include "udc.h"
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #include "generic.h"
40*4882a593Smuzhiyun #include "devices.h"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /******************************************************************************
43*4882a593Smuzhiyun  * Pin configuration
44*4882a593Smuzhiyun  ******************************************************************************/
45*4882a593Smuzhiyun static unsigned long palmtc_pin_config[] __initdata = {
46*4882a593Smuzhiyun 	/* MMC */
47*4882a593Smuzhiyun 	GPIO6_MMC_CLK,
48*4882a593Smuzhiyun 	GPIO8_MMC_CS0,
49*4882a593Smuzhiyun 	GPIO12_GPIO,	/* detect */
50*4882a593Smuzhiyun 	GPIO32_GPIO,	/* power */
51*4882a593Smuzhiyun 	GPIO54_GPIO,	/* r/o switch */
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	/* PCMCIA */
54*4882a593Smuzhiyun 	GPIO52_nPCE_1,
55*4882a593Smuzhiyun 	GPIO53_nPCE_2,
56*4882a593Smuzhiyun 	GPIO50_nPIOR,
57*4882a593Smuzhiyun 	GPIO51_nPIOW,
58*4882a593Smuzhiyun 	GPIO49_nPWE,
59*4882a593Smuzhiyun 	GPIO48_nPOE,
60*4882a593Smuzhiyun 	GPIO52_nPCE_1,
61*4882a593Smuzhiyun 	GPIO53_nPCE_2,
62*4882a593Smuzhiyun 	GPIO57_nIOIS16,
63*4882a593Smuzhiyun 	GPIO56_nPWAIT,
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	/* AC97 */
66*4882a593Smuzhiyun 	GPIO28_AC97_BITCLK,
67*4882a593Smuzhiyun 	GPIO29_AC97_SDATA_IN_0,
68*4882a593Smuzhiyun 	GPIO30_AC97_SDATA_OUT,
69*4882a593Smuzhiyun 	GPIO31_AC97_SYNC,
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	/* IrDA */
72*4882a593Smuzhiyun 	GPIO45_GPIO,	/* ir disable */
73*4882a593Smuzhiyun 	GPIO46_FICP_RXD,
74*4882a593Smuzhiyun 	GPIO47_FICP_TXD,
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	/* PWM */
77*4882a593Smuzhiyun 	GPIO17_PWM1_OUT,
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	/* USB */
80*4882a593Smuzhiyun 	GPIO4_GPIO,	/* detect */
81*4882a593Smuzhiyun 	GPIO36_GPIO,	/* pullup */
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/* LCD */
84*4882a593Smuzhiyun 	GPIOxx_LCD_TFT_16BPP,
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	/* MATRIX KEYPAD */
87*4882a593Smuzhiyun 	GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,	/* in 0 */
88*4882a593Smuzhiyun 	GPIO9_GPIO | WAKEUP_ON_EDGE_BOTH,	/* in 1 */
89*4882a593Smuzhiyun 	GPIO10_GPIO | WAKEUP_ON_EDGE_BOTH,	/* in 2 */
90*4882a593Smuzhiyun 	GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH,	/* in 3 */
91*4882a593Smuzhiyun 	GPIO18_GPIO | MFP_LPM_DRIVE_LOW,	/* out 0 */
92*4882a593Smuzhiyun 	GPIO19_GPIO | MFP_LPM_DRIVE_LOW,	/* out 1 */
93*4882a593Smuzhiyun 	GPIO20_GPIO | MFP_LPM_DRIVE_LOW,	/* out 2 */
94*4882a593Smuzhiyun 	GPIO21_GPIO | MFP_LPM_DRIVE_LOW,	/* out 3 */
95*4882a593Smuzhiyun 	GPIO22_GPIO | MFP_LPM_DRIVE_LOW,	/* out 4 */
96*4882a593Smuzhiyun 	GPIO23_GPIO | MFP_LPM_DRIVE_LOW,	/* out 5 */
97*4882a593Smuzhiyun 	GPIO24_GPIO | MFP_LPM_DRIVE_LOW,	/* out 6 */
98*4882a593Smuzhiyun 	GPIO25_GPIO | MFP_LPM_DRIVE_LOW,	/* out 7 */
99*4882a593Smuzhiyun 	GPIO26_GPIO | MFP_LPM_DRIVE_LOW,	/* out 8 */
100*4882a593Smuzhiyun 	GPIO27_GPIO | MFP_LPM_DRIVE_LOW,	/* out 9 */
101*4882a593Smuzhiyun 	GPIO79_GPIO | MFP_LPM_DRIVE_LOW,	/* out 10 */
102*4882a593Smuzhiyun 	GPIO80_GPIO | MFP_LPM_DRIVE_LOW,	/* out 11 */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	/* PXA GPIO KEYS */
105*4882a593Smuzhiyun 	GPIO7_GPIO | WAKEUP_ON_EDGE_BOTH,	/* hotsync button on cradle */
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	/* MISC */
108*4882a593Smuzhiyun 	GPIO1_RST,	/* reset */
109*4882a593Smuzhiyun 	GPIO2_GPIO,	/* earphone detect */
110*4882a593Smuzhiyun 	GPIO16_GPIO,	/* backlight switch */
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /******************************************************************************
114*4882a593Smuzhiyun  * SD/MMC card controller
115*4882a593Smuzhiyun  ******************************************************************************/
116*4882a593Smuzhiyun #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
117*4882a593Smuzhiyun static struct pxamci_platform_data palmtc_mci_platform_data = {
118*4882a593Smuzhiyun 	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
119*4882a593Smuzhiyun 	.detect_delay_ms	= 200,
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun static struct gpiod_lookup_table palmtc_mci_gpio_table = {
123*4882a593Smuzhiyun 	.dev_id = "pxa2xx-mci.0",
124*4882a593Smuzhiyun 	.table = {
125*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_DETECT_N,
126*4882a593Smuzhiyun 			    "cd", GPIO_ACTIVE_LOW),
127*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_READONLY,
128*4882a593Smuzhiyun 			    "wp", GPIO_ACTIVE_LOW),
129*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_SD_POWER,
130*4882a593Smuzhiyun 			    "power", GPIO_ACTIVE_HIGH),
131*4882a593Smuzhiyun 		{ },
132*4882a593Smuzhiyun 	},
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
palmtc_mmc_init(void)135*4882a593Smuzhiyun static void __init palmtc_mmc_init(void)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	gpiod_add_lookup_table(&palmtc_mci_gpio_table);
138*4882a593Smuzhiyun 	pxa_set_mci_info(&palmtc_mci_platform_data);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun #else
palmtc_mmc_init(void)141*4882a593Smuzhiyun static inline void palmtc_mmc_init(void) {}
142*4882a593Smuzhiyun #endif
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /******************************************************************************
145*4882a593Smuzhiyun  * GPIO keys
146*4882a593Smuzhiyun  ******************************************************************************/
147*4882a593Smuzhiyun #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
148*4882a593Smuzhiyun static struct gpio_keys_button palmtc_pxa_buttons[] = {
149*4882a593Smuzhiyun 	{KEY_F8, GPIO_NR_PALMTC_HOTSYNC_BUTTON, 1, "HotSync Button", EV_KEY, 1},
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun static struct gpio_keys_platform_data palmtc_pxa_keys_data = {
153*4882a593Smuzhiyun 	.buttons	= palmtc_pxa_buttons,
154*4882a593Smuzhiyun 	.nbuttons	= ARRAY_SIZE(palmtc_pxa_buttons),
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun static struct platform_device palmtc_pxa_keys = {
158*4882a593Smuzhiyun 	.name	= "gpio-keys",
159*4882a593Smuzhiyun 	.id	= -1,
160*4882a593Smuzhiyun 	.dev	= {
161*4882a593Smuzhiyun 		.platform_data = &palmtc_pxa_keys_data,
162*4882a593Smuzhiyun 	},
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
palmtc_keys_init(void)165*4882a593Smuzhiyun static void __init palmtc_keys_init(void)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun 	platform_device_register(&palmtc_pxa_keys);
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun #else
palmtc_keys_init(void)170*4882a593Smuzhiyun static inline void palmtc_keys_init(void) {}
171*4882a593Smuzhiyun #endif
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /******************************************************************************
174*4882a593Smuzhiyun  * Backlight
175*4882a593Smuzhiyun  ******************************************************************************/
176*4882a593Smuzhiyun #if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun static struct gpiod_lookup_table palmtc_pwm_bl_gpio_table = {
179*4882a593Smuzhiyun 	.dev_id = "pwm-backlight.0",
180*4882a593Smuzhiyun 	.table = {
181*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_BL_POWER,
182*4882a593Smuzhiyun 			    "enable", GPIO_ACTIVE_HIGH),
183*4882a593Smuzhiyun 	},
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun static struct pwm_lookup palmtc_pwm_lookup[] = {
187*4882a593Smuzhiyun 	PWM_LOOKUP("pxa25x-pwm.1", 0, "pwm-backlight.0", NULL, PALMTC_PERIOD_NS,
188*4882a593Smuzhiyun 		   PWM_POLARITY_NORMAL),
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun static struct platform_pwm_backlight_data palmtc_backlight_data = {
192*4882a593Smuzhiyun 	.max_brightness	= PALMTC_MAX_INTENSITY,
193*4882a593Smuzhiyun 	.dft_brightness	= PALMTC_MAX_INTENSITY,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun static struct platform_device palmtc_backlight = {
197*4882a593Smuzhiyun 	.name	= "pwm-backlight",
198*4882a593Smuzhiyun 	.dev	= {
199*4882a593Smuzhiyun 		.parent		= &pxa25x_device_pwm1.dev,
200*4882a593Smuzhiyun 		.platform_data	= &palmtc_backlight_data,
201*4882a593Smuzhiyun 	},
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
palmtc_pwm_init(void)204*4882a593Smuzhiyun static void __init palmtc_pwm_init(void)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	gpiod_add_lookup_table(&palmtc_pwm_bl_gpio_table);
207*4882a593Smuzhiyun 	pwm_add_table(palmtc_pwm_lookup, ARRAY_SIZE(palmtc_pwm_lookup));
208*4882a593Smuzhiyun 	platform_device_register(&palmtc_backlight);
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun #else
palmtc_pwm_init(void)211*4882a593Smuzhiyun static inline void palmtc_pwm_init(void) {}
212*4882a593Smuzhiyun #endif
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /******************************************************************************
215*4882a593Smuzhiyun  * IrDA
216*4882a593Smuzhiyun  ******************************************************************************/
217*4882a593Smuzhiyun #if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
218*4882a593Smuzhiyun static struct pxaficp_platform_data palmtc_ficp_platform_data = {
219*4882a593Smuzhiyun 	.gpio_pwdown		= GPIO_NR_PALMTC_IR_DISABLE,
220*4882a593Smuzhiyun 	.transceiver_cap	= IR_SIRMODE | IR_OFF,
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
palmtc_irda_init(void)223*4882a593Smuzhiyun static void __init palmtc_irda_init(void)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	pxa_set_ficp_info(&palmtc_ficp_platform_data);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun #else
palmtc_irda_init(void)228*4882a593Smuzhiyun static inline void palmtc_irda_init(void) {}
229*4882a593Smuzhiyun #endif
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /******************************************************************************
232*4882a593Smuzhiyun  * Keyboard
233*4882a593Smuzhiyun  ******************************************************************************/
234*4882a593Smuzhiyun #if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
235*4882a593Smuzhiyun static const uint32_t palmtc_matrix_keys[] = {
236*4882a593Smuzhiyun 	KEY(0, 0, KEY_F1),
237*4882a593Smuzhiyun 	KEY(0, 1, KEY_X),
238*4882a593Smuzhiyun 	KEY(0, 2, KEY_POWER),
239*4882a593Smuzhiyun 	KEY(0, 3, KEY_TAB),
240*4882a593Smuzhiyun 	KEY(0, 4, KEY_A),
241*4882a593Smuzhiyun 	KEY(0, 5, KEY_Q),
242*4882a593Smuzhiyun 	KEY(0, 6, KEY_LEFTSHIFT),
243*4882a593Smuzhiyun 	KEY(0, 7, KEY_Z),
244*4882a593Smuzhiyun 	KEY(0, 8, KEY_S),
245*4882a593Smuzhiyun 	KEY(0, 9, KEY_W),
246*4882a593Smuzhiyun 	KEY(0, 10, KEY_E),
247*4882a593Smuzhiyun 	KEY(0, 11, KEY_UP),
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	KEY(1, 0, KEY_F2),
250*4882a593Smuzhiyun 	KEY(1, 1, KEY_DOWN),
251*4882a593Smuzhiyun 	KEY(1, 3, KEY_D),
252*4882a593Smuzhiyun 	KEY(1, 4, KEY_C),
253*4882a593Smuzhiyun 	KEY(1, 5, KEY_F),
254*4882a593Smuzhiyun 	KEY(1, 6, KEY_R),
255*4882a593Smuzhiyun 	KEY(1, 7, KEY_SPACE),
256*4882a593Smuzhiyun 	KEY(1, 8, KEY_V),
257*4882a593Smuzhiyun 	KEY(1, 9, KEY_G),
258*4882a593Smuzhiyun 	KEY(1, 10, KEY_T),
259*4882a593Smuzhiyun 	KEY(1, 11, KEY_LEFT),
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	KEY(2, 0, KEY_F3),
262*4882a593Smuzhiyun 	KEY(2, 1, KEY_LEFTCTRL),
263*4882a593Smuzhiyun 	KEY(2, 3, KEY_H),
264*4882a593Smuzhiyun 	KEY(2, 4, KEY_Y),
265*4882a593Smuzhiyun 	KEY(2, 5, KEY_N),
266*4882a593Smuzhiyun 	KEY(2, 6, KEY_J),
267*4882a593Smuzhiyun 	KEY(2, 7, KEY_U),
268*4882a593Smuzhiyun 	KEY(2, 8, KEY_M),
269*4882a593Smuzhiyun 	KEY(2, 9, KEY_K),
270*4882a593Smuzhiyun 	KEY(2, 10, KEY_I),
271*4882a593Smuzhiyun 	KEY(2, 11, KEY_RIGHT),
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	KEY(3, 0, KEY_F4),
274*4882a593Smuzhiyun 	KEY(3, 1, KEY_ENTER),
275*4882a593Smuzhiyun 	KEY(3, 3, KEY_DOT),
276*4882a593Smuzhiyun 	KEY(3, 4, KEY_L),
277*4882a593Smuzhiyun 	KEY(3, 5, KEY_O),
278*4882a593Smuzhiyun 	KEY(3, 6, KEY_LEFTALT),
279*4882a593Smuzhiyun 	KEY(3, 7, KEY_ENTER),
280*4882a593Smuzhiyun 	KEY(3, 8, KEY_BACKSPACE),
281*4882a593Smuzhiyun 	KEY(3, 9, KEY_P),
282*4882a593Smuzhiyun 	KEY(3, 10, KEY_B),
283*4882a593Smuzhiyun 	KEY(3, 11, KEY_FN),
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun const struct matrix_keymap_data palmtc_keymap_data = {
287*4882a593Smuzhiyun 	.keymap			= palmtc_matrix_keys,
288*4882a593Smuzhiyun 	.keymap_size		= ARRAY_SIZE(palmtc_matrix_keys),
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun static const unsigned int palmtc_keypad_row_gpios[] = {
292*4882a593Smuzhiyun 	0, 9, 10, 11
293*4882a593Smuzhiyun };
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun static const unsigned int palmtc_keypad_col_gpios[] = {
296*4882a593Smuzhiyun 	18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 79, 80
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun static struct matrix_keypad_platform_data palmtc_keypad_platform_data = {
300*4882a593Smuzhiyun 	.keymap_data	= &palmtc_keymap_data,
301*4882a593Smuzhiyun 	.row_gpios	= palmtc_keypad_row_gpios,
302*4882a593Smuzhiyun 	.num_row_gpios	= ARRAY_SIZE(palmtc_keypad_row_gpios),
303*4882a593Smuzhiyun 	.col_gpios	= palmtc_keypad_col_gpios,
304*4882a593Smuzhiyun 	.num_col_gpios	= ARRAY_SIZE(palmtc_keypad_col_gpios),
305*4882a593Smuzhiyun 	.active_low	= 1,
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	.debounce_ms		= 20,
308*4882a593Smuzhiyun 	.col_scan_delay_us	= 5,
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun static struct platform_device palmtc_keyboard = {
312*4882a593Smuzhiyun 	.name	= "matrix-keypad",
313*4882a593Smuzhiyun 	.id	= -1,
314*4882a593Smuzhiyun 	.dev	= {
315*4882a593Smuzhiyun 		.platform_data = &palmtc_keypad_platform_data,
316*4882a593Smuzhiyun 	},
317*4882a593Smuzhiyun };
palmtc_mkp_init(void)318*4882a593Smuzhiyun static void __init palmtc_mkp_init(void)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun 	platform_device_register(&palmtc_keyboard);
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun #else
palmtc_mkp_init(void)323*4882a593Smuzhiyun static inline void palmtc_mkp_init(void) {}
324*4882a593Smuzhiyun #endif
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /******************************************************************************
327*4882a593Smuzhiyun  * UDC
328*4882a593Smuzhiyun  ******************************************************************************/
329*4882a593Smuzhiyun #if defined(CONFIG_USB_PXA25X)||defined(CONFIG_USB_PXA25X_MODULE)
330*4882a593Smuzhiyun static struct gpiod_lookup_table palmtc_udc_gpiod_table = {
331*4882a593Smuzhiyun 	.dev_id = "gpio-vbus",
332*4882a593Smuzhiyun 	.table = {
333*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_USB_DETECT_N,
334*4882a593Smuzhiyun 			    "vbus", GPIO_ACTIVE_LOW),
335*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTC_USB_POWER,
336*4882a593Smuzhiyun 			    "pullup", GPIO_ACTIVE_HIGH),
337*4882a593Smuzhiyun 		{ },
338*4882a593Smuzhiyun 	},
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun static struct platform_device palmtc_gpio_vbus = {
342*4882a593Smuzhiyun 	.name	= "gpio-vbus",
343*4882a593Smuzhiyun 	.id	= -1,
344*4882a593Smuzhiyun };
345*4882a593Smuzhiyun 
palmtc_udc_init(void)346*4882a593Smuzhiyun static void __init palmtc_udc_init(void)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun 	gpiod_add_lookup_table(&palmtc_udc_gpiod_table);
349*4882a593Smuzhiyun 	platform_device_register(&palmtc_gpio_vbus);
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun #else
palmtc_udc_init(void)352*4882a593Smuzhiyun static inline void palmtc_udc_init(void) {}
353*4882a593Smuzhiyun #endif
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun /******************************************************************************
356*4882a593Smuzhiyun  * Touchscreen / Battery / GPIO-extender
357*4882a593Smuzhiyun  ******************************************************************************/
358*4882a593Smuzhiyun #if	defined(CONFIG_TOUCHSCREEN_UCB1400) || \
359*4882a593Smuzhiyun 	defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
360*4882a593Smuzhiyun static struct platform_device palmtc_ucb1400_device = {
361*4882a593Smuzhiyun 	.name	= "ucb1400_core",
362*4882a593Smuzhiyun 	.id	= -1,
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
palmtc_ts_init(void)365*4882a593Smuzhiyun static void __init palmtc_ts_init(void)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun 	pxa_set_ac97_info(NULL);
368*4882a593Smuzhiyun 	platform_device_register(&palmtc_ucb1400_device);
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun #else
palmtc_ts_init(void)371*4882a593Smuzhiyun static inline void palmtc_ts_init(void) {}
372*4882a593Smuzhiyun #endif
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun /******************************************************************************
375*4882a593Smuzhiyun  * LEDs
376*4882a593Smuzhiyun  ******************************************************************************/
377*4882a593Smuzhiyun #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
378*4882a593Smuzhiyun struct gpio_led palmtc_gpio_leds[] = {
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	.name			= "palmtc:green:user",
381*4882a593Smuzhiyun 	.default_trigger	= "none",
382*4882a593Smuzhiyun 	.gpio			= GPIO_NR_PALMTC_LED_POWER,
383*4882a593Smuzhiyun 	.active_low		= 1,
384*4882a593Smuzhiyun }, {
385*4882a593Smuzhiyun 	.name			= "palmtc:vibra:vibra",
386*4882a593Smuzhiyun 	.default_trigger	= "none",
387*4882a593Smuzhiyun 	.gpio			= GPIO_NR_PALMTC_VIBRA_POWER,
388*4882a593Smuzhiyun 	.active_low		= 1,
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun static struct gpio_led_platform_data palmtc_gpio_led_info = {
394*4882a593Smuzhiyun 	.leds		= palmtc_gpio_leds,
395*4882a593Smuzhiyun 	.num_leds	= ARRAY_SIZE(palmtc_gpio_leds),
396*4882a593Smuzhiyun };
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun static struct platform_device palmtc_leds = {
399*4882a593Smuzhiyun 	.name	= "leds-gpio",
400*4882a593Smuzhiyun 	.id	= -1,
401*4882a593Smuzhiyun 	.dev	= {
402*4882a593Smuzhiyun 		.platform_data	= &palmtc_gpio_led_info,
403*4882a593Smuzhiyun 	}
404*4882a593Smuzhiyun };
405*4882a593Smuzhiyun 
palmtc_leds_init(void)406*4882a593Smuzhiyun static void __init palmtc_leds_init(void)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun 	platform_device_register(&palmtc_leds);
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun #else
palmtc_leds_init(void)411*4882a593Smuzhiyun static inline void palmtc_leds_init(void) {}
412*4882a593Smuzhiyun #endif
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /******************************************************************************
415*4882a593Smuzhiyun  * NOR Flash
416*4882a593Smuzhiyun  ******************************************************************************/
417*4882a593Smuzhiyun #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
418*4882a593Smuzhiyun static struct resource palmtc_flash_resource = {
419*4882a593Smuzhiyun 	.start	= PXA_CS0_PHYS,
420*4882a593Smuzhiyun 	.end	= PXA_CS0_PHYS + SZ_16M - 1,
421*4882a593Smuzhiyun 	.flags	= IORESOURCE_MEM,
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun static struct mtd_partition palmtc_flash_parts[] = {
425*4882a593Smuzhiyun 	{
426*4882a593Smuzhiyun 		.name	= "U-Boot Bootloader",
427*4882a593Smuzhiyun 		.offset	= 0x0,
428*4882a593Smuzhiyun 		.size	= 0x40000,
429*4882a593Smuzhiyun 	},
430*4882a593Smuzhiyun 	{
431*4882a593Smuzhiyun 		.name	= "Linux Kernel",
432*4882a593Smuzhiyun 		.offset	= 0x40000,
433*4882a593Smuzhiyun 		.size	= 0x2c0000,
434*4882a593Smuzhiyun 	},
435*4882a593Smuzhiyun 	{
436*4882a593Smuzhiyun 		.name	= "Filesystem",
437*4882a593Smuzhiyun 		.offset	= 0x300000,
438*4882a593Smuzhiyun 		.size	= 0xcc0000,
439*4882a593Smuzhiyun 	},
440*4882a593Smuzhiyun 	{
441*4882a593Smuzhiyun 		.name	= "U-Boot Environment",
442*4882a593Smuzhiyun 		.offset	= 0xfc0000,
443*4882a593Smuzhiyun 		.size	= MTDPART_SIZ_FULL,
444*4882a593Smuzhiyun 	},
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun static struct physmap_flash_data palmtc_flash_data = {
448*4882a593Smuzhiyun 	.width		= 4,
449*4882a593Smuzhiyun 	.parts		= palmtc_flash_parts,
450*4882a593Smuzhiyun 	.nr_parts	= ARRAY_SIZE(palmtc_flash_parts),
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun static struct platform_device palmtc_flash = {
454*4882a593Smuzhiyun 	.name		= "physmap-flash",
455*4882a593Smuzhiyun 	.id		= -1,
456*4882a593Smuzhiyun 	.resource	= &palmtc_flash_resource,
457*4882a593Smuzhiyun 	.num_resources	= 1,
458*4882a593Smuzhiyun 	.dev = {
459*4882a593Smuzhiyun 		.platform_data	= &palmtc_flash_data,
460*4882a593Smuzhiyun 	},
461*4882a593Smuzhiyun };
462*4882a593Smuzhiyun 
palmtc_nor_init(void)463*4882a593Smuzhiyun static void __init palmtc_nor_init(void)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	platform_device_register(&palmtc_flash);
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun #else
palmtc_nor_init(void)468*4882a593Smuzhiyun static inline void palmtc_nor_init(void) {}
469*4882a593Smuzhiyun #endif
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun /******************************************************************************
472*4882a593Smuzhiyun  * Framebuffer
473*4882a593Smuzhiyun  ******************************************************************************/
474*4882a593Smuzhiyun #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
475*4882a593Smuzhiyun static struct pxafb_mode_info palmtc_lcd_modes[] = {
476*4882a593Smuzhiyun 	{
477*4882a593Smuzhiyun 		.pixclock	= 115384,
478*4882a593Smuzhiyun 		.xres		= 320,
479*4882a593Smuzhiyun 		.yres		= 320,
480*4882a593Smuzhiyun 		.bpp		= 16,
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 		.left_margin	= 27,
483*4882a593Smuzhiyun 		.right_margin	= 7,
484*4882a593Smuzhiyun 		.upper_margin	= 7,
485*4882a593Smuzhiyun 		.lower_margin	= 8,
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 		.hsync_len	= 6,
488*4882a593Smuzhiyun 		.vsync_len	= 1,
489*4882a593Smuzhiyun 	},
490*4882a593Smuzhiyun };
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun static struct pxafb_mach_info palmtc_lcd_screen = {
493*4882a593Smuzhiyun 	.modes			= palmtc_lcd_modes,
494*4882a593Smuzhiyun 	.num_modes		= ARRAY_SIZE(palmtc_lcd_modes),
495*4882a593Smuzhiyun 	.lcd_conn		= LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
496*4882a593Smuzhiyun };
497*4882a593Smuzhiyun 
palmtc_lcd_init(void)498*4882a593Smuzhiyun static void __init palmtc_lcd_init(void)
499*4882a593Smuzhiyun {
500*4882a593Smuzhiyun 	pxa_set_fb_info(NULL, &palmtc_lcd_screen);
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun #else
palmtc_lcd_init(void)503*4882a593Smuzhiyun static inline void palmtc_lcd_init(void) {}
504*4882a593Smuzhiyun #endif
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun /******************************************************************************
507*4882a593Smuzhiyun  * Machine init
508*4882a593Smuzhiyun  ******************************************************************************/
palmtc_init(void)509*4882a593Smuzhiyun static void __init palmtc_init(void)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun 	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtc_pin_config));
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	pxa_set_ffuart_info(NULL);
514*4882a593Smuzhiyun 	pxa_set_btuart_info(NULL);
515*4882a593Smuzhiyun 	pxa_set_stuart_info(NULL);
516*4882a593Smuzhiyun 	pxa_set_hwuart_info(NULL);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	palmtc_mmc_init();
519*4882a593Smuzhiyun 	palmtc_keys_init();
520*4882a593Smuzhiyun 	palmtc_pwm_init();
521*4882a593Smuzhiyun 	palmtc_irda_init();
522*4882a593Smuzhiyun 	palmtc_mkp_init();
523*4882a593Smuzhiyun 	palmtc_udc_init();
524*4882a593Smuzhiyun 	palmtc_ts_init();
525*4882a593Smuzhiyun 	palmtc_nor_init();
526*4882a593Smuzhiyun 	palmtc_lcd_init();
527*4882a593Smuzhiyun 	palmtc_leds_init();
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun MACHINE_START(PALMTC, "Palm Tungsten|C")
531*4882a593Smuzhiyun 	.atag_offset 	= 0x100,
532*4882a593Smuzhiyun 	.map_io		= pxa25x_map_io,
533*4882a593Smuzhiyun 	.nr_irqs	= PXA_NR_IRQS,
534*4882a593Smuzhiyun 	.init_irq	= pxa25x_init_irq,
535*4882a593Smuzhiyun 	.handle_irq	= pxa25x_handle_irq,
536*4882a593Smuzhiyun 	.init_time	= pxa_timer_init,
537*4882a593Smuzhiyun 	.init_machine	= palmtc_init,
538*4882a593Smuzhiyun 	.restart	= pxa_restart,
539*4882a593Smuzhiyun MACHINE_END
540