Lines Matching +full:client +full:- +full:id

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 * -------------------------------------------------------------------------
67 struct i2c_client *client; member
78 int id[SILEAD_MAX_FINGERS]; member
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()
193 static void silead_ts_set_power(struct i2c_client *client, in silead_ts_set_power() argument
196 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_set_power()
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()
243 static void silead_ts_read_data(struct i2c_client *client) in silead_ts_read_data() argument
245 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_read_data()
246 struct input_dev *input = data->input; in silead_ts_read_data()
247 struct device *dev = &client->dev; in silead_ts_read_data()
252 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_DATA, 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()
316 static int silead_ts_init(struct i2c_client *client) in silead_ts_init() argument
318 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_init()
321 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_init()
327 error = i2c_smbus_write_byte_data(client, SILEAD_REG_TOUCH_NR, in silead_ts_init()
328 data->max_fingers); in silead_ts_init()
333 error = i2c_smbus_write_byte_data(client, SILEAD_REG_CLOCK, in silead_ts_init()
339 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_init()
348 dev_err(&client->dev, "Registers clear error %d\n", error); in silead_ts_init()
352 static int silead_ts_reset(struct i2c_client *client) in silead_ts_reset() argument
356 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_reset()
362 error = i2c_smbus_write_byte_data(client, SILEAD_REG_CLOCK, in silead_ts_reset()
368 error = i2c_smbus_write_byte_data(client, SILEAD_REG_POWER, in silead_ts_reset()
377 dev_err(&client->dev, "Chip reset error %d\n", error); in silead_ts_reset()
381 static int silead_ts_startup(struct i2c_client *client) in silead_ts_startup() argument
385 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, 0x00); in silead_ts_startup()
387 dev_err(&client->dev, "Startup error %d\n", error); in silead_ts_startup()
396 static int silead_ts_load_fw(struct i2c_client *client) in silead_ts_load_fw() argument
398 struct device *dev = &client->dev; in silead_ts_load_fw()
399 struct silead_ts_data *data = i2c_get_clientdata(client); 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()
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()
456 error = i2c_smbus_write_i2c_block_data(client, in silead_ts_load_fw()
470 static u32 silead_ts_get_status(struct i2c_client *client) in silead_ts_get_status() argument
475 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_STATUS, in silead_ts_get_status()
478 dev_err(&client->dev, "Status read error %d\n", error); in silead_ts_get_status()
485 static int silead_ts_get_id(struct i2c_client *client) in silead_ts_get_id() argument
487 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_get_id()
491 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_ID, in silead_ts_get_id()
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()
502 static int silead_ts_setup(struct i2c_client *client) in silead_ts_setup() argument
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()
535 silead_ts_get_id(client); in silead_ts_setup()
538 pm_runtime_forbid(&client->dev); in silead_ts_setup()
539 pm_runtime_disable(&client->dev); in silead_ts_setup()
542 silead_ts_set_power(client, SILEAD_POWER_OFF); in silead_ts_setup()
543 silead_ts_set_power(client, SILEAD_POWER_ON); in silead_ts_setup()
545 error = silead_ts_get_id(client); in silead_ts_setup()
547 dev_err(&client->dev, "Chip ID read error %d\n", error); in silead_ts_setup()
551 error = silead_ts_init(client); in silead_ts_setup()
555 error = silead_ts_reset(client); in silead_ts_setup()
559 error = silead_ts_load_fw(client); in silead_ts_setup()
563 error = silead_ts_startup(client); in silead_ts_setup()
567 status = silead_ts_get_status(client); in silead_ts_setup()
569 dev_err(&client->dev, in silead_ts_setup()
571 return -ENODEV; in silead_ts_setup()
577 static irqreturn_t silead_ts_threaded_irq_handler(int irq, void *id) in silead_ts_threaded_irq_handler() argument
579 struct silead_ts_data *data = id; in silead_ts_threaded_irq_handler()
580 struct i2c_client *client = data->client; in silead_ts_threaded_irq_handler() local
582 silead_ts_read_data(client); in silead_ts_threaded_irq_handler()
587 static void silead_ts_read_props(struct i2c_client *client) in silead_ts_read_props() argument
589 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_read_props()
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()
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()
615 const struct i2c_device_id *id) in silead_ts_set_default_fw_name() argument
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()
640 const struct i2c_device_id *id) in silead_ts_set_default_fw_name() argument
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()
655 static int silead_ts_probe(struct i2c_client *client, in silead_ts_probe() argument
656 const struct i2c_device_id *id) in silead_ts_probe() argument
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()
674 i2c_set_clientdata(client, data); in silead_ts_probe()
675 data->client = client; in silead_ts_probe()
677 error = silead_ts_set_default_fw_name(data, id); in silead_ts_probe()
681 silead_ts_read_props(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 if (PTR_ERR(data->gpio_power) != -EPROBE_DEFER) in silead_ts_probe()
712 return PTR_ERR(data->gpio_power); in silead_ts_probe()
715 error = silead_ts_setup(client); in silead_ts_probe()
727 error = devm_request_threaded_irq(dev, client->irq, in silead_ts_probe()
729 IRQF_ONESHOT, client->name, data); in silead_ts_probe()
731 if (error != -EPROBE_DEFER) in silead_ts_probe()
741 struct i2c_client *client = to_i2c_client(dev); in silead_ts_suspend() local
743 disable_irq(client->irq); in silead_ts_suspend()
744 silead_ts_set_power(client, SILEAD_POWER_OFF); in silead_ts_suspend()
750 struct i2c_client *client = to_i2c_client(dev); in silead_ts_resume() local
754 silead_ts_set_power(client, SILEAD_POWER_ON); in silead_ts_resume()
757 error = silead_ts_reset(client); in silead_ts_resume()
762 error = silead_ts_load_fw(client); in silead_ts_resume()
767 error = silead_ts_startup(client); in silead_ts_resume()
771 status = silead_ts_get_status(client); in silead_ts_resume()
779 return -ENODEV; in silead_ts_resume()
782 enable_irq(client->irq); in silead_ts_resume()