static bool wait_for_reg(void __iomem *reg, u32 mask, unsigned long timeout) { timeout += jiffies; while (time_is_after_eq_jiffies(timeout)) { if ((readl(reg) & mask) == mask) return true; msleep(1); } return false; }
/** * ir_timer_keyup() - generates a keyup event after a timeout * @cookie: a pointer to struct ir_input_dev passed to setup_timer() * * This routine will generate a keyup event some time after a keydown event * is generated when no further activity has been detected. */ static void ir_timer_keyup(unsigned long cookie) { struct ir_input_dev *ir = (struct ir_input_dev *)cookie; unsigned long flags; /* * ir->keyup_jiffies is used to prevent a race condition if a * hardware interrupt occurs at this point and the keyup timer * event is moved further into the future as a result. * * The timer will then be reactivated and this function called * again in the future. We need to exit gracefully in that case * to allow the input subsystem to do its auto-repeat magic or * a keyup event might follow immediately after the keydown. */ spin_lock_irqsave(&ir->keylock, flags); if (time_is_after_eq_jiffies(ir->keyup_jiffies)) ir_keyup(ir); spin_unlock_irqrestore(&ir->keylock, flags); }