2007-03-11 20:44:05 -03:00
/*
* Driver for the Conexant CX23885 PCIe bridge
*
2008-09-03 17:12:12 -03:00
* Copyright ( c ) 2006 Steven Toth < stoth @ linuxtv . org >
2007-03-11 20:44:05 -03: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 .
*/
2016-11-13 09:46:11 -02:00
# include "cx23885.h"
2007-03-11 20:44:05 -03:00
# include <linux/module.h>
# include <linux/init.h>
# include <linux/device.h>
# include <linux/fs.h>
# include <linux/kthread.h>
# include <linux/file.h>
# include <linux/suspend.h>
# include <media/v4l2-common.h>
2017-12-28 13:03:51 -05:00
# include <media/dvb_ca_en50221.h>
2007-03-11 20:44:05 -03:00
# include "s5h1409.h"
2008-07-09 02:18:49 -03:00
# include "s5h1411.h"
2007-03-11 20:44:05 -03:00
# include "mt2131.h"
2007-12-07 01:40:36 -03:00
# include "tda8290.h"
2007-12-24 04:52:08 -03:00
# include "tda18271.h"
2007-09-08 15:17:13 -03:00
# include "lgdt330x.h"
2011-07-11 10:58:35 -03:00
# include "xc4000.h"
2007-12-18 01:57:06 -03:00
# include "xc5000.h"
2009-10-26 08:54:04 -03:00
# include "max2165.h"
2008-04-19 01:14:19 -03:00
# include "tda10048.h"
2007-12-18 01:09:11 -03:00
# include "tuner-xc2028.h"
2008-04-22 14:46:16 -03:00
# include "tuner-simple.h"
2008-04-22 15:38:26 -03:00
# include "dib7000p.h"
2014-06-12 07:12:24 -03:00
# include "dib0070.h"
2008-04-22 15:38:26 -03:00
# include "dibx000_common.h"
2008-08-04 21:39:53 -03:00
# include "zl10353.h"
2009-03-03 12:06:09 -03:00
# include "stv0900.h"
2009-06-19 05:45:23 -03:00
# include "stv0900_reg.h"
2009-03-03 12:06:09 -03:00
# include "stv6110.h"
# include "lnbh24.h"
2009-01-17 12:11:20 -03:00
# include "cx24116.h"
2013-10-01 22:11:35 -03:00
# include "cx24117.h"
2009-03-03 12:06:09 -03:00
# include "cimax2.h"
2009-05-18 05:25:49 -03:00
# include "lgs8gxx.h"
2009-03-03 12:06:09 -03:00
# include "netup-eeprom.h"
# include "netup-init.h"
2009-05-03 23:27:02 -03:00
# include "lgdt3305.h"
2009-10-26 08:54:04 -03:00
# include "atbm8830.h"
2012-12-23 19:25:38 -03:00
# include "ts2020.h"
2009-11-24 20:16:04 -03:00
# include "ds3000.h"
# include "cx23885-f300.h"
2011-01-25 17:04:00 -03:00
# include "altera-ci.h"
# include "stv0367.h"
2012-01-07 09:20:48 -03:00
# include "drxk.h"
# include "mt2063.h"
2012-09-12 07:59:18 -03:00
# include "stv090x.h"
# include "stb6100.h"
# include "stb6100_cfg.h"
2012-12-15 23:34:09 -03:00
# include "tda10071.h"
# include "a8293.h"
2013-08-09 08:53:27 -03:00
# include "mb86a20s.h"
2014-07-22 17:12:13 -03:00
# include "si2165.h"
2014-08-11 16:58:15 -03:00
# include "si2168.h"
# include "si2157.h"
2014-10-04 03:59:30 -03:00
# include "sp2.h"
2014-08-11 16:58:15 -03:00
# include "m88ds3103.h"
2014-12-11 16:12:46 -03:00
# include "m88rs6000t.h"
2016-08-09 19:43:40 -03:00
# include "lgdt3306a.h"
2007-03-11 20:44:05 -03:00
2008-01-12 11:36:36 -03:00
static unsigned int debug ;
2007-03-11 20:44:05 -03:00
2008-01-12 11:36:36 -03:00
# define dprintk(level, fmt, arg...)\
do { if ( debug > = level ) \
2016-11-13 09:46:11 -02:00
printk ( KERN_DEBUG pr_fmt ( " %s dvb: " fmt ) , \
__func__ , # # arg ) ; \
2008-01-12 11:36:36 -03:00
} while ( 0 )
2007-03-11 20:44:05 -03:00
/* ------------------------------------------------------------------ */
2007-12-07 01:40:36 -03:00
static unsigned int alt_tuner ;
module_param ( alt_tuner , int , 0644 ) ;
MODULE_PARM_DESC ( alt_tuner , " Enable alternate tuner configuration " ) ;
2008-04-09 19:13:13 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2007-12-07 01:40:36 -03:00
/* ------------------------------------------------------------------ */
2015-10-28 00:50:37 -02:00
static int queue_setup ( struct vb2_queue * q ,
2014-08-14 06:43:01 -03:00
unsigned int * num_buffers , unsigned int * num_planes ,
2016-04-15 09:15:05 -03:00
unsigned int sizes [ ] , struct device * alloc_devs [ ] )
2007-03-11 20:44:05 -03:00
{
2014-08-14 06:43:01 -03:00
struct cx23885_tsport * port = q - > drv_priv ;
2007-03-11 20:44:05 -03:00
port - > ts_packet_size = 188 * 4 ;
port - > ts_packet_count = 32 ;
2014-08-14 06:43:01 -03:00
* num_planes = 1 ;
sizes [ 0 ] = port - > ts_packet_size * port - > ts_packet_count ;
* num_buffers = 32 ;
2007-03-11 20:44:05 -03:00
return 0 ;
}
2014-08-14 06:43:01 -03:00
static int buffer_prepare ( struct vb2_buffer * vb )
2007-03-11 20:44:05 -03:00
{
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct vb2_v4l2_buffer * vbuf = to_vb2_v4l2_buffer ( vb ) ;
2014-08-14 06:43:01 -03:00
struct cx23885_tsport * port = vb - > vb2_queue - > drv_priv ;
struct cx23885_buffer * buf =
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
container_of ( vbuf , struct cx23885_buffer , vb ) ;
2014-08-14 06:43:01 -03:00
return cx23885_buf_prepare ( buf , port ) ;
2007-03-11 20:44:05 -03:00
}
2014-08-14 06:43:01 -03:00
static void buffer_finish ( struct vb2_buffer * vb )
2007-03-11 20:44:05 -03:00
{
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct vb2_v4l2_buffer * vbuf = to_vb2_v4l2_buffer ( vb ) ;
2014-08-14 06:43:01 -03:00
struct cx23885_tsport * port = vb - > vb2_queue - > drv_priv ;
struct cx23885_dev * dev = port - > dev ;
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct cx23885_buffer * buf = container_of ( vbuf ,
2014-08-14 06:43:01 -03:00
struct cx23885_buffer , vb ) ;
cx23885_free_buffer ( dev , buf ) ;
2007-03-11 20:44:05 -03:00
}
2014-08-14 06:43:01 -03:00
static void buffer_queue ( struct vb2_buffer * vb )
2007-03-11 20:44:05 -03:00
{
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct vb2_v4l2_buffer * vbuf = to_vb2_v4l2_buffer ( vb ) ;
2014-08-14 06:43:01 -03:00
struct cx23885_tsport * port = vb - > vb2_queue - > drv_priv ;
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 10:30:30 -03:00
struct cx23885_buffer * buf = container_of ( vbuf ,
2014-08-14 06:43:01 -03:00
struct cx23885_buffer , vb ) ;
cx23885_buf_queue ( port , buf ) ;
2007-03-11 20:44:05 -03:00
}
2011-01-25 17:04:00 -03:00
static void cx23885_dvb_gate_ctrl ( struct cx23885_tsport * port , int open )
{
2014-08-14 06:43:01 -03:00
struct vb2_dvb_frontends * f ;
struct vb2_dvb_frontend * fe ;
2011-01-25 17:04:00 -03:00
f = & port - > frontends ;
if ( f - > gate < = 1 ) /* undefined or fe0 */
2014-08-14 06:43:01 -03:00
fe = vb2_dvb_get_frontend ( f , 1 ) ;
2011-01-25 17:04:00 -03:00
else
2014-08-14 06:43:01 -03:00
fe = vb2_dvb_get_frontend ( f , f - > gate ) ;
2011-01-25 17:04:00 -03:00
if ( fe & & fe - > dvb . frontend & & fe - > dvb . frontend - > ops . i2c_gate_ctrl )
fe - > dvb . frontend - > ops . i2c_gate_ctrl ( fe - > dvb . frontend , open ) ;
}
2014-08-14 06:43:01 -03:00
static int cx23885_start_streaming ( struct vb2_queue * q , unsigned int count )
{
struct cx23885_tsport * port = q - > drv_priv ;
struct cx23885_dmaqueue * dmaq = & port - > mpegq ;
struct cx23885_buffer * buf = list_entry ( dmaq - > active . next ,
struct cx23885_buffer , queue ) ;
cx23885_start_dma ( port , dmaq , buf ) ;
return 0 ;
}
static void cx23885_stop_streaming ( struct vb2_queue * q )
{
struct cx23885_tsport * port = q - > drv_priv ;
cx23885_cancel_buffers ( port ) ;
}
2016-09-08 20:59:18 -03:00
static const struct vb2_ops dvb_qops = {
2014-08-14 06:43:01 -03:00
. queue_setup = queue_setup ,
. buf_prepare = buffer_prepare ,
. buf_finish = buffer_finish ,
. buf_queue = buffer_queue ,
. wait_prepare = vb2_ops_wait_prepare ,
. wait_finish = vb2_ops_wait_finish ,
. start_streaming = cx23885_start_streaming ,
. stop_streaming = cx23885_stop_streaming ,
2007-03-11 20:44:05 -03:00
} ;
2007-09-04 21:40:47 -03:00
static struct s5h1409_config hauppauge_generic_config = {
2007-09-08 19:08:17 -03:00
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
2007-12-13 10:04:10 -03:00
. qam_if = 44000 ,
2007-09-08 19:08:17 -03:00
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2007-09-08 19:08:17 -03:00
} ;
2008-04-19 01:14:19 -03:00
static struct tda10048_config hauppauge_hvr1200_config = {
. demod_address = 0x10 > > 1 ,
. output_mode = TDA10048_SERIAL_OUTPUT ,
. fwbulkwritelen = TDA10048_BULKWRITE_200 ,
2009-05-02 11:08:23 -03:00
. inversion = TDA10048_INVERSION_ON ,
2009-05-15 21:04:18 -03:00
. dtv6_if_freq_khz = TDA10048_IF_3300 ,
. dtv7_if_freq_khz = TDA10048_IF_3800 ,
. dtv8_if_freq_khz = TDA10048_IF_4300 ,
2009-05-02 11:08:23 -03:00
. clk_freq_khz = TDA10048_CLK_16000 ,
2008-04-19 01:14:19 -03:00
} ;
2009-05-12 17:32:17 -03:00
static struct tda10048_config hauppauge_hvr1210_config = {
. demod_address = 0x10 > > 1 ,
. output_mode = TDA10048_SERIAL_OUTPUT ,
. fwbulkwritelen = TDA10048_BULKWRITE_200 ,
. inversion = TDA10048_INVERSION_ON ,
2009-05-16 11:00:23 -03:00
. dtv6_if_freq_khz = TDA10048_IF_3300 ,
. dtv7_if_freq_khz = TDA10048_IF_3500 ,
. dtv8_if_freq_khz = TDA10048_IF_4000 ,
2009-05-12 17:32:17 -03:00
. clk_freq_khz = TDA10048_CLK_16000 ,
} ;
2007-12-07 01:40:36 -03:00
static struct s5h1409_config hauppauge_ezqam_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
. qam_if = 4000 ,
. inversion = S5H1409_INVERSION_ON ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2007-12-07 01:40:36 -03:00
} ;
2007-09-08 19:08:17 -03:00
static struct s5h1409_config hauppauge_hvr1800lp_config = {
2007-03-11 20:44:05 -03:00
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
2007-12-13 10:04:10 -03:00
. qam_if = 44000 ,
2007-03-20 15:27:53 -03:00
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2007-03-11 20:44:05 -03:00
} ;
2007-12-18 01:09:11 -03:00
static struct s5h1409_config hauppauge_hvr1500_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2007-12-18 01:09:11 -03:00
} ;
2007-09-04 21:40:47 -03:00
static struct mt2131_config hauppauge_generic_tunerconfig = {
2007-08-22 21:01:20 -03:00
0x61
} ;
2007-09-08 15:17:13 -03:00
static struct lgdt330x_config fusionhdtv_5_express = {
. demod_chip = LGDT3303 ,
. serial_mpeg = 0x40 ,
} ;
2007-12-18 01:57:06 -03:00
static struct s5h1409_config hauppauge_hvr1500q_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
. qam_if = 44000 ,
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2007-12-18 01:57:06 -03:00
} ;
2008-05-07 01:43:10 -03:00
static struct s5h1409_config dvico_s5h1409_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
. qam_if = 44000 ,
. inversion = S5H1409_INVERSION_OFF ,
. status_mode = S5H1409_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2008-05-07 01:43:10 -03:00
} ;
2008-07-09 02:18:49 -03:00
static struct s5h1411_config dvico_s5h1411_config = {
. output_mode = S5H1411_SERIAL_OUTPUT ,
. gpio = S5H1411_GPIO_ON ,
. qam_if = S5H1411_IF_44000 ,
. vsb_if = S5H1411_IF_44000 ,
. inversion = S5H1411_INVERSION_OFF ,
. status_mode = S5H1411_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2008-07-09 02:18:49 -03:00
} ;
2009-05-08 16:05:29 -03:00
static struct s5h1411_config hcw_s5h1411_config = {
. output_mode = S5H1411_SERIAL_OUTPUT ,
. gpio = S5H1411_GPIO_OFF ,
. vsb_if = S5H1411_IF_44000 ,
. qam_if = S5H1411_IF_4000 ,
. inversion = S5H1411_INVERSION_ON ,
. status_mode = S5H1411_DEMODLOCKING ,
2018-03-03 09:53:32 -05:00
. mpeg_timing = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK ,
2009-05-08 16:05:29 -03:00
} ;
2007-12-18 01:57:06 -03:00
static struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
2007-12-20 01:14:43 -03:00
. i2c_address = 0x61 ,
. if_khz = 5380 ,
2007-12-18 01:57:06 -03:00
} ;
2008-05-07 01:43:10 -03:00
static struct xc5000_config dvico_xc5000_tunerconfig = {
. i2c_address = 0x64 ,
. if_khz = 5380 ,
} ;
2007-12-24 04:52:08 -03:00
static struct tda829x_config tda829x_no_probe = {
. probe_tuner = TDA829X_DONT_PROBE ,
} ;
2008-01-02 03:01:54 -03:00
static struct tda18271_std_map hauppauge_tda18271_std_map = {
2008-04-22 14:46:22 -03:00
. atsc_6 = { . if_freq = 5380 , . agc_mode = 3 , . std = 3 ,
. if_lvl = 6 , . rfagc_top = 0x37 } ,
. qam_6 = { . if_freq = 4000 , . agc_mode = 3 , . std = 0 ,
. if_lvl = 6 , . rfagc_top = 0x37 } ,
2008-01-02 03:01:54 -03:00
} ;
2009-05-21 12:49:28 -03:00
static struct tda18271_std_map hauppauge_hvr1200_tda18271_std_map = {
. dvbt_6 = { . if_freq = 3300 , . agc_mode = 3 , . std = 4 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
. dvbt_7 = { . if_freq = 3800 , . agc_mode = 3 , . std = 5 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
. dvbt_8 = { . if_freq = 4300 , . agc_mode = 3 , . std = 6 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
} ;
2008-01-02 03:01:54 -03:00
static struct tda18271_config hauppauge_tda18271_config = {
. std_map = & hauppauge_tda18271_std_map ,
. gate = TDA18271_GATE_ANALOG ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2008-01-02 03:01:54 -03:00
} ;
2008-04-19 01:14:19 -03:00
static struct tda18271_config hauppauge_hvr1200_tuner_config = {
2009-05-21 12:49:28 -03:00
. std_map = & hauppauge_hvr1200_tda18271_std_map ,
2008-04-19 01:14:19 -03:00
. gate = TDA18271_GATE_ANALOG ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2008-04-19 01:14:19 -03:00
} ;
2009-05-12 17:32:17 -03:00
static struct tda18271_config hauppauge_hvr1210_tuner_config = {
. gate = TDA18271_GATE_DIGITAL ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2009-05-12 17:32:17 -03:00
} ;
2014-07-22 17:12:13 -03:00
static struct tda18271_config hauppauge_hvr4400_tuner_config = {
. gate = TDA18271_GATE_DIGITAL ,
. output_opt = TDA18271_OUTPUT_LT_OFF ,
} ;
2009-05-12 18:53:47 -03:00
static struct tda18271_std_map hauppauge_hvr127x_std_map = {
2009-05-03 23:27:02 -03:00
. atsc_6 = { . if_freq = 3250 , . agc_mode = 3 , . std = 4 ,
. if_lvl = 1 , . rfagc_top = 0x58 } ,
. qam_6 = { . if_freq = 4000 , . agc_mode = 3 , . std = 5 ,
. if_lvl = 1 , . rfagc_top = 0x58 } ,
} ;
2009-05-12 18:53:47 -03:00
static struct tda18271_config hauppauge_hvr127x_config = {
. std_map = & hauppauge_hvr127x_std_map ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2009-05-03 23:27:02 -03:00
} ;
2009-05-12 18:53:47 -03:00
static struct lgdt3305_config hauppauge_lgdt3305_config = {
2009-05-03 23:27:02 -03:00
. i2c_addr = 0x0e ,
. mpeg_mode = LGDT3305_MPEG_SERIAL ,
. tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE ,
. tpvalid_polarity = LGDT3305_TP_VALID_HIGH ,
. deny_i2c_rptr = 1 ,
. spectral_inversion = 1 ,
. qam_if_khz = 4000 ,
. vsb_if_khz = 3250 ,
} ;
2008-04-25 19:03:08 -07:00
static struct dibx000_agc_config xc3028_agc_config = {
2008-04-22 15:38:26 -03:00
BAND_VHF | BAND_UHF , /* band_caps */
/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
* P_agc_inv_pwm1 = 0 , P_agc_inv_pwm2 = 0 ,
* P_agc_inh_dc_rv_est = 0 , P_agc_time_est = 3 , P_agc_freeze = 0 ,
* P_agc_nb_est = 2 , P_agc_write = 0
*/
( 0 < < 15 ) | ( 0 < < 14 ) | ( 0 < < 11 ) | ( 0 < < 10 ) | ( 0 < < 9 ) | ( 0 < < 8 ) |
( 3 < < 5 ) | ( 0 < < 4 ) | ( 2 < < 1 ) | ( 0 < < 0 ) , /* setup */
712 , /* inv_gain */
21 , /* time_stabiliz */
0 , /* alpha_level */
118 , /* thlock */
0 , /* wbd_inv */
2867 , /* wbd_ref */
0 , /* wbd_sel */
2 , /* wbd_alpha */
0 , /* agc1_max */
0 , /* agc1_min */
39718 , /* agc2_max */
9930 , /* agc2_min */
0 , /* agc1_pt1 */
0 , /* agc1_pt2 */
0 , /* agc1_pt3 */
0 , /* agc1_slope1 */
0 , /* agc1_slope2 */
0 , /* agc2_pt1 */
128 , /* agc2_pt2 */
29 , /* agc2_slope1 */
29 , /* agc2_slope2 */
17 , /* alpha_mant */
27 , /* alpha_exp */
23 , /* beta_mant */
51 , /* beta_exp */
1 , /* perform_agc_softsplit */
} ;
/* PLL Configuration for COFDM BW_MHz = 8.000000
* With external clock = 30.000000 */
2008-04-25 19:03:08 -07:00
static struct dibx000_bandwidth_config xc3028_bw_config = {
2008-04-22 15:38:26 -03:00
60000 , /* internal */
30000 , /* sampling */
1 , /* pll_cfg: prediv */
8 , /* pll_cfg: ratio */
3 , /* pll_cfg: range */
1 , /* pll_cfg: reset */
0 , /* pll_cfg: bypass */
0 , /* misc: refdiv */
0 , /* misc: bypclk_div */
1 , /* misc: IO_CLK_en_core */
1 , /* misc: ADClkSrc */
0 , /* misc: modulo */
( 3 < < 14 ) | ( 1 < < 12 ) | ( 524 < < 0 ) , /* sad_cfg: refsel, sel, freq_15k */
( 1 < < 25 ) | 5816102 , /* ifreq = 5.200000 MHz */
20452225 , /* timf */
30000000 /* xtal_hz */
} ;
static struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
. output_mpeg2_in_188_bytes = 1 ,
. hostbus_diversity = 1 ,
. tuner_is_baseband = 0 ,
. update_lna = NULL ,
. agc_config_count = 1 ,
. agc = & xc3028_agc_config ,
. bw = & xc3028_bw_config ,
. gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS ,
. gpio_val = DIB7000P_GPIO_DEFAULT_VALUES ,
. gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS ,
. pwm_freq_div = 0 ,
. agc_control = NULL ,
. spur_protect = 0 ,
. output_mode = OUTMODE_MPEG2_SERIAL ,
} ;
2008-08-04 21:39:53 -03:00
static struct zl10353_config dvico_fusionhdtv_xc3028 = {
. demod_address = 0x0f ,
. if2 = 45600 ,
. no_tuner = 1 ,
2009-04-27 11:27:04 -03:00
. disable_i2c_gate_ctrl = 1 ,
2008-08-04 21:39:53 -03:00
} ;
2009-06-19 05:45:23 -03:00
static struct stv0900_reg stv0900_ts_regs [ ] = {
{ R0900_TSGENERAL , 0x00 } ,
{ R0900_P1_TSSPEED , 0x40 } ,
{ R0900_P2_TSSPEED , 0x40 } ,
{ R0900_P1_TSCFGM , 0xc0 } ,
{ R0900_P2_TSCFGM , 0xc0 } ,
{ R0900_P1_TSCFGH , 0xe0 } ,
{ R0900_P2_TSCFGH , 0xe0 } ,
{ R0900_P1_TSCFGL , 0x20 } ,
{ R0900_P2_TSCFGL , 0x20 } ,
{ 0xffff , 0xff } , /* terminate */
} ;
2009-03-03 12:06:09 -03:00
static struct stv0900_config netup_stv0900_config = {
. demod_address = 0x68 ,
2009-10-17 08:58:26 -03:00
. demod_mode = 1 , /* dual */
2009-07-19 18:06:00 -03:00
. xtal = 8000000 ,
2009-03-03 12:06:09 -03:00
. clkmode = 3 , /* 0-CLKI, 2-XTALI, else AUTO */
. diseqc_mode = 2 , /* 2/3 PWM */
2009-06-19 05:45:23 -03:00
. ts_config_regs = stv0900_ts_regs ,
2009-03-03 12:06:09 -03:00
. tun1_maddress = 0 , /* 0x60 */
. tun2_maddress = 3 , /* 0x63 */
. tun1_adc = 1 , /* 1 Vpp */
. tun2_adc = 1 , /* 1 Vpp */
} ;
static struct stv6110_config netup_stv6110_tunerconfig_a = {
. i2c_address = 0x60 ,
2009-07-19 18:06:00 -03:00
. mclk = 16000000 ,
. clk_div = 1 ,
2009-10-17 08:23:00 -03:00
. gain = 8 , /* +16 dB - maximum gain */
2009-03-03 12:06:09 -03:00
} ;
static struct stv6110_config netup_stv6110_tunerconfig_b = {
. i2c_address = 0x63 ,
2009-07-19 18:06:00 -03:00
. mclk = 16000000 ,
. clk_div = 1 ,
2009-10-17 08:23:00 -03:00
. gain = 8 , /* +16 dB - maximum gain */
2009-03-03 12:06:09 -03:00
} ;
2009-01-17 12:11:20 -03:00
static struct cx24116_config tbs_cx24116_config = {
2009-11-24 20:16:04 -03:00
. demod_address = 0x55 ,
2009-01-17 12:11:20 -03:00
} ;
2013-10-01 22:11:35 -03:00
static struct cx24117_config tbs_cx24117_config = {
. demod_address = 0x55 ,
} ;
2009-11-24 20:16:04 -03:00
static struct ds3000_config tevii_ds3000_config = {
. demod_address = 0x68 ,
2009-01-17 12:18:26 -03:00
} ;
2012-12-23 19:25:38 -03:00
static struct ts2020_config tevii_ts2020_config = {
. tuner_address = 0x60 ,
2012-12-28 19:40:33 -03:00
. clk_out_div = 1 ,
2014-01-31 07:15:48 -03:00
. frequency_div = 1146000 ,
2012-12-23 19:25:38 -03:00
} ;
2009-01-17 12:23:31 -03:00
static struct cx24116_config dvbworld_cx24116_config = {
. demod_address = 0x05 ,
} ;
2009-05-18 05:25:49 -03:00
static struct lgs8gxx_config mygica_x8506_lgs8gl5_config = {
. prod = LGS8GXX_PROD_LGS8GL5 ,
. demod_address = 0x19 ,
. serial_ts = 0 ,
. ts_clk_pol = 1 ,
. ts_clk_gated = 1 ,
. if_clk_freq = 30400 , /* 30.4 MHz */
. if_freq = 5380 , /* 5.38 MHz */
. if_neg_center = 1 ,
. ext_adc = 0 ,
. adc_signed = 0 ,
. if_neg_edge = 0 ,
} ;
static struct xc5000_config mygica_x8506_xc5000_config = {
. i2c_address = 0x61 ,
. if_khz = 5380 ,
} ;
2013-08-09 08:53:27 -03:00
static struct mb86a20s_config mygica_x8507_mb86a20s_config = {
. demod_address = 0x10 ,
} ;
static struct xc5000_config mygica_x8507_xc5000_config = {
. i2c_address = 0x61 ,
. if_khz = 4000 ,
} ;
2012-09-12 07:59:18 -03:00
static struct stv090x_config prof_8000_stv090x_config = {
2012-12-28 19:40:33 -03:00
. device = STV0903 ,
. demod_mode = STV090x_SINGLE ,
. clk_mode = STV090x_CLK_EXT ,
. xtal = 27000000 ,
. address = 0x6A ,
. ts1_mode = STV090x_TSMODE_PARALLEL_PUNCTURED ,
. repeater_level = STV090x_RPTLEVEL_64 ,
. adc1_range = STV090x_ADC_2Vpp ,
. diseqc_envelope_mode = false ,
. tuner_get_frequency = stb6100_get_frequency ,
. tuner_set_frequency = stb6100_set_frequency ,
. tuner_set_bandwidth = stb6100_set_bandwidth ,
. tuner_get_bandwidth = stb6100_get_bandwidth ,
2012-09-12 07:59:18 -03:00
} ;
static struct stb6100_config prof_8000_stb6100_config = {
. tuner_address = 0x60 ,
. refclock = 27000000 ,
} ;
2016-08-09 19:43:40 -03:00
static struct lgdt3306a_config hauppauge_quadHD_ATSC_a_config = {
. i2c_addr = 0x59 ,
. qam_if_khz = 4000 ,
. vsb_if_khz = 3250 ,
. deny_i2c_rptr = 1 , /* Disabled */
. spectral_inversion = 0 , /* Disabled */
. mpeg_mode = LGDT3306A_MPEG_SERIAL ,
. tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE ,
. tpvalid_polarity = LGDT3306A_TP_VALID_HIGH ,
. xtalMHz = 25 , /* 24 or 25 */
} ;
static struct lgdt3306a_config hauppauge_quadHD_ATSC_b_config = {
. i2c_addr = 0x0e ,
. qam_if_khz = 4000 ,
. vsb_if_khz = 3250 ,
. deny_i2c_rptr = 1 , /* Disabled */
. spectral_inversion = 0 , /* Disabled */
. mpeg_mode = LGDT3306A_MPEG_SERIAL ,
. tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE ,
. tpvalid_polarity = LGDT3306A_TP_VALID_HIGH ,
. xtalMHz = 25 , /* 24 or 25 */
} ;
2015-06-07 14:53:52 -03:00
static int p8000_set_voltage ( struct dvb_frontend * fe ,
enum fe_sec_voltage voltage )
2012-09-12 07:59:18 -03:00
{
struct cx23885_tsport * port = fe - > dvb - > priv ;
struct cx23885_dev * dev = port - > dev ;
if ( voltage = = SEC_VOLTAGE_18 )
cx_write ( MC417_RWD , 0x00001e00 ) ;
else if ( voltage = = SEC_VOLTAGE_13 )
cx_write ( MC417_RWD , 0x00001a00 ) ;
else
cx_write ( MC417_RWD , 0x00001800 ) ;
return 0 ;
}
2014-08-11 16:58:15 -03:00
static int dvbsky_t9580_set_voltage ( struct dvb_frontend * fe ,
2015-06-07 14:53:52 -03:00
enum fe_sec_voltage voltage )
2014-08-11 16:58:15 -03:00
{
struct cx23885_tsport * port = fe - > dvb - > priv ;
struct cx23885_dev * dev = port - > dev ;
cx23885_gpio_enable ( dev , GPIO_0 | GPIO_1 , 1 ) ;
switch ( voltage ) {
case SEC_VOLTAGE_13 :
cx23885_gpio_set ( dev , GPIO_1 ) ;
cx23885_gpio_clear ( dev , GPIO_0 ) ;
break ;
case SEC_VOLTAGE_18 :
cx23885_gpio_set ( dev , GPIO_1 ) ;
cx23885_gpio_set ( dev , GPIO_0 ) ;
break ;
case SEC_VOLTAGE_OFF :
cx23885_gpio_clear ( dev , GPIO_1 ) ;
cx23885_gpio_clear ( dev , GPIO_0 ) ;
break ;
}
/* call the frontend set_voltage function */
port - > fe_set_voltage ( fe , voltage ) ;
return 0 ;
}
2014-11-05 11:58:38 -03:00
static int dvbsky_s952_portc_set_voltage ( struct dvb_frontend * fe ,
2015-06-07 14:53:52 -03:00
enum fe_sec_voltage voltage )
2014-11-05 11:58:38 -03:00
{
struct cx23885_tsport * port = fe - > dvb - > priv ;
struct cx23885_dev * dev = port - > dev ;
cx23885_gpio_enable ( dev , GPIO_12 | GPIO_13 , 1 ) ;
switch ( voltage ) {
case SEC_VOLTAGE_13 :
cx23885_gpio_set ( dev , GPIO_13 ) ;
cx23885_gpio_clear ( dev , GPIO_12 ) ;
break ;
case SEC_VOLTAGE_18 :
cx23885_gpio_set ( dev , GPIO_13 ) ;
cx23885_gpio_set ( dev , GPIO_12 ) ;
break ;
case SEC_VOLTAGE_OFF :
cx23885_gpio_clear ( dev , GPIO_13 ) ;
cx23885_gpio_clear ( dev , GPIO_12 ) ;
break ;
}
/* call the frontend set_voltage function */
return port - > fe_set_voltage ( fe , voltage ) ;
}
2014-10-04 03:59:30 -03:00
static int cx23885_sp2_ci_ctrl ( void * priv , u8 read , int addr ,
u8 data , int * mem )
{
/* MC417 */
# define SP2_DATA 0x000000ff
# define SP2_WR 0x00008000
# define SP2_RD 0x00004000
# define SP2_ACK 0x00001000
# define SP2_ADHI 0x00000800
# define SP2_ADLO 0x00000400
# define SP2_CS1 0x00000200
# define SP2_CS0 0x00000100
# define SP2_EN_ALL 0x00001000
# define SP2_CTRL_OFF (SP2_CS1 | SP2_CS0 | SP2_WR | SP2_RD)
struct cx23885_tsport * port = priv ;
struct cx23885_dev * dev = port - > dev ;
int ret ;
2014-10-23 07:01:44 -03:00
int tmp = 0 ;
2014-10-04 03:59:30 -03:00
unsigned long timeout ;
mutex_lock ( & dev - > gpio_lock ) ;
/* write addr */
cx_write ( MC417_OEN , SP2_EN_ALL ) ;
cx_write ( MC417_RWD , SP2_CTRL_OFF |
SP2_ADLO | ( 0xff & addr ) ) ;
cx_clear ( MC417_RWD , SP2_ADLO ) ;
cx_write ( MC417_RWD , SP2_CTRL_OFF |
SP2_ADHI | ( 0xff & ( addr > > 8 ) ) ) ;
cx_clear ( MC417_RWD , SP2_ADHI ) ;
if ( read )
/* data in */
cx_write ( MC417_OEN , SP2_EN_ALL | SP2_DATA ) ;
else
/* data out */
cx_write ( MC417_RWD , SP2_CTRL_OFF | data ) ;
/* chip select 0 */
cx_clear ( MC417_RWD , SP2_CS0 ) ;
/* read/write */
cx_clear ( MC417_RWD , ( read ) ? SP2_RD : SP2_WR ) ;
/* wait for a maximum of 1 msec */
timeout = jiffies + msecs_to_jiffies ( 1 ) ;
while ( ! time_after ( jiffies , timeout ) ) {
tmp = cx_read ( MC417_RWD ) ;
if ( ( tmp & SP2_ACK ) = = 0 )
break ;
usleep_range ( 50 , 100 ) ;
}
cx_set ( MC417_RWD , SP2_CTRL_OFF ) ;
* mem = tmp & 0xff ;
mutex_unlock ( & dev - > gpio_lock ) ;
if ( ! read ) {
if ( * mem < 0 ) {
ret = - EREMOTEIO ;
goto err ;
}
}
return 0 ;
err :
return ret ;
}
2011-12-26 20:48:54 -03:00
static int cx23885_dvb_set_frontend ( struct dvb_frontend * fe )
2009-05-08 22:39:24 -03:00
{
2011-12-26 20:48:54 -03:00
struct dtv_frontend_properties * p = & fe - > dtv_property_cache ;
2009-05-08 22:39:24 -03:00
struct cx23885_tsport * port = fe - > dvb - > priv ;
struct cx23885_dev * dev = port - > dev ;
switch ( dev - > board ) {
case CX23885_BOARD_HAUPPAUGE_HVR1275 :
2011-12-26 20:48:54 -03:00
switch ( p - > modulation ) {
2009-05-08 22:39:24 -03:00
case VSB_8 :
cx23885_gpio_clear ( dev , GPIO_5 ) ;
break ;
case QAM_64 :
case QAM_256 :
default :
cx23885_gpio_set ( dev , GPIO_5 ) ;
break ;
}
break ;
2009-10-21 13:15:30 -03:00
case CX23885_BOARD_MYGICA_X8506 :
2013-08-09 08:53:27 -03:00
case CX23885_BOARD_MYGICA_X8507 :
2009-10-21 13:15:30 -03:00
case CX23885_BOARD_MAGICPRO_PROHDTVE2 :
/* Select Digital TV */
cx23885_gpio_set ( dev , GPIO_0 ) ;
break ;
2009-05-08 22:39:24 -03:00
}
2013-08-09 08:53:25 -03:00
/* Call the real set_frontend */
if ( port - > set_frontend )
return port - > set_frontend ( fe ) ;
2009-05-08 22:39:24 -03:00
return 0 ;
2009-05-08 22:39:24 -03:00
}
2013-08-09 08:53:25 -03:00
static void cx23885_set_frontend_hook ( struct cx23885_tsport * port ,
struct dvb_frontend * fe )
{
port - > set_frontend = fe - > ops . set_frontend ;
fe - > ops . set_frontend = cx23885_dvb_set_frontend ;
}
2009-06-17 01:38:12 -03:00
static struct lgs8gxx_config magicpro_prohdtve2_lgs8g75_config = {
. prod = LGS8GXX_PROD_LGS8G75 ,
. demod_address = 0x19 ,
. serial_ts = 0 ,
. ts_clk_pol = 1 ,
. ts_clk_gated = 1 ,
. if_clk_freq = 30400 , /* 30.4 MHz */
. if_freq = 6500 , /* 6.50 MHz */
. if_neg_center = 1 ,
. ext_adc = 0 ,
. adc_signed = 1 ,
. adc_vpp = 2 , /* 1.6 Vpp */
. if_neg_edge = 1 ,
} ;
static struct xc5000_config magicpro_prohdtve2_xc5000_config = {
. i2c_address = 0x61 ,
. if_khz = 6500 ,
} ;
2009-10-26 08:54:04 -03:00
static struct atbm8830_config mygica_x8558pro_atbm8830_cfg1 = {
. prod = ATBM8830_PROD_8830 ,
. demod_address = 0x44 ,
. serial_ts = 0 ,
. ts_sampling_edge = 1 ,
. ts_clk_gated = 0 ,
. osc_clk_freq = 30400 , /* in kHz */
. if_freq = 0 , /* zero IF */
. zif_swap_iq = 1 ,
2009-11-28 08:36:31 -03:00
. agc_min = 0x2E ,
. agc_max = 0xFF ,
. agc_hold_loop = 0 ,
2009-10-26 08:54:04 -03:00
} ;
static struct max2165_config mygic_x8558pro_max2165_cfg1 = {
. i2c_address = 0x60 ,
. osc_clk = 20
} ;
static struct atbm8830_config mygica_x8558pro_atbm8830_cfg2 = {
. prod = ATBM8830_PROD_8830 ,
. demod_address = 0x44 ,
. serial_ts = 1 ,
. ts_sampling_edge = 1 ,
. ts_clk_gated = 0 ,
. osc_clk_freq = 30400 , /* in kHz */
. if_freq = 0 , /* zero IF */
. zif_swap_iq = 1 ,
2009-11-28 08:36:31 -03:00
. agc_min = 0x2E ,
. agc_max = 0xFF ,
. agc_hold_loop = 0 ,
2009-10-26 08:54:04 -03:00
} ;
static struct max2165_config mygic_x8558pro_max2165_cfg2 = {
. i2c_address = 0x60 ,
. osc_clk = 20
} ;
2011-01-25 17:04:00 -03:00
static struct stv0367_config netup_stv0367_config [ ] = {
{
. demod_address = 0x1c ,
. xtal = 27000000 ,
. if_khz = 4500 ,
. if_iq_mode = 0 ,
. ts_mode = 1 ,
. clk_pol = 0 ,
} , {
. demod_address = 0x1d ,
. xtal = 27000000 ,
. if_khz = 4500 ,
. if_iq_mode = 0 ,
. ts_mode = 1 ,
. clk_pol = 0 ,
} ,
} ;
static struct xc5000_config netup_xc5000_config [ ] = {
{
. i2c_address = 0x61 ,
. if_khz = 4500 ,
} , {
. i2c_address = 0x64 ,
. if_khz = 4500 ,
} ,
} ;
2012-01-07 09:20:48 -03:00
static struct drxk_config terratec_drxk_config [ ] = {
{
. adr = 0x29 ,
. no_i2c_bridge = 1 ,
} , {
. adr = 0x2a ,
. no_i2c_bridge = 1 ,
} ,
} ;
static struct mt2063_config terratec_mt2063_config [ ] = {
{
. tuner_address = 0x60 ,
} , {
. tuner_address = 0x67 ,
} ,
} ;
2015-04-20 14:48:33 -03:00
static const struct tda10071_platform_data hauppauge_tda10071_pdata = {
. clk = 40444000 , /* 40.444 MHz */
. i2c_wr_max = 64 ,
. ts_mode = TDA10071_TS_SERIAL ,
. pll_multiplier = 20 ,
. tuner_i2c_addr = 0x54 ,
} ;
2014-08-11 16:58:15 -03:00
static const struct m88ds3103_config dvbsky_t9580_m88ds3103_config = {
. i2c_addr = 0x68 ,
. clock = 27000000 ,
. i2c_wr_max = 33 ,
. clock_out = 0 ,
. ts_mode = M88DS3103_TS_PARALLEL ,
. ts_clk = 16000 ,
. ts_clk_pol = 1 ,
. lnb_en_pol = 1 ,
. lnb_hv_pol = 0 ,
. agc = 0x99 ,
} ;
2014-10-23 07:01:44 -03:00
static const struct m88ds3103_config dvbsky_s950c_m88ds3103_config = {
. i2c_addr = 0x68 ,
. clock = 27000000 ,
. i2c_wr_max = 33 ,
. clock_out = 0 ,
. ts_mode = M88DS3103_TS_CI ,
. ts_clk = 10000 ,
. ts_clk_pol = 1 ,
. lnb_en_pol = 1 ,
. lnb_hv_pol = 0 ,
. agc = 0x99 ,
} ;
2014-12-11 16:12:46 -03:00
static const struct m88ds3103_config hauppauge_hvr5525_m88ds3103_config = {
. i2c_addr = 0x69 ,
. clock = 27000000 ,
. i2c_wr_max = 33 ,
. ts_mode = M88DS3103_TS_PARALLEL ,
. ts_clk = 16000 ,
. ts_clk_pol = 1 ,
. agc = 0x99 ,
} ;
2018-01-05 19:48:20 -05:00
static struct lgdt3306a_config hauppauge_hvr1265k4_config = {
. i2c_addr = 0x59 ,
. qam_if_khz = 4000 ,
. vsb_if_khz = 3250 ,
. deny_i2c_rptr = 1 , /* Disabled */
. spectral_inversion = 0 , /* Disabled */
. mpeg_mode = LGDT3306A_MPEG_SERIAL ,
. tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE ,
. tpvalid_polarity = LGDT3306A_TP_VALID_HIGH ,
. xtalMHz = 25 , /* 24 or 25 */
} ;
2012-10-27 11:29:23 -03:00
static int netup_altera_fpga_rw ( void * device , int flag , int data , int read )
2011-01-25 17:04:00 -03:00
{
struct cx23885_dev * dev = ( struct cx23885_dev * ) device ;
unsigned long timeout = jiffies + msecs_to_jiffies ( 1 ) ;
2011-01-02 09:10:00 -03:00
uint32_t mem = 0 ;
2011-01-25 17:04:00 -03:00
2011-01-02 09:10:00 -03:00
mem = cx_read ( MC417_RWD ) ;
2011-01-25 17:04:00 -03:00
if ( read )
cx_set ( MC417_OEN , ALT_DATA ) ;
else {
cx_clear ( MC417_OEN , ALT_DATA ) ; /* D0-D7 out */
mem & = ~ ALT_DATA ;
mem | = ( data & ALT_DATA ) ;
}
if ( flag )
2011-01-02 09:10:00 -03:00
mem | = ALT_AD_RG ;
2011-01-25 17:04:00 -03:00
else
2011-01-02 09:10:00 -03:00
mem & = ~ ALT_AD_RG ;
2011-01-25 17:04:00 -03:00
2011-01-02 09:10:00 -03:00
mem & = ~ ALT_CS ;
2011-01-25 17:04:00 -03:00
if ( read )
2011-01-02 09:10:00 -03:00
mem = ( mem & ~ ALT_RD ) | ALT_WR ;
2011-01-25 17:04:00 -03:00
else
2011-01-02 09:10:00 -03:00
mem = ( mem & ~ ALT_WR ) | ALT_RD ;
cx_write ( MC417_RWD , mem ) ; /* start RW cycle */
2011-01-25 17:04:00 -03:00
for ( ; ; ) {
mem = cx_read ( MC417_RWD ) ;
if ( ( mem & ALT_RDY ) = = 0 )
break ;
if ( time_after ( jiffies , timeout ) )
break ;
udelay ( 1 ) ;
}
cx_set ( MC417_RWD , ALT_RD | ALT_WR | ALT_CS ) ;
if ( read )
return mem & ALT_DATA ;
return 0 ;
} ;
2009-10-26 08:54:04 -03:00
2014-06-12 07:12:24 -03:00
static int dib7070_tuner_reset ( struct dvb_frontend * fe , int onoff )
{
struct dib7000p_ops * dib7000p_ops = fe - > sec_priv ;
return dib7000p_ops - > set_gpio ( fe , 8 , 0 , ! onoff ) ;
}
static int dib7070_tuner_sleep ( struct dvb_frontend * fe , int onoff )
{
return 0 ;
}
static struct dib0070_config dib7070p_dib0070_config = {
. i2c_address = DEFAULT_DIB0070_I2C_ADDRESS ,
. reset = dib7070_tuner_reset ,
. sleep = dib7070_tuner_sleep ,
. clock_khz = 12000 ,
. freq_offset_khz_vhf = 550 ,
/* .flip_chip = 1, */
} ;
/* DIB7070 generic */
static struct dibx000_agc_config dib7070_agc_config = {
. band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND ,
/*
* P_agc_use_sd_mod1 = 0 , P_agc_use_sd_mod2 = 0 , P_agc_freq_pwm_div = 5 ,
* P_agc_inv_pwm1 = 0 , P_agc_inv_pwm2 = 0 , P_agc_inh_dc_rv_est = 0 ,
* P_agc_time_est = 3 , P_agc_freeze = 0 , P_agc_nb_est = 5 , P_agc_write = 0
*/
. setup = ( 0 < < 15 ) | ( 0 < < 14 ) | ( 5 < < 11 ) | ( 0 < < 10 ) | ( 0 < < 9 ) |
( 0 < < 8 ) | ( 3 < < 5 ) | ( 0 < < 4 ) | ( 5 < < 1 ) | ( 0 < < 0 ) ,
. inv_gain = 600 ,
. time_stabiliz = 10 ,
. alpha_level = 0 ,
. thlock = 118 ,
. wbd_inv = 0 ,
. wbd_ref = 3530 ,
. wbd_sel = 1 ,
. wbd_alpha = 5 ,
. agc1_max = 65535 ,
. agc1_min = 0 ,
. agc2_max = 65535 ,
. agc2_min = 0 ,
. agc1_pt1 = 0 ,
. agc1_pt2 = 40 ,
. agc1_pt3 = 183 ,
. agc1_slope1 = 206 ,
. agc1_slope2 = 255 ,
. agc2_pt1 = 72 ,
. agc2_pt2 = 152 ,
. agc2_slope1 = 88 ,
. agc2_slope2 = 90 ,
. alpha_mant = 17 ,
. alpha_exp = 27 ,
. beta_mant = 23 ,
. beta_exp = 51 ,
. perform_agc_softsplit = 0 ,
} ;
static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
. internal = 60000 ,
. sampling = 15000 ,
. pll_prediv = 1 ,
. pll_ratio = 20 ,
. pll_range = 3 ,
. pll_reset = 1 ,
. pll_bypass = 0 ,
. enable_refdiv = 0 ,
. bypclk_div = 0 ,
. IO_CLK_en_core = 1 ,
. ADClkSrc = 1 ,
. modulo = 2 ,
/* refsel, sel, freq_15k */
. sad_cfg = ( 3 < < 14 ) | ( 1 < < 12 ) | ( 524 < < 0 ) ,
. ifreq = ( 0 < < 25 ) | 0 ,
. timf = 20452225 ,
. xtal_hz = 12000000 ,
} ;
static struct dib7000p_config dib7070p_dib7000p_config = {
/* .output_mode = OUTMODE_MPEG2_FIFO, */
. output_mode = OUTMODE_MPEG2_SERIAL ,
/* .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK, */
. output_mpeg2_in_188_bytes = 1 ,
. agc_config_count = 1 ,
. agc = & dib7070_agc_config ,
. bw = & dib7070_bw_config_12_mhz ,
. tuner_is_baseband = 1 ,
. spur_protect = 1 ,
. gpio_dir = 0xfcef , /* DIB7000P_GPIO_DEFAULT_DIRECTIONS, */
. gpio_val = 0x0110 , /* DIB7000P_GPIO_DEFAULT_VALUES, */
. gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS ,
. hostbus_diversity = 1 ,
} ;
2014-12-23 13:48:07 -02:00
static int dvb_register_ci_mac ( struct cx23885_tsport * port )
{
struct cx23885_dev * dev = port - > dev ;
struct i2c_client * client_ci = NULL ;
struct vb2_dvb_frontend * fe0 ;
fe0 = vb2_dvb_get_frontend ( & port - > frontends , 1 ) ;
if ( ! fe0 )
return - EINVAL ;
switch ( dev - > board ) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI : {
static struct netup_card_info cinfo ;
netup_get_card_info ( & dev - > i2c_bus [ 0 ] . i2c_adap , & cinfo ) ;
memcpy ( port - > frontends . adapter . proposed_mac ,
cinfo . port [ port - > nr - 1 ] . mac , 6 ) ;
2016-11-13 09:46:11 -02:00
pr_info ( " NetUP Dual DVB-S2 CI card port%d MAC=%pM \n " ,
2014-12-23 13:48:07 -02:00
port - > nr , port - > frontends . adapter . proposed_mac ) ;
netup_ci_init ( port ) ;
return 0 ;
}
case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF : {
struct altera_ci_config netup_ci_cfg = {
. dev = dev , /* magic number to identify*/
. adapter = & port - > frontends . adapter , /* for CI */
. demux = & fe0 - > dvb . demux , /* for hw pid filter */
. fpga_rw = netup_altera_fpga_rw ,
} ;
altera_ci_init ( & netup_ci_cfg , port - > nr ) ;
return 0 ;
}
case CX23885_BOARD_TEVII_S470 : {
u8 eeprom [ 256 ] ; /* 24C02 i2c eeprom */
if ( port - > nr ! = 1 )
return 0 ;
/* Read entire EEPROM */
dev - > i2c_bus [ 0 ] . i2c_client . addr = 0xa0 > > 1 ;
tveeprom_read ( & dev - > i2c_bus [ 0 ] . i2c_client , eeprom , sizeof ( eeprom ) ) ;
2016-11-13 09:46:11 -02:00
pr_info ( " TeVii S470 MAC= %pM \n " , eeprom + 0xa0 ) ;
2014-12-23 13:48:07 -02:00
memcpy ( port - > frontends . adapter . proposed_mac , eeprom + 0xa0 , 6 ) ;
return 0 ;
}
case CX23885_BOARD_DVBSKY_T9580 :
case CX23885_BOARD_DVBSKY_S950 :
case CX23885_BOARD_DVBSKY_S952 :
case CX23885_BOARD_DVBSKY_T982 : {
u8 eeprom [ 256 ] ; /* 24C02 i2c eeprom */
if ( port - > nr > 2 )
return 0 ;
/* Read entire EEPROM */
dev - > i2c_bus [ 0 ] . i2c_client . addr = 0xa0 > > 1 ;
tveeprom_read ( & dev - > i2c_bus [ 0 ] . i2c_client , eeprom ,
sizeof ( eeprom ) ) ;
2016-11-13 09:46:11 -02:00
pr_info ( " %s port %d MAC address: %pM \n " ,
2014-12-23 13:48:07 -02:00
cx23885_boards [ dev - > board ] . name , port - > nr ,
eeprom + 0xc0 + ( port - > nr - 1 ) * 8 ) ;
memcpy ( port - > frontends . adapter . proposed_mac , eeprom + 0xc0 +
( port - > nr - 1 ) * 8 , 6 ) ;
return 0 ;
}
case CX23885_BOARD_DVBSKY_S950C :
case CX23885_BOARD_DVBSKY_T980C :
case CX23885_BOARD_TT_CT2_4500_CI : {
u8 eeprom [ 256 ] ; /* 24C02 i2c eeprom */
struct sp2_config sp2_config ;
struct i2c_board_info info ;
2014-12-23 13:48:07 -02:00
struct cx23885_i2c * i2c_bus = & dev - > i2c_bus [ 0 ] ;
2014-12-23 13:48:07 -02:00
/* attach CI */
memset ( & sp2_config , 0 , sizeof ( sp2_config ) ) ;
sp2_config . dvb_adap = & port - > frontends . adapter ;
sp2_config . priv = port ;
sp2_config . ci_control = cx23885_sp2_ci_ctrl ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " sp2 " , I2C_NAME_SIZE ) ;
info . addr = 0x40 ;
info . platform_data = & sp2_config ;
request_module ( info . type ) ;
2014-12-23 13:48:07 -02:00
client_ci = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
2014-12-23 13:48:07 -02:00
if ( client_ci = = NULL | | client_ci - > dev . driver = = NULL )
return - ENODEV ;
if ( ! try_module_get ( client_ci - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_ci ) ;
return - ENODEV ;
}
port - > i2c_client_ci = client_ci ;
if ( port - > nr ! = 1 )
return 0 ;
/* Read entire EEPROM */
dev - > i2c_bus [ 0 ] . i2c_client . addr = 0xa0 > > 1 ;
tveeprom_read ( & dev - > i2c_bus [ 0 ] . i2c_client , eeprom ,
sizeof ( eeprom ) ) ;
2016-11-13 09:46:11 -02:00
pr_info ( " %s MAC address: %pM \n " ,
2014-12-23 13:48:07 -02:00
cx23885_boards [ dev - > board ] . name , eeprom + 0xc0 ) ;
memcpy ( port - > frontends . adapter . proposed_mac , eeprom + 0xc0 , 6 ) ;
return 0 ;
}
}
return 0 ;
}
2007-03-11 20:44:05 -03:00
static int dvb_register ( struct cx23885_tsport * port )
{
2014-05-29 09:20:15 -03:00
struct dib7000p_ops dib7000p_ops ;
2007-03-11 20:44:05 -03:00
struct cx23885_dev * dev = port - > dev ;
2009-05-18 05:25:49 -03:00
struct cx23885_i2c * i2c_bus = NULL , * i2c_bus2 = NULL ;
2014-08-14 06:43:01 -03:00
struct vb2_dvb_frontend * fe0 , * fe1 = NULL ;
2014-08-11 16:58:15 -03:00
struct si2168_config si2168_config ;
2016-07-26 04:09:03 -03:00
struct si2165_platform_data si2165_pdata ;
2014-08-11 16:58:15 -03:00
struct si2157_config si2157_config ;
2015-03-23 18:52:46 -03:00
struct ts2020_config ts2020_config ;
2016-12-25 13:38:20 -02:00
struct m88ds3103_platform_data m88ds3103_pdata ;
2018-01-05 19:48:21 -05:00
struct m88rs6000t_config m88rs6000t_config = { } ;
struct a8293_platform_data a8293_pdata = { } ;
2014-08-11 16:58:15 -03:00
struct i2c_board_info info ;
struct i2c_adapter * adapter ;
2014-12-23 13:48:07 -02:00
struct i2c_client * client_demod = NULL , * client_tuner = NULL ;
2015-04-16 13:59:46 -03:00
struct i2c_client * client_sec = NULL ;
2015-06-07 14:53:52 -03:00
int ( * p_set_voltage ) ( struct dvb_frontend * fe ,
enum fe_sec_voltage voltage ) = NULL ;
2011-01-25 17:04:00 -03:00
int mfe_shared = 0 ; /* bus not shared by default */
2009-03-03 12:06:09 -03:00
int ret ;
2008-10-11 11:05:50 -03:00
2008-10-11 11:24:30 -03:00
/* Get the first frontend */
2014-08-14 06:43:01 -03:00
fe0 = vb2_dvb_get_frontend ( & port - > frontends , 1 ) ;
2008-10-11 11:05:50 -03:00
if ( ! fe0 )
return - EINVAL ;
2007-03-11 20:44:05 -03:00
2014-08-14 06:43:01 -03:00
/* init struct vb2_dvb */
2008-10-11 11:05:50 -03:00
fe0 - > dvb . name = dev - > name ;
2007-03-11 20:44:05 -03:00
2011-01-25 17:04:00 -03:00
/* multi-frontend gate control is undefined or defaults to fe0 */
port - > frontends . gate = 0 ;
/* Sets the gate control callback to be used by i2c command calls */
port - > gate_ctrl = cx23885_dvb_gate_ctrl ;
2007-03-11 20:44:05 -03:00
/* init frontend */
switch ( dev - > board ) {
2007-08-22 21:01:20 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-09-04 21:40:47 -03:00
& hauppauge_generic_config ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& hauppauge_generic_tunerconfig , 0 ) ;
2007-03-11 20:44:05 -03:00
break ;
2009-05-03 23:27:02 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1270 :
2009-05-08 22:39:24 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1275 :
2009-05-03 23:27:02 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgdt3305_attach ,
2009-05-12 18:53:47 -03:00
& hauppauge_lgdt3305_config ,
2009-05-03 23:27:02 -03:00
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_hvr127x_config ) ;
2013-08-09 08:53:25 -03:00
if ( dev - > board = = CX23885_BOARD_HAUPPAUGE_HVR1275 )
cx23885_set_frontend_hook ( port , fe0 - > dvb . frontend ) ;
2009-05-03 23:27:02 -03:00
break ;
2009-05-08 16:05:29 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1255 :
2012-07-01 16:15:14 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111 :
2009-05-08 16:05:29 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
& hcw_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
2012-07-01 16:15:14 -03:00
tda18271_attach ( & dev - > ts1 . analog_fe ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
2009-05-08 16:05:29 -03:00
break ;
2007-12-07 01:40:36 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:18:53 -03:00
switch ( alt_tuner ) {
2007-12-07 01:40:36 -03:00
case 1 :
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend =
2007-12-07 01:40:36 -03:00
dvb_attach ( s5h1409_attach ,
& hauppauge_ezqam_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda829x_attach , fe0 - > dvb . frontend ,
& dev - > i2c_bus [ 1 ] . i2c_adap , 0x42 ,
& tda829x_no_probe ) ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
2007-12-07 01:40:36 -03:00
break ;
case 0 :
default :
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend =
2007-12-07 01:40:36 -03:00
dvb_attach ( s5h1409_attach ,
& hauppauge_generic_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& hauppauge_generic_tunerconfig , 0 ) ;
2007-12-07 01:40:36 -03:00
}
break ;
2007-09-08 19:08:17 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-09-08 19:08:17 -03:00
& hauppauge_hvr1800lp_config ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& hauppauge_generic_tunerconfig , 0 ) ;
2007-09-08 19:08:17 -03:00
break ;
2007-09-08 15:17:13 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( lgdt330x_attach ,
2018-03-09 10:53:30 -05:00
& fusionhdtv_5_express ,
0x0e ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( simple_tuner_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap , 0x61 ,
TUNER_LG_TDVS_H06XF ) ;
2007-09-08 15:17:13 -03:00
break ;
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-12-18 01:57:06 -03:00
& hauppauge_hvr1500q_config ,
& dev - > i2c_bus [ 0 ] . i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& hauppauge_hvr1500q_tunerconfig ) ;
2007-12-18 01:57:06 -03:00
break ;
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-12-18 01:09:11 -03:00
& hauppauge_hvr1500_config ,
& dev - > i2c_bus [ 0 ] . i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2007-12-18 01:09:11 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & i2c_bus - > i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2007-12-18 01:09:11 -03:00
. max_len = 64 ,
2009-04-20 22:42:00 -03:00
. demod = XC3028_FE_OREN538 ,
2007-12-18 01:09:11 -03:00
} ;
fe = dvb_attach ( xc2028_attach ,
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend , & cfg ) ;
2007-12-18 01:09:11 -03:00
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
2008-04-19 01:25:52 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
2008-04-19 01:14:19 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( tda10048_attach ,
2008-04-19 01:14:19 -03:00
& hauppauge_hvr1200_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda829x_attach , fe0 - > dvb . frontend ,
& dev - > i2c_bus [ 1 ] . i2c_adap , 0x42 ,
& tda829x_no_probe ) ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_hvr1200_tuner_config ) ;
2009-05-12 17:32:17 -03:00
break ;
case CX23885_BOARD_HAUPPAUGE_HVR1210 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( tda10048_attach ,
& hauppauge_hvr1210_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_hvr1210_tuner_config ) ;
2008-04-19 01:14:19 -03:00
}
break ;
2008-04-22 15:38:26 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2014-05-29 09:20:15 -03:00
if ( ! dvb_attach ( dib7000p_attach , & dib7000p_ops ) )
return - ENODEV ;
fe0 - > dvb . frontend = dib7000p_ops . init ( & i2c_bus - > i2c_adap ,
2008-04-22 15:38:26 -03:00
0x12 , & hauppauge_hvr1400_dib7000_config ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-04-22 15:38:26 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & dev - > i2c_bus [ 1 ] . i2c_adap ,
. i2c_addr = 0x64 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC3028L_DEFAULT_FIRMWARE ,
2008-04-22 15:38:26 -03:00
. max_len = 64 ,
2011-07-28 16:38:54 -03:00
. demod = XC3028_FE_DIBCOM52 ,
2008-10-16 20:18:44 -03:00
/* This is true for all demods with
v36 firmware ? */
2008-09-28 02:24:44 -03:00
. type = XC2028_D2633 ,
2008-04-22 15:38:26 -03:00
} ;
fe = dvb_attach ( xc2028_attach ,
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend , & cfg ) ;
2008-04-22 15:38:26 -03:00
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
2008-05-07 01:43:10 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP :
i2c_bus = & dev - > i2c_bus [ port - > nr - 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2008-05-07 01:43:10 -03:00
& dvico_s5h1409_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend = = NULL )
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
2008-07-09 02:18:49 -03:00
& dvico_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
2008-09-06 14:56:58 -03:00
& i2c_bus - > i2c_adap ,
& dvico_xc5000_tunerconfig ) ;
2008-05-07 01:43:10 -03:00
break ;
2008-08-04 21:39:53 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP : {
i2c_bus = & dev - > i2c_bus [ port - > nr - 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( zl10353_attach ,
2008-08-04 21:39:53 -03:00
& dvico_fusionhdtv_xc3028 ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-08-04 21:39:53 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & i2c_bus - > i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2008-08-04 21:39:53 -03:00
. max_len = 64 ,
. demod = XC3028_FE_ZARLINK456 ,
} ;
2008-10-11 11:05:50 -03:00
fe = dvb_attach ( xc2028_attach , fe0 - > dvb . frontend ,
2008-08-04 21:39:53 -03:00
& cfg ) ;
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
2014-06-12 07:12:24 -03:00
}
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2 : {
i2c_bus = & dev - > i2c_bus [ port - > nr - 1 ] ;
/* cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0); */
/* cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1); */
if ( ! dvb_attach ( dib7000p_attach , & dib7000p_ops ) )
return - ENODEV ;
if ( dib7000p_ops . i2c_enumeration ( & i2c_bus - > i2c_adap , 1 , 0x12 , & dib7070p_dib7000p_config ) < 0 ) {
2016-11-13 09:46:11 -02:00
pr_warn ( " Unable to enumerate dib7000p \n " ) ;
2014-06-12 07:12:24 -03:00
return - ENODEV ;
}
fe0 - > dvb . frontend = dib7000p_ops . init ( & i2c_bus - > i2c_adap , 0x80 , & dib7070p_dib7000p_config ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
struct i2c_adapter * tun_i2c ;
fe0 - > dvb . frontend - > sec_priv = kmalloc ( sizeof ( dib7000p_ops ) , GFP_KERNEL ) ;
memcpy ( fe0 - > dvb . frontend - > sec_priv , & dib7000p_ops , sizeof ( dib7000p_ops ) ) ;
tun_i2c = dib7000p_ops . get_i2c_master ( fe0 - > dvb . frontend , DIBX000_I2C_INTERFACE_TUNER , 1 ) ;
if ( ! dvb_attach ( dib0070_attach , fe0 - > dvb . frontend , tun_i2c , & dib7070p_dib0070_config ) )
return - ENODEV ;
}
break ;
2008-08-04 21:39:53 -03:00
}
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2009-09-18 18:55:47 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E800 :
2008-08-12 13:30:03 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( zl10353_attach ,
2008-08-12 13:30:03 -03:00
& dvico_fusionhdtv_xc3028 ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-08-12 13:30:03 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & dev - > i2c_bus [ 1 ] . i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2008-08-12 13:30:03 -03:00
. max_len = 64 ,
. demod = XC3028_FE_ZARLINK456 ,
} ;
2008-10-11 11:05:50 -03:00
fe = dvb_attach ( xc2028_attach , fe0 - > dvb . frontend ,
2008-08-12 13:30:03 -03:00
& cfg ) ;
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
2009-01-17 12:11:20 -03:00
break ;
2011-07-11 10:58:35 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( zl10353_attach ,
& dvico_fusionhdtv_xc3028 ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
struct dvb_frontend * fe ;
struct xc4000_config cfg = {
. i2c_address = 0x61 ,
. default_pm = 0 ,
. dvb_amplitude = 134 ,
. set_smoothedcvbs = 1 ,
. if_khz = 4560
} ;
fe = dvb_attach ( xc4000_attach , fe0 - > dvb . frontend ,
& dev - > i2c_bus [ 1 ] . i2c_adap , & cfg ) ;
2011-12-11 18:57:58 -03:00
if ( ! fe ) {
2016-11-13 09:46:11 -02:00
pr_err ( " %s/2: xc4000 attach failed \n " ,
2011-12-11 18:57:58 -03:00
dev - > name ) ;
goto frontend_detach ;
}
2011-07-11 10:58:35 -03:00
}
break ;
2009-01-17 12:11:20 -03:00
case CX23885_BOARD_TBS_6920 :
2009-11-24 20:16:04 -03:00
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2009-01-17 12:11:20 -03:00
fe0 - > dvb . frontend = dvb_attach ( cx24116_attach ,
2009-11-24 20:16:04 -03:00
& tbs_cx24116_config ,
& i2c_bus - > i2c_adap ) ;
2009-01-17 12:11:20 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend - > ops . set_voltage = f300_set_voltage ;
2009-01-17 12:11:20 -03:00
2009-01-17 12:18:26 -03:00
break ;
2013-10-01 22:11:35 -03:00
case CX23885_BOARD_TBS_6980 :
case CX23885_BOARD_TBS_6981 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
switch ( port - > nr ) {
/* PORT B */
case 1 :
fe0 - > dvb . frontend = dvb_attach ( cx24117_attach ,
& tbs_cx24117_config ,
2013-10-03 08:33:47 -03:00
& i2c_bus - > i2c_adap ) ;
2013-10-01 22:11:35 -03:00
break ;
/* PORT C */
case 2 :
fe0 - > dvb . frontend = dvb_attach ( cx24117_attach ,
& tbs_cx24117_config ,
2013-10-03 08:33:47 -03:00
& i2c_bus - > i2c_adap ) ;
2013-10-01 22:11:35 -03:00
break ;
}
break ;
2009-01-17 12:18:26 -03:00
case CX23885_BOARD_TEVII_S470 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend = dvb_attach ( ds3000_attach ,
& tevii_ds3000_config ,
& i2c_bus - > i2c_adap ) ;
2012-12-23 19:25:38 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( ts2020_attach , fe0 - > dvb . frontend ,
& tevii_ts2020_config , & i2c_bus - > i2c_adap ) ;
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend - > ops . set_voltage = f300_set_voltage ;
2012-12-23 19:25:38 -03:00
}
2009-01-17 12:18:26 -03:00
2008-08-12 13:30:03 -03:00
break ;
2009-01-17 12:23:31 -03:00
case CX23885_BOARD_DVBWORLD_2005 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( cx24116_attach ,
& dvbworld_cx24116_config ,
& i2c_bus - > i2c_adap ) ;
break ;
2009-03-03 12:06:09 -03:00
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
switch ( port - > nr ) {
/* port B */
case 1 :
fe0 - > dvb . frontend = dvb_attach ( stv0900_attach ,
& netup_stv0900_config ,
& i2c_bus - > i2c_adap , 0 ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
if ( dvb_attach ( stv6110_attach ,
fe0 - > dvb . frontend ,
& netup_stv6110_tunerconfig_a ,
& i2c_bus - > i2c_adap ) ) {
if ( ! dvb_attach ( lnbh24_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
2009-10-17 08:38:45 -03:00
LNBH24_PCL | LNBH24_TTX ,
LNBH24_TEN , 0x09 ) )
2016-11-13 09:46:11 -02:00
pr_err ( " No LNBH24 found! \n " ) ;
2009-03-03 12:06:09 -03:00
}
}
break ;
/* port C */
case 2 :
fe0 - > dvb . frontend = dvb_attach ( stv0900_attach ,
& netup_stv0900_config ,
& i2c_bus - > i2c_adap , 1 ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
if ( dvb_attach ( stv6110_attach ,
fe0 - > dvb . frontend ,
& netup_stv6110_tunerconfig_b ,
& i2c_bus - > i2c_adap ) ) {
if ( ! dvb_attach ( lnbh24_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
2009-10-17 08:38:45 -03:00
LNBH24_PCL | LNBH24_TTX ,
LNBH24_TEN , 0x0a ) )
2016-11-13 09:46:11 -02:00
pr_err ( " No LNBH24 found! \n " ) ;
2009-03-03 12:06:09 -03:00
}
}
break ;
}
break ;
2009-05-18 05:25:49 -03:00
case CX23885_BOARD_MYGICA_X8506 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgs8gxx_attach ,
& mygica_x8506_lgs8gl5_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
& i2c_bus2 - > i2c_adap , & mygica_x8506_xc5000_config ) ;
2013-08-09 08:53:25 -03:00
cx23885_set_frontend_hook ( port , fe0 - > dvb . frontend ) ;
2009-05-18 05:25:49 -03:00
break ;
2013-08-09 08:53:27 -03:00
case CX23885_BOARD_MYGICA_X8507 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( mb86a20s_attach ,
& mygica_x8507_mb86a20s_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
& i2c_bus2 - > i2c_adap ,
& mygica_x8507_xc5000_config ) ;
2013-08-09 08:53:27 -03:00
cx23885_set_frontend_hook ( port , fe0 - > dvb . frontend ) ;
break ;
2009-06-17 01:38:12 -03:00
case CX23885_BOARD_MAGICPRO_PROHDTVE2 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgs8gxx_attach ,
& magicpro_prohdtve2_lgs8g75_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
& i2c_bus2 - > i2c_adap ,
& magicpro_prohdtve2_xc5000_config ) ;
2013-08-09 08:53:25 -03:00
cx23885_set_frontend_hook ( port , fe0 - > dvb . frontend ) ;
2009-06-17 01:38:12 -03:00
break ;
2009-07-20 15:37:25 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1850 :
2012-01-04 21:08:35 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
& hcw_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 0 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
2012-01-04 21:08:35 -03:00
tda18271_attach ( & dev - > ts1 . analog_fe ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
break ;
2009-11-11 01:52:45 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1290 :
2009-07-20 15:37:25 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
& hcw_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 0 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
2009-07-20 15:37:25 -03:00
break ;
2009-10-26 08:54:04 -03:00
case CX23885_BOARD_MYGICA_X8558PRO :
switch ( port - > nr ) {
/* port B */
case 1 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( atbm8830_attach ,
& mygica_x8558pro_atbm8830_cfg1 ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( max2165_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& mygic_x8558pro_max2165_cfg1 ) ;
2009-10-26 08:54:04 -03:00
break ;
/* port C */
case 2 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( atbm8830_attach ,
& mygica_x8558pro_atbm8830_cfg2 ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( max2165_attach , fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& mygic_x8558pro_max2165_cfg2 ) ;
2009-10-26 08:54:04 -03:00
}
break ;
2011-01-25 17:04:00 -03:00
case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF :
2016-09-22 13:37:06 -03:00
if ( port - > nr > 2 )
return 0 ;
2011-01-25 17:04:00 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
mfe_shared = 1 ; /* MFE */
port - > frontends . gate = 0 ; /* not clear for me yet */
/* ports B, C */
/* MFE frontend 1 DVB-T */
fe0 - > dvb . frontend = dvb_attach ( stv0367ter_attach ,
& netup_stv0367_config [ port - > nr - 1 ] ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
if ( NULL = = dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
2011-01-25 17:04:00 -03:00
& i2c_bus - > i2c_adap ,
& netup_xc5000_config [ port - > nr - 1 ] ) )
2014-10-30 11:15:53 -03:00
goto frontend_detach ;
/* load xc5000 firmware */
fe0 - > dvb . frontend - > ops . tuner_ops . init ( fe0 - > dvb . frontend ) ;
2011-01-25 17:04:00 -03:00
/* MFE frontend 2 */
2014-08-14 06:43:01 -03:00
fe1 = vb2_dvb_get_frontend ( & port - > frontends , 2 ) ;
2011-01-25 17:04:00 -03:00
if ( fe1 = = NULL )
goto frontend_detach ;
/* DVB-C init */
fe1 - > dvb . frontend = dvb_attach ( stv0367cab_attach ,
& netup_stv0367_config [ port - > nr - 1 ] ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe1 - > dvb . frontend = = NULL )
break ;
fe1 - > dvb . frontend - > id = 1 ;
if ( NULL = = dvb_attach ( xc5000_attach ,
fe1 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& netup_xc5000_config [ port - > nr - 1 ] ) )
goto frontend_detach ;
2011-01-25 17:04:00 -03:00
break ;
2012-01-07 09:20:48 -03:00
case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
switch ( port - > nr ) {
/* port b */
case 1 :
fe0 - > dvb . frontend = dvb_attach ( drxk_attach ,
& terratec_drxk_config [ 0 ] ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
if ( ! dvb_attach ( mt2063_attach ,
fe0 - > dvb . frontend ,
& terratec_mt2063_config [ 0 ] ,
& i2c_bus2 - > i2c_adap ) )
goto frontend_detach ;
2012-01-07 09:20:48 -03:00
break ;
/* port c */
case 2 :
fe0 - > dvb . frontend = dvb_attach ( drxk_attach ,
& terratec_drxk_config [ 1 ] ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
if ( ! dvb_attach ( mt2063_attach ,
fe0 - > dvb . frontend ,
& terratec_mt2063_config [ 1 ] ,
& i2c_bus2 - > i2c_adap ) )
goto frontend_detach ;
2012-01-07 09:20:48 -03:00
break ;
}
break ;
2012-05-11 11:45:42 -03:00
case CX23885_BOARD_TEVII_S471 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( ds3000_attach ,
& tevii_ds3000_config ,
& i2c_bus - > i2c_adap ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
dvb_attach ( ts2020_attach , fe0 - > dvb . frontend ,
& tevii_ts2020_config , & i2c_bus - > i2c_adap ) ;
2012-05-11 11:45:42 -03:00
break ;
2012-09-12 07:59:18 -03:00
case CX23885_BOARD_PROF_8000 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( stv090x_attach ,
& prof_8000_stv090x_config ,
& i2c_bus - > i2c_adap ,
STV090x_DEMODULATOR_0 ) ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
if ( ! dvb_attach ( stb6100_attach ,
fe0 - > dvb . frontend ,
& prof_8000_stb6100_config ,
& i2c_bus - > i2c_adap ) )
goto frontend_detach ;
2012-09-12 07:59:18 -03:00
2014-10-30 11:15:53 -03:00
fe0 - > dvb . frontend - > ops . set_voltage = p8000_set_voltage ;
2012-09-12 07:59:18 -03:00
break ;
2015-04-20 15:01:51 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR4400 : {
struct tda10071_platform_data tda10071_pdata = hauppauge_tda10071_pdata ;
struct a8293_platform_data a8293_pdata = { } ;
2012-12-15 23:34:09 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2014-07-22 17:12:13 -03:00
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
switch ( port - > nr ) {
/* port b */
case 1 :
2015-04-20 15:01:51 -03:00
/* attach demod + tuner combo */
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " tda10071_cx24118 " , I2C_NAME_SIZE ) ;
info . addr = 0x05 ;
info . platform_data = & tda10071_pdata ;
request_module ( " tda10071 " ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( ! client_demod | | ! client_demod - > dev . driver )
2014-10-30 11:15:53 -03:00
goto frontend_detach ;
2015-04-20 15:01:51 -03:00
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
fe0 - > dvb . frontend = tda10071_pdata . get_dvb_frontend ( client_demod ) ;
port - > i2c_client_demod = client_demod ;
/* attach SEC */
a8293_pdata . dvb_frontend = fe0 - > dvb . frontend ;
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " a8293 " , I2C_NAME_SIZE ) ;
info . addr = 0x0b ;
info . platform_data = & a8293_pdata ;
request_module ( " a8293 " ) ;
client_sec = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( ! client_sec | | ! client_sec - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_sec - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_sec ) ;
goto frontend_detach ;
}
port - > i2c_client_sec = client_sec ;
2014-07-22 17:12:13 -03:00
break ;
/* port c */
case 2 :
2016-07-26 04:09:03 -03:00
/* attach frontend */
memset ( & si2165_pdata , 0 , sizeof ( si2165_pdata ) ) ;
si2165_pdata . fe = & fe0 - > dvb . frontend ;
2017-11-05 09:25:06 -05:00
si2165_pdata . chip_mode = SI2165_MODE_PLL_XTAL ;
si2165_pdata . ref_freq_hz = 16000000 ;
2016-07-26 04:09:03 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2165 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2165_pdata ;
request_module ( info . type ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( client_demod = = NULL | |
client_demod - > dev . driver = = NULL )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
2014-10-30 11:15:53 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
fe0 - > dvb . frontend - > ops . i2c_gate_ctrl = NULL ;
if ( ! dvb_attach ( tda18271_attach ,
fe0 - > dvb . frontend ,
0x60 , & i2c_bus2 - > i2c_adap ,
& hauppauge_hvr4400_tuner_config ) )
goto frontend_detach ;
2014-07-22 17:12:13 -03:00
break ;
2012-12-15 23:34:09 -03:00
}
break ;
2015-04-20 15:01:51 -03:00
}
2015-04-20 14:48:33 -03:00
case CX23885_BOARD_HAUPPAUGE_STARBURST : {
struct tda10071_platform_data tda10071_pdata = hauppauge_tda10071_pdata ;
struct a8293_platform_data a8293_pdata = { } ;
2014-12-22 19:51:39 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2015-04-20 14:48:33 -03:00
/* attach demod + tuner combo */
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " tda10071_cx24118 " , I2C_NAME_SIZE ) ;
info . addr = 0x05 ;
info . platform_data = & tda10071_pdata ;
request_module ( " tda10071 " ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( ! client_demod | | ! client_demod - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
2014-12-22 19:51:39 -03:00
}
2015-04-20 14:48:33 -03:00
fe0 - > dvb . frontend = tda10071_pdata . get_dvb_frontend ( client_demod ) ;
port - > i2c_client_demod = client_demod ;
/* attach SEC */
a8293_pdata . dvb_frontend = fe0 - > dvb . frontend ;
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " a8293 " , I2C_NAME_SIZE ) ;
info . addr = 0x0b ;
info . platform_data = & a8293_pdata ;
request_module ( " a8293 " ) ;
client_sec = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( ! client_sec | | ! client_sec - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_sec - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_sec ) ;
goto frontend_detach ;
}
port - > i2c_client_sec = client_sec ;
2014-12-22 19:51:39 -03:00
break ;
2015-04-20 14:48:33 -03:00
}
2014-08-11 16:58:15 -03:00
case CX23885_BOARD_DVBSKY_T9580 :
2014-11-05 11:58:07 -03:00
case CX23885_BOARD_DVBSKY_S950 :
2014-08-11 16:58:15 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
switch ( port - > nr ) {
/* port b - satellite */
case 1 :
/* attach frontend */
fe0 - > dvb . frontend = dvb_attach ( m88ds3103_attach ,
& dvbsky_t9580_m88ds3103_config ,
& i2c_bus2 - > i2c_adap , & adapter ) ;
if ( fe0 - > dvb . frontend = = NULL )
break ;
/* attach tuner */
2015-03-23 18:52:46 -03:00
memset ( & ts2020_config , 0 , sizeof ( ts2020_config ) ) ;
ts2020_config . fe = fe0 - > dvb . frontend ;
2015-05-26 12:04:00 -03:00
ts2020_config . get_agc_pwm = m88ds3103_get_agc_pwm ;
2014-08-11 16:58:15 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
2015-03-23 18:52:46 -03:00
strlcpy ( info . type , " ts2020 " , I2C_NAME_SIZE ) ;
2014-08-11 16:58:15 -03:00
info . addr = 0x60 ;
2015-03-23 18:52:46 -03:00
info . platform_data = & ts2020_config ;
2014-08-11 16:58:15 -03:00
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
if ( client_tuner = = NULL | |
client_tuner - > dev . driver = = NULL )
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
/* delegate signal strength measurement to tuner */
fe0 - > dvb . frontend - > ops . read_signal_strength =
fe0 - > dvb . frontend - > ops . tuner_ops . get_rf_strength ;
/*
* for setting the voltage we need to set GPIOs on
* the card .
*/
port - > fe_set_voltage =
fe0 - > dvb . frontend - > ops . set_voltage ;
fe0 - > dvb . frontend - > ops . set_voltage =
dvbsky_t9580_set_voltage ;
port - > i2c_client_tuner = client_tuner ;
break ;
/* port c - terrestrial/cable */
case 2 :
/* attach frontend */
2014-09-24 00:06:54 -03:00
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
2014-08-11 16:58:15 -03:00
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
si2168_config . ts_mode = SI2168_TS_SERIAL ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2168_config ;
request_module ( info . type ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( client_demod = = NULL | |
client_demod - > dev . driver = = NULL )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
2014-09-24 00:06:54 -03:00
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
2014-08-11 16:58:15 -03:00
si2157_config . fe = fe0 - > dvb . frontend ;
2015-05-05 13:54:17 -03:00
si2157_config . if_port = 1 ;
2014-08-11 16:58:15 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
if ( client_tuner = = NULL | |
2014-12-23 13:48:07 -02:00
client_tuner - > dev . driver = = NULL )
2014-08-11 16:58:15 -03:00
goto frontend_detach ;
2014-12-23 13:48:07 -02:00
2014-08-11 16:58:15 -03:00
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
break ;
}
break ;
2014-09-29 04:44:16 -03:00
case CX23885_BOARD_DVBSKY_T980C :
2014-10-30 17:48:27 -03:00
case CX23885_BOARD_TT_CT2_4500_CI :
2016-02-16 18:17:45 -02:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
2014-09-29 04:44:16 -03:00
/* attach frontend */
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
si2168_config . ts_mode = SI2168_TS_PARALLEL ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2168_config ;
request_module ( info . type ) ;
2016-02-16 18:17:45 -02:00
client_demod = i2c_new_device ( & i2c_bus2 - > i2c_adap , & info ) ;
2014-12-10 11:05:59 -03:00
if ( client_demod = = NULL | | client_demod - > dev . driver = = NULL )
2014-09-29 04:44:16 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
2015-05-05 13:54:17 -03:00
si2157_config . if_port = 1 ;
2014-09-29 04:44:16 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
2014-12-23 13:48:07 -02:00
if ( client_tuner = = NULL | |
client_tuner - > dev . driver = = NULL )
2014-09-29 04:44:16 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
2014-10-23 07:01:44 -03:00
port - > i2c_client_tuner = client_tuner ;
break ;
case CX23885_BOARD_DVBSKY_S950C :
2016-02-16 18:17:45 -02:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
2014-10-23 07:01:44 -03:00
/* attach frontend */
fe0 - > dvb . frontend = dvb_attach ( m88ds3103_attach ,
& dvbsky_s950c_m88ds3103_config ,
2016-02-16 18:17:45 -02:00
& i2c_bus2 - > i2c_adap , & adapter ) ;
2014-10-23 07:01:44 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
/* attach tuner */
2015-03-23 18:52:46 -03:00
memset ( & ts2020_config , 0 , sizeof ( ts2020_config ) ) ;
ts2020_config . fe = fe0 - > dvb . frontend ;
2015-05-26 12:04:00 -03:00
ts2020_config . get_agc_pwm = m88ds3103_get_agc_pwm ;
2014-10-23 07:01:44 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
2015-03-23 18:52:46 -03:00
strlcpy ( info . type , " ts2020 " , I2C_NAME_SIZE ) ;
2014-10-23 07:01:44 -03:00
info . addr = 0x60 ;
2015-03-23 18:52:46 -03:00
info . platform_data = & ts2020_config ;
2014-10-23 07:01:44 -03:00
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
2014-12-10 11:05:59 -03:00
if ( client_tuner = = NULL | | client_tuner - > dev . driver = = NULL )
2014-10-23 07:01:44 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
/* delegate signal strength measurement to tuner */
fe0 - > dvb . frontend - > ops . read_signal_strength =
fe0 - > dvb . frontend - > ops . tuner_ops . get_rf_strength ;
2014-11-05 11:58:38 -03:00
port - > i2c_client_tuner = client_tuner ;
break ;
case CX23885_BOARD_DVBSKY_S952 :
2016-12-25 13:38:20 -02:00
/* attach frontend */
memset ( & m88ds3103_pdata , 0 , sizeof ( m88ds3103_pdata ) ) ;
m88ds3103_pdata . clk = 27000000 ;
m88ds3103_pdata . i2c_wr_max = 33 ;
m88ds3103_pdata . agc = 0x99 ;
m88ds3103_pdata . clk_out = M88DS3103_CLOCK_OUT_DISABLED ;
m88ds3103_pdata . lnb_en_pol = 1 ;
2014-11-05 11:58:38 -03:00
switch ( port - > nr ) {
/* port b */
case 1 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2016-12-25 13:38:20 -02:00
m88ds3103_pdata . ts_mode = M88DS3103_TS_PARALLEL ;
m88ds3103_pdata . ts_clk = 16000 ;
m88ds3103_pdata . ts_clk_pol = 1 ;
2014-11-05 11:58:38 -03:00
p_set_voltage = dvbsky_t9580_set_voltage ;
break ;
/* port c */
case 2 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2016-12-25 13:38:20 -02:00
m88ds3103_pdata . ts_mode = M88DS3103_TS_SERIAL ;
m88ds3103_pdata . ts_clk = 96000 ;
m88ds3103_pdata . ts_clk_pol = 0 ;
2014-11-05 11:58:38 -03:00
p_set_voltage = dvbsky_s952_portc_set_voltage ;
break ;
2016-12-25 13:38:20 -02:00
default :
return 0 ;
2014-11-05 11:58:38 -03:00
}
2016-12-25 13:38:20 -02:00
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " m88ds3103 " , I2C_NAME_SIZE ) ;
info . addr = 0x68 ;
info . platform_data = & m88ds3103_pdata ;
request_module ( info . type ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
if ( client_demod = = NULL | | client_demod - > dev . driver = = NULL )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
adapter = m88ds3103_pdata . get_i2c_adapter ( client_demod ) ;
fe0 - > dvb . frontend = m88ds3103_pdata . get_dvb_frontend ( client_demod ) ;
2014-11-05 11:58:38 -03:00
/* attach tuner */
2015-03-23 18:52:46 -03:00
memset ( & ts2020_config , 0 , sizeof ( ts2020_config ) ) ;
ts2020_config . fe = fe0 - > dvb . frontend ;
2015-05-26 12:04:00 -03:00
ts2020_config . get_agc_pwm = m88ds3103_get_agc_pwm ;
2014-11-05 11:58:38 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
2015-03-23 18:52:46 -03:00
strlcpy ( info . type , " ts2020 " , I2C_NAME_SIZE ) ;
2014-11-05 11:58:38 -03:00
info . addr = 0x60 ;
2015-03-23 18:52:46 -03:00
info . platform_data = & ts2020_config ;
2014-11-05 11:58:38 -03:00
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
2014-12-10 11:05:59 -03:00
if ( client_tuner = = NULL | | client_tuner - > dev . driver = = NULL )
2014-11-05 11:58:38 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
/* delegate signal strength measurement to tuner */
fe0 - > dvb . frontend - > ops . read_signal_strength =
fe0 - > dvb . frontend - > ops . tuner_ops . get_rf_strength ;
/*
* for setting the voltage we need to set GPIOs on
* the card .
*/
port - > fe_set_voltage =
fe0 - > dvb . frontend - > ops . set_voltage ;
fe0 - > dvb . frontend - > ops . set_voltage = p_set_voltage ;
2014-11-12 01:23:12 -03:00
port - > i2c_client_tuner = client_tuner ;
break ;
case CX23885_BOARD_DVBSKY_T982 :
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
switch ( port - > nr ) {
/* port b */
case 1 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
si2168_config . ts_mode = SI2168_TS_PARALLEL ;
break ;
/* port c */
case 2 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
si2168_config . ts_mode = SI2168_TS_SERIAL ;
break ;
}
/* attach frontend */
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2168_config ;
request_module ( info . type ) ;
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
2014-12-10 11:05:59 -03:00
if ( client_demod = = NULL | | client_demod - > dev . driver = = NULL )
2014-11-12 01:23:12 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
2015-05-05 13:54:17 -03:00
si2157_config . if_port = 1 ;
2014-11-12 01:23:12 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
2014-12-23 13:48:07 -02:00
if ( client_tuner = = NULL | |
client_tuner - > dev . driver = = NULL )
2014-11-12 01:23:12 -03:00
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
2014-09-29 04:44:16 -03:00
port - > i2c_client_tuner = client_tuner ;
break ;
2018-01-05 19:48:21 -05:00
case CX23885_BOARD_HAUPPAUGE_STARBURST2 :
case CX23885_BOARD_HAUPPAUGE_HVR5525 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
2015-12-18 14:22:21 -02:00
switch ( port - > nr ) {
2014-12-11 16:12:46 -03:00
/* port b - satellite */
case 1 :
/* attach frontend */
fe0 - > dvb . frontend = dvb_attach ( m88ds3103_attach ,
& hauppauge_hvr5525_m88ds3103_config ,
2018-01-05 19:48:21 -05:00
& i2c_bus - > i2c_adap , & adapter ) ;
2014-12-11 16:12:46 -03:00
if ( fe0 - > dvb . frontend = = NULL )
break ;
/* attach SEC */
2015-04-20 17:08:01 -03:00
a8293_pdata . dvb_frontend = fe0 - > dvb . frontend ;
memset ( & info , 0 , sizeof ( info ) ) ;
strlcpy ( info . type , " a8293 " , I2C_NAME_SIZE ) ;
info . addr = 0x0b ;
info . platform_data = & a8293_pdata ;
request_module ( " a8293 " ) ;
2018-01-05 19:48:21 -05:00
client_sec = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
2015-04-20 17:08:01 -03:00
if ( ! client_sec | | ! client_sec - > dev . driver )
2014-12-11 16:12:46 -03:00
goto frontend_detach ;
2015-04-20 17:08:01 -03:00
if ( ! try_module_get ( client_sec - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_sec ) ;
goto frontend_detach ;
}
port - > i2c_client_sec = client_sec ;
2014-12-11 16:12:46 -03:00
/* attach tuner */
memset ( & m88rs6000t_config , 0 , sizeof ( m88rs6000t_config ) ) ;
m88rs6000t_config . fe = fe0 - > dvb . frontend ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " m88rs6000t " , I2C_NAME_SIZE ) ;
info . addr = 0x21 ;
info . platform_data = & m88rs6000t_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( adapter , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
/* delegate signal strength measurement to tuner */
fe0 - > dvb . frontend - > ops . read_signal_strength =
fe0 - > dvb . frontend - > ops . tuner_ops . get_rf_strength ;
break ;
/* port c - terrestrial/cable */
case 2 :
/* attach frontend */
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
si2168_config . ts_mode = SI2168_TS_SERIAL ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2168_config ;
request_module ( " %s " , info . type ) ;
2018-01-05 19:48:21 -05:00
client_demod = i2c_new_device ( & i2c_bus - > i2c_adap , & info ) ;
2014-12-11 16:12:46 -03:00
if ( ! client_demod | | ! client_demod - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
2015-05-05 13:54:17 -03:00
si2157_config . if_port = 1 ;
2014-12-11 16:12:46 -03:00
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
2018-01-05 19:48:21 -05:00
client_tuner = i2c_new_device ( & i2c_bus2 - > i2c_adap , & info ) ;
2014-12-11 16:12:46 -03:00
if ( ! client_tuner | | ! client_tuner - > dev . driver ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
break ;
}
break ;
2016-07-02 06:46:23 -03:00
case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB :
2018-01-05 19:48:22 -05:00
case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885 :
pr_info ( " %s(): board=%d port=%d \n " , __func__ ,
dev - > board , port - > nr ) ;
2016-07-02 06:46:23 -03:00
switch ( port - > nr ) {
/* port b - Terrestrial/cable */
case 1 :
/* attach frontend */
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
si2168_config . ts_mode = SI2168_TS_SERIAL ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x64 ;
info . platform_data = & si2168_config ;
request_module ( " %s " , info . type ) ;
client_demod = i2c_new_device ( & dev - > i2c_bus [ 0 ] . i2c_adap , & info ) ;
if ( ! client_demod | | ! client_demod - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
si2157_config . if_port = 1 ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( & dev - > i2c_bus [ 1 ] . i2c_adap , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
break ;
/* port c - terrestrial/cable */
case 2 :
/* attach frontend */
memset ( & si2168_config , 0 , sizeof ( si2168_config ) ) ;
si2168_config . i2c_adapter = & adapter ;
si2168_config . fe = & fe0 - > dvb . frontend ;
si2168_config . ts_mode = SI2168_TS_SERIAL ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2168 " , I2C_NAME_SIZE ) ;
info . addr = 0x66 ;
info . platform_data = & si2168_config ;
request_module ( " %s " , info . type ) ;
client_demod = i2c_new_device ( & dev - > i2c_bus [ 0 ] . i2c_adap , & info ) ;
if ( ! client_demod | | ! client_demod - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_demod - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_demod ) ;
goto frontend_detach ;
}
port - > i2c_client_demod = client_demod ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
si2157_config . if_port = 1 ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x62 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( & dev - > i2c_bus [ 1 ] . i2c_adap , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
2016-08-09 19:43:40 -03:00
}
port - > i2c_client_tuner = client_tuner ;
break ;
}
break ;
case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC :
2018-01-05 19:48:22 -05:00
case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885 :
pr_info ( " %s(): board=%d port=%d \n " , __func__ ,
dev - > board , port - > nr ) ;
2016-08-09 19:43:40 -03:00
switch ( port - > nr ) {
/* port b - Terrestrial/cable */
case 1 :
/* attach frontend */
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgdt3306a_attach ,
& hauppauge_quadHD_ATSC_a_config , & i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend = = NULL )
break ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
si2157_config . if_port = 1 ;
si2157_config . inversion = 1 ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( & dev - > i2c_bus [ 1 ] . i2c_adap , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
break ;
/* port c - terrestrial/cable */
case 2 :
/* attach frontend */
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgdt3306a_attach ,
& hauppauge_quadHD_ATSC_b_config , & i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend = = NULL )
break ;
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
si2157_config . if_port = 1 ;
si2157_config . inversion = 1 ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x62 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( & dev - > i2c_bus [ 1 ] . i2c_adap , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
}
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
goto frontend_detach ;
2016-07-02 06:46:23 -03:00
}
port - > i2c_client_tuner = client_tuner ;
break ;
}
break ;
2018-01-05 19:48:20 -05:00
case CX23885_BOARD_HAUPPAUGE_HVR1265_K4 :
switch ( port - > nr ) {
/* port c - Terrestrial/cable */
case 2 :
/* attach frontend */
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgdt3306a_attach ,
& hauppauge_hvr1265k4_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend = = NULL )
break ;
2016-07-02 06:46:23 -03:00
2018-01-05 19:48:20 -05:00
/* attach tuner */
memset ( & si2157_config , 0 , sizeof ( si2157_config ) ) ;
si2157_config . fe = fe0 - > dvb . frontend ;
si2157_config . if_port = 1 ;
si2157_config . inversion = 1 ;
memset ( & info , 0 , sizeof ( struct i2c_board_info ) ) ;
strlcpy ( info . type , " si2157 " , I2C_NAME_SIZE ) ;
info . addr = 0x60 ;
info . platform_data = & si2157_config ;
request_module ( " %s " , info . type ) ;
client_tuner = i2c_new_device ( & dev - > i2c_bus [ 1 ] . i2c_adap , & info ) ;
if ( ! client_tuner | | ! client_tuner - > dev . driver )
goto frontend_detach ;
if ( ! try_module_get ( client_tuner - > dev . driver - > owner ) ) {
i2c_unregister_device ( client_tuner ) ;
client_tuner = NULL ;
goto frontend_detach ;
}
port - > i2c_client_tuner = client_tuner ;
break ;
}
break ;
2007-03-11 20:44:05 -03:00
default :
2016-11-13 09:46:11 -02:00
pr_info ( " %s: The frontend of your DVB/ATSC card isn't supported yet \n " ,
dev - > name ) ;
2007-03-11 20:44:05 -03:00
break ;
}
2011-01-25 17:04:00 -03:00
if ( ( NULL = = fe0 - > dvb . frontend ) | | ( fe1 & & NULL = = fe1 - > dvb . frontend ) ) {
2016-11-13 09:46:11 -02:00
pr_err ( " %s: frontend initialization failed \n " ,
2011-01-25 17:04:00 -03:00
dev - > name ) ;
goto frontend_detach ;
2007-03-11 20:44:05 -03:00
}
2011-01-25 17:04:00 -03:00
2008-09-12 13:31:45 -03:00
/* define general-purpose callback pointer */
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend - > callback = cx23885_tuner_callback ;
2011-01-25 17:04:00 -03:00
if ( fe1 )
fe1 - > dvb . frontend - > callback = cx23885_tuner_callback ;
#if 0
/* Ensure all frontends negotiate bus access */
fe0 - > dvb . frontend - > ops . ts_bus_ctrl = cx23885_dvb_bus_ctrl ;
if ( fe1 )
fe1 - > dvb . frontend - > ops . ts_bus_ctrl = cx23885_dvb_bus_ctrl ;
# endif
2007-03-11 20:44:05 -03:00
media: add tuner standby op, use where needed
The v4l2_subdev core s_power op was used for two different things: power on/off
sensors or video decoders/encoders and to put a tuner in standby (and only the
tuner!). There is no 'tuner wakeup' op, that's done automatically when the tuner
is accessed.
The danger with calling (s_power, 0) to put a tuner into standby is that it is
usually broadcast for all subdevs. So a video receiver subdev that supports
s_power will also be powered off, and since there is no corresponding (s_power, 1)
they will never be powered on again.
In addition, this is specifically meant for tuners only since they draw the most
current.
This patch adds a new tuner op called 'standby' and replaces all calls to
(core, s_power, 0) by (tuner, standby). This prevents confusion between the two
uses of s_power. Note that there is no overlap: bridge drivers either just want
to put the tuner into standby, or they deal with powering on/off sensors. Never
both.
This also makes it easier to replace s_power for the remaining bridge drivers
with some PM code later.
Whether we want something cleaner for tuners in the future is a separate topic.
There is a lot of legacy code surrounding tuners, and I am very hesitant about
making changes there.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2018-02-21 02:49:25 -05:00
/* Put the tuner in standby to keep it quiet */
call_all ( dev , tuner , standby ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend - > ops . analog_ops . standby )
fe0 - > dvb . frontend - > ops . analog_ops . standby ( fe0 - > dvb . frontend ) ;
2007-12-07 01:40:36 -03:00
2007-03-11 20:44:05 -03:00
/* register everything */
2014-08-14 06:43:01 -03:00
ret = vb2_dvb_register_bus ( & port - > frontends , THIS_MODULE , port ,
2016-02-05 08:35:50 -02:00
& dev - > pci - > dev , NULL ,
adapter_nr , mfe_shared ) ;
2010-06-25 08:01:28 -03:00
if ( ret )
2011-01-25 17:04:00 -03:00
goto frontend_detach ;
2008-10-11 11:05:50 -03:00
2014-12-23 13:48:07 -02:00
ret = dvb_register_ci_mac ( port ) ;
if ( ret )
goto frontend_detach ;
2014-10-04 03:59:30 -03:00
2014-12-23 13:48:07 -02:00
return 0 ;
2014-09-29 04:44:16 -03:00
2014-12-23 13:48:07 -02:00
frontend_detach :
2015-04-16 13:59:46 -03:00
/* remove I2C client for SEC */
client_sec = port - > i2c_client_sec ;
if ( client_sec ) {
module_put ( client_sec - > dev . driver - > owner ) ;
i2c_unregister_device ( client_sec ) ;
port - > i2c_client_sec = NULL ;
}
2014-12-23 13:48:07 -02:00
/* remove I2C client for tuner */
client_tuner = port - > i2c_client_tuner ;
if ( client_tuner ) {
module_put ( client_tuner - > dev . driver - > owner ) ;
i2c_unregister_device ( client_tuner ) ;
port - > i2c_client_tuner = NULL ;
2009-03-03 12:06:09 -03:00
}
2014-12-23 13:48:07 -02:00
/* remove I2C client for demodulator */
client_demod = port - > i2c_client_demod ;
if ( client_demod ) {
module_put ( client_demod - > dev . driver - > owner ) ;
i2c_unregister_device ( client_demod ) ;
port - > i2c_client_demod = NULL ;
}
2011-01-25 17:04:00 -03:00
port - > gate_ctrl = NULL ;
2014-08-14 06:43:01 -03:00
vb2_dvb_dealloc_frontends ( & port - > frontends ) ;
2011-01-25 17:04:00 -03:00
return - EINVAL ;
2007-03-11 20:44:05 -03:00
}
int cx23885_dvb_register ( struct cx23885_tsport * port )
{
2008-10-11 11:05:50 -03:00
2014-08-14 06:43:01 -03:00
struct vb2_dvb_frontend * fe0 ;
2007-03-11 20:44:05 -03:00
struct cx23885_dev * dev = port - > dev ;
2008-10-11 12:34:39 -03:00
int err , i ;
/* Here we need to allocate the correct number of frontends,
tree-wide: fix assorted typos all over the place
That is "success", "unknown", "through", "performance", "[re|un]mapping"
, "access", "default", "reasonable", "[con]currently", "temperature"
, "channel", "[un]used", "application", "example","hierarchy", "therefore"
, "[over|under]flow", "contiguous", "threshold", "enough" and others.
Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2009-11-14 13:09:05 -02:00
* as reflected in the cards struct . The reality is that currently
2008-10-11 12:34:39 -03:00
* no cx23885 boards support this - yet . But , if we don ' t modify this
* code then the second frontend would never be allocated ( later )
* and fail with error before the attach in dvb_register ( ) .
* Without these changes we risk an OOPS later . The changes here
* are for safety , and should provide a good foundation for the
* future addition of any multi - frontend cx23885 based boards .
*/
2016-11-13 09:46:11 -02:00
pr_info ( " %s() allocating %d frontend(s) \n " , __func__ ,
2008-10-11 12:34:39 -03:00
port - > num_frontends ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
for ( i = 1 ; i < = port - > num_frontends ; i + + ) {
2014-08-14 06:43:01 -03:00
struct vb2_queue * q ;
if ( vb2_dvb_alloc_frontend (
2008-10-16 20:18:44 -03:00
& port - > frontends , i ) = = NULL ) {
2016-11-13 09:46:11 -02:00
pr_err ( " %s() failed to alloc \n " , __func__ ) ;
2008-10-11 12:34:39 -03:00
return - ENOMEM ;
}
2014-08-14 06:43:01 -03:00
fe0 = vb2_dvb_get_frontend ( & port - > frontends , i ) ;
2008-10-11 12:34:39 -03:00
if ( ! fe0 )
2014-10-30 11:15:53 -03:00
return - EINVAL ;
2008-10-11 11:05:50 -03:00
2008-10-11 12:34:39 -03:00
dprintk ( 1 , " %s \n " , __func__ ) ;
2008-10-16 20:18:44 -03:00
dprintk ( 1 , " ->probed by Card=%d Name=%s, PCI %02x:%02x \n " ,
2008-10-11 12:34:39 -03:00
dev - > board ,
dev - > name ,
dev - > pci_bus ,
dev - > pci_slot ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
err = - ENODEV ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
/* dvb stuff */
/* We have to init the queue for each frontend on a port. */
2016-11-13 09:46:11 -02:00
pr_info ( " %s: cx23885 based dvb card \n " , dev - > name ) ;
2014-08-14 06:43:01 -03:00
q = & fe0 - > dvb . dvbq ;
q - > type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
q - > io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ ;
q - > gfp_flags = GFP_DMA32 ;
q - > min_buffers_needed = 2 ;
q - > drv_priv = port ;
q - > buf_struct_size = sizeof ( struct cx23885_buffer ) ;
q - > ops = & dvb_qops ;
q - > mem_ops = & vb2_dma_sg_memops ;
q - > timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC ;
q - > lock = & dev - > lock ;
2016-02-15 12:37:15 -02:00
q - > dev = & dev - > pci - > dev ;
2014-08-14 06:43:01 -03:00
err = vb2_queue_init ( q ) ;
if ( err < 0 )
return err ;
2008-10-11 12:34:39 -03:00
}
2007-03-11 20:44:05 -03:00
err = dvb_register ( port ) ;
if ( err ! = 0 )
2016-11-13 09:46:11 -02:00
pr_err ( " %s() dvb_register failed err = %d \n " ,
__func__ , err ) ;
2007-03-11 20:44:05 -03:00
return err ;
}
int cx23885_dvb_unregister ( struct cx23885_tsport * port )
{
2014-08-14 06:43:01 -03:00
struct vb2_dvb_frontend * fe0 ;
2014-08-11 16:58:13 -03:00
struct i2c_client * client ;
2017-08-02 12:45:59 -04:00
fe0 = vb2_dvb_get_frontend ( & port - > frontends , 1 ) ;
if ( fe0 & & fe0 - > dvb . frontend )
vb2_dvb_unregister_bus ( & port - > frontends ) ;
2014-09-29 04:44:19 -03:00
/* remove I2C client for CI */
client = port - > i2c_client_ci ;
if ( client ) {
module_put ( client - > dev . driver - > owner ) ;
i2c_unregister_device ( client ) ;
}
2015-04-16 13:59:46 -03:00
/* remove I2C client for SEC */
client = port - > i2c_client_sec ;
if ( client ) {
module_put ( client - > dev . driver - > owner ) ;
i2c_unregister_device ( client ) ;
}
2014-08-11 16:58:13 -03:00
/* remove I2C client for tuner */
client = port - > i2c_client_tuner ;
if ( client ) {
module_put ( client - > dev . driver - > owner ) ;
i2c_unregister_device ( client ) ;
}
/* remove I2C client for demodulator */
client = port - > i2c_client_demod ;
if ( client ) {
module_put ( client - > dev . driver - > owner ) ;
i2c_unregister_device ( client ) ;
}
2008-10-11 11:05:50 -03:00
2009-03-13 13:24:19 -03:00
switch ( port - > dev - > board ) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
netup_ci_exit ( port ) ;
break ;
2011-01-25 17:04:00 -03:00
case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF :
altera_ci_release ( port - > dev , port - > nr ) ;
break ;
2009-03-13 13:24:19 -03:00
}
2009-03-03 12:06:09 -03:00
2011-01-25 17:04:00 -03:00
port - > gate_ctrl = NULL ;
2007-03-11 20:44:05 -03:00
return 0 ;
}