|  | /* | 
|  | * include/asm-arm/macro.h | 
|  | * | 
|  | * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 
|  | * | 
|  | * See file CREDITS for list of people who contributed to this | 
|  | * project. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public License as | 
|  | * published by the Free Software Foundation; either version 2 of | 
|  | * the License, or (at your option) any later version. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
|  | * MA 02111-1307 USA | 
|  | */ | 
|  |  | 
|  | #ifndef __ASM_ARM_MACRO_H__ | 
|  | #define __ASM_ARM_MACRO_H__ | 
|  | #ifdef __ASSEMBLY__ | 
|  |  | 
|  | /* | 
|  | * These macros provide a convenient way to write 8, 16 and 32 bit data | 
|  | * to any address. | 
|  | * Registers r4 and r5 are used, any data in these registers are | 
|  | * overwritten by the macros. | 
|  | * The macros are valid for any ARM architecture, they do not implement | 
|  | * any memory barriers so caution is recommended when using these when the | 
|  | * caches are enabled or on a multi-core system. | 
|  | */ | 
|  |  | 
|  | .macro	write32, addr, data | 
|  | ldr	r4, =\addr | 
|  | ldr	r5, =\data | 
|  | str	r5, [r4] | 
|  | .endm | 
|  |  | 
|  | .macro	write16, addr, data | 
|  | ldr	r4, =\addr | 
|  | ldrh	r5, =\data | 
|  | strh	r5, [r4] | 
|  | .endm | 
|  |  | 
|  | .macro	write8, addr, data | 
|  | ldr	r4, =\addr | 
|  | ldrb	r5, =\data | 
|  | strb	r5, [r4] | 
|  | .endm | 
|  |  | 
|  | /* | 
|  | * This macro generates a loop that can be used for delays in the code. | 
|  | * Register r4 is used, any data in this register is overwritten by the | 
|  | * macro. | 
|  | * The macro is valid for any ARM architeture. The actual time spent in the | 
|  | * loop will vary from CPU to CPU though. | 
|  | */ | 
|  |  | 
|  | .macro	wait_timer, time | 
|  | ldr	r4, =\time | 
|  | 1: | 
|  | nop | 
|  | subs	r4, r4, #1 | 
|  | bcs	1b | 
|  | .endm | 
|  |  | 
|  | #endif /* __ASSEMBLY__ */ | 
|  | #endif /* __ASM_ARM_MACRO_H__ */ |