]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/i2c/busses/i2c-bcm2835.c
i2c: bcm2835: Avoid clock stretching timeouts
[mirror_ubuntu-jammy-kernel.git] / drivers / i2c / busses / i2c-bcm2835.c
index 37443edbf75464083693878983790c93d3457709..ad3b124a2e3768c9eb132fd2208ce421ed1da631 100644 (file)
 #define BCM2835_I2C_FIFO       0x10
 #define BCM2835_I2C_DIV                0x14
 #define BCM2835_I2C_DEL                0x18
+/*
+ * 16-bit field for the number of SCL cycles to wait after rising SCL
+ * before deciding the slave is not responding. 0 disables the
+ * timeout detection.
+ */
 #define BCM2835_I2C_CLKT       0x1c
 
 #define BCM2835_I2C_C_READ     BIT(0)
@@ -477,6 +482,12 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
        adap->dev.of_node = pdev->dev.of_node;
        adap->quirks = of_device_get_match_data(&pdev->dev);
 
+       /*
+        * Disable the hardware clock stretching timeout. SMBUS
+        * specifies a limit for how long the device can stretch the
+        * clock, but core I2C doesn't.
+        */
+       bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0);
        bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0);
 
        ret = i2c_add_adapter(adap);