cpufreq.c (98817a84ff1c755c347ac633ff017a623a631fad) | cpufreq.c (8cc46ae565c393f77417cb9530b1265eb50f5d2e) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/drivers/cpufreq/cpufreq.c 4 * 5 * Copyright (C) 2001 Russell King 6 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de> 7 * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org> 8 * --- 607 unchanged lines hidden (view full) --- 616 617 for_each_governor(t) 618 if (!strncasecmp(str_governor, t->name, CPUFREQ_NAME_LEN)) 619 return t; 620 621 return NULL; 622} 623 | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/drivers/cpufreq/cpufreq.c 4 * 5 * Copyright (C) 2001 Russell King 6 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de> 7 * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org> 8 * --- 607 unchanged lines hidden (view full) --- 616 617 for_each_governor(t) 618 if (!strncasecmp(str_governor, t->name, CPUFREQ_NAME_LEN)) 619 return t; 620 621 return NULL; 622} 623 |
624static struct cpufreq_governor *get_governor(const char *str_governor) 625{ 626 struct cpufreq_governor *t; 627 628 mutex_lock(&cpufreq_governor_mutex); 629 t = find_governor(str_governor); 630 if (!t) 631 goto unlock; 632 633 if (!try_module_get(t->owner)) 634 t = NULL; 635 636unlock: 637 mutex_unlock(&cpufreq_governor_mutex); 638 639 return t; 640} 641 |
|
624static unsigned int cpufreq_parse_policy(char *str_governor) 625{ 626 if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) 627 return CPUFREQ_POLICY_PERFORMANCE; 628 629 if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) 630 return CPUFREQ_POLICY_POWERSAVE; 631 632 return CPUFREQ_POLICY_UNKNOWN; 633} 634 635/** 636 * cpufreq_parse_governor - parse a governor string only for has_target() 637 * @str_governor: Governor name. 638 */ 639static struct cpufreq_governor *cpufreq_parse_governor(char *str_governor) 640{ 641 struct cpufreq_governor *t; 642 | 642static unsigned int cpufreq_parse_policy(char *str_governor) 643{ 644 if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) 645 return CPUFREQ_POLICY_PERFORMANCE; 646 647 if (!strncasecmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) 648 return CPUFREQ_POLICY_POWERSAVE; 649 650 return CPUFREQ_POLICY_UNKNOWN; 651} 652 653/** 654 * cpufreq_parse_governor - parse a governor string only for has_target() 655 * @str_governor: Governor name. 656 */ 657static struct cpufreq_governor *cpufreq_parse_governor(char *str_governor) 658{ 659 struct cpufreq_governor *t; 660 |
643 mutex_lock(&cpufreq_governor_mutex); | 661 t = get_governor(str_governor); 662 if (t) 663 return t; |
644 | 664 |
645 t = find_governor(str_governor); 646 if (!t) { 647 int ret; | 665 if (request_module("cpufreq_%s", str_governor)) 666 return NULL; |
648 | 667 |
649 mutex_unlock(&cpufreq_governor_mutex); 650 651 ret = request_module("cpufreq_%s", str_governor); 652 if (ret) 653 return NULL; 654 655 mutex_lock(&cpufreq_governor_mutex); 656 657 t = find_governor(str_governor); 658 } 659 if (t && !try_module_get(t->owner)) 660 t = NULL; 661 662 mutex_unlock(&cpufreq_governor_mutex); 663 664 return t; | 668 return get_governor(str_governor); |
665} 666 667/** 668 * cpufreq_per_cpu_attr_read() / show_##file_name() - 669 * print out cpufreq information 670 * 671 * Write out information from cpufreq_driver->policy[cpu]; object must be 672 * "unsigned int". --- 137 unchanged lines hidden (view full) --- 810 ssize_t i = 0; 811 struct cpufreq_governor *t; 812 813 if (!has_target()) { 814 i += sprintf(buf, "performance powersave"); 815 goto out; 816 } 817 | 669} 670 671/** 672 * cpufreq_per_cpu_attr_read() / show_##file_name() - 673 * print out cpufreq information 674 * 675 * Write out information from cpufreq_driver->policy[cpu]; object must be 676 * "unsigned int". --- 137 unchanged lines hidden (view full) --- 814 ssize_t i = 0; 815 struct cpufreq_governor *t; 816 817 if (!has_target()) { 818 i += sprintf(buf, "performance powersave"); 819 goto out; 820 } 821 |
822 mutex_lock(&cpufreq_governor_mutex); |
|
818 for_each_governor(t) { 819 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char)) 820 - (CPUFREQ_NAME_LEN + 2))) | 823 for_each_governor(t) { 824 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char)) 825 - (CPUFREQ_NAME_LEN + 2))) |
821 goto out; | 826 break; |
822 i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name); 823 } | 827 i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name); 828 } |
829 mutex_unlock(&cpufreq_governor_mutex); |
|
824out: 825 i += sprintf(&buf[i], "\n"); 826 return i; 827} 828 829ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf) 830{ 831 ssize_t i = 0; --- 221 unchanged lines hidden (view full) --- 1053 return NULL; 1054} 1055 1056static int cpufreq_init_policy(struct cpufreq_policy *policy) 1057{ 1058 struct cpufreq_governor *def_gov = cpufreq_default_governor(); 1059 struct cpufreq_governor *gov = NULL; 1060 unsigned int pol = CPUFREQ_POLICY_UNKNOWN; | 830out: 831 i += sprintf(&buf[i], "\n"); 832 return i; 833} 834 835ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf) 836{ 837 ssize_t i = 0; --- 221 unchanged lines hidden (view full) --- 1059 return NULL; 1060} 1061 1062static int cpufreq_init_policy(struct cpufreq_policy *policy) 1063{ 1064 struct cpufreq_governor *def_gov = cpufreq_default_governor(); 1065 struct cpufreq_governor *gov = NULL; 1066 unsigned int pol = CPUFREQ_POLICY_UNKNOWN; |
1067 int ret; |
|
1061 1062 if (has_target()) { 1063 /* Update policy governor to the one used before hotplug. */ | 1068 1069 if (has_target()) { 1070 /* Update policy governor to the one used before hotplug. */ |
1064 gov = find_governor(policy->last_governor); | 1071 gov = get_governor(policy->last_governor); |
1065 if (gov) { 1066 pr_debug("Restoring governor %s for cpu %d\n", 1067 policy->governor->name, policy->cpu); 1068 } else if (def_gov) { 1069 gov = def_gov; | 1072 if (gov) { 1073 pr_debug("Restoring governor %s for cpu %d\n", 1074 policy->governor->name, policy->cpu); 1075 } else if (def_gov) { 1076 gov = def_gov; |
1077 __module_get(gov->owner); |
|
1070 } else { 1071 return -ENODATA; 1072 } 1073 } else { 1074 /* Use the default policy if there is no last_policy. */ 1075 if (policy->last_policy) { 1076 pol = policy->last_policy; 1077 } else if (def_gov) { --- 6 unchanged lines hidden (view full) --- 1084 if (pol == CPUFREQ_POLICY_UNKNOWN) 1085 pol = policy->policy; 1086 } 1087 if (pol != CPUFREQ_POLICY_PERFORMANCE && 1088 pol != CPUFREQ_POLICY_POWERSAVE) 1089 return -ENODATA; 1090 } 1091 | 1078 } else { 1079 return -ENODATA; 1080 } 1081 } else { 1082 /* Use the default policy if there is no last_policy. */ 1083 if (policy->last_policy) { 1084 pol = policy->last_policy; 1085 } else if (def_gov) { --- 6 unchanged lines hidden (view full) --- 1092 if (pol == CPUFREQ_POLICY_UNKNOWN) 1093 pol = policy->policy; 1094 } 1095 if (pol != CPUFREQ_POLICY_PERFORMANCE && 1096 pol != CPUFREQ_POLICY_POWERSAVE) 1097 return -ENODATA; 1098 } 1099 |
1092 return cpufreq_set_policy(policy, gov, pol); | 1100 ret = cpufreq_set_policy(policy, gov, pol); 1101 if (gov) 1102 module_put(gov->owner); 1103 1104 return ret; |
1093} 1094 1095static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) 1096{ 1097 int ret = 0; 1098 1099 /* Has this CPU been taken care of already? */ 1100 if (cpumask_test_cpu(cpu, policy->cpus)) --- 1695 unchanged lines hidden --- | 1105} 1106 1107static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) 1108{ 1109 int ret = 0; 1110 1111 /* Has this CPU been taken care of already? */ 1112 if (cpumask_test_cpu(cpu, policy->cpus)) --- 1695 unchanged lines hidden --- |