Lines Matching refs:bwmon

332 static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all)  in bwmon_clear_counters()  argument
346 regmap_field_force_write(bwmon->regs[F_CLEAR], val); in bwmon_clear_counters()
347 if (bwmon->data->quirks & BWMON_NEEDS_FORCE_CLEAR) in bwmon_clear_counters()
348 regmap_field_force_write(bwmon->regs[F_CLEAR], 0); in bwmon_clear_counters()
351 static void bwmon_clear_irq(struct icc_bwmon *bwmon) in bwmon_clear_irq() argument
369 regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], BWMON_IRQ_ENABLE_MASK); in bwmon_clear_irq()
370 if (bwmon->data->quirks & BWMON_NEEDS_FORCE_CLEAR) in bwmon_clear_irq()
371 regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], 0); in bwmon_clear_irq()
372 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) in bwmon_clear_irq()
373 regmap_field_force_write(bwmon->regs[F_GLOBAL_IRQ_CLEAR], in bwmon_clear_irq()
377 static void bwmon_disable(struct icc_bwmon *bwmon) in bwmon_disable() argument
380 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) in bwmon_disable()
381 regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], 0x0); in bwmon_disable()
382 regmap_field_write(bwmon->regs[F_IRQ_ENABLE], 0x0); in bwmon_disable()
388 regmap_field_write(bwmon->regs[F_ENABLE], 0x0); in bwmon_disable()
391 static void bwmon_enable(struct icc_bwmon *bwmon, unsigned int irq_enable) in bwmon_enable() argument
394 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ) in bwmon_enable()
395 regmap_field_write(bwmon->regs[F_GLOBAL_IRQ_ENABLE], in bwmon_enable()
397 regmap_field_write(bwmon->regs[F_IRQ_ENABLE], irq_enable); in bwmon_enable()
400 regmap_field_write(bwmon->regs[F_ENABLE], BWMON_ENABLE_ENABLE); in bwmon_enable()
403 static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon, in bwmon_kbps_to_count() argument
406 return kbps / bwmon->data->count_unit_kb; in bwmon_kbps_to_count()
409 static void bwmon_set_threshold(struct icc_bwmon *bwmon, in bwmon_set_threshold() argument
414 thres = mult_frac(bwmon_kbps_to_count(bwmon, kbps), in bwmon_set_threshold()
415 bwmon->data->sample_ms, MSEC_PER_SEC); in bwmon_set_threshold()
419 static void bwmon_start(struct icc_bwmon *bwmon) in bwmon_start() argument
421 const struct icc_bwmon_data *data = bwmon->data; in bwmon_start()
424 bwmon_clear_counters(bwmon, true); in bwmon_start()
426 window = mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC); in bwmon_start()
428 regmap_field_write(bwmon->regs[F_SAMPLE_WINDOW], window); in bwmon_start()
430 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], in bwmon_start()
432 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], in bwmon_start()
434 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_LOW], in bwmon_start()
437 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE0], in bwmon_start()
439 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE1], in bwmon_start()
441 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE2], in bwmon_start()
443 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE3], in bwmon_start()
446 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE0], in bwmon_start()
448 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE1], in bwmon_start()
450 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE2], in bwmon_start()
452 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE3], in bwmon_start()
455 bwmon_clear_irq(bwmon); in bwmon_start()
456 bwmon_enable(bwmon, BWMON_IRQ_ENABLE_MASK); in bwmon_start()
461 struct icc_bwmon *bwmon = dev_id; in bwmon_intr() local
465 if (regmap_field_read(bwmon->regs[F_IRQ_STATUS], &status)) in bwmon_intr()
482 bwmon_disable(bwmon); in bwmon_intr()
490 if (regmap_field_read(bwmon->regs[F_ZONE0_MAX + zone], &max)) in bwmon_intr()
494 max *= bwmon->data->count_unit_kb; in bwmon_intr()
495 bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms); in bwmon_intr()
502 struct icc_bwmon *bwmon = dev_id; in bwmon_intr_thread() local
507 bw_kbps = bwmon->target_kbps; in bwmon_intr_thread()
509 target_opp = dev_pm_opp_find_bw_ceil(bwmon->dev, &bw_kbps, 0); in bwmon_intr_thread()
511 target_opp = dev_pm_opp_find_bw_floor(bwmon->dev, &bw_kbps, 0); in bwmon_intr_thread()
513 bwmon->target_kbps = bw_kbps; in bwmon_intr_thread()
516 opp = dev_pm_opp_find_bw_floor(bwmon->dev, &bw_kbps, 0); in bwmon_intr_thread()
518 down_kbps = bwmon->target_kbps; in bwmon_intr_thread()
522 up_kbps = bwmon->target_kbps + 1; in bwmon_intr_thread()
524 if (bwmon->target_kbps >= bwmon->max_bw_kbps) in bwmon_intr_thread()
526 else if (bwmon->target_kbps <= bwmon->min_bw_kbps) in bwmon_intr_thread()
531 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], in bwmon_intr_thread()
533 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], in bwmon_intr_thread()
535 bwmon_clear_counters(bwmon, false); in bwmon_intr_thread()
536 bwmon_clear_irq(bwmon); in bwmon_intr_thread()
537 bwmon_enable(bwmon, irq_enable); in bwmon_intr_thread()
539 if (bwmon->target_kbps == bwmon->current_kbps) in bwmon_intr_thread()
542 dev_pm_opp_set_opp(bwmon->dev, target_opp); in bwmon_intr_thread()
543 bwmon->current_kbps = bwmon->target_kbps; in bwmon_intr_thread()
554 struct icc_bwmon *bwmon) in bwmon_init_regmap() argument
565 map = devm_regmap_init_mmio(dev, base, bwmon->data->regmap_cfg); in bwmon_init_regmap()
573 return devm_regmap_field_bulk_alloc(dev, map, bwmon->regs, in bwmon_init_regmap()
574 bwmon->data->regmap_fields, in bwmon_init_regmap()
582 struct icc_bwmon *bwmon; in bwmon_probe() local
585 bwmon = devm_kzalloc(dev, sizeof(*bwmon), GFP_KERNEL); in bwmon_probe()
586 if (!bwmon) in bwmon_probe()
589 bwmon->data = of_device_get_match_data(dev); in bwmon_probe()
591 ret = bwmon_init_regmap(pdev, bwmon); in bwmon_probe()
595 bwmon->irq = platform_get_irq(pdev, 0); in bwmon_probe()
596 if (bwmon->irq < 0) in bwmon_probe()
597 return bwmon->irq; in bwmon_probe()
603 bwmon->max_bw_kbps = UINT_MAX; in bwmon_probe()
604 opp = dev_pm_opp_find_bw_floor(dev, &bwmon->max_bw_kbps, 0); in bwmon_probe()
608 bwmon->min_bw_kbps = 0; in bwmon_probe()
609 opp = dev_pm_opp_find_bw_ceil(dev, &bwmon->min_bw_kbps, 0); in bwmon_probe()
613 bwmon->dev = dev; in bwmon_probe()
615 bwmon_disable(bwmon); in bwmon_probe()
616 ret = devm_request_threaded_irq(dev, bwmon->irq, bwmon_intr, in bwmon_probe()
618 IRQF_ONESHOT, dev_name(dev), bwmon); in bwmon_probe()
622 platform_set_drvdata(pdev, bwmon); in bwmon_probe()
623 bwmon_start(bwmon); in bwmon_probe()
630 struct icc_bwmon *bwmon = platform_get_drvdata(pdev); in bwmon_remove() local
632 bwmon_disable(bwmon); in bwmon_remove()