lkml.org 
[lkml]   [2020]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 090/138] hwmon: (adm1275) Make sure we are reading enough data for different chips
    Date
    From: Chu Lin <linchuyuan@google.com>

    [ Upstream commit 6d1d41c075a1a54ba03370e268171fec20e06563 ]

    Issue:
    When PEC is enabled, binding adm1272 to the adm1275 would
    fail due to PEC error. See below:
    adm1275: probe of xxxx failed with error -74

    Diagnosis:
    Per the datasheet of adm1272, adm1278, adm1293 and amd1294,
    PMON_CONFIG (0xd4) is 16bits wide. On the other hand,
    PMON_CONFIG (0xd4) for adm1275 is 8bits wide. The driver should not
    assume everything is 8bits wide and read only 8bits from it.

    Solution:
    If it is adm1272, adm1278, adm1293 and adm1294, use i2c_read_word.
    Else, use i2c_read_byte

    Testing:
    Binding adm1272 to the driver.
    The change is only tested on adm1272.

    Signed-off-by: Chu Lin <linchuyuan@google.com>
    Link: https://lore.kernel.org/r/20200709040612.3977094-1-linchuyuan@google.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/hwmon/pmbus/adm1275.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/drivers/hwmon/pmbus/adm1275.c b/drivers/hwmon/pmbus/adm1275.c
    index 5caa37fbfc187..66b12e5ccbc65 100644
    --- a/drivers/hwmon/pmbus/adm1275.c
    +++ b/drivers/hwmon/pmbus/adm1275.c
    @@ -454,6 +454,7 @@ MODULE_DEVICE_TABLE(i2c, adm1275_id);
    static int adm1275_probe(struct i2c_client *client,
    const struct i2c_device_id *id)
    {
    + s32 (*config_read_fn)(const struct i2c_client *client, u8 reg);
    u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
    int config, device_config;
    int ret;
    @@ -499,11 +500,16 @@ static int adm1275_probe(struct i2c_client *client,
    "Device mismatch: Configured %s, detected %s\n",
    id->name, mid->name);

    - config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
    + if (mid->driver_data == adm1272 || mid->driver_data == adm1278 ||
    + mid->driver_data == adm1293 || mid->driver_data == adm1294)
    + config_read_fn = i2c_smbus_read_word_data;
    + else
    + config_read_fn = i2c_smbus_read_byte_data;
    + config = config_read_fn(client, ADM1275_PMON_CONFIG);
    if (config < 0)
    return config;

    - device_config = i2c_smbus_read_byte_data(client, ADM1275_DEVICE_CONFIG);
    + device_config = config_read_fn(client, ADM1275_DEVICE_CONFIG);
    if (device_config < 0)
    return device_config;

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-07-27 16:35    [W:5.660 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site