static void exynos5_int_exit(struct device *dev) { struct platform_device *pdev = container_of(dev, struct platform_device, dev); struct busfreq_data_int *data = platform_get_drvdata(pdev); devfreq_unregister_opp_notifier(dev, data->devfreq); }
void kbase_devfreq_term(struct kbase_device *kbdev) { int err; dev_dbg(kbdev->dev, "Term Mali devfreq\n"); #ifdef CONFIG_DEVFREQ_THERMAL devfreq_cooling_unregister(kbdev->devfreq_cooling); #endif devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq); err = devfreq_remove_device(kbdev->devfreq); if (err) dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err); else kbdev->devfreq = NULL; }
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; }