/*
 *
 * Copyright (C) 2012-2019, Samsung Electronics Co., Ltd.
 *
 * Cypress touchscreen. Driver file
 */

#include <tee_internal_api.h>
#include "board.h"
#include "i2c.h"
#include "dbg.h"
#include "errno.h"
#include "touch_gpio.h"
#include "cypress_driver.h"

#define CY_TOUCH_REPORT_ID        1
#define CTS_RETRY_COUNT           8

extern cypress_ts_info_t cts_info;

static int cts_i2c_read(Touch_Report_t *TR)
{
    TEE_Result ret;
    deviceInfo_t *i2cDev = &board.i2c;
    int try_count = CTS_RETRY_COUNT;
    do {
        TR->Length = -1;
        ret = i2c_receive(i2cDev, i2cDev->bus.slave_address,
                          (unsigned char*)TR, 2);
        if (ret == TEE_SUCCESS) {
            if (TR->Length >= 7) {
                ret = i2c_receive(i2cDev, i2cDev->bus.slave_address,
                                  (unsigned char*)TR, TR->Length);
                if (ret != TEE_SUCCESS) {
                    goto l1;
                }
            }
            return 0;
        }
l1: ;
    } while(--try_count);
    return -EIO;
}

int cts_irq_process(void)
{
    int i;
    int ret;
    uint8_t finger_id;
    uint8_t ev_type;
    Touch_Report_t TR;

    ret = cts_i2c_read(&TR);
    if (ret == 0) {
    }
    if (TR.Report_ID != CY_TOUCH_REPORT_ID) {
        return 0;
    }
    i = TR.data1 & NUM_OF_RECS;
    while (i) {
        i--;
#if 0
        dbgPrintf("%s i=%d ID=%d TIP=%d EvID=%d X=%d Y=%d\n", __func__, i,
                  (TR.TR[i].ID & TOUCH_ID_MASK),
                  (TR.TR[i].ID & TOUCH_TIP_MASK)  >> 7,
                  (TR.TR[i].ID & TOUCH_EVID_MASK) >> 5,
                  TR.TR[i].X, TR.TR[i].Y);
#endif
        if (TR.TR[i].ID & TOUCH_TIP_MASK) {
            ev_type = tui_ts_press;
        } else {
            ev_type = tui_ts_release;
        }
        finger_id = TR.TR[i].ID & TOUCH_ID_MASK;
        add_touch_event(finger_id, TR.TR[i].X, TR.TR[i].Y, ev_type);
    }
    return 0;
}

int cts_driver_init(void)
{
    init_touch_queue();

    return 0;
}
