2005-11-08 21:37:07 -08:00
/*
2005-11-08 21:38:25 -08:00
em28xx - i2c . c - driver for Empia EM2800 / EM2820 / 2840 USB video capture devices
2005-11-08 21:37:07 -08:00
2005-11-08 21:38:25 -08:00
Copyright ( C ) 2005 Ludovico Cavedon < cavedon @ sssup . it >
Markus Rechberger < mrechberger @ gmail . com >
2006-04-03 07:53:40 -03:00
Mauro Carvalho Chehab < mchehab @ infradead . org >
2005-11-08 21:38:25 -08:00
Sascha Sommer < saschasommer @ freenet . de >
2013-03-26 13:38:36 -03:00
Copyright ( C ) 2013 Frank Schäfer < fschaefer . oss @ googlemail . com >
2005-11-08 21:37:07 -08:00
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 . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/usb.h>
# include <linux/i2c.h>
2014-01-04 05:42:11 -03:00
# include <linux/jiffies.h>
2005-11-08 21:37:07 -08:00
2005-11-08 21:38:25 -08:00
# include "em28xx.h"
2007-10-29 23:36:12 -03:00
# include "tuner-xc2028.h"
2006-01-09 15:32:31 -02:00
# include <media/v4l2-common.h>
2005-11-08 21:37:32 -08:00
# include <media/tuner.h>
2005-11-08 21:37:07 -08:00
/* ----------------------------------------------------------- */
2008-04-22 14:41:48 -03:00
static unsigned int i2c_scan ;
2005-11-08 21:37:07 -08:00
module_param ( i2c_scan , int , 0444 ) ;
MODULE_PARM_DESC ( i2c_scan , " scan i2c bus at insmod time " ) ;
2008-04-22 14:41:48 -03:00
static unsigned int i2c_debug ;
2005-11-08 21:37:07 -08:00
module_param ( i2c_debug , int , 0644 ) ;
2013-12-28 08:23:30 -03:00
MODULE_PARM_DESC ( i2c_debug , " i2c debug message level (1: normal debug, 2: show I2C transfers) " ) ;
2005-11-08 21:37:07 -08:00
/*
2013-01-03 14:27:02 -03:00
* em2800_i2c_send_bytes ( )
* send up to 4 bytes to the em2800 i2c device
2005-11-08 21:37:24 -08:00
*/
2013-01-03 14:27:02 -03:00
static int em2800_i2c_send_bytes ( struct em28xx * dev , u8 addr , u8 * buf , u16 len )
2005-11-08 21:37:24 -08:00
{
2014-01-05 09:45:50 -03:00
unsigned long timeout = jiffies + msecs_to_jiffies ( EM28XX_I2C_XFER_TIMEOUT ) ;
2005-11-08 21:37:24 -08:00
int ret ;
2012-12-16 14:23:27 -03:00
u8 b2 [ 6 ] ;
2013-01-03 14:27:02 -03:00
if ( len < 1 | | len > 4 )
return - EOPNOTSUPP ;
2005-11-08 21:37:24 -08:00
BUG_ON ( len < 1 | | len > 4 ) ;
b2 [ 5 ] = 0x80 + len - 1 ;
b2 [ 4 ] = addr ;
b2 [ 3 ] = buf [ 0 ] ;
if ( len > 1 )
b2 [ 2 ] = buf [ 1 ] ;
if ( len > 2 )
b2 [ 1 ] = buf [ 2 ] ;
if ( len > 3 )
b2 [ 0 ] = buf [ 3 ] ;
2013-01-03 14:27:03 -03:00
/* trigger write */
2005-11-08 21:38:27 -08:00
ret = dev - > em28xx_write_regs ( dev , 4 - len , & b2 [ 4 - len ] , 2 + len ) ;
2005-11-08 21:37:24 -08:00
if ( ret ! = 2 + len ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " failed to trigger write to i2c address 0x%x (error=%i) \n " ,
addr , ret ) ;
2013-01-03 14:27:05 -03:00
return ( ret < 0 ) ? ret : - EIO ;
2005-11-08 21:37:24 -08:00
}
2013-01-03 14:27:03 -03:00
/* wait for completion */
2014-01-04 05:42:11 -03:00
while ( time_is_after_jiffies ( timeout ) ) {
2005-11-08 21:38:27 -08:00
ret = dev - > em28xx_read_reg ( dev , 0x05 ) ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0x80 + len - 1 )
2005-11-08 21:37:24 -08:00
return len ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0x94 + len - 1 ) {
2014-01-06 09:17:53 -03:00
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " R05 returned 0x%02x: I2C ACK error \n " ,
2014-01-06 09:17:53 -03:00
ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " failed to get i2c transfer status from bridge register (error=%i) \n " ,
ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
}
2006-02-07 06:49:11 -02:00
msleep ( 5 ) ;
2005-11-08 21:37:24 -08:00
}
2013-12-28 08:23:30 -03:00
if ( i2c_debug )
em28xx_warn ( " write to i2c device at 0x%x timed out \n " , addr ) ;
2014-01-04 05:42:11 -03:00
return - ETIMEDOUT ;
2005-11-08 21:37:24 -08:00
}
/*
2013-01-03 14:27:03 -03:00
* em2800_i2c_recv_bytes ( )
* read up to 4 bytes from the em2800 i2c device
2005-11-08 21:37:24 -08:00
*/
2013-01-03 14:27:03 -03:00
static int em2800_i2c_recv_bytes ( struct em28xx * dev , u8 addr , u8 * buf , u16 len )
2005-11-08 21:37:24 -08:00
{
2014-01-05 09:45:50 -03:00
unsigned long timeout = jiffies + msecs_to_jiffies ( EM28XX_I2C_XFER_TIMEOUT ) ;
2013-01-03 14:27:03 -03:00
u8 buf2 [ 4 ] ;
2005-11-08 21:37:24 -08:00
int ret ;
2013-01-03 14:27:03 -03:00
int i ;
if ( len < 1 | | len > 4 )
return - EOPNOTSUPP ;
/* trigger read */
buf2 [ 1 ] = 0x84 + len - 1 ;
buf2 [ 0 ] = addr ;
ret = dev - > em28xx_write_regs ( dev , 0x04 , buf2 , 2 ) ;
if ( ret ! = 2 ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " failed to trigger read from i2c address 0x%x (error=%i) \n " ,
addr , ret ) ;
2013-01-03 14:27:03 -03:00
return ( ret < 0 ) ? ret : - EIO ;
2005-11-08 21:37:24 -08:00
}
2008-09-04 03:33:43 -03:00
2013-01-03 14:27:03 -03:00
/* wait for completion */
2014-01-04 05:42:11 -03:00
while ( time_is_after_jiffies ( timeout ) ) {
2013-01-03 14:27:03 -03:00
ret = dev - > em28xx_read_reg ( dev , 0x05 ) ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0x84 + len - 1 )
2013-01-03 14:27:03 -03:00
break ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0x94 + len - 1 ) {
2014-01-06 09:17:53 -03:00
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " R05 returned 0x%02x: I2C ACK error \n " ,
2014-01-06 09:17:53 -03:00
ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " failed to get i2c transfer status from bridge register (error=%i) \n " ,
ret ) ;
2013-01-03 14:27:03 -03:00
return ret ;
}
2006-02-07 06:49:11 -02:00
msleep ( 5 ) ;
2005-11-08 21:37:24 -08:00
}
2013-12-28 08:23:30 -03:00
if ( ret ! = 0x84 + len - 1 ) {
if ( i2c_debug )
em28xx_warn ( " read from i2c device at 0x%x timed out \n " ,
addr ) ;
}
2013-01-03 14:27:03 -03:00
/* get the received message */
ret = dev - > em28xx_read_reg_req_len ( dev , 0x00 , 4 - len , buf2 , len ) ;
if ( ret ! = len ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " reading from i2c device at 0x%x failed: couldn't get the received message from the bridge (error=%i) \n " ,
addr , ret ) ;
2013-01-03 14:27:03 -03:00
return ( ret < 0 ) ? ret : - EIO ;
}
for ( i = 0 ; i < len ; i + + )
buf [ i ] = buf2 [ len - 1 - i ] ;
return ret ;
2005-11-08 21:37:24 -08:00
}
/*
2013-01-03 14:27:03 -03:00
* em2800_i2c_check_for_device ( )
* check if there is an i2c device at the supplied address
2005-11-08 21:37:24 -08:00
*/
2013-01-03 14:27:03 -03:00
static int em2800_i2c_check_for_device ( struct em28xx * dev , u8 addr )
2005-11-08 21:37:24 -08:00
{
2013-01-03 14:27:03 -03:00
u8 buf ;
2005-11-08 21:37:24 -08:00
int ret ;
2013-01-03 14:27:02 -03:00
2013-01-03 14:27:03 -03:00
ret = em2800_i2c_recv_bytes ( dev , addr , & buf , 1 ) ;
if ( ret = = 1 )
return 0 ;
return ( ret < 0 ) ? ret : - EIO ;
2005-11-08 21:37:24 -08:00
}
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_send_bytes ( )
2005-11-08 21:37:07 -08:00
*/
2012-12-16 14:23:27 -03:00
static int em28xx_i2c_send_bytes ( struct em28xx * dev , u16 addr , u8 * buf ,
u16 len , int stop )
2005-11-08 21:37:07 -08:00
{
2014-01-05 09:45:50 -03:00
unsigned long timeout = jiffies + msecs_to_jiffies ( EM28XX_I2C_XFER_TIMEOUT ) ;
2014-01-04 05:42:11 -03:00
int ret ;
2005-11-08 21:37:07 -08:00
2013-01-03 14:27:02 -03:00
if ( len < 1 | | len > 64 )
return - EOPNOTSUPP ;
2013-03-24 17:09:59 -03:00
/*
* NOTE : limited by the USB ctrl message constraints
* Zero length reads always succeed , even if no device is connected
*/
2013-01-03 14:27:02 -03:00
2013-01-03 14:27:05 -03:00
/* Write to i2c device */
ret = dev - > em28xx_write_regs_req ( dev , stop ? 2 : 3 , addr , buf , len ) ;
if ( ret ! = len ) {
if ( ret < 0 ) {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " writing to i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
} else {
2013-03-24 14:58:03 -03:00
em28xx_warn ( " %i bytes write to i2c device at 0x%x requested, but %i bytes written \n " ,
2013-01-03 14:27:05 -03:00
len , addr , ret ) ;
return - EIO ;
}
}
2005-11-08 21:37:07 -08:00
2014-01-04 05:42:11 -03:00
/* wait for completion */
while ( time_is_after_jiffies ( timeout ) ) {
2011-07-09 19:36:11 -03:00
ret = dev - > em28xx_read_reg ( dev , 0x05 ) ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0 ) /* success */
2013-01-03 14:27:05 -03:00
return len ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0x10 ) {
2014-01-06 09:17:53 -03:00
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " I2C ACK error on writing to addr 0x%02x \n " ,
2014-01-06 09:17:53 -03:00
addr ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
em28xx_warn ( " failed to get i2c transfer status from bridge register (error=%i) \n " ,
2013-03-24 14:58:03 -03:00
ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
}
2011-07-09 19:36:11 -03:00
msleep ( 5 ) ;
2013-03-24 17:09:59 -03:00
/*
* NOTE : do we really have to wait for success ?
* Never seen anything else than 0x00 or 0x10
* ( even with high payload ) . . .
*/
2011-07-09 19:36:11 -03:00
}
2014-01-19 18:48:35 -03:00
if ( ret = = 0x02 | | ret = = 0x04 ) {
/* NOTE: these errors seem to be related to clock stretching */
if ( i2c_debug )
em28xx_warn ( " write to i2c device at 0x%x timed out (status=%i) \n " ,
addr , ret ) ;
return - ETIMEDOUT ;
}
em28xx_warn ( " write to i2c device at 0x%x failed with unknown error (status=%i) \n " ,
addr , ret ) ;
return - EIO ;
2005-11-08 21:37:07 -08:00
}
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_recv_bytes ( )
2005-11-08 21:37:07 -08:00
* read a byte from the i2c device
*/
2012-12-16 14:23:27 -03:00
static int em28xx_i2c_recv_bytes ( struct em28xx * dev , u16 addr , u8 * buf , u16 len )
2005-11-08 21:37:07 -08:00
{
int ret ;
2013-01-03 14:27:02 -03:00
if ( len < 1 | | len > 64 )
return - EOPNOTSUPP ;
2013-03-24 17:09:59 -03:00
/*
* NOTE : limited by the USB ctrl message constraints
* Zero length reads always succeed , even if no device is connected
*/
2013-01-03 14:27:02 -03:00
2013-01-03 14:27:05 -03:00
/* Read data from i2c device */
2005-11-08 21:38:27 -08:00
ret = dev - > em28xx_read_reg_req_len ( dev , 2 , addr , buf , len ) ;
2013-03-10 07:25:25 -03:00
if ( ret < 0 ) {
em28xx_warn ( " reading from i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
return ret ;
2013-01-03 14:27:05 -03:00
}
2013-03-24 17:09:59 -03:00
/*
* NOTE : some devices with two i2c busses have the bad habit to return 0
2013-03-10 07:25:25 -03:00
* bytes if we are on bus B AND there was no write attempt to the
* specified slave address before AND no device is present at the
* requested slave address .
2014-01-04 05:42:11 -03:00
* Anyway , the next check will fail with - ENXIO in this case , so avoid
2013-03-10 07:25:25 -03:00
* spamming the system log on device probing and do nothing here .
*/
2013-01-03 14:27:05 -03:00
/* Check success of the i2c operation */
ret = dev - > em28xx_read_reg ( dev , 0x05 ) ;
2014-01-04 05:42:11 -03:00
if ( ret = = 0 ) /* success */
return len ;
2005-11-08 21:37:07 -08:00
if ( ret < 0 ) {
2014-01-04 05:42:11 -03:00
em28xx_warn ( " failed to get i2c transfer status from bridge register (error=%i) \n " ,
2013-03-24 14:58:03 -03:00
ret ) ;
2005-11-08 21:37:07 -08:00
return ret ;
}
2014-01-06 09:17:53 -03:00
if ( ret = = 0x10 ) {
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " I2C ACK error on writing to addr 0x%02x \n " ,
2014-01-06 09:17:53 -03:00
addr ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-06 09:17:53 -03:00
}
2014-01-04 05:42:11 -03:00
2014-01-19 18:48:35 -03:00
if ( ret = = 0x02 | | ret = = 0x04 ) {
/* NOTE: these errors seem to be related to clock stretching */
if ( i2c_debug )
em28xx_warn ( " write to i2c device at 0x%x timed out (status=%i) \n " ,
addr , ret ) ;
return - ETIMEDOUT ;
}
em28xx_warn ( " write to i2c device at 0x%x failed with unknown error (status=%i) \n " ,
addr , ret ) ;
return - EIO ;
2005-11-08 21:37:07 -08:00
}
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_check_for_device ( )
2005-11-08 21:37:07 -08:00
* check if there is a i2c_device at the supplied address
*/
2012-12-16 14:23:27 -03:00
static int em28xx_i2c_check_for_device ( struct em28xx * dev , u16 addr )
2005-11-08 21:37:07 -08:00
{
int ret ;
2013-01-03 14:27:05 -03:00
u8 buf ;
2005-11-08 21:37:07 -08:00
2013-01-03 14:27:05 -03:00
ret = em28xx_i2c_recv_bytes ( dev , addr , & buf , 1 ) ;
if ( ret = = 1 )
return 0 ;
return ( ret < 0 ) ? ret : - EIO ;
2005-11-08 21:37:07 -08:00
}
2013-03-26 13:38:36 -03:00
/*
* em25xx_bus_B_send_bytes
* write bytes to the i2c device
*/
static int em25xx_bus_B_send_bytes ( struct em28xx * dev , u16 addr , u8 * buf ,
u16 len )
{
int ret ;
if ( len < 1 | | len > 64 )
return - EOPNOTSUPP ;
/*
* NOTE : limited by the USB ctrl message constraints
* Zero length reads always succeed , even if no device is connected
*/
/* Set register and write value */
ret = dev - > em28xx_write_regs_req ( dev , 0x06 , addr , buf , len ) ;
if ( ret ! = len ) {
if ( ret < 0 ) {
em28xx_warn ( " writing to i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
return ret ;
} else {
em28xx_warn ( " %i bytes write to i2c device at 0x%x requested, but %i bytes written \n " ,
len , addr , ret ) ;
return - EIO ;
}
}
/* Check success */
ret = dev - > em28xx_read_reg_req ( dev , 0x08 , 0x0000 ) ;
/*
* NOTE : the only error we ' ve seen so far is
* 0x01 when the slave device is not present
*/
if ( ! ret )
return len ;
2014-01-06 09:17:53 -03:00
else if ( ret > 0 ) {
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " Bus B R08 returned 0x%02x: I2C ACK error \n " ,
2014-01-06 09:17:53 -03:00
ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-06 09:17:53 -03:00
}
2013-03-26 13:38:36 -03:00
return ret ;
/*
* NOTE : With chip types ( other chip IDs ) which actually don ' t support
* this operation , it seems to succeed ALWAYS ! ( even if there is no
* slave device or even no second i2c bus provided )
*/
}
/*
* em25xx_bus_B_recv_bytes
* read bytes from the i2c device
*/
static int em25xx_bus_B_recv_bytes ( struct em28xx * dev , u16 addr , u8 * buf ,
u16 len )
{
int ret ;
if ( len < 1 | | len > 64 )
return - EOPNOTSUPP ;
/*
* NOTE : limited by the USB ctrl message constraints
* Zero length reads always succeed , even if no device is connected
*/
/* Read value */
ret = dev - > em28xx_read_reg_req_len ( dev , 0x06 , addr , buf , len ) ;
if ( ret < 0 ) {
em28xx_warn ( " reading from i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
return ret ;
}
/*
* NOTE : some devices with two i2c busses have the bad habit to return 0
* bytes if we are on bus B AND there was no write attempt to the
* specified slave address before AND no device is present at the
* requested slave address .
2014-01-04 05:42:11 -03:00
* Anyway , the next check will fail with - ENXIO in this case , so avoid
2013-03-26 13:38:36 -03:00
* spamming the system log on device probing and do nothing here .
*/
/* Check success */
ret = dev - > em28xx_read_reg_req ( dev , 0x08 , 0x0000 ) ;
/*
* NOTE : the only error we ' ve seen so far is
* 0x01 when the slave device is not present
*/
if ( ! ret )
return len ;
2014-01-06 09:17:53 -03:00
else if ( ret > 0 ) {
if ( i2c_debug = = 1 )
2014-01-19 18:48:34 -03:00
em28xx_warn ( " Bus B R08 returned 0x%02x: I2C ACK error \n " ,
2014-01-06 09:17:53 -03:00
ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-06 09:17:53 -03:00
}
2013-03-26 13:38:36 -03:00
return ret ;
/*
* NOTE : With chip types ( other chip IDs ) which actually don ' t support
* this operation , it seems to succeed ALWAYS ! ( even if there is no
* slave device or even no second i2c bus provided )
*/
}
/*
* em25xx_bus_B_check_for_device ( )
* check if there is a i2c device at the supplied address
*/
static int em25xx_bus_B_check_for_device ( struct em28xx * dev , u16 addr )
{
u8 buf ;
int ret ;
ret = em25xx_bus_B_recv_bytes ( dev , addr , & buf , 1 ) ;
if ( ret < 0 )
return ret ;
return 0 ;
/*
* NOTE : With chips which do not support this operation ,
* it seems to succeed ALWAYS ! ( even if no device connected )
*/
}
static inline int i2c_check_for_device ( struct em28xx_i2c_bus * i2c_bus , u16 addr )
{
struct em28xx * dev = i2c_bus - > dev ;
int rc = - EOPNOTSUPP ;
if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX )
rc = em28xx_i2c_check_for_device ( dev , addr ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM2800 )
rc = em2800_i2c_check_for_device ( dev , addr ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM25XX_BUS_B )
rc = em25xx_bus_B_check_for_device ( dev , addr ) ;
return rc ;
}
static inline int i2c_recv_bytes ( struct em28xx_i2c_bus * i2c_bus ,
struct i2c_msg msg )
{
struct em28xx * dev = i2c_bus - > dev ;
u16 addr = msg . addr < < 1 ;
2013-12-28 08:23:30 -03:00
int rc = - EOPNOTSUPP ;
2013-03-26 13:38:36 -03:00
if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX )
rc = em28xx_i2c_recv_bytes ( dev , addr , msg . buf , msg . len ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM2800 )
rc = em2800_i2c_recv_bytes ( dev , addr , msg . buf , msg . len ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM25XX_BUS_B )
rc = em25xx_bus_B_recv_bytes ( dev , addr , msg . buf , msg . len ) ;
return rc ;
}
static inline int i2c_send_bytes ( struct em28xx_i2c_bus * i2c_bus ,
struct i2c_msg msg , int stop )
{
struct em28xx * dev = i2c_bus - > dev ;
u16 addr = msg . addr < < 1 ;
2013-12-28 08:23:30 -03:00
int rc = - EOPNOTSUPP ;
2013-03-26 13:38:36 -03:00
if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX )
rc = em28xx_i2c_send_bytes ( dev , addr , msg . buf , msg . len , stop ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM2800 )
rc = em2800_i2c_send_bytes ( dev , addr , msg . buf , msg . len ) ;
else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM25XX_BUS_B )
rc = em25xx_bus_B_send_bytes ( dev , addr , msg . buf , msg . len ) ;
return rc ;
}
2005-11-08 21:37:07 -08:00
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_xfer ( )
2005-11-08 21:37:07 -08:00
* the main i2c transfer function
*/
2005-11-08 21:38:27 -08:00
static int em28xx_i2c_xfer ( struct i2c_adapter * i2c_adap ,
2005-11-08 21:37:07 -08:00
struct i2c_msg msgs [ ] , int num )
{
2013-03-05 06:55:28 -03:00
struct em28xx_i2c_bus * i2c_bus = i2c_adap - > algo_data ;
struct em28xx * dev = i2c_bus - > dev ;
unsigned bus = i2c_bus - > bus ;
2013-03-26 13:38:36 -03:00
int addr , rc , i ;
2013-03-21 06:03:27 -03:00
u8 reg ;
2005-11-08 21:37:07 -08:00
2014-07-11 18:25:55 -03:00
/* prevent i2c xfer attempts after device is disconnected
some fe ' s try to do i2c writes / reads from their release
interfaces when called in disconnect path */
if ( dev - > disconnected )
return - ENODEV ;
2013-03-05 06:55:28 -03:00
rc = rt_mutex_trylock ( & dev - > i2c_bus_lock ) ;
if ( rc < 0 )
return rc ;
/* Switch I2C bus if needed */
2013-03-26 13:38:36 -03:00
if ( bus ! = dev - > cur_i2c_bus & &
i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX ) {
2013-03-05 06:55:28 -03:00
if ( bus = = 1 )
2013-03-21 06:03:27 -03:00
reg = EM2874_I2C_SECONDARY_BUS_SELECT ;
2013-03-05 06:55:28 -03:00
else
2013-03-21 06:03:27 -03:00
reg = 0 ;
em28xx_write_reg_bits ( dev , EM28XX_R06_I2C_CLK , reg ,
EM2874_I2C_SECONDARY_BUS_SELECT ) ;
2013-03-05 06:55:28 -03:00
dev - > cur_i2c_bus = bus ;
}
if ( num < = 0 ) {
rt_mutex_unlock ( & dev - > i2c_bus_lock ) ;
2005-11-08 21:37:07 -08:00
return 0 ;
2013-03-05 06:55:28 -03:00
}
2005-11-08 21:37:07 -08:00
for ( i = 0 ; i < num ; i + + ) {
addr = msgs [ i ] . addr < < 1 ;
2013-12-28 08:23:30 -03:00
if ( i2c_debug > 1 )
2013-03-03 15:37:35 -03:00
printk ( KERN_DEBUG " %s at %s: %s %s addr=%02x len=%d: " ,
dev - > name , __func__ ,
( msgs [ i ] . flags & I2C_M_RD ) ? " read " : " write " ,
i = = num - 1 ? " stop " : " nonstop " ,
addr , msgs [ i ] . len ) ;
2014-01-04 05:42:11 -03:00
if ( ! msgs [ i ] . len ) {
/*
* no len : check only for device presence
* This code is only called during device probe .
*/
2013-03-26 13:38:36 -03:00
rc = i2c_check_for_device ( i2c_bus , addr ) ;
2013-12-28 08:23:30 -03:00
if ( rc < 0 ) {
if ( rc = = - ENXIO ) {
if ( i2c_debug > 1 )
printk ( KERN_CONT " no device \n " ) ;
rc = - ENODEV ;
} else {
if ( i2c_debug > 1 )
printk ( KERN_CONT " ERROR: %i \n " , rc ) ;
}
2013-03-05 06:55:28 -03:00
rt_mutex_unlock ( & dev - > i2c_bus_lock ) ;
2013-12-28 08:23:30 -03:00
return rc ;
2005-11-08 21:37:07 -08:00
}
2005-11-08 21:37:24 -08:00
} else if ( msgs [ i ] . flags & I2C_M_RD ) {
2005-11-08 21:37:07 -08:00
/* read bytes */
2013-03-26 13:38:36 -03:00
rc = i2c_recv_bytes ( i2c_bus , msgs [ i ] ) ;
2013-12-28 08:23:30 -03:00
if ( i2c_debug > 1 & & rc > = 0 )
printk ( KERN_CONT " %*ph " ,
msgs [ i ] . len , msgs [ i ] . buf ) ;
2005-11-08 21:37:07 -08:00
} else {
2013-12-28 08:23:30 -03:00
if ( i2c_debug > 1 )
printk ( KERN_CONT " %*ph " ,
msgs [ i ] . len , msgs [ i ] . buf ) ;
2005-11-08 21:37:07 -08:00
/* write bytes */
2013-03-26 13:38:36 -03:00
rc = i2c_send_bytes ( i2c_bus , msgs [ i ] , i = = num - 1 ) ;
2005-11-08 21:37:07 -08:00
}
2013-01-03 14:27:05 -03:00
if ( rc < 0 ) {
2013-12-28 08:23:30 -03:00
if ( i2c_debug > 1 )
printk ( KERN_CONT " ERROR: %i \n " , rc ) ;
2013-03-05 06:55:28 -03:00
rt_mutex_unlock ( & dev - > i2c_bus_lock ) ;
2013-01-03 14:27:05 -03:00
return rc ;
}
2013-12-28 08:23:30 -03:00
if ( i2c_debug > 1 )
printk ( KERN_CONT " \n " ) ;
2005-11-08 21:37:07 -08:00
}
2013-03-05 06:55:28 -03:00
rt_mutex_unlock ( & dev - > i2c_bus_lock ) ;
2005-11-08 21:37:07 -08:00
return num ;
}
2013-03-24 17:09:59 -03:00
/*
* based on linux / sunrpc / svcauth . h and linux / hash . h
2007-11-03 21:20:59 -03:00
* The original hash function returns a different value , if arch is x86_64
2013-03-24 17:09:59 -03:00
* or i386 .
2007-11-03 21:20:59 -03:00
*/
static inline unsigned long em28xx_hash_mem ( char * buf , int length , int bits )
{
unsigned long hash = 0 ;
unsigned long l = 0 ;
int len = 0 ;
unsigned char c ;
2014-11-28 08:34:15 -03:00
2007-11-03 21:20:59 -03:00
do {
if ( len = = length ) {
c = ( char ) len ;
len = - 1 ;
} else
c = * buf + + ;
l = ( l < < 8 ) | c ;
len + + ;
if ( ( len & ( 32 / 8 - 1 ) ) = = 0 )
hash = ( ( hash ^ l ) * 0x9e370001UL ) ;
} while ( len ) ;
return ( hash > > ( 32 - bits ) ) & 0xffffffffUL ;
}
2013-03-24 17:09:59 -03:00
/*
* Helper function to read data blocks from i2c clients with 8 or 16 bit
* address width , 8 bit register width and auto incrementation been activated
*/
2013-03-05 06:55:28 -03:00
static int em28xx_i2c_read_block ( struct em28xx * dev , unsigned bus , u16 addr ,
bool addr_w16 , u16 len , u8 * data )
2013-03-03 15:37:41 -03:00
{
int remain = len , rsize , rsize_max , ret ;
u8 buf [ 2 ] ;
/* Sanity check */
if ( addr + remain > ( addr_w16 * 0xff00 + 0xff + 1 ) )
return - EINVAL ;
/* Select address */
buf [ 0 ] = addr > > 8 ;
buf [ 1 ] = addr & 0xff ;
2013-03-05 06:55:28 -03:00
ret = i2c_master_send ( & dev - > i2c_client [ bus ] , buf + ! addr_w16 , 1 + addr_w16 ) ;
2013-03-03 15:37:41 -03:00
if ( ret < 0 )
return ret ;
/* Read data */
if ( dev - > board . is_em2800 )
rsize_max = 4 ;
else
rsize_max = 64 ;
while ( remain > 0 ) {
if ( remain > rsize_max )
rsize = rsize_max ;
else
rsize = remain ;
2013-03-05 06:55:28 -03:00
ret = i2c_master_recv ( & dev - > i2c_client [ bus ] , data , rsize ) ;
2013-03-03 15:37:41 -03:00
if ( ret < 0 )
return ret ;
remain - = rsize ;
data + = rsize ;
}
return len ;
}
2013-03-05 06:55:28 -03:00
static int em28xx_i2c_eeprom ( struct em28xx * dev , unsigned bus ,
u8 * * eedata , u16 * eedata_len )
2005-11-08 21:37:07 -08:00
{
2013-03-03 15:37:43 -03:00
const u16 len = 256 ;
2013-03-24 17:09:59 -03:00
/*
* FIXME common length / size for bytes to read , to display , hash
2013-03-03 15:37:43 -03:00
* calculation and returned device dataset . Simplifies the code a lot ,
2013-03-24 17:09:59 -03:00
* but we might have to deal with multiple sizes in the future !
*/
2013-12-28 08:23:30 -03:00
int err ;
2013-03-03 15:37:43 -03:00
struct em28xx_eeprom * dev_config ;
u8 buf , * data ;
2005-11-08 21:37:07 -08:00
2013-03-03 15:37:42 -03:00
* eedata = NULL ;
2013-03-03 15:37:43 -03:00
* eedata_len = 0 ;
2013-03-03 15:37:42 -03:00
2013-03-05 06:55:28 -03:00
/* EEPROM is always on i2c bus 0 on all known devices. */
dev - > i2c_client [ bus ] . addr = 0xa0 > > 1 ;
2005-11-08 21:37:24 -08:00
/* Check if board has eeprom */
2013-03-05 06:55:28 -03:00
err = i2c_master_recv ( & dev - > i2c_client [ bus ] , & buf , 0 ) ;
2008-09-08 03:27:20 -03:00
if ( err < 0 ) {
2013-03-03 15:37:34 -03:00
em28xx_info ( " board has no eeprom \n " ) ;
2008-11-15 23:44:14 -03:00
return - ENODEV ;
2008-09-08 03:27:20 -03:00
}
2005-11-08 21:37:24 -08:00
2013-03-03 15:37:42 -03:00
data = kzalloc ( len , GFP_KERNEL ) ;
if ( data = = NULL )
return - ENOMEM ;
2013-03-03 15:37:41 -03:00
/* Read EEPROM content */
2013-03-05 06:55:28 -03:00
err = em28xx_i2c_read_block ( dev , bus , 0x0000 ,
dev - > eeprom_addrwidth_16bit ,
2013-03-03 15:37:42 -03:00
len , data ) ;
2013-03-03 15:37:41 -03:00
if ( err ! = len ) {
2013-03-03 15:37:34 -03:00
em28xx_errdev ( " failed to read eeprom (err=%d) \n " , err ) ;
2013-03-03 15:37:43 -03:00
goto error ;
2005-11-08 21:37:07 -08:00
}
2013-01-03 14:27:06 -03:00
2013-12-28 08:23:30 -03:00
if ( i2c_debug ) {
/* Display eeprom content */
print_hex_dump ( KERN_INFO , " eeprom " , DUMP_PREFIX_OFFSET ,
16 , 1 , data , len , true ) ;
if ( dev - > eeprom_addrwidth_16bit )
em28xx_info ( " eeprom %06x: ... (skipped) \n " , 256 ) ;
2005-11-08 21:37:07 -08:00
}
2013-03-03 15:37:40 -03:00
if ( dev - > eeprom_addrwidth_16bit & &
2013-03-03 15:37:42 -03:00
data [ 0 ] = = 0x26 & & data [ 3 ] = = 0x00 ) {
2013-03-03 15:37:40 -03:00
/* new eeprom format; size 4-64kb */
2013-03-03 15:37:43 -03:00
u16 mc_start ;
u16 hwconf_offset ;
2013-03-03 15:37:42 -03:00
dev - > hash = em28xx_hash_mem ( data , len , 32 ) ;
2013-03-03 15:37:43 -03:00
mc_start = ( data [ 1 ] < < 8 ) + 4 ; /* usually 0x0004 */
2013-03-24 14:58:03 -03:00
em28xx_info ( " EEPROM ID = %02x %02x %02x %02x, EEPROM hash = 0x%08lx \n " ,
2013-03-03 15:37:43 -03:00
data [ 0 ] , data [ 1 ] , data [ 2 ] , data [ 3 ] , dev - > hash ) ;
em28xx_info ( " EEPROM info: \n " ) ;
2013-03-24 14:58:03 -03:00
em28xx_info ( " \t microcode start address = 0x%04x, boot configuration = 0x%02x \n " ,
2013-03-03 15:37:43 -03:00
mc_start , data [ 2 ] ) ;
2013-03-24 17:09:59 -03:00
/*
* boot configuration ( address 0x0002 ) :
2013-03-03 15:37:40 -03:00
* [ 0 ] microcode download speed : 1 = 400 kHz ; 0 = 100 kHz
* [ 1 ] always selects 12 kb RAM
* [ 2 ] USB device speed : 1 = force Full Speed ; 0 = auto detect
* [ 4 ] 1 = force fast mode and no suspend for device testing
* [ 5 : 7 ] USB PHY tuning registers ; determined by device
* characterization
*/
2013-03-24 17:09:59 -03:00
/*
* Read hardware config dataset offset from address
* ( microcode start + 46 )
*/
2013-03-05 06:55:28 -03:00
err = em28xx_i2c_read_block ( dev , bus , mc_start + 46 , 1 , 2 ,
data ) ;
2013-03-03 15:37:43 -03:00
if ( err ! = 2 ) {
em28xx_errdev ( " failed to read hardware configuration data from eeprom (err=%d) \n " ,
err ) ;
goto error ;
}
/* Calculate hardware config dataset start address */
hwconf_offset = mc_start + data [ 0 ] + ( data [ 1 ] < < 8 ) ;
/* Read hardware config dataset */
2013-03-24 17:09:59 -03:00
/*
* NOTE : the microcode copy can be multiple pages long , but
2013-03-03 15:37:43 -03:00
* we assume the hardware config dataset is the same as in
* the old eeprom and not longer than 256 bytes .
* tveeprom is currently also limited to 256 bytes .
2013-03-03 15:37:40 -03:00
*/
2013-03-05 06:55:28 -03:00
err = em28xx_i2c_read_block ( dev , bus , hwconf_offset , 1 , len ,
data ) ;
2013-03-03 15:37:43 -03:00
if ( err ! = len ) {
em28xx_errdev ( " failed to read hardware configuration data from eeprom (err=%d) \n " ,
err ) ;
goto error ;
}
2013-03-03 15:37:40 -03:00
2013-03-03 15:37:43 -03:00
/* Verify hardware config dataset */
/* NOTE: not all devices provide this type of dataset */
if ( data [ 0 ] ! = 0x1a | | data [ 1 ] ! = 0xeb | |
data [ 2 ] ! = 0x67 | | data [ 3 ] ! = 0x95 ) {
em28xx_info ( " \t no hardware configuration dataset found in eeprom \n " ) ;
kfree ( data ) ;
return 0 ;
}
/* TODO: decrypt eeprom data for camera bridges (em25xx, em276x+) */
} else if ( ! dev - > eeprom_addrwidth_16bit & &
data [ 0 ] = = 0x1a & & data [ 1 ] = = 0xeb & &
data [ 2 ] = = 0x67 & & data [ 3 ] = = 0x95 ) {
dev - > hash = em28xx_hash_mem ( data , len , 32 ) ;
2013-03-24 14:58:03 -03:00
em28xx_info ( " EEPROM ID = %02x %02x %02x %02x, EEPROM hash = 0x%08lx \n " ,
2013-03-03 15:37:43 -03:00
data [ 0 ] , data [ 1 ] , data [ 2 ] , data [ 3 ] , dev - > hash ) ;
em28xx_info ( " EEPROM info: \n " ) ;
} else {
2013-03-03 15:37:40 -03:00
em28xx_info ( " unknown eeprom format or eeprom corrupted ! \n " ) ;
2013-03-03 15:37:43 -03:00
err = - ENODEV ;
goto error ;
2013-03-03 15:37:37 -03:00
}
2013-03-03 15:37:42 -03:00
* eedata = data ;
2013-03-03 15:37:43 -03:00
* eedata_len = len ;
2013-07-16 18:57:53 -03:00
dev_config = ( void * ) * eedata ;
2013-03-03 15:37:42 -03:00
2013-03-03 15:37:43 -03:00
switch ( le16_to_cpu ( dev_config - > chip_conf ) > > 4 & 0x3 ) {
2005-11-08 21:37:07 -08:00
case 0 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t No audio on board. \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 1 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t AC97 audio (5 sample rates) \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 2 :
2013-12-22 11:17:46 -03:00
if ( dev - > chip_id < CHIP_ID_EM2860 )
em28xx_info ( " \t I2S audio, sample rate=32k \n " ) ;
else
em28xx_info ( " \t I2S audio, 3 sample rates \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 3 :
2013-12-22 11:17:46 -03:00
if ( dev - > chip_id < CHIP_ID_EM2860 )
em28xx_info ( " \t I2S audio, 3 sample rates \n " ) ;
else
em28xx_info ( " \t I2S audio, 5 sample rates \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
}
2013-03-03 15:37:43 -03:00
if ( le16_to_cpu ( dev_config - > chip_conf ) & 1 < < 3 )
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t USB Remote wakeup capable \n " ) ;
2005-11-08 21:37:07 -08:00
2013-03-03 15:37:43 -03:00
if ( le16_to_cpu ( dev_config - > chip_conf ) & 1 < < 2 )
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t USB Self power capable \n " ) ;
2005-11-08 21:37:07 -08:00
2013-03-03 15:37:43 -03:00
switch ( le16_to_cpu ( dev_config - > chip_conf ) & 0x3 ) {
2005-11-08 21:37:07 -08:00
case 0 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t 500mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 1 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t 400mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 2 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t 300mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 3 :
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t 200mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
}
2013-03-03 15:37:34 -03:00
em28xx_info ( " \t Table at offset 0x%02x, strings=0x%04x, 0x%04x, 0x%04x \n " ,
2013-03-03 15:37:43 -03:00
dev_config - > string_idx_table ,
le16_to_cpu ( dev_config - > string1 ) ,
le16_to_cpu ( dev_config - > string2 ) ,
le16_to_cpu ( dev_config - > string3 ) ) ;
2005-11-08 21:37:07 -08:00
return 0 ;
2013-03-03 15:37:43 -03:00
error :
kfree ( data ) ;
return err ;
2005-11-08 21:37:07 -08:00
}
/* ----------------------------------------------------------- */
/*
* functionality ( )
*/
2013-03-05 06:55:28 -03:00
static u32 functionality ( struct i2c_adapter * i2c_adap )
2005-11-08 21:37:07 -08:00
{
2013-03-05 06:55:28 -03:00
struct em28xx_i2c_bus * i2c_bus = i2c_adap - > algo_data ;
2013-03-26 13:38:36 -03:00
if ( ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX ) | |
( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM25XX_BUS_B ) ) {
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL ;
} else if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM2800 ) {
return ( I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL ) &
~ I2C_FUNC_SMBUS_WRITE_BLOCK_DATA ;
}
WARN ( 1 , " Unknown i2c bus algorithm. \n " ) ;
return 0 ;
2005-11-08 21:37:07 -08:00
}
2005-11-08 21:38:27 -08:00
static struct i2c_algorithm em28xx_algo = {
. master_xfer = em28xx_i2c_xfer ,
2005-11-08 21:37:07 -08:00
. functionality = functionality ,
} ;
2005-11-08 21:38:27 -08:00
static struct i2c_adapter em28xx_adap_template = {
2005-11-08 21:37:07 -08:00
. owner = THIS_MODULE ,
2005-11-08 21:38:27 -08:00
. name = " em28xx " ,
. algo = & em28xx_algo ,
2005-11-08 21:37:07 -08:00
} ;
2005-11-08 21:38:27 -08:00
static struct i2c_client em28xx_client_template = {
. name = " em28xx internal " ,
2005-11-08 21:37:07 -08:00
} ;
/* ----------------------------------------------------------- */
/*
* i2c_devs
* incomplete list of known devices
*/
static char * i2c_devs [ 128 ] = {
2014-11-11 19:43:51 -03:00
[ 0x1c > > 1 ] = " lgdt330x " ,
2013-01-13 10:15:08 -03:00
[ 0x3e > > 1 ] = " remote IR sensor " ,
2005-11-08 21:37:07 -08:00
[ 0x4a > > 1 ] = " saa7113h " ,
2012-06-12 18:19:27 -03:00
[ 0x52 > > 1 ] = " drxk " ,
2005-11-08 21:37:07 -08:00
[ 0x60 > > 1 ] = " remote IR sensor " ,
2005-11-08 21:37:31 -08:00
[ 0x8e > > 1 ] = " remote IR sensor " ,
2005-11-08 21:37:07 -08:00
[ 0x86 > > 1 ] = " tda9887 " ,
[ 0x80 > > 1 ] = " msp34xx " ,
[ 0x88 > > 1 ] = " msp34xx " ,
[ 0xa0 > > 1 ] = " eeprom " ,
2009-03-04 08:27:52 -03:00
[ 0xb0 > > 1 ] = " tda9874 " ,
2005-11-08 21:37:07 -08:00
[ 0xb8 > > 1 ] = " tvp5150a " ,
2009-07-03 15:36:18 -03:00
[ 0xba > > 1 ] = " webcam sensor or tvp5150a " ,
2005-11-08 21:37:07 -08:00
[ 0xc0 > > 1 ] = " tuner (analog) " ,
[ 0xc2 > > 1 ] = " tuner (analog) " ,
[ 0xc4 > > 1 ] = " tuner (analog) " ,
[ 0xc6 > > 1 ] = " tuner (analog) " ,
} ;
/*
* do_i2c_scan ( )
* check i2c address range for devices
*/
2013-03-05 06:55:28 -03:00
void em28xx_do_i2c_scan ( struct em28xx * dev , unsigned bus )
2005-11-08 21:37:07 -08:00
{
2007-11-04 08:06:48 -03:00
u8 i2c_devicelist [ 128 ] ;
2005-11-08 21:37:07 -08:00
unsigned char buf ;
int i , rc ;
2007-11-04 08:06:48 -03:00
memset ( i2c_devicelist , 0 , ARRAY_SIZE ( i2c_devicelist ) ) ;
2007-03-29 08:42:30 -03:00
for ( i = 0 ; i < ARRAY_SIZE ( i2c_devs ) ; i + + ) {
2013-03-05 06:55:28 -03:00
dev - > i2c_client [ bus ] . addr = i ;
rc = i2c_master_recv ( & dev - > i2c_client [ bus ] , & buf , 0 ) ;
2005-11-08 21:37:07 -08:00
if ( rc < 0 )
continue ;
2007-11-04 08:06:48 -03:00
i2c_devicelist [ i ] = i ;
2013-03-05 06:55:28 -03:00
em28xx_info ( " found i2c device @ 0x%x on bus %d [%s] \n " ,
i < < 1 , bus , i2c_devs [ i ] ? i2c_devs [ i ] : " ??? " ) ;
2005-11-08 21:37:07 -08:00
}
2007-11-04 08:06:48 -03:00
2013-03-05 06:55:28 -03:00
if ( bus = = dev - > def_i2c_bus )
dev - > i2c_hash = em28xx_hash_mem ( i2c_devicelist ,
ARRAY_SIZE ( i2c_devicelist ) , 32 ) ;
2005-11-08 21:37:07 -08:00
}
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_register ( )
2005-11-08 21:37:07 -08:00
* register i2c bus
*/
2013-03-26 13:38:36 -03:00
int em28xx_i2c_register ( struct em28xx * dev , unsigned bus ,
enum em28xx_i2c_algo_type algo_type )
2005-11-08 21:37:07 -08:00
{
2008-09-08 03:27:20 -03:00
int retval ;
2005-11-08 21:38:27 -08:00
BUG_ON ( ! dev - > em28xx_write_regs | | ! dev - > em28xx_read_reg ) ;
BUG_ON ( ! dev - > em28xx_write_regs_req | | ! dev - > em28xx_read_reg_req ) ;
2008-09-08 03:27:20 -03:00
2013-03-05 06:55:28 -03:00
if ( bus > = NUM_I2C_BUSES )
return - ENODEV ;
dev - > i2c_adap [ bus ] = em28xx_adap_template ;
dev - > i2c_adap [ bus ] . dev . parent = & dev - > udev - > dev ;
strcpy ( dev - > i2c_adap [ bus ] . name , dev - > name ) ;
dev - > i2c_bus [ bus ] . bus = bus ;
2013-03-26 13:38:36 -03:00
dev - > i2c_bus [ bus ] . algo_type = algo_type ;
2013-03-05 06:55:28 -03:00
dev - > i2c_bus [ bus ] . dev = dev ;
dev - > i2c_adap [ bus ] . algo_data = & dev - > i2c_bus [ bus ] ;
retval = i2c_add_adapter ( & dev - > i2c_adap [ bus ] ) ;
2008-09-08 03:27:20 -03:00
if ( retval < 0 ) {
em28xx_errdev ( " %s: i2c_add_adapter failed! retval [%d] \n " ,
2014-11-28 08:34:15 -03:00
__func__ , retval ) ;
2008-09-08 03:27:20 -03:00
return retval ;
}
2005-11-08 21:37:07 -08:00
2013-03-05 06:55:28 -03:00
dev - > i2c_client [ bus ] = em28xx_client_template ;
dev - > i2c_client [ bus ] . adapter = & dev - > i2c_adap [ bus ] ;
2005-11-08 21:37:07 -08:00
2013-03-05 06:55:28 -03:00
/* Up to now, all eeproms are at bus 0 */
if ( ! bus ) {
retval = em28xx_i2c_eeprom ( dev , bus , & dev - > eedata , & dev - > eedata_len ) ;
if ( ( retval < 0 ) & & ( retval ! = - ENODEV ) ) {
em28xx_errdev ( " %s: em28xx_i2_eeprom failed! retval [%d] \n " ,
2014-11-28 08:34:15 -03:00
__func__ , retval ) ;
2008-11-15 23:44:14 -03:00
2013-03-05 06:55:28 -03:00
return retval ;
}
2008-09-08 03:27:20 -03:00
}
2005-11-08 21:37:07 -08:00
if ( i2c_scan )
2013-03-05 06:55:28 -03:00
em28xx_do_i2c_scan ( dev , bus ) ;
2008-11-15 23:44:14 -03:00
2005-11-08 21:37:07 -08:00
return 0 ;
}
/*
2005-11-08 21:38:27 -08:00
* em28xx_i2c_unregister ( )
2005-11-08 21:37:07 -08:00
* unregister i2c_bus
*/
2013-03-05 06:55:28 -03:00
int em28xx_i2c_unregister ( struct em28xx * dev , unsigned bus )
2005-11-08 21:37:07 -08:00
{
2013-03-05 06:55:28 -03:00
if ( bus > = NUM_I2C_BUSES )
return - ENODEV ;
i2c_del_adapter ( & dev - > i2c_adap [ bus ] ) ;
2005-11-08 21:37:07 -08:00
return 0 ;
}