From 95099d4622f8cb224d94e314c7a8e0df60b13f87 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 09 Dec 2023 08:38:01 +0000
Subject: [PATCH] enable docker ppp
---
kernel/drivers/power/supply/bq24190_charger.c | 111 +++++++++++++++++++++++++++++++++----------------------
1 files changed, 66 insertions(+), 45 deletions(-)
diff --git a/kernel/drivers/power/supply/bq24190_charger.c b/kernel/drivers/power/supply/bq24190_charger.c
index 8632089..8c3c378 100644
--- a/kernel/drivers/power/supply/bq24190_charger.c
+++ b/kernel/drivers/power/supply/bq24190_charger.c
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-only
/*
* Driver for the TI bq24190 battery charger.
*
* Author: Mark A. Greer <mgreer@animalcreek.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
*/
#include <linux/module.h>
@@ -21,6 +18,7 @@
#include <linux/workqueue.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
+#include <linux/extcon-provider.h>
#define BQ24190_MANUFACTURER "Texas Instruments"
@@ -43,6 +41,7 @@
#define BQ24190_REG_POC_CHG_CONFIG_DISABLE 0x0
#define BQ24190_REG_POC_CHG_CONFIG_CHARGE 0x1
#define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
+#define BQ24190_REG_POC_CHG_CONFIG_OTG_ALT 0x3
#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_SYS_MIN_MIN 3000
@@ -142,7 +141,7 @@
#define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
#define BQ24190_REG_VPRS_PN_SHIFT 3
#define BQ24190_REG_VPRS_PN_24190 0x4
-#define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193 */
+#define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193, 24196 */
#define BQ24190_REG_VPRS_PN_24192I 0x3
#define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
#define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
@@ -159,6 +158,7 @@
struct bq24190_dev_info {
struct i2c_client *client;
struct device *dev;
+ struct extcon_dev *edev;
struct power_supply *charger;
struct power_supply *battery;
struct delayed_work input_current_limit_work;
@@ -172,6 +172,11 @@
u8 f_reg;
u8 ss_reg;
u8 watchdog;
+};
+
+static const unsigned int bq24190_usb_extcon_cable[] = {
+ EXTCON_USB,
+ EXTCON_NONE,
};
/*
@@ -402,9 +407,7 @@
static struct attribute *
bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
-static const struct attribute_group bq24190_sysfs_attr_group = {
- .attrs = bq24190_sysfs_attrs,
-};
+ATTRIBUTE_GROUPS(bq24190_sysfs);
static void bq24190_sysfs_init_attrs(void)
{
@@ -481,8 +484,10 @@
return ret;
ret = pm_runtime_get_sync(bdi->dev);
- if (ret < 0)
+ if (ret < 0) {
+ pm_runtime_put_noidle(bdi->dev);
return ret;
+ }
ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
if (ret)
@@ -493,26 +498,6 @@
return count;
}
-
-static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
-{
- bq24190_sysfs_init_attrs();
-
- return sysfs_create_group(&bdi->charger->dev.kobj,
- &bq24190_sysfs_attr_group);
-}
-
-static void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi)
-{
- sysfs_remove_group(&bdi->charger->dev.kobj, &bq24190_sysfs_attr_group);
-}
-#else
-static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
-{
- return 0;
-}
-
-static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {}
#endif
#ifdef CONFIG_REGULATOR
@@ -568,7 +553,11 @@
pm_runtime_mark_last_busy(bdi->dev);
pm_runtime_put_autosuspend(bdi->dev);
- return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
+ if (ret)
+ return ret;
+
+ return (val == BQ24190_REG_POC_CHG_CONFIG_OTG ||
+ val == BQ24190_REG_POC_CHG_CONFIG_OTG_ALT);
}
static const struct regulator_ops bq24190_vbus_ops = {
@@ -579,6 +568,7 @@
static const struct regulator_desc bq24190_vbus_desc = {
.name = "usb_otg_vbus",
+ .of_match = "usb-otg-vbus",
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
.ops = &bq24190_vbus_ops,
@@ -692,7 +682,7 @@
* { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
* struct i2c_adapter ad = { ... };
* i2c_add_adapter(&ad);
- * i2c_new_device(&ad, &bi);
+ * i2c_new_client_device(&ad, &bi);
*/
if (device_property_read_bool(bdi->dev, "disable-reset"))
return 0;
@@ -1537,6 +1527,20 @@
.property_is_writeable = bq24190_battery_property_is_writeable,
};
+static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
+{
+ bool otg_enabled;
+ int ret;
+
+ otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
+ ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
+ if (ret < 0)
+ dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
+ otg_enabled, ret);
+
+ return ret;
+}
+
static void bq24190_check_status(struct bq24190_dev_info *bdi)
{
const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
@@ -1606,8 +1610,10 @@
bdi->ss_reg = ss_reg;
}
- if (alert_charger || alert_battery)
+ if (alert_charger || alert_battery) {
power_supply_changed(bdi->charger);
+ bq24190_configure_usb_otg(bdi, ss_reg);
+ }
if (alert_battery && bdi->battery)
power_supply_changed(bdi->battery);
@@ -1647,8 +1653,12 @@
if (ret < 0)
return ret;
- if (v != BQ24190_REG_VPRS_PN_24190 &&
- v != BQ24190_REG_VPRS_PN_24192I) {
+ switch (v) {
+ case BQ24190_REG_VPRS_PN_24190:
+ case BQ24190_REG_VPRS_PN_24192:
+ case BQ24190_REG_VPRS_PN_24192I:
+ break;
+ default:
dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
return -ENODEV;
}
@@ -1704,7 +1714,7 @@
static int bq24190_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
- struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
+ struct i2c_adapter *adapter = client->adapter;
struct device *dev = &client->dev;
struct power_supply_config charger_cfg = {}, battery_cfg = {};
struct bq24190_dev_info *bdi;
@@ -1737,6 +1747,14 @@
return -EINVAL;
}
+ bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
+ if (IS_ERR(bdi->edev))
+ return PTR_ERR(bdi->edev);
+
+ ret = devm_extcon_dev_register(dev, bdi->edev);
+ if (ret < 0)
+ return ret;
+
pm_runtime_enable(dev);
pm_runtime_use_autosuspend(dev);
pm_runtime_set_autosuspend_delay(dev, 600);
@@ -1745,6 +1763,11 @@
dev_err(dev, "pm_runtime_get failed: %i\n", ret);
goto out_pmrt;
}
+
+#ifdef CONFIG_SYSFS
+ bq24190_sysfs_init_attrs();
+ charger_cfg.attr_grp = bq24190_sysfs_groups;
+#endif
charger_cfg.drv_data = bdi;
charger_cfg.of_node = dev->of_node;
@@ -1783,11 +1806,9 @@
goto out_charger;
}
- ret = bq24190_sysfs_create_group(bdi);
- if (ret < 0) {
- dev_err(dev, "Can't create sysfs entries\n");
+ ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
+ if (ret < 0)
goto out_charger;
- }
bdi->initialized = true;
@@ -1797,12 +1818,12 @@
"bq24190-charger", bdi);
if (ret < 0) {
dev_err(dev, "Can't set up irq handler\n");
- goto out_sysfs;
+ goto out_charger;
}
ret = bq24190_register_vbus_regulator(bdi);
if (ret < 0)
- goto out_sysfs;
+ goto out_charger;
enable_irq_wake(client->irq);
@@ -1810,9 +1831,6 @@
pm_runtime_put_autosuspend(dev);
return 0;
-
-out_sysfs:
- bq24190_sysfs_remove_group(bdi);
out_charger:
if (!IS_ERR_OR_NULL(bdi->battery))
@@ -1838,7 +1856,6 @@
}
bq24190_register_reset(bdi);
- bq24190_sysfs_remove_group(bdi);
if (bdi->battery)
power_supply_unregister(bdi->battery);
power_supply_unregister(bdi->charger);
@@ -1941,7 +1958,9 @@
static const struct i2c_device_id bq24190_i2c_ids[] = {
{ "bq24190" },
+ { "bq24192" },
{ "bq24192i" },
+ { "bq24196" },
{ },
};
MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
@@ -1949,7 +1968,9 @@
#ifdef CONFIG_OF
static const struct of_device_id bq24190_of_match[] = {
{ .compatible = "ti,bq24190", },
+ { .compatible = "ti,bq24192", },
{ .compatible = "ti,bq24192i", },
+ { .compatible = "ti,bq24196", },
{ },
};
MODULE_DEVICE_TABLE(of, bq24190_of_match);
--
Gitblit v1.6.2