1c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#ifndef _ASM_M32R_CMPXCHG_H 2c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define _ASM_M32R_CMPXCHG_H 3c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 4c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells/* 5c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells * M32R version: 6c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells * Copyright (C) 2001, 2002 Hitoshi Yamamoto 7c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> 8c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells */ 9c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 10c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#include <linux/irqflags.h> 11c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#include <asm/assembler.h> 12c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#include <asm/dcache_clear.h> 13c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 14c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsextern void __xchg_called_with_bad_pointer(void); 15c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 16c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic __always_inline unsigned long 17c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells__xchg(unsigned long x, volatile void *ptr, int size) 18c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 19c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long flags; 20c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long tmp = 0; 21c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 22c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_save(flags); 23c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 24c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells switch (size) { 25c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#ifndef CONFIG_SMP 26c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 1: 27c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 28c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ldb %0, @%2 \n\t" 29c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "stb %1, @%2 \n\t" 30c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 31c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 32c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 2: 33c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 34c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ldh %0, @%2 \n\t" 35c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "sth %1, @%2 \n\t" 36c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 37c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 38c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 4: 39c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 40c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ld %0, @%2 \n\t" 41c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "st %1, @%2 \n\t" 42c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 43c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 44c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#else /* CONFIG_SMP */ 45c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 4: 46c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 47c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells DCACHE_CLEAR("%0", "r4", "%2") 48c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "lock %0, @%2; \n\t" 49c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "unlock %1, @%2; \n\t" 50c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) 51c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "memory" 52c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#ifdef CONFIG_CHIP_M32700_TS1 53c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells , "r4" 54c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* CONFIG_CHIP_M32700_TS1 */ 55c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ); 56c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 57c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* CONFIG_SMP */ 58c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells default: 59c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __xchg_called_with_bad_pointer(); 60c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells } 61c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 62c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_restore(flags); 63c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 64c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return (tmp); 65c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 66c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 67c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define xchg(ptr, x) \ 68c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) 69c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 70c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic __always_inline unsigned long 71c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells__xchg_local(unsigned long x, volatile void *ptr, int size) 72c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 73c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long flags; 74c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long tmp = 0; 75c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 76c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_save(flags); 77c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 78c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells switch (size) { 79c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 1: 80c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 81c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ldb %0, @%2 \n\t" 82c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "stb %1, @%2 \n\t" 83c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 84c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 85c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 2: 86c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 87c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ldh %0, @%2 \n\t" 88c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "sth %1, @%2 \n\t" 89c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 90c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 91c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 4: 92c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 93c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ld %0, @%2 \n\t" 94c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "st %1, @%2 \n\t" 95c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (tmp) : "r" (x), "r" (ptr) : "memory"); 96c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells break; 97c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells default: 98c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __xchg_called_with_bad_pointer(); 99c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells } 100c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 101c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_restore(flags); 102c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 103c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return (tmp); 104c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 105c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 106c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define xchg_local(ptr, x) \ 107c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ((__typeof__(*(ptr)))__xchg_local((unsigned long)(x), (ptr), \ 108c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells sizeof(*(ptr)))) 109c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 110c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define __HAVE_ARCH_CMPXCHG 1 111c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 112c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic inline unsigned long 113c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells__cmpxchg_u32(volatile unsigned int *p, unsigned int old, unsigned int new) 114c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 115c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long flags; 116c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned int retval; 117c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 118c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_save(flags); 119c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 120c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells DCACHE_CLEAR("%0", "r4", "%1") 121c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells M32R_LOCK" %0, @%1; \n" 122c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " bne %0, %2, 1f; \n" 123c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells M32R_UNLOCK" %3, @%1; \n" 124c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " bra 2f; \n" 125c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " .fillinsn \n" 126c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "1:" 127c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells M32R_UNLOCK" %0, @%1; \n" 128c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " .fillinsn \n" 129c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "2:" 130c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (retval) 131c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "r" (p), "r" (old), "r" (new) 132c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "cbit", "memory" 133c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#ifdef CONFIG_CHIP_M32700_TS1 134c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells , "r4" 135c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* CONFIG_CHIP_M32700_TS1 */ 136c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ); 137c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_restore(flags); 138c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 139c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return retval; 140c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 141c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 142c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic inline unsigned long 143c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells__cmpxchg_local_u32(volatile unsigned int *p, unsigned int old, 144c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned int new) 145c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 146c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long flags; 147c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned int retval; 148c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 149c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_save(flags); 150c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __asm__ __volatile__ ( 151c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells DCACHE_CLEAR("%0", "r4", "%1") 152c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "ld %0, @%1; \n" 153c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " bne %0, %2, 1f; \n" 154c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "st %3, @%1; \n" 155c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " bra 2f; \n" 156c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " .fillinsn \n" 157c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "1:" 158c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "st %0, @%1; \n" 159c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells " .fillinsn \n" 160c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells "2:" 161c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "=&r" (retval) 162c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "r" (p), "r" (old), "r" (new) 163c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells : "cbit", "memory" 164c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#ifdef CONFIG_CHIP_M32700_TS1 165c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells , "r4" 166c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* CONFIG_CHIP_M32700_TS1 */ 167c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ); 168c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells local_irq_restore(flags); 169c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 170c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return retval; 171c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 172c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 173c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells/* This function doesn't exist, so you'll get a linker error 174c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells if something tries to do an invalid cmpxchg(). */ 175c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsextern void __cmpxchg_called_with_bad_pointer(void); 176c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 177c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic inline unsigned long 178c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) 179c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 180c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells switch (size) { 181c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 4: 182c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return __cmpxchg_u32(ptr, old, new); 183c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#if 0 /* we don't have __cmpxchg_u64 */ 184c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 8: 185c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return __cmpxchg_u64(ptr, old, new); 186c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* 0 */ 187c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells } 188c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells __cmpxchg_called_with_bad_pointer(); 189c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return old; 190c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 191c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 192c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define cmpxchg(ptr, o, n) \ 193c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ((__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)(o), \ 194c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells (unsigned long)(n), sizeof(*(ptr)))) 195c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 196c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#include <asm-generic/cmpxchg-local.h> 197c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 198c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howellsstatic inline unsigned long __cmpxchg_local(volatile void *ptr, 199c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long old, 200c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells unsigned long new, int size) 201c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells{ 202c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells switch (size) { 203c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells case 4: 204c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return __cmpxchg_local_u32(ptr, old, new); 205c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells default: 206c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return __cmpxchg_local_generic(ptr, old, new, size); 207c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells } 208c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 209c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells return old; 210c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells} 211c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 212c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells/* 213c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make 214c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells * them available. 215c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells */ 216c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define cmpxchg_local(ptr, o, n) \ 217c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \ 218c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells (unsigned long)(n), sizeof(*(ptr)))) 219c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) 220c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells 221c9034c3a1d67486284b3b569595a4bd377aaf8ccDavid Howells#endif /* _ASM_M32R_CMPXCHG_H */ 222