diff options
Diffstat (limited to 'drivers/power/tosa_battery.c')
-rw-r--r-- | drivers/power/tosa_battery.c | 79 |
1 files changed, 20 insertions, 59 deletions
diff --git a/drivers/power/tosa_battery.c b/drivers/power/tosa_battery.c index 53f0d3524fc..28bbe7e094e 100644 --- a/drivers/power/tosa_battery.c +++ b/drivers/power/tosa_battery.c | |||
@@ -307,25 +307,20 @@ static struct tosa_bat tosa_bat_bu = { | |||
307 | .adc_temp_divider = -1, | 307 | .adc_temp_divider = -1, |
308 | }; | 308 | }; |
309 | 309 | ||
310 | static struct { | 310 | static struct gpio tosa_bat_gpios[] = { |
311 | int gpio; | 311 | { TOSA_GPIO_CHARGE_OFF, GPIOF_OUT_INIT_HIGH, "main charge off" }, |
312 | char *name; | 312 | { TOSA_GPIO_CHARGE_OFF_JC, GPIOF_OUT_INIT_HIGH, "jacket charge off" }, |
313 | bool output; | 313 | { TOSA_GPIO_BAT_SW_ON, GPIOF_OUT_INIT_LOW, "battery switch" }, |
314 | int value; | 314 | { TOSA_GPIO_BAT0_V_ON, GPIOF_OUT_INIT_LOW, "main battery" }, |
315 | } gpios[] = { | 315 | { TOSA_GPIO_BAT1_V_ON, GPIOF_OUT_INIT_LOW, "jacket battery" }, |
316 | { TOSA_GPIO_CHARGE_OFF, "main charge off", 1, 1 }, | 316 | { TOSA_GPIO_BAT1_TH_ON, GPIOF_OUT_INIT_LOW, "main battery temp" }, |
317 | { TOSA_GPIO_CHARGE_OFF_JC, "jacket charge off", 1, 1 }, | 317 | { TOSA_GPIO_BAT0_TH_ON, GPIOF_OUT_INIT_LOW, "jacket battery temp" }, |
318 | { TOSA_GPIO_BAT_SW_ON, "battery switch", 1, 0 }, | 318 | { TOSA_GPIO_BU_CHRG_ON, GPIOF_OUT_INIT_LOW, "backup battery" }, |
319 | { TOSA_GPIO_BAT0_V_ON, "main battery", 1, 0 }, | 319 | { TOSA_GPIO_BAT0_CRG, GPIOF_IN, "main battery full" }, |
320 | { TOSA_GPIO_BAT1_V_ON, "jacket battery", 1, 0 }, | 320 | { TOSA_GPIO_BAT1_CRG, GPIOF_IN, "jacket battery full" }, |
321 | { TOSA_GPIO_BAT1_TH_ON, "main battery temp", 1, 0 }, | 321 | { TOSA_GPIO_BAT0_LOW, GPIOF_IN, "main battery low" }, |
322 | { TOSA_GPIO_BAT0_TH_ON, "jacket battery temp", 1, 0 }, | 322 | { TOSA_GPIO_BAT1_LOW, GPIOF_IN, "jacket battery low" }, |
323 | { TOSA_GPIO_BU_CHRG_ON, "backup battery", 1, 0 }, | 323 | { TOSA_GPIO_JACKET_DETECT, GPIOF_IN, "jacket detect" }, |
324 | { TOSA_GPIO_BAT0_CRG, "main battery full", 0, 0 }, | ||
325 | { TOSA_GPIO_BAT1_CRG, "jacket battery full", 0, 0 }, | ||
326 | { TOSA_GPIO_BAT0_LOW, "main battery low", 0, 0 }, | ||
327 | { TOSA_GPIO_BAT1_LOW, "jacket battery low", 0, 0 }, | ||
328 | { TOSA_GPIO_JACKET_DETECT, "jacket detect", 0, 0 }, | ||
329 | }; | 324 | }; |
330 | 325 | ||
331 | #ifdef CONFIG_PM | 326 | #ifdef CONFIG_PM |
@@ -350,27 +345,13 @@ static int tosa_bat_resume(struct platform_device *dev) | |||
350 | static int __devinit tosa_bat_probe(struct platform_device *dev) | 345 | static int __devinit tosa_bat_probe(struct platform_device *dev) |
351 | { | 346 | { |
352 | int ret; | 347 | int ret; |
353 | int i; | ||
354 | 348 | ||
355 | if (!machine_is_tosa()) | 349 | if (!machine_is_tosa()) |
356 | return -ENODEV; | 350 | return -ENODEV; |
357 | 351 | ||
358 | for (i = 0; i < ARRAY_SIZE(gpios); i++) { | 352 | ret = gpio_request_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios)); |
359 | ret = gpio_request(gpios[i].gpio, gpios[i].name); | 353 | if (ret) |
360 | if (ret) { | 354 | return ret; |
361 | i--; | ||
362 | goto err_gpio; | ||
363 | } | ||
364 | |||
365 | if (gpios[i].output) | ||
366 | ret = gpio_direction_output(gpios[i].gpio, | ||
367 | gpios[i].value); | ||
368 | else | ||
369 | ret = gpio_direction_input(gpios[i].gpio); | ||
370 | |||
371 | if (ret) | ||
372 | goto err_gpio; | ||
373 | } | ||
374 | 355 | ||
375 | mutex_init(&tosa_bat_main.work_lock); | 356 | mutex_init(&tosa_bat_main.work_lock); |
376 | mutex_init(&tosa_bat_jacket.work_lock); | 357 | mutex_init(&tosa_bat_jacket.work_lock); |
@@ -424,18 +405,12 @@ err_psy_reg_main: | |||
424 | /* see comment in tosa_bat_remove */ | 405 | /* see comment in tosa_bat_remove */ |
425 | cancel_work_sync(&bat_work); | 406 | cancel_work_sync(&bat_work); |
426 | 407 | ||
427 | i--; | 408 | gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios)); |
428 | err_gpio: | ||
429 | for (; i >= 0; i--) | ||
430 | gpio_free(gpios[i].gpio); | ||
431 | |||
432 | return ret; | 409 | return ret; |
433 | } | 410 | } |
434 | 411 | ||
435 | static int __devexit tosa_bat_remove(struct platform_device *dev) | 412 | static int __devexit tosa_bat_remove(struct platform_device *dev) |
436 | { | 413 | { |
437 | int i; | ||
438 | |||
439 | free_irq(gpio_to_irq(TOSA_GPIO_JACKET_DETECT), &tosa_bat_jacket); | 414 | free_irq(gpio_to_irq(TOSA_GPIO_JACKET_DETECT), &tosa_bat_jacket); |
440 | free_irq(gpio_to_irq(TOSA_GPIO_BAT1_CRG), &tosa_bat_jacket); | 415 | free_irq(gpio_to_irq(TOSA_GPIO_BAT1_CRG), &tosa_bat_jacket); |
441 | free_irq(gpio_to_irq(TOSA_GPIO_BAT0_CRG), &tosa_bat_main); | 416 | free_irq(gpio_to_irq(TOSA_GPIO_BAT0_CRG), &tosa_bat_main); |
@@ -450,10 +425,7 @@ static int __devexit tosa_bat_remove(struct platform_device *dev) | |||
450 | * unregistered now. | 425 | * unregistered now. |
451 | */ | 426 | */ |
452 | cancel_work_sync(&bat_work); | 427 | cancel_work_sync(&bat_work); |
453 | 428 | gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios)); | |
454 | for (i = ARRAY_SIZE(gpios) - 1; i >= 0; i--) | ||
455 | gpio_free(gpios[i].gpio); | ||
456 | |||
457 | return 0; | 429 | return 0; |
458 | } | 430 | } |
459 | 431 | ||
@@ -466,18 +438,7 @@ static struct platform_driver tosa_bat_driver = { | |||
466 | .resume = tosa_bat_resume, | 438 | .resume = tosa_bat_resume, |
467 | }; | 439 | }; |
468 | 440 | ||
469 | static int __init tosa_bat_init(void) | 441 | module_platform_driver(tosa_bat_driver); |
470 | { | ||
471 | return platform_driver_register(&tosa_bat_driver); | ||
472 | } | ||
473 | |||
474 | static void __exit tosa_bat_exit(void) | ||
475 | { | ||
476 | platform_driver_unregister(&tosa_bat_driver); | ||
477 | } | ||
478 | |||
479 | module_init(tosa_bat_init); | ||
480 | module_exit(tosa_bat_exit); | ||
481 | 442 | ||
482 | MODULE_LICENSE("GPL"); | 443 | MODULE_LICENSE("GPL"); |
483 | MODULE_AUTHOR("Dmitry Baryshkov"); | 444 | MODULE_AUTHOR("Dmitry Baryshkov"); |