@@ -32,8 +32,25 @@ struct macsmc_power {
3232
3333 struct work_struct critical_work ;
3434 bool shutdown_started ;
35+
36+ struct delayed_work dbg_log_work ;
37+ };
38+
39+ static int macsmc_log_power_set (const char * val , const struct kernel_param * kp );
40+
41+ static const struct kernel_param_ops macsmc_log_power_ops = {
42+ .set = macsmc_log_power_set ,
43+ .get = param_get_bool ,
3544};
3645
46+ static bool log_power = false;
47+ module_param_cb (log_power , & macsmc_log_power_ops , & log_power , 0644 );
48+ MODULE_PARM_DESC (log_power , "Periodically log power consumption for debugging" );
49+
50+ #define POWER_LOG_INTERVAL (HZ)
51+
52+ static struct macsmc_power * g_power ;
53+
3754#define CHNC_BATTERY_FULL BIT(0)
3855#define CHNC_NO_CHARGER BIT(7)
3956#define CHNC_NOCHG_CH0C BIT(14)
@@ -467,7 +484,58 @@ static const struct power_supply_desc macsmc_ac_desc = {
467484 .num_properties = ARRAY_SIZE (macsmc_ac_props ),
468485};
469486
470- static void macsmc_power_critical_work (struct work_struct * wrk ) {
487+ static int macsmc_log_power_set (const char * val , const struct kernel_param * kp )
488+ {
489+ int ret = param_set_bool (val , kp );
490+
491+ if (ret < 0 )
492+ return ret ;
493+
494+ if (log_power && g_power )
495+ schedule_delayed_work (& g_power -> dbg_log_work , 0 );
496+
497+ return 0 ;
498+ }
499+
500+ static void macsmc_dbg_work (struct work_struct * wrk )
501+ {
502+ struct macsmc_power * power = container_of (to_delayed_work (wrk ),
503+ struct macsmc_power , dbg_log_work );
504+ int p_in = 0 , p_sys = 0 , p_3v8 = 0 , p_mpmu = 0 , p_spmu = 0 , p_clvr = 0 , p_cpu = 0 ;
505+ s32 p_bat = 0 ;
506+ s16 t_full = 0 , t_empty = 0 ;
507+ u8 charge = 0 ;
508+
509+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PDTR ), & p_in , 1000 );
510+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PSTR ), & p_sys , 1000 );
511+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PMVR ), & p_3v8 , 1000 );
512+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PHPC ), & p_cpu , 1000 );
513+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PSVR ), & p_clvr , 1000 );
514+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PPMC ), & p_mpmu , 1000 );
515+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PPSC ), & p_spmu , 1000 );
516+ apple_smc_read_s32 (power -> smc , SMC_KEY (B0AP ), & p_bat );
517+ apple_smc_read_s16 (power -> smc , SMC_KEY (B0TE ), & t_empty );
518+ apple_smc_read_s16 (power -> smc , SMC_KEY (B0TF ), & t_full );
519+ apple_smc_read_u8 (power -> smc , SMC_KEY (BUIC ), & charge );
520+
521+ #define FD3 (x ) ((x) / 1000), abs((x) % 1000)
522+
523+ dev_info (power -> dev ,
524+ "In %2d.%03dW Sys %2d.%03dW 3V8 %2d.%03dW MPMU %2d.%03dW SPMU %2d.%03dW "
525+ "CLVR %2d.%03dW CPU %2d.%03dW Batt %2d.%03dW %d%% T%s %dm\n" ,
526+ FD3 (p_in ), FD3 (p_sys ), FD3 (p_3v8 ), FD3 (p_mpmu ), FD3 (p_spmu ), FD3 (p_clvr ),
527+ FD3 (p_cpu ), FD3 (p_bat ), charge ,
528+ t_full >= 0 ? "full" : "empty" ,
529+ t_full >= 0 ? t_full : t_empty );
530+
531+ #undef FD3
532+
533+ if (log_power )
534+ schedule_delayed_work (& power -> dbg_log_work , POWER_LOG_INTERVAL );
535+ }
536+
537+ static void macsmc_power_critical_work (struct work_struct * wrk )
538+ {
471539 struct macsmc_power * power = container_of (wrk , struct macsmc_power , critical_work );
472540 int ret ;
473541 u32 bcf0 ;
@@ -610,6 +678,12 @@ static int macsmc_power_probe(struct platform_device *pdev)
610678 apple_smc_register_notifier (power -> smc , & power -> nb );
611679
612680 INIT_WORK (& power -> critical_work , macsmc_power_critical_work );
681+ INIT_DELAYED_WORK (& power -> dbg_log_work , macsmc_dbg_work );
682+
683+ g_power = power ;
684+
685+ if (log_power )
686+ schedule_delayed_work (& power -> dbg_log_work , 0 );
613687
614688 return 0 ;
615689}
@@ -618,6 +692,11 @@ static int macsmc_power_remove(struct platform_device *pdev)
618692{
619693 struct macsmc_power * power = dev_get_drvdata (& pdev -> dev );
620694
695+ cancel_work (& power -> critical_work );
696+ cancel_delayed_work (& power -> dbg_log_work );
697+
698+ g_power = NULL ;
699+
621700 apple_smc_unregister_notifier (power -> smc , & power -> nb );
622701
623702 return 0 ;
0 commit comments