aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2012-05-19 14:35:25 -0400
committerGuenter Roeck <linux@roeck-us.net>2013-02-06 12:58:05 -0500
commit16c6d01f3b21bd35526cccbe37010a906072a590 (patch)
tree99caa5e9d4eac581a277e2ab4b2342012021e4f2
parent1640eaecc4c5f62c73a87445a55c0f0cbe3b4579 (diff)
hwmon: (pmbus) Add support for word status register
Not all PMBus devices support the byte status register at 0x78. Try to use the word status register at 0x79 instead if that is the case. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r--drivers/hwmon/pmbus/pmbus_core.c80
1 files changed, 52 insertions, 28 deletions
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 32f4530cd1e8..cb5e255a84c6 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -109,6 +109,7 @@ struct pmbus_data {
109 * so we keep them all together. 109 * so we keep them all together.
110 */ 110 */
111 u8 status[PB_NUM_STATUS_REG]; 111 u8 status[PB_NUM_STATUS_REG];
112 u8 status_register;
112 113
113 u8 currpage; 114 u8 currpage;
114}; 115};
@@ -285,9 +286,10 @@ EXPORT_SYMBOL_GPL(pmbus_clear_faults);
285 286
286static int pmbus_check_status_cml(struct i2c_client *client) 287static int pmbus_check_status_cml(struct i2c_client *client)
287{ 288{
289 struct pmbus_data *data = i2c_get_clientdata(client);
288 int status, status2; 290 int status, status2;
289 291
290 status = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_BYTE); 292 status = _pmbus_read_byte_data(client, -1, data->status_register);
291 if (status < 0 || (status & PB_STATUS_CML)) { 293 if (status < 0 || (status & PB_STATUS_CML)) {
292 status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML); 294 status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML);
293 if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND)) 295 if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND))
@@ -344,7 +346,7 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
344 for (i = 0; i < info->pages; i++) 346 for (i = 0; i < info->pages; i++)
345 data->status[PB_STATUS_BASE + i] 347 data->status[PB_STATUS_BASE + i]
346 = _pmbus_read_byte_data(client, i, 348 = _pmbus_read_byte_data(client, i,
347 PMBUS_STATUS_BYTE); 349 data->status_register);
348 for (i = 0; i < info->pages; i++) { 350 for (i = 0; i < info->pages; i++) {
349 if (!(info->func[i] & PMBUS_HAVE_STATUS_VOUT)) 351 if (!(info->func[i] & PMBUS_HAVE_STATUS_VOUT))
350 continue; 352 continue;
@@ -1015,7 +1017,7 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
1015 */ 1017 */
1016 if (!ret && attr->gbit && 1018 if (!ret && attr->gbit &&
1017 pmbus_check_byte_register(client, page, 1019 pmbus_check_byte_register(client, page,
1018 PMBUS_STATUS_BYTE)) { 1020 data->status_register)) {
1019 ret = pmbus_add_boolean(data, name, "alarm", index, 1021 ret = pmbus_add_boolean(data, name, "alarm", index,
1020 NULL, NULL, 1022 NULL, NULL,
1021 PB_STATUS_BASE + page, 1023 PB_STATUS_BASE + page,
@@ -1683,6 +1685,51 @@ static int pmbus_identify_common(struct i2c_client *client,
1683 return 0; 1685 return 0;
1684} 1686}
1685 1687
1688static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
1689 struct pmbus_driver_info *info)
1690{
1691 struct device *dev = &client->dev;
1692 int ret;
1693
1694 /*
1695 * Some PMBus chips don't support PMBUS_STATUS_BYTE, so try
1696 * to use PMBUS_STATUS_WORD instead if that is the case.
1697 * Bail out if both registers are not supported.
1698 */
1699 data->status_register = PMBUS_STATUS_BYTE;
1700 ret = i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE);
1701 if (ret < 0 || ret == 0xff) {
1702 data->status_register = PMBUS_STATUS_WORD;
1703 ret = i2c_smbus_read_word_data(client, PMBUS_STATUS_WORD);
1704 if (ret < 0 || ret == 0xffff) {
1705 dev_err(dev, "PMBus status register not found\n");
1706 return -ENODEV;
1707 }
1708 }
1709
1710 pmbus_clear_faults(client);
1711
1712 if (info->identify) {
1713 ret = (*info->identify)(client, info);
1714 if (ret < 0) {
1715 dev_err(dev, "Chip identification failed\n");
1716 return ret;
1717 }
1718 }
1719
1720 if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
1721 dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages);
1722 return -ENODEV;
1723 }
1724
1725 ret = pmbus_identify_common(client, data);
1726 if (ret < 0) {
1727 dev_err(dev, "Failed to identify chip capabilities\n");
1728 return ret;
1729 }
1730 return 0;
1731}
1732
1686int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, 1733int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
1687 struct pmbus_driver_info *info) 1734 struct pmbus_driver_info *info)
1688{ 1735{
@@ -1707,36 +1754,13 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
1707 mutex_init(&data->update_lock); 1754 mutex_init(&data->update_lock);
1708 data->dev = dev; 1755 data->dev = dev;
1709 1756
1710 /* Bail out if PMBus status register does not exist. */
1711 if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0) {
1712 dev_err(dev, "PMBus status register not found\n");
1713 return -ENODEV;
1714 }
1715
1716 if (pdata) 1757 if (pdata)
1717 data->flags = pdata->flags; 1758 data->flags = pdata->flags;
1718 data->info = info; 1759 data->info = info;
1719 1760
1720 pmbus_clear_faults(client); 1761 ret = pmbus_init_common(client, data, info);
1721 1762 if (ret < 0)
1722 if (info->identify) {
1723 ret = (*info->identify)(client, info);
1724 if (ret < 0) {
1725 dev_err(dev, "Chip identification failed\n");
1726 return ret;
1727 }
1728 }
1729
1730 if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
1731 dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages);
1732 return -ENODEV;
1733 }
1734
1735 ret = pmbus_identify_common(client, data);
1736 if (ret < 0) {
1737 dev_err(dev, "Failed to identify chip capabilities\n");
1738 return ret; 1763 return ret;
1739 }
1740 1764
1741 ret = pmbus_find_attributes(client, data); 1765 ret = pmbus_find_attributes(client, data);
1742 if (ret) 1766 if (ret)