[media] dib0700: add initial code for PCTV 340e by Davide Ferri
This is initial code written by Davide Ferri for the PCTV 340e, including a new xc4000 driver. I am checking in all the code unmodified, and making no assertions about its quality (other than confirming it compiles). [mchehab@redhat.com: rebased on the top of the current tree] Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com> Signed-off-by: Davide Ferri <davidef1986@gmail.com> Cc: Patrick Boettcher <pboettcher@kernellabs.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
32127363ee
Коммит
8d009a0c41
|
@ -78,6 +78,7 @@ tuner=77 - TCL tuner MF02GIP-5N-E
|
||||||
tuner=78 - Philips FMD1216MEX MK3 Hybrid Tuner
|
tuner=78 - Philips FMD1216MEX MK3 Hybrid Tuner
|
||||||
tuner=79 - Philips PAL/SECAM multi (FM1216 MK5)
|
tuner=79 - Philips PAL/SECAM multi (FM1216 MK5)
|
||||||
tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
|
tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
|
||||||
|
tuner=81 - Xceive 4000 tuner
|
||||||
tuner=81 - Partsnic (Daewoo) PTI-5NF05
|
tuner=81 - Partsnic (Daewoo) PTI-5NF05
|
||||||
tuner=82 - Philips CU1216L
|
tuner=82 - Philips CU1216L
|
||||||
tuner=83 - NXP TDA18271
|
tuner=83 - NXP TDA18271
|
||||||
|
|
|
@ -23,6 +23,7 @@ config MEDIA_TUNER
|
||||||
depends on VIDEO_MEDIA && I2C
|
depends on VIDEO_MEDIA && I2C
|
||||||
select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
|
select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
|
||||||
select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMISE
|
select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMISE
|
||||||
|
select MEDIA_TUNER_XC4000 if !MEDIA_TUNER_CUSTOMISE
|
||||||
select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMISE
|
select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMISE
|
||||||
select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
|
select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
|
||||||
select MEDIA_TUNER_TEA5761 if !MEDIA_TUNER_CUSTOMISE
|
select MEDIA_TUNER_TEA5761 if !MEDIA_TUNER_CUSTOMISE
|
||||||
|
@ -152,6 +153,15 @@ config MEDIA_TUNER_XC5000
|
||||||
This device is only used inside a SiP called together with a
|
This device is only used inside a SiP called together with a
|
||||||
demodulator for now.
|
demodulator for now.
|
||||||
|
|
||||||
|
config MEDIA_TUNER_XC4000
|
||||||
|
tristate "Xceive XC4000 silicon tuner"
|
||||||
|
depends on VIDEO_MEDIA && I2C
|
||||||
|
default m if MEDIA_TUNER_CUSTOMISE
|
||||||
|
help
|
||||||
|
A driver for the silicon tuner XC4000 from Xceive.
|
||||||
|
This device is only used inside a SiP called together with a
|
||||||
|
demodulator for now.
|
||||||
|
|
||||||
config MEDIA_TUNER_MXL5005S
|
config MEDIA_TUNER_MXL5005S
|
||||||
tristate "MaxLinear MSL5005S silicon tuner"
|
tristate "MaxLinear MSL5005S silicon tuner"
|
||||||
depends on VIDEO_MEDIA && I2C
|
depends on VIDEO_MEDIA && I2C
|
||||||
|
|
|
@ -16,6 +16,7 @@ obj-$(CONFIG_MEDIA_TUNER_TDA9887) += tda9887.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_TDA827X) += tda827x.o
|
obj-$(CONFIG_MEDIA_TUNER_TDA827X) += tda827x.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_TDA18271) += tda18271.o
|
obj-$(CONFIG_MEDIA_TUNER_TDA18271) += tda18271.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_XC5000) += xc5000.o
|
obj-$(CONFIG_MEDIA_TUNER_XC5000) += xc5000.o
|
||||||
|
obj-$(CONFIG_MEDIA_TUNER_XC4000) += xc4000.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_MT2060) += mt2060.o
|
obj-$(CONFIG_MEDIA_TUNER_MT2060) += mt2060.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_MT2266) += mt2266.o
|
obj-$(CONFIG_MEDIA_TUNER_MT2266) += mt2266.o
|
||||||
obj-$(CONFIG_MEDIA_TUNER_QT1010) += qt1010.o
|
obj-$(CONFIG_MEDIA_TUNER_QT1010) += qt1010.o
|
||||||
|
|
|
@ -1805,6 +1805,10 @@ struct tunertype tuners[] = {
|
||||||
.name = "Xceive 5000 tuner",
|
.name = "Xceive 5000 tuner",
|
||||||
/* see xc5000.c for details */
|
/* see xc5000.c for details */
|
||||||
},
|
},
|
||||||
|
[TUNER_XC4000] = { /* Xceive 4000 */
|
||||||
|
.name = "Xceive 4000 tuner",
|
||||||
|
/* see xc4000.c for details */
|
||||||
|
},
|
||||||
[TUNER_TCL_MF02GIP_5N] = { /* TCL tuner MF02GIP-5N-E */
|
[TUNER_TCL_MF02GIP_5N] = { /* TCL tuner MF02GIP-5N-E */
|
||||||
.name = "TCL tuner MF02GIP-5N-E",
|
.name = "TCL tuner MF02GIP-5N-E",
|
||||||
.params = tuner_tcl_mf02gip_5n_params,
|
.params = tuner_tcl_mf02gip_5n_params,
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Driver for Xceive XC4000 "QAM/8VSB single chip tuner"
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
*
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __XC4000_H__
|
||||||
|
#define __XC4000_H__
|
||||||
|
|
||||||
|
#include <linux/firmware.h>
|
||||||
|
|
||||||
|
struct dvb_frontend;
|
||||||
|
struct i2c_adapter;
|
||||||
|
|
||||||
|
struct xc4000_config {
|
||||||
|
u8 i2c_address;
|
||||||
|
u32 if_khz;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* xc4000 callback command */
|
||||||
|
#define XC4000_TUNER_RESET 0
|
||||||
|
|
||||||
|
/* For each bridge framework, when it attaches either analog or digital,
|
||||||
|
* it has to store a reference back to its _core equivalent structure,
|
||||||
|
* so that it can service the hardware by steering gpio's etc.
|
||||||
|
* Each bridge implementation is different so cast devptr accordingly.
|
||||||
|
* The xc4000 driver cares not for this value, other than ensuring
|
||||||
|
* it's passed back to a bridge during tuner_callback().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_MEDIA_TUNER_XC4000) || \
|
||||||
|
(defined(CONFIG_MEDIA_TUNER_XC4000_MODULE) && defined(MODULE))
|
||||||
|
extern struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,
|
||||||
|
struct i2c_adapter *i2c,
|
||||||
|
struct xc4000_config *cfg);
|
||||||
|
#else
|
||||||
|
static inline struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,
|
||||||
|
struct i2c_adapter *i2c,
|
||||||
|
struct xc4000_config *cfg)
|
||||||
|
{
|
||||||
|
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -17,6 +17,7 @@
|
||||||
#include "mt2266.h"
|
#include "mt2266.h"
|
||||||
#include "tuner-xc2028.h"
|
#include "tuner-xc2028.h"
|
||||||
#include "xc5000.h"
|
#include "xc5000.h"
|
||||||
|
#include "xc4000.h"
|
||||||
#include "s5h1411.h"
|
#include "s5h1411.h"
|
||||||
#include "dib0070.h"
|
#include "dib0070.h"
|
||||||
#include "dib0090.h"
|
#include "dib0090.h"
|
||||||
|
@ -2655,6 +2656,41 @@ static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
== NULL ? -ENODEV : 0;
|
== NULL ? -ENODEV : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dib0700_xc4000_tuner_callback(void *priv, int component,
|
||||||
|
int command, int arg)
|
||||||
|
{
|
||||||
|
struct dvb_usb_adapter *adap = priv;
|
||||||
|
|
||||||
|
if (command == XC4000_TUNER_RESET) {
|
||||||
|
/* Reset the tuner */
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
|
||||||
|
msleep(10);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
|
||||||
|
msleep(10);
|
||||||
|
} else {
|
||||||
|
err("xc4000: unknown tuner callback command: %d\n", command);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct xc4000_config s5h1411_xc4000_tunerconfig = {
|
||||||
|
.i2c_address = 0x64,
|
||||||
|
.if_khz = 5380,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int xc4000_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
|
{
|
||||||
|
err("xc4000: xc4000_tuner_attach");
|
||||||
|
/* FIXME: generalize & move to common area */
|
||||||
|
adap->fe->callback = dib0700_xc4000_tuner_callback;
|
||||||
|
|
||||||
|
return dvb_attach(xc4000_attach, adap->fe, &adap->dev->i2c_adap,
|
||||||
|
&s5h1411_xc4000_tunerconfig)
|
||||||
|
== NULL ? -ENODEV : 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct lgdt3305_config hcw_lgdt3305_config = {
|
static struct lgdt3305_config hcw_lgdt3305_config = {
|
||||||
.i2c_addr = 0x0e,
|
.i2c_addr = 0x0e,
|
||||||
.mpeg_mode = LGDT3305_MPEG_PARALLEL,
|
.mpeg_mode = LGDT3305_MPEG_PARALLEL,
|
||||||
|
@ -2802,6 +2838,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
|
||||||
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE7090PVR) },
|
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_TFE7090PVR) },
|
||||||
{ USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
|
{ USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2) },
|
||||||
/* 75 */{ USB_DEVICE(USB_VID_MEDION, USB_PID_CREATIX_CTX1921) },
|
/* 75 */{ USB_DEVICE(USB_VID_MEDION, USB_PID_CREATIX_CTX1921) },
|
||||||
|
{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV340E) },
|
||||||
{ 0 } /* Terminating entry */
|
{ 0 } /* Terminating entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
||||||
|
@ -3762,6 +3799,37 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.rc.core = {
|
||||||
|
.rc_interval = DEFAULT_RC_INTERVAL,
|
||||||
|
.rc_codes = RC_MAP_DIB0700_RC5_TABLE,
|
||||||
|
.module_name = "dib0700",
|
||||||
|
.rc_query = dib0700_rc_query_old_firmware,
|
||||||
|
.allowed_protos = RC_TYPE_RC5 |
|
||||||
|
RC_TYPE_RC6 |
|
||||||
|
RC_TYPE_NEC,
|
||||||
|
.change_protocol = dib0700_change_protocol,
|
||||||
|
},
|
||||||
|
}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
|
||||||
|
.num_adapters = 1,
|
||||||
|
.adapter = {
|
||||||
|
{
|
||||||
|
.frontend_attach = stk7700ph_frontend_attach,
|
||||||
|
.tuner_attach = xc4000_tuner_attach,
|
||||||
|
|
||||||
|
DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
|
||||||
|
|
||||||
|
.size_of_priv = sizeof(struct
|
||||||
|
dib0700_adapter_state),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
.num_device_descs = 1,
|
||||||
|
.devices = {
|
||||||
|
{ "Pinnacle PCTV 340e HD Pro USB Stick",
|
||||||
|
{ &dib0700_usb_id_table[76], NULL },
|
||||||
|
{ NULL },
|
||||||
|
},
|
||||||
|
},
|
||||||
.rc.core = {
|
.rc.core = {
|
||||||
.rc_interval = DEFAULT_RC_INTERVAL,
|
.rc_interval = DEFAULT_RC_INTERVAL,
|
||||||
.rc_codes = RC_MAP_DIB0700_RC5_TABLE,
|
.rc_codes = RC_MAP_DIB0700_RC5_TABLE,
|
||||||
|
|
|
@ -228,6 +228,7 @@
|
||||||
#define USB_PID_PINNACLE_PCTV72E 0x0236
|
#define USB_PID_PINNACLE_PCTV72E 0x0236
|
||||||
#define USB_PID_PINNACLE_PCTV73E 0x0237
|
#define USB_PID_PINNACLE_PCTV73E 0x0237
|
||||||
#define USB_PID_PINNACLE_PCTV310E 0x3211
|
#define USB_PID_PINNACLE_PCTV310E 0x3211
|
||||||
|
#define USB_PID_PINNACLE_PCTV340E 0x023d
|
||||||
#define USB_PID_PINNACLE_PCTV801E 0x023a
|
#define USB_PID_PINNACLE_PCTV801E 0x023a
|
||||||
#define USB_PID_PINNACLE_PCTV801E_SE 0x023b
|
#define USB_PID_PINNACLE_PCTV801E_SE 0x023b
|
||||||
#define USB_PID_PINNACLE_PCTV73A 0x0243
|
#define USB_PID_PINNACLE_PCTV73A 0x0243
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "tda9887.h"
|
#include "tda9887.h"
|
||||||
#include "xc5000.h"
|
#include "xc5000.h"
|
||||||
#include "tda18271.h"
|
#include "tda18271.h"
|
||||||
|
#include "xc4000.h"
|
||||||
|
|
||||||
#define UNSET (-1U)
|
#define UNSET (-1U)
|
||||||
|
|
||||||
|
@ -391,6 +392,19 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
||||||
tune_now = 0;
|
tune_now = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TUNER_XC4000:
|
||||||
|
{
|
||||||
|
struct xc4000_config xc4000_cfg = {
|
||||||
|
.i2c_address = t->i2c->addr,
|
||||||
|
/* if_khz will be set when the digital dvb_attach() occurs */
|
||||||
|
.if_khz = 0,
|
||||||
|
};
|
||||||
|
if (!dvb_attach(xc4000_attach,
|
||||||
|
&t->fe, t->i2c->adapter, &xc4000_cfg))
|
||||||
|
goto attach_failed;
|
||||||
|
tune_now = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (!dvb_attach(simple_tuner_attach, &t->fe,
|
if (!dvb_attach(simple_tuner_attach, &t->fe,
|
||||||
t->i2c->adapter, t->i2c->addr, t->type))
|
t->i2c->adapter, t->i2c->addr, t->type))
|
||||||
|
|
|
@ -127,6 +127,8 @@
|
||||||
#define TUNER_PHILIPS_FMD1216MEX_MK3 78
|
#define TUNER_PHILIPS_FMD1216MEX_MK3 78
|
||||||
#define TUNER_PHILIPS_FM1216MK5 79
|
#define TUNER_PHILIPS_FM1216MK5 79
|
||||||
#define TUNER_PHILIPS_FQ1216LME_MK3 80 /* Active loopthrough, no FM */
|
#define TUNER_PHILIPS_FQ1216LME_MK3 80 /* Active loopthrough, no FM */
|
||||||
|
#define TUNER_XC4000 81 /* Xceive Silicon Tuner */
|
||||||
|
|
||||||
#define TUNER_PARTSNIC_PTI_5NF05 81
|
#define TUNER_PARTSNIC_PTI_5NF05 81
|
||||||
#define TUNER_PHILIPS_CU1216L 82
|
#define TUNER_PHILIPS_CU1216L 82
|
||||||
#define TUNER_NXP_TDA18271 83
|
#define TUNER_NXP_TDA18271 83
|
||||||
|
|
Загрузка…
Ссылка в новой задаче