]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 26 Mar 2009 18:04:08 +0000 (11:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 26 Mar 2009 18:04:08 +0000 (11:04 -0700)
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq: (35 commits)
  [CPUFREQ] Prevent p4-clockmod from auto-binding to the ondemand governor.
  [CPUFREQ] Make cpufreq-nforce2 less obnoxious
  [CPUFREQ] p4-clockmod reports wrong frequency.
  [CPUFREQ] powernow-k8: Use a common exit path.
  [CPUFREQ] Change link order of x86 cpufreq modules
  [CPUFREQ] conservative: remove 10x from def_sampling_rate
  [CPUFREQ] conservative: fixup governor to function more like ondemand logic
  [CPUFREQ] conservative: fix dbs_cpufreq_notifier so freq is not locked
  [CPUFREQ] conservative: amend author's email address
  [CPUFREQ] Use swap() in longhaul.c
  [CPUFREQ] checkpatch cleanups for acpi-cpufreq
  [CPUFREQ] powernow-k8: Only print error message once, not per core.
  [CPUFREQ] ondemand/conservative: sanitize sampling_rate restrictions
  [CPUFREQ] ondemand/conservative: deprecate sampling_rate{min,max}
  [CPUFREQ] powernow-k8: Always compile powernow-k8 driver with ACPI support
  [CPUFREQ] Introduce /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_transition_latency
  [CPUFREQ] checkpatch cleanups for powernow-k8
  [CPUFREQ] checkpatch cleanups for ondemand governor.
  [CPUFREQ] checkpatch cleanups for powernow-k7
  [CPUFREQ] checkpatch cleanups for speedstep related drivers.
  ...

1  2 
arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
arch/x86/kernel/tsc.c
drivers/cpufreq/cpufreq.c

index 3178c3acd97ebb4aa515d19da8a7f75b1178b08a,352cf9a491649a1144899d37fbf732b8b7b84c88..41ed94915f974ce0310510d9864b54d8e96f37df
  #include <linux/cpufreq.h>
  #include <linux/slab.h>
  #include <linux/cpumask.h>
+ #include <linux/timex.h>
  
  #include <asm/processor.h>
  #include <asm/msr.h>
- #include <asm/timex.h>
+ #include <asm/timer.h>
  
  #include "speedstep-lib.h"
  
  #define PFX   "p4-clockmod: "
- #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg)
+ #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
+               "p4-clockmod", msg)
  
  /*
   * Duty Cycle (3bits), note DC_DISABLE is not specified in
@@@ -58,7 -60,8 +60,8 @@@ static int cpufreq_p4_setdc(unsigned in
  {
        u32 l, h;
  
-       if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV))
+       if (!cpu_online(cpu) ||
+           (newstate > DC_DISABLE) || (newstate == DC_RESV))
                return -EINVAL;
  
        rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h);
@@@ -66,7 -69,8 +69,8 @@@
        if (l & 0x01)
                dprintk("CPU#%d currently thermal throttled\n", cpu);
  
-       if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT))
+       if (has_N44_O17_errata[cpu] &&
+           (newstate == DC_25PT || newstate == DC_DFLT))
                newstate = DC_38PT;
  
        rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
@@@ -112,7 -116,8 +116,8 @@@ static int cpufreq_p4_target(struct cpu
        struct cpufreq_freqs freqs;
        int i;
  
-       if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate))
+       if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0],
+                               target_freq, relation, &newstate))
                return -EINVAL;
  
        freqs.old = cpufreq_p4_get(policy->cpu);
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
        }
  
-       /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software
+       /* run on each logical CPU,
+        * see section 13.15.3 of IA32 Intel Architecture Software
         * Developer's Manual, Volume 3
         */
        for_each_cpu(i, policy->cpus)
