Re: [PATCH 3/5] hwmon: (pmbus/core) Add mapping function to pmbus_read_block_data()

Guenter Roeck <[email protected]> Mon, 3 Aug 2026 08:45:26 -0700
Newsgroups org.kernel.vger.linux-hwmon,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-doc
Message-ID <[email protected]>
On 8/3/26 08:03, Nuno Sá wrote:
> On Fri, Jul 31, 2026 at 09:46:29AM -0700, Guenter Roeck wrote:
>> On 7/31/26 08:42, Nuno Sá wrote:
>>> On Thu, Jul 30, 2026 at 08:54:25AM -0700, Guenter Roeck wrote:
>>>> On 7/30/26 08:19, Nuno Sá wrote:
>>>>> On Thu, Jul 30, 2026 at 07:47:37AM -0700, Guenter Roeck wrote:
>>>>>> On 7/30/26 07:27, Nuno Sá wrote:
>>>>>>> On Tue, Jul 28, 2026 at 02:05:53PM -0700, Guenter Roeck wrote:
>>>>>>>> On 7/28/26 09:03, Nuno Sá via B4 Relay wrote:
>>>>>>>>> From: Nuno Sá <[email protected]>
>>>>>>>>>
>>>>>>>>> This is in preparation for adding support to a device which needs to
>>>>>>>>> use it's own read_block implementation.
>>>>>>>>>
>>>>>>>>
>>>>>>>> The chip-specific implementation calls i2c_smbus_read_i2c_block_data().
>>>>>>>> I'll need to know if this is a chip limit or a controller limit.
>>>>>>>> If it is a controller limit, a chip specific override would be
>>>>>>>> inappropriate.
>>>>>>>
>>>>>>> I'll reply from top of my head (did not looked at the driver again).
>>>>>>> IIRC, the biggest reason we need the chip-specific implementation is because of
>>>>>>> the RAIL selection logic (mainly when not in page mode).
>>>>>>>
>>>>>>
>>>>>> Yes, I have seen that. Question is why you use i2c_smbus_read_i2c_block_data()
>>>>>> instead of i2c_smbus_read_block_data(). The rail selection logic would not
>>>>>> require that.
>>>>>
>>>>> IIRC the reason was because the i2c controller on the raspberry pie does not
>>>>> support i2c_smbus_read_block_data(). So I guess this:
>>>>>
>>>>> https://elixir.bootlin.com/linux/v7.1.4/source/drivers/i2c/i2c-core-smbus.c#L220
>>>>>
>>>>
>>>> Hmm, I think we really need a common solution for that problem. Not all
>>>> controllers support i2c_smbus_read_i2c_block_data(), so you are just moving
>>>> the problem from one controller to another.
>>>
>>> Yikes. I actually though i2c_smbus_read_i2c_block_data(9 was more widely
>>> supported (if not always). Not sure if you have something in mind but
>>> one straight way would be to choose different implementations (for
>>> read_block) depending on i2c_check_functionality()
>>>
>>
>> Handling it in pmbus_read_block_data() would be straightforward. Actually, I
>> wonder why it isn't handled as fallback in i2c_smbus_read_block_data(),
>> but I assume there must be a reason.
>>
>> Either case, I don't understand how the existing calls to i2c_smbus_read_i2c_block_data()
>> work. For example, in drivers/hwmon/pmbus/max20830.c, the assumption is that the
>> first returned data byte would be the length field. However, that is already done
>> in i2c_smbus_read_i2c_block_data():
>>
>> /* Returns the number of read bytes */
>> s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command,
>>                                    u8 length, u8 *values)
>> {
>>          union i2c_smbus_data data;
>>          int status;
>>
>>          if (length > I2C_SMBUS_BLOCK_MAX)
>>                  length = I2C_SMBUS_BLOCK_MAX;
>>          data.block[0] = length;
>>          status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
>>                                  I2C_SMBUS_READ, command,
>>                                  I2C_SMBUS_I2C_BLOCK_DATA, &data);
>>          if (status < 0)
>>                  return status;
>>
>>          memcpy(values, &data.block[1], data.block[0]);
>>          return data.block[0];
>> }
>>
>> Does the command return the length twice ?
> 
> I think the device is actually the one sending the block size again. I
> went looking at very old emails and found this chain:
> 
> Me:
> 
> "Thanks for the inputs... As I said, I think know what’s my issue. I’m fairly sure the first
> byte I’m reading is the block size. I’ll take this into account and re-test."
> 
> Reply:
> 
> "On one hand, that does make sense. The first byte in a block read transaction should indeed
> be the block size. That said, 0xB1 is 6 bytes long when not including this first byte. So we
> are still missing a byte with actual information. Could you perhaps please share the full
> packet data that you are capturing?"
> 
> The above was me struggling with per phase reads.
> 
> But maybe the above changed with newer FW versions for the chips. I'll
> ask around.
> 

No, I found that other chips do the same.

I am working on a generic function pmbus_read_smbus_i2c_block_data() which calls
i2c_smbus_read_block_data() if supported and otherwise (if supoported) calls
i2c_smbus_read_i2c_block_data(). It should be ready within a day or so.

Thanks,
Guenter