Lines Matching +full:proximity +full:- +full:near +full:- +full:level
1 // SPDX-License-Identifier: GPL-2.0-only
3 * vcnl4000.c - Support for Vishay VCNL4000/4010/4020/4040/4200 combined ambient
4 * light and proximity sensor
11 * VCNL4000/10/20 (7-bit I2C slave address 0x13)
12 * VCNL4040 (7-bit I2C slave address 0x60)
13 * VCNL4200 (7-bit I2C slave address 0x51)
45 #define VCNL4010_PROX_RATE 0x82 /* Proximity rate */
46 #define VCNL4000_LED_CURRENT 0x83 /* IR LED current for proximity mode */
51 #define VCNL4000_PS_RESULT_HI 0x87 /* Proximity result register, MSB */
52 #define VCNL4000_PS_RESULT_LO 0x88 /* Proximity result register, LSB */
53 #define VCNL4000_PS_MEAS_FREQ 0x89 /* Proximity test signal frequency */
55 #define VCNL4000_PS_MOD_ADJ 0x8a /* Proximity modulator timing adjustment */
63 #define VCNL4200_PS_CONF1 0x03 /* Proximity configuration */
64 #define VCNL4200_PS_CONF3 0x04 /* Proximity configuration */
65 #define VCNL4040_PS_THDL_LM 0x06 /* Proximity threshold low */
66 #define VCNL4040_PS_THDH_LM 0x07 /* Proximity threshold high */
69 #define VCNL4200_PS_DATA 0x08 /* Proximity data */
79 #define VCNL4000_PS_RDY BIT(5) /* proximity data ready? */
80 #define VCNL4000_AL_OD BIT(4) /* start on-demand ALS measurement */
81 #define VCNL4000_PS_OD BIT(3) /* start on-demand proximity measurement */
83 #define VCNL4000_PROX_EN BIT(1) /* start proximity measurement */
84 #define VCNL4000_SELF_TIMED_EN BIT(0) /* start self-timed measurement */
91 #define VCNL4040_PS_CONF2_PS_IT GENMASK(3, 1) /* Proximity integration time */
92 #define VCNL4040_CONF1_PS_PERS GENMASK(5, 4) /* Proximity interrupt persistence setting */
93 #define VCNL4040_PS_CONF2_PS_INT GENMASK(9, 8) /* Proximity interrupt mode */
94 #define VCNL4040_PS_CONF3_MPS GENMASK(6, 5) /* Proximity multi pulse number */
95 #define VCNL4040_PS_MS_LED_I GENMASK(10, 8) /* Proximity current */
96 #define VCNL4040_PS_IF_AWAY BIT(8) /* Proximity event cross low threshold */
97 #define VCNL4040_PS_IF_CLOSE BIT(9) /* Proximity event cross high threshold */
105 #define VCNL4010_INT_PROX_EN BIT(3) /* Enable on proximity data ready */
110 #define VCNL4010_INT_PROXIMITY 3 /* Proximity data ready */
198 u8 ps_int; /* proximity interrupt mode */
248 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_PROD_REV); in vcnl4000_init()
255 if (data->id != VCNL4000) in vcnl4000_init()
256 dev_warn(&data->client->dev, in vcnl4000_init()
260 if (data->id != VCNL4010) in vcnl4000_init()
261 dev_warn(&data->client->dev, in vcnl4000_init()
265 return -ENODEV; in vcnl4000_init()
268 data->rev = ret & 0xf; in vcnl4000_init()
269 data->al_scale = 250000; in vcnl4000_init()
271 return data->chip_spec->set_power_state(data, true); in vcnl4000_init()
278 mutex_lock(&data->vcnl4000_lock); in vcnl4000_write_als_enable()
280 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4000_write_als_enable()
289 ret = i2c_smbus_write_word_data(data->client, VCNL4200_AL_CONF, ret); in vcnl4000_write_als_enable()
292 mutex_unlock(&data->vcnl4000_lock); in vcnl4000_write_als_enable()
301 mutex_lock(&data->vcnl4000_lock); in vcnl4000_write_ps_enable()
303 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4000_write_ps_enable()
312 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, ret); in vcnl4000_write_ps_enable()
315 mutex_unlock(&data->vcnl4000_lock); in vcnl4000_write_ps_enable()
325 if (!on && (data->ps_int || data->als_int)) in vcnl4200_set_power_state()
338 data->vcnl4200_al.last_measurement = ktime_get(); in vcnl4200_set_power_state()
339 data->vcnl4200_ps.last_measurement = ktime_get(); in vcnl4200_set_power_state()
349 ret = i2c_smbus_read_word_data(data->client, VCNL4200_DEV_ID); in vcnl4200_init()
356 ret = i2c_smbus_read_word_data(data->client, VCNL4040_DEV_ID); in vcnl4200_init()
363 return -ENODEV; in vcnl4200_init()
366 dev_dbg(&data->client->dev, "device id 0x%x", id); in vcnl4200_init()
368 data->rev = (ret >> 8) & 0xf; in vcnl4200_init()
369 data->ps_int = 0; in vcnl4200_init()
370 data->als_int = 0; in vcnl4200_init()
372 data->vcnl4200_al.reg = VCNL4200_AL_DATA; in vcnl4200_init()
373 data->vcnl4200_ps.reg = VCNL4200_PS_DATA; in vcnl4200_init()
377 data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000); in vcnl4200_init()
379 data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000); in vcnl4200_init()
383 data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000); in vcnl4200_init()
385 data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000); in vcnl4200_init()
388 data->al_scale = data->chip_spec->ulux_step; in vcnl4200_init()
389 mutex_init(&data->vcnl4200_al.lock); in vcnl4200_init()
390 mutex_init(&data->vcnl4200_ps.lock); in vcnl4200_init()
392 ret = data->chip_spec->set_power_state(data, true); in vcnl4200_init()
403 ret = i2c_smbus_read_word_swapped(data->client, data_reg); in vcnl4000_read_data()
414 return -ERANGE; in vcnl4000_write_data()
416 return i2c_smbus_write_word_swapped(data->client, data_reg, val); in vcnl4000_write_data()
426 mutex_lock(&data->vcnl4000_lock); in vcnl4000_measure()
428 ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, in vcnl4000_measure()
434 while (tries--) { in vcnl4000_measure()
435 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_COMMAND); in vcnl4000_measure()
444 dev_err(&data->client->dev, in vcnl4000_measure()
446 ret = -EIO; in vcnl4000_measure()
454 mutex_unlock(&data->vcnl4000_lock); in vcnl4000_measure()
459 mutex_unlock(&data->vcnl4000_lock); in vcnl4000_measure()
470 mutex_lock(&chan->lock); in vcnl4200_measure()
472 next_measurement = ktime_add(chan->last_measurement, in vcnl4200_measure()
473 chan->sampling_rate); in vcnl4200_measure()
477 chan->last_measurement = ktime_get(); in vcnl4200_measure()
479 mutex_unlock(&chan->lock); in vcnl4200_measure()
481 ret = i2c_smbus_read_word_data(data->client, chan->reg); in vcnl4200_measure()
499 return vcnl4200_measure(data, &data->vcnl4200_al, val); in vcnl4200_measure_light()
511 return vcnl4200_measure(data, &data->vcnl4200_ps, val); in vcnl4200_measure_proximity()
519 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_PROX_RATE); in vcnl4010_read_proxy_samp_freq()
524 return -EINVAL; in vcnl4010_read_proxy_samp_freq()
536 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_COMMAND); in vcnl4010_is_in_periodic_mode()
545 struct device *dev = &data->client->dev; in vcnl4000_set_pm_runtime_state()
562 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_read_als_it()
567 if (ret >= data->chip_spec->num_als_it_times) in vcnl4040_read_als_it()
568 return -EINVAL; in vcnl4040_read_als_it()
570 *val = (*data->chip_spec->als_it_times)[ret][0]; in vcnl4040_read_als_it()
571 *val2 = (*data->chip_spec->als_it_times)[ret][1]; in vcnl4040_read_als_it()
582 for (i = 0; i < data->chip_spec->num_als_it_times; i++) { in vcnl4040_write_als_it()
583 if (val == (*data->chip_spec->als_it_times)[i][1]) in vcnl4040_write_als_it()
587 if (i == data->chip_spec->num_als_it_times) in vcnl4040_write_als_it()
588 return -EINVAL; in vcnl4040_write_als_it()
590 data->vcnl4200_al.sampling_rate = ktime_set(0, val * 1200); in vcnl4040_write_als_it()
591 data->al_scale = div_u64(mul_u32_u32(data->chip_spec->ulux_step, in vcnl4040_write_als_it()
592 (*data->chip_spec->als_it_times)[0][1]), in vcnl4040_write_als_it()
595 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_als_it()
597 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_write_als_it()
603 ret = i2c_smbus_write_word_data(data->client, in vcnl4040_write_als_it()
608 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_als_it()
616 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_read_ps_it()
622 if (ret >= data->chip_spec->num_ps_it_times) in vcnl4040_read_ps_it()
623 return -EINVAL; in vcnl4040_read_ps_it()
625 *val = (*data->chip_spec->ps_it_times)[ret][0]; in vcnl4040_read_ps_it()
626 *val2 = (*data->chip_spec->ps_it_times)[ret][1]; in vcnl4040_read_ps_it()
634 int ret, index = -1; in vcnl4040_write_ps_it()
637 for (i = 0; i < data->chip_spec->num_ps_it_times; i++) { in vcnl4040_write_ps_it()
638 if (val == (*data->chip_spec->ps_it_times)[i][1]) { in vcnl4040_write_ps_it()
645 return -EINVAL; in vcnl4040_write_ps_it()
647 data->vcnl4200_ps.sampling_rate = ktime_set(0, val * 60 * NSEC_PER_USEC); in vcnl4040_write_ps_it()
649 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_ps_it()
651 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_write_ps_it()
657 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, in vcnl4040_write_ps_it()
661 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_ps_it()
670 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_read_als_period()
676 return -EINVAL; in vcnl4040_read_als_period()
679 if (it >= data->chip_spec->num_als_it_times) in vcnl4040_read_als_period()
680 return -EINVAL; in vcnl4040_read_als_period()
682 val_c = mul_u32_u32((*data->chip_spec->als_it_times)[it][1], in vcnl4040_read_als_period()
696 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_write_als_period()
701 if (it >= data->chip_spec->num_als_it_times) in vcnl4040_write_als_period()
702 return -EINVAL; in vcnl4040_write_als_period()
704 for (i = 0; i < ARRAY_SIZE(vcnl4040_als_persistence) - 1; i++) { in vcnl4040_write_als_period()
706 (*data->chip_spec->als_it_times)[it][1])) in vcnl4040_write_als_period()
710 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_als_period()
712 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_write_als_period()
718 ret = i2c_smbus_write_word_data(data->client, VCNL4200_AL_CONF, in vcnl4040_write_als_period()
722 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_als_period()
730 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_read_ps_period()
736 return -EINVAL; in vcnl4040_read_ps_period()
739 if (it >= data->chip_spec->num_ps_it_times) in vcnl4040_read_ps_period()
740 return -EINVAL; in vcnl4040_read_ps_period()
742 *val = (*data->chip_spec->ps_it_times)[it][0]; in vcnl4040_read_ps_period()
743 *val2 = (*data->chip_spec->ps_it_times)[it][1] * in vcnl4040_read_ps_period()
754 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_write_ps_period()
759 if (it >= data->chip_spec->num_ps_it_times) in vcnl4040_write_ps_period()
760 return -EINVAL; in vcnl4040_write_ps_period()
763 i = ARRAY_SIZE(vcnl4040_ps_persistence) - 1; in vcnl4040_write_ps_period()
765 for (i = 0; i < ARRAY_SIZE(vcnl4040_ps_persistence) - 1; i++) { in vcnl4040_write_ps_period()
767 (*data->chip_spec->ps_it_times)[it][1]) in vcnl4040_write_ps_period()
772 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_ps_period()
774 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_write_ps_period()
780 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, in vcnl4040_write_ps_period()
784 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_ps_period()
792 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF3); in vcnl4040_read_ps_oversampling_ratio()
798 return -EINVAL; in vcnl4040_read_ps_oversampling_ratio()
817 return -EINVAL; in vcnl4040_write_ps_oversampling_ratio()
819 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_ps_oversampling_ratio()
821 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF3); in vcnl4040_write_ps_oversampling_ratio()
827 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF3, in vcnl4040_write_ps_oversampling_ratio()
831 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_ps_oversampling_ratio()
839 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF3); in vcnl4040_read_ps_calibbias()
845 return -EINVAL; in vcnl4040_read_ps_calibbias()
865 return -EINVAL; in vcnl4040_write_ps_calibbias()
867 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_ps_calibbias()
869 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF3); in vcnl4040_write_ps_calibbias()
875 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF3, in vcnl4040_write_ps_calibbias()
879 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_ps_calibbias()
896 switch (chan->type) { in vcnl4000_read_raw()
898 ret = data->chip_spec->measure_light(data, val); in vcnl4000_read_raw()
903 ret = data->chip_spec->measure_proximity(data, val); in vcnl4000_read_raw()
908 ret = -EINVAL; in vcnl4000_read_raw()
913 if (chan->type != IIO_LIGHT) in vcnl4000_read_raw()
914 return -EINVAL; in vcnl4000_read_raw()
917 *val2 = data->al_scale; in vcnl4000_read_raw()
920 switch (chan->type) { in vcnl4000_read_raw()
928 return -EINVAL; in vcnl4000_read_raw()
934 switch (chan->type) { in vcnl4000_read_raw()
941 return -EINVAL; in vcnl4000_read_raw()
944 switch (chan->type) { in vcnl4000_read_raw()
951 return -EINVAL; in vcnl4000_read_raw()
954 return -EINVAL; in vcnl4000_read_raw()
967 return -EINVAL; in vcnl4040_write_raw()
968 switch (chan->type) { in vcnl4040_write_raw()
974 return -EINVAL; in vcnl4040_write_raw()
977 switch (chan->type) { in vcnl4040_write_raw()
981 return -EINVAL; in vcnl4040_write_raw()
984 switch (chan->type) { in vcnl4040_write_raw()
988 return -EINVAL; in vcnl4040_write_raw()
991 return -EINVAL; in vcnl4040_write_raw()
1004 switch (chan->type) { in vcnl4040_read_avail()
1006 *vals = (int *)(*data->chip_spec->als_it_times); in vcnl4040_read_avail()
1007 *length = 2 * data->chip_spec->num_als_it_times; in vcnl4040_read_avail()
1010 *vals = (int *)(*data->chip_spec->ps_it_times); in vcnl4040_read_avail()
1011 *length = 2 * data->chip_spec->num_ps_it_times; in vcnl4040_read_avail()
1014 return -EINVAL; in vcnl4040_read_avail()
1019 switch (chan->type) { in vcnl4040_read_avail()
1026 return -EINVAL; in vcnl4040_read_avail()
1029 switch (chan->type) { in vcnl4040_read_avail()
1036 return -EINVAL; in vcnl4040_read_avail()
1039 return -EINVAL; in vcnl4040_read_avail()
1059 ret = -EBUSY; in vcnl4010_read_raw()
1068 switch (chan->type) { in vcnl4010_read_raw()
1075 return -EINVAL; in vcnl4010_read_raw()
1078 return -EINVAL; in vcnl4010_read_raw()
1094 return -EINVAL; in vcnl4010_read_avail()
1102 int index = -1; in vcnl4010_write_proxy_samp_freq()
1113 return -EINVAL; in vcnl4010_write_proxy_samp_freq()
1115 return i2c_smbus_write_byte_data(data->client, VCNL4010_PROX_RATE, in vcnl4010_write_proxy_samp_freq()
1132 ret = -EBUSY; in vcnl4010_write_raw()
1138 switch (chan->type) { in vcnl4010_write_raw()
1143 ret = -EINVAL; in vcnl4010_write_raw()
1147 ret = -EINVAL; in vcnl4010_write_raw()
1182 return -EINVAL; in vcnl4010_read_event()
1185 return -EINVAL; in vcnl4010_read_event()
1215 return -EINVAL; in vcnl4010_write_event()
1218 return -EINVAL; in vcnl4010_write_event()
1232 switch (chan->type) { in vcnl4040_read_event()
1240 ret = i2c_smbus_read_word_data(data->client, in vcnl4040_read_event()
1244 ret = i2c_smbus_read_word_data(data->client, in vcnl4040_read_event()
1248 return -EINVAL; in vcnl4040_read_event()
1252 return -EINVAL; in vcnl4040_read_event()
1262 ret = i2c_smbus_read_word_data(data->client, in vcnl4040_read_event()
1266 ret = i2c_smbus_read_word_data(data->client, in vcnl4040_read_event()
1270 return -EINVAL; in vcnl4040_read_event()
1274 return -EINVAL; in vcnl4040_read_event()
1278 return -EINVAL; in vcnl4040_read_event()
1296 switch (chan->type) { in vcnl4040_write_event()
1304 ret = i2c_smbus_write_word_data(data->client, in vcnl4040_write_event()
1309 ret = i2c_smbus_write_word_data(data->client, in vcnl4040_write_event()
1314 return -EINVAL; in vcnl4040_write_event()
1318 return -EINVAL; in vcnl4040_write_event()
1328 ret = i2c_smbus_write_word_data(data->client, in vcnl4040_write_event()
1333 ret = i2c_smbus_write_word_data(data->client, in vcnl4040_write_event()
1338 return -EINVAL; in vcnl4040_write_event()
1342 return -EINVAL; in vcnl4040_write_event()
1346 return -EINVAL; in vcnl4040_write_event()
1357 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_INT_CTRL); in vcnl4010_is_thr_enabled()
1371 switch (chan->type) { in vcnl4010_read_event_config()
1375 return -EINVAL; in vcnl4010_read_event_config()
1391 /* Enable periodic measurement of proximity data. */ in vcnl4010_config_threshold()
1395 * Enable interrupts on threshold, for proximity data by in vcnl4010_config_threshold()
1407 ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, in vcnl4010_config_threshold()
1412 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, icr); in vcnl4010_config_threshold()
1427 switch (chan->type) { in vcnl4010_write_event_config()
1431 return -EINVAL; in vcnl4010_write_event_config()
1443 switch (chan->type) { in vcnl4040_read_event_config()
1445 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_read_event_config()
1449 data->als_int = FIELD_GET(VCNL4040_ALS_CONF_INT_EN, ret); in vcnl4040_read_event_config()
1451 return data->als_int; in vcnl4040_read_event_config()
1453 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_read_event_config()
1457 data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, ret); in vcnl4040_read_event_config()
1463 return -EINVAL; in vcnl4040_read_event_config()
1472 int ret = -EINVAL; in vcnl4040_write_event_config()
1476 mutex_lock(&data->vcnl4000_lock); in vcnl4040_write_event_config()
1478 switch (chan->type) { in vcnl4040_write_event_config()
1480 ret = i2c_smbus_read_word_data(data->client, VCNL4200_AL_CONF); in vcnl4040_write_event_config()
1490 data->als_int = FIELD_GET(VCNL4040_ALS_CONF_INT_EN, val); in vcnl4040_write_event_config()
1491 ret = i2c_smbus_write_word_data(data->client, VCNL4200_AL_CONF, in vcnl4040_write_event_config()
1495 ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1); in vcnl4040_write_event_config()
1506 data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, val); in vcnl4040_write_event_config()
1507 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, in vcnl4040_write_event_config()
1515 mutex_unlock(&data->vcnl4000_lock); in vcnl4040_write_event_config()
1526 ret = i2c_smbus_read_word_data(data->client, data->chip_spec->int_reg); in vcnl4040_irq_thread()
1572 return sprintf(buf, "%u\n", data->near_level); in vcnl4000_read_near_level()
1582 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_ISR); in vcnl4010_irq_thread()
1609 i2c_smbus_write_byte_data(data->client, VCNL4010_ISR, in vcnl4010_irq_thread()
1614 iio_trigger_poll_nested(indio_dev->trig); in vcnl4010_irq_thread()
1623 struct iio_dev *indio_dev = pf->indio_dev; in vcnl4010_trigger_handler()
1625 const unsigned long *active_scan_mask = indio_dev->active_scan_mask; in vcnl4010_trigger_handler()
1626 u16 buffer[8] __aligned(8) = {0}; /* 1x16-bit + naturally aligned ts */ in vcnl4010_trigger_handler()
1632 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_ISR); in vcnl4010_trigger_handler()
1651 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_ISR, in vcnl4010_trigger_handler()
1663 iio_trigger_notify_done(indio_dev->trig); in vcnl4010_trigger_handler()
1675 return -EBUSY; in vcnl4010_buffer_postenable()
1677 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, in vcnl4010_buffer_postenable()
1683 return i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, cmd); in vcnl4010_buffer_postenable()
1691 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, 0); in vcnl4010_buffer_predisable()
1695 return i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 0); in vcnl4010_buffer_predisable()
1775 .scan_index = -1,
1912 struct i2c_client *client = data->client; in vcnl4010_probe_trigger()
1915 trigger = devm_iio_trigger_alloc(&client->dev, "%s-dev%d", in vcnl4010_probe_trigger()
1916 indio_dev->name, in vcnl4010_probe_trigger()
1919 return -ENOMEM; in vcnl4010_probe_trigger()
1921 trigger->ops = &vcnl4010_trigger_ops; in vcnl4010_probe_trigger()
1924 return devm_iio_trigger_register(&client->dev, trigger); in vcnl4010_probe_trigger()
1934 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in vcnl4000_probe()
1936 return -ENOMEM; in vcnl4000_probe()
1940 data->client = client; in vcnl4000_probe()
1941 data->id = id->driver_data; in vcnl4000_probe()
1942 data->chip_spec = &vcnl4000_chip_spec_cfg[data->id]; in vcnl4000_probe()
1944 mutex_init(&data->vcnl4000_lock); in vcnl4000_probe()
1946 ret = data->chip_spec->init(data); in vcnl4000_probe()
1950 dev_dbg(&client->dev, "%s Ambient light/proximity sensor, Rev: %02x\n", in vcnl4000_probe()
1951 data->chip_spec->prod, data->rev); in vcnl4000_probe()
1953 if (device_property_read_u32(&client->dev, "proximity-near-level", in vcnl4000_probe()
1954 &data->near_level)) in vcnl4000_probe()
1955 data->near_level = 0; in vcnl4000_probe()
1957 indio_dev->info = data->chip_spec->info; in vcnl4000_probe()
1958 indio_dev->channels = data->chip_spec->channels; in vcnl4000_probe()
1959 indio_dev->num_channels = data->chip_spec->num_channels; in vcnl4000_probe()
1960 indio_dev->name = VCNL4000_DRV_NAME; in vcnl4000_probe()
1961 indio_dev->modes = INDIO_DIRECT_MODE; in vcnl4000_probe()
1963 if (data->chip_spec->trig_buffer_func && in vcnl4000_probe()
1964 data->chip_spec->buffer_setup_ops) { in vcnl4000_probe()
1965 ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, in vcnl4000_probe()
1967 data->chip_spec->trig_buffer_func, in vcnl4000_probe()
1968 data->chip_spec->buffer_setup_ops); in vcnl4000_probe()
1970 dev_err(&client->dev, in vcnl4000_probe()
1976 if (client->irq && data->chip_spec->irq_thread) { in vcnl4000_probe()
1977 ret = devm_request_threaded_irq(&client->dev, client->irq, in vcnl4000_probe()
1978 NULL, data->chip_spec->irq_thread, in vcnl4000_probe()
1984 dev_err(&client->dev, "irq request failed\n"); in vcnl4000_probe()
1993 ret = pm_runtime_set_active(&client->dev); in vcnl4000_probe()
2001 pm_runtime_enable(&client->dev); in vcnl4000_probe()
2002 pm_runtime_set_autosuspend_delay(&client->dev, VCNL4000_SLEEP_DELAY_MS); in vcnl4000_probe()
2003 pm_runtime_use_autosuspend(&client->dev); in vcnl4000_probe()
2007 data->chip_spec->set_power_state(data, false); in vcnl4000_probe()
2042 pm_runtime_dont_use_autosuspend(&client->dev); in vcnl4000_remove()
2043 pm_runtime_disable(&client->dev); in vcnl4000_remove()
2045 pm_runtime_set_suspended(&client->dev); in vcnl4000_remove()
2047 ret = data->chip_spec->set_power_state(data, false); in vcnl4000_remove()
2049 dev_warn(&client->dev, "Failed to power down (%pe)\n", in vcnl4000_remove()
2058 return data->chip_spec->set_power_state(data, false); in vcnl4000_runtime_suspend()
2066 return data->chip_spec->set_power_state(data, true); in vcnl4000_runtime_resume()
2087 MODULE_DESCRIPTION("Vishay VCNL4000 proximity/ambient light sensor driver");