This is an attempt to only allow opening on devices that have actually successfully init (or have no dv_init?) -- wrap devsw->dv_open so we can kick back ENXIO consistently if we haven't been initialized successfully.
dv_open previously used varargs, but always took exactly one devdesc-esque pointer. Formalize the prototype as taking a struct devdesc *, we'll just use type-punning as needed and is safe in individual dv_open.
Some redundancy of walking through global devsw and initializing has been removed in favor of providing a common method for this in libsa. U-Boot uses it, though it did something slightly different: dv_init == NULL implied an unusable device, but this is now fine (and likely sufficiently edge-casey that it doesn't really matter).