hwmon: PMBus driver documentation
authorGuenter Roeck <guenter.roeck@ericsson.com>
Mon, 28 Jun 2010 21:29:03 +0000 (14:29 -0700)
committerGuenter Roeck <guenter.roeck@ericsson.com>
Tue, 15 Mar 2011 05:38:58 +0000 (22:38 -0700)
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Documentation/hwmon/pmbus [new file with mode: 0644]

diff --git a/Documentation/hwmon/pmbus b/Documentation/hwmon/pmbus
new file mode 100644 (file)
index 0000000..f2d42e8
--- /dev/null
@@ -0,0 +1,215 @@
+Kernel driver pmbus
+====================
+
+Supported chips:
+  * Ericsson BMR45X series
+    DC/DC Converter
+    Prefixes: 'bmr450', 'bmr451', 'bmr453', 'bmr454'
+    Addresses scanned: -
+    Datasheet:
+ http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146395
+  * Linear Technology LTC2978
+    Octal PMBus Power Supply Monitor and Controller
+    Prefix: 'ltc2978'
+    Addresses scanned: -
+    Datasheet: http://cds.linear.com/docs/Datasheet/2978fa.pdf
+  * Maxim MAX16064
+    Quad Power-Supply Controller
+    Prefix: 'max16064'
+    Addresses scanned: -
+    Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX16064.pdf
+  * Maxim MAX34440
+    PMBus 6-Channel Power-Supply Manager
+    Prefixes: 'max34440'
+    Addresses scanned: -
+    Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34440.pdf
+  * Maxim MAX34441
+    PMBus 5-Channel Power-Supply Manager and Intelligent Fan Controller
+    Prefixes: 'max34441'
+    Addresses scanned: -
+    Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX34441.pdf
+  * Maxim MAX8688
+    Digital Power-Supply Controller/Monitor
+    Prefix: 'max8688'
+    Addresses scanned: -
+    Datasheet: http://datasheets.maxim-ic.com/en/ds/MAX8688.pdf
+  * Generic PMBus devices
+    Prefix: 'pmbus'
+    Addresses scanned: -
+    Datasheet: n.a.
+
+Author: Guenter Roeck <guenter.roeck@ericsson.com>
+
+
+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 suported 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                        Minumum 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 minumum 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 minumum 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_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 "vinY"
+
+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 tempererature.
+                       From READ_TEMPERATURE_X register.
+tempX_min              Mimimum tempererature. From UT_WARN_LIMIT register.
+tempX_max              Maximum tempererature. From OT_WARN_LIMIT register.
+tempX_lcrit            Critical low tempererature.
+                       From UT_FAULT_LIMIT register.
+tempX_crit             Critical high tempererature.
+                       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.