diff options
Diffstat (limited to 'drivers/media/video/s2255drv.c')
-rw-r--r-- | drivers/media/video/s2255drv.c | 166 |
1 files changed, 62 insertions, 104 deletions
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index 882a79679dc6..631a84eea1ae 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c | |||
@@ -310,7 +310,7 @@ struct s2255_fh { | |||
310 | /* Need DSP version 5+ for video status feature */ | 310 | /* Need DSP version 5+ for video status feature */ |
311 | #define S2255_MIN_DSP_STATUS 5 | 311 | #define S2255_MIN_DSP_STATUS 5 |
312 | #define S2255_MAJOR_VERSION 1 | 312 | #define S2255_MAJOR_VERSION 1 |
313 | #define S2255_MINOR_VERSION 16 | 313 | #define S2255_MINOR_VERSION 17 |
314 | #define S2255_RELEASE 0 | 314 | #define S2255_RELEASE 0 |
315 | #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \ | 315 | #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \ |
316 | S2255_MINOR_VERSION, \ | 316 | S2255_MINOR_VERSION, \ |
@@ -384,49 +384,6 @@ MODULE_DEVICE_TABLE(usb, s2255_table); | |||
384 | 384 | ||
385 | #define BUFFER_TIMEOUT msecs_to_jiffies(400) | 385 | #define BUFFER_TIMEOUT msecs_to_jiffies(400) |
386 | 386 | ||
387 | /* supported controls */ | ||
388 | static struct v4l2_queryctrl s2255_qctrl[] = { | ||
389 | { | ||
390 | .id = V4L2_CID_BRIGHTNESS, | ||
391 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
392 | .name = "Brightness", | ||
393 | .minimum = -127, | ||
394 | .maximum = 128, | ||
395 | .step = 1, | ||
396 | .default_value = 0, | ||
397 | .flags = 0, | ||
398 | }, { | ||
399 | .id = V4L2_CID_CONTRAST, | ||
400 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
401 | .name = "Contrast", | ||
402 | .minimum = 0, | ||
403 | .maximum = 255, | ||
404 | .step = 0x1, | ||
405 | .default_value = DEF_CONTRAST, | ||
406 | .flags = 0, | ||
407 | }, { | ||
408 | .id = V4L2_CID_SATURATION, | ||
409 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
410 | .name = "Saturation", | ||
411 | .minimum = 0, | ||
412 | .maximum = 255, | ||
413 | .step = 0x1, | ||
414 | .default_value = DEF_SATURATION, | ||
415 | .flags = 0, | ||
416 | }, { | ||
417 | .id = V4L2_CID_HUE, | ||
418 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
419 | .name = "Hue", | ||
420 | .minimum = 0, | ||
421 | .maximum = 255, | ||
422 | .step = 0x1, | ||
423 | .default_value = DEF_HUE, | ||
424 | .flags = 0, | ||
425 | } | ||
426 | }; | ||
427 | |||
428 | static int qctl_regs[ARRAY_SIZE(s2255_qctrl)]; | ||
429 | |||
430 | /* image formats. */ | 387 | /* image formats. */ |
431 | static const struct s2255_fmt formats[] = { | 388 | static const struct s2255_fmt formats[] = { |
432 | { | 389 | { |
@@ -1472,74 +1429,82 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i) | |||
1472 | static int vidioc_queryctrl(struct file *file, void *priv, | 1429 | static int vidioc_queryctrl(struct file *file, void *priv, |
1473 | struct v4l2_queryctrl *qc) | 1430 | struct v4l2_queryctrl *qc) |
1474 | { | 1431 | { |
1475 | int i; | 1432 | switch (qc->id) { |
1476 | 1433 | case V4L2_CID_BRIGHTNESS: | |
1477 | for (i = 0; i < ARRAY_SIZE(s2255_qctrl); i++) | 1434 | v4l2_ctrl_query_fill(qc, -127, 127, 1, DEF_BRIGHT); |
1478 | if (qc->id && qc->id == s2255_qctrl[i].id) { | 1435 | break; |
1479 | memcpy(qc, &(s2255_qctrl[i]), sizeof(*qc)); | 1436 | case V4L2_CID_CONTRAST: |
1480 | return 0; | 1437 | v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_CONTRAST); |
1481 | } | 1438 | break; |
1482 | 1439 | case V4L2_CID_SATURATION: | |
1483 | dprintk(4, "query_ctrl -EINVAL %d\n", qc->id); | 1440 | v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_SATURATION); |
1484 | return -EINVAL; | 1441 | break; |
1442 | case V4L2_CID_HUE: | ||
1443 | v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_HUE); | ||
1444 | break; | ||
1445 | default: | ||
1446 | return -EINVAL; | ||
1447 | } | ||
1448 | dprintk(4, "%s, id %d\n", __func__, qc->id); | ||
1449 | return 0; | ||
1485 | } | 1450 | } |
1486 | 1451 | ||
1487 | static int vidioc_g_ctrl(struct file *file, void *priv, | 1452 | static int vidioc_g_ctrl(struct file *file, void *priv, |
1488 | struct v4l2_control *ctrl) | 1453 | struct v4l2_control *ctrl) |
1489 | { | 1454 | { |
1490 | int i; | 1455 | struct s2255_fh *fh = priv; |
1491 | 1456 | switch (ctrl->id) { | |
1492 | for (i = 0; i < ARRAY_SIZE(s2255_qctrl); i++) | 1457 | case V4L2_CID_BRIGHTNESS: |
1493 | if (ctrl->id == s2255_qctrl[i].id) { | 1458 | ctrl->value = fh->mode.bright; |
1494 | ctrl->value = qctl_regs[i]; | 1459 | break; |
1495 | return 0; | 1460 | case V4L2_CID_CONTRAST: |
1496 | } | 1461 | ctrl->value = fh->mode.contrast; |
1497 | dprintk(4, "g_ctrl -EINVAL\n"); | 1462 | break; |
1498 | 1463 | case V4L2_CID_SATURATION: | |
1499 | return -EINVAL; | 1464 | ctrl->value = fh->mode.saturation; |
1465 | break; | ||
1466 | case V4L2_CID_HUE: | ||
1467 | ctrl->value = fh->mode.hue; | ||
1468 | break; | ||
1469 | default: | ||
1470 | return -EINVAL; | ||
1471 | } | ||
1472 | dprintk(4, "%s, id %d val %d\n", __func__, ctrl->id, ctrl->value); | ||
1473 | return 0; | ||
1500 | } | 1474 | } |
1501 | 1475 | ||
1502 | static int vidioc_s_ctrl(struct file *file, void *priv, | 1476 | static int vidioc_s_ctrl(struct file *file, void *priv, |
1503 | struct v4l2_control *ctrl) | 1477 | struct v4l2_control *ctrl) |
1504 | { | 1478 | { |
1505 | int i; | ||
1506 | struct s2255_fh *fh = priv; | 1479 | struct s2255_fh *fh = priv; |
1507 | struct s2255_dev *dev = fh->dev; | 1480 | struct s2255_dev *dev = fh->dev; |
1508 | struct s2255_mode *mode; | 1481 | struct s2255_mode *mode; |
1509 | mode = &fh->mode; | 1482 | mode = &fh->mode; |
1510 | dprintk(4, "vidioc_s_ctrl\n"); | 1483 | dprintk(4, "%s\n", __func__); |
1511 | for (i = 0; i < ARRAY_SIZE(s2255_qctrl); i++) { | 1484 | /* update the mode to the corresponding value */ |
1512 | if (ctrl->id == s2255_qctrl[i].id) { | 1485 | switch (ctrl->id) { |
1513 | if (ctrl->value < s2255_qctrl[i].minimum || | 1486 | case V4L2_CID_BRIGHTNESS: |
1514 | ctrl->value > s2255_qctrl[i].maximum) | 1487 | mode->bright = ctrl->value; |
1515 | return -ERANGE; | 1488 | break; |
1516 | 1489 | case V4L2_CID_CONTRAST: | |
1517 | qctl_regs[i] = ctrl->value; | 1490 | mode->contrast = ctrl->value; |
1518 | /* update the mode to the corresponding value */ | 1491 | break; |
1519 | switch (ctrl->id) { | 1492 | case V4L2_CID_HUE: |
1520 | case V4L2_CID_BRIGHTNESS: | 1493 | mode->hue = ctrl->value; |
1521 | mode->bright = ctrl->value; | 1494 | break; |
1522 | break; | 1495 | case V4L2_CID_SATURATION: |
1523 | case V4L2_CID_CONTRAST: | 1496 | mode->saturation = ctrl->value; |
1524 | mode->contrast = ctrl->value; | 1497 | break; |
1525 | break; | 1498 | default: |
1526 | case V4L2_CID_HUE: | 1499 | return -EINVAL; |
1527 | mode->hue = ctrl->value; | ||
1528 | break; | ||
1529 | case V4L2_CID_SATURATION: | ||
1530 | mode->saturation = ctrl->value; | ||
1531 | break; | ||
1532 | } | ||
1533 | mode->restart = 0; | ||
1534 | /* set mode here. Note: stream does not need restarted. | ||
1535 | some V4L programs restart stream unnecessarily | ||
1536 | after a s_crtl. | ||
1537 | */ | ||
1538 | s2255_set_mode(dev, fh->channel, mode); | ||
1539 | return 0; | ||
1540 | } | ||
1541 | } | 1500 | } |
1542 | return -EINVAL; | 1501 | mode->restart = 0; |
1502 | /* set mode here. Note: stream does not need restarted. | ||
1503 | some V4L programs restart stream unnecessarily | ||
1504 | after a s_crtl. | ||
1505 | */ | ||
1506 | s2255_set_mode(dev, fh->channel, mode); | ||
1507 | return 0; | ||
1543 | } | 1508 | } |
1544 | 1509 | ||
1545 | static int vidioc_g_jpegcomp(struct file *file, void *priv, | 1510 | static int vidioc_g_jpegcomp(struct file *file, void *priv, |
@@ -1701,18 +1666,11 @@ static int s2255_open(struct file *file) | |||
1701 | fh->width = LINE_SZ_4CIFS_NTSC; | 1666 | fh->width = LINE_SZ_4CIFS_NTSC; |
1702 | fh->height = NUM_LINES_4CIFS_NTSC * 2; | 1667 | fh->height = NUM_LINES_4CIFS_NTSC * 2; |
1703 | fh->channel = cur_channel; | 1668 | fh->channel = cur_channel; |
1704 | |||
1705 | /* configure channel to default state */ | 1669 | /* configure channel to default state */ |
1706 | if (!dev->chn_configured[cur_channel]) { | 1670 | if (!dev->chn_configured[cur_channel]) { |
1707 | s2255_set_mode(dev, cur_channel, &fh->mode); | 1671 | s2255_set_mode(dev, cur_channel, &fh->mode); |
1708 | dev->chn_configured[cur_channel] = 1; | 1672 | dev->chn_configured[cur_channel] = 1; |
1709 | } | 1673 | } |
1710 | |||
1711 | |||
1712 | /* Put all controls at a sane state */ | ||
1713 | for (i = 0; i < ARRAY_SIZE(s2255_qctrl); i++) | ||
1714 | qctl_regs[i] = s2255_qctrl[i].default_value; | ||
1715 | |||
1716 | dprintk(1, "s2255drv: open dev=%s type=%s users=%d\n", | 1674 | dprintk(1, "s2255drv: open dev=%s type=%s users=%d\n", |
1717 | video_device_node_name(vdev), v4l2_type_names[type], | 1675 | video_device_node_name(vdev), v4l2_type_names[type], |
1718 | dev->users[cur_channel]); | 1676 | dev->users[cur_channel]); |