• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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