Lines Matching +full:trade +full:- +full:off

1 // SPDX-License-Identifier: GPL-2.0+
55 struct iqs62x_core *iqs62x = iqs621_als->iqs62x; in iqs621_als_init()
59 switch (iqs621_als->ir_flags_mask) { in iqs621_als_init()
61 ret = regmap_write(iqs62x->regmap, IQS622_IR_THRESH_TOUCH, in iqs621_als_init()
62 iqs621_als->thresh_prox); in iqs621_als_init()
66 ret = regmap_write(iqs62x->regmap, IQS622_IR_THRESH_PROX, in iqs621_als_init()
67 iqs621_als->thresh_prox); in iqs621_als_init()
71 ret = regmap_write(iqs62x->regmap, IQS621_ALS_THRESH_LIGHT, in iqs621_als_init()
72 iqs621_als->thresh_light); in iqs621_als_init()
76 ret = regmap_write(iqs62x->regmap, IQS621_ALS_THRESH_DARK, in iqs621_als_init()
77 iqs621_als->thresh_dark); in iqs621_als_init()
83 if (iqs621_als->light_en || iqs621_als->range_en) in iqs621_als_init()
84 event_mask |= iqs62x->dev_desc->als_mask; in iqs621_als_init()
86 if (iqs621_als->prox_en) in iqs621_als_init()
87 event_mask |= iqs62x->dev_desc->ir_mask; in iqs621_als_init()
89 return regmap_clear_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, in iqs621_als_init()
107 indio_dev = iqs621_als->indio_dev; in iqs621_als_notifier()
110 mutex_lock(&iqs621_als->lock); in iqs621_als_notifier()
115 dev_err(indio_dev->dev.parent, in iqs621_als_notifier()
116 "Failed to re-initialize device: %d\n", ret); in iqs621_als_notifier()
125 if (!iqs621_als->light_en && !iqs621_als->range_en && in iqs621_als_notifier()
126 !iqs621_als->prox_en) { in iqs621_als_notifier()
132 light_new = event_data->als_flags & IQS621_ALS_FLAGS_LIGHT; in iqs621_als_notifier()
133 light_old = iqs621_als->als_flags & IQS621_ALS_FLAGS_LIGHT; in iqs621_als_notifier()
135 if (iqs621_als->light_en && light_new && !light_old) in iqs621_als_notifier()
141 else if (iqs621_als->light_en && !light_new && light_old) in iqs621_als_notifier()
149 range_new = event_data->als_flags & IQS621_ALS_FLAGS_RANGE; in iqs621_als_notifier()
150 range_old = iqs621_als->als_flags & IQS621_ALS_FLAGS_RANGE; in iqs621_als_notifier()
152 if (iqs621_als->range_en && (range_new > range_old)) in iqs621_als_notifier()
158 else if (iqs621_als->range_en && (range_new < range_old)) in iqs621_als_notifier()
166 prox_new = event_data->ir_flags & iqs621_als->ir_flags_mask; in iqs621_als_notifier()
167 prox_old = iqs621_als->ir_flags & iqs621_als->ir_flags_mask; in iqs621_als_notifier()
169 if (iqs621_als->prox_en && prox_new && !prox_old) in iqs621_als_notifier()
175 else if (iqs621_als->prox_en && !prox_new && prox_old) in iqs621_als_notifier()
182 iqs621_als->als_flags = event_data->als_flags; in iqs621_als_notifier()
183 iqs621_als->ir_flags = event_data->ir_flags; in iqs621_als_notifier()
187 mutex_unlock(&iqs621_als->lock); in iqs621_als_notifier()
195 struct iio_dev *indio_dev = iqs621_als->indio_dev; in iqs621_als_notifier_unregister()
198 ret = blocking_notifier_chain_unregister(&iqs621_als->iqs62x->nh, in iqs621_als_notifier_unregister()
199 &iqs621_als->notifier); in iqs621_als_notifier_unregister()
201 dev_err(indio_dev->dev.parent, in iqs621_als_notifier_unregister()
210 struct iqs62x_core *iqs62x = iqs621_als->iqs62x; in iqs621_als_read_raw()
214 switch (chan->type) { in iqs621_als_read_raw()
216 ret = regmap_read(iqs62x->regmap, chan->address, val); in iqs621_als_read_raw()
225 ret = regmap_raw_read(iqs62x->regmap, chan->address, &val_buf, in iqs621_als_read_raw()
234 return -EINVAL; in iqs621_als_read_raw()
246 mutex_lock(&iqs621_als->lock); in iqs621_als_read_event_config()
248 switch (chan->type) { in iqs621_als_read_event_config()
250 ret = iqs621_als->light_en; in iqs621_als_read_event_config()
254 ret = iqs621_als->range_en; in iqs621_als_read_event_config()
258 ret = iqs621_als->prox_en; in iqs621_als_read_event_config()
262 ret = -EINVAL; in iqs621_als_read_event_config()
265 mutex_unlock(&iqs621_als->lock); in iqs621_als_read_event_config()
277 struct iqs62x_core *iqs62x = iqs621_als->iqs62x; in iqs621_als_write_event_config()
281 mutex_lock(&iqs621_als->lock); in iqs621_als_write_event_config()
283 ret = regmap_read(iqs62x->regmap, iqs62x->dev_desc->als_flags, &val); in iqs621_als_write_event_config()
286 iqs621_als->als_flags = val; in iqs621_als_write_event_config()
288 switch (chan->type) { in iqs621_als_write_event_config()
290 ret = regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, in iqs621_als_write_event_config()
291 iqs62x->dev_desc->als_mask, in iqs621_als_write_event_config()
292 iqs621_als->range_en || state ? 0 : in iqs621_als_write_event_config()
295 iqs621_als->light_en = state; in iqs621_als_write_event_config()
299 ret = regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, in iqs621_als_write_event_config()
300 iqs62x->dev_desc->als_mask, in iqs621_als_write_event_config()
301 iqs621_als->light_en || state ? 0 : in iqs621_als_write_event_config()
304 iqs621_als->range_en = state; in iqs621_als_write_event_config()
308 ret = regmap_read(iqs62x->regmap, IQS622_IR_FLAGS, &val); in iqs621_als_write_event_config()
311 iqs621_als->ir_flags = val; in iqs621_als_write_event_config()
313 ret = regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, in iqs621_als_write_event_config()
314 iqs62x->dev_desc->ir_mask, in iqs621_als_write_event_config()
317 iqs621_als->prox_en = state; in iqs621_als_write_event_config()
321 ret = -EINVAL; in iqs621_als_write_event_config()
325 mutex_unlock(&iqs621_als->lock); in iqs621_als_write_event_config()
340 mutex_lock(&iqs621_als->lock); in iqs621_als_read_event_value()
344 *val = iqs621_als->thresh_light * 16; in iqs621_als_read_event_value()
348 *val = iqs621_als->thresh_dark * 4; in iqs621_als_read_event_value()
352 if (iqs621_als->ir_flags_mask == IQS622_IR_FLAGS_TOUCH) in iqs621_als_read_event_value()
353 *val = iqs621_als->thresh_prox * 4; in iqs621_als_read_event_value()
355 *val = iqs621_als->thresh_prox; in iqs621_als_read_event_value()
359 ret = -EINVAL; in iqs621_als_read_event_value()
362 mutex_unlock(&iqs621_als->lock); in iqs621_als_read_event_value()
375 struct iqs62x_core *iqs62x = iqs621_als->iqs62x; in iqs621_als_write_event_value()
378 int ret = -EINVAL; in iqs621_als_write_event_value()
380 mutex_lock(&iqs621_als->lock); in iqs621_als_write_event_value()
387 thresh_cache = &iqs621_als->thresh_light; in iqs621_als_write_event_value()
395 thresh_cache = &iqs621_als->thresh_dark; in iqs621_als_write_event_value()
407 * select the hardware threshold that gives the best trade-off in iqs621_als_write_event_value()
410 * By default, the close-range (but coarse) touch threshold is in iqs621_als_write_event_value()
432 thresh_cache = &iqs621_als->thresh_prox; in iqs621_als_write_event_value()
442 ret = regmap_write(iqs62x->regmap, thresh_reg, thresh_val); in iqs621_als_write_event_value()
447 iqs621_als->ir_flags_mask = ir_flags_mask; in iqs621_als_write_event_value()
450 mutex_unlock(&iqs621_als->lock); in iqs621_als_write_event_value()
543 struct iqs62x_core *iqs62x = dev_get_drvdata(pdev->dev.parent); in iqs621_als_probe()
549 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*iqs621_als)); in iqs621_als_probe()
551 return -ENOMEM; in iqs621_als_probe()
554 iqs621_als->iqs62x = iqs62x; in iqs621_als_probe()
555 iqs621_als->indio_dev = indio_dev; in iqs621_als_probe()
557 if (iqs62x->dev_desc->prod_num == IQS622_PROD_NUM) { in iqs621_als_probe()
558 ret = regmap_read(iqs62x->regmap, IQS622_IR_THRESH_TOUCH, in iqs621_als_probe()
562 iqs621_als->thresh_prox = val; in iqs621_als_probe()
563 iqs621_als->ir_flags_mask = IQS622_IR_FLAGS_TOUCH; in iqs621_als_probe()
565 indio_dev->channels = iqs622_als_channels; in iqs621_als_probe()
566 indio_dev->num_channels = ARRAY_SIZE(iqs622_als_channels); in iqs621_als_probe()
568 ret = regmap_read(iqs62x->regmap, IQS621_ALS_THRESH_LIGHT, in iqs621_als_probe()
572 iqs621_als->thresh_light = val; in iqs621_als_probe()
574 ret = regmap_read(iqs62x->regmap, IQS621_ALS_THRESH_DARK, in iqs621_als_probe()
578 iqs621_als->thresh_dark = val; in iqs621_als_probe()
580 indio_dev->channels = iqs621_als_channels; in iqs621_als_probe()
581 indio_dev->num_channels = ARRAY_SIZE(iqs621_als_channels); in iqs621_als_probe()
584 indio_dev->modes = INDIO_DIRECT_MODE; in iqs621_als_probe()
585 indio_dev->name = iqs62x->dev_desc->dev_name; in iqs621_als_probe()
586 indio_dev->info = &iqs621_als_info; in iqs621_als_probe()
588 mutex_init(&iqs621_als->lock); in iqs621_als_probe()
590 iqs621_als->notifier.notifier_call = iqs621_als_notifier; in iqs621_als_probe()
591 ret = blocking_notifier_chain_register(&iqs621_als->iqs62x->nh, in iqs621_als_probe()
592 &iqs621_als->notifier); in iqs621_als_probe()
594 dev_err(&pdev->dev, "Failed to register notifier: %d\n", ret); in iqs621_als_probe()
598 ret = devm_add_action_or_reset(&pdev->dev, in iqs621_als_probe()
604 return devm_iio_device_register(&pdev->dev, indio_dev); in iqs621_als_probe()
609 .name = "iqs621-als",
618 MODULE_ALIAS("platform:iqs621-als");