Re: [PATCH 3/5] hwmon: (pmbus/core) Add mapping function to pmbus_read_block_data()
Guenter Roeck <[email protected]> Fri, 31 Jul 2026 09:46:29 -0700
| Newsgroups | org.kernel.vger.linux-hwmon,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-doc |
|---|---|
| Message-ID | <[email protected]> |
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 ? Thanks, Guenter >> >> One key example is the PIIX4 driver. Your new driver does not support the >> majority of PC style systems with AMD CPUs. >> > > I see! > > - Nuno Sá >