> > On 21 Jun 2016, at 1:28 PM, Artturi Alm <artturi....@gmail.com> wrote: > > Hi, > > i'm unsure about the accepted way of working around irregular registers, > like would be needed with supporting Mentor OTG USB on both omap&sunxi > on armv7. irregular as in _no_ correlation what so ever, so off*4 kind > of solution does not apply. > My question in particular is; is (ab)using bus_space for this accepted > workaround? > > NetBSD, where the driver got ported from, does have #ifdef MOTG_ALLWINNER > which is obviously not possible, given GENERIC and its nature as true > 'uni-mono-kernel'. i was actually a bit shocked when i figured how many > arm kernel configs etc. they get to have maintenance-fun with if/when > necessary :) > > reason why i think this is better than any other method to solve it in > run-time rather than compile-time is, because it wouldn't affect other > than the offender(=sunxi/Allwinner), no matter how ugly. > > shortened(actually +30cases in switch below) to show something like > what i would propose:
id go with a map of the registers inside the driver. something like struct musb2_registers { bus_size_t reg_faddr; bus_size_t reg_power; bus_size_t reg_devctl; ... }; and then static const struct musb2_registers aw_musb2_registers = { MUSB2_REG_FADDR_AW, MUSB2_REG_POWER_AW, MUSB2_REG_DEVCTL_AW, ... }; static const struct musb2_registers sx_musb2_registers = { MUSB2_REG_FADDR_SX, MUSB2_REG_POWER_SX, MUSB2_REG_DEVCTL_SX, ... }; using this could be something like this: struct musb2_softc { struct device sc_dev; const struct musb2_registers *sc_reg; ... } #define musb2_rd4(_sc, _r) bus_space_read_4((_sc)->sc_tag, (_sc)->sc_handle, (_sc)->sc_reg->(_r)) attach would pick between the right instance of musb2_registers, and then the rest of the driver would be: reg = musb2_read(sc, reg_faddr); or something.