]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
i2c: rcar: explain the lockless design
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Sun, 3 Mar 2019 15:03:14 +0000 (16:03 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Tue, 12 Mar 2019 13:09:33 +0000 (14:09 +0100)
To make sure people can understand the lockless design of this driver
without the need to dive into git history, add a comment giving an
overview of the situation.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-rcar.c

index ce59e14e34b0af19d4dca9be2c36fb92558572b4..a7578f6da9796647724fb346a88bd4a2e91a3b14 100644 (file)
@@ -611,6 +611,15 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
        return true;
 }
 
+/*
+ * This driver has a lock-free design because there are IP cores (at least
+ * R-Car Gen2) which have an inherent race condition in their hardware design.
+ * There, we need to clear RCAR_BUS_MASK_DATA bits as soon as possible after
+ * the interrupt was generated, otherwise an unwanted repeated message gets
+ * generated. It turned out that taking a spinlock at the beginning of the ISR
+ * was already causing repeated messages. Thus, this driver was converted to
+ * the now lockless behaviour. Please keep this in mind when hacking the driver.
+ */
 static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
 {
        struct rcar_i2c_priv *priv = ptr;