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

Commit c812b67c authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5886): zr36067: Fix problem setting norms



The zr36067 driver doesn't make a distinction between the different sub-types
of NTSC, PAL, or SECAM norms.  For example, when the enum std ioctl returns
the PAL standard it returns PAL_BG|PAL_DK|PAL_H|PAL_I.

When setting the norm, it required the bitmask to match exactly the set of
norms used during the enumeration.  If just one norm was specified, for
example PAL_BG or NTSC_M, it would fail.  This violates the V4L2 spec,
"VIDIOC_S_STD accepts *one* or more flags..."

The key thing to realize is that V4L2_STD_PAL is not one bit, it is multiple
bits.  It's ok to call S_STD with any *one* of those bits, but the driver was
requiring *all* of them.

This fixes the S_STD function so that it will accept any set of one or more
PAL norms as PAL, and the same for NTSC and SECAM.

Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Acked-by: default avatarRonald S. Bultje <rbultje@ronald.bitfreak.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 9c837fb6
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -3704,11 +3704,11 @@ zoran_do_ioctl (struct inode *inode,
		dprintk(3, KERN_DEBUG "%s: VIDIOC_S_STD - norm=0x%llx\n",
		dprintk(3, KERN_DEBUG "%s: VIDIOC_S_STD - norm=0x%llx\n",
			ZR_DEVNAME(zr), (unsigned long long)*std);
			ZR_DEVNAME(zr), (unsigned long long)*std);


		if (*std == V4L2_STD_PAL)
		if ((*std & V4L2_STD_PAL) && !(*std & ~V4L2_STD_PAL))
			norm = VIDEO_MODE_PAL;
			norm = VIDEO_MODE_PAL;
		else if (*std == V4L2_STD_NTSC)
		else if ((*std & V4L2_STD_NTSC) && !(*std & ~V4L2_STD_NTSC))
			norm = VIDEO_MODE_NTSC;
			norm = VIDEO_MODE_NTSC;
		else if (*std == V4L2_STD_SECAM)
		else if ((*std & V4L2_STD_SECAM) && !(*std & ~V4L2_STD_SECAM))
			norm = VIDEO_MODE_SECAM;
			norm = VIDEO_MODE_SECAM;
		else if (*std == V4L2_STD_ALL)
		else if (*std == V4L2_STD_ALL)
			norm = VIDEO_MODE_AUTO;
			norm = VIDEO_MODE_AUTO;