[PATCH] ARM: mm: cache-l2x0: Add support for re-enabling l2x0
Colin Cross
ccross at android.com
Mon Jun 13 14:20:34 EDT 2011
On Mon, Jun 13, 2011 at 3:19 AM, Lorenzo Pieralisi
<lorenzo.pieralisi at arm.com> wrote:
> On Mon, Jun 13, 2011 at 01:46:58AM +0100, Colin Cross wrote:
>> Remove __init annotation from l2x0_init so it can be used to
>> reinitialize the l2x0 after it has been reset during suspend.
>>
>> Only print the init messages the first time l2x0_init is called.
>>
>> Add l2x0_enable to re-enable the l2x0 after l2x0_disable if
>> the l2x0 was not reset.
>>
>> l2x0_disable cannot use writel, as writel calls wmb(), and wmb()
>> may call outer_cache_sync, which takes the same spinlock as
>> l2x0_disable.
>>
>> Signed-off-by: Colin Cross <ccross at android.com>
>> ---
>> arch/arm/include/asm/hardware/cache-l2x0.h | 3 ++-
>> arch/arm/mm/cache-l2x0.c | 18 ++++++++++++++----
>> 2 files changed, 16 insertions(+), 5 deletions(-)
>>
>
> [...]
>
>> +/* enables l2x0 after l2x0_disable, does not invalidate */
>> +void l2x0_enable(void)
>> +{
>> + unsigned long flags;
>> +
>> + spin_lock_irqsave(&l2x0_lock, flags);
>> + writel_relaxed(1, l2x0_base + L2X0_CTRL);
>> + spin_unlock_irqrestore(&l2x0_lock, flags);
>> +}
>> +
>> static void l2x0_disable(void)
>> {
>> unsigned long flags;
>>
>> spin_lock_irqsave(&l2x0_lock, flags);
>> - writel(0, l2x0_base + L2X0_CTRL);
>> + writel_relaxed(0, l2x0_base + L2X0_CTRL);
>> spin_unlock_irqrestore(&l2x0_lock, flags);
>> }
>
> This function is still dodgy to use, since we are disabling L2
> possibly with current function stack lines allocated, which might wreak havoc.
More information about the linux-arm-kernel
mailing list