Lines Matching defs:data
93 static void silead_apply_efi_fw_min_max(struct silead_ts_data *data)
95 struct input_absinfo *absinfo_x = &data->input->absinfo[ABS_MT_POSITION_X];
96 struct input_absinfo *absinfo_y = &data->input->absinfo[ABS_MT_POSITION_Y];
98 if (!data->efi_fw_min_max_set)
101 absinfo_x->minimum = data->efi_fw_min_max[0];
102 absinfo_x->maximum = data->efi_fw_min_max[1];
103 absinfo_y->minimum = data->efi_fw_min_max[2];
104 absinfo_y->maximum = data->efi_fw_min_max[3];
106 if (data->prop.invert_x) {
111 if (data->prop.invert_y) {
116 if (data->prop.swap_x_y) {
122 static int silead_ts_request_input_dev(struct silead_ts_data *data)
124 struct device *dev = &data->client->dev;
127 data->input = devm_input_allocate_device(dev);
128 if (!data->input) {
134 input_set_abs_params(data->input, ABS_MT_POSITION_X, 0, 4095, 0, 0);
135 input_set_abs_params(data->input, ABS_MT_POSITION_Y, 0, 4095, 0, 0);
136 touchscreen_parse_properties(data->input, true, &data->prop);
137 silead_apply_efi_fw_min_max(data);
139 input_mt_init_slots(data->input, data->max_fingers,
144 input_set_capability(data->input, EV_KEY, KEY_LEFTMETA);
146 data->input->name = SILEAD_TS_NAME;
147 data->input->phys = "input/ts";
148 data->input->id.bustype = BUS_I2C;
150 error = input_register_device(data->input);
159 static int silead_ts_request_pen_input_dev(struct silead_ts_data *data)
161 struct device *dev = &data->client->dev;
164 if (!data->pen_supported)
167 data->pen_input = devm_input_allocate_device(dev);
168 if (!data->pen_input)
171 input_set_abs_params(data->pen_input, ABS_X, 0, 4095, 0, 0);
172 input_set_abs_params(data->pen_input, ABS_Y, 0, 4095, 0, 0);
173 input_set_capability(data->pen_input, EV_KEY, BTN_TOUCH);
174 input_set_capability(data->pen_input, EV_KEY, BTN_TOOL_PEN);
175 set_bit(INPUT_PROP_DIRECT, data->pen_input->propbit);
176 touchscreen_parse_properties(data->pen_input, false, &data->prop);
177 input_abs_set_res(data->pen_input, ABS_X, data->pen_x_res);
178 input_abs_set_res(data->pen_input, ABS_Y, data->pen_y_res);
180 data->pen_input->name = SILEAD_TS_NAME " pen";
181 data->pen_input->phys = "input/pen";
182 data->input->id.bustype = BUS_I2C;
184 error = input_register_device(data->pen_input);
196 struct silead_ts_data *data = i2c_get_clientdata(client);
198 if (data->gpio_power) {
199 gpiod_set_value_cansleep(data->gpio_power, state);
204 static bool silead_ts_handle_pen_data(struct silead_ts_data *data, u8 *buf)
209 if (!data->pen_supported || buf[2] != 0x00 || buf[3] != 0x00)
212 if (buf[0] == 0x00 && buf[1] == 0x00 && data->pen_down) {
213 data->pen_up_count++;
214 if (data->pen_up_count == 6) {
215 data->pen_down = false;
222 touchscreen_set_mt_pos(&pos, &data->prop,
226 input_report_abs(data->pen_input, ABS_X, pos.x);
227 input_report_abs(data->pen_input, ABS_Y, pos.y);
229 data->pen_up_count = 0;
230 data->pen_down = true;
237 input_report_key(data->pen_input, BTN_TOOL_PEN, data->pen_down);
238 input_report_key(data->pen_input, BTN_TOUCH, data->pen_down);
239 input_sync(data->pen_input);
245 struct silead_ts_data *data = i2c_get_clientdata(client);
246 struct input_dev *input = data->input;
259 if (buf[0] > data->max_fingers) {
261 buf[0], data->max_fingers);
262 buf[0] = data->max_fingers;
265 if (silead_ts_handle_pen_data(data, buf))
290 data->id[touch_nr] = (bufp[SILEAD_POINT_X_MSB_OFF] &
292 touchscreen_set_mt_pos(&data->pos[touch_nr], &data->prop,
298 input_mt_assign_slots(input, data->slots, data->pos, touch_nr, 0);
301 input_mt_slot(input, data->slots[i]);
303 input_report_abs(input, ABS_MT_POSITION_X, data->pos[i].x);
304 input_report_abs(input, ABS_MT_POSITION_Y, data->pos[i].y);
306 dev_dbg(dev, "x=%d y=%d hw_id=%d sw_id=%d\n", data->pos[i].x,
307 data->pos[i].y, data->id[i], data->slots[i]);
318 struct silead_ts_data *data = i2c_get_clientdata(client);
328 data->max_fingers);
399 struct silead_ts_data *data = i2c_get_clientdata(client);
405 dev_dbg(dev, "Firmware file name: %s", data->fw_name);
429 error = firmware_request_nowarn(&fw, data->fw_name, dev);
431 error = firmware_request_platform(&fw, data->fw_name, dev);
438 data->efi_fw_min_max,
439 ARRAY_SIZE(data->efi_fw_min_max));
441 data->efi_fw_min_max_set = true;
444 if (data->pen_supported) {
446 data->fw_name);
448 data->pen_supported = false;
453 fw_data = (struct silead_fw_data *)fw->data;
487 struct silead_ts_data *data = i2c_get_clientdata(client);
496 data->chip_id = le32_to_cpu(chip_id);
497 dev_info(&client->dev, "Silead chip ID: 0x%8X", data->chip_id);
579 struct silead_ts_data *data = id;
580 struct i2c_client *client = data->client;
589 struct silead_ts_data *data = i2c_get_clientdata(client);
595 &data->max_fingers);
598 data->max_fingers = 5; /* Most devices handle up-to 5 fingers */
603 snprintf(data->fw_name, sizeof(data->fw_name),
608 data->pen_supported = device_property_read_bool(dev, "silead,pen-supported");
609 device_property_read_u32(dev, "silead,pen-resolution-x", &data->pen_x_res);
610 device_property_read_u32(dev, "silead,pen-resolution-y", &data->pen_y_res);
614 static int silead_ts_set_default_fw_name(struct silead_ts_data *data,
618 struct device *dev = &data->client->dev;
626 snprintf(data->fw_name, sizeof(data->fw_name),
629 for (i = 0; i < strlen(data->fw_name); i++)
630 data->fw_name[i] = tolower(data->fw_name[i]);
632 snprintf(data->fw_name, sizeof(data->fw_name),
639 static int silead_ts_set_default_fw_name(struct silead_ts_data *data,
642 snprintf(data->fw_name, sizeof(data->fw_name),
650 struct silead_ts_data *data = arg;
652 regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);
658 struct silead_ts_data *data;
670 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
671 if (!data)
674 i2c_set_clientdata(client, data);
675 data->client = client;
677 error = silead_ts_set_default_fw_name(data, id);
687 data->regulators[0].supply = "vddio";
688 data->regulators[1].supply = "avdd";
689 error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators),
690 data->regulators);
698 error = regulator_bulk_enable(ARRAY_SIZE(data->regulators),
699 data->regulators);
703 error = devm_add_action_or_reset(dev, silead_disable_regulator, data);
708 data->gpio_power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
709 if (IS_ERR(data->gpio_power))
710 return dev_err_probe(dev, PTR_ERR(data->gpio_power),
717 error = silead_ts_request_input_dev(data);
721 error = silead_ts_request_pen_input_dev(data);
727 IRQF_ONESHOT, client->name, data);