@@@ -153,28 -159,30 +159,30 @@@ static unsigned int cpufreq_p4_get_freq
  {
        if (c->x86 == 0x06) {
                if (cpu_has(c, X86_FEATURE_EST))
-                       printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. "
-                              "The acpi-cpufreq module offers voltage scaling"
-                              " in addition of frequency scaling. You should use "
-                              "that instead of p4-clockmod, if possible.\n");
+                       printk(KERN_WARNING PFX "Warning: EST-capable CPU "
+                              "detected. The acpi-cpufreq module offers "
+                              "voltage scaling in addition of frequency "
+                              "scaling. You should use that instead of "
+                              "p4-clockmod, if possible.\n");
                switch (c->x86_model) {
                case 0x0E: /* Core */
                case 0x0F: /* Core Duo */
                case 0x16: /* Celeron Core */
                        p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS;
-                       return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE);
+                       return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE);
                case 0x0D: /* Pentium M (Dothan) */
                        p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS;
                        /* fall through */
                case 0x09: /* Pentium M (Banias) */
-                       return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM);
+                       return speedstep_get_frequency(SPEEDSTEP_CPU_PM);
                }
        }
  
        if (c->x86 != 0xF) {
                if (!cpu_has(c, X86_FEATURE_EST))
-                       printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. "
-                               "Please send an e-mail to <cpufreq@vger.kernel.org>\n");
+                       printk(KERN_WARNING PFX "Unknown CPU. "
+                               "Please send an e-mail to "
+                               "<cpufreq@vger.kernel.org>\n");
                return 0;
        }
  
         * throttling is active or not. */
        p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS;
  
-       if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) {
+       if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) {
                printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. "
                       "The speedstep-ich or acpi cpufreq modules offer "
                       "voltage scaling in addition of frequency scaling. "
                       "You should use either one instead of p4-clockmod, "
                       "if possible.\n");
-               return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M);
+               return speedstep_get_frequency(SPEEDSTEP_CPU_P4M);
        }
  
-       return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D);
+       return speedstep_get_frequency(SPEEDSTEP_CPU_P4D);
  }
  
  
@@@ -217,14 -225,20 +225,20 @@@ static int cpufreq_p4_cpu_init(struct c
                dprintk("has errata -- disabling low frequencies\n");
        }
  
+       if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4D &&
+           c->x86_model < 2) {
+               /* switch to maximum frequency and measure result */
+               cpufreq_p4_setdc(policy->cpu, DC_DISABLE);
+               recalibrate_cpu_khz();
+       }
        /* get max frequency */
        stock_freq = cpufreq_p4_get_frequency(c);
        if (!stock_freq)
                return -EINVAL;
  
        /* table init */
-       for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
-               if ((i<2) && (has_N44_O17_errata[policy->cpu]))
+       for (i = 1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
+               if ((i < 2) && (has_N44_O17_errata[policy->cpu]))
                        p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
                else
                        p4clockmod_table[i].frequency = (stock_freq * i)/8;
        cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu);
  
        /* cpuinfo and default policy values */
-       policy->cpuinfo.transition_latency = 1000000; /* assumed */
+       /* the transition latency is set to be 1 higher than the maximum
+        * transition latency of the ondemand governor */
+       policy->cpuinfo.transition_latency = 10000001;
        policy->cur = stock_freq;
  
        return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0]);
@@@ -258,12 -275,12 +275,12 @@@ static unsigned int cpufreq_p4_get(unsi
                l = DC_DISABLE;
  
        if (l != DC_DISABLE)
-               return (stock_freq * l / 8);
+               return stock_freq * l / 8;
  
        return stock_freq;
  }
  
- static struct freq_attrp4clockmod_attr[] = {
+ static struct freq_attr *p4clockmod_attr[] = {
        &cpufreq_freq_attr_scaling_available_freqs,
        NULL,
  };
@@@ -277,6 -294,7 +294,6 @@@ static struct cpufreq_driver p4clockmod
        .name           = "p4-clockmod",
        .owner          = THIS_MODULE,
        .attr           = p4clockmod_attr,
 -      .hide_interface = 1,
  };
  
  
@@@ -298,9 -316,10 +315,10 @@@ static int __init cpufreq_p4_init(void
  
        ret = cpufreq_register_driver(&p4clockmod_driver);
        if (!ret)
-               printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock Modulation available\n");
+               printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock "
+                               "Modulation available\n");
  
