> This patchset adds hwspinlock framework that makes it possible
> for drivers to use those hwspinlock devices and stay platform-independent.
>
> Currently there are two users for this hwspinlock interface:
>
> 1. Inter-processor communications: on OMAP4, cpu-intensive multimedia
> tasks are offloaded by the host to the remote M3 and/or C64x+ slave
> processors.
>
> To achieve fast message-based communications, a minimal kernel support
> is needed to deliver messages arriving from a remote processor to the
> appropriate user process.
>
> This communication is based on a simple data structure that is shared between
> the remote processors, and access to it is synchronized using the hwspinlock
> module (remote processor directly places new messages in this shared data
> structure).
>
> 2. On some OMAP4 boards, the I2C bus is shared between the A9 and the M3,
> and the hwspinlock is used to synchronize access to it.
>
> While (2) can get away with an omap-specific hwspinlock implementation,
> (1) is by no means omap-specific, and a common hwspinlock interface is
> needed to keep it generic, in hopes that it will be useful for other
> platforms as well.
>
> Changes v2->v3:
> - Remove the timeout-less _lock API variant (Tony)
> - s/state->io_base/io_base/ (Ionut)
> - Remove the "generic" wording (David)
> - s/hwspinlock_/hwspin_lock_/ (Mugdha)
> - Use MAX_SCHEDULE_TIMEOUT to indicate no timeout (Mugdha)
> - Be more verbose on egregious API misuse (Olof)
> - locking API misuse is BUG_ON material (Russell)
>
> Note: Russell also suggested compiling out NULL checks on ARM.
> I've posted an initial proposal for this (see
>
https://lkml.org/lkml/2010/11/29/96), which I'm going to resubmit
> separately. If accepted, I'll adopt hwspinlocks to use it.
>
> Patches are tested against linux-omap-2.6 master, which is 2.6.37-rc4 plus
> omap material. All, but the third (the hwmod omap patch), apply on top of
> mainline 2.6.37-rc4 as well
>
> Changes v1->v2:
> - Convert to a generic interface (Tony)
> - API should silently succeed if framework isn't built (Greg)
> - Don't use ERR_PTR pattern (Grant)
> - Use tristate, fix and extend commentary (Kevin)
> - Provide API flexibility regarding irq handling (Arnd, Grant)
>
> Note: after reviewing OMAP's L4 access times, and comparing them with
> external memory latencies, I can say that there is no notable difference.
> Because of that, we can safely treat the hwspinlock like we do
> with regular spinlocks: preemption should be disabled, but whether
> to disable interrupts or not is up to the caller.
>
> So despite the TRM's recommendation to always disable local interrupts
> when taking an OMAP Hardware Spinlock, I have decided to allow callers
> not to do that (by providing the full extent of hwspin_lock(),
> hwspin_lock_irq() and hwspin_lock_irqsave() API).
>
> Just like regular spinlocks, it's up to the callers to decide whether
> interrupts should be disabled or not.
>
> Sleeping, btw, is still prohibited of course.
>
> Contributions:
>
> Previous versions of an omap-specific hwspinlock driver circulated in
> linux-omap several times, and received substantial attention and contribution
> from many developers (see [1][2][3][4][5][6]):
>
> Simon Que did the initial implementation and pushed several iterations
> Benoit Cousson provided extensive review, help, improvements and hwmod support
> Hari Kanigeri helped out when Simon was away
> Sanjeev Premi, Santosh Shilimkar and Nishanth Menon did lots of review
>
> I'd like to thank Benoit Cousson, Steve Krueger, Hari Kanigeri,
> Nourredine Hamoudi and Richard Woodruff for useful discussions about
> the OMAP Spinlock requirements and use-cases.
>
> Relevant linux-omap threads:
>
> [1]
http://thread.gmane.org/gmane.linux.ports.arm.omap/38755
> [2]
http://thread.gmane.org/gmane.linux.ports.arm.omap/38917
> [3]
http://thread.gmane.org/gmane.linux.ports.arm.omap/39187
> [4]
http://thread.gmane.org/gmane.linux.ports.arm.omap/39365
> [5]
http://thread.gmane.org/gmane.linux.ports.arm.omap/39815
> [6]
http://thread.gmane.org/gmane.linux.ports.arm.omap/40901
>