diff options
Diffstat (limited to 'drivers/media/tdmb/fc8050/fci_i2c.c')
-rw-r--r-- | drivers/media/tdmb/fc8050/fci_i2c.c | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/drivers/media/tdmb/fc8050/fci_i2c.c b/drivers/media/tdmb/fc8050/fci_i2c.c deleted file mode 100644 index 2cad84d..0000000 --- a/drivers/media/tdmb/fc8050/fci_i2c.c +++ /dev/null @@ -1,263 +0,0 @@ -/***************************************************************************** - Copyright(c) 2009 FCI Inc. All Rights Reserved - - File name : fci_i2c.c - - Description : fci i2c driver - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - History : - ---------------------------------------------------------------------- - 2009/09/11 jason initial -*******************************************************************************/ - -#include <linux/input.h> - - -#include "fci_types.h" -#include "fci_oal.h" -#include "fc8050_regs.h" -#include "fci_hal.h" - -/* #define FEATURE_FCI_I2C_CHECK_STATUS */ - -#define I2CSTAT_TIP 0x02 /* Tip bit */ -#define I2CSTAT_NACK 0x80 /* Nack bit */ - -#define I2C_TIMEOUT 1 /* 1 second */ - -#define I2C_CR_STA 0x80 -#define I2C_CR_STO 0x40 -#define I2C_CR_RD 0x20 -#define I2C_CR_WR 0x10 -#define I2C_CR_NACK 0x08 -#define I2C_CR_IACK 0x01 - -#define I2C_WRITE 0 -#define I2C_READ 1 - -#define I2C_OK 0 -#define I2C_NOK 1 -#define I2C_NACK 2 -#define I2C_NOK_LA 3 /* Lost arbitration */ -#define I2C_NOK_TOUT 4 /* time out */ - -static int wait_for_xfer(HANDLE hDevice) -{ - int i; - int res = I2C_OK; - u8 status; - - i = I2C_TIMEOUT * 10000; - /* wait for transfer complete */ - do { - bbm_read(hDevice, BBM_I2C_SR, &status); - i--; - } while ((i > 0) && (status & I2CSTAT_TIP)); - - /* check time out or nack */ - if (status & I2CSTAT_TIP) - res = I2C_NOK_TOUT; - -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - else { - bbm_read(hDevice, BBM_I2C_SR, &status); - if (status & I2CSTAT_NACK) - res = I2C_NACK; - else - res = I2C_OK; - } -#endif - return res; -} - -static int fci_i2c_transfer( - HANDLE hDevice, u8 cmd_type, u8 chip - , u8 addr[], u8 addr_len, u8 data[], u8 data_len) -{ - int i; - int result = I2C_OK; - - switch (cmd_type) { - case I2C_WRITE: - bbm_write(hDevice, BBM_I2C_TXR, chip | cmd_type); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - if (addr && addr_len) { - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - } - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, data[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - break; - case I2C_READ: - if (addr && addr_len) { - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - - i = 0; - while ((i < addr_len) && (result == I2C_OK)) { - bbm_write(hDevice, BBM_I2C_TXR, addr[i]); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - i++; - } - } - - bbm_write(hDevice, BBM_I2C_TXR, chip | I2C_READ); - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if (result != I2C_OK) - return result; -#endif - - i = 0; - while ((i < data_len) && (result == I2C_OK)) { - if (i == data_len - 1) { - bbm_write(hDevice, BBM_I2C_CR - , I2C_CR_RD|I2C_CR_NACK); - result = wait_for_xfer(hDevice); - if ((result != I2C_NACK) - && (result != I2C_OK)) { - print_log(hDevice, "NACK4-0[%02x]\n" - , result); - return result; - } - } else { - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_RD); - result = wait_for_xfer(hDevice); - if (result != I2C_OK) { - print_log(hDevice, "NACK4-1[%02x]\n" - , result); - return result; - } - } - bbm_read(hDevice, BBM_I2C_RXR, &data[i]); - i++; - } - - bbm_write(hDevice, BBM_I2C_CR, I2C_CR_STO); -#ifdef FEATURE_FCI_I2C_CHECK_STATUS - result = wait_for_xfer(hDevice); - if ((result != I2C_NACK) && (result != I2C_OK)) { - print_log(hDevice, "NACK5[%02X]\n", result); - return result; - } -#endif - break; - default: - return I2C_NOK; - } - - return I2C_OK; -} - -int fci_i2c_init(HANDLE hDevice, int speed, int slaveaddr) -{ - u16 pr, rpr = 0; - - pr = (u16)((4800 / speed) - 1); - /* pr=400; */ - bbm_word_write(hDevice, BBM_I2C_PR, pr); - - bbm_word_read(hDevice, BBM_I2C_PR, &rpr); - if (pr != rpr) - return BBM_NOK; - - /* i2c master core enable & interrupt enable */ - bbm_write(hDevice, BBM_I2C_CTR, 0xC0); - - return BBM_OK; -} - -int fci_i2c_read( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len) -{ - int ret; - u8 tmp[4] = {0xcc, 0xcc, 0xcc, 0xcc}; - - ret = fci_i2c_transfer(hDevice, I2C_READ, chip << 1 - , &addr, address_len, &tmp[0], len); - if (ret != I2C_OK) { - print_log(hDevice - , "fci_i2c_read() result=%d, addr = %x, data=%x\n" - , ret, addr, *data); - return ret; - } - - /* *data = tmp[0]; */ - memcpy(data, tmp, len); - - return ret; -} - -int fci_i2c_write( - HANDLE hDevice, u8 chip, u8 addr, u8 address_len, u8 *data, u8 len) -{ - int ret; - u8 *paddr = &addr; - - ret = fci_i2c_transfer(hDevice, I2C_WRITE, chip << 1 - , paddr, address_len, data, len); - - if (ret != I2C_OK) - print_log(hDevice - , "fci_i2c_write() result=%d, addr= %x, data=%x\n" - , ret, addr, *data); - - return ret; -} |