|
@@ -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);
|
|
|
}
|
|
|
|