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);
}