From: Hans de Goede <hdegoede@redhat.com>
To: "Rafael J . Wysocki" <rjw@rjwysocki.net>,
Len Brown <lenb@kernel.org>, Wolfram Sang <wsa@the-dreams.de>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Lee Jones <lee.jones@linaro.org>,
Sebastian Reichel <sre@kernel.org>,
MyungJoo Ham <myungjoo.ham@samsung.com>,
Chanwoo Choi <cw00.choi@samsung.com>
Cc: Hans de Goede <hdegoede@redhat.com>,
linux-acpi@vger.kernel.org, Takashi Iwai <tiwai@suse.de>,
linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pm@vger.kernel.org
Subject: [PATCH 10/15] power: supply: bq24190_charger: Use extcon to determine ilimit, 5v boost
Date: Fri, 17 Mar 2017 10:55:22 +0100 [thread overview]
Message-ID: <20170317095527.10487-11-hdegoede@redhat.com> (raw)
In-Reply-To: <20170317095527.10487-1-hdegoede@redhat.com>
Add support for monitoring an extcon device with SDP/CDP/DCP and HOST
cables and adjust ilimit and enable/disable the 5v boost converter
accordingly. This is necessary on systems where the PSEL pin is hardwired
high and ILIM needs to be set by software based on the detected charger
type.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/power/supply/Kconfig | 1 +
drivers/power/supply/bq24190_charger.c | 85 ++++++++++++++++++++++++++++++++++
include/linux/power/bq24190_charger.h | 1 +
3 files changed, 87 insertions(+)
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index f8b6e64..fd93110 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -442,6 +442,7 @@ config CHARGER_BQ2415X
config CHARGER_BQ24190
tristate "TI BQ24190 battery charger driver"
depends on I2C
+ depends on EXTCON
depends on GPIOLIB || COMPILE_TEST
help
Say Y to enable support for the TI BQ24190 battery charger.
diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c
index 82cb33d..03990e2 100644
--- a/drivers/power/supply/bq24190_charger.c
+++ b/drivers/power/supply/bq24190_charger.c
@@ -11,10 +11,12 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
+#include <linux/extcon.h>
#include <linux/of_irq.h>
#include <linux/of_device.h>
#include <linux/pm_runtime.h>
#include <linux/power_supply.h>
+#include <linux/workqueue.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
@@ -39,6 +41,8 @@
#define BQ24190_REG_POC_WDT_RESET_SHIFT 6
#define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
#define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
+#define BQ24190_REG_POC_CHG_CONFIG_CHARGE 1
+#define BQ24190_REG_POC_CHG_CONFIG_OTG 2
#define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
#define BQ24190_REG_POC_SYS_MIN_SHIFT 1
#define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
@@ -152,6 +156,9 @@ struct bq24190_dev_info {
struct power_supply *charger;
struct power_supply *battery;
struct bq24190_platform_data *pdata;
+ struct extcon_dev *extcon;
+ struct notifier_block extcon_nb;
+ struct work_struct extcon_work;
char model_name[I2C_NAME_SIZE];
kernel_ulong_t model;
struct mutex f_reg_lock;
@@ -167,6 +174,11 @@ struct bq24190_dev_info {
* number at that index in the array is the real-world value that it
* represents.
*/
+
+/* REG00[2:0] (IINLIM) in uAh */
+static const int bq24190_iinlim_values[] = {
+ 100000, 150000, 500000, 900000, 1200000, 1500000, 2000000, 3000000 };
+
/* REG02[7:2] (ICHG) in uAh */
static const int bq24190_ccc_ichg_values[] = {
512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
@@ -1290,6 +1302,61 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
return IRQ_HANDLED;
}
+static void bq24190_extcon_work(struct work_struct *work)
+{
+ struct bq24190_dev_info *bdi =
+ container_of(work, struct bq24190_dev_info, extcon_work);
+ int ret, iinlim = 0;
+
+ if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_SDP) == 1)
+ iinlim = 500000;
+ else if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_CDP) == 1 ||
+ extcon_get_state(bdi->extcon, EXTCON_CHG_USB_ACA) == 1)
+ iinlim = 1500000;
+ else if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_DCP) == 1)
+ iinlim = 2000000;
+
+ if (iinlim) {
+ ret = bq24190_set_field_val(bdi, BQ24190_REG_ISC,
+ BQ24190_REG_ISC_IINLIM_MASK,
+ BQ24190_REG_ISC_IINLIM_SHIFT,
+ bq24190_iinlim_values,
+ ARRAY_SIZE(bq24190_iinlim_values),
+ iinlim);
+ if (ret)
+ dev_err(bdi->dev, "Can't set IINLIM: %d\n", ret);
+ }
+
+ /*
+ * If no charger has been detected and host mode is requested, activate
+ * the 5V boost converter, otherwise deactivate it.
+ */
+ if (!iinlim && extcon_get_state(bdi->extcon, EXTCON_USB_HOST) == 1) {
+ ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
+ BQ24190_REG_POC_CHG_CONFIG_MASK,
+ BQ24190_REG_POC_CHG_CONFIG_SHIFT,
+ BQ24190_REG_POC_CHG_CONFIG_OTG);
+ } else {
+ ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
+ BQ24190_REG_POC_CHG_CONFIG_MASK,
+ BQ24190_REG_POC_CHG_CONFIG_SHIFT,
+ BQ24190_REG_POC_CHG_CONFIG_CHARGE);
+ }
+ if (ret)
+ dev_err(bdi->dev, "Can't set CHG_CONFIG: %d\n", ret);
+}
+
+static int bq24190_extcon_event(struct notifier_block *nb, unsigned long event,
+ void *param)
+{
+ struct bq24190_dev_info *bdi =
+ container_of(nb, struct bq24190_dev_info, extcon_nb);
+
+ schedule_work(&bdi->extcon_work);
+
+ return NOTIFY_OK;
+}
+
static int bq24190_hw_init(struct bq24190_dev_info *bdi)
{
u8 v;
@@ -1375,6 +1442,12 @@ static int bq24190_probe(struct i2c_client *client,
return -EPROBE_DEFER;
}
+ if (bdi->pdata && bdi->pdata->extcon_name) {
+ bdi->extcon = extcon_get_extcon_dev(bdi->pdata->extcon_name);
+ if (!bdi->extcon)
+ return -EPROBE_DEFER;
+ }
+
pm_runtime_enable(dev);
pm_runtime_resume(dev);
@@ -1423,6 +1496,18 @@ static int bq24190_probe(struct i2c_client *client,
goto out4;
}
+ if (bdi->extcon) {
+ INIT_WORK(&bdi->extcon_work, bq24190_extcon_work);
+ bdi->extcon_nb.notifier_call = bq24190_extcon_event;
+ ret = devm_extcon_register_notifier(dev, bdi->extcon, -1,
+ &bdi->extcon_nb);
+ if (ret)
+ goto out4;
+
+ /* Sync initial cable state */
+ schedule_work(&bdi->extcon_work);
+ }
+
return 0;
out4:
diff --git a/include/linux/power/bq24190_charger.h b/include/linux/power/bq24190_charger.h
index 02d248b..909c5b9 100644
--- a/include/linux/power/bq24190_charger.h
+++ b/include/linux/power/bq24190_charger.h
@@ -13,6 +13,7 @@
struct bq24190_platform_data {
bool no_register_reset;
+ const char *extcon_name;
int (*get_ext_bat_property)(enum power_supply_property prop,
union power_supply_propval *val);
};
--
2.9.3
next prev parent reply other threads:[~2017-03-17 9:59 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-17 9:55 [PATCH 00/15] Add Intel Cherry Trail Whiskey Cove PMIC support Hans de Goede
2017-03-17 9:55 ` [PATCH 01/15] mfd: Add Cherry Trail Whiskey Cove PMIC driver Hans de Goede
2017-03-17 17:00 ` Andy Shevchenko
2017-03-20 10:41 ` Lee Jones
2017-03-20 12:55 ` Andy Shevchenko
2017-03-17 9:55 ` [PATCH 02/15] ACPI / PMIC: Add opregion driver for Intel CHT Whiskey Cove PMIC Hans de Goede
2017-03-17 9:55 ` [PATCH 03/15] extcon: cht-wc: Add Intel Cherry Trail Whiskey Cove PMIC extcon driver Hans de Goede
2017-03-17 17:18 ` Andy Shevchenko
2017-03-20 18:08 ` Hans de Goede
2017-03-20 1:33 ` Chanwoo Choi
2017-03-20 13:00 ` Andy Shevchenko
2017-03-21 3:54 ` Chanwoo Choi
2017-03-21 5:21 ` Chanwoo Choi
2017-03-21 6:27 ` Chanwoo Choi
2017-03-20 19:57 ` Hans de Goede
2017-03-21 5:16 ` Chanwoo Choi
2017-03-23 15:22 ` Hans de Goede
2017-03-17 9:55 ` [PATCH 04/15] power: supply: bq24190_charger: Add no_register_reset pdata flag Hans de Goede
2017-03-17 17:20 ` Andy Shevchenko
2017-03-17 9:55 ` [PATCH 05/15] power: supply: bq24190_charger: Limit charging voltage to 4.3V Hans de Goede
2017-03-17 9:55 ` [PATCH 06/15] power: supply: bq24190_charger: Use i2c-core irq-mapping code Hans de Goede
2017-03-17 17:24 ` Andy Shevchenko
2017-03-20 4:46 ` Sebastian Reichel
2017-03-17 9:55 ` [PATCH 07/15] power: supply: bq24190_charger: Add support for bq24192[i] Hans de Goede
2017-03-17 9:55 ` [PATCH 08/15] power: supply: bq24190_charger: Add support for external fuel gauge Hans de Goede
2017-03-17 9:55 ` [PATCH 09/15] power: supply: bq24190_charger: Add voltage_max_design prop to battery Hans de Goede
2017-03-20 5:12 ` Sebastian Reichel
2017-03-17 9:55 ` Hans de Goede [this message]
2017-03-17 17:33 ` [PATCH 10/15] power: supply: bq24190_charger: Use extcon to determine ilimit, 5v boost Andy Shevchenko
2017-03-20 22:38 ` Hans de Goede
2017-03-20 4:52 ` Sebastian Reichel
2017-03-17 9:55 ` [PATCH 11/15] i2c: core: Allow getting ACPI info by index Hans de Goede
2017-03-17 17:35 ` Andy Shevchenko
2017-03-17 9:55 ` [PATCH 12/15] i2c: core: Add new i2c_acpi_new_device helper function Hans de Goede
2017-03-17 17:37 ` Andy Shevchenko
2017-03-22 15:59 ` Hans de Goede
2017-03-17 9:55 ` [PATCH 13/15] i2c: core: Allow drivers to specify index for irq to get from of / ACPI Hans de Goede
2017-03-17 17:41 ` Andy Shevchenko
2017-03-20 8:55 ` kbuild test robot
2017-03-17 9:55 ` [PATCH 14/15] power: supply: Add driver for Cherry Trail Whiskey Cove PMIC Fuel Gauge Hans de Goede
2017-03-17 17:58 ` Andy Shevchenko
2017-03-22 17:03 ` Hans de Goede
2017-03-20 5:07 ` Sebastian Reichel
2017-03-17 9:55 ` [PATCH 15/15] i2c-cht-wc: Add Intel Cherry Trail Whiskey Cove SMBUS controller driver Hans de Goede
2017-03-17 18:22 ` Andy Shevchenko
2017-03-23 13:58 ` Hans de Goede
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=20170317095527.10487-11-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=cw00.choi@samsung.com \
--cc=lee.jones@linaro.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=myungjoo.ham@samsung.com \
--cc=rjw@rjwysocki.net \
--cc=sre@kernel.org \
--cc=tiwai@suse.de \
--cc=wsa@the-dreams.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®