^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Hauppauge HD PVR USB driver - video 4 linux 2 interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2008 Janne Grunau (j@jannau.net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/v4l2-dv-timings.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <media/v4l2-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <media/v4l2-common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <media/v4l2-dv-timings.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <media/v4l2-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "hdpvr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define BULK_URB_TIMEOUT 90 /* 0.09 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define print_buffer_status() { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) "%s:%d buffer stat: %d free, %d proc\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) __func__, __LINE__, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) list_size(&dev->free_buff_list), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) list_size(&dev->rec_buff_list)); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) static const struct v4l2_dv_timings hdpvr_dv_timings[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) V4L2_DV_BT_CEA_720X480I59_94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) V4L2_DV_BT_CEA_720X576I50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) V4L2_DV_BT_CEA_720X480P59_94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) V4L2_DV_BT_CEA_720X576P50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) V4L2_DV_BT_CEA_1280X720P50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) V4L2_DV_BT_CEA_1280X720P60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) V4L2_DV_BT_CEA_1920X1080I50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) V4L2_DV_BT_CEA_1920X1080I60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* Use 480i59 as the default timings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define HDPVR_DEF_DV_TIMINGS_IDX (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct hdpvr_fh {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct v4l2_fh fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) bool legacy_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static uint list_size(struct list_head *list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) uint count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) list_for_each(tmp, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /*=========================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /* urb callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static void hdpvr_read_bulk_callback(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct hdpvr_buffer *buf = (struct hdpvr_buffer *)urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct hdpvr_device *dev = buf->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* marking buffer as received and wake waiting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) buf->status = BUFSTAT_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) wake_up_interruptible(&dev->wait_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /*=========================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* buffer bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* function expects dev->io_mutex to be hold by caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) int hdpvr_cancel_queue(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct hdpvr_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) list_for_each_entry(buf, &dev->rec_buff_list, buff_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) usb_kill_urb(buf->urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) buf->status = BUFSTAT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) list_splice_init(&dev->rec_buff_list, dev->free_buff_list.prev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static int hdpvr_free_queue(struct list_head *q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct list_head *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct hdpvr_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) for (p = q->next; p != q;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) buf = list_entry(p, struct hdpvr_buffer, buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) urb = buf->urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) usb_free_coherent(urb->dev, urb->transfer_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) urb->transfer_buffer, urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) tmp = p->next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) list_del(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) p = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* function expects dev->io_mutex to be hold by caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int hdpvr_free_buffers(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) hdpvr_cancel_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) hdpvr_free_queue(&dev->free_buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) hdpvr_free_queue(&dev->rec_buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* function expects dev->io_mutex to be hold by caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) uint i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) int retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) u8 *mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) struct hdpvr_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) "allocating %u buffers\n", count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) for (i = 0; i < count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) buf = kzalloc(sizeof(struct hdpvr_buffer), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) v4l2_err(&dev->v4l2_dev, "cannot allocate buffer\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) buf->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) goto exit_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) buf->urb = urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) mem = usb_alloc_coherent(dev->udev, dev->bulk_in_size, GFP_KERNEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) &urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (!mem) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) v4l2_err(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) "cannot allocate usb transfer buffer\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) goto exit_urb_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) usb_fill_bulk_urb(buf->urb, dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) usb_rcvbulkpipe(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) dev->bulk_in_endpointAddr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) mem, dev->bulk_in_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) hdpvr_read_bulk_callback, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) buf->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) buf->status = BUFSTAT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) list_add_tail(&buf->buff_list, &dev->free_buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) exit_urb_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) exit_urb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) hdpvr_free_buffers(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static int hdpvr_submit_buffers(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct hdpvr_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) int ret = 0, err_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) while (dev->status == STATUS_STREAMING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) !list_empty(&dev->free_buff_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) buf = list_entry(dev->free_buff_list.next, struct hdpvr_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (buf->status != BUFSTAT_AVAILABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) v4l2_err(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) "buffer not marked as available\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) urb = buf->urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) urb->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) urb->actual_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ret = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) v4l2_err(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) "usb_submit_urb in %s returned %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (++err_count > 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) buf->status = BUFSTAT_INPROGRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) list_move_tail(&buf->buff_list, &dev->rec_buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) print_buffer_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) static struct hdpvr_buffer *hdpvr_get_next_buffer(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct hdpvr_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (list_empty(&dev->rec_buff_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) buf = list_entry(dev->rec_buff_list.next, struct hdpvr_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) return buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static void hdpvr_transmit_buffers(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct hdpvr_device *dev = container_of(work, struct hdpvr_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) while (dev->status == STATUS_STREAMING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (hdpvr_submit_buffers(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) v4l2_err(&dev->v4l2_dev, "couldn't submit buffers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (wait_event_interruptible(dev->wait_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) !list_empty(&dev->free_buff_list) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) dev->status != STATUS_STREAMING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) "transmit worker exited\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) "transmit buffers errored\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) dev->status = STATUS_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /* function expects dev->io_mutex to be hold by caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static int hdpvr_start_streaming(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct hdpvr_video_info vidinf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (dev->status == STATUS_STREAMING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (dev->status != STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) ret = get_video_info(dev, &vidinf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (!vidinf.valid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) msleep(250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) "no video signal at input %d\n", dev->options.video_input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) "video signal: %dx%d@%dhz\n", vidinf.width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) vidinf.height, vidinf.fps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /* start streaming 2 request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ret = usb_control_msg(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) usb_sndctrlpipe(dev->udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 0xb8, 0x38, 0x1, 0, NULL, 0, 8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) "encoder start control request returned %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) ret = hdpvr_config_call(dev, CTRL_START_STREAMING_VALUE, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) dev->status = STATUS_STREAMING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) schedule_work(&dev->worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) "streaming started\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* function expects dev->io_mutex to be hold by caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static int hdpvr_stop_streaming(struct hdpvr_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) int actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) uint c = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) if (dev->status == STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) else if (dev->status != STATUS_STREAMING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) buf = kmalloc(dev->bulk_in_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) v4l2_err(&dev->v4l2_dev, "failed to allocate temporary buffer for emptying the internal device buffer. Next capture start will be slow\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) dev->status = STATUS_SHUTTING_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) hdpvr_config_call(dev, CTRL_STOP_STREAMING_VALUE, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) wake_up_interruptible(&dev->wait_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) flush_work(&dev->worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* kill the still outstanding urbs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) hdpvr_cancel_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* emptying the device buffer beforeshutting it down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) while (buf && ++c < 500 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) !usb_bulk_msg(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) usb_rcvbulkpipe(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) dev->bulk_in_endpointAddr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) buf, dev->bulk_in_size, &actual_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) BULK_URB_TIMEOUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) "%2d: got %d bytes\n", c, actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) "used %d urbs to empty device buffers\n", c-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) dev->status = STATUS_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /*=======================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * video 4 linux 2 file operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) static int hdpvr_open(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct hdpvr_fh *fh = kzalloc(sizeof(*fh), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (fh == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) fh->legacy_mode = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) v4l2_fh_init(&fh->fh, video_devdata(file));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) v4l2_fh_add(&fh->fh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) file->private_data = fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) static int hdpvr_release(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (file->private_data == dev->owner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) hdpvr_stop_streaming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) dev->owner = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return v4l2_fh_release(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * hdpvr_v4l2_read()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) * will allocate buffers when called for the first time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct hdpvr_buffer *buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) unsigned int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) int rem, cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (*pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return -ESPIPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (dev->status == STATUS_IDLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (hdpvr_start_streaming(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) "start_streaming failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) dev->status = STATUS_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) dev->owner = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) print_buffer_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* wait for the first buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (!(file->f_flags & O_NONBLOCK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) if (wait_event_interruptible(dev->wait_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) !list_empty_careful(&dev->rec_buff_list)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) buf = hdpvr_get_next_buffer(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) while (count > 0 && buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) if (buf->status != BUFSTAT_READY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) dev->status != STATUS_DISCONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) /* return nonblocking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (file->f_flags & O_NONBLOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) err = wait_event_interruptible_timeout(dev->wait_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) buf->status == BUFSTAT_READY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) msecs_to_jiffies(1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) v4l2_info(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) "timeout: restart streaming\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) hdpvr_stop_streaming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) * The FW needs about 4 seconds after streaming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) * stopped before it is ready to restart
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * streaming.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) msleep(4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) err = hdpvr_start_streaming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) if (buf->status != BUFSTAT_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) /* set remaining bytes to copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) urb = buf->urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) rem = urb->actual_length - buf->pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) cnt = rem > count ? count : rem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (copy_to_user(buffer, urb->transfer_buffer + buf->pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) cnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) v4l2_err(&dev->v4l2_dev, "read: copy_to_user failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) buf->pos += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) count -= cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) buffer += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) ret += cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) /* finished, take next buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (buf->pos == urb->actual_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) buf->pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) buf->status = BUFSTAT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) list_move_tail(&buf->buff_list, &dev->free_buff_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) print_buffer_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) wake_up_interruptible(&dev->wait_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) buf = hdpvr_get_next_buffer(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (!ret && !buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) static __poll_t hdpvr_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) __poll_t req_events = poll_requested_events(wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) struct hdpvr_buffer *buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct hdpvr_device *dev = video_drvdata(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) __poll_t mask = v4l2_ctrl_poll(filp, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (!(req_events & (EPOLLIN | EPOLLRDNORM)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (dev->status == STATUS_IDLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (hdpvr_start_streaming(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) "start_streaming failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) dev->status = STATUS_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) dev->owner = filp->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) print_buffer_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) buf = hdpvr_get_next_buffer(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) /* only wait if no data is available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (!buf || buf->status != BUFSTAT_READY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) poll_wait(filp, &dev->wait_data, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) buf = hdpvr_get_next_buffer(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (buf && buf->status == BUFSTAT_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) mask |= EPOLLIN | EPOLLRDNORM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) return mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) static const struct v4l2_file_operations hdpvr_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) .open = hdpvr_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) .release = hdpvr_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .read = hdpvr_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .poll = hdpvr_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .unlocked_ioctl = video_ioctl2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) /*=======================================================================*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) * V4L2 ioctl handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) static int vidioc_querycap(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct v4l2_capability *cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) strscpy(cap->driver, "hdpvr", sizeof(cap->driver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) strscpy(cap->card, "Hauppauge HD PVR", sizeof(cap->card));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) static int vidioc_s_std(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) v4l2_std_id std)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) u8 std_type = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) if (!fh->legacy_mode && dev->options.video_input == HDPVR_COMPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) if (dev->status != STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) if (std & V4L2_STD_525_60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) std_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) dev->cur_std = std;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) dev->width = 720;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) dev->height = std_type ? 576 : 480;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) return hdpvr_config_call(dev, CTRL_VIDEO_STD_TYPE, std_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) static int vidioc_g_std(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) v4l2_std_id *std)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (!fh->legacy_mode && dev->options.video_input == HDPVR_COMPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) *std = dev->cur_std;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) static int vidioc_querystd(struct file *file, void *_fh, v4l2_std_id *a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) struct hdpvr_video_info vid_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) *a = V4L2_STD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) if (dev->options.video_input == HDPVR_COMPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) return fh->legacy_mode ? 0 : -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) ret = get_video_info(dev, &vid_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if (vid_info.valid && vid_info.width == 720 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) (vid_info.height == 480 || vid_info.height == 576)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) *a = (vid_info.height == 480) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) V4L2_STD_525_60 : V4L2_STD_625_50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) static int vidioc_s_dv_timings(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) struct v4l2_dv_timings *timings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) fh->legacy_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) if (dev->options.video_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (dev->status != STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) for (i = 0; i < ARRAY_SIZE(hdpvr_dv_timings); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (v4l2_match_dv_timings(timings, hdpvr_dv_timings + i, 0, false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) if (i == ARRAY_SIZE(hdpvr_dv_timings))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) dev->cur_dv_timings = hdpvr_dv_timings[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) dev->width = hdpvr_dv_timings[i].bt.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) dev->height = hdpvr_dv_timings[i].bt.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static int vidioc_g_dv_timings(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct v4l2_dv_timings *timings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) fh->legacy_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) if (dev->options.video_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) *timings = dev->cur_dv_timings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static int vidioc_query_dv_timings(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct v4l2_dv_timings *timings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct hdpvr_video_info vid_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) bool interlaced;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) fh->legacy_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (dev->options.video_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) ret = get_video_info(dev, &vid_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) if (!vid_info.valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) return -ENOLCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) interlaced = vid_info.fps <= 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) for (i = 0; i < ARRAY_SIZE(hdpvr_dv_timings); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) const struct v4l2_bt_timings *bt = &hdpvr_dv_timings[i].bt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) unsigned hsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) unsigned vsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) unsigned fps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) hsize = V4L2_DV_BT_FRAME_WIDTH(bt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) vsize = V4L2_DV_BT_FRAME_HEIGHT(bt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) fps = (unsigned)bt->pixelclock / (hsize * vsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) if (bt->width != vid_info.width ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) bt->height != vid_info.height ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) bt->interlaced != interlaced ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) (fps != vid_info.fps && fps + 1 != vid_info.fps))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) *timings = hdpvr_dv_timings[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (i == ARRAY_SIZE(hdpvr_dv_timings))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) ret = -ERANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) static int vidioc_enum_dv_timings(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct v4l2_enum_dv_timings *timings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) fh->legacy_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) memset(timings->reserved, 0, sizeof(timings->reserved));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (dev->options.video_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) if (timings->index >= ARRAY_SIZE(hdpvr_dv_timings))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) timings->timings = hdpvr_dv_timings[timings->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) static int vidioc_dv_timings_cap(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) struct v4l2_dv_timings_cap *cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) fh->legacy_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) if (dev->options.video_input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) cap->type = V4L2_DV_BT_656_1120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) cap->bt.min_width = 720;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) cap->bt.max_width = 1920;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) cap->bt.min_height = 480;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) cap->bt.max_height = 1080;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) cap->bt.min_pixelclock = 27000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) cap->bt.max_pixelclock = 74250000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) cap->bt.standards = V4L2_DV_BT_STD_CEA861;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) cap->bt.capabilities = V4L2_DV_BT_CAP_INTERLACED | V4L2_DV_BT_CAP_PROGRESSIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) static const char *iname[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) [HDPVR_COMPONENT] = "Component",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) [HDPVR_SVIDEO] = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) [HDPVR_COMPOSITE] = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) static int vidioc_enum_input(struct file *file, void *_fh, struct v4l2_input *i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) n = i->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (n >= HDPVR_VIDEO_INPUTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) i->type = V4L2_INPUT_TYPE_CAMERA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) strscpy(i->name, iname[n], sizeof(i->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) i->audioset = 1<<HDPVR_RCA_FRONT | 1<<HDPVR_RCA_BACK | 1<<HDPVR_SPDIF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) i->capabilities = n ? V4L2_IN_CAP_STD : V4L2_IN_CAP_DV_TIMINGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) i->std = n ? V4L2_STD_ALL : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static int vidioc_s_input(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) unsigned int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (index >= HDPVR_VIDEO_INPUTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (dev->status != STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) retval = hdpvr_config_call(dev, CTRL_VIDEO_INPUT_VALUE, index+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) if (!retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) dev->options.video_input = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) * Unfortunately gstreamer calls ENUMSTD and bails out if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) * won't find any formats, even though component input is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) * selected. This means that we have to leave tvnorms at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) * V4L2_STD_ALL. We cannot use the 'legacy' trick since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) * tvnorms is set at the device node level and not at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) * filehandle level.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) * Comment this out for now, but if the legacy mode can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) * removed in the future, then this code should be enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) * again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) dev->video_dev.tvnorms =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) (index != HDPVR_COMPONENT) ? V4L2_STD_ALL : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) static int vidioc_g_input(struct file *file, void *private_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) unsigned int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) *index = dev->options.video_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) static const char *audio_iname[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) [HDPVR_RCA_FRONT] = "RCA front",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) [HDPVR_RCA_BACK] = "RCA back",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) [HDPVR_SPDIF] = "SPDIF",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static int vidioc_enumaudio(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) struct v4l2_audio *audio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) n = audio->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) if (n >= HDPVR_AUDIO_INPUTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) audio->capability = V4L2_AUDCAP_STEREO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) strscpy(audio->name, audio_iname[n], sizeof(audio->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) static int vidioc_s_audio(struct file *file, void *private_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) const struct v4l2_audio *audio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (audio->index >= HDPVR_AUDIO_INPUTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) if (dev->status != STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) retval = hdpvr_set_audio(dev, audio->index+1, dev->options.audio_codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) if (!retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) dev->options.audio_input = audio->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) static int vidioc_g_audio(struct file *file, void *private_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct v4l2_audio *audio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) audio->index = dev->options.audio_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) audio->capability = V4L2_AUDCAP_STEREO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) strscpy(audio->name, audio_iname[audio->index], sizeof(audio->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) static int hdpvr_try_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) struct hdpvr_device *dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) container_of(ctrl->handler, struct hdpvr_device, hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) if (ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) dev->video_bitrate->val >= dev->video_bitrate_peak->val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) dev->video_bitrate_peak->val =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) dev->video_bitrate->val + 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) static int hdpvr_s_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) struct hdpvr_device *dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) container_of(ctrl->handler, struct hdpvr_device, hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) struct hdpvr_options *opt = &dev->options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) case V4L2_CID_BRIGHTNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) ret = hdpvr_config_call(dev, CTRL_BRIGHTNESS, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) dev->options.brightness = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) case V4L2_CID_CONTRAST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) ret = hdpvr_config_call(dev, CTRL_CONTRAST, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) dev->options.contrast = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) case V4L2_CID_SATURATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) ret = hdpvr_config_call(dev, CTRL_SATURATION, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) dev->options.saturation = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) case V4L2_CID_HUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) ret = hdpvr_config_call(dev, CTRL_HUE, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) dev->options.hue = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) case V4L2_CID_SHARPNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) ret = hdpvr_config_call(dev, CTRL_SHARPNESS, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) dev->options.sharpness = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) case V4L2_CID_MPEG_AUDIO_ENCODING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) if (dev->flags & HDPVR_FLAG_AC3_CAP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) opt->audio_codec = ctrl->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) return hdpvr_set_audio(dev, opt->audio_input + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) opt->audio_codec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) case V4L2_CID_MPEG_VIDEO_ENCODING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) /* case V4L2_CID_MPEG_VIDEO_B_FRAMES: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) /* if (ctrl->value == 0 && !(opt->gop_mode & 0x2)) { */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) /* opt->gop_mode |= 0x2; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) /* hdpvr_config_call(dev, CTRL_GOP_MODE_VALUE, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) /* opt->gop_mode); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) /* } */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) /* if (ctrl->value == 128 && opt->gop_mode & 0x2) { */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) /* opt->gop_mode &= ~0x2; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* hdpvr_config_call(dev, CTRL_GOP_MODE_VALUE, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) /* opt->gop_mode); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) /* } */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) /* break; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) uint peak_bitrate = dev->video_bitrate_peak->val / 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) uint bitrate = dev->video_bitrate->val / 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (ctrl->is_new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) opt->bitrate_mode = HDPVR_CONSTANT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) opt->bitrate_mode = HDPVR_VARIABLE_AVERAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) hdpvr_config_call(dev, CTRL_BITRATE_MODE_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) opt->bitrate_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) v4l2_ctrl_activate(dev->video_bitrate_peak,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) ctrl->val != V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (dev->video_bitrate_peak->is_new ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) dev->video_bitrate->is_new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) opt->bitrate = bitrate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) opt->peak_bitrate = peak_bitrate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) hdpvr_set_bitrate(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) case V4L2_CID_MPEG_STREAM_TYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) static int vidioc_enum_fmt_vid_cap(struct file *file, void *private_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) struct v4l2_fmtdesc *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (f->index != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) f->pixelformat = V4L2_PIX_FMT_MPEG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) static int vidioc_g_fmt_vid_cap(struct file *file, void *_fh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) struct v4l2_format *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) struct hdpvr_device *dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct hdpvr_fh *fh = _fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) * The original driver would always returns the current detected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * resolution as the format (and EFAULT if it couldn't be detected).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * With the introduction of VIDIOC_QUERY_DV_TIMINGS there is now a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * better way of doing this, but to stay compatible with existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * applications we assume legacy mode every time an application opens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * the device. Only if one of the new DV_TIMINGS ioctls is called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) * will the filehandle go into 'normal' mode where g_fmt returns the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) * last set format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (fh->legacy_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) struct hdpvr_video_info vid_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) ret = get_video_info(dev, &vid_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) if (!vid_info.valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) f->fmt.pix.width = vid_info.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) f->fmt.pix.height = vid_info.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) f->fmt.pix.width = dev->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) f->fmt.pix.height = dev->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) f->fmt.pix.sizeimage = dev->bulk_in_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) f->fmt.pix.bytesperline = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) if (f->fmt.pix.width == 720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) /* SDTV formats */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) f->fmt.pix.field = V4L2_FIELD_INTERLACED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) /* HDTV formats */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) f->fmt.pix.field = V4L2_FIELD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) static int vidioc_encoder_cmd(struct file *filp, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) struct v4l2_encoder_cmd *a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) struct hdpvr_device *dev = video_drvdata(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) int res = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) mutex_lock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) a->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) switch (a->cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) case V4L2_ENC_CMD_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) if (dev->owner && filp->private_data != dev->owner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) res = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) if (dev->status == STATUS_STREAMING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) res = hdpvr_start_streaming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) if (!res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) dev->owner = filp->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) dev->status = STATUS_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) case V4L2_ENC_CMD_STOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (dev->owner && filp->private_data != dev->owner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) res = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (dev->status == STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) res = hdpvr_stop_streaming(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (!res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) dev->owner = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) "Unsupported encoder cmd %d\n", a->cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) res = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) mutex_unlock(&dev->io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static int vidioc_try_encoder_cmd(struct file *filp, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) struct v4l2_encoder_cmd *a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) a->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) switch (a->cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) case V4L2_ENC_CMD_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) case V4L2_ENC_CMD_STOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) static const struct v4l2_ioctl_ops hdpvr_ioctl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) .vidioc_querycap = vidioc_querycap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .vidioc_s_std = vidioc_s_std,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .vidioc_g_std = vidioc_g_std,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) .vidioc_querystd = vidioc_querystd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) .vidioc_s_dv_timings = vidioc_s_dv_timings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) .vidioc_g_dv_timings = vidioc_g_dv_timings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .vidioc_query_dv_timings= vidioc_query_dv_timings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) .vidioc_enum_dv_timings = vidioc_enum_dv_timings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) .vidioc_dv_timings_cap = vidioc_dv_timings_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) .vidioc_enum_input = vidioc_enum_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) .vidioc_g_input = vidioc_g_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) .vidioc_s_input = vidioc_s_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) .vidioc_enumaudio = vidioc_enumaudio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) .vidioc_g_audio = vidioc_g_audio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) .vidioc_s_audio = vidioc_s_audio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) .vidioc_enum_fmt_vid_cap= vidioc_enum_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) .vidioc_s_fmt_vid_cap = vidioc_g_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) .vidioc_try_fmt_vid_cap = vidioc_g_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) .vidioc_encoder_cmd = vidioc_encoder_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) .vidioc_try_encoder_cmd = vidioc_try_encoder_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) .vidioc_log_status = v4l2_ctrl_log_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) static void hdpvr_device_release(struct video_device *vdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) struct hdpvr_device *dev = video_get_drvdata(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) hdpvr_delete(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) flush_work(&dev->worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) v4l2_device_unregister(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) v4l2_ctrl_handler_free(&dev->hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) /* deregister I2C adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) #if IS_ENABLED(CONFIG_I2C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) mutex_lock(&dev->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) i2c_del_adapter(&dev->i2c_adapter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) mutex_unlock(&dev->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) #endif /* CONFIG_I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) kfree(dev->usbc_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) static const struct video_device hdpvr_video_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) .fops = &hdpvr_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) .release = hdpvr_device_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) .ioctl_ops = &hdpvr_ioctl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) .tvnorms = V4L2_STD_ALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) V4L2_CAP_READWRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) static const struct v4l2_ctrl_ops hdpvr_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) .try_ctrl = hdpvr_try_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) .s_ctrl = hdpvr_s_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) int devnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) struct v4l2_ctrl_handler *hdl = &dev->hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) bool ac3 = dev->flags & HDPVR_FLAG_AC3_CAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) // initialize dev->worker
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) INIT_WORK(&dev->worker, hdpvr_transmit_buffers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) dev->cur_std = V4L2_STD_525_60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) dev->width = 720;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) dev->height = 480;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) dev->cur_dv_timings = hdpvr_dv_timings[HDPVR_DEF_DV_TIMINGS_IDX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) v4l2_ctrl_handler_init(hdl, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) if (dev->fw_ver > 0x15) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) V4L2_CID_BRIGHTNESS, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) V4L2_CID_CONTRAST, 0x0, 0xff, 1, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) V4L2_CID_SATURATION, 0x0, 0xff, 1, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) V4L2_CID_HUE, 0x0, 0x1e, 1, 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) V4L2_CID_SHARPNESS, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) V4L2_CID_BRIGHTNESS, 0x0, 0xff, 1, 0x86);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) V4L2_CID_CONTRAST, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) V4L2_CID_SATURATION, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) V4L2_CID_HUE, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) V4L2_CID_SHARPNESS, 0x0, 0xff, 1, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) V4L2_CID_MPEG_STREAM_TYPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 0x1, V4L2_MPEG_STREAM_TYPE_MPEG2_TS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) V4L2_CID_MPEG_AUDIO_ENCODING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 : V4L2_MPEG_AUDIO_ENCODING_AAC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 0x7, ac3 ? dev->options.audio_codec : V4L2_MPEG_AUDIO_ENCODING_AAC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) V4L2_CID_MPEG_VIDEO_ENCODING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC, 0x3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) dev->video_mode = v4l2_ctrl_new_std_menu(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) dev->video_bitrate = v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) V4L2_CID_MPEG_VIDEO_BITRATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 1000000, 13500000, 100000, 6500000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) dev->video_bitrate_peak = v4l2_ctrl_new_std(hdl, &hdpvr_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 1100000, 20200000, 100000, 9000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) dev->v4l2_dev.ctrl_handler = hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) if (hdl->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) res = hdl->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) v4l2_err(&dev->v4l2_dev, "Could not register controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) v4l2_ctrl_cluster(3, &dev->video_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) res = v4l2_ctrl_handler_setup(hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) if (res < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) v4l2_err(&dev->v4l2_dev, "Could not setup controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) /* setup and register video device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) dev->video_dev = hdpvr_video_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) strscpy(dev->video_dev.name, "Hauppauge HD PVR",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) sizeof(dev->video_dev.name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) dev->video_dev.v4l2_dev = &dev->v4l2_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) video_set_drvdata(&dev->video_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) res = video_register_device(&dev->video_dev, VFL_TYPE_VIDEO, devnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) if (res < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) v4l2_err(&dev->v4l2_dev, "video_device registration failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) v4l2_ctrl_handler_free(hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) }