forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'for-v3.14' of git://git.infradead.org/battery-2.6
Pull battery updates from Dmitry Eremin-Solenikov: "I'm picking up power supply maintainership from Anton Vorontov. Could you please pull battery-2.6 git tree changes prepared for the v3.14 release. Highlights: - Power supply notifier - Several drivers gained DT support - Added Maxim 14577 driver - Change of maintainer" * tag 'for-v3.14' of git://git.infradead.org/battery-2.6: MAINTAINERS: Pick up power supply maintainership max17042_battery: Add IRQF_ONESHOT flag to use default irq handler gpio-charger: Support wakeup events power_supply: Add charger support for Maxim 14577 dt: Binding documentation for isp1704 charger isp1704_charger: Add DT support charger-manager: of_cm_parse_desc() should be static bq2415x_charger: Add DT support power_supply: Add power_supply_get_by_phandle bq2415x_charger: Use power_supply notifier for automode power: reset: Add as3722 power-off driver mfd: AS3722: Add dt node properties for system power controller charger-manager: Support deivce tree in charger manager driver charger-manager: Modify the way of checking battery's temperature power_supply: Add power_supply notifier
- Loading branch information
Showing
20 changed files
with
1,043 additions
and
132 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
Binding for NXP ISP1704 USB Charger Detection | ||
|
||
Required properties: | ||
- compatible: Should contain one of the following: | ||
* "nxp,isp1704" | ||
- nxp,enable-gpio: Should contain a phandle + gpio-specifier | ||
to the GPIO pin connected to the chip's enable pin. | ||
- usb-phy: Should contain a phandle to the USB PHY | ||
the ISP1704 is connected to. | ||
|
||
Example: | ||
|
||
isp1704 { | ||
compatible = "nxp,isp1704"; | ||
nxp,enable-gpio = <&gpio3 3 GPIO_ACTIVE_LOW>; | ||
usb-phy = <&usb2_phy>; | ||
}; |
81 changes: 81 additions & 0 deletions
81
Documentation/devicetree/bindings/power_supply/charger-manager.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
charger-manager bindings | ||
~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|
||
Required properties : | ||
- compatible : "charger-manager" | ||
- <>-supply : for regulator consumer | ||
- cm-num-chargers : number of chargers | ||
- cm-chargers : name of chargers | ||
- cm-fuel-gauge : name of battery fuel gauge | ||
- subnode <regulator> : | ||
- cm-regulator-name : name of charger regulator | ||
- subnode <cable> : | ||
- cm-cable-name : name of charger cable | ||
- cm-cable-extcon : name of extcon dev | ||
(optional) - cm-cable-min : minimum current of cable | ||
(optional) - cm-cable-max : maximum current of cable | ||
|
||
Optional properties : | ||
- cm-name : charger manager's name (default : "battery") | ||
- cm-poll-mode : polling mode (enum polling_modes) | ||
- cm-poll-interval : polling interval | ||
- cm-battery-stat : battery status (enum data_source) | ||
- cm-fullbatt-* : data for full battery checking | ||
- cm-thermal-zone : name of external thermometer's thermal zone | ||
- cm-battery-* : threshold battery temperature for charging | ||
-cold : critical cold temperature of battery for charging | ||
-cold-in-minus : flag that cold temerature is in minus degree | ||
-hot : critical hot temperature of battery for charging | ||
-temp-diff : temperature difference to allow recharging | ||
- cm-dis/charging-max = limits of charging duration | ||
|
||
Example : | ||
charger-manager@0 { | ||
compatible = "charger-manager"; | ||
chg-reg-supply = <&charger_regulator>; | ||
|
||
cm-name = "battery"; | ||
/* Always polling ON : 30s */ | ||
cm-poll-mode = <1>; | ||
cm-poll-interval = <30000>; | ||
|
||
cm-fullbatt-vchkdrop-ms = <30000>; | ||
cm-fullbatt-vchkdrop-volt = <150000>; | ||
cm-fullbatt-soc = <100>; | ||
|
||
cm-battery-stat = <3>; | ||
|
||
cm-num-chargers = <3>; | ||
cm-chargers = "charger0", "charger1", "charger2"; | ||
|
||
cm-fuel-gauge = "fuelgauge0"; | ||
|
||
cm-thermal-zone = "thermal_zone.1" | ||
/* in deci centigrade */ | ||
cm-battery-cold = <50>; | ||
cm-battery-cold-in-minus; | ||
cm-battery-hot = <800>; | ||
cm-battery-temp-diff = <100>; | ||
|
||
/* Allow charging for 5hr */ | ||
cm-charging-max = <18000000>; | ||
/* Allow discharging for 2hr */ | ||
cm-discharging-max = <7200000>; | ||
|
||
regulator@0 { | ||
cm-regulator-name = "chg-reg"; | ||
cable@0 { | ||
cm-cable-name = "USB"; | ||
cm-cable-extcon = "extcon-dev.0"; | ||
cm-cable-min = <475000>; | ||
cm-cable-max = <500000>; | ||
}; | ||
cable@1 { | ||
cm-cable-name = "TA"; | ||
cm-cable-extcon = "extcon-dev.0"; | ||
cm-cable-min = <650000>; | ||
cm-cable-max = <675000>; | ||
}; | ||
}; | ||
|
||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6712,7 +6712,7 @@ F: include/linux/timer* | |
F: kernel/*timer* | ||
|
||
POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS | ||
M: Anton Vorontsov <[email protected]> | ||
M: Dmitry Eremin-Solenikov <[email protected]> | ||
M: David Woodhouse <[email protected]> | ||
T: git git://git.infradead.org/battery-2.6.git | ||
S: Maintained | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
/* | ||
* bq2415x charger driver | ||
* | ||
* Copyright (C) 2011-2012 Pali Rohár <[email protected]> | ||
* Copyright (C) 2011-2013 Pali Rohár <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
|
@@ -170,6 +170,8 @@ struct bq2415x_device { | |
struct bq2415x_platform_data init_data; | ||
struct power_supply charger; | ||
struct delayed_work work; | ||
struct power_supply *notify_psy; | ||
struct notifier_block nb; | ||
enum bq2415x_mode reported_mode;/* mode reported by hook function */ | ||
enum bq2415x_mode mode; /* current configured mode */ | ||
enum bq2415x_chip chip; | ||
|
@@ -795,24 +797,53 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode) | |
|
||
} | ||
|
||
/* hook function called by other driver which set reported mode */ | ||
static void bq2415x_hook_function(enum bq2415x_mode mode, void *data) | ||
static int bq2415x_notifier_call(struct notifier_block *nb, | ||
unsigned long val, void *v) | ||
{ | ||
struct bq2415x_device *bq = data; | ||
struct bq2415x_device *bq = | ||
container_of(nb, struct bq2415x_device, nb); | ||
struct power_supply *psy = v; | ||
enum bq2415x_mode mode; | ||
union power_supply_propval prop; | ||
int ret; | ||
int mA; | ||
|
||
if (!bq) | ||
return; | ||
if (val != PSY_EVENT_PROP_CHANGED) | ||
return NOTIFY_OK; | ||
|
||
if (psy != bq->notify_psy) | ||
return NOTIFY_OK; | ||
|
||
dev_dbg(bq->dev, "notifier call was called\n"); | ||
|
||
ret = psy->get_property(psy, POWER_SUPPLY_PROP_CURRENT_MAX, &prop); | ||
if (ret != 0) | ||
return NOTIFY_OK; | ||
|
||
mA = prop.intval; | ||
|
||
if (mA == 0) | ||
mode = BQ2415X_MODE_OFF; | ||
else if (mA < 500) | ||
mode = BQ2415X_MODE_NONE; | ||
else if (mA < 1800) | ||
mode = BQ2415X_MODE_HOST_CHARGER; | ||
else | ||
mode = BQ2415X_MODE_DEDICATED_CHARGER; | ||
|
||
if (bq->reported_mode == mode) | ||
return NOTIFY_OK; | ||
|
||
dev_dbg(bq->dev, "hook function was called\n"); | ||
bq->reported_mode = mode; | ||
|
||
/* if automode is not enabled do not tell about reported_mode */ | ||
if (bq->automode < 1) | ||
return; | ||
return NOTIFY_OK; | ||
|
||
sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode"); | ||
bq2415x_set_mode(bq, bq->reported_mode); | ||
|
||
return NOTIFY_OK; | ||
} | ||
|
||
/**** timer functions ****/ | ||
|
@@ -1512,9 +1543,11 @@ static int bq2415x_probe(struct i2c_client *client, | |
int num; | ||
char *name; | ||
struct bq2415x_device *bq; | ||
struct device_node *np = client->dev.of_node; | ||
struct bq2415x_platform_data *pdata = client->dev.platform_data; | ||
|
||
if (!client->dev.platform_data) { | ||
dev_err(&client->dev, "platform data not set\n"); | ||
if (!np && !pdata) { | ||
dev_err(&client->dev, "platform data missing\n"); | ||
return -ENODEV; | ||
} | ||
|
||
|
@@ -1539,6 +1572,17 @@ static int bq2415x_probe(struct i2c_client *client, | |
goto error_2; | ||
} | ||
|
||
if (np) { | ||
bq->notify_psy = power_supply_get_by_phandle(np, "ti,usb-charger-detection"); | ||
|
||
if (!bq->notify_psy) | ||
return -EPROBE_DEFER; | ||
} | ||
else if (pdata->notify_device) | ||
bq->notify_psy = power_supply_get_by_name(pdata->notify_device); | ||
else | ||
bq->notify_psy = NULL; | ||
|
||
i2c_set_clientdata(client, bq); | ||
|
||
bq->id = num; | ||
|
@@ -1550,8 +1594,34 @@ static int bq2415x_probe(struct i2c_client *client, | |
bq->autotimer = 0; | ||
bq->automode = 0; | ||
|
||
memcpy(&bq->init_data, client->dev.platform_data, | ||
sizeof(bq->init_data)); | ||
if (np) { | ||
ret = of_property_read_u32(np, "ti,current-limit", | ||
&bq->init_data.current_limit); | ||
if (ret) | ||
return ret; | ||
ret = of_property_read_u32(np, "ti,weak-battery-voltage", | ||
&bq->init_data.weak_battery_voltage); | ||
if (ret) | ||
return ret; | ||
ret = of_property_read_u32(np, "ti,battery-regulation-voltage", | ||
&bq->init_data.battery_regulation_voltage); | ||
if (ret) | ||
return ret; | ||
ret = of_property_read_u32(np, "ti,charge-current", | ||
&bq->init_data.charge_current); | ||
if (ret) | ||
return ret; | ||
ret = of_property_read_u32(np, "ti,termination-current", | ||
&bq->init_data.termination_current); | ||
if (ret) | ||
return ret; | ||
ret = of_property_read_u32(np, "ti,resistor-sense", | ||
&bq->init_data.resistor_sense); | ||
if (ret) | ||
return ret; | ||
} else { | ||
memcpy(&bq->init_data, pdata, sizeof(bq->init_data)); | ||
} | ||
|
||
bq2415x_reset_chip(bq); | ||
|
||
|
@@ -1573,16 +1643,20 @@ static int bq2415x_probe(struct i2c_client *client, | |
goto error_4; | ||
} | ||
|
||
if (bq->init_data.set_mode_hook) { | ||
if (bq->init_data.set_mode_hook( | ||
bq2415x_hook_function, bq)) { | ||
bq->automode = 1; | ||
bq2415x_set_mode(bq, bq->reported_mode); | ||
dev_info(bq->dev, "automode enabled\n"); | ||
} else { | ||
bq->automode = -1; | ||
dev_info(bq->dev, "automode failed\n"); | ||
if (bq->notify_psy) { | ||
bq->nb.notifier_call = bq2415x_notifier_call; | ||
ret = power_supply_reg_notifier(&bq->nb); | ||
if (ret) { | ||
dev_err(bq->dev, "failed to reg notifier: %d\n", ret); | ||
goto error_5; | ||
} | ||
|
||
/* Query for initial reported_mode and set it */ | ||
bq2415x_notifier_call(&bq->nb, PSY_EVENT_PROP_CHANGED, bq->notify_psy); | ||
bq2415x_set_mode(bq, bq->reported_mode); | ||
|
||
bq->automode = 1; | ||
dev_info(bq->dev, "automode enabled\n"); | ||
} else { | ||
bq->automode = -1; | ||
dev_info(bq->dev, "automode not supported\n"); | ||
|
@@ -1594,6 +1668,7 @@ static int bq2415x_probe(struct i2c_client *client, | |
dev_info(bq->dev, "driver registered\n"); | ||
return 0; | ||
|
||
error_5: | ||
error_4: | ||
bq2415x_sysfs_exit(bq); | ||
error_3: | ||
|
@@ -1614,8 +1689,8 @@ static int bq2415x_remove(struct i2c_client *client) | |
{ | ||
struct bq2415x_device *bq = i2c_get_clientdata(client); | ||
|
||
if (bq->init_data.set_mode_hook) | ||
bq->init_data.set_mode_hook(NULL, NULL); | ||
if (bq->notify_psy) | ||
power_supply_unreg_notifier(&bq->nb); | ||
|
||
bq2415x_sysfs_exit(bq); | ||
bq2415x_power_supply_exit(bq); | ||
|
Oops, something went wrong.