Commit 11f7078c authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Mauro Carvalho Chehab

V4L/DVB (6272): V4L: properly fix support for capturing interlaced video in saa7134

By "capturing interlaced video" I mean that card ensures that top field
is really top and vice versa (I think it takes the filed ID from signal)
Properly turn on/off that support depending on signal state
Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent cb71201f
...@@ -594,8 +594,10 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id) ...@@ -594,8 +594,10 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
print_irqstatus(dev,loop,report,status); print_irqstatus(dev,loop,report,status);
if (report & SAA7134_IRQ_REPORT_RDCAP /* _INTL */) if ((report & SAA7134_IRQ_REPORT_RDCAP) ||
saa7134_irq_video_intl(dev); (report & SAA7134_IRQ_REPORT_INTL))
saa7134_irq_video_signalchange(dev);
if ((report & SAA7134_IRQ_REPORT_DONE_RA0) && if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
(status & 0x60) == 0) (status & 0x60) == 0)
...@@ -1081,7 +1083,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, ...@@ -1081,7 +1083,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
mutex_unlock(&devlist_lock); mutex_unlock(&devlist_lock);
/* check for signal */ /* check for signal */
saa7134_irq_video_intl(dev); saa7134_irq_video_signalchange(dev);
if (saa7134_dmasound_init && !dev->dmasound.priv_data) { if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
saa7134_dmasound_init(dev); saa7134_dmasound_init(dev);
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
static unsigned int video_debug = 0; static unsigned int video_debug = 0;
static unsigned int gbuffers = 8; static unsigned int gbuffers = 8;
static unsigned int noninterlaced = 1; static unsigned int noninterlaced = 0;
static unsigned int gbufsize = 720*576*4; static unsigned int gbufsize = 720*576*4;
static unsigned int gbufsize_max = 720*576*4; static unsigned int gbufsize_max = 720*576*4;
static char secam[] = "--"; static char secam[] = "--";
...@@ -2454,7 +2454,7 @@ int saa7134_video_init2(struct saa7134_dev *dev) ...@@ -2454,7 +2454,7 @@ int saa7134_video_init2(struct saa7134_dev *dev)
return 0; return 0;
} }
void saa7134_irq_video_intl(struct saa7134_dev *dev) void saa7134_irq_video_signalchange(struct saa7134_dev *dev)
{ {
static const char *st[] = { static const char *st[] = {
"(no signal)", "NTSC", "PAL", "SECAM" }; "(no signal)", "NTSC", "PAL", "SECAM" };
...@@ -2466,24 +2466,28 @@ void saa7134_irq_video_intl(struct saa7134_dev *dev) ...@@ -2466,24 +2466,28 @@ void saa7134_irq_video_intl(struct saa7134_dev *dev)
(st1 & 0x40) ? "not locked" : "locked", (st1 & 0x40) ? "not locked" : "locked",
(st2 & 0x40) ? "no" : "yes", (st2 & 0x40) ? "no" : "yes",
st[st1 & 0x03]); st[st1 & 0x03]);
dev->nosignal = (st1 & 0x40) || (st2 & 0x40); dev->nosignal = (st1 & 0x40) || (st2 & 0x40) || !(st2 & 0x1);
if (dev->nosignal) { if (dev->nosignal) {
/* no video signal -> mute audio */ /* no video signal -> mute audio */
if (dev->ctl_automute) if (dev->ctl_automute)
dev->automute = 1; dev->automute = 1;
saa7134_tvaudio_setmute(dev); saa7134_tvaudio_setmute(dev);
saa_setb(SAA7134_SYNC_CTRL, 0x20);
} else { } else {
/* wake up tvaudio audio carrier scan thread */ /* wake up tvaudio audio carrier scan thread */
saa7134_tvaudio_do_scan(dev); saa7134_tvaudio_do_scan(dev);
if (!noninterlaced)
saa_clearb(SAA7134_SYNC_CTRL, 0x20);
} }
if ((st2 & 0x80) && !noninterlaced && !dev->nosignal)
saa_clearb(SAA7134_SYNC_CTRL, 0x20);
else
saa_setb(SAA7134_SYNC_CTRL, 0x20);
if (dev->mops && dev->mops->signal_change) if (dev->mops && dev->mops->signal_change)
dev->mops->signal_change(dev); dev->mops->signal_change(dev);
} }
void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status) void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status)
{ {
enum v4l2_field field; enum v4l2_field field;
......
...@@ -639,7 +639,7 @@ int saa7134_common_ioctl(struct saa7134_dev *dev, ...@@ -639,7 +639,7 @@ int saa7134_common_ioctl(struct saa7134_dev *dev,
int saa7134_video_init1(struct saa7134_dev *dev); int saa7134_video_init1(struct saa7134_dev *dev);
int saa7134_video_init2(struct saa7134_dev *dev); int saa7134_video_init2(struct saa7134_dev *dev);
void saa7134_irq_video_intl(struct saa7134_dev *dev); void saa7134_irq_video_signalchange(struct saa7134_dev *dev);
void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status); void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status);
......
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