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 * -------------------------------------------------------------------------
66 struct i2c_client *client; member
76 int id[SILEAD_MAX_FINGERS]; member
86 struct device *dev = &data->client->dev; in silead_ts_request_input_dev()
89 data->input = devm_input_allocate_device(dev); in silead_ts_request_input_dev()
90 if (!data->input) { in silead_ts_request_input_dev()
93 return -ENOMEM; in silead_ts_request_input_dev()
96 input_set_abs_params(data->input, ABS_MT_POSITION_X, 0, 4095, 0, 0); in silead_ts_request_input_dev()
97 input_set_abs_params(data->input, ABS_MT_POSITION_Y, 0, 4095, 0, 0); in silead_ts_request_input_dev()
98 touchscreen_parse_properties(data->input, true, &data->prop); in silead_ts_request_input_dev()
100 input_mt_init_slots(data->input, data->max_fingers, in silead_ts_request_input_dev()
104 if (device_property_read_bool(dev, "silead,home-button")) in silead_ts_request_input_dev()
105 input_set_capability(data->input, EV_KEY, KEY_LEFTMETA); in silead_ts_request_input_dev()
107 data->input->name = SILEAD_TS_NAME; in silead_ts_request_input_dev()
108 data->input->phys = "input/ts"; in silead_ts_request_input_dev()
109 data->input->id.bustype = BUS_I2C; in silead_ts_request_input_dev()
111 error = input_register_device(data->input); in silead_ts_request_input_dev()
120 static void silead_ts_set_power(struct i2c_client *client, in silead_ts_set_power() argument
123 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_set_power()
125 if (data->gpio_power) { in silead_ts_set_power()
126 gpiod_set_value_cansleep(data->gpio_power, state); in silead_ts_set_power()
131 static void silead_ts_read_data(struct i2c_client *client) in silead_ts_read_data() argument
133 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_read_data()
134 struct input_dev *input = data->input; in silead_ts_read_data()
135 struct device *dev = &client->dev; in silead_ts_read_data()
140 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_DATA, in silead_ts_read_data()
147 if (buf[0] > data->max_fingers) { in silead_ts_read_data()
149 buf[0], data->max_fingers); in silead_ts_read_data()
150 buf[0] = data->max_fingers; in silead_ts_read_data()
172 * Bits 4-7 are the touch id, note not all models have in silead_ts_read_data()
175 data->id[touch_nr] = (bufp[SILEAD_POINT_X_MSB_OFF] & in silead_ts_read_data()
177 touchscreen_set_mt_pos(&data->pos[touch_nr], &data->prop, in silead_ts_read_data()
183 input_mt_assign_slots(input, data->slots, data->pos, touch_nr, 0); in silead_ts_read_data()
186 input_mt_slot(input, data->slots[i]); in silead_ts_read_data()
188 input_report_abs(input, ABS_MT_POSITION_X, data->pos[i].x); in silead_ts_read_data()
189 input_report_abs(input, ABS_MT_POSITION_Y, data->pos[i].y); in silead_ts_read_data()
191 dev_dbg(dev, "x=%d y=%d hw_id=%d sw_id=%d\n", data->pos[i].x, in silead_ts_read_data()
192 data->pos[i].y, data->id[i], data->slots[i]); in silead_ts_read_data()
200 static int silead_ts_init(struct i2c_client *client) in silead_ts_init() argument
202 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_init()
205 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_init()
211 error = i2c_smbus_write_byte_data(client, SILEAD_REG_TOUCH_NR, in silead_ts_init()
212 data->max_fingers); in silead_ts_init()
217 error = i2c_smbus_write_byte_data(client, SILEAD_REG_CLOCK, in silead_ts_init()
223 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_init()
232 dev_err(&client->dev, "Registers clear error %d\n", error); in silead_ts_init()
236 static int silead_ts_reset(struct i2c_client *client) in silead_ts_reset() argument
240 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, in silead_ts_reset()
246 error = i2c_smbus_write_byte_data(client, SILEAD_REG_CLOCK, in silead_ts_reset()
252 error = i2c_smbus_write_byte_data(client, SILEAD_REG_POWER, in silead_ts_reset()
261 dev_err(&client->dev, "Chip reset error %d\n", error); in silead_ts_reset()
265 static int silead_ts_startup(struct i2c_client *client) in silead_ts_startup() argument
269 error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET, 0x00); in silead_ts_startup()
271 dev_err(&client->dev, "Startup error %d\n", error); in silead_ts_startup()
280 static int silead_ts_load_fw(struct i2c_client *client) in silead_ts_load_fw() argument
282 struct device *dev = &client->dev; in silead_ts_load_fw()
283 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_load_fw()
289 dev_dbg(dev, "Firmware file name: %s", data->fw_name); in silead_ts_load_fw()
291 error = firmware_request_platform(&fw, data->fw_name, dev); in silead_ts_load_fw()
297 fw_size = fw->size / sizeof(*fw_data); in silead_ts_load_fw()
298 fw_data = (struct silead_fw_data *)fw->data; in silead_ts_load_fw()
301 error = i2c_smbus_write_i2c_block_data(client, in silead_ts_load_fw()
315 static u32 silead_ts_get_status(struct i2c_client *client) in silead_ts_get_status() argument
320 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_STATUS, in silead_ts_get_status()
323 dev_err(&client->dev, "Status read error %d\n", error); in silead_ts_get_status()
330 static int silead_ts_get_id(struct i2c_client *client) in silead_ts_get_id() argument
332 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_get_id()
336 error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_ID, in silead_ts_get_id()
339 dev_err(&client->dev, "Chip ID read error %d\n", error); in silead_ts_get_id()
343 data->chip_id = le32_to_cpu(chip_id); in silead_ts_get_id()
344 dev_info(&client->dev, "Silead chip ID: 0x%8X", data->chip_id); in silead_ts_get_id()
349 static int silead_ts_setup(struct i2c_client *client) in silead_ts_setup() argument
354 silead_ts_set_power(client, SILEAD_POWER_OFF); in silead_ts_setup()
355 silead_ts_set_power(client, SILEAD_POWER_ON); in silead_ts_setup()
357 error = silead_ts_get_id(client); in silead_ts_setup()
361 error = silead_ts_init(client); in silead_ts_setup()
365 error = silead_ts_reset(client); in silead_ts_setup()
369 error = silead_ts_load_fw(client); in silead_ts_setup()
373 error = silead_ts_startup(client); in silead_ts_setup()
377 status = silead_ts_get_status(client); in silead_ts_setup()
379 dev_err(&client->dev, in silead_ts_setup()
381 return -ENODEV; in silead_ts_setup()
387 static irqreturn_t silead_ts_threaded_irq_handler(int irq, void *id) in silead_ts_threaded_irq_handler() argument
389 struct silead_ts_data *data = id; in silead_ts_threaded_irq_handler()
390 struct i2c_client *client = data->client; in silead_ts_threaded_irq_handler() local
392 silead_ts_read_data(client); in silead_ts_threaded_irq_handler()
397 static void silead_ts_read_props(struct i2c_client *client) in silead_ts_read_props() argument
399 struct silead_ts_data *data = i2c_get_clientdata(client); in silead_ts_read_props()
400 struct device *dev = &client->dev; in silead_ts_read_props()
404 error = device_property_read_u32(dev, "silead,max-fingers", in silead_ts_read_props()
405 &data->max_fingers); in silead_ts_read_props()
408 data->max_fingers = 5; /* Most devices handle up-to 5 fingers */ in silead_ts_read_props()
411 error = device_property_read_string(dev, "firmware-name", &str); in silead_ts_read_props()
413 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_read_props()
421 const struct i2c_device_id *id) in silead_ts_set_default_fw_name() argument
424 struct device *dev = &data->client->dev; in silead_ts_set_default_fw_name()
428 acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); in silead_ts_set_default_fw_name()
430 return -ENODEV; in silead_ts_set_default_fw_name()
432 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
433 "silead/%s.fw", acpi_id->id); in silead_ts_set_default_fw_name()
435 for (i = 0; i < strlen(data->fw_name); i++) in silead_ts_set_default_fw_name()
436 data->fw_name[i] = tolower(data->fw_name[i]); in silead_ts_set_default_fw_name()
438 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
439 "silead/%s.fw", id->name); in silead_ts_set_default_fw_name()
446 const struct i2c_device_id *id) in silead_ts_set_default_fw_name() argument
448 snprintf(data->fw_name, sizeof(data->fw_name), in silead_ts_set_default_fw_name()
449 "silead/%s.fw", id->name); in silead_ts_set_default_fw_name()
458 regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators); in silead_disable_regulator()
461 static int silead_ts_probe(struct i2c_client *client, in silead_ts_probe() argument
462 const struct i2c_device_id *id) in silead_ts_probe() argument
465 struct device *dev = &client->dev; in silead_ts_probe()
468 if (!i2c_check_functionality(client->adapter, in silead_ts_probe()
473 return -ENXIO; in silead_ts_probe()
478 return -ENOMEM; in silead_ts_probe()
480 i2c_set_clientdata(client, data); in silead_ts_probe()
481 data->client = client; in silead_ts_probe()
483 error = silead_ts_set_default_fw_name(data, id); in silead_ts_probe()
487 silead_ts_read_props(client); in silead_ts_probe()
490 if (client->irq <= 0) in silead_ts_probe()
491 return -ENODEV; in silead_ts_probe()
493 data->regulators[0].supply = "vddio"; in silead_ts_probe()
494 data->regulators[1].supply = "avdd"; in silead_ts_probe()
495 error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators), in silead_ts_probe()
496 data->regulators); in silead_ts_probe()
504 error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), in silead_ts_probe()
505 data->regulators); in silead_ts_probe()
514 data->gpio_power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW); in silead_ts_probe()
515 if (IS_ERR(data->gpio_power)) { in silead_ts_probe()
516 if (PTR_ERR(data->gpio_power) != -EPROBE_DEFER) in silead_ts_probe()
518 return PTR_ERR(data->gpio_power); in silead_ts_probe()
521 error = silead_ts_setup(client); in silead_ts_probe()
529 error = devm_request_threaded_irq(dev, client->irq, in silead_ts_probe()
531 IRQF_ONESHOT, client->name, data); in silead_ts_probe()
533 if (error != -EPROBE_DEFER) in silead_ts_probe()
543 struct i2c_client *client = to_i2c_client(dev); in silead_ts_suspend() local
545 disable_irq(client->irq); in silead_ts_suspend()
546 silead_ts_set_power(client, SILEAD_POWER_OFF); in silead_ts_suspend()
552 struct i2c_client *client = to_i2c_client(dev); in silead_ts_resume() local
556 silead_ts_set_power(client, SILEAD_POWER_ON); in silead_ts_resume()
559 error = silead_ts_reset(client); in silead_ts_resume()
564 error = silead_ts_load_fw(client); in silead_ts_resume()
569 error = silead_ts_startup(client); in silead_ts_resume()
573 status = silead_ts_get_status(client); in silead_ts_resume()
581 return -ENODEV; in silead_ts_resume()
584 enable_irq(client->irq); in silead_ts_resume()