Kernel driver pmbus
====================

Supported chips:
  * Ericsson BMR453, BMR454
    Prefixes: 'bmr453', 'bmr454'
    Addresses scanned: -
    Datasheet:
 http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146395
  * ON Semiconductor ADP4000, NCP4200, NCP4208
    Prefixes: 'adp4000', 'ncp4200', 'ncp4208'
    Addresses scanned: -
    Datasheets:
	http://www.onsemi.com/pub_link/Collateral/ADP4000-D.PDF
	http://www.onsemi.com/pub_link/Collateral/NCP4200-D.PDF
	http://www.onsemi.com/pub_link/Collateral/JUNE%202009-%20REV.%200.PDF
  * Lineage Power
    Prefixes: 'mdt040', 'pdt003', 'pdt006', 'pdt012', 'udt020'
    Addresses scanned: -
    Datasheets:
	http://www.lineagepower.com/oem/pdf/PDT003A0X.pdf
	http://www.lineagepower.com/oem/pdf/PDT006A0X.pdf
	http://www.lineagepower.com/oem/pdf/PDT012A0X.pdf
	http://www.lineagepower.com/oem/pdf/UDT020A0X.pdf
	http://www.lineagepower.com/oem/pdf/MDT040A0X.pdf
  * Texas Instruments TPS40400, TPS40422
    Prefixes: 'tps40400', 'tps40422'
    Addresses scanned: -
    Datasheets:
	http://www.ti.com/lit/gpn/tps40400
	http://www.ti.com/lit/gpn/tps40422
  * Generic PMBus devices
    Prefix: 'pmbus'
    Addresses scanned: -
    Datasheet: n.a.

Author: Guenter Roeck <linux@roeck-us.net>


Description
-----------

This driver supports hardware montoring for various PMBus compliant devices.
It supports voltage, current, power, and temperature sensors as supported
by the device.

Each monitored channel has its own high and low limits, plus a critical
limit.

Fan support will be added in a later version of this driver.


Usage Notes
-----------

This driver does not probe for PMBus devices, since there is no register
which can be safely used to identify the chip (The MFG_ID register is not
supported by all chips), and since there is no well defined address range for
PMBus devices. You will have to instantiate the devices explicitly.

Example: the following will load the driver for an LTC2978 at address 0x60
on I2C bus #1:
$ modprobe pmbus
$ echo ltc2978 0x60 > /sys/bus/i2c/devices/i2c-1/new_device


Platform data support
---------------------

Support for additional PMBus chips can be added by defining chip parameters in
a new chip specific driver file. For example, (untested) code to add support for
Emerson DS1200 power modules might look as follows.

static struct pmbus_driver_info ds1200_info = {
	.pages = 1,
	/* Note: All other sensors are in linear mode */
	.direct[PSC_VOLTAGE_OUT] = true,
	.direct[PSC_TEMPERATURE] = true,
	.direct[PSC_CURRENT_OUT] = true,
	.m[PSC_VOLTAGE_IN] = 1,
	.b[PSC_VOLTAGE_IN] = 0,
	.R[PSC_VOLTAGE_IN] = 3,
	.m[PSC_VOLTAGE_OUT] = 1,
	.b[PSC_VOLTAGE_OUT] = 0,
	.R[PSC_VOLTAGE_OUT] = 3,
	.m[PSC_TEMPERATURE] = 1,
	.b[PSC_TEMPERATURE] = 0,
	.R[PSC_TEMPERATURE] = 3,
	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT
		   | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
		   | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
		   | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT
		   | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
		   | PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
};

static int ds1200_probe(struct i2c_client *client,
			const struct i2c_device_id *id)
{
	return pmbus_do_probe(client, id, &ds1200_info);
}

static int ds1200_remove(struct i2c_client *client)
{
	return pmbus_do_remove(client);
}

static const struct i2c_device_id ds1200_id[] = {
	{"ds1200", 0},
	{}
};

MODULE_DEVICE_TABLE(i2c, ds1200_id);

/* This is the driver that will be inserted */
static struct i2c_driver ds1200_driver = {
	.driver = {
		   .name = "ds1200",
		   },
	.probe = ds1200_probe,
	.remove = ds1200_remove,
	.id_table = ds1200_id,
};

static int __init ds1200_init(void)
{
	return i2c_add_driver(&ds1200_driver);
}

