Lines Matching full:ts

112 static void *goodix_get_event_report(struct goodix_ts_data *ts, u32 addr,  in goodix_get_event_report()  argument
115 struct spi_device *spi = to_spi_device(&ts->spi->dev); in goodix_get_event_report()
133 dev_err(ts->dev, "spi transfer error: %d", error); in goodix_get_event_report()
140 static int goodix_spi_read(struct goodix_ts_data *ts, u32 addr, in goodix_spi_read() argument
143 struct spi_device *spi = to_spi_device(&ts->spi->dev); in goodix_spi_read()
148 if (GOODIX_SPI_READ_PREFIX_LEN + len > sizeof(ts->xfer_buf)) { in goodix_spi_read()
149 dev_err(ts->dev, "read data len exceed limit %zu", in goodix_spi_read()
150 sizeof(ts->xfer_buf) - GOODIX_SPI_READ_PREFIX_LEN); in goodix_spi_read()
155 ts->xfer_buf[0] = GOODIX_SPI_READ_FLAG; in goodix_spi_read()
156 put_unaligned_be32(addr, ts->xfer_buf + GOODIX_SPI_TRANS_PREFIX_LEN); in goodix_spi_read()
160 xfers.tx_buf = ts->xfer_buf; in goodix_spi_read()
161 xfers.rx_buf = ts->xfer_buf; in goodix_spi_read()
167 dev_err(ts->dev, "spi transfer error: %d", error); in goodix_spi_read()
169 memcpy(data, ts->xfer_buf + GOODIX_SPI_READ_PREFIX_LEN, len); in goodix_spi_read()
174 static int goodix_spi_write(struct goodix_ts_data *ts, u32 addr, in goodix_spi_write() argument
177 struct spi_device *spi = to_spi_device(&ts->spi->dev); in goodix_spi_write()
182 if (GOODIX_SPI_WRITE_PREFIX_LEN + len > sizeof(ts->xfer_buf)) { in goodix_spi_write()
183 dev_err(ts->dev, "write data len exceed limit %zu", in goodix_spi_write()
184 sizeof(ts->xfer_buf) - GOODIX_SPI_WRITE_PREFIX_LEN); in goodix_spi_write()
189 ts->xfer_buf[0] = GOODIX_SPI_WRITE_FLAG; in goodix_spi_write()
190 put_unaligned_be32(addr, ts->xfer_buf + GOODIX_SPI_TRANS_PREFIX_LEN); in goodix_spi_write()
191 memcpy(ts->xfer_buf + GOODIX_SPI_WRITE_PREFIX_LEN, data, len); in goodix_spi_write()
195 xfers.tx_buf = ts->xfer_buf; in goodix_spi_write()
201 dev_err(ts->dev, "spi transfer error: %d", error); in goodix_spi_write()
206 static int goodix_dev_confirm(struct goodix_ts_data *ts) in goodix_dev_confirm() argument
212 gpiod_set_value_cansleep(ts->reset_gpio, 0); in goodix_dev_confirm()
217 error = goodix_spi_write(ts, GOODIX_DEV_CONFIRM_ADDR, in goodix_dev_confirm()
222 error = goodix_spi_read(ts, GOODIX_DEV_CONFIRM_ADDR, in goodix_dev_confirm()
233 dev_err(ts->dev, "device confirm failed, rx_buf: %*ph", 8, rx_buf); in goodix_dev_confirm()
247 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_parse() local
251 rsize = le16_to_cpu(ts->hid_desc.report_desc_length); in goodix_hid_parse()
253 dev_err(ts->dev, "invalid report desc size, %d", rsize); in goodix_hid_parse()
261 error = goodix_spi_read(ts, GOODIX_HID_REPORT_DESC_ADDR, rdesc, rsize); in goodix_hid_parse()
263 dev_err(ts->dev, "failed get report desc, %d", error); in goodix_hid_parse()
269 dev_err(ts->dev, "failed parse report, %d", error); in goodix_hid_parse()
297 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_start() local
307 if (report_size <= ts->hid_max_event_sz) in goodix_hid_start()
310 ts->event_buf = devm_krealloc(ts->dev, ts->event_buf, in goodix_hid_start()
312 if (!ts->event_buf) in goodix_hid_start()
315 ts->hid_max_event_sz = report_size; in goodix_hid_start()
326 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_open() local
328 set_bit(GOODIX_HID_STARTED, &ts->flags); in goodix_hid_open()
334 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_close() local
336 clear_bit(GOODIX_HID_STARTED, &ts->flags); in goodix_hid_close()
340 static int goodix_hid_check_ack_status(struct goodix_ts_data *ts, u32 *resp_len) in goodix_hid_check_ack_status() argument
353 error = goodix_spi_read(ts, GOODIX_HID_CMD_ADDR, in goodix_hid_check_ack_status()
358 dev_err(ts->dev, "hrd.size too short: %d", len); in goodix_hid_check_ack_status()
391 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_get_raw_report() local
392 u16 data_register = le16_to_cpu(ts->hid_desc.data_register); in goodix_hid_get_raw_report()
393 u16 cmd_register = le16_to_cpu(ts->hid_desc.cmd_register); in goodix_hid_get_raw_report()
405 error = goodix_spi_read(ts, GOODIX_HID_SIGN_ADDR, buf, len); in goodix_hid_get_raw_report()
407 dev_err(ts->dev, "failed get win8 sign: %d", error); in goodix_hid_get_raw_report()
436 error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, tmp_buf, tx_len); in goodix_hid_get_raw_report()
438 dev_err(ts->dev, "failed send read feature cmd, %d", error); in goodix_hid_get_raw_report()
447 error = goodix_hid_check_ack_status(ts, &response_data_len); in goodix_hid_get_raw_report()
456 error = goodix_spi_read(ts, GOODIX_HID_CMD_ADDR + in goodix_hid_get_raw_report()
460 dev_err(ts->dev, "failed read hid response data, %d", error); in goodix_hid_get_raw_report()
465 dev_err(ts->dev, "incorrect report (%d vs %d expected)", in goodix_hid_get_raw_report()
491 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_set_raw_report() local
492 u16 data_register = le16_to_cpu(ts->hid_desc.data_register); in goodix_hid_set_raw_report()
493 u16 cmd_register = le16_to_cpu(ts->hid_desc.cmd_register); in goodix_hid_set_raw_report()
526 error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, tmp_buf, tx_len); in goodix_hid_set_raw_report()
528 dev_err(ts->dev, "failed send report: %*ph", tx_len, tmp_buf); in goodix_hid_set_raw_report()
539 struct goodix_ts_data *ts = hid->driver_data; in goodix_hid_raw_request() local
542 guard(mutex)(&ts->hid_request_lock); in goodix_hid_raw_request()
571 struct goodix_ts_data *ts = data; in goodix_hid_irq() local
576 if (!test_bit(GOODIX_HID_STARTED, &ts->flags)) in goodix_hid_irq()
587 event = goodix_get_event_report(ts, ts->hid_report_addr, ts->event_buf, in goodix_hid_irq()
591 dev_err(ts->dev, "failed get coordinate data"); in goodix_hid_irq()
601 dev_err(ts->dev, "invalid coordinate event package size, %d", in goodix_hid_irq()
605 hid_input_report(ts->hid, HID_INPUT_REPORT, pkg->data, in goodix_hid_irq()
613 if (report_size >= ts->hid_max_event_sz) { in goodix_hid_irq()
614 dev_err(ts->dev, "package size exceed limit %d vs %d", in goodix_hid_irq()
615 report_size, ts->hid_max_event_sz); in goodix_hid_irq()
620 pkg = goodix_get_event_report(ts, ts->hid_report_addr + sizeof(*event), in goodix_hid_irq()
621 ts->event_buf, in goodix_hid_irq()
624 dev_err(ts->dev, "failed read attachment data content"); in goodix_hid_irq()
628 hid_input_report(ts->hid, HID_INPUT_REPORT, pkg->data, in goodix_hid_irq()
634 static int goodix_hid_init(struct goodix_ts_data *ts) in goodix_hid_init() argument
640 error = goodix_spi_read(ts, GOODIX_HID_DESC_ADDR, &ts->hid_desc, in goodix_hid_init()
641 sizeof(ts->hid_desc)); in goodix_hid_init()
643 dev_err(ts->dev, "failed get hid desc, %d", error); in goodix_hid_init()
651 hid->driver_data = ts; in goodix_hid_init()
654 hid->dev.parent = &ts->spi->dev; in goodix_hid_init()
656 hid->version = le16_to_cpu(ts->hid_desc.bcd_version); in goodix_hid_init()
657 hid->vendor = le16_to_cpu(ts->hid_desc.vendor_id); in goodix_hid_init()
658 hid->product = le16_to_cpu(ts->hid_desc.product_id); in goodix_hid_init()
664 dev_err(ts->dev, "failed add hid device, %d", error); in goodix_hid_init()
669 ts->hid = hid; in goodix_hid_init()
676 struct goodix_ts_data *ts; in goodix_spi_probe() local
686 ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); in goodix_spi_probe()
687 if (!ts) in goodix_spi_probe()
690 mutex_init(&ts->hid_request_lock); in goodix_spi_probe()
691 spi_set_drvdata(spi, ts); in goodix_spi_probe()
692 ts->spi = spi; in goodix_spi_probe()
693 ts->dev = dev; in goodix_spi_probe()
694 ts->hid_max_event_sz = GOODIX_SPI_READ_PREFIX_LEN + in goodix_spi_probe()
696 ts->event_buf = devm_kmalloc(dev, ts->hid_max_event_sz, GFP_KERNEL); in goodix_spi_probe()
697 if (!ts->event_buf) in goodix_spi_probe()
700 ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); in goodix_spi_probe()
701 if (IS_ERR(ts->reset_gpio)) in goodix_spi_probe()
702 return dev_err_probe(dev, PTR_ERR(ts->reset_gpio), in goodix_spi_probe()
705 ts->hid_report_addr = GOODIX_HID_REPORT_ADDR; in goodix_spi_probe()
706 error = goodix_dev_confirm(ts); in goodix_spi_probe()
713 error = goodix_hid_init(ts); in goodix_spi_probe()
719 error = devm_request_threaded_irq(&ts->spi->dev, ts->spi->irq, in goodix_spi_probe()
721 "goodix_spi_hid", ts); in goodix_spi_probe()
723 dev_err(ts->dev, "could not register interrupt, irq = %d, %d", in goodix_spi_probe()
724 ts->spi->irq, error); in goodix_spi_probe()
731 hid_destroy_device(ts->hid); in goodix_spi_probe()
737 struct goodix_ts_data *ts = spi_get_drvdata(spi); in goodix_spi_remove() local
740 hid_destroy_device(ts->hid); in goodix_spi_remove()
743 static int goodix_spi_set_power(struct goodix_ts_data *ts, int power_state) in goodix_spi_set_power() argument
751 guard(mutex)(&ts->hid_request_lock); in goodix_spi_set_power()
752 error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, power_control_cmd, in goodix_spi_set_power()
755 dev_err(ts->dev, "failed set power mode: %s", in goodix_spi_set_power()
764 struct goodix_ts_data *ts = dev_get_drvdata(dev); in goodix_spi_suspend() local
766 disable_irq(ts->spi->irq); in goodix_spi_suspend()
767 return goodix_spi_set_power(ts, GOODIX_SPI_POWER_SLEEP); in goodix_spi_suspend()
772 struct goodix_ts_data *ts = dev_get_drvdata(dev); in goodix_spi_resume() local
774 enable_irq(ts->spi->irq); in goodix_spi_resume()
775 return goodix_spi_set_power(ts, GOODIX_SPI_POWER_ON); in goodix_spi_resume()