1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MTD primitives for XIP support. Architecture specific functions. 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Do not include this file directly. It's included from linux/mtd/xip.h 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Author: Vladimir Barinov <vbarinov@ru.mvista.com> 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (c) 2005 MontaVista Software, Inc. This file is licensed under the 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * terms of the GNU General Public License version 2. This program is 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * licensed "as is" without any warranty of any kind, whether express or 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * implied. 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ARCH_OMAP_MTD_XIP_H__ 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __ARCH_OMAP_MTD_XIP_H__ 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/hardware.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define OMAP_MPU_TIMER_BASE (0xfffec500) 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define OMAP_MPU_TIMER_OFFSET 0x100 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct { 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 cntl; /* CNTL_TIMER, R/W */ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 load_tim; /* LOAD_TIM, W */ 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 read_tim; /* READ_TIM, R */ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} xip_omap_mpu_timer_regs_t; 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_omap_mpu_timer_base(n) \ 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru((volatile xip_omap_mpu_timer_regs_t*)IO_ADDRESS(OMAP_MPU_TIMER_BASE + \ 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (n)*OMAP_MPU_TIMER_OFFSET)) 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long xip_omap_mpu_timer_read(int nr) 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru volatile xip_omap_mpu_timer_regs_t* timer = xip_omap_mpu_timer_base(nr); 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return timer->read_tim; 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_irqpending() \ 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (omap_readl(OMAP_IH1_ITR) & ~omap_readl(OMAP_IH1_MIR)) 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_currtime() (~xip_omap_mpu_timer_read(0)) 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * It's permitted to do approxmation for xip_elapsed_since macro 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (see linux/mtd/xip.h) 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_MACH_OMAP_PERSEUS2 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_elapsed_since(x) (signed)((~xip_omap_mpu_timer_read(0) - (x)) / 7) 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_elapsed_since(x) (signed)((~xip_omap_mpu_timer_read(0) - (x)) / 6) 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * xip_cpu_idle() is used when waiting for a delay equal or larger than 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the system timer tick period. This should put the CPU into idle mode 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to save power and to be woken up only when some interrupts are pending. 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * As above, this should not rely upon standard kernel code. 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define xip_cpu_idle() asm volatile ("mcr p15, 0, %0, c7, c0, 4" :: "r" (1)) 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __ARCH_OMAP_MTD_XIP_H__ */ 62