Lines Matching +full:diff +full:- +full:channels

1 // SPDX-License-Identifier: GPL-2.0
119 s16 diff; /* Difference of Low Pass Data and Base Line Data */ member
148 __le16 channels[HX9023S_CH_NUM]; member
314 return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG, in hx9023s_interrupt_enable()
320 return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG, in hx9023s_interrupt_disable()
327 return regmap_update_bits(data->regmap, in hx9023s_data_lock()
332 return regmap_update_bits(data->regmap, in hx9023s_data_lock()
348 ch_pos[i] = data->ch_data[i].channel_positive == HX9023S_NOT_CONNECTED ? in hx9023s_ch_cfg()
349 HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_positive]; in hx9023s_ch_cfg()
350 ch_neg[i] = data->ch_data[i].channel_negative == HX9023S_NOT_CONNECTED ? in hx9023s_ch_cfg()
351 HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_negative]; in hx9023s_ch_cfg()
357 return regmap_bulk_write(data->regmap, HX9023S_CH0_CFG_7_0, reg_list, in hx9023s_ch_cfg()
363 guard(mutex)(&data->mutex); in hx9023s_write_far_debounce()
364 return regmap_update_bits(data->regmap, HX9023S_PROX_INT_LOW_CFG, in hx9023s_write_far_debounce()
371 guard(mutex)(&data->mutex); in hx9023s_write_near_debounce()
372 return regmap_update_bits(data->regmap, HX9023S_PROX_INT_HIGH_CFG, in hx9023s_write_near_debounce()
381 ret = regmap_read(data->regmap, HX9023S_PROX_INT_LOW_CFG, val); in hx9023s_read_far_debounce()
394 ret = regmap_read(data->regmap, HX9023S_PROX_INT_HIGH_CFG, val); in hx9023s_read_near_debounce()
412 ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf)); in hx9023s_get_thres_near()
417 data->ch_data[ch].thres.near = tmp; in hx9023s_get_thres_near()
432 ret = regmap_bulk_read(data->regmap, reg, &buf, sizeof(buf)); in hx9023s_get_thres_far()
437 data->ch_data[ch].thres.far = tmp; in hx9023s_get_thres_far()
448 data->ch_data[ch].thres.near = ((val / 32) & GENMASK(9, 0)) * 32; in hx9023s_set_thres_near()
452 return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16)); in hx9023s_set_thres_near()
460 data->ch_data[ch].thres.far = ((val / 32) & GENMASK(9, 0)) * 32; in hx9023s_set_thres_far()
464 return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16)); in hx9023s_set_thres_far()
469 return regmap_read(data->regmap, HX9023S_PROX_STATUS, &data->prox_state_reg); in hx9023s_get_prox_state()
478 ret = regmap_read(data->regmap, HX9023S_RAW_BL_RD_CFG, &buf); in hx9023s_data_select()
484 data->ch_data[i].sel_diff = test_bit(i, &tmp); in hx9023s_data_select()
485 data->ch_data[i].sel_lp = !data->ch_data[i].sel_diff; in hx9023s_data_select()
486 data->ch_data[i].sel_bl = test_bit(i + 4, &tmp); in hx9023s_data_select()
487 data->ch_data[i].sel_raw = !data->ch_data[i].sel_bl; in hx9023s_data_select()
490 ret = regmap_read(data->regmap, HX9023S_INTERRUPT_CFG1, &buf); in hx9023s_data_select()
495 data->ch_data[4].sel_diff = test_bit(2, &tmp); in hx9023s_data_select()
496 data->ch_data[4].sel_lp = !data->ch_data[4].sel_diff; in hx9023s_data_select()
497 data->ch_data[4].sel_bl = test_bit(3, &tmp); in hx9023s_data_select()
498 data->ch_data[4].sel_raw = !data->ch_data[4].sel_bl; in hx9023s_data_select()
518 /* 3 bytes for each of channels 0 to 3 which have contiguous registers */ in hx9023s_sample()
519 ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH0_0, buf, 12); in hx9023s_sample()
524 ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH4_0, buf + 12, 3); in hx9023s_sample()
530 data->ch_data[i].raw = 0; in hx9023s_sample()
531 data->ch_data[i].bl = 0; in hx9023s_sample()
532 if (data->ch_data[i].sel_raw) in hx9023s_sample()
533 data->ch_data[i].raw = value; in hx9023s_sample()
534 if (data->ch_data[i].sel_bl) in hx9023s_sample()
535 data->ch_data[i].bl = value; in hx9023s_sample()
538 /* 3 bytes for each of channels 0 to 3 which have contiguous registers */ in hx9023s_sample()
539 ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH0_0, buf, 12); in hx9023s_sample()
544 ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH4_0, buf + 12, 3); in hx9023s_sample()
550 data->ch_data[i].lp = 0; in hx9023s_sample()
551 data->ch_data[i].diff = 0; in hx9023s_sample()
552 if (data->ch_data[i].sel_lp) in hx9023s_sample()
553 data->ch_data[i].lp = value; in hx9023s_sample()
554 if (data->ch_data[i].sel_diff) in hx9023s_sample()
555 data->ch_data[i].diff = value; in hx9023s_sample()
559 if (data->ch_data[i].sel_lp && data->ch_data[i].sel_bl) in hx9023s_sample()
560 data->ch_data[i].diff = data->ch_data[i].lp - data->ch_data[i].bl; in hx9023s_sample()
563 /* 2 bytes for each of channels 0 to 4 which have contiguous registers */ in hx9023s_sample()
564 ret = regmap_bulk_read(data->regmap, HX9023S_OFFSET_DAC0_7_0, buf, 10); in hx9023s_sample()
571 data->ch_data[i].dac = value; in hx9023s_sample()
583 ret = regmap_read(data->regmap, HX9023S_CH_NUM_CFG, &buf); in hx9023s_ch_en()
587 data->ch_en_stat = buf; in hx9023s_ch_en()
588 if (en && data->ch_en_stat == 0) in hx9023s_ch_en()
589 data->prox_state_reg = 0; in hx9023s_ch_en()
591 data->ch_data[ch_id].enable = en; in hx9023s_ch_en()
592 __assign_bit(ch_id, &data->ch_en_stat, en); in hx9023s_ch_en()
594 return regmap_write(data->regmap, HX9023S_CH_NUM_CFG, data->ch_en_stat); in hx9023s_ch_en()
599 struct device *dev = regmap_get_device(data->regmap); in hx9023s_property_get()
604 data->chan_in_use = 0; in hx9023s_property_get()
606 data->ch_data[i].channel_positive = HX9023S_NOT_CONNECTED; in hx9023s_property_get()
607 data->ch_data[i].channel_negative = HX9023S_NOT_CONNECTED; in hx9023s_property_get()
613 return dev_err_probe(dev, ret < 0 ? ret : -EINVAL, in hx9023s_property_get()
615 __set_bit(reg, &data->chan_in_use); in hx9023s_property_get()
617 ret = fwnode_property_read_u32(child, "single-channel", &temp); in hx9023s_property_get()
619 data->ch_data[reg].channel_positive = temp; in hx9023s_property_get()
620 data->ch_data[reg].channel_negative = HX9023S_NOT_CONNECTED; in hx9023s_property_get()
622 ret = fwnode_property_read_u32_array(child, "diff-channels", in hx9023s_property_get()
625 data->ch_data[reg].channel_positive = array[0]; in hx9023s_property_get()
626 data->ch_data[reg].channel_negative = array[1]; in hx9023s_property_get()
643 unsigned long channels = chan_read | chan_event; in hx9023s_update_chan_en() local
645 if ((data->chan_read | data->chan_event) != channels) { in hx9023s_update_chan_en()
646 for_each_set_bit(i, &channels, HX9023S_CH_NUM) in hx9023s_update_chan_en()
647 hx9023s_ch_en(data, i, test_bit(i, &data->chan_in_use)); in hx9023s_update_chan_en()
648 for_each_clear_bit(i, &channels, HX9023S_CH_NUM) in hx9023s_update_chan_en()
652 data->chan_read = chan_read; in hx9023s_update_chan_en()
653 data->chan_event = chan_event; in hx9023s_update_chan_en()
672 *val = data->ch_data[chan->channel].diff; in hx9023s_get_proximity()
681 ret = regmap_read(data->regmap, HX9023S_PRF_CFG, &index); in hx9023s_get_samp_freq()
699 if (chan->type != IIO_PROXIMITY) in hx9023s_read_raw()
700 return -EINVAL; in hx9023s_read_raw()
714 return -EINVAL; in hx9023s_read_raw()
720 struct device *dev = regmap_get_device(data->regmap); in hx9023s_set_samp_freq()
731 return -EINVAL; in hx9023s_set_samp_freq()
734 return regmap_write(data->regmap, HX9023S_PRF_CFG, i); in hx9023s_set_samp_freq()
743 if (chan->type != IIO_PROXIMITY) in hx9023s_write_raw()
744 return -EINVAL; in hx9023s_write_raw()
747 return -EINVAL; in hx9023s_write_raw()
757 if (data->trigger_enabled) in hx9023s_irq_handler()
758 iio_trigger_poll(data->trig); in hx9023s_irq_handler()
779 prox_changed = (data->chan_prox_stat ^ data->prox_state_reg) & data->chan_event; in hx9023s_push_events()
783 dir = (data->prox_state_reg & BIT(chan)) ? in hx9023s_push_events()
791 data->chan_prox_stat = data->prox_state_reg; in hx9023s_push_events()
799 guard(mutex)(&data->mutex); in hx9023s_irq_thread_handler()
813 if (chan->type != IIO_PROXIMITY) in hx9023s_read_event_val()
814 return -EINVAL; in hx9023s_read_event_val()
820 return hx9023s_get_thres_far(data, chan->channel, val); in hx9023s_read_event_val()
822 return hx9023s_get_thres_near(data, chan->channel, val); in hx9023s_read_event_val()
824 return -EINVAL; in hx9023s_read_event_val()
833 return -EINVAL; in hx9023s_read_event_val()
836 return -EINVAL; in hx9023s_read_event_val()
848 if (chan->type != IIO_PROXIMITY) in hx9023s_write_event_val()
849 return -EINVAL; in hx9023s_write_event_val()
855 return hx9023s_set_thres_far(data, chan->channel, val); in hx9023s_write_event_val()
857 return hx9023s_set_thres_near(data, chan->channel, val); in hx9023s_write_event_val()
859 return -EINVAL; in hx9023s_write_event_val()
868 return -EINVAL; in hx9023s_write_event_val()
871 return -EINVAL; in hx9023s_write_event_val()
882 return test_bit(chan->channel, &data->chan_event); in hx9023s_read_event_config()
893 if (test_bit(chan->channel, &data->chan_in_use)) { in hx9023s_write_event_config()
894 hx9023s_ch_en(data, chan->channel, state); in hx9023s_write_event_config()
895 __assign_bit(chan->channel, &data->chan_event, in hx9023s_write_event_config()
896 data->ch_data[chan->channel].enable); in hx9023s_write_event_config()
916 guard(mutex)(&data->mutex); in hx9023s_set_trigger_state()
919 else if (!data->chan_read) in hx9023s_set_trigger_state()
921 data->trigger_enabled = state; in hx9023s_set_trigger_state()
933 struct iio_dev *indio_dev = pf->indio_dev; in hx9023s_trigger_handler()
935 struct device *dev = regmap_get_device(data->regmap); in hx9023s_trigger_handler()
939 guard(mutex)(&data->mutex); in hx9023s_trigger_handler()
953 index = indio_dev->channels[bit].channel; in hx9023s_trigger_handler()
954 data->buffer.channels[i++] = cpu_to_le16(data->ch_data[index].diff); in hx9023s_trigger_handler()
957 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, in hx9023s_trigger_handler()
958 pf->timestamp); in hx9023s_trigger_handler()
961 iio_trigger_notify_done(indio_dev->trig); in hx9023s_trigger_handler()
969 unsigned long channels = 0; in hx9023s_buffer_preenable() local
972 guard(mutex)(&data->mutex); in hx9023s_buffer_preenable()
974 __set_bit(indio_dev->channels[bit].channel, &channels); in hx9023s_buffer_preenable()
976 hx9023s_update_chan_en(data, channels, data->chan_event); in hx9023s_buffer_preenable()
985 guard(mutex)(&data->mutex); in hx9023s_buffer_postdisable()
986 hx9023s_update_chan_en(data, 0, data->chan_event); in hx9023s_buffer_postdisable()
999 struct device *dev = regmap_get_device(data->regmap); in hx9023s_id_check()
1003 ret = regmap_read(data->regmap, HX9023S_DEVICE_ID, &id); in hx9023s_id_check()
1015 u8 *cfg_start = bin->data + FW_DATA_OFFSET; in hx9023s_bin_load()
1020 for (i = 0; i < bin->reg_count; i++) { in hx9023s_bin_load()
1023 ret = regmap_write(data->regmap, addr, val); in hx9023s_bin_load()
1034 kzalloc(fw->size + sizeof(*bin), GFP_KERNEL); in hx9023s_send_cfg()
1036 return -ENOMEM; in hx9023s_send_cfg()
1038 memcpy(bin->data, fw->data, fw->size); in hx9023s_send_cfg()
1040 bin->fw_size = fw->size; in hx9023s_send_cfg()
1041 bin->fw_ver = bin->data[FW_VER_OFFSET]; in hx9023s_send_cfg()
1042 bin->reg_count = get_unaligned_le16(bin->data + FW_REG_CNT_OFFSET); in hx9023s_send_cfg()
1052 struct device *dev = regmap_get_device(data->regmap); in hx9023s_cfg_update()
1055 if (!fw || !fw->data) { in hx9023s_cfg_update()
1066 ret = regcache_sync(data->regmap); in hx9023s_cfg_update()
1073 ret = regmap_multi_reg_write(data->regmap, hx9023s_reg_init_list, in hx9023s_cfg_update()
1080 ret = regcache_sync(data->regmap); in hx9023s_cfg_update()
1087 struct device *dev = &client->dev; in hx9023s_probe()
1094 return -ENOMEM; in hx9023s_probe()
1097 mutex_init(&data->mutex); in hx9023s_probe()
1099 data->regmap = devm_regmap_init_i2c(client, &hx9023s_regmap_config); in hx9023s_probe()
1100 if (IS_ERR(data->regmap)) in hx9023s_probe()
1101 return dev_err_probe(dev, PTR_ERR(data->regmap), in hx9023s_probe()
1116 indio_dev->name = "hx9023s"; in hx9023s_probe()
1117 indio_dev->channels = hx9023s_channels; in hx9023s_probe()
1118 indio_dev->num_channels = ARRAY_SIZE(hx9023s_channels); in hx9023s_probe()
1119 indio_dev->info = &hx9023s_info; in hx9023s_probe()
1120 indio_dev->modes = INDIO_DIRECT_MODE; in hx9023s_probe()
1132 if (client->irq) { in hx9023s_probe()
1133 ret = devm_request_threaded_irq(dev, client->irq, in hx9023s_probe()
1141 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in hx9023s_probe()
1142 indio_dev->name, in hx9023s_probe()
1144 if (!data->trig) in hx9023s_probe()
1145 return dev_err_probe(dev, -ENOMEM, in hx9023s_probe()
1148 data->trig->ops = &hx9023s_trigger_ops; in hx9023s_probe()
1149 iio_trigger_set_drvdata(data->trig, indio_dev); in hx9023s_probe()
1151 ret = devm_iio_trigger_register(dev, data->trig); in hx9023s_probe()
1172 guard(mutex)(&data->mutex); in hx9023s_suspend()
1182 guard(mutex)(&data->mutex); in hx9023s_resume()
1183 if (data->trigger_enabled) in hx9023s_resume()
1212 * are time-consuming. Prefer async so we don't delay boot