lede/target/linux/silicon/patches-5.19/0146-power-supply-macsmc_power-Add-AC-power-supply.patch

138 lines
4.2 KiB
Diff

From 58a6709f62008f3210799c906767c7c51aec5e75 Mon Sep 17 00:00:00 2001
From: Hector Martin <marcan@marcan.st>
Date: Tue, 15 Feb 2022 02:24:42 +0900
Subject: [PATCH 146/171] power: supply: macsmc_power: Add AC power supply
Signed-off-by: Hector Martin <marcan@marcan.st>
---
drivers/power/supply/macsmc_power.c | 74 +++++++++++++++++++++++++----
1 file changed, 66 insertions(+), 8 deletions(-)
diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c
index 4a8a90b775dd..dee48ee8b5a4 100644
--- a/drivers/power/supply/macsmc_power.c
+++ b/drivers/power/supply/macsmc_power.c
@@ -17,11 +17,14 @@
struct macsmc_power {
struct device *dev;
struct apple_smc *smc;
- struct power_supply *psy;
+
+ struct power_supply *batt;
char model_name[MAX_STRING_LENGTH];
char serial_number[MAX_STRING_LENGTH];
char mfg_date[MAX_STRING_LENGTH];
+ struct power_supply *ac;
+
struct notifier_block nb;
};
@@ -49,7 +52,7 @@ static int macsmc_battery_get_status(struct macsmc_power *power)
u32 nopower_flags;
u16 ac_current;
int ret;
-
+
/*
* Note: there are fallbacks in case some of these SMC keys disappear in the future
* or are not present on some machines. We treat the absence of the CHCE/CHCC/BSFC/CHSC
@@ -334,7 +337,6 @@ static int macsmc_battery_property_is_writeable(struct power_supply *psy,
}
}
-
static enum power_supply_property macsmc_battery_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
@@ -375,6 +377,54 @@ static const struct power_supply_desc macsmc_battery_desc = {
.num_properties = ARRAY_SIZE(macsmc_battery_props),
};
+static int macsmc_ac_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct macsmc_power *power = power_supply_get_drvdata(psy);
+ int ret = 0;
+ u16 vu16;
+ u32 vu32;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+ ret = apple_smc_read_u32(power->smc, SMC_KEY(CHIS), &vu32);
+ val->intval = !!vu32;
+ break;
+ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
+ ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-n), &vu16);
+ val->intval = vu16 * 1000;
+ break;
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+ ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-i), &vu16);
+ val->intval = vu16 * 1000;
+ break;
+ case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT:
+ ret = apple_smc_read_u32(power->smc, SMC_KEY(ACPW), &vu32);
+ val->intval = vu32 * 1000;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+static enum power_supply_property macsmc_ac_props[] = {
+ POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_VOLTAGE_NOW,
+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
+ POWER_SUPPLY_PROP_INPUT_POWER_LIMIT,
+};
+
+static const struct power_supply_desc macsmc_ac_desc = {
+ .name = "macsmc-ac",
+ .type = POWER_SUPPLY_TYPE_MAINS,
+ .get_property = macsmc_ac_get_property,
+ .properties = macsmc_ac_props,
+ .num_properties = ARRAY_SIZE(macsmc_ac_props),
+};
+
static int macsmc_power_event(struct notifier_block *nb, unsigned long event, void *data)
{
struct macsmc_power *power = container_of(nb, struct macsmc_power, nb);
@@ -383,7 +433,8 @@ static int macsmc_power_event(struct notifier_block *nb, unsigned long event, vo
bool charging = (event & 0xff) != 0;
dev_info(power->dev, "Charging: %d\n", charging);
- power_supply_changed(power->psy);
+ power_supply_changed(power->batt);
+ power_supply_changed(power->ac);
return NOTIFY_OK;
}
@@ -420,10 +471,17 @@ static int macsmc_power_probe(struct platform_device *pdev)
apple_smc_write_u8(power->smc, SMC_KEY(CH0B), 0);
psy_cfg.drv_data = power;
- power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg);
- if (IS_ERR(power->psy)) {
- dev_err(&pdev->dev, "Failed to register power supply\n");
- ret = PTR_ERR(power->psy);
+ power->batt = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg);
+ if (IS_ERR(power->batt)) {
+ dev_err(&pdev->dev, "Failed to register battery\n");
+ ret = PTR_ERR(power->batt);
+ return ret;
+ }
+
+ power->ac = devm_power_supply_register(&pdev->dev, &macsmc_ac_desc, &psy_cfg);
+ if (IS_ERR(power->ac)) {
+ dev_err(&pdev->dev, "Failed to register AC adapter\n");
+ ret = PTR_ERR(power->ac);
return ret;
}
--
2.34.1