On May 29 2016 or thereabouts, Corey Minyard wrote: > From: Corey Minyard <cminyard@xxxxxxxxxx> > > The code was passing around read_write, which required comparison > with a constant, but was effectively a bool. Pass around an > is_read bool instead. This also makes it consistent with the > priv->is_read used for interrupt handling. > > Signed-off-by: Corey Minyard <cminyard@xxxxxxxxxx> > --- The rough idea of the patch looks good to me, but I don't know if the authors of i2c-i801.c did want to keep the char to be closer to the SMBus protocol and be able to inject this char in the pipe directly. So no strong opinion on this one. Cheers, Benjamin > drivers/i2c/busses/i2c-i801.c | 51 ++++++++++++++++++++----------------------- > 1 file changed, 24 insertions(+), 27 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c > index 56db310..ae1e60a 100644 > --- a/drivers/i2c/busses/i2c-i801.c > +++ b/drivers/i2c/busses/i2c-i801.c > @@ -432,7 +432,7 @@ static int i801_transaction(struct i801_priv *priv, int xact) > > static int i801_block_transaction_by_block(struct i801_priv *priv, > union i2c_smbus_data *data, > - char read_write, int hwpec) > + bool is_read, int hwpec) > { > int i, len; > int status; > @@ -440,7 +440,7 @@ static int i801_block_transaction_by_block(struct i801_priv *priv, > inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */ > > /* Use 32-byte buffer to process this transaction */ > - if (read_write == I2C_SMBUS_WRITE) { > + if (!is_read) { > len = data->block[0]; > outb_p(len, SMBHSTDAT0(priv)); > for (i = 0; i < len; i++) > @@ -452,7 +452,7 @@ static int i801_block_transaction_by_block(struct i801_priv *priv, > if (status < 0 || status & STATUS_ERROR_FLAGS) > return status; > > - if (read_write == I2C_SMBUS_READ) { > + if (is_read) { > len = priv->len = inb_p(SMBHSTDAT0(priv)); > if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) > return -EPROTO; > @@ -555,7 +555,7 @@ static irqreturn_t i801_isr(int irq, void *dev_id) > */ > static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, > union i2c_smbus_data *data, > - char read_write, int command) > + bool is_read, int command) > { > int i, len; > int smbcmd; > @@ -565,20 +565,19 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, > > len = data->block[0]; > > - if (read_write == I2C_SMBUS_WRITE) { > + if (!is_read) { > outb_p(len, SMBHSTDAT0(priv)); > outb_p(data->block[1], SMBBLKDAT(priv)); > } > > - if (command == I2C_SMBUS_I2C_BLOCK_DATA && > - read_write == I2C_SMBUS_READ) > + if (command == I2C_SMBUS_I2C_BLOCK_DATA && is_read) > smbcmd = I801_I2C_BLOCK_DATA; > else > smbcmd = I801_BLOCK_DATA; > > if (priv->features & FEATURE_IRQ) { > - priv->is_read = (read_write == I2C_SMBUS_READ); > - if (len == 1 && priv->is_read) > + priv->is_read = is_read; > + if (len == 1 && is_read) > smbcmd |= SMBHSTCNT_LAST_BYTE; > priv->cmd = smbcmd | SMBHSTCNT_INTREN; > priv->len = len; > @@ -599,7 +598,7 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, > } > > for (i = 1; i <= len; i++) { > - if (i == len && read_write == I2C_SMBUS_READ) > + if (i == len && is_read) > smbcmd |= SMBHSTCNT_LAST_BYTE; > outb_p(smbcmd, SMBHSTCNT(priv)); > > @@ -611,7 +610,7 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, > if (status) > return status; > > - if (i == 1 && read_write == I2C_SMBUS_READ > + if (i == 1 && is_read > && command != I2C_SMBUS_I2C_BLOCK_DATA) { > priv->len = inb_p(SMBHSTDAT0(priv)); > if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) > @@ -620,9 +619,9 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, > } > > /* Retrieve/store value in SMBBLKDAT */ > - if (read_write == I2C_SMBUS_READ) > + if (is_read) > data->block[i] = inb_p(SMBBLKDAT(priv)); > - if (read_write == I2C_SMBUS_WRITE && i+1 <= len) > + else if (i+1 <= len) > outb_p(data->block[i+1], SMBBLKDAT(priv)); > > /* signals SMBBLKDAT ready */ > @@ -642,7 +641,7 @@ static int i801_set_block_buffer_mode(struct i801_priv *priv) > > /* Block transaction function */ > static int i801_block_transaction(struct i801_priv *priv, unsigned short flags, > - union i2c_smbus_data *data, char read_write, > + union i2c_smbus_data *data, bool is_read, > int command) > { > int result = 0; > @@ -658,8 +657,7 @@ static int i801_block_transaction(struct i801_priv *priv, unsigned short flags, > outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC), > SMBAUXCTL(priv)); > > - if (read_write == I2C_SMBUS_WRITE > - || command == I2C_SMBUS_I2C_BLOCK_DATA) { > + if (!is_read || command == I2C_SMBUS_I2C_BLOCK_DATA) { > if (data->block[0] < 1) > data->block[0] = 1; > if (data->block[0] > I2C_SMBUS_BLOCK_MAX) > @@ -674,12 +672,11 @@ static int i801_block_transaction(struct i801_priv *priv, unsigned short flags, > if ((priv->features & FEATURE_BLOCK_BUFFER) > && command != I2C_SMBUS_I2C_BLOCK_DATA > && i801_set_block_buffer_mode(priv) == 0) > - result = i801_block_transaction_by_block(priv, data, > - read_write, hwpec); > + result = i801_block_transaction_by_block(priv, data, is_read, > + hwpec); > else > result = i801_block_transaction_byte_by_byte(priv, data, > - read_write, > - command); > + is_read, command); > > /* > * Some BIOSes don't like it when PEC is enabled at reboot or > @@ -702,6 +699,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > int block = 0; > int ret = 0, xact = 0; > int hostc = -1; > + bool is_read = (read_write == I2C_SMBUS_READ); > struct i801_priv *priv = i2c_get_adapdata(adap); > > pm_runtime_get_sync(&priv->pci_dev->dev); > @@ -715,7 +713,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > case I2C_SMBUS_BYTE: > outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), > SMBHSTADD(priv)); > - if (read_write == I2C_SMBUS_WRITE) > + if (!is_read) > outb_p(command, SMBHSTCMD(priv)); > xact = I801_BYTE; > break; > @@ -723,7 +721,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), > SMBHSTADD(priv)); > outb_p(command, SMBHSTCMD(priv)); > - if (read_write == I2C_SMBUS_WRITE) > + if (!is_read) > outb_p(data->byte, SMBHSTDAT0(priv)); > xact = I801_BYTE_DATA; > break; > @@ -731,7 +729,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), > SMBHSTADD(priv)); > outb_p(command, SMBHSTCMD(priv)); > - if (read_write == I2C_SMBUS_WRITE) { > + if (!is_read) { > outb_p(data->word & 0xff, SMBHSTDAT0(priv)); > outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); > } > @@ -747,7 +745,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > /* NB: page 240 of ICH5 datasheet shows that the R/#W > * bit should be cleared here, even when reading */ > outb_p((addr & 0x7f) << 1, SMBHSTADD(priv)); > - if (read_write == I2C_SMBUS_WRITE) { > + if (!is_read) { > unsigned char thostc; > > outb_p(command, SMBHSTCMD(priv)); > @@ -779,8 +777,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > goto out; > > if (block) > - ret = i801_block_transaction(priv, flags, data, read_write, > - size); > + ret = i801_block_transaction(priv, flags, data, is_read, size); > else > ret = i801_transaction(priv, xact); > > @@ -797,7 +794,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr, > goto out; > if (ret) > goto out; > - if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK)) > + if (!is_read || (xact == I801_QUICK)) > goto out; > > switch (xact & 0x7f) { -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html