aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2008-11-20 11:34:57 -0500
committerEric Miao <eric.miao@marvell.com>2008-11-27 09:47:26 -0500
commita730b327ca70f0e4d933202e3979e96613c3585f (patch)
treee52b0d904ae19fcb4e9ca35613119fab28db9653 /arch
parent2fd36a5d6e830269a37f0f6ccfd34ee0517ebc7d (diff)
[ARM] pxa/palmtx: misc fixes to use generic GPIO API
Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Signed-off-by: Eric Miao <eric.miao@marvell.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-pxa/palmtx.c150
1 files changed, 118 insertions, 32 deletions
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index 4447711c9fc6..a9d94f5dbec4 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -56,6 +56,9 @@ static unsigned long palmtx_pin_config[] __initdata = {
56 GPIO110_MMC_DAT_2, 56 GPIO110_MMC_DAT_2,
57 GPIO111_MMC_DAT_3, 57 GPIO111_MMC_DAT_3,
58 GPIO112_MMC_CMD, 58 GPIO112_MMC_CMD,
59 GPIO14_GPIO, /* SD detect */
60 GPIO114_GPIO, /* SD power */
61 GPIO115_GPIO, /* SD r/o switch */
59 62
60 /* AC97 */ 63 /* AC97 */
61 GPIO28_AC97_BITCLK, 64 GPIO28_AC97_BITCLK,
@@ -64,6 +67,7 @@ static unsigned long palmtx_pin_config[] __initdata = {
64 GPIO31_AC97_SYNC, 67 GPIO31_AC97_SYNC,
65 68
66 /* IrDA */ 69 /* IrDA */
70 GPIO40_GPIO, /* ir disable */
67 GPIO46_FICP_RXD, 71 GPIO46_FICP_RXD,
68 GPIO47_FICP_TXD, 72 GPIO47_FICP_TXD,
69 73
@@ -71,7 +75,8 @@ static unsigned long palmtx_pin_config[] __initdata = {
71 GPIO16_PWM0_OUT, 75 GPIO16_PWM0_OUT,
72 76
73 /* USB */ 77 /* USB */
74 GPIO13_GPIO, 78 GPIO13_GPIO, /* usb detect */
79 GPIO95_GPIO, /* usb power */
75 80
76 /* PCMCIA */ 81 /* PCMCIA */
77 GPIO48_nPOE, 82 GPIO48_nPOE,
@@ -84,6 +89,45 @@ static unsigned long palmtx_pin_config[] __initdata = {
84 GPIO55_nPREG, 89 GPIO55_nPREG,
85 GPIO56_nPWAIT, 90 GPIO56_nPWAIT,
86 GPIO57_nIOIS16, 91 GPIO57_nIOIS16,
92 GPIO94_GPIO, /* wifi power 1 */
93 GPIO108_GPIO, /* wifi power 2 */
94 GPIO116_GPIO, /* wifi ready */
95
96 /* MATRIX KEYPAD */
97 GPIO100_KP_MKIN_0,
98 GPIO101_KP_MKIN_1,
99 GPIO102_KP_MKIN_2,
100 GPIO97_KP_MKIN_3,
101 GPIO103_KP_MKOUT_0,
102 GPIO104_KP_MKOUT_1,
103 GPIO105_KP_MKOUT_2,
104
105 /* LCD */
106 GPIO58_LCD_LDD_0,
107 GPIO59_LCD_LDD_1,
108 GPIO60_LCD_LDD_2,
109 GPIO61_LCD_LDD_3,
110 GPIO62_LCD_LDD_4,
111 GPIO63_LCD_LDD_5,
112 GPIO64_LCD_LDD_6,
113 GPIO65_LCD_LDD_7,
114 GPIO66_LCD_LDD_8,
115 GPIO67_LCD_LDD_9,
116 GPIO68_LCD_LDD_10,
117 GPIO69_LCD_LDD_11,
118 GPIO70_LCD_LDD_12,
119 GPIO71_LCD_LDD_13,
120 GPIO72_LCD_LDD_14,
121 GPIO73_LCD_LDD_15,
122 GPIO74_LCD_FCLK,
123 GPIO75_LCD_LCLK,
124 GPIO76_LCD_PCLK,
125 GPIO77_LCD_BIAS,
126
127 /* MISC. */
128 GPIO10_GPIO, /* hotsync button */
129 GPIO12_GPIO, /* power detect */
130 GPIO107_GPIO, /* earphone detect */
87}; 131};
88 132
89/****************************************************************************** 133/******************************************************************************
@@ -95,32 +139,49 @@ static int palmtx_mci_init(struct device *dev, irq_handler_t palmtx_detect_int,
95 int err = 0; 139 int err = 0;
96 140
97 /* Setup an interrupt for detecting card insert/remove events */ 141 /* Setup an interrupt for detecting card insert/remove events */
98 err = request_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, palmtx_detect_int, 142 err = gpio_request(GPIO_NR_PALMTX_SD_DETECT_N, "SD IRQ");
99 IRQF_DISABLED | IRQF_SAMPLE_RANDOM | 143 if (err)
144 goto err;
145 err = gpio_direction_input(GPIO_NR_PALMTX_SD_DETECT_N);
146 if (err)
147 goto err2;
148 err = request_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N),
149 palmtx_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
100 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, 150 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
101 "SD/MMC card detect", data); 151 "SD/MMC card detect", data);
102 if (err) { 152 if (err) {
103 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", 153 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
104 __func__); 154 __func__);
105 return err; 155 goto err2;
106 } 156 }
107 157
108 err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER"); 158 err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER");
109 if (err) 159 if (err)
110 goto pwr_err; 160 goto err3;
161 err = gpio_direction_output(GPIO_NR_PALMTX_SD_POWER, 0);
162 if (err)
163 goto err4;
111 164
112 err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY"); 165 err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY");
113 if (err) 166 if (err)
114 goto ro_err; 167 goto err4;
168 err = gpio_direction_input(GPIO_NR_PALMTX_SD_READONLY);
169 if (err)
170 goto err5;
115 171
116 printk(KERN_DEBUG "%s: irq registered\n", __func__); 172 printk(KERN_DEBUG "%s: irq registered\n", __func__);
117 173
118 return 0; 174 return 0;
119 175
120ro_err: 176err5:
177 gpio_free(GPIO_NR_PALMTX_SD_READONLY);
178err4:
121 gpio_free(GPIO_NR_PALMTX_SD_POWER); 179 gpio_free(GPIO_NR_PALMTX_SD_POWER);
122pwr_err: 180err3:
123 free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data); 181 free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data);
182err2:
183 gpio_free(GPIO_NR_PALMTX_SD_DETECT_N);
184err:
124 return err; 185 return err;
125} 186}
126 187
@@ -128,7 +189,8 @@ static void palmtx_mci_exit(struct device *dev, void *data)
128{ 189{
129 gpio_free(GPIO_NR_PALMTX_SD_READONLY); 190 gpio_free(GPIO_NR_PALMTX_SD_READONLY);
130 gpio_free(GPIO_NR_PALMTX_SD_POWER); 191 gpio_free(GPIO_NR_PALMTX_SD_POWER);
131 free_irq(IRQ_GPIO_PALMTX_SD_DETECT_N, data); 192 free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data);
193 gpio_free(GPIO_NR_PALMTX_SD_DETECT_N);
132} 194}
133 195
134static void palmtx_mci_power(struct device *dev, unsigned int vdd) 196static void palmtx_mci_power(struct device *dev, unsigned int vdd)
@@ -167,7 +229,6 @@ static unsigned int palmtx_matrix_keys[] = {
167 229
168 KEY(3, 0, KEY_RIGHT), 230 KEY(3, 0, KEY_RIGHT),
169 KEY(3, 2, KEY_LEFT), 231 KEY(3, 2, KEY_LEFT),
170
171}; 232};
172 233
173static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = { 234static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
@@ -209,11 +270,19 @@ static int palmtx_backlight_init(struct device *dev)
209 ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER"); 270 ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER");
210 if (ret) 271 if (ret)
211 goto err; 272 goto err;
273 ret = gpio_direction_output(GPIO_NR_PALMTX_BL_POWER, 0);
274 if (ret)
275 goto err2;
212 ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER"); 276 ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER");
213 if (ret) 277 if (ret)
214 goto err2; 278 goto err2;
279 ret = gpio_direction_output(GPIO_NR_PALMTX_LCD_POWER, 0);
280 if (ret)
281 goto err3;
215 282
216 return 0; 283 return 0;
284err3:
285 gpio_free(GPIO_NR_PALMTX_LCD_POWER);
217err2: 286err2:
218 gpio_free(GPIO_NR_PALMTX_BL_POWER); 287 gpio_free(GPIO_NR_PALMTX_BL_POWER);
219err: 288err:
@@ -254,6 +323,24 @@ static struct platform_device palmtx_backlight = {
254/****************************************************************************** 323/******************************************************************************
255 * IrDA 324 * IrDA
256 ******************************************************************************/ 325 ******************************************************************************/
326static int palmtx_irda_startup(struct device *dev)
327{
328 int err;
329 err = gpio_request(GPIO_NR_PALMTX_IR_DISABLE, "IR DISABLE");
330 if (err)
331 goto err;
332 err = gpio_direction_output(GPIO_NR_PALMTX_IR_DISABLE, 1);
333 if (err)
334 gpio_free(GPIO_NR_PALMTX_IR_DISABLE);
335err:
336 return err;
337}
338
339static void palmtx_irda_shutdown(struct device *dev)
340{
341 gpio_free(GPIO_NR_PALMTX_IR_DISABLE);
342}
343
257static void palmtx_irda_transceiver_mode(struct device *dev, int mode) 344static void palmtx_irda_transceiver_mode(struct device *dev, int mode)
258{ 345{
259 gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF); 346 gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF);
@@ -261,6 +348,8 @@ static void palmtx_irda_transceiver_mode(struct device *dev, int mode)
261} 348}
262 349
263static struct pxaficp_platform_data palmtx_ficp_platform_data = { 350static struct pxaficp_platform_data palmtx_ficp_platform_data = {
351 .startup = palmtx_irda_startup,
352 .shutdown = palmtx_irda_shutdown,
264 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, 353 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
265 .transceiver_mode = palmtx_irda_transceiver_mode, 354 .transceiver_mode = palmtx_irda_transceiver_mode,
266}; 355};
@@ -268,17 +357,11 @@ static struct pxaficp_platform_data palmtx_ficp_platform_data = {
268/****************************************************************************** 357/******************************************************************************
269 * UDC 358 * UDC
270 ******************************************************************************/ 359 ******************************************************************************/
271static void palmtx_udc_command(int cmd)
272{
273 gpio_set_value(GPIO_NR_PALMTX_USB_POWER, !cmd);
274 udelay(50);
275 gpio_set_value(GPIO_NR_PALMTX_USB_PULLUP, !cmd);
276}
277
278static struct pxa2xx_udc_mach_info palmtx_udc_info __initdata = { 360static struct pxa2xx_udc_mach_info palmtx_udc_info __initdata = {
279 .gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N, 361 .gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N,
280 .gpio_vbus_inverted = 1, 362 .gpio_vbus_inverted = 1,
281 .udc_command = palmtx_udc_command, 363 .gpio_pullup = GPIO_NR_PALMTX_USB_POWER,
364 .gpio_pullup_inverted = 0,
282}; 365};
283 366
284/****************************************************************************** 367/******************************************************************************
@@ -290,17 +373,16 @@ static int power_supply_init(struct device *dev)
290 373
291 ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC"); 374 ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC");
292 if (ret) 375 if (ret)
293 goto err_cs_ac; 376 goto err1;
294 377 ret = gpio_direction_input(GPIO_NR_PALMTX_POWER_DETECT);
295 ret = gpio_request(GPIO_NR_PALMTX_USB_DETECT_N, "CABLE_STATE_USB");
296 if (ret) 378 if (ret)
297 goto err_cs_usb; 379 goto err2;
298 380
299 return 0; 381 return 0;
300 382
301err_cs_usb: 383err2:
302 gpio_free(GPIO_NR_PALMTX_POWER_DETECT); 384 gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
303err_cs_ac: 385err1:
304 return ret; 386 return ret;
305} 387}
306 388
@@ -309,14 +391,8 @@ static int palmtx_is_ac_online(void)
309 return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT); 391 return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT);
310} 392}
311 393
312static int palmtx_is_usb_online(void)
313{
314 return !gpio_get_value(GPIO_NR_PALMTX_USB_DETECT_N);
315}
316
317static void power_supply_exit(struct device *dev) 394static void power_supply_exit(struct device *dev)
318{ 395{
319 gpio_free(GPIO_NR_PALMTX_USB_DETECT_N);
320 gpio_free(GPIO_NR_PALMTX_POWER_DETECT); 396 gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
321} 397}
322 398
@@ -327,7 +403,6 @@ static char *palmtx_supplicants[] = {
327static struct pda_power_pdata power_supply_info = { 403static struct pda_power_pdata power_supply_info = {
328 .init = power_supply_init, 404 .init = power_supply_init,
329 .is_ac_online = palmtx_is_ac_online, 405 .is_ac_online = palmtx_is_ac_online,
330 .is_usb_online = palmtx_is_usb_online,
331 .exit = power_supply_exit, 406 .exit = power_supply_exit,
332 .supplied_to = palmtx_supplicants, 407 .supplied_to = palmtx_supplicants,
333 .num_supplicants = ARRAY_SIZE(palmtx_supplicants), 408 .num_supplicants = ARRAY_SIZE(palmtx_supplicants),
@@ -410,12 +485,23 @@ static void __init palmtx_map_io(void)
410 iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc)); 485 iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
411} 486}
412 487
488/* setup udc GPIOs initial state */
489static void __init palmtx_udc_init(void)
490{
491 if (!gpio_request(GPIO_NR_PALMTX_USB_POWER, "UDC Vbus")) {
492 gpio_direction_output(GPIO_NR_PALMTX_USB_POWER, 1);
493 gpio_free(GPIO_NR_PALMTX_USB_POWER);
494 }
495}
496
497
413static void __init palmtx_init(void) 498static void __init palmtx_init(void)
414{ 499{
415 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config)); 500 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
416 501
417 set_pxa_fb_info(&palmtx_lcd_screen); 502 set_pxa_fb_info(&palmtx_lcd_screen);
418 pxa_set_mci_info(&palmtx_mci_platform_data); 503 pxa_set_mci_info(&palmtx_mci_platform_data);
504 palmtx_udc_init();
419 pxa_set_udc_info(&palmtx_udc_info); 505 pxa_set_udc_info(&palmtx_udc_info);
420 pxa_set_ac97_info(NULL); 506 pxa_set_ac97_info(NULL);
421 pxa_set_ficp_info(&palmtx_ficp_platform_data); 507 pxa_set_ficp_info(&palmtx_ficp_platform_data);