-       return (ret);
+       return ret;
  }
  
  
@@@ -310,9 -329,9 +328,9 @@@ static void __exit cpufreq_p4_exit(void
  }
  
  
- MODULE_AUTHOR ("Zwane Mwaikambo <zwane@commfireservices.com>");
- MODULE_DESCRIPTION ("cpufreq driver for Pentium(TM) 4/Xeon(TM)");
- MODULE_LICENSE ("GPL");
+ MODULE_AUTHOR("Zwane Mwaikambo <zwane@commfireservices.com>");
+ MODULE_DESCRIPTION("cpufreq driver for Pentium(TM) 4/Xeon(TM)");
+ MODULE_LICENSE("GPL");
  
  late_initcall(cpufreq_p4_init);
  module_exit(cpufreq_p4_exit);
diff --combined arch/x86/kernel/tsc.c
index d5cebb52d45ba3e30844b8171e275eb76647493c,5ad22f8f5f3a24840337da60b2f2b8ffc4fcbf01..b8e7aaf7ef751eee1fc338b79094a6a15dba6d4d
@@@ -273,43 -273,30 +273,43 @@@ static unsigned long pit_calibrate_tsc(
   * use the TSC value at the transitions to calculate a pretty
   * good value for the TSC frequencty.
   */
 -static inline int pit_expect_msb(unsigned char val)
 +static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
  {
 -      int count = 0;
 +      int count;
 +      u64 tsc = 0;
  
        for (count = 0; count < 50000; count++) {
                /* Ignore LSB */
                inb(0x42);
                if (inb(0x42) != val)
                        break;
 +              tsc = get_cycles();
        }
 -      return count > 50;
 +      *deltap = get_cycles() - tsc;
 +      *tscp = tsc;
 +
 +      /*
 +       * We require _some_ success, but the quality control
 +       * will be based on the error terms on the TSC values.
 +       */
 +      return count > 5;
  }
  
  /*
 - * How many MSB values do we want to see? We aim for a
 - * 15ms calibration, which assuming a 2us counter read
 - * error should give us roughly 150 ppm precision for
 - * the calibration.
 + * How many MSB values do we want to see? We aim for
 + * a maximum error rate of 500ppm (in practice the
 + * real error is much smaller), but refuse to spend
 + * more than 25ms on it.
   */
 -#define QUICK_PIT_MS 15
 -#define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
 +#define MAX_QUICK_PIT_MS 25
 +#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
  
  static unsigned long quick_pit_calibrate(void)
  {
 +      int i;
 +      u64 tsc, delta;
 +      unsigned long d1, d2;
 +
        /* Set the Gate high, disable speaker */
        outb((inb(0x61) & ~0x02) | 0x01, 0x61);
  
        outb(0xff, 0x42);
        outb(0xff, 0x42);
  
 -      if (pit_expect_msb(0xff)) {
 -              int i;
 -              u64 t1, t2, delta;
 -              unsigned char expect = 0xfe;
 -
 -              t1 = get_cycles();
 -              for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) {
 -                      if (!pit_expect_msb(expect))
 -                              goto failed;
 +      /*
 +       * The PIT starts counting at the next edge, so we
 +       * need to delay for a microsecond. The easiest way
 +       * to do that is to just read back the 16-bit counter
 +       * once from the PIT.
 +       */
 +      inb(0x42);
 +      inb(0x42);
 +
 +      if (pit_expect_msb(0xff, &tsc, &d1)) {
 +              for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
 +                      if (!pit_expect_msb(0xff-i, &delta, &d2))
 +                              break;
 +
 +                      /*
 +                       * Iterate until the error is less than 500 ppm
 +                       */
 +                      delta -= tsc;
 +                      if (d1+d2 < delta >> 11)
 +                              goto success;
                }
 -              t2 = get_cycles();
 -
 -              /*
 -               * Make sure we can rely on the second TSC timestamp:
 -               */
 -              if (!pit_expect_msb(expect))
 -                      goto failed;
 -
 -              /*
 -               * Ok, if we get here, then we've seen the
 -               * MSB of the PIT decrement QUICK_PIT_ITERATIONS
 -               * times, and each MSB had many hits, so we never
 -               * had any sudden jumps.
 -               *
 -               * As a result, we can depend on there not being
 -               * any odd delays anywhere, and the TSC reads are
 -               * reliable.
 -               *
 -               * kHz = ticks / time-in-seconds / 1000;
 -               * kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000
 -               * kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000)
 -               */
 -              delta = (t2 - t1)*PIT_TICK_RATE;
 -              do_div(delta, QUICK_PIT_ITERATIONS*256*1000);
 -              printk("Fast TSC calibration using PIT\n");
 -              return delta;
        }
 -failed:
 +      printk("Fast TSC calibration failed\n");
        return 0;
 +
 +success:
 +      /*
 +       * Ok, if we get here, then we've seen the
 +       * MSB of the PIT decrement 'i' times, and the
 +       * error has shrunk to less than 500 ppm.
 +       *
 +       * As a result, we can depend on there not being
 +       * any odd delays anywhere, and the TSC reads are
 +       * reliable (within the error). We also adjust the
 +       * delta to the middle of the error bars, just
 +       * because it looks nicer.
 +       *
 +       * kHz = ticks / time-in-seconds / 1000;
 +       * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
 +       * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
 +       */
 +      delta += (long)(d2 - d1)/2;
 +      delta *= PIT_TICK_RATE;
 +      do_div(delta, i*256*1000);
 +      printk("Fast TSC calibration using PIT\n");
 +      return delta;
  }
  
  /**
@@@ -543,8 -523,6 +543,6 @@@ unsigned long native_calibrate_tsc(void
        return tsc_pit_min;
  }
  
- #ifdef CONFIG_X86_32
- /* Only called from the Powernow K7 cpu freq driver */
  int recalibrate_cpu_khz(void)
  {
  #ifndef CONFIG_SMP
  
  EXPORT_SYMBOL(recalibrate_cpu_khz);
  
- #endif /* CONFIG_X86_32 */
  
  /* Accelerators for sched_clock()
   * convert from cycles(64bits) => nanoseconds (64bits)
index d6daf3c507d3491b0e78a75f2366820114027f03,6fe466efb0b590aaf395bcfd339bd7962bf65a07..d270e8eb3e67f3fb0af2af1b6d4ea7a36521cf07
@@@ -104,7 -104,8 +104,8 @@@ EXPORT_SYMBOL_GPL(unlock_policy_rwsem_w
  
  
  /* internal prototypes */
- static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
+ static int __cpufreq_governor(struct cpufreq_policy *policy,
+               unsigned int event);
  static unsigned int __cpufreq_get(unsigned int cpu);
  static void handle_update(struct work_struct *work);
  
@@@ -128,7 -129,7 +129,7 @@@ static int __init init_cpufreq_transiti
  pure_initcall(init_cpufreq_transition_notifier_list);
  
  static LIST_HEAD(cpufreq_governor_list);
- static DEFINE_MUTEX (cpufreq_governor_mutex);
+ static DEFINE_MUTEX(cpufreq_governor_mutex);
  
  struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
  {
@@@ -371,7 -372,7 +372,7 @@@ static struct cpufreq_governor *__find_
        struct cpufreq_governor *t;
  
        list_for_each_entry(t, &cpufreq_governor_list, governor_list)
-               if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN))
+               if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN))
                        return t;
  
        return NULL;
