The most logical way to build modules, for the part that has to do with hardware, is to make each module, no matter how small and how many of them, to separate the characteristics that one development stage got from the other.
For example, separate a module for detecting the partitions (developed as a PC standard) from the module to detect the filesystems (developed by many different entities).
Or, have a module to access any kind of disk, that has an information block for every one, and in turn there exist a lower-level module that in turn work as a wrapper to save the low level information in very delimited areas for all of the different types of disks.
In short, separate for hardware, in modules, what ones have done from what others have done. In this way, the attitude of letting alone the hardware designers from the software and thus forcing its design is complied, I'd say, fully in that respect.