Lines Matching refs:data
281 static int sx9310_update_chan_en(struct sx9310_data *data,
288 if ((data->chan_read | data->chan_event) != channels) {
289 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
295 data->chan_read = chan_read;
296 data->chan_event = chan_event;
300 static int sx9310_get_read_channel(struct sx9310_data *data, int channel)
302 return sx9310_update_chan_en(data, data->chan_read | BIT(channel),
303 data->chan_event);
306 static int sx9310_put_read_channel(struct sx9310_data *data, int channel)
308 return sx9310_update_chan_en(data, data->chan_read & ~BIT(channel),
309 data->chan_event);
312 static int sx9310_get_event_channel(struct sx9310_data *data, int channel)
314 return sx9310_update_chan_en(data, data->chan_read,
315 data->chan_event | BIT(channel));
318 static int sx9310_put_event_channel(struct sx9310_data *data, int channel)
320 return sx9310_update_chan_en(data, data->chan_read,
321 data->chan_event & ~BIT(channel));
324 static int sx9310_enable_irq(struct sx9310_data *data, unsigned int irq)
326 if (!data->client->irq)
328 return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, irq);
331 static int sx9310_disable_irq(struct sx9310_data *data, unsigned int irq)
333 if (!data->client->irq)
335 return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, 0);
338 static int sx9310_read_prox_data(struct sx9310_data *data,
343 ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel);
347 return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
354 static int sx9310_wait_for_sample(struct sx9310_data *data)
359 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val);
370 static int sx9310_read_proximity(struct sx9310_data *data,
376 mutex_lock(&data->mutex);
378 ret = sx9310_get_read_channel(data, chan->channel);
382 ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
386 mutex_unlock(&data->mutex);
388 if (data->client->irq) {
389 ret = wait_for_completion_interruptible(&data->completion);
390 reinit_completion(&data->completion);
392 ret = sx9310_wait_for_sample(data);
395 mutex_lock(&data->mutex);
400 ret = sx9310_read_prox_data(data, chan, &rawval);
407 ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
411 ret = sx9310_put_read_channel(data, chan->channel);
415 mutex_unlock(&data->mutex);
420 sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
422 sx9310_put_read_channel(data, chan->channel);
424 mutex_unlock(&data->mutex);
429 static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
434 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, ®val);
449 struct sx9310_data *data = iio_priv(indio_dev);
461 ret = sx9310_read_proximity(data, chan, val);
465 return sx9310_read_samp_freq(data, val, val2);
471 static int sx9310_set_samp_freq(struct sx9310_data *data, int val, int val2)
483 mutex_lock(&data->mutex);
486 data->regmap, SX9310_REG_PROX_CTRL0,
490 mutex_unlock(&data->mutex);
499 struct sx9310_data *data = iio_priv(indio_dev);
507 return sx9310_set_samp_freq(data, val, val2);
513 struct sx9310_data *data = iio_priv(indio_dev);
515 if (data->trigger_enabled)
516 iio_trigger_poll(data->trig);
530 struct sx9310_data *data = iio_priv(indio_dev);
535 ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
537 dev_err(&data->client->dev, "i2c transfer error in irq\n");
545 prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
557 data->chan_prox_stat = val;
563 struct sx9310_data *data = iio_priv(indio_dev);
567 mutex_lock(&data->mutex);
569 ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
571 dev_err(&data->client->dev, "i2c transfer error in irq\n");
579 complete(&data->completion);
582 mutex_unlock(&data->mutex);
592 struct sx9310_data *data = iio_priv(indio_dev);
594 return !!(data->chan_event & BIT(chan->channel));
602 struct sx9310_data *data = iio_priv(indio_dev);
607 if (!!(data->chan_event & BIT(chan->channel)) == state)
610 mutex_lock(&data->mutex);
612 ret = sx9310_get_event_channel(data, chan->channel);
615 if (!(data->chan_event & ~BIT(chan->channel))) {
616 ret = sx9310_enable_irq(data, eventirq);
618 sx9310_put_event_channel(data, chan->channel);
621 ret = sx9310_put_event_channel(data, chan->channel);
624 if (!data->chan_event) {
625 ret = sx9310_disable_irq(data, eventirq);
627 sx9310_get_event_channel(data, chan->channel);
632 mutex_unlock(&data->mutex);
656 struct sx9310_data *data = iio_priv(indio_dev);
659 mutex_lock(&data->mutex);
662 ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
663 else if (!data->chan_read)
664 ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
668 data->trigger_enabled = state;
671 mutex_unlock(&data->mutex);
684 struct sx9310_data *data = iio_priv(indio_dev);
688 mutex_lock(&data->mutex);
692 ret = sx9310_read_prox_data(data, &indio_dev->channels[bit],
697 data->buffer.channels[i++] = val;
700 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
704 mutex_unlock(&data->mutex);
713 struct sx9310_data *data = iio_priv(indio_dev);
717 mutex_lock(&data->mutex);
722 ret = sx9310_update_chan_en(data, channels, data->chan_event);
723 mutex_unlock(&data->mutex);
729 struct sx9310_data *data = iio_priv(indio_dev);
732 mutex_lock(&data->mutex);
733 ret = sx9310_update_chan_en(data, 0, data->chan_event);
734 mutex_unlock(&data->mutex);
793 struct sx9310_data *data = iio_priv(indio_dev);
798 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0);
803 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
808 ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
813 dev_err(&data->client->dev,
819 regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
825 struct sx9310_data *data = iio_priv(indio_dev);
830 ret = regmap_write(data->regmap, SX9310_REG_RESET, SX9310_SOFT_RESET);
837 ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
844 ret = regmap_write(data->regmap, initval->reg, initval->def);
860 dev_err(dev, "WHOAMI does not match device data: %u\n", whoami);
881 struct sx9310_data *data = _data;
883 regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies);
891 struct sx9310_data *data;
893 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
897 data = iio_priv(indio_dev);
898 data->client = client;
899 data->supplies[0].supply = "vdd";
900 data->supplies[1].supply = "svdd";
901 mutex_init(&data->mutex);
902 init_completion(&data->completion);
904 data->regmap = devm_regmap_init_i2c(client, &sx9310_regmap_config);
905 if (IS_ERR(data->regmap))
906 return PTR_ERR(data->regmap);
908 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
909 data->supplies);
913 ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies);
919 ret = devm_add_action_or_reset(dev, sx9310_regulator_disable, data);
923 ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
929 ret = sx9310_set_indio_dev_name(dev, indio_dev, data->whoami);
953 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
956 if (!data->trig)
959 data->trig->dev.parent = dev;
960 data->trig->ops = &sx9310_trigger_ops;
961 iio_trigger_set_drvdata(data->trig, indio_dev);
963 ret = devm_iio_trigger_register(dev, data->trig);
981 struct sx9310_data *data = iio_priv(indio_dev);
985 disable_irq_nosync(data->client->irq);
987 mutex_lock(&data->mutex);
988 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
989 &data->suspend_ctrl0);
993 ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
994 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
998 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 0);
1001 mutex_unlock(&data->mutex);
1008 struct sx9310_data *data = iio_priv(indio_dev);
1011 mutex_lock(&data->mutex);
1012 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
1016 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
1017 data->suspend_ctrl0);
1020 mutex_unlock(&data->mutex);
1024 enable_irq(data->client->irq);