static int devfreq_cpubw_hwmon_ev_handler(struct devfreq *df, unsigned int event, void *data) { int ret; switch (event) { case DEVFREQ_GOV_START: ret = start_monitoring(df); if (ret) return ret; ret = sysfs_create_group(&df->dev.kobj, &dev_attr_group); if (ret) return ret; devfreq_monitor_start(df); pr_debug("Enabled CPU BW HW monitor governor\n"); break; case DEVFREQ_GOV_STOP: sysfs_remove_group(&df->dev.kobj, &dev_attr_group); devfreq_monitor_stop(df); *(unsigned long *)df->data = 0; stop_monitoring(df); pr_debug("Disabled CPU BW HW monitor governor\n"); break; case DEVFREQ_GOV_INTERVAL: devfreq_interval_update(df, (unsigned int *)data); break; } return 0; }
static int devfreq_simple_usage_handler(struct devfreq *devfreq, unsigned int event, void *data) { int ret; switch (event) { case DEVFREQ_GOV_START: ret = devfreq_simple_usage_register_notifier(devfreq); if (ret) return ret; devfreq_monitor_start(devfreq); break; case DEVFREQ_GOV_STOP: devfreq_monitor_stop(devfreq); ret = devfreq_simple_usage_unregister_notifier(devfreq); if (ret) return ret; break; case DEVFREQ_GOV_INTERVAL: devfreq_interval_update(devfreq, (unsigned int*)data); break; case DEVFREQ_GOV_SUSPEND: devfreq_monitor_suspend(devfreq); break; case DEVFREQ_GOV_RESUME: devfreq_monitor_resume(devfreq); break; default: break; } return 0; }
static int devfreq_bw_hwmon_ev_handler(struct devfreq *df, unsigned int event, void *data) { int ret; unsigned int sample_ms; struct hwmon_node *node; struct bw_hwmon *hw; switch (event) { case DEVFREQ_GOV_START: sample_ms = df->profile->polling_ms; sample_ms = max(MIN_MS, sample_ms); sample_ms = min(MAX_MS, sample_ms); df->profile->polling_ms = sample_ms; ret = gov_start(df); if (ret) return ret; dev_dbg(df->dev.parent, "Enabled dev BW HW monitor governor\n"); break; case DEVFREQ_GOV_STOP: gov_stop(df); dev_dbg(df->dev.parent, "Disabled dev BW HW monitor governor\n"); break; case DEVFREQ_GOV_INTERVAL: sample_ms = *(unsigned int *)data; sample_ms = max(MIN_MS, sample_ms); sample_ms = min(MAX_MS, sample_ms); /* * Suspend/resume the HW monitor around the interval update * to prevent the HW monitor IRQ from trying to change * stop/start the delayed workqueue while the interval update * is happening. */ node = df->data; hw = node->hw; hw->suspend_hwmon(hw); devfreq_interval_update(df, &sample_ms); ret = hw->resume_hwmon(hw); if (ret) { dev_err(df->dev.parent, "Unable to resume HW monitor (%d)\n", ret); return ret; } break; case DEVFREQ_GOV_SUSPEND: ret = gov_suspend(df); if (ret) { dev_err(df->dev.parent, "Unable to suspend BW HW mon governor (%d)\n", ret); return ret; } dev_dbg(df->dev.parent, "Suspended BW HW mon governor\n"); break; case DEVFREQ_GOV_RESUME: ret = gov_resume(df); if (ret) { dev_err(df->dev.parent, "Unable to resume BW HW mon governor (%d)\n", ret); return ret; } dev_dbg(df->dev.parent, "Resumed BW HW mon governor\n"); break; } return 0; }