1717struct 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-
338340static 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+
378428static 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