Split up the driver into multiple files for maintainablity. Also added IRQ capability