Hi, On Mon, Sep 26, 2016 at 10:46:25AM +0200, Olliver Schinagl wrote: > > For the spin_lock part, I was just comparing it to a > > spin_lock_irqsave, which is pretty expensive since it masks all the > > interrupts in the system, introducing latencies. > > so spin_lock is very expensive and we should avoid if we can? spin_lock_irqsave, if possible, yes. > > > but I think we need the ndelay for the else where we do not > > > have the ready flag (A10 or A13 iirc?) > > > > Hmmmm, good point. But that would also apply to your second patch > > then, wouldn't it? > yeah, you would have an if/else for the case of !hasready. > > this is what i've been dabbling in the train last week, but haven't > thought it through yet, let alone tested it: > > > +       if (!(sun4i_pwm->data->has_rdy)) > +               ndelay(pwm_get_period(pwm)); > +       else > +               do { > +                       spin_lock(&sun4i_pwm->ctrl_lock); > +                       val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG); > +                       spin_unlock(&sun4i_pwm->ctrl_lock); > +               } while (!(val & PWM_RDY(pwm->hwpwm))) > > Here I assumed the spin_lock is cheap to make, expensive to hold for > long, e.g. reducing the length the spin-lock is active for. the > alternative was to remove the spin_lock here, and remove unlock-lock > before-after this block where you basically get a very long lasting > spin_lock, the alternative. If you're only reading, why do you need to take the lock? You probbaly want to have a timeout too. Maxime -- Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com