static int cpubw_hwmon_driver_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; int ret; l2pm_irq = platform_get_irq(pdev, 0); if (l2pm_irq < 0) { pr_err("Unable to get IRQ number\n"); return l2pm_irq; } ret = of_property_read_u32(dev->of_node, "qcom,bytes-per-beat", &bytes_per_beat); if (ret) { pr_err("Unable to read bytes per beat\n"); return ret; } ret = devfreq_add_governor(&devfreq_cpubw_hwmon); if (ret) { pr_err("devfreq governor registration failed\n"); return ret; } return 0; }
static int __init msm_adreno_tz_init(void) { return devfreq_add_governor(&msm_adreno_tz); }
static int __init devfreq_simple_usage_init(void) { return devfreq_add_governor(&devfreq_simple_usage); }
static int __init devfreq_userspace_init(void) { return devfreq_add_governor(&devfreq_userspace); }
static int __init devfreq_throughput_init(void) { return devfreq_add_governor(&devfreq_throughput); }
static int __init devfreq_vbif_init(void) { return devfreq_add_governor(&devfreq_vbif); }
static int __init devfreq_simple_exynos_init(void) { return devfreq_add_governor(&devfreq_simple_exynos); }
static int __init podgov_init(void) { return devfreq_add_governor(&nvhost_podgov); }
static int __init devfreq_watermark_init(void) { return devfreq_add_governor(&devfreq_watermark_active); }
static int __init devfreq_performance_init(void) { return devfreq_add_governor(&devfreq_performance); }
static int __init devfreq_gpubw_init(void) { return devfreq_add_governor(&devfreq_gpubw); }
int register_bw_hwmon(struct device *dev, struct bw_hwmon *hwmon) { int ret = 0; struct hwmon_node *node; struct attribute_group *attr_grp; if (!hwmon->gov && !hwmon->dev && !hwmon->of_node) return -EINVAL; node = devm_kzalloc(dev, sizeof(*node), GFP_KERNEL); if (!node) { dev_err(dev, "Unable to register gov. Out of memory!\n"); return -ENOMEM; } if (hwmon->gov) { attr_grp = devm_kzalloc(dev, sizeof(*attr_grp), GFP_KERNEL); if (!attr_grp) return -ENOMEM; hwmon->gov->get_target_freq = devfreq_bw_hwmon_get_freq; hwmon->gov->event_handler = devfreq_bw_hwmon_ev_handler; attr_grp->name = hwmon->gov->name; attr_grp->attrs = dev_attr; node->gov = hwmon->gov; node->attr_grp = attr_grp; } else { node->gov = &devfreq_gov_bw_hwmon; node->attr_grp = &dev_attr_group; } node->guard_band_mbps = 100; node->decay_rate = 90; node->io_percent = 16; node->low_power_ceil_mbps = 0; node->low_power_io_percent = 16; node->low_power_delay = 60; node->bw_step = 190; node->sample_ms = 50; node->up_scale = 0; node->up_thres = 10; node->down_thres = 0; node->down_count = 3; node->hist_memory = 0; node->hyst_trigger_count = 3; node->hyst_length = 0; node->idle_mbps = 400; node->mbps_zones[0] = 0; node->hw = hwmon; mutex_lock(&list_lock); list_add_tail(&node->list, &hwmon_list); mutex_unlock(&list_lock); if (hwmon->gov) { ret = devfreq_add_governor(hwmon->gov); } else { mutex_lock(&state_lock); if (!use_cnt) ret = devfreq_add_governor(&devfreq_gov_bw_hwmon); if (!ret) use_cnt++; mutex_unlock(&state_lock); } if (!ret) dev_info(dev, "BW HWmon governor registered.\n"); else dev_err(dev, "BW HWmon governor registration failed!\n"); return ret; }