power_supply: power_supply_read_temp only if use_cnt > 0
[cascardo/linux.git] / drivers / power / s3c_adc_battery.c
index 5948ce0..0ffe5cd 100644 (file)
@@ -28,7 +28,7 @@
 #define JITTER_DELAY                   500 /* ms */
 
 struct s3c_adc_bat {
-       struct power_supply             psy;
+       struct power_supply             *psy;
        struct s3c_adc_client           *client;
        struct s3c_adc_bat_pdata        *pdata;
        int                             volt_value;
@@ -73,10 +73,10 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
                                enum power_supply_property psp,
                                union power_supply_propval *val)
 {
-       struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
+       struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
 
        if (!bat) {
-               dev_err(psy->dev, "%s: no battery infos ?!\n", __func__);
+               dev_err(&psy->dev, "%s: no battery infos ?!\n", __func__);
                return -EINVAL;
        }
 
@@ -105,17 +105,17 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
        }
 }
 
-static struct s3c_adc_bat backup_bat = {
-       .psy = {
-               .name           = "backup-battery",
-               .type           = POWER_SUPPLY_TYPE_BATTERY,
-               .properties     = s3c_adc_backup_bat_props,
-               .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
-               .get_property   = s3c_adc_backup_bat_get_property,
-               .use_for_apm    = 1,
-       },
+static const struct power_supply_desc backup_bat_desc = {
+       .name           = "backup-battery",
+       .type           = POWER_SUPPLY_TYPE_BATTERY,
+       .properties     = s3c_adc_backup_bat_props,
+       .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
+       .get_property   = s3c_adc_backup_bat_get_property,
+       .use_for_apm    = 1,
 };
 
+static struct s3c_adc_bat backup_bat;
+
 static enum power_supply_property s3c_adc_main_bat_props[] = {
        POWER_SUPPLY_PROP_STATUS,
        POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
@@ -141,7 +141,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
                                    enum power_supply_property psp,
                                    union power_supply_propval *val)
 {
-       struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
+       struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
 
        int new_level;
        int full_volt;
@@ -149,7 +149,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
        unsigned int lut_size;
 
        if (!bat) {
-               dev_err(psy->dev, "no battery infos ?!\n");
+               dev_err(&psy->dev, "no battery infos ?!\n");
                return -EINVAL;
        }
 
@@ -232,18 +232,18 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
        }
 }
 
-static struct s3c_adc_bat main_bat = {
-       .psy = {
-               .name                   = "main-battery",
-               .type                   = POWER_SUPPLY_TYPE_BATTERY,
-               .properties             = s3c_adc_main_bat_props,
-               .num_properties         = ARRAY_SIZE(s3c_adc_main_bat_props),
-               .get_property           = s3c_adc_bat_get_property,
-               .external_power_changed = s3c_adc_bat_ext_power_changed,
-               .use_for_apm            = 1,
-       },
+static const struct power_supply_desc main_bat_desc = {
+       .name                   = "main-battery",
+       .type                   = POWER_SUPPLY_TYPE_BATTERY,
+       .properties             = s3c_adc_main_bat_props,
+       .num_properties         = ARRAY_SIZE(s3c_adc_main_bat_props),
+       .get_property           = s3c_adc_bat_get_property,
+       .external_power_changed = s3c_adc_bat_ext_power_changed,
+       .use_for_apm            = 1,
 };
 
+static struct s3c_adc_bat main_bat;
+
 static void s3c_adc_bat_work(struct work_struct *work)
 {
        struct s3c_adc_bat *bat = &main_bat;
@@ -251,7 +251,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
        int is_plugged;
        static int was_plugged;
 
-       is_plugged = power_supply_am_i_supplied(&bat->psy);
+       is_plugged = power_supply_am_i_supplied(bat->psy);
        bat->cable_plugged = is_plugged;
        if (is_plugged != was_plugged) {
                was_plugged = is_plugged;
@@ -279,7 +279,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
                }
        }
 
-       power_supply_changed(&bat->psy);
+       power_supply_changed(bat->psy);
 }
 
 static irqreturn_t s3c_adc_bat_charged(int irq, void *dev_id)
@@ -310,16 +310,25 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
        main_bat.cable_plugged = 0;
        main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING;
 
-       ret = power_supply_register(&pdev->dev, &main_bat.psy);
-       if (ret)
+       main_bat.psy = power_supply_register(&pdev->dev, &main_bat_desc, NULL);
+       if (IS_ERR(main_bat.psy)) {
+               ret = PTR_ERR(main_bat.psy);
                goto err_reg_main;
+       }
        if (pdata->backup_volt_mult) {
+               const struct power_supply_config psy_cfg
+                                               = { .drv_data = &backup_bat, };
+
                backup_bat.client = client;
                backup_bat.pdata = pdev->dev.platform_data;
                backup_bat.volt_value = -1;
-               ret = power_supply_register(&pdev->dev, &backup_bat.psy);
-               if (ret)
+               backup_bat.psy = power_supply_register(&pdev->dev,
+                                                      &backup_bat_desc,
+                                                      &psy_cfg);
+               if (IS_ERR(backup_bat.psy)) {
+                       ret = PTR_ERR(backup_bat.psy);
                        goto err_reg_backup;
+               }
        }
 
        INIT_DELAYED_WORK(&bat_work, s3c_adc_bat_work);
@@ -360,9 +369,9 @@ err_irq:
                gpio_free(pdata->gpio_charge_finished);
 err_gpio:
        if (pdata->backup_volt_mult)
-               power_supply_unregister(&backup_bat.psy);
+               power_supply_unregister(backup_bat.psy);
 err_reg_backup:
-       power_supply_unregister(&main_bat.psy);
+       power_supply_unregister(main_bat.psy);
 err_reg_main:
        return ret;
 }
@@ -372,9 +381,9 @@ static int s3c_adc_bat_remove(struct platform_device *pdev)
        struct s3c_adc_client *client = platform_get_drvdata(pdev);
        struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data;
 
-       power_supply_unregister(&main_bat.psy);
+       power_supply_unregister(main_bat.psy);
        if (pdata->backup_volt_mult)
-               power_supply_unregister(&backup_bat.psy);
+               power_supply_unregister(backup_bat.psy);
 
        s3c_adc_release(client);