The original implementation __do_IRQ() is an alternative entry point for all types of interrupts.
This handler turned out to be not suitable for all interrupt hardware and was therefore reimplemented with split functionality for egde/level/simple/percpu interrupts. This is not only a functional optimization. It also shortens code paths for interrupts.
To make use of the split implementation, replace the call to __do_IRQ by a call to desc->chip->handle_irq() and associate the appropriate handler function to desc->chip->handle_irq(). In most cases the generic handler implementations should be sufficient.