Lines Matching refs:ad714x

12 #include <linux/input/ad714x.h>
14 #include "ad714x.h"
126 static void ad714x_use_com_int(struct ad714x_chip *ad714x,
134 ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1);
136 ad714x->write(ad714x, STG_COM_INT_EN_REG, data);
138 ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1);
140 ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data);
143 static void ad714x_use_thr_int(struct ad714x_chip *ad714x,
151 ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1);
153 ad714x->write(ad714x, STG_COM_INT_EN_REG, data);
155 ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1);
157 ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data);
160 static int ad714x_cal_highest_stage(struct ad714x_chip *ad714x,
168 if (ad714x->sensor_val[i] > max_res) {
169 max_res = ad714x->sensor_val[i];
177 static int ad714x_cal_abs_pos(struct ad714x_chip *ad714x,
184 a_param = ad714x->sensor_val[start_stage + 1];
185 b_param = ad714x->sensor_val[start_stage] +
186 ad714x->sensor_val[start_stage + 1];
188 a_param = ad714x->sensor_val[end_stage] *
190 ad714x->sensor_val[end_stage - 1] *
192 b_param = ad714x->sensor_val[end_stage] +
193 ad714x->sensor_val[end_stage - 1];
195 a_param = ad714x->sensor_val[highest_stage] *
197 ad714x->sensor_val[highest_stage - 1] *
199 ad714x->sensor_val[highest_stage + 1] *
201 b_param = ad714x->sensor_val[highest_stage] +
202 ad714x->sensor_val[highest_stage - 1] +
203 ad714x->sensor_val[highest_stage + 1];
213 static void ad714x_button_state_machine(struct ad714x_chip *ad714x, int idx)
215 struct ad714x_button_plat *hw = &ad714x->hw->button[idx];
216 struct ad714x_button_drv *sw = &ad714x->sw->button[idx];
220 if (((ad714x->h_state & hw->h_mask) == hw->h_mask) &&
221 ((ad714x->l_state & hw->l_mask) == hw->l_mask)) {
222 dev_dbg(ad714x->dev, "button %d touched\n", idx);
230 if (((ad714x->h_state & hw->h_mask) != hw->h_mask) ||
231 ((ad714x->l_state & hw->l_mask) != hw->l_mask)) {
232 dev_dbg(ad714x->dev, "button %d released\n", idx);
248 static void ad714x_slider_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
250 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
253 ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage,
254 &ad714x->adc_reg[hw->start_stage],
258 ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
259 &ad714x->amb_reg[i], 1);
261 ad714x->sensor_val[i] =
262 abs(ad714x->adc_reg[i] - ad714x->amb_reg[i]);
266 static void ad714x_slider_cal_highest_stage(struct ad714x_chip *ad714x, int idx)
268 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
269 struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx];
271 sw->highest_stage = ad714x_cal_highest_stage(ad714x, hw->start_stage,
274 dev_dbg(ad714x->dev, "slider %d highest_stage:%d\n", idx,
291 static void ad714x_slider_cal_abs_pos(struct ad714x_chip *ad714x, int idx)
293 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
294 struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx];
296 sw->abs_pos = ad714x_cal_abs_pos(ad714x, hw->start_stage, hw->end_stage,
299 dev_dbg(ad714x->dev, "slider %d absolute position:%d\n", idx,
313 static void ad714x_slider_cal_flt_pos(struct ad714x_chip *ad714x, int idx)
315 struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx];
320 dev_dbg(ad714x->dev, "slider %d filter position:%d\n", idx,
324 static void ad714x_slider_use_com_int(struct ad714x_chip *ad714x, int idx)
326 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
328 ad714x_use_com_int(ad714x, hw->start_stage, hw->end_stage);
331 static void ad714x_slider_use_thr_int(struct ad714x_chip *ad714x, int idx)
333 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
335 ad714x_use_thr_int(ad714x, hw->start_stage, hw->end_stage);
338 static void ad714x_slider_state_machine(struct ad714x_chip *ad714x, int idx)
340 struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx];
341 struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx];
347 h_state = ad714x->h_state & mask;
348 c_state = ad714x->c_state & mask;
357 ad714x_slider_use_com_int(ad714x, idx);
358 dev_dbg(ad714x->dev, "slider %d touched\n", idx);
364 ad714x_slider_cal_sensor_val(ad714x, idx);
365 ad714x_slider_cal_highest_stage(ad714x, idx);
366 ad714x_slider_cal_abs_pos(ad714x, idx);
375 ad714x_slider_cal_sensor_val(ad714x, idx);
376 ad714x_slider_cal_highest_stage(ad714x, idx);
377 ad714x_slider_cal_abs_pos(ad714x, idx);
378 ad714x_slider_cal_flt_pos(ad714x, idx);
385 ad714x_slider_use_thr_int(ad714x, idx);
388 dev_dbg(ad714x->dev, "slider %d released\n",
407 static void ad714x_wheel_cal_highest_stage(struct ad714x_chip *ad714x, int idx)
409 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
410 struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx];
413 sw->highest_stage = ad714x_cal_highest_stage(ad714x, hw->start_stage,
416 dev_dbg(ad714x->dev, "wheel %d highest_stage:%d\n", idx,
420 static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
422 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
425 ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage,
426 &ad714x->adc_reg[hw->start_stage],
430 ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
431 &ad714x->amb_reg[i], 1);
432 if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
433 ad714x->sensor_val[i] =
434 ad714x->adc_reg[i] - ad714x->amb_reg[i];
436 ad714x->sensor_val[i] = 0;
449 static void ad714x_wheel_cal_abs_pos(struct ad714x_chip *ad714x, int idx)
451 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
452 struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx];
461 a_param = ad714x->sensor_val[highest] *
463 ad714x->sensor_val[first_before] *
465 ad714x->sensor_val[first_after] *
467 b_param = ad714x->sensor_val[highest] +
468 ad714x->sensor_val[first_before] +
469 ad714x->sensor_val[first_after];
480 static void ad714x_wheel_cal_flt_pos(struct ad714x_chip *ad714x, int idx)
482 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
483 struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx];
496 static void ad714x_wheel_use_com_int(struct ad714x_chip *ad714x, int idx)
498 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
500 ad714x_use_com_int(ad714x, hw->start_stage, hw->end_stage);
503 static void ad714x_wheel_use_thr_int(struct ad714x_chip *ad714x, int idx)
505 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
507 ad714x_use_thr_int(ad714x, hw->start_stage, hw->end_stage);
510 static void ad714x_wheel_state_machine(struct ad714x_chip *ad714x, int idx)
512 struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx];
513 struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx];
519 h_state = ad714x->h_state & mask;
520 c_state = ad714x->c_state & mask;
529 ad714x_wheel_use_com_int(ad714x, idx);
530 dev_dbg(ad714x->dev, "wheel %d touched\n", idx);
536 ad714x_wheel_cal_sensor_val(ad714x, idx);
537 ad714x_wheel_cal_highest_stage(ad714x, idx);
538 ad714x_wheel_cal_abs_pos(ad714x, idx);
547 ad714x_wheel_cal_sensor_val(ad714x, idx);
548 ad714x_wheel_cal_highest_stage(ad714x, idx);
549 ad714x_wheel_cal_abs_pos(ad714x, idx);
550 ad714x_wheel_cal_flt_pos(ad714x, idx);
558 ad714x_wheel_use_thr_int(ad714x, idx);
562 dev_dbg(ad714x->dev, "wheel %d released\n",
574 static void touchpad_cal_sensor_val(struct ad714x_chip *ad714x, int idx)
576 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
579 ad714x->read(ad714x, CDC_RESULT_S0 + hw->x_start_stage,
580 &ad714x->adc_reg[hw->x_start_stage],
584 ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM,
585 &ad714x->amb_reg[i], 1);
586 if (ad714x->adc_reg[i] > ad714x->amb_reg[i])
587 ad714x->sensor_val[i] =
588 ad714x->adc_reg[i] - ad714x->amb_reg[i];
590 ad714x->sensor_val[i] = 0;
594 static void touchpad_cal_highest_stage(struct ad714x_chip *ad714x, int idx)
596 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
597 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
599 sw->x_highest_stage = ad714x_cal_highest_stage(ad714x,
601 sw->y_highest_stage = ad714x_cal_highest_stage(ad714x,
604 dev_dbg(ad714x->dev,
615 static int touchpad_check_second_peak(struct ad714x_chip *ad714x, int idx)
617 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
618 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
622 if ((ad714x->sensor_val[i] - ad714x->sensor_val[i + 1])
623 > (ad714x->sensor_val[i + 1] / 10))
628 if ((ad714x->sensor_val[i + 1] - ad714x->sensor_val[i])
629 > (ad714x->sensor_val[i] / 10))
634 if ((ad714x->sensor_val[i] - ad714x->sensor_val[i + 1])
635 > (ad714x->sensor_val[i + 1] / 10))
640 if ((ad714x->sensor_val[i + 1] - ad714x->sensor_val[i])
641 > (ad714x->sensor_val[i] / 10))
654 static void touchpad_cal_abs_pos(struct ad714x_chip *ad714x, int idx)
656 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
657 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
659 sw->x_abs_pos = ad714x_cal_abs_pos(ad714x, hw->x_start_stage,
661 sw->y_abs_pos = ad714x_cal_abs_pos(ad714x, hw->y_start_stage,
664 dev_dbg(ad714x->dev, "touchpad %d absolute position:(%d, %d)\n", idx,
668 static void touchpad_cal_flt_pos(struct ad714x_chip *ad714x, int idx)
670 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
677 dev_dbg(ad714x->dev, "touchpad %d filter position:(%d, %d)\n",
699 static int touchpad_check_endpoint(struct ad714x_chip *ad714x, int idx)
701 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
702 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
706 percent_sensor_diff = (ad714x->sensor_val[hw->x_start_stage] -
707 ad714x->sensor_val[hw->x_start_stage + 1]) * 100 /
708 ad714x->sensor_val[hw->x_start_stage + 1];
713 ad714x->sensor_val[hw->x_start_stage + 1];
717 (ad714x->sensor_val[hw->x_start_stage + 1] >
723 percent_sensor_diff = (ad714x->sensor_val[hw->x_end_stage] -
724 ad714x->sensor_val[hw->x_end_stage - 1]) * 100 /
725 ad714x->sensor_val[hw->x_end_stage - 1];
730 ad714x->sensor_val[hw->x_end_stage - 1];
734 (ad714x->sensor_val[hw->x_end_stage - 1] >
740 percent_sensor_diff = (ad714x->sensor_val[hw->y_start_stage] -
741 ad714x->sensor_val[hw->y_start_stage + 1]) * 100 /
742 ad714x->sensor_val[hw->y_start_stage + 1];
747 ad714x->sensor_val[hw->y_start_stage + 1];
751 (ad714x->sensor_val[hw->y_start_stage + 1] >
757 percent_sensor_diff = (ad714x->sensor_val[hw->y_end_stage] -
758 ad714x->sensor_val[hw->y_end_stage - 1]) * 100 /
759 ad714x->sensor_val[hw->y_end_stage - 1];
764 ad714x->sensor_val[hw->y_end_stage - 1];
768 (ad714x->sensor_val[hw->y_end_stage - 1] >
776 static void touchpad_use_com_int(struct ad714x_chip *ad714x, int idx)
778 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
780 ad714x_use_com_int(ad714x, hw->x_start_stage, hw->x_end_stage);
783 static void touchpad_use_thr_int(struct ad714x_chip *ad714x, int idx)
785 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
787 ad714x_use_thr_int(ad714x, hw->x_start_stage, hw->x_end_stage);
788 ad714x_use_thr_int(ad714x, hw->y_start_stage, hw->y_end_stage);
791 static void ad714x_touchpad_state_machine(struct ad714x_chip *ad714x, int idx)
793 struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx];
794 struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx];
803 h_state = ad714x->h_state & mask;
804 c_state = ad714x->c_state & mask;
813 touchpad_use_com_int(ad714x, idx);
814 dev_dbg(ad714x->dev, "touchpad %d touched\n", idx);
820 touchpad_cal_sensor_val(ad714x, idx);
821 touchpad_cal_highest_stage(ad714x, idx);
822 if ((!touchpad_check_second_peak(ad714x, idx)) &&
823 (!touchpad_check_endpoint(ad714x, idx))) {
824 dev_dbg(ad714x->dev,
827 touchpad_cal_abs_pos(ad714x, idx);
838 touchpad_cal_sensor_val(ad714x, idx);
839 touchpad_cal_highest_stage(ad714x, idx);
840 if ((!touchpad_check_second_peak(ad714x, idx))
841 && (!touchpad_check_endpoint(ad714x, idx))) {
842 touchpad_cal_abs_pos(ad714x, idx);
843 touchpad_cal_flt_pos(ad714x, idx);
855 touchpad_use_thr_int(ad714x, idx);
858 dev_dbg(ad714x->dev, "touchpad %d released\n",
870 static int ad714x_hw_detect(struct ad714x_chip *ad714x)
874 ad714x->read(ad714x, AD714X_PARTID_REG, &data, 1);
877 ad714x->product = 0x7142;
878 ad714x->version = data & 0xF;
879 dev_info(ad714x->dev, "found AD7142 captouch, rev:%d\n",
880 ad714x->version);
884 ad714x->product = 0x7143;
885 ad714x->version = data & 0xF;
886 dev_info(ad714x->dev, "found AD7143 captouch, rev:%d\n",
887 ad714x->version);
891 ad714x->product = 0x7147;
892 ad714x->version = data & 0xF;
893 dev_info(ad714x->dev, "found AD7147(A) captouch, rev:%d\n",
894 ad714x->version);
898 ad714x->product = 0x7148;
899 ad714x->version = data & 0xF;
900 dev_info(ad714x->dev, "found AD7148 captouch, rev:%d\n",
901 ad714x->version);
905 dev_err(ad714x->dev,
912 static void ad714x_hw_init(struct ad714x_chip *ad714x)
923 ad714x->write(ad714x, reg_base + j,
924 ad714x->hw->stage_cfg_reg[i][j]);
928 ad714x->write(ad714x, AD714X_SYSCFG_REG + i,
929 ad714x->hw->sys_cfg_reg[i]);
931 ad714x->read(ad714x, AD714X_SYSCFG_REG + i, &data, 1);
933 ad714x->write(ad714x, AD714X_STG_CAL_EN_REG, 0xFFF);
936 ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
941 struct ad714x_chip *ad714x = data;
944 mutex_lock(&ad714x->mutex);
946 ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
948 for (i = 0; i < ad714x->hw->button_num; i++)
949 ad714x_button_state_machine(ad714x, i);
950 for (i = 0; i < ad714x->hw->slider_num; i++)
951 ad714x_slider_state_machine(ad714x, i);
952 for (i = 0; i < ad714x->hw->wheel_num; i++)
953 ad714x_wheel_state_machine(ad714x, i);
954 for (i = 0; i < ad714x->hw->touchpad_num; i++)
955 ad714x_touchpad_state_machine(ad714x, i);
957 mutex_unlock(&ad714x->mutex);
970 struct ad714x_chip *ad714x;
987 dev_err(dev, "platform data for ad714x doesn't exist\n");
992 ad714x = devm_kzalloc(dev, sizeof(*ad714x) + sizeof(*ad714x->sw) +
998 if (!ad714x) {
1002 ad714x->hw = plat_data;
1004 drv_mem = ad714x + 1;
1005 ad714x->sw = drv_mem;
1006 drv_mem += sizeof(*ad714x->sw);
1007 ad714x->sw->slider = sd_drv = drv_mem;
1008 drv_mem += sizeof(*sd_drv) * ad714x->hw->slider_num;
1009 ad714x->sw->wheel = wl_drv = drv_mem;
1010 drv_mem += sizeof(*wl_drv) * ad714x->hw->wheel_num;
1011 ad714x->sw->touchpad = tp_drv = drv_mem;
1012 drv_mem += sizeof(*tp_drv) * ad714x->hw->touchpad_num;
1013 ad714x->sw->button = bt_drv = drv_mem;
1014 drv_mem += sizeof(*bt_drv) * ad714x->hw->button_num;
1016 ad714x->read = read;
1017 ad714x->write = write;
1018 ad714x->irq = irq;
1019 ad714x->dev = dev;
1021 error = ad714x_hw_detect(ad714x);
1027 ad714x_hw_init(ad714x);
1028 mutex_init(&ad714x->mutex);
1031 if (ad714x->hw->slider_num > 0) {
1032 struct ad714x_slider_plat *sd_plat = ad714x->hw->slider;
1034 for (i = 0; i < ad714x->hw->slider_num; i++) {
1047 input->id.product = ad714x->product;
1048 input->id.version = ad714x->version;
1061 if (ad714x->hw->wheel_num > 0) {
1062 struct ad714x_wheel_plat *wl_plat = ad714x->hw->wheel;
1064 for (i = 0; i < ad714x->hw->wheel_num; i++) {
1077 input->id.product = ad714x->product;
1078 input->id.version = ad714x->version;
1091 if (ad714x->hw->touchpad_num > 0) {
1092 struct ad714x_touchpad_plat *tp_plat = ad714x->hw->touchpad;
1094 for (i = 0; i < ad714x->hw->touchpad_num; i++) {
1110 input->id.product = ad714x->product;
1111 input->id.version = ad714x->version;
1124 if (ad714x->hw->button_num > 0) {
1125 struct ad714x_button_plat *bt_plat = ad714x->hw->button;
1134 for (i = 0; i < ad714x->hw->button_num; i++) {
1140 input->id.product = ad714x->product;
1141 input->id.version = ad714x->version;
1153 error = devm_request_threaded_irq(dev, ad714x->irq, NULL,
1155 irqflags, "ad714x_captouch", ad714x);
1157 dev_err(dev, "can't allocate irq %d\n", ad714x->irq);
1161 return ad714x;
1167 struct ad714x_chip *ad714x = dev_get_drvdata(dev);
1170 dev_dbg(ad714x->dev, "%s enter\n", __func__);
1172 mutex_lock(&ad714x->mutex);
1174 data = ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL] | 0x3;
1175 ad714x->write(ad714x, AD714X_PWR_CTRL, data);
1177 mutex_unlock(&ad714x->mutex);
1184 struct ad714x_chip *ad714x = dev_get_drvdata(dev);
1185 dev_dbg(ad714x->dev, "%s enter\n", __func__);
1187 mutex_lock(&ad714x->mutex);
1191 ad714x->write(ad714x, AD714X_PWR_CTRL,
1192 ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL]);
1198 ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3);
1200 mutex_unlock(&ad714x->mutex);