hwmon: (adm1275) Add support for peak attributes
Guenter Roeck [Sat, 9 Jul 2011 18:17:33 +0000 (11:17 -0700)]
Add support for voltage and current peak (historic maximum) attributes.

Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>

Documentation/hwmon/adm1275
drivers/hwmon/pmbus/adm1275.c

index 6a3a647..097b3cc 100644 (file)
@@ -43,8 +43,8 @@ Documentation/hwmon/pmbus for details.
 Sysfs entries
 -------------
 
-The following attributes are supported. Limits are read-write; all other
-attributes are read-only.
+The following attributes are supported. Limits are read-write, history reset
+attributes are write-only, all other attributes are read-only.
 
 in1_label              "vin1" or "vout1" depending on chip variant and
                        configuration.
@@ -53,8 +53,12 @@ in1_min                      Minumum Voltage. From VOUT_UV_WARN_LIMIT register.
 in1_max                        Maximum voltage. From VOUT_OV_WARN_LIMIT register.
 in1_min_alarm          Voltage low alarm. From VOLTAGE_UV_WARNING status.
 in1_max_alarm          Voltage high alarm. From VOLTAGE_OV_WARNING status.
+in1_highest            Historical maximum voltage.
+in1_reset_history      Write any value to reset history.
 
 curr1_label            "iout1"
 curr1_input            Measured current. From READ_IOUT register.
 curr1_max              Maximum current. From IOUT_OC_WARN_LIMIT register.
 curr1_max_alarm                Current high alarm. From IOUT_OC_WARN_LIMIT register.
+curr1_highest          Historical maximum current.
+curr1_reset_history    Write any value to reset history.
index 71770ff..c936e27 100644 (file)
 #include <linux/i2c.h>
 #include "pmbus.h"
 
+#define ADM1275_PEAK_IOUT              0xd0
+#define ADM1275_PEAK_VIN               0xd1
+#define ADM1275_PEAK_VOUT              0xd2
 #define ADM1275_PMON_CONFIG            0xd4
 
 #define ADM1275_VIN_VOUT_SELECT                (1 << 6)
 #define ADM1275_VRANGE                 (1 << 5)
 
+static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
+{
+       int ret;
+
+       if (page)
+               return -EINVAL;
+
+       switch (reg) {
+       case PMBUS_VIRT_READ_IOUT_MAX:
+               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT);
+               break;
+       case PMBUS_VIRT_READ_VOUT_MAX:
+               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT);
+               break;
+       case PMBUS_VIRT_READ_VIN_MAX:
+               ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN);
+               break;
+       case PMBUS_VIRT_RESET_IOUT_HISTORY:
+       case PMBUS_VIRT_RESET_VOUT_HISTORY:
+       case PMBUS_VIRT_RESET_VIN_HISTORY:
+               ret = 0;
+               break;
+       default:
+               ret = -ENODATA;
+               break;
+       }
+       return ret;
+}
+
+static int adm1275_write_word_data(struct i2c_client *client, int page, int reg,
+                                  u16 word)
+{
+       int ret;
+
+       if (page)
+               return -EINVAL;
+
+       switch (reg) {
+       case PMBUS_VIRT_RESET_IOUT_HISTORY:
+               ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_IOUT, 0);
+               break;
+       case PMBUS_VIRT_RESET_VOUT_HISTORY:
+               ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VOUT, 0);
+               break;
+       case PMBUS_VIRT_RESET_VIN_HISTORY:
+               ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0);
+               break;
+       default:
+               ret = -ENODATA;
+               break;
+       }
+       return ret;
+}
+
 static int adm1275_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)
 {
@@ -58,6 +115,9 @@ static int adm1275_probe(struct i2c_client *client,
        info->R[PSC_CURRENT_OUT] = -1;
        info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
 
+       info->read_word_data = adm1275_read_word_data;
+       info->write_word_data = adm1275_write_word_data;
+
        if (config & ADM1275_VRANGE) {
                info->m[PSC_VOLTAGE_IN] = 19199;
                info->b[PSC_VOLTAGE_IN] = 0;