Merge tag 'hsi-for-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi
[sfrench/cifs-2.6.git] / drivers / power / ds2760_battery.c
index 85b4e6eca0b1984cc39ea0a3e0d6fbd5614ab543..80f73ccb77ab707b56614e44c66d84d60c143b0e 100644 (file)
@@ -53,7 +53,8 @@ struct ds2760_device_info {
        int charge_status;              /* POWER_SUPPLY_STATUS_* */
 
        int full_counter;
-       struct power_supply bat;
+       struct power_supply *bat;
+       struct power_supply_desc bat_desc;
        struct device *w1_dev;
        struct workqueue_struct *monitor_wqueue;
        struct delayed_work monitor_work;
@@ -254,7 +255,7 @@ static void ds2760_battery_update_status(struct ds2760_device_info *di)
        if (di->charge_status == POWER_SUPPLY_STATUS_UNKNOWN)
                di->full_counter = 0;
 
-       if (power_supply_am_i_supplied(&di->bat)) {
+       if (power_supply_am_i_supplied(di->bat)) {
                if (di->current_uA > 10000) {
                        di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
                        di->full_counter = 0;
@@ -287,7 +288,7 @@ static void ds2760_battery_update_status(struct ds2760_device_info *di)
        }
 
        if (di->charge_status != old_charge_status)
-               power_supply_changed(&di->bat);
+               power_supply_changed(di->bat);
 }
 
 static void ds2760_battery_write_status(struct ds2760_device_info *di,
@@ -346,12 +347,9 @@ static void ds2760_battery_work(struct work_struct *work)
        queue_delayed_work(di->monitor_wqueue, &di->monitor_work, interval);
 }
 
-#define to_ds2760_device_info(x) container_of((x), struct ds2760_device_info, \
-                                             bat);
-
 static void ds2760_battery_external_power_changed(struct power_supply *psy)
 {
-       struct ds2760_device_info *di = to_ds2760_device_info(psy);
+       struct ds2760_device_info *di = power_supply_get_drvdata(psy);
 
        dev_dbg(di->dev, "%s\n", __func__);
 
@@ -377,7 +375,7 @@ static void ds2760_battery_set_charged_work(struct work_struct *work)
         * that error.
         */
 
-       if (!power_supply_am_i_supplied(&di->bat))
+       if (!power_supply_am_i_supplied(di->bat))
                return;
 
        bias = (signed char) di->current_raw +
@@ -396,7 +394,7 @@ static void ds2760_battery_set_charged_work(struct work_struct *work)
 
 static void ds2760_battery_set_charged(struct power_supply *psy)
 {
-       struct ds2760_device_info *di = to_ds2760_device_info(psy);
+       struct ds2760_device_info *di = power_supply_get_drvdata(psy);
 
        /* postpone the actual work by 20 secs. This is for debouncing GPIO
         * signals and to let the current value settle. See AN4188. */
@@ -407,7 +405,7 @@ static int ds2760_battery_get_property(struct power_supply *psy,
                                       enum power_supply_property psp,
                                       union power_supply_propval *val)
 {
-       struct ds2760_device_info *di = to_ds2760_device_info(psy);
+       struct ds2760_device_info *di = power_supply_get_drvdata(psy);
 
        switch (psp) {
        case POWER_SUPPLY_PROP_STATUS:
@@ -458,7 +456,7 @@ static int ds2760_battery_set_property(struct power_supply *psy,
                                       enum power_supply_property psp,
                                       const union power_supply_propval *val)
 {
-       struct ds2760_device_info *di = to_ds2760_device_info(psy);
+       struct ds2760_device_info *di = power_supply_get_drvdata(psy);
 
        switch (psp) {
        case POWER_SUPPLY_PROP_CHARGE_FULL:
@@ -508,6 +506,7 @@ static enum power_supply_property ds2760_battery_props[] = {
 
 static int ds2760_battery_probe(struct platform_device *pdev)
 {
+       struct power_supply_config psy_cfg = {};
        char status;
        int retval = 0;
        struct ds2760_device_info *di;
@@ -520,20 +519,22 @@ static int ds2760_battery_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, di);
 
-       di->dev                 = &pdev->dev;
-       di->w1_dev              = pdev->dev.parent;
-       di->bat.name            = dev_name(&pdev->dev);
-       di->bat.type            = POWER_SUPPLY_TYPE_BATTERY;
-       di->bat.properties      = ds2760_battery_props;
-       di->bat.num_properties  = ARRAY_SIZE(ds2760_battery_props);
-       di->bat.get_property    = ds2760_battery_get_property;
-       di->bat.set_property    = ds2760_battery_set_property;
-       di->bat.property_is_writeable =
+       di->dev                         = &pdev->dev;
+       di->w1_dev                      = pdev->dev.parent;
+       di->bat_desc.name               = dev_name(&pdev->dev);
+       di->bat_desc.type               = POWER_SUPPLY_TYPE_BATTERY;
+       di->bat_desc.properties         = ds2760_battery_props;
+       di->bat_desc.num_properties     = ARRAY_SIZE(ds2760_battery_props);
+       di->bat_desc.get_property       = ds2760_battery_get_property;
+       di->bat_desc.set_property       = ds2760_battery_set_property;
+       di->bat_desc.property_is_writeable =
                                  ds2760_battery_property_is_writeable;
-       di->bat.set_charged     = ds2760_battery_set_charged;
-       di->bat.external_power_changed =
+       di->bat_desc.set_charged        = ds2760_battery_set_charged;
+       di->bat_desc.external_power_changed =
                                  ds2760_battery_external_power_changed;
 
+       psy_cfg.drv_data                = di;
+
        di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
 
        /* enable sleep mode feature */
@@ -555,9 +556,10 @@ static int ds2760_battery_probe(struct platform_device *pdev)
        if (current_accum)
                ds2760_battery_set_current_accum(di, current_accum);
 
-       retval = power_supply_register(&pdev->dev, &di->bat);
-       if (retval) {
+       di->bat = power_supply_register(&pdev->dev, &di->bat_desc, &psy_cfg);
+       if (IS_ERR(di->bat)) {
                dev_err(di->dev, "failed to register battery\n");
+               retval = PTR_ERR(di->bat);
                goto batt_failed;
        }
 
@@ -574,7 +576,7 @@ static int ds2760_battery_probe(struct platform_device *pdev)
        goto success;
 
 workqueue_failed:
-       power_supply_unregister(&di->bat);
+       power_supply_unregister(di->bat);
 batt_failed:
 di_alloc_failed:
 success:
@@ -588,7 +590,7 @@ static int ds2760_battery_remove(struct platform_device *pdev)
        cancel_delayed_work_sync(&di->monitor_work);
        cancel_delayed_work_sync(&di->set_charged_work);
        destroy_workqueue(di->monitor_wqueue);
-       power_supply_unregister(&di->bat);
+       power_supply_unregister(di->bat);
 
        return 0;
 }
@@ -610,7 +612,7 @@ static int ds2760_battery_resume(struct platform_device *pdev)
        struct ds2760_device_info *di = platform_get_drvdata(pdev);
 
        di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
-       power_supply_changed(&di->bat);
+       power_supply_changed(di->bat);
 
        mod_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ);