On Tue, Dec 04, 2018 at 10:49:44PM +0300, Sergei Shtylyov wrote: > Protect the CPG register read-modify-write sequence with a spinlock. Spinlocks are expensive, I think an explanation of why this is necessary would be worthwhile. > > Signed-off-by: Sergei Shtylyov <sergei.shtylyov@xxxxxxxxxxxxxxxxxx> > > --- > Changes in version 2: > - new patch. > > drivers/clk/renesas/rcar-gen3-cpg.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > Index: renesas-drivers/drivers/clk/renesas/rcar-gen3-cpg.c > =================================================================== > --- renesas-drivers.orig/drivers/clk/renesas/rcar-gen3-cpg.c > +++ renesas-drivers/drivers/clk/renesas/rcar-gen3-cpg.c > @@ -30,14 +30,19 @@ > > #define CPG_RCKCR_CKSEL BIT(15) /* RCLK Clock Source Select */ > > +static spinlock_t cpg_lock; > + > static void cpg_reg_modify(void __iomem *reg, u32 clear, u32 set) > { > + unsigned long flags; > u32 val; > > + spin_lock_irqsave(&cpg_lock, flags); > val = readl(reg); > val &= ~clear; > val |= set; > writel(val, reg); > + spin_unlock_irqrestore(&cpg_lock, flags); > }; > > struct cpg_simple_notifier { > @@ -604,5 +609,8 @@ int __init rcar_gen3_cpg_init(const stru > if (attr) > cpg_quirks = (uintptr_t)attr->data; > pr_debug("%s: mode = 0x%x quirks = 0x%x\n", __func__, mode, cpg_quirks); > + > + spin_lock_init(&cpg_lock); > + > return 0; > } >