Lines Matching full:data
168 static int elan_enable_power(struct elan_tp_data *data) in elan_enable_power() argument
173 error = regulator_enable(data->vcc); in elan_enable_power()
175 dev_err(&data->client->dev, in elan_enable_power()
181 error = data->ops->power_control(data->client, true); in elan_enable_power()
188 dev_err(&data->client->dev, "failed to enable power: %d\n", error); in elan_enable_power()
192 static int elan_disable_power(struct elan_tp_data *data) in elan_disable_power() argument
198 error = data->ops->power_control(data->client, false); in elan_disable_power()
200 error = regulator_disable(data->vcc); in elan_disable_power()
202 dev_err(&data->client->dev, in elan_disable_power()
206 data->ops->power_control(data->client, true); in elan_disable_power()
216 dev_err(&data->client->dev, "failed to disable power: %d\n", error); in elan_disable_power()
220 static int elan_sleep(struct elan_tp_data *data) in elan_sleep() argument
226 error = data->ops->sleep_control(data->client, true); in elan_sleep()
236 static int elan_query_product(struct elan_tp_data *data) in elan_query_product() argument
240 error = data->ops->get_product_id(data->client, &data->product_id); in elan_query_product()
244 error = data->ops->get_pattern(data->client, &data->pattern); in elan_query_product()
248 error = data->ops->get_sm_version(data->client, data->pattern, in elan_query_product()
249 &data->ic_type, &data->sm_version, in elan_query_product()
250 &data->clickpad); in elan_query_product()
257 static int elan_check_ASUS_special_fw(struct elan_tp_data *data) in elan_check_ASUS_special_fw() argument
259 if (data->ic_type == 0x0E) { in elan_check_ASUS_special_fw()
260 switch (data->product_id) { in elan_check_ASUS_special_fw()
266 } else if (data->ic_type == 0x08 && data->product_id == 0x26) { in elan_check_ASUS_special_fw()
274 static int __elan_initialize(struct elan_tp_data *data) in __elan_initialize() argument
276 struct i2c_client *client = data->client; in __elan_initialize()
280 error = data->ops->initialize(client); in __elan_initialize()
286 error = elan_query_product(data); in __elan_initialize()
295 if (elan_check_ASUS_special_fw(data)) { in __elan_initialize()
296 error = data->ops->sleep_control(client, false); in __elan_initialize()
307 data->mode |= ETP_ENABLE_ABS; in __elan_initialize()
308 error = data->ops->set_mode(client, data->mode); in __elan_initialize()
316 error = data->ops->sleep_control(client, false); in __elan_initialize()
327 static int elan_initialize(struct elan_tp_data *data) in elan_initialize() argument
333 error = __elan_initialize(data); in elan_initialize()
343 static int elan_query_device_info(struct elan_tp_data *data) in elan_query_device_info() argument
347 error = data->ops->get_version(data->client, data->pattern, false, in elan_query_device_info()
348 &data->fw_version); in elan_query_device_info()
352 error = data->ops->get_checksum(data->client, false, in elan_query_device_info()
353 &data->fw_checksum); in elan_query_device_info()
357 error = data->ops->get_version(data->client, data->pattern, in elan_query_device_info()
358 true, &data->iap_version); in elan_query_device_info()
362 error = data->ops->get_pressure_adjustment(data->client, in elan_query_device_info()
363 &data->pressure_adjustment); in elan_query_device_info()
367 error = data->ops->get_report_features(data->client, data->pattern, in elan_query_device_info()
368 &data->report_features, in elan_query_device_info()
369 &data->report_len); in elan_query_device_info()
373 error = elan_get_fwinfo(data->ic_type, data->iap_version, in elan_query_device_info()
374 &data->fw_validpage_count, in elan_query_device_info()
375 &data->fw_signature_address, in elan_query_device_info()
376 &data->fw_page_size); in elan_query_device_info()
378 dev_warn(&data->client->dev, in elan_query_device_info()
380 data->iap_version, data->ic_type); in elan_query_device_info()
402 static int elan_query_device_parameters(struct elan_tp_data *data) in elan_query_device_parameters() argument
404 struct i2c_client *client = data->client; in elan_query_device_parameters()
411 "touchscreen-size-x", &data->max_x) || in elan_query_device_parameters()
413 "touchscreen-size-y", &data->max_y)) { in elan_query_device_parameters()
414 error = data->ops->get_max(data->client, in elan_query_device_parameters()
415 &data->max_x, in elan_query_device_parameters()
416 &data->max_y); in elan_query_device_parameters()
421 --data->max_x; in elan_query_device_parameters()
422 --data->max_y; in elan_query_device_parameters()
431 error = data->ops->get_num_traces(data->client, in elan_query_device_parameters()
436 data->width_x = data->max_x / x_traces; in elan_query_device_parameters()
437 data->width_y = data->max_y / y_traces; in elan_query_device_parameters()
443 error = data->ops->get_resolution(data->client, in elan_query_device_parameters()
448 data->x_res = elan_convert_resolution(hw_x_res, data->pattern); in elan_query_device_parameters()
449 data->y_res = elan_convert_resolution(hw_y_res, data->pattern); in elan_query_device_parameters()
451 data->x_res = (data->max_x + 1) / x_mm; in elan_query_device_parameters()
452 data->y_res = (data->max_y + 1) / y_mm; in elan_query_device_parameters()
456 data->clickpad = 1; in elan_query_device_parameters()
459 data->middle_button = true; in elan_query_device_parameters()
469 static int elan_write_fw_block(struct elan_tp_data *data, u16 page_size, in elan_write_fw_block() argument
476 error = data->ops->write_fw_block(data->client, page_size, in elan_write_fw_block()
481 dev_dbg(&data->client->dev, in elan_write_fw_block()
488 static int __elan_update_firmware(struct elan_tp_data *data, in __elan_update_firmware() argument
491 struct i2c_client *client = data->client; in __elan_update_firmware()
499 error = data->ops->prepare_fw_update(client, data->ic_type, in __elan_update_firmware()
500 data->iap_version, in __elan_update_firmware()
501 data->fw_page_size); in __elan_update_firmware()
505 iap_start_addr = get_unaligned_le16(&fw->data[ETP_IAP_START_ADDR * 2]); in __elan_update_firmware()
507 boot_page_count = (iap_start_addr * 2) / data->fw_page_size; in __elan_update_firmware()
508 for (i = boot_page_count; i < data->fw_validpage_count; i++) { in __elan_update_firmware()
510 const u8 *page = &fw->data[i * data->fw_page_size]; in __elan_update_firmware()
512 for (j = 0; j < data->fw_page_size; j += 2) in __elan_update_firmware()
515 error = elan_write_fw_block(data, data->fw_page_size, in __elan_update_firmware()
528 error = data->ops->finish_fw_update(client, &data->fw_completion); in __elan_update_firmware()
532 error = data->ops->get_checksum(client, true, &fw_checksum); in __elan_update_firmware()
545 static int elan_update_firmware(struct elan_tp_data *data, in elan_update_firmware() argument
548 struct i2c_client *client = data->client; in elan_update_firmware()
554 data->in_fw_update = true; in elan_update_firmware()
556 retval = __elan_update_firmware(data, fw); in elan_update_firmware()
559 data->ops->iap_reset(client); in elan_update_firmware()
562 elan_initialize(data); in elan_update_firmware()
563 elan_query_device_info(data); in elan_update_firmware()
566 data->in_fw_update = false; in elan_update_firmware()
582 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_fw_checksum() local
584 return sprintf(buf, "0x%04x\n", data->fw_checksum); in elan_sysfs_read_fw_checksum()
592 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_product_id() local
595 data->product_id); in elan_sysfs_read_product_id()
603 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_fw_ver() local
605 return sprintf(buf, "%d.0\n", data->fw_version); in elan_sysfs_read_fw_ver()
613 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_sm_ver() local
615 return sprintf(buf, "%d.0\n", data->sm_version); in elan_sysfs_read_sm_ver()
623 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_iap_ver() local
625 return sprintf(buf, "%d.0\n", data->iap_version); in elan_sysfs_read_iap_ver()
632 struct elan_tp_data *data = dev_get_drvdata(dev); in elan_sysfs_update_fw() local
639 if (data->fw_validpage_count == 0) in elan_sysfs_update_fw()
643 fw_name = kasprintf(GFP_KERNEL, ETP_FW_NAME, data->product_id); in elan_sysfs_update_fw()
657 /* Firmware file must match signature data */ in elan_sysfs_update_fw()
658 fw_signature = &fw->data[data->fw_signature_address]; in elan_sysfs_update_fw()
667 error = mutex_lock_interruptible(&data->sysfs_mutex); in elan_sysfs_update_fw()
671 error = elan_update_firmware(data, fw); in elan_sysfs_update_fw()
673 mutex_unlock(&data->sysfs_mutex); in elan_sysfs_update_fw()
685 struct elan_tp_data *data = i2c_get_clientdata(client); in calibrate_store() local
691 retval = mutex_lock_interruptible(&data->sysfs_mutex); in calibrate_store()
697 data->mode |= ETP_ENABLE_CALIBRATE; in calibrate_store()
698 retval = data->ops->set_mode(client, data->mode); in calibrate_store()
705 retval = data->ops->calibrate(client); in calibrate_store()
717 retval = data->ops->calibrate_result(client, val); in calibrate_store()
732 data->mode &= ~ETP_ENABLE_CALIBRATE; in calibrate_store()
733 error = data->ops->set_mode(data->client, data->mode); in calibrate_store()
742 mutex_unlock(&data->sysfs_mutex); in calibrate_store()
751 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_sysfs_read_mode() local
755 error = mutex_lock_interruptible(&data->sysfs_mutex); in elan_sysfs_read_mode()
759 error = data->ops->iap_get_mode(data->client, &mode); in elan_sysfs_read_mode()
761 mutex_unlock(&data->sysfs_mutex); in elan_sysfs_read_mode()
799 struct elan_tp_data *data = i2c_get_clientdata(client); in acquire_store() local
803 retval = mutex_lock_interruptible(&data->sysfs_mutex); in acquire_store()
809 data->baseline_ready = false; in acquire_store()
811 data->mode |= ETP_ENABLE_CALIBRATE; in acquire_store()
812 retval = data->ops->set_mode(data->client, data->mode); in acquire_store()
821 retval = data->ops->get_baseline_data(data->client, true, in acquire_store()
822 &data->max_baseline); in acquire_store()
829 retval = data->ops->get_baseline_data(data->client, false, in acquire_store()
830 &data->min_baseline); in acquire_store()
837 data->baseline_ready = true; in acquire_store()
840 data->mode &= ~ETP_ENABLE_CALIBRATE; in acquire_store()
841 error = data->ops->set_mode(data->client, data->mode); in acquire_store()
850 mutex_unlock(&data->sysfs_mutex); in acquire_store()
858 struct elan_tp_data *data = i2c_get_clientdata(client); in min_show() local
861 retval = mutex_lock_interruptible(&data->sysfs_mutex); in min_show()
865 if (!data->baseline_ready) { in min_show()
870 retval = snprintf(buf, PAGE_SIZE, "%d", data->min_baseline); in min_show()
873 mutex_unlock(&data->sysfs_mutex); in min_show()
881 struct elan_tp_data *data = i2c_get_clientdata(client); in max_show() local
884 retval = mutex_lock_interruptible(&data->sysfs_mutex); in max_show()
888 if (!data->baseline_ready) { in max_show()
893 retval = snprintf(buf, PAGE_SIZE, "%d", data->max_baseline); in max_show()
896 mutex_unlock(&data->sysfs_mutex); in max_show()
928 static void elan_report_contact(struct elan_tp_data *data, int contact_num, in elan_report_contact() argument
932 struct input_dev *input = data->input; in elan_report_contact()
945 if (pos_x > data->max_x || pos_y > data->max_y) { in elan_report_contact()
949 data->max_x, data->max_y); in elan_report_contact()
954 scaled_pressure = pressure + data->pressure_adjustment; in elan_report_contact()
961 input_report_abs(input, ABS_MT_POSITION_Y, data->max_y - pos_y); in elan_report_contact()
964 if (data->report_features & ETP_FEATURE_REPORT_MK) { in elan_report_contact()
977 area_x = mk_x * (data->width_x - ETP_FWIDTH_REDUCE); in elan_report_contact()
978 area_y = mk_y * (data->width_y - ETP_FWIDTH_REDUCE); in elan_report_contact()
992 static void elan_report_absolute(struct elan_tp_data *data, u8 *packet, in elan_report_absolute() argument
995 struct input_dev *input = data->input; in elan_report_absolute()
1002 pm_wakeup_event(&data->client->dev, 0); in elan_report_absolute()
1008 elan_report_contact(data, i, contact_valid, high_precision, in elan_report_absolute()
1022 static void elan_report_trackpoint(struct elan_tp_data *data, u8 *report) in elan_report_trackpoint() argument
1024 struct input_dev *input = data->tp_input; in elan_report_trackpoint()
1028 pm_wakeup_event(&data->client->dev, 0); in elan_report_trackpoint()
1030 if (!data->tp_input) { in elan_report_trackpoint()
1031 dev_warn_once(&data->client->dev, in elan_report_trackpoint()
1053 struct elan_tp_data *data = dev_id; in elan_isr() local
1062 if (data->in_fw_update) { in elan_isr()
1063 complete(&data->fw_completion); in elan_isr()
1067 error = data->ops->get_report(data->client, report, data->report_len); in elan_isr()
1073 elan_report_absolute(data, report, false); in elan_isr()
1076 elan_report_absolute(data, report, true); in elan_isr()
1079 elan_report_trackpoint(data, report); in elan_isr()
1082 dev_err(&data->client->dev, "invalid report id data (%x)\n", in elan_isr()
1096 static int elan_setup_trackpoint_input_device(struct elan_tp_data *data) in elan_setup_trackpoint_input_device() argument
1098 struct device *dev = &data->client->dev; in elan_setup_trackpoint_input_device()
1108 input->id.product = data->product_id; in elan_setup_trackpoint_input_device()
1109 input_set_drvdata(input, data); in elan_setup_trackpoint_input_device()
1120 data->tp_input = input; in elan_setup_trackpoint_input_device()
1125 static int elan_setup_input_device(struct elan_tp_data *data) in elan_setup_input_device() argument
1127 struct device *dev = &data->client->dev; in elan_setup_input_device()
1129 unsigned int max_width = max(data->width_x, data->width_y); in elan_setup_input_device()
1130 unsigned int min_width = min(data->width_x, data->width_y); in elan_setup_input_device()
1140 input->id.product = data->product_id; in elan_setup_input_device()
1141 input_set_drvdata(input, data); in elan_setup_input_device()
1152 if (data->clickpad) { in elan_setup_input_device()
1156 if (data->middle_button) in elan_setup_input_device()
1162 input_set_abs_params(input, ABS_X, 0, data->max_x, 0, 0); in elan_setup_input_device()
1163 input_set_abs_params(input, ABS_Y, 0, data->max_y, 0, 0); in elan_setup_input_device()
1164 input_abs_set_res(input, ABS_X, data->x_res); in elan_setup_input_device()
1165 input_abs_set_res(input, ABS_Y, data->y_res); in elan_setup_input_device()
1167 if (data->report_features & ETP_FEATURE_REPORT_MK) in elan_setup_input_device()
1173 input_set_abs_params(input, ABS_MT_POSITION_X, 0, data->max_x, 0, 0); in elan_setup_input_device()
1174 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, data->max_y, 0, 0); in elan_setup_input_device()
1175 input_abs_set_res(input, ABS_MT_POSITION_X, data->x_res); in elan_setup_input_device()
1176 input_abs_set_res(input, ABS_MT_POSITION_Y, data->y_res); in elan_setup_input_device()
1179 if (data->report_features & ETP_FEATURE_REPORT_MK) { in elan_setup_input_device()
1186 data->input = input; in elan_setup_input_device()
1193 struct elan_tp_data *data = _data; in elan_disable_regulator() local
1195 regulator_disable(data->vcc); in elan_disable_regulator()
1203 struct elan_tp_data *data; in elan_probe() local
1221 data = devm_kzalloc(dev, sizeof(struct elan_tp_data), GFP_KERNEL); in elan_probe()
1222 if (!data) in elan_probe()
1225 i2c_set_clientdata(client, data); in elan_probe()
1227 data->ops = transport_ops; in elan_probe()
1228 data->client = client; in elan_probe()
1229 init_completion(&data->fw_completion); in elan_probe()
1230 mutex_init(&data->sysfs_mutex); in elan_probe()
1232 data->vcc = devm_regulator_get(dev, "vcc"); in elan_probe()
1233 if (IS_ERR(data->vcc)) { in elan_probe()
1234 error = PTR_ERR(data->vcc); in elan_probe()
1241 error = regulator_enable(data->vcc); in elan_probe()
1247 error = devm_add_action_or_reset(dev, elan_disable_regulator, data); in elan_probe()
1262 error = elan_initialize(data); in elan_probe()
1266 error = elan_query_device_info(data); in elan_probe()
1270 error = elan_query_device_parameters(data); in elan_probe()
1276 data->product_id, in elan_probe()
1277 data->fw_version, in elan_probe()
1278 data->sm_version, in elan_probe()
1279 data->iap_version); in elan_probe()
1288 data->max_x, data->max_y, in elan_probe()
1289 data->width_x, data->width_y, in elan_probe()
1290 data->x_res, data->y_res, in elan_probe()
1291 data->ic_type, data->pattern); in elan_probe()
1294 error = elan_setup_input_device(data); in elan_probe()
1299 error = elan_setup_trackpoint_input_device(data); in elan_probe()
1315 client->name, data); in elan_probe()
1327 error = input_register_device(data->input); in elan_probe()
1333 if (data->tp_input) { in elan_probe()
1334 error = input_register_device(data->tp_input); in elan_probe()
1356 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_suspend() local
1364 ret = mutex_lock_interruptible(&data->sysfs_mutex); in elan_suspend()
1371 ret = elan_sleep(data); in elan_suspend()
1373 data->irq_wake = (enable_irq_wake(client->irq) == 0); in elan_suspend()
1375 ret = elan_disable_power(data); in elan_suspend()
1378 mutex_unlock(&data->sysfs_mutex); in elan_suspend()
1385 struct elan_tp_data *data = i2c_get_clientdata(client); in elan_resume() local
1388 if (device_may_wakeup(dev) && data->irq_wake) { in elan_resume()
1390 data->irq_wake = false; in elan_resume()
1393 error = elan_enable_power(data); in elan_resume()
1399 error = elan_initialize(data); in elan_resume()
1404 enable_irq(data->client->irq); in elan_resume()