Unified Driver model for low speed and high speed microcontrollers with limited and good memory
(See also Is there a standard for writing device drivers for microcontrollers? ; as your question relates purely to software you might get a better answer on the software stackexchange.)

In C, functions are strongly preferred over macros wherever possible. They're easier to debug, and can inline just as well if you're concerned about speed. You say "in the interrupt routine where I would not want to call any functions"; what target platform are you writing for and do you have a hard stack limit? Banning functions entirely from interrupt handlers is not a great style either. You might want to invest in a "top half"/"bottom half" architecture as used by Linux.

Having said that, the quasi-object-orientated style (I wouldn't call it "callback") of passing a map of peripheral registers around doesn't work well on the very small platforms such as PIC, where indirection is unreasonably expensive. Those are really too small for a meaningful operating system with drivers.