Files
BPI-CM9-Linux/build/patch/kernel/archive/sm8250-6.18/0037-power-supply-qcom_pm8150b_charger-adds-charging-cont.patch

128 lines
4.7 KiB
Diff

From 7bd708ddea7172b6142660a73f7427fcacb3fad3 Mon Sep 17 00:00:00 2001
From: Tomasz Duda <tomaszduda23@gmail.com>
Date: Tue, 5 Aug 2025 15:33:27 +0200
Subject: [PATCH 37/62] power: supply: qcom_pm8150b_charger: adds charging
control to pm8150b_charger
Signed-off-by: Jiali Chen <chenjiali@radxa.com>
---
.../qcom/sm8250-oneplus-instantnoodlep.dts | 5 ++++
drivers/power/supply/power_supply_sysfs.c | 1 +
drivers/power/supply/qcom_pm8150b_charger.c | 24 +++++++++++++++++++
include/linux/power_supply.h | 1 +
4 files changed, 31 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/sm8250-oneplus-instantnoodlep.dts b/arch/arm64/boot/dts/qcom/sm8250-oneplus-instantnoodlep.dts
index 5e8fc0b24054..86a687128827 100644
--- a/arch/arm64/boot/dts/qcom/sm8250-oneplus-instantnoodlep.dts
+++ b/arch/arm64/boot/dts/qcom/sm8250-oneplus-instantnoodlep.dts
@@ -742,6 +742,11 @@ vol_down_n: vol-down-n-state {
};
};
+&pm8150b_charger {
+ status = "okay";
+ monitored-battery = <&battery>;
+};
+
&pon_pwrkey {
status = "okay";
};
diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
index 18e5e84a81c6..71ed4fa57c3f 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -223,6 +223,7 @@ static struct power_supply_attr power_supply_attrs[] __ro_after_init = {
POWER_SUPPLY_ATTR(MANUFACTURE_YEAR),
POWER_SUPPLY_ATTR(MANUFACTURE_MONTH),
POWER_SUPPLY_ATTR(MANUFACTURE_DAY),
+ POWER_SUPPLY_ATTR(CHARGING_ENABLED),
POWER_SUPPLY_ATTR(INTERNAL_RESISTANCE),
POWER_SUPPLY_ATTR(STATE_OF_HEALTH),
/* Properties of type `const char *' */
diff --git a/drivers/power/supply/qcom_pm8150b_charger.c b/drivers/power/supply/qcom_pm8150b_charger.c
index d3590b4d7d5b..90842d8633b6 100644
--- a/drivers/power/supply/qcom_pm8150b_charger.c
+++ b/drivers/power/supply/qcom_pm8150b_charger.c
@@ -318,6 +318,7 @@ static enum power_supply_property smb5_properties[] = {
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_USB_TYPE,
+ POWER_SUPPLY_PROP_CHARGING_ENABLED,
};
static int smb5_get_prop_usb_online(struct smb5_chip *chip, int *val)
@@ -388,6 +389,18 @@ static int smb5_apsd_get_charger_type(struct smb5_chip *chip, int *val)
return 0;
}
+static int smb5_get_prop_charging_enabled(struct smb5_chip *chip, int *val)
+{
+ unsigned int charging_enabled;
+ int rc = regmap_read(chip->regmap, chip->base + CHARGING_ENABLE_CMD, &charging_enabled);
+ if (rc < 0) {
+ dev_err(chip->dev, "Failed to read charging enabled status, rc = %d", rc);
+ return rc;
+ }
+ *val = charging_enabled & CHARGING_ENABLE_CMD_BIT ? 1 : 0;
+ return 0;
+}
+
static int smb5_get_prop_status(struct smb5_chip *chip, int *val)
{
unsigned char stat[2];
@@ -461,6 +474,12 @@ static int smb5_set_current_limit(struct smb5_chip *chip, unsigned int val)
val_raw);
}
+static int smb5_set_prop_charging_enabled(struct smb5_chip *chip, unsigned int val)
+{
+ return regmap_update_bits(chip->regmap, chip->base + CHARGING_ENABLE_CMD,
+ CHARGING_ENABLE_CMD_BIT, val ? CHARGING_ENABLE_CMD_BIT : 0);
+}
+
static void smb5_status_change_work(struct work_struct *work)
{
unsigned int charger_type, current_ua;
@@ -600,6 +619,8 @@ static int smb5_get_property(struct power_supply *psy,
return smb5_get_prop_health(chip, &val->intval);
case POWER_SUPPLY_PROP_USB_TYPE:
return smb5_apsd_get_charger_type(chip, &val->intval);
+ case POWER_SUPPLY_PROP_CHARGING_ENABLED:
+ return smb5_get_prop_charging_enabled(chip, &val->intval);
default:
dev_err(chip->dev, "invalid property: %d\n", psp);
return -EINVAL;
@@ -615,6 +636,8 @@ static int smb5_set_property(struct power_supply *psy,
switch (psp) {
case POWER_SUPPLY_PROP_CURRENT_MAX:
return smb5_set_current_limit(chip, val->intval);
+ case POWER_SUPPLY_PROP_CHARGING_ENABLED:
+ return smb5_set_prop_charging_enabled(chip, val->intval);
default:
dev_err(chip->dev, "No setter for property: %d\n", psp);
return -EINVAL;
@@ -626,6 +649,7 @@ static int smb5_property_is_writable(struct power_supply *psy,
{
switch (psp) {
case POWER_SUPPLY_PROP_CURRENT_MAX:
+ case POWER_SUPPLY_PROP_CHARGING_ENABLED:
return 1;
default:
return 0;
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index f21f806bfb38..c9af526ab1a7 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -176,6 +176,7 @@ enum power_supply_property {
POWER_SUPPLY_PROP_MANUFACTURE_YEAR,
POWER_SUPPLY_PROP_MANUFACTURE_MONTH,
POWER_SUPPLY_PROP_MANUFACTURE_DAY,
+ POWER_SUPPLY_PROP_CHARGING_ENABLED,
POWER_SUPPLY_PROP_INTERNAL_RESISTANCE,
POWER_SUPPLY_PROP_STATE_OF_HEALTH,
/* Properties of type `const char *' */
--
2.47.3