diff options
author | davidycchen <davidycchen@google.com> | 2021-11-25 15:51:31 +0800 |
---|---|---|
committer | davidycchen <davidycchen@google.com> | 2021-11-26 11:34:59 +0800 |
commit | 8d731b8cfb5a2733598b04ea7e69ccddcbee9416 (patch) | |
tree | 2b11b2ed425fe439d00d42080aeee8fcaddbe779 /syna_tcm2.c | |
parent | 4ad4a9cf451d4d4c68e981a7c4c53d9a3b5aa13f (diff) | |
download | synaptics_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.c | 27 |
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) |