mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-22 21:26:59 +08:00
138 lines
4.2 KiB
Diff
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
|
|
|