@@@ -429,15 -430,11 +430,11 @@@ static int cpufreq_parse_governor(char 
  
                mutex_unlock(&cpufreq_governor_mutex);
        }
  out:
+ out:
        return err;
  }
  
  
- /* drivers/base/cpu.c */
- extern struct sysdev_class cpu_sysdev_class;
  /**
   * cpufreq_per_cpu_attr_read() / show_##file_name() -
   * print out cpufreq information
  static ssize_t show_##file_name                               \
  (struct cpufreq_policy *policy, char *buf)            \
  {                                                     \
-       return sprintf (buf, "%u\n", policy->object);   \
+       return sprintf(buf, "%u\n", policy->object);    \
  }
  
  show_one(cpuinfo_min_freq, cpuinfo.min_freq);
  show_one(cpuinfo_max_freq, cpuinfo.max_freq);
+ show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
  show_one(scaling_min_freq, min);
  show_one(scaling_max_freq, max);
  show_one(scaling_cur_freq, cur);
@@@ -476,7 -474,7 +474,7 @@@ static ssize_t store_##file_name                                   
        if (ret)                                                        \
                return -EINVAL;                                         \
                                                                        \
-       ret = sscanf (buf, "%u", &new_policy.object);                   \
+       ret = sscanf(buf, "%u", &new_policy.object);                    \
        if (ret != 1)                                                   \
                return -EINVAL;                                         \
                                                                        \
        return ret ? ret : count;                                       \
  }
  
- store_one(scaling_min_freq,min);
- store_one(scaling_max_freq,max);
+ store_one(scaling_min_freq, min);
+ store_one(scaling_max_freq, max);
  
  /**
   * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
@@@ -507,12 -505,13 +505,13 @@@ static ssize_t show_cpuinfo_cur_freq(st
   */
  static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
  {
-       if(policy->policy == CPUFREQ_POLICY_POWERSAVE)
+       if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
                return sprintf(buf, "powersave\n");
        else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
                return sprintf(buf, "performance\n");
        else if (policy->governor)
-               return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n", policy->governor->name);
+               return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n",
+                               policy->governor->name);
        return -EINVAL;
  }
  
