/* * * FocalTech TouchScreen driver. * * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /************************************************************************ * * File Name: focaltech_i2c.c * * Author: fupeipei * * Created: 2016-08-04 * * Abstract: i2c communication with TP * * Version: v1.0 * * Revision History: * v1.0: * First release. By fupeipei 2016-08-04 ************************************************************************/ /***************************************************************************** * Included header files *****************************************************************************/ #include "focaltech_core.h" /***************************************************************************** * Private constant and macro definitions using #define *****************************************************************************/ /***************************************************************************** * Private enumerations, structures and unions using typedef *****************************************************************************/ /***************************************************************************** * Static variables *****************************************************************************/ static DEFINE_MUTEX(i2c_rw_access); /***************************************************************************** * Global variable or extern global variabls/functions *****************************************************************************/ /***************************************************************************** * Static function prototypes *****************************************************************************/ /***************************************************************************** * functions body *****************************************************************************/ /************************************************************************ * Name: fts_i2c_read * Brief: i2c read * Input: i2c info, write buf, write len, read buf, read len * Output: get data in the 3rd buf * Return: fail <0 ***********************************************************************/ int fts_i2c_read(struct i2c_client *client, char *writebuf,int writelen, char *readbuf, int readlen) { int ret; mutex_lock(&i2c_rw_access); if (readlen > 0) { if (writelen > 0) { struct i2c_msg msgs[] = { { .addr = client->addr, .flags = 0, .len = writelen, .buf = writebuf, }, { .addr = client->addr, .flags = I2C_M_RD, .len = readlen, .buf = readbuf, }, }; ret = i2c_transfer(client->adapter, msgs, 2); if (ret < 0) { FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); } } else { struct i2c_msg msgs[] = { { .addr = client->addr, .flags = I2C_M_RD, .len = readlen, .buf = readbuf, }, }; ret = i2c_transfer(client->adapter, msgs, 1); if (ret < 0) { FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); } } } mutex_unlock(&i2c_rw_access); return ret; } /************************************************************************ * Name: fts_i2c_write * Brief: i2c write * Input: i2c info, write buf, write len * Output: no * Return: fail <0 ***********************************************************************/ int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) { int ret = 0; mutex_lock(&i2c_rw_access); if (writelen > 0) { struct i2c_msg msgs[] = { { .addr = client->addr, .flags = 0, .len = writelen, .buf = writebuf, }, }; ret = i2c_transfer(client->adapter, msgs, 1); if (ret < 0) { FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); } } mutex_unlock(&i2c_rw_access); return ret; } /************************************************************************ * Name: fts_i2c_write_reg * Brief: write register * Input: i2c info, reg address, reg value * Output: no * Return: fail <0 ***********************************************************************/ int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) { u8 buf[2] = {0}; buf[0] = regaddr; buf[1] = regvalue; return fts_i2c_write(client, buf, sizeof(buf)); } /************************************************************************ * Name: fts_i2c_read_reg * Brief: read register * Input: i2c info, reg address, reg value * Output: get reg value * Return: fail <0 ***********************************************************************/ int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) { return fts_i2c_read(client, ®addr, 1, regvalue, 1); } /************************************************************************ * Name: fts_i2c_init * Brief: fts i2c init * Input: * Output: * Return: ***********************************************************************/ int fts_i2c_init(void) { FTS_FUNC_ENTER(); FTS_FUNC_EXIT(); return 0; } /************************************************************************ * Name: fts_i2c_exit * Brief: fts i2c exit * Input: * Output: * Return: ***********************************************************************/ int fts_i2c_exit(void) { FTS_FUNC_ENTER(); FTS_FUNC_EXIT(); return 0; }