2018-03-03 10:43:14 -05:00
// SPDX-License-Identifier: GPL-2.0+
//
// em28xx-i2c.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
//
// Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
// Markus Rechberger <mrechberger@gmail.com>
MAINTAINERS & files: Canonize the e-mails I use at files
From now on, I'll start using my @kernel.org as my development e-mail.
As such, let's remove the entries that point to the old
mchehab@s-opensource.com at MAINTAINERS file.
For the files written with a copyright with mchehab@s-opensource,
let's keep Samsung on their names, using mchehab+samsung@kernel.org,
in order to keep pointing to my employer, with sponsors the work.
For the files written before I join Samsung (on July, 4 2013),
let's just use mchehab@kernel.org.
For bug reports, we can simply point to just kernel.org, as
this will reach my mchehab+samsung inbox anyway.
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: Brian Warner <brian.warner@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2018-04-25 05:34:48 -04:00
// Mauro Carvalho Chehab <mchehab@kernel.org>
2018-03-03 10:43:14 -05:00
// Sascha Sommer <saschasommer@freenet.de>
// Copyright (C) 2013 Frank Schäfer <fschaefer.oss@googlemail.com>
//
// 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.
2005-11-08 21:37:07 -08:00
2016-10-12 07:26:47 -03:00
# include "em28xx.h"
2005-11-08 21:37:07 -08:00
# 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
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
2016-10-20 08:42:03 -02:00
# define dprintk(level, fmt, arg...) do { \
if ( i2c_debug > level ) \
2016-12-07 13:48:10 -02:00
dev_printk ( KERN_DEBUG , & dev - > intf - > dev , \
2016-10-20 08:42:03 -02:00
" i2c: %s: " fmt , __func__ , # # arg ) ; \
} while ( 0 )
2018-03-01 12:54:06 -05:00
/*
* Time in msecs to wait for i2c xfers to finish .
* 35 ms is the maximum time a SMBUS device could wait when
* clock stretching is used . As the transfer itself will take
* some time to happen , set it to 35 ms .
*
* Ok , I2C doesn ' t specify any limit . So , eventually , we may need
* to increase this timeout .
*/
# define EM28XX_I2C_XFER_TIMEOUT 35 /* ms */
static int em28xx_i2c_timeout ( struct em28xx * dev )
{
int time = EM28XX_I2C_XFER_TIMEOUT ;
switch ( dev - > i2c_speed & 0x03 ) {
case EM28XX_I2C_FREQ_25_KHZ :
time + = 4 ; /* Assume 4 ms for transfers */
break ;
case EM28XX_I2C_FREQ_100_KHZ :
case EM28XX_I2C_FREQ_400_KHZ :
time + = 1 ; /* Assume 1 ms for transfers */
break ;
default : /* EM28XX_I2C_FREQ_1_5_MHZ */
break ;
}
return msecs_to_jiffies ( time ) ;
}
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
{
2018-03-01 12:54:06 -05:00
unsigned long timeout = jiffies + em28xx_i2c_timeout ( dev ) ;
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
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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to trigger write to i2c address 0x%x (error=%i) \n " ,
2013-03-24 14:58:03 -03:00
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 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " R05 returned 0x%02x: I2C ACK error \n " , ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to get i2c transfer status from bridge register (error=%i) \n " ,
2016-10-12 07:32:23 -03:00
ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
}
2018-03-03 14:15:57 -05:00
usleep_range ( 5000 , 6000 ) ;
2005-11-08 21:37:24 -08:00
}
2016-10-20 08:42:03 -02:00
dprintk ( 0 , " 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
{
2018-03-01 12:54:06 -05:00
unsigned long timeout = jiffies + em28xx_i2c_timeout ( dev ) ;
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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " R05 returned 0x%02x: I2C ACK error \n " ,
ret ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to get i2c transfer status from bridge register (error=%i) \n " ,
ret ) ;
2013-01-03 14:27:03 -03:00
return ret ;
}
2018-03-03 14:15:57 -05:00
usleep_range ( 5000 , 6000 ) ;
2005-11-08 21:37:24 -08:00
}
2018-03-03 14:15:57 -05:00
if ( ret ! = 0x84 + len - 1 )
2016-10-20 08:42:03 -02:00
dprintk ( 0 , " read from i2c device at 0x%x timed out \n " , addr ) ;
2013-01-03 14:27:03 -03:00
/* get the received message */
2018-03-03 14:15:57 -05:00
ret = dev - > em28xx_read_reg_req_len ( dev , 0x00 , 4 - len , buf2 , len ) ;
2013-01-03 14:27:03 -03:00
if ( ret ! = len ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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
{
2018-03-01 12:54:06 -05:00
unsigned long timeout = jiffies + em28xx_i2c_timeout ( dev ) ;
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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" writing to i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
}
2018-03-03 14:15:57 -05:00
dev_warn ( & dev - > intf - > dev ,
" %i bytes write to i2c device at 0x%x requested, but %i bytes written \n " ,
len , addr , ret ) ;
return - EIO ;
2013-01-03 14:27:05 -03:00
}
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 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " I2C ACK error on writing to addr 0x%02x \n " ,
addr ) ;
2014-01-04 05:42:11 -03:00
return - ENXIO ;
2014-01-04 05:42:11 -03:00
}
if ( ret < 0 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to get i2c transfer status from bridge register (error=%i) \n " ,
ret ) ;
2013-01-03 14:27:05 -03:00
return ret ;
}
2018-03-03 14:15:57 -05:00
usleep_range ( 5000 , 6000 ) ;
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 */
2016-10-20 08:42:03 -02:00
dprintk ( 0 ,
" write to i2c device at 0x%x timed out (status=%i) \n " ,
addr , ret ) ;
2014-01-19 18:48:35 -03:00
return - ETIMEDOUT ;
}
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" write to i2c device at 0x%x failed with unknown error (status=%i) \n " ,
addr , ret ) ;
2014-01-19 18:48:35 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" reading from i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
2013-03-10 07:25:25 -03:00
return ret ;
2013-01-03 14:27:05 -03:00
}
2013-03-24 17:09:59 -03:00
/*
2019-02-18 14:29:03 -05:00
* NOTE : some devices with two i2c buses 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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to get i2c transfer status from bridge register (error=%i) \n " ,
ret ) ;
2005-11-08 21:37:07 -08:00
return ret ;
}
2014-01-06 09:17:53 -03:00
if ( ret = = 0x10 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " I2C ACK error on writing to addr 0x%02x \n " ,
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 */
2016-10-20 08:42:03 -02:00
dprintk ( 0 ,
" write to i2c device at 0x%x timed out (status=%i) \n " ,
addr , ret ) ;
2014-01-19 18:48:35 -03:00
return - ETIMEDOUT ;
}
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" write to i2c device at 0x%x failed with unknown error (status=%i) \n " ,
addr , ret ) ;
2014-01-19 18:48:35 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" writing to i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
2013-03-26 13:38:36 -03:00
return ret ;
}
2018-03-03 14:15:57 -05:00
dev_warn ( & dev - > intf - > dev ,
" %i bytes write to i2c device at 0x%x requested, but %i bytes written \n " ,
len , addr , ret ) ;
return - EIO ;
2013-03-26 13:38:36 -03:00
}
/* 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 ;
2018-03-03 14:15:57 -05:00
if ( ret > 0 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " Bus B R08 returned 0x%02x: I2C ACK error \n " , 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 ) {
2016-12-07 13:48:10 -02:00
dev_warn ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" reading from i2c device at 0x%x failed (error=%i) \n " ,
addr , ret ) ;
2013-03-26 13:38:36 -03:00
return ret ;
}
/*
2019-02-18 14:29:03 -05:00
* NOTE : some devices with two i2c buses have the bad habit to return 0
2013-03-26 13:38:36 -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-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 ;
2018-03-03 14:15:57 -05:00
if ( ret > 0 ) {
2016-10-20 08:42:03 -02:00
dprintk ( 1 , " Bus B R08 returned 0x%02x: I2C ACK error \n " , 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 ;
2018-03-03 14:15:57 -05:00
unsigned int 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
2018-03-03 14:15:57 -05: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
*/
2014-07-11 18:25:55 -03:00
if ( dev - > disconnected )
return - ENODEV ;
2016-05-09 05:22:55 -03:00
if ( ! rt_mutex_trylock ( & dev - > i2c_bus_lock ) )
return - EAGAIN ;
2013-03-05 06:55:28 -03:00
/* 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 ;
}
2005-11-08 21:37:07 -08:00
for ( i = 0 ; i < num ; i + + ) {
addr = msgs [ i ] . addr < < 1 ;
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 ) ;
2016-10-20 08:42:03 -02:00
if ( rc = = - ENXIO )
rc = - ENODEV ;
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 ] ) ;
2005-11-08 21:37:07 -08:00
} else {
/* 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
}
2016-10-20 08:42:03 -02:00
if ( rc < 0 )
goto error ;
dprintk ( 2 , " %s %s addr=%02x len=%d: %*ph \n " ,
( msgs [ i ] . flags & I2C_M_RD ) ? " read " : " write " ,
i = = num - 1 ? " stop " : " nonstop " ,
addr , msgs [ i ] . len ,
msgs [ i ] . len , msgs [ i ] . buf ) ;
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 ;
2016-10-20 08:42:03 -02:00
error :
dprintk ( 2 , " %s %s addr=%02x len=%d: %sERROR: %i \n " ,
( msgs [ i ] . flags & I2C_M_RD ) ? " read " : " write " ,
i = = num - 1 ? " stop " : " nonstop " ,
addr , msgs [ i ] . len ,
( rc = = - ENODEV ) ? " no device " : " " ,
rc ) ;
rt_mutex_unlock ( & dev - > i2c_bus_lock ) ;
return rc ;
2005-11-08 21:37:07 -08:00
}
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 ;
2018-03-03 14:15:57 -05:00
} else {
2007-11-03 21:20:59 -03:00
c = * buf + + ;
2018-03-03 14:15:57 -05:00
}
2007-11-03 21:20:59 -03:00
l = ( l < < 8 ) | c ;
len + + ;
if ( ( len & ( 32 / 8 - 1 ) ) = = 0 )
2018-03-03 14:15:57 -05:00
hash = ( ( hash ^ l ) * 0x9e370001UL ) ;
2007-11-03 21:20:59 -03:00
} 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
*/
2018-03-03 14:15:57 -05:00
static int em28xx_i2c_read_block ( struct em28xx * dev , unsigned int bus , u16 addr ,
2013-03-05 06:55:28 -03:00
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 ;
2018-03-03 14:15:57 -05: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 ;
}
2018-03-03 14:15:57 -05:00
static int em28xx_i2c_eeprom ( struct em28xx * dev , unsigned int bus ,
2013-03-05 06:55:28 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " 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 ) ;
2018-03-03 14:15:57 -05:00
if ( ! data )
2013-03-03 15:37:42 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_err ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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 */
2016-10-20 08:42:03 -02:00
print_hex_dump ( KERN_DEBUG , " em28xx eeprom " , DUMP_PREFIX_OFFSET ,
2013-12-28 08:23:30 -03:00
16 , 1 , data , len , true ) ;
if ( dev - > eeprom_addrwidth_16bit )
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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 */
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2018-02-09 09:13:26 -05:00
" EEPROM ID = %4ph, EEPROM hash = 0x%08lx \n " ,
data , dev - > hash ) ;
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" EEPROM info: \n " ) ;
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \t microcode start address = 0x%04x, boot configuration = 0x%02x \n " ,
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 ) {
2016-12-07 13:48:10 -02:00
dev_err ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to read hardware configuration data from eeprom (err=%d) \n " ,
err ) ;
2013-03-03 15:37:43 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_err ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" failed to read hardware configuration data from eeprom (err=%d) \n " ,
err ) ;
2013-03-03 15:37:43 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \t no hardware configuration dataset found in eeprom \n " ) ;
2013-03-03 15:37:43 -03:00
kfree ( data ) ;
return 0 ;
}
2018-03-03 14:15:57 -05:00
/*
* TODO : decrypt eeprom data for camera bridges
* ( em25xx , em276x + )
*/
2013-03-03 15:37:43 -03:00
} 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 ) ;
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2018-02-09 09:13:26 -05:00
" EEPROM ID = %4ph, EEPROM hash = 0x%08lx \n " ,
data , dev - > hash ) ;
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" EEPROM info: \n " ) ;
2013-03-03 15:37:43 -03:00
} else {
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \t No audio on board. \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 1 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \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 )
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \t I2S audio, sample rate=32k \n " ) ;
2013-12-22 11:17:46 -03:00
else
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \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 )
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \t I2S audio, 3 sample rates \n " ) ;
2013-12-22 11:17:46 -03:00
else
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \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 )
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \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 )
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \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 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \t 500mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 1 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \t 400mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 2 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \t 300mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
case 3 :
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev , " \t 200mA max power \n " ) ;
2005-11-08 21:37:07 -08:00
break ;
}
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" \t Table at offset 0x%02x, strings=0x%04x, 0x%04x, 0x%04x \n " ,
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 ;
2018-03-03 14:15:57 -05:00
if ( i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM28XX | |
i2c_bus - > algo_type = = EM28XX_I2C_ALGO_EM25XX_BUS_B ) {
2013-03-26 13:38:36 -03:00
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
}
2016-08-29 10:12:01 -03:00
static const struct i2c_algorithm em28xx_algo = {
2005-11-08 21:38:27 -08:00
. master_xfer = em28xx_i2c_xfer ,
2005-11-08 21:37:07 -08:00
. functionality = functionality ,
} ;
2017-08-19 06:34:15 -04:00
static const 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
} ;
2017-08-28 03:21:35 -04:00
static const struct i2c_client em28xx_client_template = {
2005-11-08 21:38:27 -08:00
. name = " em28xx internal " ,
2005-11-08 21:37:07 -08:00
} ;
/* ----------------------------------------------------------- */
/*
* i2c_devs
* incomplete list of known devices
*/
static char * i2c_devs [ 128 ] = {
2018-03-03 14:15:57 -05: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
*/
2018-03-03 14:15:57 -05:00
void em28xx_do_i2c_scan ( struct em28xx * dev , unsigned int 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 ;
2019-11-03 12:23:35 +01:00
memset ( i2c_devicelist , 0 , sizeof ( i2c_devicelist ) ) ;
2007-11-04 08:06:48 -03:00
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 ;
2016-12-07 13:48:10 -02:00
dev_info ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" 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 ,
2019-11-03 12:23:35 +01:00
sizeof ( 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
*/
2018-03-03 14:15:57 -05:00
int em28xx_i2c_register ( struct em28xx * dev , unsigned int bus ,
2013-03-26 13:38:36 -03:00
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 ;
2018-03-03 14:15:57 -05:00
if ( WARN_ON ( ! dev - > em28xx_write_regs | | ! dev - > em28xx_read_reg | |
! dev - > em28xx_write_regs_req | | ! dev - > em28xx_read_reg_req ) )
return - ENODEV ;
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 ;
2016-12-07 13:48:10 -02:00
dev - > i2c_adap [ bus ] . dev . parent = & dev - > intf - > dev ;
2018-09-10 16:20:42 -04:00
strscpy ( dev - > i2c_adap [ bus ] . name , dev_name ( & dev - > intf - > dev ) ,
sizeof ( dev - > i2c_adap [ bus ] . name ) ) ;
2013-03-05 06:55:28 -03:00
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 ) {
2016-12-07 13:48:10 -02:00
dev_err ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" %s: i2c_add_adapter failed! retval [%d] \n " ,
__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 ) {
2018-03-03 14:15:57 -05:00
retval = em28xx_i2c_eeprom ( dev , bus ,
& dev - > eedata , & dev - > eedata_len ) ;
if ( retval < 0 & & retval ! = - ENODEV ) {
2016-12-07 13:48:10 -02:00
dev_err ( & dev - > intf - > dev ,
2016-10-20 08:42:03 -02:00
" %s: em28xx_i2_eeprom failed! retval [%d] \n " ,
__func__ , retval ) ;
2013-03-05 06:55:28 -03:00
}
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
*/
2018-03-03 14:15:57 -05:00
int em28xx_i2c_unregister ( struct em28xx * dev , unsigned int 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 ;
}