kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0268-i2c-bcm2835-Set-clock-stretch-timeout-to-35ms.patch
1 From 9c64858d41cc65982aaf36866ffa8e04b9792718 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Fri, 12 Jul 2019 15:38:35 +0100
4 Subject: [PATCH] i2c: bcm2835: Set clock-stretch timeout to 35ms
5
6 The BCM2835 I2C blocks have a register to set the clock-stretch
7 timeout - how long the device is allowed to hold SCL low - in bus
8 cycles. The current driver doesn't write to the register, therefore
9 the default value of 64 cycles is being used for all devices.
10
11 Set the timeout to the value recommended for SMBus - 35ms.
12
13 See: https://github.com/raspberrypi/linux/issues/3064
14
15 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
16 ---
17  drivers/i2c/busses/i2c-bcm2835.c | 12 ++++++++++++
18  1 file changed, 12 insertions(+)
19
20 --- a/drivers/i2c/busses/i2c-bcm2835.c
21 +++ b/drivers/i2c/busses/i2c-bcm2835.c
22 @@ -188,6 +188,7 @@ static int clk_bcm2835_i2c_set_rate(stru
23  {
24         struct clk_bcm2835_i2c *div = to_clk_bcm2835_i2c(hw);
25         u32 redl, fedl;
26 +       u32 clk_tout;
27         u32 divider = clk_bcm2835_i2c_calc_divider(rate, parent_rate);
28  
29         if (divider == -EINVAL)
30 @@ -211,6 +212,17 @@ static int clk_bcm2835_i2c_set_rate(stru
31         bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL,
32                            (fedl << BCM2835_I2C_FEDL_SHIFT) |
33                            (redl << BCM2835_I2C_REDL_SHIFT));
34 +
35 +       /*
36 +        * Set the clock stretch timeout to the SMBUs-recommended 35ms.
37 +        */
38 +       if (rate > 0xffff*1000/35)
39 +           clk_tout = 0xffff;
40 +       else
41 +           clk_tout = 35*rate/1000;
42 +
43 +       bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_CLKT, clk_tout);
44 +
45         return 0;
46  }
47