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 ---