]> Pileus Git - ~andy/linux/blobdiff - drivers/power/tosa_battery.c
Merge branch 'for-3.3' of git://linux-nfs.org/~bfields/linux
[~andy/linux] / drivers / power / tosa_battery.c
index 53f0d3524fcd58f483a0ebcda42ccc0a353726e8..28bbe7e094e36a7695ffaf4a81e3e3e50dbf5ca4 100644 (file)
@@ -307,25 +307,20 @@ static struct tosa_bat tosa_bat_bu = {
        .adc_temp_divider = -1,
 };
 
-static struct {
-       int gpio;
-       char *name;
-       bool output;
-       int value;
-} gpios[] = {
-       { TOSA_GPIO_CHARGE_OFF,         "main charge off",      1, 1 },
-       { TOSA_GPIO_CHARGE_OFF_JC,      "jacket charge off",    1, 1 },
-       { TOSA_GPIO_BAT_SW_ON,          "battery switch",       1, 0 },
-       { TOSA_GPIO_BAT0_V_ON,          "main battery",         1, 0 },
-       { TOSA_GPIO_BAT1_V_ON,          "jacket battery",       1, 0 },
-       { TOSA_GPIO_BAT1_TH_ON,         "main battery temp",    1, 0 },
-       { TOSA_GPIO_BAT0_TH_ON,         "jacket battery temp",  1, 0 },
-       { TOSA_GPIO_BU_CHRG_ON,         "backup battery",       1, 0 },
-       { TOSA_GPIO_BAT0_CRG,           "main battery full",    0, 0 },
-       { TOSA_GPIO_BAT1_CRG,           "jacket battery full",  0, 0 },
-       { TOSA_GPIO_BAT0_LOW,           "main battery low",     0, 0 },
-       { TOSA_GPIO_BAT1_LOW,           "jacket battery low",   0, 0 },
-       { TOSA_GPIO_JACKET_DETECT,      "jacket detect",        0, 0 },
+static struct gpio tosa_bat_gpios[] = {
+       { TOSA_GPIO_CHARGE_OFF,    GPIOF_OUT_INIT_HIGH, "main charge off" },
+       { TOSA_GPIO_CHARGE_OFF_JC, GPIOF_OUT_INIT_HIGH, "jacket charge off" },
+       { TOSA_GPIO_BAT_SW_ON,     GPIOF_OUT_INIT_LOW,  "battery switch" },
+       { TOSA_GPIO_BAT0_V_ON,     GPIOF_OUT_INIT_LOW,  "main battery" },
+       { TOSA_GPIO_BAT1_V_ON,     GPIOF_OUT_INIT_LOW,  "jacket battery" },
+       { TOSA_GPIO_BAT1_TH_ON,    GPIOF_OUT_INIT_LOW,  "main battery temp" },
+       { TOSA_GPIO_BAT0_TH_ON,    GPIOF_OUT_INIT_LOW,  "jacket battery temp" },
+       { TOSA_GPIO_BU_CHRG_ON,    GPIOF_OUT_INIT_LOW,  "backup battery" },
+       { TOSA_GPIO_BAT0_CRG,      GPIOF_IN,            "main battery full" },
+       { TOSA_GPIO_BAT1_CRG,      GPIOF_IN,            "jacket battery full" },
+       { TOSA_GPIO_BAT0_LOW,      GPIOF_IN,            "main battery low" },
+       { TOSA_GPIO_BAT1_LOW,      GPIOF_IN,            "jacket battery low" },
+       { TOSA_GPIO_JACKET_DETECT, GPIOF_IN,            "jacket detect" },
 };
 
 #ifdef CONFIG_PM
@@ -350,27 +345,13 @@ static int tosa_bat_resume(struct platform_device *dev)
 static int __devinit tosa_bat_probe(struct platform_device *dev)
 {
        int ret;
-       int i;
 
        if (!machine_is_tosa())
                return -ENODEV;
 
-       for (i = 0; i < ARRAY_SIZE(gpios); i++) {
-               ret = gpio_request(gpios[i].gpio, gpios[i].name);
-               if (ret) {
-                       i--;
-                       goto err_gpio;
-               }
-
-               if (gpios[i].output)
-                       ret = gpio_direction_output(gpios[i].gpio,
-                                       gpios[i].value);
-               else
-                       ret = gpio_direction_input(gpios[i].gpio);
-
-               if (ret)
-                       goto err_gpio;
-       }
+       ret = gpio_request_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios));
+       if (ret)
+               return ret;
 
        mutex_init(&tosa_bat_main.work_lock);
        mutex_init(&tosa_bat_jacket.work_lock);
@@ -424,18 +405,12 @@ err_psy_reg_main:
        /* see comment in tosa_bat_remove */
        cancel_work_sync(&bat_work);
 
-       i--;
-err_gpio:
-       for (; i >= 0; i--)
-               gpio_free(gpios[i].gpio);
-
+       gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios));
        return ret;
 }
 
 static int __devexit tosa_bat_remove(struct platform_device *dev)
 {
-       int i;
-
        free_irq(gpio_to_irq(TOSA_GPIO_JACKET_DETECT), &tosa_bat_jacket);
        free_irq(gpio_to_irq(TOSA_GPIO_BAT1_CRG), &tosa_bat_jacket);
        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)
         * unregistered now.
         */
        cancel_work_sync(&bat_work);
-
-       for (i = ARRAY_SIZE(gpios) - 1; i >= 0; i--)
-               gpio_free(gpios[i].gpio);
-
+       gpio_free_array(tosa_bat_gpios, ARRAY_SIZE(tosa_bat_gpios));
        return 0;
 }
 
@@ -466,18 +438,7 @@ static struct platform_driver tosa_bat_driver = {
        .resume         = tosa_bat_resume,
 };
 
-static int __init tosa_bat_init(void)
-{
-       return platform_driver_register(&tosa_bat_driver);
-}
-
-static void __exit tosa_bat_exit(void)
-{
-       platform_driver_unregister(&tosa_bat_driver);
-}
-
-module_init(tosa_bat_init);
-module_exit(tosa_bat_exit);
+module_platform_driver(tosa_bat_driver);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Dmitry Baryshkov");