From: Andreas Dannenberg <dannenberg@ti.com>
To: Sebastian Reichel <sre@kernel.org>,
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>,
David Woodhouse <dwmw2@infradead.org>,
Laurentiu Palcu <laurentiu.palcu@intel.com>,
Krzysztof Kozlowski <k.kozlowski.k@gmail.com>
Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
Andreas Dannenberg <dannenberg@ti.com>
Subject: [PATCH 04/13] power: bq24257: Allow manual setting of input current limit
Date: Mon, 31 Aug 2015 21:10:26 -0500 [thread overview]
Message-ID: <1441073435-12349-5-git-send-email-dannenberg@ti.com> (raw)
In-Reply-To: <1441073435-12349-1-git-send-email-dannenberg@ti.com>
A new device property called "ti,in-ilimit-autoset-disable" is
introduced to allow disabling the D+/D- based auto-detection algorithm
used to determine the input current limit. This feature is also
explicitly disabled on bq25250 devices which don't support D+/D-
charger type detection.
If "ti,in-ilimit-autoset-disable" is set the actual input current limit
can be configured through the "ti,in-limit-current" property.
Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
---
drivers/power/bq24257_charger.c | 98 ++++++++++++++++++++++++++++++++---------
1 file changed, 77 insertions(+), 21 deletions(-)
diff --git a/drivers/power/bq24257_charger.c b/drivers/power/bq24257_charger.c
index 45232bd..229fbce 100644
--- a/drivers/power/bq24257_charger.c
+++ b/drivers/power/bq24257_charger.c
@@ -68,6 +68,8 @@ struct bq24257_init_data {
u8 ichg; /* charge current */
u8 vbat; /* regulation voltage */
u8 iterm; /* termination current */
+ u8 in_ilimit; /* input current limit */
+ bool in_ilimit_autoset_disable; /* auto-detect of input current limit */
};
struct bq24257_state {
@@ -95,6 +97,8 @@ struct bq24257_device {
struct bq24257_state state;
struct mutex lock; /* protect state data */
+
+ bool in_ilimit_autoset_disable;
};
static bool bq24257_is_volatile_reg(struct device *dev, unsigned int reg)
@@ -183,6 +187,12 @@ static const u32 bq24257_iterm_map[] = {
#define BQ24257_ITERM_MAP_SIZE ARRAY_SIZE(bq24257_iterm_map)
+static const u32 bq24257_iilimit_map[] = {
+ 100000, 150000, 500000, 900000, 1500000, 2000000
+};
+
+#define BQ24257_IILIMIT_MAP_SIZE ARRAY_SIZE(bq24257_iilimit_map)
+
static int bq24257_field_read(struct bq24257_device *bq,
enum bq24257_fields field_id)
{
@@ -478,24 +488,35 @@ static void bq24257_handle_state_change(struct bq24257_device *bq,
old_state = bq->state;
mutex_unlock(&bq->lock);
- if (!new_state->power_good) { /* power removed */
- cancel_delayed_work_sync(&bq->iilimit_setup_work);
-
- /* activate D+/D- port detection algorithm */
- ret = bq24257_field_write(bq, F_DPDM_EN, 1);
- if (ret < 0)
- goto error;
+ /*
+ * Handle BQ2425x state changes observing whether the D+/D- based input
+ * current limit autoset functionality is enabled.
+ */
+ if (!new_state->power_good) {
+ dev_dbg(bq->dev, "Power removed\n");
+ if (!bq->in_ilimit_autoset_disable) {
+ cancel_delayed_work_sync(&bq->iilimit_setup_work);
- reset_iilimit = true;
- } else if (!old_state.power_good) { /* power inserted */
- config_iilimit = true;
- } else if (new_state->fault == FAULT_NO_BAT) { /* battery removed */
- cancel_delayed_work_sync(&bq->iilimit_setup_work);
+ /* activate D+/D- port detection algorithm */
+ ret = bq24257_field_write(bq, F_DPDM_EN, 1);
+ if (ret < 0)
+ goto error;
- reset_iilimit = true;
- } else if (old_state.fault == FAULT_NO_BAT) { /* battery connected */
- config_iilimit = true;
- } else if (new_state->fault == FAULT_TIMER) { /* safety timer expired */
+ reset_iilimit = true;
+ }
+ } else if (!old_state.power_good) {
+ dev_dbg(bq->dev, "Power inserted\n");
+ config_iilimit = !bq->in_ilimit_autoset_disable;
+ } else if (new_state->fault == FAULT_NO_BAT) {
+ dev_warn(bq->dev, "Battery removed\n");
+ if (!bq->in_ilimit_autoset_disable) {
+ cancel_delayed_work_sync(&bq->iilimit_setup_work);
+ reset_iilimit = true;
+ }
+ } else if (old_state.fault == FAULT_NO_BAT) {
+ dev_warn(bq->dev, "Battery connected\n");
+ config_iilimit = !bq->in_ilimit_autoset_disable;
+ } else if (new_state->fault == FAULT_TIMER) {
dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
}
@@ -580,7 +601,16 @@ static int bq24257_hw_init(struct bq24257_device *bq)
bq->state = state;
mutex_unlock(&bq->lock);
- if (!state.power_good)
+ if (bq->in_ilimit_autoset_disable) {
+ dev_dbg(bq->dev, "manually setting iilimit = %d\n",
+ bq->init_data.in_ilimit);
+
+ /* program fixed input current limit */
+ ret = bq24257_field_write(bq, F_IILIMIT,
+ bq->init_data.in_ilimit);
+ if (ret < 0)
+ return ret;
+ } else if (!state.power_good)
/* activate D+/D- detection algorithm */
ret = bq24257_field_write(bq, F_DPDM_EN, 1);
else if (state.fault != FAULT_NO_BAT)
@@ -658,6 +688,7 @@ static int bq24257_fw_probe(struct bq24257_device *bq)
int ret;
u32 property;
+ /* Required properties */
ret = device_property_read_u32(bq->dev, "ti,charge-current", &property);
if (ret < 0)
return ret;
@@ -681,6 +712,19 @@ static int bq24257_fw_probe(struct bq24257_device *bq)
bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map,
BQ24257_ITERM_MAP_SIZE);
+ /* Optional properties */
+ ret = device_property_read_u32(bq->dev, "ti,in-limit-current",
+ &property);
+
+ if (ret < 0)
+ bq->init_data.in_ilimit = IILIMIT_500;
+ else
+ bq->init_data.in_ilimit = bq24257_find_idx(property,
+ bq24257_iilimit_map, BQ24257_IILIMIT_MAP_SIZE);
+
+ bq->init_data.in_ilimit_autoset_disable = device_property_read_bool(
+ bq->dev, "ti,in-ilimit-autoset-disable");
+
return 0;
}
@@ -728,8 +772,6 @@ static int bq24257_probe(struct i2c_client *client,
i2c_set_clientdata(client, bq);
- INIT_DELAYED_WORK(&bq->iilimit_setup_work, bq24257_iilimit_setup_work);
-
if (!dev->platform_data) {
ret = bq24257_fw_probe(bq);
if (ret < 0) {
@@ -740,6 +782,18 @@ static int bq24257_probe(struct i2c_client *client,
return -ENODEV;
}
+ /*
+ * The BQ24250 doesn't support the D+/D- based detection for the
+ * input current limit setting so explicitly disable that feature
+ * otherwise respect the user configuration.
+ */
+ bq->in_ilimit_autoset_disable = bq->chip == BQ24250 ?
+ true : bq->init_data.in_ilimit_autoset_disable;
+
+ if (!bq->in_ilimit_autoset_disable)
+ INIT_DELAYED_WORK(&bq->iilimit_setup_work,
+ bq24257_iilimit_setup_work);
+
/* we can only check Power Good status by probing the PG pin */
ret = bq24257_pg_gpio_probe(bq);
if (ret < 0)
@@ -792,7 +846,8 @@ static int bq24257_remove(struct i2c_client *client)
{
struct bq24257_device *bq = i2c_get_clientdata(client);
- cancel_delayed_work_sync(&bq->iilimit_setup_work);
+ if (!bq->in_ilimit_autoset_disable)
+ cancel_delayed_work_sync(&bq->iilimit_setup_work);
power_supply_unregister(bq->charger);
@@ -807,7 +862,8 @@ static int bq24257_suspend(struct device *dev)
struct bq24257_device *bq = dev_get_drvdata(dev);
int ret = 0;
- cancel_delayed_work_sync(&bq->iilimit_setup_work);
+ if (!bq->in_ilimit_autoset_disable)
+ cancel_delayed_work_sync(&bq->iilimit_setup_work);
/* reset all registers to default (and activate standalone mode) */
ret = bq24257_field_write(bq, F_RESET, 1);
--
1.9.1
next prev parent reply other threads:[~2015-09-01 2:11 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-01 2:10 [PATCH 00/13] power: bq24257: Add support for bq24250/bq24251 Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 01/13] power: bq24257: Add bit definition for temp sense enable Andreas Dannenberg
2015-09-01 19:42 ` Andrew F. Davis
2015-09-01 2:10 ` [PATCH 02/13] power: bq24257: Add dead battery reporting Andreas Dannenberg
2015-09-01 19:33 ` Andrew F. Davis
2015-09-01 21:04 ` Andreas Dannenberg
2015-09-01 21:16 ` Andrew F. Davis
2015-09-04 13:28 ` Laurentiu Palcu
2015-09-04 15:08 ` Andreas Dannenberg
[not found] ` <1441073435-12349-1-git-send-email-dannenberg-l0cyMroinI0@public.gmane.org>
2015-09-01 2:10 ` [PATCH 03/13] power: bq24257: Add basic support for bq24250/bq24251 Andreas Dannenberg
2015-09-01 19:48 ` Andrew F. Davis
2015-09-01 21:24 ` Andreas Dannenberg
[not found] ` <1441073435-12349-4-git-send-email-dannenberg-l0cyMroinI0@public.gmane.org>
2015-09-02 8:19 ` Laurentiu Palcu
2015-09-02 14:16 ` Andreas Dannenberg
2015-09-02 8:07 ` [PATCH 00/13] power: bq24257: Add " Laurentiu Palcu
2015-09-02 14:09 ` Andreas Dannenberg
2015-09-01 2:10 ` Andreas Dannenberg [this message]
2015-09-01 19:59 ` [PATCH 04/13] power: bq24257: Allow manual setting of input current limit Andrew F. Davis
2015-09-02 8:23 ` Laurentiu Palcu
2015-09-01 2:10 ` [PATCH 05/13] power: bq24257: Add SW-based approach for Power Good determination Andreas Dannenberg
2015-09-01 20:01 ` Andrew F. Davis
[not found] ` <1441073435-12349-6-git-send-email-dannenberg-l0cyMroinI0@public.gmane.org>
2015-09-02 8:29 ` Laurentiu Palcu
2015-09-01 2:10 ` [PATCH 06/13] power: bq24257: Add over voltage protection setting support Andreas Dannenberg
2015-09-01 20:10 ` Andrew F. Davis
2015-09-01 2:10 ` [PATCH 07/13] power: bq24257: Add VINDPM voltage threshold " Andreas Dannenberg
2015-09-01 20:48 ` Andrew F. Davis
2015-09-01 2:10 ` [PATCH 08/13] power: bq24257: Extend scope of mutex protection Andreas Dannenberg
2015-09-01 20:34 ` Andrew F. Davis
2015-09-01 22:15 ` Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 09/13] power: bq24257: Add charge type setting support Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 10/13] power: bq24257: Add in_ilimit " Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 11/13] power: bq24257: Add various device-specific sysfs properties Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 12/13] power: bq24257: Add platform data based initialization Andreas Dannenberg
2015-09-01 2:10 ` [PATCH 13/13] dt: power: bq24257-charger: Cover additional devices Andreas Dannenberg
[not found] ` <1441073435-12349-14-git-send-email-dannenberg-l0cyMroinI0@public.gmane.org>
2015-09-02 5:24 ` Krzysztof Kozlowski
2015-09-02 14:03 ` Andreas Dannenberg
2015-09-03 1:31 ` Krzysztof Kozlowski
2015-09-03 1:47 ` Andreas Dannenberg
2015-09-03 1:57 ` Krzysztof Kozlowski
2015-09-03 16:09 ` Andreas Dannenberg
2015-09-03 23:50 ` Krzysztof Kozlowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1441073435-12349-5-git-send-email-dannenberg@ti.com \
--to=dannenberg@ti.com \
--cc=dbaryshkov@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=dwmw2@infradead.org \
--cc=k.kozlowski.k@gmail.com \
--cc=laurentiu.palcu@intel.com \
--cc=linux-pm@vger.kernel.org \
--cc=sre@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.