128 lines
4.7 KiB
Diff
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
|
|
|