[PATCH RESEND] mfd: mc13xxx: Remove unneeded mc13xxx_lock/unlock
Philippe Rétornaz
philippe.retornaz at gmail.com
Mon Dec 2 04:51:00 EST 2013
Le 30/11/2013 06:01, Alexander Shiyan a écrit :
> Locking is performed by regmap API so no additional locking is
> needed. Nevertheless, keep locking in the ADC conversion routine.
> This need for keep proper read ADC sequence when calling from adc &
> touchscreen drivers.
You can't do that so easily !
Regmap only protect against concurrent access to the SPI/I2C bus, but do
not protect the driver's internal data.
And it does not protect against a race between concurrent access at a
higher level :
reg = regmap_read();
(modify reg)
regmap_write(reg);
And we do have such behavior:
* The mc13xxx->irqhandler/irqdata array is
protected by this mutex.
* And we also have non-atomic RMW in mc13xxx_irq_unmask():
ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
if (ret)
return ret;
if (!(mask & irqbit))
return 0;
return mc13xxx_reg_write(mc13xxx, offmask, mask & ~irqbit);
It's OK to do this if you are protected by a mutex, but as soon as you
remove it you will have concurrency between two irq_unmask/irq_mask.
So you can remove the lock from trivial function like:
mc13xxx_lock(led->master);
mc13xxx_reg_rmw(led->master, reg, mask << shift, value << shift);
mc13xxx_unlock(led->master);
Which protect only a single access to regmap.
But we need to keep it for more complex behavior.
Regards,
Philippe
More information about the linux-arm-kernel
mailing list