You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (583 commits) V4L/DVB (10130): use USB API functions rather than constants V4L/DVB (10129): dvb: remove deprecated use of RW_LOCK_UNLOCKED in frontends V4L/DVB (10128): modify V4L documentation to be a valid XHTML V4L/DVB (10127): stv06xx: Avoid having y unitialized V4L/DVB (10125): em28xx: Don't do AC97 vendor detection for i2s audio devices V4L/DVB (10124): em28xx: expand output formats available V4L/DVB (10123): em28xx: fix reversed definitions of I2S audio modes V4L/DVB (10122): em28xx: don't load em28xx-alsa for em2870 based devices V4L/DVB (10121): em28xx: remove worthless Pinnacle PCTV HD Mini 80e device profile V4L/DVB (10120): em28xx: remove redundant Pinnacle Dazzle DVC 100 profile V4L/DVB (10119): em28xx: fix corrupted XCLK value V4L/DVB (10118): zoran: fix warning for a variable not used V4L/DVB (10116): af9013: Fix gcc false warnings V4L/DVB (10111a): usbvideo.h: remove an useless blank line V4L/DVB (10111): quickcam_messenger.c: fix a warning V4L/DVB (10110): v4l2-ioctl: Fix warnings when using .unlocked_ioctl = __video_ioctl2 V4L/DVB (10109): anysee: Fix usage of an unitialized function V4L/DVB (10104): uvcvideo: Add support for video output devices V4L/DVB (10102): uvcvideo: Ignore interrupt endpoint for built-in iSight webcams. V4L/DVB (10101): uvcvideo: Fix bulk URB processing when the header is erroneous ...
This commit is contained in:
@@ -2391,6 +2391,67 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
|
||||
|
||||
/* Kworld Plus TV Analog Lite PCI IR
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
*/
|
||||
IR_KEYTAB_TYPE ir_codes_kworld_plus_tv_analog[IR_KEYTAB_SIZE] = {
|
||||
[0x0c] = KEY_PROG1, /* Kworld key */
|
||||
[0x16] = KEY_CLOSECD, /* -> ) */
|
||||
[0x1d] = KEY_POWER2,
|
||||
|
||||
[0x00] = KEY_1,
|
||||
[0x01] = KEY_2,
|
||||
[0x02] = KEY_3, /* Two keys have the same code: 3 and left */
|
||||
[0x03] = KEY_4, /* Two keys have the same code: 3 and right */
|
||||
[0x04] = KEY_5,
|
||||
[0x05] = KEY_6,
|
||||
[0x06] = KEY_7,
|
||||
[0x07] = KEY_8,
|
||||
[0x08] = KEY_9,
|
||||
[0x0a] = KEY_0,
|
||||
|
||||
[0x09] = KEY_AGAIN,
|
||||
[0x14] = KEY_MUTE,
|
||||
|
||||
[0x20] = KEY_UP,
|
||||
[0x21] = KEY_DOWN,
|
||||
[0x0b] = KEY_ENTER,
|
||||
|
||||
[0x10] = KEY_CHANNELUP,
|
||||
[0x11] = KEY_CHANNELDOWN,
|
||||
|
||||
/* Couldn't map key left/key right since those
|
||||
conflict with '3' and '4' scancodes
|
||||
I dunno what the original driver does
|
||||
*/
|
||||
|
||||
[0x13] = KEY_VOLUMEUP,
|
||||
[0x12] = KEY_VOLUMEDOWN,
|
||||
|
||||
/* The lower part of the IR
|
||||
There are several duplicated keycodes there.
|
||||
Most of them conflict with digits.
|
||||
Add mappings just to the unused scancodes.
|
||||
Somehow, the original driver has a way to know,
|
||||
but this doesn't seem to be on some GPIO.
|
||||
Also, it is not related to the time between keyup
|
||||
and keydown.
|
||||
*/
|
||||
[0x19] = KEY_PAUSE, /* Timeshift */
|
||||
[0x1a] = KEY_STOP,
|
||||
[0x1b] = KEY_RECORD,
|
||||
|
||||
[0x22] = KEY_TEXT,
|
||||
|
||||
[0x15] = KEY_AUDIO, /* ((*)) */
|
||||
[0x0f] = KEY_ZOOM,
|
||||
[0x1c] = KEY_SHUFFLE, /* snapshot */
|
||||
|
||||
[0x18] = KEY_RED, /* B */
|
||||
[0x23] = KEY_GREEN, /* C */
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog);
|
||||
|
||||
IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = {
|
||||
[0x20] = KEY_LIST,
|
||||
[0x00] = KEY_POWER,
|
||||
@@ -2511,3 +2572,35 @@ IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE] = {
|
||||
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys);
|
||||
|
||||
/* ATI TV Wonder HD 600 USB
|
||||
Devin Heitmueller <devin.heitmueller@gmail.com>
|
||||
*/
|
||||
IR_KEYTAB_TYPE ir_codes_ati_tv_wonder_hd_600[IR_KEYTAB_SIZE] = {
|
||||
[0x00] = KEY_RECORD, /* Row 1 */
|
||||
[0x01] = KEY_PLAYPAUSE,
|
||||
[0x02] = KEY_STOP,
|
||||
[0x03] = KEY_POWER,
|
||||
[0x04] = KEY_PREVIOUS, /* Row 2 */
|
||||
[0x05] = KEY_REWIND,
|
||||
[0x06] = KEY_FORWARD,
|
||||
[0x07] = KEY_NEXT,
|
||||
[0x08] = KEY_EPG, /* Row 3 */
|
||||
[0x09] = KEY_HOME,
|
||||
[0x0a] = KEY_MENU,
|
||||
[0x0b] = KEY_CHANNELUP,
|
||||
[0x0c] = KEY_BACK, /* Row 4 */
|
||||
[0x0d] = KEY_UP,
|
||||
[0x0e] = KEY_INFO,
|
||||
[0x0f] = KEY_CHANNELDOWN,
|
||||
[0x10] = KEY_LEFT, /* Row 5 */
|
||||
[0x11] = KEY_SELECT,
|
||||
[0x12] = KEY_RIGHT,
|
||||
[0x13] = KEY_VOLUMEUP,
|
||||
[0x14] = KEY_LAST, /* Row 6 */
|
||||
[0x15] = KEY_DOWN,
|
||||
[0x16] = KEY_MUTE,
|
||||
[0x17] = KEY_VOLUMEDOWN,
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600);
|
||||
|
||||
@@ -313,7 +313,7 @@ static int fops_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
/*
|
||||
DEB_EE(("inode:%p, file:%p, cmd:%d, arg:%li\n",inode, file, cmd, arg));
|
||||
*/
|
||||
return video_usercopy(inode, file, cmd, arg, saa7146_video_do_ioctl);
|
||||
return video_usercopy(file, cmd, arg, saa7146_video_do_ioctl);
|
||||
}
|
||||
|
||||
static int fops_mmap(struct file *file, struct vm_area_struct * vma)
|
||||
|
||||
@@ -834,7 +834,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
|
||||
* copying is done already, arg is a kernel pointer.
|
||||
*/
|
||||
|
||||
static int __saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
int saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct saa7146_fh *fh = file->private_data;
|
||||
struct saa7146_dev *dev = fh->dev;
|
||||
@@ -1216,17 +1216,11 @@ static int __saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *a
|
||||
#endif
|
||||
default:
|
||||
return v4l_compat_translate_ioctl(file, cmd, arg,
|
||||
__saa7146_video_do_ioctl);
|
||||
saa7146_video_do_ioctl);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int saa7146_video_do_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, void *arg)
|
||||
{
|
||||
return __saa7146_video_do_ioctl(file, cmd, arg);
|
||||
}
|
||||
|
||||
/*********************************************************************************/
|
||||
/* buffer handling functions */
|
||||
|
||||
|
||||
@@ -3598,7 +3598,7 @@ static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum,
|
||||
76, 77, 91, 134, 135, 137, 147,
|
||||
156, 166, 167, 168, 25 };
|
||||
|
||||
*count = sizeof(RegAddr) / sizeof(u8);
|
||||
*count = ARRAY_SIZE(RegAddr);
|
||||
|
||||
status += MXL_BlockInit(fe);
|
||||
|
||||
@@ -3630,7 +3630,7 @@ static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal,
|
||||
*/
|
||||
#endif
|
||||
|
||||
*count = sizeof(RegAddr) / sizeof(u8);
|
||||
*count = ARRAY_SIZE(RegAddr);
|
||||
|
||||
for (i = 0 ; i < *count; i++) {
|
||||
RegNum[i] = RegAddr[i];
|
||||
@@ -3648,7 +3648,7 @@ static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum,
|
||||
|
||||
u8 RegAddr[] = {43, 136};
|
||||
|
||||
*count = sizeof(RegAddr) / sizeof(u8);
|
||||
*count = ARRAY_SIZE(RegAddr);
|
||||
|
||||
for (i = 0; i < *count; i++) {
|
||||
RegNum[i] = RegAddr[i];
|
||||
|
||||
@@ -80,10 +80,11 @@ static void tda827x_set_std(struct dvb_frontend *fe,
|
||||
mode = "xx";
|
||||
}
|
||||
|
||||
if (params->mode == V4L2_TUNER_RADIO)
|
||||
if (params->mode == V4L2_TUNER_RADIO) {
|
||||
priv->sgIF = 88; /* if frequency is 5.5 MHz */
|
||||
|
||||
dprintk("setting tda827x to system %s\n", mode);
|
||||
dprintk("setting tda827x to radio FM\n");
|
||||
} else
|
||||
dprintk("setting tda827x to system %s\n", mode);
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +200,7 @@ static int tda827xo_set_params(struct dvb_frontend *fe,
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
i2c_transfer(priv->i2c_adap, &msg, 1);
|
||||
|
||||
priv->frequency = tuner_freq - if_freq; // FIXME
|
||||
priv->frequency = params->frequency;
|
||||
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
||||
|
||||
return 0;
|
||||
@@ -304,7 +305,7 @@ static int tda827xo_set_analog_params(struct dvb_frontend *fe,
|
||||
reg2[1] = 0x08; /* Vsync en */
|
||||
i2c_transfer(priv->i2c_adap, &msg, 1);
|
||||
|
||||
priv->frequency = freq * 62500;
|
||||
priv->frequency = params->frequency;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -591,7 +592,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
i2c_transfer(priv->i2c_adap, &msg, 1);
|
||||
|
||||
priv->frequency = tuner_freq - if_freq; // FIXME
|
||||
priv->frequency = params->frequency;
|
||||
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
||||
|
||||
return 0;
|
||||
@@ -691,7 +692,7 @@ static int tda827xa_set_analog_params(struct dvb_frontend *fe,
|
||||
tuner_reg[1] = 0x19 + (priv->lpsel << 1);
|
||||
i2c_transfer(priv->i2c_adap, &msg, 1);
|
||||
|
||||
priv->frequency = freq * 62500;
|
||||
priv->frequency = params->frequency;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,9 @@ static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "enable verbose debug messages");
|
||||
|
||||
static int deemphasis_50;
|
||||
MODULE_PARM_DESC(deemphasis_50, "0 - 75us deemphasis; 1 - 50us deemphasis");
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
struct tda8290_priv {
|
||||
@@ -139,9 +142,34 @@ static void set_audio(struct dvb_frontend *fe,
|
||||
mode = "xx";
|
||||
}
|
||||
|
||||
tuner_dbg("setting tda829x to system %s\n", mode);
|
||||
if (params->mode == V4L2_TUNER_RADIO) {
|
||||
priv->tda8290_easy_mode = 0x01; /* Start with MN values */
|
||||
tuner_dbg("setting to radio FM\n");
|
||||
} else {
|
||||
tuner_dbg("setting tda829x to system %s\n", mode);
|
||||
}
|
||||
}
|
||||
|
||||
struct {
|
||||
unsigned char seq[2];
|
||||
} fm_mode[] = {
|
||||
{ { 0x01, 0x81} }, /* Put device into expert mode */
|
||||
{ { 0x03, 0x48} }, /* Disable NOTCH and VIDEO filters */
|
||||
{ { 0x04, 0x04} }, /* Disable color carrier filter (SSIF) */
|
||||
{ { 0x05, 0x04} }, /* ADC headroom */
|
||||
{ { 0x06, 0x10} }, /* group delay flat */
|
||||
|
||||
{ { 0x07, 0x00} }, /* use the same radio DTO values as a tda8295 */
|
||||
{ { 0x08, 0x00} },
|
||||
{ { 0x09, 0x80} },
|
||||
{ { 0x0a, 0xda} },
|
||||
{ { 0x0b, 0x4b} },
|
||||
{ { 0x0c, 0x68} },
|
||||
|
||||
{ { 0x0d, 0x00} }, /* PLL off, no video carrier detect */
|
||||
{ { 0x14, 0x00} }, /* disable auto mute if no video */
|
||||
};
|
||||
|
||||
static void tda8290_set_params(struct dvb_frontend *fe,
|
||||
struct analog_parameters *params)
|
||||
{
|
||||
@@ -178,15 +206,30 @@ static void tda8290_set_params(struct dvb_frontend *fe,
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, soft_reset, 2);
|
||||
msleep(1);
|
||||
|
||||
expert_mode[1] = priv->tda8290_easy_mode + 0x80;
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, expert_mode, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, gainset_off, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, if_agc_spd, 2);
|
||||
if (priv->tda8290_easy_mode & 0x60)
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, adc_head_9, 2);
|
||||
else
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, adc_head_6, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_nom, 2);
|
||||
if (params->mode == V4L2_TUNER_RADIO) {
|
||||
int i;
|
||||
unsigned char deemphasis[] = { 0x13, 1 };
|
||||
|
||||
/* FIXME: allow using a different deemphasis */
|
||||
|
||||
if (deemphasis_50)
|
||||
deemphasis[1] = 2;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(fm_mode); i++)
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, fm_mode[i].seq, 2);
|
||||
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, deemphasis, 2);
|
||||
} else {
|
||||
expert_mode[1] = priv->tda8290_easy_mode + 0x80;
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, expert_mode, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, gainset_off, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, if_agc_spd, 2);
|
||||
if (priv->tda8290_easy_mode & 0x60)
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, adc_head_9, 2);
|
||||
else
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, adc_head_6, 2);
|
||||
tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_nom, 2);
|
||||
}
|
||||
|
||||
tda8290_i2c_bridge(fe, 1);
|
||||
|
||||
|
||||
@@ -180,11 +180,10 @@ static struct tvnorm tvnorms[] = {
|
||||
},{
|
||||
.std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H,
|
||||
.name = "SECAM-BGH",
|
||||
.b = ( cPositiveAmTV |
|
||||
.b = ( cNegativeFmTV |
|
||||
cQSS ),
|
||||
.c = ( cTopDefault),
|
||||
.e = ( cGating_36 |
|
||||
cAudioIF_5_5 |
|
||||
.e = ( cAudioIF_5_5 |
|
||||
cVideoIF_38_90 ),
|
||||
},{
|
||||
.std = V4L2_STD_SECAM_L,
|
||||
|
||||
@@ -28,6 +28,12 @@ static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "enable verbose debug messages");
|
||||
|
||||
static int no_poweroff;
|
||||
module_param(no_poweroff, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "0 (default) powers device off when not used.\n"
|
||||
"1 keep device energized and with tuner ready all the times.\n"
|
||||
" Faster, but consumes more power and keeps the device hotter\n");
|
||||
|
||||
static char audio_std[8];
|
||||
module_param_string(audio_std, audio_std, sizeof(audio_std), 0);
|
||||
MODULE_PARM_DESC(audio_std,
|
||||
@@ -1091,6 +1097,34 @@ static int xc2028_set_params(struct dvb_frontend *fe,
|
||||
T_DIGITAL_TV, type, 0, demod);
|
||||
}
|
||||
|
||||
static int xc2028_sleep(struct dvb_frontend *fe)
|
||||
{
|
||||
struct xc2028_data *priv = fe->tuner_priv;
|
||||
int rc = 0;
|
||||
|
||||
/* Avoid firmware reload on slow devices */
|
||||
if (no_poweroff)
|
||||
return 0;
|
||||
|
||||
tuner_dbg("Putting xc2028/3028 into poweroff mode.\n");
|
||||
if (debug > 1) {
|
||||
tuner_dbg("Printing sleep stack trace:\n");
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
|
||||
if (priv->firm_version < 0x0202)
|
||||
rc = send_seq(priv, {0x00, 0x08, 0x00, 0x00});
|
||||
else
|
||||
rc = send_seq(priv, {0x80, 0x08, 0x00, 0x00});
|
||||
|
||||
priv->cur_fw.type = 0; /* need firmware reload */
|
||||
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int xc2028_dvb_release(struct dvb_frontend *fe)
|
||||
{
|
||||
@@ -1171,6 +1205,7 @@ static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {
|
||||
.get_frequency = xc2028_get_frequency,
|
||||
.get_rf_strength = xc2028_signal,
|
||||
.set_params = xc2028_set_params,
|
||||
.sleep = xc2028_sleep,
|
||||
};
|
||||
|
||||
struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
|
||||
|
||||
@@ -36,10 +36,6 @@ static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
|
||||
|
||||
static int xc5000_load_fw_on_attach;
|
||||
module_param_named(init_fw, xc5000_load_fw_on_attach, int, 0644);
|
||||
MODULE_PARM_DESC(init_fw, "Load firmware during driver initialization.");
|
||||
|
||||
static DEFINE_MUTEX(xc5000_list_mutex);
|
||||
static LIST_HEAD(hybrid_tuner_instance_list);
|
||||
|
||||
@@ -1017,9 +1013,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
|
||||
memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops,
|
||||
sizeof(struct dvb_tuner_ops));
|
||||
|
||||
if (xc5000_load_fw_on_attach)
|
||||
xc5000_init(fe);
|
||||
|
||||
return fe;
|
||||
fail:
|
||||
mutex_unlock(&xc5000_list_mutex);
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
# DVB device configuration
|
||||
#
|
||||
|
||||
config DVB_DYNAMIC_MINORS
|
||||
bool "Dynamic DVB minor allocation"
|
||||
depends on DVB_CORE
|
||||
default n
|
||||
help
|
||||
If you say Y here, the DVB subsystem will use dynamic minor
|
||||
allocation for any device that uses the DVB major number.
|
||||
This means that you can have more than 4 of a single type
|
||||
of device (like demuxes and frontends) per adapter, but udev
|
||||
will be required to manage the device nodes.
|
||||
|
||||
If you are unsure about this, say N here.
|
||||
|
||||
menuconfig DVB_CAPTURE_DRIVERS
|
||||
bool "DVB/ATSC adapters"
|
||||
depends on DVB_CORE
|
||||
|
||||
@@ -14,6 +14,7 @@ config DVB_B2C2_FLEXCOP
|
||||
select DVB_ISL6421 if !DVB_FE_CUSTOMISE
|
||||
select DVB_CX24123 if !DVB_FE_CUSTOMISE
|
||||
select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMIZE
|
||||
select DVB_TUNER_CX24113 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Support for the digital TV receiver chip made by B2C2 Inc. included in
|
||||
Technisats PCI cards and USB boxes.
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -368,7 +367,7 @@ static int __devinit dm1105dvb_dma_map(struct dm1105dvb *dm1105dvb)
|
||||
{
|
||||
dm1105dvb->ts_buf = pci_alloc_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, &dm1105dvb->dma_addr);
|
||||
|
||||
return pci_dma_mapping_error(dm1105dvb->pdev, dm1105dvb->dma_addr);
|
||||
return !dm1105dvb->ts_buf;
|
||||
}
|
||||
|
||||
static void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb)
|
||||
|
||||
@@ -128,6 +128,7 @@ struct dvb_frontend_private {
|
||||
unsigned int step_size;
|
||||
int quality;
|
||||
unsigned int check_wrapped;
|
||||
enum dvbfe_search algo_status;
|
||||
};
|
||||
|
||||
static void dvb_frontend_wakeup(struct dvb_frontend *fe);
|
||||
@@ -516,6 +517,8 @@ static int dvb_frontend_thread(void *data)
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
unsigned long timeout;
|
||||
fe_status_t s;
|
||||
enum dvbfe_algo algo;
|
||||
|
||||
struct dvb_frontend_parameters *params;
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
@@ -562,23 +565,80 @@ restart:
|
||||
|
||||
/* do an iteration of the tuning loop */
|
||||
if (fe->ops.get_frontend_algo) {
|
||||
if (fe->ops.get_frontend_algo(fe) == FE_ALGO_HW) {
|
||||
/* have we been asked to retune? */
|
||||
params = NULL;
|
||||
algo = fe->ops.get_frontend_algo(fe);
|
||||
switch (algo) {
|
||||
case DVBFE_ALGO_HW:
|
||||
dprintk("%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
|
||||
params = NULL; /* have we been asked to RETUNE ? */
|
||||
|
||||
if (fepriv->state & FESTATE_RETUNE) {
|
||||
dprintk("%s: Retune requested, FESTATE_RETUNE\n", __func__);
|
||||
params = &fepriv->parameters;
|
||||
fepriv->state = FESTATE_TUNED;
|
||||
}
|
||||
|
||||
fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
|
||||
if (s != fepriv->status) {
|
||||
if (fe->ops.tune)
|
||||
fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
|
||||
|
||||
if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
|
||||
dprintk("%s: state changed, adding current state\n", __func__);
|
||||
dvb_frontend_add_event(fe, s);
|
||||
fepriv->status = s;
|
||||
}
|
||||
} else
|
||||
break;
|
||||
case DVBFE_ALGO_SW:
|
||||
dprintk("%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
|
||||
dvb_frontend_swzigzag(fe);
|
||||
} else
|
||||
break;
|
||||
case DVBFE_ALGO_CUSTOM:
|
||||
params = NULL; /* have we been asked to RETUNE ? */
|
||||
dprintk("%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
|
||||
if (fepriv->state & FESTATE_RETUNE) {
|
||||
dprintk("%s: Retune requested, FESTAT_RETUNE\n", __func__);
|
||||
params = &fepriv->parameters;
|
||||
fepriv->state = FESTATE_TUNED;
|
||||
}
|
||||
/* Case where we are going to search for a carrier
|
||||
* User asked us to retune again for some reason, possibly
|
||||
* requesting a search with a new set of parameters
|
||||
*/
|
||||
if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
|
||||
if (fe->ops.search) {
|
||||
fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters);
|
||||
/* We did do a search as was requested, the flags are
|
||||
* now unset as well and has the flags wrt to search.
|
||||
*/
|
||||
} else {
|
||||
fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
|
||||
}
|
||||
}
|
||||
/* Track the carrier if the search was successful */
|
||||
if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) {
|
||||
if (fe->ops.track)
|
||||
fe->ops.track(fe, &fepriv->parameters);
|
||||
} else {
|
||||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
fepriv->delay = HZ / 2;
|
||||
}
|
||||
fe->ops.read_status(fe, &s);
|
||||
if (s != fepriv->status) {
|
||||
dvb_frontend_add_event(fe, s); /* update event list */
|
||||
fepriv->status = s;
|
||||
if (!(s & FE_HAS_LOCK)) {
|
||||
fepriv->delay = HZ / 10;
|
||||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
} else {
|
||||
fepriv->delay = 60 * HZ;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
dprintk("%s: UNDEFINED ALGO !\n", __func__);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
dvb_frontend_swzigzag(fe);
|
||||
}
|
||||
}
|
||||
|
||||
if (dvb_powerdown_on_sleep) {
|
||||
@@ -1226,6 +1286,9 @@ int dtv_property_process_set(struct dvb_frontend *fe, struct dtv_property *tvp,
|
||||
dprintk("%s() Finalised property cache\n", __func__);
|
||||
dtv_property_cache_submit(fe);
|
||||
|
||||
/* Request the search algorithm to search */
|
||||
fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
||||
|
||||
r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
|
||||
&fepriv->parameters);
|
||||
break;
|
||||
|
||||
@@ -69,6 +69,125 @@ struct analog_parameters {
|
||||
u64 std;
|
||||
};
|
||||
|
||||
enum dvbfe_modcod {
|
||||
DVBFE_MODCOD_DUMMY_PLFRAME = 0,
|
||||
DVBFE_MODCOD_QPSK_1_4,
|
||||
DVBFE_MODCOD_QPSK_1_3,
|
||||
DVBFE_MODCOD_QPSK_2_5,
|
||||
DVBFE_MODCOD_QPSK_1_2,
|
||||
DVBFE_MODCOD_QPSK_3_5,
|
||||
DVBFE_MODCOD_QPSK_2_3,
|
||||
DVBFE_MODCOD_QPSK_3_4,
|
||||
DVBFE_MODCOD_QPSK_4_5,
|
||||
DVBFE_MODCOD_QPSK_5_6,
|
||||
DVBFE_MODCOD_QPSK_8_9,
|
||||
DVBFE_MODCOD_QPSK_9_10,
|
||||
DVBFE_MODCOD_8PSK_3_5,
|
||||
DVBFE_MODCOD_8PSK_2_3,
|
||||
DVBFE_MODCOD_8PSK_3_4,
|
||||
DVBFE_MODCOD_8PSK_5_6,
|
||||
DVBFE_MODCOD_8PSK_8_9,
|
||||
DVBFE_MODCOD_8PSK_9_10,
|
||||
DVBFE_MODCOD_16APSK_2_3,
|
||||
DVBFE_MODCOD_16APSK_3_4,
|
||||
DVBFE_MODCOD_16APSK_4_5,
|
||||
DVBFE_MODCOD_16APSK_5_6,
|
||||
DVBFE_MODCOD_16APSK_8_9,
|
||||
DVBFE_MODCOD_16APSK_9_10,
|
||||
DVBFE_MODCOD_32APSK_3_4,
|
||||
DVBFE_MODCOD_32APSK_4_5,
|
||||
DVBFE_MODCOD_32APSK_5_6,
|
||||
DVBFE_MODCOD_32APSK_8_9,
|
||||
DVBFE_MODCOD_32APSK_9_10,
|
||||
DVBFE_MODCOD_RESERVED_1,
|
||||
DVBFE_MODCOD_BPSK_1_3,
|
||||
DVBFE_MODCOD_BPSK_1_4,
|
||||
DVBFE_MODCOD_RESERVED_2
|
||||
};
|
||||
|
||||
enum tuner_param {
|
||||
DVBFE_TUNER_FREQUENCY = (1 << 0),
|
||||
DVBFE_TUNER_TUNERSTEP = (1 << 1),
|
||||
DVBFE_TUNER_IFFREQ = (1 << 2),
|
||||
DVBFE_TUNER_BANDWIDTH = (1 << 3),
|
||||
DVBFE_TUNER_REFCLOCK = (1 << 4),
|
||||
DVBFE_TUNER_IQSENSE = (1 << 5),
|
||||
DVBFE_TUNER_DUMMY = (1 << 31)
|
||||
};
|
||||
|
||||
/*
|
||||
* ALGO_HW: (Hardware Algorithm)
|
||||
* ----------------------------------------------------------------
|
||||
* Devices that support this algorithm do everything in hardware
|
||||
* and no software support is needed to handle them.
|
||||
* Requesting these devices to LOCK is the only thing required,
|
||||
* device is supposed to do everything in the hardware.
|
||||
*
|
||||
* ALGO_SW: (Software Algorithm)
|
||||
* ----------------------------------------------------------------
|
||||
* These are dumb devices, that require software to do everything
|
||||
*
|
||||
* ALGO_CUSTOM: (Customizable Agorithm)
|
||||
* ----------------------------------------------------------------
|
||||
* Devices having this algorithm can be customized to have specific
|
||||
* algorithms in the frontend driver, rather than simply doing a
|
||||
* software zig-zag. In this case the zigzag maybe hardware assisted
|
||||
* or it maybe completely done in hardware. In all cases, usage of
|
||||
* this algorithm, in conjunction with the search and track
|
||||
* callbacks, utilizes the driver specific algorithm.
|
||||
*
|
||||
* ALGO_RECOVERY: (Recovery Algorithm)
|
||||
* ----------------------------------------------------------------
|
||||
* These devices have AUTO recovery capabilities from LOCK failure
|
||||
*/
|
||||
enum dvbfe_algo {
|
||||
DVBFE_ALGO_HW = (1 << 0),
|
||||
DVBFE_ALGO_SW = (1 << 1),
|
||||
DVBFE_ALGO_CUSTOM = (1 << 2),
|
||||
DVBFE_ALGO_RECOVERY = (1 << 31)
|
||||
};
|
||||
|
||||
struct tuner_state {
|
||||
u32 frequency;
|
||||
u32 tunerstep;
|
||||
u32 ifreq;
|
||||
u32 bandwidth;
|
||||
u32 iqsense;
|
||||
u32 refclock;
|
||||
};
|
||||
|
||||
/*
|
||||
* search callback possible return status
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_SUCCESS
|
||||
* The frontend search algorithm completed and returned succesfully
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_ASLEEP
|
||||
* The frontend search algorithm is sleeping
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_FAILED
|
||||
* The frontend search for a signal failed
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_INVALID
|
||||
* The frontend search algorith was probably supplied with invalid
|
||||
* parameters and the search is an invalid one
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_ERROR
|
||||
* The frontend search algorithm failed due to some error
|
||||
*
|
||||
* DVBFE_ALGO_SEARCH_AGAIN
|
||||
* The frontend search algorithm was requested to search again
|
||||
*/
|
||||
enum dvbfe_search {
|
||||
DVBFE_ALGO_SEARCH_SUCCESS = (1 << 0),
|
||||
DVBFE_ALGO_SEARCH_ASLEEP = (1 << 1),
|
||||
DVBFE_ALGO_SEARCH_FAILED = (1 << 2),
|
||||
DVBFE_ALGO_SEARCH_INVALID = (1 << 3),
|
||||
DVBFE_ALGO_SEARCH_AGAIN = (1 << 4),
|
||||
DVBFE_ALGO_SEARCH_ERROR = (1 << 31),
|
||||
};
|
||||
|
||||
|
||||
struct dvb_tuner_ops {
|
||||
|
||||
struct dvb_tuner_info info;
|
||||
@@ -99,6 +218,13 @@ struct dvb_tuner_ops {
|
||||
* tuners which require sophisticated tuning loops, controlling each parameter seperately. */
|
||||
int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
|
||||
int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
|
||||
|
||||
/*
|
||||
* These are provided seperately from set_params in order to facilitate silicon
|
||||
* tuners which require sophisticated tuning loops, controlling each parameter seperately.
|
||||
*/
|
||||
int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
|
||||
int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
|
||||
};
|
||||
|
||||
struct analog_demod_info {
|
||||
@@ -142,7 +268,7 @@ struct dvb_frontend_ops {
|
||||
unsigned int *delay,
|
||||
fe_status_t *status);
|
||||
/* get frontend tuning algorithm from the module */
|
||||
int (*get_frontend_algo)(struct dvb_frontend *fe);
|
||||
enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
|
||||
|
||||
/* these two are only used for the swzigzag code */
|
||||
int (*set_frontend)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
|
||||
@@ -167,6 +293,12 @@ struct dvb_frontend_ops {
|
||||
int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
|
||||
int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
|
||||
|
||||
/* These callbacks are for devices that implement their own
|
||||
* tuning algorithms, rather than a simple swzigzag
|
||||
*/
|
||||
enum dvbfe_search (*search)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
|
||||
int (*track)(struct dvb_frontend *fe, struct dvb_frontend_parameters *p);
|
||||
|
||||
struct dvb_tuner_ops tuner_ops;
|
||||
struct analog_demod_ops analog_ops;
|
||||
|
||||
|
||||
@@ -50,33 +50,27 @@ static const char * const dnames[] = {
|
||||
"net", "osd"
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DVB_DYNAMIC_MINORS
|
||||
#define MAX_DVB_MINORS 256
|
||||
#define DVB_MAX_IDS MAX_DVB_MINORS
|
||||
#else
|
||||
#define DVB_MAX_IDS 4
|
||||
#define nums2minor(num,type,id) ((num << 6) | (id << 4) | type)
|
||||
#define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64)
|
||||
#endif
|
||||
|
||||
static struct class *dvb_class;
|
||||
|
||||
static struct dvb_device* dvbdev_find_device (int minor)
|
||||
{
|
||||
struct dvb_adapter *adap;
|
||||
|
||||
list_for_each_entry(adap, &dvb_adapter_list, list_head) {
|
||||
struct dvb_device *dev;
|
||||
list_for_each_entry(dev, &adap->device_list, list_head)
|
||||
if (nums2minor(adap->num, dev->type, dev->id) == minor)
|
||||
return dev;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct dvb_device *dvb_minors[MAX_DVB_MINORS];
|
||||
static DECLARE_RWSEM(minor_rwsem);
|
||||
|
||||
static int dvb_device_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct dvb_device *dvbdev;
|
||||
|
||||
lock_kernel();
|
||||
dvbdev = dvbdev_find_device (iminor(inode));
|
||||
down_read(&minor_rwsem);
|
||||
dvbdev = dvb_minors[iminor(inode)];
|
||||
|
||||
if (dvbdev && dvbdev->fops) {
|
||||
int err = 0;
|
||||
@@ -92,9 +86,11 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
||||
file->f_op = fops_get(old_fops);
|
||||
}
|
||||
fops_put(old_fops);
|
||||
up_read(&minor_rwsem);
|
||||
unlock_kernel();
|
||||
return err;
|
||||
}
|
||||
up_read(&minor_rwsem);
|
||||
unlock_kernel();
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -192,6 +188,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
struct dvb_device *dvbdev;
|
||||
struct file_operations *dvbdevfops;
|
||||
struct device *clsdev;
|
||||
int minor;
|
||||
int id;
|
||||
|
||||
mutex_lock(&dvbdev_register_lock);
|
||||
@@ -231,11 +228,31 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
|
||||
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
||||
|
||||
down_write(&minor_rwsem);
|
||||
#ifdef CONFIG_DVB_DYNAMIC_MINORS
|
||||
for (minor = 0; minor < MAX_DVB_MINORS; minor++)
|
||||
if (dvb_minors[minor] == NULL)
|
||||
break;
|
||||
|
||||
if (minor == MAX_DVB_MINORS) {
|
||||
kfree(dvbdevfops);
|
||||
kfree(dvbdev);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
#else
|
||||
minor = nums2minor(adap->num, type, id);
|
||||
#endif
|
||||
|
||||
dvbdev->minor = minor;
|
||||
dvb_minors[minor] = dvbdev;
|
||||
up_write(&minor_rwsem);
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
clsdev = device_create(dvb_class, adap->device,
|
||||
MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
|
||||
NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
|
||||
MKDEV(DVB_MAJOR, minor),
|
||||
dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
|
||||
if (IS_ERR(clsdev)) {
|
||||
printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
|
||||
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
|
||||
@@ -243,8 +260,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
}
|
||||
|
||||
dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
|
||||
adap->num, dnames[type], id, nums2minor(adap->num, type, id),
|
||||
nums2minor(adap->num, type, id));
|
||||
adap->num, dnames[type], id, minor, minor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -256,8 +272,11 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
|
||||
if (!dvbdev)
|
||||
return;
|
||||
|
||||
device_destroy(dvb_class, MKDEV(DVB_MAJOR, nums2minor(dvbdev->adapter->num,
|
||||
dvbdev->type, dvbdev->id)));
|
||||
down_write(&minor_rwsem);
|
||||
dvb_minors[dvbdev->minor] = NULL;
|
||||
up_write(&minor_rwsem);
|
||||
|
||||
device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
|
||||
|
||||
list_del (&dvbdev->list_head);
|
||||
kfree (dvbdev->fops);
|
||||
@@ -413,6 +432,15 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int dvb_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
struct dvb_device *dvbdev = dev_get_drvdata(dev);
|
||||
|
||||
add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id);
|
||||
add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init init_dvbdev(void)
|
||||
{
|
||||
int retval;
|
||||
@@ -434,6 +462,7 @@ static int __init init_dvbdev(void)
|
||||
retval = PTR_ERR(dvb_class);
|
||||
goto error;
|
||||
}
|
||||
dvb_class->dev_uevent = dvb_uevent;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
|
||||
@@ -74,6 +74,7 @@ struct dvb_device {
|
||||
struct file_operations *fops;
|
||||
struct dvb_adapter *adapter;
|
||||
int type;
|
||||
int minor;
|
||||
u32 id;
|
||||
|
||||
/* in theory, 'users' can vanish now,
|
||||
|
||||
@@ -733,9 +733,19 @@ static int af9015_read_config(struct usb_device *udev)
|
||||
af9015_config.ir_table_size =
|
||||
ARRAY_SIZE(af9015_ir_table_mygictv);
|
||||
break;
|
||||
case AF9015_REMOTE_DIGITTRADE_DVB_T:
|
||||
af9015_properties[i].rc_key_map =
|
||||
af9015_rc_keys_digittrade;
|
||||
af9015_properties[i].rc_key_map_size =
|
||||
ARRAY_SIZE(af9015_rc_keys_digittrade);
|
||||
af9015_config.ir_table =
|
||||
af9015_ir_table_digittrade;
|
||||
af9015_config.ir_table_size =
|
||||
ARRAY_SIZE(af9015_ir_table_digittrade);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (udev->descriptor.idVendor) {
|
||||
switch (le16_to_cpu(udev->descriptor.idVendor)) {
|
||||
case USB_VID_LEADTEK:
|
||||
af9015_properties[i].rc_key_map =
|
||||
af9015_rc_keys_leadtek;
|
||||
@@ -748,7 +758,7 @@ static int af9015_read_config(struct usb_device *udev)
|
||||
break;
|
||||
case USB_VID_VISIONPLUS:
|
||||
if (udev->descriptor.idProduct ==
|
||||
USB_PID_AZUREWAVE_AD_TU700) {
|
||||
cpu_to_le16(USB_PID_AZUREWAVE_AD_TU700)) {
|
||||
af9015_properties[i].rc_key_map =
|
||||
af9015_rc_keys_twinhan;
|
||||
af9015_properties[i].rc_key_map_size =
|
||||
@@ -800,6 +810,16 @@ static int af9015_read_config(struct usb_device *udev)
|
||||
ARRAY_SIZE(af9015_ir_table_msi);
|
||||
}
|
||||
break;
|
||||
case USB_VID_AVERMEDIA:
|
||||
af9015_properties[i].rc_key_map =
|
||||
af9015_rc_keys_avermedia;
|
||||
af9015_properties[i].rc_key_map_size =
|
||||
ARRAY_SIZE(af9015_rc_keys_avermedia);
|
||||
af9015_config.ir_table =
|
||||
af9015_ir_table_avermedia;
|
||||
af9015_config.ir_table_size =
|
||||
ARRAY_SIZE(af9015_ir_table_avermedia);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1191,6 +1211,7 @@ static struct usb_device_id af9015_usb_table[] = {
|
||||
{USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
|
||||
{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
|
||||
/* 15 */{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
|
||||
{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
|
||||
{0},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, af9015_usb_table);
|
||||
@@ -1343,7 +1364,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
|
||||
|
||||
.i2c_algo = &af9015_i2c_algo,
|
||||
|
||||
.num_device_descs = 6,
|
||||
.num_device_descs = 7,
|
||||
.devices = {
|
||||
{
|
||||
.name = "Xtensions XD-380",
|
||||
@@ -1375,6 +1396,12 @@ static struct dvb_usb_device_properties af9015_properties[] = {
|
||||
.cold_ids = {&af9015_usb_table[15], NULL},
|
||||
.warm_ids = {NULL},
|
||||
},
|
||||
{
|
||||
.name = "KWorld USB DVB-T TV Stick II " \
|
||||
"(VS-DVB-T 395U)",
|
||||
.cold_ids = {&af9015_usb_table[16], NULL},
|
||||
.warm_ids = {NULL},
|
||||
},
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -123,6 +123,7 @@ enum af9015_remote {
|
||||
AF9015_REMOTE_A_LINK_DTU_M,
|
||||
AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
|
||||
AF9015_REMOTE_MYGICTV_U718,
|
||||
AF9015_REMOTE_DIGITTRADE_DVB_T,
|
||||
};
|
||||
|
||||
/* Leadtek WinFast DTV Dongle Gold */
|
||||
@@ -520,4 +521,143 @@ static u8 af9015_ir_table_kworld[] = {
|
||||
0x86, 0x6b, 0x23, 0xdc, 0x45, 0x07, 0x00,
|
||||
};
|
||||
|
||||
/* AverMedia Volar X */
|
||||
static struct dvb_usb_rc_key af9015_rc_keys_avermedia[] = {
|
||||
{ 0x05, 0x3d, KEY_PROG1 }, /* SOURCE */
|
||||
{ 0x05, 0x12, KEY_POWER }, /* POWER */
|
||||
{ 0x05, 0x1e, KEY_1 }, /* 1 */
|
||||
{ 0x05, 0x1f, KEY_2 }, /* 2 */
|
||||
{ 0x05, 0x20, KEY_3 }, /* 3 */
|
||||
{ 0x05, 0x21, KEY_4 }, /* 4 */
|
||||
{ 0x05, 0x22, KEY_5 }, /* 5 */
|
||||
{ 0x05, 0x23, KEY_6 }, /* 6 */
|
||||
{ 0x05, 0x24, KEY_7 }, /* 7 */
|
||||
{ 0x05, 0x25, KEY_8 }, /* 8 */
|
||||
{ 0x05, 0x26, KEY_9 }, /* 9 */
|
||||
{ 0x05, 0x3f, KEY_LEFT }, /* L / DISPLAY */
|
||||
{ 0x05, 0x27, KEY_0 }, /* 0 */
|
||||
{ 0x05, 0x0f, KEY_RIGHT }, /* R / CH RTN */
|
||||
{ 0x05, 0x18, KEY_PROG2 }, /* SNAP SHOT */
|
||||
{ 0x05, 0x1c, KEY_PROG3 }, /* 16-CH PREV */
|
||||
{ 0x05, 0x2d, KEY_VOLUMEDOWN }, /* VOL DOWN */
|
||||
{ 0x05, 0x3e, KEY_ZOOM }, /* FULL SCREEN */
|
||||
{ 0x05, 0x2e, KEY_VOLUMEUP }, /* VOL UP */
|
||||
{ 0x05, 0x10, KEY_MUTE }, /* MUTE */
|
||||
{ 0x05, 0x04, KEY_AUDIO }, /* AUDIO */
|
||||
{ 0x05, 0x15, KEY_RECORD }, /* RECORD */
|
||||
{ 0x05, 0x11, KEY_PLAY }, /* PLAY */
|
||||
{ 0x05, 0x16, KEY_STOP }, /* STOP */
|
||||
{ 0x05, 0x0c, KEY_PLAYPAUSE }, /* TIMESHIFT / PAUSE */
|
||||
{ 0x05, 0x05, KEY_BACK }, /* << / RED */
|
||||
{ 0x05, 0x09, KEY_FORWARD }, /* >> / YELLOW */
|
||||
{ 0x05, 0x17, KEY_TEXT }, /* TELETEXT */
|
||||
{ 0x05, 0x0a, KEY_EPG }, /* EPG */
|
||||
{ 0x05, 0x13, KEY_MENU }, /* MENU */
|
||||
|
||||
{ 0x05, 0x0e, KEY_CHANNELUP }, /* CH UP */
|
||||
{ 0x05, 0x0d, KEY_CHANNELDOWN }, /* CH DOWN */
|
||||
{ 0x05, 0x19, KEY_FIRST }, /* |<< / GREEN */
|
||||
{ 0x05, 0x08, KEY_LAST }, /* >>| / BLUE */
|
||||
};
|
||||
|
||||
static u8 af9015_ir_table_avermedia[] = {
|
||||
0x02, 0xfd, 0x00, 0xff, 0x12, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x01, 0xfe, 0x3d, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x03, 0xfc, 0x17, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x04, 0xfb, 0x0a, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x05, 0xfa, 0x1e, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x06, 0xf9, 0x1f, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x07, 0xf8, 0x20, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x09, 0xf6, 0x21, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0a, 0xf5, 0x22, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0b, 0xf4, 0x23, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0d, 0xf2, 0x24, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0e, 0xf1, 0x25, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0f, 0xf0, 0x26, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x11, 0xee, 0x27, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x08, 0xf7, 0x04, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x0c, 0xf3, 0x3e, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x10, 0xef, 0x1c, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x12, 0xed, 0x3f, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x13, 0xec, 0x0f, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x14, 0xeb, 0x10, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x15, 0xea, 0x13, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x17, 0xe8, 0x18, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x18, 0xe7, 0x11, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x19, 0xe6, 0x15, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1a, 0xe5, 0x0c, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1b, 0xe4, 0x16, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1c, 0xe3, 0x09, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1d, 0xe2, 0x05, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1e, 0xe1, 0x2d, 0x05, 0x00,
|
||||
0x02, 0xfd, 0x1f, 0xe0, 0x2e, 0x05, 0x00,
|
||||
0x03, 0xfc, 0x00, 0xff, 0x08, 0x05, 0x00,
|
||||
0x03, 0xfc, 0x01, 0xfe, 0x19, 0x05, 0x00,
|
||||
0x03, 0xfc, 0x02, 0xfd, 0x0d, 0x05, 0x00,
|
||||
0x03, 0xfc, 0x03, 0xfc, 0x0e, 0x05, 0x00,
|
||||
};
|
||||
|
||||
/* Digittrade DVB-T USB Stick */
|
||||
static struct dvb_usb_rc_key af9015_rc_keys_digittrade[] = {
|
||||
{ 0x01, 0x0f, KEY_LAST }, /* RETURN */
|
||||
{ 0x05, 0x17, KEY_TEXT }, /* TELETEXT */
|
||||
{ 0x01, 0x08, KEY_EPG }, /* EPG */
|
||||
{ 0x05, 0x13, KEY_POWER }, /* POWER */
|
||||
{ 0x01, 0x09, KEY_ZOOM }, /* FULLSCREEN */
|
||||
{ 0x00, 0x40, KEY_AUDIO }, /* DUAL SOUND */
|
||||
{ 0x00, 0x2c, KEY_PRINT }, /* SNAPSHOT */
|
||||
{ 0x05, 0x16, KEY_SUBTITLE }, /* SUBTITLE */
|
||||
{ 0x00, 0x52, KEY_CHANNELUP }, /* CH Up */
|
||||
{ 0x00, 0x51, KEY_CHANNELDOWN },/* Ch Dn */
|
||||
{ 0x00, 0x57, KEY_VOLUMEUP }, /* Vol Up */
|
||||
{ 0x00, 0x56, KEY_VOLUMEDOWN }, /* Vol Dn */
|
||||
{ 0x01, 0x10, KEY_MUTE }, /* MUTE */
|
||||
{ 0x00, 0x27, KEY_0 },
|
||||
{ 0x00, 0x1e, KEY_1 },
|
||||
{ 0x00, 0x1f, KEY_2 },
|
||||
{ 0x00, 0x20, KEY_3 },
|
||||
{ 0x00, 0x21, KEY_4 },
|
||||
{ 0x00, 0x22, KEY_5 },
|
||||
{ 0x00, 0x23, KEY_6 },
|
||||
{ 0x00, 0x24, KEY_7 },
|
||||
{ 0x00, 0x25, KEY_8 },
|
||||
{ 0x00, 0x26, KEY_9 },
|
||||
{ 0x01, 0x17, KEY_PLAYPAUSE }, /* TIMESHIFT */
|
||||
{ 0x01, 0x15, KEY_RECORD }, /* RECORD */
|
||||
{ 0x03, 0x13, KEY_PLAY }, /* PLAY */
|
||||
{ 0x01, 0x16, KEY_STOP }, /* STOP */
|
||||
{ 0x01, 0x13, KEY_PAUSE }, /* PAUSE */
|
||||
};
|
||||
|
||||
static u8 af9015_ir_table_digittrade[] = {
|
||||
0x00, 0xff, 0x06, 0xf9, 0x13, 0x05, 0x00,
|
||||
0x00, 0xff, 0x4d, 0xb2, 0x17, 0x01, 0x00,
|
||||
0x00, 0xff, 0x1f, 0xe0, 0x2c, 0x00, 0x00,
|
||||
0x00, 0xff, 0x0a, 0xf5, 0x15, 0x01, 0x00,
|
||||
0x00, 0xff, 0x0e, 0xf1, 0x16, 0x01, 0x00,
|
||||
0x00, 0xff, 0x09, 0xf6, 0x09, 0x01, 0x00,
|
||||
0x00, 0xff, 0x01, 0xfe, 0x08, 0x01, 0x00,
|
||||
0x00, 0xff, 0x05, 0xfa, 0x10, 0x01, 0x00,
|
||||
0x00, 0xff, 0x02, 0xfd, 0x56, 0x00, 0x00,
|
||||
0x00, 0xff, 0x40, 0xbf, 0x57, 0x00, 0x00,
|
||||
0x00, 0xff, 0x19, 0xe6, 0x52, 0x00, 0x00,
|
||||
0x00, 0xff, 0x17, 0xe8, 0x51, 0x00, 0x00,
|
||||
0x00, 0xff, 0x10, 0xef, 0x0f, 0x01, 0x00,
|
||||
0x00, 0xff, 0x54, 0xab, 0x27, 0x00, 0x00,
|
||||
0x00, 0xff, 0x1b, 0xe4, 0x1e, 0x00, 0x00,
|
||||
0x00, 0xff, 0x11, 0xee, 0x1f, 0x00, 0x00,
|
||||
0x00, 0xff, 0x15, 0xea, 0x20, 0x00, 0x00,
|
||||
0x00, 0xff, 0x12, 0xed, 0x21, 0x00, 0x00,
|
||||
0x00, 0xff, 0x16, 0xe9, 0x22, 0x00, 0x00,
|
||||
0x00, 0xff, 0x4c, 0xb3, 0x23, 0x00, 0x00,
|
||||
0x00, 0xff, 0x48, 0xb7, 0x24, 0x00, 0x00,
|
||||
0x00, 0xff, 0x04, 0xfb, 0x25, 0x00, 0x00,
|
||||
0x00, 0xff, 0x00, 0xff, 0x26, 0x00, 0x00,
|
||||
0x00, 0xff, 0x1e, 0xe1, 0x13, 0x03, 0x00,
|
||||
0x00, 0xff, 0x1a, 0xe5, 0x13, 0x01, 0x00,
|
||||
0x00, 0xff, 0x03, 0xfc, 0x17, 0x05, 0x00,
|
||||
0x00, 0xff, 0x0d, 0xf2, 0x16, 0x05, 0x00,
|
||||
0x00, 0xff, 0x1d, 0xe2, 0x40, 0x00, 0x00,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -153,7 +153,7 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
|
||||
int num)
|
||||
{
|
||||
struct dvb_usb_device *d = i2c_get_adapdata(adap);
|
||||
int ret, inc, i = 0;
|
||||
int ret = 0, inc, i = 0;
|
||||
|
||||
if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
|
||||
return -EAGAIN;
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
/* debug */
|
||||
int dvb_usb_cinergyt2_debug;
|
||||
int disable_remote;
|
||||
|
||||
module_param_named(debug, dvb_usb_cinergyt2_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "set debugging level (1=info, xfer=2, rc=4 "
|
||||
@@ -45,7 +44,7 @@ struct cinergyt2_state {
|
||||
};
|
||||
|
||||
/* We are missing a release hook with usb_device data */
|
||||
struct dvb_usb_device *cinergyt2_usb_device;
|
||||
static struct dvb_usb_device *cinergyt2_usb_device;
|
||||
|
||||
static struct dvb_usb_device_properties cinergyt2_properties;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user