Skip to content

Commit d0773ec

Browse files
marcanjannau
authored andcommitted
power: supply: macsmc_power: Add a debug mode to print power usage
Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent c093775 commit d0773ec

1 file changed

Lines changed: 80 additions & 1 deletion

File tree

drivers/power/supply/macsmc_power.c

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)