Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: i2c-stm32f7: Add I2C_SMBUS_I2C_BLOCK_DATA support

This patch adds the support of I2C_SMBUS_I2C_BLOCK_DATA transaction type
for the stm32f7 SMBUS Controller.
Use emulated I2C_SMBUS_I2C_BLOCK_DATA transactions as there is no specific
hardware in STM32 I2C to manage this (e.g. like no need for PEC here).
Emulated transfer will fall back calling i2c transfer method where there's
already support for DMAs for example.
So, use the I2C_FUNC_SMBUS_I2C_BLOCK in stm32f7_i2c_func(), and rely on
emulated transfer by returning -EOPNOTSUPP in the smbus_xfer() routine
for such a case.

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Reviewed-by: Pierre-Yves MORDRET <pierre-yves.mordret@st.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>

authored by

Fabrice Gasnier and committed by
Wolfram Sang
473fbdf7 6e76cb7d

+5 -1
+5 -1
drivers/i2c/busses/i2c-stm32f7.c
··· 952 952 cr2 &= ~STM32F7_I2C_CR2_RD_WRN; 953 953 f7_msg->read_write = I2C_SMBUS_READ; 954 954 break; 955 + case I2C_SMBUS_I2C_BLOCK_DATA: 956 + /* Rely on emulated i2c transfer (through master_xfer) */ 957 + return -EOPNOTSUPP; 955 958 default: 956 959 dev_err(dev, "Unsupported smbus protocol %d\n", f7_msg->size); 957 960 return -EOPNOTSUPP; ··· 1805 1802 I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | 1806 1803 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | 1807 1804 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL | 1808 - I2C_FUNC_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_PEC; 1805 + I2C_FUNC_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_PEC | 1806 + I2C_FUNC_SMBUS_I2C_BLOCK; 1809 1807 } 1810 1808 1811 1809 static struct i2c_algorithm stm32f7_i2c_algo = {