#
# CPU Frequency scaling
#

menu "CPU Frequency scaling"

source "drivers/cpufreq/Kconfig"

if CPU_FREQ

comment "CPUFreq processor drivers"

config X86_ACPI_CPUFREQ
	tristate "ACPI Processor P-States driver"
	select CPU_FREQ_TABLE
	depends on ACPI_PROCESSOR
	help
	  This driver adds a CPUFreq driver which utilizes the ACPI
	  Processor Performance States.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config ELAN_CPUFREQ
	tristate "AMD Elan"
	select CPU_FREQ_TABLE
	depends on X86_ELAN
	---help---
	  This adds the CPUFreq driver for AMD Elan SC400 and SC410
	  processors.

	  You need to specify the processor maximum speed as boot
	  parameter: elanfreq=maxspeed (in kHz) or as module
	  parameter "max_freq".

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_POWERNOW_K6
	tristate "AMD Mobile K6-2/K6-3 PowerNow!"
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for mobile AMD K6-2+ and mobile
	  AMD K6-3+ processors.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_POWERNOW_K7
	tristate "AMD Mobile Athlon/Duron PowerNow!"
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for mobile AMD K7 mobile processors.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_POWERNOW_K7_ACPI
	bool
	depends on X86_POWERNOW_K7 && ACPI_PROCESSOR
	depends on !(X86_POWERNOW_K7 = y && ACPI_PROCESSOR = m)
	default y

config X86_POWERNOW_K8
	tristate "AMD Opteron/Athlon64 PowerNow!"
	select CPU_FREQ_TABLE
	depends on EXPERIMENTAL
	help
	  This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_POWERNOW_K8_ACPI
	bool
	depends on X86_POWERNOW_K8 && ACPI_PROCESSOR
	depends on !(X86_POWERNOW_K8 = y && ACPI_PROCESSOR = m)
	default y

config X86_GX_SUSPMOD
	tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
	help
	 This add the CPUFreq driver for NatSemi Geode processors which
	 support suspend modulation.

	 For details, take a look at <file:Documentation/cpu-freq/>.

	 If in doubt, say N.

config X86_SPEEDSTEP_CENTRINO
	tristate "Intel Enhanced SpeedStep"
	select CPU_FREQ_TABLE
	select X86_SPEEDSTEP_CENTRINO_TABLE if (!X86_SPEEDSTEP_CENTRINO_ACPI)
	help
	  This adds the CPUFreq driver for Enhanced SpeedStep enabled
	  mobile CPUs.  This means Intel Pentium M (Centrino) CPUs. However,
	  you also need to say Y to "Use ACPI tables to decode..." below
	  [which might imply enabling ACPI] if you want to use this driver
	  on non-Banias CPUs.
	  
	  For details, take a look at <file:Documentation/cpu-freq/>.
	  
	  If in doubt, say N.

config X86_SPEEDSTEP_CENTRINO_ACPI
	bool "Use ACPI tables to decode valid frequency/voltage pairs"
	depends on X86_SPEEDSTEP_CENTRINO && ACPI_PROCESSOR
	depends on !(X86_SPEEDSTEP_CENTRINO = y && ACPI_PROCESSOR = m)
	default y
	help
	  Use primarily the information provided in the BIOS ACPI tables
	  to determine valid CPU frequency and voltage pairings. It is
	  required for the driver to work on non-Banias CPUs.

	  If in doubt, say Y.

config X86_SPEEDSTEP_CENTRINO_TABLE
	bool "Built-in tables for Banias CPUs"
	depends on X86_SPEEDSTEP_CENTRINO
	default y
	help
	  Use built-in tables for Banias CPUs if ACPI encoding
	  is not available.

	  If in doubt, say N.

config X86_SPEEDSTEP_ICH
	tristate "Intel Speedstep on ICH-M chipsets (ioport interface)"
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for certain mobile Intel Pentium III
	  (Coppermine), all mobile Intel Pentium III-M (Tualatin) and all
	  mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, 
	  ICH3 or ICH4 southbridge.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_SPEEDSTEP_SMI
	tristate "Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)"
	select CPU_FREQ_TABLE
	depends on EXPERIMENTAL
	help
	  This adds the CPUFreq driver for certain mobile Intel Pentium III
	  (Coppermine), all mobile Intel Pentium III-M (Tualatin)  
	  on systems which have an Intel 440BX/ZX/MX southbridge.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_P4_CLOCKMOD
	tristate "Intel Pentium 4 clock modulation"
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for Intel Pentium 4 / XEON
	  processors.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_CPUFREQ_NFORCE2
	tristate "nVidia nForce2 FSB changing"
	depends on EXPERIMENTAL
	help
	  This adds the CPUFreq driver for FSB changing on nVidia nForce2
	  platforms.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_LONGRUN
	tristate "Transmeta LongRun"
	help
	  This adds the CPUFreq driver for Transmeta Crusoe and Efficeon processors
	  which support LongRun.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

config X86_LONGHAUL
	tristate "VIA Cyrix III Longhaul"
	select CPU_FREQ_TABLE
	help
	  This adds the CPUFreq driver for VIA Samuel/CyrixIII, 
	  VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T 
	  processors.

	  For details, take a look at <file:Documentation/cpu-freq/>.

	  If in doubt, say N.

comment "shared options"

config X86_ACPI_CPUFREQ_PROC_INTF
        bool "/proc/acpi/processor/../performance interface (deprecated)"
	depends on PROC_FS
	depends on X86_ACPI_CPUFREQ || X86_SPEEDSTEP_CENTRINO_ACPI || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI
	help
	  This enables the deprecated /proc/acpi/processor/../performance 
	  interface. While it is helpful for debugging, the generic,
	  cross-architecture cpufreq interfaces should be used.

	  If in doubt, say N.

config X86_SPEEDSTEP_LIB
	tristate
	default X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD

config X86_SPEEDSTEP_RELAXED_CAP_CHECK
	bool "Relaxed speedstep capability checks"
	depends on (X86_SPEEDSTEP_SMI || X86_SPEEDSTEP_ICH)
	help
	  Don't perform all checks for a speedstep capable system which would 
	  normally be done. Some ancient or strange systems, though speedstep 
	  capable, don't always indicate that they are speedstep capable. This 
	  option lets the probing code bypass some of those checks if the
	  parameter "relaxed_check=1" is passed to the module.

endif	# CPU_FREQ

endmenu
