Skip to content

Commit

Permalink
Merge tag 'for-v4.1' of git://git.infradead.org/battery-2.6
Browse files Browse the repository at this point in the history
Pull power supply and reset changes from Sebastian Reichel:

 - new API for safe access of power supply function attrs

 - devres support for power supply (un)registration

 - new drivers / chips:
     - generic syscon based poweroff driver
     - iio & charger driver for da9150
     - fuel gauge driver for axp288
     - bq27x00: add support for bq27510
     - bq2415x: add support for bq24157s

 - twl4030-madc-battery: convert to iio consumer

 - misc fixes

* tag 'for-v4.1' of git://git.infradead.org/battery-2.6: (66 commits)
  power: twl4030_madc_battery: Add missing MODULE_ALIAS
  power: twl4030-madc-battery: Convert to iio consumer.
  dt: power: Add docs for generic SYSCON poweroff driver.
  power: reset: Add generic SYSCON register mapped poweroff.
  power: max17042_battery: add missed blank
  power: max17042_battery: Use reg type instead of chip type
  power/reset: at91: big endian fixes for atsama5d3x
  power_supply: charger-manager: Fix dereferencing of ERR_PTR
  HID: input: Fix NULL pointer dereference when power_supply_register fails
  power: constify of_device_id array
  power/reset/rmobile-reset.c: Fix !HAS_IOMEM build
  power_supply: 88pm860x_charger: Fix possible NULL pointer dereference and use of initialized variable
  arm: mach-pxa: Decrement the power supply's device reference counter
  mfd: ab8500: Decrement the power supply's device reference counter
  power_supply: bq2415x_charger: Decrement the power supply's device reference counter
  power_supply: 88pm860x_charger: Decrement the power supply's device reference counter
  x86/olpc/xo15/sci: Use newly added power_supply_put API
  x86/olpc/xo1/sci: Use newly added power_supply_put API
  power_supply: charger-manager: Decrement the power supply's device reference counter
  power_supply: Increment power supply use counter when obtaining references
  ...
  • Loading branch information
torvalds committed Apr 13, 2015
2 parents d700b05 + 5939d9d commit a21c1ea
Show file tree
Hide file tree
Showing 106 changed files with 5,435 additions and 2,104 deletions.
16 changes: 16 additions & 0 deletions Documentation/devicetree/bindings/iio/adc/da9150-gpadc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Dialog Semiconductor DA9150 IIO GPADC bindings

Required properties:
- compatible: "dlg,da9150-gpadc" for DA9150 IIO GPADC
- #io-channel-cells: Should be set to <1>
(See Documentation/devicetree/bindings/iio/iio-bindings.txt for further info)

For further information on GPADC channels, see device datasheet.


Example:

gpadc: da9150-gpadc {
compatible = "dlg,da9150-gpadc";
#io-channel-cells = <1>;
};
26 changes: 26 additions & 0 deletions Documentation/devicetree/bindings/power/da9150-charger.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Dialog Semiconductor DA9150 Charger Power Supply bindings

Required properties:
- compatible: "dlg,da9150-charger" for DA9150 Charger Power Supply

Optional properties:
- io-channels: List of phandle and IIO specifier pairs
- io-channel-names: List of channel names used by charger
["CHAN_IBUS", "CHAN_VBUS", "CHAN_TJUNC", "CHAN_VBAT"]
(See Documentation/devicetree/bindings/iio/iio-bindings.txt for further info)


Example:

da9150-charger {
compatible = "dlg,da9150-charger";

io-channels = <&gpadc 0>,
<&gpadc 2>,
<&gpadc 8>,
<&gpadc 5>;
io-channel-names = "CHAN_IBUS",
"CHAN_VBUS",
"CHAN_TJUNC",
"CHAN_VBAT";
};
23 changes: 23 additions & 0 deletions Documentation/devicetree/bindings/power/reset/syscon-poweroff.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Generic SYSCON mapped register poweroff driver

This is a generic poweroff driver using syscon to map the poweroff register.
The poweroff is generally performed with a write to the poweroff register
defined by the register map pointed by syscon reference plus the offset
with the mask defined in the poweroff node.

Required properties:
- compatible: should contain "syscon-poweroff"
- regmap: this is phandle to the register map node
- offset: offset in the register map for the poweroff register (in bytes)
- mask: the poweroff value written to the poweroff register (32 bit access)

Default will be little endian mode, 32 bit access only.

Examples:

