|
@@ -254,6 +254,24 @@ int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(pmbus_read_byte_data);
|
|
EXPORT_SYMBOL_GPL(pmbus_read_byte_data);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
|
|
|
|
+ * a device specific mapping function exists and calls it if necessary.
|
|
|
|
+ */
|
|
|
|
+static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
|
|
|
|
+{
|
|
|
|
+ struct pmbus_data *data = i2c_get_clientdata(client);
|
|
|
|
+ const struct pmbus_driver_info *info = data->info;
|
|
|
|
+ int status;
|
|
|
|
+
|
|
|
|
+ if (info->read_byte_data) {
|
|
|
|
+ status = info->read_byte_data(client, page, reg);
|
|
|
|
+ if (status != -ENODATA)
|
|
|
|
+ return status;
|
|
|
|
+ }
|
|
|
|
+ return pmbus_read_byte_data(client, page, reg);
|
|
|
|
+}
|
|
|
|
+
|
|
static void pmbus_clear_fault_page(struct i2c_client *client, int page)
|
|
static void pmbus_clear_fault_page(struct i2c_client *client, int page)
|
|
{
|
|
{
|
|
pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
|
|
pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
|
|
@@ -287,7 +305,7 @@ bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)
|
|
int rv;
|
|
int rv;
|
|
struct pmbus_data *data = i2c_get_clientdata(client);
|
|
struct pmbus_data *data = i2c_get_clientdata(client);
|
|
|
|
|
|
- rv = pmbus_read_byte_data(client, page, reg);
|
|
|
|
|
|
+ rv = _pmbus_read_byte_data(client, page, reg);
|
|
if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
|
|
if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
|
|
rv = pmbus_check_status_cml(client);
|
|
rv = pmbus_check_status_cml(client);
|
|
pmbus_clear_fault_page(client, -1);
|
|
pmbus_clear_fault_page(client, -1);
|
|
@@ -316,24 +334,6 @@ const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(pmbus_get_driver_info);
|
|
EXPORT_SYMBOL_GPL(pmbus_get_driver_info);
|
|
|
|
|
|
-/*
|
|
|
|
- * _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
|
|
|
|
- * a device specific mapping function exists and calls it if necessary.
|
|
|
|
- */
|
|
|
|
-static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
|
|
|
|
-{
|
|
|
|
- struct pmbus_data *data = i2c_get_clientdata(client);
|
|
|
|
- const struct pmbus_driver_info *info = data->info;
|
|
|
|
- int status;
|
|
|
|
-
|
|
|
|
- if (info->read_byte_data) {
|
|
|
|
- status = info->read_byte_data(client, page, reg);
|
|
|
|
- if (status != -ENODATA)
|
|
|
|
- return status;
|
|
|
|
- }
|
|
|
|
- return pmbus_read_byte_data(client, page, reg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static struct pmbus_data *pmbus_update_device(struct device *dev)
|
|
static struct pmbus_data *pmbus_update_device(struct device *dev)
|
|
{
|
|
{
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
@@ -1037,9 +1037,11 @@ static void pmbus_add_sensor_attrs_one(struct i2c_client *client,
|
|
index, page, cbase, attr);
|
|
index, page, cbase, attr);
|
|
/*
|
|
/*
|
|
* Add generic alarm attribute only if there are no individual
|
|
* Add generic alarm attribute only if there are no individual
|
|
- * alarm attributes, and if there is a global alarm bit.
|
|
|
|
|
|
+ * alarm attributes, if there is a global alarm bit, and if
|
|
|
|
+ * the generic status register for this page is accessible.
|
|
*/
|
|
*/
|
|
- if (!have_alarm && attr->gbit)
|
|
|
|
|
|
+ if (!have_alarm && attr->gbit &&
|
|
|
|
+ pmbus_check_byte_register(client, page, PMBUS_STATUS_BYTE))
|
|
pmbus_add_boolean_reg(data, name, "alarm", index,
|
|
pmbus_add_boolean_reg(data, name, "alarm", index,
|
|
PB_STATUS_BASE + page,
|
|
PB_STATUS_BASE + page,
|
|
attr->gbit);
|
|
attr->gbit);
|