Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: V4L/DVB (4290): Add support for the TCL M2523_3DB_E tuner. V4L/DVB (4289): Missing statement in drivers/media/dvb/frontends/cx22700.c V4L/DVB (4288): Clean out a zillion sparse warnings in pvrusb2 V4L/DVB (4287): Pvrusb2/: possible cleanups V4L/DVB (4285): Cx88: add support for Geniatech Digistar / Digiwave 103g V4L/DVB (4284): Cx24123: fix set_voltage function according to the specs V4L/DVB (4282): Fix: use swzigzag for swalgo V4L/DVB (4281): TDA9887_SET_CONFIG should only be handled by the tda9887. V4L/DVB (4277): Fix CI interface on PRO KNC1 cards V4L/DVB (4276): Fix CI on old KNC1 DVBC cards V4L/DVB (4275): The FE_SET_FRONTEND_TUNE_MODE ioctl always returns EOPNOTSUPP V4L/DVB (4274): Eliminate use of tda9887 from pvrusb2 driver V4L/DVB (4273): Always log pvrusb2 device register / unregister events V4L/DVB (4272): Fix tveeprom supported standards V4L/DVB (4270): Add tda9887-specific tuner configuration V4L/DVB (4269): Subject: videocodec: make 1-bit fields unsigned V4L/DVB (4267): Remove all instances of request_module("tda9887") V4L/DVB (4264): Cx88-blackbird: implement VIDIOC_QUERYCTRL and VIDIOC_QUERYMENU
This commit is contained in:
Коммит
1cfef5ed63
|
@ -50,3 +50,4 @@
|
|||
49 -> PixelView PlayTV P7000 [1554:4813]
|
||||
50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
|
||||
51 -> WinFast DTV2000 H [107d:665e]
|
||||
52 -> Geniatech DVB-S [14f1:0084]
|
||||
|
|
|
@ -570,7 +570,8 @@ static int dvb_frontend_thread(void *data)
|
|||
dvb_frontend_add_event(fe, s);
|
||||
fepriv->status = s;
|
||||
}
|
||||
}
|
||||
} else
|
||||
dvb_frontend_swzigzag(fe);
|
||||
} else
|
||||
dvb_frontend_swzigzag(fe);
|
||||
}
|
||||
|
@ -975,6 +976,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
|
|||
|
||||
case FE_SET_FRONTEND_TUNE_MODE:
|
||||
fepriv->tune_mode_flags = (unsigned long) parg;
|
||||
err = 0;
|
||||
break;
|
||||
};
|
||||
|
||||
|
|
|
@ -134,6 +134,7 @@ static int cx22700_set_tps (struct cx22700_state *state, struct dvb_ofdm_paramet
|
|||
return -EINVAL;
|
||||
|
||||
if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8)
|
||||
return -EINVAL;
|
||||
|
||||
if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -670,10 +670,10 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
|
|||
switch (voltage) {
|
||||
case SEC_VOLTAGE_13:
|
||||
dprintk("%s: setting voltage 13V\n", __FUNCTION__);
|
||||
return cx24123_writereg(state, 0x29, val | 0x80);
|
||||
return cx24123_writereg(state, 0x29, val & 0x7f);
|
||||
case SEC_VOLTAGE_18:
|
||||
dprintk("%s: setting voltage 18V\n", __FUNCTION__);
|
||||
return cx24123_writereg(state, 0x29, val & 0x7f);
|
||||
return cx24123_writereg(state, 0x29, val | 0x80);
|
||||
default:
|
||||
return -EINVAL;
|
||||
};
|
||||
|
|
|
@ -1141,6 +1141,15 @@ static void frontend_init(struct budget_av *budget_av)
|
|||
break;
|
||||
|
||||
case SUBID_DVBC_KNC1:
|
||||
budget_av->reinitialise_demod = 1;
|
||||
fe = tda10021_attach(&philips_cu1216_config,
|
||||
&budget_av->budget.i2c_adap,
|
||||
read_pwm(budget_av));
|
||||
if (fe) {
|
||||
fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params;
|
||||
}
|
||||
break;
|
||||
|
||||
case SUBID_DVBC_KNC1_PLUS:
|
||||
case SUBID_DVBC_CINERGY1200:
|
||||
budget_av->reinitialise_demod = 1;
|
||||
|
@ -1293,11 +1302,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
|||
|
||||
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||
frontend_init(budget_av);
|
||||
|
||||
if (!budget_av->has_saa7113) {
|
||||
ciintf_init(budget_av);
|
||||
}
|
||||
|
||||
ciintf_init(budget_av);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -3548,11 +3548,6 @@ void __devinit bttv_init_card2(struct bttv *btv)
|
|||
/* Hybrid DVB card, DOES have a tda9887 */
|
||||
if (btv->c.type == BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE)
|
||||
tda9887 = 1;
|
||||
if((btv->tuner_type == TUNER_PHILIPS_FM1216ME_MK3) ||
|
||||
(btv->tuner_type == TUNER_PHILIPS_FM1236_MK3) ||
|
||||
(btv->tuner_type == TUNER_PHILIPS_FM1256_IH3) ||
|
||||
tda9887)
|
||||
request_module("tda9887");
|
||||
if (btv->tuner_type != UNSET)
|
||||
request_module("tuner");
|
||||
}
|
||||
|
|
|
@ -686,6 +686,39 @@ static struct videobuf_queue_ops blackbird_qops = {
|
|||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
static const u32 *ctrl_classes[] = {
|
||||
cx88_user_ctrls,
|
||||
cx2341x_mpeg_ctrls,
|
||||
NULL
|
||||
};
|
||||
|
||||
static int blackbird_queryctrl(struct cx8802_dev *dev, struct v4l2_queryctrl *qctrl)
|
||||
{
|
||||
qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
|
||||
if (qctrl->id == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* Standard V4L2 controls */
|
||||
if (cx8800_ctrl_query(qctrl) == 0)
|
||||
return 0;
|
||||
|
||||
/* MPEG V4L2 controls */
|
||||
if (cx2341x_ctrl_query(&dev->params, qctrl))
|
||||
qctrl->flags |= V4L2_CTRL_FLAG_DISABLED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int blackbird_querymenu(struct cx8802_dev *dev, struct v4l2_querymenu *qmenu)
|
||||
{
|
||||
struct v4l2_queryctrl qctrl;
|
||||
|
||||
qctrl.id = qmenu->id;
|
||||
blackbird_queryctrl(dev, &qctrl);
|
||||
return v4l2_ctrl_query_menu(qmenu, &qctrl, cx2341x_ctrl_get_menu(qmenu->id));
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
static int mpeg_do_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, void *arg)
|
||||
{
|
||||
|
@ -866,6 +899,16 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
|
|||
core->name);
|
||||
return 0;
|
||||
}
|
||||
case VIDIOC_QUERYMENU:
|
||||
return blackbird_querymenu(dev, arg);
|
||||
case VIDIOC_QUERYCTRL:
|
||||
{
|
||||
struct v4l2_queryctrl *c = arg;
|
||||
|
||||
if (blackbird_queryctrl(dev, c) == 0)
|
||||
return 0;
|
||||
return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl);
|
||||
}
|
||||
|
||||
default:
|
||||
return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl);
|
||||
|
|
|
@ -1194,6 +1194,21 @@ struct cx88_board cx88_boards[] = {
|
|||
}},
|
||||
.dvb = 1,
|
||||
},
|
||||
[CX88_BOARD_GENIATECH_DVBS] = {
|
||||
.name = "Geniatech DVB-S",
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
.input = {{
|
||||
.type = CX88_VMUX_DVB,
|
||||
.vmux = 0,
|
||||
},{
|
||||
.type = CX88_VMUX_COMPOSITE1,
|
||||
.vmux = 1,
|
||||
}},
|
||||
.dvb = 1,
|
||||
},
|
||||
};
|
||||
const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
|
||||
|
||||
|
@ -1439,6 +1454,10 @@ struct cx88_subid cx88_subids[] = {
|
|||
.subvendor = 0x18ac,
|
||||
.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
|
||||
.card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
|
||||
},{
|
||||
.subvendor = 0x14f1,
|
||||
.subdevice = 0x0084,
|
||||
.card = CX88_BOARD_GENIATECH_DVBS,
|
||||
},
|
||||
};
|
||||
const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
|
||||
|
|
|
@ -496,6 +496,26 @@ static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
{
|
||||
struct cx8802_dev *dev= fe->dvb->priv;
|
||||
struct cx88_core *core = dev->core;
|
||||
|
||||
if (voltage == SEC_VOLTAGE_OFF) {
|
||||
dprintk(1,"LNB Voltage OFF\n");
|
||||
cx_write(MO_GP0_IO, 0x0000efff);
|
||||
}
|
||||
|
||||
if (core->prev_set_voltage)
|
||||
return core->prev_set_voltage(fe, voltage);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct cx24123_config geniatech_dvbs_config = {
|
||||
.demod_address = 0x55,
|
||||
.set_ts_params = cx24123_set_ts_param,
|
||||
};
|
||||
|
||||
static struct cx24123_config hauppauge_novas_config = {
|
||||
.demod_address = 0x55,
|
||||
.set_ts_params = cx24123_set_ts_param,
|
||||
|
@ -760,6 +780,14 @@ static int dvb_register(struct cx8802_dev *dev)
|
|||
dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
|
||||
}
|
||||
break;
|
||||
case CX88_BOARD_GENIATECH_DVBS:
|
||||
dev->dvb.frontend = cx24123_attach(&geniatech_dvbs_config,
|
||||
&dev->core->i2c_adap);
|
||||
if (dev->dvb.frontend) {
|
||||
dev->core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage;
|
||||
dev->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
|
||||
|
|
|
@ -327,6 +327,51 @@ static struct cx88_ctrl cx8800_ctls[] = {
|
|||
};
|
||||
static const int CX8800_CTLS = ARRAY_SIZE(cx8800_ctls);
|
||||
|
||||
const u32 cx88_user_ctrls[] = {
|
||||
V4L2_CID_USER_CLASS,
|
||||
V4L2_CID_BRIGHTNESS,
|
||||
V4L2_CID_CONTRAST,
|
||||
V4L2_CID_SATURATION,
|
||||
V4L2_CID_HUE,
|
||||
V4L2_CID_AUDIO_VOLUME,
|
||||
V4L2_CID_AUDIO_BALANCE,
|
||||
V4L2_CID_AUDIO_MUTE,
|
||||
0
|
||||
};
|
||||
EXPORT_SYMBOL(cx88_user_ctrls);
|
||||
|
||||
static const u32 *ctrl_classes[] = {
|
||||
cx88_user_ctrls,
|
||||
NULL
|
||||
};
|
||||
|
||||
int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (qctrl->id < V4L2_CID_BASE ||
|
||||
qctrl->id >= V4L2_CID_LASTP1)
|
||||
return -EINVAL;
|
||||
for (i = 0; i < CX8800_CTLS; i++)
|
||||
if (cx8800_ctls[i].v.id == qctrl->id)
|
||||
break;
|
||||
if (i == CX8800_CTLS) {
|
||||
*qctrl = no_ctl;
|
||||
return 0;
|
||||
}
|
||||
*qctrl = cx8800_ctls[i].v;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(cx8800_ctrl_query);
|
||||
|
||||
static int cx88_queryctrl(struct v4l2_queryctrl *qctrl)
|
||||
{
|
||||
qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
|
||||
if (qctrl->id == 0)
|
||||
return -EINVAL;
|
||||
return cx8800_ctrl_query(qctrl);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
/* resource management */
|
||||
|
||||
|
@ -1362,20 +1407,8 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
|
|||
case VIDIOC_QUERYCTRL:
|
||||
{
|
||||
struct v4l2_queryctrl *c = arg;
|
||||
int i;
|
||||
|
||||
if (c->id < V4L2_CID_BASE ||
|
||||
c->id >= V4L2_CID_LASTP1)
|
||||
return -EINVAL;
|
||||
for (i = 0; i < CX8800_CTLS; i++)
|
||||
if (cx8800_ctls[i].v.id == c->id)
|
||||
break;
|
||||
if (i == CX8800_CTLS) {
|
||||
*c = no_ctl;
|
||||
return 0;
|
||||
}
|
||||
*c = cx8800_ctls[i].v;
|
||||
return 0;
|
||||
return cx88_queryctrl(c);
|
||||
}
|
||||
case VIDIOC_G_CTRL:
|
||||
return get_control(core,arg);
|
||||
|
@ -1893,8 +1926,6 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
|
|||
/* load and configure helper modules */
|
||||
if (TUNER_ABSENT != core->tuner_type)
|
||||
request_module("tuner");
|
||||
if (core->tda9887_conf)
|
||||
request_module("tda9887");
|
||||
|
||||
/* register v4l devices */
|
||||
dev->video_dev = cx88_vdev_init(core,dev->pci,
|
||||
|
|
|
@ -196,6 +196,7 @@ extern struct sram_channel cx88_sram_channels[];
|
|||
#define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49
|
||||
#define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50
|
||||
#define CX88_BOARD_WINFAST_DTV2000H 51
|
||||
#define CX88_BOARD_GENIATECH_DVBS 52
|
||||
|
||||
enum cx88_itype {
|
||||
CX88_VMUX_COMPOSITE1 = 1,
|
||||
|
@ -590,6 +591,8 @@ int cx8802_resume_common(struct pci_dev *pci_dev);
|
|||
extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
|
||||
struct cx88_core *core, unsigned int cmd,
|
||||
void *arg, v4l2_kioctl driver_ioctl);
|
||||
extern const u32 cx88_user_ctrls[];
|
||||
extern int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl);
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
|
|
|
@ -1574,8 +1574,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
request_module("tvp5150");
|
||||
if (dev->has_tuner)
|
||||
request_module("tuner");
|
||||
if (dev->tda9887_conf)
|
||||
request_module("tda9887");
|
||||
#endif
|
||||
errCode = em28xx_config(dev);
|
||||
if (errCode) {
|
||||
|
|
|
@ -90,8 +90,8 @@ struct msp_state {
|
|||
/* thread */
|
||||
struct task_struct *kthread;
|
||||
wait_queue_head_t wq;
|
||||
int restart:1;
|
||||
int watch_stereo:1;
|
||||
unsigned int restart:1;
|
||||
unsigned int watch_stereo:1;
|
||||
};
|
||||
|
||||
/* msp3400-driver.c */
|
||||
|
|
|
@ -8,7 +8,7 @@ obj-pvrusb2-24xxx-$(CONFIG_VIDEO_PVRUSB2_24XXX) := \
|
|||
pvrusb2-objs := pvrusb2-i2c-core.o pvrusb2-i2c-cmd-v4l2.o \
|
||||
pvrusb2-audio.o pvrusb2-i2c-chips-v4l2.o \
|
||||
pvrusb2-encoder.o pvrusb2-video-v4l.o \
|
||||
pvrusb2-eeprom.o pvrusb2-tuner.o pvrusb2-demod.o \
|
||||
pvrusb2-eeprom.o pvrusb2-tuner.o \
|
||||
pvrusb2-main.o pvrusb2-hdw.o pvrusb2-v4l2.o \
|
||||
pvrusb2-ctrl.o pvrusb2-std.o \
|
||||
pvrusb2-context.o pvrusb2-io.o pvrusb2-ioread.o \
|
||||
|
|
|
@ -145,8 +145,8 @@ static int get_audio_status(struct pvr2_msp3400_handler *ctxt)
|
|||
|
||||
static void pvr2_msp3400_detach(struct pvr2_msp3400_handler *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
ctxt->hdw->audio_stat = 0;
|
||||
ctxt->client->handler = NULL;
|
||||
ctxt->hdw->audio_stat = NULL;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ struct pvr2_context *pvr2_context_create(
|
|||
const struct usb_device_id *devid,
|
||||
void (*setup_func)(struct pvr2_context *))
|
||||
{
|
||||
struct pvr2_context *mp = 0;
|
||||
struct pvr2_context *mp = NULL;
|
||||
mp = kmalloc(sizeof(*mp),GFP_KERNEL);
|
||||
if (!mp) goto done;
|
||||
memset(mp,0,sizeof(*mp));
|
||||
|
@ -87,7 +87,7 @@ struct pvr2_context *pvr2_context_create(
|
|||
mp->hdw = pvr2_hdw_create(intf,devid);
|
||||
if (!mp->hdw) {
|
||||
pvr2_context_destroy(mp);
|
||||
mp = 0;
|
||||
mp = NULL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,7 @@ void pvr2_channel_init(struct pvr2_channel *cp,struct pvr2_context *mp)
|
|||
{
|
||||
cp->hdw = mp->hdw;
|
||||
cp->mc_head = mp;
|
||||
cp->mc_next = 0;
|
||||
cp->mc_next = NULL;
|
||||
cp->mc_prev = mp->mc_last;
|
||||
if (mp->mc_last) {
|
||||
mp->mc_last->mc_next = cp;
|
||||
|
@ -160,8 +160,8 @@ static void pvr2_channel_disclaim_stream(struct pvr2_channel *cp)
|
|||
{
|
||||
if (!cp->stream) return;
|
||||
pvr2_stream_kill(cp->stream->stream);
|
||||
cp->stream->user = 0;
|
||||
cp->stream = 0;
|
||||
cp->stream->user = NULL;
|
||||
cp->stream = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -179,7 +179,7 @@ void pvr2_channel_done(struct pvr2_channel *cp)
|
|||
} else {
|
||||
mp->mc_first = cp->mc_next;
|
||||
}
|
||||
cp->hdw = 0;
|
||||
cp->hdw = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -212,7 +212,7 @@ struct pvr2_ioread *pvr2_channel_create_mpeg_stream(
|
|||
{
|
||||
struct pvr2_ioread *cp;
|
||||
cp = pvr2_ioread_create();
|
||||
if (!cp) return 0;
|
||||
if (!cp) return NULL;
|
||||
pvr2_ioread_setup(cp,sp->stream);
|
||||
pvr2_ioread_set_sync_key(cp,stream_sync_key,sizeof(stream_sync_key));
|
||||
return cp;
|
||||
|
|
|
@ -158,7 +158,7 @@ int pvr2_ctrl_get_mask(struct pvr2_ctrl *cptr)
|
|||
/* Retrieve the control's name */
|
||||
const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr)
|
||||
{
|
||||
if (!cptr) return 0;
|
||||
if (!cptr) return NULL;
|
||||
return cptr->info->name;
|
||||
}
|
||||
|
||||
|
@ -166,7 +166,7 @@ const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr)
|
|||
/* Retrieve the control's desc */
|
||||
const char *pvr2_ctrl_get_desc(struct pvr2_ctrl *cptr)
|
||||
{
|
||||
if (!cptr) return 0;
|
||||
if (!cptr) return NULL;
|
||||
return cptr->info->desc;
|
||||
}
|
||||
|
||||
|
@ -488,7 +488,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
|
|||
|
||||
LOCK_TAKE(cptr->hdw->big_lock); do {
|
||||
if (cptr->info->type == pvr2_ctl_int) {
|
||||
ret = parse_token(ptr,len,valptr,0,0);
|
||||
ret = parse_token(ptr,len,valptr,NULL,0);
|
||||
if ((ret >= 0) &&
|
||||
((*valptr < cptr->info->def.type_int.min_value) ||
|
||||
(*valptr > cptr->info->def.type_int.max_value))) {
|
||||
|
|
|
@ -139,8 +139,8 @@ static const struct pvr2_v4l_cx2584x_ops decoder_ops[] = {
|
|||
|
||||
static void decoder_detach(struct pvr2_v4l_cx2584x *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
ctxt->hdw->decoder_ctrl = 0;
|
||||
ctxt->client->handler = NULL;
|
||||
ctxt->hdw->decoder_ctrl = NULL;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
@ -221,7 +221,7 @@ static unsigned int decoder_describe(struct pvr2_v4l_cx2584x *ctxt,
|
|||
static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt)
|
||||
{
|
||||
int ret;
|
||||
ret = pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_RESET,0);
|
||||
ret = pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_RESET,NULL);
|
||||
pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx25840 decoder_reset (ret=%d)",ret);
|
||||
}
|
||||
|
||||
|
|
|
@ -82,7 +82,7 @@ static unsigned int debugifc_isolate_word(const char *buf,unsigned int count,
|
|||
unsigned int wlen;
|
||||
unsigned int scnt;
|
||||
|
||||
wptr = 0;
|
||||
wptr = NULL;
|
||||
wlen = 0;
|
||||
scnt = debugifc_count_whitespace(buf,count);
|
||||
consume_cnt += scnt; count -= scnt; buf += scnt;
|
||||
|
@ -337,8 +337,8 @@ int pvr2_debugifc_print_status(struct pvr2_hdw *hdw,
|
|||
}
|
||||
|
||||
|
||||
int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf,
|
||||
unsigned int count)
|
||||
static int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf,
|
||||
unsigned int count)
|
||||
{
|
||||
const char *wptr;
|
||||
unsigned int wlen;
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 Mike Isely <isely@pobox.com>
|
||||
* Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "pvrusb2.h"
|
||||
#include "pvrusb2-util.h"
|
||||
#include "pvrusb2-demod.h"
|
||||
#include "pvrusb2-hdw-internal.h"
|
||||
#include "pvrusb2-debug.h"
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/tuner.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
|
||||
struct pvr2_demod_handler {
|
||||
struct pvr2_hdw *hdw;
|
||||
struct pvr2_i2c_client *client;
|
||||
struct pvr2_i2c_handler i2c_handler;
|
||||
int type_update_fl;
|
||||
};
|
||||
|
||||
|
||||
static void set_config(struct pvr2_demod_handler *ctxt)
|
||||
{
|
||||
struct pvr2_hdw *hdw = ctxt->hdw;
|
||||
int cfg = 0;
|
||||
|
||||
switch (hdw->tuner_type) {
|
||||
case TUNER_PHILIPS_FM1216ME_MK3:
|
||||
case TUNER_PHILIPS_FM1236_MK3:
|
||||
cfg = TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pvr2_trace(PVR2_TRACE_CHIPS,"i2c demod set_config(0x%x)",cfg);
|
||||
pvr2_i2c_client_cmd(ctxt->client,TDA9887_SET_CONFIG,&cfg);
|
||||
ctxt->type_update_fl = 0;
|
||||
}
|
||||
|
||||
|
||||
static int demod_check(struct pvr2_demod_handler *ctxt)
|
||||
{
|
||||
struct pvr2_hdw *hdw = ctxt->hdw;
|
||||
if (hdw->tuner_updated) ctxt->type_update_fl = !0;
|
||||
return ctxt->type_update_fl != 0;
|
||||
}
|
||||
|
||||
|
||||
static void demod_update(struct pvr2_demod_handler *ctxt)
|
||||
{
|
||||
if (ctxt->type_update_fl) set_config(ctxt);
|
||||
}
|
||||
|
||||
|
||||
static void demod_detach(struct pvr2_demod_handler *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
||||
static unsigned int demod_describe(struct pvr2_demod_handler *ctxt,char *buf,unsigned int cnt)
|
||||
{
|
||||
return scnprintf(buf,cnt,"handler: pvrusb2-demod");
|
||||
}
|
||||
|
||||
|
||||
const static struct pvr2_i2c_handler_functions tuner_funcs = {
|
||||
.detach = (void (*)(void *))demod_detach,
|
||||
.check = (int (*)(void *))demod_check,
|
||||
.update = (void (*)(void *))demod_update,
|
||||
.describe = (unsigned int (*)(void *,char *,unsigned int))demod_describe,
|
||||
};
|
||||
|
||||
|
||||
int pvr2_i2c_demod_setup(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp)
|
||||
{
|
||||
struct pvr2_demod_handler *ctxt;
|
||||
if (cp->handler) return 0;
|
||||
|
||||
ctxt = kmalloc(sizeof(*ctxt),GFP_KERNEL);
|
||||
if (!ctxt) return 0;
|
||||
memset(ctxt,0,sizeof(*ctxt));
|
||||
|
||||
ctxt->i2c_handler.func_data = ctxt;
|
||||
ctxt->i2c_handler.func_table = &tuner_funcs;
|
||||
ctxt->type_update_fl = !0;
|
||||
ctxt->client = cp;
|
||||
ctxt->hdw = hdw;
|
||||
cp->handler = &ctxt->i2c_handler;
|
||||
pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x tda9887 V4L2 handler set up",
|
||||
cp->client->addr);
|
||||
return !0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Stuff for Emacs to see, in order to encourage consistent editing style:
|
||||
*** Local Variables: ***
|
||||
*** mode: c ***
|
||||
*** fill-column: 70 ***
|
||||
*** tab-width: 8 ***
|
||||
*** c-basic-offset: 8 ***
|
||||
*** End: ***
|
||||
*/
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 Mike Isely <isely@pobox.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#ifndef __PVRUSB2_DEMOD_H
|
||||
#define __PVRUSB2_DEMOD_H
|
||||
|
||||
#include "pvrusb2-i2c-core.h"
|
||||
|
||||
int pvr2_i2c_demod_setup(struct pvr2_hdw *,struct pvr2_i2c_client *);
|
||||
|
||||
#endif /* __PVRUSB2_DEMOD_H */
|
||||
|
||||
/*
|
||||
Stuff for Emacs to see, in order to encourage consistent editing style:
|
||||
*** Local Variables: ***
|
||||
*** mode: c ***
|
||||
*** fill-column: 70 ***
|
||||
*** tab-width: 8 ***
|
||||
*** c-basic-offset: 8 ***
|
||||
*** End: ***
|
||||
*/
|
|
@ -58,7 +58,7 @@ static u8 *pvr2_eeprom_fetch(struct pvr2_hdw *hdw)
|
|||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
"Failed to allocate memory"
|
||||
" required to read eeprom");
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
trace_eeprom("Value for eeprom addr from controller was 0x%x",
|
||||
|
@ -108,7 +108,7 @@ static u8 *pvr2_eeprom_fetch(struct pvr2_hdw *hdw)
|
|||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
"eeprom fetch set offs err=%d",ret);
|
||||
kfree(eeprom);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return eeprom;
|
||||
|
|
|
@ -65,7 +65,7 @@ static int pvr2_encoder_write_words(struct pvr2_hdw *hdw,
|
|||
}
|
||||
ret = pvr2_send_request(hdw,
|
||||
hdw->cmd_buffer,1+(chunkCnt*7),
|
||||
0,0);
|
||||
NULL,0);
|
||||
if (ret) return ret;
|
||||
data += chunkCnt;
|
||||
dlen -= chunkCnt;
|
||||
|
@ -322,7 +322,7 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
ret = cx2341x_update(hdw,pvr2_encoder_cmd,
|
||||
(hdw->enc_cur_valid ? &hdw->enc_cur_state : 0),
|
||||
(hdw->enc_cur_valid ? &hdw->enc_cur_state : NULL),
|
||||
&hdw->enc_ctl_state);
|
||||
if (ret) {
|
||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
|
|
|
@ -354,23 +354,6 @@ struct pvr2_hdw {
|
|||
unsigned int control_cnt;
|
||||
};
|
||||
|
||||
int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw);
|
||||
|
||||
unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *);
|
||||
|
||||
void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,unsigned long val);
|
||||
void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val);
|
||||
|
||||
void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
|
||||
void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
|
||||
|
||||
int pvr2_i2c_basic_op(struct pvr2_hdw *,u8 i2c_addr,
|
||||
u8 *wdata,u16 wlen,
|
||||
u8 *rdata,u16 rlen);
|
||||
|
||||
#endif /* __PVRUSB2_HDW_INTERNAL_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -63,7 +63,6 @@ struct pvr2_string_table {
|
|||
static const char *pvr2_client_24xxx[] = {
|
||||
"cx25840",
|
||||
"tuner",
|
||||
"tda9887",
|
||||
"wm8775",
|
||||
};
|
||||
#endif
|
||||
|
@ -73,7 +72,6 @@ static const char *pvr2_client_29xxx[] = {
|
|||
"msp3400",
|
||||
"saa7115",
|
||||
"tuner",
|
||||
"tda9887",
|
||||
};
|
||||
|
||||
static struct pvr2_string_table pvr2_client_lists[] = {
|
||||
|
@ -89,8 +87,8 @@ static struct pvr2_string_table pvr2_client_lists[] = {
|
|||
#endif
|
||||
};
|
||||
|
||||
static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = 0};
|
||||
DECLARE_MUTEX(pvr2_unit_sem);
|
||||
static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
|
||||
static DECLARE_MUTEX(pvr2_unit_sem);
|
||||
|
||||
static int ctlchg = 0;
|
||||
static int initusbreset = 1;
|
||||
|
@ -263,6 +261,25 @@ static const char *control_values_subsystem[] = {
|
|||
[PVR2_SUBSYS_B_ENC_RUN] = "enc_run",
|
||||
};
|
||||
|
||||
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
|
||||
static int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw);
|
||||
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
|
||||
static unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *hdw);
|
||||
static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
|
||||
static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
|
||||
static void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw);
|
||||
static void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val);
|
||||
static void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val);
|
||||
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||
unsigned int timeout,int probe_fl,
|
||||
void *write_data,unsigned int write_len,
|
||||
void *read_data,unsigned int read_len);
|
||||
static int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res);
|
||||
static int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res);
|
||||
|
||||
static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
|
||||
{
|
||||
|
@ -405,7 +422,7 @@ static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
|
|||
info = (struct pvr2_ctl_info *)(cptr->info);
|
||||
if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
|
||||
if (info->set_value) {
|
||||
info->set_value = 0;
|
||||
info->set_value = NULL;
|
||||
}
|
||||
} else {
|
||||
if (!(info->set_value)) {
|
||||
|
@ -836,14 +853,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
|
||||
struct pvr2_hdw *pvr2_hdw_find(int unit_number)
|
||||
{
|
||||
if (unit_number < 0) return 0;
|
||||
if (unit_number >= PVR_NUM) return 0;
|
||||
return unit_pointers[unit_number];
|
||||
}
|
||||
|
||||
|
||||
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
||||
{
|
||||
return hdw->unit_number;
|
||||
|
@ -917,9 +926,9 @@ static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
|
|||
* is not suitable for an usb transaction.
|
||||
*
|
||||
*/
|
||||
int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
|
||||
static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
|
||||
{
|
||||
const struct firmware *fw_entry = 0;
|
||||
const struct firmware *fw_entry = NULL;
|
||||
void *fw_ptr;
|
||||
unsigned int pipe;
|
||||
int ret;
|
||||
|
@ -1015,7 +1024,7 @@ int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
|
|||
|
||||
int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
|
||||
{
|
||||
const struct firmware *fw_entry = 0;
|
||||
const struct firmware *fw_entry = NULL;
|
||||
void *fw_ptr;
|
||||
unsigned int pipe, fw_len, fw_done;
|
||||
int actual_length;
|
||||
|
@ -1166,8 +1175,9 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
|
|||
reconfigure and start over.
|
||||
|
||||
*/
|
||||
void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,unsigned long val)
|
||||
static void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val)
|
||||
{
|
||||
unsigned long nmsk;
|
||||
unsigned long vmsk;
|
||||
|
@ -1318,18 +1328,6 @@ void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
|
|||
}
|
||||
|
||||
|
||||
void pvr2_hdw_subsys_bit_set(struct pvr2_hdw *hdw,unsigned long msk)
|
||||
{
|
||||
pvr2_hdw_subsys_bit_chg(hdw,msk,msk);
|
||||
}
|
||||
|
||||
|
||||
void pvr2_hdw_subsys_bit_clr(struct pvr2_hdw *hdw,unsigned long msk)
|
||||
{
|
||||
pvr2_hdw_subsys_bit_chg(hdw,msk,0);
|
||||
}
|
||||
|
||||
|
||||
unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *hdw)
|
||||
{
|
||||
return hdw->subsys_enabled_mask;
|
||||
|
@ -1342,9 +1340,9 @@ unsigned long pvr2_hdw_subsys_stream_get(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
|
||||
void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val)
|
||||
static void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,
|
||||
unsigned long val)
|
||||
{
|
||||
unsigned long val2;
|
||||
msk &= PVR2_SUBSYS_ALL;
|
||||
|
@ -1366,7 +1364,7 @@ void pvr2_hdw_subsys_stream_bit_chg(struct pvr2_hdw *hdw,
|
|||
}
|
||||
|
||||
|
||||
int pvr2_hdw_set_streaming_no_lock(struct pvr2_hdw *hdw,int enableFl)
|
||||
static int pvr2_hdw_set_streaming_no_lock(struct pvr2_hdw *hdw,int enableFl)
|
||||
{
|
||||
if ((!enableFl) == !(hdw->flag_streaming_enabled)) return 0;
|
||||
if (enableFl) {
|
||||
|
@ -1400,8 +1398,8 @@ int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
|
||||
enum pvr2_config config)
|
||||
static int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
|
||||
enum pvr2_config config)
|
||||
{
|
||||
unsigned long sm = hdw->subsys_enabled_mask;
|
||||
if (!hdw->flag_ok) return -EIO;
|
||||
|
@ -1741,7 +1739,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
|
|||
sizeof(pvr2_device_names)/sizeof(pvr2_device_names[0])) {
|
||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||
"Bogus device type of %u reported",hdw_type);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hdw = kmalloc(sizeof(*hdw),GFP_KERNEL);
|
||||
|
@ -1922,38 +1920,38 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
|
|||
if (hdw->mpeg_ctrl_info) kfree(hdw->mpeg_ctrl_info);
|
||||
kfree(hdw);
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Remove _all_ associations between this driver and the underlying USB
|
||||
layer. */
|
||||
void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
|
||||
static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
|
||||
{
|
||||
if (hdw->flag_disconnected) return;
|
||||
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
|
||||
if (hdw->ctl_read_urb) {
|
||||
usb_kill_urb(hdw->ctl_read_urb);
|
||||
usb_free_urb(hdw->ctl_read_urb);
|
||||
hdw->ctl_read_urb = 0;
|
||||
hdw->ctl_read_urb = NULL;
|
||||
}
|
||||
if (hdw->ctl_write_urb) {
|
||||
usb_kill_urb(hdw->ctl_write_urb);
|
||||
usb_free_urb(hdw->ctl_write_urb);
|
||||
hdw->ctl_write_urb = 0;
|
||||
hdw->ctl_write_urb = NULL;
|
||||
}
|
||||
if (hdw->ctl_read_buffer) {
|
||||
kfree(hdw->ctl_read_buffer);
|
||||
hdw->ctl_read_buffer = 0;
|
||||
hdw->ctl_read_buffer = NULL;
|
||||
}
|
||||
if (hdw->ctl_write_buffer) {
|
||||
kfree(hdw->ctl_write_buffer);
|
||||
hdw->ctl_write_buffer = 0;
|
||||
hdw->ctl_write_buffer = NULL;
|
||||
}
|
||||
pvr2_hdw_render_useless_unlocked(hdw);
|
||||
hdw->flag_disconnected = !0;
|
||||
hdw->usb_dev = 0;
|
||||
hdw->usb_intf = 0;
|
||||
hdw->usb_dev = NULL;
|
||||
hdw->usb_intf = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1963,11 +1961,11 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
|
|||
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
|
||||
if (hdw->fw_buffer) {
|
||||
kfree(hdw->fw_buffer);
|
||||
hdw->fw_buffer = 0;
|
||||
hdw->fw_buffer = NULL;
|
||||
}
|
||||
if (hdw->vid_stream) {
|
||||
pvr2_stream_destroy(hdw->vid_stream);
|
||||
hdw->vid_stream = 0;
|
||||
hdw->vid_stream = NULL;
|
||||
}
|
||||
if (hdw->audio_stat) {
|
||||
hdw->audio_stat->detach(hdw->audio_stat->ctxt);
|
||||
|
@ -1981,7 +1979,7 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
|
|||
if ((hdw->unit_number >= 0) &&
|
||||
(hdw->unit_number < PVR_NUM) &&
|
||||
(unit_pointers[hdw->unit_number] == hdw)) {
|
||||
unit_pointers[hdw->unit_number] = 0;
|
||||
unit_pointers[hdw->unit_number] = NULL;
|
||||
}
|
||||
} while (0); up(&pvr2_unit_sem);
|
||||
if (hdw->controls) kfree(hdw->controls);
|
||||
|
@ -2018,7 +2016,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
|
|||
|
||||
// Attempt to autoselect an appropriate value for std_enum_cur given
|
||||
// whatever is currently in std_mask_cur
|
||||
void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
|
||||
static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
|
||||
{
|
||||
unsigned int idx;
|
||||
for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
|
||||
|
@ -2033,7 +2031,7 @@ void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
|
|||
|
||||
// Calculate correct set of enumerated standards based on currently known
|
||||
// set of available standards bits.
|
||||
void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
|
||||
static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
|
||||
{
|
||||
struct v4l2_standard *newstd;
|
||||
unsigned int std_cnt;
|
||||
|
@ -2043,12 +2041,12 @@ void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
|
|||
|
||||
if (hdw->std_defs) {
|
||||
kfree(hdw->std_defs);
|
||||
hdw->std_defs = 0;
|
||||
hdw->std_defs = NULL;
|
||||
}
|
||||
hdw->std_enum_cnt = 0;
|
||||
if (hdw->std_enum_names) {
|
||||
kfree(hdw->std_enum_names);
|
||||
hdw->std_enum_names = 0;
|
||||
hdw->std_enum_names = NULL;
|
||||
}
|
||||
|
||||
if (!std_cnt) {
|
||||
|
@ -2099,7 +2097,7 @@ unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
|
|||
struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
|
||||
unsigned int idx)
|
||||
{
|
||||
if (idx >= hdw->control_cnt) return 0;
|
||||
if (idx >= hdw->control_cnt) return NULL;
|
||||
return hdw->controls + idx;
|
||||
}
|
||||
|
||||
|
@ -2118,7 +2116,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
|
|||
i = cptr->info->internal_id;
|
||||
if (i && (i == ctl_id)) return cptr;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2135,7 +2133,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id
|
|||
i = cptr->info->v4l_id;
|
||||
if (i && (i == ctl_id)) return cptr;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2149,7 +2147,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
|
|||
int i;
|
||||
|
||||
/* This could be made a lot more efficient, but for now... */
|
||||
cp2 = 0;
|
||||
cp2 = NULL;
|
||||
for (idx = 0; idx < hdw->control_cnt; idx++) {
|
||||
cptr = hdw->controls + idx;
|
||||
i = cptr->info->v4l_id;
|
||||
|
@ -2159,7 +2157,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
|
|||
cp2 = cptr;
|
||||
}
|
||||
return cp2;
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2182,7 +2180,7 @@ static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
|
|||
state(s) back to their previous value before this function was called.
|
||||
Thus we can automatically reconfigure affected pieces of the driver as
|
||||
controls are changed. */
|
||||
int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw)
|
||||
static int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw)
|
||||
{
|
||||
unsigned long saved_subsys_mask = hdw->subsys_enabled_mask;
|
||||
unsigned long stale_subsys_mask = 0;
|
||||
|
@ -2321,14 +2319,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
|
||||
void pvr2_hdw_poll_trigger(struct pvr2_hdw *hdw)
|
||||
{
|
||||
LOCK_TAKE(hdw->big_lock); do {
|
||||
pvr2_hdw_poll_trigger_unlocked(hdw);
|
||||
} while (0); LOCK_GIVE(hdw->big_lock);
|
||||
}
|
||||
|
||||
|
||||
/* Return name for this driver instance */
|
||||
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
||||
{
|
||||
|
@ -2337,7 +2327,7 @@ const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
|||
|
||||
|
||||
/* Return bit mask indicating signal status */
|
||||
unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *hdw)
|
||||
static unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *hdw)
|
||||
{
|
||||
unsigned int msk = 0;
|
||||
switch (hdw->input_val) {
|
||||
|
@ -2424,7 +2414,7 @@ void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag)
|
|||
pvr2_trace(PVR2_TRACE_FIRMWARE,
|
||||
"Cleaning up after CPU firmware fetch");
|
||||
kfree(hdw->fw_buffer);
|
||||
hdw->fw_buffer = 0;
|
||||
hdw->fw_buffer = NULL;
|
||||
hdw->fw_size = 0;
|
||||
/* Now release the CPU. It will disconnect and
|
||||
reconnect later. */
|
||||
|
@ -2519,22 +2509,6 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int v)
|
|||
}
|
||||
|
||||
|
||||
void pvr2_reset_ctl_endpoints(struct pvr2_hdw *hdw)
|
||||
{
|
||||
if (!hdw->usb_dev) return;
|
||||
usb_settoggle(hdw->usb_dev, PVR2_CTL_WRITE_ENDPOINT & 0xf,
|
||||
!(PVR2_CTL_WRITE_ENDPOINT & USB_DIR_IN), 0);
|
||||
usb_settoggle(hdw->usb_dev, PVR2_CTL_READ_ENDPOINT & 0xf,
|
||||
!(PVR2_CTL_READ_ENDPOINT & USB_DIR_IN), 0);
|
||||
usb_clear_halt(hdw->usb_dev,
|
||||
usb_rcvbulkpipe(hdw->usb_dev,
|
||||
PVR2_CTL_READ_ENDPOINT & 0x7f));
|
||||
usb_clear_halt(hdw->usb_dev,
|
||||
usb_sndbulkpipe(hdw->usb_dev,
|
||||
PVR2_CTL_WRITE_ENDPOINT & 0x7f));
|
||||
}
|
||||
|
||||
|
||||
static void pvr2_ctl_write_complete(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct pvr2_hdw *hdw = urb->context;
|
||||
|
@ -2568,10 +2542,10 @@ static void pvr2_ctl_timeout(unsigned long data)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||
unsigned int timeout,int probe_fl,
|
||||
void *write_data,unsigned int write_len,
|
||||
void *read_data,unsigned int read_len)
|
||||
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||
unsigned int timeout,int probe_fl,
|
||||
void *write_data,unsigned int write_len,
|
||||
void *read_data,unsigned int read_len)
|
||||
{
|
||||
unsigned int idx;
|
||||
int status = 0;
|
||||
|
@ -2826,7 +2800,7 @@ int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
|
||||
static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
@ -2850,7 +2824,7 @@ int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res)
|
||||
static int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -2867,7 +2841,7 @@ int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res)
|
||||
static int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -2883,13 +2857,13 @@ int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res)
|
|||
}
|
||||
|
||||
|
||||
void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw)
|
||||
static void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw)
|
||||
{
|
||||
if (!hdw->flag_ok) return;
|
||||
pvr2_trace(PVR2_TRACE_INIT,"render_useless");
|
||||
hdw->flag_ok = 0;
|
||||
if (hdw->vid_stream) {
|
||||
pvr2_stream_setup(hdw->vid_stream,0,0,0);
|
||||
pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
|
||||
}
|
||||
hdw->flag_streaming_enabled = 0;
|
||||
hdw->subsys_enabled_mask = 0;
|
||||
|
@ -2908,7 +2882,7 @@ void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
|
|||
{
|
||||
int ret;
|
||||
pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
|
||||
ret = usb_lock_device_for_reset(hdw->usb_dev,0);
|
||||
ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
|
||||
if (ret == 1) {
|
||||
ret = usb_reset_device(hdw->usb_dev);
|
||||
usb_unlock_device(hdw->usb_dev);
|
||||
|
@ -2957,7 +2931,7 @@ int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
|
|||
pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset");
|
||||
hdw->flag_ok = !0;
|
||||
hdw->cmd_buffer[0] = 0xdd;
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
|
||||
} while (0); LOCK_GIVE(hdw->ctl_lock);
|
||||
return status;
|
||||
}
|
||||
|
@ -2969,7 +2943,7 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
|
|||
LOCK_TAKE(hdw->ctl_lock); do {
|
||||
pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup");
|
||||
hdw->cmd_buffer[0] = 0xde;
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
|
||||
} while (0); LOCK_GIVE(hdw->ctl_lock);
|
||||
return status;
|
||||
}
|
||||
|
@ -2996,12 +2970,12 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
||||
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
||||
{
|
||||
int status;
|
||||
LOCK_TAKE(hdw->ctl_lock); do {
|
||||
hdw->cmd_buffer[0] = (runFl ? 0x36 : 0x37);
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
|
||||
status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
|
||||
} while (0); LOCK_GIVE(hdw->ctl_lock);
|
||||
if (!status) {
|
||||
hdw->subsys_enabled_mask =
|
||||
|
@ -3094,7 +3068,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
||||
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
||||
{
|
||||
int result;
|
||||
LOCK_TAKE(hdw->ctl_lock); do {
|
||||
|
|
|
@ -91,7 +91,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
|
|||
void pvr2_hdw_poll(struct pvr2_hdw *);
|
||||
|
||||
/* Trigger a poll to take place later at a convenient time */
|
||||
void pvr2_hdw_poll_trigger(struct pvr2_hdw *);
|
||||
void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *);
|
||||
|
||||
/* Register a callback used to trigger a future poll */
|
||||
|
@ -99,9 +98,6 @@ void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *,
|
|||
void (*func)(void *),
|
||||
void *data);
|
||||
|
||||
/* Get pointer to structure given unit number */
|
||||
struct pvr2_hdw *pvr2_hdw_find(int unit_number);
|
||||
|
||||
/* Destroy hardware interaction structure */
|
||||
void pvr2_hdw_destroy(struct pvr2_hdw *);
|
||||
|
||||
|
@ -180,12 +176,6 @@ int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,struct v4l2_standard *std,
|
|||
void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
|
||||
unsigned long msk,unsigned long val);
|
||||
|
||||
/* Shortcut for pvr2_hdw_subsys_bit_chg(hdw,msk,msk) */
|
||||
void pvr2_hdw_subsys_bit_set(struct pvr2_hdw *hdw,unsigned long msk);
|
||||
|
||||
/* Shortcut for pvr2_hdw_subsys_bit_chg(hdw,msk,0) */
|
||||
void pvr2_hdw_subsys_bit_clr(struct pvr2_hdw *hdw,unsigned long msk);
|
||||
|
||||
/* Retrieve mask indicating which pieces of hardware are currently enabled
|
||||
/ configured. */
|
||||
unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *);
|
||||
|
@ -225,34 +215,18 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,int);
|
|||
/* The following entry points are all lower level things you normally don't
|
||||
want to worry about. */
|
||||
|
||||
/* Attempt to recover from a USB foul-up (in practice I find that if you
|
||||
have to do this, then it's already too late). */
|
||||
void pvr2_reset_ctl_endpoints(struct pvr2_hdw *hdw);
|
||||
|
||||
/* Issue a command and get a response from the device. LOTS of higher
|
||||
level stuff is built on this. */
|
||||
int pvr2_send_request(struct pvr2_hdw *,
|
||||
void *write_ptr,unsigned int write_len,
|
||||
void *read_ptr,unsigned int read_len);
|
||||
|
||||
/* Issue a command and get a response from the device. This extended
|
||||
version includes a probe flag (which if set means that device errors
|
||||
should not be logged or treated as fatal) and a timeout in jiffies.
|
||||
This can be used to non-lethally probe the health of endpoint 1. */
|
||||
int pvr2_send_request_ex(struct pvr2_hdw *,unsigned int timeout,int probe_fl,
|
||||
void *write_ptr,unsigned int write_len,
|
||||
void *read_ptr,unsigned int read_len);
|
||||
|
||||
/* Slightly higher level device communication functions. */
|
||||
int pvr2_write_register(struct pvr2_hdw *, u16, u32);
|
||||
int pvr2_read_register(struct pvr2_hdw *, u16, u32 *);
|
||||
int pvr2_write_u16(struct pvr2_hdw *, u16, int);
|
||||
int pvr2_write_u8(struct pvr2_hdw *, u8, int);
|
||||
|
||||
/* Call if for any reason we can't talk to the hardware anymore - this will
|
||||
cause the driver to stop flailing on the device. */
|
||||
void pvr2_hdw_render_useless(struct pvr2_hdw *);
|
||||
void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *);
|
||||
|
||||
/* Set / clear 8051's reset bit */
|
||||
void pvr2_hdw_cpureset_assert(struct pvr2_hdw *,int);
|
||||
|
@ -271,12 +245,6 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *);
|
|||
/* Order decoder to reset */
|
||||
int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *);
|
||||
|
||||
/* Stop / start video stream transport */
|
||||
int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
|
||||
|
||||
/* Find I2C address of eeprom */
|
||||
int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *);
|
||||
|
||||
/* Direct manipulation of GPIO bits */
|
||||
int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *);
|
||||
int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *);
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include "pvrusb2-i2c-cmd-v4l2.h"
|
||||
#include "pvrusb2-audio.h"
|
||||
#include "pvrusb2-tuner.h"
|
||||
#include "pvrusb2-demod.h"
|
||||
#include "pvrusb2-video-v4l.h"
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
|
||||
#include "pvrusb2-cx2584x-v4l.h"
|
||||
|
@ -89,11 +88,6 @@ void pvr2_i2c_probe(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp)
|
|||
return;
|
||||
}
|
||||
}
|
||||
if (id == I2C_DRIVERID_TDA9887) {
|
||||
if (pvr2_i2c_demod_setup(hdw,cp)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ const struct pvr2_i2c_op pvr2_i2c_op_v4l2_size = {
|
|||
static void do_log(struct pvr2_hdw *hdw)
|
||||
{
|
||||
pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 do_log()");
|
||||
pvr2_i2c_core_cmd(hdw,VIDIOC_LOG_STATUS,0);
|
||||
pvr2_i2c_core_cmd(hdw,VIDIOC_LOG_STATUS,NULL);
|
||||
|
||||
}
|
||||
|
||||
|
@ -217,7 +217,7 @@ const struct pvr2_i2c_op pvr2_i2c_op_v4l2_log = {
|
|||
void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client *cp,int fl)
|
||||
{
|
||||
pvr2_i2c_client_cmd(cp,
|
||||
(fl ? VIDIOC_STREAMON : VIDIOC_STREAMOFF),0);
|
||||
(fl ? VIDIOC_STREAMON : VIDIOC_STREAMOFF),NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,10 @@ static unsigned int i2c_scan = 0;
|
|||
module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
|
||||
|
||||
static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
|
||||
unsigned int detail,
|
||||
char *buf,unsigned int maxlen);
|
||||
|
||||
static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
|
||||
u8 i2c_addr, /* I2C address we're talking to */
|
||||
u8 *data, /* Data to write */
|
||||
|
@ -165,12 +169,12 @@ static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
|
|||
|
||||
/* This is the common low level entry point for doing I2C operations to the
|
||||
hardware. */
|
||||
int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
|
||||
u8 i2c_addr,
|
||||
u8 *wdata,
|
||||
u16 wlen,
|
||||
u8 *rdata,
|
||||
u16 rlen)
|
||||
static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
|
||||
u8 i2c_addr,
|
||||
u8 *wdata,
|
||||
u16 wlen,
|
||||
u8 *rdata,
|
||||
u16 rlen)
|
||||
{
|
||||
if (!rdata) rlen = 0;
|
||||
if (!wdata) wlen = 0;
|
||||
|
@ -267,7 +271,7 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
|
|||
"WARNING: Disabling further access to the device"
|
||||
" to prevent other foul-ups.");
|
||||
// This blocks all further communication with the part.
|
||||
hdw->i2c_func[0x44] = 0;
|
||||
hdw->i2c_func[0x44] = NULL;
|
||||
pvr2_hdw_render_useless(hdw);
|
||||
goto fail;
|
||||
}
|
||||
|
@ -294,7 +298,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
|
|||
int num)
|
||||
{
|
||||
int ret = -ENOTSUPP;
|
||||
pvr2_i2c_func funcp = 0;
|
||||
pvr2_i2c_func funcp = NULL;
|
||||
struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
|
||||
|
||||
if (!num) {
|
||||
|
@ -319,7 +323,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
|
|||
u16 tcnt,bcnt,offs;
|
||||
if (!msgs[0].len) {
|
||||
/* Length == 0 read. This is a probe. */
|
||||
if (funcp(hdw,msgs[0].addr,0,0,0,0)) {
|
||||
if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
|
||||
ret = -EIO;
|
||||
goto done;
|
||||
}
|
||||
|
@ -336,7 +340,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
|
|||
if (bcnt > sizeof(hdw->cmd_buffer)-1) {
|
||||
bcnt = sizeof(hdw->cmd_buffer)-1;
|
||||
}
|
||||
if (funcp(hdw,msgs[0].addr,0,0,
|
||||
if (funcp(hdw,msgs[0].addr,NULL,0,
|
||||
msgs[0].buf+offs,bcnt)) {
|
||||
ret = -EIO;
|
||||
goto done;
|
||||
|
@ -350,7 +354,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
|
|||
/* Simple write */
|
||||
ret = 1;
|
||||
if (funcp(hdw,msgs[0].addr,
|
||||
msgs[0].buf,msgs[0].len,0,0)) {
|
||||
msgs[0].buf,msgs[0].len,NULL,0)) {
|
||||
ret = -EIO;
|
||||
}
|
||||
goto done;
|
||||
|
@ -705,9 +709,9 @@ int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw)
|
|||
return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0;
|
||||
}
|
||||
|
||||
unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
|
||||
unsigned int detail,
|
||||
char *buf,unsigned int maxlen)
|
||||
static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
|
||||
unsigned int detail,
|
||||
char *buf,unsigned int maxlen)
|
||||
{
|
||||
unsigned int ccnt,bcnt;
|
||||
int spcfl = 0;
|
||||
|
@ -871,7 +875,7 @@ static void do_i2c_scan(struct pvr2_hdw *hdw)
|
|||
msg[0].addr = 0;
|
||||
msg[0].flags = I2C_M_RD;
|
||||
msg[0].len = 0;
|
||||
msg[0].buf = 0;
|
||||
msg[0].buf = NULL;
|
||||
printk("%s: i2c scan beginning\n",hdw->name);
|
||||
for (i = 0; i < 128; i++) {
|
||||
msg[0].addr = i;
|
||||
|
|
|
@ -75,9 +75,6 @@ unsigned int pvr2_i2c_report(struct pvr2_hdw *,char *buf,unsigned int maxlen);
|
|||
PVR2_I2C_DETAIL_DEBUG |\
|
||||
PVR2_I2C_DETAIL_HANDLER |\
|
||||
PVR2_I2C_DETAIL_CTLMASK)
|
||||
unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *,
|
||||
unsigned int detail_mask,
|
||||
char *buf,unsigned int maxlen);
|
||||
|
||||
void pvr2_i2c_probe(struct pvr2_hdw *,struct pvr2_i2c_client *);
|
||||
const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx);
|
||||
|
|
|
@ -93,7 +93,7 @@ struct pvr2_buffer {
|
|||
struct urb *purb;
|
||||
};
|
||||
|
||||
const char *pvr2_buffer_state_decode(enum pvr2_buffer_state st)
|
||||
static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state st)
|
||||
{
|
||||
switch (st) {
|
||||
case pvr2_buffer_state_none: return "none";
|
||||
|
@ -104,7 +104,8 @@ const char *pvr2_buffer_state_decode(enum pvr2_buffer_state st)
|
|||
return "unknown";
|
||||
}
|
||||
|
||||
void pvr2_buffer_describe(struct pvr2_buffer *bp,const char *msg)
|
||||
#ifdef SANITY_CHECK_BUFFERS
|
||||
static void pvr2_buffer_describe(struct pvr2_buffer *bp,const char *msg)
|
||||
{
|
||||
pvr2_trace(PVR2_TRACE_INFO,
|
||||
"buffer%s%s %p state=%s id=%d status=%d"
|
||||
|
@ -115,10 +116,11 @@ void pvr2_buffer_describe(struct pvr2_buffer *bp,const char *msg)
|
|||
(bp ? pvr2_buffer_state_decode(bp->state) : "(invalid)"),
|
||||
(bp ? bp->id : 0),
|
||||
(bp ? bp->status : 0),
|
||||
(bp ? bp->stream : 0),
|
||||
(bp ? bp->purb : 0),
|
||||
(bp ? bp->stream : NULL),
|
||||
(bp ? bp->purb : NULL),
|
||||
(bp ? bp->signature : 0));
|
||||
}
|
||||
#endif /* SANITY_CHECK_BUFFERS */
|
||||
|
||||
static void pvr2_buffer_remove(struct pvr2_buffer *bp)
|
||||
{
|
||||
|
@ -284,7 +286,7 @@ static void pvr2_buffer_done(struct pvr2_buffer *bp)
|
|||
pvr2_buffer_wipe(bp);
|
||||
pvr2_buffer_set_none(bp);
|
||||
bp->signature = 0;
|
||||
bp->stream = 0;
|
||||
bp->stream = NULL;
|
||||
if (bp->purb) usb_free_urb(bp->purb);
|
||||
pvr2_trace(PVR2_TRACE_BUF_POOL,"/*---TRACE_FLOW---*/"
|
||||
" bufferDone %p",bp);
|
||||
|
@ -339,13 +341,13 @@ static int pvr2_stream_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
|||
struct pvr2_buffer *bp;
|
||||
bp = sp->buffers[sp->buffer_total_count - 1];
|
||||
/* Paranoia */
|
||||
sp->buffers[sp->buffer_total_count - 1] = 0;
|
||||
sp->buffers[sp->buffer_total_count - 1] = NULL;
|
||||
(sp->buffer_total_count)--;
|
||||
pvr2_buffer_done(bp);
|
||||
kfree(bp);
|
||||
}
|
||||
if (scnt < sp->buffer_slot_count) {
|
||||
struct pvr2_buffer **nb = 0;
|
||||
struct pvr2_buffer **nb = NULL;
|
||||
if (scnt) {
|
||||
nb = kmalloc(scnt * sizeof(*nb),GFP_KERNEL);
|
||||
if (!nb) return -ENOMEM;
|
||||
|
@ -513,10 +515,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp,
|
|||
}
|
||||
|
||||
/* Query / set the nominal buffer count */
|
||||
int pvr2_stream_get_buffer_count(struct pvr2_stream *sp)
|
||||
{
|
||||
return sp->buffer_target_count;
|
||||
}
|
||||
|
||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
||||
{
|
||||
|
@ -532,21 +530,21 @@ int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
|||
struct pvr2_buffer *pvr2_stream_get_idle_buffer(struct pvr2_stream *sp)
|
||||
{
|
||||
struct list_head *lp = sp->idle_list.next;
|
||||
if (lp == &sp->idle_list) return 0;
|
||||
if (lp == &sp->idle_list) return NULL;
|
||||
return list_entry(lp,struct pvr2_buffer,list_overhead);
|
||||
}
|
||||
|
||||
struct pvr2_buffer *pvr2_stream_get_ready_buffer(struct pvr2_stream *sp)
|
||||
{
|
||||
struct list_head *lp = sp->ready_list.next;
|
||||
if (lp == &sp->ready_list) return 0;
|
||||
if (lp == &sp->ready_list) return NULL;
|
||||
return list_entry(lp,struct pvr2_buffer,list_overhead);
|
||||
}
|
||||
|
||||
struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id)
|
||||
{
|
||||
if (id < 0) return 0;
|
||||
if (id >= sp->buffer_total_count) return 0;
|
||||
if (id < 0) return NULL;
|
||||
if (id >= sp->buffer_total_count) return NULL;
|
||||
return sp->buffers[id];
|
||||
}
|
||||
|
||||
|
@ -555,17 +553,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp)
|
|||
return sp->r_count;
|
||||
}
|
||||
|
||||
int pvr2_stream_get_idle_count(struct pvr2_stream *sp)
|
||||
{
|
||||
return sp->i_count;
|
||||
}
|
||||
|
||||
void pvr2_stream_flush(struct pvr2_stream *sp)
|
||||
{
|
||||
mutex_lock(&sp->mutex); do {
|
||||
pvr2_stream_internal_flush(sp);
|
||||
} while(0); mutex_unlock(&sp->mutex);
|
||||
}
|
||||
|
||||
void pvr2_stream_kill(struct pvr2_stream *sp)
|
||||
{
|
||||
|
@ -620,20 +607,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int pvr2_buffer_idle(struct pvr2_buffer *bp)
|
||||
{
|
||||
struct pvr2_stream *sp;
|
||||
if (!bp) return -EINVAL;
|
||||
sp = bp->stream;
|
||||
mutex_lock(&sp->mutex); do {
|
||||
pvr2_buffer_wipe(bp);
|
||||
pvr2_buffer_set_idle(bp);
|
||||
if (sp->buffer_total_count != sp->buffer_target_count) {
|
||||
pvr2_stream_achieve_buffer_count(sp);
|
||||
}
|
||||
} while(0); mutex_unlock(&sp->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
||||
{
|
||||
|
@ -673,10 +646,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp)
|
|||
return bp->status;
|
||||
}
|
||||
|
||||
enum pvr2_buffer_state pvr2_buffer_get_state(struct pvr2_buffer *bp)
|
||||
{
|
||||
return bp->state;
|
||||
}
|
||||
|
||||
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
||||
{
|
||||
|
|
|
@ -36,8 +36,6 @@ enum pvr2_buffer_state {
|
|||
struct pvr2_stream;
|
||||
struct pvr2_buffer;
|
||||
|
||||
const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
|
||||
|
||||
/* Initialize / tear down stream structure */
|
||||
struct pvr2_stream *pvr2_stream_create(void);
|
||||
void pvr2_stream_destroy(struct pvr2_stream *);
|
||||
|
@ -49,7 +47,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *,
|
|||
void *data);
|
||||
|
||||
/* Query / set the nominal buffer count */
|
||||
int pvr2_stream_get_buffer_count(struct pvr2_stream *);
|
||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int);
|
||||
|
||||
/* Get a pointer to a buffer that is either idle, ready, or is specified
|
||||
|
@ -59,12 +56,8 @@ struct pvr2_buffer *pvr2_stream_get_ready_buffer(struct pvr2_stream *);
|
|||
struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id);
|
||||
|
||||
/* Find out how many buffers are idle or ready */
|
||||
int pvr2_stream_get_idle_count(struct pvr2_stream *);
|
||||
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
||||
|
||||
/* Kill all pending operations */
|
||||
void pvr2_stream_flush(struct pvr2_stream *);
|
||||
|
||||
/* Kill all pending buffers and throw away any ready buffers as well */
|
||||
void pvr2_stream_kill(struct pvr2_stream *);
|
||||
|
||||
|
@ -77,18 +70,12 @@ unsigned int pvr2_buffer_get_count(struct pvr2_buffer *);
|
|||
/* Retrieve completion code for given ready buffer */
|
||||
int pvr2_buffer_get_status(struct pvr2_buffer *);
|
||||
|
||||
/* Retrieve state of given buffer */
|
||||
enum pvr2_buffer_state pvr2_buffer_get_state(struct pvr2_buffer *);
|
||||
|
||||
/* Retrieve ID of given buffer */
|
||||
int pvr2_buffer_get_id(struct pvr2_buffer *);
|
||||
|
||||
/* Start reading into given buffer (kill it if needed) */
|
||||
int pvr2_buffer_queue(struct pvr2_buffer *);
|
||||
|
||||
/* Move buffer back to idle pool (kill it if needed) */
|
||||
int pvr2_buffer_idle(struct pvr2_buffer *);
|
||||
|
||||
#endif /* __PVRUSB2_IO_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -54,7 +54,7 @@ static int pvr2_ioread_init(struct pvr2_ioread *cp)
|
|||
{
|
||||
unsigned int idx;
|
||||
|
||||
cp->stream = 0;
|
||||
cp->stream = NULL;
|
||||
mutex_init(&cp->mutex);
|
||||
|
||||
for (idx = 0; idx < BUFFER_COUNT; idx++) {
|
||||
|
@ -77,7 +77,7 @@ static void pvr2_ioread_done(struct pvr2_ioread *cp)
|
|||
{
|
||||
unsigned int idx;
|
||||
|
||||
pvr2_ioread_setup(cp,0);
|
||||
pvr2_ioread_setup(cp,NULL);
|
||||
for (idx = 0; idx < BUFFER_COUNT; idx++) {
|
||||
if (!(cp->buffer_storage[idx])) continue;
|
||||
kfree(cp->buffer_storage[idx]);
|
||||
|
@ -88,12 +88,12 @@ struct pvr2_ioread *pvr2_ioread_create(void)
|
|||
{
|
||||
struct pvr2_ioread *cp;
|
||||
cp = kmalloc(sizeof(*cp),GFP_KERNEL);
|
||||
if (!cp) return 0;
|
||||
if (!cp) return NULL;
|
||||
pvr2_trace(PVR2_TRACE_STRUCT,"pvr2_ioread_create id=%p",cp);
|
||||
memset(cp,0,sizeof(*cp));
|
||||
if (pvr2_ioread_init(cp) < 0) {
|
||||
kfree(cp);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
return cp;
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ void pvr2_ioread_destroy(struct pvr2_ioread *cp)
|
|||
pvr2_trace(PVR2_TRACE_STRUCT,"pvr2_ioread_destroy id=%p",cp);
|
||||
if (cp->sync_key_ptr) {
|
||||
kfree(cp->sync_key_ptr);
|
||||
cp->sync_key_ptr = 0;
|
||||
cp->sync_key_ptr = NULL;
|
||||
}
|
||||
kfree(cp);
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *cp,
|
|||
if (sync_key_len != cp->sync_key_len) {
|
||||
if (cp->sync_key_ptr) {
|
||||
kfree(cp->sync_key_ptr);
|
||||
cp->sync_key_ptr = 0;
|
||||
cp->sync_key_ptr = NULL;
|
||||
}
|
||||
cp->sync_key_len = 0;
|
||||
if (sync_key_len) {
|
||||
|
@ -144,8 +144,8 @@ static void pvr2_ioread_stop(struct pvr2_ioread *cp)
|
|||
pvr2_trace(PVR2_TRACE_START_STOP,
|
||||
"/*---TRACE_READ---*/ pvr2_ioread_stop id=%p",cp);
|
||||
pvr2_stream_kill(cp->stream);
|
||||
cp->c_buf = 0;
|
||||
cp->c_data_ptr = 0;
|
||||
cp->c_buf = NULL;
|
||||
cp->c_data_ptr = NULL;
|
||||
cp->c_data_len = 0;
|
||||
cp->c_data_offs = 0;
|
||||
cp->enabled = 0;
|
||||
|
@ -179,8 +179,8 @@ static int pvr2_ioread_start(struct pvr2_ioread *cp)
|
|||
}
|
||||
}
|
||||
cp->enabled = !0;
|
||||
cp->c_buf = 0;
|
||||
cp->c_data_ptr = 0;
|
||||
cp->c_buf = NULL;
|
||||
cp->c_data_ptr = NULL;
|
||||
cp->c_data_len = 0;
|
||||
cp->c_data_offs = 0;
|
||||
cp->stream_running = 0;
|
||||
|
@ -214,7 +214,7 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp)
|
|||
pvr2_ioread_stop(cp);
|
||||
pvr2_stream_kill(cp->stream);
|
||||
pvr2_stream_set_buffer_count(cp->stream,0);
|
||||
cp->stream = 0;
|
||||
cp->stream = NULL;
|
||||
}
|
||||
if (sp) {
|
||||
pvr2_trace(PVR2_TRACE_START_STOP,
|
||||
|
@ -251,12 +251,8 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int pvr2_ioread_get_enabled(struct pvr2_ioread *cp)
|
||||
{
|
||||
return cp->enabled != 0;
|
||||
}
|
||||
|
||||
int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
||||
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
||||
{
|
||||
int stat;
|
||||
|
||||
|
@ -274,8 +270,8 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
|||
pvr2_ioread_stop(cp);
|
||||
return 0;
|
||||
}
|
||||
cp->c_buf = 0;
|
||||
cp->c_data_ptr = 0;
|
||||
cp->c_buf = NULL;
|
||||
cp->c_data_ptr = NULL;
|
||||
cp->c_data_len = 0;
|
||||
cp->c_data_offs = 0;
|
||||
}
|
||||
|
@ -307,7 +303,7 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
|||
return !0;
|
||||
}
|
||||
|
||||
void pvr2_ioread_filter(struct pvr2_ioread *cp)
|
||||
static void pvr2_ioread_filter(struct pvr2_ioread *cp)
|
||||
{
|
||||
unsigned int idx;
|
||||
if (!cp->enabled) return;
|
||||
|
|
|
@ -33,7 +33,6 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *,
|
|||
const char *sync_key_ptr,
|
||||
unsigned int sync_key_len);
|
||||
int pvr2_ioread_set_enabled(struct pvr2_ioread *,int fl);
|
||||
int pvr2_ioread_get_enabled(struct pvr2_ioread *);
|
||||
int pvr2_ioread_read(struct pvr2_ioread *,void __user *buf,unsigned int cnt);
|
||||
int pvr2_ioread_avail(struct pvr2_ioread *);
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ module_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR);
|
|||
MODULE_PARM_DESC(debug, "Debug trace mask");
|
||||
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
|
||||
static struct pvr2_sysfs_class *class_ptr = 0;
|
||||
static struct pvr2_sysfs_class *class_ptr = NULL;
|
||||
#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
|
||||
|
||||
static void pvr_setup_attach(struct pvr2_context *pvr)
|
||||
|
@ -104,10 +104,10 @@ static void pvr_disconnect(struct usb_interface *intf)
|
|||
}
|
||||
|
||||
static struct usb_driver pvr_driver = {
|
||||
name: "pvrusb2",
|
||||
id_table: pvr2_device_table,
|
||||
probe: pvr_probe,
|
||||
disconnect: pvr_disconnect
|
||||
.name = "pvrusb2",
|
||||
.id_table = pvr2_device_table,
|
||||
.probe = pvr_probe,
|
||||
.disconnect = pvr_disconnect
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -121,7 +121,7 @@ static const struct std_name *find_std_name(const struct std_name *arrPtr,
|
|||
if (strlen(p->name) != bufSize) continue;
|
||||
if (!memcmp(bufPtr,p->name,bufSize)) return p;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -289,7 +289,7 @@ static struct v4l2_standard *match_std(v4l2_std_id id)
|
|||
return generic_standards + idx;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int pvr2_std_fill(struct v4l2_standard *std,v4l2_std_id id)
|
||||
|
@ -364,7 +364,7 @@ struct v4l2_standard *pvr2_std_create_enum(unsigned int *countptr,
|
|||
|
||||
pvr2_trace(PVR2_TRACE_INIT,"Setting up %u unique standard(s)",
|
||||
std_cnt);
|
||||
if (!std_cnt) return 0; // paranoia
|
||||
if (!std_cnt) return NULL; // paranoia
|
||||
|
||||
stddefs = kmalloc(sizeof(struct v4l2_standard) * std_cnt,
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -504,7 +504,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
|
|||
cip->cptr = cptr;
|
||||
|
||||
cip->chptr = sfp;
|
||||
cip->item_next = 0;
|
||||
cip->item_next = NULL;
|
||||
if (sfp->item_last) {
|
||||
sfp->item_last->item_next = cip;
|
||||
} else {
|
||||
|
@ -625,7 +625,7 @@ static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
|
|||
&sfp->debugifc->attr_debuginfo);
|
||||
class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd);
|
||||
kfree(sfp->debugifc);
|
||||
sfp->debugifc = 0;
|
||||
sfp->debugifc = NULL;
|
||||
}
|
||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||
|
||||
|
@ -678,9 +678,9 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp)
|
|||
class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
||||
class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
|
||||
sfp->class_dev->class_data = 0;
|
||||
sfp->class_dev->class_data = NULL;
|
||||
class_device_unregister(sfp->class_dev);
|
||||
sfp->class_dev = 0;
|
||||
sfp->class_dev = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -739,13 +739,13 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
|||
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
||||
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
||||
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
||||
sfp->attr_v4l_minor_number.store = 0;
|
||||
sfp->attr_v4l_minor_number.store = NULL;
|
||||
class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
||||
sfp->attr_unit_number.attr.owner = THIS_MODULE;
|
||||
sfp->attr_unit_number.attr.name = "unit_number";
|
||||
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
||||
sfp->attr_unit_number.show = unit_number_show;
|
||||
sfp->attr_unit_number.store = 0;
|
||||
sfp->attr_unit_number.store = NULL;
|
||||
class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||
|
||||
pvr2_sysfs_add_controls(sfp);
|
||||
|
@ -806,7 +806,7 @@ struct pvr2_sysfs_class *pvr2_sysfs_class_create(void)
|
|||
pvr2_sysfs_trace(
|
||||
"Registration failed for pvr2_sysfs_class id=%p",clp);
|
||||
kfree(clp);
|
||||
clp = 0;
|
||||
clp = NULL;
|
||||
}
|
||||
return clp;
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ static void tuner_update(struct pvr2_tuner_handler *ctxt)
|
|||
|
||||
static void pvr2_tuner_detach(struct pvr2_tuner_handler *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
ctxt->client->handler = NULL;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
|
|||
module_param_array(video_nr, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(video_nr, "Offset for device's minor");
|
||||
|
||||
struct v4l2_capability pvr_capability ={
|
||||
static struct v4l2_capability pvr_capability ={
|
||||
.driver = "pvrusb2",
|
||||
.card = "Hauppauge WinTV pvr-usb2",
|
||||
.bus_info = "usb",
|
||||
|
@ -111,7 +111,7 @@ static struct v4l2_tuner pvr_v4l2_tuners[]= {
|
|||
}
|
||||
};
|
||||
|
||||
struct v4l2_fmtdesc pvr_fmtdesc [] = {
|
||||
static struct v4l2_fmtdesc pvr_fmtdesc [] = {
|
||||
{
|
||||
.index = 0,
|
||||
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
||||
|
@ -127,7 +127,7 @@ struct v4l2_fmtdesc pvr_fmtdesc [] = {
|
|||
#define PVR_FORMAT_PIX 0
|
||||
#define PVR_FORMAT_VBI 1
|
||||
|
||||
struct v4l2_format pvr_format [] = {
|
||||
static struct v4l2_format pvr_format [] = {
|
||||
[PVR_FORMAT_PIX] = {
|
||||
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
||||
.fmt = {
|
||||
|
@ -701,9 +701,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
|||
|
||||
static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
|
||||
{
|
||||
pvr2_trace(PVR2_TRACE_INIT,
|
||||
"unregistering device video%d [%s]",
|
||||
dip->vdev->minor,pvr2_config_get_name(dip->config));
|
||||
printk(KERN_INFO "pvrusb2: unregistering device video%d [%s]\n",
|
||||
dip->vdev->minor,pvr2_config_get_name(dip->config));
|
||||
if (dip->ctxt_idx >= 0) {
|
||||
mutex_lock(&device_lock);
|
||||
devices[dip->ctxt_idx] = NULL;
|
||||
|
@ -725,7 +724,7 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp)
|
|||
}
|
||||
|
||||
|
||||
void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
|
||||
static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
|
||||
{
|
||||
struct pvr2_v4l2 *vp;
|
||||
vp = container_of(chp,struct pvr2_v4l2,channel);
|
||||
|
@ -735,8 +734,8 @@ void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
||||
/* Temporary hack : use ivtv api until a v4l2 one is available. */
|
||||
|
@ -747,7 +746,7 @@ int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
|
|||
}
|
||||
|
||||
|
||||
int pvr2_v4l2_release(struct inode *inode, struct file *file)
|
||||
static int pvr2_v4l2_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct pvr2_v4l2_fh *fhp = file->private_data;
|
||||
struct pvr2_v4l2 *vp = fhp->vhead;
|
||||
|
@ -761,9 +760,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file)
|
|||
hdw = fhp->channel.mc_head->hdw;
|
||||
pvr2_hdw_set_streaming(hdw,0);
|
||||
sp = pvr2_ioread_get_stream(fhp->rhp);
|
||||
if (sp) pvr2_stream_set_callback(sp,0,0);
|
||||
if (sp) pvr2_stream_set_callback(sp,NULL,NULL);
|
||||
pvr2_ioread_destroy(fhp->rhp);
|
||||
fhp->rhp = 0;
|
||||
fhp->rhp = NULL;
|
||||
}
|
||||
v4l2_prio_close(&vp->prio, &fhp->prio);
|
||||
file->private_data = NULL;
|
||||
|
@ -779,9 +778,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file)
|
|||
} else {
|
||||
vp->vfirst = fhp->vnext;
|
||||
}
|
||||
fhp->vnext = 0;
|
||||
fhp->vprev = 0;
|
||||
fhp->vhead = 0;
|
||||
fhp->vnext = NULL;
|
||||
fhp->vprev = NULL;
|
||||
fhp->vhead = NULL;
|
||||
pvr2_channel_done(&fhp->channel);
|
||||
pvr2_trace(PVR2_TRACE_STRUCT,
|
||||
"Destroying pvr_v4l2_fh id=%p",fhp);
|
||||
|
@ -794,9 +793,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
|
||||
int pvr2_v4l2_open(struct inode *inode, struct file *file)
|
||||
static int pvr2_v4l2_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct pvr2_v4l2_dev *dip = 0; /* Our own context pointer */
|
||||
struct pvr2_v4l2_dev *dip = NULL; /* Our own context pointer */
|
||||
struct pvr2_v4l2_fh *fhp;
|
||||
struct pvr2_v4l2 *vp;
|
||||
struct pvr2_hdw *hdw;
|
||||
|
@ -854,7 +853,7 @@ int pvr2_v4l2_open(struct inode *inode, struct file *file)
|
|||
pvr2_context_enter(vp->channel.mc_head); do {
|
||||
pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
|
||||
pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
|
||||
fhp->vnext = 0;
|
||||
fhp->vnext = NULL;
|
||||
fhp->vprev = vp->vlast;
|
||||
if (vp->vlast) {
|
||||
vp->vlast->vnext = fhp;
|
||||
|
@ -897,7 +896,7 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
|
|||
|
||||
fh->rhp = pvr2_channel_create_mpeg_stream(fh->dev_info->stream);
|
||||
if (!fh->rhp) {
|
||||
pvr2_channel_claim_stream(&fh->channel,0);
|
||||
pvr2_channel_claim_stream(&fh->channel,NULL);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -1078,9 +1077,8 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
|
|||
(video_register_device(dip->vdev, v4l_type, -1) < 0)) {
|
||||
err("Failed to register pvrusb2 v4l video device");
|
||||
} else {
|
||||
pvr2_trace(PVR2_TRACE_INIT,
|
||||
"registered device video%d [%s]",
|
||||
dip->vdev->minor,pvr2_config_get_name(dip->config));
|
||||
printk(KERN_INFO "pvrusb2: registered device video%d [%s]\n",
|
||||
dip->vdev->minor,pvr2_config_get_name(dip->config));
|
||||
}
|
||||
|
||||
if ((dip->vdev->minor < sizeof(devices)/sizeof(devices[0])) &&
|
||||
|
|
|
@ -126,8 +126,8 @@ static const struct pvr2_v4l_decoder_ops decoder_ops[] = {
|
|||
|
||||
static void decoder_detach(struct pvr2_v4l_decoder *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
ctxt->hdw->decoder_ctrl = 0;
|
||||
ctxt->client->handler = NULL;
|
||||
ctxt->hdw->decoder_ctrl = NULL;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ static unsigned int wm8775_describe(struct pvr2_v4l_wm8775 *ctxt,
|
|||
|
||||
static void wm8775_detach(struct pvr2_v4l_wm8775 *ctxt)
|
||||
{
|
||||
ctxt->client->handler = 0;
|
||||
ctxt->client->handler = NULL;
|
||||
kfree(ctxt);
|
||||
}
|
||||
|
||||
|
|
|
@ -942,8 +942,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
|
|||
/* load i2c helpers */
|
||||
if (TUNER_ABSENT != dev->tuner_type)
|
||||
request_module("tuner");
|
||||
if (dev->tda9887_conf)
|
||||
request_module("tda9887");
|
||||
if (card_is_empress(dev)) {
|
||||
request_module("saa6752hs");
|
||||
request_module_depend("saa7134-empress",&need_empress);
|
||||
|
|
|
@ -590,8 +590,8 @@ int tda9887_tuner_init(struct i2c_client *c)
|
|||
t->set_tv_freq = tda9887_set_freq;
|
||||
t->set_radio_freq = tda9887_set_freq;
|
||||
t->standby = tda9887_standby;
|
||||
t->tuner_status=tda9887_tuner_status;
|
||||
t->get_afc=tda9887_get_afc;
|
||||
t->tuner_status = tda9887_tuner_status;
|
||||
t->get_afc = tda9887_get_afc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -416,7 +416,7 @@ static void tuner_status(struct i2c_client *client)
|
|||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
/* static var Used only in tuner_attach and tuner_probe */
|
||||
/* static vars: used only in tuner_attach and tuner_probe */
|
||||
static unsigned default_mode_mask;
|
||||
|
||||
/* During client attach, set_type is called by adapter's attach_inform callback.
|
||||
|
@ -608,13 +608,13 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
||||
break;
|
||||
case TDA9887_SET_CONFIG:
|
||||
{
|
||||
int *i = arg;
|
||||
if (t->type == TUNER_TDA9887) {
|
||||
int *i = arg;
|
||||
|
||||
t->tda9887_config = *i;
|
||||
set_freq(client, t->tv_freq);
|
||||
t->tda9887_config = *i;
|
||||
set_freq(client, t->tv_freq);
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* --- v4l ioctls --- */
|
||||
/* take care: bttv does userspace copying, we'll get a
|
||||
kernel pointer here... */
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/videodev.h>
|
||||
#include <media/tuner.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
static int offset = 0;
|
||||
module_param(offset, int, 0666);
|
||||
|
@ -128,6 +129,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
u8 buffer[4];
|
||||
int rc, IFPCoff, i, j;
|
||||
enum param_type desired_type;
|
||||
struct tuner_params *params;
|
||||
|
||||
tun = &tuners[t->type];
|
||||
|
||||
|
@ -169,19 +171,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
IFPCoff,t->type);
|
||||
j = 0;
|
||||
}
|
||||
params = &tun->params[j];
|
||||
|
||||
for (i = 0; i < tun->params[j].count; i++) {
|
||||
if (freq > tun->params[j].ranges[i].limit)
|
||||
for (i = 0; i < params->count; i++) {
|
||||
if (freq > params->ranges[i].limit)
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (i == tun->params[j].count) {
|
||||
if (i == params->count) {
|
||||
tuner_dbg("TV frequency out of range (%d > %d)",
|
||||
freq, tun->params[j].ranges[i - 1].limit);
|
||||
freq = tun->params[j].ranges[--i].limit;
|
||||
freq, params->ranges[i - 1].limit);
|
||||
freq = params->ranges[--i].limit;
|
||||
}
|
||||
config = tun->params[j].ranges[i].config;
|
||||
cb = tun->params[j].ranges[i].cb;
|
||||
config = params->ranges[i].config;
|
||||
cb = params->ranges[i].cb;
|
||||
/* i == 0 -> VHF_LO
|
||||
* i == 1 -> VHF_HI
|
||||
* i == 2 -> UHF */
|
||||
|
@ -281,7 +284,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
break;
|
||||
}
|
||||
|
||||
if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) {
|
||||
if (params->cb_first_if_lower_freq && div < t->last_div) {
|
||||
buffer[0] = config;
|
||||
buffer[1] = cb;
|
||||
buffer[2] = (div>>8) & 0x7f;
|
||||
|
@ -293,6 +296,43 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
buffer[3] = cb;
|
||||
}
|
||||
t->last_div = div;
|
||||
if (params->has_tda9887) {
|
||||
int config = 0;
|
||||
int is_secam_l = (t->std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) &&
|
||||
!(t->std & ~(V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC));
|
||||
|
||||
if (t->std == V4L2_STD_SECAM_LC) {
|
||||
if (params->port1_active ^ params->port1_invert_for_secam_lc)
|
||||
config |= TDA9887_PORT1_ACTIVE;
|
||||
if (params->port2_active ^ params->port2_invert_for_secam_lc)
|
||||
config |= TDA9887_PORT2_ACTIVE;
|
||||
}
|
||||
else {
|
||||
if (params->port1_active)
|
||||
config |= TDA9887_PORT1_ACTIVE;
|
||||
if (params->port2_active)
|
||||
config |= TDA9887_PORT2_ACTIVE;
|
||||
}
|
||||
if (params->intercarrier_mode)
|
||||
config |= TDA9887_INTERCARRIER;
|
||||
if (is_secam_l) {
|
||||
if (i == 0 && params->default_top_secam_low)
|
||||
config |= TDA9887_TOP(params->default_top_secam_low);
|
||||
else if (i == 1 && params->default_top_secam_mid)
|
||||
config |= TDA9887_TOP(params->default_top_secam_mid);
|
||||
else if (params->default_top_secam_high)
|
||||
config |= TDA9887_TOP(params->default_top_secam_high);
|
||||
}
|
||||
else {
|
||||
if (i == 0 && params->default_top_low)
|
||||
config |= TDA9887_TOP(params->default_top_low);
|
||||
else if (i == 1 && params->default_top_mid)
|
||||
config |= TDA9887_TOP(params->default_top_mid);
|
||||
else if (params->default_top_high)
|
||||
config |= TDA9887_TOP(params->default_top_high);
|
||||
}
|
||||
i2c_clients_command(c->adapter, TDA9887_SET_CONFIG, &config);
|
||||
}
|
||||
tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||
buffer[0],buffer[1],buffer[2],buffer[3]);
|
||||
|
||||
|
@ -339,6 +379,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
|
|||
u16 div;
|
||||
int rc, j;
|
||||
enum param_type desired_type = TUNER_PARAM_TYPE_RADIO;
|
||||
struct tuner_params *params;
|
||||
|
||||
tun = &tuners[t->type];
|
||||
|
||||
|
@ -352,7 +393,8 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
|
|||
j = 0;
|
||||
|
||||
div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */
|
||||
buffer[2] = (tun->params[j].ranges[0].config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */
|
||||
params = &tun->params[j];
|
||||
buffer[2] = (params->ranges[0].config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */
|
||||
|
||||
switch (t->type) {
|
||||
case TUNER_TENA_9533_DI:
|
||||
|
@ -384,7 +426,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
|
|||
}
|
||||
buffer[0] = (div>>8) & 0x7f;
|
||||
buffer[1] = div & 0xff;
|
||||
if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) {
|
||||
if (params->cb_first_if_lower_freq && div < t->last_div) {
|
||||
buffer[0] = buffer[2];
|
||||
buffer[1] = buffer[3];
|
||||
buffer[2] = (div>>8) & 0x7f;
|
||||
|
@ -398,6 +440,18 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
|
|||
buffer[0],buffer[1],buffer[2],buffer[3]);
|
||||
t->last_div = div;
|
||||
|
||||
if (params->has_tda9887) {
|
||||
int config = 0;
|
||||
if (params->port1_active && !params->port1_fm_high_sensitivity)
|
||||
config |= TDA9887_PORT1_ACTIVE;
|
||||
if (params->port2_active && !params->port2_fm_high_sensitivity)
|
||||
config |= TDA9887_PORT2_ACTIVE;
|
||||
if (params->intercarrier_mode)
|
||||
config |= TDA9887_INTERCARRIER;
|
||||
/* if (params->port1_set_for_fm_mono)
|
||||
config &= ~TDA9887_PORT1_ACTIVE;*/
|
||||
i2c_clients_command(c->adapter, TDA9887_SET_CONFIG, &config);
|
||||
}
|
||||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||
}
|
||||
|
|
|
@ -380,6 +380,10 @@ static struct tuner_params tuner_philips_fq1216me_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_lg_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_lg_pal_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_active = 1,
|
||||
.port2_invert_for_secam_lc = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -542,6 +546,14 @@ static struct tuner_params tuner_fm1216me_mk3_params[] = {
|
|||
.ranges = tuner_fm1216me_mk3_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_fm1216me_mk3_pal_ranges),
|
||||
.cb_first_if_lower_freq = 1,
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_active = 1,
|
||||
.port2_invert_for_secam_lc = 1,
|
||||
.port1_fm_high_sensitivity = 1,
|
||||
.default_top_mid = -2,
|
||||
.default_top_secam_mid = -2,
|
||||
.default_top_secam_high = -2,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -612,6 +624,10 @@ static struct tuner_params tuner_fm1236_mk3_params[] = {
|
|||
.ranges = tuner_fm1236_mk3_ntsc_ranges,
|
||||
.count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges),
|
||||
.cb_first_if_lower_freq = 1,
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_active = 1,
|
||||
.port1_fm_high_sensitivity = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -632,6 +648,8 @@ static struct tuner_params tuner_microtune_4049_fm5_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_temic_4009f_5_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_temic_4009f_5_pal_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.port1_invert_for_secam_lc = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -648,6 +666,8 @@ static struct tuner_params tuner_panasonic_vp27_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_NTSC,
|
||||
.ranges = tuner_panasonic_vp27_ntsc_ranges,
|
||||
.count = ARRAY_SIZE(tuner_panasonic_vp27_ntsc_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.intercarrier_mode = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -782,6 +802,13 @@ static struct tuner_params tuner_philips_fq1216ame_mk4_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_philips_fq12_6a___mk4_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_philips_fq12_6a___mk4_pal_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_invert_for_secam_lc = 1,
|
||||
.default_top_mid = -2,
|
||||
.default_top_secam_low = -2,
|
||||
.default_top_secam_mid = -2,
|
||||
.default_top_secam_high = -2,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -870,6 +897,12 @@ static struct tuner_params tuner_philips_fmd1216me_mk3_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_philips_fmd1216me_mk3_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_philips_fmd1216me_mk3_pal_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_active = 1,
|
||||
.port2_fm_high_sensitivity = 1,
|
||||
.port2_invert_for_secam_lc = 1,
|
||||
.port1_set_for_fm_mono = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1005,6 +1038,7 @@ static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_NTSC,
|
||||
.ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges,
|
||||
.count = ARRAY_SIZE(tuner_samsung_tcpn_2121p30a_ntsc_ranges),
|
||||
.has_tda9887 = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1037,6 +1071,10 @@ static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_samsung_tcpg_6121p30a_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_samsung_tcpg_6121p30a_pal_ranges),
|
||||
.has_tda9887 = 1,
|
||||
.port1_active = 1,
|
||||
.port2_active = 1,
|
||||
.port2_invert_for_secam_lc = 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -73,14 +73,14 @@ static struct HAUPPAUGE_TUNER_FMT
|
|||
}
|
||||
hauppauge_tuner_fmt[] =
|
||||
{
|
||||
{ V4L2_STD_UNKNOWN," UNKNOWN" },
|
||||
{ V4L2_STD_UNKNOWN," FM" },
|
||||
{ V4L2_STD_PAL_BG, " PAL(B/G)" },
|
||||
{ V4L2_STD_NTSC_M, " NTSC(M)" },
|
||||
{ V4L2_STD_PAL_I, " PAL(I)" },
|
||||
{ V4L2_STD_SECAM_L," SECAM(L/L')" },
|
||||
{ V4L2_STD_PAL_DK, " PAL(D/D1/K)" },
|
||||
{ V4L2_STD_ATSC, " ATSC/DVB Digital" },
|
||||
{ V4L2_STD_UNKNOWN, " UNKNOWN" },
|
||||
{ V4L2_STD_UNKNOWN, " FM" },
|
||||
{ V4L2_STD_B|V4L2_STD_GH, " PAL(B/G)" },
|
||||
{ V4L2_STD_MN, " NTSC(M)" },
|
||||
{ V4L2_STD_PAL_I, " PAL(I)" },
|
||||
{ V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC, " SECAM(L/L')" },
|
||||
{ V4L2_STD_DK, " PAL(D/D1/K)" },
|
||||
{ V4L2_STD_ATSC, " ATSC/DVB Digital" },
|
||||
};
|
||||
|
||||
/* This is the full list of possible tuners. Many thanks to Hauppauge for
|
||||
|
@ -219,7 +219,7 @@ hauppauge_tuner[] =
|
|||
{ TUNER_ABSENT, "Thompson DTT75105"},
|
||||
{ TUNER_ABSENT, "Conexant_CX24109"},
|
||||
{ TUNER_TCL_2002N, "TCL M2523_5N_E"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DB_E"},
|
||||
{ TUNER_TCL_2002MB, "TCL M2523_3DB_E"},
|
||||
{ TUNER_ABSENT, "Philips 8275A"},
|
||||
{ TUNER_ABSENT, "Microtune MT2060"},
|
||||
{ TUNER_ABSENT, "Philips FM1236 MK5"},
|
||||
|
|
|
@ -222,14 +222,14 @@ M zr36055[1] 0001 0000c001 00000000 (zr36050[1])
|
|||
/* ========================= */
|
||||
|
||||
struct vfe_polarity {
|
||||
int vsync_pol:1;
|
||||
int hsync_pol:1;
|
||||
int field_pol:1;
|
||||
int blank_pol:1;
|
||||
int subimg_pol:1;
|
||||
int poe_pol:1;
|
||||
int pvalid_pol:1;
|
||||
int vclk_pol:1;
|
||||
unsigned int vsync_pol:1;
|
||||
unsigned int hsync_pol:1;
|
||||
unsigned int field_pol:1;
|
||||
unsigned int blank_pol:1;
|
||||
unsigned int subimg_pol:1;
|
||||
unsigned int poe_pol:1;
|
||||
unsigned int pvalid_pol:1;
|
||||
unsigned int vclk_pol:1;
|
||||
};
|
||||
|
||||
struct vfe_settings {
|
||||
|
|
|
@ -20,6 +20,7 @@ struct tuner_range {
|
|||
|
||||
struct tuner_params {
|
||||
enum param_type type;
|
||||
|
||||
/* Many Philips based tuners have a comment like this in their
|
||||
* datasheet:
|
||||
*
|
||||
|
@ -39,6 +40,60 @@ struct tuner_params {
|
|||
* static unless the control byte was sent first.
|
||||
*/
|
||||
unsigned int cb_first_if_lower_freq:1;
|
||||
/* Set to 1 if this tuner uses a tda9887 */
|
||||
unsigned int has_tda9887:1;
|
||||
/* Many Philips tuners use tda9887 PORT1 to select the FM radio
|
||||
sensitivity. If this setting is 1, then set PORT1 to 1 to
|
||||
get proper FM reception. */
|
||||
unsigned int port1_fm_high_sensitivity:1;
|
||||
/* Some Philips tuners use tda9887 PORT2 to select the FM radio
|
||||
sensitivity. If this setting is 1, then set PORT2 to 1 to
|
||||
get proper FM reception. */
|
||||
unsigned int port2_fm_high_sensitivity:1;
|
||||
/* Most tuners with a tda9887 use QSS mode. Some (cheaper) tuners
|
||||
use Intercarrier mode. If this setting is 1, then the tuner
|
||||
needs to be set to intercarrier mode. */
|
||||
unsigned int intercarrier_mode:1;
|
||||
/* This setting sets the default value for PORT1.
|
||||
0 means inactive, 1 means active. Note: the actual bit
|
||||
value written to the tda9887 is inverted. So a 0 here
|
||||
means a 1 in the B6 bit. */
|
||||
unsigned int port1_active:1;
|
||||
/* This setting sets the default value for PORT2.
|
||||
0 means inactive, 1 means active. Note: the actual bit
|
||||
value written to the tda9887 is inverted. So a 0 here
|
||||
means a 1 in the B7 bit. */
|
||||
unsigned int port2_active:1;
|
||||
/* Sometimes PORT1 is inverted when the SECAM-L' standard is selected.
|
||||
Set this bit to 1 if this is needed. */
|
||||
unsigned int port1_invert_for_secam_lc:1;
|
||||
/* Sometimes PORT2 is inverted when the SECAM-L' standard is selected.
|
||||
Set this bit to 1 if this is needed. */
|
||||
unsigned int port2_invert_for_secam_lc:1;
|
||||
/* Some cards require PORT1 to be 1 for mono Radio FM and 0 for stereo. */
|
||||
unsigned int port1_set_for_fm_mono:1;
|
||||
/* Default tda9887 TOP value in dB for the low band. Default is 0.
|
||||
Range: -16:+15 */
|
||||
signed int default_top_low:5;
|
||||
/* Default tda9887 TOP value in dB for the mid band. Default is 0.
|
||||
Range: -16:+15 */
|
||||
signed int default_top_mid:5;
|
||||
/* Default tda9887 TOP value in dB for the high band. Default is 0.
|
||||
Range: -16:+15 */
|
||||
signed int default_top_high:5;
|
||||
/* Default tda9887 TOP value in dB for SECAM-L/L' for the low band.
|
||||
Default is 0. Several tuners require a different TOP value for
|
||||
the SECAM-L/L' standards. Range: -16:+15 */
|
||||
signed int default_top_secam_low:5;
|
||||
/* Default tda9887 TOP value in dB for SECAM-L/L' for the mid band.
|
||||
Default is 0. Several tuners require a different TOP value for
|
||||
the SECAM-L/L' standards. Range: -16:+15 */
|
||||
signed int default_top_secam_mid:5;
|
||||
/* Default tda9887 TOP value in dB for SECAM-L/L' for the high band.
|
||||
Default is 0. Several tuners require a different TOP value for
|
||||
the SECAM-L/L' standards. Range: -16:+15 */
|
||||
signed int default_top_secam_high:5;
|
||||
|
||||
|
||||
unsigned int count;
|
||||
struct tuner_range *ranges;
|
||||
|
|
Загрузка…
Ссылка в новой задаче