Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / hwmon / pmbus_core.c
index 6474512..196ffaf 100644 (file)
@@ -139,7 +139,6 @@ struct pmbus_data {
         * A single status register covers multiple attributes,
         * so we keep them all together.
         */
-       u8 status_bits;
        u8 status[PB_NUM_STATUS_REG];
 
        u8 currpage;
@@ -752,7 +751,7 @@ static void pmbus_add_boolean_cmp(struct pmbus_data *data,
 static void pmbus_add_sensor(struct pmbus_data *data,
                             const char *name, const char *type, int seq,
                             int page, int reg, enum pmbus_sensor_classes class,
-                            bool update)
+                            bool update, bool readonly)
 {
        struct pmbus_sensor *sensor;
 
@@ -765,7 +764,7 @@ static void pmbus_add_sensor(struct pmbus_data *data,
        sensor->reg = reg;
        sensor->class = class;
        sensor->update = update;
-       if (update)
+       if (readonly)
                PMBUS_ADD_GET_ATTR(data, sensor->name, sensor,
                                   data->num_sensors);
        else
@@ -916,14 +915,14 @@ static void pmbus_find_attributes(struct i2c_client *client,
 
                i0 = data->num_sensors;
                pmbus_add_label(data, "in", in_index, "vin", 0);
-               pmbus_add_sensor(data, "in", "input", in_index,
-                                0, PMBUS_READ_VIN, PSC_VOLTAGE_IN, true);
+               pmbus_add_sensor(data, "in", "input", in_index, 0,
+                                PMBUS_READ_VIN, PSC_VOLTAGE_IN, true, true);
                if (pmbus_check_word_register(client, 0,
                                              PMBUS_VIN_UV_WARN_LIMIT)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "min", in_index,
                                         0, PMBUS_VIN_UV_WARN_LIMIT,
-                                        PSC_VOLTAGE_IN, false);
+                                        PSC_VOLTAGE_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT) {
                                pmbus_add_boolean_reg(data, "in", "min_alarm",
                                                      in_index,
@@ -937,7 +936,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "lcrit", in_index,
                                         0, PMBUS_VIN_UV_FAULT_LIMIT,
-                                        PSC_VOLTAGE_IN, false);
+                                        PSC_VOLTAGE_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT) {
                                pmbus_add_boolean_reg(data, "in", "lcrit_alarm",
                                                      in_index,
@@ -951,7 +950,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "max", in_index,
                                         0, PMBUS_VIN_OV_WARN_LIMIT,
-                                        PSC_VOLTAGE_IN, false);
+                                        PSC_VOLTAGE_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT) {
                                pmbus_add_boolean_reg(data, "in", "max_alarm",
                                                      in_index,
@@ -965,7 +964,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "crit", in_index,
                                         0, PMBUS_VIN_OV_FAULT_LIMIT,
-                                        PSC_VOLTAGE_IN, false);
+                                        PSC_VOLTAGE_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT) {
                                pmbus_add_boolean_reg(data, "in", "crit_alarm",
                                                      in_index,
@@ -988,7 +987,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
        if (info->func[0] & PMBUS_HAVE_VCAP) {
                pmbus_add_label(data, "in", in_index, "vcap", 0);
                pmbus_add_sensor(data, "in", "input", in_index, 0,
-                                PMBUS_READ_VCAP, PSC_VOLTAGE_IN, true);
+                                PMBUS_READ_VCAP, PSC_VOLTAGE_IN, true, true);
                in_index++;
        }
 
@@ -1004,13 +1003,13 @@ static void pmbus_find_attributes(struct i2c_client *client,
                i0 = data->num_sensors;
                pmbus_add_label(data, "in", in_index, "vout", page + 1);
                pmbus_add_sensor(data, "in", "input", in_index, page,
-                                PMBUS_READ_VOUT, PSC_VOLTAGE_OUT, true);
+                                PMBUS_READ_VOUT, PSC_VOLTAGE_OUT, true, true);
                if (pmbus_check_word_register(client, page,
                                              PMBUS_VOUT_UV_WARN_LIMIT)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "min", in_index, page,
                                         PMBUS_VOUT_UV_WARN_LIMIT,
-                                        PSC_VOLTAGE_OUT, false);
+                                        PSC_VOLTAGE_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_VOUT) {
                                pmbus_add_boolean_reg(data, "in", "min_alarm",
                                                      in_index,
@@ -1025,7 +1024,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "lcrit", in_index, page,
                                         PMBUS_VOUT_UV_FAULT_LIMIT,
-                                        PSC_VOLTAGE_OUT, false);
+                                        PSC_VOLTAGE_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_VOUT) {
                                pmbus_add_boolean_reg(data, "in", "lcrit_alarm",
                                                      in_index,
@@ -1040,7 +1039,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "max", in_index, page,
                                         PMBUS_VOUT_OV_WARN_LIMIT,
-                                        PSC_VOLTAGE_OUT, false);
+                                        PSC_VOLTAGE_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_VOUT) {
                                pmbus_add_boolean_reg(data, "in", "max_alarm",
                                                      in_index,
@@ -1055,7 +1054,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "in", "crit", in_index, page,
                                         PMBUS_VOUT_OV_FAULT_LIMIT,
-                                        PSC_VOLTAGE_OUT, false);
+                                        PSC_VOLTAGE_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_VOUT) {
                                pmbus_add_boolean_reg(data, "in", "crit_alarm",
                                                      in_index,
@@ -1088,14 +1087,14 @@ static void pmbus_find_attributes(struct i2c_client *client,
        if (info->func[0] & PMBUS_HAVE_IIN) {
                i0 = data->num_sensors;
                pmbus_add_label(data, "curr", in_index, "iin", 0);
-               pmbus_add_sensor(data, "curr", "input", in_index,
-                                0, PMBUS_READ_IIN, PSC_CURRENT_IN, true);
+               pmbus_add_sensor(data, "curr", "input", in_index, 0,
+                                PMBUS_READ_IIN, PSC_CURRENT_IN, true, true);
                if (pmbus_check_word_register(client, 0,
                                              PMBUS_IIN_OC_WARN_LIMIT)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "curr", "max", in_index,
                                         0, PMBUS_IIN_OC_WARN_LIMIT,
-                                        PSC_CURRENT_IN, false);
+                                        PSC_CURRENT_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT) {
                                pmbus_add_boolean_reg(data, "curr", "max_alarm",
                                                      in_index,
@@ -1108,7 +1107,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "curr", "crit", in_index,
                                         0, PMBUS_IIN_OC_FAULT_LIMIT,
-                                        PSC_CURRENT_IN, false);
+                                        PSC_CURRENT_IN, false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT)
                                pmbus_add_boolean_reg(data, "curr",
                                                      "crit_alarm",
@@ -1131,13 +1130,13 @@ static void pmbus_find_attributes(struct i2c_client *client,
                i0 = data->num_sensors;
                pmbus_add_label(data, "curr", in_index, "iout", page + 1);
                pmbus_add_sensor(data, "curr", "input", in_index, page,
-                                PMBUS_READ_IOUT, PSC_CURRENT_OUT, true);
+                                PMBUS_READ_IOUT, PSC_CURRENT_OUT, true, true);
                if (pmbus_check_word_register(client, page,
                                              PMBUS_IOUT_OC_WARN_LIMIT)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "curr", "max", in_index, page,
                                         PMBUS_IOUT_OC_WARN_LIMIT,
-                                        PSC_CURRENT_OUT, false);
+                                        PSC_CURRENT_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_IOUT) {
                                pmbus_add_boolean_reg(data, "curr", "max_alarm",
                                                      in_index,
@@ -1151,7 +1150,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "curr", "lcrit", in_index, page,
                                         PMBUS_IOUT_UC_FAULT_LIMIT,
-                                        PSC_CURRENT_OUT, false);
+                                        PSC_CURRENT_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_IOUT) {
                                pmbus_add_boolean_reg(data, "curr",
                                                      "lcrit_alarm",
@@ -1166,7 +1165,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "curr", "crit", in_index, page,
                                         PMBUS_IOUT_OC_FAULT_LIMIT,
-                                        PSC_CURRENT_OUT, false);
+                                        PSC_CURRENT_OUT, false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_IOUT) {
                                pmbus_add_boolean_reg(data, "curr",
                                                      "crit_alarm",
@@ -1199,13 +1198,13 @@ static void pmbus_find_attributes(struct i2c_client *client,
                i0 = data->num_sensors;
                pmbus_add_label(data, "power", in_index, "pin", 0);
                pmbus_add_sensor(data, "power", "input", in_index,
-                                0, PMBUS_READ_PIN, PSC_POWER, true);
+                                0, PMBUS_READ_PIN, PSC_POWER, true, true);
                if (pmbus_check_word_register(client, 0,
                                              PMBUS_PIN_OP_WARN_LIMIT)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "power", "max", in_index,
                                         0, PMBUS_PIN_OP_WARN_LIMIT, PSC_POWER,
-                                        false);
+                                        false, false);
                        if (info->func[0] & PMBUS_HAVE_STATUS_INPUT)
                                pmbus_add_boolean_reg(data, "power",
                                                      "alarm",
@@ -1228,7 +1227,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                i0 = data->num_sensors;
                pmbus_add_label(data, "power", in_index, "pout", page + 1);
                pmbus_add_sensor(data, "power", "input", in_index, page,
-                                PMBUS_READ_POUT, PSC_POWER, true);
+                                PMBUS_READ_POUT, PSC_POWER, true, true);
                /*
                 * Per hwmon sysfs API, power_cap is to be used to limit output
                 * power.
@@ -1241,7 +1240,8 @@ static void pmbus_find_attributes(struct i2c_client *client,
                if (pmbus_check_word_register(client, page, PMBUS_POUT_MAX)) {
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "power", "cap", in_index, page,
-                                        PMBUS_POUT_MAX, PSC_POWER, false);
+                                        PMBUS_POUT_MAX, PSC_POWER,
+                                        false, false);
                        need_alarm = true;
                }
                if (pmbus_check_word_register(client, page,
@@ -1249,7 +1249,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "power", "max", in_index, page,
                                         PMBUS_POUT_OP_WARN_LIMIT, PSC_POWER,
-                                        false);
+                                        false, false);
                        need_alarm = true;
                }
                if (need_alarm && (info->func[page] & PMBUS_HAVE_STATUS_IOUT))
@@ -1264,7 +1264,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i1 = data->num_sensors;
                        pmbus_add_sensor(data, "power", "crit", in_index, page,
                                         PMBUS_POUT_OP_FAULT_LIMIT, PSC_POWER,
-                                        false);
+                                        false, false);
                        if (info->func[page] & PMBUS_HAVE_STATUS_IOUT)
                                pmbus_add_boolean_reg(data, "power",
                                                      "crit_alarm",
@@ -1302,7 +1302,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                        i0 = data->num_sensors;
                        pmbus_add_sensor(data, "temp", "input", in_index, page,
                                         pmbus_temp_registers[t],
-                                        PSC_TEMPERATURE, true);
+                                        PSC_TEMPERATURE, true, true);
 
                        /*
                         * PMBus provides only one status register for TEMP1-3.
@@ -1323,7 +1323,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                                i1 = data->num_sensors;
                                pmbus_add_sensor(data, "temp", "min", in_index,
                                                 page, PMBUS_UT_WARN_LIMIT,
-                                                PSC_TEMPERATURE, true);
+                                                PSC_TEMPERATURE, true, false);
                                if (info->func[page] & PMBUS_HAVE_STATUS_TEMP) {
                                        pmbus_add_boolean_cmp(data, "temp",
                                                "min_alarm", in_index, i1, i0,
@@ -1338,7 +1338,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                                pmbus_add_sensor(data, "temp", "lcrit",
                                                 in_index, page,
                                                 PMBUS_UT_FAULT_LIMIT,
-                                                PSC_TEMPERATURE, true);
+                                                PSC_TEMPERATURE, true, false);
                                if (info->func[page] & PMBUS_HAVE_STATUS_TEMP) {
                                        pmbus_add_boolean_cmp(data, "temp",
                                                "lcrit_alarm", in_index, i1, i0,
@@ -1352,7 +1352,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                                i1 = data->num_sensors;
                                pmbus_add_sensor(data, "temp", "max", in_index,
                                                 page, PMBUS_OT_WARN_LIMIT,
-                                                PSC_TEMPERATURE, true);
+                                                PSC_TEMPERATURE, true, false);
                                if (info->func[page] & PMBUS_HAVE_STATUS_TEMP) {
                                        pmbus_add_boolean_cmp(data, "temp",
                                                "max_alarm", in_index, i0, i1,
@@ -1366,7 +1366,7 @@ static void pmbus_find_attributes(struct i2c_client *client,
                                i1 = data->num_sensors;
                                pmbus_add_sensor(data, "temp", "crit", in_index,
                                                 page, PMBUS_OT_FAULT_LIMIT,
-                                                PSC_TEMPERATURE, true);
+                                                PSC_TEMPERATURE, true, false);
                                if (info->func[page] & PMBUS_HAVE_STATUS_TEMP) {
                                        pmbus_add_boolean_cmp(data, "temp",
                                                "crit_alarm", in_index, i0, i1,
@@ -1421,7 +1421,8 @@ static void pmbus_find_attributes(struct i2c_client *client,
 
                        i0 = data->num_sensors;
                        pmbus_add_sensor(data, "fan", "input", in_index, page,
-                                        pmbus_fan_registers[f], PSC_FAN, true);
+                                        pmbus_fan_registers[f], PSC_FAN, true,
+                                        true);
 
                        /*
                         * Each fan status register covers multiple fans,