Lines Matching refs:data
62 #define VCNL4200_PS_DATA 0x08 /* Proximity data */
63 #define VCNL4200_AL_DATA 0x09 /* Ambient light data */
69 #define VCNL4000_AL_RDY BIT(6) /* ALS data ready? */
70 #define VCNL4000_PS_RDY BIT(5) /* proximity data ready? */
80 #define VCNL4010_INT_ALS_EN BIT(2) /* Enable on ALS data ready */
81 #define VCNL4010_INT_PROX_EN BIT(3) /* Enable on proximity data ready */
85 #define VCNL4010_INT_ALS 2 /* ALS data ready */
86 #define VCNL4010_INT_PROXIMITY 3 /* Proximity data ready */
138 int (*init)(struct vcnl4000_data *data);
139 int (*measure_light)(struct vcnl4000_data *data, int *val);
140 int (*measure_proximity)(struct vcnl4000_data *data, int *val);
141 int (*set_power_state)(struct vcnl4000_data *data, bool on);
154 static int vcnl4000_set_power_state(struct vcnl4000_data *data, bool on)
160 static int vcnl4000_init(struct vcnl4000_data *data)
164 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_PROD_REV);
171 if (data->id != VCNL4000)
172 dev_warn(&data->client->dev,
176 if (data->id != VCNL4010)
177 dev_warn(&data->client->dev,
184 data->rev = ret & 0xf;
185 data->al_scale = 250000;
186 mutex_init(&data->vcnl4000_lock);
188 return data->chip_spec->set_power_state(data, true);
191 static int vcnl4200_set_power_state(struct vcnl4000_data *data, bool on)
196 ret = i2c_smbus_write_word_data(data->client, VCNL4200_AL_CONF, val);
200 ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, val);
205 /* Wait at least one integration cycle before fetching data */
206 data->vcnl4200_al.last_measurement = ktime_get();
207 data->vcnl4200_ps.last_measurement = ktime_get();
213 static int vcnl4200_init(struct vcnl4000_data *data)
217 ret = i2c_smbus_read_word_data(data->client, VCNL4200_DEV_ID);
224 ret = i2c_smbus_read_word_data(data->client, VCNL4040_DEV_ID);
234 dev_dbg(&data->client->dev, "device id 0x%x", id);
236 data->rev = (ret >> 8) & 0xf;
238 data->vcnl4200_al.reg = VCNL4200_AL_DATA;
239 data->vcnl4200_ps.reg = VCNL4200_PS_DATA;
243 data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000);
245 data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000);
246 data->al_scale = 24000;
250 data->vcnl4200_al.sampling_rate = ktime_set(0, 96000 * 1000);
252 data->vcnl4200_ps.sampling_rate = ktime_set(0, 6000 * 1000);
253 data->al_scale = 120000;
256 mutex_init(&data->vcnl4200_al.lock);
257 mutex_init(&data->vcnl4200_ps.lock);
259 ret = data->chip_spec->set_power_state(data, true);
266 static int vcnl4000_read_data(struct vcnl4000_data *data, u8 data_reg, int *val)
270 ret = i2c_smbus_read_word_swapped(data->client, data_reg);
278 static int vcnl4000_write_data(struct vcnl4000_data *data, u8 data_reg, int val)
283 return i2c_smbus_write_word_swapped(data->client, data_reg, val);
287 static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask,
293 mutex_lock(&data->vcnl4000_lock);
295 ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND,
300 /* wait for data to become ready */
302 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_COMMAND);
311 dev_err(&data->client->dev,
312 "vcnl4000_measure() failed, data not ready\n");
317 ret = vcnl4000_read_data(data, data_reg, val);
321 mutex_unlock(&data->vcnl4000_lock);
326 mutex_unlock(&data->vcnl4000_lock);
330 static int vcnl4200_measure(struct vcnl4000_data *data,
348 ret = i2c_smbus_read_word_data(data->client, chan->reg);
357 static int vcnl4000_measure_light(struct vcnl4000_data *data, int *val)
359 return vcnl4000_measure(data,
364 static int vcnl4200_measure_light(struct vcnl4000_data *data, int *val)
366 return vcnl4200_measure(data, &data->vcnl4200_al, val);
369 static int vcnl4000_measure_proximity(struct vcnl4000_data *data, int *val)
371 return vcnl4000_measure(data,
376 static int vcnl4200_measure_proximity(struct vcnl4000_data *data, int *val)
378 return vcnl4200_measure(data, &data->vcnl4200_ps, val);
381 static int vcnl4010_read_proxy_samp_freq(struct vcnl4000_data *data, int *val,
386 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_PROX_RATE);
399 static bool vcnl4010_is_in_periodic_mode(struct vcnl4000_data *data)
403 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_COMMAND);
410 static int vcnl4000_set_pm_runtime_state(struct vcnl4000_data *data, bool on)
412 struct device *dev = &data->client->dev;
432 struct vcnl4000_data *data = iio_priv(indio_dev);
436 ret = vcnl4000_set_pm_runtime_state(data, true);
442 ret = data->chip_spec->measure_light(data, val);
447 ret = data->chip_spec->measure_proximity(data, val);
454 vcnl4000_set_pm_runtime_state(data, false);
461 *val2 = data->al_scale;
473 struct vcnl4000_data *data = iio_priv(indio_dev);
483 if (vcnl4010_is_in_periodic_mode(data)) {
495 ret = vcnl4010_read_proxy_samp_freq(data, val, val2);
523 static int vcnl4010_write_proxy_samp_freq(struct vcnl4000_data *data, int val,
540 return i2c_smbus_write_byte_data(data->client, VCNL4010_PROX_RATE,
549 struct vcnl4000_data *data = iio_priv(indio_dev);
556 if (vcnl4010_is_in_periodic_mode(data)) {
565 ret = vcnl4010_write_proxy_samp_freq(data, val, val2);
589 struct vcnl4000_data *data = iio_priv(indio_dev);
595 ret = vcnl4000_read_data(data, VCNL4010_HIGH_THR_HI,
601 ret = vcnl4000_read_data(data, VCNL4010_LOW_THR_HI,
622 struct vcnl4000_data *data = iio_priv(indio_dev);
628 ret = vcnl4000_write_data(data, VCNL4010_HIGH_THR_HI,
634 ret = vcnl4000_write_data(data, VCNL4010_LOW_THR_HI,
647 static bool vcnl4010_is_thr_enabled(struct vcnl4000_data *data)
651 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_INT_CTRL);
663 struct vcnl4000_data *data = iio_priv(indio_dev);
667 return vcnl4010_is_thr_enabled(data);
675 struct vcnl4000_data *data = iio_priv(indio_dev);
685 /* Enable periodic measurement of proximity data. */
689 * Enable interrupts on threshold, for proximity data by
694 if (!vcnl4010_is_thr_enabled(data))
701 ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND,
706 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, icr);
734 struct vcnl4000_data *data = iio_priv(indio_dev);
736 return sprintf(buf, "%u\n", data->near_level);
865 struct vcnl4000_data *data = iio_priv(indio_dev);
869 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_ISR);
896 i2c_smbus_write_byte_data(data->client, VCNL4010_ISR,
911 struct vcnl4000_data *data = iio_priv(indio_dev);
919 ret = i2c_smbus_read_byte_data(data->client, VCNL4010_ISR);
927 ret = vcnl4000_read_data(data,
938 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_ISR,
956 struct vcnl4000_data *data = iio_priv(indio_dev);
961 if (vcnl4010_is_in_periodic_mode(data))
964 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL,
970 return i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, cmd);
975 struct vcnl4000_data *data = iio_priv(indio_dev);
978 ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, 0);
982 return i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 0);
996 struct vcnl4000_data *data = iio_priv(indio_dev);
997 struct i2c_client *client = data->client;
1015 struct vcnl4000_data *data;
1019 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1023 data = iio_priv(indio_dev);
1025 data->client = client;
1026 data->id = id->driver_data;
1027 data->chip_spec = &vcnl4000_chip_spec_cfg[data->id];
1029 ret = data->chip_spec->init(data);
1034 data->chip_spec->prod, data->rev);
1037 &data->near_level))
1038 data->near_level = 0;
1040 indio_dev->info = data->chip_spec->info;
1041 indio_dev->channels = data->chip_spec->channels;
1042 indio_dev->num_channels = data->chip_spec->num_channels;
1046 if (client->irq && data->chip_spec->irq_support) {
1087 data->chip_spec->set_power_state(data, false);
1094 .data = (void *)VCNL4000,
1098 .data = (void *)VCNL4010,
1102 .data = (void *)VCNL4010,
1106 .data = (void *)VCNL4040,
1110 .data = (void *)VCNL4200,
1119 struct vcnl4000_data *data = iio_priv(indio_dev);
1126 return data->chip_spec->set_power_state(data, false);
1132 struct vcnl4000_data *data = iio_priv(indio_dev);
1134 return data->chip_spec->set_power_state(data, false);
1140 struct vcnl4000_data *data = iio_priv(indio_dev);
1142 return data->chip_spec->set_power_state(data, true);