summaryrefslogtreecommitdiff
path: root/syna_tcm2.c
diff options
context:
space:
mode:
authordavidycchen <davidycchen@google.com>2021-11-25 15:51:31 +0800
committerdavidycchen <davidycchen@google.com>2021-11-26 11:34:59 +0800
commit8d731b8cfb5a2733598b04ea7e69ccddcbee9416 (patch)
tree2b11b2ed425fe439d00d42080aeee8fcaddbe779 /syna_tcm2.c
parent4ad4a9cf451d4d4c68e981a7c4c53d9a3b5aa13f (diff)
downloadsynaptics_touch-8d731b8cfb5a2733598b04ea7e69ccddcbee9416.tar.gz
synaptics: support to get touch raw data from sysfs node
Bug: 199104466 Test: cd /sys/class/spi_master/spi0/spi0.0/synaptics_tcm.0/sysfs echo 12 > get_raw_data; cat get_raw_data Signed-off-by: davidycchen <davidycchen@google.com> Change-Id: If6d2bed19af2b069439bea444ce21e4e923b5fff
Diffstat (limited to 'syna_tcm2.c')
-rw-r--r--syna_tcm2.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/syna_tcm2.c b/syna_tcm2.c
index 0aa0f18..d70803c 100644
--- a/syna_tcm2.c
+++ b/syna_tcm2.c
@@ -631,6 +631,7 @@ static irqreturn_t syna_dev_interrupt_thread(int irq, void *data)
unsigned char code = 0;
struct syna_tcm *tcm = data;
struct syna_hw_attn_data *attn = &tcm->hw_if->bdata_attn;
+ struct tcm_dev *tcm_dev = tcm->tcm_dev;
/* It is possible that interrupts were disabled while the handler is
* executing, before acquiring the mutex. If so, simply return.
@@ -682,6 +683,25 @@ static irqreturn_t syna_dev_interrupt_thread(int irq, void *data)
}
/* forward the touch event to system */
syna_dev_report_input_events(tcm);
+ } else if (code == tcm->raw_data_report_code) {
+ if (!tcm->raw_data_buffer) {
+ tcm->raw_data_buffer = kmalloc(
+ sizeof(u16) * (tcm_dev->rows * tcm_dev->cols +
+ tcm_dev->rows + tcm_dev->cols),
+ GFP_KERNEL);
+ if (!tcm->raw_data_buffer) {
+ LOGE("Allocate raw_data_buffer failed\n");
+ goto exit;
+ }
+ }
+ if (tcm->event_data.data_length == sizeof(u16) * (tcm_dev->rows * tcm_dev->cols +
+ tcm_dev->rows + tcm_dev->cols)) {
+ memcpy(tcm->raw_data_buffer, tcm->event_data.buf,
+ tcm->event_data.data_length);
+ complete_all(&tcm->raw_data_completion);
+ } else {
+ LOGE("Raw data length: %d is incorrect.\n", tcm->event_data.data_length);
+ }
}
exit:
@@ -1810,6 +1830,10 @@ static int syna_dev_probe(struct platform_device *pdev)
}
#endif
+ tcm->raw_data_report_code = 0;
+ init_completion(&tcm->raw_data_completion);
+ complete_all(&tcm->raw_data_completion);
+
#ifdef HAS_SYSFS_INTERFACE
/* create the device file and register to char device classes */
retval = syna_cdev_create_sysfs(tcm, pdev);
@@ -1893,6 +1917,9 @@ static int syna_dev_remove(struct platform_device *pdev)
return 0;
}
+ if (tcm->raw_data_buffer)
+ kfree(tcm->raw_data_buffer);
+
#if defined(USE_DRM_BRIDGE)
syna_unregister_panel_bridge(&tcm->panel_bridge);
#elif defined(ENABLE_DISP_NOTIFIER)