aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kocialkowski <contact@paulk.fr>2016-09-02 18:09:53 -0400
committerSebastian Reichel <sre@kernel.org>2016-09-05 06:59:49 -0400
commitc65a8b51123a14f6960e4238bfa4673d54ee183a (patch)
tree6c71dafdd88c4ff44c84b4b809229df38061b889
parent3b5dd3a49496220b35af83c96e3d2ff5716550ae (diff)
power: supply: bq24735-charger: Request status GPIO with initial input setup
This requests the status GPIO with initial input setup. It is required to read the GPIO status at probe time and thus correctly avoid sending I2C messages when AC is not plugged. When requesting the GPIO without initial input setup, it always reads 0 which causes probe to fail as it assumes the charger is connected, sends I2C messages and fails. While at it, this switches the driver over to gpiod API. Signed-off-by: Paul Kocialkowski <contact@paulk.fr> Signed-off-by: Sebastian Reichel <sre@kernel.org>
-rw-r--r--drivers/power/supply/bq24735-charger.c39
-rw-r--r--include/linux/power/bq24735-charger.h4
2 files changed, 12 insertions, 31 deletions
diff --git a/drivers/power/supply/bq24735-charger.c b/drivers/power/supply/bq24735-charger.c
index dc460bb03d84..eb7783b42e0a 100644
--- a/drivers/power/supply/bq24735-charger.c
+++ b/drivers/power/supply/bq24735-charger.c
@@ -25,7 +25,7 @@
25#include <linux/kernel.h> 25#include <linux/kernel.h>
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/of.h> 27#include <linux/of.h>
28#include <linux/of_gpio.h> 28#include <linux/gpio/consumer.h>
29#include <linux/power_supply.h> 29#include <linux/power_supply.h>
30#include <linux/slab.h> 30#include <linux/slab.h>
31 31
@@ -49,6 +49,7 @@ struct bq24735 {
49 struct i2c_client *client; 49 struct i2c_client *client;
50 struct bq24735_platform *pdata; 50 struct bq24735_platform *pdata;
51 struct mutex lock; 51 struct mutex lock;
52 struct gpio_desc *status_gpio;
52 bool charging; 53 bool charging;
53}; 54};
54 55
@@ -177,12 +178,8 @@ static int bq24735_config_charger(struct bq24735 *charger)
177 178
178static bool bq24735_charger_is_present(struct bq24735 *charger) 179static bool bq24735_charger_is_present(struct bq24735 *charger)
179{ 180{
180 struct bq24735_platform *pdata = charger->pdata; 181 if (charger->status_gpio) {
181 int ret; 182 return !gpiod_get_value_cansleep(charger->status_gpio);
182
183 if (pdata->status_gpio_valid) {
184 ret = gpio_get_value_cansleep(pdata->status_gpio);
185 return ret ^= pdata->status_gpio_active_low == 0;
186 } else { 183 } else {
187 int ac = 0; 184 int ac = 0;
188 185
@@ -308,7 +305,6 @@ static struct bq24735_platform *bq24735_parse_dt_data(struct i2c_client *client)
308 struct device_node *np = client->dev.of_node; 305 struct device_node *np = client->dev.of_node;
309 u32 val; 306 u32 val;
310 int ret; 307 int ret;
311 enum of_gpio_flags flags;
312 308
313 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); 309 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
314 if (!pdata) { 310 if (!pdata) {
@@ -317,12 +313,6 @@ static struct bq24735_platform *bq24735_parse_dt_data(struct i2c_client *client)
317 return NULL; 313 return NULL;
318 } 314 }
319 315
320 pdata->status_gpio = of_get_named_gpio_flags(np, "ti,ac-detect-gpios",
321 0, &flags);
322
323 if (flags & OF_GPIO_ACTIVE_LOW)
324 pdata->status_gpio_active_low = 1;
325
326 ret = of_property_read_u32(np, "ti,charge-current", &val); 316 ret = of_property_read_u32(np, "ti,charge-current", &val);
327 if (!ret) 317 if (!ret)
328 pdata->charge_current = val; 318 pdata->charge_current = val;
@@ -396,21 +386,16 @@ static int bq24735_charger_probe(struct i2c_client *client,
396 386
397 i2c_set_clientdata(client, charger); 387 i2c_set_clientdata(client, charger);
398 388
399 if (gpio_is_valid(charger->pdata->status_gpio)) { 389 charger->status_gpio = devm_gpiod_get_optional(&client->dev,
400 ret = devm_gpio_request(&client->dev, 390 "ti,ac-detect",
401 charger->pdata->status_gpio, 391 GPIOD_IN);
402 name); 392 if (IS_ERR(charger->status_gpio)) {
403 if (ret) { 393 ret = PTR_ERR(charger->status_gpio);
404 dev_err(&client->dev, 394 dev_err(&client->dev, "Getting gpio failed: %d\n", ret);
405 "Failed GPIO request for GPIO %d: %d\n", 395 return ret;
406 charger->pdata->status_gpio, ret);
407 }
408
409 charger->pdata->status_gpio_valid = !ret;
410 } 396 }
411 397
412 if (!charger->pdata->status_gpio_valid 398 if (!charger->status_gpio || bq24735_charger_is_present(charger)) {
413 || bq24735_charger_is_present(charger)) {
414 ret = bq24735_read_word(client, BQ24735_MANUFACTURER_ID); 399 ret = bq24735_read_word(client, BQ24735_MANUFACTURER_ID);
415 if (ret < 0) { 400 if (ret < 0) {
416 dev_err(&client->dev, "Failed to read manufacturer id : %d\n", 401 dev_err(&client->dev, "Failed to read manufacturer id : %d\n",
diff --git a/include/linux/power/bq24735-charger.h b/include/linux/power/bq24735-charger.h
index 6b750c1a45fa..b04be59f914c 100644
--- a/include/linux/power/bq24735-charger.h
+++ b/include/linux/power/bq24735-charger.h
@@ -28,10 +28,6 @@ struct bq24735_platform {
28 28
29 const char *name; 29 const char *name;
30 30
31 int status_gpio;
32 int status_gpio_active_low;
33 bool status_gpio_valid;
34
35 bool ext_control; 31 bool ext_control;
36 32
37 char **supplied_to; 33 char **supplied_to;