Expanding that a bit: since USB is a packet-based protocol, many USB drivers bring network programs into mind: you construct a packet of certain length, then tell the kernel driver to send it over the wire, then listen for response... The actual protocol is just binary data to kernel who only cares about the fact that the packets move in and out of the hardware.
The "do everything in kernel and then provide a file-based API to the programs" is merely ancient unix mentality. It is almost definitely not the best possible method to write every driver with.