1 /*
2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "hdf_touch.h"
10 #include "gpio_if.h"
11 #include "hdf_device_desc.h"
12 #include "hdf_log.h"
13 #include "hdf_pm.h"
14 #include "osal_mem.h"
15 #include "osal_io.h"
16 #include "event_hub.h"
17 #include "input_i2c_ops.h"
18
19 #if defined(CONFIG_ARCH_ROCKCHIP)
20 #include <linux/hrtimer.h>
21 #include <linux/string.h>
22 #include <linux/jiffies.h>
23 #include <linux/time.h>
24 #include <linux/sched.h>
25 #include <linux/kthread.h>
26 #endif
27
28 #define I2C_TYPE 0
29 #define SPI_TYPE 1
30 #define MAX_TOUCH_DEVICE 5
31 #define REGISTER_BYTE_SIZE 4
32 #define TOUCH_CHIP_NAME_LEN 10
33
34 #if defined(CONFIG_ARCH_ROCKCHIP)
35 #define GTP_ESD_PROTECT 1
36 #define GTP_REG_CMD 0x8040
37 #define GTP_REG_CMD_1 0x8041
38 #endif
39
40 static TouchDriver *g_touchDriverList[MAX_TOUCH_DEVICE];
41 static void InputFrameReport(TouchDriver *driver);
42 static int32_t ChipCheckResetRetry(ChipDevice *chipDev);
43
SetGpioDirAndLevel(int gpio,int dir,int level)44 static int32_t SetGpioDirAndLevel(int gpio, int dir, int level)
45 {
46 int32_t ret;
47 if ((dir == GPIO_DIR_IN) || (dir == GPIO_DIR_OUT)) {
48 ret = GpioSetDir(gpio, dir);
49 if (ret != HDF_SUCCESS) {
50 HDF_LOGE("%s: set gpio%d to %d dir failed, ret %d", __func__, gpio, dir, ret);
51 return HDF_FAILURE;
52 }
53 }
54
55 if ((level == GPIO_VAL_LOW) || (level == GPIO_VAL_HIGH)) {
56 ret = GpioWrite(gpio, level);
57 if (ret != HDF_SUCCESS) {
58 HDF_LOGE("%s: pull gpio%d to %d level failed, ret %d", __func__, gpio, level, ret);
59 return HDF_FAILURE;
60 }
61 }
62 return HDF_SUCCESS;
63 }
64
SetVccPower(uint32_t status)65 static int32_t SetVccPower(uint32_t status)
66 {
67 (void)status;
68 return HDF_SUCCESS;
69 }
70
SetVciPower(uint32_t status)71 static int32_t SetVciPower(uint32_t status)
72 {
73 (void)status;
74 return HDF_SUCCESS;
75 }
76
SetGpio(uint16_t gpio,uint32_t dir,uint32_t status)77 static int32_t SetGpio(uint16_t gpio, uint32_t dir, uint32_t status)
78 {
79 int32_t ret = SetGpioDirAndLevel(gpio, dir, status);
80 CHECK_RETURN_VALUE(ret);
81 return HDF_SUCCESS;
82 }
83
HandleResetEvent(ChipDevice * chipDev,uint32_t * timing,uint32_t length)84 static int32_t HandleResetEvent(ChipDevice *chipDev, uint32_t *timing, uint32_t length)
85 {
86 int32_t ret = 0;
87 uint16_t gpio;
88
89 if (length <= PWR_DELAY_INDEX) {
90 HDF_LOGE("%s: invalid param", __func__);
91 return HDF_FAILURE;
92 }
93 uint32_t type = timing[PWR_TYPE_INDEX];
94 uint32_t status = timing[PWR_STATUS_INDEX];
95 uint32_t dir = timing[PWR_DIR_INDEX];
96 uint32_t delay = timing[PWR_DELAY_INDEX];
97 HDF_LOGD("%s: type = %u, status = %u, dir = %u, delay = %u", __func__, type, status, dir, delay);
98
99 switch (type) {
100 case TYPE_VCC:
101 case TYPE_VCI:
102 break;
103 case TYPE_INT:
104 gpio = chipDev->boardCfg->pins.intGpio;
105 ret = SetGpio(gpio, dir, status);
106 break;
107 case TYPE_RESET:
108 gpio = chipDev->boardCfg->pins.rstGpio;
109 ret = SetGpio(gpio, dir, status);
110 break;
111 default:
112 HDF_LOGE("%s: unknown power type", __func__);
113 break;
114 }
115 if (delay > 0) {
116 OsalMSleep(delay);
117 }
118 return ret;
119 }
120
HandlePowerEvent(ChipDevice * chipDev,uint32_t * timing,uint32_t length)121 static int32_t HandlePowerEvent(ChipDevice *chipDev, uint32_t *timing, uint32_t length)
122 {
123 int32_t ret = 0;
124 uint16_t gpio;
125
126 if (length <= PWR_DELAY_INDEX) {
127 HDF_LOGE("%s: invalid param", __func__);
128 return HDF_FAILURE;
129 }
130 uint32_t type = timing[PWR_TYPE_INDEX];
131 uint32_t status = timing[PWR_STATUS_INDEX];
132 uint32_t dir = timing[PWR_DIR_INDEX];
133 uint32_t delay = timing[PWR_DELAY_INDEX];
134 HDF_LOGD("%s: type = %u, status = %u, dir = %u, delay = %u", __func__, type, status, dir, delay);
135
136 switch (type) {
137 case TYPE_VCC:
138 ret = SetVccPower(status);
139 break;
140 case TYPE_VCI:
141 ret = SetVciPower(status);
142 break;
143 case TYPE_RESET:
144 gpio = chipDev->boardCfg->pins.rstGpio;
145 ret = SetGpio(gpio, dir, status);
146 break;
147 case TYPE_INT:
148 gpio = chipDev->boardCfg->pins.intGpio;
149 ret = SetGpio(gpio, dir, status);
150 break;
151 default:
152 HDF_LOGE("%s: unknown power type", __func__);
153 break;
154 }
155 if (delay > 0) {
156 OsalMSleep(delay);
157 }
158 return ret;
159 }
160
InputPinMuxCfg(uint32_t regAddr,int32_t regSize,uint32_t regValue)161 static int32_t InputPinMuxCfg(uint32_t regAddr, int32_t regSize, uint32_t regValue)
162 {
163 #if defined(CONFIG_ARCH_SPRD) || defined(CONFIG_ARCH_ROCKCHIP)
164 return HDF_SUCCESS;
165 #endif
166 uint8_t *base = NULL;
167 if (regAddr == 0) {
168 HDF_LOGE("%s: regAddr invalid", __func__);
169 return HDF_FAILURE;
170 }
171
172 base = OsalIoRemap(regAddr, regSize);
173 if (base == NULL) {
174 HDF_LOGE("%s: ioremap failed", __func__);
175 return HDF_FAILURE;
176 }
177
178 OSAL_WRITEL(regValue, base);
179 OsalIoUnmap((void *)base);
180 return HDF_SUCCESS;
181 }
182
183 #if defined(CONFIG_ARCH_ROCKCHIP)
SetResetStatus(TouchDriver * driver)184 static int32_t SetResetStatus(TouchDriver *driver)
185 {
186 int32_t ret;
187 uint8_t writeBuf[5]; // 5: buffer size
188
189 writeBuf[0] = (GTP_REG_CMD_1 >> 8) & 0xFF; // 8:high byte 0xff:mask
190 writeBuf[1] = GTP_REG_CMD_1 & 0xFF;
191 writeBuf[2] = 0x00; // 2:index 0x00: reg value
192 writeBuf[3] = 0x56; // 3:index 0x56: reg value
193 writeBuf[4] = 0xAA; // 4:index 0xAA: reg value
194 ret = InputI2cWrite(&driver->i2cClient, writeBuf, 5); // 5: buffer size
195 if (ret != HDF_SUCCESS) {
196 HDF_LOGE("%s: InputI2cWrite failed, ret = %d", __func__, ret);
197 return ret;
198 }
199
200 writeBuf[0] = (GTP_REG_CMD >> 8) & 0xFF; // 8:high byte 0xff:mask
201 writeBuf[1] = GTP_REG_CMD & 0xFF;
202 writeBuf[2] = 0xAA; // 2:index 0xAA: reg value
203
204 ret = InputI2cWrite(&driver->i2cClient, writeBuf, 3); // 3: buffer size
205 if (ret != HDF_SUCCESS) {
206 HDF_LOGE("%s: InputI2cWrite failed, ret = %d", __func__, ret);
207 return ret;
208 }
209
210 return HDF_SUCCESS;
211 }
212 #endif
213
SetPowerOnTiming(ChipDevice * chipDev,bool enableRst)214 static int32_t SetPowerOnTiming(ChipDevice *chipDev, bool enableRst)
215 {
216 int32_t i;
217 int32_t ret;
218 uint32_t rstPinAddr;
219 uint32_t rstPinValue;
220 uint32_t intPinAddr;
221 uint32_t intPinValue;
222 SeqArray pwrOnTiming = {0};
223 TouchDriver *driver = chipDev->driver;
224
225 rstPinAddr = driver->boardCfg->pins.rstPinReg[0];
226 rstPinValue = driver->boardCfg->pins.rstPinReg[1];
227 intPinAddr = driver->boardCfg->pins.intPinReg[0];
228 intPinValue = driver->boardCfg->pins.intPinReg[1];
229
230 if (InputPinMuxCfg(rstPinAddr, REGISTER_BYTE_SIZE, rstPinValue) != HDF_SUCCESS) {
231 return HDF_FAILURE;
232 }
233
234 if (InputPinMuxCfg(intPinAddr, REGISTER_BYTE_SIZE, intPinValue) != HDF_SUCCESS) {
235 return HDF_FAILURE;
236 }
237 HDF_LOGD("%s: rstPinAddr = 0x%x, rstPinValue = 0x%x, intPinAddr = 0x%x, intPinValue = 0x%x",
238 __func__, rstPinAddr, rstPinValue, intPinAddr, intPinValue);
239
240 ret = memcpy_s(&pwrOnTiming, sizeof(SeqArray), &chipDev->chipCfg->pwrSeq.pwrOn, sizeof(SeqArray));
241 if (ret != EOK) {
242 HDF_LOGE("%s: memcpy_s failed", __func__);
243 return HDF_FAILURE;
244 }
245
246 if ((pwrOnTiming.buf == NULL) || (pwrOnTiming.count == 0)) {
247 HDF_LOGE("%s: pwrOnTiming config is invalid", __func__);
248 return HDF_FAILURE;
249 }
250
251 for (i = 0; i < pwrOnTiming.count / PWR_CELL_LEN; i++) {
252 if (enableRst) {
253 ret = HandleResetEvent(chipDev, pwrOnTiming.buf, PWR_CELL_LEN);
254 } else {
255 ret = HandlePowerEvent(chipDev, pwrOnTiming.buf, PWR_CELL_LEN);
256 }
257 CHECK_RETURN_VALUE(ret);
258 pwrOnTiming.buf = pwrOnTiming.buf + PWR_CELL_LEN;
259 }
260 #if defined(CONFIG_ARCH_ROCKCHIP)
261 ret = SetResetStatus(driver);
262 if (ret != HDF_SUCCESS) {
263 HDF_LOGE("%s: SetResetStatus failed", __func__);
264 }
265 #endif
266 return HDF_SUCCESS;
267 }
268
EventHandle(TouchDriver * driver,ChipDevice * chipDev)269 static void EventHandle(TouchDriver *driver, ChipDevice *chipDev)
270 {
271 int32_t ret;
272 if ((chipDev->ops == NULL) || (chipDev->ops->DataHandle == NULL)) {
273 return;
274 }
275
276 ret = chipDev->ops->DataHandle(chipDev);
277 if (ret == HDF_SUCCESS) {
278 InputFrameReport(driver);
279 } else {
280 HDF_LOGE("%s: DataHandle failed", __func__);
281 }
282 }
283
IrqHandle(uint16_t intGpioNum,void * data)284 static int32_t IrqHandle(uint16_t intGpioNum, void *data)
285 {
286 TouchDriver *driver = (TouchDriver *)data;
287 int ret = GpioDisableIrq(intGpioNum);
288 if (ret != HDF_SUCCESS) {
289 HDF_LOGE("%s: disable irq failed, ret %d", __func__, ret);
290 return HDF_FAILURE;
291 }
292
293 EventHandle(driver, driver->device);
294
295 ret = GpioEnableIrq(intGpioNum);
296 if (ret != HDF_SUCCESS) {
297 HDF_LOGE("%s: enable irq failed, ret %d", __func__, ret);
298 return HDF_FAILURE;
299 }
300 return HDF_SUCCESS;
301 }
302
InputFrameReport(TouchDriver * driver)303 static void InputFrameReport(TouchDriver *driver)
304 {
305 InputDevice *dev = driver->inputDev;
306 FrameData *frame = &driver->frameData;
307 int32_t i;
308
309 OsalMutexLock(&driver->mutex);
310 for (i = 0; i < MAX_FINGERS_NUM; i++) {
311 if (frame->fingers[i].valid) {
312 input_report_abs(dev, ABS_MT_POSITION_X, frame->fingers[i].x);
313 input_report_abs(dev, ABS_MT_POSITION_Y, frame->fingers[i].y);
314 input_report_abs(dev, ABS_MT_TRACKING_ID, frame->fingers[i].trackId);
315 input_mt_sync(dev);
316 }
317 }
318
319 if ((frame->definedEvent == TOUCH_DOWN) || (frame->definedEvent == TOUCH_CONTACT)) {
320 input_report_key(dev, BTN_TOUCH, 1); // BTN_TOUCH DOWN
321 } else {
322 input_report_key(dev, BTN_TOUCH, 0); // BTN_TOUCH UP
323 }
324 OsalMutexUnlock(&driver->mutex);
325 input_sync(dev);
326 }
327
SetupChipIrq(ChipDevice * chipDev)328 static int32_t SetupChipIrq(ChipDevice *chipDev)
329 {
330 int32_t ret;
331 uint16_t intGpioNum = chipDev->boardCfg->pins.intGpio;
332 uint16_t irqFlag = chipDev->chipCfg->bus.chipI2c.irqFlag;
333
334 if (chipDev->driver == NULL) {
335 HDF_LOGE("%s: invalid param", __func__);
336 return HDF_FAILURE;
337 }
338 irqFlag |= GPIO_IRQ_USING_THREAD;
339 HDF_LOGD("%s: gpioNum = %u, irqFlag = %u", __func__, intGpioNum, irqFlag);
340 ret = GpioSetIrq(intGpioNum, irqFlag, IrqHandle, chipDev->driver);
341 if (ret != 0) {
342 HDF_LOGE("%s: register irq failed, ret %d", __func__, ret);
343 return ret;
344 }
345
346 ret = GpioEnableIrq(intGpioNum);
347 if (ret != HDF_SUCCESS) {
348 HDF_LOGE("%s: enable irq failed, ret %d", __func__, ret);
349 return HDF_FAILURE;
350 }
351 return HDF_SUCCESS;
352 }
353
ChipReset(ChipDevice * chipDev)354 static void ChipReset(ChipDevice *chipDev)
355 {
356 if (chipDev == NULL) {
357 HDF_LOGE("%s: invalid param", __func__);
358 return;
359 }
360 (void)SetPowerOnTiming(chipDev, true);
361 }
362
363 #if GTP_ESD_PROTECT
364 static TouchDriver *g_touchDriver;
365 static struct workqueue_struct *gt1x_workqueue = NULL;
366 static int esd_work_cycle = 200;
367 static struct delayed_work esd_check_work;
368 static int esd_running;
369 static void Gt1xEsdCheckFunc(struct work_struct *);
370
Gt1xSedFeedWatchdog(TouchDriver * driver,uint8_t cmd,uint8_t data)371 int32_t Gt1xSedFeedWatchdog(TouchDriver *driver, uint8_t cmd, uint8_t data)
372 {
373 (void)driver;
374 int32_t ret;
375
376 uint8_t writeBuf[4]; // 4: buffer len
377 writeBuf[0] = 0x80; // 0x80: reg address high bit
378 writeBuf[1] = 0x41; // 0x41: reg address low bit
379 writeBuf[2] = 0; // 2: bit nu 0: reg value
380 writeBuf[3] = (uint8_t) ((0 - cmd - data) & 0xFF); // 3: bit nu 0xFF: mask
381
382 ret = InputI2cWrite(&g_touchDriver->i2cClient, writeBuf, 4); // 4: len
383 CHIP_CHECK_RETURN(ret);
384
385 writeBuf[0] = 0x80; // 0x80: reg address high bit
386 writeBuf[1] = 0x40; // 0x40: reg address low bit
387 writeBuf[2] = 0xAA; // 2:bit nu 0xAA: reg value
388
389 ret = InputI2cWrite(&g_touchDriver->i2cClient, writeBuf, 3); // 3: len
390 CHIP_CHECK_RETURN(ret);
391 OsalMSleep(50); // 50: ms
392
393 return ret;
394 }
395
Gt1xSedReadStatus(TouchDriver * driver)396 static int32_t Gt1xSedReadStatus(TouchDriver *driver)
397 {
398 int32_t ret = -1;
399 uint8_t buf[4] = {0};
400 uint8_t reg[2] = {0};
401 reg[0] = 0x80; // 0x80: reg address high bit
402 reg[1] = 0x40; // 0x40: reg address low bit
403 ret = InputI2cRead(&g_touchDriver->i2cClient, reg, 2, buf, 4); // 2: len 4: len
404
405 return (!ret && buf[0] != 0xAA && buf[3] == 0xAA); // 0xAA: reg value 3: bit nu
406 }
407
Gt1xSedResetStatus(TouchDriver * driver)408 static int32_t Gt1xSedResetStatus(TouchDriver *driver)
409 {
410 int32_t ret = -1;
411 uint8_t writeBuf[6]; // 6: buffer size
412
413 writeBuf[0] = 0x42; // 0x42: reg address high bit
414 writeBuf[1] = 0x26; // 0x26: reg address low bit
415 writeBuf[2] = 0x01; // 0x01: reg value
416 writeBuf[3] = 0x01; // 3: bit nu 0x01: reg value
417 writeBuf[4] = 0x01; // 4: bit nu 0x01: reg value
418 writeBuf[5] = 0x01; // 5: bit nu 0x01: reg value
419 ret = InputI2cWrite(&g_touchDriver->i2cClient, writeBuf, 6); // 6: len
420
421 return ret;
422 }
423
Gt1xInitEsdProtect(void)424 void Gt1xInitEsdProtect(void)
425 {
426 esd_work_cycle = 2 * HZ; // 2:nu HZ: clock ticks in 1 second generated by system
427 HDF_LOGI("Clock ticks for an esd cycle: %d", esd_work_cycle);
428 INIT_DELAYED_WORK(&esd_check_work, Gt1xEsdCheckFunc);
429 }
430
Gt1xEsdSwitch(int32_t on)431 void Gt1xEsdSwitch(int32_t on)
432 {
433 if (on) { // switch on esd check
434 HDF_LOGI("Esd protector started!");
435 queue_delayed_work(gt1x_workqueue, &esd_check_work, 1);
436 } else { // switch off esd check
437 HDF_LOGI("Esd protector stoped!");
438 cancel_delayed_work(&esd_check_work);
439 }
440 }
441
Gt1xDeinitEsdProtect(void)442 static void Gt1xDeinitEsdProtect(void)
443 {
444 Gt1xEsdSwitch(0);
445 }
446
ChipEsdResetRetry(TouchDriver * driver)447 static int32_t ChipEsdResetRetry(TouchDriver *driver)
448 {
449 int32_t ret;
450 ChipDevice *chipDev = driver->device;
451 uint16_t intGpioNum = driver->device->boardCfg->pins.intGpio;
452
453 ret = GpioDisableIrq(intGpioNum);
454 if (ret != HDF_SUCCESS) {
455 HDF_LOGE("%s: disable irq failed, ret %d", __func__, ret);
456 return HDF_FAILURE;
457 }
458 HDF_LOGI("start ChipEsdResetRetry");
459 ret = ChipCheckResetRetry(chipDev);
460 if (ret != HDF_SUCCESS) {
461 HDF_LOGE("%s: enable irq failed, ret %d", __func__, ret);
462 ret = GpioEnableIrq(intGpioNum);
463 if (ret != HDF_SUCCESS) {
464 HDF_LOGE("%s: enable irq failed, ret %d", __func__, ret);
465 }
466 return HDF_FAILURE;
467 }
468 HDF_LOGI("end ChipEsdResetRetry");
469
470 ret = GpioEnableIrq(intGpioNum);
471 if (ret != HDF_SUCCESS) {
472 HDF_LOGE("%s: enable irq failed, ret %d", __func__, ret);
473 return HDF_FAILURE;
474 }
475 return HDF_SUCCESS;
476 }
477
Gt1xEsdCheckFunc(struct work_struct * work)478 static void Gt1xEsdCheckFunc(struct work_struct *work)
479 {
480 int32_t i = 0;
481 int32_t ret = -1;
482
483 for (i = 0; i < 3; i++) { // 3:nu
484 ret = Gt1xSedReadStatus(g_touchDriver);
485 if (ret) {
486 break;
487 }
488 OsalMSleep(50); // 50: sleep time
489 }
490
491 if (likely(i < 3)) { // 3:nu
492 Gt1xSedFeedWatchdog(g_touchDriver, 0xaa, 0); // 0xaa: reg value
493 queue_delayed_work(gt1x_workqueue, &esd_check_work, esd_work_cycle);
494 } else {
495 HDF_LOGI("IC works abnormally! Process reset guitar");
496 Gt1xSedResetStatus(g_touchDriver);
497 OsalMSleep(50); // 50: sleep time
498 ret = ChipEsdResetRetry(g_touchDriver);
499 if (ret == HDF_SUCCESS) {
500 queue_delayed_work(gt1x_workqueue, &esd_check_work, esd_work_cycle);
501 } else {
502 HDF_LOGE("ESD failed, exit esd check work thread");
503 }
504 }
505 }
506 #endif
507
508 #if defined(CONFIG_ARCH_ROCKCHIP)
Gt1xRequestIo(ChipDevice * chipDev)509 static int32_t Gt1xRequestIo(ChipDevice *chipDev)
510 {
511 int32_t ret;
512 ret = SetGpio(chipDev->boardCfg->pins.rstGpio, 1, 0);
513 if (ret != HDF_SUCCESS) {
514 HDF_LOGE("%s: set rstGpio to output failed, ret %d", __func__, ret);
515 return HDF_FAILURE;
516 }
517 ret = SetGpio(chipDev->boardCfg->pins.intGpio, 1, 0);
518 if (ret != HDF_SUCCESS) {
519 HDF_LOGE("%s: set intGpio to output failed, ret %d", __func__, ret);
520 return HDF_FAILURE;
521 }
522 OsalMSleep(100); // 100 : delay time
523 ret = SetGpio(chipDev->boardCfg->pins.rstGpio, 1, 1);
524 if (ret != HDF_SUCCESS) {
525 HDF_LOGE("%s: set intGpio to output failed, ret %d", __func__, ret);
526 return HDF_FAILURE;
527 }
528 OsalMSleep(20); // 20 : delay time
529 return HDF_SUCCESS;
530 }
531 #endif
532
ChipCheckResetRetry(ChipDevice * chipDev)533 static int32_t ChipCheckResetRetry(ChipDevice *chipDev)
534 {
535 int32_t count = 20; // 20 : reset time
536 int32_t ret;
537
538 if ((chipDev->ops == NULL) || (chipDev->ops->Detect == NULL)) {
539 return HDF_FAILURE;
540 }
541
542 while (count --) {
543 ChipReset(chipDev);
544 OsalMSleep(100); // 100 : wait 100msthen try one time
545 ret = chipDev->ops->Detect(chipDev);
546 if (ret == HDF_SUCCESS) {
547 return HDF_SUCCESS;
548 }
549 HDF_LOGI("%s: reset chip %d time", __func__, count);
550 }
551 return HDF_FAILURE;
552 }
553
ChipDriverInit(ChipDevice * chipDev)554 static int32_t ChipDriverInit(ChipDevice *chipDev)
555 {
556 int32_t ret;
557 #if defined(CONFIG_ARCH_ROCKCHIP)
558 g_touchDriver = chipDev->driver;
559 ret = Gt1xRequestIo(chipDev);
560 CHECK_RETURN_VALUE(ret);
561 #else
562 ret = SetPowerOnTiming(chipDev, false);
563 CHECK_RETURN_VALUE(ret);
564 #endif
565 OsalMSleep(100); // 100 : delay time
566 ret = ChipCheckResetRetry(chipDev);
567 CHECK_RETURN_VALUE(ret);
568
569 #if GTP_ESD_PROTECT
570 gt1x_workqueue = create_singlethread_workqueue("gt1x_workthread");
571 if (gt1x_workqueue == NULL) {
572 HDF_LOGE("Create workqueue failed!");
573 }
574 Gt1xInitEsdProtect();
575 Gt1xEsdSwitch(1);
576 #endif
577 HDF_LOGI("%s: chipDetect succ, ret = %d ", __func__, ret);
578
579 #if defined(CONFIG_ARCH_SPRD) || defined(CONFIG_ARCH_ROCKCHIP)
580 HDF_LOGI("%s: DAYU do not update firmware", __func__);
581 #else
582 ret = chipDev->ops->UpdateFirmware(chipDev);
583 CHECK_RETURN_VALUE(ret);
584 HDF_LOGI("%s: update firmware success", __func__);
585 #endif
586
587 ret = SetupChipIrq(chipDev);
588 CHECK_RETURN_VALUE(ret);
589 return HDF_SUCCESS;
590 }
591
InputDeviceInstance(ChipDevice * chipDev)592 static InputDevice *InputDeviceInstance(ChipDevice *chipDev)
593 {
594 InputDevice *inputDev = (InputDevice *)OsalMemAlloc(sizeof(InputDevice));
595 if (inputDev == NULL) {
596 HDF_LOGE("%s: instance input device failed", __func__);
597 return NULL;
598 }
599 (void)memset_s(inputDev, sizeof(InputDevice), 0, sizeof(InputDevice));
600
601 inputDev->hdfDevObj = chipDev->driver->hdfTouchDev;
602 inputDev->pvtData = (void *)chipDev;
603 inputDev->devType = chipDev->driver->boardCfg->attr.devType;
604 inputDev->devName = chipDev->driver->devName;
605
606 return inputDev;
607 }
608
ChipMatchCheck(const ChipDevice * chipDev,const TouchDriver * driver)609 static int32_t ChipMatchCheck(const ChipDevice *chipDev, const TouchDriver *driver)
610 {
611 const struct DeviceResourceNode *boardNode = driver->boardCfg->boardNode;
612 const struct DeviceResourceNode *chipNode = chipDev->chipCfg->chipNode;
613
614 if ((boardNode == NULL) || (boardNode->parent == NULL)) {
615 HDF_LOGE("%s: board node or upper node is null", __func__);
616 return HDF_FAILURE;
617 }
618
619 if ((chipNode == NULL) || (chipNode->parent == NULL) || (chipNode->parent->parent == NULL)) {
620 HDF_LOGE("%s: chip node or upper node is null ", __func__);
621 return HDF_FAILURE;
622 }
623
624 if (boardNode->parent == chipNode->parent->parent) {
625 HDF_LOGI("%s: boardNode's father name = %s, chipNode's grandpa name = %s", __func__,
626 boardNode->parent->name, chipNode->parent->parent->name);
627 return HDF_SUCCESS;
628 }
629 return HDF_FAILURE;
630 }
631
DeviceBindDriver(ChipDevice * chipDev)632 static int32_t DeviceBindDriver(ChipDevice *chipDev)
633 {
634 TouchDriver *driver = NULL;
635 int32_t ret = HDF_FAILURE;
636 int32_t i;
637 for (i = 0; i < MAX_TOUCH_DEVICE; i++) {
638 if ((g_touchDriverList[i] != NULL) && g_touchDriverList[i]->initedFlag) {
639 ret = ChipMatchCheck(chipDev, g_touchDriverList[i]);
640 if (ret == HDF_SUCCESS) {
641 driver = g_touchDriverList[i];
642 break;
643 }
644 }
645 }
646
647 if ((ret == HDF_FAILURE) || (driver == NULL)) {
648 return HDF_FAILURE;
649 }
650
651 driver->i2cClient.i2cCfg.addr = chipDev->chipCfg->bus.chipI2c.commAddr;
652 driver->device = chipDev;
653 chipDev->driver = driver;
654 chipDev->boardCfg = driver->boardCfg;
655 return HDF_SUCCESS;
656 }
657
RegisterTouchChipDevice(ChipDevice * chipDev)658 int32_t RegisterTouchChipDevice(ChipDevice *chipDev)
659 {
660 int32_t ret;
661 InputDevice *inputDev = NULL;
662 if ((chipDev == NULL) || (chipDev->chipCfg == NULL)) {
663 return HDF_ERR_INVALID_PARAM;
664 }
665
666 ret = DeviceBindDriver(chipDev);
667 if (ret != HDF_SUCCESS) {
668 HDF_LOGE("%s: chip device match driver failed", __func__);
669 return HDF_FAILURE;
670 }
671
672 ret = ChipDriverInit(chipDev);
673 if (ret != HDF_SUCCESS) {
674 goto EXIT;
675 }
676
677 inputDev = InputDeviceInstance(chipDev);
678 if (inputDev == NULL) {
679 return HDF_ERR_MALLOC_FAIL;
680 }
681
682 ret = RegisterInputDevice(inputDev);
683 if (ret != HDF_SUCCESS) {
684 goto EXIT1;
685 }
686 chipDev->driver->inputDev = inputDev;
687 chipDev->ops->SetAbility(chipDev);
688 return HDF_SUCCESS;
689
690 EXIT1:
691 OsalMemFree(inputDev);
692 EXIT:
693 chipDev->driver->device = NULL;
694 return HDF_FAILURE;
695 }
696
TouchGetDevType(TouchDriver * driver,struct HdfSBuf * reply)697 static int32_t TouchGetDevType(TouchDriver *driver, struct HdfSBuf *reply)
698 {
699 uint32_t devType = driver->devType;
700 HDF_LOGI("%s: enter, devType is %u", __func__, devType);
701 bool ret = HdfSbufWriteUint32(reply, devType);
702 if (!ret) {
703 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
704 return HDF_FAILURE;
705 }
706 return HDF_SUCCESS;
707 }
708
TouchSetPowerStatus(TouchDriver * driver,struct HdfSBuf * data)709 static int32_t TouchSetPowerStatus(TouchDriver *driver, struct HdfSBuf *data)
710 {
711 uint32_t pwrStatus = 0;
712 bool ret = HdfSbufReadUint32(data, &pwrStatus);
713 if (!ret) {
714 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
715 return HDF_FAILURE;
716 }
717 driver->pwrStatus = pwrStatus;
718 HDF_LOGI("%s: set power status is %u", __func__, pwrStatus);
719 return HDF_SUCCESS;
720 }
721
TouchGetPowerStatus(TouchDriver * driver,struct HdfSBuf * reply)722 static int32_t TouchGetPowerStatus(TouchDriver *driver, struct HdfSBuf *reply)
723 {
724 uint32_t pwrStatus = driver->pwrStatus;
725 bool ret = HdfSbufWriteUint32(reply, pwrStatus);
726 if (!ret) {
727 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
728 return HDF_FAILURE;
729 }
730 HDF_LOGI("%s: get power status is %u", __func__, pwrStatus);
731 return HDF_SUCCESS;
732 }
733
TouchGetDeviceStrInfo(TouchDriver * driver,int32_t cmd,struct HdfSBuf * reply)734 static int32_t TouchGetDeviceStrInfo(TouchDriver *driver, int32_t cmd, struct HdfSBuf *reply)
735 {
736 const char *info = NULL;
737 if ((driver->device == NULL) || (driver->device->chipCfg == NULL)) {
738 HDF_LOGE("%s: parameter invalid", __func__);
739 return HDF_ERR_INVALID_PARAM;
740 }
741
742 switch (cmd) {
743 case GET_CHIP_NAME:
744 info = driver->device->chipName;
745 break;
746 case GET_VENDOR_NAME:
747 info = driver->device->vendorName;
748 break;
749 case GET_CHIP_INFO:
750 info = driver->device->chipCfg->chipInfo;
751 break;
752 default:
753 info = NULL;
754 break;
755 }
756
757 bool ret = HdfSbufWriteString(reply, info);
758 if (!ret) {
759 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
760 return HDF_FAILURE;
761 }
762 HDF_LOGI("%s: cmd is %d, the info is %s", __func__, cmd, info);
763 return HDF_SUCCESS;
764 }
765
TouchGetDeviceAttr(TouchDriver * driver,struct HdfSBuf * reply)766 static int32_t TouchGetDeviceAttr(TouchDriver *driver, struct HdfSBuf *reply)
767 {
768 char *tempStr = "main_touch";
769 int32_t ret;
770 if (driver->inputDev == NULL) {
771 return HDF_FAILURE;
772 }
773
774 HDF_LOGE("%s: enter", __func__);
775 ret = strncpy_s(driver->inputDev->attrSet.devName, DEV_NAME_LEN, tempStr, strlen(tempStr));
776 if (ret != 0) {
777 HDF_LOGE("%s: strncpy dev attr failed", __func__);
778 return HDF_FAILURE;
779 }
780
781 if (!HdfSbufWriteBuffer(reply, &driver->inputDev->attrSet, sizeof(DevAttr))) {
782 HDF_LOGE("%s: sbuf write dev attr failed", __func__);
783 }
784
785 HDF_LOGI("%s: get dev attr succ", __func__);
786 return HDF_SUCCESS;
787 }
788
TouchGetDeviceAbility(TouchDriver * driver,struct HdfSBuf * reply)789 static int32_t TouchGetDeviceAbility(TouchDriver *driver, struct HdfSBuf *reply)
790 {
791 if (driver->inputDev == NULL) {
792 return HDF_FAILURE;
793 }
794 HDF_LOGE("%s: enter", __func__);
795
796 if (!HdfSbufWriteBuffer(reply, &driver->inputDev->abilitySet, sizeof(DevAbility))) {
797 HDF_LOGE("%s: sbuf write dev ability failed", __func__);
798 }
799
800 HDF_LOGI("%s: get dev ability succ", __func__);
801 return HDF_SUCCESS;
802 }
803
TouchSetGestureMode(TouchDriver * driver,struct HdfSBuf * data)804 static int32_t TouchSetGestureMode(TouchDriver *driver, struct HdfSBuf *data)
805 {
806 uint32_t gestureMode = 0;
807 bool ret = HdfSbufReadUint32(data, &gestureMode);
808 if (!ret) {
809 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
810 return HDF_FAILURE;
811 }
812 driver->gestureMode = gestureMode;
813 HDF_LOGD("%s: set gesture mode is %u", __func__, gestureMode);
814 return HDF_SUCCESS;
815 }
816
TouchSelfCapacitance(TouchDriver * driver,struct HdfSBuf * data,struct HdfSBuf * reply)817 static int32_t TouchSelfCapacitance(TouchDriver *driver, struct HdfSBuf *data, struct HdfSBuf *reply)
818 {
819 CapacitanceTestInfo capacTest = {0};
820 bool ret = HdfSbufReadUint32(data, &capacTest.testType);
821 if (!ret) {
822 HDF_LOGE("%s: HdfSbufWriteUint32 failed", __func__);
823 return HDF_FAILURE;
824 }
825
826 if (strncpy_s(capacTest.testResult, SELF_TEST_RESULT_LEN, "SUCCESS", sizeof("SUCCESS")) != EOK) {
827 HDF_LOGE("%s: strncpy_s fail", __func__);
828 return HDF_FAILURE;
829 }
830
831 ret = HdfSbufWriteString(reply, (const char *)capacTest.testResult);
832 if (!ret) {
833 HDF_LOGE("%s: HdfSbufWriteString failed", __func__);
834 return HDF_FAILURE;
835 }
836 HDF_LOGD("%s: capac test type is %u, test result is %s", __func__, capacTest.testType, capacTest.testResult);
837 return HDF_SUCCESS;
838 }
839
TouchRunExtraCmd(TouchDriver * driver,struct HdfSBuf * data)840 static int32_t TouchRunExtraCmd(TouchDriver *driver, struct HdfSBuf *data)
841 {
842 InputExtraCmd cmd = {0};
843 cmd.cmdCode = HdfSbufReadString(data);
844 if (cmd.cmdCode == NULL) {
845 HDF_LOGE("%s: HdfSbufReadString failed", __func__);
846 return HDF_FAILURE;
847 }
848
849 cmd.cmdValue = HdfSbufReadString(data);
850 if (cmd.cmdValue == NULL) {
851 HDF_LOGE("%s: HdfSbufReadString failed", __func__);
852 return HDF_FAILURE;
853 }
854 HDF_LOGD("%s: extra cmd code is %s, cmd value is %s", __func__, cmd.cmdCode, cmd.cmdValue);
855 return HDF_SUCCESS;
856 }
857
HdfTouchDispatch(struct HdfDeviceIoClient * client,int32_t cmd,struct HdfSBuf * data,struct HdfSBuf * reply)858 static int32_t HdfTouchDispatch(struct HdfDeviceIoClient *client, int32_t cmd,
859 struct HdfSBuf *data, struct HdfSBuf *reply)
860 {
861 int32_t ret;
862 TouchDriver *touchDriver = NULL;
863 if ((client == NULL) || (client->device == NULL) || (data == NULL) || (reply == NULL)) {
864 HDF_LOGE("%s: param is null", __func__);
865 return HDF_FAILURE;
866 }
867
868 touchDriver = (TouchDriver *)client->device->priv;
869 if (touchDriver == NULL) {
870 HDF_LOGE("%s: touchDriver is null", __func__);
871 return HDF_FAILURE;
872 }
873
874 HDF_LOGI("%s: cmd = %d", __func__, cmd);
875 switch (cmd) {
876 case GET_DEV_TYPE:
877 ret = TouchGetDevType(touchDriver, reply);
878 break;
879 case SET_PWR_STATUS:
880 ret = TouchSetPowerStatus(touchDriver, data);
881 break;
882 case GET_PWR_STATUS:
883 ret = TouchGetPowerStatus(touchDriver, reply);
884 break;
885 case GET_CHIP_NAME:
886 case GET_VENDOR_NAME:
887 case GET_CHIP_INFO:
888 ret = TouchGetDeviceStrInfo(touchDriver, cmd, reply);
889 break;
890 case GET_DEV_ATTR:
891 ret = TouchGetDeviceAttr(touchDriver, reply);
892 break;
893 case GET_DEV_ABILITY:
894 ret = TouchGetDeviceAbility(touchDriver, reply);
895 break;
896 case SET_GESTURE_MODE:
897 ret = TouchSetGestureMode(touchDriver, data);
898 break;
899 case RUN_CAPAC_TEST:
900 ret = TouchSelfCapacitance(touchDriver, data, reply);
901 break;
902 case RUN_EXTRA_CMD:
903 ret = TouchRunExtraCmd(touchDriver, data);
904 break;
905 default:
906 ret = HDF_SUCCESS;
907 HDF_LOGE("%s: cmd unknown, cmd = 0x%x", __func__, cmd);
908 break;
909 }
910 return ret;
911 }
912
TouchSetupBus(TouchDriver * driver,TouchBoardCfg * config)913 static int32_t TouchSetupBus(TouchDriver *driver, TouchBoardCfg *config)
914 {
915 uint8_t busType = config->bus.busType;
916 uint8_t busNum = config->bus.i2c.busNum;
917 if (busType == I2C_TYPE) {
918 uint32_t i2cClkAddr = config->bus.i2c.i2cClkReg[0];
919 uint32_t i2cClkValue = config->bus.i2c.i2cClkReg[1];
920 uint32_t i2cDataAddr = config->bus.i2c.i2cDataReg[0];
921 uint32_t i2cDataValue = config->bus.i2c.i2cDataReg[1];
922
923 if (InputPinMuxCfg(i2cClkAddr, REGISTER_BYTE_SIZE, i2cClkValue) != HDF_SUCCESS) {
924 return HDF_FAILURE;
925 }
926 if (InputPinMuxCfg(i2cDataAddr, REGISTER_BYTE_SIZE, i2cDataValue) != HDF_SUCCESS) {
927 return HDF_FAILURE;
928 }
929
930 /* get i2c handle */
931 driver->i2cClient.i2cHandle = I2cOpen(busNum);
932 if (driver->i2cClient.i2cHandle == NULL) {
933 HDF_LOGE("%s: open i2c%u failed", __func__, busNum);
934 return HDF_FAILURE;
935 }
936 return HDF_SUCCESS;
937 }
938
939 if (busType == SPI_TYPE) {
940 HDF_LOGI("%s: setup spi bus succ", __func__);
941 return HDF_SUCCESS;
942 }
943
944 return HDF_FAILURE;
945 }
946
TouchInitData(TouchDriver * driver,TouchBoardCfg * config)947 static int32_t TouchInitData(TouchDriver *driver, TouchBoardCfg *config)
948 {
949 driver->devType = config->attr.devType;
950 driver->devName = config->attr.devName;
951 driver->i2cClient.i2cCfg.busNum = config->bus.i2c.busNum;
952 driver->irqStopFlag = false;
953
954 return HDF_SUCCESS;
955 }
956
TouchDriverInit(TouchDriver * driver,TouchBoardCfg * config)957 static int32_t TouchDriverInit(TouchDriver *driver, TouchBoardCfg *config)
958 {
959 int32_t ret = TouchInitData(driver, config);
960 CHECK_RETURN_VALUE(ret);
961
962 ret = TouchSetupBus(driver, config);
963 CHECK_RETURN_VALUE(ret);
964
965 ret = OsalMutexInit(&driver->mutex);
966 CHECK_RETURN_VALUE(ret);
967
968 driver->initedFlag = true;
969 return HDF_SUCCESS;
970 }
971
BoardConfigInstance(struct HdfDeviceObject * device)972 static TouchBoardCfg *BoardConfigInstance(struct HdfDeviceObject *device)
973 {
974 TouchBoardCfg *boardCfg = (TouchBoardCfg *)OsalMemAlloc(sizeof(TouchBoardCfg));
975 if (boardCfg == NULL) {
976 HDF_LOGE("%s: instance board config failed", __func__);
977 return NULL;
978 }
979 (void)memset_s(boardCfg, sizeof(TouchBoardCfg), 0, sizeof(TouchBoardCfg));
980
981 if (ParseTouchBoardConfig(device->property, boardCfg) != HDF_SUCCESS) {
982 HDF_LOGE("%s: parse board config failed", __func__);
983 OsalMemFree(boardCfg);
984 boardCfg = NULL;
985 }
986 return boardCfg;
987 }
988
TouchDriverInstance(void)989 static TouchDriver *TouchDriverInstance(void)
990 {
991 TouchDriver *touchDrv = (TouchDriver *)OsalMemAlloc(sizeof(TouchDriver));
992 if (touchDrv == NULL) {
993 HDF_LOGE("%s: instance touch driver failed", __func__);
994 return NULL;
995 }
996 (void)memset_s(touchDrv, sizeof(TouchDriver), 0, sizeof(TouchDriver));
997 return touchDrv;
998 }
999
AddTouchDriver(TouchDriver * driver)1000 static void AddTouchDriver(TouchDriver *driver)
1001 {
1002 int32_t i;
1003 for (i = 0; i < MAX_TOUCH_DEVICE; i++) {
1004 if (g_touchDriverList[i] == NULL) {
1005 g_touchDriverList[i] = driver;
1006 return;
1007 }
1008 }
1009 }
1010
HdfTouchDriverBind(struct HdfDeviceObject * device)1011 static int32_t HdfTouchDriverBind(struct HdfDeviceObject *device)
1012 {
1013 if (device == NULL) {
1014 HDF_LOGE("%s: param is null", __func__);
1015 return HDF_ERR_INVALID_PARAM;
1016 }
1017
1018 static struct IDeviceIoService touchService = {
1019 .Dispatch = HdfTouchDispatch,
1020 };
1021
1022 device->service = &touchService;
1023 return HDF_SUCCESS;
1024 }
1025
1026 #if defined(CONFIG_ARCH_ROCKCHIP)
HdfTouchDriverDozeResume(struct HdfDeviceObject * device)1027 static int HdfTouchDriverDozeResume(struct HdfDeviceObject *device)
1028 {
1029 if (device == NULL) {
1030 HDF_LOGE("%s: param is null", __func__);
1031 return HDF_ERR_INVALID_PARAM;
1032 }
1033 HDF_LOGI("%s:called", __func__);
1034
1035 static int32_t isFirstResume = 1;
1036 if (isFirstResume == 1) {
1037 isFirstResume = 0;
1038 return HDF_SUCCESS;
1039 }
1040 TouchDriver *touchDriver = (TouchDriver *)device->priv;
1041 ChipReset(touchDriver->device);
1042
1043 return HDF_SUCCESS;
1044 }
1045
HdfTouchDriverDozeSuspend(struct HdfDeviceObject * device)1046 static int HdfTouchDriverDozeSuspend(struct HdfDeviceObject *device)
1047 {
1048 if (device == NULL) {
1049 HDF_LOGE("%s: param is null", __func__);
1050 return HDF_ERR_INVALID_PARAM;
1051 }
1052 HDF_LOGI("%s:called", __func__);
1053
1054 int32_t ret = -1;
1055 uint8_t writeBuf[3]; // 3: buffer size
1056 TouchDriver *touchDriver = (TouchDriver *)device->priv;
1057 uint16_t intGpioNum = touchDriver->device->boardCfg->pins.intGpio;
1058
1059 GpioSetDir(intGpioNum, 1);
1060 GpioWrite(intGpioNum, 0);
1061
1062 writeBuf[0] = 0x80; // 0x42: reg address high bit
1063 writeBuf[1] = 0x40; // 0x26: reg address low bit
1064 writeBuf[2] = 0x05; // 0x01: reg value
1065 ret = InputI2cWrite(&touchDriver->i2cClient, writeBuf, 3); // 3: len
1066 HDF_LOGI("%s:ret = %d", __func__, ret);
1067
1068 return HDF_SUCCESS;
1069 }
1070
HdfTouchDriverRegisterPowerListener(struct HdfDeviceObject * device)1071 static void HdfTouchDriverRegisterPowerListener(struct HdfDeviceObject *device)
1072 {
1073 int ret;
1074 static struct IPowerEventListener powerListener = {0};
1075 HDF_LOGI("%s::enter!", __func__);
1076 powerListener.DozeResume = HdfTouchDriverDozeResume;
1077 powerListener.DozeSuspend = HdfTouchDriverDozeSuspend;
1078 powerListener.Resume = NULL;
1079 powerListener.Suspend = NULL;
1080
1081 ret = HdfPmRegisterPowerListener(device, &powerListener);
1082 HDF_LOGI("%s:register power listener, ret = %d", __func__, ret);
1083 }
1084
HdfTouchDriverUnregisterPowerListener(struct HdfDeviceObject * device)1085 static void HdfTouchDriverUnregisterPowerListener(struct HdfDeviceObject *device)
1086 {
1087 static struct IPowerEventListener powerListener = {0};
1088 HDF_LOGI("%s::enter!", __func__);
1089 powerListener.DozeResume = NULL;
1090 powerListener.DozeSuspend = NULL;
1091 powerListener.Resume = NULL;
1092 powerListener.Suspend = NULL;
1093
1094 HdfPmUnregisterPowerListener(device, &powerListener);
1095 }
1096 #endif
1097
HdfTouchDriverProbe(struct HdfDeviceObject * device)1098 static int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
1099 {
1100 int32_t ret;
1101 TouchBoardCfg *boardCfg = NULL;
1102 TouchDriver *touchDriver = NULL;
1103
1104 HDF_LOGI("%s: enter", __func__);
1105 if (device == NULL) {
1106 HDF_LOGE("%s: param is null", __func__);
1107 return HDF_ERR_INVALID_PARAM;
1108 }
1109
1110 boardCfg = BoardConfigInstance(device);
1111 if (boardCfg == NULL) {
1112 return HDF_ERR_MALLOC_FAIL;
1113 }
1114 touchDriver = TouchDriverInstance();
1115 if (touchDriver == NULL) {
1116 goto EXIT;
1117 }
1118
1119 ret = TouchDriverInit(touchDriver, boardCfg);
1120 if (ret == HDF_SUCCESS) {
1121 touchDriver->hdfTouchDev = device;
1122 touchDriver->boardCfg = boardCfg;
1123 AddTouchDriver(touchDriver);
1124 device->priv = (void *)touchDriver;
1125 #if defined(CONFIG_ARCH_ROCKCHIP)
1126 HdfTouchDriverRegisterPowerListener(device);
1127 #endif
1128 HDF_LOGI("%s: %s exit succ", __func__, boardCfg->attr.devName);
1129 return HDF_SUCCESS;
1130 }
1131
1132 EXIT:
1133 OsalMemFree(boardCfg);
1134 if (touchDriver != NULL) {
1135 touchDriver->boardCfg = NULL;
1136 OsalMemFree(touchDriver);
1137 }
1138 return HDF_FAILURE;
1139 }
1140
HdfTouchDriverRelease(struct HdfDeviceObject * device)1141 static void HdfTouchDriverRelease(struct HdfDeviceObject *device)
1142 {
1143 TouchDriver *driver = NULL;
1144 InputDevice *inputDev = NULL;
1145 int32_t i;
1146
1147 if (device == NULL || device->priv == NULL) {
1148 HDF_LOGE("%s: param is null", __func__);
1149 return;
1150 }
1151 driver = device->priv;
1152
1153 for (i = 0; i < MAX_TOUCH_DEVICE; i++) {
1154 if (g_touchDriverList[i] == driver) {
1155 inputDev = driver->inputDev;
1156 break;
1157 }
1158 }
1159
1160 if (inputDev != NULL) {
1161 UnregisterInputDevice(inputDev);
1162 driver->inputDev = NULL;
1163 }
1164
1165 #if defined(CONFIG_ARCH_ROCKCHIP)
1166 HdfTouchDriverUnregisterPowerListener(device);
1167 #endif
1168
1169 OsalMutexDestroy(&driver->mutex);
1170 OsalMemFree(driver);
1171 if (i < MAX_TOUCH_DEVICE) {
1172 g_touchDriverList[i] = NULL;
1173 }
1174 }
1175
1176 struct HdfDriverEntry g_hdfTouchEntry = {
1177 .moduleVersion = 1,
1178 .moduleName = "HDF_TOUCH",
1179 .Bind = HdfTouchDriverBind,
1180 .Init = HdfTouchDriverProbe,
1181 .Release = HdfTouchDriverRelease,
1182 };
1183
1184 HDF_INIT(g_hdfTouchEntry);
1185