It's almost universally better to use inline assembly via a macro to read/write mmio rather than use volatile.