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:
Коммит
44813aa62a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Загрузка…
Ссылка в новой задаче