i2c: tegra: Wait for config load atomically while in ISR
Upon a communication error, the interrupt handler can call
tegra_i2c_disable_packet_mode. This causes a sleeping poll to happen
unless the current transaction was marked atomic. Fix this by
making the poll happen atomically if we are in an IRQ.
This matches the behavior prior to the patch mentioned
in the Fixes tag.
Fixes: ede2299f71
("i2c: tegra: Support atomic transfers")
Cc: stable@vger.kernel.org
Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
7c53f6b671
commit
27b7c6e096
@ -533,7 +533,7 @@ static int tegra_i2c_poll_register(struct tegra_i2c_dev *i2c_dev,
|
|||||||
void __iomem *addr = i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg);
|
void __iomem *addr = i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg);
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
if (!i2c_dev->atomic_mode)
|
if (!i2c_dev->atomic_mode && !in_irq())
|
||||||
return readl_relaxed_poll_timeout(addr, val, !(val & mask),
|
return readl_relaxed_poll_timeout(addr, val, !(val & mask),
|
||||||
delay_us, timeout_us);
|
delay_us, timeout_us);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user