media: dvb: move compat handlers into drivers
The VIDEO_STILLPICTURE is only implemented by one driver, while VIDEO_GET_EVENT has two users in tree. In both cases, it is fairly easy to handle the compat ioctls in the native handler rather than relying on translation in fs/compat_ioctls. In effect, this means that now the drivers implement both structure layouts in both native and compat mode, but I don't see anything wrong with that. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
8a24280b11
commit
04b72322e8
@@ -932,7 +932,6 @@ static int dvb_video_get_event (struct av7110 *av7110, struct video_event *event
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* DVB device file operations
|
||||
******************************************************************************/
|
||||
@@ -1095,6 +1094,42 @@ static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
struct compat_video_still_picture {
|
||||
compat_uptr_t iFrame;
|
||||
int32_t size;
|
||||
};
|
||||
#define VIDEO_STILLPICTURE32 _IOW('o', 30, struct compat_video_still_picture)
|
||||
|
||||
struct compat_video_event {
|
||||
__s32 type;
|
||||
/* unused, make sure to use atomic time for y2038 if it ever gets used */
|
||||
compat_long_t timestamp;
|
||||
union {
|
||||
video_size_t size;
|
||||
unsigned int frame_rate; /* in frames per 1000sec */
|
||||
unsigned char vsync_field; /* unknown/odd/even/progressive */
|
||||
} u;
|
||||
};
|
||||
#define VIDEO_GET_EVENT32 _IOR('o', 28, struct compat_video_event)
|
||||
|
||||
static int dvb_compat_video_get_event(struct av7110 *av7110,
|
||||
struct compat_video_event *event, int flags)
|
||||
{
|
||||
struct video_event ev;
|
||||
int ret;
|
||||
|
||||
ret = dvb_video_get_event(av7110, &ev, flags);
|
||||
|
||||
*event = (struct compat_video_event) {
|
||||
.type = ev.type,
|
||||
.timestamp = ev.timestamp,
|
||||
.u.size = ev.u.size,
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dvb_video_ioctl(struct file *file,
|
||||
unsigned int cmd, void *parg)
|
||||
@@ -1184,6 +1219,12 @@ static int dvb_video_ioctl(struct file *file,
|
||||
memcpy(parg, &av7110->videostate, sizeof(struct video_status));
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
case VIDEO_GET_EVENT32:
|
||||
ret = dvb_compat_video_get_event(av7110, parg, file->f_flags);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case VIDEO_GET_EVENT:
|
||||
ret = dvb_video_get_event(av7110, parg, file->f_flags);
|
||||
break;
|
||||
@@ -1226,6 +1267,19 @@ static int dvb_video_ioctl(struct file *file,
|
||||
1, (u16) arg);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
case VIDEO_STILLPICTURE32:
|
||||
{
|
||||
struct compat_video_still_picture *pic =
|
||||
(struct compat_video_still_picture *) parg;
|
||||
av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY;
|
||||
dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
|
||||
ret = play_iframe(av7110, compat_ptr(pic->iFrame),
|
||||
pic->size, file->f_flags & O_NONBLOCK);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
case VIDEO_STILLPICTURE:
|
||||
{
|
||||
struct video_still_picture *pic =
|
||||
|
Reference in New Issue
Block a user