diff --git a/drivers/iio/light/tsl2584.c b/drivers/iio/light/tsl2584.c index 704b6be0fd7dcda5d9d246b68800a8aea7355457..87150c6bd29bc0f88e26c775e23d2d54628e1e03 100644 --- a/drivers/iio/light/tsl2584.c +++ b/drivers/iio/light/tsl2584.c @@ -121,6 +121,7 @@ struct tsl2584_chip { struct workqueue_struct *als_wq; struct mutex io_lock; bool cal_status; + int flush_count; }; static struct sensors_classdev sensors_light_cdev = { @@ -935,6 +936,18 @@ static int tsl258x_als_set_enable(struct sensors_classdev *sensors_cdev, } +static int tsl258x_als_flush(struct sensors_classdev *sensors_cdev) +{ + struct tsl2584_chip *als_data = container_of(sensors_cdev, + struct tsl2584_chip, als_cdev); + + input_event(als_data->ls_input_dev, EV_SYN, SYN_CONFIG, + als_data->flush_count++); + input_sync(als_data->ls_input_dev); + + return 0; +} + static int tsl258x_als_poll_delay_set(struct sensors_classdev *sensors_cdev, unsigned int delay_msec) { @@ -993,9 +1006,17 @@ static void tsl258x_als_work_func(struct work_struct *work) struct tsl2584_chip *ps_data = container_of(work, struct tsl2584_chip, als_work); struct iio_dev *indio_dev = i2c_get_clientdata(ps_data->client); int als_lux_last = 0; + ktime_t timestamp; + + timestamp = ktime_get_boottime(); + mutex_lock(&ps_data->io_lock); als_lux_last = taos_get_lux(indio_dev); input_report_abs(ps_data->ls_input_dev, ABS_MISC, als_lux_last); + input_event(ps_data->ls_input_dev, EV_SYN, SYN_TIME_SEC, + ktime_to_timespec(timestamp).tv_sec); + input_event(ps_data->ls_input_dev, EV_SYN, SYN_TIME_NSEC, + ktime_to_timespec(timestamp).tv_nsec); input_sync(ps_data->ls_input_dev); mutex_unlock(&ps_data->io_lock); } @@ -1068,6 +1089,7 @@ static int taos_probe(struct i2c_client *clientp, chip->als_cdev = sensors_light_cdev; chip->als_cdev.sensors_enable = tsl258x_als_set_enable; chip->als_cdev.sensors_poll_delay = tsl258x_als_poll_delay_set; + chip->als_cdev.sensors_flush = tsl258x_als_flush; chip->als_wq = create_singlethread_workqueue("als_wq"); INIT_WORK(&chip->als_work, tsl258x_als_work_func); hrtimer_init(&chip->als_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); diff --git a/drivers/input/input.c b/drivers/input/input.c index 76e097ffdea2ff0b4557dc8f86becd86247d33c2..2c6f68bf90e802b2b6aa44fb766248773f14008e 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -267,6 +267,8 @@ static int input_get_disposition(struct input_dev *dev, case EV_SYN: switch (code) { case SYN_CONFIG: + case SYN_TIME_SEC: + case SYN_TIME_NSEC: disposition = INPUT_PASS_TO_ALL; break;