linux/Documentation/hwmon/asc7621.rst

=====================
Kernel driver asc7621
=====================

Supported chips:

    Andigilog aSC7621 and aSC7621a

    Prefix: 'asc7621'

    Addresses scanned: I2C 0x2c, 0x2d, 0x2e

    Datasheet: http://www.fairview5.com/linux/asc7621/asc7621.pdf

Author:
		George Joseph

Description provided by Dave Pivin @ Andigilog:

Andigilog has both the PECI and pre-PECI versions of the Heceta-6, as
Intel calls them. Heceta-6e has high frequency PWM and Heceta-6p has
added PECI and a 4th thermal zone. The Andigilog aSC7611 is the
Heceta-6e part and aSC7621 is the Heceta-6p part. They are both in
volume production, shipping to Intel and their subs.

We have enhanced both parts relative to the governing Intel
specification. First enhancement is temperature reading resolution. We
have used registers below 20h for vendor-specific functions in addition
to those in the Intel-specified vendor range.

Our conversion process produces a result that is reported as two bytes.
The fan speed control uses this finer value to produce a "step-less" fan
PWM output. These two bytes are "read-locked" to guarantee that once a
high or low byte is read, the other byte is locked-in until after the
next read of any register. So to get an atomic reading, read high or low
byte, then the very next read should be the opposite byte. Our data
sheet says 10-bits of resolution, although you may find the lower bits
are active, they are not necessarily reliable or useful externally. We
chose not to mask them.

We employ significant filtering that is user tunable as described in the
data sheet. Our temperature reports and fan PWM outputs are very smooth
when compared to the competition, in addition to the higher resolution
temperature reports. The smoother PWM output does not require user
intervention.

We offer GPIO features on the former VID pins. These are open-drain
outputs or inputs and may be used as general purpose I/O or as alarm
outputs that are based on temperature limits. These are in 19h and 1Ah.

We offer flexible mapping of temperature readings to thermal zones. Any
temperature may be mapped to any zone, which has a default assignment
that follows Intel's specs.

Since there is a fan to zone assignment that allows for the "hotter" of
a set of zones to control the PWM of an individual fan, but there is no
indication to the user, we have added an indicator that shows which zone
is currently controlling the PWM for a given fan. This is in register
00h.

Both remote diode temperature readings may be given an offset value such
that the reported reading as well as the temperature used to determine
PWM may be offset for system calibration purposes.

PECI Extended configuration allows for having more than two domains per
PECI address and also provides an enabling function for each PECI
address. One could use our flexible zone assignment to have a zone
assigned to up to 4 PECI addresses. This is not possible in the default
Intel configuration. This would be useful in multi-CPU systems with
individual fans on each that would benefit from individual fan control.
This is in register 0Eh.

The tachometer measurement system is flexible and able to adapt to many
fan types. We can also support pulse-stretched PWM so that 3-wire fans
may be used. These characteristics are in registers 04h to 07h.

Finally, we have added a tach disable function that turns off the tach
measurement system for individual tachs in order to save power. That is
in register 75h.

--------------------------------------------------------------------------

aSC7621 Product Description
===========================

The aSC7621 has a two wire digital interface compatible with SMBus 2.0.
Using a 10-bit ADC, the aSC7621 measures the temperature of two remote diode
connected transistors as well as its own die. Support for Platform
Environmental Control Interface (PECI) is included.

Using temperature information from these four zones, an automatic fan speed
control algorithm is employed to minimize acoustic impact while achieving
recommended CPU temperature under varying operational loads.

To set fan speed, the aSC7621 has three independent pulse width modulation
(PWM) outputs that are controlled by one, or a combination of three,
temperature zones. Both high- and low-frequency PWM ranges are supported.

The aSC7621 also includes a digital filter that can be invoked to smooth
temperature readings for better control of fan speed and minimum acoustic
impact.

The aSC7621 has tachometer inputs to measure fan speed on up to four fans.
Limit and status registers for all measured values are included to alert
the system host that any measurements are outside of programmed limits
via status registers.

System voltages of VCCP, 2.5V, 3.3V, 5.0V, and 12V motherboard power are
monitored efficiently with internal scaling resistors.

Features
--------

- Supports PECI interface and monitors internal and remote thermal diodes
- 2-wire, SMBus 2.0 compliant, serial interface
- 10-bit ADC
- Monitors VCCP, 2.5V, 3.3V, 5.0V, and 12V motherboard/processor supplies
- Programmable autonomous fan control based on temperature readings
- Noise filtering of temperature reading for fan speed control
- 0.25C digital temperature sensor resolution
- 3 PWM fan speed control outputs for 2-, 3- or 4-wire fans and up to 4 fan
  tachometer inputs
- Enhanced measured temperature to Temperature Zone assignment.
- Provides high and low PWM frequency ranges
- 3 GPIO pins for custom use
- 24-Lead QSOP package

Configuration Notes
===================

Except where noted below, the sysfs entries created by this driver follow
the standards defined in "sysfs-interface".

