Skip to content

Commit

Permalink
[CPUFREQ] Move PMBASE reading away and do it only once at initializat…
Browse files Browse the repository at this point in the history
…ion 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>
  • Loading branch information
Mattia Dongili authored and Dave Jones committed Dec 7, 2005
1 parent 1a10760 commit 9a7d82a
Showing 1 changed file with 30 additions and 13 deletions.
43 changes: 30 additions & 13 deletions arch/i386/kernel/cpu/cpufreq/speedstep-ich.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);

Expand Down Expand Up @@ -400,6 +414,9 @@ static int __init speedstep_init(void)
return -EINVAL;
}

if (speedstep_find_register())
return -ENODEV;

return cpufreq_register_driver(&speedstep_driver);
}

Expand Down

0 comments on commit 9a7d82a

Please sign in to comment.