Skip to content

Commit ce75747

Browse files
committed
power: supply: macsmc_power: Add AC power supply
Signed-off-by: Hector Martin <[email protected]>
1 parent f569361 commit ce75747

1 file changed

Lines changed: 66 additions & 8 deletions

File tree

drivers/power/supply/macsmc_power.c

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
struct macsmc_power {
1818
struct device *dev;
1919
struct apple_smc *smc;
20-
struct power_supply *psy;
20+
21+
struct power_supply *batt;
2122
char model_name[MAX_STRING_LENGTH];
2223
char serial_number[MAX_STRING_LENGTH];
2324
char mfg_date[MAX_STRING_LENGTH];
2425

26+
struct power_supply *ac;
27+
2528
struct notifier_block nb;
2629
};
2730

@@ -49,7 +52,7 @@ static int macsmc_battery_get_status(struct macsmc_power *power)
4952
u32 nopower_flags;
5053
u16 ac_current;
5154
int ret;
52-
55+
5356
/*
5457
* Note: there are fallbacks in case some of these SMC keys disappear in the future
5558
* 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,
334337
}
335338
}
336339

337-
338340
static enum power_supply_property macsmc_battery_props[] = {
339341
POWER_SUPPLY_PROP_STATUS,
340342
POWER_SUPPLY_PROP_PRESENT,
@@ -375,6 +377,54 @@ static const struct power_supply_desc macsmc_battery_desc = {
375377
.num_properties = ARRAY_SIZE(macsmc_battery_props),
376378
};
377379

380+
static int macsmc_ac_get_property(struct power_supply *psy,
381+
enum power_supply_property psp,
382+
union power_supply_propval *val)
383+
{
384+
struct macsmc_power *power = power_supply_get_drvdata(psy);
385+
int ret = 0;
386+
u16 vu16;
387+
u32 vu32;
388+
389+
switch (psp) {
390+
case POWER_SUPPLY_PROP_ONLINE:
391+
ret = apple_smc_read_u32(power->smc, SMC_KEY(CHIS), &vu32);
392+
val->intval = !!vu32;
393+
break;
394+
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
395+
ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-n), &vu16);
396+
val->intval = vu16 * 1000;
397+
break;
398+
case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
399+
ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-i), &vu16);
400+
val->intval = vu16 * 1000;
401+
break;
402+
case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT:
403+
ret = apple_smc_read_u32(power->smc, SMC_KEY(ACPW), &vu32);
404+
val->intval = vu32 * 1000;
405+
break;
406+
default:
407+
return -EINVAL;
408+
}
409+
410+
return ret;
411+
}
412+
413+
static enum power_supply_property macsmc_ac_props[] = {
414+
POWER_SUPPLY_PROP_ONLINE,
415+
POWER_SUPPLY_PROP_VOLTAGE_NOW,
416+
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
417+
POWER_SUPPLY_PROP_INPUT_POWER_LIMIT,
418+
};
419+
420+
static const struct power_supply_desc macsmc_ac_desc = {
421+
.name = "macsmc-ac",
422+
.type = POWER_SUPPLY_TYPE_MAINS,
423+
.get_property = macsmc_ac_get_property,
424+
.properties = macsmc_ac_props,
425+
.num_properties = ARRAY_SIZE(macsmc_ac_props),
426+
};
427+
378428
static int macsmc_power_event(struct notifier_block *nb, unsigned long event, void *data)
379429
{
380430
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
383433
bool charging = (event & 0xff) != 0;
384434

385435
dev_info(power->dev, "Charging: %d\n", charging);
386-
power_supply_changed(power->psy);
436+
power_supply_changed(power->batt);
437+
power_supply_changed(power->ac);
387438

388439
return NOTIFY_OK;
389440
}
@@ -420,10 +471,17 @@ static int macsmc_power_probe(struct platform_device *pdev)
420471
apple_smc_write_u8(power->smc, SMC_KEY(CH0B), 0);
421472

422473
psy_cfg.drv_data = power;
423-
power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg);
424-
if (IS_ERR(power->psy)) {
425-
dev_err(&pdev->dev, "Failed to register power supply\n");
426-
ret = PTR_ERR(power->psy);
474+
power->batt = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg);
475+
if (IS_ERR(power->batt)) {
476+
dev_err(&pdev->dev, "Failed to register battery\n");
477+
ret = PTR_ERR(power->batt);
478+
return ret;
479+
}
480+
481+
power->ac = devm_power_supply_register(&pdev->dev, &macsmc_ac_desc, &psy_cfg);
482+
if (IS_ERR(power->ac)) {
483+
dev_err(&pdev->dev, "Failed to register AC adapter\n");
484+
ret = PTR_ERR(power->ac);
427485
return ret;
428486
}
429487

0 commit comments

Comments
 (0)