These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / i2c / busses / i2c-bcm2835.c
index c9336a3..3032b89 100644 (file)
 #define BCM2835_I2C_S_CLKT     BIT(9)
 #define BCM2835_I2C_S_LEN      BIT(10) /* Fake bit for SW error reporting */
 
+#define BCM2835_I2C_BITMSK_S   0x03FF
+
+#define BCM2835_I2C_CDIV_MIN   0x0002
+#define BCM2835_I2C_CDIV_MAX   0xFFFE
+
 #define BCM2835_I2C_TIMEOUT (msecs_to_jiffies(1000))
 
 struct bcm2835_i2c_dev {
@@ -111,6 +116,7 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data)
        u32 val, err;
 
        val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
+       val &= BCM2835_I2C_BITMSK_S;
        bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, val);
 
        err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR);
@@ -258,6 +264,11 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
         */
        if (divider & 1)
                divider++;
+       if ((divider < BCM2835_I2C_CDIV_MIN) ||
+           (divider > BCM2835_I2C_CDIV_MAX)) {
+               dev_err(&pdev->dev, "Invalid clock-frequency\n");
+               return -ENODEV;
+       }
        bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider);
 
        irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);