@@@ -531,7 -530,7 +530,7 @@@ static ssize_t store_scaling_governor(s
        if (ret)
                return ret;
  
-       ret = sscanf (buf, "%15s", str_governor);
+       ret = sscanf(buf, "%15s", str_governor);
        if (ret != 1)
                return -EINVAL;
  
@@@ -575,7 -574,8 +574,8 @@@ static ssize_t show_scaling_available_g
        }
  
        list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
-               if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char)) - (CPUFREQ_NAME_LEN + 2)))
+               if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
+                   - (CPUFREQ_NAME_LEN + 2)))
                        goto out;
                i += scnprintf(&buf[i], CPUFREQ_NAME_LEN, "%s ", t->name);
        }
@@@ -594,7 -594,7 +594,7 @@@ static ssize_t show_cpus(const struct c
                        i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
                i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
                if (i >= (PAGE_SIZE - 5))
-                   break;
+                       break;
        }
        i += sprintf(&buf[i], "\n");
        return i;
@@@ -660,6 -660,7 +660,7 @@@ __ATTR(_name, 0644, show_##_name, store
  define_one_ro0400(cpuinfo_cur_freq);
  define_one_ro(cpuinfo_min_freq);
  define_one_ro(cpuinfo_max_freq);
+ define_one_ro(cpuinfo_transition_latency);
  define_one_ro(scaling_available_governors);
  define_one_ro(scaling_driver);
  define_one_ro(scaling_cur_freq);
@@@ -673,6 -674,7 +674,7 @@@ define_one_rw(scaling_setspeed)
  static struct attribute *default_attrs[] = {
        &cpuinfo_min_freq.attr,
        &cpuinfo_max_freq.attr,
+       &cpuinfo_transition_latency.attr,
        &scaling_min_freq.attr,
        &scaling_max_freq.attr,
        &affected_cpus.attr,
        NULL
  };
  
- #define to_policy(k) container_of(k,struct cpufreq_policy,kobj)
- #define to_attr(a) container_of(a,struct freq_attr,attr)
+ #define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
+ #define to_attr(a) container_of(a, struct freq_attr, attr)
  
- static ssize_t show(struct kobject *kobj, struct attribute *attr ,char *buf)
+ static ssize_t show(struct kobject *kobj, struct attribute *attrchar *buf)
  {
        struct cpufreq_policy *policy = to_policy(kobj);
        struct freq_attr *fattr = to_attr(attr);
@@@ -754,6 -756,11 +756,6 @@@ static struct kobj_type ktype_cpufreq 
        .release        = cpufreq_sysfs_release,
  };
  
 -static struct kobj_type ktype_empty_cpufreq = {
 -      .sysfs_ops      = &sysfs_ops,
 -      .release        = cpufreq_sysfs_release,
 -};
 -
  
  /**
   * cpufreq_add_dev - add a CPU device
@@@ -853,10 -860,10 +855,10 @@@ static int cpufreq_add_dev(struct sys_d
                if (cpu == j)
                        continue;
  
-               /* check for existing affected CPUs.  They may not be aware
-                * of it due to CPU Hotplug.
+               /* Check for existing affected CPUs.
+                * They may not be aware of it due to CPU Hotplug.
                 */
-               managed_policy = cpufreq_cpu_get(j);            // FIXME: Where is this released?  What about error paths?
+               managed_policy = cpufreq_cpu_get(j);            /* FIXME: Where is this released?  What about error paths? */
                if (unlikely(managed_policy)) {
  
                        /* Set proper policy_cpu */
        memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
  
        /* prepare interface data */
 -      if (!cpufreq_driver->hide_interface) {
 -              ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
 -                                         &sys_dev->kobj, "cpufreq");
 +      ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &sys_dev->kobj,
 +                                 "cpufreq");
 +      if (ret)
 +              goto err_out_driver_exit;
 +
 +      /* set up files for this cpu device */
 +      drv_attr = cpufreq_driver->attr;
 +      while ((drv_attr) && (*drv_attr)) {
 +              ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
                if (ret)
                        goto err_out_driver_exit;
 -
 -              /* set up files for this cpu device */
 -              drv_attr = cpufreq_driver->attr;
 -              while ((drv_attr) && (*drv_attr)) {
 -                      ret = sysfs_create_file(&policy->kobj,
 -                                              &((*drv_attr)->attr));
 -                      if (ret)
 -                              goto err_out_driver_exit;
 -                      drv_attr++;
 -              }
 -              if (cpufreq_driver->get) {
 -                      ret = sysfs_create_file(&policy->kobj,
 -                                              &cpuinfo_cur_freq.attr);
 -                      if (ret)
 -                              goto err_out_driver_exit;
 -              }
 -              if (cpufreq_driver->target) {
 -                      ret = sysfs_create_file(&policy->kobj,
 -                                              &scaling_cur_freq.attr);
 -                      if (ret)
 -                              goto err_out_driver_exit;
 -              }
 -      } else {
 -              ret = kobject_init_and_add(&policy->kobj, &ktype_empty_cpufreq,
 -                                         &sys_dev->kobj, "cpufreq");
 +              drv_attr++;
 +      }
 +      if (cpufreq_driver->get) {
 +              ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
 +              if (ret)
 +                      goto err_out_driver_exit;
 +      }
 +      if (cpufreq_driver->target) {
 +              ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
                if (ret)
                        goto err_out_driver_exit;
        }
@@@ -1127,8 -1144,8 +1129,8 @@@ static void handle_update(struct work_s
   *    @old_freq: CPU frequency the kernel thinks the CPU runs at
   *    @new_freq: CPU frequency the CPU actually runs at
   *
-  *    We adjust to current frequency first, and need to clean up later. So either call
-  *    to cpufreq_update_policy() or schedule handle_update()).
+  *    We adjust to current frequency first, and need to clean up later.
+  *    So either call to cpufreq_update_policy() or schedule handle_update()).
   */
  static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
                                unsigned int new_freq)
@@@ -1610,7 -1627,8 +1612,8 @@@ EXPORT_SYMBOL_GPL(cpufreq_unregister_go
  
  /**
   * cpufreq_get_policy - get the current cpufreq_policy
-  * @policy: struct cpufreq_policy into which the current cpufreq_policy is written
+  * @policy: struct cpufreq_policy into which the current cpufreq_policy
+  *    is written
   *
   * Reads the current cpufreq policy.
   */