#include <linux/irqflags.h>
 
-struct __xchg_dummy { unsigned long a[100]; };
-#define __xg(x) ((volatile struct __xchg_dummy *)(x))
+#define __xg(type, x) ((volatile type *)(x))
 
 extern unsigned long __invalid_xchg_size(unsigned long, volatile void *, int);
 
                         "1:\n\t"
                         "casb %0,%1,%2\n\t"
                         "jne 1b"
-                        : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
+                        : "=&d" (x) : "d" (x), "m" (*__xg(u8, ptr)) : "memory");
                break;
        case 2:
                __asm__ __volatile__
                         "1:\n\t"
                         "casw %0,%1,%2\n\t"
                         "jne 1b"
-                        : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
+                        : "=&d" (x) : "d" (x), "m" (*__xg(u16, ptr)) : "memory");
                break;
        case 4:
                __asm__ __volatile__
                         "1:\n\t"
                         "casl %0,%1,%2\n\t"
                         "jne 1b"
-                        : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
+                        : "=&d" (x) : "d" (x), "m" (*__xg(u32, ptr)) : "memory");
                break;
        default:
                x = __invalid_xchg_size(x, ptr, size);