| .. | .. |
|---|
| 52 | 52 | |
|---|
| 53 | 53 | static struct tm6000_fmt format[] = { |
|---|
| 54 | 54 | { |
|---|
| 55 | | - .name = "4:2:2, packed, YVY2", |
|---|
| 56 | 55 | .fourcc = V4L2_PIX_FMT_YUYV, |
|---|
| 57 | 56 | .depth = 16, |
|---|
| 58 | 57 | }, { |
|---|
| 59 | | - .name = "4:2:2, packed, UYVY", |
|---|
| 60 | 58 | .fourcc = V4L2_PIX_FMT_UYVY, |
|---|
| 61 | 59 | .depth = 16, |
|---|
| 62 | 60 | }, { |
|---|
| 63 | | - .name = "A/V + VBI mux packet", |
|---|
| 64 | 61 | .fourcc = V4L2_PIX_FMT_TM6000, |
|---|
| 65 | 62 | .depth = 16, |
|---|
| 66 | 63 | } |
|---|
| .. | .. |
|---|
| 106 | 103 | dprintk(dev, V4L2_DEBUG_ISOC, "[%p/%d] wakeup\n", buf, buf->vb.i); |
|---|
| 107 | 104 | buf->vb.state = VIDEOBUF_DONE; |
|---|
| 108 | 105 | buf->vb.field_count++; |
|---|
| 109 | | - v4l2_get_timestamp(&buf->vb.ts); |
|---|
| 106 | + buf->vb.ts = ktime_get_ns(); |
|---|
| 110 | 107 | |
|---|
| 111 | 108 | list_del(&buf->vb.queue); |
|---|
| 112 | 109 | wake_up(&buf->vb.done); |
|---|
| .. | .. |
|---|
| 180 | 177 | field = (header >> 11) & 0x1; |
|---|
| 181 | 178 | line = (header >> 12) & 0x1ff; |
|---|
| 182 | 179 | cmd = (header >> 21) & 0x7; |
|---|
| 183 | | - /* Validates haeder fields */ |
|---|
| 180 | + /* Validates header fields */ |
|---|
| 184 | 181 | if (size > TM6000_URB_MSG_LEN) |
|---|
| 185 | 182 | size = TM6000_URB_MSG_LEN; |
|---|
| 186 | 183 | pktsize = TM6000_URB_MSG_LEN; |
|---|
| .. | .. |
|---|
| 419 | 416 | { |
|---|
| 420 | 417 | struct tm6000_dmaqueue *dma_q = urb->context; |
|---|
| 421 | 418 | struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq); |
|---|
| 419 | + unsigned long flags; |
|---|
| 422 | 420 | int i; |
|---|
| 423 | 421 | |
|---|
| 424 | 422 | switch (urb->status) { |
|---|
| .. | .. |
|---|
| 436 | 434 | break; |
|---|
| 437 | 435 | } |
|---|
| 438 | 436 | |
|---|
| 439 | | - spin_lock(&dev->slock); |
|---|
| 437 | + spin_lock_irqsave(&dev->slock, flags); |
|---|
| 440 | 438 | tm6000_isoc_copy(urb); |
|---|
| 441 | | - spin_unlock(&dev->slock); |
|---|
| 439 | + spin_unlock_irqrestore(&dev->slock, flags); |
|---|
| 442 | 440 | |
|---|
| 443 | 441 | /* Reset urb buffers */ |
|---|
| 444 | 442 | for (i = 0; i < urb->number_of_packets; i++) { |
|---|
| .. | .. |
|---|
| 854 | 852 | struct v4l2_capability *cap) |
|---|
| 855 | 853 | { |
|---|
| 856 | 854 | struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev; |
|---|
| 857 | | - struct video_device *vdev = video_devdata(file); |
|---|
| 858 | 855 | |
|---|
| 859 | | - strlcpy(cap->driver, "tm6000", sizeof(cap->driver)); |
|---|
| 860 | | - strlcpy(cap->card, "Trident TVMaster TM5600/6000/6010", sizeof(cap->card)); |
|---|
| 856 | + strscpy(cap->driver, "tm6000", sizeof(cap->driver)); |
|---|
| 857 | + strscpy(cap->card, "Trident TM5600/6000/6010", sizeof(cap->card)); |
|---|
| 861 | 858 | usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info)); |
|---|
| 859 | + cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | |
|---|
| 860 | + V4L2_CAP_DEVICE_CAPS; |
|---|
| 862 | 861 | if (dev->tuner_type != TUNER_ABSENT) |
|---|
| 863 | | - cap->device_caps |= V4L2_CAP_TUNER; |
|---|
| 864 | | - if (vdev->vfl_type == VFL_TYPE_GRABBER) |
|---|
| 865 | | - cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE | |
|---|
| 866 | | - V4L2_CAP_STREAMING | |
|---|
| 867 | | - V4L2_CAP_READWRITE; |
|---|
| 868 | | - else |
|---|
| 869 | | - cap->device_caps |= V4L2_CAP_RADIO; |
|---|
| 870 | | - cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | |
|---|
| 871 | | - V4L2_CAP_RADIO | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE; |
|---|
| 862 | + cap->capabilities |= V4L2_CAP_TUNER; |
|---|
| 863 | + if (dev->caps.has_radio) |
|---|
| 864 | + cap->capabilities |= V4L2_CAP_RADIO; |
|---|
| 872 | 865 | |
|---|
| 873 | 866 | return 0; |
|---|
| 874 | 867 | } |
|---|
| .. | .. |
|---|
| 879 | 872 | if (f->index >= ARRAY_SIZE(format)) |
|---|
| 880 | 873 | return -EINVAL; |
|---|
| 881 | 874 | |
|---|
| 882 | | - strlcpy(f->description, format[f->index].name, sizeof(f->description)); |
|---|
| 883 | 875 | f->pixelformat = format[f->index].fourcc; |
|---|
| 884 | 876 | return 0; |
|---|
| 885 | 877 | } |
|---|
| .. | .. |
|---|
| 1091 | 1083 | else |
|---|
| 1092 | 1084 | i->type = V4L2_INPUT_TYPE_CAMERA; |
|---|
| 1093 | 1085 | |
|---|
| 1094 | | - strcpy(i->name, iname[dev->vinput[n].type]); |
|---|
| 1086 | + strscpy(i->name, iname[dev->vinput[n].type], sizeof(i->name)); |
|---|
| 1095 | 1087 | |
|---|
| 1096 | 1088 | i->std = TM6000_STD; |
|---|
| 1097 | 1089 | |
|---|
| .. | .. |
|---|
| 1188 | 1180 | if (0 != t->index) |
|---|
| 1189 | 1181 | return -EINVAL; |
|---|
| 1190 | 1182 | |
|---|
| 1191 | | - strcpy(t->name, "Television"); |
|---|
| 1183 | + strscpy(t->name, "Television", sizeof(t->name)); |
|---|
| 1192 | 1184 | t->type = V4L2_TUNER_ANALOG_TV; |
|---|
| 1193 | 1185 | t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO; |
|---|
| 1194 | 1186 | t->rangehigh = 0xffffffffUL; |
|---|
| .. | .. |
|---|
| 1268 | 1260 | return -EINVAL; |
|---|
| 1269 | 1261 | |
|---|
| 1270 | 1262 | memset(t, 0, sizeof(*t)); |
|---|
| 1271 | | - strcpy(t->name, "Radio"); |
|---|
| 1263 | + strscpy(t->name, "Radio", sizeof(t->name)); |
|---|
| 1272 | 1264 | t->type = V4L2_TUNER_RADIO; |
|---|
| 1273 | 1265 | t->capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO; |
|---|
| 1274 | 1266 | t->rxsubchans = V4L2_TUNER_SUB_STEREO; |
|---|
| .. | .. |
|---|
| 1308 | 1300 | video_device_node_name(vdev)); |
|---|
| 1309 | 1301 | |
|---|
| 1310 | 1302 | switch (vdev->vfl_type) { |
|---|
| 1311 | | - case VFL_TYPE_GRABBER: |
|---|
| 1303 | + case VFL_TYPE_VIDEO: |
|---|
| 1312 | 1304 | type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|---|
| 1313 | 1305 | break; |
|---|
| 1314 | 1306 | case VFL_TYPE_VBI: |
|---|
| .. | .. |
|---|
| 1626 | 1618 | v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops, |
|---|
| 1627 | 1619 | V4L2_CID_HUE, -128, 127, 1, 0); |
|---|
| 1628 | 1620 | v4l2_ctrl_add_handler(&dev->ctrl_handler, |
|---|
| 1629 | | - &dev->radio_ctrl_handler, NULL); |
|---|
| 1621 | + &dev->radio_ctrl_handler, NULL, false); |
|---|
| 1630 | 1622 | |
|---|
| 1631 | 1623 | if (dev->radio_ctrl_handler.error) |
|---|
| 1632 | 1624 | ret = dev->radio_ctrl_handler.error; |
|---|
| .. | .. |
|---|
| 1638 | 1630 | vdev_init(dev, &dev->vfd, &tm6000_template, "video"); |
|---|
| 1639 | 1631 | |
|---|
| 1640 | 1632 | dev->vfd.ctrl_handler = &dev->ctrl_handler; |
|---|
| 1633 | + dev->vfd.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | |
|---|
| 1634 | + V4L2_CAP_READWRITE; |
|---|
| 1635 | + if (dev->tuner_type != TUNER_ABSENT) |
|---|
| 1636 | + dev->vfd.device_caps |= V4L2_CAP_TUNER; |
|---|
| 1641 | 1637 | |
|---|
| 1642 | 1638 | /* init video dma queues */ |
|---|
| 1643 | 1639 | INIT_LIST_HEAD(&dev->vidq.active); |
|---|
| 1644 | 1640 | INIT_LIST_HEAD(&dev->vidq.queued); |
|---|
| 1645 | 1641 | |
|---|
| 1646 | | - ret = video_register_device(&dev->vfd, VFL_TYPE_GRABBER, video_nr); |
|---|
| 1642 | + ret = video_register_device(&dev->vfd, VFL_TYPE_VIDEO, video_nr); |
|---|
| 1647 | 1643 | |
|---|
| 1648 | 1644 | if (ret < 0) { |
|---|
| 1649 | 1645 | printk(KERN_INFO "%s: can't register video device\n", |
|---|
| .. | .. |
|---|
| 1658 | 1654 | vdev_init(dev, &dev->radio_dev, &tm6000_radio_template, |
|---|
| 1659 | 1655 | "radio"); |
|---|
| 1660 | 1656 | dev->radio_dev.ctrl_handler = &dev->radio_ctrl_handler; |
|---|
| 1657 | + dev->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER; |
|---|
| 1661 | 1658 | ret = video_register_device(&dev->radio_dev, VFL_TYPE_RADIO, |
|---|
| 1662 | 1659 | radio_nr); |
|---|
| 1663 | 1660 | if (ret < 0) { |
|---|