poweroff {
compatible = "syscon-poweroff";
regmap = <&regmapnode>;
offset = <0x0>;
mask = <0x7a>;
};
4 changes: 4 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -3137,12 +3137,15 @@ S: Supported
F: Documentation/hwmon/da90??
F: drivers/gpio/gpio-da90??.c
F: drivers/hwmon/da90??-hwmon.c
F: drivers/iio/adc/da91??-*.c
F: drivers/input/misc/da90??_onkey.c
F: drivers/input/touchscreen/da9052_tsi.c
F: drivers/leds/leds-da90??.c
F: drivers/mfd/da903x.c
F: drivers/mfd/da90??-*.c
F: drivers/mfd/da91??-*.c
F: drivers/power/da9052-battery.c
F: drivers/power/da91??-*.c
F: drivers/regulator/da903x.c
F: drivers/regulator/da9???-regulator.[ch]
F: drivers/rtc/rtc-da90??.c
Expand All @@ -3152,6 +3155,7 @@ F: include/linux/mfd/da903x.h
F: include/linux/mfd/da9052/
F: include/linux/mfd/da9055/
F: include/linux/mfd/da9063/
F: include/linux/mfd/da9150/
F: include/sound/da[79]*.h
F: sound/soc/codecs/da[79]*.[ch]

Expand Down
4 changes: 3 additions & 1 deletion arch/arm/mach-pxa/raumfeld.c
Original file line number Diff line number Diff line change
Expand Up @@ -758,8 +758,10 @@ static void raumfeld_power_signal_charged(void)
struct power_supply *psy =
power_supply_get_by_name(raumfeld_power_supplicants[0]);

if (psy)
if (psy) {
power_supply_set_battery_charged(psy);
power_supply_put(psy);
}
}

static int raumfeld_power_resume(void)
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/platform/olpc/olpc-xo1-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ static void battery_status_changed(void)

if (psy) {
power_supply_changed(psy);
put_device(psy->dev);
power_supply_put(psy);
}
}

Expand All @@ -71,7 +71,7 @@ static void ac_status_changed(void)

if (psy) {
power_supply_changed(psy);
put_device(psy->dev);
power_supply_put(psy);
}
}

Expand Down
4 changes: 2 additions & 2 deletions arch/x86/platform/olpc/olpc-xo15-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ static void battery_status_changed(void)

if (psy) {
power_supply_changed(psy);
put_device(psy->dev);
power_supply_put(psy);
}
}

Expand All @@ -93,7 +93,7 @@ static void ac_status_changed(void)

if (psy) {
power_supply_changed(psy);
put_device(psy->dev);
power_supply_put(psy);
}
}

Expand Down
32 changes: 19 additions & 13 deletions drivers/acpi/ac.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,14 @@ static struct acpi_driver acpi_ac_driver = {
};

struct acpi_ac {
struct power_supply charger;
struct power_supply *charger;
struct power_supply_desc charger_desc;
struct acpi_device * device;
unsigned long long state;
struct notifier_block battery_nb;
};

#define to_acpi_ac(x) container_of(x, struct acpi_ac, charger)
#define to_acpi_ac(x) power_supply_get_drvdata(x)

#ifdef CONFIG_ACPI_PROCFS_POWER
static const struct file_operations acpi_ac_fops = {
Expand Down Expand Up @@ -275,7 +276,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
dev_name(&device->dev), event,
(u32) ac->state);
acpi_notifier_call_chain(device, event, (u32) ac->state);
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
kobject_uevent(&ac->charger->dev.kobj, KOBJ_CHANGE);
}

