/* Waits for 'usecs' microseconds using the TOD clock comparator.  */
void __udelay(unsigned long long usecs)
/* Waits for 'usecs' microseconds using the TOD clock comparator.  */
void __udelay(unsigned long long usecs)
{
	unsigned long flags;
	preempt_disable();
	local_irq_save(flags);
	if (in_irq()) {
		__udelay_disabled(usecs);
		goto out;
	}
	if (in_softirq()) {
		if (raw_irqs_disabled_flags(flags))
			__udelay_disabled(usecs);
		else
			__udelay_enabled(usecs);
		goto out;
	}
	if (raw_irqs_disabled_flags(flags)) {
		local_bh_disable();
		__udelay_disabled(usecs);
		_local_bh_enable();
		goto out;
	}
	__udelay_enabled(usecs);
out:
	local_irq_restore(flags);
	preempt_enable();
}