Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a7d82a8 authored by Mattia Dongili's avatar Mattia Dongili Committed by Dave Jones
Browse files

[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: default avatarMattia Dongili <malattia@linux.it>
Acked-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 1a10760c
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -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);
}