aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/tosa_battery.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/tosa_battery.c')
-rw-r--r--drivers/power/tosa_battery.c79
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
310static struct { 310static 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)
350static int __devinit tosa_bat_probe(struct platform_device *dev) 345static 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));
428err_gpio:
429 for (; i >= 0; i--)
430 gpio_free(gpios[i].gpio);
431
432 return ret; 409 return ret;
433} 410}
434 411
435static int __devexit tosa_bat_remove(struct platform_device *dev) 412static 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
469static int __init tosa_bat_init(void) 441module_platform_driver(tosa_bat_driver);
470{
471 return platform_driver_register(&tosa_bat_driver);
472}
473
474static void __exit tosa_bat_exit(void)
475{
476 platform_driver_unregister(&tosa_bat_driver);
477}
478
479module_init(tosa_bat_init);
480module_exit(tosa_bat_exit);
481 442
482MODULE_LICENSE("GPL"); 443MODULE_LICENSE("GPL");
483MODULE_AUTHOR("Dmitry Baryshkov"); 444MODULE_AUTHOR("Dmitry Baryshkov");