static int tegra_cpufreq_init_once(void) { struct sched_param sp; int rc = 0; mutex_lock(&init_mutex); if (rm_cpufreq) goto clean; if (NvRmOpenNew(&rm_cpufreq)!=NvSuccess) { pr_err("%s: unable to open NvRm\n", __func__); rc = -ENOSYS; goto clean; } clk_cpu = clk_get_sys(NULL, "cpu"); if (IS_ERR(clk_cpu)) { rc = PTR_ERR(clk_cpu); clk_cpu = NULL; goto clean; } rc = register_reboot_notifier(&dfs_reboot_nb); if (rc) { pr_err("%s: unable to regsiter DVFS reboot notifier\n", __func__); goto clean; } cpufreq_dfsd = kthread_create(tegra_cpufreq_dfsd, NULL, "cpufreq-dvfsd"); if (IS_ERR(cpufreq_dfsd)) { pr_err("%s: unable to start DVFS daemon\n", __func__); rc = PTR_ERR(cpufreq_dfsd); cpufreq_dfsd = NULL; goto clean; } sp.sched_priority = KTHREAD_IRQ_PRIO + 1; if (sched_setscheduler_nocheck(cpufreq_dfsd, SCHED_FIFO, &sp) < 0) pr_err("%s: unable to elevate DVFS daemon priority\n",__func__); clean: if (rc) { if (rm_cpufreq) NvRmClose(rm_cpufreq); if (clk_cpu) clk_put(clk_cpu); clk_cpu = NULL; rm_cpufreq = NULL; unregister_reboot_notifier(&dfs_reboot_nb); } mutex_unlock(&init_mutex); return rc; }
NvError NvRmOpen(NvRmDeviceHandle *pHandle, NvU32 DeviceId) { return NvRmOpenNew(pHandle); }