use of regmap_read() and regmap_write() in c_can_hw_raminit_syscon()
is not safe as the RAMINIT register can be shared between different drivers
at least for TI SoCs.

To make the modification atomic we switch to using regmap_update_bits().

Signed-off-by: Roger Quadros <rog...@ti.com>
---
 drivers/net/can/c_can/c_can_platform.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/c_can/c_can_platform.c 
b/drivers/net/can/c_can/c_can_platform.c
index f363972..364209a 100644
--- a/drivers/net/can/c_can/c_can_platform.c
+++ b/drivers/net/can/c_can/c_can_platform.c
@@ -110,6 +110,10 @@ static void c_can_hw_raminit_syscon(const struct 
c_can_priv *priv, bool enable)
         */
        ctrl &= ~(1 << raminit->bits.start);
        ctrl |= 1 << raminit->bits.done;
+
+       /* we can't use regmap_update_bits here as it will bypass the write
+        * if START is already 0 and DONE is already 1.
+        */
        regmap_write(raminit->syscon, raminit->reg, ctrl);
 
        ctrl &= ~(1 << raminit->bits.done);
@@ -118,12 +122,13 @@ static void c_can_hw_raminit_syscon(const struct 
c_can_priv *priv, bool enable)
        if (enable) {
                /* Set start bit and wait for the done bit. */
                ctrl |= 1 << raminit->bits.start;
-               regmap_write(raminit->syscon, raminit->reg, ctrl);
+               regmap_update_bits(raminit->syscon, raminit->reg, mask, ctrl);
 
                /* clear START bit if start pulse is needed */
                if (raminit->needs_pulse) {
                        ctrl &= ~(1 << raminit->bits.start);
-                       regmap_write(raminit->syscon, raminit->reg, ctrl);
+                       regmap_update_bits(raminit->syscon, raminit->reg,
+                                          mask, ctrl);
                }
 
                ctrl |= 1 << raminit->bits.done;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to