Lines Matching refs:cd

198 static bool goodix_berlin_is_dummy_data(struct goodix_berlin_core *cd,
215 static int goodix_berlin_dev_confirm(struct goodix_berlin_core *cd)
223 error = regmap_raw_write(cd->regmap,
229 error = regmap_raw_read(cd->regmap,
241 dev_err(cd->dev, "device confirm failed, rx_buf: %*ph\n",
247 static int goodix_berlin_power_on(struct goodix_berlin_core *cd)
251 error = regulator_enable(cd->iovdd);
253 dev_err(cd->dev, "Failed to enable iovdd: %d\n", error);
260 error = regulator_enable(cd->avdd);
262 dev_err(cd->dev, "Failed to enable avdd: %d\n", error);
269 gpiod_set_value_cansleep(cd->reset_gpio, 0);
274 error = goodix_berlin_dev_confirm(cd);
284 gpiod_set_value_cansleep(cd->reset_gpio, 1);
285 regulator_disable(cd->avdd);
287 regulator_disable(cd->iovdd);
291 static void goodix_berlin_power_off(struct goodix_berlin_core *cd)
293 gpiod_set_value_cansleep(cd->reset_gpio, 1);
294 regulator_disable(cd->avdd);
295 regulator_disable(cd->iovdd);
298 static int goodix_berlin_read_version(struct goodix_berlin_core *cd)
302 error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_FW_VERSION_INFO_ADDR,
303 &cd->fw_version, sizeof(cd->fw_version));
305 dev_err(cd->dev, "error reading fw version, %d\n", error);
309 if (!goodix_berlin_checksum_valid((u8 *)&cd->fw_version,
310 sizeof(cd->fw_version))) {
311 dev_err(cd->dev, "invalid fw version: checksum error\n");
319 static int goodix_berlin_parse_ic_info(struct goodix_berlin_core *cd,
349 cd->touch_data_addr = le32_to_cpu(misc->touch_data_addr);
354 dev_err(cd->dev, "ic_info length is invalid (offset %d length %d)\n",
359 static int goodix_berlin_get_ic_info(struct goodix_berlin_core *cd)
370 error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_IC_INFO_ADDR,
373 dev_err(cd->dev, "failed get ic info length, %d\n", error);
379 dev_err(cd->dev, "invalid ic info length %d\n", length);
383 error = regmap_raw_read(cd->regmap, GOODIX_BERLIN_IC_INFO_ADDR,
386 dev_err(cd->dev, "failed get ic info data, %d\n", error);
391 if (goodix_berlin_is_dummy_data(cd, afe_data, length)) {
392 dev_err(cd->dev, "fw info data invalid\n");
397 dev_err(cd->dev, "fw info checksum error\n");
401 error = goodix_berlin_parse_ic_info(cd, afe_data, length);
406 if (!cd->touch_data_addr) {
407 dev_err(cd->dev, "touch_data_addr is null\n");
414 static int goodix_berlin_get_remaining_contacts(struct goodix_berlin_core *cd,
419 u32 addr = cd->touch_data_addr + GOODIX_BERLIN_HEADER_SIZE + offset;
422 error = regmap_raw_read(cd->regmap, addr,
423 &cd->event.data[offset],
426 dev_err_ratelimited(cd->dev, "failed to get touch data, %d\n",
434 static void goodix_berlin_report_state(struct goodix_berlin_core *cd, int n)
437 (struct goodix_berlin_touch *)cd->event.data;
448 dev_warn_once(cd->dev, "Stylus event type not handled\n");
454 dev_warn_ratelimited(cd->dev, "invalid finger id %d\n", id);
458 input_mt_slot(cd->input_dev, id);
459 input_mt_report_slot_state(cd->input_dev, MT_TOOL_FINGER, true);
461 touchscreen_report_pos(cd->input_dev, &cd->props,
464 input_report_abs(cd->input_dev, ABS_MT_TOUCH_MAJOR,
468 input_mt_sync_frame(cd->input_dev);
469 input_sync(cd->input_dev);
472 static void goodix_berlin_touch_handler(struct goodix_berlin_core *cd)
478 cd->event.hdr.request_type);
480 dev_warn(cd->dev, "invalid touch num %d\n", touch_num);
486 error = goodix_berlin_get_remaining_contacts(cd, touch_num);
494 if (!goodix_berlin_checksum_valid(cd->event.data, len)) {
495 dev_err(cd->dev, "touch data checksum error: %*ph\n",
496 len, cd->event.data);
501 goodix_berlin_report_state(cd, touch_num);
504 static int goodix_berlin_request_handle_reset(struct goodix_berlin_core *cd)
506 gpiod_set_value_cansleep(cd->reset_gpio, 1);
508 gpiod_set_value_cansleep(cd->reset_gpio, 0);
517 struct goodix_berlin_core *cd = data;
555 error = regmap_raw_read(cd->regmap, cd->touch_data_addr,
556 &cd->event,
561 dev_warn_ratelimited(cd->dev,
566 if (cd->event.hdr.status == 0)
569 if (!goodix_berlin_checksum_valid((u8 *)&cd->event.hdr,
571 dev_warn_ratelimited(cd->dev,
574 &cd->event.hdr);
578 if (cd->event.hdr.status & GOODIX_BERLIN_TOUCH_EVENT)
579 goodix_berlin_touch_handler(cd);
581 if (cd->event.hdr.status & GOODIX_BERLIN_REQUEST_EVENT) {
582 switch (cd->event.hdr.request_type) {
584 if (cd->reset_gpio)
585 goodix_berlin_request_handle_reset(cd);
589 dev_warn(cd->dev, "unsupported request code 0x%x\n",
590 cd->event.hdr.request_type);
597 regmap_write(cd->regmap, cd->touch_data_addr, 0);
603 static int goodix_berlin_input_dev_config(struct goodix_berlin_core *cd,
609 input_dev = devm_input_allocate_device(cd->dev);
613 cd->input_dev = input_dev;
614 input_set_drvdata(input_dev, cd);
621 input_set_abs_params(cd->input_dev, ABS_MT_POSITION_X,
623 input_set_abs_params(cd->input_dev, ABS_MT_POSITION_Y,
625 input_set_abs_params(cd->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
627 touchscreen_parse_properties(cd->input_dev, true, &cd->props);
629 error = input_mt_init_slots(cd->input_dev, GOODIX_BERLIN_MAX_TOUCH,
634 error = input_register_device(cd->input_dev);
643 struct goodix_berlin_core *cd = dev_get_drvdata(dev);
645 disable_irq(cd->irq);
646 goodix_berlin_power_off(cd);
653 struct goodix_berlin_core *cd = dev_get_drvdata(dev);
656 error = goodix_berlin_power_on(cd);
660 enable_irq(cd->irq);
670 struct goodix_berlin_core *cd = data;
672 goodix_berlin_power_off(cd);
678 struct goodix_berlin_core *cd;
686 cd = devm_kzalloc(dev, sizeof(*cd), GFP_KERNEL);
687 if (!cd)
690 cd->dev = dev;
691 cd->regmap = regmap;
692 cd->irq = irq;
694 cd->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
695 if (IS_ERR(cd->reset_gpio))
696 return dev_err_probe(dev, PTR_ERR(cd->reset_gpio),
699 cd->avdd = devm_regulator_get(dev, "avdd");
700 if (IS_ERR(cd->avdd))
701 return dev_err_probe(dev, PTR_ERR(cd->avdd),
704 cd->iovdd = devm_regulator_get(dev, "iovdd");
705 if (IS_ERR(cd->iovdd))
706 return dev_err_probe(dev, PTR_ERR(cd->iovdd),
709 error = goodix_berlin_power_on(cd);
715 error = devm_add_action_or_reset(dev, goodix_berlin_power_off_act, cd);
719 error = goodix_berlin_read_version(cd);
725 error = goodix_berlin_get_ic_info(cd);
731 error = goodix_berlin_input_dev_config(cd, id);
737 error = devm_request_threaded_irq(dev, cd->irq, NULL, goodix_berlin_irq,
738 IRQF_ONESHOT, "goodix-berlin", cd);
744 dev_set_drvdata(dev, cd);
747 cd->fw_version.patch_pid);