Lines Matching +full:max +full:- +full:fingers
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* -------------------------------------------------------------------------
3 * Copyright (C) 2014-2015, Intel Corporation
7 * Copyright (C) 2010-2015, Shanghai Sileadinc Co.Ltd
9 * -------------------------------------------------------------------------
95 struct input_absinfo *absinfo_x = &data->input->absinfo[ABS_MT_POSITION_X]; in silead_apply_efi_fw_min_max()
96 struct input_absinfo *absinfo_y = &data->input->absinfo[ABS_MT_POSITION_Y]; in silead_apply_efi_fw_min_max()
98 if (!data->efi_fw_min_max_set) in silead_apply_efi_fw_min_max()
101 absinfo_x->minimum = data->efi_fw_min_max[0]; in silead_apply_efi_fw_min_max()
102 absinfo_x->maximum = data->efi_fw_min_max[1]; in silead_apply_efi_fw_min_max()
103 absinfo_y->minimum = data->efi_fw_min_max[2]; in silead_apply_efi_fw_min_max()
104 absinfo_y->maximum = data->efi_fw_min_max[3]; in silead_apply_efi_fw_min_max()
106 if (data->prop.invert_x) { in silead_apply_efi_fw_min_max()
107 absinfo_x->maximum -= absinfo_x->minimum; in silead_apply_efi_fw_min_max()
108 absinfo_x->minimum = 0; in silead_apply_efi_fw_min_max()
111 if (data->prop.invert_y) { in silead_apply_efi_fw_min_max()
112 absinfo_y->maximum -= absinfo_y->minimum; in silead_apply_efi_fw_min_max()
113 absinfo_y->minimum = 0; in silead_apply_efi_fw_min_max()
116 if (data->prop.swap_x_y) { in silead_apply_efi_fw_min_max()
117 swap(absinfo_x->minimum, absinfo_y->minimum); in silead_apply_efi_fw_min_max()
118 swap(absinfo_x->maximum, absinfo_y->maximum); in silead_apply_efi_fw_min_max()
124 struct device *dev = &data->client->dev; in silead_ts_request_input_dev()
127 data->input = devm_input_allocate_device(dev); in silead_ts_request_input_dev()
128 if (!data->input) { in silead_ts_request_input_dev()
131 return -ENOMEM; in silead_ts_request_input_dev()
134 input_set_abs_params(data->input, ABS_MT_POSITION_X, 0, 4095, 0, 0); in silead_ts_request_input_dev()
135 input_set_abs_params(data->input, ABS_MT_POSITION_Y, 0, 4095, 0, 0); in silead_ts_request_input_dev()
136 touchscreen_parse_properties(data->input, true, &data->prop); in silead_ts_request_input_dev()
139 input_mt_init_slots(data->input, data->max_fingers, in silead_ts_request_input_dev()
143 if (device_property_read_bool(dev, "silead,home-button")) in silead_ts_request_input_dev()
144 input_set_capability(data->input, EV_KEY, KEY_LEFTMETA); in silead_ts_request_input_dev()
146 data->input->name = SILEAD_TS_NAME; in silead_ts_request_input_dev()
147 data->input->phys = "input/ts"; in silead_ts_request_input_dev()
148 data->input->id.bustype = BUS_I2C; in silead_ts_request_input_dev()
150 error = input_register_device(data->input); in silead_ts_request_input_dev()
161 struct device *dev = &data->client->dev; in silead_ts_request_pen_input_dev()
164 if (!data->pen_supported) in silead_ts_request_pen_input_dev()
167 data->pen_input = devm_input_allocate_device(dev); in silead_ts_request_pen_input_dev()
168 if (!data->pen_input) in silead_ts_request_pen_input_dev()
169 return -ENOMEM; in silead_ts_request_pen_input_dev()
171 input_set_abs_params(data->pen_input, ABS_X, 0, 4095, 0, 0); in silead_ts_request_pen_input_dev()
172 input_set_abs_params(data->pen_input, ABS_Y, 0, 4095, 0, 0); in silead_ts_request_pen_input_dev()
173 input_set_capability(data->pen_input, EV_KEY, BTN_TOUCH); in silead_ts_request_pen_input_dev()
174 input_set_capability(data->pen_input, EV_KEY, BTN_TOOL_PEN); in silead_ts_request_pen_input_dev()
175 set_bit(INPUT_PROP_DIRECT, data->pen_input->propbit); in silead_ts_request_pen_input_dev()
176 touchscreen_parse_properties(data->pen_input, false, &data->prop); in silead_ts_request_pen_input_dev()
177 input_abs_set_res(data->pen_input, ABS_X, data->pen_x_res); in silead_ts_request_pen_input_dev()
178 input_abs_set_res(data->pen_input, ABS_Y, data->pen_y_res); in silead_ts_request_pen_input_dev()
180 data->pen_input->name = SILEAD_TS_NAME " pen"; in silead_ts_request_pen_input_dev()
181 data->pen_input->phys = "input/pen"; in silead_ts_request_pen_input_dev()
182 data->input->id.bustype = BUS_I2C; in silead_ts_request_pen_input_dev()
184 error = input_register_device(data->pen_input); in silead_ts_request_pen_input_dev()
198 if (data->gpio_power) { in silead_ts_set_power()
199 gpiod_set_value_cansleep(data->gpio_power, state); in silead_ts_set_power()
209 if (!data->pen_supported || buf[2] != 0x00 || buf[3] != 0x00) in silead_ts_handle_pen_data()
212 if (buf[0] == 0x00 && buf[1] == 0x00 && data->pen_down) { in silead_ts_handle_pen_data()
213 data->pen_up_count++; in silead_ts_handle_pen_data()
214 if (data->pen_up_count == 6) { in silead_ts_handle_pen_data()
215 data->pen_down = false; in silead_ts_handle_pen_data()
222 touchscreen_set_mt_pos(&pos, &data->prop, in silead_ts_handle_pen_data()
226 input_report_abs(data->pen_input, ABS_X, pos.x); in silead_ts_handle_pen_data()
227 input_report_abs(data->pen_input, ABS_Y, pos.y); in silead_ts_handle_pen_data()
229 data->pen_up_count = 0; in silead_ts_handle_pen_data()
230 data->pen_down = true; in silead_ts_handle_pen_data()
237 input_report_key(data->pen_input, BTN_TOOL_PEN, data->pen_down); in silead_ts_handle_pen_data()
238 input_report_key(data->pen_input, BTN_TOUCH, data->pen_down); in silead_ts_handle_pen_data()
239 input_sync(data->pen_input); in silead_ts_handle_pen_data()
246 struct input_dev *input = data->input; in silead_ts_read_data()
247 struct device *dev = &client->dev; in silead_ts_read_data()
259 if (buf[0] > data->max_fingers) { in silead_ts_read_data()
261 buf[0], data->max_fingers); in silead_ts_read_data()
262 buf[0] = data->max_fingers; in silead_ts_read_data()
287 * Bits 4-7 are the touch id, note not all models have in silead_ts_read_data()
290 data->id[touch_nr] = (bufp[SILEAD_POINT_X_MSB_OFF] & in silead_ts_read_data()
292 touchscreen_set_mt_pos(&data->pos[touch_nr], &data->prop, in silead_ts_read_data()
298 input_mt_assign_slots(input, data->slots, data->pos, touch_nr, 0); in silead_ts_read_data()
301 input_mt_slot(input, data->slots[i]); in silead_ts_read_data()
303 input_report_abs(input, ABS_MT_POSITION_X, data->pos[i].x); in silead_ts_read_data()
304 input_report_abs(input, ABS_MT_POSITION_Y, data->pos[i].y); in silead_ts_read_data()
306 dev_dbg(dev, "x=%d y=%d hw_id=%d sw_id=%d\n", data->pos[i].x, in silead_ts_read_data()
307 data->pos[i].y, data->id[i], data->slots[i]); in silead_ts_read_data()
328 data->max_fingers); in silead_ts_init()
348 dev_err(&client->dev, "Registers clear error %d\n", error); in silead_ts_init()
377 dev_err(&client->dev, "Chip reset error %d\n", error); in silead_ts_reset()
387 dev_err(&client->dev, "Startup error %d\n", error); in silead_ts_startup()
398 struct device *dev = &client->dev; in silead_ts_load_fw()
405 dev_dbg(dev, "Firmware file name: %s", data->fw_name); in silead_ts_load_fw()
410 * Silead firmware files in linux-firmware. in silead_ts_load_fw()
413 * which contains an embedded copy of the firmware. The fw-loader code has a in silead_ts_load_fw()
421 * calibration can lead to significant differences in the reported min/max in silead_ts_load_fw()
426 * succeeds we apply an (optional) set of alternative min/max values from the in silead_ts_load_fw()
427 * "silead,efi-fw-min-max" property. in silead_ts_load_fw()
429 error = firmware_request_nowarn(&fw, data->fw_name, dev); in silead_ts_load_fw()
431 error = firmware_request_platform(&fw, data->fw_name, dev); in silead_ts_load_fw()
437 error = device_property_read_u32_array(dev, "silead,efi-fw-min-max", in silead_ts_load_fw()
438 data->efi_fw_min_max, in silead_ts_load_fw()
439 ARRAY_SIZE(data->efi_fw_min_max)); in silead_ts_load_fw()
441 data->efi_fw_min_max_set = true; in silead_ts_load_fw()
444 if (data->pen_supported) { in silead_ts_load_fw()
446 data->fw_name); in silead_ts_load_fw()
448 data->pen_supported = false; in silead_ts_load_fw()
452 fw_size = fw->size / sizeof(*fw_data); in silead_ts_load_fw()
453 fw_data = (struct silead_fw_data *)fw->data; in silead_ts_load_fw()
478 dev_err(&client->dev, "Status read error %d\n", error); in silead_ts_get_status()
496 data->chip_id = le32_to_cpu(chip_id); in silead_ts_get_id()
497 dev_info(&client->dev, "Silead chip ID: 0x%8X", data->chip_id); in silead_ts_get_id()
508 * Some buggy BIOS-es bring up the chip in a stuck state where it in silead_ts_setup()
513 * response to which the I2C-bus-driver will call: in silead_ts_setup()
514 * i2c_recover_bus() which will unstuck the I2C-bus. Note the in silead_ts_setup()
515 * unstuck-ing of the I2C bus only works if we first drop the in silead_ts_setup()
521 * Resources. The workaround below runtime-suspends the chip to in silead_ts_setup()
526 if (device_property_read_bool(&client->dev, in silead_ts_setup()
527 "silead,stuck-controller-bug")) { in silead_ts_setup()
528 pm_runtime_set_active(&client->dev); in silead_ts_setup()
529 pm_runtime_enable(&client->dev); in silead_ts_setup()
530 pm_runtime_allow(&client->dev); in silead_ts_setup()
532 pm_runtime_suspend(&client->dev); in silead_ts_setup()
534 …dev_warn(&client->dev, FW_BUG "Stuck I2C bus: please ignore the next 'controller timed out' error\… in silead_ts_setup()
538 pm_runtime_forbid(&client->dev); in silead_ts_setup()
539 pm_runtime_disable(&client->dev); in silead_ts_setup()
547 dev_err(&client->dev, "Chip ID read error %d\n", error); in silead_ts_setup()
569 dev_err(&client->dev, in silead_ts_setup()
571 return -ENODEV; in silead_ts_setup()
580 struct i2c_client *client = data->client; in silead_ts_threaded_irq_handler()
590 struct device *dev = &client->dev; in silead_ts_read_props()
594 error = device_property_read_u32(dev, "silead,max-fingers", in silead_ts_read_props()
595 &data->max_fingers); in silead_ts_read_props()
597 dev_dbg(dev, "Max fingers read error %d\n", error); in silead_ts_read_props()
598 data->max_fingers = 5; /* Most devices handle up-to 5 fingers */ in silead_ts_read_props()
601 error = device_property_read_string(dev, "firmware-name", &str); in silead_ts_read_props()
603 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_read_props()
608 data->pen_supported = device_property_read_bool(dev, "silead,pen-supported"); in silead_ts_read_props()
609 device_property_read_u32(dev, "silead,pen-resolution-x", &data->pen_x_res); in silead_ts_read_props()
610 device_property_read_u32(dev, "silead,pen-resolution-y", &data->pen_y_res); in silead_ts_read_props()
618 struct device *dev = &data->client->dev; in silead_ts_set_default_fw_name()
622 acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); in silead_ts_set_default_fw_name()
624 return -ENODEV; in silead_ts_set_default_fw_name()
626 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
627 "silead/%s.fw", acpi_id->id); in silead_ts_set_default_fw_name()
629 for (i = 0; i < strlen(data->fw_name); i++) in silead_ts_set_default_fw_name()
630 data->fw_name[i] = tolower(data->fw_name[i]); in silead_ts_set_default_fw_name()
632 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
633 "silead/%s.fw", id->name); in silead_ts_set_default_fw_name()
642 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
643 "silead/%s.fw", id->name); in silead_ts_set_default_fw_name()
652 regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators); in silead_disable_regulator()
659 struct device *dev = &client->dev; in silead_ts_probe()
662 if (!i2c_check_functionality(client->adapter, in silead_ts_probe()
667 return -ENXIO; in silead_ts_probe()
672 return -ENOMEM; in silead_ts_probe()
675 data->client = client; in silead_ts_probe()
684 if (client->irq <= 0) in silead_ts_probe()
685 return -ENODEV; in silead_ts_probe()
687 data->regulators[0].supply = "vddio"; in silead_ts_probe()
688 data->regulators[1].supply = "avdd"; in silead_ts_probe()
689 error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators), in silead_ts_probe()
690 data->regulators); in silead_ts_probe()
698 error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), in silead_ts_probe()
699 data->regulators); in silead_ts_probe()
708 data->gpio_power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW); in silead_ts_probe()
709 if (IS_ERR(data->gpio_power)) in silead_ts_probe()
710 return dev_err_probe(dev, PTR_ERR(data->gpio_power), in silead_ts_probe()
725 error = devm_request_threaded_irq(dev, client->irq, in silead_ts_probe()
727 IRQF_ONESHOT, client->name, data); in silead_ts_probe()
729 if (error != -EPROBE_DEFER) in silead_ts_probe()
741 disable_irq(client->irq); in silead_ts_suspend()
777 return -ENODEV; in silead_ts_resume()
780 enable_irq(client->irq); in silead_ts_resume()