V4L/DVB (4475): Fix most Compat32 stuff on V4L2

Tested on x64 with a bttv board. Most Get ioctls are fixed. The only
non-completely working one is VIDIOCGAUDIO. All other IOR ioctls give the
same results on x86_64 and i386 architectures.
Thanks to Alastair Poole <netstar@gatheringofgray.com> for part of this
patch and tests on ppc64.

Signed-off-by: Alastair Poole <netstar@gatheringofgray.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c
index b69ee11..d82a488 100644
--- a/drivers/media/video/compat_ioctl32.c
+++ b/drivers/media/video/compat_ioctl32.c
@@ -58,6 +58,7 @@
 	return 0;
 }
 
+
 struct video_buffer32 {
 	compat_caddr_t base;
 	compat_int_t height, width, depth, bytesperline;
@@ -618,6 +619,7 @@
 		struct video_buffer vb;
 		struct video_window vw;
 		struct video_code vc;
+		struct video_audio va;
 #endif
 		struct v4l2_format v2f;
 		struct v4l2_buffer v2b;
@@ -635,31 +637,31 @@
 	/* First, convert the command. */
 	switch(cmd) {
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
-	case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break;
-	case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break;
-	case VIDIOCGWIN32: cmd = VIDIOCGWIN; break;
-	case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break;
-	case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break;
-	case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break;
-	case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break;
-	case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
+	case VIDIOCGTUNER32: realcmd = cmd = VIDIOCGTUNER; break;
+	case VIDIOCSTUNER32: realcmd = cmd = VIDIOCSTUNER; break;
+	case VIDIOCGWIN32: realcmd = cmd = VIDIOCGWIN; break;
+	case VIDIOCGFBUF32: realcmd = cmd = VIDIOCGFBUF; break;
+	case VIDIOCSFBUF32: realcmd = cmd = VIDIOCSFBUF; break;
+	case VIDIOCGFREQ32: realcmd = cmd = VIDIOCGFREQ; break;
+	case VIDIOCSFREQ32: realcmd = cmd = VIDIOCSFREQ; break;
+	case VIDIOCSMICROCODE32: realcmd = cmd = VIDIOCSMICROCODE; break;
 #endif
-	case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break;
-	case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break;
-	case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break;
-	case VIDIOC_QBUF32: cmd = VIDIOC_QBUF; break;
-	case VIDIOC_DQBUF32: cmd = VIDIOC_DQBUF; break;
-	case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break;
-	case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break;
-	case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break;
-	case VIDIOC_S_FBUF32: cmd = VIDIOC_S_FBUF; break;
-	case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break;
+	case VIDIOC_G_FMT32: realcmd = cmd = VIDIOC_G_FMT; break;
+	case VIDIOC_S_FMT32: realcmd = cmd = VIDIOC_S_FMT; break;
+	case VIDIOC_QUERYBUF32: realcmd = cmd = VIDIOC_QUERYBUF; break;
+	case VIDIOC_QBUF32: realcmd = cmd = VIDIOC_QBUF; break;
+	case VIDIOC_DQBUF32: realcmd = cmd = VIDIOC_DQBUF; break;
+	case VIDIOC_STREAMON32: realcmd = cmd = VIDIOC_STREAMON; break;
+	case VIDIOC_STREAMOFF32: realcmd = cmd = VIDIOC_STREAMOFF; break;
+	case VIDIOC_G_FBUF32: realcmd = cmd = VIDIOC_G_FBUF; break;
+	case VIDIOC_S_FBUF32: realcmd = cmd = VIDIOC_S_FBUF; break;
+	case VIDIOC_OVERLAY32: realcmd = cmd = VIDIOC_OVERLAY; break;
 	case VIDIOC_ENUMSTD32: realcmd = VIDIOC_ENUMSTD; break;
 	case VIDIOC_ENUMINPUT32: realcmd = VIDIOC_ENUMINPUT; break;
-	case VIDIOC_S_CTRL32: cmd = VIDIOC_S_CTRL; break;
-	case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
-	case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
-	case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
+	case VIDIOC_S_CTRL32: realcmd = cmd = VIDIOC_S_CTRL; break;
+	case VIDIOC_G_INPUT32: realcmd = cmd = VIDIOC_G_INPUT; break;
+	case VIDIOC_S_INPUT32: realcmd = cmd = VIDIOC_S_INPUT; break;
+	case VIDIOC_TRY_FMT32: realcmd = cmd = VIDIOC_TRY_FMT; break;
 	};
 
 	switch(cmd) {
@@ -676,6 +678,7 @@
 		compatible_arg = 0;
 		break;
 
+
 	case VIDIOCSFREQ:
 #endif
 	case VIDIOC_S_INPUT:
@@ -683,7 +686,7 @@
 	case VIDIOC_STREAMON:
 	case VIDIOC_STREAMOFF:
 		err = get_user(karg.vx, (u32 __user *)up);
-		compatible_arg = 0;
+		compatible_arg = 1;
 		break;
 
 	case VIDIOC_S_FBUF:
@@ -739,6 +742,7 @@
 	case VIDIOC_G_FBUF:
 	case VIDIOC_G_INPUT:
 		compatible_arg = 0;
+		break;
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
 	case VIDIOCSMICROCODE:
 		err = microcode32(&karg.vc, up);
@@ -755,7 +759,7 @@
 		mm_segment_t old_fs = get_fs();
 
 		set_fs(KERNEL_DS);
-		err = native_ioctl(file, realcmd, (unsigned long)&karg);
+		err = native_ioctl(file, realcmd, (unsigned long) &karg);
 		set_fs(old_fs);
 	}
 	if(err == 0) {
@@ -772,6 +776,7 @@
 		case VIDIOCGFBUF:
 			err = put_video_buffer32(&karg.vb, up);
 			break;
+
 #endif
 		case VIDIOC_G_FBUF:
 			err = put_v4l2_framebuffer32(&karg.v2fb, up);
@@ -841,10 +846,14 @@
 	case VIDIOCSFBUF32:
 	case VIDIOCGFREQ32:
 	case VIDIOCSFREQ32:
+	case VIDIOCGAUDIO:
+	case VIDIOCSAUDIO:
 #endif
 	case VIDIOC_QUERYCAP:
 	case VIDIOC_ENUM_FMT:
 	case VIDIOC_G_FMT32:
+	case VIDIOC_CROPCAP:
+	case VIDIOC_S_CROP:
 	case VIDIOC_S_FMT32:
 	case VIDIOC_REQBUFS:
 	case VIDIOC_QUERYBUF32:
@@ -882,8 +891,6 @@
 	case VIDIOCSPICT:
 	case VIDIOCCAPTURE:
 	case VIDIOCKEY:
-	case VIDIOCGAUDIO:
-	case VIDIOCSAUDIO:
 	case VIDIOCSYNC:
 	case VIDIOCMCAPTURE:
 	case VIDIOCGMBUF: