[CPUFREQ] Move PMBASE reading away and do it only once at initialization time
authorMattia Dongili <malattia@linux.it>
Wed, 30 Nov 2005 21:00:59 +0000 (22:00 +0100)
committerDave Jones <davej@redhat.com>
Wed, 7 Dec 2005 03:27:15 +0000 (19:27 -0800)
This patch moves away PMBASE reading and only performs it at
cpufreq_register_driver time by exiting with -ENODEV if unable to read
the value.

Signed-off-by: Mattia Dongili <malattia@linux.it>
Acked-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Dave Jones <davej@redhat.com>
arch/i386/kernel/cpu/cpufreq/speedstep-ich.c

index 862e0b5656b9ed24cc5d46a26ba23b1458c4a35a..b425cd3d1838377aee89ad50411b2f51b6d40306 100644 (file)
@@ -40,6 +40,7 @@ static struct pci_dev *speedstep_chipset_dev;
  */
 static unsigned int speedstep_processor = 0;
 
+static u32 pmbase;
 
 /*
  *   There are only two frequency states for each processor. Values
@@ -56,34 +57,47 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
 
 
 /**
- * speedstep_set_state - set the SpeedStep state
- * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ * speedstep_find_register - read the PMBASE address
  *
- *   Tries to change the SpeedStep state.
+ * Returns: -ENODEV if no register could be found
  */
-static void speedstep_set_state (unsigned int state)
+static int speedstep_find_register (void)
 {
-       u32 pmbase;
-       u8 pm2_blk;
-       u8 value;
-       unsigned long flags;
-
-       if (!speedstep_chipset_dev || (state > 0x1))
-               return;
+       if (!speedstep_chipset_dev)
+               return -ENODEV;
 
        /* get PMBASE */
        pci_read_config_dword(speedstep_chipset_dev, 0x40, &pmbase);
        if (!(pmbase & 0x01)) {
                printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
-               return;
+               return -ENODEV;
        }
 
        pmbase &= 0xFFFFFFFE;
        if (!pmbase) {
                printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
-               return;
+               return -ENODEV;
        }
 
+       dprintk("pmbase is 0x%x\n", pmbase);
+       return 0;
+}
+
+/**
+ * speedstep_set_state - set the SpeedStep state
+ * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ *
+ *   Tries to change the SpeedStep state.
+ */
+static void speedstep_set_state (unsigned int state)
+{
+       u8 pm2_blk;
+       u8 value;
+       unsigned long flags;
+
+       if (state > 0x1)
+               return;
+
        /* Disable IRQs */
        local_irq_save(flags);
 
@@ -400,6 +414,9 @@ static int __init speedstep_init(void)
                return -EINVAL;
        }
 
+       if (speedstep_find_register())
+               return -ENODEV;
+
        return cpufreq_register_driver(&speedstep_driver);
 }