Commit 54a772b8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6:
  [media] tuner-core: fix a 2.6.39 regression with mt20xx
  [media] dvb_frontend: fix race condition in stopping/starting frontend
  [media] media: fix radio-sf16fmr2 build when SND is not enabled
  [media] MEDIA: Fix non-ISA_DMA_API link failure of sound code
  [media] nuvoton-cir: make idle timeout more sane
  [media] mceusb: increase default timeout to 100ms
  [media] mceusb: Timeout unit corrections
  [media] Revert "V4L/DVB: cx23885: Enable Message Signaled Interrupts(MSI)"
parents a6b52a9d a1ad5ec7
...@@ -1988,6 +1988,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) ...@@ -1988,6 +1988,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) { if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0) if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
goto err0; goto err0;
/* If we took control of the bus, we need to force
reinitialization. This is because many ts_bus_ctrl()
functions strobe the RESET pin on the demod, and if the
frontend thread already exists then the dvb_init() routine
won't get called (which is what usually does initial
register configuration). */
fepriv->reinitialise = 1;
} }
if ((ret = dvb_generic_open (inode, file)) < 0) if ((ret = dvb_generic_open (inode, file)) < 0)
......
...@@ -168,7 +168,7 @@ config RADIO_MAXIRADIO ...@@ -168,7 +168,7 @@ config RADIO_MAXIRADIO
config RADIO_MIROPCM20 config RADIO_MIROPCM20
tristate "miroSOUND PCM20 radio" tristate "miroSOUND PCM20 radio"
depends on ISA && VIDEO_V4L2 && SND depends on ISA && ISA_DMA_API && VIDEO_V4L2 && SND
select SND_ISA select SND_ISA
select SND_MIRO select SND_MIRO
---help--- ---help---
...@@ -201,7 +201,7 @@ config RADIO_SF16FMI ...@@ -201,7 +201,7 @@ config RADIO_SF16FMI
config RADIO_SF16FMR2 config RADIO_SF16FMR2
tristate "SF16FMR2 Radio" tristate "SF16FMR2 Radio"
depends on ISA && VIDEO_V4L2 depends on ISA && VIDEO_V4L2 && SND
---help--- ---help---
Choose Y here if you have one of these FM radio cards. Choose Y here if you have one of these FM radio cards.
......
...@@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf, ...@@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
inout, data1); inout, data1);
break; break;
case MCE_CMD_S_TIMEOUT: case MCE_CMD_S_TIMEOUT:
/* value is in units of 50us, so x*50/100 or x/2 ms */ /* value is in units of 50us, so x*50/1000 ms */
dev_info(dev, "%s receive timeout of %d ms\n", dev_info(dev, "%s receive timeout of %d ms\n",
inout, ((data1 << 8) | data2) / 2); inout,
((data1 << 8) | data2) * MCE_TIME_UNIT / 1000);
break; break;
case MCE_CMD_G_TIMEOUT: case MCE_CMD_G_TIMEOUT:
dev_info(dev, "Get receive timeout\n"); dev_info(dev, "Get receive timeout\n");
...@@ -847,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index) ...@@ -847,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
switch (ir->buf_in[index]) { switch (ir->buf_in[index]) {
/* 2-byte return value commands */ /* 2-byte return value commands */
case MCE_CMD_S_TIMEOUT: case MCE_CMD_S_TIMEOUT:
ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2); ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT);
break; break;
/* 1-byte return value commands */ /* 1-byte return value commands */
...@@ -1078,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) ...@@ -1078,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
rc->priv = ir; rc->priv = ir;
rc->driver_type = RC_DRIVER_IR_RAW; rc->driver_type = RC_DRIVER_IR_RAW;
rc->allowed_protos = RC_TYPE_ALL; rc->allowed_protos = RC_TYPE_ALL;
rc->timeout = US_TO_NS(1000); rc->timeout = MS_TO_NS(100);
if (!ir->flags.no_tx) { if (!ir->flags.no_tx) {
rc->s_tx_mask = mceusb_set_tx_mask; rc->s_tx_mask = mceusb_set_tx_mask;
rc->s_tx_carrier = mceusb_set_tx_carrier; rc->s_tx_carrier = mceusb_set_tx_carrier;
......
...@@ -1110,7 +1110,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) ...@@ -1110,7 +1110,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
rdev->dev.parent = &pdev->dev; rdev->dev.parent = &pdev->dev;
rdev->driver_name = NVT_DRIVER_NAME; rdev->driver_name = NVT_DRIVER_NAME;
rdev->map_name = RC_MAP_RC6_MCE; rdev->map_name = RC_MAP_RC6_MCE;
rdev->timeout = US_TO_NS(1000); rdev->timeout = MS_TO_NS(100);
/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
#if 0 #if 0
......
...@@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev, ...@@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
goto fail_irq; goto fail_irq;
} }
if (!pci_enable_msi(pci_dev)) err = request_irq(pci_dev->irq, cx23885_irq,
err = request_irq(pci_dev->irq, cx23885_irq, IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
IRQF_DISABLED, dev->name, dev);
else
err = request_irq(pci_dev->irq, cx23885_irq,
IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
if (err < 0) { if (err < 0) {
printk(KERN_ERR "%s: can't get IRQ %d\n", printk(KERN_ERR "%s: can't get IRQ %d\n",
dev->name, pci_dev->irq); dev->name, pci_dev->irq);
...@@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev) ...@@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
/* unregister stuff */ /* unregister stuff */
free_irq(pci_dev->irq, dev); free_irq(pci_dev->irq, dev);
pci_disable_msi(pci_dev);
cx23885_dev_unregister(dev); cx23885_dev_unregister(dev);
v4l2_device_unregister(v4l2_dev); v4l2_device_unregister(v4l2_dev);
......
...@@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client) ...@@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client)
* returns 0. * returns 0.
* This function is needed for boards that have a separate tuner for * This function is needed for boards that have a separate tuner for
* radio (like devices with tea5767). * radio (like devices with tea5767).
* NOTE: mt20xx uses V4L2_TUNER_DIGITAL_TV and calls set_tv_freq to
* select a TV frequency. So, t_mode = T_ANALOG_TV could actually
* be used to represent a Digital TV too.
*/ */
static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode) static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode)
{ {
if ((1 << mode & t->mode_mask) == 0) int t_mode;
if (mode == V4L2_TUNER_RADIO)
t_mode = T_RADIO;
else
t_mode = T_ANALOG_TV;
if ((t_mode & t->mode_mask) == 0)
return -EINVAL; return -EINVAL;
return 0; return 0;
...@@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe) ...@@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe)
case V4L2_TUNER_RADIO: case V4L2_TUNER_RADIO:
p = "radio"; p = "radio";
break; break;
case V4L2_TUNER_DIGITAL_TV: case V4L2_TUNER_DIGITAL_TV: /* Used by mt20xx */
p = "digital TV"; p = "digital TV";
break; break;
case V4L2_TUNER_ANALOG_TV: case V4L2_TUNER_ANALOG_TV:
...@@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) ...@@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
return 0; return 0;
if (vt->type == t->mode && analog_ops->get_afc) if (vt->type == t->mode && analog_ops->get_afc)
vt->afc = analog_ops->get_afc(&t->fe); vt->afc = analog_ops->get_afc(&t->fe);
if (vt->type == V4L2_TUNER_ANALOG_TV) if (t->mode != V4L2_TUNER_RADIO) {
vt->capability |= V4L2_TUNER_CAP_NORM; vt->capability |= V4L2_TUNER_CAP_NORM;
if (vt->type != V4L2_TUNER_RADIO) {
vt->rangelow = tv_range[0] * 16; vt->rangelow = tv_range[0] * 16;
vt->rangehigh = tv_range[1] * 16; vt->rangehigh = tv_range[1] * 16;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment