i2c: rcar: fix MNR interrupt handling
[deliverable/linux.git] / drivers / i2c / busses / i2c-rcar.c
index 8994059236786e88b42185b3edbe916b3fb98bd8..dc32f5fa75d019dc52c2601dd4cbcab5ba6d5e86 100644 (file)
@@ -367,18 +367,15 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
 
        msr = rcar_i2c_read(priv, ICMSR);
 
+       /* Only handle interrupts that are currently enabled */
+       msr &= rcar_i2c_read(priv, ICMIER);
+
        /* Arbitration lost */
        if (msr & MAL) {
                rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST));
                goto out;
        }
 
-       /* Stop */
-       if (msr & MST) {
-               rcar_i2c_flags_set(priv, ID_DONE);
-               goto out;
-       }
-
        /* Nack */
        if (msr & MNR) {
                /* go to stop phase */
@@ -388,6 +385,12 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
                goto out;
        }
 
+       /* Stop */
+       if (msr & MST) {
+               rcar_i2c_flags_set(priv, ID_DONE);
+               goto out;
+       }
+
        if (rcar_i2c_is_recv(priv))
                rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr));
        else
@@ -541,13 +544,13 @@ static int rcar_i2c_probe(struct platform_device *pdev)
        irq = platform_get_irq(pdev, 0);
        init_waitqueue_head(&priv->wait);
 
-       adap                    = &priv->adap;
-       adap->nr                = pdev->id;
-       adap->algo              = &rcar_i2c_algo;
-       adap->class             = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED;
-       adap->retries           = 3;
-       adap->dev.parent        = dev;
-       adap->dev.of_node       = dev->of_node;
+       adap = &priv->adap;
+       adap->nr = pdev->id;
+       adap->algo = &rcar_i2c_algo;
+       adap->class = I2C_CLASS_DEPRECATED;
+       adap->retries = 3;
+       adap->dev.parent = dev;
+       adap->dev.of_node = dev->of_node;
        i2c_set_adapdata(adap, priv);
        strlcpy(adap->name, pdev->name, sizeof(adap->name));
 
This page took 0.031338 seconds and 5 git commands to generate.