LCOV - code coverage report
Current view: top level - drivers/cpufreq - cpufreq.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 347 795 43.6 %
Date: 2014-04-16 Functions: 32 83 38.6 %
Branches: 198 584 33.9 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/drivers/cpufreq/cpufreq.c
       3                 :            :  *
       4                 :            :  *  Copyright (C) 2001 Russell King
       5                 :            :  *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
       6                 :            :  *            (C) 2013 Viresh Kumar <viresh.kumar@linaro.org>
       7                 :            :  *
       8                 :            :  *  Oct 2005 - Ashok Raj <ashok.raj@intel.com>
       9                 :            :  *      Added handling for CPU hotplug
      10                 :            :  *  Feb 2006 - Jacob Shin <jacob.shin@amd.com>
      11                 :            :  *      Fix handling for CPU hotplug -- affected CPUs
      12                 :            :  *
      13                 :            :  * This program is free software; you can redistribute it and/or modify
      14                 :            :  * it under the terms of the GNU General Public License version 2 as
      15                 :            :  * published by the Free Software Foundation.
      16                 :            :  */
      17                 :            : 
      18                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      19                 :            : 
      20                 :            : #include <linux/cpu.h>
      21                 :            : #include <linux/cpufreq.h>
      22                 :            : #include <linux/delay.h>
      23                 :            : #include <linux/device.h>
      24                 :            : #include <linux/init.h>
      25                 :            : #include <linux/kernel_stat.h>
      26                 :            : #include <linux/module.h>
      27                 :            : #include <linux/mutex.h>
      28                 :            : #include <linux/slab.h>
      29                 :            : #include <linux/syscore_ops.h>
      30                 :            : #include <linux/tick.h>
      31                 :            : #include <trace/events/power.h>
      32                 :            : 
      33                 :            : /**
      34                 :            :  * The "cpufreq driver" - the arch- or hardware-dependent low
      35                 :            :  * level driver of CPUFreq support, and its spinlock. This lock
      36                 :            :  * also protects the cpufreq_cpu_data array.
      37                 :            :  */
      38                 :            : static struct cpufreq_driver *cpufreq_driver;
      39                 :            : static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
      40                 :            : static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data_fallback);
      41                 :            : static DEFINE_RWLOCK(cpufreq_driver_lock);
      42                 :            : DEFINE_MUTEX(cpufreq_governor_lock);
      43                 :            : static LIST_HEAD(cpufreq_policy_list);
      44                 :            : 
      45                 :            : #ifdef CONFIG_HOTPLUG_CPU
      46                 :            : /* This one keeps track of the previously set governor of a removed CPU */
      47                 :            : static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
      48                 :            : #endif
      49                 :            : 
      50                 :            : static inline bool has_target(void)
      51                 :            : {
      52 [ -  + ][ #  # ]:        338 :         return cpufreq_driver->target_index || cpufreq_driver->target;
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      53                 :            : }
      54                 :            : 
      55                 :            : /*
      56                 :            :  * rwsem to guarantee that cpufreq driver module doesn't unload during critical
      57                 :            :  * sections
      58                 :            :  */
      59                 :            : static DECLARE_RWSEM(cpufreq_rwsem);
      60                 :            : 
      61                 :            : /* internal prototypes */
      62                 :            : static int __cpufreq_governor(struct cpufreq_policy *policy,
      63                 :            :                 unsigned int event);
      64                 :            : static unsigned int __cpufreq_get(unsigned int cpu);
      65                 :            : static void handle_update(struct work_struct *work);
      66                 :            : 
      67                 :            : /**
      68                 :            :  * Two notifier lists: the "policy" list is involved in the
      69                 :            :  * validation process for a new CPU frequency policy; the
      70                 :            :  * "transition" list for kernel code that needs to handle
      71                 :            :  * changes to devices when the CPU clock speed changes.
      72                 :            :  * The mutex locks both lists.
      73                 :            :  */
      74                 :            : static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
      75                 :            : static struct srcu_notifier_head cpufreq_transition_notifier_list;
      76                 :            : 
      77                 :            : static bool init_cpufreq_transition_notifier_list_called;
      78                 :          0 : static int __init init_cpufreq_transition_notifier_list(void)
      79                 :            : {
      80                 :          0 :         srcu_init_notifier_head(&cpufreq_transition_notifier_list);
      81                 :          0 :         init_cpufreq_transition_notifier_list_called = true;
      82                 :          0 :         return 0;
      83                 :            : }
      84                 :            : pure_initcall(init_cpufreq_transition_notifier_list);
      85                 :            : 
      86                 :            : static int off __read_mostly;
      87                 :            : static int cpufreq_disabled(void)
      88                 :            : {
      89                 :      45211 :         return off;
      90                 :            : }
      91                 :          0 : void disable_cpufreq(void)
      92                 :            : {
      93                 :          0 :         off = 1;
      94                 :          0 : }
      95                 :            : static LIST_HEAD(cpufreq_governor_list);
      96                 :            : static DEFINE_MUTEX(cpufreq_governor_mutex);
      97                 :            : 
      98                 :          0 : bool have_governor_per_policy(void)
      99                 :            : {
     100                 :        256 :         return !!(cpufreq_driver->flags & CPUFREQ_HAVE_GOVERNOR_PER_POLICY);
     101                 :            : }
     102                 :            : EXPORT_SYMBOL_GPL(have_governor_per_policy);
     103                 :            : 
     104                 :          0 : struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
     105                 :            : {
     106         [ +  - ]:          3 :         if (have_governor_per_policy())
     107                 :          3 :                 return &policy->kobj;
     108                 :            :         else
     109                 :          0 :                 return cpufreq_global_kobject;
     110                 :            : }
     111                 :            : EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
     112                 :            : 
     113                 :            : static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
     114                 :            : {
     115                 :            :         u64 idle_time;
     116                 :            :         u64 cur_wall_time;
     117                 :            :         u64 busy_time;
     118                 :            : 
     119                 :          0 :         cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
     120                 :            : 
     121                 :          0 :         busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
     122                 :          0 :         busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
     123                 :          0 :         busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
     124                 :          0 :         busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
     125                 :          0 :         busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
     126                 :          0 :         busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
     127                 :            : 
     128                 :          0 :         idle_time = cur_wall_time - busy_time;
     129         [ #  # ]:          0 :         if (wall)
     130                 :          0 :                 *wall = cputime_to_usecs(cur_wall_time);
     131                 :            : 
     132                 :          0 :         return cputime_to_usecs(idle_time);
     133                 :            : }
     134                 :            : 
     135                 :          0 : u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
     136                 :            : {
     137         [ -  + ]:      98359 :         u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
     138                 :            : 
     139         [ -  + ]:     196718 :         if (idle_time == -1ULL)
     140                 :          0 :                 return get_cpu_idle_time_jiffy(cpu, wall);
     141         [ +  - ]:      98359 :         else if (!io_busy)
     142                 :      98359 :                 idle_time += get_cpu_iowait_time_us(cpu, wall);
     143                 :            : 
     144                 :      98359 :         return idle_time;
     145                 :            : }
     146                 :            : EXPORT_SYMBOL_GPL(get_cpu_idle_time);
     147                 :            : 
     148                 :            : /*
     149                 :            :  * This is a generic cpufreq init() routine which can be used by cpufreq
     150                 :            :  * drivers of SMP systems. It will do following:
     151                 :            :  * - validate & show freq table passed
     152                 :            :  * - set policies transition latency
     153                 :            :  * - policy->cpus with all possible CPUs
     154                 :            :  */
     155                 :          0 : int cpufreq_generic_init(struct cpufreq_policy *policy,
     156                 :            :                 struct cpufreq_frequency_table *table,
     157                 :            :                 unsigned int transition_latency)
     158                 :            : {
     159                 :            :         int ret;
     160                 :            : 
     161                 :          0 :         ret = cpufreq_table_validate_and_show(policy, table);
     162         [ #  # ]:          0 :         if (ret) {
     163                 :          0 :                 pr_err("%s: invalid frequency table: %d\n", __func__, ret);
     164                 :          0 :                 return ret;
     165                 :            :         }
     166                 :            : 
     167                 :          0 :         policy->cpuinfo.transition_latency = transition_latency;
     168                 :            : 
     169                 :            :         /*
     170                 :            :          * The driver only supports the SMP configuartion where all processors
     171                 :            :          * share the clock and voltage and clock.
     172                 :            :          */
     173                 :            :         cpumask_setall(policy->cpus);
     174                 :            : 
     175                 :          0 :         return 0;
     176                 :            : }
     177                 :            : EXPORT_SYMBOL_GPL(cpufreq_generic_init);
     178                 :            : 
     179                 :          0 : unsigned int cpufreq_generic_get(unsigned int cpu)
     180                 :            : {
     181                 :          0 :         struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
     182                 :            : 
     183 [ #  # ][ #  # ]:          0 :         if (!policy || IS_ERR(policy->clk)) {
     184         [ #  # ]:          0 :                 pr_err("%s: No %s associated to cpu: %d\n", __func__,
     185                 :            :                                 policy ? "clk" : "policy", cpu);
     186                 :          0 :                 return 0;
     187                 :            :         }
     188                 :            : 
     189                 :          0 :         return clk_get_rate(policy->clk) / 1000;
     190                 :            : }
     191                 :            : EXPORT_SYMBOL_GPL(cpufreq_generic_get);
     192                 :            : 
     193                 :          0 : struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
     194                 :            : {
     195                 :            :         struct cpufreq_policy *policy = NULL;
     196                 :            :         unsigned long flags;
     197                 :            : 
     198 [ +  - ][ +  - ]:        164 :         if (cpufreq_disabled() || (cpu >= nr_cpu_ids))
     199                 :            :                 return NULL;
     200                 :            : 
     201         [ +  - ]:        164 :         if (!down_read_trylock(&cpufreq_rwsem))
     202                 :            :                 return NULL;
     203                 :            : 
     204                 :            :         /* get the cpufreq driver */
     205                 :        164 :         read_lock_irqsave(&cpufreq_driver_lock, flags);
     206                 :            : 
     207         [ +  - ]:        164 :         if (cpufreq_driver) {
     208                 :            :                 /* get the CPU */
     209                 :        164 :                 policy = per_cpu(cpufreq_cpu_data, cpu);
     210         [ +  + ]:        164 :                 if (policy)
     211                 :         84 :                         kobject_get(&policy->kobj);
     212                 :            :         }
     213                 :            : 
     214                 :        164 :         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
     215                 :            : 
     216         [ +  + ]:        164 :         if (!policy)
     217                 :         80 :                 up_read(&cpufreq_rwsem);
     218                 :            : 
     219                 :        164 :         return policy;
     220                 :            : }
     221                 :            : EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
     222                 :            : 
     223                 :          0 : void cpufreq_cpu_put(struct cpufreq_policy *policy)
     224                 :            : {
     225         [ +  - ]:         84 :         if (cpufreq_disabled())
     226                 :          0 :                 return;
     227                 :            : 
     228                 :         84 :         kobject_put(&policy->kobj);
     229                 :         84 :         up_read(&cpufreq_rwsem);
     230                 :            : }
     231                 :            : EXPORT_SYMBOL_GPL(cpufreq_cpu_put);
     232                 :            : 
     233                 :            : /*********************************************************************
     234                 :            :  *            EXTERNALLY AFFECTING FREQUENCY CHANGES                 *
     235                 :            :  *********************************************************************/
     236                 :            : 
     237                 :            : /**
     238                 :            :  * adjust_jiffies - adjust the system "loops_per_jiffy"
     239                 :            :  *
     240                 :            :  * This function alters the system "loops_per_jiffy" for the clock
     241                 :            :  * speed change. Note that loops_per_jiffy cannot be updated on SMP
     242                 :            :  * systems as each CPU might be scaled differently. So, use the arch
     243                 :            :  * per-CPU loops_per_jiffy value wherever possible.
     244                 :            :  */
     245                 :            : #ifndef CONFIG_SMP
     246                 :            : static unsigned long l_p_j_ref;
     247                 :            : static unsigned int l_p_j_ref_freq;
     248                 :            : 
     249                 :            : static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
     250                 :            : {
     251                 :            :         if (ci->flags & CPUFREQ_CONST_LOOPS)
     252                 :            :                 return;
     253                 :            : 
     254                 :            :         if (!l_p_j_ref_freq) {
     255                 :            :                 l_p_j_ref = loops_per_jiffy;
     256                 :            :                 l_p_j_ref_freq = ci->old;
     257                 :            :                 pr_debug("saving %lu as reference value for loops_per_jiffy; "
     258                 :            :                         "freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
     259                 :            :         }
     260                 :            :         if ((val == CPUFREQ_POSTCHANGE && ci->old != ci->new) ||
     261                 :            :             (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
     262                 :            :                 loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
     263                 :            :                                                                 ci->new);
     264                 :            :                 pr_debug("scaling loops_per_jiffy to %lu "
     265                 :            :                         "for frequency %u kHz\n", loops_per_jiffy, ci->new);
     266                 :            :         }
     267                 :            : }
     268                 :            : #else
     269                 :            : static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
     270                 :            : {
     271                 :            :         return;
     272                 :            : }
     273                 :            : #endif
     274                 :            : 
     275                 :          0 : static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
     276                 :            :                 struct cpufreq_freqs *freqs, unsigned int state)
     277                 :            : {
     278         [ -  + ]:      12358 :         BUG_ON(irqs_disabled());
     279                 :            : 
     280         [ +  - ]:      12358 :         if (cpufreq_disabled())
     281                 :      12358 :                 return;
     282                 :            : 
     283                 :      12358 :         freqs->flags = cpufreq_driver->flags;
     284                 :            :         pr_debug("notification %u of frequency transition to %u kHz\n",
     285                 :            :                 state, freqs->new);
     286                 :            : 
     287      [ +  +  - ]:      12358 :         switch (state) {
     288                 :            : 
     289                 :            :         case CPUFREQ_PRECHANGE:
     290                 :            :                 /* detect if the driver reported a value as "old frequency"
     291                 :            :                  * which is not equal to what the cpufreq core thinks is
     292                 :            :                  * "old frequency".
     293                 :            :                  */
     294         [ +  - ]:       6179 :                 if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
     295 [ +  - ][ +  + ]:       6179 :                         if ((policy) && (policy->cpu == freqs->cpu) &&
                 [ +  - ]
     296         [ -  + ]:       2091 :                             (policy->cur) && (policy->cur != freqs->old)) {
     297                 :            :                                 pr_debug("Warning: CPU frequency is"
     298                 :            :                                         " %u, cpufreq assumed %u kHz.\n",
     299                 :            :                                         freqs->old, policy->cur);
     300                 :          0 :                                 freqs->old = policy->cur;
     301                 :            :                         }
     302                 :            :                 }
     303                 :       6179 :                 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
     304                 :            :                                 CPUFREQ_PRECHANGE, freqs);
     305                 :            :                 adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
     306                 :            :                 break;
     307                 :            : 
     308                 :            :         case CPUFREQ_POSTCHANGE:
     309                 :            :                 adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
     310                 :            :                 pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new,
     311                 :            :                         (unsigned long)freqs->cpu);
     312                 :       6179 :                 trace_cpu_frequency(freqs->new, freqs->cpu);
     313                 :       6179 :                 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
     314                 :            :                                 CPUFREQ_POSTCHANGE, freqs);
     315 [ +  - ][ +  + ]:       6179 :                 if (likely(policy) && likely(policy->cpu == freqs->cpu))
     316                 :       2091 :                         policy->cur = freqs->new;
     317                 :            :                 break;
     318                 :            :         }
     319                 :            : }
     320                 :            : 
     321                 :            : /**
     322                 :            :  * cpufreq_notify_transition - call notifier chain and adjust_jiffies
     323                 :            :  * on frequency transition.
     324                 :            :  *
     325                 :            :  * This function calls the transition notifiers and the "adjust_jiffies"
     326                 :            :  * function. It is called twice on all CPU frequency changes that have
     327                 :            :  * external effects.
     328                 :            :  */
     329                 :          0 : void cpufreq_notify_transition(struct cpufreq_policy *policy,
     330                 :            :                 struct cpufreq_freqs *freqs, unsigned int state)
     331                 :            : {
     332         [ +  + ]:      20722 :         for_each_cpu(freqs->cpu, policy->cpus)
     333                 :      12358 :                 __cpufreq_notify_transition(policy, freqs, state);
     334                 :       4182 : }
     335                 :            : EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
     336                 :            : 
     337                 :            : /* Do post notifications when there are chances that transition has failed */
     338                 :          0 : void cpufreq_notify_post_transition(struct cpufreq_policy *policy,
     339                 :            :                 struct cpufreq_freqs *freqs, int transition_failed)
     340                 :            : {
     341                 :       2076 :         cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE);
     342         [ -  + ]:       2076 :         if (!transition_failed)
     343                 :          0 :                 return;
     344                 :            : 
     345                 :          0 :         swap(freqs->old, freqs->new);
     346                 :          0 :         cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE);
     347                 :          0 :         cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE);
     348                 :            : }
     349                 :            : EXPORT_SYMBOL_GPL(cpufreq_notify_post_transition);
     350                 :            : 
     351                 :            : 
     352                 :            : /*********************************************************************
     353                 :            :  *                          SYSFS INTERFACE                          *
     354                 :            :  *********************************************************************/
     355                 :          0 : ssize_t show_boost(struct kobject *kobj,
     356                 :            :                                  struct attribute *attr, char *buf)
     357                 :            : {
     358                 :          0 :         return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
     359                 :            : }
     360                 :            : 
     361                 :          0 : static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
     362                 :            :                                   const char *buf, size_t count)
     363                 :            : {
     364                 :            :         int ret, enable;
     365                 :            : 
     366                 :          0 :         ret = sscanf(buf, "%d", &enable);
     367 [ #  # ][ #  # ]:          0 :         if (ret != 1 || enable < 0 || enable > 1)
                 [ #  # ]
     368                 :            :                 return -EINVAL;
     369                 :            : 
     370         [ #  # ]:          0 :         if (cpufreq_boost_trigger_state(enable)) {
     371         [ #  # ]:          0 :                 pr_err("%s: Cannot %s BOOST!\n", __func__,
     372                 :            :                        enable ? "enable" : "disable");
     373                 :          0 :                 return -EINVAL;
     374                 :            :         }
     375                 :            : 
     376                 :            :         pr_debug("%s: cpufreq BOOST %s\n", __func__,
     377                 :            :                  enable ? "enabled" : "disabled");
     378                 :            : 
     379                 :          0 :         return count;
     380                 :            : }
     381                 :            : define_one_global_rw(boost);
     382                 :            : 
     383                 :          0 : static struct cpufreq_governor *__find_governor(const char *str_governor)
     384                 :            : {
     385                 :            :         struct cpufreq_governor *t;
     386                 :            : 
     387         [ +  - ]:          7 :         list_for_each_entry(t, &cpufreq_governor_list, governor_list)
     388         [ +  + ]:          7 :                 if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN))
     389                 :            :                         return t;
     390                 :            : 
     391                 :            :         return NULL;
     392                 :            : }
     393                 :            : 
     394                 :            : /**
     395                 :            :  * cpufreq_parse_governor - parse a governor string
     396                 :            :  */
     397                 :          0 : static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
     398                 :            :                                 struct cpufreq_governor **governor)
     399                 :            : {
     400                 :            :         int err = -EINVAL;
     401                 :            : 
     402         [ #  # ]:          0 :         if (!cpufreq_driver)
     403                 :            :                 goto out;
     404                 :            : 
     405         [ #  # ]:          0 :         if (cpufreq_driver->setpolicy) {
     406         [ #  # ]:          0 :                 if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
     407                 :          0 :                         *policy = CPUFREQ_POLICY_PERFORMANCE;
     408                 :            :                         err = 0;
     409         [ #  # ]:          0 :                 } else if (!strnicmp(str_governor, "powersave",
     410                 :            :                                                 CPUFREQ_NAME_LEN)) {
     411                 :          0 :                         *policy = CPUFREQ_POLICY_POWERSAVE;
     412                 :            :                         err = 0;
     413                 :            :                 }
     414         [ #  # ]:          0 :         } else if (has_target()) {
     415                 :            :                 struct cpufreq_governor *t;
     416                 :            : 
     417                 :          0 :                 mutex_lock(&cpufreq_governor_mutex);
     418                 :            : 
     419                 :          0 :                 t = __find_governor(str_governor);
     420                 :            : 
     421         [ #  # ]:          0 :                 if (t == NULL) {
     422                 :            :                         int ret;
     423                 :            : 
     424                 :          0 :                         mutex_unlock(&cpufreq_governor_mutex);
     425                 :          0 :                         ret = request_module("cpufreq_%s", str_governor);
     426                 :          0 :                         mutex_lock(&cpufreq_governor_mutex);
     427                 :            : 
     428         [ #  # ]:          0 :                         if (ret == 0)
     429                 :          0 :                                 t = __find_governor(str_governor);
     430                 :            :                 }
     431                 :            : 
     432         [ #  # ]:          0 :                 if (t != NULL) {
     433                 :          0 :                         *governor = t;
     434                 :            :                         err = 0;
     435                 :            :                 }
     436                 :            : 
     437                 :          0 :                 mutex_unlock(&cpufreq_governor_mutex);
     438                 :            :         }
     439                 :            : out:
     440                 :          0 :         return err;
     441                 :            : }
     442                 :            : 
     443                 :            : /**
     444                 :            :  * cpufreq_per_cpu_attr_read() / show_##file_name() -
     445                 :            :  * print out cpufreq information
     446                 :            :  *
     447                 :            :  * Write out information from cpufreq_driver->policy[cpu]; object must be
     448                 :            :  * "unsigned int".
     449                 :            :  */
     450                 :            : 
     451                 :            : #define show_one(file_name, object)                     \
     452                 :            : static ssize_t show_##file_name                         \
     453                 :            : (struct cpufreq_policy *policy, char *buf)              \
     454                 :            : {                                                       \
     455                 :            :         return sprintf(buf, "%u\n", policy->object);       \
     456                 :            : }
     457                 :            : 
     458                 :          0 : show_one(cpuinfo_min_freq, cpuinfo.min_freq);
     459                 :          0 : show_one(cpuinfo_max_freq, cpuinfo.max_freq);
     460                 :          0 : show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
     461                 :          0 : show_one(scaling_min_freq, min);
     462                 :          0 : show_one(scaling_max_freq, max);
     463                 :          0 : show_one(scaling_cur_freq, cur);
     464                 :            : 
     465                 :            : static int cpufreq_set_policy(struct cpufreq_policy *policy,
     466                 :            :                                 struct cpufreq_policy *new_policy);
     467                 :            : 
     468                 :            : /**
     469                 :            :  * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
     470                 :            :  */
     471                 :            : #define store_one(file_name, object)                    \
     472                 :            : static ssize_t store_##file_name                                        \
     473                 :            : (struct cpufreq_policy *policy, const char *buf, size_t count)          \
     474                 :            : {                                                                       \
     475                 :            :         int ret;                                                        \
     476                 :            :         struct cpufreq_policy new_policy;                               \
     477                 :            :                                                                         \
     478                 :            :         ret = cpufreq_get_policy(&new_policy, policy->cpu);              \
     479                 :            :         if (ret)                                                        \
     480                 :            :                 return -EINVAL;                                         \
     481                 :            :                                                                         \
     482                 :            :         ret = sscanf(buf, "%u", &new_policy.object);                      \
     483                 :            :         if (ret != 1)                                                   \
     484                 :            :                 return -EINVAL;                                         \
     485                 :            :                                                                         \
     486                 :            :         ret = cpufreq_set_policy(policy, &new_policy);              \
     487                 :            :         policy->user_policy.object = policy->object;                      \
     488                 :            :                                                                         \
     489                 :            :         return ret ? ret : count;                                       \
     490                 :            : }
     491                 :            : 
     492 [ #  # ][ #  # ]:          0 : store_one(scaling_min_freq, min);
                 [ #  # ]
     493 [ #  # ][ #  # ]:          0 : store_one(scaling_max_freq, max);
                 [ #  # ]
     494                 :            : 
     495                 :            : /**
     496                 :            :  * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
     497                 :            :  */
     498                 :          0 : static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
     499                 :            :                                         char *buf)
     500                 :            : {
     501                 :          0 :         unsigned int cur_freq = __cpufreq_get(policy->cpu);
     502         [ #  # ]:          0 :         if (!cur_freq)
     503                 :          0 :                 return sprintf(buf, "<unknown>");
     504                 :          0 :         return sprintf(buf, "%u\n", cur_freq);
     505                 :            : }
     506                 :            : 
     507                 :            : /**
     508                 :            :  * show_scaling_governor - show the current policy for the specified CPU
     509                 :            :  */
     510                 :          0 : static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
     511                 :            : {
     512         [ #  # ]:          0 :         if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
     513                 :          0 :                 return sprintf(buf, "powersave\n");
     514         [ #  # ]:          0 :         else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
     515                 :          0 :                 return sprintf(buf, "performance\n");
     516         [ #  # ]:          0 :         else if (policy->governor)
     517                 :          0 :                 return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n",
     518                 :          0 :                                 policy->governor->name);
     519                 :            :         return -EINVAL;
     520                 :            : }
     521                 :            : 
     522                 :            : /**
     523                 :            :  * store_scaling_governor - store policy for the specified CPU
     524                 :            :  */
     525                 :          0 : static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
     526                 :            :                                         const char *buf, size_t count)
     527                 :            : {
     528                 :            :         int ret;
     529                 :            :         char    str_governor[16];
     530                 :            :         struct cpufreq_policy new_policy;
     531                 :            : 
     532                 :          0 :         ret = cpufreq_get_policy(&new_policy, policy->cpu);
     533         [ #  # ]:          0 :         if (ret)
     534                 :            :                 return ret;
     535                 :            : 
     536                 :          0 :         ret = sscanf(buf, "%15s", str_governor);
     537         [ #  # ]:          0 :         if (ret != 1)
     538                 :            :                 return -EINVAL;
     539                 :            : 
     540         [ #  # ]:          0 :         if (cpufreq_parse_governor(str_governor, &new_policy.policy,
     541                 :            :                                                 &new_policy.governor))
     542                 :            :                 return -EINVAL;
     543                 :            : 
     544                 :          0 :         ret = cpufreq_set_policy(policy, &new_policy);
     545                 :            : 
     546                 :          0 :         policy->user_policy.policy = policy->policy;
     547                 :          0 :         policy->user_policy.governor = policy->governor;
     548                 :            : 
     549         [ #  # ]:          0 :         if (ret)
     550                 :            :                 return ret;
     551                 :            :         else
     552                 :          0 :                 return count;
     553                 :            : }
     554                 :            : 
     555                 :            : /**
     556                 :            :  * show_scaling_driver - show the cpufreq driver currently loaded
     557                 :            :  */
     558                 :          0 : static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)
     559                 :            : {
     560                 :          0 :         return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n", cpufreq_driver->name);
     561                 :            : }
     562                 :            : 
     563                 :            : /**
     564                 :            :  * show_scaling_available_governors - show the available CPUfreq governors
     565                 :            :  */
     566                 :          0 : static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
     567                 :            :                                                 char *buf)
     568                 :            : {
     569                 :            :         ssize_t i = 0;
     570                 :            :         struct cpufreq_governor *t;
     571                 :            : 
     572         [ #  # ]:          0 :         if (!has_target()) {
     573                 :          0 :                 i += sprintf(buf, "performance powersave");
     574                 :          0 :                 goto out;
     575                 :            :         }
     576                 :            : 
     577         [ #  # ]:          0 :         list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
     578         [ #  # ]:          0 :                 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
     579                 :            :                     - (CPUFREQ_NAME_LEN + 2)))
     580                 :            :                         goto out;
     581                 :          0 :                 i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
     582                 :            :         }
     583                 :            : out:
     584                 :          0 :         i += sprintf(&buf[i], "\n");
     585                 :          0 :         return i;
     586                 :            : }
     587                 :            : 
     588                 :          0 : ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf)
     589                 :            : {
     590                 :            :         ssize_t i = 0;
     591                 :            :         unsigned int cpu;
     592                 :            : 
     593         [ #  # ]:          0 :         for_each_cpu(cpu, mask) {
     594         [ #  # ]:          0 :                 if (i)
     595                 :          0 :                         i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
     596                 :          0 :                 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
     597         [ #  # ]:          0 :                 if (i >= (PAGE_SIZE - 5))
     598                 :            :                         break;
     599                 :            :         }
     600                 :          0 :         i += sprintf(&buf[i], "\n");
     601                 :          0 :         return i;
     602                 :            : }
     603                 :            : EXPORT_SYMBOL_GPL(cpufreq_show_cpus);
     604                 :            : 
     605                 :            : /**
     606                 :            :  * show_related_cpus - show the CPUs affected by each transition even if
     607                 :            :  * hw coordination is in use
     608                 :            :  */
     609                 :          0 : static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf)
     610                 :            : {
     611                 :          0 :         return cpufreq_show_cpus(policy->related_cpus, buf);
     612                 :            : }
     613                 :            : 
     614                 :            : /**
     615                 :            :  * show_affected_cpus - show the CPUs affected by each transition
     616                 :            :  */
     617                 :          0 : static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf)
     618                 :            : {
     619                 :          0 :         return cpufreq_show_cpus(policy->cpus, buf);
     620                 :            : }
     621                 :            : 
     622                 :          0 : static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
     623                 :            :                                         const char *buf, size_t count)
     624                 :            : {
     625                 :          0 :         unsigned int freq = 0;
     626                 :            :         unsigned int ret;
     627                 :            : 
     628 [ #  # ][ #  # ]:          0 :         if (!policy->governor || !policy->governor->store_setspeed)
     629                 :            :                 return -EINVAL;
     630                 :            : 
     631                 :          0 :         ret = sscanf(buf, "%u", &freq);
     632         [ #  # ]:          0 :         if (ret != 1)
     633                 :            :                 return -EINVAL;
     634                 :            : 
     635                 :          0 :         policy->governor->store_setspeed(policy, freq);
     636                 :            : 
     637                 :          0 :         return count;
     638                 :            : }
     639                 :            : 
     640                 :          0 : static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
     641                 :            : {
     642 [ #  # ][ #  # ]:          0 :         if (!policy->governor || !policy->governor->show_setspeed)
     643                 :          0 :                 return sprintf(buf, "<unsupported>\n");
     644                 :            : 
     645                 :          0 :         return policy->governor->show_setspeed(policy, buf);
     646                 :            : }
     647                 :            : 
     648                 :            : /**
     649                 :            :  * show_bios_limit - show the current cpufreq HW/BIOS limitation
     650                 :            :  */
     651                 :          0 : static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
     652                 :            : {
     653                 :            :         unsigned int limit;
     654                 :            :         int ret;
     655         [ #  # ]:          0 :         if (cpufreq_driver->bios_limit) {
     656                 :          0 :                 ret = cpufreq_driver->bios_limit(policy->cpu, &limit);
     657         [ #  # ]:          0 :                 if (!ret)
     658                 :          0 :                         return sprintf(buf, "%u\n", limit);
     659                 :            :         }
     660                 :          0 :         return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
     661                 :            : }
     662                 :            : 
     663                 :            : cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
     664                 :            : cpufreq_freq_attr_ro(cpuinfo_min_freq);
     665                 :            : cpufreq_freq_attr_ro(cpuinfo_max_freq);
     666                 :            : cpufreq_freq_attr_ro(cpuinfo_transition_latency);
     667                 :            : cpufreq_freq_attr_ro(scaling_available_governors);
     668                 :            : cpufreq_freq_attr_ro(scaling_driver);
     669                 :            : cpufreq_freq_attr_ro(scaling_cur_freq);
     670                 :            : cpufreq_freq_attr_ro(bios_limit);
     671                 :            : cpufreq_freq_attr_ro(related_cpus);
     672                 :            : cpufreq_freq_attr_ro(affected_cpus);
     673                 :            : cpufreq_freq_attr_rw(scaling_min_freq);
     674                 :            : cpufreq_freq_attr_rw(scaling_max_freq);
     675                 :            : cpufreq_freq_attr_rw(scaling_governor);
     676                 :            : cpufreq_freq_attr_rw(scaling_setspeed);
     677                 :            : 
     678                 :            : static struct attribute *default_attrs[] = {
     679                 :            :         &cpuinfo_min_freq.attr,
     680                 :            :         &cpuinfo_max_freq.attr,
     681                 :            :         &cpuinfo_transition_latency.attr,
     682                 :            :         &scaling_min_freq.attr,
     683                 :            :         &scaling_max_freq.attr,
     684                 :            :         &affected_cpus.attr,
     685                 :            :         &related_cpus.attr,
     686                 :            :         &scaling_governor.attr,
     687                 :            :         &scaling_driver.attr,
     688                 :            :         &scaling_available_governors.attr,
     689                 :            :         &scaling_setspeed.attr,
     690                 :            :         NULL
     691                 :            : };
     692                 :            : 
     693                 :            : #define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
     694                 :            : #define to_attr(a) container_of(a, struct freq_attr, attr)
     695                 :            : 
     696                 :          0 : static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
     697                 :            : {
     698                 :          0 :         struct cpufreq_policy *policy = to_policy(kobj);
     699                 :            :         struct freq_attr *fattr = to_attr(attr);
     700                 :            :         ssize_t ret;
     701                 :            : 
     702         [ #  # ]:          0 :         if (!down_read_trylock(&cpufreq_rwsem))
     703                 :            :                 return -EINVAL;
     704                 :            : 
     705                 :          0 :         down_read(&policy->rwsem);
     706                 :            : 
     707         [ #  # ]:          0 :         if (fattr->show)
     708                 :          0 :                 ret = fattr->show(policy, buf);
     709                 :            :         else
     710                 :            :                 ret = -EIO;
     711                 :            : 
     712                 :          0 :         up_read(&policy->rwsem);
     713                 :          0 :         up_read(&cpufreq_rwsem);
     714                 :            : 
     715                 :          0 :         return ret;
     716                 :            : }
     717                 :            : 
     718                 :          0 : static ssize_t store(struct kobject *kobj, struct attribute *attr,
     719                 :            :                      const char *buf, size_t count)
     720                 :            : {
     721                 :          0 :         struct cpufreq_policy *policy = to_policy(kobj);
     722                 :            :         struct freq_attr *fattr = to_attr(attr);
     723                 :            :         ssize_t ret = -EINVAL;
     724                 :            : 
     725                 :          0 :         get_online_cpus();
     726                 :            : 
     727         [ #  # ]:          0 :         if (!cpu_online(policy->cpu))
     728                 :            :                 goto unlock;
     729                 :            : 
     730         [ #  # ]:          0 :         if (!down_read_trylock(&cpufreq_rwsem))
     731                 :            :                 goto unlock;
     732                 :            : 
     733                 :          0 :         down_write(&policy->rwsem);
     734                 :            : 
     735         [ #  # ]:          0 :         if (fattr->store)
     736                 :          0 :                 ret = fattr->store(policy, buf, count);
     737                 :            :         else
     738                 :            :                 ret = -EIO;
     739                 :            : 
     740                 :          0 :         up_write(&policy->rwsem);
     741                 :            : 
     742                 :          0 :         up_read(&cpufreq_rwsem);
     743                 :            : unlock:
     744                 :          0 :         put_online_cpus();
     745                 :            : 
     746                 :          0 :         return ret;
     747                 :            : }
     748                 :            : 
     749                 :          0 : static void cpufreq_sysfs_release(struct kobject *kobj)
     750                 :            : {
     751                 :            :         struct cpufreq_policy *policy = to_policy(kobj);
     752                 :            :         pr_debug("last reference is dropped\n");
     753                 :          3 :         complete(&policy->kobj_unregister);
     754                 :          3 : }
     755                 :            : 
     756                 :            : static const struct sysfs_ops sysfs_ops = {
     757                 :            :         .show   = show,
     758                 :            :         .store  = store,
     759                 :            : };
     760                 :            : 
     761                 :            : static struct kobj_type ktype_cpufreq = {
     762                 :            :         .sysfs_ops      = &sysfs_ops,
     763                 :            :         .default_attrs  = default_attrs,
     764                 :            :         .release        = cpufreq_sysfs_release,
     765                 :            : };
     766                 :            : 
     767                 :            : struct kobject *cpufreq_global_kobject;
     768                 :            : EXPORT_SYMBOL(cpufreq_global_kobject);
     769                 :            : 
     770                 :            : static int cpufreq_global_kobject_usage;
     771                 :            : 
     772                 :          0 : int cpufreq_get_global_kobject(void)
     773                 :            : {
     774         [ #  # ]:          0 :         if (!cpufreq_global_kobject_usage++)
     775                 :          0 :                 return kobject_add(cpufreq_global_kobject,
     776                 :          0 :                                 &cpu_subsys.dev_root->kobj, "%s", "cpufreq");
     777                 :            : 
     778                 :            :         return 0;
     779                 :            : }
     780                 :            : EXPORT_SYMBOL(cpufreq_get_global_kobject);
     781                 :            : 
     782                 :          0 : void cpufreq_put_global_kobject(void)
     783                 :            : {
     784         [ #  # ]:          0 :         if (!--cpufreq_global_kobject_usage)
     785                 :          0 :                 kobject_del(cpufreq_global_kobject);
     786                 :          0 : }
     787                 :            : EXPORT_SYMBOL(cpufreq_put_global_kobject);
     788                 :            : 
     789                 :          0 : int cpufreq_sysfs_create_file(const struct attribute *attr)
     790                 :            : {
     791                 :          0 :         int ret = cpufreq_get_global_kobject();
     792                 :            : 
     793         [ #  # ]:          0 :         if (!ret) {
     794                 :          0 :                 ret = sysfs_create_file(cpufreq_global_kobject, attr);
     795         [ #  # ]:          0 :                 if (ret)
     796                 :          0 :                         cpufreq_put_global_kobject();
     797                 :            :         }
     798                 :            : 
     799                 :          0 :         return ret;
     800                 :            : }
     801                 :            : EXPORT_SYMBOL(cpufreq_sysfs_create_file);
     802                 :            : 
     803                 :          0 : void cpufreq_sysfs_remove_file(const struct attribute *attr)
     804                 :            : {
     805                 :          0 :         sysfs_remove_file(cpufreq_global_kobject, attr);
     806                 :          0 :         cpufreq_put_global_kobject();
     807                 :          0 : }
     808                 :            : EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
     809                 :            : 
     810                 :            : /* symlink affected CPUs */
     811                 :          0 : static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
     812                 :            : {
     813                 :            :         unsigned int j;
     814                 :            :         int ret = 0;
     815                 :            : 
     816         [ +  + ]:         12 :         for_each_cpu(j, policy->cpus) {
     817                 :            :                 struct device *cpu_dev;
     818                 :            : 
     819         [ +  + ]:          6 :                 if (j == policy->cpu)
     820                 :          3 :                         continue;
     821                 :            : 
     822                 :            :                 pr_debug("Adding link for CPU: %u\n", j);
     823                 :          3 :                 cpu_dev = get_cpu_device(j);
     824                 :          3 :                 ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
     825                 :            :                                         "cpufreq");
     826         [ +  - ]:          6 :                 if (ret)
     827                 :            :                         break;
     828                 :            :         }
     829                 :          3 :         return ret;
     830                 :            : }
     831                 :            : 
     832                 :          0 : static int cpufreq_add_dev_interface(struct cpufreq_policy *policy,
     833                 :            :                                      struct device *dev)
     834                 :            : {
     835                 :            :         struct freq_attr **drv_attr;
     836                 :            :         int ret = 0;
     837                 :            : 
     838                 :            :         /* prepare interface data */
     839                 :          3 :         ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
     840                 :            :                                    &dev->kobj, "cpufreq");
     841         [ +  - ]:          3 :         if (ret)
     842                 :            :                 return ret;
     843                 :            : 
     844                 :            :         /* set up files for this cpu device */
     845                 :          3 :         drv_attr = cpufreq_driver->attr;
     846 [ +  - ][ +  + ]:          6 :         while ((drv_attr) && (*drv_attr)) {
     847                 :          3 :                 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
     848         [ +  - ]:          3 :                 if (ret)
     849                 :            :                         goto err_out_kobj_put;
     850                 :          3 :                 drv_attr++;
     851                 :            :         }
     852         [ +  - ]:          3 :         if (cpufreq_driver->get) {
     853                 :            :                 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
     854            [ + ]:          3 :                 if (ret)
     855                 :            :                         goto err_out_kobj_put;
     856                 :            :         }
     857         [ +  - ]:          3 :         if (has_target()) {
     858                 :            :                 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
     859         [ +  - ]:          3 :                 if (ret)
     860                 :            :                         goto err_out_kobj_put;
     861                 :            :         }
     862         [ -  + ]:          3 :         if (cpufreq_driver->bios_limit) {
     863                 :            :                 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
     864         [ #  # ]:          0 :                 if (ret)
     865                 :            :                         goto err_out_kobj_put;
     866                 :            :         }
     867                 :            : 
     868                 :          3 :         ret = cpufreq_add_dev_symlink(policy);
     869         [ -  + ]:          3 :         if (ret)
     870                 :            :                 goto err_out_kobj_put;
     871                 :            : 
     872                 :            :         return ret;
     873                 :            : 
     874                 :            : err_out_kobj_put:
     875                 :          0 :         kobject_put(&policy->kobj);
     876                 :          0 :         wait_for_completion(&policy->kobj_unregister);
     877                 :          0 :         return ret;
     878                 :            : }
     879                 :            : 
     880                 :          0 : static void cpufreq_init_policy(struct cpufreq_policy *policy)
     881                 :            : {
     882                 :            :         struct cpufreq_policy new_policy;
     883                 :            :         int ret = 0;
     884                 :            : 
     885                 :          3 :         memcpy(&new_policy, policy, sizeof(*policy));
     886                 :            : 
     887                 :            :         /* Use the default policy if its valid. */
     888         [ -  + ]:          3 :         if (cpufreq_driver->setpolicy)
     889                 :          0 :                 cpufreq_parse_governor(policy->governor->name,
     890                 :            :                                         &new_policy.policy, NULL);
     891                 :            : 
     892                 :            :         /* assure that the starting sequence is run in cpufreq_set_policy */
     893                 :          3 :         policy->governor = NULL;
     894                 :            : 
     895                 :            :         /* set default policy */
     896                 :          3 :         ret = cpufreq_set_policy(policy, &new_policy);
     897         [ -  + ]:          3 :         if (ret) {
     898                 :            :                 pr_debug("setting policy failed\n");
     899         [ #  # ]:          0 :                 if (cpufreq_driver->exit)
     900                 :          0 :                         cpufreq_driver->exit(policy);
     901                 :            :         }
     902                 :          3 : }
     903                 :            : 
     904                 :            : #ifdef CONFIG_HOTPLUG_CPU
     905                 :          0 : static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy,
     906                 :            :                                   unsigned int cpu, struct device *dev)
     907                 :            : {
     908                 :            :         int ret = 0;
     909                 :            :         unsigned long flags;
     910                 :            : 
     911         [ +  - ]:         77 :         if (has_target()) {
     912                 :         77 :                 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
     913         [ -  + ]:         77 :                 if (ret) {
     914                 :          0 :                         pr_err("%s: Failed to stop governor\n", __func__);
     915                 :          0 :                         return ret;
     916                 :            :                 }
     917                 :            :         }
     918                 :            : 
     919                 :         77 :         down_write(&policy->rwsem);
     920                 :            : 
     921                 :         77 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
     922                 :            : 
     923                 :            :         cpumask_set_cpu(cpu, policy->cpus);
     924                 :         77 :         per_cpu(cpufreq_cpu_data, cpu) = policy;
     925                 :         77 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
     926                 :            : 
     927                 :         77 :         up_write(&policy->rwsem);
     928                 :            : 
     929         [ +  - ]:         77 :         if (has_target()) {
     930 [ +  - ][ -  + ]:         77 :                 if ((ret = __cpufreq_governor(policy, CPUFREQ_GOV_START)) ||
     931                 :            :                         (ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))) {
     932                 :          0 :                         pr_err("%s: Failed to start governor\n", __func__);
     933                 :          0 :                         return ret;
     934                 :            :                 }
     935                 :            :         }
     936                 :            : 
     937                 :         77 :         return sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
     938                 :            : }
     939                 :            : #endif
     940                 :            : 
     941                 :          0 : static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu)
     942                 :            : {
     943                 :            :         struct cpufreq_policy *policy;
     944                 :            :         unsigned long flags;
     945                 :            : 
     946                 :          0 :         read_lock_irqsave(&cpufreq_driver_lock, flags);
     947                 :            : 
     948                 :          0 :         policy = per_cpu(cpufreq_cpu_data_fallback, cpu);
     949                 :            : 
     950                 :          0 :         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
     951                 :            : 
     952                 :          0 :         return policy;
     953                 :            : }
     954                 :            : 
     955                 :          0 : static struct cpufreq_policy *cpufreq_policy_alloc(void)
     956                 :            : {
     957                 :            :         struct cpufreq_policy *policy;
     958                 :            : 
     959                 :            :         policy = kzalloc(sizeof(*policy), GFP_KERNEL);
     960         [ +  - ]:          3 :         if (!policy)
     961                 :            :                 return NULL;
     962                 :            : 
     963                 :            :         if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
     964                 :            :                 goto err_free_policy;
     965                 :            : 
     966                 :            :         if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
     967                 :            :                 goto err_free_cpumask;
     968                 :            : 
     969                 :          3 :         INIT_LIST_HEAD(&policy->policy_list);
     970                 :          3 :         init_rwsem(&policy->rwsem);
     971                 :            : 
     972                 :          3 :         return policy;
     973                 :            : 
     974                 :            : err_free_cpumask:
     975                 :            :         free_cpumask_var(policy->cpus);
     976                 :            : err_free_policy:
     977                 :            :         kfree(policy);
     978                 :            : 
     979                 :            :         return NULL;
     980                 :            : }
     981                 :            : 
     982                 :          0 : static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy)
     983                 :            : {
     984                 :            :         struct kobject *kobj;
     985                 :            :         struct completion *cmp;
     986                 :            : 
     987                 :          3 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
     988                 :            :                         CPUFREQ_REMOVE_POLICY, policy);
     989                 :            : 
     990                 :          3 :         down_read(&policy->rwsem);
     991                 :          3 :         kobj = &policy->kobj;
     992                 :          3 :         cmp = &policy->kobj_unregister;
     993                 :          3 :         up_read(&policy->rwsem);
     994                 :          3 :         kobject_put(kobj);
     995                 :            : 
     996                 :            :         /*
     997                 :            :          * We need to make sure that the underlying kobj is
     998                 :            :          * actually not referenced anymore by anybody before we
     999                 :            :          * proceed with unloading.
    1000                 :            :          */
    1001                 :            :         pr_debug("waiting for dropping of refcount\n");
    1002                 :          3 :         wait_for_completion(cmp);
    1003                 :            :         pr_debug("wait complete\n");
    1004                 :          3 : }
    1005                 :            : 
    1006                 :            : static void cpufreq_policy_free(struct cpufreq_policy *policy)
    1007                 :            : {
    1008                 :            :         free_cpumask_var(policy->related_cpus);
    1009                 :            :         free_cpumask_var(policy->cpus);
    1010                 :          3 :         kfree(policy);
    1011                 :            : }
    1012                 :            : 
    1013                 :          0 : static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
    1014                 :            : {
    1015 [ -  + ][ +  - ]:         29 :         if (WARN_ON(cpu == policy->cpu))
    1016                 :         29 :                 return;
    1017                 :            : 
    1018                 :         29 :         down_write(&policy->rwsem);
    1019                 :            : 
    1020                 :         29 :         policy->last_cpu = policy->cpu;
    1021                 :         29 :         policy->cpu = cpu;
    1022                 :            : 
    1023                 :         29 :         up_write(&policy->rwsem);
    1024                 :            : 
    1025                 :         29 :         cpufreq_frequency_table_update_policy_cpu(policy);
    1026                 :         29 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    1027                 :            :                         CPUFREQ_UPDATE_POLICY_CPU, policy);
    1028                 :            : }
    1029                 :            : 
    1030                 :          0 : static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
    1031                 :            :                              bool frozen)
    1032                 :            : {
    1033                 :         83 :         unsigned int j, cpu = dev->id;
    1034                 :            :         int ret = -ENOMEM;
    1035                 :            :         struct cpufreq_policy *policy;
    1036                 :            :         unsigned long flags;
    1037                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1038                 :            :         struct cpufreq_policy *tpolicy;
    1039                 :            :         struct cpufreq_governor *gov;
    1040                 :            : #endif
    1041                 :            : 
    1042         [ +  - ]:         83 :         if (cpu_is_offline(cpu))
    1043                 :            :                 return 0;
    1044                 :            : 
    1045                 :            :         pr_debug("adding CPU %u\n", cpu);
    1046                 :            : 
    1047                 :            : #ifdef CONFIG_SMP
    1048                 :            :         /* check whether a different CPU already registered this
    1049                 :            :          * CPU because it is in the same boat. */
    1050                 :         83 :         policy = cpufreq_cpu_get(cpu);
    1051         [ +  + ]:         83 :         if (unlikely(policy)) {
    1052                 :          3 :                 cpufreq_cpu_put(policy);
    1053                 :            :                 return 0;
    1054                 :            :         }
    1055                 :            : #endif
    1056                 :            : 
    1057         [ +  - ]:         80 :         if (!down_read_trylock(&cpufreq_rwsem))
    1058                 :            :                 return 0;
    1059                 :            : 
    1060                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1061                 :            :         /* Check if this cpu was hot-unplugged earlier and has siblings */
    1062                 :         80 :         read_lock_irqsave(&cpufreq_driver_lock, flags);
    1063         [ +  + ]:        114 :         list_for_each_entry(tpolicy, &cpufreq_policy_list, policy_list) {
    1064         [ +  + ]:        111 :                 if (cpumask_test_cpu(cpu, tpolicy->related_cpus)) {
    1065                 :         77 :                         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1066                 :         77 :                         ret = cpufreq_add_policy_cpu(tpolicy, cpu, dev);
    1067                 :         77 :                         up_read(&cpufreq_rwsem);
    1068                 :            :                         return ret;
    1069                 :            :                 }
    1070                 :            :         }
    1071                 :          3 :         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1072                 :            : #endif
    1073                 :            : 
    1074                 :            :         /*
    1075                 :            :          * Restore the saved policy when doing light-weight init and fall back
    1076                 :            :          * to the full init if that fails.
    1077                 :            :          */
    1078         [ -  + ]:          3 :         policy = frozen ? cpufreq_policy_restore(cpu) : NULL;
    1079         [ +  - ]:          3 :         if (!policy) {
    1080                 :            :                 frozen = false;
    1081                 :          3 :                 policy = cpufreq_policy_alloc();
    1082         [ +  - ]:          3 :                 if (!policy)
    1083                 :            :                         goto nomem_out;
    1084                 :            :         }
    1085                 :            : 
    1086                 :            :         /*
    1087                 :            :          * In the resume path, since we restore a saved policy, the assignment
    1088                 :            :          * to policy->cpu is like an update of the existing policy, rather than
    1089                 :            :          * the creation of a brand new one. So we need to perform this update
    1090                 :            :          * by invoking update_policy_cpu().
    1091                 :            :          */
    1092 [ -  + ][ #  # ]:          3 :         if (frozen && cpu != policy->cpu)
    1093                 :          0 :                 update_policy_cpu(policy, cpu);
    1094                 :            :         else
    1095                 :          3 :                 policy->cpu = cpu;
    1096                 :            : 
    1097                 :          3 :         policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
    1098                 :            :         cpumask_copy(policy->cpus, cpumask_of(cpu));
    1099                 :            : 
    1100                 :            :         init_completion(&policy->kobj_unregister);
    1101                 :          6 :         INIT_WORK(&policy->update, handle_update);
    1102                 :            : 
    1103                 :            :         /* call driver. From then on the cpufreq must be able
    1104                 :            :          * to accept all calls to ->verify and ->setpolicy for this CPU
    1105                 :            :          */
    1106                 :          3 :         ret = cpufreq_driver->init(policy);
    1107         [ +  - ]:          3 :         if (ret) {
    1108                 :            :                 pr_debug("initialization failed\n");
    1109                 :            :                 goto err_set_policy_cpu;
    1110                 :            :         }
    1111                 :            : 
    1112                 :            :         /* related cpus should atleast have policy->cpus */
    1113                 :            :         cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus);
    1114                 :            : 
    1115                 :            :         /*
    1116                 :            :          * affected cpus must always be the one, which are online. We aren't
    1117                 :            :          * managing offline cpus here.
    1118                 :            :          */
    1119                 :            :         cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);
    1120                 :            : 
    1121         [ +  - ]:          3 :         if (!frozen) {
    1122                 :          3 :                 policy->user_policy.min = policy->min;
    1123                 :          3 :                 policy->user_policy.max = policy->max;
    1124                 :            :         }
    1125                 :            : 
    1126                 :          3 :         down_write(&policy->rwsem);
    1127                 :          3 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    1128         [ +  + ]:          9 :         for_each_cpu(j, policy->cpus)
    1129                 :          6 :                 per_cpu(cpufreq_cpu_data, j) = policy;
    1130                 :          3 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1131                 :            : 
    1132 [ +  - ][ +  - ]:          3 :         if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
    1133                 :          3 :                 policy->cur = cpufreq_driver->get(policy->cpu);
    1134         [ -  + ]:          3 :                 if (!policy->cur) {
    1135                 :          0 :                         pr_err("%s: ->get() failed\n", __func__);
    1136                 :            :                         goto err_get_freq;
    1137                 :            :                 }
    1138                 :            :         }
    1139                 :            : 
    1140                 :            :         /*
    1141                 :            :          * Sometimes boot loaders set CPU frequency to a value outside of
    1142                 :            :          * frequency table present with cpufreq core. In such cases CPU might be
    1143                 :            :          * unstable if it has to run on that frequency for long duration of time
    1144                 :            :          * and so its better to set it to a frequency which is specified in
    1145                 :            :          * freq-table. This also makes cpufreq stats inconsistent as
    1146                 :            :          * cpufreq-stats would fail to register because current frequency of CPU
    1147                 :            :          * isn't found in freq-table.
    1148                 :            :          *
    1149                 :            :          * Because we don't want this change to effect boot process badly, we go
    1150                 :            :          * for the next freq which is >= policy->cur ('cur' must be set by now,
    1151                 :            :          * otherwise we will end up setting freq to lowest of the table as 'cur'
    1152                 :            :          * is initialized to zero).
    1153                 :            :          *
    1154                 :            :          * We are passing target-freq as "policy->cur - 1" otherwise
    1155                 :            :          * __cpufreq_driver_target() would simply fail, as policy->cur will be
    1156                 :            :          * equal to target-freq.
    1157                 :            :          */
    1158         [ +  - ]:          3 :         if ((cpufreq_driver->flags & CPUFREQ_NEED_INITIAL_FREQ_CHECK)
    1159         [ +  - ]:          3 :             && has_target()) {
    1160                 :            :                 /* Are we running at unknown frequency ? */
    1161                 :          3 :                 ret = cpufreq_frequency_table_get_index(policy, policy->cur);
    1162         [ -  + ]:          3 :                 if (ret == -EINVAL) {
    1163                 :            :                         /* Warn user and fix it */
    1164                 :          0 :                         pr_warn("%s: CPU%d: Running at unlisted freq: %u KHz\n",
    1165                 :            :                                 __func__, policy->cpu, policy->cur);
    1166                 :          0 :                         ret = __cpufreq_driver_target(policy, policy->cur - 1,
    1167                 :            :                                 CPUFREQ_RELATION_L);
    1168                 :            : 
    1169                 :            :                         /*
    1170                 :            :                          * Reaching here after boot in a few seconds may not
    1171                 :            :                          * mean that system will remain stable at "unknown"
    1172                 :            :                          * frequency for longer duration. Hence, a BUG_ON().
    1173                 :            :                          */
    1174         [ #  # ]:          0 :                         BUG_ON(ret);
    1175                 :          0 :                         pr_warn("%s: CPU%d: Unlisted initial frequency changed to: %u KHz\n",
    1176                 :            :                                 __func__, policy->cpu, policy->cur);
    1177                 :            :                 }
    1178                 :            :         }
    1179                 :            : 
    1180                 :          3 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    1181                 :            :                                      CPUFREQ_START, policy);
    1182                 :            : 
    1183                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1184                 :          3 :         gov = __find_governor(per_cpu(cpufreq_cpu_governor, cpu));
    1185         [ +  - ]:          3 :         if (gov) {
    1186                 :          3 :                 policy->governor = gov;
    1187                 :            :                 pr_debug("Restoring governor %s for cpu %d\n",
    1188                 :            :                        policy->governor->name, cpu);
    1189                 :            :         }
    1190                 :            : #endif
    1191                 :            : 
    1192         [ +  - ]:          3 :         if (!frozen) {
    1193                 :          3 :                 ret = cpufreq_add_dev_interface(policy, dev);
    1194         [ +  - ]:          3 :                 if (ret)
    1195                 :            :                         goto err_out_unregister;
    1196                 :          3 :                 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    1197                 :            :                                 CPUFREQ_CREATE_POLICY, policy);
    1198                 :            :         }
    1199                 :            : 
    1200                 :          3 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    1201                 :          3 :         list_add(&policy->policy_list, &cpufreq_policy_list);
    1202                 :          3 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1203                 :            : 
    1204                 :          3 :         cpufreq_init_policy(policy);
    1205                 :            : 
    1206         [ +  - ]:          3 :         if (!frozen) {
    1207                 :          3 :                 policy->user_policy.policy = policy->policy;
    1208                 :          3 :                 policy->user_policy.governor = policy->governor;
    1209                 :            :         }
    1210                 :          3 :         up_write(&policy->rwsem);
    1211                 :            : 
    1212                 :          3 :         kobject_uevent(&policy->kobj, KOBJ_ADD);
    1213                 :          3 :         up_read(&cpufreq_rwsem);
    1214                 :            : 
    1215                 :            :         pr_debug("initialization complete\n");
    1216                 :            : 
    1217                 :            :         return 0;
    1218                 :            : 
    1219                 :            : err_out_unregister:
    1220                 :            : err_get_freq:
    1221                 :          0 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    1222         [ #  # ]:          0 :         for_each_cpu(j, policy->cpus)
    1223                 :          0 :                 per_cpu(cpufreq_cpu_data, j) = NULL;
    1224                 :          0 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1225                 :            : 
    1226         [ #  # ]:          0 :         if (cpufreq_driver->exit)
    1227                 :          0 :                 cpufreq_driver->exit(policy);
    1228                 :            : err_set_policy_cpu:
    1229         [ #  # ]:          0 :         if (frozen) {
    1230                 :            :                 /* Do not leave stale fallback data behind. */
    1231                 :          0 :                 per_cpu(cpufreq_cpu_data_fallback, cpu) = NULL;
    1232                 :          0 :                 cpufreq_policy_put_kobj(policy);
    1233                 :            :         }
    1234                 :            :         cpufreq_policy_free(policy);
    1235                 :            : 
    1236                 :            : nomem_out:
    1237                 :          0 :         up_read(&cpufreq_rwsem);
    1238                 :            : 
    1239                 :            :         return ret;
    1240                 :            : }
    1241                 :            : 
    1242                 :            : /**
    1243                 :            :  * cpufreq_add_dev - add a CPU device
    1244                 :            :  *
    1245                 :            :  * Adds the cpufreq interface for a CPU device.
    1246                 :            :  *
    1247                 :            :  * The Oracle says: try running cpufreq registration/unregistration concurrently
    1248                 :            :  * with with cpu hotplugging and all hell will break loose. Tried to clean this
    1249                 :            :  * mess up, but more thorough testing is needed. - Mathieu
    1250                 :            :  */
    1251                 :          0 : static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
    1252                 :            : {
    1253                 :          5 :         return __cpufreq_add_dev(dev, sif, false);
    1254                 :            : }
    1255                 :            : 
    1256                 :          0 : static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy,
    1257                 :            :                                            unsigned int old_cpu)
    1258                 :            : {
    1259                 :            :         struct device *cpu_dev;
    1260                 :            :         int ret;
    1261                 :            : 
    1262                 :            :         /* first sibling now owns the new sysfs dir */
    1263                 :         29 :         cpu_dev = get_cpu_device(cpumask_any_but(policy->cpus, old_cpu));
    1264                 :            : 
    1265                 :         29 :         sysfs_remove_link(&cpu_dev->kobj, "cpufreq");
    1266                 :         29 :         ret = kobject_move(&policy->kobj, &cpu_dev->kobj);
    1267         [ -  + ]:         58 :         if (ret) {
    1268                 :          0 :                 pr_err("%s: Failed to move kobj: %d", __func__, ret);
    1269                 :            : 
    1270                 :          0 :                 down_write(&policy->rwsem);
    1271                 :            :                 cpumask_set_cpu(old_cpu, policy->cpus);
    1272                 :          0 :                 up_write(&policy->rwsem);
    1273                 :            : 
    1274                 :          0 :                 ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
    1275                 :            :                                         "cpufreq");
    1276                 :            : 
    1277                 :          0 :                 return -EINVAL;
    1278                 :            :         }
    1279                 :            : 
    1280                 :         29 :         return cpu_dev->id;
    1281                 :            : }
    1282                 :            : 
    1283                 :          0 : static int __cpufreq_remove_dev_prepare(struct device *dev,
    1284                 :            :                                         struct subsys_interface *sif,
    1285                 :            :                                         bool frozen)
    1286                 :            : {
    1287                 :         80 :         unsigned int cpu = dev->id, cpus;
    1288                 :            :         int new_cpu, ret;
    1289                 :            :         unsigned long flags;
    1290                 :            :         struct cpufreq_policy *policy;
    1291                 :            : 
    1292                 :            :         pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
    1293                 :            : 
    1294                 :         80 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    1295                 :            : 
    1296                 :         80 :         policy = per_cpu(cpufreq_cpu_data, cpu);
    1297                 :            : 
    1298                 :            :         /* Save the policy somewhere when doing a light-weight tear-down */
    1299         [ -  + ]:         80 :         if (frozen)
    1300                 :          0 :                 per_cpu(cpufreq_cpu_data_fallback, cpu) = policy;
    1301                 :            : 
    1302                 :         80 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1303                 :            : 
    1304         [ +  - ]:         80 :         if (!policy) {
    1305                 :            :                 pr_debug("%s: No cpu_data found\n", __func__);
    1306                 :            :                 return -EINVAL;
    1307                 :            :         }
    1308                 :            : 
    1309         [ +  - ]:         80 :         if (has_target()) {
    1310                 :         80 :                 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
    1311         [ -  + ]:         80 :                 if (ret) {
    1312                 :          0 :                         pr_err("%s: Failed to stop governor\n", __func__);
    1313                 :            :                         return ret;
    1314                 :            :                 }
    1315                 :            :         }
    1316                 :            : 
    1317                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1318         [ +  - ]:         80 :         if (!cpufreq_driver->setpolicy)
    1319                 :         80 :                 strncpy(per_cpu(cpufreq_cpu_governor, cpu),
    1320                 :         80 :                         policy->governor->name, CPUFREQ_NAME_LEN);
    1321                 :            : #endif
    1322                 :            : 
    1323                 :         80 :         down_read(&policy->rwsem);
    1324                 :            :         cpus = cpumask_weight(policy->cpus);
    1325                 :         80 :         up_read(&policy->rwsem);
    1326                 :            : 
    1327         [ +  + ]:         80 :         if (cpu != policy->cpu) {
    1328                 :         48 :                 sysfs_remove_link(&dev->kobj, "cpufreq");
    1329         [ +  + ]:         32 :         } else if (cpus > 1) {
    1330                 :         29 :                 new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu);
    1331         [ +  - ]:         29 :                 if (new_cpu >= 0) {
    1332                 :         29 :                         update_policy_cpu(policy, new_cpu);
    1333                 :            : 
    1334                 :            :                         if (!frozen) {
    1335                 :            :                                 pr_debug("%s: policy Kobject moved to cpu: %d from: %d\n",
    1336                 :            :                                                 __func__, new_cpu, cpu);
    1337                 :            :                         }
    1338                 :            :                 }
    1339                 :            :         }
    1340                 :            : 
    1341                 :            :         return 0;
    1342                 :            : }
    1343                 :            : 
    1344                 :          0 : static int __cpufreq_remove_dev_finish(struct device *dev,
    1345                 :            :                                        struct subsys_interface *sif,
    1346                 :            :                                        bool frozen)
    1347                 :            : {
    1348                 :         80 :         unsigned int cpu = dev->id, cpus;
    1349                 :            :         int ret;
    1350                 :            :         unsigned long flags;
    1351                 :            :         struct cpufreq_policy *policy;
    1352                 :            : 
    1353                 :         80 :         read_lock_irqsave(&cpufreq_driver_lock, flags);
    1354                 :         80 :         policy = per_cpu(cpufreq_cpu_data, cpu);
    1355                 :         80 :         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1356                 :            : 
    1357         [ +  - ]:         80 :         if (!policy) {
    1358                 :            :                 pr_debug("%s: No cpu_data found\n", __func__);
    1359                 :            :                 return -EINVAL;
    1360                 :            :         }
    1361                 :            : 
    1362                 :         80 :         down_write(&policy->rwsem);
    1363                 :            :         cpus = cpumask_weight(policy->cpus);
    1364                 :            : 
    1365         [ +  + ]:         80 :         if (cpus > 1)
    1366                 :         77 :                 cpumask_clear_cpu(cpu, policy->cpus);
    1367                 :         80 :         up_write(&policy->rwsem);
    1368                 :            : 
    1369                 :            :         /* If cpu is last user of policy, free policy */
    1370         [ +  + ]:         80 :         if (cpus == 1) {
    1371         [ +  - ]:          3 :                 if (has_target()) {
    1372                 :          3 :                         ret = __cpufreq_governor(policy,
    1373                 :            :                                         CPUFREQ_GOV_POLICY_EXIT);
    1374         [ -  + ]:          3 :                         if (ret) {
    1375                 :          0 :                                 pr_err("%s: Failed to exit governor\n",
    1376                 :            :                                                 __func__);
    1377                 :            :                                 return ret;
    1378                 :            :                         }
    1379                 :            :                 }
    1380                 :            : 
    1381            [ + ]:          3 :                 if (!frozen)
    1382                 :          3 :                         cpufreq_policy_put_kobj(policy);
    1383                 :            : 
    1384                 :            :                 /*
    1385                 :            :                  * Perform the ->exit() even during light-weight tear-down,
    1386                 :            :                  * since this is a core component, and is essential for the
    1387                 :            :                  * subsequent light-weight ->init() to succeed.
    1388                 :            :                  */
    1389         [ +  - ]:          3 :                 if (cpufreq_driver->exit)
    1390                 :          3 :                         cpufreq_driver->exit(policy);
    1391                 :            : 
    1392                 :            :                 /* Remove policy from list of active policies */
    1393                 :          3 :                 write_lock_irqsave(&cpufreq_driver_lock, flags);
    1394                 :            :                 list_del(&policy->policy_list);
    1395                 :          3 :                 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1396                 :            : 
    1397         [ +  - ]:          3 :                 if (!frozen)
    1398                 :            :                         cpufreq_policy_free(policy);
    1399                 :            :         } else {
    1400         [ +  - ]:         77 :                 if (has_target()) {
    1401 [ +  - ][ -  + ]:         77 :                         if ((ret = __cpufreq_governor(policy, CPUFREQ_GOV_START)) ||
    1402                 :            :                                         (ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))) {
    1403                 :          0 :                                 pr_err("%s: Failed to start governor\n",
    1404                 :            :                                                 __func__);
    1405                 :            :                                 return ret;
    1406                 :            :                         }
    1407                 :            :                 }
    1408                 :            :         }
    1409                 :            : 
    1410                 :         80 :         per_cpu(cpufreq_cpu_data, cpu) = NULL;
    1411                 :            :         return 0;
    1412                 :            : }
    1413                 :            : 
    1414                 :            : /**
    1415                 :            :  * cpufreq_remove_dev - remove a CPU device
    1416                 :            :  *
    1417                 :            :  * Removes the cpufreq interface for a CPU device.
    1418                 :            :  */
    1419                 :          0 : static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
    1420                 :            : {
    1421                 :          5 :         unsigned int cpu = dev->id;
    1422                 :            :         int ret;
    1423                 :            : 
    1424         [ +  + ]:          5 :         if (cpu_is_offline(cpu))
    1425                 :            :                 return 0;
    1426                 :            : 
    1427                 :          2 :         ret = __cpufreq_remove_dev_prepare(dev, sif, false);
    1428                 :            : 
    1429         [ +  - ]:          2 :         if (!ret)
    1430                 :          2 :                 ret = __cpufreq_remove_dev_finish(dev, sif, false);
    1431                 :            : 
    1432                 :          2 :         return ret;
    1433                 :            : }
    1434                 :            : 
    1435                 :          0 : static void handle_update(struct work_struct *work)
    1436                 :            : {
    1437                 :            :         struct cpufreq_policy *policy =
    1438                 :            :                 container_of(work, struct cpufreq_policy, update);
    1439                 :          0 :         unsigned int cpu = policy->cpu;
    1440                 :            :         pr_debug("handle_update for cpu %u called\n", cpu);
    1441                 :          0 :         cpufreq_update_policy(cpu);
    1442                 :          0 : }
    1443                 :            : 
    1444                 :            : /**
    1445                 :            :  *      cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're
    1446                 :            :  *      in deep trouble.
    1447                 :            :  *      @cpu: cpu number
    1448                 :            :  *      @old_freq: CPU frequency the kernel thinks the CPU runs at
    1449                 :            :  *      @new_freq: CPU frequency the CPU actually runs at
    1450                 :            :  *
    1451                 :            :  *      We adjust to current frequency first, and need to clean up later.
    1452                 :            :  *      So either call to cpufreq_update_policy() or schedule handle_update()).
    1453                 :            :  */
    1454                 :          0 : static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
    1455                 :            :                                 unsigned int new_freq)
    1456                 :            : {
    1457                 :            :         struct cpufreq_policy *policy;
    1458                 :            :         struct cpufreq_freqs freqs;
    1459                 :            :         unsigned long flags;
    1460                 :            : 
    1461                 :            :         pr_debug("Warning: CPU frequency out of sync: cpufreq and timing "
    1462                 :            :                "core thinks of %u, is %u kHz.\n", old_freq, new_freq);
    1463                 :            : 
    1464                 :         15 :         freqs.old = old_freq;
    1465                 :         15 :         freqs.new = new_freq;
    1466                 :            : 
    1467                 :         15 :         read_lock_irqsave(&cpufreq_driver_lock, flags);
    1468                 :         15 :         policy = per_cpu(cpufreq_cpu_data, cpu);
    1469                 :         15 :         read_unlock_irqrestore(&cpufreq_driver_lock, flags);
    1470                 :            : 
    1471                 :         15 :         cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
    1472                 :         15 :         cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
    1473                 :         15 : }
    1474                 :            : 
    1475                 :            : /**
    1476                 :            :  * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
    1477                 :            :  * @cpu: CPU number
    1478                 :            :  *
    1479                 :            :  * This is the last known freq, without actually getting it from the driver.
    1480                 :            :  * Return value will be same as what is shown in scaling_cur_freq in sysfs.
    1481                 :            :  */
    1482                 :          0 : unsigned int cpufreq_quick_get(unsigned int cpu)
    1483                 :            : {
    1484                 :            :         struct cpufreq_policy *policy;
    1485                 :            :         unsigned int ret_freq = 0;
    1486                 :            : 
    1487 [ #  # ][ #  # ]:          0 :         if (cpufreq_driver && cpufreq_driver->setpolicy && cpufreq_driver->get)
                 [ #  # ]
    1488                 :          0 :                 return cpufreq_driver->get(cpu);
    1489                 :            : 
    1490                 :          0 :         policy = cpufreq_cpu_get(cpu);
    1491         [ #  # ]:          0 :         if (policy) {
    1492                 :          0 :                 ret_freq = policy->cur;
    1493                 :          0 :                 cpufreq_cpu_put(policy);
    1494                 :            :         }
    1495                 :            : 
    1496                 :          0 :         return ret_freq;
    1497                 :            : }
    1498                 :            : EXPORT_SYMBOL(cpufreq_quick_get);
    1499                 :            : 
    1500                 :            : /**
    1501                 :            :  * cpufreq_quick_get_max - get the max reported CPU frequency for this CPU
    1502                 :            :  * @cpu: CPU number
    1503                 :            :  *
    1504                 :            :  * Just return the max possible frequency for a given CPU.
    1505                 :            :  */
    1506                 :          0 : unsigned int cpufreq_quick_get_max(unsigned int cpu)
    1507                 :            : {
    1508                 :          0 :         struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
    1509                 :            :         unsigned int ret_freq = 0;
    1510                 :            : 
    1511         [ #  # ]:          0 :         if (policy) {
    1512                 :          0 :                 ret_freq = policy->max;
    1513                 :          0 :                 cpufreq_cpu_put(policy);
    1514                 :            :         }
    1515                 :            : 
    1516                 :          0 :         return ret_freq;
    1517                 :            : }
    1518                 :            : EXPORT_SYMBOL(cpufreq_quick_get_max);
    1519                 :            : 
    1520                 :          0 : static unsigned int __cpufreq_get(unsigned int cpu)
    1521                 :            : {
    1522                 :          0 :         struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
    1523                 :            :         unsigned int ret_freq = 0;
    1524                 :            : 
    1525         [ #  # ]:          0 :         if (!cpufreq_driver->get)
    1526                 :            :                 return ret_freq;
    1527                 :            : 
    1528                 :          0 :         ret_freq = cpufreq_driver->get(cpu);
    1529                 :            : 
    1530 [ #  # ][ #  # ]:          0 :         if (ret_freq && policy->cur &&
                 [ #  # ]
    1531                 :          0 :                 !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
    1532                 :            :                 /* verify no discrepancy between actual and
    1533                 :            :                                         saved value exists */
    1534         [ #  # ]:          0 :                 if (unlikely(ret_freq != policy->cur)) {
    1535                 :          0 :                         cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
    1536                 :          0 :                         schedule_work(&policy->update);
    1537                 :            :                 }
    1538                 :            :         }
    1539                 :            : 
    1540                 :          0 :         return ret_freq;
    1541                 :            : }
    1542                 :            : 
    1543                 :            : /**
    1544                 :            :  * cpufreq_get - get the current CPU frequency (in kHz)
    1545                 :            :  * @cpu: CPU number
    1546                 :            :  *
    1547                 :            :  * Get the CPU current (static) CPU frequency
    1548                 :            :  */
    1549                 :          0 : unsigned int cpufreq_get(unsigned int cpu)
    1550                 :            : {
    1551                 :          0 :         struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
    1552                 :            :         unsigned int ret_freq = 0;
    1553                 :            : 
    1554         [ #  # ]:          0 :         if (policy) {
    1555                 :          0 :                 down_read(&policy->rwsem);
    1556                 :          0 :                 ret_freq = __cpufreq_get(cpu);
    1557                 :          0 :                 up_read(&policy->rwsem);
    1558                 :            : 
    1559                 :          0 :                 cpufreq_cpu_put(policy);
    1560                 :            :         }
    1561                 :            : 
    1562                 :          0 :         return ret_freq;
    1563                 :            : }
    1564                 :            : EXPORT_SYMBOL(cpufreq_get);
    1565                 :            : 
    1566                 :            : static struct subsys_interface cpufreq_interface = {
    1567                 :            :         .name           = "cpufreq",
    1568                 :            :         .subsys         = &cpu_subsys,
    1569                 :            :         .add_dev        = cpufreq_add_dev,
    1570                 :            :         .remove_dev     = cpufreq_remove_dev,
    1571                 :            : };
    1572                 :            : 
    1573                 :            : /**
    1574                 :            :  * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
    1575                 :            :  *
    1576                 :            :  * This function is only executed for the boot processor.  The other CPUs
    1577                 :            :  * have been put offline by means of CPU hotplug.
    1578                 :            :  */
    1579                 :          0 : static int cpufreq_bp_suspend(void)
    1580                 :            : {
    1581                 :            :         int ret = 0;
    1582                 :            : 
    1583                 :          0 :         int cpu = smp_processor_id();
    1584                 :            :         struct cpufreq_policy *policy;
    1585                 :            : 
    1586                 :            :         pr_debug("suspending cpu %u\n", cpu);
    1587                 :            : 
    1588                 :            :         /* If there's no policy for the boot CPU, we have nothing to do. */
    1589                 :          0 :         policy = cpufreq_cpu_get(cpu);
    1590         [ #  # ]:          0 :         if (!policy)
    1591                 :            :                 return 0;
    1592                 :            : 
    1593         [ #  # ]:          0 :         if (cpufreq_driver->suspend) {
    1594                 :          0 :                 ret = cpufreq_driver->suspend(policy);
    1595         [ #  # ]:          0 :                 if (ret)
    1596                 :          0 :                         printk(KERN_ERR "cpufreq: suspend failed in ->suspend "
    1597                 :            :                                         "step on CPU %u\n", policy->cpu);
    1598                 :            :         }
    1599                 :            : 
    1600                 :          0 :         cpufreq_cpu_put(policy);
    1601                 :          0 :         return ret;
    1602                 :            : }
    1603                 :            : 
    1604                 :            : /**
    1605                 :            :  * cpufreq_bp_resume - Restore proper frequency handling of the boot CPU.
    1606                 :            :  *
    1607                 :            :  *      1.) resume CPUfreq hardware support (cpufreq_driver->resume())
    1608                 :            :  *      2.) schedule call cpufreq_update_policy() ASAP as interrupts are
    1609                 :            :  *          restored. It will verify that the current freq is in sync with
    1610                 :            :  *          what we believe it to be. This is a bit later than when it
    1611                 :            :  *          should be, but nonethteless it's better than calling
    1612                 :            :  *          cpufreq_driver->get() here which might re-enable interrupts...
    1613                 :            :  *
    1614                 :            :  * This function is only executed for the boot CPU.  The other CPUs have not
    1615                 :            :  * been turned on yet.
    1616                 :            :  */
    1617                 :          0 : static void cpufreq_bp_resume(void)
    1618                 :            : {
    1619                 :            :         int ret = 0;
    1620                 :            : 
    1621                 :          0 :         int cpu = smp_processor_id();
    1622                 :            :         struct cpufreq_policy *policy;
    1623                 :            : 
    1624                 :            :         pr_debug("resuming cpu %u\n", cpu);
    1625                 :            : 
    1626                 :            :         /* If there's no policy for the boot CPU, we have nothing to do. */
    1627                 :          0 :         policy = cpufreq_cpu_get(cpu);
    1628         [ #  # ]:          0 :         if (!policy)
    1629                 :          0 :                 return;
    1630                 :            : 
    1631         [ #  # ]:          0 :         if (cpufreq_driver->resume) {
    1632                 :          0 :                 ret = cpufreq_driver->resume(policy);
    1633         [ #  # ]:          0 :                 if (ret) {
    1634                 :          0 :                         printk(KERN_ERR "cpufreq: resume failed in ->resume "
    1635                 :            :                                         "step on CPU %u\n", policy->cpu);
    1636                 :          0 :                         goto fail;
    1637                 :            :                 }
    1638                 :            :         }
    1639                 :            : 
    1640                 :          0 :         schedule_work(&policy->update);
    1641                 :            : 
    1642                 :            : fail:
    1643                 :          0 :         cpufreq_cpu_put(policy);
    1644                 :            : }
    1645                 :            : 
    1646                 :            : static struct syscore_ops cpufreq_syscore_ops = {
    1647                 :            :         .suspend        = cpufreq_bp_suspend,
    1648                 :            :         .resume         = cpufreq_bp_resume,
    1649                 :            : };
    1650                 :            : 
    1651                 :            : /**
    1652                 :            :  *      cpufreq_get_current_driver - return current driver's name
    1653                 :            :  *
    1654                 :            :  *      Return the name string of the currently loaded cpufreq driver
    1655                 :            :  *      or NULL, if none.
    1656                 :            :  */
    1657                 :          0 : const char *cpufreq_get_current_driver(void)
    1658                 :            : {
    1659         [ #  # ]:          0 :         if (cpufreq_driver)
    1660                 :          0 :                 return cpufreq_driver->name;
    1661                 :            : 
    1662                 :            :         return NULL;
    1663                 :            : }
    1664                 :            : EXPORT_SYMBOL_GPL(cpufreq_get_current_driver);
    1665                 :            : 
    1666                 :            : /*********************************************************************
    1667                 :            :  *                     NOTIFIER LISTS INTERFACE                      *
    1668                 :            :  *********************************************************************/
    1669                 :            : 
    1670                 :            : /**
    1671                 :            :  *      cpufreq_register_notifier - register a driver with cpufreq
    1672                 :            :  *      @nb: notifier function to register
    1673                 :            :  *      @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
    1674                 :            :  *
    1675                 :            :  *      Add a driver to one of two lists: either a list of drivers that
    1676                 :            :  *      are notified about clock rate changes (once before and once after
    1677                 :            :  *      the transition), or a list of drivers that are notified about
    1678                 :            :  *      changes in cpufreq policy.
    1679                 :            :  *
    1680                 :            :  *      This function may sleep, and has the same return conditions as
    1681                 :            :  *      blocking_notifier_chain_register.
    1682                 :            :  */
    1683                 :          0 : int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
    1684                 :            : {
    1685                 :            :         int ret;
    1686                 :            : 
    1687         [ #  # ]:          0 :         if (cpufreq_disabled())
    1688                 :            :                 return -EINVAL;
    1689                 :            : 
    1690         [ #  # ]:          0 :         WARN_ON(!init_cpufreq_transition_notifier_list_called);
    1691                 :            : 
    1692      [ #  #  # ]:          0 :         switch (list) {
    1693                 :            :         case CPUFREQ_TRANSITION_NOTIFIER:
    1694                 :          0 :                 ret = srcu_notifier_chain_register(
    1695                 :            :                                 &cpufreq_transition_notifier_list, nb);
    1696                 :          0 :                 break;
    1697                 :            :         case CPUFREQ_POLICY_NOTIFIER:
    1698                 :          0 :                 ret = blocking_notifier_chain_register(
    1699                 :            :                                 &cpufreq_policy_notifier_list, nb);
    1700                 :          0 :                 break;
    1701                 :            :         default:
    1702                 :            :                 ret = -EINVAL;
    1703                 :            :         }
    1704                 :            : 
    1705                 :          0 :         return ret;
    1706                 :            : }
    1707                 :            : EXPORT_SYMBOL(cpufreq_register_notifier);
    1708                 :            : 
    1709                 :            : /**
    1710                 :            :  *      cpufreq_unregister_notifier - unregister a driver with cpufreq
    1711                 :            :  *      @nb: notifier block to be unregistered
    1712                 :            :  *      @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
    1713                 :            :  *
    1714                 :            :  *      Remove a driver from the CPU frequency notifier list.
    1715                 :            :  *
    1716                 :            :  *      This function may sleep, and has the same return conditions as
    1717                 :            :  *      blocking_notifier_chain_unregister.
    1718                 :            :  */
    1719                 :          0 : int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
    1720                 :            : {
    1721                 :            :         int ret;
    1722                 :            : 
    1723         [ #  # ]:          0 :         if (cpufreq_disabled())
    1724                 :            :                 return -EINVAL;
    1725                 :            : 
    1726      [ #  #  # ]:          0 :         switch (list) {
    1727                 :            :         case CPUFREQ_TRANSITION_NOTIFIER:
    1728                 :          0 :                 ret = srcu_notifier_chain_unregister(
    1729                 :            :                                 &cpufreq_transition_notifier_list, nb);
    1730                 :          0 :                 break;
    1731                 :            :         case CPUFREQ_POLICY_NOTIFIER:
    1732                 :          0 :                 ret = blocking_notifier_chain_unregister(
    1733                 :            :                                 &cpufreq_policy_notifier_list, nb);
    1734                 :          0 :                 break;
    1735                 :            :         default:
    1736                 :            :                 ret = -EINVAL;
    1737                 :            :         }
    1738                 :            : 
    1739                 :          0 :         return ret;
    1740                 :            : }
    1741                 :            : EXPORT_SYMBOL(cpufreq_unregister_notifier);
    1742                 :            : 
    1743                 :            : 
    1744                 :            : /*********************************************************************
    1745                 :            :  *                              GOVERNORS                            *
    1746                 :            :  *********************************************************************/
    1747                 :            : 
    1748                 :          0 : int __cpufreq_driver_target(struct cpufreq_policy *policy,
    1749                 :            :                             unsigned int target_freq,
    1750                 :            :                             unsigned int relation)
    1751                 :            : {
    1752                 :            :         int retval = -EINVAL;
    1753                 :            :         unsigned int old_target_freq = target_freq;
    1754                 :            : 
    1755         [ +  - ]:      32604 :         if (cpufreq_disabled())
    1756                 :            :                 return -ENODEV;
    1757                 :            : 
    1758                 :            :         /* Make sure that target_freq is within supported range */
    1759         [ -  + ]:      32604 :         if (target_freq > policy->max)
    1760                 :            :                 target_freq = policy->max;
    1761         [ +  + ]:      32604 :         if (target_freq < policy->min)
    1762                 :            :                 target_freq = policy->min;
    1763                 :            : 
    1764                 :            :         pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
    1765                 :            :                         policy->cpu, target_freq, relation, old_target_freq);
    1766                 :            : 
    1767                 :            :         /*
    1768                 :            :          * This might look like a redundant call as we are checking it again
    1769                 :            :          * after finding index. But it is left intentionally for cases where
    1770                 :            :          * exactly same freq is called again and so we can save on few function
    1771                 :            :          * calls.
    1772                 :            :          */
    1773         [ +  + ]:      32604 :         if (target_freq == policy->cur)
    1774                 :            :                 return 0;
    1775                 :            : 
    1776         [ -  + ]:       2768 :         if (cpufreq_driver->target)
    1777                 :          0 :                 retval = cpufreq_driver->target(policy, target_freq, relation);
    1778         [ +  - ]:       2768 :         else if (cpufreq_driver->target_index) {
    1779                 :            :                 struct cpufreq_frequency_table *freq_table;
    1780                 :            :                 struct cpufreq_freqs freqs;
    1781                 :            :                 bool notify;
    1782                 :            :                 int index;
    1783                 :            : 
    1784                 :       2768 :                 freq_table = cpufreq_frequency_get_table(policy->cpu);
    1785         [ -  + ]:       2768 :                 if (unlikely(!freq_table)) {
    1786                 :          0 :                         pr_err("%s: Unable to find freq_table\n", __func__);
    1787                 :        692 :                         goto out;
    1788                 :            :                 }
    1789                 :            : 
    1790                 :       2768 :                 retval = cpufreq_frequency_table_target(policy, freq_table,
    1791                 :            :                                 target_freq, relation, &index);
    1792         [ -  + ]:       2768 :                 if (unlikely(retval)) {
    1793                 :          0 :                         pr_err("%s: Unable to find matching freq\n", __func__);
    1794                 :          0 :                         goto out;
    1795                 :            :                 }
    1796                 :            : 
    1797         [ +  + ]:       2768 :                 if (freq_table[index].frequency == policy->cur) {
    1798                 :            :                         retval = 0;
    1799                 :            :                         goto out;
    1800                 :            :                 }
    1801                 :            : 
    1802                 :       2076 :                 notify = !(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION);
    1803                 :            : 
    1804         [ +  - ]:       2076 :                 if (notify) {
    1805                 :       2076 :                         freqs.old = policy->cur;
    1806                 :       2076 :                         freqs.new = freq_table[index].frequency;
    1807                 :       2076 :                         freqs.flags = 0;
    1808                 :            : 
    1809                 :            :                         pr_debug("%s: cpu: %d, oldfreq: %u, new freq: %u\n",
    1810                 :            :                                         __func__, policy->cpu, freqs.old,
    1811                 :            :                                         freqs.new);
    1812                 :            : 
    1813                 :       2076 :                         cpufreq_notify_transition(policy, &freqs,
    1814                 :            :                                         CPUFREQ_PRECHANGE);
    1815                 :            :                 }
    1816                 :            : 
    1817                 :       2076 :                 retval = cpufreq_driver->target_index(policy, index);
    1818         [ -  + ]:       2076 :                 if (retval)
    1819                 :          0 :                         pr_err("%s: Failed to change cpu frequency: %d\n",
    1820                 :            :                                         __func__, retval);
    1821                 :            : 
    1822         [ +  - ]:       2076 :                 if (notify)
    1823                 :       2076 :                         cpufreq_notify_post_transition(policy, &freqs, retval);
    1824                 :            :         }
    1825                 :            : 
    1826                 :            : out:
    1827                 :       2768 :         return retval;
    1828                 :            : }
    1829                 :            : EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
    1830                 :            : 
    1831                 :          0 : int cpufreq_driver_target(struct cpufreq_policy *policy,
    1832                 :            :                           unsigned int target_freq,
    1833                 :            :                           unsigned int relation)
    1834                 :            : {
    1835                 :            :         int ret = -EINVAL;
    1836                 :            : 
    1837                 :          0 :         down_write(&policy->rwsem);
    1838                 :            : 
    1839                 :          0 :         ret = __cpufreq_driver_target(policy, target_freq, relation);
    1840                 :            : 
    1841                 :          0 :         up_write(&policy->rwsem);
    1842                 :            : 
    1843                 :          0 :         return ret;
    1844                 :            : }
    1845                 :            : EXPORT_SYMBOL_GPL(cpufreq_driver_target);
    1846                 :            : 
    1847                 :            : /*
    1848                 :            :  * when "event" is CPUFREQ_GOV_LIMITS
    1849                 :            :  */
    1850                 :            : 
    1851                 :          0 : static int __cpufreq_governor(struct cpufreq_policy *policy,
    1852                 :            :                                         unsigned int event)
    1853                 :            : {
    1854                 :            :         int ret;
    1855                 :            : 
    1856                 :            :         /* Only must be defined when default governor is known to have latency
    1857                 :            :            restrictions, like e.g. conservative or ondemand.
    1858                 :            :            That this is the case is already ensured in Kconfig
    1859                 :            :         */
    1860                 :            : #ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
    1861                 :            :         struct cpufreq_governor *gov = &cpufreq_gov_performance;
    1862                 :            : #else
    1863                 :            :         struct cpufreq_governor *gov = NULL;
    1864                 :            : #endif
    1865                 :            : 
    1866 [ +  + ][ -  + ]:        555 :         if (policy->governor->max_transition_latency &&
    1867                 :        245 :             policy->cpuinfo.transition_latency >
    1868                 :            :             policy->governor->max_transition_latency) {
    1869         [ #  # ]:          0 :                 if (!gov)
    1870                 :            :                         return -EINVAL;
    1871                 :            :                 else {
    1872                 :          0 :                         printk(KERN_WARNING "%s governor failed, too long"
    1873                 :            :                                " transition latency of HW, fallback"
    1874                 :            :                                " to %s governor\n",
    1875                 :          0 :                                policy->governor->name,
    1876                 :            :                                gov->name);
    1877                 :          0 :                         policy->governor = gov;
    1878                 :            :                 }
    1879                 :            :         }
    1880                 :            : 
    1881         [ +  + ]:        555 :         if (event == CPUFREQ_GOV_POLICY_INIT)
    1882         [ +  - ]:          3 :                 if (!try_module_get(policy->governor->owner))
    1883                 :            :                         return -EINVAL;
    1884                 :            : 
    1885                 :            :         pr_debug("__cpufreq_governor for CPU %u, event %u\n",
    1886                 :            :                                                 policy->cpu, event);
    1887                 :            : 
    1888                 :        555 :         mutex_lock(&cpufreq_governor_lock);
    1889 [ +  + ][ +  - ]:        555 :         if ((policy->governor_enabled && event == CPUFREQ_GOV_START)
    1890         [ +  + ]:        555 :             || (!policy->governor_enabled
    1891         [ -  + ]:        163 :             && (event == CPUFREQ_GOV_LIMITS || event == CPUFREQ_GOV_STOP))) {
    1892                 :          0 :                 mutex_unlock(&cpufreq_governor_lock);
    1893                 :          0 :                 return -EBUSY;
    1894                 :            :         }
    1895                 :            : 
    1896         [ +  + ]:        555 :         if (event == CPUFREQ_GOV_STOP)
    1897                 :        157 :                 policy->governor_enabled = false;
    1898         [ +  + ]:        398 :         else if (event == CPUFREQ_GOV_START)
    1899                 :        157 :                 policy->governor_enabled = true;
    1900                 :            : 
    1901                 :        555 :         mutex_unlock(&cpufreq_governor_lock);
    1902                 :            : 
    1903                 :        555 :         ret = policy->governor->governor(policy, event);
    1904                 :            : 
    1905         [ +  - ]:        555 :         if (!ret) {
    1906         [ +  + ]:        555 :                 if (event == CPUFREQ_GOV_POLICY_INIT)
    1907                 :          3 :                         policy->governor->initialized++;
    1908         [ +  + ]:        552 :                 else if (event == CPUFREQ_GOV_POLICY_EXIT)
    1909                 :          3 :                         policy->governor->initialized--;
    1910                 :            :         } else {
    1911                 :            :                 /* Restore original values */
    1912                 :          0 :                 mutex_lock(&cpufreq_governor_lock);
    1913         [ #  # ]:          0 :                 if (event == CPUFREQ_GOV_STOP)
    1914                 :          0 :                         policy->governor_enabled = true;
    1915         [ #  # ]:          0 :                 else if (event == CPUFREQ_GOV_START)
    1916                 :          0 :                         policy->governor_enabled = false;
    1917                 :          0 :                 mutex_unlock(&cpufreq_governor_lock);
    1918                 :            :         }
    1919                 :            : 
    1920 [ +  - ][ +  + ]:        555 :         if (((event == CPUFREQ_GOV_POLICY_INIT) && ret) ||
    1921                 :        555 :                         ((event == CPUFREQ_GOV_POLICY_EXIT) && !ret))
    1922                 :          3 :                 module_put(policy->governor->owner);
    1923                 :            : 
    1924                 :        555 :         return ret;
    1925                 :            : }
    1926                 :            : 
    1927                 :          0 : int cpufreq_register_governor(struct cpufreq_governor *governor)
    1928                 :            : {
    1929                 :            :         int err;
    1930                 :            : 
    1931         [ #  # ]:          0 :         if (!governor)
    1932                 :            :                 return -EINVAL;
    1933                 :            : 
    1934         [ #  # ]:          0 :         if (cpufreq_disabled())
    1935                 :            :                 return -ENODEV;
    1936                 :            : 
    1937                 :          0 :         mutex_lock(&cpufreq_governor_mutex);
    1938                 :            : 
    1939                 :          0 :         governor->initialized = 0;
    1940                 :            :         err = -EBUSY;
    1941         [ #  # ]:          0 :         if (__find_governor(governor->name) == NULL) {
    1942                 :            :                 err = 0;
    1943                 :          0 :                 list_add(&governor->governor_list, &cpufreq_governor_list);
    1944                 :            :         }
    1945                 :            : 
    1946                 :          0 :         mutex_unlock(&cpufreq_governor_mutex);
    1947                 :          0 :         return err;
    1948                 :            : }
    1949                 :            : EXPORT_SYMBOL_GPL(cpufreq_register_governor);
    1950                 :            : 
    1951                 :          0 : void cpufreq_unregister_governor(struct cpufreq_governor *governor)
    1952                 :            : {
    1953                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1954                 :            :         int cpu;
    1955                 :            : #endif
    1956                 :            : 
    1957         [ #  # ]:          0 :         if (!governor)
    1958                 :            :                 return;
    1959                 :            : 
    1960         [ #  # ]:          0 :         if (cpufreq_disabled())
    1961                 :            :                 return;
    1962                 :            : 
    1963                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1964         [ #  # ]:          0 :         for_each_present_cpu(cpu) {
    1965         [ #  # ]:          0 :                 if (cpu_online(cpu))
    1966                 :          0 :                         continue;
    1967         [ #  # ]:          0 :                 if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
    1968                 :          0 :                         strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
    1969                 :            :         }
    1970                 :            : #endif
    1971                 :            : 
    1972                 :          0 :         mutex_lock(&cpufreq_governor_mutex);
    1973                 :            :         list_del(&governor->governor_list);
    1974                 :          0 :         mutex_unlock(&cpufreq_governor_mutex);
    1975                 :          0 :         return;
    1976                 :            : }
    1977                 :            : EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
    1978                 :            : 
    1979                 :            : 
    1980                 :            : /*********************************************************************
    1981                 :            :  *                          POLICY INTERFACE                         *
    1982                 :            :  *********************************************************************/
    1983                 :            : 
    1984                 :            : /**
    1985                 :            :  * cpufreq_get_policy - get the current cpufreq_policy
    1986                 :            :  * @policy: struct cpufreq_policy into which the current cpufreq_policy
    1987                 :            :  *      is written
    1988                 :            :  *
    1989                 :            :  * Reads the current cpufreq policy.
    1990                 :            :  */
    1991                 :          0 : int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
    1992                 :            : {
    1993                 :            :         struct cpufreq_policy *cpu_policy;
    1994         [ #  # ]:          0 :         if (!policy)
    1995                 :            :                 return -EINVAL;
    1996                 :            : 
    1997                 :          0 :         cpu_policy = cpufreq_cpu_get(cpu);
    1998         [ #  # ]:          0 :         if (!cpu_policy)
    1999                 :            :                 return -EINVAL;
    2000                 :            : 
    2001                 :          0 :         memcpy(policy, cpu_policy, sizeof(*policy));
    2002                 :            : 
    2003                 :          0 :         cpufreq_cpu_put(cpu_policy);
    2004                 :          0 :         return 0;
    2005                 :            : }
    2006                 :            : EXPORT_SYMBOL(cpufreq_get_policy);
    2007                 :            : 
    2008                 :            : /*
    2009                 :            :  * policy : current policy.
    2010                 :            :  * new_policy: policy to be set.
    2011                 :            :  */
    2012                 :          0 : static int cpufreq_set_policy(struct cpufreq_policy *policy,
    2013                 :            :                                 struct cpufreq_policy *new_policy)
    2014                 :            : {
    2015                 :            :         int ret = 0, failed = 1;
    2016                 :            : 
    2017                 :            :         pr_debug("setting new policy for CPU %u: %u - %u kHz\n", new_policy->cpu,
    2018                 :            :                 new_policy->min, new_policy->max);
    2019                 :            : 
    2020                 :         81 :         memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
    2021                 :            : 
    2022 [ +  - ][ +  - ]:         81 :         if (new_policy->min > policy->max || new_policy->max < policy->min) {
    2023                 :            :                 ret = -EINVAL;
    2024                 :            :                 goto error_out;
    2025                 :            :         }
    2026                 :            : 
    2027                 :            :         /* verify the cpu speed can be set within this limit */
    2028                 :         81 :         ret = cpufreq_driver->verify(new_policy);
    2029         [ +  - ]:         81 :         if (ret)
    2030                 :            :                 goto error_out;
    2031                 :            : 
    2032                 :            :         /* adjust if necessary - all reasons */
    2033                 :         81 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    2034                 :            :                         CPUFREQ_ADJUST, new_policy);
    2035                 :            : 
    2036                 :            :         /* adjust if necessary - hardware incompatibility*/
    2037                 :         81 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    2038                 :            :                         CPUFREQ_INCOMPATIBLE, new_policy);
    2039                 :            : 
    2040                 :            :         /*
    2041                 :            :          * verify the cpu speed can be set within this limit, which might be
    2042                 :            :          * different to the first one
    2043                 :            :          */
    2044                 :         81 :         ret = cpufreq_driver->verify(new_policy);
    2045         [ +  - ]:         81 :         if (ret)
    2046                 :            :                 goto error_out;
    2047                 :            : 
    2048                 :            :         /* notification of the new policy */
    2049                 :         81 :         blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
    2050                 :            :                         CPUFREQ_NOTIFY, new_policy);
    2051                 :            : 
    2052                 :         81 :         policy->min = new_policy->min;
    2053                 :         81 :         policy->max = new_policy->max;
    2054                 :            : 
    2055                 :            :         pr_debug("new min and max freqs are %u - %u kHz\n",
    2056                 :            :                                         policy->min, policy->max);
    2057                 :            : 
    2058         [ -  + ]:         81 :         if (cpufreq_driver->setpolicy) {
    2059                 :          0 :                 policy->policy = new_policy->policy;
    2060                 :            :                 pr_debug("setting range\n");
    2061                 :          0 :                 ret = cpufreq_driver->setpolicy(new_policy);
    2062                 :            :         } else {
    2063         [ +  + ]:         81 :                 if (new_policy->governor != policy->governor) {
    2064                 :            :                         /* save old, working values */
    2065                 :            :                         struct cpufreq_governor *old_gov = policy->governor;
    2066                 :            : 
    2067                 :            :                         pr_debug("governor switch\n");
    2068                 :            : 
    2069                 :            :                         /* end old governor */
    2070         [ -  + ]:          3 :                         if (policy->governor) {
    2071                 :          0 :                                 __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
    2072                 :          0 :                                 up_write(&policy->rwsem);
    2073                 :          0 :                                 __cpufreq_governor(policy,
    2074                 :            :                                                 CPUFREQ_GOV_POLICY_EXIT);
    2075                 :          0 :                                 down_write(&policy->rwsem);
    2076                 :            :                         }
    2077                 :            : 
    2078                 :            :                         /* start new governor */
    2079                 :          3 :                         policy->governor = new_policy->governor;
    2080         [ +  - ]:          3 :                         if (!__cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT)) {
    2081         [ -  + ]:          3 :                                 if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) {
    2082                 :            :                                         failed = 0;
    2083                 :            :                                 } else {
    2084                 :          0 :                                         up_write(&policy->rwsem);
    2085                 :          0 :                                         __cpufreq_governor(policy,
    2086                 :            :                                                         CPUFREQ_GOV_POLICY_EXIT);
    2087                 :          0 :                                         down_write(&policy->rwsem);
    2088                 :            :                                 }
    2089                 :            :                         }
    2090                 :            : 
    2091         [ -  + ]:          3 :                         if (failed) {
    2092                 :            :                                 /* new governor failed, so re-start old one */
    2093                 :            :                                 pr_debug("starting governor %s failed\n",
    2094                 :            :                                                         policy->governor->name);
    2095         [ #  # ]:          0 :                                 if (old_gov) {
    2096                 :          0 :                                         policy->governor = old_gov;
    2097                 :          0 :                                         __cpufreq_governor(policy,
    2098                 :            :                                                         CPUFREQ_GOV_POLICY_INIT);
    2099                 :          0 :                                         __cpufreq_governor(policy,
    2100                 :            :                                                            CPUFREQ_GOV_START);
    2101                 :            :                                 }
    2102                 :            :                                 ret = -EINVAL;
    2103                 :            :                                 goto error_out;
    2104                 :            :                         }
    2105                 :            :                         /* might be a policy change, too, so fall through */
    2106                 :            :                 }
    2107                 :            :                 pr_debug("governor: change or update limits\n");
    2108                 :         81 :                 ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
    2109                 :            :         }
    2110                 :            : 
    2111                 :            : error_out:
    2112                 :         81 :         return ret;
    2113                 :            : }
    2114                 :            : 
    2115                 :            : /**
    2116                 :            :  *      cpufreq_update_policy - re-evaluate an existing cpufreq policy
    2117                 :            :  *      @cpu: CPU which shall be re-evaluated
    2118                 :            :  *
    2119                 :            :  *      Useful for policy notifiers which have different necessities
    2120                 :            :  *      at different times.
    2121                 :            :  */
    2122                 :          0 : int cpufreq_update_policy(unsigned int cpu)
    2123                 :            : {
    2124                 :         78 :         struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
    2125                 :            :         struct cpufreq_policy new_policy;
    2126                 :            :         int ret;
    2127                 :            : 
    2128         [ +  - ]:         78 :         if (!policy) {
    2129                 :            :                 ret = -ENODEV;
    2130                 :            :                 goto no_policy;
    2131                 :            :         }
    2132                 :            : 
    2133                 :         78 :         down_write(&policy->rwsem);
    2134                 :            : 
    2135                 :            :         pr_debug("updating policy for CPU %u\n", cpu);
    2136                 :         78 :         memcpy(&new_policy, policy, sizeof(*policy));
    2137                 :         78 :         new_policy.min = policy->user_policy.min;
    2138                 :         78 :         new_policy.max = policy->user_policy.max;
    2139                 :         78 :         new_policy.policy = policy->user_policy.policy;
    2140                 :         78 :         new_policy.governor = policy->user_policy.governor;
    2141                 :            : 
    2142                 :            :         /*
    2143                 :            :          * BIOS might change freq behind our back
    2144                 :            :          * -> ask driver for current freq and notify governors about a change
    2145                 :            :          */
    2146 [ +  - ][ +  - ]:         78 :         if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
    2147                 :         78 :                 new_policy.cur = cpufreq_driver->get(cpu);
    2148         [ -  + ]:         78 :                 if (!policy->cur) {
    2149                 :            :                         pr_debug("Driver did not initialize current freq");
    2150                 :          0 :                         policy->cur = new_policy.cur;
    2151                 :            :                 } else {
    2152 [ +  + ][ +  - ]:         93 :                         if (policy->cur != new_policy.cur && has_target())
    2153                 :         15 :                                 cpufreq_out_of_sync(cpu, policy->cur,
    2154                 :            :                                                                 new_policy.cur);
    2155                 :            :                 }
    2156                 :            :         }
    2157                 :            : 
    2158                 :         78 :         ret = cpufreq_set_policy(policy, &new_policy);
    2159                 :            : 
    2160                 :         78 :         up_write(&policy->rwsem);
    2161                 :            : 
    2162                 :         78 :         cpufreq_cpu_put(policy);
    2163                 :            : no_policy:
    2164                 :         78 :         return ret;
    2165                 :            : }
    2166                 :            : EXPORT_SYMBOL(cpufreq_update_policy);
    2167                 :            : 
    2168                 :          0 : static int cpufreq_cpu_callback(struct notifier_block *nfb,
    2169                 :            :                                         unsigned long action, void *hcpu)
    2170                 :            : {
    2171                 :        546 :         unsigned int cpu = (unsigned long)hcpu;
    2172                 :         78 :         struct device *dev;
    2173                 :            :         bool frozen = false;
    2174                 :            : 
    2175                 :        546 :         dev = get_cpu_device(cpu);
    2176         [ +  - ]:        546 :         if (dev) {
    2177                 :            : 
    2178         [ -  + ]:        546 :                 if (action & CPU_TASKS_FROZEN)
    2179                 :            :                         frozen = true;
    2180                 :            : 
    2181   [ +  +  +  -  :        546 :                 switch (action & ~CPU_TASKS_FROZEN) {
                      + ]
    2182                 :            :                 case CPU_ONLINE:
    2183                 :         78 :                         __cpufreq_add_dev(dev, NULL, frozen);
    2184                 :         78 :                         cpufreq_update_policy(cpu);
    2185                 :         78 :                         break;
    2186                 :            : 
    2187                 :            :                 case CPU_DOWN_PREPARE:
    2188                 :         78 :                         __cpufreq_remove_dev_prepare(dev, NULL, frozen);
    2189                 :         78 :                         break;
    2190                 :            : 
    2191                 :            :                 case CPU_POST_DEAD:
    2192                 :         78 :                         __cpufreq_remove_dev_finish(dev, NULL, frozen);
    2193                 :         78 :                         break;
    2194                 :            : 
    2195                 :            :                 case CPU_DOWN_FAILED:
    2196                 :          0 :                         __cpufreq_add_dev(dev, NULL, frozen);
    2197                 :          0 :                         break;
    2198                 :            :                 }
    2199                 :            :         }
    2200                 :          0 :         return NOTIFY_OK;
    2201                 :            : }
    2202                 :            : 
    2203                 :            : static struct notifier_block __refdata cpufreq_cpu_notifier = {
    2204                 :            :         .notifier_call = cpufreq_cpu_callback,
    2205                 :            : };
    2206                 :            : 
    2207                 :            : /*********************************************************************
    2208                 :            :  *               BOOST                                               *
    2209                 :            :  *********************************************************************/
    2210                 :          0 : static int cpufreq_boost_set_sw(int state)
    2211                 :            : {
    2212                 :            :         struct cpufreq_frequency_table *freq_table;
    2213                 :            :         struct cpufreq_policy *policy;
    2214                 :            :         int ret = -EINVAL;
    2215                 :            : 
    2216         [ #  # ]:          0 :         list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
    2217                 :          0 :                 freq_table = cpufreq_frequency_get_table(policy->cpu);
    2218         [ #  # ]:          0 :                 if (freq_table) {
    2219                 :          0 :                         ret = cpufreq_frequency_table_cpuinfo(policy,
    2220                 :            :                                                         freq_table);
    2221         [ #  # ]:          0 :                         if (ret) {
    2222                 :          0 :                                 pr_err("%s: Policy frequency update failed\n",
    2223                 :            :                                        __func__);
    2224                 :          0 :                                 break;
    2225                 :            :                         }
    2226                 :          0 :                         policy->user_policy.max = policy->max;
    2227                 :          0 :                         __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
    2228                 :            :                 }
    2229                 :            :         }
    2230                 :            : 
    2231                 :          0 :         return ret;
    2232                 :            : }
    2233                 :            : 
    2234                 :          0 : int cpufreq_boost_trigger_state(int state)
    2235                 :            : {
    2236                 :            :         unsigned long flags;
    2237                 :            :         int ret = 0;
    2238                 :            : 
    2239         [ #  # ]:          0 :         if (cpufreq_driver->boost_enabled == state)
    2240                 :            :                 return 0;
    2241                 :            : 
    2242                 :          0 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    2243                 :          0 :         cpufreq_driver->boost_enabled = state;
    2244                 :          0 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2245                 :            : 
    2246                 :          0 :         ret = cpufreq_driver->set_boost(state);
    2247         [ #  # ]:          0 :         if (ret) {
    2248                 :          0 :                 write_lock_irqsave(&cpufreq_driver_lock, flags);
    2249                 :          0 :                 cpufreq_driver->boost_enabled = !state;
    2250                 :          0 :                 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2251                 :            : 
    2252         [ #  # ]:          0 :                 pr_err("%s: Cannot %s BOOST\n", __func__,
    2253                 :            :                        state ? "enable" : "disable");
    2254                 :            :         }
    2255                 :            : 
    2256                 :          0 :         return ret;
    2257                 :            : }
    2258                 :            : 
    2259                 :          0 : int cpufreq_boost_supported(void)
    2260                 :            : {
    2261   [ +  -  +  - ]:          2 :         if (likely(cpufreq_driver))
         [ #  # ][ #  # ]
    2262                 :          2 :                 return cpufreq_driver->boost_supported;
    2263                 :            : 
    2264                 :            :         return 0;
    2265                 :            : }
    2266                 :            : EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
    2267                 :            : 
    2268                 :          0 : int cpufreq_boost_enabled(void)
    2269                 :            : {
    2270                 :         24 :         return cpufreq_driver->boost_enabled;
    2271                 :            : }
    2272                 :            : EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
    2273                 :            : 
    2274                 :            : /*********************************************************************
    2275                 :            :  *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
    2276                 :            :  *********************************************************************/
    2277                 :            : 
    2278                 :            : /**
    2279                 :            :  * cpufreq_register_driver - register a CPU Frequency driver
    2280                 :            :  * @driver_data: A struct cpufreq_driver containing the values#
    2281                 :            :  * submitted by the CPU Frequency driver.
    2282                 :            :  *
    2283                 :            :  * Registers a CPU Frequency driver to this core code. This code
    2284                 :            :  * returns zero on success, -EBUSY when another driver got here first
    2285                 :            :  * (and isn't unregistered in the meantime).
    2286                 :            :  *
    2287                 :            :  */
    2288                 :          0 : int cpufreq_register_driver(struct cpufreq_driver *driver_data)
    2289                 :            : {
    2290                 :            :         unsigned long flags;
    2291                 :            :         int ret;
    2292                 :            : 
    2293         [ +  - ]:          1 :         if (cpufreq_disabled())
    2294                 :            :                 return -ENODEV;
    2295                 :            : 
    2296 [ +  - ][ +  - ]:          1 :         if (!driver_data || !driver_data->verify || !driver_data->init ||
         [ +  - ][ +  - ]
    2297 [ -  + ][ #  # ]:          1 :             !(driver_data->setpolicy || driver_data->target_index ||
    2298                 :          0 :                     driver_data->target))
    2299                 :            :                 return -EINVAL;
    2300                 :            : 
    2301                 :            :         pr_debug("trying to register driver %s\n", driver_data->name);
    2302                 :            : 
    2303         [ -  + ]:          1 :         if (driver_data->setpolicy)
    2304                 :          0 :                 driver_data->flags |= CPUFREQ_CONST_LOOPS;
    2305                 :            : 
    2306                 :          1 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    2307         [ -  + ]:          1 :         if (cpufreq_driver) {
    2308                 :          0 :                 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2309                 :          0 :                 return -EEXIST;
    2310                 :            :         }
    2311                 :          1 :         cpufreq_driver = driver_data;
    2312                 :          1 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2313                 :            : 
    2314         [ -  + ]:          1 :         if (cpufreq_boost_supported()) {
    2315                 :            :                 /*
    2316                 :            :                  * Check if driver provides function to enable boost -
    2317                 :            :                  * if not, use cpufreq_boost_set_sw as default
    2318                 :            :                  */
    2319         [ #  # ]:          0 :                 if (!cpufreq_driver->set_boost)
    2320                 :          0 :                         cpufreq_driver->set_boost = cpufreq_boost_set_sw;
    2321                 :            : 
    2322                 :          0 :                 ret = cpufreq_sysfs_create_file(&boost.attr);
    2323         [ #  # ]:          0 :                 if (ret) {
    2324                 :          0 :                         pr_err("%s: cannot register global BOOST sysfs file\n",
    2325                 :            :                                 __func__);
    2326                 :          0 :                         goto err_null_driver;
    2327                 :            :                 }
    2328                 :            :         }
    2329                 :            : 
    2330                 :          1 :         ret = subsys_interface_register(&cpufreq_interface);
    2331         [ +  - ]:          1 :         if (ret)
    2332                 :            :                 goto err_boost_unreg;
    2333                 :            : 
    2334         [ -  + ]:          1 :         if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
    2335                 :            :                 int i;
    2336                 :            :                 ret = -ENODEV;
    2337                 :            : 
    2338                 :            :                 /* check for at least one working CPU */
    2339         [ #  # ]:          0 :                 for (i = 0; i < nr_cpu_ids; i++)
    2340 [ #  # ][ #  # ]:          0 :                         if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {
    2341                 :            :                                 ret = 0;
    2342                 :            :                                 break;
    2343                 :            :                         }
    2344                 :            : 
    2345                 :            :                 /* if all ->init() calls failed, unregister */
    2346         [ #  # ]:          0 :                 if (ret) {
    2347                 :            :                         pr_debug("no CPU initialized for driver %s\n",
    2348                 :            :                                                         driver_data->name);
    2349                 :            :                         goto err_if_unreg;
    2350                 :            :                 }
    2351                 :            :         }
    2352                 :            : 
    2353                 :          1 :         register_hotcpu_notifier(&cpufreq_cpu_notifier);
    2354                 :            :         pr_debug("driver %s up and running\n", driver_data->name);
    2355                 :            : 
    2356                 :          1 :         return 0;
    2357                 :            : err_if_unreg:
    2358                 :          0 :         subsys_interface_unregister(&cpufreq_interface);
    2359                 :            : err_boost_unreg:
    2360         [ #  # ]:          0 :         if (cpufreq_boost_supported())
    2361                 :          0 :                 cpufreq_sysfs_remove_file(&boost.attr);
    2362                 :            : err_null_driver:
    2363                 :          0 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    2364                 :          0 :         cpufreq_driver = NULL;
    2365                 :          0 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2366                 :          0 :         return ret;
    2367                 :            : }
    2368                 :            : EXPORT_SYMBOL_GPL(cpufreq_register_driver);
    2369                 :            : 
    2370                 :            : /**
    2371                 :            :  * cpufreq_unregister_driver - unregister the current CPUFreq driver
    2372                 :            :  *
    2373                 :            :  * Unregister the current CPUFreq driver. Only call this if you have
    2374                 :            :  * the right to do so, i.e. if you have succeeded in initialising before!
    2375                 :            :  * Returns zero if successful, and -EINVAL if the cpufreq_driver is
    2376                 :            :  * currently not initialised.
    2377                 :            :  */
    2378                 :          0 : int cpufreq_unregister_driver(struct cpufreq_driver *driver)
    2379                 :            : {
    2380                 :            :         unsigned long flags;
    2381                 :            : 
    2382 [ +  - ][ +  - ]:          1 :         if (!cpufreq_driver || (driver != cpufreq_driver))
    2383                 :            :                 return -EINVAL;
    2384                 :            : 
    2385                 :            :         pr_debug("unregistering driver %s\n", driver->name);
    2386                 :            : 
    2387                 :          1 :         subsys_interface_unregister(&cpufreq_interface);
    2388         [ -  + ]:          1 :         if (cpufreq_boost_supported())
    2389                 :          0 :                 cpufreq_sysfs_remove_file(&boost.attr);
    2390                 :            : 
    2391                 :          1 :         unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
    2392                 :            : 
    2393                 :          1 :         down_write(&cpufreq_rwsem);
    2394                 :          1 :         write_lock_irqsave(&cpufreq_driver_lock, flags);
    2395                 :            : 
    2396                 :          1 :         cpufreq_driver = NULL;
    2397                 :            : 
    2398                 :          1 :         write_unlock_irqrestore(&cpufreq_driver_lock, flags);
    2399                 :          1 :         up_write(&cpufreq_rwsem);
    2400                 :            : 
    2401                 :          1 :         return 0;
    2402                 :            : }
    2403                 :            : EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
    2404                 :            : 
    2405                 :          0 : static int __init cpufreq_core_init(void)
    2406                 :            : {
    2407         [ #  # ]:          0 :         if (cpufreq_disabled())
    2408                 :            :                 return -ENODEV;
    2409                 :            : 
    2410                 :          0 :         cpufreq_global_kobject = kobject_create();
    2411         [ #  # ]:          0 :         BUG_ON(!cpufreq_global_kobject);
    2412                 :          0 :         register_syscore_ops(&cpufreq_syscore_ops);
    2413                 :            : 
    2414                 :          0 :         return 0;
    2415                 :            : }
    2416                 :            : core_initcall(cpufreq_core_init);

Generated by: LCOV version 1.9