Skip to content

Commit c506955

Browse files
Phil Elwellpopcornmix
Phil Elwell
authored andcommitted
i2c: bcm2835: Set clock-stretch timeout to 35ms
The BCM2835 I2C blocks have a register to set the clock-stretch timeout - how long the device is allowed to hold SCL low - in bus cycles. The current driver doesn't write to the register, therefore the default value of 64 cycles is being used for all devices. Set the timeout to the value recommended for SMBus - 35ms. See: #3064 Signed-off-by: Phil Elwell <[email protected]>
1 parent ef6d535 commit c506955

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

drivers/i2c/busses/i2c-bcm2835.c

+12
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ static int clk_bcm2835_i2c_set_rate(struct clk_hw *hw, unsigned long rate,
193193
{
194194
struct clk_bcm2835_i2c *div = to_clk_bcm2835_i2c(hw);
195195
u32 redl, fedl;
196+
u32 clk_tout;
196197
u32 divider = clk_bcm2835_i2c_calc_divider(rate, parent_rate);
197198

198199
if (divider == -EINVAL)
@@ -216,6 +217,17 @@ static int clk_bcm2835_i2c_set_rate(struct clk_hw *hw, unsigned long rate,
216217
bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL,
217218
(fedl << BCM2835_I2C_FEDL_SHIFT) |
218219
(redl << BCM2835_I2C_REDL_SHIFT));
220+
221+
/*
222+
* Set the clock stretch timeout to the SMBUs-recommended 35ms.
223+
*/
224+
if (rate > 0xffff*1000/35)
225+
clk_tout = 0xffff;
226+
else
227+
clk_tout = 35*rate/1000;
228+
229+
bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_CLKT, clk_tout);
230+
219231
return 0;
220232
}
221233

0 commit comments

Comments
 (0)