static int start_monitoring(struct devfreq *df) { int ret, mbyte; ret = request_threaded_irq(l2pm_irq, NULL, mon_intr_handler, IRQF_ONESHOT | IRQF_SHARED, "cpubw_hwmon", df); if (ret) { pr_err("Unable to register interrupt handler\n"); return ret; } mon_init(); mon_disable(RD_MON); mon_disable(WR_MON); mbyte = (df->previous_freq * io_percent) / (2 * 100); prev_r_start_val = mon_set_limit_mbyte(RD_MON, mbyte); prev_w_start_val = mon_set_limit_mbyte(WR_MON, mbyte); prev_ts = ktime_get(); prev_ab = 0; mon_irq_enable(RD_MON, true); mon_irq_enable(WR_MON, true); mon_enable(RD_MON); mon_enable(WR_MON); global_mon_enable(true); return 0; }
static void stop_monitoring(struct devfreq *df) { global_mon_enable(false); mon_disable(RD_MON); mon_disable(WR_MON); mon_irq_enable(RD_MON, false); mon_irq_enable(WR_MON, false); disable_irq(l2pm_irq); free_irq(l2pm_irq, df); }
static int start_bw_hwmon(struct bw_hwmon *hw, unsigned long mbps) { struct bwmon *m = to_bwmon(hw); u32 limit; int ret; ret = request_threaded_irq(m->irq, NULL, bwmon_intr_handler, IRQF_ONESHOT | IRQF_SHARED, dev_name(m->dev), m); if (ret) { dev_err(m->dev, "Unable to register interrupt handler! (%d)\n", ret); return ret; } mon_disable(m); limit = mbps_to_bytes(mbps, hw->df->profile->polling_ms, 0); mon_set_limit(m, limit); mon_clear(m); mon_irq_clear(m); mon_irq_enable(m); mon_enable(m); return 0; }
static int resume_bw_hwmon(struct bw_hwmon *hw) { struct bwmon *m = to_bwmon(hw); mon_clear(m); mon_irq_enable(m); mon_enable(m); enable_irq(m->irq); return 0; }
static int resume_bw_hwmon(struct bw_hwmon *hw) { struct bwmon *m = to_bwmon(hw); int ret; mon_clear(m); mon_irq_enable(m); mon_enable(m); ret = request_threaded_irq(m->irq, NULL, bwmon_intr_handler, IRQF_ONESHOT | IRQF_SHARED, dev_name(m->dev), m); if (ret) { dev_err(m->dev, "Unable to register interrupt handler! (%d)\n", ret); return ret; } return 0; }