Merge branch 'i2c/for-current-fixed' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:

 - a revert because of bugzilla #200045 (and some documentation about
   it)

 - another regression fix in the i2c-gpio driver

 - a leak fix for the i2c core

* 'i2c/for-current-fixed' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: gpio: initialize SCL to HIGH again
  i2c: smbus: kill memory leak on emulated and failed DMA SMBus xfers
  i2c: algos: bit: mention our experience about initial states
  Revert "i2c: algo-bit: init the bus to a known state"
This commit is contained in:
Linus Torvalds 2018-06-29 12:21:12 -07:00
Родитель 7886953859 12b731dd46
Коммит 44813aa62a
3 изменённых файлов: 15 добавлений и 11 удалений

Просмотреть файл

@ -647,10 +647,10 @@ static int __i2c_bit_add_bus(struct i2c_adapter *adap,
if (bit_adap->getscl == NULL) if (bit_adap->getscl == NULL)
adap->quirks = &i2c_bit_quirk_no_clk_stretch; adap->quirks = &i2c_bit_quirk_no_clk_stretch;
/* Bring bus to a known state. Looks like STOP if bus is not free yet */ /*
setscl(bit_adap, 1); * We tried forcing SCL/SDA to an initial state here. But that caused a
udelay(bit_adap->udelay); * regression, sadly. Check Bugzilla #200045 for details.
setsda(bit_adap, 1); */
ret = add_adapter(adap); ret = add_adapter(adap);
if (ret < 0) if (ret < 0)

Просмотреть файл

@ -279,9 +279,9 @@ static int i2c_gpio_probe(struct platform_device *pdev)
* required for an I2C bus. * required for an I2C bus.
*/ */
if (pdata->scl_is_open_drain) if (pdata->scl_is_open_drain)
gflags = GPIOD_OUT_LOW; gflags = GPIOD_OUT_HIGH;
else else
gflags = GPIOD_OUT_LOW_OPEN_DRAIN; gflags = GPIOD_OUT_HIGH_OPEN_DRAIN;
priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags);
if (IS_ERR(priv->scl)) if (IS_ERR(priv->scl))
return PTR_ERR(priv->scl); return PTR_ERR(priv->scl);

Просмотреть файл

@ -465,15 +465,18 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
status = i2c_transfer(adapter, msg, num); status = i2c_transfer(adapter, msg, num);
if (status < 0) if (status < 0)
return status; goto cleanup;
if (status != num) if (status != num) {
return -EIO; status = -EIO;
goto cleanup;
}
status = 0;
/* Check PEC if last message is a read */ /* Check PEC if last message is a read */
if (i && (msg[num-1].flags & I2C_M_RD)) { if (i && (msg[num-1].flags & I2C_M_RD)) {
status = i2c_smbus_check_pec(partial_pec, &msg[num-1]); status = i2c_smbus_check_pec(partial_pec, &msg[num-1]);
if (status < 0) if (status < 0)
return status; goto cleanup;
} }
if (read_write == I2C_SMBUS_READ) if (read_write == I2C_SMBUS_READ)
@ -499,12 +502,13 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
break; break;
} }
cleanup:
if (msg[0].flags & I2C_M_DMA_SAFE) if (msg[0].flags & I2C_M_DMA_SAFE)
kfree(msg[0].buf); kfree(msg[0].buf);
if (msg[1].flags & I2C_M_DMA_SAFE) if (msg[1].flags & I2C_M_DMA_SAFE)
kfree(msg[1].buf); kfree(msg[1].buf);
return 0; return status;
} }
/** /**