diff options
| -rw-r--r-- | arch/arm/mach-pxa/tosa.c | 88 | ||||
| -rw-r--r-- | include/asm-arm/arch-pxa/tosa.h | 25 |
2 files changed, 71 insertions, 42 deletions
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 9f5ca5497bb9..49b5b83c0e4c 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
| 24 | #include <linux/gpio_keys.h> | 24 | #include <linux/gpio_keys.h> |
| 25 | #include <linux/input.h> | 25 | #include <linux/input.h> |
| 26 | #include <linux/gpio.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
| 28 | #include <asm/memory.h> | 29 | #include <asm/memory.h> |
| @@ -166,8 +167,7 @@ static struct resource tosa_scoop_resources[] = { | |||
| 166 | 167 | ||
| 167 | static struct scoop_config tosa_scoop_setup = { | 168 | static struct scoop_config tosa_scoop_setup = { |
| 168 | .io_dir = TOSA_SCOOP_IO_DIR, | 169 | .io_dir = TOSA_SCOOP_IO_DIR, |
| 169 | .io_out = TOSA_SCOOP_IO_OUT, | 170 | .gpio_base = TOSA_SCOOP_GPIO_BASE, |
| 170 | |||
| 171 | }; | 171 | }; |
| 172 | 172 | ||
| 173 | struct platform_device tosascoop_device = { | 173 | struct platform_device tosascoop_device = { |
| @@ -194,7 +194,7 @@ static struct resource tosa_scoop_jc_resources[] = { | |||
| 194 | 194 | ||
| 195 | static struct scoop_config tosa_scoop_jc_setup = { | 195 | static struct scoop_config tosa_scoop_jc_setup = { |
| 196 | .io_dir = TOSA_SCOOP_JC_IO_DIR, | 196 | .io_dir = TOSA_SCOOP_JC_IO_DIR, |
| 197 | .io_out = TOSA_SCOOP_JC_IO_OUT, | 197 | .gpio_base = TOSA_SCOOP_JC_GPIO_BASE, |
| 198 | }; | 198 | }; |
| 199 | 199 | ||
| 200 | struct platform_device tosascoop_jc_device = { | 200 | struct platform_device tosascoop_jc_device = { |
| @@ -232,20 +232,8 @@ static struct scoop_pcmcia_config tosa_pcmcia_config = { | |||
| 232 | /* | 232 | /* |
| 233 | * USB Device Controller | 233 | * USB Device Controller |
| 234 | */ | 234 | */ |
| 235 | static void tosa_udc_command(int cmd) | ||
| 236 | { | ||
| 237 | switch(cmd) { | ||
| 238 | case PXA2XX_UDC_CMD_CONNECT: | ||
| 239 | set_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_USB_PULLUP); | ||
| 240 | break; | ||
| 241 | case PXA2XX_UDC_CMD_DISCONNECT: | ||
| 242 | reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_USB_PULLUP); | ||
| 243 | break; | ||
| 244 | } | ||
| 245 | } | ||
| 246 | |||
| 247 | static struct pxa2xx_udc_mach_info udc_info __initdata = { | 235 | static struct pxa2xx_udc_mach_info udc_info __initdata = { |
| 248 | .udc_command = tosa_udc_command, | 236 | .gpio_pullup = TOSA_GPIO_USB_PULLUP, |
| 249 | .gpio_vbus = TOSA_GPIO_USB_IN, | 237 | .gpio_vbus = TOSA_GPIO_USB_IN, |
| 250 | .gpio_vbus_inverted = 1, | 238 | .gpio_vbus_inverted = 1, |
| 251 | }; | 239 | }; |
| @@ -264,9 +252,39 @@ static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void | |||
| 264 | err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int, | 252 | err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int, |
| 265 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 253 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
| 266 | "MMC/SD card detect", data); | 254 | "MMC/SD card detect", data); |
| 267 | if (err) | 255 | if (err) { |
| 268 | printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); | 256 | printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); |
| 257 | goto err_irq; | ||
| 258 | } | ||
| 259 | |||
| 260 | err = gpio_request(TOSA_GPIO_SD_WP, "sd_wp"); | ||
| 261 | if (err) { | ||
| 262 | printk(KERN_ERR "tosa_mci_init: can't request SD_WP gpio\n"); | ||
| 263 | goto err_gpio_wp; | ||
| 264 | } | ||
| 265 | err = gpio_direction_input(TOSA_GPIO_SD_WP); | ||
| 266 | if (err) | ||
| 267 | goto err_gpio_wp_dir; | ||
| 268 | |||
| 269 | err = gpio_request(TOSA_GPIO_PWR_ON, "sd_pwr"); | ||
| 270 | if (err) { | ||
| 271 | printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n"); | ||
| 272 | goto err_gpio_pwr; | ||
| 273 | } | ||
| 274 | err = gpio_direction_output(TOSA_GPIO_PWR_ON, 0); | ||
| 275 | if (err) | ||
| 276 | goto err_gpio_pwr_dir; | ||
| 269 | 277 | ||
| 278 | return 0; | ||
| 279 | |||
| 280 | err_gpio_pwr_dir: | ||
| 281 | gpio_free(TOSA_GPIO_PWR_ON); | ||
| 282 | err_gpio_pwr: | ||
| 283 | err_gpio_wp_dir: | ||
| 284 | gpio_free(TOSA_GPIO_SD_WP); | ||
| 285 | err_gpio_wp: | ||
| 286 | free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data); | ||
| 287 | err_irq: | ||
| 270 | return err; | 288 | return err; |
| 271 | } | 289 | } |
| 272 | 290 | ||
| @@ -275,19 +293,21 @@ static void tosa_mci_setpower(struct device *dev, unsigned int vdd) | |||
| 275 | struct pxamci_platform_data* p_d = dev->platform_data; | 293 | struct pxamci_platform_data* p_d = dev->platform_data; |
| 276 | 294 | ||
| 277 | if (( 1 << vdd) & p_d->ocr_mask) { | 295 | if (( 1 << vdd) & p_d->ocr_mask) { |
| 278 | set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_PWR_ON); | 296 | gpio_set_value(TOSA_GPIO_PWR_ON, 1); |
| 279 | } else { | 297 | } else { |
| 280 | reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_PWR_ON); | 298 | gpio_set_value(TOSA_GPIO_PWR_ON, 0); |
| 281 | } | 299 | } |
| 282 | } | 300 | } |
| 283 | 301 | ||
| 284 | static int tosa_mci_get_ro(struct device *dev) | 302 | static int tosa_mci_get_ro(struct device *dev) |
| 285 | { | 303 | { |
| 286 | return (read_scoop_reg(&tosascoop_device.dev, SCOOP_GPWR)&TOSA_SCOOP_SD_WP); | 304 | return gpio_get_value(TOSA_GPIO_SD_WP); |
| 287 | } | 305 | } |
| 288 | 306 | ||
| 289 | static void tosa_mci_exit(struct device *dev, void *data) | 307 | static void tosa_mci_exit(struct device *dev, void *data) |
| 290 | { | 308 | { |
| 309 | gpio_free(TOSA_GPIO_PWR_ON); | ||
| 310 | gpio_free(TOSA_GPIO_SD_WP); | ||
| 291 | free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data); | 311 | free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data); |
| 292 | } | 312 | } |
| 293 | 313 | ||
| @@ -302,18 +322,36 @@ static struct pxamci_platform_data tosa_mci_platform_data = { | |||
| 302 | /* | 322 | /* |
| 303 | * Irda | 323 | * Irda |
| 304 | */ | 324 | */ |
| 305 | static void tosa_irda_transceiver_mode(struct device *dev, int mode) | 325 | static int tosa_irda_startup(struct device *dev) |
| 306 | { | 326 | { |
| 307 | if (mode & IR_OFF) { | 327 | int ret; |
| 308 | reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_IR_POWERDWN); | 328 | |
| 309 | } else { | 329 | ret = gpio_request(TOSA_GPIO_IR_POWERDWN, "IrDA powerdown"); |
| 310 | set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_IR_POWERDWN); | 330 | if (ret) |
| 331 | return ret; | ||
| 332 | |||
| 333 | ret = gpio_direction_output(TOSA_GPIO_IR_POWERDWN, 0); | ||
| 334 | if (ret) | ||
| 335 | gpio_free(TOSA_GPIO_IR_POWERDWN); | ||
| 336 | |||
| 337 | return ret; | ||
| 311 | } | 338 | } |
| 339 | |||
| 340 | static void tosa_irda_shutdown(struct device *dev) | ||
| 341 | { | ||
| 342 | gpio_free(TOSA_GPIO_IR_POWERDWN); | ||
| 343 | } | ||
| 344 | |||
| 345 | static void tosa_irda_transceiver_mode(struct device *dev, int mode) | ||
| 346 | { | ||
| 347 | gpio_set_value(TOSA_GPIO_IR_POWERDWN, !(mode & IR_OFF)); | ||
| 312 | } | 348 | } |
| 313 | 349 | ||
| 314 | static struct pxaficp_platform_data tosa_ficp_platform_data = { | 350 | static struct pxaficp_platform_data tosa_ficp_platform_data = { |
| 315 | .transceiver_cap = IR_SIRMODE | IR_OFF, | 351 | .transceiver_cap = IR_SIRMODE | IR_OFF, |
| 316 | .transceiver_mode = tosa_irda_transceiver_mode, | 352 | .transceiver_mode = tosa_irda_transceiver_mode, |
| 353 | .startup = tosa_irda_startup, | ||
| 354 | .shutdown = tosa_irda_shutdown, | ||
| 317 | }; | 355 | }; |
| 318 | 356 | ||
| 319 | /* | 357 | /* |
diff --git a/include/asm-arm/arch-pxa/tosa.h b/include/asm-arm/arch-pxa/tosa.h index c05e4faf85a6..130bc6025cf4 100644 --- a/include/asm-arm/arch-pxa/tosa.h +++ b/include/asm-arm/arch-pxa/tosa.h | |||
| @@ -23,11 +23,12 @@ | |||
| 23 | /* | 23 | /* |
| 24 | * SCOOP2 internal GPIOs | 24 | * SCOOP2 internal GPIOs |
| 25 | */ | 25 | */ |
| 26 | #define TOSA_SCOOP_GPIO_BASE NR_BUILTIN_GPIO | ||
| 26 | #define TOSA_SCOOP_PXA_VCORE1 SCOOP_GPCR_PA11 | 27 | #define TOSA_SCOOP_PXA_VCORE1 SCOOP_GPCR_PA11 |
| 27 | #define TOSA_SCOOP_TC6393_REST_IN SCOOP_GPCR_PA12 | 28 | #define TOSA_SCOOP_TC6393_REST_IN SCOOP_GPCR_PA12 |
| 28 | #define TOSA_SCOOP_IR_POWERDWN SCOOP_GPCR_PA13 | 29 | #define TOSA_GPIO_IR_POWERDWN (TOSA_SCOOP_GPIO_BASE + 2) |
| 29 | #define TOSA_SCOOP_SD_WP SCOOP_GPCR_PA14 | 30 | #define TOSA_GPIO_SD_WP (TOSA_SCOOP_GPIO_BASE + 3) |
| 30 | #define TOSA_SCOOP_PWR_ON SCOOP_GPCR_PA15 | 31 | #define TOSA_GPIO_PWR_ON (TOSA_SCOOP_GPIO_BASE + 4) |
| 31 | #define TOSA_SCOOP_AUD_PWR_ON SCOOP_GPCR_PA16 | 32 | #define TOSA_SCOOP_AUD_PWR_ON SCOOP_GPCR_PA16 |
| 32 | #define TOSA_SCOOP_BT_RESET SCOOP_GPCR_PA17 | 33 | #define TOSA_SCOOP_BT_RESET SCOOP_GPCR_PA17 |
| 33 | #define TOSA_SCOOP_BT_PWR_EN SCOOP_GPCR_PA18 | 34 | #define TOSA_SCOOP_BT_PWR_EN SCOOP_GPCR_PA18 |
| @@ -35,7 +36,7 @@ | |||
| 35 | 36 | ||
| 36 | /* GPIO Direction 1 : output mode / 0:input mode */ | 37 | /* GPIO Direction 1 : output mode / 0:input mode */ |
| 37 | #define TOSA_SCOOP_IO_DIR ( TOSA_SCOOP_PXA_VCORE1 | TOSA_SCOOP_TC6393_REST_IN | \ | 38 | #define TOSA_SCOOP_IO_DIR ( TOSA_SCOOP_PXA_VCORE1 | TOSA_SCOOP_TC6393_REST_IN | \ |
| 38 | TOSA_SCOOP_IR_POWERDWN | TOSA_SCOOP_PWR_ON | TOSA_SCOOP_AUD_PWR_ON |\ | 39 | TOSA_SCOOP_AUD_PWR_ON |\ |
| 39 | TOSA_SCOOP_BT_RESET | TOSA_SCOOP_BT_PWR_EN ) | 40 | TOSA_SCOOP_BT_RESET | TOSA_SCOOP_BT_PWR_EN ) |
| 40 | /* GPIO out put level when init 1: Hi */ | 41 | /* GPIO out put level when init 1: Hi */ |
| 41 | #define TOSA_SCOOP_IO_OUT ( TOSA_SCOOP_TC6393_REST_IN ) | 42 | #define TOSA_SCOOP_IO_OUT ( TOSA_SCOOP_TC6393_REST_IN ) |
| @@ -43,10 +44,11 @@ | |||
| 43 | /* | 44 | /* |
| 44 | * SCOOP2 jacket GPIOs | 45 | * SCOOP2 jacket GPIOs |
| 45 | */ | 46 | */ |
| 47 | #define TOSA_SCOOP_JC_GPIO_BASE (NR_BUILTIN_GPIO + 12) | ||
| 46 | #define TOSA_SCOOP_JC_BT_LED SCOOP_GPCR_PA11 | 48 | #define TOSA_SCOOP_JC_BT_LED SCOOP_GPCR_PA11 |
| 47 | #define TOSA_SCOOP_JC_NOTE_LED SCOOP_GPCR_PA12 | 49 | #define TOSA_SCOOP_JC_NOTE_LED SCOOP_GPCR_PA12 |
| 48 | #define TOSA_SCOOP_JC_CHRG_ERR_LED SCOOP_GPCR_PA13 | 50 | #define TOSA_SCOOP_JC_CHRG_ERR_LED SCOOP_GPCR_PA13 |
| 49 | #define TOSA_SCOOP_JC_USB_PULLUP SCOOP_GPCR_PA14 | 51 | #define TOSA_GPIO_USB_PULLUP (TOSA_SCOOP_JC_GPIO_BASE + 3) |
| 50 | #define TOSA_SCOOP_JC_TC6393_SUSPEND SCOOP_GPCR_PA15 | 52 | #define TOSA_SCOOP_JC_TC6393_SUSPEND SCOOP_GPCR_PA15 |
| 51 | #define TOSA_SCOOP_JC_TC3693_L3V_ON SCOOP_GPCR_PA16 | 53 | #define TOSA_SCOOP_JC_TC3693_L3V_ON SCOOP_GPCR_PA16 |
| 52 | #define TOSA_SCOOP_JC_WLAN_DETECT SCOOP_GPCR_PA17 | 54 | #define TOSA_SCOOP_JC_WLAN_DETECT SCOOP_GPCR_PA17 |
| @@ -55,11 +57,9 @@ | |||
| 55 | 57 | ||
| 56 | /* GPIO Direction 1 : output mode / 0:input mode */ | 58 | /* GPIO Direction 1 : output mode / 0:input mode */ |
| 57 | #define TOSA_SCOOP_JC_IO_DIR ( TOSA_SCOOP_JC_BT_LED | TOSA_SCOOP_JC_NOTE_LED | \ | 59 | #define TOSA_SCOOP_JC_IO_DIR ( TOSA_SCOOP_JC_BT_LED | TOSA_SCOOP_JC_NOTE_LED | \ |
| 58 | TOSA_SCOOP_JC_CHRG_ERR_LED | TOSA_SCOOP_JC_USB_PULLUP | \ | 60 | TOSA_SCOOP_JC_CHRG_ERR_LED | \ |
| 59 | TOSA_SCOOP_JC_TC6393_SUSPEND | TOSA_SCOOP_JC_TC3693_L3V_ON | \ | 61 | TOSA_SCOOP_JC_TC6393_SUSPEND | TOSA_SCOOP_JC_TC3693_L3V_ON | \ |
| 60 | TOSA_SCOOP_JC_WLAN_LED | TOSA_SCOOP_JC_CARD_LIMIT_SEL ) | 62 | TOSA_SCOOP_JC_WLAN_LED | TOSA_SCOOP_JC_CARD_LIMIT_SEL ) |
| 61 | /* GPIO out put level when init 1: Hi */ | ||
| 62 | #define TOSA_SCOOP_JC_IO_OUT ( 0 ) | ||
| 63 | 63 | ||
| 64 | /* | 64 | /* |
| 65 | * Timing Generator | 65 | * Timing Generator |
| @@ -74,15 +74,6 @@ | |||
| 74 | #define TG_HPOSCTL 0x07 | 74 | #define TG_HPOSCTL 0x07 |
| 75 | 75 | ||
| 76 | /* | 76 | /* |
| 77 | * LED | ||
| 78 | */ | ||
| 79 | #define TOSA_SCOOP_LED_BLUE TOSA_SCOOP_GPCR_PA11 | ||
| 80 | #define TOSA_SCOOP_LED_GREEN TOSA_SCOOP_GPCR_PA12 | ||
| 81 | #define TOSA_SCOOP_LED_ORANGE TOSA_SCOOP_GPCR_PA13 | ||
| 82 | #define TOSA_SCOOP_LED_WLAN TOSA_SCOOP_GPCR_PA18 | ||
| 83 | |||
| 84 | |||
| 85 | /* | ||
| 86 | * PXA GPIOs | 77 | * PXA GPIOs |
| 87 | */ | 78 | */ |
| 88 | #define TOSA_GPIO_POWERON (0) | 79 | #define TOSA_GPIO_POWERON (0) |
