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
@@ -333,7 +336,6 @@ static int macsmc_battery_property_is_writeable(struct power_supply *psy,
333336 }
334337}
335338
336-
337339static enum power_supply_property macsmc_battery_props [] = {
338340 POWER_SUPPLY_PROP_STATUS ,
339341 POWER_SUPPLY_PROP_PRESENT ,
@@ -374,6 +376,54 @@ static const struct power_supply_desc macsmc_battery_desc = {
374376 .num_properties = ARRAY_SIZE (macsmc_battery_props ),
375377};
376378
379+ static int macsmc_ac_get_property (struct power_supply * psy ,
380+ enum power_supply_property psp ,
381+ union power_supply_propval * val )
382+ {
383+ struct macsmc_power * power = power_supply_get_drvdata (psy );
384+ int ret = 0 ;
385+ u16 vu16 ;
386+ u32 vu32 ;
387+
388+ switch (psp ) {
389+ case POWER_SUPPLY_PROP_ONLINE :
390+ ret = apple_smc_read_u32 (power -> smc , SMC_KEY (CHIS ), & vu32 );
391+ val -> intval = !!vu32 ;
392+ break ;
393+ case POWER_SUPPLY_PROP_VOLTAGE_NOW :
394+ ret = apple_smc_read_u16 (power -> smc , SMC_KEY (AC - n ), & vu16 );
395+ val -> intval = vu16 * 1000 ;
396+ break ;
397+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT :
398+ ret = apple_smc_read_u16 (power -> smc , SMC_KEY (AC - i ), & vu16 );
399+ val -> intval = vu16 * 1000 ;
400+ break ;
401+ case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT :
402+ ret = apple_smc_read_u32 (power -> smc , SMC_KEY (ACPW ), & vu32 );
403+ val -> intval = vu32 * 1000 ;
404+ break ;
405+ default :
406+ return - EINVAL ;
407+ }
408+
409+ return ret ;
410+ }
411+
412+ static enum power_supply_property macsmc_ac_props [] = {
413+ POWER_SUPPLY_PROP_ONLINE ,
414+ POWER_SUPPLY_PROP_VOLTAGE_NOW ,
415+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT ,
416+ POWER_SUPPLY_PROP_INPUT_POWER_LIMIT ,
417+ };
418+
419+ static const struct power_supply_desc macsmc_ac_desc = {
420+ .name = "macsmc-ac" ,
421+ .type = POWER_SUPPLY_TYPE_MAINS ,
422+ .get_property = macsmc_ac_get_property ,
423+ .properties = macsmc_ac_props ,
424+ .num_properties = ARRAY_SIZE (macsmc_ac_props ),
425+ };
426+
377427static int macsmc_power_event (struct notifier_block * nb , unsigned long event , void * data )
378428{
379429 struct macsmc_power * power = container_of (nb , struct macsmc_power , nb );
@@ -382,7 +432,8 @@ static int macsmc_power_event(struct notifier_block *nb, unsigned long event, vo
382432 bool charging = (event & 0xff ) != 0 ;
383433
384434 dev_info (power -> dev , "Charging: %d\n" , charging );
385- power_supply_changed (power -> psy );
435+ power_supply_changed (power -> batt );
436+ power_supply_changed (power -> ac );
386437
387438 return NOTIFY_OK ;
388439 }
@@ -419,10 +470,17 @@ static int macsmc_power_probe(struct platform_device *pdev)
419470 apple_smc_write_u8 (power -> smc , SMC_KEY (CH0B ), 0 );
420471
421472 psy_cfg .drv_data = power ;
422- power -> psy = devm_power_supply_register (& pdev -> dev , & macsmc_battery_desc , & psy_cfg );
423- if (IS_ERR (power -> psy )) {
424- dev_err (& pdev -> dev , "Failed to register power supply\n" );
425- ret = PTR_ERR (power -> psy );
473+ power -> batt = devm_power_supply_register (& pdev -> dev , & macsmc_battery_desc , & psy_cfg );
474+ if (IS_ERR (power -> batt )) {
475+ dev_err (& pdev -> dev , "Failed to register battery\n" );
476+ ret = PTR_ERR (power -> batt );
477+ return ret ;
478+ }
479+
480+ power -> ac = devm_power_supply_register (& pdev -> dev , & macsmc_ac_desc , & psy_cfg );
481+ if (IS_ERR (power -> ac )) {
482+ dev_err (& pdev -> dev , "Failed to register AC adapter\n" );
483+ ret = PTR_ERR (power -> ac );
426484 return ret ;
427485 }
428486
0 commit comments