blob: 30cc616bcbe0226eedb01770f9b9ec6d9b103303 [file] [log] [blame]
/*
* Copyright(c) 2013 FCI Inc. All Rights Reserved
*
* File name : fc8080_i2c.c
*
* Description : i2c interface source file
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
* History :
* ----------------------------------------------------------------------
*/
#include <linux/module.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include "fci_types.h"
#include "fc8080_regs.h"
#include "fci_oal.h"
#include "tdmb.h"
#define CHIP_ADDR 0x58
#define I2C_M_FCIRD 1
#define I2C_M_FCIWR 0
#define I2C_MAX_SEND_LENGTH 500
struct i2c_ts_driver {
struct i2c_client *client;
struct input_dev *input_dev;
struct work_struct work;
};
struct i2c_client *fc8080_i2c;
static DEFINE_MUTEX(lock);
static s32 i2c_bulkread(HANDLE handle, u8 chip, u16 addr, u8 *data, u16 length)
{
int res;
struct i2c_msg rmsg[2];
unsigned char i2c_data[2];
rmsg[0].addr = CHIP_ADDR;
rmsg[0].flags = I2C_M_FCIWR;
rmsg[0].len = 2;
rmsg[0].buf = i2c_data;
i2c_data[0] = (addr >> 8) & 0xff;
i2c_data[1] = (addr) & 0xff;
rmsg[1].addr = CHIP_ADDR;
rmsg[1].flags = I2C_M_FCIRD;
rmsg[1].len = length;
rmsg[1].buf = data;
res = i2c_transfer(fc8080_i2c->adapter, &rmsg[0], 2);
return res;
}
static s32 i2c_bulkwrite(HANDLE handle, u8 chip, u16 addr, u8 *data, u16 length)
{
int res;
struct i2c_msg wmsg;
unsigned char i2c_data[I2C_MAX_SEND_LENGTH];
if ((length + 2) > I2C_MAX_SEND_LENGTH)
return -ENODEV;
wmsg.addr = CHIP_ADDR;
wmsg.flags = I2C_M_FCIWR;
wmsg.len = length + 2;
wmsg.buf = i2c_data;
i2c_data[0] = (addr >> 8) & 0xff;
i2c_data[1] = (addr) & 0xff;
memcpy(&i2c_data[2], data, length);
res = i2c_transfer(fc8080_i2c->adapter, &wmsg, 1);
return res;
}
static s32 i2c_dataread(HANDLE handle, u8 chip, u16 addr, u8 *data, u16 length)
{
return i2c_bulkread(handle, chip, addr, data, length);
}
s32 fc8080_i2c_init(HANDLE handle, unsigned long param)
{
static unsigned long fc8080_i2c_temp;
fc8080_i2c_temp = param;
fc8080_i2c = (struct i2c_client *)fc8080_i2c_temp;
DPRINTK("%s : 0x%p\n", __func__, fc8080_i2c);
return BBM_OK;
}
s32 fc8080_i2c_byteread(HANDLE handle, u16 addr, u8 *data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkread(handle, (u8) CHIP_ADDR, addr, data, 1);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_wordread(HANDLE handle, u16 addr, u16 *data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkread(handle, (u8) CHIP_ADDR, addr, (u8 *) data, 2);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_longread(HANDLE handle, u16 addr, u32 *data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkread(handle, (u8) CHIP_ADDR, addr, (u8 *) data, 4);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_bulkread(HANDLE handle, u16 addr, u8 *data, u16 length)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkread(handle, (u8) CHIP_ADDR, addr, data, length);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_bytewrite(HANDLE handle, u16 addr, u8 data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkwrite(handle, (u8) CHIP_ADDR, addr, (u8 *) &data, 1);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_wordwrite(HANDLE handle, u16 addr, u16 data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkwrite(handle, (u8) CHIP_ADDR, addr, (u8 *) &data, 2);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_longwrite(HANDLE handle, u16 addr, u32 data)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkwrite(handle, (u8) CHIP_ADDR, addr, (u8 *) &data, 4);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_bulkwrite(HANDLE handle, u16 addr, u8 *data, u16 length)
{
s32 res;
mutex_lock(&lock);
res = i2c_bulkwrite(handle, (u8) CHIP_ADDR, addr, data, length);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_dataread(HANDLE handle, u16 addr, u8 *data, u32 length)
{
s32 res;
mutex_lock(&lock);
res = i2c_dataread(handle, (u8) CHIP_ADDR, addr, data, length);
mutex_unlock(&lock);
return res;
}
s32 fc8080_i2c_deinit(HANDLE handle)
{
return BBM_OK;
}