* [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status
@ 2024-07-15 12:55 Artur Weber
2024-07-15 12:55 ` [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property Artur Weber
` (8 more replies)
0 siblings, 9 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
This patchset does the following:
- Add CURRENT_MAX and INPUT_CURRENT_MAX power supply properties to
expose the "fast charge current" (maximum current from charger to
battery) and "CHGIN input current limit" (maximum current from
external supply to charger).
- Add functions for toggling charging and OTG modes.
- Add an extcon-based handler that enables charging or OTG depending
on the cable type plugged in. The extcon device to use for cable
detection can be specified in the device tree, and is entirely
optional.
The extcon listener implementation is inspired by the rt5033 charger
driver (commit 8242336dc8a8 ("power: supply: rt5033_charger: Add cable
detection and USB OTG supply")).
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
See v1 for old description:
https://lore.kernel.org/r/20240530-max77693-charger-extcon-v1-0-dc2a9e5bdf30@gmail.com
---
Changes in v2:
- Changed to use monitored-battery for charge current value
- Both current limit variables are now set by the CHARGER regulator
- Link to v1: https://lore.kernel.org/r/20240530-max77693-charger-extcon-v1-0-dc2a9e5bdf30@gmail.com
---
Artur Weber (9):
dt-bindings: power: supply: max77693: Add monitored-battery property
dt-bindings: power: supply: max77693: Add maxim,usb-connector property
regulator: max77693: Set fast charge current in MAX77693 CHARGER regulator
power: supply: max77693: Expose CURRENT_MAX property
power: supply: max77693: Set charge current limits during init
power: supply: max77693: Add USB extcon detection for enabling charging
power: supply: max77693: Add support for detecting and enabling OTG
ARM: dts: samsung: exynos4212-tab3: Add battery node with charge current value
ARM: dts: samsung: exynos4212-tab3: Add USB connector node
.../bindings/power/supply/maxim,max77693.yaml | 15 ++
arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi | 19 ++
drivers/power/supply/Kconfig | 1 +
drivers/power/supply/max77693_charger.c | 273 ++++++++++++++++++++-
drivers/regulator/max77693-regulator.c | 34 ++-
include/linux/mfd/max77693-private.h | 11 +
6 files changed, 340 insertions(+), 13 deletions(-)
---
base-commit: a38297e3fb012ddfa7ce0321a7e5a8daeb1872b6
change-id: 20240525-max77693-charger-extcon-9ebb7bad83ce
Best regards,
--
Artur Weber <aweber.kernel@gmail.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-22 5:48 ` Krzysztof Kozlowski
2024-07-15 12:55 ` [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property Artur Weber
` (7 subsequent siblings)
8 siblings, 1 reply; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
Add the monitored-battery property, so that its constant charge current
property can be used to specify the current limit to use for fast charge
(when plugged into a wall charger).
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Switched to monitored-battery property from separate fast charge
current property
---
.../devicetree/bindings/power/supply/maxim,max77693.yaml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml b/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
index f5fd53debbc8..2f4437dafdc0 100644
--- a/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
+++ b/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
@@ -16,10 +16,19 @@ description: |
See also Documentation/devicetree/bindings/mfd/maxim,max77693.yaml for
additional information and example.
+allOf:
+ - $ref: power-supply.yaml#
+
properties:
compatible:
const: maxim,max77693-charger
+ monitored-battery:
+ description:
+ Phandle to "simple-battery"-compatible battery node.
+ The constant-charge-current-max-microamps property of the battery
+ node is used to specify the fast charge current.
+
maxim,constant-microvolt:
description: |
Battery constant voltage in uV. The charger will operate in fast
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
2024-07-15 12:55 ` [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-22 5:49 ` Krzysztof Kozlowski
2024-07-15 12:55 ` [PATCH v2 3/9] regulator: max77693: Set fast charge current in MAX77693 CHARGER regulator Artur Weber
` (6 subsequent siblings)
8 siblings, 1 reply; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
Allow for specifying a USB connector to use for charger type/OTG cable
detection.
The way this is done is inspired by the rt5033-charger implementation.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml b/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
index 2f4437dafdc0..b70c171bd4b9 100644
--- a/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
+++ b/Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
@@ -73,6 +73,12 @@ properties:
enum: [4300000, 4700000, 4800000, 4900000]
default: 4300000
+ maxim,usb-connector:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ USB connector to use for charger type/OTG cable detection. Phandle
+ to a USB connector according to usb-connector.yaml.
+
required:
- compatible
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 3/9] regulator: max77693: Set fast charge current in MAX77693 CHARGER regulator
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
2024-07-15 12:55 ` [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property Artur Weber
2024-07-15 12:55 ` [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-15 12:55 ` [PATCH v2 4/9] power: supply: max77693: Expose CURRENT_MAX property Artur Weber
` (5 subsequent siblings)
8 siblings, 0 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
The MAX77693 CHARGER regulator only controlled the "charge input
current", with fast charge current being listed as a TODO.
Fix this by also setting the fast charge current when the CHARGER
regulator limits are changed.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Added this commit
---
drivers/regulator/max77693-regulator.c | 34 +++++++++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/drivers/regulator/max77693-regulator.c b/drivers/regulator/max77693-regulator.c
index 72a67d0c5f1e..3fee2e255fd0 100644
--- a/drivers/regulator/max77693-regulator.c
+++ b/drivers/regulator/max77693-regulator.c
@@ -36,6 +36,7 @@ enum max77843_regulator_type {
/* Register differences between chargers: MAX77693 and MAX77843 */
struct chg_reg_data {
+ enum max77693_types type;
unsigned int linear_reg;
unsigned int linear_mask;
unsigned int uA_step;
@@ -46,11 +47,12 @@ struct chg_reg_data {
* MAX77693 CHARGER regulator - Min : 20mA, Max : 2580mA, step : 20mA
* 0x00, 0x01, 0x2, 0x03 = 60 mA
* 0x04 ~ 0x7E = (60 + (X - 3) * 20) mA
- * Actually for MAX77693 the driver manipulates the maximum input current,
- * not the fast charge current (output). This should be fixed.
*
* On MAX77843 the calculation formula is the same (except values).
* Fortunately it properly manipulates the fast charge current.
+ *
+ * On MAX77693 there is an additional "fast charge current" register:
+ * min: 0 mA, max: 2100mA, step: 0.1A / 3.
*/
static int max77693_chg_get_current_limit(struct regulator_dev *rdev)
{
@@ -86,6 +88,7 @@ static int max77693_chg_set_current_limit(struct regulator_dev *rdev,
const struct chg_reg_data *reg_data = rdev_get_drvdata(rdev);
unsigned int chg_min_uA = rdev->constraints->min_uA;
int sel = 0;
+ int ret;
while (chg_min_uA + reg_data->uA_step * sel < min_uA)
sel++;
@@ -96,7 +99,30 @@ static int max77693_chg_set_current_limit(struct regulator_dev *rdev,
/* the first four codes for charger current are all 60mA */
sel += reg_data->min_sel;
- return regmap_write(rdev->regmap, reg_data->linear_reg, sel);
+ ret = regmap_write(rdev->regmap, reg_data->linear_reg, sel);
+ if (ret)
+ return ret;
+
+ if (reg_data->type == TYPE_MAX77693) {
+ /*
+ * For MAX77693 we also have to set the fast charge current
+ * value. This value has a lower upper limit (2.1A), so we cap
+ * it at the highest possible value if it goes above the limit.
+ */
+
+ sel = (min_uA / 1000) * 10 / 333; /* 0.1A/3 steps */
+
+ if (sel > CHG_CNFG_02_CC_MASK)
+ sel = CHG_CNFG_02_CC_MASK;
+
+ sel <<= CHG_CNFG_02_CC_SHIFT;
+
+ return regmap_update_bits(rdev->regmap,
+ MAX77693_CHG_REG_CHG_CNFG_02,
+ CHG_CNFG_02_CC_MASK, sel);
+ }
+
+ return 0;
}
/* end of CHARGER regulator ops */
@@ -179,6 +205,7 @@ static const struct regulator_desc max77693_supported_regulators[] = {
};
static const struct chg_reg_data max77693_chg_reg_data = {
+ .type = TYPE_MAX77693,
.linear_reg = MAX77693_CHG_REG_CHG_CNFG_09,
.linear_mask = CHG_CNFG_09_CHGIN_ILIM_MASK,
.uA_step = 20000,
@@ -219,6 +246,7 @@ static const struct regulator_desc max77843_supported_regulators[] = {
};
static const struct chg_reg_data max77843_chg_reg_data = {
+ .type = TYPE_MAX77843,
.linear_reg = MAX77843_CHG_REG_CHG_CNFG_02,
.linear_mask = MAX77843_CHG_FAST_CHG_CURRENT_MASK,
.uA_step = MAX77843_CHG_FAST_CHG_CURRENT_STEP,
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 4/9] power: supply: max77693: Expose CURRENT_MAX property
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (2 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 3/9] regulator: max77693: Set fast charge current in MAX77693 CHARGER regulator Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-15 12:55 ` [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init Artur Weber
` (4 subsequent siblings)
8 siblings, 0 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
There are two charger current limit registers:
- Fast charge current limit (which controls current going from the
charger to the battery);
- CHGIN input current limit (which controls current going into the
charger through the cable).
Both of them are aggregated in the CHARGER regulator. Add a property
that allows for reading the current limit from userspace.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Adapted to both current limits being managed in the CHARGER regulator
---
drivers/power/supply/max77693_charger.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
index 2001e12c9f7d..0d53f61d58ba 100644
--- a/drivers/power/supply/max77693_charger.c
+++ b/drivers/power/supply/max77693_charger.c
@@ -9,6 +9,7 @@
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
#include <linux/mfd/max77693.h>
#include <linux/mfd/max77693-common.h>
#include <linux/mfd/max77693-private.h>
@@ -21,6 +22,7 @@ struct max77693_charger {
struct device *dev;
struct max77693_dev *max77693;
struct power_supply *charger;
+ struct regulator *regu;
u32 constant_volt;
u32 min_system_volt;
@@ -197,12 +199,33 @@ static int max77693_get_online(struct regmap *regmap, int *val)
return 0;
}
+/*
+ * There are *two* current limit registers:
+ * - CHGIN limit, which limits the input current from the external charger;
+ * - Fast charge current limit, which limits the current going to the battery.
+ * Both are managed by the CHARGER regulator.
+ */
+
+static int max77693_get_current_limit(struct max77693_charger *chg, int *val)
+{
+ int ret;
+
+ ret = regulator_get_current_limit(chg->regu);
+ if (ret < 0)
+ return ret;
+
+ *val = ret;
+
+ return 0;
+}
+
static enum power_supply_property max77693_charger_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER,
};
@@ -231,6 +254,9 @@ static int max77693_charger_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_ONLINE:
ret = max77693_get_online(regmap, &val->intval);
break;
+ case POWER_SUPPLY_PROP_CURRENT_MAX:
+ ret = max77693_get_current_limit(chg, &val->intval);
+ break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = max77693_charger_model;
break;
@@ -680,6 +706,12 @@ static int max77693_charger_probe(struct platform_device *pdev)
chg->dev = &pdev->dev;
chg->max77693 = max77693;
+ /* This gets the CHARGER regulator from the parent MAX77693 device */
+ chg->regu = devm_regulator_get(chg->dev, "CHARGER");
+ if (IS_ERR(chg->regu))
+ return dev_err_probe(&pdev->dev, PTR_ERR(chg->regu),
+ "failed to get charger regulator\n");
+
ret = max77693_dt_init(&pdev->dev, chg);
if (ret)
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (3 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 4/9] power: supply: max77693: Expose CURRENT_MAX property Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-25 15:37 ` Lee Jones
2024-07-15 12:55 ` [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging Artur Weber
` (3 subsequent siblings)
8 siblings, 1 reply; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
There are two charger current limit registers:
- Fast charge current limit (which controls current going from the
charger to the battery);
- CHGIN input current limit (which controls current going into the
charger through the cable).
Add a function for setting both of the values, and set them to a
safe default value of 500mA at initialization.
The default value for the fast charge current limit can be modified
by setting the constant-charge-current-max-ua DT property of the
battery node specified in the monitored-battery charger DT property.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Squashed mfd include register additions into this commit
- Changed from custom fast charge current property to monitored-battery
(devm_power_supply_register call has been moved up as it is needed by
the DT init function now)
- Changed to adapt to both current limit values being managed by the
CHARGER regulator
---
drivers/power/supply/max77693_charger.c | 43 ++++++++++++++++++++++++---------
include/linux/mfd/max77693-private.h | 6 +++++
2 files changed, 38 insertions(+), 11 deletions(-)
diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
index 0d53f61d58ba..0ddaa03669a2 100644
--- a/drivers/power/supply/max77693_charger.c
+++ b/drivers/power/supply/max77693_charger.c
@@ -28,6 +28,7 @@ struct max77693_charger {
u32 min_system_volt;
u32 thermal_regulation_temp;
u32 batttery_overcurrent;
+ u32 fast_charge_current;
u32 charge_input_threshold_volt;
};
@@ -570,6 +571,14 @@ static int max77693_set_batttery_overcurrent(struct max77693_charger *chg,
CHG_CNFG_12_B2SOVRC_MASK, data);
}
+static int max77693_set_current_limit(struct max77693_charger *chg,
+ unsigned int uamp)
+{
+ dev_dbg(chg->dev, "Current limit: %u\n", uamp);
+
+ return regulator_set_current_limit(chg->regu, (int)uamp, (int)uamp);
+}
+
static int max77693_set_charge_input_threshold_volt(struct max77693_charger *chg,
unsigned int uvolt)
{
@@ -647,6 +656,10 @@ static int max77693_reg_init(struct max77693_charger *chg)
if (ret)
return ret;
+ ret = max77693_set_current_limit(chg, DEFAULT_FAST_CHARGE_CURRENT);
+ if (ret)
+ return ret;
+
return max77693_set_charge_input_threshold_volt(chg,
chg->charge_input_threshold_volt);
}
@@ -654,6 +667,7 @@ static int max77693_reg_init(struct max77693_charger *chg)
#ifdef CONFIG_OF
static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
{
+ struct power_supply_battery_info *battery_info;
struct device_node *np = dev->of_node;
if (!np) {
@@ -682,11 +696,20 @@ static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
chg->charge_input_threshold_volt =
DEFAULT_CHARGER_INPUT_THRESHOLD_VOLT;
+ if (power_supply_get_battery_info(chg->charger, &battery_info) ||
+ !battery_info->constant_charge_current_max_ua)
+ chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
+ else
+ chg->fast_charge_current = \
+ battery_info->constant_charge_current_max_ua;
+
return 0;
}
#else /* CONFIG_OF */
static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
{
+ chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
+
return 0;
}
#endif /* CONFIG_OF */
@@ -712,6 +735,15 @@ static int max77693_charger_probe(struct platform_device *pdev)
return dev_err_probe(&pdev->dev, PTR_ERR(chg->regu),
"failed to get charger regulator\n");
+ psy_cfg.drv_data = chg;
+
+ chg->charger = devm_power_supply_register(&pdev->dev,
+ &max77693_charger_desc,
+ &psy_cfg);
+ if (IS_ERR(chg->charger))
+ return dev_err_probe(&pdev->dev, PTR_ERR(chg->charger),
+ "failed: power supply register\n");
+
ret = max77693_dt_init(&pdev->dev, chg);
if (ret)
return ret;
@@ -720,8 +752,6 @@ static int max77693_charger_probe(struct platform_device *pdev)
if (ret)
return ret;
- psy_cfg.drv_data = chg;
-
ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
if (ret) {
dev_err(&pdev->dev, "failed: create fast charge timer sysfs entry\n");
@@ -741,15 +771,6 @@ static int max77693_charger_probe(struct platform_device *pdev)
goto err;
}
- chg->charger = devm_power_supply_register(&pdev->dev,
- &max77693_charger_desc,
- &psy_cfg);
- if (IS_ERR(chg->charger)) {
- dev_err(&pdev->dev, "failed: power supply register\n");
- ret = PTR_ERR(chg->charger);
- goto err;
- }
-
return 0;
err:
diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h
index 54444ff2a5de..4570646e2f33 100644
--- a/include/linux/mfd/max77693-private.h
+++ b/include/linux/mfd/max77693-private.h
@@ -145,6 +145,8 @@ enum max77693_pmic_reg {
#define DEFAULT_THERMAL_REGULATION_TEMP 100
/* microamps */
#define DEFAULT_BATTERY_OVERCURRENT 3500000
+/* microamps */
+#define DEFAULT_FAST_CHARGE_CURRENT 500000
/* microvolts */
#define DEFAULT_CHARGER_INPUT_THRESHOLD_VOLT 4300000
@@ -217,6 +219,10 @@ enum max77693_charger_battery_state {
#define CHG_CNFG_01_CHGRSTRT_MASK (0x3 << CHG_CNFG_01_CHGRSTRT_SHIFT)
#define CHG_CNFG_01_PQEN_MAKS BIT(CHG_CNFG_01_PQEN_SHIFT)
+/* MAX77693_CHG_REG_CHG_CNFG_02 register */
+#define CHG_CNFG_02_CC_SHIFT 0
+#define CHG_CNFG_02_CC_MASK 0x3F
+
/* MAX77693_CHG_REG_CHG_CNFG_03 register */
#define CHG_CNFG_03_TOITH_SHIFT 0
#define CHG_CNFG_03_TOTIME_SHIFT 3
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (4 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-20 20:59 ` Artur Weber
2024-07-15 12:55 ` [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG Artur Weber
` (2 subsequent siblings)
8 siblings, 1 reply; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
Add a device tree property, "maxim,usb-connector", that can be used to
specify a USB connector to use to detect whether a charging cable has
been plugged in/out, and enable/disable charging accordingly.
To accommodate this, also add an internal pointer to the CHARGER regulator,
which is used to enable/disable charging and set the input current limit
(which will be done in subsequent commits).
The extcon listener/worker implementation is inspired by the rt5033_charger
driver.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Changed to adapt to both current limits being managed by one function
---
drivers/power/supply/Kconfig | 1 +
drivers/power/supply/max77693_charger.c | 125 ++++++++++++++++++++++++++++++++
2 files changed, 126 insertions(+)
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index 3e31375491d5..e4aeff9e7ad1 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -549,6 +549,7 @@ config CHARGER_MAX77650
config CHARGER_MAX77693
tristate "Maxim MAX77693 battery charger driver"
depends on MFD_MAX77693
+ depends on EXTCON || !EXTCON
help
Say Y to enable support for the Maxim MAX77693 battery charger.
diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
index 0ddaa03669a2..2dc273dd96ee 100644
--- a/drivers/power/supply/max77693_charger.c
+++ b/drivers/power/supply/max77693_charger.c
@@ -5,6 +5,8 @@
// Copyright (C) 2014 Samsung Electronics
// Krzysztof Kozlowski <krzk@kernel.org>
+#include <linux/devm-helpers.h>
+#include <linux/extcon.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
@@ -30,6 +32,13 @@ struct max77693_charger {
u32 batttery_overcurrent;
u32 fast_charge_current;
u32 charge_input_threshold_volt;
+
+ /* USB cable notifications */
+ struct {
+ struct extcon_dev *edev;
+ struct notifier_block nb;
+ struct work_struct work;
+ } cable;
};
static int max77693_get_charger_state(struct regmap *regmap, int *val)
@@ -664,17 +673,110 @@ static int max77693_reg_init(struct max77693_charger *chg)
chg->charge_input_threshold_volt);
}
+static int max77693_set_charging(struct max77693_charger *chg, bool enable)
+{
+ int is_enabled;
+ int ret = 0;
+
+ is_enabled = regulator_is_enabled(chg->regu);
+ if (is_enabled < 0)
+ return is_enabled;
+
+ if (enable && !is_enabled)
+ ret = regulator_enable(chg->regu);
+ else if (!enable && is_enabled)
+ ret = regulator_disable(chg->regu);
+
+ return ret;
+}
+
+static void max77693_charger_extcon_work(struct work_struct *work)
+{
+ struct max77693_charger *chg = container_of(work, struct max77693_charger,
+ cable.work);
+ struct extcon_dev *edev = chg->cable.edev;
+ int connector, state;
+ int ret;
+
+ for (connector = EXTCON_USB_HOST; connector <= EXTCON_CHG_USB_PD;
+ connector++) {
+ state = extcon_get_state(edev, connector);
+ if (state == 1)
+ break;
+ }
+
+ switch (connector) {
+ case EXTCON_CHG_USB_SDP:
+ case EXTCON_CHG_USB_DCP:
+ case EXTCON_CHG_USB_CDP:
+ case EXTCON_CHG_USB_ACA:
+ case EXTCON_CHG_USB_FAST:
+ case EXTCON_CHG_USB_SLOW:
+ case EXTCON_CHG_USB_PD:
+ ret = max77693_set_charging(chg, true);
+ if (ret) {
+ dev_err(chg->dev, "failed to enable charging\n");
+ break;
+ }
+ dev_info(chg->dev, "charging. connector type: %d\n",
+ connector);
+ break;
+ default:
+ ret = max77693_set_charging(chg, false);
+ if (ret) {
+ dev_err(chg->dev, "failed to disable charging\n");
+ break;
+ }
+ dev_info(chg->dev, "charging. connector type: %d\n",
+ connector);
+ break;
+ }
+
+ power_supply_changed(chg->charger);
+}
+
+static int max77693_charger_extcon_notifier(struct notifier_block *nb,
+ unsigned long event, void *param)
+{
+ struct max77693_charger *chg = container_of(nb, struct max77693_charger,
+ cable.nb);
+
+ schedule_work(&chg->cable.work);
+
+ return NOTIFY_OK;
+}
+
#ifdef CONFIG_OF
static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
{
struct power_supply_battery_info *battery_info;
struct device_node *np = dev->of_node;
+ struct device_node *np_conn, *np_edev;
if (!np) {
dev_err(dev, "no charger OF node\n");
return -EINVAL;
}
+ np_conn = of_parse_phandle(np, "maxim,usb-connector", 0);
+ np_edev = of_get_parent(np_conn);
+
+ chg->cable.edev = extcon_find_edev_by_node(np_edev);
+ if (IS_ERR(chg->cable.edev)) {
+ /*
+ * In case of deferred extcon probe, defer our probe as well
+ * until it appears.
+ */
+ if (PTR_ERR(chg->cable.edev) == -EPROBE_DEFER)
+ return PTR_ERR(chg->cable.edev);
+ /*
+ * Otherwise, ignore errors (the charger can run without a
+ * connector provided).
+ */
+ dev_warn(dev, "no extcon device found in device-tree (%ld)\n",
+ PTR_ERR(chg->cable.edev));
+ }
+
if (of_property_read_u32(np, "maxim,constant-microvolt",
&chg->constant_volt))
chg->constant_volt = DEFAULT_CONSTANT_VOLT;
@@ -752,6 +854,26 @@ static int max77693_charger_probe(struct platform_device *pdev)
if (ret)
return ret;
+ /* Set up extcon if the USB connector node was found */
+ if (!IS_ERR(chg->cable.edev)) {
+ ret = devm_work_autocancel(&pdev->dev, &chg->cable.work,
+ max77693_charger_extcon_work);
+ if (ret) {
+ dev_err(&pdev->dev, "failed: initialize extcon work\n");
+ return ret;
+ }
+
+ chg->cable.nb.notifier_call = max77693_charger_extcon_notifier;
+
+ ret = devm_extcon_register_notifier_all(&pdev->dev,
+ chg->cable.edev,
+ &chg->cable.nb);
+ if (ret) {
+ dev_err(&pdev->dev, "failed: register extcon notifier\n");
+ return ret;
+ }
+ }
+
ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
if (ret) {
dev_err(&pdev->dev, "failed: create fast charge timer sysfs entry\n");
@@ -778,6 +900,9 @@ static int max77693_charger_probe(struct platform_device *pdev)
device_remove_file(&pdev->dev, &dev_attr_top_off_threshold_current);
device_remove_file(&pdev->dev, &dev_attr_fast_charge_timer);
+ devm_extcon_unregister_notifier_all(&pdev->dev, chg->cable.edev,
+ &chg->cable.nb);
+
return ret;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (5 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-25 15:38 ` Lee Jones
2024-07-15 12:55 ` [PATCH v2 8/9] ARM: dts: samsung: exynos4212-tab3: Add battery node with charge current value Artur Weber
2024-07-15 12:55 ` [PATCH v2 9/9] ARM: dts: samsung: exynos4212-tab3: Add USB connector node Artur Weber
8 siblings, 1 reply; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
Building upon the newly added extcon detection support, add detection
for USB OTG cables (EXTCON_USB_HOST type), and enable/disable the OTG
bits as needed.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Added CHGIN OTG current limit value
- Squashed MFD header register changes into this commit
---
drivers/power/supply/max77693_charger.c | 103 +++++++++++++++++++++++++++-----
include/linux/mfd/max77693-private.h | 5 ++
2 files changed, 94 insertions(+), 14 deletions(-)
diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
index 2dc273dd96ee..34d68b1050d4 100644
--- a/drivers/power/supply/max77693_charger.c
+++ b/drivers/power/supply/max77693_charger.c
@@ -669,6 +669,16 @@ static int max77693_reg_init(struct max77693_charger *chg)
if (ret)
return ret;
+ /* Set OTG current limit to 900 mA */
+ data = (0x1 << CHG_CNFG_02_OTG_ILIM_SHIFT);
+ ret = regmap_update_bits(chg->max77693->regmap,
+ MAX77693_CHG_REG_CHG_CNFG_02,
+ CHG_CNFG_02_OTG_ILIM_MASK, data);
+ if (ret) {
+ dev_err(chg->dev, "Error setting OTG current limit: %d\n", ret);
+ return ret;
+ }
+
return max77693_set_charge_input_threshold_volt(chg,
chg->charge_input_threshold_volt);
}
@@ -690,11 +700,42 @@ static int max77693_set_charging(struct max77693_charger *chg, bool enable)
return ret;
}
+static int max77693_set_otg(struct max77693_charger *chg, bool enable)
+{
+ struct regmap *regmap = chg->max77693->regmap;
+ unsigned int data;
+ bool is_enabled;
+ int ret;
+
+ ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_CNFG_00, &data);
+ if (ret)
+ return ret;
+
+ is_enabled = !!(data & CHG_CNFG_00_OTG_MASK);
+
+ if (enable && !is_enabled) {
+ /* OTG on, boost on, DIS_MUIC_CTRL on */
+ data |= CHG_CNFG_00_OTG_MASK | CHG_CNFG_00_BOOST_MASK \
+ | CHG_CNFG_00_DIS_MUIC_CTRL_MASK;
+
+ } else if (!enable && is_enabled) {
+ /* OTG off, boost off, DIS_MUIC_CTRL off */
+ data &= ~(CHG_CNFG_00_OTG_MASK | CHG_CNFG_00_BOOST_MASK \
+ | CHG_CNFG_00_DIS_MUIC_CTRL_MASK);
+ }
+
+ return regmap_write(chg->max77693->regmap,
+ MAX77693_CHG_REG_CHG_CNFG_00,
+ data);
+}
+
static void max77693_charger_extcon_work(struct work_struct *work)
{
struct max77693_charger *chg = container_of(work, struct max77693_charger,
cable.work);
struct extcon_dev *edev = chg->cable.edev;
+ bool set_charging, set_otg;
+ unsigned int current_limit;
int connector, state;
int ret;
@@ -707,31 +748,61 @@ static void max77693_charger_extcon_work(struct work_struct *work)
switch (connector) {
case EXTCON_CHG_USB_SDP:
- case EXTCON_CHG_USB_DCP:
case EXTCON_CHG_USB_CDP:
+ case EXTCON_CHG_USB_SLOW:
+ current_limit = 500000; /* 500 mA */
+ set_charging = true;
+ set_otg = false;
+
+ dev_info(chg->dev, "slow charging. connector type: %d\n",
+ connector);
+ break;
+ case EXTCON_CHG_USB_DCP:
case EXTCON_CHG_USB_ACA:
case EXTCON_CHG_USB_FAST:
- case EXTCON_CHG_USB_SLOW:
case EXTCON_CHG_USB_PD:
- ret = max77693_set_charging(chg, true);
- if (ret) {
- dev_err(chg->dev, "failed to enable charging\n");
- break;
- }
- dev_info(chg->dev, "charging. connector type: %d\n",
+ current_limit = chg->fast_charge_current;
+ set_charging = true;
+ set_otg = false;
+
+ dev_info(chg->dev, "fast charging. connector type: %d\n",
+ connector);
+ break;
+ case EXTCON_USB_HOST:
+ current_limit = 500000; /* 500 mA */
+ set_charging = false;
+ set_otg = true;
+
+ dev_info(chg->dev, "USB host. connector type: %d\n",
connector);
break;
default:
- ret = max77693_set_charging(chg, false);
- if (ret) {
- dev_err(chg->dev, "failed to disable charging\n");
- break;
- }
- dev_info(chg->dev, "charging. connector type: %d\n",
+ current_limit = 500000; /* 500 mA */
+ set_charging = false;
+ set_otg = false;
+
+ dev_info(chg->dev, "disconnected. connector type: %d\n",
connector);
break;
}
+ ret = max77693_set_current_limit(chg, current_limit);
+ if (ret) {
+ dev_err(chg->dev, "failed to set current limit (%d)\n", ret);
+ goto out;
+ }
+
+ ret = max77693_set_charging(chg, set_charging);
+ if (ret) {
+ dev_err(chg->dev, "failed to set charging (%d)\n", ret);
+ goto out;
+ }
+
+ ret = max77693_set_otg(chg, set_otg);
+ if (ret)
+ dev_err(chg->dev, "failed to set OTG (%d)\n", ret);
+
+out:
power_supply_changed(chg->charger);
}
@@ -793,6 +864,10 @@ static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
&chg->batttery_overcurrent))
chg->batttery_overcurrent = DEFAULT_BATTERY_OVERCURRENT;
+ if (of_property_read_u32(np, "maxim,fast-charge-current-microamp",
+ &chg->fast_charge_current))
+ chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
+
if (of_property_read_u32(np, "maxim,charge-input-threshold-microvolt",
&chg->charge_input_threshold_volt))
chg->charge_input_threshold_volt =
diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h
index 4570646e2f33..313fcc3173f9 100644
--- a/include/linux/mfd/max77693-private.h
+++ b/include/linux/mfd/max77693-private.h
@@ -209,7 +209,10 @@ enum max77693_charger_battery_state {
/* MAX77693 CHG_CNFG_00 register */
#define CHG_CNFG_00_CHG_MASK 0x1
+#define CHG_CNFG_00_OTG_MASK 0x2
#define CHG_CNFG_00_BUCK_MASK 0x4
+#define CHG_CNFG_00_BOOST_MASK 0x8
+#define CHG_CNFG_00_DIS_MUIC_CTRL_MASK 0x20
/* MAX77693_CHG_REG_CHG_CNFG_01 register */
#define CHG_CNFG_01_FCHGTIME_SHIFT 0
@@ -222,6 +225,8 @@ enum max77693_charger_battery_state {
/* MAX77693_CHG_REG_CHG_CNFG_02 register */
#define CHG_CNFG_02_CC_SHIFT 0
#define CHG_CNFG_02_CC_MASK 0x3F
+#define CHG_CNFG_02_OTG_ILIM_SHIFT 7
+#define CHG_CNFG_02_OTG_ILIM_MASK 0x80
/* MAX77693_CHG_REG_CHG_CNFG_03 register */
#define CHG_CNFG_03_TOITH_SHIFT 0
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 8/9] ARM: dts: samsung: exynos4212-tab3: Add battery node with charge current value
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (6 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
2024-07-15 12:55 ` [PATCH v2 9/9] ARM: dts: samsung: exynos4212-tab3: Add USB connector node Artur Weber
8 siblings, 0 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
This value was verified by comparing register dumps of the MAX77693
charger with on mainline with a downstream kernel under Android; the
value on downstream was set to 1.8 amps when charging with a proper
charger.
Add it to a new battery node and pass it to the MAX77693 charger
so that the fast charge current setting can be used for charging.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
Changes in v2:
- Switched to monitored-battery
---
arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
index e5254e32aa8f..7905e33234f2 100644
--- a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
@@ -153,6 +153,7 @@ charger_reg: CHARGER {
charger {
compatible = "maxim,max77693-charger";
+ monitored-battery = <&battery>;
maxim,constant-microvolt = <4350000>;
maxim,min-system-microvolt = <3600000>;
@@ -294,6 +295,11 @@ submic_bias_reg: voltage-regulator-5 {
regulator-max-microvolt = <2800000>;
};
+ battery: battery {
+ compatible = "simple-battery";
+ constant-charge-current-max-microamp = <1800000>;
+ };
+
sound: sound {
compatible = "samsung,midas-audio";
model = "TAB3";
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 9/9] ARM: dts: samsung: exynos4212-tab3: Add USB connector node
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
` (7 preceding siblings ...)
2024-07-15 12:55 ` [PATCH v2 8/9] ARM: dts: samsung: exynos4212-tab3: Add battery node with charge current value Artur Weber
@ 2024-07-15 12:55 ` Artur Weber
8 siblings, 0 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-15 12:55 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli, Artur Weber
Add a subnode to the MAX77693 MFD for the MUIC and connect the USB
connector node to the charger to allow for charger type/OTG cable
detection.
Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
index 7905e33234f2..f5ee3640a940 100644
--- a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
@@ -151,6 +151,17 @@ charger_reg: CHARGER {
};
};
+ muic {
+ compatible = "maxim,max77693-muic";
+
+ usb_conn: connector {
+ compatible = "samsung,usb-connector-11pin",
+ "usb-b-connector";
+ label = "micro-USB";
+ type = "micro";
+ };
+ };
+
charger {
compatible = "maxim,max77693-charger";
monitored-battery = <&battery>;
@@ -160,6 +171,8 @@ charger {
maxim,thermal-regulation-celsius = <100>;
maxim,battery-overcurrent-microamp = <3500000>;
maxim,charge-input-threshold-microvolt = <4300000>;
+
+ maxim,usb-connector = <&usb_conn>;
};
};
};
--
2.45.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging
2024-07-15 12:55 ` [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging Artur Weber
@ 2024-07-20 20:59 ` Artur Weber
0 siblings, 0 replies; 15+ messages in thread
From: Artur Weber @ 2024-07-20 20:59 UTC (permalink / raw)
To: Krzysztof Kozlowski, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli
On 15.07.2024 14:55, Artur Weber wrote:
> Add a device tree property, "maxim,usb-connector", that can be used to
> specify a USB connector to use to detect whether a charging cable has
> been plugged in/out, and enable/disable charging accordingly.
>
> To accommodate this, also add an internal pointer to the CHARGER regulator,
> which is used to enable/disable charging and set the input current limit
> (which will be done in subsequent commits).
>
> The extcon listener/worker implementation is inspired by the rt5033_charger
> driver.
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> ...> diff --git a/drivers/power/supply/max77693_charger.c
b/drivers/power/supply/max77693_charger.c
> index 0ddaa03669a2..2dc273dd96ee 100644
> --- a/drivers/power/supply/max77693_charger.c
> +++ b/drivers/power/supply/max77693_charger.c
> ...
> +static int max77693_set_charging(struct max77693_charger *chg, bool enable)
> +{
> + int is_enabled;
> + int ret = 0;
> +
> + is_enabled = regulator_is_enabled(chg->regu);
> + if (is_enabled < 0)
> + return is_enabled;
> +
> + if (enable && !is_enabled)
> + ret = regulator_enable(chg->regu);
> + else if (!enable && is_enabled)
> + ret = regulator_disable(chg->regu);
> +
> + return ret;
> +}
Nevermind, the regulator-based approach simply doesn't work here,
because we pretty frequently end up in a situation like this:
[ 20.162612] ------------[ cut here ]------------
[ 20.162618] WARNING: CPU: 0 PID: 29 at drivers/regulator/core.c:3015
_regulator_disable+0x140/0x1a0
[ 20.162645] unbalanced disables for CHARGER
[ 20.162649] Modules linked in: fuse brcmfmac_wcc hci_uart btintel
btbcm bluetooth snd_soc_midas_wm1811 st_accel_i2c st_sensors_i2c
st_accel_spi st_accel brcmfmac ecdh_generic st_sensors st_sensors_spi
ecc libaes brcmutil cfg80211 rfkill exynos_adc yamaha_yas530
industrialio_triggered_buffer kfifo_buf exynos_rng s5p_sss cm3323
industrialio
[ 20.162737] CPU: 0 PID: 29 Comm: kworker/0:2 Tainted: G W
6.10.0-postmarketos-exynos4 #82
[ 20.162747] Hardware name: Samsung Exynos (Flattened Device Tree)
[ 20.162754] Workqueue: events max77693_charger_extcon_work
[ 20.162770] Call trace:
[ 20.162778] unwind_backtrace from show_stack+0x10/0x14
[ 20.162804] show_stack from dump_stack_lvl+0x50/0x64
[ 20.162824] dump_stack_lvl from __warn+0x94/0xc0
[ 20.162838] __warn from warn_slowpath_fmt+0x120/0x1b4
[ 20.162855] warn_slowpath_fmt from _regulator_disable+0x140/0x1a0
[ 20.162873] _regulator_disable from regulator_disable+0x34/0x6c
[ 20.162890] regulator_disable from
max77693_charger_extcon_work+0x1e4/0x268
[ 20.162907] max77693_charger_extcon_work from
process_one_work+0x154/0x2dc
[ 20.162925] process_one_work from worker_thread+0x250/0x438
[ 20.162941] worker_thread from kthread+0x110/0x12c
[ 20.162958] kthread from ret_from_fork+0x14/0x28
[ 20.162970] Exception stack(0xc18edfb0 to 0xc18edff8)
[ 20.162979] dfa0: 00000000
00000000 00000000 00000000
[ 20.162987] dfc0: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
[ 20.162994] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
[ 20.162999] ---[ end trace 0000000000000000 ]---
[ 20.163007] max77693-charger max77693-charger: failed to set charging
(-5)
This can be reproduced by booting the device in with no cable plugged
in, then plugging in an OTG cable. It prints the warning on connect and
disconnect. More importantly, this prevents a switch to/from OTG mode in
the scenarios that print a warning. (I've also encountered some issues
with similar warnings being printed on unsuspend, but wasn't able to
reproduce them; I'm willing to assume they were related to plugging in
an OTG cable as the wakeup trigger.)
As far as I understand it, this is because regulator_is_enabled checks
for the hardware state, not for the in-software regulator enable count,
and the charging bits are flipped on by default (presumably by the
bootloader). I thought regulator-boot-on would handle this, but clearly
it doesn't...
Best regards
Artur
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property
2024-07-15 12:55 ` [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property Artur Weber
@ 2024-07-22 5:48 ` Krzysztof Kozlowski
0 siblings, 0 replies; 15+ messages in thread
From: Krzysztof Kozlowski @ 2024-07-22 5:48 UTC (permalink / raw)
To: Artur Weber, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli
On 15/07/2024 14:55, Artur Weber wrote:
> Add the monitored-battery property, so that its constant charge current
> property can be used to specify the current limit to use for fast charge
> (when plugged into a wall charger).
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> ---
> Changes in v2:
> - Switched to monitored-battery property from separate fast charge
> current property
> ---
> .../devicetree/bindings/power/supply/maxim,max77693.yaml | 9 +++++++++
> 1 file changed, 9 insertions(+)
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property
2024-07-15 12:55 ` [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property Artur Weber
@ 2024-07-22 5:49 ` Krzysztof Kozlowski
0 siblings, 0 replies; 15+ messages in thread
From: Krzysztof Kozlowski @ 2024-07-22 5:49 UTC (permalink / raw)
To: Artur Weber, Chanwoo Choi
Cc: Sebastian Reichel, Rob Herring, Conor Dooley, Lee Jones,
Krzysztof Kozlowski, Alim Akhtar, linux-pm, devicetree,
linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli
On 15/07/2024 14:55, Artur Weber wrote:
> Allow for specifying a USB connector to use for charger type/OTG cable
> detection.
>
> The way this is done is inspired by the rt5033-charger implementation.
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
<form letter>
This is a friendly reminder during the review process.
It looks like you received a tag and forgot to add it.
If you do not know the process, here is a short explanation:
Please add Acked-by/Reviewed-by/Tested-by tags when posting new
versions, under or above your Signed-off-by tag. Tag is "received", when
provided in a message replied to you on the mailing list. Tools like b4
can help here. However, there's no need to repost patches *only* to add
the tags. The upstream maintainer will do that for tags received on the
version they apply.
https://elixir.bootlin.com/linux/v6.5-rc3/source/Documentation/process/submitting-patches.rst#L577
If a tag was not added on purpose, please state why and what changed.
</form letter>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init
2024-07-15 12:55 ` [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init Artur Weber
@ 2024-07-25 15:37 ` Lee Jones
0 siblings, 0 replies; 15+ messages in thread
From: Lee Jones @ 2024-07-25 15:37 UTC (permalink / raw)
To: Artur Weber
Cc: Krzysztof Kozlowski, Chanwoo Choi, Sebastian Reichel, Rob Herring,
Conor Dooley, Krzysztof Kozlowski, Alim Akhtar, linux-pm,
devicetree, linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli
On Mon, 15 Jul 2024, Artur Weber wrote:
> There are two charger current limit registers:
>
> - Fast charge current limit (which controls current going from the
> charger to the battery);
> - CHGIN input current limit (which controls current going into the
> charger through the cable).
>
> Add a function for setting both of the values, and set them to a
> safe default value of 500mA at initialization.
>
> The default value for the fast charge current limit can be modified
> by setting the constant-charge-current-max-ua DT property of the
> battery node specified in the monitored-battery charger DT property.
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> ---
> Changes in v2:
> - Squashed mfd include register additions into this commit
> - Changed from custom fast charge current property to monitored-battery
> (devm_power_supply_register call has been moved up as it is needed by
> the DT init function now)
> - Changed to adapt to both current limit values being managed by the
> CHARGER regulator
> ---
> drivers/power/supply/max77693_charger.c | 43 ++++++++++++++++++++++++---------
> include/linux/mfd/max77693-private.h | 6 +++++
Acked-by: Lee Jones <lee@kernel.org>
> 2 files changed, 38 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
> index 0d53f61d58ba..0ddaa03669a2 100644
> --- a/drivers/power/supply/max77693_charger.c
> +++ b/drivers/power/supply/max77693_charger.c
> @@ -28,6 +28,7 @@ struct max77693_charger {
> u32 min_system_volt;
> u32 thermal_regulation_temp;
> u32 batttery_overcurrent;
> + u32 fast_charge_current;
> u32 charge_input_threshold_volt;
> };
>
> @@ -570,6 +571,14 @@ static int max77693_set_batttery_overcurrent(struct max77693_charger *chg,
> CHG_CNFG_12_B2SOVRC_MASK, data);
> }
>
> +static int max77693_set_current_limit(struct max77693_charger *chg,
> + unsigned int uamp)
> +{
> + dev_dbg(chg->dev, "Current limit: %u\n", uamp);
> +
> + return regulator_set_current_limit(chg->regu, (int)uamp, (int)uamp);
> +}
> +
> static int max77693_set_charge_input_threshold_volt(struct max77693_charger *chg,
> unsigned int uvolt)
> {
> @@ -647,6 +656,10 @@ static int max77693_reg_init(struct max77693_charger *chg)
> if (ret)
> return ret;
>
> + ret = max77693_set_current_limit(chg, DEFAULT_FAST_CHARGE_CURRENT);
> + if (ret)
> + return ret;
> +
> return max77693_set_charge_input_threshold_volt(chg,
> chg->charge_input_threshold_volt);
> }
> @@ -654,6 +667,7 @@ static int max77693_reg_init(struct max77693_charger *chg)
> #ifdef CONFIG_OF
> static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
> {
> + struct power_supply_battery_info *battery_info;
> struct device_node *np = dev->of_node;
>
> if (!np) {
> @@ -682,11 +696,20 @@ static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
> chg->charge_input_threshold_volt =
> DEFAULT_CHARGER_INPUT_THRESHOLD_VOLT;
>
> + if (power_supply_get_battery_info(chg->charger, &battery_info) ||
> + !battery_info->constant_charge_current_max_ua)
> + chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
> + else
> + chg->fast_charge_current = \
> + battery_info->constant_charge_current_max_ua;
> +
> return 0;
> }
> #else /* CONFIG_OF */
> static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
> {
> + chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
> +
> return 0;
> }
> #endif /* CONFIG_OF */
> @@ -712,6 +735,15 @@ static int max77693_charger_probe(struct platform_device *pdev)
> return dev_err_probe(&pdev->dev, PTR_ERR(chg->regu),
> "failed to get charger regulator\n");
>
> + psy_cfg.drv_data = chg;
> +
> + chg->charger = devm_power_supply_register(&pdev->dev,
> + &max77693_charger_desc,
> + &psy_cfg);
> + if (IS_ERR(chg->charger))
> + return dev_err_probe(&pdev->dev, PTR_ERR(chg->charger),
> + "failed: power supply register\n");
> +
> ret = max77693_dt_init(&pdev->dev, chg);
> if (ret)
> return ret;
> @@ -720,8 +752,6 @@ static int max77693_charger_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> - psy_cfg.drv_data = chg;
> -
> ret = device_create_file(&pdev->dev, &dev_attr_fast_charge_timer);
> if (ret) {
> dev_err(&pdev->dev, "failed: create fast charge timer sysfs entry\n");
> @@ -741,15 +771,6 @@ static int max77693_charger_probe(struct platform_device *pdev)
> goto err;
> }
>
> - chg->charger = devm_power_supply_register(&pdev->dev,
> - &max77693_charger_desc,
> - &psy_cfg);
> - if (IS_ERR(chg->charger)) {
> - dev_err(&pdev->dev, "failed: power supply register\n");
> - ret = PTR_ERR(chg->charger);
> - goto err;
> - }
> -
> return 0;
>
> err:
> diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h
> index 54444ff2a5de..4570646e2f33 100644
> --- a/include/linux/mfd/max77693-private.h
> +++ b/include/linux/mfd/max77693-private.h
> @@ -145,6 +145,8 @@ enum max77693_pmic_reg {
> #define DEFAULT_THERMAL_REGULATION_TEMP 100
> /* microamps */
> #define DEFAULT_BATTERY_OVERCURRENT 3500000
> +/* microamps */
> +#define DEFAULT_FAST_CHARGE_CURRENT 500000
> /* microvolts */
> #define DEFAULT_CHARGER_INPUT_THRESHOLD_VOLT 4300000
>
> @@ -217,6 +219,10 @@ enum max77693_charger_battery_state {
> #define CHG_CNFG_01_CHGRSTRT_MASK (0x3 << CHG_CNFG_01_CHGRSTRT_SHIFT)
> #define CHG_CNFG_01_PQEN_MAKS BIT(CHG_CNFG_01_PQEN_SHIFT)
>
> +/* MAX77693_CHG_REG_CHG_CNFG_02 register */
> +#define CHG_CNFG_02_CC_SHIFT 0
> +#define CHG_CNFG_02_CC_MASK 0x3F
> +
> /* MAX77693_CHG_REG_CHG_CNFG_03 register */
> #define CHG_CNFG_03_TOITH_SHIFT 0
> #define CHG_CNFG_03_TOTIME_SHIFT 3
>
> --
> 2.45.2
>
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG
2024-07-15 12:55 ` [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG Artur Weber
@ 2024-07-25 15:38 ` Lee Jones
0 siblings, 0 replies; 15+ messages in thread
From: Lee Jones @ 2024-07-25 15:38 UTC (permalink / raw)
To: Artur Weber
Cc: Krzysztof Kozlowski, Chanwoo Choi, Sebastian Reichel, Rob Herring,
Conor Dooley, Krzysztof Kozlowski, Alim Akhtar, linux-pm,
devicetree, linux-kernel, linux-arm-kernel, linux-samsung-soc,
~postmarketos/upstreaming, Henrik Grimler, Wolfgang Wiedmeyer,
Denis 'GNUtoo' Carikli
On Mon, 15 Jul 2024, Artur Weber wrote:
> Building upon the newly added extcon detection support, add detection
> for USB OTG cables (EXTCON_USB_HOST type), and enable/disable the OTG
> bits as needed.
>
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> ---
> Changes in v2:
> - Added CHGIN OTG current limit value
> - Squashed MFD header register changes into this commit
> ---
> drivers/power/supply/max77693_charger.c | 103 +++++++++++++++++++++++++++-----
> include/linux/mfd/max77693-private.h | 5 ++
Acked-by: Lee Jones <lee@kernel.org>
> 2 files changed, 94 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c
> index 2dc273dd96ee..34d68b1050d4 100644
> --- a/drivers/power/supply/max77693_charger.c
> +++ b/drivers/power/supply/max77693_charger.c
> @@ -669,6 +669,16 @@ static int max77693_reg_init(struct max77693_charger *chg)
> if (ret)
> return ret;
>
> + /* Set OTG current limit to 900 mA */
> + data = (0x1 << CHG_CNFG_02_OTG_ILIM_SHIFT);
> + ret = regmap_update_bits(chg->max77693->regmap,
> + MAX77693_CHG_REG_CHG_CNFG_02,
> + CHG_CNFG_02_OTG_ILIM_MASK, data);
> + if (ret) {
> + dev_err(chg->dev, "Error setting OTG current limit: %d\n", ret);
> + return ret;
> + }
> +
> return max77693_set_charge_input_threshold_volt(chg,
> chg->charge_input_threshold_volt);
> }
> @@ -690,11 +700,42 @@ static int max77693_set_charging(struct max77693_charger *chg, bool enable)
> return ret;
> }
>
> +static int max77693_set_otg(struct max77693_charger *chg, bool enable)
> +{
> + struct regmap *regmap = chg->max77693->regmap;
> + unsigned int data;
> + bool is_enabled;
> + int ret;
> +
> + ret = regmap_read(regmap, MAX77693_CHG_REG_CHG_CNFG_00, &data);
> + if (ret)
> + return ret;
> +
> + is_enabled = !!(data & CHG_CNFG_00_OTG_MASK);
> +
> + if (enable && !is_enabled) {
> + /* OTG on, boost on, DIS_MUIC_CTRL on */
> + data |= CHG_CNFG_00_OTG_MASK | CHG_CNFG_00_BOOST_MASK \
> + | CHG_CNFG_00_DIS_MUIC_CTRL_MASK;
> +
> + } else if (!enable && is_enabled) {
> + /* OTG off, boost off, DIS_MUIC_CTRL off */
> + data &= ~(CHG_CNFG_00_OTG_MASK | CHG_CNFG_00_BOOST_MASK \
> + | CHG_CNFG_00_DIS_MUIC_CTRL_MASK);
> + }
> +
> + return regmap_write(chg->max77693->regmap,
> + MAX77693_CHG_REG_CHG_CNFG_00,
> + data);
> +}
> +
> static void max77693_charger_extcon_work(struct work_struct *work)
> {
> struct max77693_charger *chg = container_of(work, struct max77693_charger,
> cable.work);
> struct extcon_dev *edev = chg->cable.edev;
> + bool set_charging, set_otg;
> + unsigned int current_limit;
> int connector, state;
> int ret;
>
> @@ -707,31 +748,61 @@ static void max77693_charger_extcon_work(struct work_struct *work)
>
> switch (connector) {
> case EXTCON_CHG_USB_SDP:
> - case EXTCON_CHG_USB_DCP:
> case EXTCON_CHG_USB_CDP:
> + case EXTCON_CHG_USB_SLOW:
> + current_limit = 500000; /* 500 mA */
> + set_charging = true;
> + set_otg = false;
> +
> + dev_info(chg->dev, "slow charging. connector type: %d\n",
> + connector);
> + break;
> + case EXTCON_CHG_USB_DCP:
> case EXTCON_CHG_USB_ACA:
> case EXTCON_CHG_USB_FAST:
> - case EXTCON_CHG_USB_SLOW:
> case EXTCON_CHG_USB_PD:
> - ret = max77693_set_charging(chg, true);
> - if (ret) {
> - dev_err(chg->dev, "failed to enable charging\n");
> - break;
> - }
> - dev_info(chg->dev, "charging. connector type: %d\n",
> + current_limit = chg->fast_charge_current;
> + set_charging = true;
> + set_otg = false;
> +
> + dev_info(chg->dev, "fast charging. connector type: %d\n",
> + connector);
> + break;
> + case EXTCON_USB_HOST:
> + current_limit = 500000; /* 500 mA */
> + set_charging = false;
> + set_otg = true;
> +
> + dev_info(chg->dev, "USB host. connector type: %d\n",
> connector);
> break;
> default:
> - ret = max77693_set_charging(chg, false);
> - if (ret) {
> - dev_err(chg->dev, "failed to disable charging\n");
> - break;
> - }
> - dev_info(chg->dev, "charging. connector type: %d\n",
> + current_limit = 500000; /* 500 mA */
> + set_charging = false;
> + set_otg = false;
> +
> + dev_info(chg->dev, "disconnected. connector type: %d\n",
> connector);
> break;
> }
>
> + ret = max77693_set_current_limit(chg, current_limit);
> + if (ret) {
> + dev_err(chg->dev, "failed to set current limit (%d)\n", ret);
> + goto out;
> + }
> +
> + ret = max77693_set_charging(chg, set_charging);
> + if (ret) {
> + dev_err(chg->dev, "failed to set charging (%d)\n", ret);
> + goto out;
> + }
> +
> + ret = max77693_set_otg(chg, set_otg);
> + if (ret)
> + dev_err(chg->dev, "failed to set OTG (%d)\n", ret);
> +
> +out:
> power_supply_changed(chg->charger);
> }
>
> @@ -793,6 +864,10 @@ static int max77693_dt_init(struct device *dev, struct max77693_charger *chg)
> &chg->batttery_overcurrent))
> chg->batttery_overcurrent = DEFAULT_BATTERY_OVERCURRENT;
>
> + if (of_property_read_u32(np, "maxim,fast-charge-current-microamp",
> + &chg->fast_charge_current))
> + chg->fast_charge_current = DEFAULT_FAST_CHARGE_CURRENT;
> +
> if (of_property_read_u32(np, "maxim,charge-input-threshold-microvolt",
> &chg->charge_input_threshold_volt))
> chg->charge_input_threshold_volt =
> diff --git a/include/linux/mfd/max77693-private.h b/include/linux/mfd/max77693-private.h
> index 4570646e2f33..313fcc3173f9 100644
> --- a/include/linux/mfd/max77693-private.h
> +++ b/include/linux/mfd/max77693-private.h
> @@ -209,7 +209,10 @@ enum max77693_charger_battery_state {
>
> /* MAX77693 CHG_CNFG_00 register */
> #define CHG_CNFG_00_CHG_MASK 0x1
> +#define CHG_CNFG_00_OTG_MASK 0x2
> #define CHG_CNFG_00_BUCK_MASK 0x4
> +#define CHG_CNFG_00_BOOST_MASK 0x8
> +#define CHG_CNFG_00_DIS_MUIC_CTRL_MASK 0x20
>
> /* MAX77693_CHG_REG_CHG_CNFG_01 register */
> #define CHG_CNFG_01_FCHGTIME_SHIFT 0
> @@ -222,6 +225,8 @@ enum max77693_charger_battery_state {
> /* MAX77693_CHG_REG_CHG_CNFG_02 register */
> #define CHG_CNFG_02_CC_SHIFT 0
> #define CHG_CNFG_02_CC_MASK 0x3F
> +#define CHG_CNFG_02_OTG_ILIM_SHIFT 7
> +#define CHG_CNFG_02_OTG_ILIM_MASK 0x80
>
> /* MAX77693_CHG_REG_CHG_CNFG_03 register */
> #define CHG_CNFG_03_TOITH_SHIFT 0
>
> --
> 2.45.2
>
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2024-07-25 15:39 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-15 12:55 [PATCH v2 0/9] power: supply: max77693: Toggle charging/OTG based on extcon status Artur Weber
2024-07-15 12:55 ` [PATCH v2 1/9] dt-bindings: power: supply: max77693: Add monitored-battery property Artur Weber
2024-07-22 5:48 ` Krzysztof Kozlowski
2024-07-15 12:55 ` [PATCH v2 2/9] dt-bindings: power: supply: max77693: Add maxim,usb-connector property Artur Weber
2024-07-22 5:49 ` Krzysztof Kozlowski
2024-07-15 12:55 ` [PATCH v2 3/9] regulator: max77693: Set fast charge current in MAX77693 CHARGER regulator Artur Weber
2024-07-15 12:55 ` [PATCH v2 4/9] power: supply: max77693: Expose CURRENT_MAX property Artur Weber
2024-07-15 12:55 ` [PATCH v2 5/9] power: supply: max77693: Set charge current limits during init Artur Weber
2024-07-25 15:37 ` Lee Jones
2024-07-15 12:55 ` [PATCH v2 6/9] power: supply: max77693: Add USB extcon detection for enabling charging Artur Weber
2024-07-20 20:59 ` Artur Weber
2024-07-15 12:55 ` [PATCH v2 7/9] power: supply: max77693: Add support for detecting and enabling OTG Artur Weber
2024-07-25 15:38 ` Lee Jones
2024-07-15 12:55 ` [PATCH v2 8/9] ARM: dts: samsung: exynos4212-tab3: Add battery node with charge current value Artur Weber
2024-07-15 12:55 ` [PATCH v2 9/9] ARM: dts: samsung: exynos4212-tab3: Add USB connector node Artur Weber
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).