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