/*
 *
 * Copyright (C) 2012-2019, Samsung Electronics Co., Ltd.
 *
 * RMI4 transport level functions
 */

#include "rmi.h"

#define RMI_PAGE_SELECT_REGISTER             0xff
#define RMI_I2C_PAGE(addr)                   (((addr) >> 8) & 0xff)

static int rmi_set_page(rmi_device_t *rmi_dev, uint16_t page)
{
    int rc;
    uint8_t temp = page;

    rc = rmi_dev->i2c_write(RMI_PAGE_SELECT_REGISTER, &temp, 1);
    if (rc <= 0) {
        RMI_ERR("set page failed: %d.", rc);
        if (!rc) {
            rc = -1;
        }
        return rc;
    }
    rmi_dev->page = page;
    return 0;
}

int rmi_write_block(rmi_device_t *rmi_dev, uint16_t addr, uint8_t *buf, int len)
{
    int rc;

    if (RMI_I2C_PAGE(addr) != rmi_dev->page) {
        rc = rmi_set_page(rmi_dev, RMI_I2C_PAGE(addr));
        if (rc < 0) {
            return rc;
        }
    }

    rc = rmi_dev->i2c_write(addr & 0xff, buf, len);
    return rc;
}

int rmi_write_byte(rmi_device_t *rmi_dev, uint16_t addr, uint8_t data)
{
    int rc = rmi_write_block(rmi_dev, addr, &data, 1);
    return (rc < 0) ? rc : ((rc == 0)?-1:0);
}

int rmi_read_block(rmi_device_t *rmi_dev, uint16_t addr, uint8_t *buf, int len)
{
    int rc;

    if (RMI_I2C_PAGE(addr) != rmi_dev->page) {
        rc = rmi_set_page(rmi_dev, RMI_I2C_PAGE(addr));
        if (rc < 0) {
            return rc;
        }
    }

    rc = rmi_dev->i2c_read(addr & 0xff, buf, len);
    return rc;
}

int rmi_read_byte(rmi_device_t *rmi_dev, uint16_t addr, uint8_t *buf)
{
    int rc = rmi_read_block(rmi_dev, addr, buf, 1);
    return (rc < 0) ? rc : ((rc == 0)?-1:0);
}

int rmi_transport_init(rmi_device_t *rmi_dev)
{
    int error;

    rmi_dev->page = -1;
    error = rmi_set_page(rmi_dev, 0);
    if (error < 0) {
        RMI_ERR("RMI i2c failed. err = %d", error);
        return error;
    }

    RMI_DBG("%s() : RMI i2c transport inited.", __func__);
    return 0;
}
