mirror of https://gitee.com/openkylin/linux.git
[CPUFREQ] Move PMBASE reading away and do it only once at initialization time
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>
This commit is contained in:
parent
1a10760c91
commit
9a7d82a89a
|
@ -40,6 +40,7 @@ static struct pci_dev *speedstep_chipset_dev;
|
||||||
*/
|
*/
|
||||||
static unsigned int speedstep_processor = 0;
|
static unsigned int speedstep_processor = 0;
|
||||||
|
|
||||||
|
static u32 pmbase;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are only two frequency states for each processor. Values
|
* There are only two frequency states for each processor. Values
|
||||||
|
@ -55,6 +56,33 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg)
|
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* speedstep_find_register - read the PMBASE address
|
||||||
|
*
|
||||||
|
* Returns: -ENODEV if no register could be found
|
||||||
|
*/
|
||||||
|
static int speedstep_find_register (void)
|
||||||
|
{
|
||||||
|
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 -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmbase &= 0xFFFFFFFE;
|
||||||
|
if (!pmbase) {
|
||||||
|
printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintk("pmbase is 0x%x\n", pmbase);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* speedstep_set_state - set the SpeedStep state
|
* speedstep_set_state - set the SpeedStep state
|
||||||
* @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
|
* @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
|
||||||
|
@ -63,27 +91,13 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
|
||||||
*/
|
*/
|
||||||
static void speedstep_set_state (unsigned int state)
|
static void speedstep_set_state (unsigned int state)
|
||||||
{
|
{
|
||||||
u32 pmbase;
|
|
||||||
u8 pm2_blk;
|
u8 pm2_blk;
|
||||||
u8 value;
|
u8 value;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (!speedstep_chipset_dev || (state > 0x1))
|
if (state > 0x1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
pmbase &= 0xFFFFFFFE;
|
|
||||||
if (!pmbase) {
|
|
||||||
printk(KERN_ERR "speedstep-ich: could not find speedstep register\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable IRQs */
|
/* Disable IRQs */
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
@ -400,6 +414,9 @@ static int __init speedstep_init(void)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (speedstep_find_register())
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
return cpufreq_register_driver(&speedstep_driver);
|
return cpufreq_register_driver(&speedstep_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue