@@ -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)
@@ -466,7 +483,58 @@ static const struct power_supply_desc macsmc_ac_desc = {
466483 .num_properties = ARRAY_SIZE (macsmc_ac_props ),
467484};
468485
469- static void macsmc_power_critical_work (struct work_struct * wrk ) {
486+ static int macsmc_log_power_set (const char * val , const struct kernel_param * kp )
487+ {
488+ int ret = param_set_bool (val , kp );
489+
490+ if (ret < 0 )
491+ return ret ;
492+
493+ if (log_power && g_power )
494+ schedule_delayed_work (& g_power -> dbg_log_work , 0 );
495+
496+ return 0 ;
497+ }
498+
499+ static void macsmc_dbg_work (struct work_struct * wrk )
500+ {
501+ struct macsmc_power * power = container_of (to_delayed_work (wrk ),
502+ struct macsmc_power , dbg_log_work );
503+ int p_in = 0 , p_sys = 0 , p_3v8 = 0 , p_mpmu = 0 , p_spmu = 0 , p_clvr = 0 , p_cpu = 0 ;
504+ s32 p_bat = 0 ;
505+ s16 t_full = 0 , t_empty = 0 ;
506+ u8 charge = 0 ;
507+
508+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PDTR ), & p_in , 1000 );
509+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PSTR ), & p_sys , 1000 );
510+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PMVR ), & p_3v8 , 1000 );
511+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PHPC ), & p_cpu , 1000 );
512+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PSVR ), & p_clvr , 1000 );
513+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PPMC ), & p_mpmu , 1000 );
514+ apple_smc_read_f32_scaled (power -> smc , SMC_KEY (PPSC ), & p_spmu , 1000 );
515+ apple_smc_read_s32 (power -> smc , SMC_KEY (B0AP ), & p_bat );
516+ apple_smc_read_s16 (power -> smc , SMC_KEY (B0TE ), & t_empty );
517+ apple_smc_read_s16 (power -> smc , SMC_KEY (B0TF ), & t_full );
518+ apple_smc_read_u8 (power -> smc , SMC_KEY (BUIC ), & charge );
519+
520+ #define FD3 (x ) ((x) / 1000), abs((x) % 1000)
521+
522+ dev_info (power -> dev ,
523+ "In %2d.%03dW Sys %2d.%03dW 3V8 %2d.%03dW MPMU %2d.%03dW SPMU %2d.%03dW "
524+ "CLVR %2d.%03dW CPU %2d.%03dW Batt %2d.%03dW %d%% T%s %dm\n" ,
525+ FD3 (p_in ), FD3 (p_sys ), FD3 (p_3v8 ), FD3 (p_mpmu ), FD3 (p_spmu ), FD3 (p_clvr ),
526+ FD3 (p_cpu ), FD3 (p_bat ), charge ,
527+ t_full >= 0 ? "full" : "empty" ,
528+ t_full >= 0 ? t_full : t_empty );
529+
530+ #undef FD3
531+
532+ if (log_power )
533+ schedule_delayed_work (& power -> dbg_log_work , POWER_LOG_INTERVAL );
534+ }
535+
536+ static void macsmc_power_critical_work (struct work_struct * wrk )
537+ {
470538 struct macsmc_power * power = container_of (wrk , struct macsmc_power , critical_work );
471539 int ret ;
472540 u32 bcf0 ;
@@ -609,6 +677,12 @@ static int macsmc_power_probe(struct platform_device *pdev)
609677 apple_smc_register_notifier (power -> smc , & power -> nb );
610678
611679 INIT_WORK (& power -> critical_work , macsmc_power_critical_work );
680+ INIT_DELAYED_WORK (& power -> dbg_log_work , macsmc_dbg_work );
681+
682+ g_power = power ;
683+
684+ if (log_power )
685+ schedule_delayed_work (& power -> dbg_log_work , 0 );
612686
613687 return 0 ;
614688}
@@ -617,6 +691,11 @@ static void macsmc_power_remove(struct platform_device *pdev)
617691{
618692 struct macsmc_power * power = dev_get_drvdata (& pdev -> dev );
619693
694+ cancel_work (& power -> critical_work );
695+ cancel_delayed_work (& power -> dbg_log_work );
696+
697+ g_power = NULL ;
698+
620699 apple_smc_unregister_notifier (power -> smc , & power -> nb );
621700}
622701
0 commit comments