Lines Matching refs:data
95 #define GP2AP020A00F_TYPE_MASK 0x01 /* Output data type selection */
367 static int gp2ap020a00f_set_operation_mode(struct gp2ap020a00f_data *data,
374 err = regmap_read(data->regmap, GP2AP020A00F_OP_REG,
385 err = regmap_update_bits(data->regmap,
392 err = regmap_update_bits(data->regmap, GP2AP020A00F_ALS_REG,
398 err = regmap_update_bits(data->regmap, GP2AP020A00F_PS_REG,
404 err = regmap_update_bits(data->regmap, GP2AP020A00F_LED_REG,
412 err = regmap_update_bits(data->regmap,
420 data->cur_opmode = op;
425 static bool gp2ap020a00f_als_enabled(struct gp2ap020a00f_data *data)
427 return test_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags) ||
428 test_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags) ||
429 test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags) ||
430 test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
433 static bool gp2ap020a00f_prox_detect_enabled(struct gp2ap020a00f_data *data)
435 return test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags) ||
436 test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
439 static int gp2ap020a00f_write_event_threshold(struct gp2ap020a00f_data *data,
448 else if (test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags) &&
455 thresh_reg_val = data->thresh_val[th_val_id] / 16;
457 thresh_reg_val = data->thresh_val[th_val_id] > 16000 ?
459 data->thresh_val[th_val_id];
463 return regmap_bulk_write(data->regmap,
468 static int gp2ap020a00f_alter_opmode(struct gp2ap020a00f_data *data,
478 if (data->cur_opmode == GP2AP020A00F_OPMODE_SHUTDOWN)
483 if (data->cur_opmode == GP2AP020A00F_OPMODE_ALS_AND_PS)
491 return gp2ap020a00f_set_operation_mode(data, new_mode);
494 static int gp2ap020a00f_exec_cmd(struct gp2ap020a00f_data *data,
501 if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
503 err = gp2ap020a00f_set_operation_mode(data,
507 if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
509 err = gp2ap020a00f_set_operation_mode(data,
513 if (data->cur_opmode != GP2AP020A00F_OPMODE_SHUTDOWN)
515 err = gp2ap020a00f_set_operation_mode(data,
519 if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
521 if (!gp2ap020a00f_als_enabled(data))
522 err = gp2ap020a00f_alter_opmode(data,
525 set_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags);
528 clear_bit(GP2AP020A00F_FLAG_ALS_CLEAR_TRIGGER, &data->flags);
529 if (gp2ap020a00f_als_enabled(data))
531 err = gp2ap020a00f_alter_opmode(data,
536 if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
538 if (!gp2ap020a00f_als_enabled(data))
539 err = gp2ap020a00f_alter_opmode(data,
542 set_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags);
545 clear_bit(GP2AP020A00F_FLAG_ALS_IR_TRIGGER, &data->flags);
546 if (gp2ap020a00f_als_enabled(data))
548 err = gp2ap020a00f_alter_opmode(data,
553 if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
555 err = gp2ap020a00f_alter_opmode(data,
558 set_bit(GP2AP020A00F_FLAG_PROX_TRIGGER, &data->flags);
561 clear_bit(GP2AP020A00F_FLAG_PROX_TRIGGER, &data->flags);
562 err = gp2ap020a00f_alter_opmode(data,
567 if (test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags))
569 if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
571 if (!gp2ap020a00f_als_enabled(data)) {
572 err = gp2ap020a00f_alter_opmode(data,
578 set_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags);
579 err = gp2ap020a00f_write_event_threshold(data,
583 if (!test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags))
585 clear_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags);
586 if (!gp2ap020a00f_als_enabled(data)) {
587 err = gp2ap020a00f_alter_opmode(data,
593 err = gp2ap020a00f_write_event_threshold(data,
597 if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags))
599 if (data->cur_opmode == GP2AP020A00F_OPMODE_PROX_DETECT)
601 if (!gp2ap020a00f_als_enabled(data)) {
602 err = gp2ap020a00f_alter_opmode(data,
608 set_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
609 err = gp2ap020a00f_write_event_threshold(data,
613 if (!test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags))
615 clear_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags);
616 if (!gp2ap020a00f_als_enabled(data)) {
617 err = gp2ap020a00f_alter_opmode(data,
623 err = gp2ap020a00f_write_event_threshold(data,
627 if (test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags))
629 if (gp2ap020a00f_als_enabled(data) ||
630 data->cur_opmode == GP2AP020A00F_OPMODE_PS)
632 if (!gp2ap020a00f_prox_detect_enabled(data)) {
633 err = gp2ap020a00f_set_operation_mode(data,
638 set_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags);
639 err = gp2ap020a00f_write_event_threshold(data,
643 if (!test_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags))
645 clear_bit(GP2AP020A00F_FLAG_PROX_RISING_EV, &data->flags);
646 err = gp2ap020a00f_set_operation_mode(data,
650 err = gp2ap020a00f_write_event_threshold(data,
654 if (test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags))
656 if (gp2ap020a00f_als_enabled(data) ||
657 data->cur_opmode == GP2AP020A00F_OPMODE_PS)
659 if (!gp2ap020a00f_prox_detect_enabled(data)) {
660 err = gp2ap020a00f_set_operation_mode(data,
665 set_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
666 err = gp2ap020a00f_write_event_threshold(data,
670 if (!test_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags))
672 clear_bit(GP2AP020A00F_FLAG_PROX_FALLING_EV, &data->flags);
673 err = gp2ap020a00f_set_operation_mode(data,
677 err = gp2ap020a00f_write_event_threshold(data,
685 static int wait_conversion_complete_irq(struct gp2ap020a00f_data *data)
689 ret = wait_event_timeout(data->data_ready_queue,
691 &data->flags),
693 clear_bit(GP2AP020A00F_FLAG_DATA_READY, &data->flags);
698 static int gp2ap020a00f_read_output(struct gp2ap020a00f_data *data,
704 err = wait_conversion_complete_irq(data);
706 dev_dbg(&data->client->dev, "data ready timeout\n");
708 err = regmap_bulk_read(data->regmap, output_reg, reg_buf, 2);
717 static bool gp2ap020a00f_adjust_lux_mode(struct gp2ap020a00f_data *data,
723 if (!test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags)) {
725 set_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags);
730 clear_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags);
739 err = gp2ap020a00f_write_event_threshold(data,
742 dev_err(&data->client->dev,
747 err = gp2ap020a00f_write_event_threshold(data,
750 dev_err(&data->client->dev,
756 err = regmap_update_bits(data->regmap,
762 dev_err(&data->client->dev,
767 err = regmap_update_bits(data->regmap,
773 dev_err(&data->client->dev,
778 err = regmap_update_bits(data->regmap,
784 dev_err(&data->client->dev,
790 if (test_bit(GP2AP020A00F_FLAG_ALS_RISING_EV, &data->flags)) {
791 err = gp2ap020a00f_write_event_threshold(data,
794 dev_err(&data->client->dev,
800 if (test_bit(GP2AP020A00F_FLAG_ALS_FALLING_EV, &data->flags)) {
801 err = gp2ap020a00f_write_event_threshold(data,
804 dev_err(&data->client->dev,
816 static void gp2ap020a00f_output_to_lux(struct gp2ap020a00f_data *data,
819 if (test_bit(GP2AP020A00F_FLAG_LUX_MODE_HI, &data->flags))
825 struct gp2ap020a00f_data *data =
828 iio_trigger_poll(data->trig);
831 static irqreturn_t gp2ap020a00f_prox_sensing_handler(int irq, void *data)
833 struct iio_dev *indio_dev = data;
866 static irqreturn_t gp2ap020a00f_thresh_event_handler(int irq, void *data)
868 struct iio_dev *indio_dev = data;
961 static irqreturn_t gp2ap020a00f_trigger_handler(int irq, void *data)
963 struct iio_poll_func *pf = data;
1025 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1031 mutex_lock(&data->lock);
1044 &data->flags);
1048 &data->flags);
1056 &data->flags);
1064 &data->flags);
1068 data->thresh_val[thresh_val_id] = val;
1069 err = gp2ap020a00f_write_event_threshold(data, thresh_val_id,
1072 mutex_unlock(&data->lock);
1084 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1088 mutex_lock(&data->lock);
1097 *val = data->thresh_val[GP2AP020A00F_THRESH_VAL_ID(thresh_reg_l)];
1100 mutex_unlock(&data->lock);
1108 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1123 if (data->thresh_val[GP2AP020A00F_THRESH_PL] == 0)
1126 if (data->thresh_val[GP2AP020A00F_THRESH_PH] == 0)
1130 err = gp2ap020a00f_exec_cmd(data, cmd_high_ev);
1134 err = gp2ap020a00f_exec_cmd(data, cmd_low_ev);
1138 free_irq(data->client->irq, indio_dev);
1141 err = request_threaded_irq(data->client->irq, NULL,
1149 err = request_threaded_irq(data->client->irq, NULL,
1166 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1170 mutex_lock(&data->lock);
1180 err = gp2ap020a00f_exec_cmd(data, cmd);
1184 err = gp2ap020a00f_exec_cmd(data, cmd);
1191 mutex_unlock(&data->lock);
1201 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1204 mutex_lock(&data->lock);
1210 &data->flags);
1213 &data->flags);
1218 &data->flags);
1221 &data->flags);
1228 mutex_unlock(&data->lock);
1233 static int gp2ap020a00f_read_channel(struct gp2ap020a00f_data *data,
1253 err = gp2ap020a00f_exec_cmd(data, cmd);
1255 dev_err(&data->client->dev,
1260 err = gp2ap020a00f_read_output(data, chan->address, val);
1262 dev_err(&data->client->dev,
1265 err = gp2ap020a00f_set_operation_mode(data,
1268 dev_err(&data->client->dev,
1273 gp2ap020a00f_output_to_lux(data, val);
1284 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1292 err = gp2ap020a00f_read_channel(data, chan, val);
1388 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1391 mutex_lock(&data->lock);
1405 err = gp2ap020a00f_exec_cmd(data,
1409 err = gp2ap020a00f_exec_cmd(data,
1413 err = gp2ap020a00f_exec_cmd(data,
1422 data->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
1423 if (!data->buffer)
1427 mutex_unlock(&data->lock);
1434 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1437 mutex_lock(&data->lock);
1443 err = gp2ap020a00f_exec_cmd(data,
1447 err = gp2ap020a00f_exec_cmd(data,
1451 err = gp2ap020a00f_exec_cmd(data,
1458 kfree(data->buffer);
1460 mutex_unlock(&data->lock);
1473 struct gp2ap020a00f_data *data;
1478 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1482 data = iio_priv(indio_dev);
1484 data->vled_reg = devm_regulator_get(&client->dev, "vled");
1485 if (IS_ERR(data->vled_reg))
1486 return PTR_ERR(data->vled_reg);
1488 err = regulator_enable(data->vled_reg);
1511 data->client = client;
1512 data->cur_opmode = GP2AP020A00F_OPMODE_SHUTDOWN;
1513 data->regmap = regmap;
1514 init_waitqueue_head(&data->data_ready_queue);
1516 mutex_init(&data->lock);
1530 data->trig = devm_iio_trigger_alloc(&client->dev, "%s-trigger",
1532 if (data->trig == NULL) {
1550 init_irq_work(&data->work, gp2ap020a00f_iio_trigger_work);
1552 err = iio_trigger_register(data->trig);
1565 iio_trigger_unregister(data->trig);
1571 regulator_disable(data->vled_reg);
1579 struct gp2ap020a00f_data *data = iio_priv(indio_dev);
1582 err = gp2ap020a00f_set_operation_mode(data,
1588 iio_trigger_unregister(data->trig);
1591 regulator_disable(data->vled_reg);