Lines Matching +full:full +full:- +full:pwr +full:- +full:cycle +full:- +full:in +full:- +full:suspend
1 // SPDX-License-Identifier: GPL-2.0+
8 * inductive keys as well as Hall-effect switches, and one for each of the two
225 .name = "event-prox",
231 .name = "event-prox-alt",
238 .name = "event-touch",
244 .name = "event-touch-alt",
251 .name = "event-deep",
257 .name = "event-deep-alt",
339 * Slider 1 is unavailable if the touch-and-hold option is enabled via in iqs269_slider_type()
340 * OTP. In that case, the channel selection register is repurposed for in iqs269_slider_type()
341 * the touch-and-hold timer ceiling. in iqs269_slider_type()
343 if (slider_num && (iqs269->otp_option & IQS269_OTP_OPTION_HOLD)) in iqs269_slider_type()
346 if (!iqs269->sys_reg.slider_select[slider_num]) in iqs269_slider_type()
350 if (iqs269->sl_code[slider_num][i] != KEY_RESERVED) in iqs269_slider_type()
359 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_mode_set()
363 return -EINVAL; in iqs269_ati_mode_set()
366 return -EINVAL; in iqs269_ati_mode_set()
368 mutex_lock(&iqs269->lock); in iqs269_ati_mode_set()
376 iqs269->ati_current = false; in iqs269_ati_mode_set()
378 mutex_unlock(&iqs269->lock); in iqs269_ati_mode_set()
386 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_mode_get()
390 return -EINVAL; in iqs269_ati_mode_get()
392 mutex_lock(&iqs269->lock); in iqs269_ati_mode_get()
394 mutex_unlock(&iqs269->lock); in iqs269_ati_mode_get()
405 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_base_set()
409 return -EINVAL; in iqs269_ati_base_set()
429 return -EINVAL; in iqs269_ati_base_set()
432 mutex_lock(&iqs269->lock); in iqs269_ati_base_set()
440 iqs269->ati_current = false; in iqs269_ati_base_set()
442 mutex_unlock(&iqs269->lock); in iqs269_ati_base_set()
450 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_base_get()
454 return -EINVAL; in iqs269_ati_base_get()
456 mutex_lock(&iqs269->lock); in iqs269_ati_base_get()
458 mutex_unlock(&iqs269->lock); in iqs269_ati_base_get()
478 return -EINVAL; in iqs269_ati_base_get()
485 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_target_set()
489 return -EINVAL; in iqs269_ati_target_set()
492 return -EINVAL; in iqs269_ati_target_set()
494 mutex_lock(&iqs269->lock); in iqs269_ati_target_set()
502 iqs269->ati_current = false; in iqs269_ati_target_set()
504 mutex_unlock(&iqs269->lock); in iqs269_ati_target_set()
512 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in iqs269_ati_target_get()
516 return -EINVAL; in iqs269_ati_target_get()
518 mutex_lock(&iqs269->lock); in iqs269_ati_target_get()
520 mutex_unlock(&iqs269->lock); in iqs269_ati_target_get()
538 return -EINVAL; in iqs269_parse_mask()
548 return -EINVAL; in iqs269_parse_mask()
559 struct i2c_client *client = iqs269->client; in iqs269_parse_chan()
568 dev_err(&client->dev, "Failed to read channel number: %d\n", in iqs269_parse_chan()
572 dev_err(&client->dev, "Invalid channel number: %u\n", reg); in iqs269_parse_chan()
573 return -EINVAL; in iqs269_parse_chan()
576 iqs269->sys_reg.active |= BIT(reg); in iqs269_parse_chan()
577 if (!fwnode_property_present(ch_node, "azoteq,reseed-disable")) in iqs269_parse_chan()
578 iqs269->sys_reg.reseed |= BIT(reg); in iqs269_parse_chan()
580 if (fwnode_property_present(ch_node, "azoteq,blocking-enable")) in iqs269_parse_chan()
581 iqs269->sys_reg.blocking |= BIT(reg); in iqs269_parse_chan()
583 if (fwnode_property_present(ch_node, "azoteq,slider0-select")) in iqs269_parse_chan()
584 iqs269->sys_reg.slider_select[0] |= BIT(reg); in iqs269_parse_chan()
586 if (fwnode_property_present(ch_node, "azoteq,slider1-select") && in iqs269_parse_chan()
587 !(iqs269->otp_option & IQS269_OTP_OPTION_HOLD)) in iqs269_parse_chan()
588 iqs269->sys_reg.slider_select[1] |= BIT(reg); in iqs269_parse_chan()
590 ch_reg = &iqs269->sys_reg.ch_reg[reg]; in iqs269_parse_chan()
592 error = iqs269_parse_mask(ch_node, "azoteq,rx-enable", in iqs269_parse_chan()
593 &ch_reg->rx_enable); in iqs269_parse_chan()
595 dev_err(&client->dev, "Invalid channel %u RX enable mask: %d\n", in iqs269_parse_chan()
600 error = iqs269_parse_mask(ch_node, "azoteq,tx-enable", in iqs269_parse_chan()
601 &ch_reg->tx_enable); in iqs269_parse_chan()
603 dev_err(&client->dev, "Invalid channel %u TX enable mask: %d\n", in iqs269_parse_chan()
608 engine_a = be16_to_cpu(ch_reg->engine_a); in iqs269_parse_chan()
609 engine_b = be16_to_cpu(ch_reg->engine_b); in iqs269_parse_chan()
612 if (fwnode_property_present(ch_node, "azoteq,meas-cap-decrease")) in iqs269_parse_chan()
616 if (fwnode_property_present(ch_node, "azoteq,rx-float-inactive")) in iqs269_parse_chan()
621 if (!fwnode_property_read_u32(ch_node, "azoteq,local-cap-size", &val)) { in iqs269_parse_chan()
635 dev_err(&client->dev, in iqs269_parse_chan()
638 return -EINVAL; in iqs269_parse_chan()
643 if (fwnode_property_present(ch_node, "azoteq,invert-enable")) in iqs269_parse_chan()
646 if (!fwnode_property_read_u32(ch_node, "azoteq,proj-bias", &val)) { in iqs269_parse_chan()
648 dev_err(&client->dev, in iqs269_parse_chan()
651 return -EINVAL; in iqs269_parse_chan()
658 if (!fwnode_property_read_u32(ch_node, "azoteq,sense-mode", &val)) { in iqs269_parse_chan()
660 dev_err(&client->dev, in iqs269_parse_chan()
663 return -EINVAL; in iqs269_parse_chan()
670 if (!fwnode_property_read_u32(ch_node, "azoteq,sense-freq", &val)) { in iqs269_parse_chan()
672 dev_err(&client->dev, in iqs269_parse_chan()
675 return -EINVAL; in iqs269_parse_chan()
683 if (fwnode_property_present(ch_node, "azoteq,static-enable")) in iqs269_parse_chan()
686 ch_reg->engine_a = cpu_to_be16(engine_a); in iqs269_parse_chan()
687 ch_reg->engine_b = cpu_to_be16(engine_b); in iqs269_parse_chan()
689 if (!fwnode_property_read_u32(ch_node, "azoteq,ati-mode", &val)) { in iqs269_parse_chan()
692 dev_err(&client->dev, in iqs269_parse_chan()
698 if (!fwnode_property_read_u32(ch_node, "azoteq,ati-base", &val)) { in iqs269_parse_chan()
701 dev_err(&client->dev, in iqs269_parse_chan()
707 if (!fwnode_property_read_u32(ch_node, "azoteq,ati-target", &val)) { in iqs269_parse_chan()
710 dev_err(&client->dev, in iqs269_parse_chan()
717 error = iqs269_parse_mask(ch_node, "azoteq,assoc-select", in iqs269_parse_chan()
718 &ch_reg->assoc_select); in iqs269_parse_chan()
720 dev_err(&client->dev, "Invalid channel %u association: %d\n", in iqs269_parse_chan()
725 if (!fwnode_property_read_u32(ch_node, "azoteq,assoc-weight", &val)) { in iqs269_parse_chan()
727 dev_err(&client->dev, in iqs269_parse_chan()
730 return -EINVAL; in iqs269_parse_chan()
733 ch_reg->assoc_weight = val; in iqs269_parse_chan()
744 dev_err(&client->dev, in iqs269_parse_chan()
748 return -EINVAL; in iqs269_parse_chan()
751 ch_reg->thresh[iqs269_events[i].th_offs] = val; in iqs269_parse_chan()
755 u8 *hyst = &ch_reg->hyst; in iqs269_parse_chan()
758 dev_err(&client->dev, in iqs269_parse_chan()
762 return -EINVAL; in iqs269_parse_chan()
778 if (error == -EINVAL) { in iqs269_parse_chan()
781 dev_err(&client->dev, in iqs269_parse_chan()
789 if (iqs269->hall_enable) { in iqs269_parse_chan()
790 iqs269->switches[i].code = val; in iqs269_parse_chan()
791 iqs269->switches[i].enabled = true; in iqs269_parse_chan()
796 if (iqs269->hall_enable) in iqs269_parse_chan()
801 iqs269->keycode[i * IQS269_NUM_CH + reg] = val; in iqs269_parse_chan()
804 iqs269->sys_reg.event_mask &= ~iqs269_events[i].mask; in iqs269_parse_chan()
812 struct iqs269_sys_reg *sys_reg = &iqs269->sys_reg; in iqs269_parse_prop()
813 struct i2c_client *client = iqs269->client; in iqs269_parse_prop()
819 iqs269->hall_enable = device_property_present(&client->dev, in iqs269_parse_prop()
820 "azoteq,hall-enable"); in iqs269_parse_prop()
822 error = regmap_raw_read(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg, in iqs269_parse_prop()
827 if (!device_property_read_u32(&client->dev, "azoteq,filt-str-lp-lta", in iqs269_parse_prop()
830 dev_err(&client->dev, "Invalid filter strength: %u\n", in iqs269_parse_prop()
832 return -EINVAL; in iqs269_parse_prop()
835 sys_reg->filter &= ~IQS269_FILT_STR_LP_LTA_MASK; in iqs269_parse_prop()
836 sys_reg->filter |= (val << IQS269_FILT_STR_LP_LTA_SHIFT); in iqs269_parse_prop()
839 if (!device_property_read_u32(&client->dev, "azoteq,filt-str-lp-cnt", in iqs269_parse_prop()
842 dev_err(&client->dev, "Invalid filter strength: %u\n", in iqs269_parse_prop()
844 return -EINVAL; in iqs269_parse_prop()
847 sys_reg->filter &= ~IQS269_FILT_STR_LP_CNT_MASK; in iqs269_parse_prop()
848 sys_reg->filter |= (val << IQS269_FILT_STR_LP_CNT_SHIFT); in iqs269_parse_prop()
851 if (!device_property_read_u32(&client->dev, "azoteq,filt-str-np-lta", in iqs269_parse_prop()
854 dev_err(&client->dev, "Invalid filter strength: %u\n", in iqs269_parse_prop()
856 return -EINVAL; in iqs269_parse_prop()
859 sys_reg->filter &= ~IQS269_FILT_STR_NP_LTA_MASK; in iqs269_parse_prop()
860 sys_reg->filter |= (val << IQS269_FILT_STR_NP_LTA_SHIFT); in iqs269_parse_prop()
863 if (!device_property_read_u32(&client->dev, "azoteq,filt-str-np-cnt", in iqs269_parse_prop()
866 dev_err(&client->dev, "Invalid filter strength: %u\n", in iqs269_parse_prop()
868 return -EINVAL; in iqs269_parse_prop()
871 sys_reg->filter &= ~IQS269_FILT_STR_NP_CNT_MASK; in iqs269_parse_prop()
872 sys_reg->filter |= val; in iqs269_parse_prop()
875 if (!device_property_read_u32(&client->dev, "azoteq,rate-np-ms", in iqs269_parse_prop()
878 dev_err(&client->dev, "Invalid report rate: %u\n", val); in iqs269_parse_prop()
879 return -EINVAL; in iqs269_parse_prop()
882 sys_reg->rate_np = val; in iqs269_parse_prop()
885 if (!device_property_read_u32(&client->dev, "azoteq,rate-lp-ms", in iqs269_parse_prop()
888 dev_err(&client->dev, "Invalid report rate: %u\n", val); in iqs269_parse_prop()
889 return -EINVAL; in iqs269_parse_prop()
892 sys_reg->rate_lp = val; in iqs269_parse_prop()
895 if (!device_property_read_u32(&client->dev, "azoteq,rate-ulp-ms", in iqs269_parse_prop()
898 dev_err(&client->dev, "Invalid report rate: %u\n", val); in iqs269_parse_prop()
899 return -EINVAL; in iqs269_parse_prop()
902 sys_reg->rate_ulp = val / 16; in iqs269_parse_prop()
905 if (!device_property_read_u32(&client->dev, "azoteq,timeout-pwr-ms", in iqs269_parse_prop()
908 dev_err(&client->dev, "Invalid timeout: %u\n", val); in iqs269_parse_prop()
909 return -EINVAL; in iqs269_parse_prop()
912 sys_reg->timeout_pwr = val / 512; in iqs269_parse_prop()
915 if (!device_property_read_u32(&client->dev, "azoteq,timeout-lta-ms", in iqs269_parse_prop()
918 dev_err(&client->dev, "Invalid timeout: %u\n", val); in iqs269_parse_prop()
919 return -EINVAL; in iqs269_parse_prop()
922 sys_reg->timeout_lta = val / 512; in iqs269_parse_prop()
925 misc_a = be16_to_cpu(sys_reg->misc_a); in iqs269_parse_prop()
926 misc_b = be16_to_cpu(sys_reg->misc_b); in iqs269_parse_prop()
929 if (device_property_present(&client->dev, "azoteq,ati-band-disable")) in iqs269_parse_prop()
933 if (device_property_present(&client->dev, "azoteq,ati-lp-only")) in iqs269_parse_prop()
937 if (device_property_present(&client->dev, "azoteq,ati-band-tighten")) in iqs269_parse_prop()
941 if (device_property_present(&client->dev, "azoteq,filt-disable")) in iqs269_parse_prop()
944 if (!device_property_read_u32(&client->dev, "azoteq,gpio3-select", in iqs269_parse_prop()
947 dev_err(&client->dev, "Invalid GPIO3 selection: %u\n", in iqs269_parse_prop()
949 return -EINVAL; in iqs269_parse_prop()
957 if (device_property_present(&client->dev, "azoteq,dual-direction")) in iqs269_parse_prop()
960 if (!device_property_read_u32(&client->dev, "azoteq,tx-freq", &val)) { in iqs269_parse_prop()
962 dev_err(&client->dev, in iqs269_parse_prop()
964 return -EINVAL; in iqs269_parse_prop()
972 if (device_property_present(&client->dev, "azoteq,global-cap-increase")) in iqs269_parse_prop()
975 if (!device_property_read_u32(&client->dev, "azoteq,reseed-select", in iqs269_parse_prop()
978 dev_err(&client->dev, "Invalid reseed selection: %u\n", in iqs269_parse_prop()
980 return -EINVAL; in iqs269_parse_prop()
988 if (device_property_present(&client->dev, "azoteq,tracking-enable")) in iqs269_parse_prop()
991 if (!device_property_read_u32(&client->dev, "azoteq,filt-str-slider", in iqs269_parse_prop()
994 dev_err(&client->dev, "Invalid filter strength: %u\n", in iqs269_parse_prop()
996 return -EINVAL; in iqs269_parse_prop()
1003 sys_reg->misc_a = cpu_to_be16(misc_a); in iqs269_parse_prop()
1004 sys_reg->misc_b = cpu_to_be16(misc_b); in iqs269_parse_prop()
1006 sys_reg->active = 0; in iqs269_parse_prop()
1007 sys_reg->reseed = 0; in iqs269_parse_prop()
1009 sys_reg->blocking = 0; in iqs269_parse_prop()
1011 sys_reg->slider_select[0] = 0; in iqs269_parse_prop()
1016 * in a state of touch for a configurable length of time. in iqs269_parse_prop()
1018 * In that case, the register used for slider 1 channel selection is in iqs269_parse_prop()
1019 * repurposed for the touch-and-hold timer ceiling. in iqs269_parse_prop()
1021 if (iqs269->otp_option & IQS269_OTP_OPTION_HOLD) { in iqs269_parse_prop()
1022 if (!device_property_read_u32(&client->dev, in iqs269_parse_prop()
1023 "azoteq,touch-hold-ms", &val)) { in iqs269_parse_prop()
1026 dev_err(&client->dev, in iqs269_parse_prop()
1027 "Invalid touch-and-hold ceiling: %u\n", in iqs269_parse_prop()
1029 return -EINVAL; in iqs269_parse_prop()
1032 sys_reg->slider_select[1] = val / 256; in iqs269_parse_prop()
1033 } else if (iqs269->ver_info.fw_num < IQS269_VER_INFO_FW_NUM_3) { in iqs269_parse_prop()
1035 * The default touch-and-hold timer ceiling initially in iqs269_parse_prop()
1037 * the device experienced a soft reset between power- in iqs269_parse_prop()
1042 * device is re-initialized. in iqs269_parse_prop()
1044 sys_reg->slider_select[1] = IQS269_TOUCH_HOLD_DEFAULT; in iqs269_parse_prop()
1047 sys_reg->slider_select[1] = 0; in iqs269_parse_prop()
1050 sys_reg->event_mask = ~((u8)IQS269_EVENT_MASK_SYS); in iqs269_parse_prop()
1052 device_for_each_child_node(&client->dev, ch_node) { in iqs269_parse_prop()
1061 * Volunteer all active channels to participate in ATI when REDO-ATI is in iqs269_parse_prop()
1064 sys_reg->redo_ati = sys_reg->active; in iqs269_parse_prop()
1066 general = be16_to_cpu(sys_reg->general); in iqs269_parse_prop()
1068 if (device_property_present(&client->dev, "azoteq,clk-div")) in iqs269_parse_prop()
1072 * Configure the device to automatically switch between normal and low- in iqs269_parse_prop()
1073 * power modes as a function of sensing activity. Ultra-low-power mode, in iqs269_parse_prop()
1074 * if enabled, is reserved for suspend. in iqs269_parse_prop()
1080 if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode", in iqs269_parse_prop()
1083 dev_err(&client->dev, "Invalid suspend mode: %u\n", in iqs269_parse_prop()
1085 return -EINVAL; in iqs269_parse_prop()
1091 if (!device_property_read_u32(&client->dev, "azoteq,ulp-update", in iqs269_parse_prop()
1094 dev_err(&client->dev, "Invalid update rate: %u\n", val); in iqs269_parse_prop()
1095 return -EINVAL; in iqs269_parse_prop()
1102 if (device_property_present(&client->dev, "linux,keycodes")) { in iqs269_parse_prop()
1104 int count = device_property_count_u32(&client->dev, in iqs269_parse_prop()
1107 dev_err(&client->dev, "Too many keycodes present\n"); in iqs269_parse_prop()
1108 return -EINVAL; in iqs269_parse_prop()
1110 dev_err(&client->dev, "Failed to count keycodes: %d\n", in iqs269_parse_prop()
1115 error = device_property_read_u32_array(&client->dev, in iqs269_parse_prop()
1117 *iqs269->sl_code, count); in iqs269_parse_prop()
1119 dev_err(&client->dev, "Failed to read keycodes: %d\n", in iqs269_parse_prop()
1124 if (device_property_present(&client->dev, in iqs269_parse_prop()
1125 "azoteq,gesture-swipe")) in iqs269_parse_prop()
1132 if (iqs269->ver_info.fw_num < IQS269_VER_INFO_FW_NUM_3) in iqs269_parse_prop()
1135 if (!device_property_read_u32(&client->dev, in iqs269_parse_prop()
1136 "azoteq,timeout-tap-ms", &val)) { in iqs269_parse_prop()
1138 dev_err(&client->dev, "Invalid timeout: %u\n", in iqs269_parse_prop()
1140 return -EINVAL; in iqs269_parse_prop()
1143 sys_reg->timeout_tap = val / (16 / scale); in iqs269_parse_prop()
1146 if (!device_property_read_u32(&client->dev, in iqs269_parse_prop()
1147 "azoteq,timeout-swipe-ms", in iqs269_parse_prop()
1150 dev_err(&client->dev, "Invalid timeout: %u\n", in iqs269_parse_prop()
1152 return -EINVAL; in iqs269_parse_prop()
1155 sys_reg->timeout_swipe = val / (16 / scale); in iqs269_parse_prop()
1158 if (!device_property_read_u32(&client->dev, in iqs269_parse_prop()
1159 "azoteq,thresh-swipe", &val)) { in iqs269_parse_prop()
1161 dev_err(&client->dev, "Invalid threshold: %u\n", in iqs269_parse_prop()
1163 return -EINVAL; in iqs269_parse_prop()
1166 sys_reg->thresh_swipe = val; in iqs269_parse_prop()
1169 sys_reg->event_mask &= ~IQS269_EVENT_MASK_GESTURE; in iqs269_parse_prop()
1173 if (device_property_present(&client->dev, "azoteq,reseed-offset")) in iqs269_parse_prop()
1179 * As per the datasheet, enable streaming during normal-power mode if in iqs269_parse_prop()
1180 * raw coordinates will be read from either slider. In that case, the in iqs269_parse_prop()
1181 * device returns to event mode during low-power mode. in iqs269_parse_prop()
1190 sys_reg->general = cpu_to_be16(general); in iqs269_parse_prop()
1205 mutex_lock(&iqs269->lock); in iqs269_dev_init()
1208 * Early revisions of silicon require the following workaround in order in iqs269_dev_init()
1209 * to restore any OTP-enabled functionality after a soft reset. in iqs269_dev_init()
1211 if (iqs269->otp_option == IQS269_OTP_OPTION_TWS && in iqs269_dev_init()
1212 iqs269->ver_info.fw_num < IQS269_VER_INFO_FW_NUM_3) { in iqs269_dev_init()
1213 error = regmap_multi_reg_write(iqs269->regmap, iqs269_tws_init, in iqs269_dev_init()
1219 error = regmap_update_bits(iqs269->regmap, IQS269_HALL_UI, in iqs269_dev_init()
1221 iqs269->hall_enable ? ~0 : 0); in iqs269_dev_init()
1225 error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS, in iqs269_dev_init()
1226 &iqs269->sys_reg, sizeof(iqs269->sys_reg)); in iqs269_dev_init()
1236 iqs269->ati_current = true; in iqs269_dev_init()
1239 mutex_unlock(&iqs269->lock); in iqs269_dev_init()
1246 struct i2c_client *client = iqs269->client; in iqs269_input_init()
1250 iqs269->keypad = devm_input_allocate_device(&client->dev); in iqs269_input_init()
1251 if (!iqs269->keypad) in iqs269_input_init()
1252 return -ENOMEM; in iqs269_input_init()
1254 iqs269->keypad->keycodemax = ARRAY_SIZE(iqs269->keycode); in iqs269_input_init()
1255 iqs269->keypad->keycode = iqs269->keycode; in iqs269_input_init()
1256 iqs269->keypad->keycodesize = sizeof(*iqs269->keycode); in iqs269_input_init()
1258 iqs269->keypad->name = "iqs269a_keypad"; in iqs269_input_init()
1259 iqs269->keypad->id.bustype = BUS_I2C; in iqs269_input_init()
1262 sw_code = iqs269->switches[i].code; in iqs269_input_init()
1265 keycode = iqs269->keycode[i * IQS269_NUM_CH + j]; in iqs269_input_init()
1268 * Hall-effect sensing repurposes a pair of dedicated in iqs269_input_init()
1273 if (iqs269->hall_enable && in iqs269_input_init()
1274 iqs269->switches[i].enabled) in iqs269_input_init()
1275 input_set_capability(iqs269->keypad, in iqs269_input_init()
1280 if (iqs269->hall_enable) in iqs269_input_init()
1286 input_set_capability(iqs269->keypad, in iqs269_input_init()
1296 iqs269->slider[i] = devm_input_allocate_device(&client->dev); in iqs269_input_init()
1297 if (!iqs269->slider[i]) in iqs269_input_init()
1298 return -ENOMEM; in iqs269_input_init()
1300 iqs269->slider[i]->keycodemax = ARRAY_SIZE(iqs269->sl_code[i]); in iqs269_input_init()
1301 iqs269->slider[i]->keycode = iqs269->sl_code[i]; in iqs269_input_init()
1302 iqs269->slider[i]->keycodesize = sizeof(**iqs269->sl_code); in iqs269_input_init()
1304 iqs269->slider[i]->name = i ? "iqs269a_slider_1" in iqs269_input_init()
1306 iqs269->slider[i]->id.bustype = BUS_I2C; in iqs269_input_init()
1309 if (iqs269->sl_code[i][j] != KEY_RESERVED) in iqs269_input_init()
1310 input_set_capability(iqs269->slider[i], EV_KEY, in iqs269_input_init()
1311 iqs269->sl_code[i][j]); in iqs269_input_init()
1314 * Present the slider as a narrow trackpad if one or more chan- in iqs269_input_init()
1319 input_set_capability(iqs269->slider[i], in iqs269_input_init()
1321 input_set_abs_params(iqs269->slider[i], in iqs269_input_init()
1325 error = input_register_device(iqs269->slider[i]); in iqs269_input_init()
1327 dev_err(&client->dev, in iqs269_input_init()
1338 struct i2c_client *client = iqs269->client; in iqs269_report()
1345 error = regmap_raw_read(iqs269->regmap, IQS269_SYS_FLAGS, &flags, in iqs269_report()
1348 dev_err(&client->dev, "Failed to read device status: %d\n", in iqs269_report()
1355 * in the event of an I2C communication error. In this case, the device in iqs269_report()
1359 dev_err(&client->dev, "Unexpected device reset\n"); in iqs269_report()
1363 dev_err(&client->dev, in iqs269_report()
1364 "Failed to re-initialize device: %d\n", error); in iqs269_report()
1374 error = regmap_raw_read(iqs269->regmap, IQS269_SLIDER_X, in iqs269_report()
1377 dev_err(&client->dev, in iqs269_report()
1392 input_report_key(iqs269->slider[i], in iqs269_report()
1393 iqs269->sl_code[i][j], in iqs269_report()
1401 input_sync(iqs269->slider[i]); in iqs269_report()
1405 * release cycle so as to emulate a full keystroke. in iqs269_report()
1409 input_report_key(iqs269->slider[i], in iqs269_report()
1410 iqs269->sl_code[i][j], in iqs269_report()
1416 * The slider is considered to be in a state of touch in iqs269_report()
1417 * if any selected channels are in a state of touch. in iqs269_report()
1420 state &= iqs269->sys_reg.slider_select[i]; in iqs269_report()
1422 input_report_key(iqs269->slider[i], BTN_TOUCH, state); in iqs269_report()
1425 input_report_abs(iqs269->slider[i], in iqs269_report()
1430 input_sync(iqs269->slider[i]); in iqs269_report()
1440 sw_code = iqs269->switches[i].code; in iqs269_report()
1443 keycode = iqs269->keycode[i * IQS269_NUM_CH + j]; in iqs269_report()
1447 if (iqs269->hall_enable && in iqs269_report()
1448 iqs269->switches[i].enabled) in iqs269_report()
1449 input_report_switch(iqs269->keypad, in iqs269_report()
1455 if (iqs269->hall_enable) in iqs269_report()
1460 input_report_key(iqs269->keypad, keycode, in iqs269_report()
1466 input_sync(iqs269->keypad); in iqs269_report()
1472 complete_all(&iqs269->ati_done); in iqs269_report()
1498 struct i2c_client *client = iqs269->client; in counts_show()
1502 if (!iqs269->ati_current || iqs269->hall_enable) in counts_show()
1503 return -EPERM; in counts_show()
1505 if (!completion_done(&iqs269->ati_done)) in counts_show()
1506 return -EBUSY; in counts_show()
1513 disable_irq(client->irq); in counts_show()
1515 error = regmap_raw_read(iqs269->regmap, in counts_show()
1516 IQS269_CHx_COUNTS + iqs269->ch_num * 2, in counts_show()
1520 enable_irq(client->irq); in counts_show()
1532 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in hall_bin_show()
1533 struct i2c_client *client = iqs269->client; in hall_bin_show()
1537 disable_irq(client->irq); in hall_bin_show()
1539 error = regmap_read(iqs269->regmap, IQS269_CAL_DATA_A, &val); in hall_bin_show()
1542 enable_irq(client->irq); in hall_bin_show()
1560 return -EINVAL; in hall_bin_show()
1571 return sysfs_emit(buf, "%u\n", iqs269->hall_enable); in hall_enable_show()
1586 mutex_lock(&iqs269->lock); in hall_enable_store()
1588 iqs269->hall_enable = val; in hall_enable_store()
1589 iqs269->ati_current = false; in hall_enable_store()
1591 mutex_unlock(&iqs269->lock); in hall_enable_store()
1601 return sysfs_emit(buf, "%u\n", iqs269->ch_num); in ch_number_show()
1617 return -EINVAL; in ch_number_store()
1619 iqs269->ch_num = val; in ch_number_store()
1628 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in rx_enable_show()
1630 return sysfs_emit(buf, "%u\n", ch_reg[iqs269->ch_num].rx_enable); in rx_enable_show()
1638 struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg; in rx_enable_store()
1647 return -EINVAL; in rx_enable_store()
1649 mutex_lock(&iqs269->lock); in rx_enable_store()
1651 ch_reg[iqs269->ch_num].rx_enable = val; in rx_enable_store()
1652 iqs269->ati_current = false; in rx_enable_store()
1654 mutex_unlock(&iqs269->lock); in rx_enable_store()
1666 error = iqs269_ati_mode_get(iqs269, iqs269->ch_num, &val); in ati_mode_show()
1685 error = iqs269_ati_mode_set(iqs269, iqs269->ch_num, val); in ati_mode_store()
1699 error = iqs269_ati_base_get(iqs269, iqs269->ch_num, &val); in ati_base_show()
1718 error = iqs269_ati_base_set(iqs269, iqs269->ch_num, val); in ati_base_store()
1732 error = iqs269_ati_target_get(iqs269, iqs269->ch_num, &val); in ati_target_show()
1751 error = iqs269_ati_target_set(iqs269, iqs269->ch_num, val); in ati_target_store()
1764 iqs269->ati_current && in ati_trigger_show()
1765 completion_done(&iqs269->ati_done)); in ati_trigger_show()
1773 struct i2c_client *client = iqs269->client; in ati_trigger_store()
1784 disable_irq(client->irq); in ati_trigger_store()
1785 reinit_completion(&iqs269->ati_done); in ati_trigger_store()
1790 enable_irq(client->irq); in ati_trigger_store()
1795 if (!wait_for_completion_timeout(&iqs269->ati_done, in ati_trigger_store()
1797 return -ETIMEDOUT; in ati_trigger_store()
1837 iqs269 = devm_kzalloc(&client->dev, sizeof(*iqs269), GFP_KERNEL); in iqs269_probe()
1839 return -ENOMEM; in iqs269_probe()
1842 iqs269->client = client; in iqs269_probe()
1844 iqs269->regmap = devm_regmap_init_i2c(client, &iqs269_regmap_config); in iqs269_probe()
1845 if (IS_ERR(iqs269->regmap)) { in iqs269_probe()
1846 error = PTR_ERR(iqs269->regmap); in iqs269_probe()
1847 dev_err(&client->dev, "Failed to initialize register map: %d\n", in iqs269_probe()
1852 mutex_init(&iqs269->lock); in iqs269_probe()
1853 init_completion(&iqs269->ati_done); in iqs269_probe()
1855 iqs269->otp_option = (uintptr_t)device_get_match_data(&client->dev); in iqs269_probe()
1857 error = regmap_raw_read(iqs269->regmap, IQS269_VER_INFO, in iqs269_probe()
1858 &iqs269->ver_info, sizeof(iqs269->ver_info)); in iqs269_probe()
1862 if (iqs269->ver_info.prod_num != IQS269_VER_INFO_PROD_NUM) { in iqs269_probe()
1863 dev_err(&client->dev, "Unrecognized product number: 0x%02X\n", in iqs269_probe()
1864 iqs269->ver_info.prod_num); in iqs269_probe()
1865 return -EINVAL; in iqs269_probe()
1874 dev_err(&client->dev, "Failed to initialize device: %d\n", in iqs269_probe()
1883 error = devm_request_threaded_irq(&client->dev, client->irq, in iqs269_probe()
1885 client->name, iqs269); in iqs269_probe()
1887 dev_err(&client->dev, "Failed to request IRQ: %d\n", error); in iqs269_probe()
1891 if (!wait_for_completion_timeout(&iqs269->ati_done, in iqs269_probe()
1893 dev_err(&client->dev, "Failed to complete ATI\n"); in iqs269_probe()
1894 return -ETIMEDOUT; in iqs269_probe()
1901 error = input_register_device(iqs269->keypad); in iqs269_probe()
1903 dev_err(&client->dev, "Failed to register keypad: %d\n", error); in iqs269_probe()
1912 u16 general = be16_to_cpu(iqs269->sys_reg.general); in iqs269_general_get()
1923 struct i2c_client *client = iqs269->client; in iqs269_suspend()
1930 disable_irq(client->irq); in iqs269_suspend()
1932 error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, general); in iqs269_suspend()
1935 enable_irq(client->irq); in iqs269_suspend()
1943 struct i2c_client *client = iqs269->client; in iqs269_resume()
1950 disable_irq(client->irq); in iqs269_resume()
1952 error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, in iqs269_resume()
1955 error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, in iqs269_resume()
1959 enable_irq(client->irq); in iqs269_resume()
1972 .compatible = "azoteq,iqs269a-00",
1976 .compatible = "azoteq,iqs269a-d0",