提交 52ea1619 编写于 作者: E Eric Sesterhenn / snakebyte 提交者: Greg Kroah-Hartman

[PATCH] USB: Remove LINUX_VERSION_CODE check in pwc/pwc-ctrl.c

this patch removes compatibility with 2.4 kernel, which makes
the code much easier to read.
Signed-off-by: NEric Sesterhenn <snakebyte@gmx.de>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 97906369
......@@ -1152,45 +1152,6 @@ int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor)
/* End of Add-Ons */
/* ************************************************* */
/* Linux 2.5.something and 2.6 pass direct pointers to arguments of
ioctl() calls. With 2.4, you have to do tedious copy_from_user()
and copy_to_user() calls. With these macros we circumvent this,
and let me maintain only one source file. The functionality is
exactly the same otherwise.
*/
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
/* define local variable for arg */
#define ARG_DEF(ARG_type, ARG_name)\
ARG_type *ARG_name = arg;
/* copy arg to local variable */
#define ARG_IN(ARG_name) /* nothing */
/* argument itself (referenced) */
#define ARGR(ARG_name) (*ARG_name)
/* argument address */
#define ARGA(ARG_name) ARG_name
/* copy local variable to arg */
#define ARG_OUT(ARG_name) /* nothing */
#else
#define ARG_DEF(ARG_type, ARG_name)\
ARG_type ARG_name;
#define ARG_IN(ARG_name)\
if (copy_from_user(&ARG_name, arg, sizeof(ARG_name))) {\
ret = -EFAULT;\
break;\
}
#define ARGR(ARG_name) ARG_name
#define ARGA(ARG_name) &ARG_name
#define ARG_OUT(ARG_name)\
if (copy_to_user(arg, &ARG_name, sizeof(ARG_name))) {\
ret = -EFAULT;\
break;\
}
#endif
int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
{
......@@ -1220,243 +1181,206 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
case VIDIOCPWCSCQUAL:
{
ARG_DEF(int, qual)
int *qual = arg;
ARG_IN(qual)
if (ARGR(qual) < 0 || ARGR(qual) > 3)
if (*qual < 0 || *qual > 3)
ret = -EINVAL;
else
ret = pwc_try_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, ARGR(qual), pdev->vsnapshot);
ret = pwc_try_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, *qual, pdev->vsnapshot);
if (ret >= 0)
pdev->vcompression = ARGR(qual);
pdev->vcompression = *qual;
break;
}
case VIDIOCPWCGCQUAL:
{
ARG_DEF(int, qual)
ARGR(qual) = pdev->vcompression;
ARG_OUT(qual)
int *qual = arg;
*qual = pdev->vcompression;
break;
}
case VIDIOCPWCPROBE:
{
ARG_DEF(struct pwc_probe, probe)
strcpy(ARGR(probe).name, pdev->vdev->name);
ARGR(probe).type = pdev->type;
ARG_OUT(probe)
struct pwc_probe *probe = arg;
strcpy(probe->name, pdev->vdev->name);
probe->type = pdev->type;
break;
}
case VIDIOCPWCGSERIAL:
{
ARG_DEF(struct pwc_serial, serial)
strcpy(ARGR(serial).serial, pdev->serial);
ARG_OUT(serial)
struct pwc_serial *serial = arg;
strcpy(serial->serial, pdev->serial);
break;
}
case VIDIOCPWCSAGC:
{
ARG_DEF(int, agc)
ARG_IN(agc)
if (pwc_set_agc(pdev, ARGR(agc) < 0 ? 1 : 0, ARGR(agc)))
int *agc = arg;
if (pwc_set_agc(pdev, *agc < 0 ? 1 : 0, *agc))
ret = -EINVAL;
break;
}
case VIDIOCPWCGAGC:
{
ARG_DEF(int, agc)
int *agc = arg;
if (pwc_get_agc(pdev, ARGA(agc)))
if (pwc_get_agc(pdev, agc))
ret = -EINVAL;
ARG_OUT(agc)
break;
}
case VIDIOCPWCSSHUTTER:
{
ARG_DEF(int, shutter_speed)
ARG_IN(shutter_speed)
ret = pwc_set_shutter_speed(pdev, ARGR(shutter_speed) < 0 ? 1 : 0, ARGR(shutter_speed));
int *shutter_speed = arg;
ret = pwc_set_shutter_speed(pdev, *shutter_speed < 0 ? 1 : 0, *shutter_speed);
break;
}
case VIDIOCPWCSAWB:
{
ARG_DEF(struct pwc_whitebalance, wb)
struct pwc_whitebalance *wb = arg;
ARG_IN(wb)
ret = pwc_set_awb(pdev, ARGR(wb).mode);
if (ret >= 0 && ARGR(wb).mode == PWC_WB_MANUAL) {
pwc_set_red_gain(pdev, ARGR(wb).manual_red);
pwc_set_blue_gain(pdev, ARGR(wb).manual_blue);
ret = pwc_set_awb(pdev, wb->mode);
if (ret >= 0 && wb->mode == PWC_WB_MANUAL) {
pwc_set_red_gain(pdev, wb->manual_red);
pwc_set_blue_gain(pdev, wb->manual_blue);
}
break;
}
case VIDIOCPWCGAWB:
{
ARG_DEF(struct pwc_whitebalance, wb)
struct pwc_whitebalance *wb = arg;
memset(ARGA(wb), 0, sizeof(struct pwc_whitebalance));
ARGR(wb).mode = pwc_get_awb(pdev);
if (ARGR(wb).mode < 0)
memset(wb, 0, sizeof(struct pwc_whitebalance));
wb->mode = pwc_get_awb(pdev);
if (wb->mode < 0)
ret = -EINVAL;
else {
if (ARGR(wb).mode == PWC_WB_MANUAL) {
ret = pwc_get_red_gain(pdev, &ARGR(wb).manual_red);
if (wb->mode == PWC_WB_MANUAL) {
ret = pwc_get_red_gain(pdev, &wb->manual_red);
if (ret < 0)
break;
ret = pwc_get_blue_gain(pdev, &ARGR(wb).manual_blue);
ret = pwc_get_blue_gain(pdev, &wb->manual_blue);
if (ret < 0)
break;
}
if (ARGR(wb).mode == PWC_WB_AUTO) {
ret = pwc_read_red_gain(pdev, &ARGR(wb).read_red);
if (wb->mode == PWC_WB_AUTO) {
ret = pwc_read_red_gain(pdev, &wb->read_red);
if (ret < 0)
break;
ret =pwc_read_blue_gain(pdev, &ARGR(wb).read_blue);
ret = pwc_read_blue_gain(pdev, &wb->read_blue);
if (ret < 0)
break;
}
}
ARG_OUT(wb)
break;
}
case VIDIOCPWCSAWBSPEED:
{
ARG_DEF(struct pwc_wb_speed, wbs)
struct pwc_wb_speed *wbs = arg;
if (ARGR(wbs).control_speed > 0) {
ret = pwc_set_wb_speed(pdev, ARGR(wbs).control_speed);
if (wbs->control_speed > 0) {
ret = pwc_set_wb_speed(pdev, wbs->control_speed);
}
if (ARGR(wbs).control_delay > 0) {
ret = pwc_set_wb_delay(pdev, ARGR(wbs).control_delay);
if (wbs->control_delay > 0) {
ret = pwc_set_wb_delay(pdev, wbs->control_delay);
}
break;
}
case VIDIOCPWCGAWBSPEED:
{
ARG_DEF(struct pwc_wb_speed, wbs)
struct pwc_wb_speed *wbs = arg;
ret = pwc_get_wb_speed(pdev, &ARGR(wbs).control_speed);
ret = pwc_get_wb_speed(pdev, &wbs->control_speed);
if (ret < 0)
break;
ret = pwc_get_wb_delay(pdev, &ARGR(wbs).control_delay);
ret = pwc_get_wb_delay(pdev, &wbs->control_delay);
if (ret < 0)
break;
ARG_OUT(wbs)
break;
}
case VIDIOCPWCSLED:
{
ARG_DEF(struct pwc_leds, leds)
ARG_IN(leds)
ret = pwc_set_leds(pdev, ARGR(leds).led_on, ARGR(leds).led_off);
struct pwc_leds *leds = arg;
ret = pwc_set_leds(pdev, leds->led_on, leds->led_off);
break;
}
case VIDIOCPWCGLED:
{
ARG_DEF(struct pwc_leds, leds)
ret = pwc_get_leds(pdev, &ARGR(leds).led_on, &ARGR(leds).led_off);
ARG_OUT(leds)
struct pwc_leds *leds = arg;
ret = pwc_get_leds(pdev, &leds->led_on, &leds->led_off);
break;
}
case VIDIOCPWCSCONTOUR:
{
ARG_DEF(int, contour)
ARG_IN(contour)
ret = pwc_set_contour(pdev, ARGR(contour));
int *contour = arg;
ret = pwc_set_contour(pdev, *contour);
break;
}
case VIDIOCPWCGCONTOUR:
{
ARG_DEF(int, contour)
ret = pwc_get_contour(pdev, ARGA(contour));
ARG_OUT(contour)
int *contour = arg;
ret = pwc_get_contour(pdev, contour);
break;
}
case VIDIOCPWCSBACKLIGHT:
{
ARG_DEF(int, backlight)
ARG_IN(backlight)
ret = pwc_set_backlight(pdev, ARGR(backlight));
int *backlight = arg;
ret = pwc_set_backlight(pdev, *backlight);
break;
}
case VIDIOCPWCGBACKLIGHT:
{
ARG_DEF(int, backlight)
ret = pwc_get_backlight(pdev, ARGA(backlight));
ARG_OUT(backlight)
int *backlight = arg;
ret = pwc_get_backlight(pdev, backlight);
break;
}
case VIDIOCPWCSFLICKER:
{
ARG_DEF(int, flicker)
ARG_IN(flicker)
ret = pwc_set_flicker(pdev, ARGR(flicker));
int *flicker = arg;
ret = pwc_set_flicker(pdev, *flicker);
break;
}
case VIDIOCPWCGFLICKER:
{
ARG_DEF(int, flicker)
ret = pwc_get_flicker(pdev, ARGA(flicker));
ARG_OUT(flicker)
int *flicker = arg;
ret = pwc_get_flicker(pdev, flicker);
break;
}
case VIDIOCPWCSDYNNOISE:
{
ARG_DEF(int, dynnoise)
ARG_IN(dynnoise)
ret = pwc_set_dynamic_noise(pdev, ARGR(dynnoise));
int *dynnoise = arg;
ret = pwc_set_dynamic_noise(pdev, *dynnoise);
break;
}
case VIDIOCPWCGDYNNOISE:
{
ARG_DEF(int, dynnoise)
ret = pwc_get_dynamic_noise(pdev, ARGA(dynnoise));
ARG_OUT(dynnoise);
int *dynnoise = arg;
ret = pwc_get_dynamic_noise(pdev, dynnoise);
break;
}
case VIDIOCPWCGREALSIZE:
{
ARG_DEF(struct pwc_imagesize, size)
ARGR(size).width = pdev->image.x;
ARGR(size).height = pdev->image.y;
ARG_OUT(size)
struct pwc_imagesize *size = arg;
size->width = pdev->image.x;
size->height = pdev->image.y;
break;
}
......@@ -1464,10 +1388,9 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
{
if (pdev->features & FEATURE_MOTOR_PANTILT)
{
ARG_DEF(int, flags)
int *flags = arg;
ARG_IN(flags)
ret = pwc_mpt_reset(pdev, ARGR(flags));
ret = pwc_mpt_reset(pdev, *flags);
if (ret >= 0)
{
pdev->pan_angle = 0;
......@@ -1485,10 +1408,8 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
{
if (pdev->features & FEATURE_MOTOR_PANTILT)
{
ARG_DEF(struct pwc_mpt_range, range)
ARGR(range) = pdev->angle_range;
ARG_OUT(range)
struct pwc_mpt_range *range = arg;
*range = pdev->angle_range;
}
else
{
......@@ -1503,21 +1424,19 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
if (pdev->features & FEATURE_MOTOR_PANTILT)
{
ARG_DEF(struct pwc_mpt_angles, angles)
ARG_IN(angles)
struct pwc_mpt_angles *angles = arg;
/* The camera can only set relative angles, so
do some calculations when getting an absolute angle .
*/
if (ARGR(angles).absolute)
if (angles->absolute)
{
new_pan = ARGR(angles).pan;
new_tilt = ARGR(angles).tilt;
new_pan = angles->pan;
new_tilt = angles->tilt;
}
else
{
new_pan = pdev->pan_angle + ARGR(angles).pan;
new_tilt = pdev->tilt_angle + ARGR(angles).tilt;
new_pan = pdev->pan_angle + angles->pan;
new_tilt = pdev->tilt_angle + angles->tilt;
}
/* check absolute ranges */
if (new_pan < pdev->angle_range.pan_min ||
......@@ -1560,12 +1479,11 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
if (pdev->features & FEATURE_MOTOR_PANTILT)
{
ARG_DEF(struct pwc_mpt_angles, angles)
struct pwc_mpt_angles *angles = arg;
ARGR(angles).absolute = 1;
ARGR(angles).pan = pdev->pan_angle;
ARGR(angles).tilt = pdev->tilt_angle;
ARG_OUT(angles)
angles->absolute = 1;
angles->pan = pdev->pan_angle;
angles->tilt = pdev->tilt_angle;
}
else
{
......@@ -1578,10 +1496,8 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
{
if (pdev->features & FEATURE_MOTOR_PANTILT)
{
ARG_DEF(struct pwc_mpt_status, status)
ret = pwc_mpt_get_status(pdev, ARGA(status));
ARG_OUT(status)
struct pwc_mpt_status *status = arg;
ret = pwc_mpt_get_status(pdev, status);
}
else
{
......@@ -1592,24 +1508,22 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg)
case VIDIOCPWCGVIDCMD:
{
ARG_DEF(struct pwc_video_command, cmd);
struct pwc_video_command *cmd = arg;
ARGR(cmd).type = pdev->type;
ARGR(cmd).release = pdev->release;
ARGR(cmd).command_len = pdev->cmd_len;
memcpy(&ARGR(cmd).command_buf, pdev->cmd_buf, pdev->cmd_len);
ARGR(cmd).bandlength = pdev->vbandlength;
ARGR(cmd).frame_size = pdev->frame_size;
ARG_OUT(cmd)
cmd->type = pdev->type;
cmd->release = pdev->release;
cmd->command_len = pdev->cmd_len;
memcpy(&cmd->command_buf, pdev->cmd_buf, pdev->cmd_len);
cmd->bandlength = pdev->vbandlength;
cmd->frame_size = pdev->frame_size;
break;
}
/*
case VIDIOCPWCGVIDTABLE:
{
ARG_DEF(struct pwc_table_init_buffer, table);
ARGR(table).len = pdev->cmd_len;
memcpy(&ARGR(table).buffer, pdev->decompress_data, pdev->decompressor->table_size);
ARG_OUT(table)
struct pwc_table_init_buffer *table = arg;
table->len = pdev->cmd_len;
memcpy(&table->buffer, pdev->decompress_data, pdev->decompressor->table_size);
break;
}
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册