]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hwmon: pmbus: zl6100: Use generic code
authorPatrick Rudolph <patrick.rudolph@9elements.com>
Mon, 2 Sep 2024 07:53:15 +0000 (09:53 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 2 Sep 2024 14:34:03 +0000 (07:34 -0700)
Use generic pmbus bus access delay.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Message-ID: <20240902075319.585656-4-patrick.rudolph@9elements.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/zl6100.c

index 83458df0d0cfafd501b92f74121b70c4f56844b1..7920a16203e1379fa28b404241fc41f4af18775b 100644 (file)
@@ -22,8 +22,6 @@ enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105,
 
 struct zl6100_data {
        int id;
-       ktime_t access;         /* chip access time */
-       int delay;              /* Delay between chip accesses in uS */
        struct pmbus_driver_info info;
 };
 
@@ -122,16 +120,6 @@ static u16 zl6100_d2l(long val)
        return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800);
 }
 
-/* Some chips need a delay between accesses */
-static inline void zl6100_wait(const struct zl6100_data *data)
-{
-       if (data->delay) {
-               s64 delta = ktime_us_delta(ktime_get(), data->access);
-               if (delta < data->delay)
-                       udelay(data->delay - delta);
-       }
-}
-
 static int zl6100_read_word_data(struct i2c_client *client, int page,
                                 int phase, int reg)
 {
@@ -174,9 +162,7 @@ static int zl6100_read_word_data(struct i2c_client *client, int page,
                break;
        }
 
-       zl6100_wait(data);
        ret = pmbus_read_word_data(client, page, phase, vreg);
-       data->access = ktime_get();
        if (ret < 0)
                return ret;
 
@@ -195,14 +181,11 @@ static int zl6100_read_word_data(struct i2c_client *client, int page,
 static int zl6100_read_byte_data(struct i2c_client *client, int page, int reg)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       struct zl6100_data *data = to_zl6100_data(info);
        int ret, status;
 
        if (page >= info->pages)
                return -ENXIO;
 
-       zl6100_wait(data);
-
        switch (reg) {
        case PMBUS_VIRT_STATUS_VMON:
                ret = pmbus_read_byte_data(client, 0,
@@ -225,7 +208,6 @@ static int zl6100_read_byte_data(struct i2c_client *client, int page, int reg)
                ret = pmbus_read_byte_data(client, page, reg);
                break;
        }
-       data->access = ktime_get();
 
        return ret;
 }
@@ -234,8 +216,7 @@ static int zl6100_write_word_data(struct i2c_client *client, int page, int reg,
                                  u16 word)
 {
        const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       struct zl6100_data *data = to_zl6100_data(info);
-       int ret, vreg;
+       int vreg;
 
        if (page >= info->pages)
                return -ENXIO;
@@ -265,27 +246,7 @@ static int zl6100_write_word_data(struct i2c_client *client, int page, int reg,
                vreg = reg;
        }
 
-       zl6100_wait(data);
-       ret = pmbus_write_word_data(client, page, vreg, word);
-       data->access = ktime_get();
-
-       return ret;
-}
-
-static int zl6100_write_byte(struct i2c_client *client, int page, u8 value)
-{
-       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       struct zl6100_data *data = to_zl6100_data(info);
-       int ret;
-
-       if (page >= info->pages)
-               return -ENXIO;
-
-       zl6100_wait(data);
-       ret = pmbus_write_byte(client, page, value);
-       data->access = ktime_get();
-
-       return ret;
+       return pmbus_write_word_data(client, page, vreg, word);
 }
 
 static const struct i2c_device_id zl6100_id[] = {
@@ -363,14 +324,7 @@ static int zl6100_probe(struct i2c_client *client)
         * supported chips are known to require a wait time between I2C
         * accesses.
         */
-       data->delay = delay;
-
-       /*
-        * Since there was a direct I2C device access above, wait before
-        * accessing the chip again.
-        */
-       data->access = ktime_get();
-       zl6100_wait(data);
+       udelay(delay);
 
        info = &data->info;
 
@@ -404,8 +358,7 @@ static int zl6100_probe(struct i2c_client *client)
                if (ret < 0)
                        return ret;
 
-               data->access = ktime_get();
-               zl6100_wait(data);
+               udelay(delay);
 
                if (ret & ZL8802_MFR_PHASES_MASK)
                        info->func[1] |= PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
@@ -418,8 +371,7 @@ static int zl6100_probe(struct i2c_client *client)
                        if (ret < 0)
                                return ret;
 
-                       data->access = ktime_get();
-                       zl6100_wait(data);
+                       udelay(delay);
 
                        ret = i2c_smbus_read_word_data(client, ZL8802_MFR_USER_CONFIG);
                        if (ret < 0)
@@ -428,8 +380,7 @@ static int zl6100_probe(struct i2c_client *client)
                        if (ret & ZL8802_MFR_XTEMP_ENABLE_2)
                                info->func[i] |= PMBUS_HAVE_TEMP2;
 
-                       data->access = ktime_get();
-                       zl6100_wait(data);
+                       udelay(delay);
                }
                ret = i2c_smbus_read_word_data(client, ZL8802_MFR_USER_GLOBAL_CONFIG);
                if (ret < 0)
@@ -446,13 +397,12 @@ static int zl6100_probe(struct i2c_client *client)
                        info->func[0] |= PMBUS_HAVE_TEMP2;
        }
 
-       data->access = ktime_get();
-       zl6100_wait(data);
+       udelay(delay);
 
+       info->access_delay = delay;
        info->read_word_data = zl6100_read_word_data;
        info->read_byte_data = zl6100_read_byte_data;
        info->write_word_data = zl6100_write_word_data;
-       info->write_byte = zl6100_write_byte;
 
        return pmbus_do_probe(client, info);
 }