Commit ac6324e7 authored by Pali Rohár's avatar Pali Rohár Committed by Anton Vorontsov

bq2415x_charger: Add support for offline and 100mA mode

* Renamed mode BQ2415X_MODE_NONE to BQ2415X_MODE_OFF because this mode
  turning chaging completly off

* Added new mode BQ2415X_MODE_NONE which enable charging with maximal
  current limit 100mA (this is minimal safe value for bq2415x chips)
Signed-off-by: default avatarPali Rohár <pali.rohar@gmail.com>
Signed-off-by: default avatarAnton Vorontsov <anton@enomsg.org>
parent 64d26f22
...@@ -733,12 +733,10 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode) ...@@ -733,12 +733,10 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode)
int charger = 0; int charger = 0;
int boost = 0; int boost = 0;
if (mode == BQ2415X_MODE_HOST_CHARGER ||
mode == BQ2415X_MODE_DEDICATED_CHARGER)
charger = 1;
if (mode == BQ2415X_MODE_BOOST) if (mode == BQ2415X_MODE_BOOST)
boost = 1; boost = 1;
else if (mode != BQ2415X_MODE_OFF)
charger = 1;
if (!charger) if (!charger)
ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE); ret = bq2415x_exec_command(bq, BQ2415X_CHARGER_DISABLE);
...@@ -750,6 +748,10 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode) ...@@ -750,6 +748,10 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode)
return ret; return ret;
switch (mode) { switch (mode) {
case BQ2415X_MODE_OFF:
dev_dbg(bq->dev, "changing mode to: Offline\n");
ret = bq2415x_set_current_limit(bq, 100);
break;
case BQ2415X_MODE_NONE: case BQ2415X_MODE_NONE:
dev_dbg(bq->dev, "changing mode to: N/A\n"); dev_dbg(bq->dev, "changing mode to: N/A\n");
ret = bq2415x_set_current_limit(bq, 100); ret = bq2415x_set_current_limit(bq, 100);
...@@ -842,7 +844,7 @@ static void bq2415x_timer_error(struct bq2415x_device *bq, const char *msg) ...@@ -842,7 +844,7 @@ static void bq2415x_timer_error(struct bq2415x_device *bq, const char *msg)
dev_err(bq->dev, "%s\n", msg); dev_err(bq->dev, "%s\n", msg);
if (bq->automode > 0) if (bq->automode > 0)
bq->automode = 0; bq->automode = 0;
bq2415x_set_mode(bq, BQ2415X_MODE_NONE); bq2415x_set_mode(bq, BQ2415X_MODE_OFF);
bq2415x_set_autotimer(bq, 0); bq2415x_set_autotimer(bq, 0);
} }
...@@ -1135,6 +1137,10 @@ static ssize_t bq2415x_sysfs_set_mode(struct device *dev, ...@@ -1135,6 +1137,10 @@ static ssize_t bq2415x_sysfs_set_mode(struct device *dev,
return -ENOSYS; return -ENOSYS;
bq->automode = 1; bq->automode = 1;
mode = bq->reported_mode; mode = bq->reported_mode;
} else if (strncmp(buf, "off", 3) == 0) {
if (bq->automode > 0)
bq->automode = 0;
mode = BQ2415X_MODE_OFF;
} else if (strncmp(buf, "none", 4) == 0) { } else if (strncmp(buf, "none", 4) == 0) {
if (bq->automode > 0) if (bq->automode > 0)
bq->automode = 0; bq->automode = 0;
...@@ -1182,6 +1188,9 @@ static ssize_t bq2415x_sysfs_show_mode(struct device *dev, ...@@ -1182,6 +1188,9 @@ static ssize_t bq2415x_sysfs_show_mode(struct device *dev,
ret += sprintf(buf+ret, "auto ("); ret += sprintf(buf+ret, "auto (");
switch (bq->mode) { switch (bq->mode) {
case BQ2415X_MODE_OFF:
ret += sprintf(buf+ret, "off");
break;
case BQ2415X_MODE_NONE: case BQ2415X_MODE_NONE:
ret += sprintf(buf+ret, "none"); ret += sprintf(buf+ret, "none");
break; break;
...@@ -1216,6 +1225,8 @@ static ssize_t bq2415x_sysfs_show_reported_mode(struct device *dev, ...@@ -1216,6 +1225,8 @@ static ssize_t bq2415x_sysfs_show_reported_mode(struct device *dev,
return -EINVAL; return -EINVAL;
switch (bq->reported_mode) { switch (bq->reported_mode) {
case BQ2415X_MODE_OFF:
return sprintf(buf, "off\n");
case BQ2415X_MODE_NONE: case BQ2415X_MODE_NONE:
return sprintf(buf, "none\n"); return sprintf(buf, "none\n");
case BQ2415X_MODE_HOST_CHARGER: case BQ2415X_MODE_HOST_CHARGER:
...@@ -1535,8 +1546,8 @@ static int bq2415x_probe(struct i2c_client *client, ...@@ -1535,8 +1546,8 @@ static int bq2415x_probe(struct i2c_client *client,
bq->dev = &client->dev; bq->dev = &client->dev;
bq->chip = id->driver_data; bq->chip = id->driver_data;
bq->name = name; bq->name = name;
bq->mode = BQ2415X_MODE_NONE; bq->mode = BQ2415X_MODE_OFF;
bq->reported_mode = BQ2415X_MODE_NONE; bq->reported_mode = BQ2415X_MODE_OFF;
bq->autotimer = 0; bq->autotimer = 0;
bq->automode = 0; bq->automode = 0;
......
...@@ -75,7 +75,8 @@ ...@@ -75,7 +75,8 @@
/* Supported modes with maximal current limit */ /* Supported modes with maximal current limit */
enum bq2415x_mode { enum bq2415x_mode {
BQ2415X_MODE_NONE, /* unknown or no charger (100mA) */ BQ2415X_MODE_OFF, /* offline mode (charger disabled) */
BQ2415X_MODE_NONE, /* unknown charger (100mA) */
BQ2415X_MODE_HOST_CHARGER, /* usb host/hub charger (500mA) */ BQ2415X_MODE_HOST_CHARGER, /* usb host/hub charger (500mA) */
BQ2415X_MODE_DEDICATED_CHARGER, /* dedicated charger (unlimited) */ BQ2415X_MODE_DEDICATED_CHARGER, /* dedicated charger (unlimited) */
BQ2415X_MODE_BOOST, /* boost mode (charging disabled) */ BQ2415X_MODE_BOOST, /* boost mode (charging disabled) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment