static void lis3lv02d_joystick_open(struct input_polled_dev *pidev) { if (lis3_dev.pm_dev) pm_runtime_get_sync(lis3_dev.pm_dev); if (lis3_dev.pdata && lis3_dev.whoami == WAI_8B && lis3_dev.idev) atomic_set(&lis3_dev.wake_thread, 1); /* * Update coordinates for the case where poll interval is 0 and * the chip in running purely under interrupt control */ lis3lv02d_joystick_poll(pidev); }
static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data) { struct lis3lv02d *lis3 = data; u8 irq_cfg = lis3->irq_cfg & LIS3_IRQ2_MASK; if (irq_cfg == LIS3_IRQ2_CLICK) lis302dl_interrupt_handle_click(lis3); else if (unlikely(irq_cfg == LIS3_IRQ2_DATA_READY)) lis302dl_data_ready(lis3, IRQ_LINE1); else lis3lv02d_joystick_poll(lis3->idev); return IRQ_HANDLED; }
static void lis302dl_interrupt_handle_ff_wu(struct lis3lv02d *lis3) { u8 wu1_src; u8 wu2_src; lis3->read(lis3, FF_WU_SRC_1, &wu1_src); lis3->read(lis3, FF_WU_SRC_2, &wu2_src); wu1_src = wu1_src & FF_WU_SRC_IA ? wu1_src : 0; wu2_src = wu2_src & FF_WU_SRC_IA ? wu2_src : 0; /* joystick poll is internally protected by the lis3->mutex. */ if (wu1_src || wu2_src) lis3lv02d_joystick_poll(lis3_dev.idev); }