/** * devfreq_cooling_register() - Register devfreq cooling device. * @df: Pointer to devfreq device. */ struct thermal_cooling_device *devfreq_cooling_register(struct devfreq *df) { return of_devfreq_cooling_register(NULL, df); }
int kbase_devfreq_init(struct kbase_device *kbdev) { struct devfreq_dev_profile *dp; int err; dev_dbg(kbdev->dev, "Init Mali devfreq\n"); if (!kbdev->clock) return -ENODEV; dp = &kbdev->devfreq_profile; dp->initial_freq = clk_get_rate(kbdev->clock); dp->polling_ms = 1000; dp->target = kbase_devfreq_target; dp->get_dev_status = kbase_devfreq_status; dp->get_cur_freq = kbase_devfreq_cur_freq; dp->exit = kbase_devfreq_exit; if (kbase_devfreq_init_freq_table(kbdev, dp)) return -EFAULT; kbdev->devfreq = devfreq_add_device(kbdev->dev, dp, "simple_ondemand", NULL); if (IS_ERR_OR_NULL(kbdev->devfreq)) { kbase_devfreq_term_freq_table(kbdev); return PTR_ERR(kbdev->devfreq); } err = devfreq_register_opp_notifier(kbdev->dev, kbdev->devfreq); if (err) { dev_err(kbdev->dev, "Failed to register OPP notifier (%d)\n", err); goto opp_notifier_failed; } #ifdef CONFIG_DEVFREQ_THERMAL kbdev->devfreq_cooling = of_devfreq_cooling_register( kbdev->dev->of_node, kbdev->devfreq); if (IS_ERR_OR_NULL(kbdev->devfreq_cooling)) { err = PTR_ERR(kbdev->devfreq_cooling); dev_err(kbdev->dev, "Failed to register cooling device (%d)\n", err); goto cooling_failed; } #ifdef CONFIG_MALI_POWER_ACTOR err = mali_pa_init(kbdev); if (err) { dev_err(kbdev->dev, "Failed to init power actor\n"); goto pa_failed; } #endif #endif return 0; #ifdef CONFIG_DEVFREQ_THERMAL #ifdef CONFIG_MALI_POWER_ACTOR pa_failed: devfreq_cooling_unregister(kbdev->devfreq_cooling); #endif /* CONFIG_MALI_POWER_ACTOR */ cooling_failed: devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq); #endif /* CONFIG_DEVFREQ_THERMAL */ opp_notifier_failed: err = devfreq_remove_device(kbdev->devfreq); if (err) dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err); else kbdev->devfreq = NULL; return err; }