aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2015-03-12 03:44:02 -0400
committerSebastian Reichel <sre@kernel.org>2015-03-13 18:15:12 -0400
commit2dc9215d7c94f7f9f34ccf8b1710ad73d82f6216 (patch)
treeb8bae66b916e1f64dd725a68bca2182ee315bf66
parente44ea364394499d38a26ed4c9668fb378ae8797f (diff)
power_supply: Move run-time configuration to separate structure
Add new structure 'power_supply_config' for holding run-time initialization data like of_node, supplies and private driver data. The power_supply_register() function is changed so all power supply drivers need updating. When registering the power supply this new 'power_supply_config' should be used instead of directly initializing 'struct power_supply'. This allows changing the ownership of power_supply structure from driver to the power supply core in next patches. When a driver does not use of_node or supplies then it should use NULL as config. If driver uses of_node or supplies then it should allocate config on stack and initialize it with proper values. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Acked-by: Pavel Machek <pavel@ucw.cz> [for the nvec part] Reviewed-by: Marc Dietrich <marvin24@gmx.de> [for drivers/platform/x86/compal-laptop.c] Reviewed-by: Darren Hart <dvhart@linux.intel.com> [for drivers/hid/*] Reviewed-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Sebastian Reichel <sre@kernel.org>
-rw-r--r--drivers/acpi/ac.c2
-rw-r--r--drivers/acpi/battery.c3
-rw-r--r--drivers/acpi/sbs.c4
-rw-r--r--drivers/hid/hid-input.c2
-rw-r--r--drivers/hid/hid-sony.c2
-rw-r--r--drivers/hid/hid-wiimote-modules.c2
-rw-r--r--drivers/hid/wacom_sys.c5
-rw-r--r--drivers/platform/x86/compal-laptop.c2
-rw-r--r--drivers/power/88pm860x_battery.c2
-rw-r--r--drivers/power/88pm860x_charger.c7
-rw-r--r--drivers/power/ab8500_btemp.c7
-rw-r--r--drivers/power/ab8500_charger.c15
-rw-r--r--drivers/power/ab8500_fg.c8
-rw-r--r--drivers/power/abx500_chargalg.c8
-rw-r--r--drivers/power/axp288_fuel_gauge.c2
-rw-r--r--drivers/power/bq2415x_charger.c2
-rw-r--r--drivers/power/bq24190_charger.c4
-rw-r--r--drivers/power/bq24735-charger.c10
-rw-r--r--drivers/power/bq27x00_battery.c2
-rw-r--r--drivers/power/charger-manager.c2
-rw-r--r--drivers/power/collie_battery.c4
-rw-r--r--drivers/power/da9030_battery.c2
-rw-r--r--drivers/power/da9052-battery.c2
-rw-r--r--drivers/power/da9150-charger.c4
-rw-r--r--drivers/power/ds2760_battery.c2
-rw-r--r--drivers/power/ds2780_battery.c2
-rw-r--r--drivers/power/ds2781_battery.c2
-rw-r--r--drivers/power/ds2782_battery.c2
-rw-r--r--drivers/power/generic-adc-battery.c2
-rw-r--r--drivers/power/goldfish_battery.c4
-rw-r--r--drivers/power/gpio-charger.c10
-rw-r--r--drivers/power/intel_mid_battery.c4
-rw-r--r--drivers/power/ipaq_micro_battery.c4
-rw-r--r--drivers/power/isp1704_charger.c2
-rw-r--r--drivers/power/jz4740-battery.c2
-rw-r--r--drivers/power/lp8727_charger.c14
-rw-r--r--drivers/power/lp8788-charger.c11
-rw-r--r--drivers/power/ltc2941-battery-gauge.c2
-rw-r--r--drivers/power/max14577_charger.c2
-rw-r--r--drivers/power/max17040_battery.c2
-rw-r--r--drivers/power/max17042_battery.c2
-rw-r--r--drivers/power/max77693_charger.c2
-rw-r--r--drivers/power/max8903_charger.c2
-rw-r--r--drivers/power/max8925_power.c14
-rw-r--r--drivers/power/max8997_charger.c2
-rw-r--r--drivers/power/max8998_charger.c2
-rw-r--r--drivers/power/olpc_battery.c4
-rw-r--r--drivers/power/pcf50633-charger.c16
-rw-r--r--drivers/power/pda_power.c18
-rw-r--r--drivers/power/pm2301_charger.c8
-rw-r--r--drivers/power/pmu_battery.c4
-rw-r--r--drivers/power/power_supply_core.c30
-rw-r--r--drivers/power/rt5033_battery.c2
-rw-r--r--drivers/power/rx51_battery.c2
-rw-r--r--drivers/power/s3c_adc_battery.c4
-rw-r--r--drivers/power/sbs-battery.c6
-rw-r--r--drivers/power/smb347-charger.c13
-rw-r--r--drivers/power/test_power.c21
-rw-r--r--drivers/power/tosa_battery.c6
-rw-r--r--drivers/power/tps65090-charger.c10
-rw-r--r--drivers/power/twl4030_charger.c4
-rw-r--r--drivers/power/twl4030_madc_battery.c2
-rw-r--r--drivers/power/wm831x_backup.c2
-rw-r--r--drivers/power/wm831x_power.c6
-rw-r--r--drivers/power/wm8350_power.c6
-rw-r--r--drivers/power/wm97xx_battery.c2
-rw-r--r--drivers/power/z2_battery.c2
-rw-r--r--drivers/staging/nvec/nvec_power.c7
-rw-r--r--include/linux/power_supply.h22
69 files changed, 224 insertions, 167 deletions
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
index 36b0e61f9c09..8bf516885ede 100644
--- a/drivers/acpi/ac.c
+++ b/drivers/acpi/ac.c
@@ -351,7 +351,7 @@ static int acpi_ac_add(struct acpi_device *device)
351 ac->charger.properties = ac_props; 351 ac->charger.properties = ac_props;
352 ac->charger.num_properties = ARRAY_SIZE(ac_props); 352 ac->charger.num_properties = ARRAY_SIZE(ac_props);
353 ac->charger.get_property = get_ac_property; 353 ac->charger.get_property = get_ac_property;
354 result = power_supply_register(&ac->device->dev, &ac->charger); 354 result = power_supply_register(&ac->device->dev, &ac->charger, NULL);
355 if (result) 355 if (result)
356 goto end; 356 goto end;
357 357
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index d98ba4355819..fd8c06f492a1 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -624,7 +624,8 @@ static int sysfs_add_battery(struct acpi_battery *battery)
624 battery->bat.type = POWER_SUPPLY_TYPE_BATTERY; 624 battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
625 battery->bat.get_property = acpi_battery_get_property; 625 battery->bat.get_property = acpi_battery_get_property;
626 626
627 result = power_supply_register_no_ws(&battery->device->dev, &battery->bat); 627 result = power_supply_register_no_ws(&battery->device->dev,
628 &battery->bat, NULL);
628 629
629 if (result) 630 if (result)
630 return result; 631 return result;
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
index a7a3edd28beb..2038ec1d021d 100644
--- a/drivers/acpi/sbs.c
+++ b/drivers/acpi/sbs.c
@@ -540,7 +540,7 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
540 ARRAY_SIZE(sbs_energy_battery_props); 540 ARRAY_SIZE(sbs_energy_battery_props);
541 } 541 }
542 battery->bat.get_property = acpi_sbs_battery_get_property; 542 battery->bat.get_property = acpi_sbs_battery_get_property;
543 result = power_supply_register(&sbs->device->dev, &battery->bat); 543 result = power_supply_register(&sbs->device->dev, &battery->bat, NULL);
544 if (result) 544 if (result)
545 goto end; 545 goto end;
546 546
@@ -580,7 +580,7 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
580 sbs->charger.properties = sbs_ac_props; 580 sbs->charger.properties = sbs_ac_props;
581 sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props); 581 sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
582 sbs->charger.get_property = sbs_get_ac_property; 582 sbs->charger.get_property = sbs_get_ac_property;
583 power_supply_register(&sbs->device->dev, &sbs->charger); 583 power_supply_register(&sbs->device->dev, &sbs->charger, NULL);
584 printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n", 584 printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
585 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), 585 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
586 ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line"); 586 ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 052869d0ab78..6182265a6571 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -439,7 +439,7 @@ static bool hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
439 dev->battery_report_type = report_type; 439 dev->battery_report_type = report_type;
440 dev->battery_report_id = field->report->id; 440 dev->battery_report_id = field->report->id;
441 441
442 ret = power_supply_register(&dev->dev, battery); 442 ret = power_supply_register(&dev->dev, battery, NULL);
443 if (ret != 0) { 443 if (ret != 0) {
444 hid_warn(dev, "can't register power supply: %d\n", ret); 444 hid_warn(dev, "can't register power supply: %d\n", ret);
445 kfree(battery->name); 445 kfree(battery->name);
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 31e9d2561106..16fc6a17ac63 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -1718,7 +1718,7 @@ static int sony_battery_probe(struct sony_sc *sc)
1718 if (!sc->battery.name) 1718 if (!sc->battery.name)
1719 return -ENOMEM; 1719 return -ENOMEM;
1720 1720
1721 ret = power_supply_register(&hdev->dev, &sc->battery); 1721 ret = power_supply_register(&hdev->dev, &sc->battery, NULL);
1722 if (ret) { 1722 if (ret) {
1723 hid_err(hdev, "Unable to register battery device\n"); 1723 hid_err(hdev, "Unable to register battery device\n");
1724 goto err_free; 1724 goto err_free;
diff --git a/drivers/hid/hid-wiimote-modules.c b/drivers/hid/hid-wiimote-modules.c
index 6b61f01e01e7..91cb00abcb8e 100644
--- a/drivers/hid/hid-wiimote-modules.c
+++ b/drivers/hid/hid-wiimote-modules.c
@@ -250,7 +250,7 @@ static int wiimod_battery_probe(const struct wiimod_ops *ops,
250 if (!wdata->battery.name) 250 if (!wdata->battery.name)
251 return -ENOMEM; 251 return -ENOMEM;
252 252
253 ret = power_supply_register(&wdata->hdev->dev, &wdata->battery); 253 ret = power_supply_register(&wdata->hdev->dev, &wdata->battery, NULL);
254 if (ret) { 254 if (ret) {
255 hid_err(wdata->hdev, "cannot register battery device\n"); 255 hid_err(wdata->hdev, "cannot register battery device\n");
256 goto err_free; 256 goto err_free;
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index f0568a7e6de9..148949c0e039 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -1021,13 +1021,14 @@ static int wacom_initialize_battery(struct wacom *wacom)
1021 wacom->ac.use_for_apm = 0; 1021 wacom->ac.use_for_apm = 0;
1022 1022
1023 error = power_supply_register(&wacom->hdev->dev, 1023 error = power_supply_register(&wacom->hdev->dev,
1024 &wacom->battery); 1024 &wacom->battery, NULL);
1025 if (error) 1025 if (error)
1026 return error; 1026 return error;
1027 1027
1028 power_supply_powers(&wacom->battery, &wacom->hdev->dev); 1028 power_supply_powers(&wacom->battery, &wacom->hdev->dev);
1029 1029
1030 error = power_supply_register(&wacom->hdev->dev, &wacom->ac); 1030 error = power_supply_register(&wacom->hdev->dev, &wacom->ac,
1031 NULL);
1031 if (error) { 1032 if (error) {
1032 power_supply_unregister(&wacom->battery); 1033 power_supply_unregister(&wacom->battery);
1033 return error; 1034 return error;
diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c
index bceb30b539f3..041a592fe753 100644
--- a/drivers/platform/x86/compal-laptop.c
+++ b/drivers/platform/x86/compal-laptop.c
@@ -1036,7 +1036,7 @@ static int compal_probe(struct platform_device *pdev)
1036 1036
1037 /* Power supply */ 1037 /* Power supply */
1038 initialize_power_supply_data(data); 1038 initialize_power_supply_data(data);
1039 err = power_supply_register(&compal_device->dev, &data->psy); 1039 err = power_supply_register(&compal_device->dev, &data->psy, NULL);
1040 if (err < 0) 1040 if (err < 0)
1041 goto remove; 1041 goto remove;
1042 1042
diff --git a/drivers/power/88pm860x_battery.c b/drivers/power/88pm860x_battery.c
index bd3c997f4fee..a99d7f2829a7 100644
--- a/drivers/power/88pm860x_battery.c
+++ b/drivers/power/88pm860x_battery.c
@@ -953,7 +953,7 @@ static int pm860x_battery_probe(struct platform_device *pdev)
953 else 953 else
954 info->resistor = 300; /* set default internal resistor */ 954 info->resistor = 300; /* set default internal resistor */
955 955
956 ret = power_supply_register(&pdev->dev, &info->battery); 956 ret = power_supply_register(&pdev->dev, &info->battery, NULL);
957 if (ret) 957 if (ret)
958 return ret; 958 return ret;
959 info->battery.dev->parent = &pdev->dev; 959 info->battery.dev->parent = &pdev->dev;
diff --git a/drivers/power/88pm860x_charger.c b/drivers/power/88pm860x_charger.c
index 734ec4afa14d..ac352a6c03ea 100644
--- a/drivers/power/88pm860x_charger.c
+++ b/drivers/power/88pm860x_charger.c
@@ -648,6 +648,7 @@ static struct pm860x_irq_desc {
648static int pm860x_charger_probe(struct platform_device *pdev) 648static int pm860x_charger_probe(struct platform_device *pdev)
649{ 649{
650 struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); 650 struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
651 struct power_supply_config psy_cfg = {};
651 struct pm860x_charger_info *info; 652 struct pm860x_charger_info *info;
652 int ret; 653 int ret;
653 int count; 654 int count;
@@ -687,12 +688,12 @@ static int pm860x_charger_probe(struct platform_device *pdev)
687 688
688 info->usb.name = "usb"; 689 info->usb.name = "usb";
689 info->usb.type = POWER_SUPPLY_TYPE_USB; 690 info->usb.type = POWER_SUPPLY_TYPE_USB;
690 info->usb.supplied_to = pm860x_supplied_to;
691 info->usb.num_supplicants = ARRAY_SIZE(pm860x_supplied_to);
692 info->usb.properties = pm860x_usb_props; 691 info->usb.properties = pm860x_usb_props;
693 info->usb.num_properties = ARRAY_SIZE(pm860x_usb_props); 692 info->usb.num_properties = ARRAY_SIZE(pm860x_usb_props);
694 info->usb.get_property = pm860x_usb_get_prop; 693 info->usb.get_property = pm860x_usb_get_prop;
695 ret = power_supply_register(&pdev->dev, &info->usb); 694 psy_cfg.supplied_to = pm860x_supplied_to;
695 psy_cfg.num_supplicants = ARRAY_SIZE(pm860x_supplied_to);
696 ret = power_supply_register(&pdev->dev, &info->usb, &psy_cfg);
696 if (ret) 697 if (ret)
697 goto out; 698 goto out;
698 699
diff --git a/drivers/power/ab8500_btemp.c b/drivers/power/ab8500_btemp.c
index 4ebf7b0819f7..d5683f503a4e 100644
--- a/drivers/power/ab8500_btemp.c
+++ b/drivers/power/ab8500_btemp.c
@@ -1058,6 +1058,7 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
1058{ 1058{
1059 struct device_node *np = pdev->dev.of_node; 1059 struct device_node *np = pdev->dev.of_node;
1060 struct abx500_bm_data *plat = pdev->dev.platform_data; 1060 struct abx500_bm_data *plat = pdev->dev.platform_data;
1061 struct power_supply_config psy_cfg = {};
1061 struct ab8500_btemp *di; 1062 struct ab8500_btemp *di;
1062 int irq, i, ret = 0; 1063 int irq, i, ret = 0;
1063 u8 val; 1064 u8 val;
@@ -1095,11 +1096,11 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
1095 di->btemp_psy.properties = ab8500_btemp_props; 1096 di->btemp_psy.properties = ab8500_btemp_props;
1096 di->btemp_psy.num_properties = ARRAY_SIZE(ab8500_btemp_props); 1097 di->btemp_psy.num_properties = ARRAY_SIZE(ab8500_btemp_props);
1097 di->btemp_psy.get_property = ab8500_btemp_get_property; 1098 di->btemp_psy.get_property = ab8500_btemp_get_property;
1098 di->btemp_psy.supplied_to = supply_interface;
1099 di->btemp_psy.num_supplicants = ARRAY_SIZE(supply_interface);
1100 di->btemp_psy.external_power_changed = 1099 di->btemp_psy.external_power_changed =
1101 ab8500_btemp_external_power_changed; 1100 ab8500_btemp_external_power_changed;
1102 1101
1102 psy_cfg.supplied_to = supply_interface;
1103 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
1103 1104
1104 /* Create a work queue for the btemp */ 1105 /* Create a work queue for the btemp */
1105 di->btemp_wq = 1106 di->btemp_wq =
@@ -1140,7 +1141,7 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
1140 } 1141 }
1141 1142
1142 /* Register BTEMP power supply class */ 1143 /* Register BTEMP power supply class */
1143 ret = power_supply_register(di->dev, &di->btemp_psy); 1144 ret = power_supply_register(di->dev, &di->btemp_psy, &psy_cfg);
1144 if (ret) { 1145 if (ret) {
1145 dev_err(di->dev, "failed to register BTEMP psy\n"); 1146 dev_err(di->dev, "failed to register BTEMP psy\n");
1146 goto free_btemp_wq; 1147 goto free_btemp_wq;
diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
index 8c8d170ff0f8..cee9b9e46825 100644
--- a/drivers/power/ab8500_charger.c
+++ b/drivers/power/ab8500_charger.c
@@ -3446,6 +3446,7 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3446{ 3446{
3447 struct device_node *np = pdev->dev.of_node; 3447 struct device_node *np = pdev->dev.of_node;
3448 struct abx500_bm_data *plat = pdev->dev.platform_data; 3448 struct abx500_bm_data *plat = pdev->dev.platform_data;
3449 struct power_supply_config psy_cfg = {};
3449 struct ab8500_charger *di; 3450 struct ab8500_charger *di;
3450 int irq, i, charger_status, ret = 0, ch_stat; 3451 int irq, i, charger_status, ret = 0, ch_stat;
3451 3452
@@ -3483,6 +3484,10 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3483 di->autopower = false; 3484 di->autopower = false;
3484 di->invalid_charger_detect_state = 0; 3485 di->invalid_charger_detect_state = 0;
3485 3486
3487 /* AC and USB supply config */
3488 psy_cfg.supplied_to = supply_interface;
3489 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
3490
3486 /* AC supply */ 3491 /* AC supply */
3487 /* power_supply base class */ 3492 /* power_supply base class */
3488 di->ac_chg.psy.name = "ab8500_ac"; 3493 di->ac_chg.psy.name = "ab8500_ac";
@@ -3490,8 +3495,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3490 di->ac_chg.psy.properties = ab8500_charger_ac_props; 3495 di->ac_chg.psy.properties = ab8500_charger_ac_props;
3491 di->ac_chg.psy.num_properties = ARRAY_SIZE(ab8500_charger_ac_props); 3496 di->ac_chg.psy.num_properties = ARRAY_SIZE(ab8500_charger_ac_props);
3492 di->ac_chg.psy.get_property = ab8500_charger_ac_get_property; 3497 di->ac_chg.psy.get_property = ab8500_charger_ac_get_property;
3493 di->ac_chg.psy.supplied_to = supply_interface;
3494 di->ac_chg.psy.num_supplicants = ARRAY_SIZE(supply_interface),
3495 /* ux500_charger sub-class */ 3498 /* ux500_charger sub-class */
3496 di->ac_chg.ops.enable = &ab8500_charger_ac_en; 3499 di->ac_chg.ops.enable = &ab8500_charger_ac_en;
3497 di->ac_chg.ops.check_enable = &ab8500_charger_ac_check_enable; 3500 di->ac_chg.ops.check_enable = &ab8500_charger_ac_check_enable;
@@ -3517,8 +3520,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3517 di->usb_chg.psy.properties = ab8500_charger_usb_props; 3520 di->usb_chg.psy.properties = ab8500_charger_usb_props;
3518 di->usb_chg.psy.num_properties = ARRAY_SIZE(ab8500_charger_usb_props); 3521 di->usb_chg.psy.num_properties = ARRAY_SIZE(ab8500_charger_usb_props);
3519 di->usb_chg.psy.get_property = ab8500_charger_usb_get_property; 3522 di->usb_chg.psy.get_property = ab8500_charger_usb_get_property;
3520 di->usb_chg.psy.supplied_to = supply_interface;
3521 di->usb_chg.psy.num_supplicants = ARRAY_SIZE(supply_interface),
3522 /* ux500_charger sub-class */ 3523 /* ux500_charger sub-class */
3523 di->usb_chg.ops.enable = &ab8500_charger_usb_en; 3524 di->usb_chg.ops.enable = &ab8500_charger_usb_en;
3524 di->usb_chg.ops.check_enable = &ab8500_charger_usb_check_enable; 3525 di->usb_chg.ops.check_enable = &ab8500_charger_usb_check_enable;
@@ -3616,7 +3617,8 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3616 3617
3617 /* Register AC charger class */ 3618 /* Register AC charger class */
3618 if (di->ac_chg.enabled) { 3619 if (di->ac_chg.enabled) {
3619 ret = power_supply_register(di->dev, &di->ac_chg.psy); 3620 ret = power_supply_register(di->dev, &di->ac_chg.psy,
3621 &psy_cfg);
3620 if (ret) { 3622 if (ret) {
3621 dev_err(di->dev, "failed to register AC charger\n"); 3623 dev_err(di->dev, "failed to register AC charger\n");
3622 goto free_charger_wq; 3624 goto free_charger_wq;
@@ -3625,7 +3627,8 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3625 3627
3626 /* Register USB charger class */ 3628 /* Register USB charger class */
3627 if (di->usb_chg.enabled) { 3629 if (di->usb_chg.enabled) {
3628 ret = power_supply_register(di->dev, &di->usb_chg.psy); 3630 ret = power_supply_register(di->dev, &di->usb_chg.psy,
3631 &psy_cfg);
3629 if (ret) { 3632 if (ret) {
3630 dev_err(di->dev, "failed to register USB charger\n"); 3633 dev_err(di->dev, "failed to register USB charger\n");
3631 goto free_ac; 3634 goto free_ac;
diff --git a/drivers/power/ab8500_fg.c b/drivers/power/ab8500_fg.c
index d30387bc4c21..73bdb4dc4142 100644
--- a/drivers/power/ab8500_fg.c
+++ b/drivers/power/ab8500_fg.c
@@ -3075,6 +3075,7 @@ static int ab8500_fg_probe(struct platform_device *pdev)
3075{ 3075{
3076 struct device_node *np = pdev->dev.of_node; 3076 struct device_node *np = pdev->dev.of_node;
3077 struct abx500_bm_data *plat = pdev->dev.platform_data; 3077 struct abx500_bm_data *plat = pdev->dev.platform_data;
3078 struct power_supply_config psy_cfg = {};
3078 struct ab8500_fg *di; 3079 struct ab8500_fg *di;
3079 int i, irq; 3080 int i, irq;
3080 int ret = 0; 3081 int ret = 0;
@@ -3111,10 +3112,11 @@ static int ab8500_fg_probe(struct platform_device *pdev)
3111 di->fg_psy.properties = ab8500_fg_props; 3112 di->fg_psy.properties = ab8500_fg_props;
3112 di->fg_psy.num_properties = ARRAY_SIZE(ab8500_fg_props); 3113 di->fg_psy.num_properties = ARRAY_SIZE(ab8500_fg_props);
3113 di->fg_psy.get_property = ab8500_fg_get_property; 3114 di->fg_psy.get_property = ab8500_fg_get_property;
3114 di->fg_psy.supplied_to = supply_interface;
3115 di->fg_psy.num_supplicants = ARRAY_SIZE(supply_interface),
3116 di->fg_psy.external_power_changed = ab8500_fg_external_power_changed; 3115 di->fg_psy.external_power_changed = ab8500_fg_external_power_changed;
3117 3116
3117 psy_cfg.supplied_to = supply_interface;
3118 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
3119
3118 di->bat_cap.max_mah_design = MILLI_TO_MICRO * 3120 di->bat_cap.max_mah_design = MILLI_TO_MICRO *
3119 di->bm->bat_type[di->bm->batt_id].charge_full_design; 3121 di->bm->bat_type[di->bm->batt_id].charge_full_design;
3120 3122
@@ -3174,7 +3176,7 @@ static int ab8500_fg_probe(struct platform_device *pdev)
3174 di->flags.batt_id_received = false; 3176 di->flags.batt_id_received = false;
3175 3177
3176 /* Register FG power supply class */ 3178 /* Register FG power supply class */
3177 ret = power_supply_register(di->dev, &di->fg_psy); 3179 ret = power_supply_register(di->dev, &di->fg_psy, &psy_cfg);
3178 if (ret) { 3180 if (ret) {
3179 dev_err(di->dev, "failed to register FG psy\n"); 3181 dev_err(di->dev, "failed to register FG psy\n");
3180 goto free_inst_curr_wq; 3182 goto free_inst_curr_wq;
diff --git a/drivers/power/abx500_chargalg.c b/drivers/power/abx500_chargalg.c
index ab54b8dea670..0da4415cbc10 100644
--- a/drivers/power/abx500_chargalg.c
+++ b/drivers/power/abx500_chargalg.c
@@ -2047,6 +2047,7 @@ static int abx500_chargalg_probe(struct platform_device *pdev)
2047{ 2047{
2048 struct device_node *np = pdev->dev.of_node; 2048 struct device_node *np = pdev->dev.of_node;
2049 struct abx500_bm_data *plat = pdev->dev.platform_data; 2049 struct abx500_bm_data *plat = pdev->dev.platform_data;
2050 struct power_supply_config psy_cfg = {};
2050 struct abx500_chargalg *di; 2051 struct abx500_chargalg *di;
2051 int ret = 0; 2052 int ret = 0;
2052 2053
@@ -2080,11 +2081,12 @@ static int abx500_chargalg_probe(struct platform_device *pdev)
2080 di->chargalg_psy.properties = abx500_chargalg_props; 2081 di->chargalg_psy.properties = abx500_chargalg_props;
2081 di->chargalg_psy.num_properties = ARRAY_SIZE(abx500_chargalg_props); 2082 di->chargalg_psy.num_properties = ARRAY_SIZE(abx500_chargalg_props);
2082 di->chargalg_psy.get_property = abx500_chargalg_get_property; 2083 di->chargalg_psy.get_property = abx500_chargalg_get_property;
2083 di->chargalg_psy.supplied_to = supply_interface;
2084 di->chargalg_psy.num_supplicants = ARRAY_SIZE(supply_interface),
2085 di->chargalg_psy.external_power_changed = 2084 di->chargalg_psy.external_power_changed =
2086 abx500_chargalg_external_power_changed; 2085 abx500_chargalg_external_power_changed;
2087 2086
2087 psy_cfg.supplied_to = supply_interface;
2088 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
2089
2088 /* Initilialize safety timer */ 2090 /* Initilialize safety timer */
2089 hrtimer_init(&di->safety_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); 2091 hrtimer_init(&di->safety_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
2090 di->safety_timer.function = abx500_chargalg_safety_timer_expired; 2092 di->safety_timer.function = abx500_chargalg_safety_timer_expired;
@@ -2115,7 +2117,7 @@ static int abx500_chargalg_probe(struct platform_device *pdev)
2115 di->chg_info.prev_conn_chg = -1; 2117 di->chg_info.prev_conn_chg = -1;
2116 2118
2117 /* Register chargalg power supply class */ 2119 /* Register chargalg power supply class */
2118 ret = power_supply_register(di->dev, &di->chargalg_psy); 2120 ret = power_supply_register(di->dev, &di->chargalg_psy, &psy_cfg);
2119 if (ret) { 2121 if (ret) {
2120 dev_err(di->dev, "failed to register chargalg psy\n"); 2122 dev_err(di->dev, "failed to register chargalg psy\n");
2121 goto free_chargalg_wq; 2123 goto free_chargalg_wq;
diff --git a/drivers/power/axp288_fuel_gauge.c b/drivers/power/axp288_fuel_gauge.c
index c86e709c1880..2bec8d241e62 100644
--- a/drivers/power/axp288_fuel_gauge.c
+++ b/drivers/power/axp288_fuel_gauge.c
@@ -1099,7 +1099,7 @@ static int axp288_fuel_gauge_probe(struct platform_device *pdev)
1099 info->bat.set_property = fuel_gauge_set_property; 1099 info->bat.set_property = fuel_gauge_set_property;
1100 info->bat.property_is_writeable = fuel_gauge_property_is_writeable; 1100 info->bat.property_is_writeable = fuel_gauge_property_is_writeable;
1101 info->bat.external_power_changed = fuel_gauge_external_power_changed; 1101 info->bat.external_power_changed = fuel_gauge_external_power_changed;
1102 ret = power_supply_register(&pdev->dev, &info->bat); 1102 ret = power_supply_register(&pdev->dev, &info->bat, NULL);
1103 if (ret) { 1103 if (ret) {
1104 dev_err(&pdev->dev, "failed to register battery: %d\n", ret); 1104 dev_err(&pdev->dev, "failed to register battery: %d\n", ret);
1105 return ret; 1105 return ret;
diff --git a/drivers/power/bq2415x_charger.c b/drivers/power/bq2415x_charger.c
index 2333d7f1182b..9b509025d687 100644
--- a/drivers/power/bq2415x_charger.c
+++ b/drivers/power/bq2415x_charger.c
@@ -1051,7 +1051,7 @@ static int bq2415x_power_supply_init(struct bq2415x_device *bq)
1051 return -ENOMEM; 1051 return -ENOMEM;
1052 } 1052 }
1053 1053
1054 ret = power_supply_register(bq->dev, &bq->charger); 1054 ret = power_supply_register(bq->dev, &bq->charger, NULL);
1055 if (ret) { 1055 if (ret) {
1056 kfree(bq->model); 1056 kfree(bq->model);
1057 return ret; 1057 return ret;
diff --git a/drivers/power/bq24190_charger.c b/drivers/power/bq24190_charger.c
index d0e8236a6404..54eb58485d55 100644
--- a/drivers/power/bq24190_charger.c
+++ b/drivers/power/bq24190_charger.c
@@ -1418,7 +1418,7 @@ static int bq24190_probe(struct i2c_client *client,
1418 1418
1419 bq24190_charger_init(&bdi->charger); 1419 bq24190_charger_init(&bdi->charger);
1420 1420
1421 ret = power_supply_register(dev, &bdi->charger); 1421 ret = power_supply_register(dev, &bdi->charger, NULL);
1422 if (ret) { 1422 if (ret) {
1423 dev_err(dev, "Can't register charger\n"); 1423 dev_err(dev, "Can't register charger\n");
1424 goto out2; 1424 goto out2;
@@ -1426,7 +1426,7 @@ static int bq24190_probe(struct i2c_client *client,
1426 1426
1427 bq24190_battery_init(&bdi->battery); 1427 bq24190_battery_init(&bdi->battery);
1428 1428
1429 ret = power_supply_register(dev, &bdi->battery); 1429 ret = power_supply_register(dev, &bdi->battery, NULL);
1430 if (ret) { 1430 if (ret) {
1431 dev_err(dev, "Can't register battery\n"); 1431 dev_err(dev, "Can't register battery\n");
1432 goto out3; 1432 goto out3;
diff --git a/drivers/power/bq24735-charger.c b/drivers/power/bq24735-charger.c
index d022b823305b..242e79bfe217 100644
--- a/drivers/power/bq24735-charger.c
+++ b/drivers/power/bq24735-charger.c
@@ -249,6 +249,7 @@ static int bq24735_charger_probe(struct i2c_client *client,
249 int ret; 249 int ret;
250 struct bq24735 *charger; 250 struct bq24735 *charger;
251 struct power_supply *supply; 251 struct power_supply *supply;
252 struct power_supply_config psy_cfg = {};
252 char *name; 253 char *name;
253 254
254 charger = devm_kzalloc(&client->dev, sizeof(*charger), GFP_KERNEL); 255 charger = devm_kzalloc(&client->dev, sizeof(*charger), GFP_KERNEL);
@@ -284,9 +285,10 @@ static int bq24735_charger_probe(struct i2c_client *client,
284 supply->properties = bq24735_charger_properties; 285 supply->properties = bq24735_charger_properties;
285 supply->num_properties = ARRAY_SIZE(bq24735_charger_properties); 286 supply->num_properties = ARRAY_SIZE(bq24735_charger_properties);
286 supply->get_property = bq24735_charger_get_property; 287 supply->get_property = bq24735_charger_get_property;
287 supply->supplied_to = charger->pdata->supplied_to; 288
288 supply->num_supplicants = charger->pdata->num_supplicants; 289 psy_cfg.supplied_to = charger->pdata->supplied_to;
289 supply->of_node = client->dev.of_node; 290 psy_cfg.num_supplicants = charger->pdata->num_supplicants;
291 psy_cfg.of_node = client->dev.of_node;
290 292
291 i2c_set_clientdata(client, charger); 293 i2c_set_clientdata(client, charger);
292 294
@@ -341,7 +343,7 @@ static int bq24735_charger_probe(struct i2c_client *client,
341 } 343 }
342 } 344 }
343 345
344 ret = power_supply_register(&client->dev, supply); 346 ret = power_supply_register(&client->dev, supply, &psy_cfg);
345 if (ret < 0) { 347 if (ret < 0) {
346 dev_err(&client->dev, "Failed to register power supply: %d\n", 348 dev_err(&client->dev, "Failed to register power supply: %d\n",
347 ret); 349 ret);
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index ba08b5926bfd..a992e43908a2 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -791,7 +791,7 @@ static int bq27x00_powersupply_init(struct bq27x00_device_info *di)
791 INIT_DELAYED_WORK(&di->work, bq27x00_battery_poll); 791 INIT_DELAYED_WORK(&di->work, bq27x00_battery_poll);
792 mutex_init(&di->lock); 792 mutex_init(&di->lock);
793 793
794 ret = power_supply_register_no_ws(di->dev, &di->bat); 794 ret = power_supply_register_no_ws(di->dev, &di->bat, NULL);
795 if (ret) { 795 if (ret) {
796 dev_err(di->dev, "failed to register battery: %d\n", ret); 796 dev_err(di->dev, "failed to register battery: %d\n", ret);
797 return ret; 797 return ret;
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index 14b0d85318eb..df27600880b9 100644
--- a/drivers/power/charger-manager.c
+++ b/drivers/power/charger-manager.c
@@ -1740,7 +1740,7 @@ static int charger_manager_probe(struct platform_device *pdev)
1740 1740
1741 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); 1741 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);
1742 1742
1743 ret = power_supply_register(NULL, &cm->charger_psy); 1743 ret = power_supply_register(NULL, &cm->charger_psy, NULL);
1744 if (ret) { 1744 if (ret) {
1745 dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n", 1745 dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n",
1746 cm->charger_psy.name); 1746 cm->charger_psy.name);
diff --git a/drivers/power/collie_battery.c b/drivers/power/collie_battery.c
index 594e4dbc2d51..e7a808d1758a 100644
--- a/drivers/power/collie_battery.c
+++ b/drivers/power/collie_battery.c
@@ -334,10 +334,10 @@ static int collie_bat_probe(struct ucb1x00_dev *dev)
334 334
335 INIT_WORK(&bat_work, collie_bat_work); 335 INIT_WORK(&bat_work, collie_bat_work);
336 336
337 ret = power_supply_register(&dev->ucb->dev, &collie_bat_main.psy); 337 ret = power_supply_register(&dev->ucb->dev, &collie_bat_main.psy, NULL);
338 if (ret) 338 if (ret)
339 goto err_psy_reg_main; 339 goto err_psy_reg_main;
340 ret = power_supply_register(&dev->ucb->dev, &collie_bat_bu.psy); 340 ret = power_supply_register(&dev->ucb->dev, &collie_bat_bu.psy, NULL);
341 if (ret) 341 if (ret)
342 goto err_psy_reg_bu; 342 goto err_psy_reg_bu;
343 343
diff --git a/drivers/power/da9030_battery.c b/drivers/power/da9030_battery.c
index 78cd5d66144b..a87406ef18ee 100644
--- a/drivers/power/da9030_battery.c
+++ b/drivers/power/da9030_battery.c
@@ -541,7 +541,7 @@ static int da9030_battery_probe(struct platform_device *pdev)
541 goto err_notifier; 541 goto err_notifier;
542 542
543 da9030_battery_setup_psy(charger); 543 da9030_battery_setup_psy(charger);
544 ret = power_supply_register(&pdev->dev, &charger->psy); 544 ret = power_supply_register(&pdev->dev, &charger->psy, NULL);
545 if (ret) 545 if (ret)
546 goto err_ps_register; 546 goto err_ps_register;
547 547
diff --git a/drivers/power/da9052-battery.c b/drivers/power/da9052-battery.c
index d17250f745c2..54ba9ddb6d4f 100644
--- a/drivers/power/da9052-battery.c
+++ b/drivers/power/da9052-battery.c
@@ -625,7 +625,7 @@ static s32 da9052_bat_probe(struct platform_device *pdev)
625 } 625 }
626 } 626 }
627 627
628 ret = power_supply_register(&pdev->dev, &bat->psy); 628 ret = power_supply_register(&pdev->dev, &bat->psy, NULL);
629 if (ret) 629 if (ret)
630 goto err; 630 goto err;
631 631
diff --git a/drivers/power/da9150-charger.c b/drivers/power/da9150-charger.c
index 4df97ea8dcde..db8ba5d8d1e3 100644
--- a/drivers/power/da9150-charger.c
+++ b/drivers/power/da9150-charger.c
@@ -550,7 +550,7 @@ static int da9150_charger_probe(struct platform_device *pdev)
550 usb->properties = da9150_charger_props; 550 usb->properties = da9150_charger_props;
551 usb->num_properties = ARRAY_SIZE(da9150_charger_props); 551 usb->num_properties = ARRAY_SIZE(da9150_charger_props);
552 usb->get_property = da9150_charger_get_prop; 552 usb->get_property = da9150_charger_get_prop;
553 ret = power_supply_register(dev, usb); 553 ret = power_supply_register(dev, usb, NULL);
554 if (ret) 554 if (ret)
555 goto usb_fail; 555 goto usb_fail;
556 556
@@ -559,7 +559,7 @@ static int da9150_charger_probe(struct platform_device *pdev)
559 battery->properties = da9150_charger_bat_props; 559 battery->properties = da9150_charger_bat_props;
560 battery->num_properties = ARRAY_SIZE(da9150_charger_bat_props); 560 battery->num_properties = ARRAY_SIZE(da9150_charger_bat_props);
561 battery->get_property = da9150_charger_battery_get_prop; 561 battery->get_property = da9150_charger_battery_get_prop;
562 ret = power_supply_register(dev, battery); 562 ret = power_supply_register(dev, battery, NULL);
563 if (ret) 563 if (ret)
564 goto battery_fail; 564 goto battery_fail;
565 565
diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c
index 85b4e6eca0b1..e82dff0bbb20 100644
--- a/drivers/power/ds2760_battery.c
+++ b/drivers/power/ds2760_battery.c
@@ -555,7 +555,7 @@ static int ds2760_battery_probe(struct platform_device *pdev)
555 if (current_accum) 555 if (current_accum)
556 ds2760_battery_set_current_accum(di, current_accum); 556 ds2760_battery_set_current_accum(di, current_accum);
557 557
558 retval = power_supply_register(&pdev->dev, &di->bat); 558 retval = power_supply_register(&pdev->dev, &di->bat, NULL);
559 if (retval) { 559 if (retval) {
560 dev_err(di->dev, "failed to register battery\n"); 560 dev_err(di->dev, "failed to register battery\n");
561 goto batt_failed; 561 goto batt_failed;
diff --git a/drivers/power/ds2780_battery.c b/drivers/power/ds2780_battery.c
index 9f418fa879e5..b1d3570ea730 100644
--- a/drivers/power/ds2780_battery.c
+++ b/drivers/power/ds2780_battery.c
@@ -776,7 +776,7 @@ static int ds2780_battery_probe(struct platform_device *pdev)
776 dev_info->bat.num_properties = ARRAY_SIZE(ds2780_battery_props); 776 dev_info->bat.num_properties = ARRAY_SIZE(ds2780_battery_props);
777 dev_info->bat.get_property = ds2780_battery_get_property; 777 dev_info->bat.get_property = ds2780_battery_get_property;
778 778
779 ret = power_supply_register(&pdev->dev, &dev_info->bat); 779 ret = power_supply_register(&pdev->dev, &dev_info->bat, NULL);
780 if (ret) { 780 if (ret) {
781 dev_err(dev_info->dev, "failed to register battery\n"); 781 dev_err(dev_info->dev, "failed to register battery\n");
782 goto fail; 782 goto fail;
diff --git a/drivers/power/ds2781_battery.c b/drivers/power/ds2781_battery.c
index 0a5acc6fc6f0..50686dc59711 100644
--- a/drivers/power/ds2781_battery.c
+++ b/drivers/power/ds2781_battery.c
@@ -769,7 +769,7 @@ static int ds2781_battery_probe(struct platform_device *pdev)
769 dev_info->bat.num_properties = ARRAY_SIZE(ds2781_battery_props); 769 dev_info->bat.num_properties = ARRAY_SIZE(ds2781_battery_props);
770 dev_info->bat.get_property = ds2781_battery_get_property; 770 dev_info->bat.get_property = ds2781_battery_get_property;
771 771
772 ret = power_supply_register(&pdev->dev, &dev_info->bat); 772 ret = power_supply_register(&pdev->dev, &dev_info->bat, NULL);
773 if (ret) { 773 if (ret) {
774 dev_err(dev_info->dev, "failed to register battery\n"); 774 dev_err(dev_info->dev, "failed to register battery\n");
775 goto fail; 775 goto fail;
diff --git a/drivers/power/ds2782_battery.c b/drivers/power/ds2782_battery.c
index 39694883d3bf..2dcb96a83cee 100644
--- a/drivers/power/ds2782_battery.c
+++ b/drivers/power/ds2782_battery.c
@@ -424,7 +424,7 @@ static int ds278x_battery_probe(struct i2c_client *client,
424 424
425 INIT_DELAYED_WORK(&info->bat_work, ds278x_bat_work); 425 INIT_DELAYED_WORK(&info->bat_work, ds278x_bat_work);
426 426
427 ret = power_supply_register(&client->dev, &info->battery); 427 ret = power_supply_register(&client->dev, &info->battery, NULL);
428 if (ret) { 428 if (ret) {
429 dev_err(&client->dev, "failed to register battery\n"); 429 dev_err(&client->dev, "failed to register battery\n");
430 goto fail_register; 430 goto fail_register;
diff --git a/drivers/power/generic-adc-battery.c b/drivers/power/generic-adc-battery.c
index 0a566ac3eefd..4575955de7c5 100644
--- a/drivers/power/generic-adc-battery.c
+++ b/drivers/power/generic-adc-battery.c
@@ -312,7 +312,7 @@ static int gab_probe(struct platform_device *pdev)
312 */ 312 */
313 psy->num_properties = ARRAY_SIZE(gab_props) + index; 313 psy->num_properties = ARRAY_SIZE(gab_props) + index;
314 314
315 ret = power_supply_register(&pdev->dev, psy); 315 ret = power_supply_register(&pdev->dev, psy, NULL);
316 if (ret) 316 if (ret)
317 goto err_reg_fail; 317 goto err_reg_fail;
318 318
diff --git a/drivers/power/goldfish_battery.c b/drivers/power/goldfish_battery.c
index 29eba88a2963..61d437f8cf76 100644
--- a/drivers/power/goldfish_battery.c
+++ b/drivers/power/goldfish_battery.c
@@ -195,11 +195,11 @@ static int goldfish_battery_probe(struct platform_device *pdev)
195 if (ret) 195 if (ret)
196 return ret; 196 return ret;
197 197
198 ret = power_supply_register(&pdev->dev, &data->ac); 198 ret = power_supply_register(&pdev->dev, &data->ac, NULL);
199 if (ret) 199 if (ret)
200 return ret; 200 return ret;
201 201
202 ret = power_supply_register(&pdev->dev, &data->battery); 202 ret = power_supply_register(&pdev->dev, &data->battery, NULL);
203 if (ret) { 203 if (ret) {
204 power_supply_unregister(&data->ac); 204 power_supply_unregister(&data->ac);
205 return ret; 205 return ret;
diff --git a/drivers/power/gpio-charger.c b/drivers/power/gpio-charger.c
index b7424c8501f1..47a9e2bd94d9 100644
--- a/drivers/power/gpio-charger.c
+++ b/drivers/power/gpio-charger.c
@@ -127,6 +127,7 @@ struct gpio_charger_platform_data *gpio_charger_parse_dt(struct device *dev)
127static int gpio_charger_probe(struct platform_device *pdev) 127static int gpio_charger_probe(struct platform_device *pdev)
128{ 128{
129 const struct gpio_charger_platform_data *pdata = pdev->dev.platform_data; 129 const struct gpio_charger_platform_data *pdata = pdev->dev.platform_data;
130 struct power_supply_config psy_cfg = {};
130 struct gpio_charger *gpio_charger; 131 struct gpio_charger *gpio_charger;
131 struct power_supply *charger; 132 struct power_supply *charger;
132 int ret; 133 int ret;
@@ -161,9 +162,10 @@ static int gpio_charger_probe(struct platform_device *pdev)
161 charger->properties = gpio_charger_properties; 162 charger->properties = gpio_charger_properties;
162 charger->num_properties = ARRAY_SIZE(gpio_charger_properties); 163 charger->num_properties = ARRAY_SIZE(gpio_charger_properties);
163 charger->get_property = gpio_charger_get_property; 164 charger->get_property = gpio_charger_get_property;
164 charger->supplied_to = pdata->supplied_to; 165
165 charger->num_supplicants = pdata->num_supplicants; 166 psy_cfg.supplied_to = pdata->supplied_to;
166 charger->of_node = pdev->dev.of_node; 167 psy_cfg.num_supplicants = pdata->num_supplicants;
168 psy_cfg.of_node = pdev->dev.of_node;
167 169
168 ret = gpio_request(pdata->gpio, dev_name(&pdev->dev)); 170 ret = gpio_request(pdata->gpio, dev_name(&pdev->dev));
169 if (ret) { 171 if (ret) {
@@ -178,7 +180,7 @@ static int gpio_charger_probe(struct platform_device *pdev)
178 180
179 gpio_charger->pdata = pdata; 181 gpio_charger->pdata = pdata;
180 182
181 ret = power_supply_register(&pdev->dev, charger); 183 ret = power_supply_register(&pdev->dev, charger, &psy_cfg);
182 if (ret < 0) { 184 if (ret < 0) {
183 dev_err(&pdev->dev, "Failed to register power supply: %d\n", 185 dev_err(&pdev->dev, "Failed to register power supply: %d\n",
184 ret); 186 ret);
diff --git a/drivers/power/intel_mid_battery.c b/drivers/power/intel_mid_battery.c
index de3f39e6fa8e..8a149657cd71 100644
--- a/drivers/power/intel_mid_battery.c
+++ b/drivers/power/intel_mid_battery.c
@@ -692,7 +692,7 @@ static int probe(int irq, struct device *dev)
692 pbi->batt.properties = pmic_battery_props; 692 pbi->batt.properties = pmic_battery_props;
693 pbi->batt.num_properties = ARRAY_SIZE(pmic_battery_props); 693 pbi->batt.num_properties = ARRAY_SIZE(pmic_battery_props);
694 pbi->batt.get_property = pmic_battery_get_property; 694 pbi->batt.get_property = pmic_battery_get_property;
695 retval = power_supply_register(dev, &pbi->batt); 695 retval = power_supply_register(dev, &pbi->batt, NULL);
696 if (retval) { 696 if (retval) {
697 dev_err(dev, 697 dev_err(dev,
698 "%s(): failed to register pmic battery device with power supply subsystem\n", 698 "%s(): failed to register pmic battery device with power supply subsystem\n",
@@ -712,7 +712,7 @@ static int probe(int irq, struct device *dev)
712 pbi->usb.properties = pmic_usb_props; 712 pbi->usb.properties = pmic_usb_props;
713 pbi->usb.num_properties = ARRAY_SIZE(pmic_usb_props); 713 pbi->usb.num_properties = ARRAY_SIZE(pmic_usb_props);
714 pbi->usb.get_property = pmic_usb_get_property; 714 pbi->usb.get_property = pmic_usb_get_property;
715 retval = power_supply_register(dev, &pbi->usb); 715 retval = power_supply_register(dev, &pbi->usb, NULL);
716 if (retval) { 716 if (retval) {
717 dev_err(dev, 717 dev_err(dev,
718 "%s(): failed to register pmic usb device with power supply subsystem\n", 718 "%s(): failed to register pmic usb device with power supply subsystem\n",
diff --git a/drivers/power/ipaq_micro_battery.c b/drivers/power/ipaq_micro_battery.c
index 96b15e003f3f..842e7e2e1cb5 100644
--- a/drivers/power/ipaq_micro_battery.c
+++ b/drivers/power/ipaq_micro_battery.c
@@ -241,11 +241,11 @@ static int micro_batt_probe(struct platform_device *pdev)
241 platform_set_drvdata(pdev, mb); 241 platform_set_drvdata(pdev, mb);
242 queue_delayed_work(mb->wq, &mb->update, 1); 242 queue_delayed_work(mb->wq, &mb->update, 1);
243 243
244 ret = power_supply_register(&pdev->dev, &micro_batt_power); 244 ret = power_supply_register(&pdev->dev, &micro_batt_power, NULL);
245 if (ret < 0) 245 if (ret < 0)
246 goto batt_err; 246 goto batt_err;
247 247
248 ret = power_supply_register(&pdev->dev, &micro_ac_power); 248 ret = power_supply_register(&pdev->dev, &micro_ac_power, NULL);
249 if (ret < 0) 249 if (ret < 0)
250 goto ac_err; 250 goto ac_err;
251 251
diff --git a/drivers/power/isp1704_charger.c b/drivers/power/isp1704_charger.c
index 0b4cf9d63291..5521178bdc08 100644
--- a/drivers/power/isp1704_charger.c
+++ b/drivers/power/isp1704_charger.c
@@ -460,7 +460,7 @@ static int isp1704_charger_probe(struct platform_device *pdev)
460 isp->psy.num_properties = ARRAY_SIZE(power_props); 460 isp->psy.num_properties = ARRAY_SIZE(power_props);
461 isp->psy.get_property = isp1704_charger_get_property; 461 isp->psy.get_property = isp1704_charger_get_property;
462 462
463 ret = power_supply_register(isp->dev, &isp->psy); 463 ret = power_supply_register(isp->dev, &isp->psy, NULL);
464 if (ret) 464 if (ret)
465 goto fail1; 465 goto fail1;
466 466
diff --git a/drivers/power/jz4740-battery.c b/drivers/power/jz4740-battery.c
index 9cd391d61819..0444434e1927 100644
--- a/drivers/power/jz4740-battery.c
+++ b/drivers/power/jz4740-battery.c
@@ -330,7 +330,7 @@ static int jz_battery_probe(struct platform_device *pdev)
330 else 330 else
331 jz4740_adc_set_config(pdev->dev.parent, JZ_ADC_CONFIG_BAT_MB, 0); 331 jz4740_adc_set_config(pdev->dev.parent, JZ_ADC_CONFIG_BAT_MB, 0);
332 332
333 ret = power_supply_register(&pdev->dev, &jz_battery->battery); 333 ret = power_supply_register(&pdev->dev, &jz_battery->battery, NULL);
334 if (ret) { 334 if (ret) {
335 dev_err(&pdev->dev, "power supply battery register failed.\n"); 335 dev_err(&pdev->dev, "power supply battery register failed.\n");
336 goto err_free_charge_irq; 336 goto err_free_charge_irq;
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c
index 32de636dcd73..1f71af7a3811 100644
--- a/drivers/power/lp8727_charger.c
+++ b/drivers/power/lp8727_charger.c
@@ -420,6 +420,7 @@ static void lp8727_charger_changed(struct power_supply *psy)
420 420
421static int lp8727_register_psy(struct lp8727_chg *pchg) 421static int lp8727_register_psy(struct lp8727_chg *pchg)
422{ 422{
423 struct power_supply_config psy_cfg = {}; /* Only for ac and usb */
423 struct lp8727_psy *psy; 424 struct lp8727_psy *psy;
424 425
425 psy = devm_kzalloc(pchg->dev, sizeof(*psy), GFP_KERNEL); 426 psy = devm_kzalloc(pchg->dev, sizeof(*psy), GFP_KERNEL);
@@ -428,15 +429,16 @@ static int lp8727_register_psy(struct lp8727_chg *pchg)
428 429
429 pchg->psy = psy; 430 pchg->psy = psy;
430 431
432 psy_cfg.supplied_to = battery_supplied_to;
433 psy_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to);
434
431 psy->ac.name = "ac"; 435 psy->ac.name = "ac";
432 psy->ac.type = POWER_SUPPLY_TYPE_MAINS; 436 psy->ac.type = POWER_SUPPLY_TYPE_MAINS;
433 psy->ac.properties = lp8727_charger_prop; 437 psy->ac.properties = lp8727_charger_prop;
434 psy->ac.num_properties = ARRAY_SIZE(lp8727_charger_prop); 438 psy->ac.num_properties = ARRAY_SIZE(lp8727_charger_prop);
435 psy->ac.get_property = lp8727_charger_get_property; 439 psy->ac.get_property = lp8727_charger_get_property;
436 psy->ac.supplied_to = battery_supplied_to;
437 psy->ac.num_supplicants = ARRAY_SIZE(battery_supplied_to);
438 440
439 if (power_supply_register(pchg->dev, &psy->ac)) 441 if (power_supply_register(pchg->dev, &psy->ac, &psy_cfg))
440 goto err_psy_ac; 442 goto err_psy_ac;
441 443
442 psy->usb.name = "usb"; 444 psy->usb.name = "usb";
@@ -444,10 +446,8 @@ static int lp8727_register_psy(struct lp8727_chg *pchg)
444 psy->usb.properties = lp8727_charger_prop; 446 psy->usb.properties = lp8727_charger_prop;
445 psy->usb.num_properties = ARRAY_SIZE(lp8727_charger_prop); 447 psy->usb.num_properties = ARRAY_SIZE(lp8727_charger_prop);
446 psy->usb.get_property = lp8727_charger_get_property; 448 psy->usb.get_property = lp8727_charger_get_property;
447 psy->usb.supplied_to = battery_supplied_to;
448 psy->usb.num_supplicants = ARRAY_SIZE(battery_supplied_to);
449 449
450 if (power_supply_register(pchg->dev, &psy->usb)) 450 if (power_supply_register(pchg->dev, &psy->usb, &psy_cfg))
451 goto err_psy_usb; 451 goto err_psy_usb;
452 452
453 psy->batt.name = "main_batt"; 453 psy->batt.name = "main_batt";
@@ -457,7 +457,7 @@ static int lp8727_register_psy(struct lp8727_chg *pchg)
457 psy->batt.get_property = lp8727_battery_get_property; 457 psy->batt.get_property = lp8727_battery_get_property;
458 psy->batt.external_power_changed = lp8727_charger_changed; 458 psy->batt.external_power_changed = lp8727_charger_changed;
459 459
460 if (power_supply_register(pchg->dev, &psy->batt)) 460 if (power_supply_register(pchg->dev, &psy->batt, NULL))
461 goto err_psy_batt; 461 goto err_psy_batt;
462 462
463 return 0; 463 return 0;
diff --git a/drivers/power/lp8788-charger.c b/drivers/power/lp8788-charger.c
index 176dab2e4c16..8e4d228519c1 100644
--- a/drivers/power/lp8788-charger.c
+++ b/drivers/power/lp8788-charger.c
@@ -400,15 +400,18 @@ static int lp8788_update_charger_params(struct platform_device *pdev,
400static int lp8788_psy_register(struct platform_device *pdev, 400static int lp8788_psy_register(struct platform_device *pdev,
401 struct lp8788_charger *pchg) 401 struct lp8788_charger *pchg)
402{ 402{
403 struct power_supply_config charger_cfg = {};
404
403 pchg->charger.name = LP8788_CHARGER_NAME; 405 pchg->charger.name = LP8788_CHARGER_NAME;
404 pchg->charger.type = POWER_SUPPLY_TYPE_MAINS; 406 pchg->charger.type = POWER_SUPPLY_TYPE_MAINS;
405 pchg->charger.properties = lp8788_charger_prop; 407 pchg->charger.properties = lp8788_charger_prop;
406 pchg->charger.num_properties = ARRAY_SIZE(lp8788_charger_prop); 408 pchg->charger.num_properties = ARRAY_SIZE(lp8788_charger_prop);
407 pchg->charger.get_property = lp8788_charger_get_property; 409 pchg->charger.get_property = lp8788_charger_get_property;
408 pchg->charger.supplied_to = battery_supplied_to;
409 pchg->charger.num_supplicants = ARRAY_SIZE(battery_supplied_to);
410 410
411 if (power_supply_register(&pdev->dev, &pchg->charger)) 411 charger_cfg.supplied_to = battery_supplied_to;
412 charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to);
413
414 if (power_supply_register(&pdev->dev, &pchg->charger, &charger_cfg))
412 return -EPERM; 415 return -EPERM;
413 416
414 pchg->battery.name = LP8788_BATTERY_NAME; 417 pchg->battery.name = LP8788_BATTERY_NAME;
@@ -417,7 +420,7 @@ static int lp8788_psy_register(struct platform_device *pdev,
417 pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop); 420 pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop);
418 pchg->battery.get_property = lp8788_battery_get_property; 421 pchg->battery.get_property = lp8788_battery_get_property;
419 422
420 if (power_supply_register(&pdev->dev, &pchg->battery)) { 423 if (power_supply_register(&pdev->dev, &pchg->battery, NULL)) {
421 power_supply_unregister(&pchg->charger); 424 power_supply_unregister(&pchg->charger);
422 return -EPERM; 425 return -EPERM;
423 } 426 }
diff --git a/drivers/power/ltc2941-battery-gauge.c b/drivers/power/ltc2941-battery-gauge.c
index 50c5d89dcef3..9bc545393ef8 100644
--- a/drivers/power/ltc2941-battery-gauge.c
+++ b/drivers/power/ltc2941-battery-gauge.c
@@ -473,7 +473,7 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
473 goto fail_comm; 473 goto fail_comm;
474 } 474 }
475 475
476 ret = power_supply_register(&client->dev, &info->supply); 476 ret = power_supply_register(&client->dev, &info->supply, NULL);
477 if (ret) { 477 if (ret) {
478 dev_err(&client->dev, "failed to register ltc2941\n"); 478 dev_err(&client->dev, "failed to register ltc2941\n");
479 goto fail_register; 479 goto fail_register;
diff --git a/drivers/power/max14577_charger.c b/drivers/power/max14577_charger.c
index 4736dc478578..c5f2a535c81a 100644
--- a/drivers/power/max14577_charger.c
+++ b/drivers/power/max14577_charger.c
@@ -594,7 +594,7 @@ static int max14577_charger_probe(struct platform_device *pdev)
594 return ret; 594 return ret;
595 } 595 }
596 596
597 ret = power_supply_register(&pdev->dev, &chg->charger); 597 ret = power_supply_register(&pdev->dev, &chg->charger, NULL);
598 if (ret) { 598 if (ret) {
599 dev_err(&pdev->dev, "failed: power supply register\n"); 599 dev_err(&pdev->dev, "failed: power supply register\n");
600 goto err; 600 goto err;
diff --git a/drivers/power/max17040_battery.c b/drivers/power/max17040_battery.c
index 63ff3f705154..d36b2f6c2053 100644
--- a/drivers/power/max17040_battery.c
+++ b/drivers/power/max17040_battery.c
@@ -224,7 +224,7 @@ static int max17040_probe(struct i2c_client *client,
224 chip->battery.properties = max17040_battery_props; 224 chip->battery.properties = max17040_battery_props;
225 chip->battery.num_properties = ARRAY_SIZE(max17040_battery_props); 225 chip->battery.num_properties = ARRAY_SIZE(max17040_battery_props);
226 226
227 ret = power_supply_register(&client->dev, &chip->battery); 227 ret = power_supply_register(&client->dev, &chip->battery, NULL);
228 if (ret) { 228 if (ret) {
229 dev_err(&client->dev, "failed: power supply register\n"); 229 dev_err(&client->dev, "failed: power supply register\n");
230 return ret; 230 return ret;
diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c
index 830435adfb64..b1ebbc3b8640 100644
--- a/drivers/power/max17042_battery.c
+++ b/drivers/power/max17042_battery.c
@@ -731,7 +731,7 @@ static int max17042_probe(struct i2c_client *client,
731 regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); 731 regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
732 } 732 }
733 733
734 ret = power_supply_register(&client->dev, &chip->battery); 734 ret = power_supply_register(&client->dev, &chip->battery, NULL);
735 if (ret) { 735 if (ret) {
736 dev_err(&client->dev, "failed: power supply register\n"); 736 dev_err(&client->dev, "failed: power supply register\n");
737 return ret; 737 return ret;
diff --git a/drivers/power/max77693_charger.c b/drivers/power/max77693_charger.c
index ca52e7d15b95..86ea0231175c 100644
--- a/drivers/power/max77693_charger.c
+++ b/drivers/power/max77693_charger.c
@@ -714,7 +714,7 @@ static int max77693_charger_probe(struct platform_device *pdev)
714 goto err; 714 goto err;
715 } 715 }
716 716
717 ret = power_supply_register(&pdev->dev, &chg->charger); 717 ret = power_supply_register(&pdev->dev, &chg->charger, NULL);
718 if (ret) { 718 if (ret) {
719 dev_err(&pdev->dev, "failed: power supply register\n"); 719 dev_err(&pdev->dev, "failed: power supply register\n");
720 goto err; 720 goto err;
diff --git a/drivers/power/max8903_charger.c b/drivers/power/max8903_charger.c
index 99e3cdcd3e11..2f769faa85f6 100644
--- a/drivers/power/max8903_charger.c
+++ b/drivers/power/max8903_charger.c
@@ -288,7 +288,7 @@ static int max8903_probe(struct platform_device *pdev)
288 data->psy.properties = max8903_charger_props; 288 data->psy.properties = max8903_charger_props;
289 data->psy.num_properties = ARRAY_SIZE(max8903_charger_props); 289 data->psy.num_properties = ARRAY_SIZE(max8903_charger_props);
290 290
291 ret = power_supply_register(dev, &data->psy); 291 ret = power_supply_register(dev, &data->psy, NULL);
292 if (ret) { 292 if (ret) {
293 dev_err(dev, "failed: power supply register.\n"); 293 dev_err(dev, "failed: power supply register.\n");
294 goto err; 294 goto err;
diff --git a/drivers/power/max8925_power.c b/drivers/power/max8925_power.c
index a6d45eef64dd..71c087e3feaf 100644
--- a/drivers/power/max8925_power.c
+++ b/drivers/power/max8925_power.c
@@ -482,6 +482,7 @@ max8925_power_dt_init(struct platform_device *pdev)
482static int max8925_power_probe(struct platform_device *pdev) 482static int max8925_power_probe(struct platform_device *pdev)
483{ 483{
484 struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); 484 struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
485 struct power_supply_config psy_cfg = {}; /* Only for ac and usb */
485 struct max8925_power_pdata *pdata = NULL; 486 struct max8925_power_pdata *pdata = NULL;
486 struct max8925_power_info *info; 487 struct max8925_power_info *info;
487 int ret; 488 int ret;
@@ -502,14 +503,15 @@ static int max8925_power_probe(struct platform_device *pdev)
502 info->adc = chip->adc; 503 info->adc = chip->adc;
503 platform_set_drvdata(pdev, info); 504 platform_set_drvdata(pdev, info);
504 505
506 psy_cfg.supplied_to = pdata->supplied_to;
507 psy_cfg.num_supplicants = pdata->num_supplicants;
508
505 info->ac.name = "max8925-ac"; 509 info->ac.name = "max8925-ac";
506 info->ac.type = POWER_SUPPLY_TYPE_MAINS; 510 info->ac.type = POWER_SUPPLY_TYPE_MAINS;
507 info->ac.properties = max8925_ac_props; 511 info->ac.properties = max8925_ac_props;
508 info->ac.num_properties = ARRAY_SIZE(max8925_ac_props); 512 info->ac.num_properties = ARRAY_SIZE(max8925_ac_props);
509 info->ac.get_property = max8925_ac_get_prop; 513 info->ac.get_property = max8925_ac_get_prop;
510 info->ac.supplied_to = pdata->supplied_to; 514 ret = power_supply_register(&pdev->dev, &info->ac, &psy_cfg);
511 info->ac.num_supplicants = pdata->num_supplicants;
512 ret = power_supply_register(&pdev->dev, &info->ac);
513 if (ret) 515 if (ret)
514 goto out; 516 goto out;
515 info->ac.dev->parent = &pdev->dev; 517 info->ac.dev->parent = &pdev->dev;
@@ -519,10 +521,8 @@ static int max8925_power_probe(struct platform_device *pdev)
519 info->usb.properties = max8925_usb_props; 521 info->usb.properties = max8925_usb_props;
520 info->usb.num_properties = ARRAY_SIZE(max8925_usb_props); 522 info->usb.num_properties = ARRAY_SIZE(max8925_usb_props);
521 info->usb.get_property = max8925_usb_get_prop; 523 info->usb.get_property = max8925_usb_get_prop;
522 info->usb.supplied_to = pdata->supplied_to;
523 info->usb.num_supplicants = pdata->num_supplicants;
524 524
525 ret = power_supply_register(&pdev->dev, &info->usb); 525 ret = power_supply_register(&pdev->dev, &info->usb, &psy_cfg);
526 if (ret) 526 if (ret)
527 goto out_usb; 527 goto out_usb;
528 info->usb.dev->parent = &pdev->dev; 528 info->usb.dev->parent = &pdev->dev;
@@ -532,7 +532,7 @@ static int max8925_power_probe(struct platform_device *pdev)
532 info->battery.properties = max8925_battery_props; 532 info->battery.properties = max8925_battery_props;
533 info->battery.num_properties = ARRAY_SIZE(max8925_battery_props); 533 info->battery.num_properties = ARRAY_SIZE(max8925_battery_props);
534 info->battery.get_property = max8925_bat_get_prop; 534 info->battery.get_property = max8925_bat_get_prop;
535 ret = power_supply_register(&pdev->dev, &info->battery); 535 ret = power_supply_register(&pdev->dev, &info->battery, NULL);
536 if (ret) 536 if (ret)
537 goto out_battery; 537 goto out_battery;
538 info->battery.dev->parent = &pdev->dev; 538 info->battery.dev->parent = &pdev->dev;
diff --git a/drivers/power/max8997_charger.c b/drivers/power/max8997_charger.c
index aefa0c9a3007..a9f4d506eb44 100644
--- a/drivers/power/max8997_charger.c
+++ b/drivers/power/max8997_charger.c
@@ -156,7 +156,7 @@ static int max8997_battery_probe(struct platform_device *pdev)
156 charger->dev = &pdev->dev; 156 charger->dev = &pdev->dev;
157 charger->iodev = iodev; 157 charger->iodev = iodev;
158 158
159 ret = power_supply_register(&pdev->dev, &charger->battery); 159 ret = power_supply_register(&pdev->dev, &charger->battery, NULL);
160 if (ret) { 160 if (ret) {
161 dev_err(&pdev->dev, "failed: power supply register\n"); 161 dev_err(&pdev->dev, "failed: power supply register\n");
162 return ret; 162 return ret;
diff --git a/drivers/power/max8998_charger.c b/drivers/power/max8998_charger.c
index 08694c7a9f38..9ee72314b3d0 100644
--- a/drivers/power/max8998_charger.c
+++ b/drivers/power/max8998_charger.c
@@ -167,7 +167,7 @@ static int max8998_battery_probe(struct platform_device *pdev)
167 max8998->battery.properties = max8998_battery_props; 167 max8998->battery.properties = max8998_battery_props;
168 max8998->battery.num_properties = ARRAY_SIZE(max8998_battery_props); 168 max8998->battery.num_properties = ARRAY_SIZE(max8998_battery_props);
169 169
170 ret = power_supply_register(max8998->dev, &max8998->battery); 170 ret = power_supply_register(max8998->dev, &max8998->battery, NULL);
171 if (ret) { 171 if (ret) {
172 dev_err(max8998->dev, "failed: power supply register\n"); 172 dev_err(max8998->dev, "failed: power supply register\n");
173 goto err; 173 goto err;
diff --git a/drivers/power/olpc_battery.c b/drivers/power/olpc_battery.c
index ad9cde705de1..1340a1a75325 100644
--- a/drivers/power/olpc_battery.c
+++ b/drivers/power/olpc_battery.c
@@ -619,7 +619,7 @@ static int olpc_battery_probe(struct platform_device *pdev)
619 619
620 /* Ignore the status. It doesn't actually matter */ 620 /* Ignore the status. It doesn't actually matter */
621 621
622 ret = power_supply_register(&pdev->dev, &olpc_ac); 622 ret = power_supply_register(&pdev->dev, &olpc_ac, NULL);
623 if (ret) 623 if (ret)
624 return ret; 624 return ret;
625 625
@@ -631,7 +631,7 @@ static int olpc_battery_probe(struct platform_device *pdev)
631 olpc_bat.num_properties = ARRAY_SIZE(olpc_xo1_bat_props); 631 olpc_bat.num_properties = ARRAY_SIZE(olpc_xo1_bat_props);
632 } 632 }
633 633
634 ret = power_supply_register(&pdev->dev, &olpc_bat); 634 ret = power_supply_register(&pdev->dev, &olpc_bat, NULL);
635 if (ret) 635 if (ret)
636 goto battery_failed; 636 goto battery_failed;
637 637
diff --git a/drivers/power/pcf50633-charger.c b/drivers/power/pcf50633-charger.c
index 771c4f0fb8ac..88fe7db2afcf 100644
--- a/drivers/power/pcf50633-charger.c
+++ b/drivers/power/pcf50633-charger.c
@@ -368,6 +368,7 @@ static const u8 mbc_irq_handlers[] = {
368 368
369static int pcf50633_mbc_probe(struct platform_device *pdev) 369static int pcf50633_mbc_probe(struct platform_device *pdev)
370{ 370{
371 struct power_supply_config psy_cfg = {};
371 struct pcf50633_mbc *mbc; 372 struct pcf50633_mbc *mbc;
372 int ret; 373 int ret;
373 int i; 374 int i;
@@ -385,45 +386,42 @@ static int pcf50633_mbc_probe(struct platform_device *pdev)
385 pcf50633_register_irq(mbc->pcf, mbc_irq_handlers[i], 386 pcf50633_register_irq(mbc->pcf, mbc_irq_handlers[i],
386 pcf50633_mbc_irq_handler, mbc); 387 pcf50633_mbc_irq_handler, mbc);
387 388
389 psy_cfg.supplied_to = mbc->pcf->pdata->batteries;
390 psy_cfg.num_supplicants = mbc->pcf->pdata->num_batteries;
391
388 /* Create power supplies */ 392 /* Create power supplies */
389 mbc->adapter.name = "adapter"; 393 mbc->adapter.name = "adapter";
390 mbc->adapter.type = POWER_SUPPLY_TYPE_MAINS; 394 mbc->adapter.type = POWER_SUPPLY_TYPE_MAINS;
391 mbc->adapter.properties = power_props; 395 mbc->adapter.properties = power_props;
392 mbc->adapter.num_properties = ARRAY_SIZE(power_props); 396 mbc->adapter.num_properties = ARRAY_SIZE(power_props);
393 mbc->adapter.get_property = &adapter_get_property; 397 mbc->adapter.get_property = &adapter_get_property;
394 mbc->adapter.supplied_to = mbc->pcf->pdata->batteries;
395 mbc->adapter.num_supplicants = mbc->pcf->pdata->num_batteries;
396 398
397 mbc->usb.name = "usb"; 399 mbc->usb.name = "usb";
398 mbc->usb.type = POWER_SUPPLY_TYPE_USB; 400 mbc->usb.type = POWER_SUPPLY_TYPE_USB;
399 mbc->usb.properties = power_props; 401 mbc->usb.properties = power_props;
400 mbc->usb.num_properties = ARRAY_SIZE(power_props); 402 mbc->usb.num_properties = ARRAY_SIZE(power_props);
401 mbc->usb.get_property = usb_get_property; 403 mbc->usb.get_property = usb_get_property;
402 mbc->usb.supplied_to = mbc->pcf->pdata->batteries;
403 mbc->usb.num_supplicants = mbc->pcf->pdata->num_batteries;
404 404
405 mbc->ac.name = "ac"; 405 mbc->ac.name = "ac";
406 mbc->ac.type = POWER_SUPPLY_TYPE_MAINS; 406 mbc->ac.type = POWER_SUPPLY_TYPE_MAINS;
407 mbc->ac.properties = power_props; 407 mbc->ac.properties = power_props;
408 mbc->ac.num_properties = ARRAY_SIZE(power_props); 408 mbc->ac.num_properties = ARRAY_SIZE(power_props);
409 mbc->ac.get_property = ac_get_property; 409 mbc->ac.get_property = ac_get_property;
410 mbc->ac.supplied_to = mbc->pcf->pdata->batteries;
411 mbc->ac.num_supplicants = mbc->pcf->pdata->num_batteries;
412 410
413 ret = power_supply_register(&pdev->dev, &mbc->adapter); 411 ret = power_supply_register(&pdev->dev, &mbc->adapter, &psy_cfg);
414 if (ret) { 412 if (ret) {
415 dev_err(mbc->pcf->dev, "failed to register adapter\n"); 413 dev_err(mbc->pcf->dev, "failed to register adapter\n");
416 return ret; 414 return ret;
417 } 415 }
418 416
419 ret = power_supply_register(&pdev->dev, &mbc->usb); 417 ret = power_supply_register(&pdev->dev, &mbc->usb, &psy_cfg);
420 if (ret) { 418 if (ret) {
421 dev_err(mbc->pcf->dev, "failed to register usb\n"); 419 dev_err(mbc->pcf->dev, "failed to register usb\n");
422 power_supply_unregister(&mbc->adapter); 420 power_supply_unregister(&mbc->adapter);
423 return ret; 421 return ret;
424 } 422 }
425 423
426 ret = power_supply_register(&pdev->dev, &mbc->ac); 424 ret = power_supply_register(&pdev->dev, &mbc->ac, &psy_cfg);
427 if (ret) { 425 if (ret) {
428 dev_err(mbc->pcf->dev, "failed to register ac\n"); 426 dev_err(mbc->pcf->dev, "failed to register ac\n");
429 power_supply_unregister(&mbc->adapter); 427 power_supply_unregister(&mbc->adapter);
diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
index 0c52e2a0d90c..fd55fad1d0db 100644
--- a/drivers/power/pda_power.c
+++ b/drivers/power/pda_power.c
@@ -83,8 +83,6 @@ static char *pda_power_supplied_to[] = {
83static struct power_supply pda_psy_ac = { 83static struct power_supply pda_psy_ac = {
84 .name = "ac", 84 .name = "ac",
85 .type = POWER_SUPPLY_TYPE_MAINS, 85 .type = POWER_SUPPLY_TYPE_MAINS,
86 .supplied_to = pda_power_supplied_to,
87 .num_supplicants = ARRAY_SIZE(pda_power_supplied_to),
88 .properties = pda_power_props, 86 .properties = pda_power_props,
89 .num_properties = ARRAY_SIZE(pda_power_props), 87 .num_properties = ARRAY_SIZE(pda_power_props),
90 .get_property = pda_power_get_property, 88 .get_property = pda_power_get_property,
@@ -93,8 +91,6 @@ static struct power_supply pda_psy_ac = {
93static struct power_supply pda_psy_usb = { 91static struct power_supply pda_psy_usb = {
94 .name = "usb", 92 .name = "usb",
95 .type = POWER_SUPPLY_TYPE_USB, 93 .type = POWER_SUPPLY_TYPE_USB,
96 .supplied_to = pda_power_supplied_to,
97 .num_supplicants = ARRAY_SIZE(pda_power_supplied_to),
98 .properties = pda_power_props, 94 .properties = pda_power_props,
99 .num_properties = ARRAY_SIZE(pda_power_props), 95 .num_properties = ARRAY_SIZE(pda_power_props),
100 .get_property = pda_power_get_property, 96 .get_property = pda_power_get_property,
@@ -262,6 +258,7 @@ static int otg_handle_notification(struct notifier_block *nb,
262 258
263static int pda_power_probe(struct platform_device *pdev) 259static int pda_power_probe(struct platform_device *pdev)
264{ 260{
261 struct power_supply_config psy_cfg = {};
265 int ret = 0; 262 int ret = 0;
266 263
267 dev = &pdev->dev; 264 dev = &pdev->dev;
@@ -309,10 +306,11 @@ static int pda_power_probe(struct platform_device *pdev)
309 usb_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "usb"); 306 usb_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "usb");
310 307
311 if (pdata->supplied_to) { 308 if (pdata->supplied_to) {
312 pda_psy_ac.supplied_to = pdata->supplied_to; 309 psy_cfg.supplied_to = pdata->supplied_to;
313 pda_psy_ac.num_supplicants = pdata->num_supplicants; 310 psy_cfg.num_supplicants = pdata->num_supplicants;
314 pda_psy_usb.supplied_to = pdata->supplied_to; 311 } else {
315 pda_psy_usb.num_supplicants = pdata->num_supplicants; 312 psy_cfg.supplied_to = pda_power_supplied_to;
313 psy_cfg.num_supplicants = ARRAY_SIZE(pda_power_supplied_to);
316 } 314 }
317 315
318#if IS_ENABLED(CONFIG_USB_PHY) 316#if IS_ENABLED(CONFIG_USB_PHY)
@@ -326,7 +324,7 @@ static int pda_power_probe(struct platform_device *pdev)
326#endif 324#endif
327 325
328 if (pdata->is_ac_online) { 326 if (pdata->is_ac_online) {
329 ret = power_supply_register(&pdev->dev, &pda_psy_ac); 327 ret = power_supply_register(&pdev->dev, &pda_psy_ac, &psy_cfg);
330 if (ret) { 328 if (ret) {
331 dev_err(dev, "failed to register %s power supply\n", 329 dev_err(dev, "failed to register %s power supply\n",
332 pda_psy_ac.name); 330 pda_psy_ac.name);
@@ -347,7 +345,7 @@ static int pda_power_probe(struct platform_device *pdev)
347 } 345 }
348 346
349 if (pdata->is_usb_online) { 347 if (pdata->is_usb_online) {
350 ret = power_supply_register(&pdev->dev, &pda_psy_usb); 348 ret = power_supply_register(&pdev->dev, &pda_psy_usb, &psy_cfg);
351 if (ret) { 349 if (ret) {
352 dev_err(dev, "failed to register %s power supply\n", 350 dev_err(dev, "failed to register %s power supply\n",
353 pda_psy_usb.name); 351 pda_psy_usb.name);
diff --git a/drivers/power/pm2301_charger.c b/drivers/power/pm2301_charger.c
index 777324992c59..d2e88e473238 100644
--- a/drivers/power/pm2301_charger.c
+++ b/drivers/power/pm2301_charger.c
@@ -989,6 +989,7 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
989 const struct i2c_device_id *id) 989 const struct i2c_device_id *id)
990{ 990{
991 struct pm2xxx_platform_data *pl_data = i2c_client->dev.platform_data; 991 struct pm2xxx_platform_data *pl_data = i2c_client->dev.platform_data;
992 struct power_supply_config psy_cfg = {};
992 struct pm2xxx_charger *pm2; 993 struct pm2xxx_charger *pm2;
993 int ret = 0; 994 int ret = 0;
994 u8 val; 995 u8 val;
@@ -1047,8 +1048,9 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
1047 pm2->ac_chg.psy.properties = pm2xxx_charger_ac_props; 1048 pm2->ac_chg.psy.properties = pm2xxx_charger_ac_props;
1048 pm2->ac_chg.psy.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props); 1049 pm2->ac_chg.psy.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props);
1049 pm2->ac_chg.psy.get_property = pm2xxx_charger_ac_get_property; 1050 pm2->ac_chg.psy.get_property = pm2xxx_charger_ac_get_property;
1050 pm2->ac_chg.psy.supplied_to = pm2->pdata->supplied_to; 1051
1051 pm2->ac_chg.psy.num_supplicants = pm2->pdata->num_supplicants; 1052 psy_cfg.supplied_to = pm2->pdata->supplied_to;
1053 psy_cfg.num_supplicants = pm2->pdata->num_supplicants;
1052 /* pm2xxx_charger sub-class */ 1054 /* pm2xxx_charger sub-class */
1053 pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en; 1055 pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en;
1054 pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick; 1056 pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick;
@@ -1093,7 +1095,7 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
1093 } 1095 }
1094 1096
1095 /* Register AC charger class */ 1097 /* Register AC charger class */
1096 ret = power_supply_register(pm2->dev, &pm2->ac_chg.psy); 1098 ret = power_supply_register(pm2->dev, &pm2->ac_chg.psy, &psy_cfg);
1097 if (ret) { 1099 if (ret) {
1098 dev_err(pm2->dev, "failed to register AC charger\n"); 1100 dev_err(pm2->dev, "failed to register AC charger\n");
1099 goto free_regulator; 1101 goto free_regulator;
diff --git a/drivers/power/pmu_battery.c b/drivers/power/pmu_battery.c
index 023d24993b87..fb026f19aa4a 100644
--- a/drivers/power/pmu_battery.c
+++ b/drivers/power/pmu_battery.c
@@ -152,7 +152,7 @@ static int __init pmu_bat_init(void)
152 goto pdev_register_failed; 152 goto pdev_register_failed;
153 } 153 }
154 154
155 ret = power_supply_register(&bat_pdev->dev, &pmu_ac); 155 ret = power_supply_register(&bat_pdev->dev, &pmu_ac, NULL);
156 if (ret) 156 if (ret)
157 goto ac_register_failed; 157 goto ac_register_failed;
158 158
@@ -169,7 +169,7 @@ static int __init pmu_bat_init(void)
169 pbat->bat.get_property = pmu_bat_get_property; 169 pbat->bat.get_property = pmu_bat_get_property;
170 pbat->pbi = &pmu_batteries[i]; 170 pbat->pbi = &pmu_batteries[i];
171 171
172 ret = power_supply_register(&bat_pdev->dev, &pbat->bat); 172 ret = power_supply_register(&bat_pdev->dev, &pbat->bat, NULL);
173 if (ret) { 173 if (ret) {
174 kfree(pbat); 174 kfree(pbat);
175 goto battery_register_failed; 175 goto battery_register_failed;
diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
index 1c0978f961ea..a21e36ed8d41 100644
--- a/drivers/power/power_supply_core.c
+++ b/drivers/power/power_supply_core.c
@@ -536,7 +536,9 @@ static void psy_unregister_cooler(struct power_supply *psy)
536#endif 536#endif
537 537
538static int __power_supply_register(struct device *parent, 538static int __power_supply_register(struct device *parent,
539 struct power_supply *psy, bool ws) 539 struct power_supply *psy,
540 const struct power_supply_config *cfg,
541 bool ws)
540{ 542{
541 struct device *dev; 543 struct device *dev;
542 int rc; 544 int rc;
@@ -553,6 +555,12 @@ static int __power_supply_register(struct device *parent,
553 dev->release = power_supply_dev_release; 555 dev->release = power_supply_dev_release;
554 dev_set_drvdata(dev, psy); 556 dev_set_drvdata(dev, psy);
555 psy->dev = dev; 557 psy->dev = dev;
558 if (cfg) {
559 psy->drv_data = cfg->drv_data;
560 psy->of_node = cfg->of_node;
561 psy->supplied_to = cfg->supplied_to;
562 psy->num_supplicants = cfg->num_supplicants;
563 }
556 564
557 rc = dev_set_name(dev, "%s", psy->name); 565 rc = dev_set_name(dev, "%s", psy->name);
558 if (rc) 566 if (rc)
@@ -605,15 +613,17 @@ dev_set_name_failed:
605 return rc; 613 return rc;
606} 614}
607 615
608int power_supply_register(struct device *parent, struct power_supply *psy) 616int power_supply_register(struct device *parent, struct power_supply *psy,
617 const struct power_supply_config *cfg)
609{ 618{
610 return __power_supply_register(parent, psy, true); 619 return __power_supply_register(parent, psy, cfg, true);
611} 620}
612EXPORT_SYMBOL_GPL(power_supply_register); 621EXPORT_SYMBOL_GPL(power_supply_register);
613 622
614int power_supply_register_no_ws(struct device *parent, struct power_supply *psy) 623int power_supply_register_no_ws(struct device *parent, struct power_supply *psy,
624 const struct power_supply_config *cfg)
615{ 625{
616 return __power_supply_register(parent, psy, false); 626 return __power_supply_register(parent, psy, cfg, false);
617} 627}
618EXPORT_SYMBOL_GPL(power_supply_register_no_ws); 628EXPORT_SYMBOL_GPL(power_supply_register_no_ws);
619 629
@@ -624,7 +634,8 @@ static void devm_power_supply_release(struct device *dev, void *res)
624 power_supply_unregister(*psy); 634 power_supply_unregister(*psy);
625} 635}
626 636
627int devm_power_supply_register(struct device *parent, struct power_supply *psy) 637int devm_power_supply_register(struct device *parent, struct power_supply *psy,
638 const struct power_supply_config *cfg)
628{ 639{
629 struct power_supply **ptr = devres_alloc(devm_power_supply_release, 640 struct power_supply **ptr = devres_alloc(devm_power_supply_release,
630 sizeof(*ptr), GFP_KERNEL); 641 sizeof(*ptr), GFP_KERNEL);
@@ -632,7 +643,7 @@ int devm_power_supply_register(struct device *parent, struct power_supply *psy)
632 643
633 if (!ptr) 644 if (!ptr)
634 return -ENOMEM; 645 return -ENOMEM;
635 ret = __power_supply_register(parent, psy, true); 646 ret = __power_supply_register(parent, psy, cfg, true);
636 if (ret < 0) 647 if (ret < 0)
637 devres_free(ptr); 648 devres_free(ptr);
638 else { 649 else {
@@ -643,7 +654,8 @@ int devm_power_supply_register(struct device *parent, struct power_supply *psy)
643} 654}
644EXPORT_SYMBOL_GPL(devm_power_supply_register); 655EXPORT_SYMBOL_GPL(devm_power_supply_register);
645 656
646int devm_power_supply_register_no_ws(struct device *parent, struct power_supply *psy) 657int devm_power_supply_register_no_ws(struct device *parent, struct power_supply *psy,
658 const struct power_supply_config *cfg)
647{ 659{
648 struct power_supply **ptr = devres_alloc(devm_power_supply_release, 660 struct power_supply **ptr = devres_alloc(devm_power_supply_release,
649 sizeof(*ptr), GFP_KERNEL); 661 sizeof(*ptr), GFP_KERNEL);
@@ -651,7 +663,7 @@ int devm_power_supply_register_no_ws(struct device *parent, struct power_supply
651 663
652 if (!ptr) 664 if (!ptr)
653 return -ENOMEM; 665 return -ENOMEM;
654 ret = __power_supply_register(parent, psy, false); 666 ret = __power_supply_register(parent, psy, cfg, false);
655 if (ret < 0) 667 if (ret < 0)
656 devres_free(ptr); 668 devres_free(ptr);
657 else { 669 else {
diff --git a/drivers/power/rt5033_battery.c b/drivers/power/rt5033_battery.c
index 995247af14fc..8cf000baaf36 100644
--- a/drivers/power/rt5033_battery.c
+++ b/drivers/power/rt5033_battery.c
@@ -138,7 +138,7 @@ static int rt5033_battery_probe(struct i2c_client *client,
138 battery->psy.properties = rt5033_battery_props; 138 battery->psy.properties = rt5033_battery_props;
139 battery->psy.num_properties = ARRAY_SIZE(rt5033_battery_props); 139 battery->psy.num_properties = ARRAY_SIZE(rt5033_battery_props);
140 140
141 ret = power_supply_register(&client->dev, &battery->psy); 141 ret = power_supply_register(&client->dev, &battery->psy, NULL);
142 if (ret) { 142 if (ret) {
143 dev_err(&client->dev, "Failed to register power supply\n"); 143 dev_err(&client->dev, "Failed to register power supply\n");
144 return ret; 144 return ret;
diff --git a/drivers/power/rx51_battery.c b/drivers/power/rx51_battery.c
index a01aacb32f59..804f60c7b715 100644
--- a/drivers/power/rx51_battery.c
+++ b/drivers/power/rx51_battery.c
@@ -238,7 +238,7 @@ static int rx51_battery_probe(struct platform_device *pdev)
238 goto error_channel_bsi; 238 goto error_channel_bsi;
239 } 239 }
240 240
241 ret = power_supply_register(di->dev, &di->bat); 241 ret = power_supply_register(di->dev, &di->bat, NULL);
242 if (ret) 242 if (ret)
243 goto error_channel_vbat; 243 goto error_channel_vbat;
244 244
diff --git a/drivers/power/s3c_adc_battery.c b/drivers/power/s3c_adc_battery.c
index 5948ce058bdd..b6ff213373dd 100644
--- a/drivers/power/s3c_adc_battery.c
+++ b/drivers/power/s3c_adc_battery.c
@@ -310,14 +310,14 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
310 main_bat.cable_plugged = 0; 310 main_bat.cable_plugged = 0;
311 main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING; 311 main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING;
312 312
313 ret = power_supply_register(&pdev->dev, &main_bat.psy); 313 ret = power_supply_register(&pdev->dev, &main_bat.psy, NULL);
314 if (ret) 314 if (ret)
315 goto err_reg_main; 315 goto err_reg_main;
316 if (pdata->backup_volt_mult) { 316 if (pdata->backup_volt_mult) {
317 backup_bat.client = client; 317 backup_bat.client = client;
318 backup_bat.pdata = pdev->dev.platform_data; 318 backup_bat.pdata = pdev->dev.platform_data;
319 backup_bat.volt_value = -1; 319 backup_bat.volt_value = -1;
320 ret = power_supply_register(&pdev->dev, &backup_bat.psy); 320 ret = power_supply_register(&pdev->dev, &backup_bat.psy, NULL);
321 if (ret) 321 if (ret)
322 goto err_reg_backup; 322 goto err_reg_backup;
323 } 323 }
diff --git a/drivers/power/sbs-battery.c b/drivers/power/sbs-battery.c
index c7b7b4018df3..879f1448fc4a 100644
--- a/drivers/power/sbs-battery.c
+++ b/drivers/power/sbs-battery.c
@@ -801,6 +801,7 @@ static int sbs_probe(struct i2c_client *client,
801{ 801{
802 struct sbs_info *chip; 802 struct sbs_info *chip;
803 struct sbs_platform_data *pdata = client->dev.platform_data; 803 struct sbs_platform_data *pdata = client->dev.platform_data;
804 struct power_supply_config psy_cfg = {};
804 int rc; 805 int rc;
805 int irq; 806 int irq;
806 char *name; 807 char *name;
@@ -825,7 +826,7 @@ static int sbs_probe(struct i2c_client *client,
825 chip->power_supply.properties = sbs_properties; 826 chip->power_supply.properties = sbs_properties;
826 chip->power_supply.num_properties = ARRAY_SIZE(sbs_properties); 827 chip->power_supply.num_properties = ARRAY_SIZE(sbs_properties);
827 chip->power_supply.get_property = sbs_get_property; 828 chip->power_supply.get_property = sbs_get_property;
828 chip->power_supply.of_node = client->dev.of_node; 829 psy_cfg.of_node = client->dev.of_node;
829 /* ignore first notification of external change, it is generated 830 /* ignore first notification of external change, it is generated
830 * from the power_supply_register call back 831 * from the power_supply_register call back
831 */ 832 */
@@ -892,7 +893,8 @@ skip_gpio:
892 goto exit_psupply; 893 goto exit_psupply;
893 } 894 }
894 895
895 rc = power_supply_register(&client->dev, &chip->power_supply); 896 rc = power_supply_register(&client->dev, &chip->power_supply,
897 &psy_cfg);
896 if (rc) { 898 if (rc) {
897 dev_err(&client->dev, 899 dev_err(&client->dev,
898 "%s: Failed to register power supply\n", __func__); 900 "%s: Failed to register power supply\n", __func__);
diff --git a/drivers/power/smb347-charger.c b/drivers/power/smb347-charger.c
index e9702de262e5..4396a1ffeb1a 100644
--- a/drivers/power/smb347-charger.c
+++ b/drivers/power/smb347-charger.c
@@ -1194,6 +1194,7 @@ static int smb347_probe(struct i2c_client *client,
1194{ 1194{
1195 static char *battery[] = { "smb347-battery" }; 1195 static char *battery[] = { "smb347-battery" };
1196 const struct smb347_charger_platform_data *pdata; 1196 const struct smb347_charger_platform_data *pdata;
1197 struct power_supply_config psy_cfg = {}; /* Only for mains and usb */
1197 struct device *dev = &client->dev; 1198 struct device *dev = &client->dev;
1198 struct smb347_charger *smb; 1199 struct smb347_charger *smb;
1199 int ret; 1200 int ret;
@@ -1223,15 +1224,15 @@ static int smb347_probe(struct i2c_client *client,
1223 if (ret < 0) 1224 if (ret < 0)
1224 return ret; 1225 return ret;
1225 1226
1227 psy_cfg.supplied_to = battery;
1228 psy_cfg.num_supplicants = ARRAY_SIZE(battery);
1226 if (smb->pdata->use_mains) { 1229 if (smb->pdata->use_mains) {
1227 smb->mains.name = "smb347-mains"; 1230 smb->mains.name = "smb347-mains";
1228 smb->mains.type = POWER_SUPPLY_TYPE_MAINS; 1231 smb->mains.type = POWER_SUPPLY_TYPE_MAINS;
1229 smb->mains.get_property = smb347_mains_get_property; 1232 smb->mains.get_property = smb347_mains_get_property;
1230 smb->mains.properties = smb347_mains_properties; 1233 smb->mains.properties = smb347_mains_properties;
1231 smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties); 1234 smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties);
1232 smb->mains.supplied_to = battery; 1235 ret = power_supply_register(dev, &smb->mains, &psy_cfg);
1233 smb->mains.num_supplicants = ARRAY_SIZE(battery);
1234 ret = power_supply_register(dev, &smb->mains);
1235 if (ret < 0) 1236 if (ret < 0)
1236 return ret; 1237 return ret;
1237 } 1238 }
@@ -1242,9 +1243,7 @@ static int smb347_probe(struct i2c_client *client,
1242 smb->usb.get_property = smb347_usb_get_property; 1243 smb->usb.get_property = smb347_usb_get_property;
1243 smb->usb.properties = smb347_usb_properties; 1244 smb->usb.properties = smb347_usb_properties;
1244 smb->usb.num_properties = ARRAY_SIZE(smb347_usb_properties); 1245 smb->usb.num_properties = ARRAY_SIZE(smb347_usb_properties);
1245 smb->usb.supplied_to = battery; 1246 ret = power_supply_register(dev, &smb->usb, &psy_cfg);
1246 smb->usb.num_supplicants = ARRAY_SIZE(battery);
1247 ret = power_supply_register(dev, &smb->usb);
1248 if (ret < 0) { 1247 if (ret < 0) {
1249 if (smb->pdata->use_mains) 1248 if (smb->pdata->use_mains)
1250 power_supply_unregister(&smb->mains); 1249 power_supply_unregister(&smb->mains);
@@ -1259,7 +1258,7 @@ static int smb347_probe(struct i2c_client *client,
1259 smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties); 1258 smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties);
1260 1259
1261 1260
1262 ret = power_supply_register(dev, &smb->battery); 1261 ret = power_supply_register(dev, &smb->battery, NULL);
1263 if (ret < 0) { 1262 if (ret < 0) {
1264 if (smb->pdata->use_usb) 1263 if (smb->pdata->use_usb)
1265 power_supply_unregister(&smb->usb); 1264 power_supply_unregister(&smb->usb);
diff --git a/drivers/power/test_power.c b/drivers/power/test_power.c
index f26b1fa00fe1..f6c92d1d7811 100644
--- a/drivers/power/test_power.c
+++ b/drivers/power/test_power.c
@@ -157,8 +157,6 @@ static struct power_supply test_power_supplies[] = {
157 [TEST_AC] = { 157 [TEST_AC] = {
158 .name = "test_ac", 158 .name = "test_ac",
159 .type = POWER_SUPPLY_TYPE_MAINS, 159 .type = POWER_SUPPLY_TYPE_MAINS,
160 .supplied_to = test_power_ac_supplied_to,
161 .num_supplicants = ARRAY_SIZE(test_power_ac_supplied_to),
162 .properties = test_power_ac_props, 160 .properties = test_power_ac_props,
163 .num_properties = ARRAY_SIZE(test_power_ac_props), 161 .num_properties = ARRAY_SIZE(test_power_ac_props),
164 .get_property = test_power_get_ac_property, 162 .get_property = test_power_get_ac_property,
@@ -173,14 +171,25 @@ static struct power_supply test_power_supplies[] = {
173 [TEST_USB] = { 171 [TEST_USB] = {
174 .name = "test_usb", 172 .name = "test_usb",
175 .type = POWER_SUPPLY_TYPE_USB, 173 .type = POWER_SUPPLY_TYPE_USB,
176 .supplied_to = test_power_ac_supplied_to,
177 .num_supplicants = ARRAY_SIZE(test_power_ac_supplied_to),
178 .properties = test_power_ac_props, 174 .properties = test_power_ac_props,
179 .num_properties = ARRAY_SIZE(test_power_ac_props), 175 .num_properties = ARRAY_SIZE(test_power_ac_props),
180 .get_property = test_power_get_usb_property, 176 .get_property = test_power_get_usb_property,
181 }, 177 },
182}; 178};
183 179
180static const struct power_supply_config test_power_configs[] = {
181 {
182 /* test_ac */
183 .supplied_to = test_power_ac_supplied_to,
184 .num_supplicants = ARRAY_SIZE(test_power_ac_supplied_to),
185 }, {
186 /* test_battery */
187 }, {
188 /* test_usb */
189 .supplied_to = test_power_ac_supplied_to,
190 .num_supplicants = ARRAY_SIZE(test_power_ac_supplied_to),
191 },
192};
184 193
185static int __init test_power_init(void) 194static int __init test_power_init(void)
186{ 195{
@@ -188,9 +197,11 @@ static int __init test_power_init(void)
188 int ret; 197 int ret;
189 198
190 BUILD_BUG_ON(TEST_POWER_NUM != ARRAY_SIZE(test_power_supplies)); 199 BUILD_BUG_ON(TEST_POWER_NUM != ARRAY_SIZE(test_power_supplies));
200 BUILD_BUG_ON(TEST_POWER_NUM != ARRAY_SIZE(test_power_configs));
191 201
192 for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++) { 202 for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++) {
193 ret = power_supply_register(NULL, &test_power_supplies[i]); 203 ret = power_supply_register(NULL, &test_power_supplies[i],
204 &test_power_configs[i]);
194 if (ret) { 205 if (ret) {
195 pr_err("%s: failed to register %s\n", __func__, 206 pr_err("%s: failed to register %s\n", __func__,
196 test_power_supplies[i].name); 207 test_power_supplies[i].name);
diff --git a/drivers/power/tosa_battery.c b/drivers/power/tosa_battery.c
index f4d80df627c7..895e4b4dfcf6 100644
--- a/drivers/power/tosa_battery.c
+++ b/drivers/power/tosa_battery.c
@@ -358,13 +358,13 @@ static int tosa_bat_probe(struct platform_device *dev)
358 358
359 INIT_WORK(&bat_work, tosa_bat_work); 359 INIT_WORK(&bat_work, tosa_bat_work);
360 360
361 ret = power_supply_register(&dev->dev, &tosa_bat_main.psy); 361 ret = power_supply_register(&dev->dev, &tosa_bat_main.psy, NULL);
362 if (ret) 362 if (ret)
363 goto err_psy_reg_main; 363 goto err_psy_reg_main;
364 ret = power_supply_register(&dev->dev, &tosa_bat_jacket.psy); 364 ret = power_supply_register(&dev->dev, &tosa_bat_jacket.psy, NULL);
365 if (ret) 365 if (ret)
366 goto err_psy_reg_jacket; 366 goto err_psy_reg_jacket;
367 ret = power_supply_register(&dev->dev, &tosa_bat_bu.psy); 367 ret = power_supply_register(&dev->dev, &tosa_bat_bu.psy, NULL);
368 if (ret) 368 if (ret)
369 goto err_psy_reg_bu; 369 goto err_psy_reg_bu;
370 370
diff --git a/drivers/power/tps65090-charger.c b/drivers/power/tps65090-charger.c
index 0f4e5971dff5..9872c901bd70 100644
--- a/drivers/power/tps65090-charger.c
+++ b/drivers/power/tps65090-charger.c
@@ -233,6 +233,7 @@ static int tps65090_charger_probe(struct platform_device *pdev)
233{ 233{
234 struct tps65090_charger *cdata; 234 struct tps65090_charger *cdata;
235 struct tps65090_platform_data *pdata; 235 struct tps65090_platform_data *pdata;
236 struct power_supply_config psy_cfg = {};
236 uint8_t status1 = 0; 237 uint8_t status1 = 0;
237 int ret; 238 int ret;
238 int irq; 239 int irq;
@@ -264,11 +265,12 @@ static int tps65090_charger_probe(struct platform_device *pdev)
264 cdata->ac.get_property = tps65090_ac_get_property; 265 cdata->ac.get_property = tps65090_ac_get_property;
265 cdata->ac.properties = tps65090_ac_props; 266 cdata->ac.properties = tps65090_ac_props;
266 cdata->ac.num_properties = ARRAY_SIZE(tps65090_ac_props); 267 cdata->ac.num_properties = ARRAY_SIZE(tps65090_ac_props);
267 cdata->ac.supplied_to = pdata->supplied_to;
268 cdata->ac.num_supplicants = pdata->num_supplicants;
269 cdata->ac.of_node = pdev->dev.of_node;
270 268
271 ret = power_supply_register(&pdev->dev, &cdata->ac); 269 psy_cfg.supplied_to = pdata->supplied_to;
270 psy_cfg.num_supplicants = pdata->num_supplicants;
271 psy_cfg.of_node = pdev->dev.of_node;
272
273 ret = power_supply_register(&pdev->dev, &cdata->ac, &psy_cfg);
272 if (ret) { 274 if (ret) {
273 dev_err(&pdev->dev, "failed: power supply register\n"); 275 dev_err(&pdev->dev, "failed: power supply register\n");
274 return ret; 276 return ret;
diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c
index d35b83e635b5..156f30e64a75 100644
--- a/drivers/power/twl4030_charger.c
+++ b/drivers/power/twl4030_charger.c
@@ -590,7 +590,7 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
590 bci->ac.num_properties = ARRAY_SIZE(twl4030_charger_props); 590 bci->ac.num_properties = ARRAY_SIZE(twl4030_charger_props);
591 bci->ac.get_property = twl4030_bci_get_property; 591 bci->ac.get_property = twl4030_bci_get_property;
592 592
593 ret = power_supply_register(&pdev->dev, &bci->ac); 593 ret = power_supply_register(&pdev->dev, &bci->ac, NULL);
594 if (ret) { 594 if (ret) {
595 dev_err(&pdev->dev, "failed to register ac: %d\n", ret); 595 dev_err(&pdev->dev, "failed to register ac: %d\n", ret);
596 goto fail_register_ac; 596 goto fail_register_ac;
@@ -604,7 +604,7 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
604 604
605 bci->usb_reg = regulator_get(bci->dev, "bci3v1"); 605 bci->usb_reg = regulator_get(bci->dev, "bci3v1");
606 606
607 ret = power_supply_register(&pdev->dev, &bci->usb); 607 ret = power_supply_register(&pdev->dev, &bci->usb, NULL);
608 if (ret) { 608 if (ret) {
609 dev_err(&pdev->dev, "failed to register usb: %d\n", ret); 609 dev_err(&pdev->dev, "failed to register usb: %d\n", ret);
610 goto fail_register_usb; 610 goto fail_register_usb;
diff --git a/drivers/power/twl4030_madc_battery.c b/drivers/power/twl4030_madc_battery.c
index cf907609ec49..d065460c1cb3 100644
--- a/drivers/power/twl4030_madc_battery.c
+++ b/drivers/power/twl4030_madc_battery.c
@@ -217,7 +217,7 @@ static int twl4030_madc_battery_probe(struct platform_device *pdev)
217 217
218 twl4030_madc_bat->pdata = pdata; 218 twl4030_madc_bat->pdata = pdata;
219 platform_set_drvdata(pdev, twl4030_madc_bat); 219 platform_set_drvdata(pdev, twl4030_madc_bat);
220 ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy); 220 ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy, NULL);
221 if (ret < 0) 221 if (ret < 0)
222 kfree(twl4030_madc_bat); 222 kfree(twl4030_madc_bat);
223 223
diff --git a/drivers/power/wm831x_backup.c b/drivers/power/wm831x_backup.c
index 56fb509f4be0..60ae871148b0 100644
--- a/drivers/power/wm831x_backup.c
+++ b/drivers/power/wm831x_backup.c
@@ -197,7 +197,7 @@ static int wm831x_backup_probe(struct platform_device *pdev)
197 backup->properties = wm831x_backup_props; 197 backup->properties = wm831x_backup_props;
198 backup->num_properties = ARRAY_SIZE(wm831x_backup_props); 198 backup->num_properties = ARRAY_SIZE(wm831x_backup_props);
199 backup->get_property = wm831x_backup_get_prop; 199 backup->get_property = wm831x_backup_get_prop;
200 ret = power_supply_register(&pdev->dev, backup); 200 ret = power_supply_register(&pdev->dev, backup, NULL);
201 201
202 return ret; 202 return ret;
203} 203}
diff --git a/drivers/power/wm831x_power.c b/drivers/power/wm831x_power.c
index 3bed2f55cf7d..a132aae6225d 100644
--- a/drivers/power/wm831x_power.c
+++ b/drivers/power/wm831x_power.c
@@ -536,7 +536,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
536 wall->properties = wm831x_wall_props; 536 wall->properties = wm831x_wall_props;
537 wall->num_properties = ARRAY_SIZE(wm831x_wall_props); 537 wall->num_properties = ARRAY_SIZE(wm831x_wall_props);
538 wall->get_property = wm831x_wall_get_prop; 538 wall->get_property = wm831x_wall_get_prop;
539 ret = power_supply_register(&pdev->dev, wall); 539 ret = power_supply_register(&pdev->dev, wall, NULL);
540 if (ret) 540 if (ret)
541 goto err_kmalloc; 541 goto err_kmalloc;
542 542
@@ -545,7 +545,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
545 usb->properties = wm831x_usb_props; 545 usb->properties = wm831x_usb_props;
546 usb->num_properties = ARRAY_SIZE(wm831x_usb_props); 546 usb->num_properties = ARRAY_SIZE(wm831x_usb_props);
547 usb->get_property = wm831x_usb_get_prop; 547 usb->get_property = wm831x_usb_get_prop;
548 ret = power_supply_register(&pdev->dev, usb); 548 ret = power_supply_register(&pdev->dev, usb, NULL);
549 if (ret) 549 if (ret)
550 goto err_wall; 550 goto err_wall;
551 551
@@ -560,7 +560,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
560 battery->num_properties = ARRAY_SIZE(wm831x_bat_props); 560 battery->num_properties = ARRAY_SIZE(wm831x_bat_props);
561 battery->get_property = wm831x_bat_get_prop; 561 battery->get_property = wm831x_bat_get_prop;
562 battery->use_for_apm = 1; 562 battery->use_for_apm = 1;
563 ret = power_supply_register(&pdev->dev, battery); 563 ret = power_supply_register(&pdev->dev, battery, NULL);
564 if (ret) 564 if (ret)
565 goto err_usb; 565 goto err_usb;
566 } 566 }
diff --git a/drivers/power/wm8350_power.c b/drivers/power/wm8350_power.c
index b3607e2906d2..261ceca561d5 100644
--- a/drivers/power/wm8350_power.c
+++ b/drivers/power/wm8350_power.c
@@ -457,7 +457,7 @@ static int wm8350_power_probe(struct platform_device *pdev)
457 ac->properties = wm8350_ac_props; 457 ac->properties = wm8350_ac_props;
458 ac->num_properties = ARRAY_SIZE(wm8350_ac_props); 458 ac->num_properties = ARRAY_SIZE(wm8350_ac_props);
459 ac->get_property = wm8350_ac_get_prop; 459 ac->get_property = wm8350_ac_get_prop;
460 ret = power_supply_register(&pdev->dev, ac); 460 ret = power_supply_register(&pdev->dev, ac, NULL);
461 if (ret) 461 if (ret)
462 return ret; 462 return ret;
463 463
@@ -466,7 +466,7 @@ static int wm8350_power_probe(struct platform_device *pdev)
466 battery->num_properties = ARRAY_SIZE(wm8350_bat_props); 466 battery->num_properties = ARRAY_SIZE(wm8350_bat_props);
467 battery->get_property = wm8350_bat_get_property; 467 battery->get_property = wm8350_bat_get_property;
468 battery->use_for_apm = 1; 468 battery->use_for_apm = 1;
469 ret = power_supply_register(&pdev->dev, battery); 469 ret = power_supply_register(&pdev->dev, battery, NULL);
470 if (ret) 470 if (ret)
471 goto battery_failed; 471 goto battery_failed;
472 472
@@ -475,7 +475,7 @@ static int wm8350_power_probe(struct platform_device *pdev)
475 usb->properties = wm8350_usb_props; 475 usb->properties = wm8350_usb_props;
476 usb->num_properties = ARRAY_SIZE(wm8350_usb_props); 476 usb->num_properties = ARRAY_SIZE(wm8350_usb_props);
477 usb->get_property = wm8350_usb_get_prop; 477 usb->get_property = wm8350_usb_get_prop;
478 ret = power_supply_register(&pdev->dev, usb); 478 ret = power_supply_register(&pdev->dev, usb, NULL);
479 if (ret) 479 if (ret)
480 goto usb_failed; 480 goto usb_failed;
481 481
diff --git a/drivers/power/wm97xx_battery.c b/drivers/power/wm97xx_battery.c
index a8e6203673ad..e81e917bd9d0 100644
--- a/drivers/power/wm97xx_battery.c
+++ b/drivers/power/wm97xx_battery.c
@@ -244,7 +244,7 @@ static int wm97xx_bat_probe(struct platform_device *dev)
244 bat_ps.properties = prop; 244 bat_ps.properties = prop;
245 bat_ps.num_properties = props; 245 bat_ps.num_properties = props;
246 246
247 ret = power_supply_register(&dev->dev, &bat_ps); 247 ret = power_supply_register(&dev->dev, &bat_ps, NULL);
248 if (!ret) 248 if (!ret)
249 schedule_work(&bat_work); 249 schedule_work(&bat_work);
250 else 250 else
diff --git a/drivers/power/z2_battery.c b/drivers/power/z2_battery.c
index 814d2e31f0c9..df22364212dd 100644
--- a/drivers/power/z2_battery.c
+++ b/drivers/power/z2_battery.c
@@ -230,7 +230,7 @@ static int z2_batt_probe(struct i2c_client *client,
230 230
231 INIT_WORK(&charger->bat_work, z2_batt_work); 231 INIT_WORK(&charger->bat_work, z2_batt_work);
232 232
233 ret = power_supply_register(&client->dev, &charger->batt_ps); 233 ret = power_supply_register(&client->dev, &charger->batt_ps, NULL);
234 if (ret) 234 if (ret)
235 goto err4; 235 goto err4;
236 236
diff --git a/drivers/staging/nvec/nvec_power.c b/drivers/staging/nvec/nvec_power.c
index 6a1459d4f8fb..4bfa84672818 100644
--- a/drivers/staging/nvec/nvec_power.c
+++ b/drivers/staging/nvec/nvec_power.c
@@ -334,8 +334,6 @@ static struct power_supply nvec_bat_psy = {
334static struct power_supply nvec_psy = { 334static struct power_supply nvec_psy = {
335 .name = "ac", 335 .name = "ac",
336 .type = POWER_SUPPLY_TYPE_MAINS, 336 .type = POWER_SUPPLY_TYPE_MAINS,
337 .supplied_to = nvec_power_supplied_to,
338 .num_supplicants = ARRAY_SIZE(nvec_power_supplied_to),
339 .properties = nvec_power_props, 337 .properties = nvec_power_props,
340 .num_properties = ARRAY_SIZE(nvec_power_props), 338 .num_properties = ARRAY_SIZE(nvec_power_props),
341 .get_property = nvec_power_get_property, 339 .get_property = nvec_power_get_property,
@@ -376,6 +374,7 @@ static int nvec_power_probe(struct platform_device *pdev)
376 struct power_supply *psy; 374 struct power_supply *psy;
377 struct nvec_power *power; 375 struct nvec_power *power;
378 struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent); 376 struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent);
377 struct power_supply_config psy_cfg = {};
379 378
380 power = devm_kzalloc(&pdev->dev, sizeof(struct nvec_power), GFP_NOWAIT); 379 power = devm_kzalloc(&pdev->dev, sizeof(struct nvec_power), GFP_NOWAIT);
381 if (power == NULL) 380 if (power == NULL)
@@ -387,6 +386,8 @@ static int nvec_power_probe(struct platform_device *pdev)
387 switch (pdev->id) { 386 switch (pdev->id) {
388 case AC: 387 case AC:
389 psy = &nvec_psy; 388 psy = &nvec_psy;
389 psy_cfg.supplied_to = nvec_power_supplied_to;
390 psy_cfg.num_supplicants = ARRAY_SIZE(nvec_power_supplied_to);
390 391
391 power->notifier.notifier_call = nvec_power_notifier; 392 power->notifier.notifier_call = nvec_power_notifier;
392 393
@@ -407,7 +408,7 @@ static int nvec_power_probe(struct platform_device *pdev)
407 if (pdev->id == BAT) 408 if (pdev->id == BAT)
408 get_bat_mfg_data(power); 409 get_bat_mfg_data(power);
409 410
410 return power_supply_register(&pdev->dev, psy); 411 return power_supply_register(&pdev->dev, psy, &psy_cfg);
411} 412}
412 413
413static int nvec_power_remove(struct platform_device *pdev) 414static int nvec_power_remove(struct platform_device *pdev)
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index e30d85c0158d..0d7c95f634a5 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -176,6 +176,16 @@ union power_supply_propval {
176struct device; 176struct device;
177struct device_node; 177struct device_node;
178 178
179/* Power supply instance specific configuration */
180struct power_supply_config {
181 struct device_node *of_node;
182 /* Driver private data */
183 void *drv_data;
184
185 char **supplied_to;
186 size_t num_supplicants;
187};
188
179struct power_supply { 189struct power_supply {
180 const char *name; 190 const char *name;
181 enum power_supply_type type; 191 enum power_supply_type type;
@@ -278,13 +288,17 @@ static inline int power_supply_is_system_supplied(void) { return -ENOSYS; }
278#endif 288#endif
279 289
280extern int power_supply_register(struct device *parent, 290extern int power_supply_register(struct device *parent,
281 struct power_supply *psy); 291 struct power_supply *psy,
292 const struct power_supply_config *cfg);
282extern int power_supply_register_no_ws(struct device *parent, 293extern int power_supply_register_no_ws(struct device *parent,
283 struct power_supply *psy); 294 struct power_supply *psy,
295 const struct power_supply_config *cfg);
284extern int devm_power_supply_register(struct device *parent, 296extern int devm_power_supply_register(struct device *parent,
285 struct power_supply *psy); 297 struct power_supply *psy,
298 const struct power_supply_config *cfg);
286extern int devm_power_supply_register_no_ws(struct device *parent, 299extern int devm_power_supply_register_no_ws(struct device *parent,
287 struct power_supply *psy); 300 struct power_supply *psy,
301 const struct power_supply_config *cfg);
288extern void power_supply_unregister(struct power_supply *psy); 302extern void power_supply_unregister(struct power_supply *psy);
289extern int power_supply_powers(struct power_supply *psy, struct device *dev); 303extern int power_supply_powers(struct power_supply *psy, struct device *dev);
290 304