Committed revision 689.
A little meta-note here. I am seeing, more frequently now than 20 years ago, this kind of style in drivers and bios code:
base = (u32 *)pci_read_config_long(whatever); *(base + xyz) =
Somehow, in all the usage of pragmas, attributes, segment names, and all the other gadgets that have been added to C in the last while, we've completely lost track of one of the most important reasons to use C in systems programming!
What's the right way to work on memory-mapped registers? Well, in this case:
struct usb_otg{ u32 uoc; u32 uocmux; u32 _1; /* A Plan 9 trick, and if it's good enough for the guys who designed C, it's good enough for me (this is a reserved register) */ u32 uocctl; };
and so on. So, just a note: don't forget about structs as templates for memory mapped registers. That capability has been there and been used since, oh, 1973 or so :-)
thanks
ron