19839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren/*
29839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * MTD primitives for XIP support. Architecture specific functions.
39839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren *
49839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * Do not include this file directly. It's included from linux/mtd/xip.h
59839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren *
6d6b52039c95556ade5c4f99592a0dc46473fbf93Vladimir Barinov * Author: Vladimir Barinov <vbarinov@embeddedalley.com>
79839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren *
89839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * (c) 2005 MontaVista Software, Inc.  This file is licensed under the
99839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * terms of the GNU General Public License version 2.  This program is
109839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * licensed "as is" without any warranty of any kind, whether express or
119839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * implied.
129839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren */
139839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
149839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#ifndef __ARCH_OMAP_MTD_XIP_H__
159839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define __ARCH_OMAP_MTD_XIP_H__
169839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
17a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
189839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define OMAP_MPU_TIMER_BASE	(0xfffec500)
199839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define OMAP_MPU_TIMER_OFFSET	0x100
209839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
219839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgrentypedef struct {
229839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	u32 cntl;			/* CNTL_TIMER, R/W */
239839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	u32 load_tim;			/* LOAD_TIM,   W */
249839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	u32 read_tim;			/* READ_TIM,   R */
259839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren} xip_omap_mpu_timer_regs_t;
269839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
279839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_omap_mpu_timer_base(n)					\
28941132606c7611246d2034cb7b01f9270c2d1edeTony Lindgren((volatile xip_omap_mpu_timer_regs_t*)OMAP1_IO_ADDRESS(OMAP_MPU_TIMER_BASE +	\
299839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	(n)*OMAP_MPU_TIMER_OFFSET))
309839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
319839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgrenstatic inline unsigned long xip_omap_mpu_timer_read(int nr)
329839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren{
339839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	volatile xip_omap_mpu_timer_regs_t* timer = xip_omap_mpu_timer_base(nr);
349839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	return timer->read_tim;
359839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren}
369839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
379839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_irqpending()	\
389839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren	(omap_readl(OMAP_IH1_ITR) & ~omap_readl(OMAP_IH1_MIR))
399839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_currtime()		(~xip_omap_mpu_timer_read(0))
409839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
419839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren/*
429839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * It's permitted to do approxmation for xip_elapsed_since macro
439839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * (see linux/mtd/xip.h)
449839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren */
459839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
469839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#ifdef CONFIG_MACH_OMAP_PERSEUS2
479839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_elapsed_since(x)	(signed)((~xip_omap_mpu_timer_read(0) - (x)) / 7)
489839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#else
499839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_elapsed_since(x)	(signed)((~xip_omap_mpu_timer_read(0) - (x)) / 6)
509839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#endif
519839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
529839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren/*
539839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * xip_cpu_idle() is used when waiting for a delay equal or larger than
549839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * the system timer tick period.  This should put the CPU into idle mode
559839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * to save power and to be woken up only when some interrupts are pending.
569839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren * As above, this should not rely upon standard kernel code.
579839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren */
589839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
599839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#define xip_cpu_idle()  asm volatile ("mcr p15, 0, %0, c7, c0, 4" :: "r" (1))
609839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren
619839c6b8dd414612be0b6a70c4aa06eaca5b7652Tony Lindgren#endif /* __ARCH_OMAP_MTD_XIP_H__ */
62