2013-07-01 05:46:56 +04:00
/*
* cyttsp_i2c_common . c
* Cypress TrueTouch ( TM ) Standard Product ( TTSP ) I2C touchscreen driver .
* For use with Cypress Txx3xx and Txx4xx parts .
* Supported parts include :
* CY8CTST341
* CY8CTMA340
* TMA4XX
* TMA1036
*
* Copyright ( C ) 2009 , 2010 , 2011 Cypress Semiconductor , Inc .
* Copyright ( C ) 2012 Javier Martinez Canillas < javier @ dowhile0 . org >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* version 2 , and only version 2 , as published by the
* Free Software Foundation .
*
* 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 .
*
* Contact Cypress Semiconductor at www . cypress . com < ttdrivers @ cypress . com >
*
*/
# include <linux/device.h>
# include <linux/export.h>
# include <linux/i2c.h>
# include <linux/module.h>
# include <linux/types.h>
2013-12-15 14:25:55 +04:00
# include "cyttsp4_core.h"
2013-07-01 05:46:56 +04:00
int cyttsp_i2c_read_block_data ( struct device * dev , u8 * xfer_buf ,
2013-07-05 01:02:57 +04:00
u16 addr , u8 length , void * values )
2013-07-01 05:46:56 +04:00
{
struct i2c_client * client = to_i2c_client ( dev ) ;
2013-07-05 01:02:57 +04:00
u8 client_addr = client - > addr | ( ( addr > > 8 ) & 0x1 ) ;
u8 addr_lo = addr & 0xFF ;
2013-07-01 05:46:56 +04:00
struct i2c_msg msgs [ ] = {
{
2013-07-05 01:02:57 +04:00
. addr = client_addr ,
2013-07-01 05:46:56 +04:00
. flags = 0 ,
. len = 1 ,
2013-07-05 01:02:57 +04:00
. buf = & addr_lo ,
2013-07-01 05:46:56 +04:00
} ,
{
2013-07-05 01:02:57 +04:00
. addr = client_addr ,
2013-07-01 05:46:56 +04:00
. flags = I2C_M_RD ,
. len = length ,
. buf = values ,
} ,
} ;
int retval ;
retval = i2c_transfer ( client - > adapter , msgs , ARRAY_SIZE ( msgs ) ) ;
if ( retval < 0 )
return retval ;
return retval ! = ARRAY_SIZE ( msgs ) ? - EIO : 0 ;
}
EXPORT_SYMBOL_GPL ( cyttsp_i2c_read_block_data ) ;
int cyttsp_i2c_write_block_data ( struct device * dev , u8 * xfer_buf ,
2013-07-05 01:02:57 +04:00
u16 addr , u8 length , const void * values )
2013-07-01 05:46:56 +04:00
{
struct i2c_client * client = to_i2c_client ( dev ) ;
2013-07-05 01:02:57 +04:00
u8 client_addr = client - > addr | ( ( addr > > 8 ) & 0x1 ) ;
u8 addr_lo = addr & 0xFF ;
struct i2c_msg msgs [ ] = {
{
. addr = client_addr ,
. flags = 0 ,
. len = length + 1 ,
. buf = xfer_buf ,
} ,
} ;
2013-07-01 05:46:56 +04:00
int retval ;
2013-07-05 01:02:57 +04:00
xfer_buf [ 0 ] = addr_lo ;
2013-07-01 05:46:56 +04:00
memcpy ( & xfer_buf [ 1 ] , values , length ) ;
2013-07-05 01:02:57 +04:00
retval = i2c_transfer ( client - > adapter , msgs , ARRAY_SIZE ( msgs ) ) ;
if ( retval < 0 )
return retval ;
2013-07-01 05:46:56 +04:00
2013-07-05 01:02:57 +04:00
return retval ! = ARRAY_SIZE ( msgs ) ? - EIO : 0 ;
2013-07-01 05:46:56 +04:00
}
EXPORT_SYMBOL_GPL ( cyttsp_i2c_write_block_data ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Cypress " ) ;