temp1_source
	=	===============================================
	0 	(default) peci_legacy = 0, Remote 1 Temperature
		peci_legacy = 1, PECI Processor Temperature 0
	1 	Remote 1 Temperature
	2 	Remote 2 Temperature
	3 	Internal Temperature
	4 	PECI Processor Temperature 0
	5 	PECI Processor Temperature 1
	6 	PECI Processor Temperature 2
	7	PECI Processor Temperature 3
	=	===============================================

temp2_source
	=	===============================================
	0 	(default) Internal Temperature
	1 	Remote 1 Temperature
	2 	Remote 2 Temperature
	3 	Internal Temperature
	4 	PECI Processor Temperature 0
	5 	PECI Processor Temperature 1
	6 	PECI Processor Temperature 2
	7 	PECI Processor Temperature 3
	=	===============================================

temp3_source
	=	===============================================
	0 	(default) Remote 2 Temperature
	1 	Remote 1 Temperature
	2 	Remote 2 Temperature
	3 	Internal Temperature
	4 	PECI Processor Temperature 0
	5 	PECI Processor Temperature 1
	6 	PECI Processor Temperature 2
	7 	PECI Processor Temperature 3
	=	===============================================

temp4_source
	=	===============================================
	0 	(default) peci_legacy = 0, PECI Processor Temperature 0
		peci_legacy = 1, Remote 1 Temperature
	1 	Remote 1 Temperature
	2 	Remote 2 Temperature
	3 	Internal Temperature
	4 	PECI Processor Temperature 0
	5 	PECI Processor Temperature 1
	6 	PECI Processor Temperature 2
	7 	PECI Processor Temperature 3
	=	===============================================

temp[1-4]_smoothing_enable / temp[1-4]_smoothing_time
	Smooths spikes in temp readings caused by noise.
	Valid values in milliseconds are:

	* 35000
	* 17600
	* 11800
	*  7000
	*  4400
	*  3000
	*  1600
	*   800

temp[1-4]_crit
	When the corresponding zone temperature reaches this value,
	ALL pwm outputs will got to 100%.

temp[5-8]_input / temp[5-8]_enable
	The aSC7621 can also read temperatures provided by the processor
	via the PECI bus.  Usually these are "core" temps and are relative
	to the point where the automatic thermal control circuit starts
	throttling.  This means that these are usually negative numbers.

pwm[1-3]_enable
	=============== ========================================================
	0		Fan off.
	1		Fan on manual control.
	2		Fan on automatic control and will run at the minimum pwm
			if the temperature for the zone is below the minimum.
	3		Fan on automatic control but will be off if the
			temperature for the zone is below the minimum.
	4-254		Ignored.
	255		Fan on full.
	=============== ========================================================

pwm[1-3]_auto_channels
	Bitmap as described in sysctl-interface with the following
	exceptions...

	Only the following combination of zones (and their corresponding masks)
	are valid:

	* 1
	* 2
	* 3
	* 2,3
	* 1,2,3
	* 4
	* 1,2,3,4

	* Special values:

	  ==		======================
	  0		Disabled.
	  16		Fan on manual control.
	  31		Fan on full.
	  ==		======================


pwm[1-3]_invert
	When set, inverts the meaning of pwm[1-3].
	i.e.  when pwm = 0, the fan will be on full and
	when pwm = 255 the fan will be off.

pwm[1-3]_freq
	PWM frequency in Hz
	Valid values in Hz are:

	* 10
	* 15
	* 23
	* 30  (default)
	* 38
	* 47
	* 62
	* 94
	* 23000
	* 24000
	* 25000
	* 26000
	* 27000
	* 28000
	* 29000
	* 30000

	Setting any other value will be ignored.

peci_enable
	Enables or disables PECI

peci_avg
	Input filter average time.

	* 0 	0 Sec. (no Smoothing) (default)
	* 1 	0.25 Sec.
	* 2 	0.5 Sec.
	* 3 	1.0 Sec.
	* 4 	2.0 Sec.
	* 5 	4.0 Sec.
	* 6 	8.0 Sec.
	* 7 	0.0 Sec.

peci_legacy
	=	============================================
	0	Standard Mode (default)
		Remote Diode 1 reading is associated with
		Temperature Zone 1, PECI is associated with
		Zone 4

	1	Legacy Mode
		PECI is associated with Temperature Zone 1,
		Remote Diode 1 is associated with Zone 4
	=	============================================

peci_diode
	Diode filter

	=	====================
	0	0.25 Sec.
	1 	1.1 Sec.
	2 	2.4 Sec.  (default)
	3 	3.4 Sec.
	4 	5.0 Sec.
	5 	6.8 Sec.
	6 	10.2 Sec.
	7 	16.4 Sec.
	=	====================

peci_4domain
	Four domain enable

	=	===============================================
	0 	1 or 2 Domains for enabled processors (default)
	1 	3 or 4 Domains for enabled processors
	=	===============================================

peci_domain
	Domain

	=	==================================================
	0 	Processor contains a single domain (0) 	 (default)
	1 	Processor contains two domains (0,1)
	=	==================================================