Lines Matching refs:data

364 static int apds9960_set_it_time(struct apds9960_data *data, int val2)  in apds9960_set_it_time()  argument
371 mutex_lock(&data->lock); in apds9960_set_it_time()
372 ret = regmap_write(data->regmap, APDS9960_REG_ATIME, in apds9960_set_it_time()
375 data->als_adc_int_us = val2; in apds9960_set_it_time()
376 mutex_unlock(&data->lock); in apds9960_set_it_time()
384 static int apds9960_set_pxs_gain(struct apds9960_data *data, int val) in apds9960_set_pxs_gain() argument
392 mutex_lock(&data->lock); in apds9960_set_pxs_gain()
393 ret = regmap_update_bits(data->regmap, in apds9960_set_pxs_gain()
398 mutex_unlock(&data->lock); in apds9960_set_pxs_gain()
402 ret = regmap_update_bits(data->regmap, in apds9960_set_pxs_gain()
407 data->pxs_gain = idx; in apds9960_set_pxs_gain()
408 mutex_unlock(&data->lock); in apds9960_set_pxs_gain()
416 static int apds9960_set_als_gain(struct apds9960_data *data, int val) in apds9960_set_als_gain() argument
423 mutex_lock(&data->lock); in apds9960_set_als_gain()
424 ret = regmap_update_bits(data->regmap, in apds9960_set_als_gain()
428 data->als_gain = idx; in apds9960_set_als_gain()
429 mutex_unlock(&data->lock); in apds9960_set_als_gain()
438 static int apds9960_set_power_state(struct apds9960_data *data, bool on) in apds9960_set_power_state() argument
440 struct device *dev = &data->client->dev; in apds9960_set_power_state()
443 mutex_lock(&data->lock); in apds9960_set_power_state()
453 usleep_range(data->als_adc_int_us, in apds9960_set_power_state()
460 mutex_unlock(&data->lock); in apds9960_set_power_state()
465 static int apds9960_set_power_state(struct apds9960_data *data, bool on) in apds9960_set_power_state() argument
475 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_read_raw() local
479 if (data->gesture_mode_running) in apds9960_read_raw()
484 apds9960_set_power_state(data, true); in apds9960_read_raw()
487 ret = regmap_read(data->regmap, chan->address, val); in apds9960_read_raw()
492 ret = regmap_bulk_read(data->regmap, chan->address, in apds9960_read_raw()
501 apds9960_set_power_state(data, false); in apds9960_read_raw()
505 mutex_lock(&data->lock); in apds9960_read_raw()
509 *val2 = data->als_adc_int_us; in apds9960_read_raw()
515 mutex_unlock(&data->lock); in apds9960_read_raw()
518 mutex_lock(&data->lock); in apds9960_read_raw()
521 *val = apds9960_pxs_gain_map[data->pxs_gain]; in apds9960_read_raw()
525 *val = apds9960_als_gain_map[data->als_gain]; in apds9960_read_raw()
531 mutex_unlock(&data->lock); in apds9960_read_raw()
542 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_write_raw() local
551 return apds9960_set_it_time(data, val2); in apds9960_write_raw()
560 return apds9960_set_pxs_gain(data, val); in apds9960_write_raw()
562 return apds9960_set_als_gain(data, val); in apds9960_write_raw()
619 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_read_event() local
629 ret = regmap_read(data->regmap, reg, val); in apds9960_read_event()
633 ret = regmap_bulk_read(data->regmap, reg, &buf, 2); in apds9960_read_event()
655 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_write_event() local
667 ret = regmap_write(data->regmap, reg, val); in apds9960_write_event()
674 ret = regmap_bulk_write(data->regmap, reg, &buf, 2); in apds9960_write_event()
688 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_read_event_config() local
692 return data->pxs_int; in apds9960_read_event_config()
694 return data->als_int; in apds9960_read_event_config()
708 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_write_event_config() local
715 if (data->pxs_int == state) in apds9960_write_event_config()
718 ret = regmap_field_write(data->reg_int_pxs, state); in apds9960_write_event_config()
721 data->pxs_int = state; in apds9960_write_event_config()
722 apds9960_set_power_state(data, state); in apds9960_write_event_config()
725 if (data->als_int == state) in apds9960_write_event_config()
728 ret = regmap_field_write(data->reg_int_als, state); in apds9960_write_event_config()
731 data->als_int = state; in apds9960_write_event_config()
732 apds9960_set_power_state(data, state); in apds9960_write_event_config()
753 static inline int apds9660_fifo_is_empty(struct apds9960_data *data) in apds9660_fifo_is_empty() argument
758 ret = regmap_read(data->regmap, APDS9960_REG_GFLVL, &cnt); in apds9660_fifo_is_empty()
765 static void apds9960_read_gesture_fifo(struct apds9960_data *data) in apds9960_read_gesture_fifo() argument
769 mutex_lock(&data->lock); in apds9960_read_gesture_fifo()
770 data->gesture_mode_running = 1; in apds9960_read_gesture_fifo()
772 while (cnt-- || (cnt = apds9660_fifo_is_empty(data) > 0)) { in apds9960_read_gesture_fifo()
773 ret = regmap_bulk_read(data->regmap, APDS9960_REG_GFIFO_BASE, in apds9960_read_gesture_fifo()
774 &data->buffer, 4); in apds9960_read_gesture_fifo()
779 iio_push_to_buffers(data->indio_dev, data->buffer); in apds9960_read_gesture_fifo()
783 data->gesture_mode_running = 0; in apds9960_read_gesture_fifo()
784 mutex_unlock(&data->lock); in apds9960_read_gesture_fifo()
790 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_interrupt_handler() local
793 ret = regmap_read(data->regmap, APDS9960_REG_STATUS, &status); in apds9960_interrupt_handler()
795 dev_err(&data->client->dev, "irq status reg read failed\n"); in apds9960_interrupt_handler()
799 if ((status & APDS9960_REG_STATUS_ALS_INT) && data->als_int) { in apds9960_interrupt_handler()
805 regmap_write(data->regmap, APDS9960_REG_CICLEAR, 1); in apds9960_interrupt_handler()
808 if ((status & APDS9960_REG_STATUS_PS_INT) && data->pxs_int) { in apds9960_interrupt_handler()
814 regmap_write(data->regmap, APDS9960_REG_PICLEAR, 1); in apds9960_interrupt_handler()
818 apds9960_read_gesture_fifo(data); in apds9960_interrupt_handler()
823 static int apds9960_set_powermode(struct apds9960_data *data, bool state) in apds9960_set_powermode() argument
825 return regmap_update_bits(data->regmap, APDS9960_REG_ENABLE, 1, state); in apds9960_set_powermode()
830 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_buffer_postenable() local
833 ret = regmap_field_write(data->reg_int_ges, 1); in apds9960_buffer_postenable()
837 ret = regmap_field_write(data->reg_enable_ges, 1); in apds9960_buffer_postenable()
841 pm_runtime_get_sync(&data->client->dev); in apds9960_buffer_postenable()
848 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_buffer_predisable() local
851 ret = regmap_field_write(data->reg_enable_ges, 0); in apds9960_buffer_predisable()
855 ret = regmap_field_write(data->reg_int_ges, 0); in apds9960_buffer_predisable()
859 pm_runtime_put_autosuspend(&data->client->dev); in apds9960_buffer_predisable()
869 static int apds9960_regfield_init(struct apds9960_data *data) in apds9960_regfield_init() argument
871 struct device *dev = &data->client->dev; in apds9960_regfield_init()
872 struct regmap *regmap = data->regmap; in apds9960_regfield_init()
874 data->reg_int_als = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
876 if (IS_ERR(data->reg_int_als)) { in apds9960_regfield_init()
878 return PTR_ERR(data->reg_int_als); in apds9960_regfield_init()
881 data->reg_int_ges = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
883 if (IS_ERR(data->reg_int_ges)) { in apds9960_regfield_init()
885 return PTR_ERR(data->reg_int_ges); in apds9960_regfield_init()
888 data->reg_int_pxs = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
890 if (IS_ERR(data->reg_int_pxs)) { in apds9960_regfield_init()
892 return PTR_ERR(data->reg_int_pxs); in apds9960_regfield_init()
895 data->reg_enable_als = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
897 if (IS_ERR(data->reg_enable_als)) { in apds9960_regfield_init()
899 return PTR_ERR(data->reg_enable_als); in apds9960_regfield_init()
902 data->reg_enable_ges = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
904 if (IS_ERR(data->reg_enable_ges)) { in apds9960_regfield_init()
906 return PTR_ERR(data->reg_enable_ges); in apds9960_regfield_init()
909 data->reg_enable_pxs = devm_regmap_field_alloc(dev, regmap, in apds9960_regfield_init()
911 if (IS_ERR(data->reg_enable_pxs)) { in apds9960_regfield_init()
913 return PTR_ERR(data->reg_enable_pxs); in apds9960_regfield_init()
919 static int apds9960_chip_init(struct apds9960_data *data) in apds9960_chip_init() argument
924 ret = apds9960_set_it_time(data, 28000); in apds9960_chip_init()
929 ret = regmap_field_write(data->reg_int_ges, 0); in apds9960_chip_init()
934 ret = regmap_field_write(data->reg_enable_ges, 0); in apds9960_chip_init()
939 ret = regmap_field_write(data->reg_int_pxs, 0); in apds9960_chip_init()
944 ret = regmap_field_write(data->reg_enable_pxs, 1); in apds9960_chip_init()
949 ret = regmap_field_write(data->reg_int_als, 0); in apds9960_chip_init()
954 ret = regmap_field_write(data->reg_enable_als, 1); in apds9960_chip_init()
961 ret = regmap_write(data->regmap, APDS9960_REG_PERS, in apds9960_chip_init()
970 ret = regmap_update_bits(data->regmap, APDS9960_REG_GCONF_1, in apds9960_chip_init()
977 ret = regmap_write(data->regmap, APDS9960_REG_GPENTH, in apds9960_chip_init()
982 ret = regmap_write(data->regmap, APDS9960_REG_GEXTH, in apds9960_chip_init()
987 return apds9960_set_powermode(data, 1); in apds9960_chip_init()
993 struct apds9960_data *data; in apds9960_probe() local
998 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in apds9960_probe()
1016 data = iio_priv(indio_dev); in apds9960_probe()
1019 data->regmap = devm_regmap_init_i2c(client, &apds9960_regmap_config); in apds9960_probe()
1020 if (IS_ERR(data->regmap)) { in apds9960_probe()
1022 return PTR_ERR(data->regmap); in apds9960_probe()
1025 data->client = client; in apds9960_probe()
1026 data->indio_dev = indio_dev; in apds9960_probe()
1027 mutex_init(&data->lock); in apds9960_probe()
1037 apds9960_set_power_state(data, true); in apds9960_probe()
1039 ret = apds9960_regfield_init(data); in apds9960_probe()
1043 ret = apds9960_chip_init(data); in apds9960_probe()
1066 apds9960_set_power_state(data, false); in apds9960_probe()
1071 apds9960_set_power_state(data, false); in apds9960_probe()
1079 struct apds9960_data *data = iio_priv(indio_dev); in apds9960_remove() local
1084 apds9960_set_powermode(data, 0); in apds9960_remove()
1092 struct apds9960_data *data = in apds9960_runtime_suspend() local
1095 return apds9960_set_powermode(data, 0); in apds9960_runtime_suspend()
1100 struct apds9960_data *data = in apds9960_runtime_resume() local
1103 return apds9960_set_powermode(data, 1); in apds9960_runtime_resume()