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 start_monitor(struct devfreq *df, bool init) { struct hwmon_node *node = df->data; struct bw_hwmon *hw = node->hw; struct device *dev = df->dev.parent; unsigned long mbps; int ret; node->prev_ts = ktime_get(); if (init) { node->prev_ab = 0; node->resume_freq = 0; node->resume_ab = 0; mbps = (df->previous_freq * node->io_percent) / 100; ret = hw->start_hwmon(hw, mbps); } else { ret = hw->resume_hwmon(hw); } if (ret) { dev_err(dev, "Unable to start HW monitor! (%d)\n", ret); return ret; } if (init) devfreq_monitor_start(df); else devfreq_monitor_resume(df); node->mon_started = true; 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 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; }