That's valid... 'a' is an expansion of the second argument to the macro.
The problem is MMU_WRITE I think.
CMDW(MINIMAL_MMU_W7104, MMU_WRITE("c7,c10,4",arg));
expands to:
CMDW(0x116, { arg = arg; asm volatile( \
"stmdb sp!, {r0}\n\t" \
"mov r0, %0\n\t" \
"mcr p15, 0, r0, "...