I don't get it. Why the "void *" stuff? That is where I think the
real badness lies, and I agree we should not have that.
But defining something like
typedef struct bus_dma_tag *bus_dma_tag_t;
would mean we could easily change what bus_dma_tag_t actually is,
keeping it opaque, while at the same time keeping the type checking.
Um, no, you get the type checking only as long as "what [it] actually
is" is a tagged type - a struct, union, or (I think; I'd have to check)
enum. Make it (for example) a char *, or an unsigned int, and you lose
much of the typechecking.