|
@@ -28,7 +28,7 @@
|
|
|
#include <linux/delay.h>
|
|
|
#include "pmbus.h"
|
|
|
|
|
|
-enum chips { zl2004, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105 };
|
|
|
+enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105 };
|
|
|
|
|
|
struct zl6100_data {
|
|
|
int id;
|
|
@@ -65,6 +65,19 @@ static int zl6100_read_word_data(struct i2c_client *client, int page, int reg)
|
|
|
if (page || reg >= PMBUS_VIRT_BASE)
|
|
|
return -ENXIO;
|
|
|
|
|
|
+ if (data->id == zl2005) {
|
|
|
+ /*
|
|
|
+ * Limit register detection is not reliable on ZL2005.
|
|
|
+ * Make sure registers are not erroneously detected.
|
|
|
+ */
|
|
|
+ switch (reg) {
|
|
|
+ case PMBUS_VOUT_OV_WARN_LIMIT:
|
|
|
+ case PMBUS_VOUT_UV_WARN_LIMIT:
|
|
|
+ case PMBUS_IOUT_OC_WARN_LIMIT:
|
|
|
+ return -ENXIO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
zl6100_wait(data);
|
|
|
ret = pmbus_read_word_data(client, page, reg);
|
|
|
data->access = ktime_get();
|
|
@@ -123,6 +136,7 @@ static int zl6100_write_byte(struct i2c_client *client, int page, u8 value)
|
|
|
|
|
|
static const struct i2c_device_id zl6100_id[] = {
|
|
|
{"zl2004", zl2004},
|
|
|
+ {"zl2005", zl2005},
|
|
|
{"zl2006", zl2006},
|
|
|
{"zl2008", zl2008},
|
|
|
{"zl2105", zl2105},
|
|
@@ -177,8 +191,9 @@ static int zl6100_probe(struct i2c_client *client,
|
|
|
data->id = mid->driver_data;
|
|
|
|
|
|
/*
|
|
|
- * ZL2008, ZL2105, and ZL6100 are known to require a wait time
|
|
|
+ * ZL2005, ZL2008, ZL2105, and ZL6100 are known to require a wait time
|
|
|
* between I2C accesses. ZL2004 and ZL6105 are known to be safe.
|
|
|
+ * Other chips have not yet been tested.
|
|
|
*
|
|
|
* Only clear the wait time for chips known to be safe. The wait time
|
|
|
* can be cleared later for additional chips if tests show that it
|