Lines Matching defs:bwmon

452 static void bwmon_clear_counters(struct icc_bwmon *bwmon, bool clear_all)
466 regmap_field_force_write(bwmon->regs[F_CLEAR], val);
467 if (bwmon->data->quirks & BWMON_NEEDS_FORCE_CLEAR)
468 regmap_field_force_write(bwmon->regs[F_CLEAR], 0);
471 static void bwmon_clear_irq(struct icc_bwmon *bwmon)
475 if (bwmon->data->global_regmap_fields)
476 global_irq_clr = bwmon->global_regs[F_GLOBAL_IRQ_CLEAR];
478 global_irq_clr = bwmon->regs[F_GLOBAL_IRQ_CLEAR];
496 regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], BWMON_IRQ_ENABLE_MASK);
497 if (bwmon->data->quirks & BWMON_NEEDS_FORCE_CLEAR)
498 regmap_field_force_write(bwmon->regs[F_IRQ_CLEAR], 0);
499 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ)
504 static void bwmon_disable(struct icc_bwmon *bwmon)
508 if (bwmon->data->global_regmap_fields)
509 global_irq_en = bwmon->global_regs[F_GLOBAL_IRQ_ENABLE];
511 global_irq_en = bwmon->regs[F_GLOBAL_IRQ_ENABLE];
514 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ)
516 regmap_field_write(bwmon->regs[F_IRQ_ENABLE], 0x0);
519 * Disable bwmon. Must happen before bwmon_clear_irq() to avoid spurious
522 regmap_field_write(bwmon->regs[F_ENABLE], 0x0);
525 static void bwmon_enable(struct icc_bwmon *bwmon, unsigned int irq_enable)
529 if (bwmon->data->global_regmap_fields)
530 global_irq_en = bwmon->global_regs[F_GLOBAL_IRQ_ENABLE];
532 global_irq_en = bwmon->regs[F_GLOBAL_IRQ_ENABLE];
535 if (bwmon->data->quirks & BWMON_HAS_GLOBAL_IRQ)
539 regmap_field_write(bwmon->regs[F_IRQ_ENABLE], irq_enable);
541 /* Enable bwmon */
542 regmap_field_write(bwmon->regs[F_ENABLE], BWMON_ENABLE_ENABLE);
545 static unsigned int bwmon_kbps_to_count(struct icc_bwmon *bwmon,
548 return kbps / bwmon->data->count_unit_kb;
551 static void bwmon_set_threshold(struct icc_bwmon *bwmon,
556 thres = mult_frac(bwmon_kbps_to_count(bwmon, kbps),
557 bwmon->data->sample_ms, MSEC_PER_SEC);
561 static void bwmon_start(struct icc_bwmon *bwmon)
563 const struct icc_bwmon_data *data = bwmon->data;
568 dev_pm_opp_find_bw_ceil(bwmon->dev, &bw_low, 0);
570 bwmon_clear_counters(bwmon, true);
572 window = mult_frac(bwmon->data->sample_ms, HW_TIMER_HZ, MSEC_PER_SEC);
574 regmap_field_write(bwmon->regs[F_SAMPLE_WINDOW], window);
576 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], bw_low);
577 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], bw_low);
578 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_LOW], 0);
580 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE0],
582 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE1],
584 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE2],
586 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE3],
589 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE0],
591 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE1],
593 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE2],
595 regmap_field_write(bwmon->regs[F_ZONE_ACTIONS_ZONE3],
598 bwmon_clear_irq(bwmon);
599 bwmon_enable(bwmon, BWMON_IRQ_ENABLE_MASK);
604 struct icc_bwmon *bwmon = dev_id;
608 if (regmap_field_read(bwmon->regs[F_IRQ_STATUS], &status))
625 bwmon_disable(bwmon);
633 if (regmap_field_read(bwmon->regs[F_ZONE0_MAX + zone], &max))
637 max *= bwmon->data->count_unit_kb;
638 bwmon->target_kbps = mult_frac(max, MSEC_PER_SEC, bwmon->data->sample_ms);
645 struct icc_bwmon *bwmon = dev_id;
650 bw_kbps = bwmon->target_kbps;
652 target_opp = dev_pm_opp_find_bw_ceil(bwmon->dev, &bw_kbps, 0);
654 target_opp = dev_pm_opp_find_bw_floor(bwmon->dev, &bw_kbps, 0);
656 bwmon->target_kbps = bw_kbps;
659 opp = dev_pm_opp_find_bw_floor(bwmon->dev, &bw_kbps, 0);
661 down_kbps = bwmon->target_kbps;
665 up_kbps = bwmon->target_kbps + 1;
667 if (bwmon->target_kbps >= bwmon->max_bw_kbps)
669 else if (bwmon->target_kbps <= bwmon->min_bw_kbps)
674 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH],
676 bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED],
678 bwmon_clear_counters(bwmon, false);
679 bwmon_clear_irq(bwmon);
680 bwmon_enable(bwmon, irq_enable);
682 if (bwmon->target_kbps == bwmon->current_kbps)
685 dev_pm_opp_set_opp(bwmon->dev, target_opp);
686 bwmon->current_kbps = bwmon->target_kbps;
697 struct icc_bwmon *bwmon)
708 "failed to map bwmon registers\n");
710 map = devm_regmap_init_mmio(dev, base, bwmon->data->regmap_cfg);
720 ret = devm_regmap_field_bulk_alloc(dev, map, bwmon->regs,
721 bwmon->data->regmap_fields,
726 if (bwmon->data->global_regmap_cfg) {
731 "failed to map bwmon global registers\n");
733 map = devm_regmap_init_mmio(dev, base, bwmon->data->global_regmap_cfg);
738 ret = devm_regmap_field_bulk_alloc(dev, map, bwmon->global_regs,
739 bwmon->data->global_regmap_fields,
750 struct icc_bwmon *bwmon;
753 bwmon = devm_kzalloc(dev, sizeof(*bwmon), GFP_KERNEL);
754 if (!bwmon)
757 bwmon->data = of_device_get_match_data(dev);
759 ret = bwmon_init_regmap(pdev, bwmon);
763 bwmon->irq = platform_get_irq(pdev, 0);
764 if (bwmon->irq < 0)
765 return bwmon->irq;
771 bwmon->max_bw_kbps = UINT_MAX;
772 opp = dev_pm_opp_find_bw_floor(dev, &bwmon->max_bw_kbps, 0);
776 bwmon->min_bw_kbps = 0;
777 opp = dev_pm_opp_find_bw_ceil(dev, &bwmon->min_bw_kbps, 0);
781 bwmon->dev = dev;
783 bwmon_disable(bwmon);
784 ret = devm_request_threaded_irq(dev, bwmon->irq, bwmon_intr,
786 IRQF_ONESHOT, dev_name(dev), bwmon);
790 platform_set_drvdata(pdev, bwmon);
791 bwmon_start(bwmon);
798 struct icc_bwmon *bwmon = platform_get_drvdata(pdev);
800 bwmon_disable(bwmon);
848 { .compatible = "qcom,msm8998-bwmon", .data = &msm8998_bwmon_data },
850 { .compatible = "qcom,sdm845-bwmon", .data = &sdm845_cpu_bwmon_data },
852 { .compatible = "qcom,sdm845-llcc-bwmon", .data = &sdm845_llcc_bwmon_data },
853 { .compatible = "qcom,sc7280-llcc-bwmon", .data = &sc7280_llcc_bwmon_data },
856 { .compatible = "qcom,sc7280-cpu-bwmon", .data = &sdm845_cpu_bwmon_data },
857 { .compatible = "qcom,sc8280xp-cpu-bwmon", .data = &sdm845_cpu_bwmon_data },
858 { .compatible = "qcom,sm8550-cpu-bwmon", .data = &sdm845_cpu_bwmon_data },
867 .name = "qcom-bwmon",