Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -594,8 +594,10 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
			print_irqstatus(dev,loop,report,status);


		if (report & SAA7134_IRQ_REPORT_RDCAP /* _INTL */)
			saa7134_irq_video_intl(dev);
		if ((report & SAA7134_IRQ_REPORT_RDCAP) ||
			(report & SAA7134_IRQ_REPORT_INTL))
				saa7134_irq_video_signalchange(dev);


		if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
		    (status & 0x60) == 0)
@@ -1081,7 +1083,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	mutex_unlock(&devlist_lock);

	/* check for signal */
	saa7134_irq_video_intl(dev);
	saa7134_irq_video_signalchange(dev);

	if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
		saa7134_dmasound_init(dev);
+10 −6
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@

static unsigned int video_debug   = 0;
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_max  = 720*576*4;
static char secam[] = "--";
@@ -2454,7 +2454,7 @@ int saa7134_video_init2(struct saa7134_dev *dev)
	return 0;
}

void saa7134_irq_video_intl(struct saa7134_dev *dev)
void saa7134_irq_video_signalchange(struct saa7134_dev *dev)
{
	static const char *st[] = {
		"(no signal)", "NTSC", "PAL", "SECAM" };
@@ -2466,24 +2466,28 @@ void saa7134_irq_video_intl(struct saa7134_dev *dev)
		(st1 & 0x40) ? "not locked" : "locked",
		(st2 & 0x40) ? "no"         : "yes",
		st[st1 & 0x03]);
	dev->nosignal = (st1 & 0x40) || (st2 & 0x40);
	dev->nosignal = (st1 & 0x40) || (st2 & 0x40)  || !(st2 & 0x1);

	if (dev->nosignal) {
		/* no video signal -> mute audio */
		if (dev->ctl_automute)
			dev->automute = 1;
		saa7134_tvaudio_setmute(dev);
		saa_setb(SAA7134_SYNC_CTRL, 0x20);
	} else {
		/* wake up tvaudio audio carrier scan thread */
		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)
		dev->mops->signal_change(dev);
}


void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status)
{
	enum v4l2_field field;
+1 −1
Original line number Diff line number Diff line
@@ -639,7 +639,7 @@ int saa7134_common_ioctl(struct saa7134_dev *dev,

int saa7134_video_init1(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);