return;
Expand Down Expand Up @@ -321,6 +322,7 @@ static struct dmi_system_id ac_dmi_table[] = {

static int acpi_ac_add(struct acpi_device *device)
{
struct power_supply_config psy_cfg = {};
int result = 0;
struct acpi_ac *ac = NULL;

Expand All @@ -341,19 +343,24 @@ static int acpi_ac_add(struct acpi_device *device)
if (result)
goto end;

ac->charger.name = acpi_device_bid(device);
psy_cfg.drv_data = ac;

ac->charger_desc.name = acpi_device_bid(device);
#ifdef CONFIG_ACPI_PROCFS_POWER
result = acpi_ac_add_fs(ac);
if (result)
goto end;
#endif
ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
ac->charger.properties = ac_props;
ac->charger.num_properties = ARRAY_SIZE(ac_props);
ac->charger.get_property = get_ac_property;
result = power_supply_register(&ac->device->dev, &ac->charger);
if (result)
ac->charger_desc.type = POWER_SUPPLY_TYPE_MAINS;
ac->charger_desc.properties = ac_props;
ac->charger_desc.num_properties = ARRAY_SIZE(ac_props);
ac->charger_desc.get_property = get_ac_property;
ac->charger = power_supply_register(&ac->device->dev,
&ac->charger_desc, &psy_cfg);
if (IS_ERR(ac->charger)) {
result = PTR_ERR(ac->charger);
goto end;
}

printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
acpi_device_name(device), acpi_device_bid(device),
Expand Down Expand Up @@ -390,7 +397,7 @@ static int acpi_ac_resume(struct device *dev)
if (acpi_ac_get_state(ac))
return 0;
if (old_state != ac->state)
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
kobject_uevent(&ac->charger->dev.kobj, KOBJ_CHANGE);
return 0;
}
#else
Expand All @@ -407,8 +414,7 @@ static int acpi_ac_remove(struct acpi_device *device)

ac = acpi_driver_data(device);

if (ac->charger.dev)
power_supply_unregister(&ac->charger);
power_supply_unregister(ac->charger);
unregister_acpi_notifier(&ac->battery_nb);

#ifdef CONFIG_ACPI_PROCFS_POWER
Expand Down
54 changes: 30 additions & 24 deletions drivers/acpi/battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ enum {
struct acpi_battery {
struct mutex lock;
struct mutex sysfs_lock;
struct power_supply bat;
struct power_supply *bat;
struct power_supply_desc bat_desc;
struct acpi_device *device;
struct notifier_block pm_nb;
unsigned long update_time;
Expand Down Expand Up @@ -149,7 +150,7 @@ struct acpi_battery {
unsigned long flags;
};

#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat)
#define to_acpi_battery(x) power_supply_get_drvdata(x)

static inline int acpi_battery_present(struct acpi_battery *battery)
{
Expand Down Expand Up @@ -608,40 +609,45 @@ static struct device_attribute alarm_attr = {

static int sysfs_add_battery(struct acpi_battery *battery)
{
int result;
struct power_supply_config psy_cfg = { .drv_data = battery, };

if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) {
battery->bat.properties = charge_battery_props;
battery->bat.num_properties =
battery->bat_desc.properties = charge_battery_props;
battery->bat_desc.num_properties =
ARRAY_SIZE(charge_battery_props);
} else {
battery->bat.properties = energy_battery_props;
battery->bat.num_properties =
battery->bat_desc.properties = energy_battery_props;
battery->bat_desc.num_properties =
ARRAY_SIZE(energy_battery_props);
}

battery->bat.name = acpi_device_bid(battery->device);
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
battery->bat.get_property = acpi_battery_get_property;
battery->bat_desc.name = acpi_device_bid(battery->device);
battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY;
battery->bat_desc.get_property = acpi_battery_get_property;

result = power_supply_register_no_ws(&battery->device->dev, &battery->bat);
battery->bat = power_supply_register_no_ws(&battery->device->dev,
&battery->bat_desc, &psy_cfg);

if (result)
if (IS_ERR(battery->bat)) {
int result = PTR_ERR(battery->bat);

battery->bat = NULL;
return result;
return device_create_file(battery->bat.dev, &alarm_attr);
}
return device_create_file(&battery->bat->dev, &alarm_attr);
}

static void sysfs_remove_battery(struct acpi_battery *battery)
{
mutex_lock(&battery->sysfs_lock);
if (!battery->bat.dev) {
if (!battery->bat) {
mutex_unlock(&battery->sysfs_lock);
return;
}

device_remove_file(battery->bat.dev, &alarm_attr);
power_supply_unregister(&battery->bat);
battery->bat.dev = NULL;
device_remove_file(&battery->bat->dev, &alarm_attr);
power_supply_unregister(battery->bat);
battery->bat = NULL;
mutex_unlock(&battery->sysfs_lock);
}

Expand Down Expand Up @@ -738,7 +744,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume)
return result;
acpi_battery_init_alarm(battery);
}
if (!battery->bat.dev) {
if (!battery->bat) {
result = sysfs_add_battery(battery);
if (result)
return result;
Expand All @@ -764,7 +770,7 @@ static void acpi_battery_refresh(struct acpi_battery *battery)
{
int power_unit;

if (!battery->bat.dev)
if (!battery->bat)
return;

power_unit = battery->power_unit;
Expand Down Expand Up @@ -1062,11 +1068,11 @@ static void acpi_battery_remove_fs(struct acpi_device *device)
static void acpi_battery_notify(struct acpi_device *device, u32 event)
{
struct acpi_battery *battery = acpi_driver_data(device);
struct device *old;
struct power_supply *old;

if (!battery)
return;
old = battery->bat.dev;
old = battery->bat;
/*
* On Acer Aspire V5-573G notifications are sometimes triggered too
* early. For example, when AC is unplugged and notification is
Expand All @@ -1083,8 +1089,8 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
acpi_battery_present(battery));
acpi_notifier_call_chain(device, event, acpi_battery_present(battery));
/* acpi_battery_update could remove power_supply object */
if (old && battery->bat.dev)
power_supply_changed(&battery->bat);
if (old && battery->bat)
power_supply_changed(battery->bat);
}

static int battery_notify(struct notifier_block *nb,
Expand All @@ -1100,7 +1106,7 @@ static int battery_notify(struct notifier_block *nb,
if (!acpi_battery_present(battery))
return 0;

if (!battery->bat.dev) {
if (battery->bat) {
result = acpi_battery_get_info(battery);
if (result)
return result;
Expand Down
Loading

0 comments on commit a21c1ea

Please sign in to comment.