static int devfreq_throughput_handler(struct devfreq *devfreq, unsigned int event, void *data) { switch (event) { case DEVFREQ_GOV_START: devfreq_monitor_start(devfreq); break; case DEVFREQ_GOV_STOP: devfreq_monitor_stop(devfreq); 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_watermark_event_handler(struct devfreq *df, unsigned int event, void *wmark_type) { int ret = 0; struct wmark_gov_info *wmarkinfo = df->data; enum watermark_type *type = wmark_type; switch (event) { case DEVFREQ_GOV_START: devfreq_watermark_start(df); wmarkinfo = df->data; if (df->profile->set_low_wmark) df->profile->set_low_wmark(df->dev.parent, wmarkinfo->p_low_wmark); if (df->profile->set_high_wmark) df->profile->set_high_wmark(df->dev.parent, wmarkinfo->p_high_wmark); break; case DEVFREQ_GOV_STOP: devfreq_watermark_debug_stop(df); break; case DEVFREQ_GOV_SUSPEND: devfreq_monitor_suspend(df); break; case DEVFREQ_GOV_RESUME: if (df->profile->set_low_wmark) df->profile->set_low_wmark(df->dev.parent, wmarkinfo->p_low_wmark); if (df->profile->set_high_wmark) df->profile->set_high_wmark(df->dev.parent, wmarkinfo->p_high_wmark); devfreq_monitor_resume(df); break; case DEVFREQ_GOV_WMARK: /* Set watermark interrupt type */ wmarkinfo->event = *type; mutex_lock(&df->lock); update_devfreq(df); mutex_unlock(&df->lock); break; default: break; } return ret; }
static int devfreq_watermark_event_handler(struct devfreq *df, unsigned int event, void *wmark_type) { int ret = 0; switch (event) { case DEVFREQ_GOV_START: { struct devfreq_dev_status dev_stat; ret = df->profile->get_dev_status(df->dev.parent, &dev_stat); if (ret < 0) break; ret = devfreq_watermark_start(df); if (ret < 0) break; update_watermarks(df, dev_stat.current_frequency, dev_stat.current_frequency); break; } case DEVFREQ_GOV_STOP: devfreq_watermark_debug_stop(df); break; case DEVFREQ_GOV_SUSPEND: devfreq_monitor_suspend(df); break; case DEVFREQ_GOV_RESUME: { struct devfreq_dev_status dev_stat; ret = df->profile->get_dev_status(df->dev.parent, &dev_stat); if (ret < 0) break; update_watermarks(df, dev_stat.current_frequency, dev_stat.current_frequency); devfreq_monitor_resume(df); break; } case DEVFREQ_GOV_WMARK: mutex_lock(&df->lock); update_devfreq(df); mutex_unlock(&df->lock); break; default: break; } return ret; }
static void stop_monitor(struct devfreq *df, bool init) { struct hwmon_node *node = df->data; struct bw_hwmon *hw = node->hw; node->mon_started = false; if (init) { devfreq_monitor_stop(df); hw->stop_hwmon(hw); } else { devfreq_monitor_suspend(df); hw->suspend_hwmon(hw); } }
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; }