1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * stk-webcam.h : Driver for Syntek 1125 USB webcam controller 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2006 Nicolas VIVIEN 6*4882a593Smuzhiyun * Copyright 2007-2008 Jaime Velasco Juan <jsagarribay@gmail.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef STKWEBCAM_H 10*4882a593Smuzhiyun #define STKWEBCAM_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/usb.h> 13*4882a593Smuzhiyun #include <media/v4l2-device.h> 14*4882a593Smuzhiyun #include <media/v4l2-ctrls.h> 15*4882a593Smuzhiyun #include <media/v4l2-common.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define DRIVER_VERSION "v0.0.1" 18*4882a593Smuzhiyun #define DRIVER_VERSION_NUM 0x000001 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define MAX_ISO_BUFS 3 21*4882a593Smuzhiyun #define ISO_FRAMES_PER_DESC 16 22*4882a593Smuzhiyun #define ISO_MAX_FRAME_SIZE 3 * 1024 23*4882a593Smuzhiyun #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct stk_iso_buf { 26*4882a593Smuzhiyun void *data; 27*4882a593Smuzhiyun int length; 28*4882a593Smuzhiyun int read; 29*4882a593Smuzhiyun struct urb *urb; 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Streaming IO buffers */ 33*4882a593Smuzhiyun struct stk_sio_buffer { 34*4882a593Smuzhiyun struct v4l2_buffer v4lbuf; 35*4882a593Smuzhiyun char *buffer; 36*4882a593Smuzhiyun int mapcount; 37*4882a593Smuzhiyun struct stk_camera *dev; 38*4882a593Smuzhiyun struct list_head list; 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum stk_mode {MODE_VGA, MODE_SXGA, MODE_CIF, MODE_QVGA, MODE_QCIF}; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct stk_video { 44*4882a593Smuzhiyun enum stk_mode mode; 45*4882a593Smuzhiyun __u32 palette; 46*4882a593Smuzhiyun int hflip; 47*4882a593Smuzhiyun int vflip; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum stk_status { 51*4882a593Smuzhiyun S_PRESENT = 1, 52*4882a593Smuzhiyun S_INITIALISED = 2, 53*4882a593Smuzhiyun S_MEMALLOCD = 4, 54*4882a593Smuzhiyun S_STREAMING = 8, 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun #define is_present(dev) ((dev)->status & S_PRESENT) 57*4882a593Smuzhiyun #define is_initialised(dev) ((dev)->status & S_INITIALISED) 58*4882a593Smuzhiyun #define is_streaming(dev) ((dev)->status & S_STREAMING) 59*4882a593Smuzhiyun #define is_memallocd(dev) ((dev)->status & S_MEMALLOCD) 60*4882a593Smuzhiyun #define set_present(dev) ((dev)->status = S_PRESENT) 61*4882a593Smuzhiyun #define unset_present(dev) ((dev)->status &= \ 62*4882a593Smuzhiyun ~(S_PRESENT|S_INITIALISED|S_STREAMING)) 63*4882a593Smuzhiyun #define set_initialised(dev) ((dev)->status |= S_INITIALISED) 64*4882a593Smuzhiyun #define unset_initialised(dev) ((dev)->status &= ~S_INITIALISED) 65*4882a593Smuzhiyun #define set_memallocd(dev) ((dev)->status |= S_MEMALLOCD) 66*4882a593Smuzhiyun #define unset_memallocd(dev) ((dev)->status &= ~S_MEMALLOCD) 67*4882a593Smuzhiyun #define set_streaming(dev) ((dev)->status |= S_STREAMING) 68*4882a593Smuzhiyun #define unset_streaming(dev) ((dev)->status &= ~S_STREAMING) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct regval { 71*4882a593Smuzhiyun unsigned reg; 72*4882a593Smuzhiyun unsigned val; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct stk_camera { 76*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 77*4882a593Smuzhiyun struct v4l2_ctrl_handler hdl; 78*4882a593Smuzhiyun struct video_device vdev; 79*4882a593Smuzhiyun struct usb_device *udev; 80*4882a593Smuzhiyun struct usb_interface *interface; 81*4882a593Smuzhiyun int webcam_model; 82*4882a593Smuzhiyun struct file *owner; 83*4882a593Smuzhiyun struct mutex lock; 84*4882a593Smuzhiyun int first_init; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun u8 isoc_ep; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* Not sure if this is right */ 89*4882a593Smuzhiyun atomic_t urbs_used; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct stk_video vsettings; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun enum stk_status status; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun spinlock_t spinlock; 96*4882a593Smuzhiyun wait_queue_head_t wait_frame; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct stk_iso_buf *isobufs; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun int frame_size; 101*4882a593Smuzhiyun /* Streaming buffers */ 102*4882a593Smuzhiyun int reading; 103*4882a593Smuzhiyun unsigned int n_sbufs; 104*4882a593Smuzhiyun struct stk_sio_buffer *sio_bufs; 105*4882a593Smuzhiyun struct list_head sio_avail; 106*4882a593Smuzhiyun struct list_head sio_full; 107*4882a593Smuzhiyun unsigned sequence; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define vdev_to_camera(d) container_of(d, struct stk_camera, vdev) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun int stk_camera_write_reg(struct stk_camera *, u16, u8); 113*4882a593Smuzhiyun int stk_camera_read_reg(struct stk_camera *, u16, u8 *); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun int stk_sensor_init(struct stk_camera *); 116*4882a593Smuzhiyun int stk_sensor_configure(struct stk_camera *); 117*4882a593Smuzhiyun int stk_sensor_sleep(struct stk_camera *dev); 118*4882a593Smuzhiyun int stk_sensor_wakeup(struct stk_camera *dev); 119*4882a593Smuzhiyun int stk_sensor_set_brightness(struct stk_camera *dev, int br); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #endif 122