static void __exit ds1200_exit(void)
{
	i2c_del_driver(&ds1200_driver);
}


Sysfs entries
-------------

When probing the chip, the driver identifies which PMBus registers are
supported, and determines available sensors from this information.
Attribute files only exist if respective sensors are supported by the chip.
Labels are provided to inform the user about the sensor associated with
a given sysfs entry.

The following attributes are supported. Limits are read-write; all other
attributes are read-only.

inX_input		Measured voltage. From READ_VIN or READ_VOUT register.
inX_min			Minimum Voltage.
			From VIN_UV_WARN_LIMIT or VOUT_UV_WARN_LIMIT register.
inX_max			Maximum voltage.
			From VIN_OV_WARN_LIMIT or VOUT_OV_WARN_LIMIT register.
inX_lcrit		Critical minimum Voltage.
			From VIN_UV_FAULT_LIMIT or VOUT_UV_FAULT_LIMIT register.
inX_crit		Critical maximum voltage.
			From VIN_OV_FAULT_LIMIT or VOUT_OV_FAULT_LIMIT register.
inX_min_alarm		Voltage low alarm. From VOLTAGE_UV_WARNING status.
inX_max_alarm		Voltage high alarm. From VOLTAGE_OV_WARNING status.
inX_lcrit_alarm		Voltage critical low alarm.
			From VOLTAGE_UV_FAULT status.
inX_crit_alarm		Voltage critical high alarm.
			From VOLTAGE_OV_FAULT status.
inX_label		"vin", "vcap", or "voutY"

currX_input		Measured current. From READ_IIN or READ_IOUT register.
currX_max		Maximum current.
			From IIN_OC_WARN_LIMIT or IOUT_OC_WARN_LIMIT register.
currX_lcrit		Critical minimum output current.
			From IOUT_UC_FAULT_LIMIT register.
currX_crit		Critical maximum current.
			From IIN_OC_FAULT_LIMIT or IOUT_OC_FAULT_LIMIT register.
currX_alarm		Current high alarm.
			From IIN_OC_WARNING or IOUT_OC_WARNING status.
currX_max_alarm		Current high alarm.
			From IIN_OC_WARN_LIMIT or IOUT_OC_WARN_LIMIT status.
currX_lcrit_alarm	Output current critical low alarm.
			From IOUT_UC_FAULT status.
currX_crit_alarm	Current critical high alarm.
			From IIN_OC_FAULT or IOUT_OC_FAULT status.
currX_label		"iin" or "ioutY"

powerX_input		Measured power. From READ_PIN or READ_POUT register.
powerX_cap		Output power cap. From POUT_MAX register.
powerX_max		Power limit. From PIN_OP_WARN_LIMIT or
			POUT_OP_WARN_LIMIT register.
powerX_crit		Critical output power limit.
			From POUT_OP_FAULT_LIMIT register.
powerX_alarm		Power high alarm.
			From PIN_OP_WARNING or POUT_OP_WARNING status.
powerX_crit_alarm	Output power critical high alarm.
			From POUT_OP_FAULT status.
powerX_label		"pin" or "poutY"

tempX_input		Measured temperature.
			From READ_TEMPERATURE_X register.
tempX_min		Mimimum temperature. From UT_WARN_LIMIT register.
tempX_max		Maximum temperature. From OT_WARN_LIMIT register.
tempX_lcrit		Critical low temperature.
			From UT_FAULT_LIMIT register.
tempX_crit		Critical high temperature.
			From OT_FAULT_LIMIT register.
tempX_min_alarm		Chip temperature low alarm. Set by comparing
			READ_TEMPERATURE_X with UT_WARN_LIMIT if
			TEMP_UT_WARNING status is set.
tempX_max_alarm		Chip temperature high alarm. Set by comparing
			READ_TEMPERATURE_X with OT_WARN_LIMIT if
			TEMP_OT_WARNING status is set.
tempX_lcrit_alarm	Chip temperature critical low alarm. Set by comparing
			READ_TEMPERATURE_X with UT_FAULT_LIMIT if
			TEMP_UT_FAULT status is set.
tempX_crit_alarm	Chip temperature critical high alarm. Set by comparing
			READ_TEMPERATURE_X with OT_FAULT_LIMIT if
			TEMP_OT_FAULT status is set.
