提交 1cfef5ed 编写于 作者: L Linus Torvalds

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
...@@ -50,3 +50,4 @@ ...@@ -50,3 +50,4 @@
49 -> PixelView PlayTV P7000 [1554:4813] 49 -> PixelView PlayTV P7000 [1554:4813]
50 -> NPG Tech Real TV FM Top 10 [14f1:0842] 50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
51 -> WinFast DTV2000 H [107d:665e] 51 -> WinFast DTV2000 H [107d:665e]
52 -> Geniatech DVB-S [14f1:0084]
...@@ -570,7 +570,8 @@ static int dvb_frontend_thread(void *data) ...@@ -570,7 +570,8 @@ static int dvb_frontend_thread(void *data)
dvb_frontend_add_event(fe, s); dvb_frontend_add_event(fe, s);
fepriv->status = s; fepriv->status = s;
} }
} } else
dvb_frontend_swzigzag(fe);
} else } else
dvb_frontend_swzigzag(fe); dvb_frontend_swzigzag(fe);
} }
...@@ -975,6 +976,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file, ...@@ -975,6 +976,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
case FE_SET_FRONTEND_TUNE_MODE: case FE_SET_FRONTEND_TUNE_MODE:
fepriv->tune_mode_flags = (unsigned long) parg; fepriv->tune_mode_flags = (unsigned long) parg;
err = 0;
break; break;
}; };
......
...@@ -134,6 +134,7 @@ static int cx22700_set_tps (struct cx22700_state *state, struct dvb_ofdm_paramet ...@@ -134,6 +134,7 @@ static int cx22700_set_tps (struct cx22700_state *state, struct dvb_ofdm_paramet
return -EINVAL; return -EINVAL;
if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8) 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) if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5)
return -EINVAL; return -EINVAL;
......
...@@ -670,10 +670,10 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage ...@@ -670,10 +670,10 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
switch (voltage) { switch (voltage) {
case SEC_VOLTAGE_13: case SEC_VOLTAGE_13:
dprintk("%s: setting voltage 13V\n", __FUNCTION__); 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: case SEC_VOLTAGE_18:
dprintk("%s: setting voltage 18V\n", __FUNCTION__); dprintk("%s: setting voltage 18V\n", __FUNCTION__);
return cx24123_writereg(state, 0x29, val & 0x7f); return cx24123_writereg(state, 0x29, val | 0x80);
default: default:
return -EINVAL; return -EINVAL;
}; };
......
...@@ -1141,6 +1141,15 @@ static void frontend_init(struct budget_av *budget_av) ...@@ -1141,6 +1141,15 @@ static void frontend_init(struct budget_av *budget_av)
break; break;
case SUBID_DVBC_KNC1: 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_KNC1_PLUS:
case SUBID_DVBC_CINERGY1200: case SUBID_DVBC_CINERGY1200:
budget_av->reinitialise_demod = 1; budget_av->reinitialise_demod = 1;
...@@ -1293,11 +1302,7 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio ...@@ -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; budget_av->budget.dvb_adapter.priv = budget_av;
frontend_init(budget_av); frontend_init(budget_av);
ciintf_init(budget_av);
if (!budget_av->has_saa7113) {
ciintf_init(budget_av);
}
return 0; return 0;
} }
......
...@@ -3548,11 +3548,6 @@ void __devinit bttv_init_card2(struct bttv *btv) ...@@ -3548,11 +3548,6 @@ void __devinit bttv_init_card2(struct bttv *btv)
/* Hybrid DVB card, DOES have a tda9887 */ /* Hybrid DVB card, DOES have a tda9887 */
if (btv->c.type == BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE) if (btv->c.type == BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE)
tda9887 = 1; 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) if (btv->tuner_type != UNSET)
request_module("tuner"); request_module("tuner");
} }
......
...@@ -686,6 +686,39 @@ static struct videobuf_queue_ops blackbird_qops = { ...@@ -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, static int mpeg_do_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *arg) unsigned int cmd, void *arg)
{ {
...@@ -866,6 +899,16 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file, ...@@ -866,6 +899,16 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
core->name); core->name);
return 0; 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: default:
return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl); return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl);
......
...@@ -1194,6 +1194,21 @@ struct cx88_board cx88_boards[] = { ...@@ -1194,6 +1194,21 @@ struct cx88_board cx88_boards[] = {
}}, }},
.dvb = 1, .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); const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
...@@ -1439,6 +1454,10 @@ struct cx88_subid cx88_subids[] = { ...@@ -1439,6 +1454,10 @@ struct cx88_subid cx88_subids[] = {
.subvendor = 0x18ac, .subvendor = 0x18ac,
.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */ .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
.card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, .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); 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 ...@@ -496,6 +496,26 @@ static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t
return 0; 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 = { static struct cx24123_config hauppauge_novas_config = {
.demod_address = 0x55, .demod_address = 0x55,
.set_ts_params = cx24123_set_ts_param, .set_ts_params = cx24123_set_ts_param,
...@@ -760,6 +780,14 @@ static int dvb_register(struct cx8802_dev *dev) ...@@ -760,6 +780,14 @@ static int dvb_register(struct cx8802_dev *dev)
dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage; dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
} }
break; 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 #endif
default: default:
printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
......
...@@ -327,6 +327,51 @@ static struct cx88_ctrl cx8800_ctls[] = { ...@@ -327,6 +327,51 @@ static struct cx88_ctrl cx8800_ctls[] = {
}; };
static const int CX8800_CTLS = ARRAY_SIZE(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 */ /* resource management */
...@@ -1362,20 +1407,8 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, ...@@ -1362,20 +1407,8 @@ int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
case VIDIOC_QUERYCTRL: case VIDIOC_QUERYCTRL:
{ {
struct v4l2_queryctrl *c = arg; struct v4l2_queryctrl *c = arg;
int i;
if (c->id < V4L2_CID_BASE || return cx88_queryctrl(c);
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;
} }
case VIDIOC_G_CTRL: case VIDIOC_G_CTRL:
return get_control(core,arg); return get_control(core,arg);
...@@ -1893,8 +1926,6 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev, ...@@ -1893,8 +1926,6 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
/* load and configure helper modules */ /* load and configure helper modules */
if (TUNER_ABSENT != core->tuner_type) if (TUNER_ABSENT != core->tuner_type)
request_module("tuner"); request_module("tuner");
if (core->tda9887_conf)
request_module("tda9887");
/* register v4l devices */ /* register v4l devices */
dev->video_dev = cx88_vdev_init(core,dev->pci, dev->video_dev = cx88_vdev_init(core,dev->pci,
......
...@@ -196,6 +196,7 @@ extern struct sram_channel cx88_sram_channels[]; ...@@ -196,6 +196,7 @@ extern struct sram_channel cx88_sram_channels[];
#define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49 #define CX88_BOARD_PIXELVIEW_PLAYTV_P7000 49
#define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50 #define CX88_BOARD_NPGTECH_REALTV_TOP10FM 50
#define CX88_BOARD_WINFAST_DTV2000H 51 #define CX88_BOARD_WINFAST_DTV2000H 51
#define CX88_BOARD_GENIATECH_DVBS 52
enum cx88_itype { enum cx88_itype {
CX88_VMUX_COMPOSITE1 = 1, CX88_VMUX_COMPOSITE1 = 1,
...@@ -590,6 +591,8 @@ int cx8802_resume_common(struct pci_dev *pci_dev); ...@@ -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, extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
struct cx88_core *core, unsigned int cmd, struct cx88_core *core, unsigned int cmd,
void *arg, v4l2_kioctl driver_ioctl); void *arg, v4l2_kioctl driver_ioctl);
extern const u32 cx88_user_ctrls[];
extern int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl);
/* /*
* Local variables: * Local variables:
......
...@@ -1574,8 +1574,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, ...@@ -1574,8 +1574,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
request_module("tvp5150"); request_module("tvp5150");
if (dev->has_tuner) if (dev->has_tuner)
request_module("tuner"); request_module("tuner");
if (dev->tda9887_conf)
request_module("tda9887");
#endif #endif
errCode = em28xx_config(dev); errCode = em28xx_config(dev);
if (errCode) { if (errCode) {
......
...@@ -90,8 +90,8 @@ struct msp_state { ...@@ -90,8 +90,8 @@ struct msp_state {
/* thread */ /* thread */
struct task_struct *kthread; struct task_struct *kthread;
wait_queue_head_t wq; wait_queue_head_t wq;
int restart:1; unsigned int restart:1;
int watch_stereo:1; unsigned int watch_stereo:1;
}; };
/* msp3400-driver.c */ /* msp3400-driver.c */
......
...@@ -8,7 +8,7 @@ obj-pvrusb2-24xxx-$(CONFIG_VIDEO_PVRUSB2_24XXX) := \ ...@@ -8,7 +8,7 @@ obj-pvrusb2-24xxx-$(CONFIG_VIDEO_PVRUSB2_24XXX) := \
pvrusb2-objs := pvrusb2-i2c-core.o pvrusb2-i2c-cmd-v4l2.o \ pvrusb2-objs := pvrusb2-i2c-core.o pvrusb2-i2c-cmd-v4l2.o \
pvrusb2-audio.o pvrusb2-i2c-chips-v4l2.o \ pvrusb2-audio.o pvrusb2-i2c-chips-v4l2.o \
pvrusb2-encoder.o pvrusb2-video-v4l.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-main.o pvrusb2-hdw.o pvrusb2-v4l2.o \
pvrusb2-ctrl.o pvrusb2-std.o \ pvrusb2-ctrl.o pvrusb2-std.o \
pvrusb2-context.o pvrusb2-io.o pvrusb2-ioread.o \ pvrusb2-context.o pvrusb2-io.o pvrusb2-ioread.o \
......
...@@ -145,8 +145,8 @@ static int get_audio_status(struct pvr2_msp3400_handler *ctxt) ...@@ -145,8 +145,8 @@ static int get_audio_status(struct pvr2_msp3400_handler *ctxt)
static void pvr2_msp3400_detach(struct pvr2_msp3400_handler *ctxt) static void pvr2_msp3400_detach(struct pvr2_msp3400_handler *ctxt)
{ {
ctxt->client->handler = 0; ctxt->client->handler = NULL;
ctxt->hdw->audio_stat = 0; ctxt->hdw->audio_stat = NULL;
kfree(ctxt); kfree(ctxt);
} }
......
...@@ -77,7 +77,7 @@ struct pvr2_context *pvr2_context_create( ...@@ -77,7 +77,7 @@ struct pvr2_context *pvr2_context_create(
const struct usb_device_id *devid, const struct usb_device_id *devid,
void (*setup_func)(struct pvr2_context *)) void (*setup_func)(struct pvr2_context *))
{ {
struct pvr2_context *mp = 0; struct pvr2_context *mp = NULL;
mp = kmalloc(sizeof(*mp),GFP_KERNEL); mp = kmalloc(sizeof(*mp),GFP_KERNEL);
if (!mp) goto done; if (!mp) goto done;
memset(mp,0,sizeof(*mp)); memset(mp,0,sizeof(*mp));
...@@ -87,7 +87,7 @@ struct pvr2_context *pvr2_context_create( ...@@ -87,7 +87,7 @@ struct pvr2_context *pvr2_context_create(
mp->hdw = pvr2_hdw_create(intf,devid); mp->hdw = pvr2_hdw_create(intf,devid);
if (!mp->hdw) { if (!mp->hdw) {
pvr2_context_destroy(mp); pvr2_context_destroy(mp);
mp = 0; mp = NULL;
goto done; goto done;
} }
...@@ -145,7 +145,7 @@ void pvr2_channel_init(struct pvr2_channel *cp,struct pvr2_context *mp) ...@@ -145,7 +145,7 @@ void pvr2_channel_init(struct pvr2_channel *cp,struct pvr2_context *mp)
{ {
cp->hdw = mp->hdw; cp->hdw = mp->hdw;
cp->mc_head = mp; cp->mc_head = mp;
cp->mc_next = 0; cp->mc_next = NULL;
cp->mc_prev = mp->mc_last; cp->mc_prev = mp->mc_last;
if (mp->mc_last) { if (mp->mc_last) {
mp->mc_last->mc_next = cp; mp->mc_last->mc_next = cp;
...@@ -160,8 +160,8 @@ static void pvr2_channel_disclaim_stream(struct pvr2_channel *cp) ...@@ -160,8 +160,8 @@ static void pvr2_channel_disclaim_stream(struct pvr2_channel *cp)
{ {
if (!cp->stream) return; if (!cp->stream) return;
pvr2_stream_kill(cp->stream->stream); pvr2_stream_kill(cp->stream->stream);
cp->stream->user = 0; cp->stream->user = NULL;
cp->stream = 0; cp->stream = NULL;
} }
...@@ -179,7 +179,7 @@ void pvr2_channel_done(struct pvr2_channel *cp) ...@@ -179,7 +179,7 @@ void pvr2_channel_done(struct pvr2_channel *cp)
} else { } else {
mp->mc_first = cp->mc_next; mp->mc_first = cp->mc_next;
} }
cp->hdw = 0; cp->hdw = NULL;
} }
...@@ -212,7 +212,7 @@ struct pvr2_ioread *pvr2_channel_create_mpeg_stream( ...@@ -212,7 +212,7 @@ struct pvr2_ioread *pvr2_channel_create_mpeg_stream(
{ {
struct pvr2_ioread *cp; struct pvr2_ioread *cp;
cp = pvr2_ioread_create(); cp = pvr2_ioread_create();
if (!cp) return 0; if (!cp) return NULL;
pvr2_ioread_setup(cp,sp->stream); pvr2_ioread_setup(cp,sp->stream);
pvr2_ioread_set_sync_key(cp,stream_sync_key,sizeof(stream_sync_key)); pvr2_ioread_set_sync_key(cp,stream_sync_key,sizeof(stream_sync_key));
return cp; return cp;
......
...@@ -158,7 +158,7 @@ int pvr2_ctrl_get_mask(struct pvr2_ctrl *cptr) ...@@ -158,7 +158,7 @@ int pvr2_ctrl_get_mask(struct pvr2_ctrl *cptr)
/* Retrieve the control's name */ /* Retrieve the control's name */
const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr) const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr)
{ {
if (!cptr) return 0; if (!cptr) return NULL;
return cptr->info->name; return cptr->info->name;
} }
...@@ -166,7 +166,7 @@ const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr) ...@@ -166,7 +166,7 @@ const char *pvr2_ctrl_get_name(struct pvr2_ctrl *cptr)
/* Retrieve the control's desc */ /* Retrieve the control's desc */
const char *pvr2_ctrl_get_desc(struct pvr2_ctrl *cptr) const char *pvr2_ctrl_get_desc(struct pvr2_ctrl *cptr)
{ {
if (!cptr) return 0; if (!cptr) return NULL;
return cptr->info->desc; return cptr->info->desc;
} }
...@@ -488,7 +488,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr, ...@@ -488,7 +488,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
LOCK_TAKE(cptr->hdw->big_lock); do { LOCK_TAKE(cptr->hdw->big_lock); do {
if (cptr->info->type == pvr2_ctl_int) { 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) && if ((ret >= 0) &&
((*valptr < cptr->info->def.type_int.min_value) || ((*valptr < cptr->info->def.type_int.min_value) ||
(*valptr > cptr->info->def.type_int.max_value))) { (*valptr > cptr->info->def.type_int.max_value))) {
......
...@@ -139,8 +139,8 @@ static const struct pvr2_v4l_cx2584x_ops decoder_ops[] = { ...@@ -139,8 +139,8 @@ static const struct pvr2_v4l_cx2584x_ops decoder_ops[] = {
static void decoder_detach(struct pvr2_v4l_cx2584x *ctxt) static void decoder_detach(struct pvr2_v4l_cx2584x *ctxt)
{ {
ctxt->client->handler = 0; ctxt->client->handler = NULL;
ctxt->hdw->decoder_ctrl = 0; ctxt->hdw->decoder_ctrl = NULL;
kfree(ctxt); kfree(ctxt);
} }
...@@ -221,7 +221,7 @@ static unsigned int decoder_describe(struct pvr2_v4l_cx2584x *ctxt, ...@@ -221,7 +221,7 @@ static unsigned int decoder_describe(struct pvr2_v4l_cx2584x *ctxt,
static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt) static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt)
{ {
int ret; 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); 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, ...@@ -82,7 +82,7 @@ static unsigned int debugifc_isolate_word(const char *buf,unsigned int count,
unsigned int wlen; unsigned int wlen;
unsigned int scnt; unsigned int scnt;
wptr = 0; wptr = NULL;
wlen = 0; wlen = 0;
scnt = debugifc_count_whitespace(buf,count); scnt = debugifc_count_whitespace(buf,count);
consume_cnt += scnt; count -= scnt; buf += scnt; consume_cnt += scnt; count -= scnt; buf += scnt;
...@@ -337,8 +337,8 @@ int pvr2_debugifc_print_status(struct pvr2_hdw *hdw, ...@@ -337,8 +337,8 @@ int pvr2_debugifc_print_status(struct pvr2_hdw *hdw,
} }
int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf, static int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf,
unsigned int count) unsigned int count)
{ {
const char *wptr; const char *wptr;
unsigned int wlen; unsigned int wlen;
......
/*
*
* $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: ***
*/
/*
*
* $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) ...@@ -58,7 +58,7 @@ static u8 *pvr2_eeprom_fetch(struct pvr2_hdw *hdw)
pvr2_trace(PVR2_TRACE_ERROR_LEGS, pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"Failed to allocate memory" "Failed to allocate memory"
" required to read eeprom"); " required to read eeprom");
return 0; return NULL;
} }
trace_eeprom("Value for eeprom addr from controller was 0x%x", trace_eeprom("Value for eeprom addr from controller was 0x%x",
...@@ -108,7 +108,7 @@ static u8 *pvr2_eeprom_fetch(struct pvr2_hdw *hdw) ...@@ -108,7 +108,7 @@ static u8 *pvr2_eeprom_fetch(struct pvr2_hdw *hdw)
pvr2_trace(PVR2_TRACE_ERROR_LEGS, pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"eeprom fetch set offs err=%d",ret); "eeprom fetch set offs err=%d",ret);
kfree(eeprom); kfree(eeprom);
return 0; return NULL;
} }
} }
return eeprom; return eeprom;
......
...@@ -65,7 +65,7 @@ static int pvr2_encoder_write_words(struct pvr2_hdw *hdw, ...@@ -65,7 +65,7 @@ static int pvr2_encoder_write_words(struct pvr2_hdw *hdw,
} }
ret = pvr2_send_request(hdw, ret = pvr2_send_request(hdw,
hdw->cmd_buffer,1+(chunkCnt*7), hdw->cmd_buffer,1+(chunkCnt*7),
0,0); NULL,0);
if (ret) return ret; if (ret) return ret;
data += chunkCnt; data += chunkCnt;
dlen -= chunkCnt; dlen -= chunkCnt;
...@@ -322,7 +322,7 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw) ...@@ -322,7 +322,7 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw)
} }
ret = cx2341x_update(hdw,pvr2_encoder_cmd, 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); &hdw->enc_ctl_state);
if (ret) { if (ret) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, pvr2_trace(PVR2_TRACE_ERROR_LEGS,
......
...@@ -354,23 +354,6 @@ struct pvr2_hdw { ...@@ -354,23 +354,6 @@ struct pvr2_hdw {
unsigned int control_cnt; 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 */ #endif /* __PVRUSB2_HDW_INTERNAL_H */
/* /*
......
...@@ -63,7 +63,6 @@ struct pvr2_string_table { ...@@ -63,7 +63,6 @@ struct pvr2_string_table {
static const char *pvr2_client_24xxx[] = { static const char *pvr2_client_24xxx[] = {
"cx25840", "cx25840",
"tuner", "tuner",
"tda9887",
"wm8775", "wm8775",
}; };
#endif #endif
...@@ -73,7 +72,6 @@ static const char *pvr2_client_29xxx[] = { ...@@ -73,7 +72,6 @@ static const char *pvr2_client_29xxx[] = {
"msp3400", "msp3400",
"saa7115", "saa7115",
"tuner", "tuner",
"tda9887",
}; };
static struct pvr2_string_table pvr2_client_lists[] = { static struct pvr2_string_table pvr2_client_lists[] = {
...@@ -89,8 +87,8 @@ static struct pvr2_string_table pvr2_client_lists[] = { ...@@ -89,8 +87,8 @@ static struct pvr2_string_table pvr2_client_lists[] = {
#endif #endif
}; };
static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = 0}; static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
DECLARE_MUTEX(pvr2_unit_sem); static DECLARE_MUTEX(pvr2_unit_sem);
static int ctlchg = 0; static int ctlchg = 0;
static int initusbreset = 1; static int initusbreset = 1;
...@@ -263,6 +261,25 @@ static const char *control_values_subsystem[] = { ...@@ -263,6 +261,25 @@ static const char *control_values_subsystem[] = {
[PVR2_SUBSYS_B_ENC_RUN] = "enc_run", [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) 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) ...@@ -405,7 +422,7 @@ static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
info = (struct pvr2_ctl_info *)(cptr->info); info = (struct pvr2_ctl_info *)(cptr->info);
if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) { if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
if (info->set_value) { if (info->set_value) {
info->set_value = 0; info->set_value = NULL;
} }
} else { } else {
if (!(info->set_value)) { if (!(info->set_value)) {
...@@ -836,14 +853,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw) ...@@ -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) int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
{ {
return hdw->unit_number; return hdw->unit_number;
...@@ -917,9 +926,9 @@ static int pvr2_locate_firmware(struct pvr2_hdw *hdw, ...@@ -917,9 +926,9 @@ static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
* is not suitable for an usb transaction. * 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; void *fw_ptr;
unsigned int pipe; unsigned int pipe;
int ret; int ret;
...@@ -1015,7 +1024,7 @@ int pvr2_upload_firmware1(struct pvr2_hdw *hdw) ...@@ -1015,7 +1024,7 @@ int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
int pvr2_upload_firmware2(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; void *fw_ptr;
unsigned int pipe, fw_len, fw_done; unsigned int pipe, fw_len, fw_done;
int actual_length; int actual_length;
...@@ -1166,8 +1175,9 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) ...@@ -1166,8 +1175,9 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
reconfigure and start over. reconfigure and start over.
*/ */
void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw, static void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
unsigned long msk,unsigned long val) unsigned long msk,
unsigned long val)
{ {
unsigned long nmsk; unsigned long nmsk;
unsigned long vmsk; unsigned long vmsk;
...@@ -1318,18 +1328,6 @@ void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw, ...@@ -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) unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *hdw)
{ {
return hdw->subsys_enabled_mask; return hdw->subsys_enabled_mask;
...@@ -1342,9 +1340,9 @@ unsigned long pvr2_hdw_subsys_stream_get(struct pvr2_hdw *hdw) ...@@ -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, static void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
unsigned long msk, unsigned long msk,
unsigned long val) unsigned long val)
{ {
unsigned long val2; unsigned long val2;
msk &= PVR2_SUBSYS_ALL; msk &= PVR2_SUBSYS_ALL;
...@@ -1366,7 +1364,7 @@ void pvr2_hdw_subsys_stream_bit_chg(struct pvr2_hdw *hdw, ...@@ -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) == !(hdw->flag_streaming_enabled)) return 0;
if (enableFl) { if (enableFl) {
...@@ -1400,8 +1398,8 @@ int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag) ...@@ -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, static int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
enum pvr2_config config) enum pvr2_config config)
{ {
unsigned long sm = hdw->subsys_enabled_mask; unsigned long sm = hdw->subsys_enabled_mask;
if (!hdw->flag_ok) return -EIO; if (!hdw->flag_ok) return -EIO;
...@@ -1741,7 +1739,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, ...@@ -1741,7 +1739,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
sizeof(pvr2_device_names)/sizeof(pvr2_device_names[0])) { sizeof(pvr2_device_names)/sizeof(pvr2_device_names[0])) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"Bogus device type of %u reported",hdw_type); "Bogus device type of %u reported",hdw_type);
return 0; return NULL;
} }
hdw = kmalloc(sizeof(*hdw),GFP_KERNEL); hdw = kmalloc(sizeof(*hdw),GFP_KERNEL);
...@@ -1922,38 +1920,38 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, ...@@ -1922,38 +1920,38 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
if (hdw->mpeg_ctrl_info) kfree(hdw->mpeg_ctrl_info); if (hdw->mpeg_ctrl_info) kfree(hdw->mpeg_ctrl_info);
kfree(hdw); kfree(hdw);
} }
return 0; return NULL;
} }
/* Remove _all_ associations between this driver and the underlying USB /* Remove _all_ associations between this driver and the underlying USB
layer. */ 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; if (hdw->flag_disconnected) return;
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw); pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
if (hdw->ctl_read_urb) { if (hdw->ctl_read_urb) {
usb_kill_urb(hdw->ctl_read_urb); usb_kill_urb(hdw->ctl_read_urb);
usb_free_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) { if (hdw->ctl_write_urb) {
usb_kill_urb(hdw->ctl_write_urb); usb_kill_urb(hdw->ctl_write_urb);
usb_free_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) { if (hdw->ctl_read_buffer) {
kfree(hdw->ctl_read_buffer); kfree(hdw->ctl_read_buffer);
hdw->ctl_read_buffer = 0; hdw->ctl_read_buffer = NULL;
} }
if (hdw->ctl_write_buffer) { if (hdw->ctl_write_buffer) {
kfree(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); pvr2_hdw_render_useless_unlocked(hdw);
hdw->flag_disconnected = !0; hdw->flag_disconnected = !0;
hdw->usb_dev = 0; hdw->usb_dev = NULL;
hdw->usb_intf = 0; hdw->usb_intf = NULL;
} }
...@@ -1963,11 +1961,11 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw) ...@@ -1963,11 +1961,11 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw); pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
if (hdw->fw_buffer) { if (hdw->fw_buffer) {
kfree(hdw->fw_buffer); kfree(hdw->fw_buffer);
hdw->fw_buffer = 0; hdw->fw_buffer = NULL;
} }
if (hdw->vid_stream) { if (hdw->vid_stream) {
pvr2_stream_destroy(hdw->vid_stream); pvr2_stream_destroy(hdw->vid_stream);
hdw->vid_stream = 0; hdw->vid_stream = NULL;
} }
if (hdw->audio_stat) { if (hdw->audio_stat) {
hdw->audio_stat->detach(hdw->audio_stat->ctxt); hdw->audio_stat->detach(hdw->audio_stat->ctxt);
...@@ -1981,7 +1979,7 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw) ...@@ -1981,7 +1979,7 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
if ((hdw->unit_number >= 0) && if ((hdw->unit_number >= 0) &&
(hdw->unit_number < PVR_NUM) && (hdw->unit_number < PVR_NUM) &&
(unit_pointers[hdw->unit_number] == hdw)) { (unit_pointers[hdw->unit_number] == hdw)) {
unit_pointers[hdw->unit_number] = 0; unit_pointers[hdw->unit_number] = NULL;
} }
} while (0); up(&pvr2_unit_sem); } while (0); up(&pvr2_unit_sem);
if (hdw->controls) kfree(hdw->controls); if (hdw->controls) kfree(hdw->controls);
...@@ -2018,7 +2016,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw) ...@@ -2018,7 +2016,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
// Attempt to autoselect an appropriate value for std_enum_cur given // Attempt to autoselect an appropriate value for std_enum_cur given
// whatever is currently in std_mask_cur // 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; unsigned int idx;
for (idx = 1; idx < hdw->std_enum_cnt; idx++) { for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
...@@ -2033,7 +2031,7 @@ void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw) ...@@ -2033,7 +2031,7 @@ void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
// Calculate correct set of enumerated standards based on currently known // Calculate correct set of enumerated standards based on currently known
// set of available standards bits. // 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; struct v4l2_standard *newstd;
unsigned int std_cnt; unsigned int std_cnt;
...@@ -2043,12 +2041,12 @@ void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw) ...@@ -2043,12 +2041,12 @@ void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
if (hdw->std_defs) { if (hdw->std_defs) {
kfree(hdw->std_defs); kfree(hdw->std_defs);
hdw->std_defs = 0; hdw->std_defs = NULL;
} }
hdw->std_enum_cnt = 0; hdw->std_enum_cnt = 0;
if (hdw->std_enum_names) { if (hdw->std_enum_names) {
kfree(hdw->std_enum_names); kfree(hdw->std_enum_names);
hdw->std_enum_names = 0; hdw->std_enum_names = NULL;
} }
if (!std_cnt) { if (!std_cnt) {
...@@ -2099,7 +2097,7 @@ unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw) ...@@ -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, struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
unsigned int idx) unsigned int idx)
{ {
if (idx >= hdw->control_cnt) return 0; if (idx >= hdw->control_cnt) return NULL;
return hdw->controls + idx; return hdw->controls + idx;
} }
...@@ -2118,7 +2116,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw, ...@@ -2118,7 +2116,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
i = cptr->info->internal_id; i = cptr->info->internal_id;
if (i && (i == ctl_id)) return cptr; 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 ...@@ -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; i = cptr->info->v4l_id;
if (i && (i == ctl_id)) return cptr; 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, ...@@ -2149,7 +2147,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
int i; int i;
/* This could be made a lot more efficient, but for now... */ /* This could be made a lot more efficient, but for now... */
cp2 = 0; cp2 = NULL;
for (idx = 0; idx < hdw->control_cnt; idx++) { for (idx = 0; idx < hdw->control_cnt; idx++) {
cptr = hdw->controls + idx; cptr = hdw->controls + idx;
i = cptr->info->v4l_id; i = cptr->info->v4l_id;
...@@ -2159,7 +2157,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw, ...@@ -2159,7 +2157,7 @@ struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
cp2 = cptr; cp2 = cptr;
} }
return cp2; return cp2;
return 0; return NULL;
} }
...@@ -2182,7 +2180,7 @@ static const char *get_ctrl_typename(enum pvr2_ctl_type tp) ...@@ -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. state(s) back to their previous value before this function was called.
Thus we can automatically reconfigure affected pieces of the driver as Thus we can automatically reconfigure affected pieces of the driver as
controls are changed. */ 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 saved_subsys_mask = hdw->subsys_enabled_mask;
unsigned long stale_subsys_mask = 0; unsigned long stale_subsys_mask = 0;
...@@ -2321,14 +2319,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw) ...@@ -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 */ /* Return name for this driver instance */
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) 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) ...@@ -2337,7 +2327,7 @@ const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
/* Return bit mask indicating signal status */ /* 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; unsigned int msk = 0;
switch (hdw->input_val) { switch (hdw->input_val) {
...@@ -2424,7 +2414,7 @@ void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag) ...@@ -2424,7 +2414,7 @@ void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag)
pvr2_trace(PVR2_TRACE_FIRMWARE, pvr2_trace(PVR2_TRACE_FIRMWARE,
"Cleaning up after CPU firmware fetch"); "Cleaning up after CPU firmware fetch");
kfree(hdw->fw_buffer); kfree(hdw->fw_buffer);
hdw->fw_buffer = 0; hdw->fw_buffer = NULL;
hdw->fw_size = 0; hdw->fw_size = 0;
/* Now release the CPU. It will disconnect and /* Now release the CPU. It will disconnect and
reconnect later. */ reconnect later. */
...@@ -2519,22 +2509,6 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int v) ...@@ -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) static void pvr2_ctl_write_complete(struct urb *urb, struct pt_regs *regs)
{ {
struct pvr2_hdw *hdw = urb->context; struct pvr2_hdw *hdw = urb->context;
...@@ -2568,10 +2542,10 @@ static void pvr2_ctl_timeout(unsigned long data) ...@@ -2568,10 +2542,10 @@ static void pvr2_ctl_timeout(unsigned long data)
} }
int pvr2_send_request_ex(struct pvr2_hdw *hdw, static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
unsigned int timeout,int probe_fl, unsigned int timeout,int probe_fl,
void *write_data,unsigned int write_len, void *write_data,unsigned int write_len,
void *read_data,unsigned int read_len) void *read_data,unsigned int read_len)
{ {
unsigned int idx; unsigned int idx;
int status = 0; int status = 0;
...@@ -2826,7 +2800,7 @@ int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data) ...@@ -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; int ret = 0;
...@@ -2850,7 +2824,7 @@ int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data) ...@@ -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; int ret;
...@@ -2867,7 +2841,7 @@ int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res) ...@@ -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; int ret;
...@@ -2883,13 +2857,13 @@ int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res) ...@@ -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; if (!hdw->flag_ok) return;
pvr2_trace(PVR2_TRACE_INIT,"render_useless"); pvr2_trace(PVR2_TRACE_INIT,"render_useless");
hdw->flag_ok = 0; hdw->flag_ok = 0;
if (hdw->vid_stream) { 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->flag_streaming_enabled = 0;
hdw->subsys_enabled_mask = 0; hdw->subsys_enabled_mask = 0;
...@@ -2908,7 +2882,7 @@ void pvr2_hdw_device_reset(struct pvr2_hdw *hdw) ...@@ -2908,7 +2882,7 @@ void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
{ {
int ret; int ret;
pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset..."); 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) { if (ret == 1) {
ret = usb_reset_device(hdw->usb_dev); ret = usb_reset_device(hdw->usb_dev);
usb_unlock_device(hdw->usb_dev); usb_unlock_device(hdw->usb_dev);
...@@ -2957,7 +2931,7 @@ int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw) ...@@ -2957,7 +2931,7 @@ int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset"); pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset");
hdw->flag_ok = !0; hdw->flag_ok = !0;
hdw->cmd_buffer[0] = 0xdd; 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); } while (0); LOCK_GIVE(hdw->ctl_lock);
return status; return status;
} }
...@@ -2969,7 +2943,7 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw) ...@@ -2969,7 +2943,7 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
LOCK_TAKE(hdw->ctl_lock); do { LOCK_TAKE(hdw->ctl_lock); do {
pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup"); pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup");
hdw->cmd_buffer[0] = 0xde; 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); } while (0); LOCK_GIVE(hdw->ctl_lock);
return status; return status;
} }
...@@ -2996,12 +2970,12 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) ...@@ -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; int status;
LOCK_TAKE(hdw->ctl_lock); do { LOCK_TAKE(hdw->ctl_lock); do {
hdw->cmd_buffer[0] = (runFl ? 0x36 : 0x37); 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); } while (0); LOCK_GIVE(hdw->ctl_lock);
if (!status) { if (!status) {
hdw->subsys_enabled_mask = hdw->subsys_enabled_mask =
...@@ -3094,7 +3068,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val) ...@@ -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; int result;
LOCK_TAKE(hdw->ctl_lock); do { LOCK_TAKE(hdw->ctl_lock); do {
......
...@@ -91,7 +91,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, ...@@ -91,7 +91,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
void pvr2_hdw_poll(struct pvr2_hdw *); void pvr2_hdw_poll(struct pvr2_hdw *);
/* Trigger a poll to take place later at a convenient time */ /* 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 *); void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *);
/* Register a callback used to trigger a future poll */ /* Register a callback used to trigger a future poll */
...@@ -99,9 +98,6 @@ void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *, ...@@ -99,9 +98,6 @@ void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *,
void (*func)(void *), void (*func)(void *),
void *data); void *data);
/* Get pointer to structure given unit number */
struct pvr2_hdw *pvr2_hdw_find(int unit_number);
/* Destroy hardware interaction structure */ /* Destroy hardware interaction structure */
void pvr2_hdw_destroy(struct pvr2_hdw *); 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, ...@@ -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, void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
unsigned long msk,unsigned long val); 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 /* Retrieve mask indicating which pieces of hardware are currently enabled
/ configured. */ / configured. */
unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *); unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *);
...@@ -225,34 +215,18 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,int); ...@@ -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 /* The following entry points are all lower level things you normally don't
want to worry about. */ 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 /* Issue a command and get a response from the device. LOTS of higher
level stuff is built on this. */ level stuff is built on this. */
int pvr2_send_request(struct pvr2_hdw *, int pvr2_send_request(struct pvr2_hdw *,
void *write_ptr,unsigned int write_len, void *write_ptr,unsigned int write_len,
void *read_ptr,unsigned int read_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. */ /* Slightly higher level device communication functions. */
int pvr2_write_register(struct pvr2_hdw *, u16, u32); 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 /* Call if for any reason we can't talk to the hardware anymore - this will
cause the driver to stop flailing on the device. */ cause the driver to stop flailing on the device. */
void pvr2_hdw_render_useless(struct pvr2_hdw *); void pvr2_hdw_render_useless(struct pvr2_hdw *);
void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *);
/* Set / clear 8051's reset bit */ /* Set / clear 8051's reset bit */
void pvr2_hdw_cpureset_assert(struct pvr2_hdw *,int); void pvr2_hdw_cpureset_assert(struct pvr2_hdw *,int);
...@@ -271,12 +245,6 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *); ...@@ -271,12 +245,6 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *);
/* Order decoder to reset */ /* Order decoder to reset */
int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *); 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 */ /* Direct manipulation of GPIO bits */
int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *); int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *);
int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *); int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *);
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include "pvrusb2-i2c-cmd-v4l2.h" #include "pvrusb2-i2c-cmd-v4l2.h"
#include "pvrusb2-audio.h" #include "pvrusb2-audio.h"
#include "pvrusb2-tuner.h" #include "pvrusb2-tuner.h"
#include "pvrusb2-demod.h"
#include "pvrusb2-video-v4l.h" #include "pvrusb2-video-v4l.h"
#ifdef CONFIG_VIDEO_PVRUSB2_24XXX #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
#include "pvrusb2-cx2584x-v4l.h" #include "pvrusb2-cx2584x-v4l.h"
...@@ -89,11 +88,6 @@ void pvr2_i2c_probe(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp) ...@@ -89,11 +88,6 @@ void pvr2_i2c_probe(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp)
return; 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 = { ...@@ -196,7 +196,7 @@ const struct pvr2_i2c_op pvr2_i2c_op_v4l2_size = {
static void do_log(struct pvr2_hdw *hdw) static void do_log(struct pvr2_hdw *hdw)
{ {
pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 do_log()"); 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 = { ...@@ -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) void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client *cp,int fl)
{ {
pvr2_i2c_client_cmd(cp, 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; ...@@ -37,6 +37,10 @@ static unsigned int i2c_scan = 0;
module_param(i2c_scan, int, S_IRUGO|S_IWUSR); module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time"); 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 */ static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
u8 i2c_addr, /* I2C address we're talking to */ u8 i2c_addr, /* I2C address we're talking to */
u8 *data, /* Data to write */ u8 *data, /* Data to write */
...@@ -165,12 +169,12 @@ static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */ ...@@ -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 /* This is the common low level entry point for doing I2C operations to the
hardware. */ hardware. */
int pvr2_i2c_basic_op(struct pvr2_hdw *hdw, static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
u8 i2c_addr, u8 i2c_addr,
u8 *wdata, u8 *wdata,
u16 wlen, u16 wlen,
u8 *rdata, u8 *rdata,
u16 rlen) u16 rlen)
{ {
if (!rdata) rlen = 0; if (!rdata) rlen = 0;
if (!wdata) wlen = 0; if (!wdata) wlen = 0;
...@@ -267,7 +271,7 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw, ...@@ -267,7 +271,7 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
"WARNING: Disabling further access to the device" "WARNING: Disabling further access to the device"
" to prevent other foul-ups."); " to prevent other foul-ups.");
// This blocks all further communication with the part. // This blocks all further communication with the part.
hdw->i2c_func[0x44] = 0; hdw->i2c_func[0x44] = NULL;
pvr2_hdw_render_useless(hdw); pvr2_hdw_render_useless(hdw);
goto fail; goto fail;
} }
...@@ -294,7 +298,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -294,7 +298,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
int num) int num)
{ {
int ret = -ENOTSUPP; int ret = -ENOTSUPP;
pvr2_i2c_func funcp = 0; pvr2_i2c_func funcp = NULL;
struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data); struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
if (!num) { if (!num) {
...@@ -319,7 +323,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -319,7 +323,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
u16 tcnt,bcnt,offs; u16 tcnt,bcnt,offs;
if (!msgs[0].len) { if (!msgs[0].len) {
/* Length == 0 read. This is a probe. */ /* 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; ret = -EIO;
goto done; goto done;
} }
...@@ -336,7 +340,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -336,7 +340,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
if (bcnt > sizeof(hdw->cmd_buffer)-1) { if (bcnt > sizeof(hdw->cmd_buffer)-1) {
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)) { msgs[0].buf+offs,bcnt)) {
ret = -EIO; ret = -EIO;
goto done; goto done;
...@@ -350,7 +354,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -350,7 +354,7 @@ static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
/* Simple write */ /* Simple write */
ret = 1; ret = 1;
if (funcp(hdw,msgs[0].addr, if (funcp(hdw,msgs[0].addr,
msgs[0].buf,msgs[0].len,0,0)) { msgs[0].buf,msgs[0].len,NULL,0)) {
ret = -EIO; ret = -EIO;
} }
goto done; goto done;
...@@ -705,9 +709,9 @@ int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw) ...@@ -705,9 +709,9 @@ int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw)
return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0; return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0;
} }
unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp, static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
unsigned int detail, unsigned int detail,
char *buf,unsigned int maxlen) char *buf,unsigned int maxlen)
{ {
unsigned int ccnt,bcnt; unsigned int ccnt,bcnt;
int spcfl = 0; int spcfl = 0;
...@@ -871,7 +875,7 @@ static void do_i2c_scan(struct pvr2_hdw *hdw) ...@@ -871,7 +875,7 @@ static void do_i2c_scan(struct pvr2_hdw *hdw)
msg[0].addr = 0; msg[0].addr = 0;
msg[0].flags = I2C_M_RD; msg[0].flags = I2C_M_RD;
msg[0].len = 0; msg[0].len = 0;
msg[0].buf = 0; msg[0].buf = NULL;
printk("%s: i2c scan beginning\n",hdw->name); printk("%s: i2c scan beginning\n",hdw->name);
for (i = 0; i < 128; i++) { for (i = 0; i < 128; i++) {
msg[0].addr = i; msg[0].addr = i;
......
...@@ -75,9 +75,6 @@ unsigned int pvr2_i2c_report(struct pvr2_hdw *,char *buf,unsigned int maxlen); ...@@ -75,9 +75,6 @@ unsigned int pvr2_i2c_report(struct pvr2_hdw *,char *buf,unsigned int maxlen);
PVR2_I2C_DETAIL_DEBUG |\ PVR2_I2C_DETAIL_DEBUG |\
PVR2_I2C_DETAIL_HANDLER |\ PVR2_I2C_DETAIL_HANDLER |\
PVR2_I2C_DETAIL_CTLMASK) 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 *); void pvr2_i2c_probe(struct pvr2_hdw *,struct pvr2_i2c_client *);
const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx); const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx);
......
...@@ -93,7 +93,7 @@ struct pvr2_buffer { ...@@ -93,7 +93,7 @@ struct pvr2_buffer {
struct urb *purb; 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) { switch (st) {
case pvr2_buffer_state_none: return "none"; case pvr2_buffer_state_none: return "none";
...@@ -104,7 +104,8 @@ const char *pvr2_buffer_state_decode(enum pvr2_buffer_state st) ...@@ -104,7 +104,8 @@ const char *pvr2_buffer_state_decode(enum pvr2_buffer_state st)
return "unknown"; 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, pvr2_trace(PVR2_TRACE_INFO,
"buffer%s%s %p state=%s id=%d status=%d" "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) ...@@ -115,10 +116,11 @@ void pvr2_buffer_describe(struct pvr2_buffer *bp,const char *msg)
(bp ? pvr2_buffer_state_decode(bp->state) : "(invalid)"), (bp ? pvr2_buffer_state_decode(bp->state) : "(invalid)"),
(bp ? bp->id : 0), (bp ? bp->id : 0),
(bp ? bp->status : 0), (bp ? bp->status : 0),
(bp ? bp->stream : 0), (bp ? bp->stream : NULL),
(bp ? bp->purb : 0), (bp ? bp->purb : NULL),
(bp ? bp->signature : 0)); (bp ? bp->signature : 0));
} }
#endif /* SANITY_CHECK_BUFFERS */
static void pvr2_buffer_remove(struct pvr2_buffer *bp) static void pvr2_buffer_remove(struct pvr2_buffer *bp)
{ {
...@@ -284,7 +286,7 @@ static void pvr2_buffer_done(struct pvr2_buffer *bp) ...@@ -284,7 +286,7 @@ static void pvr2_buffer_done(struct pvr2_buffer *bp)
pvr2_buffer_wipe(bp); pvr2_buffer_wipe(bp);
pvr2_buffer_set_none(bp); pvr2_buffer_set_none(bp);
bp->signature = 0; bp->signature = 0;
bp->stream = 0; bp->stream = NULL;
if (bp->purb) usb_free_urb(bp->purb); if (bp->purb) usb_free_urb(bp->purb);
pvr2_trace(PVR2_TRACE_BUF_POOL,"/*---TRACE_FLOW---*/" pvr2_trace(PVR2_TRACE_BUF_POOL,"/*---TRACE_FLOW---*/"
" bufferDone %p",bp); " bufferDone %p",bp);
...@@ -339,13 +341,13 @@ static int pvr2_stream_buffer_count(struct pvr2_stream *sp,unsigned int cnt) ...@@ -339,13 +341,13 @@ static int pvr2_stream_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
struct pvr2_buffer *bp; struct pvr2_buffer *bp;
bp = sp->buffers[sp->buffer_total_count - 1]; bp = sp->buffers[sp->buffer_total_count - 1];
/* Paranoia */ /* Paranoia */
sp->buffers[sp->buffer_total_count - 1] = 0; sp->buffers[sp->buffer_total_count - 1] = NULL;
(sp->buffer_total_count)--; (sp->buffer_total_count)--;
pvr2_buffer_done(bp); pvr2_buffer_done(bp);
kfree(bp); kfree(bp);
} }
if (scnt < sp->buffer_slot_count) { if (scnt < sp->buffer_slot_count) {
struct pvr2_buffer **nb = 0; struct pvr2_buffer **nb = NULL;
if (scnt) { if (scnt) {
nb = kmalloc(scnt * sizeof(*nb),GFP_KERNEL); nb = kmalloc(scnt * sizeof(*nb),GFP_KERNEL);
if (!nb) return -ENOMEM; if (!nb) return -ENOMEM;
...@@ -513,10 +515,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp, ...@@ -513,10 +515,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp,
} }
/* Query / set the nominal buffer count */ /* 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) 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) ...@@ -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 pvr2_buffer *pvr2_stream_get_idle_buffer(struct pvr2_stream *sp)
{ {
struct list_head *lp = sp->idle_list.next; 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); return list_entry(lp,struct pvr2_buffer,list_overhead);
} }
struct pvr2_buffer *pvr2_stream_get_ready_buffer(struct pvr2_stream *sp) struct pvr2_buffer *pvr2_stream_get_ready_buffer(struct pvr2_stream *sp)
{ {
struct list_head *lp = sp->ready_list.next; 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); return list_entry(lp,struct pvr2_buffer,list_overhead);
} }
struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id) struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id)
{ {
if (id < 0) return 0; if (id < 0) return NULL;
if (id >= sp->buffer_total_count) return 0; if (id >= sp->buffer_total_count) return NULL;
return sp->buffers[id]; return sp->buffers[id];
} }
...@@ -555,17 +553,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp) ...@@ -555,17 +553,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp)
return sp->r_count; 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) void pvr2_stream_kill(struct pvr2_stream *sp)
{ {
...@@ -620,20 +607,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp) ...@@ -620,20 +607,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp)
return ret; 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) 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) ...@@ -673,10 +646,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp)
return bp->status; 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) int pvr2_buffer_get_id(struct pvr2_buffer *bp)
{ {
......
...@@ -36,8 +36,6 @@ enum pvr2_buffer_state { ...@@ -36,8 +36,6 @@ enum pvr2_buffer_state {
struct pvr2_stream; struct pvr2_stream;
struct pvr2_buffer; struct pvr2_buffer;
const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
/* Initialize / tear down stream structure */ /* Initialize / tear down stream structure */
struct pvr2_stream *pvr2_stream_create(void); struct pvr2_stream *pvr2_stream_create(void);
void pvr2_stream_destroy(struct pvr2_stream *); void pvr2_stream_destroy(struct pvr2_stream *);
...@@ -49,7 +47,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *, ...@@ -49,7 +47,6 @@ void pvr2_stream_set_callback(struct pvr2_stream *,
void *data); void *data);
/* Query / set the nominal buffer count */ /* 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); 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 /* 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 *); ...@@ -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); struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id);
/* Find out how many buffers are idle or ready */ /* 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 *); 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 */ /* Kill all pending buffers and throw away any ready buffers as well */
void pvr2_stream_kill(struct pvr2_stream *); void pvr2_stream_kill(struct pvr2_stream *);
...@@ -77,18 +70,12 @@ unsigned int pvr2_buffer_get_count(struct pvr2_buffer *); ...@@ -77,18 +70,12 @@ unsigned int pvr2_buffer_get_count(struct pvr2_buffer *);
/* Retrieve completion code for given ready buffer */ /* Retrieve completion code for given ready buffer */
int pvr2_buffer_get_status(struct pvr2_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 */ /* Retrieve ID of given buffer */
int pvr2_buffer_get_id(struct pvr2_buffer *); int pvr2_buffer_get_id(struct pvr2_buffer *);
/* Start reading into given buffer (kill it if needed) */ /* Start reading into given buffer (kill it if needed) */
int pvr2_buffer_queue(struct pvr2_buffer *); 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 */ #endif /* __PVRUSB2_IO_H */
/* /*
......
...@@ -54,7 +54,7 @@ static int pvr2_ioread_init(struct pvr2_ioread *cp) ...@@ -54,7 +54,7 @@ static int pvr2_ioread_init(struct pvr2_ioread *cp)
{ {
unsigned int idx; unsigned int idx;
cp->stream = 0; cp->stream = NULL;
mutex_init(&cp->mutex); mutex_init(&cp->mutex);
for (idx = 0; idx < BUFFER_COUNT; idx++) { for (idx = 0; idx < BUFFER_COUNT; idx++) {
...@@ -77,7 +77,7 @@ static void pvr2_ioread_done(struct pvr2_ioread *cp) ...@@ -77,7 +77,7 @@ static void pvr2_ioread_done(struct pvr2_ioread *cp)
{ {
unsigned int idx; unsigned int idx;
pvr2_ioread_setup(cp,0); pvr2_ioread_setup(cp,NULL);
for (idx = 0; idx < BUFFER_COUNT; idx++) { for (idx = 0; idx < BUFFER_COUNT; idx++) {
if (!(cp->buffer_storage[idx])) continue; if (!(cp->buffer_storage[idx])) continue;
kfree(cp->buffer_storage[idx]); kfree(cp->buffer_storage[idx]);
...@@ -88,12 +88,12 @@ struct pvr2_ioread *pvr2_ioread_create(void) ...@@ -88,12 +88,12 @@ struct pvr2_ioread *pvr2_ioread_create(void)
{ {
struct pvr2_ioread *cp; struct pvr2_ioread *cp;
cp = kmalloc(sizeof(*cp),GFP_KERNEL); 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); pvr2_trace(PVR2_TRACE_STRUCT,"pvr2_ioread_create id=%p",cp);
memset(cp,0,sizeof(*cp)); memset(cp,0,sizeof(*cp));
if (pvr2_ioread_init(cp) < 0) { if (pvr2_ioread_init(cp) < 0) {
kfree(cp); kfree(cp);
return 0; return NULL;
} }
return cp; return cp;
} }
...@@ -105,7 +105,7 @@ void pvr2_ioread_destroy(struct pvr2_ioread *cp) ...@@ -105,7 +105,7 @@ void pvr2_ioread_destroy(struct pvr2_ioread *cp)
pvr2_trace(PVR2_TRACE_STRUCT,"pvr2_ioread_destroy id=%p",cp); pvr2_trace(PVR2_TRACE_STRUCT,"pvr2_ioread_destroy id=%p",cp);
if (cp->sync_key_ptr) { if (cp->sync_key_ptr) {
kfree(cp->sync_key_ptr); kfree(cp->sync_key_ptr);
cp->sync_key_ptr = 0; cp->sync_key_ptr = NULL;
} }
kfree(cp); kfree(cp);
} }
...@@ -124,7 +124,7 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *cp, ...@@ -124,7 +124,7 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *cp,
if (sync_key_len != cp->sync_key_len) { if (sync_key_len != cp->sync_key_len) {
if (cp->sync_key_ptr) { if (cp->sync_key_ptr) {
kfree(cp->sync_key_ptr); kfree(cp->sync_key_ptr);
cp->sync_key_ptr = 0; cp->sync_key_ptr = NULL;
} }
cp->sync_key_len = 0; cp->sync_key_len = 0;
if (sync_key_len) { if (sync_key_len) {
...@@ -144,8 +144,8 @@ static void pvr2_ioread_stop(struct pvr2_ioread *cp) ...@@ -144,8 +144,8 @@ static void pvr2_ioread_stop(struct pvr2_ioread *cp)
pvr2_trace(PVR2_TRACE_START_STOP, pvr2_trace(PVR2_TRACE_START_STOP,
"/*---TRACE_READ---*/ pvr2_ioread_stop id=%p",cp); "/*---TRACE_READ---*/ pvr2_ioread_stop id=%p",cp);
pvr2_stream_kill(cp->stream); pvr2_stream_kill(cp->stream);
cp->c_buf = 0; cp->c_buf = NULL;
cp->c_data_ptr = 0; cp->c_data_ptr = NULL;
cp->c_data_len = 0; cp->c_data_len = 0;
cp->c_data_offs = 0; cp->c_data_offs = 0;
cp->enabled = 0; cp->enabled = 0;
...@@ -179,8 +179,8 @@ static int pvr2_ioread_start(struct pvr2_ioread *cp) ...@@ -179,8 +179,8 @@ static int pvr2_ioread_start(struct pvr2_ioread *cp)
} }
} }
cp->enabled = !0; cp->enabled = !0;
cp->c_buf = 0; cp->c_buf = NULL;
cp->c_data_ptr = 0; cp->c_data_ptr = NULL;
cp->c_data_len = 0; cp->c_data_len = 0;
cp->c_data_offs = 0; cp->c_data_offs = 0;
cp->stream_running = 0; cp->stream_running = 0;
...@@ -214,7 +214,7 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp) ...@@ -214,7 +214,7 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp)
pvr2_ioread_stop(cp); pvr2_ioread_stop(cp);
pvr2_stream_kill(cp->stream); pvr2_stream_kill(cp->stream);
pvr2_stream_set_buffer_count(cp->stream,0); pvr2_stream_set_buffer_count(cp->stream,0);
cp->stream = 0; cp->stream = NULL;
} }
if (sp) { if (sp) {
pvr2_trace(PVR2_TRACE_START_STOP, pvr2_trace(PVR2_TRACE_START_STOP,
...@@ -251,12 +251,8 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl) ...@@ -251,12 +251,8 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl)
return ret; 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; int stat;
...@@ -274,8 +270,8 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) ...@@ -274,8 +270,8 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
pvr2_ioread_stop(cp); pvr2_ioread_stop(cp);
return 0; return 0;
} }
cp->c_buf = 0; cp->c_buf = NULL;
cp->c_data_ptr = 0; cp->c_data_ptr = NULL;
cp->c_data_len = 0; cp->c_data_len = 0;
cp->c_data_offs = 0; cp->c_data_offs = 0;
} }
...@@ -307,7 +303,7 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) ...@@ -307,7 +303,7 @@ int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
return !0; return !0;
} }
void pvr2_ioread_filter(struct pvr2_ioread *cp) static void pvr2_ioread_filter(struct pvr2_ioread *cp)
{ {
unsigned int idx; unsigned int idx;
if (!cp->enabled) return; if (!cp->enabled) return;
......
...@@ -33,7 +33,6 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *, ...@@ -33,7 +33,6 @@ void pvr2_ioread_set_sync_key(struct pvr2_ioread *,
const char *sync_key_ptr, const char *sync_key_ptr,
unsigned int sync_key_len); unsigned int sync_key_len);
int pvr2_ioread_set_enabled(struct pvr2_ioread *,int fl); 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_read(struct pvr2_ioread *,void __user *buf,unsigned int cnt);
int pvr2_ioread_avail(struct pvr2_ioread *); int pvr2_ioread_avail(struct pvr2_ioread *);
......
...@@ -54,7 +54,7 @@ module_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR); ...@@ -54,7 +54,7 @@ module_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(debug, "Debug trace mask"); MODULE_PARM_DESC(debug, "Debug trace mask");
#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS #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 */ #endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
static void pvr_setup_attach(struct pvr2_context *pvr) static void pvr_setup_attach(struct pvr2_context *pvr)
...@@ -104,10 +104,10 @@ static void pvr_disconnect(struct usb_interface *intf) ...@@ -104,10 +104,10 @@ static void pvr_disconnect(struct usb_interface *intf)
} }
static struct usb_driver pvr_driver = { static struct usb_driver pvr_driver = {
name: "pvrusb2", .name = "pvrusb2",
id_table: pvr2_device_table, .id_table = pvr2_device_table,
probe: pvr_probe, .probe = pvr_probe,
disconnect: pvr_disconnect .disconnect = pvr_disconnect
}; };
/* /*
......
...@@ -121,7 +121,7 @@ static const struct std_name *find_std_name(const struct std_name *arrPtr, ...@@ -121,7 +121,7 @@ static const struct std_name *find_std_name(const struct std_name *arrPtr,
if (strlen(p->name) != bufSize) continue; if (strlen(p->name) != bufSize) continue;
if (!memcmp(bufPtr,p->name,bufSize)) return p; 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) ...@@ -289,7 +289,7 @@ static struct v4l2_standard *match_std(v4l2_std_id id)
return generic_standards + idx; return generic_standards + idx;
} }
} }
return 0; return NULL;
} }
static int pvr2_std_fill(struct v4l2_standard *std,v4l2_std_id id) 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, ...@@ -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)", pvr2_trace(PVR2_TRACE_INIT,"Setting up %u unique standard(s)",
std_cnt); std_cnt);
if (!std_cnt) return 0; // paranoia if (!std_cnt) return NULL; // paranoia
stddefs = kmalloc(sizeof(struct v4l2_standard) * std_cnt, stddefs = kmalloc(sizeof(struct v4l2_standard) * std_cnt,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -504,7 +504,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) ...@@ -504,7 +504,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
cip->cptr = cptr; cip->cptr = cptr;
cip->chptr = sfp; cip->chptr = sfp;
cip->item_next = 0; cip->item_next = NULL;
if (sfp->item_last) { if (sfp->item_last) {
sfp->item_last->item_next = cip; sfp->item_last->item_next = cip;
} else { } else {
...@@ -625,7 +625,7 @@ static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) ...@@ -625,7 +625,7 @@ static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
&sfp->debugifc->attr_debuginfo); &sfp->debugifc->attr_debuginfo);
class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd); class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd);
kfree(sfp->debugifc); kfree(sfp->debugifc);
sfp->debugifc = 0; sfp->debugifc = NULL;
} }
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
...@@ -678,9 +678,9 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp) ...@@ -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_v4l_minor_number);
class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number); class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number);
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); 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); 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, ...@@ -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.name = "v4l_minor_number";
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
sfp->attr_v4l_minor_number.show = v4l_minor_number_show; 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); 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.owner = THIS_MODULE;
sfp->attr_unit_number.attr.name = "unit_number"; sfp->attr_unit_number.attr.name = "unit_number";
sfp->attr_unit_number.attr.mode = S_IRUGO; sfp->attr_unit_number.attr.mode = S_IRUGO;
sfp->attr_unit_number.show = unit_number_show; 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); class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
pvr2_sysfs_add_controls(sfp); pvr2_sysfs_add_controls(sfp);
...@@ -806,7 +806,7 @@ struct pvr2_sysfs_class *pvr2_sysfs_class_create(void) ...@@ -806,7 +806,7 @@ struct pvr2_sysfs_class *pvr2_sysfs_class_create(void)
pvr2_sysfs_trace( pvr2_sysfs_trace(
"Registration failed for pvr2_sysfs_class id=%p",clp); "Registration failed for pvr2_sysfs_class id=%p",clp);
kfree(clp); kfree(clp);
clp = 0; clp = NULL;
} }
return clp; return clp;
} }
......
...@@ -69,7 +69,7 @@ static void tuner_update(struct pvr2_tuner_handler *ctxt) ...@@ -69,7 +69,7 @@ static void tuner_update(struct pvr2_tuner_handler *ctxt)
static void pvr2_tuner_detach(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); kfree(ctxt);
} }
......
...@@ -81,7 +81,7 @@ static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; ...@@ -81,7 +81,7 @@ static int video_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
module_param_array(video_nr, int, NULL, 0444); module_param_array(video_nr, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "Offset for device's minor"); MODULE_PARM_DESC(video_nr, "Offset for device's minor");
struct v4l2_capability pvr_capability ={ static struct v4l2_capability pvr_capability ={
.driver = "pvrusb2", .driver = "pvrusb2",
.card = "Hauppauge WinTV pvr-usb2", .card = "Hauppauge WinTV pvr-usb2",
.bus_info = "usb", .bus_info = "usb",
...@@ -111,7 +111,7 @@ static struct v4l2_tuner pvr_v4l2_tuners[]= { ...@@ -111,7 +111,7 @@ static struct v4l2_tuner pvr_v4l2_tuners[]= {
} }
}; };
struct v4l2_fmtdesc pvr_fmtdesc [] = { static struct v4l2_fmtdesc pvr_fmtdesc [] = {
{ {
.index = 0, .index = 0,
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
...@@ -127,7 +127,7 @@ struct v4l2_fmtdesc pvr_fmtdesc [] = { ...@@ -127,7 +127,7 @@ struct v4l2_fmtdesc pvr_fmtdesc [] = {
#define PVR_FORMAT_PIX 0 #define PVR_FORMAT_PIX 0
#define PVR_FORMAT_VBI 1 #define PVR_FORMAT_VBI 1
struct v4l2_format pvr_format [] = { static struct v4l2_format pvr_format [] = {
[PVR_FORMAT_PIX] = { [PVR_FORMAT_PIX] = {
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
.fmt = { .fmt = {
...@@ -701,9 +701,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -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) static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
{ {
pvr2_trace(PVR2_TRACE_INIT, printk(KERN_INFO "pvrusb2: unregistering device video%d [%s]\n",
"unregistering device video%d [%s]", dip->vdev->minor,pvr2_config_get_name(dip->config));
dip->vdev->minor,pvr2_config_get_name(dip->config));
if (dip->ctxt_idx >= 0) { if (dip->ctxt_idx >= 0) {
mutex_lock(&device_lock); mutex_lock(&device_lock);
devices[dip->ctxt_idx] = NULL; devices[dip->ctxt_idx] = NULL;
...@@ -725,7 +724,7 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) ...@@ -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; struct pvr2_v4l2 *vp;
vp = container_of(chp,struct pvr2_v4l2,channel); vp = container_of(chp,struct pvr2_v4l2,channel);
...@@ -735,8 +734,8 @@ void pvr2_v4l2_internal_check(struct pvr2_channel *chp) ...@@ -735,8 +734,8 @@ void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
} }
int pvr2_v4l2_ioctl(struct inode *inode, struct file *file, static int pvr2_v4l2_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
/* Temporary hack : use ivtv api until a v4l2 one is available. */ /* 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, ...@@ -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_fh *fhp = file->private_data;
struct pvr2_v4l2 *vp = fhp->vhead; struct pvr2_v4l2 *vp = fhp->vhead;
...@@ -761,9 +760,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file) ...@@ -761,9 +760,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file)
hdw = fhp->channel.mc_head->hdw; hdw = fhp->channel.mc_head->hdw;
pvr2_hdw_set_streaming(hdw,0); pvr2_hdw_set_streaming(hdw,0);
sp = pvr2_ioread_get_stream(fhp->rhp); 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); pvr2_ioread_destroy(fhp->rhp);
fhp->rhp = 0; fhp->rhp = NULL;
} }
v4l2_prio_close(&vp->prio, &fhp->prio); v4l2_prio_close(&vp->prio, &fhp->prio);
file->private_data = NULL; file->private_data = NULL;
...@@ -779,9 +778,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file) ...@@ -779,9 +778,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file)
} else { } else {
vp->vfirst = fhp->vnext; vp->vfirst = fhp->vnext;
} }
fhp->vnext = 0; fhp->vnext = NULL;
fhp->vprev = 0; fhp->vprev = NULL;
fhp->vhead = 0; fhp->vhead = NULL;
pvr2_channel_done(&fhp->channel); pvr2_channel_done(&fhp->channel);
pvr2_trace(PVR2_TRACE_STRUCT, pvr2_trace(PVR2_TRACE_STRUCT,
"Destroying pvr_v4l2_fh id=%p",fhp); "Destroying pvr_v4l2_fh id=%p",fhp);
...@@ -794,9 +793,9 @@ int pvr2_v4l2_release(struct inode *inode, struct file *file) ...@@ -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_fh *fhp;
struct pvr2_v4l2 *vp; struct pvr2_v4l2 *vp;
struct pvr2_hdw *hdw; struct pvr2_hdw *hdw;
...@@ -854,7 +853,7 @@ int pvr2_v4l2_open(struct inode *inode, struct file *file) ...@@ -854,7 +853,7 @@ int pvr2_v4l2_open(struct inode *inode, struct file *file)
pvr2_context_enter(vp->channel.mc_head); do { pvr2_context_enter(vp->channel.mc_head); do {
pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp); pvr2_trace(PVR2_TRACE_STRUCT,"Creating pvr_v4l2_fh id=%p",fhp);
pvr2_channel_init(&fhp->channel,vp->channel.mc_head); pvr2_channel_init(&fhp->channel,vp->channel.mc_head);
fhp->vnext = 0; fhp->vnext = NULL;
fhp->vprev = vp->vlast; fhp->vprev = vp->vlast;
if (vp->vlast) { if (vp->vlast) {
vp->vlast->vnext = fhp; vp->vlast->vnext = fhp;
...@@ -897,7 +896,7 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh) ...@@ -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); fh->rhp = pvr2_channel_create_mpeg_stream(fh->dev_info->stream);
if (!fh->rhp) { if (!fh->rhp) {
pvr2_channel_claim_stream(&fh->channel,0); pvr2_channel_claim_stream(&fh->channel,NULL);
return -ENOMEM; return -ENOMEM;
} }
...@@ -1078,9 +1077,8 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, ...@@ -1078,9 +1077,8 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
(video_register_device(dip->vdev, v4l_type, -1) < 0)) { (video_register_device(dip->vdev, v4l_type, -1) < 0)) {
err("Failed to register pvrusb2 v4l video device"); err("Failed to register pvrusb2 v4l video device");
} else { } else {
pvr2_trace(PVR2_TRACE_INIT, printk(KERN_INFO "pvrusb2: registered device video%d [%s]\n",
"registered device video%d [%s]", dip->vdev->minor,pvr2_config_get_name(dip->config));
dip->vdev->minor,pvr2_config_get_name(dip->config));
} }
if ((dip->vdev->minor < sizeof(devices)/sizeof(devices[0])) && if ((dip->vdev->minor < sizeof(devices)/sizeof(devices[0])) &&
......
...@@ -126,8 +126,8 @@ static const struct pvr2_v4l_decoder_ops decoder_ops[] = { ...@@ -126,8 +126,8 @@ static const struct pvr2_v4l_decoder_ops decoder_ops[] = {
static void decoder_detach(struct pvr2_v4l_decoder *ctxt) static void decoder_detach(struct pvr2_v4l_decoder *ctxt)
{ {
ctxt->client->handler = 0; ctxt->client->handler = NULL;
ctxt->hdw->decoder_ctrl = 0; ctxt->hdw->decoder_ctrl = NULL;
kfree(ctxt); kfree(ctxt);
} }
......
...@@ -89,7 +89,7 @@ static unsigned int wm8775_describe(struct pvr2_v4l_wm8775 *ctxt, ...@@ -89,7 +89,7 @@ static unsigned int wm8775_describe(struct pvr2_v4l_wm8775 *ctxt,
static void wm8775_detach(struct pvr2_v4l_wm8775 *ctxt) static void wm8775_detach(struct pvr2_v4l_wm8775 *ctxt)
{ {
ctxt->client->handler = 0; ctxt->client->handler = NULL;
kfree(ctxt); kfree(ctxt);
} }
......
...@@ -942,8 +942,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, ...@@ -942,8 +942,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
/* load i2c helpers */ /* load i2c helpers */
if (TUNER_ABSENT != dev->tuner_type) if (TUNER_ABSENT != dev->tuner_type)
request_module("tuner"); request_module("tuner");
if (dev->tda9887_conf)
request_module("tda9887");
if (card_is_empress(dev)) { if (card_is_empress(dev)) {
request_module("saa6752hs"); request_module("saa6752hs");
request_module_depend("saa7134-empress",&need_empress); request_module_depend("saa7134-empress",&need_empress);
......
...@@ -590,8 +590,8 @@ int tda9887_tuner_init(struct i2c_client *c) ...@@ -590,8 +590,8 @@ int tda9887_tuner_init(struct i2c_client *c)
t->set_tv_freq = tda9887_set_freq; t->set_tv_freq = tda9887_set_freq;
t->set_radio_freq = tda9887_set_freq; t->set_radio_freq = tda9887_set_freq;
t->standby = tda9887_standby; t->standby = tda9887_standby;
t->tuner_status=tda9887_tuner_status; t->tuner_status = tda9887_tuner_status;
t->get_afc=tda9887_get_afc; t->get_afc = tda9887_get_afc;
return 0; return 0;
} }
......
...@@ -416,7 +416,7 @@ static void tuner_status(struct i2c_client *client) ...@@ -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; static unsigned default_mode_mask;
/* During client attach, set_type is called by adapter's attach_inform callback. /* 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) ...@@ -608,13 +608,13 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
tuner_dbg("VIDIOCSAUDIO not implemented.\n"); tuner_dbg("VIDIOCSAUDIO not implemented.\n");
break; break;
case TDA9887_SET_CONFIG: case TDA9887_SET_CONFIG:
{ if (t->type == TUNER_TDA9887) {
int *i = arg; int *i = arg;
t->tda9887_config = *i; t->tda9887_config = *i;
set_freq(client, t->tv_freq); set_freq(client, t->tv_freq);
}
break; break;
}
/* --- v4l ioctls --- */ /* --- v4l ioctls --- */
/* take care: bttv does userspace copying, we'll get a /* take care: bttv does userspace copying, we'll get a
kernel pointer here... */ kernel pointer here... */
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev.h> #include <linux/videodev.h>
#include <media/tuner.h> #include <media/tuner.h>
#include <media/v4l2-common.h>
static int offset = 0; static int offset = 0;
module_param(offset, int, 0666); module_param(offset, int, 0666);
...@@ -128,6 +129,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -128,6 +129,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
u8 buffer[4]; u8 buffer[4];
int rc, IFPCoff, i, j; int rc, IFPCoff, i, j;
enum param_type desired_type; enum param_type desired_type;
struct tuner_params *params;
tun = &tuners[t->type]; tun = &tuners[t->type];
...@@ -169,19 +171,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -169,19 +171,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
IFPCoff,t->type); IFPCoff,t->type);
j = 0; j = 0;
} }
params = &tun->params[j];
for (i = 0; i < tun->params[j].count; i++) { for (i = 0; i < params->count; i++) {
if (freq > tun->params[j].ranges[i].limit) if (freq > params->ranges[i].limit)
continue; continue;
break; break;
} }
if (i == tun->params[j].count) { if (i == params->count) {
tuner_dbg("TV frequency out of range (%d > %d)", tuner_dbg("TV frequency out of range (%d > %d)",
freq, tun->params[j].ranges[i - 1].limit); freq, params->ranges[i - 1].limit);
freq = tun->params[j].ranges[--i].limit; freq = params->ranges[--i].limit;
} }
config = tun->params[j].ranges[i].config; config = params->ranges[i].config;
cb = tun->params[j].ranges[i].cb; cb = params->ranges[i].cb;
/* i == 0 -> VHF_LO /* i == 0 -> VHF_LO
* i == 1 -> VHF_HI * i == 1 -> VHF_HI
* i == 2 -> UHF */ * i == 2 -> UHF */
...@@ -281,7 +284,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -281,7 +284,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
break; 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[0] = config;
buffer[1] = cb; buffer[1] = cb;
buffer[2] = (div>>8) & 0x7f; buffer[2] = (div>>8) & 0x7f;
...@@ -293,6 +296,43 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -293,6 +296,43 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
buffer[3] = cb; buffer[3] = cb;
} }
t->last_div = div; 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", tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
buffer[0],buffer[1],buffer[2],buffer[3]); 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) ...@@ -339,6 +379,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
u16 div; u16 div;
int rc, j; int rc, j;
enum param_type desired_type = TUNER_PARAM_TYPE_RADIO; enum param_type desired_type = TUNER_PARAM_TYPE_RADIO;
struct tuner_params *params;
tun = &tuners[t->type]; tun = &tuners[t->type];
...@@ -352,7 +393,8 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) ...@@ -352,7 +393,8 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
j = 0; j = 0;
div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */ 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) { switch (t->type) {
case TUNER_TENA_9533_DI: case TUNER_TENA_9533_DI:
...@@ -384,7 +426,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) ...@@ -384,7 +426,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
} }
buffer[0] = (div>>8) & 0x7f; buffer[0] = (div>>8) & 0x7f;
buffer[1] = div & 0xff; 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[0] = buffer[2];
buffer[1] = buffer[3]; buffer[1] = buffer[3];
buffer[2] = (div>>8) & 0x7f; buffer[2] = (div>>8) & 0x7f;
...@@ -398,6 +440,18 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) ...@@ -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]); buffer[0],buffer[1],buffer[2],buffer[3]);
t->last_div = div; 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))) if (4 != (rc = i2c_master_send(c,buffer,4)))
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); 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[] = { ...@@ -380,6 +380,10 @@ static struct tuner_params tuner_philips_fq1216me_params[] = {
.type = TUNER_PARAM_TYPE_PAL, .type = TUNER_PARAM_TYPE_PAL,
.ranges = tuner_lg_pal_ranges, .ranges = tuner_lg_pal_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -542,6 +546,14 @@ static struct tuner_params tuner_fm1216me_mk3_params[] = {
.ranges = tuner_fm1216me_mk3_pal_ranges, .ranges = tuner_fm1216me_mk3_pal_ranges,
.count = ARRAY_SIZE(tuner_fm1216me_mk3_pal_ranges), .count = ARRAY_SIZE(tuner_fm1216me_mk3_pal_ranges),
.cb_first_if_lower_freq = 1, .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[] = { ...@@ -612,6 +624,10 @@ static struct tuner_params tuner_fm1236_mk3_params[] = {
.ranges = tuner_fm1236_mk3_ntsc_ranges, .ranges = tuner_fm1236_mk3_ntsc_ranges,
.count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges), .count = ARRAY_SIZE(tuner_fm1236_mk3_ntsc_ranges),
.cb_first_if_lower_freq = 1, .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[] = { ...@@ -632,6 +648,8 @@ static struct tuner_params tuner_microtune_4049_fm5_params[] = {
.type = TUNER_PARAM_TYPE_PAL, .type = TUNER_PARAM_TYPE_PAL,
.ranges = tuner_temic_4009f_5_pal_ranges, .ranges = tuner_temic_4009f_5_pal_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -648,6 +666,8 @@ static struct tuner_params tuner_panasonic_vp27_params[] = {
.type = TUNER_PARAM_TYPE_NTSC, .type = TUNER_PARAM_TYPE_NTSC,
.ranges = tuner_panasonic_vp27_ntsc_ranges, .ranges = tuner_panasonic_vp27_ntsc_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -782,6 +802,13 @@ static struct tuner_params tuner_philips_fq1216ame_mk4_params[] = {
.type = TUNER_PARAM_TYPE_PAL, .type = TUNER_PARAM_TYPE_PAL,
.ranges = tuner_philips_fq12_6a___mk4_pal_ranges, .ranges = tuner_philips_fq12_6a___mk4_pal_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -870,6 +897,12 @@ static struct tuner_params tuner_philips_fmd1216me_mk3_params[] = {
.type = TUNER_PARAM_TYPE_PAL, .type = TUNER_PARAM_TYPE_PAL,
.ranges = tuner_philips_fmd1216me_mk3_pal_ranges, .ranges = tuner_philips_fmd1216me_mk3_pal_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -1005,6 +1038,7 @@ static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = {
.type = TUNER_PARAM_TYPE_NTSC, .type = TUNER_PARAM_TYPE_NTSC,
.ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges, .ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges,
.count = ARRAY_SIZE(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[] = { ...@@ -1037,6 +1071,10 @@ static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = {
.type = TUNER_PARAM_TYPE_PAL, .type = TUNER_PARAM_TYPE_PAL,
.ranges = tuner_samsung_tcpg_6121p30a_pal_ranges, .ranges = tuner_samsung_tcpg_6121p30a_pal_ranges,
.count = ARRAY_SIZE(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 ...@@ -73,14 +73,14 @@ static struct HAUPPAUGE_TUNER_FMT
} }
hauppauge_tuner_fmt[] = hauppauge_tuner_fmt[] =
{ {
{ V4L2_STD_UNKNOWN," UNKNOWN" }, { V4L2_STD_UNKNOWN, " UNKNOWN" },
{ V4L2_STD_UNKNOWN," FM" }, { V4L2_STD_UNKNOWN, " FM" },
{ V4L2_STD_PAL_BG, " PAL(B/G)" }, { V4L2_STD_B|V4L2_STD_GH, " PAL(B/G)" },
{ V4L2_STD_NTSC_M, " NTSC(M)" }, { V4L2_STD_MN, " NTSC(M)" },
{ V4L2_STD_PAL_I, " PAL(I)" }, { V4L2_STD_PAL_I, " PAL(I)" },
{ V4L2_STD_SECAM_L," SECAM(L/L')" }, { V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC, " SECAM(L/L')" },
{ V4L2_STD_PAL_DK, " PAL(D/D1/K)" }, { V4L2_STD_DK, " PAL(D/D1/K)" },
{ V4L2_STD_ATSC, " ATSC/DVB Digital" }, { V4L2_STD_ATSC, " ATSC/DVB Digital" },
}; };
/* This is the full list of possible tuners. Many thanks to Hauppauge for /* This is the full list of possible tuners. Many thanks to Hauppauge for
...@@ -219,7 +219,7 @@ hauppauge_tuner[] = ...@@ -219,7 +219,7 @@ hauppauge_tuner[] =
{ TUNER_ABSENT, "Thompson DTT75105"}, { TUNER_ABSENT, "Thompson DTT75105"},
{ TUNER_ABSENT, "Conexant_CX24109"}, { TUNER_ABSENT, "Conexant_CX24109"},
{ TUNER_TCL_2002N, "TCL M2523_5N_E"}, { 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, "Philips 8275A"},
{ TUNER_ABSENT, "Microtune MT2060"}, { TUNER_ABSENT, "Microtune MT2060"},
{ TUNER_ABSENT, "Philips FM1236 MK5"}, { TUNER_ABSENT, "Philips FM1236 MK5"},
......
...@@ -222,14 +222,14 @@ M zr36055[1] 0001 0000c001 00000000 (zr36050[1]) ...@@ -222,14 +222,14 @@ M zr36055[1] 0001 0000c001 00000000 (zr36050[1])
/* ========================= */ /* ========================= */
struct vfe_polarity { struct vfe_polarity {
int vsync_pol:1; unsigned int vsync_pol:1;
int hsync_pol:1; unsigned int hsync_pol:1;
int field_pol:1; unsigned int field_pol:1;
int blank_pol:1; unsigned int blank_pol:1;
int subimg_pol:1; unsigned int subimg_pol:1;
int poe_pol:1; unsigned int poe_pol:1;
int pvalid_pol:1; unsigned int pvalid_pol:1;
int vclk_pol:1; unsigned int vclk_pol:1;
}; };
struct vfe_settings { struct vfe_settings {
......
...@@ -20,6 +20,7 @@ struct tuner_range { ...@@ -20,6 +20,7 @@ struct tuner_range {
struct tuner_params { struct tuner_params {
enum param_type type; enum param_type type;
/* Many Philips based tuners have a comment like this in their /* Many Philips based tuners have a comment like this in their
* datasheet: * datasheet:
* *
...@@ -39,6 +40,60 @@ struct tuner_params { ...@@ -39,6 +40,60 @@ struct tuner_params {
* static unless the control byte was sent first. * static unless the control byte was sent first.
*/ */
unsigned int cb_first_if_lower_freq:1; 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; unsigned int count;
struct tuner_range *ranges; struct tuner_range *ranges;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册