root/drivers/media/usb/au0828/au0828.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. au0828_v4l2_device_register
  2. au0828_analog_register
  3. au0828_analog_unregister
  4. au0828_usb_v4l2_media_release
  5. au0828_v4l2_suspend
  6. au0828_v4l2_resume
  7. au0828_rc_register
  8. au0828_rc_unregister
  9. au0828_rc_suspend
  10. au0828_rc_resume

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  *  Driver for the Auvitek AU0828 USB bridge
   4  *
   5  *  Copyright (c) 2008 Steven Toth <stoth@linuxtv.org>
   6  */
   7 
   8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9 
  10 #include <linux/bitops.h>
  11 #include <linux/usb.h>
  12 #include <linux/i2c.h>
  13 #include <linux/i2c-algo-bit.h>
  14 #include <media/tveeprom.h>
  15 
  16 /* Analog */
  17 #include <linux/videodev2.h>
  18 #include <media/videobuf2-v4l2.h>
  19 #include <media/videobuf2-vmalloc.h>
  20 #include <media/v4l2-device.h>
  21 #include <media/v4l2-ctrls.h>
  22 #include <media/v4l2-fh.h>
  23 #include <media/media-device.h>
  24 #include <media/media-dev-allocator.h>
  25 
  26 /* DVB */
  27 #include <media/demux.h>
  28 #include <media/dmxdev.h>
  29 #include <media/dvb_demux.h>
  30 #include <media/dvb_frontend.h>
  31 #include <media/dvb_net.h>
  32 #include <media/dvbdev.h>
  33 
  34 #include "au0828-reg.h"
  35 #include "au0828-cards.h"
  36 
  37 #define URB_COUNT   16
  38 #define URB_BUFSIZE (0xe522)
  39 
  40 /* Analog constants */
  41 #define NTSC_STD_W      720
  42 #define NTSC_STD_H      480
  43 
  44 #define AU0828_INTERLACED_DEFAULT       1
  45 
  46 /* Definition for AU0828 USB transfer */
  47 #define AU0828_MAX_ISO_BUFS    12  /* maybe resize this value in the future */
  48 #define AU0828_ISO_PACKETS_PER_URB      128
  49 
  50 #define AU0828_MIN_BUF 4
  51 #define AU0828_DEF_BUF 8
  52 
  53 #define AU0828_MAX_INPUT        4
  54 
  55 /* au0828 resource types (used for res_get/res_lock etc */
  56 #define AU0828_RESOURCE_VIDEO 0x01
  57 #define AU0828_RESOURCE_VBI   0x02
  58 
  59 enum au0828_itype {
  60         AU0828_VMUX_UNDEFINED = 0,
  61         AU0828_VMUX_COMPOSITE,
  62         AU0828_VMUX_SVIDEO,
  63         AU0828_VMUX_CABLE,
  64         AU0828_VMUX_TELEVISION,
  65         AU0828_VMUX_DVB,
  66 };
  67 
  68 struct au0828_input {
  69         enum au0828_itype type;
  70         unsigned int vmux;
  71         unsigned int amux;
  72         void (*audio_setup) (void *priv, int enable);
  73 };
  74 
  75 struct au0828_board {
  76         char *name;
  77         unsigned int tuner_type;
  78         unsigned char tuner_addr;
  79         unsigned char i2c_clk_divider;
  80         unsigned char has_ir_i2c:1;
  81         unsigned char has_analog:1;
  82         struct au0828_input input[AU0828_MAX_INPUT];
  83 };
  84 
  85 struct au0828_dvb {
  86         struct mutex lock;
  87         struct dvb_adapter adapter;
  88         struct dvb_frontend *frontend;
  89         struct dvb_demux demux;
  90         struct dmxdev dmxdev;
  91         struct dmx_frontend fe_hw;
  92         struct dmx_frontend fe_mem;
  93         struct dvb_net net;
  94         int feeding;
  95         int start_count;
  96         int stop_count;
  97 
  98         int (*set_frontend)(struct dvb_frontend *fe);
  99 };
 100 
 101 enum au0828_stream_state {
 102         STREAM_OFF,
 103         STREAM_INTERRUPT,
 104         STREAM_ON
 105 };
 106 
 107 #define AUVI_INPUT(nr) (dev->board.input[nr])
 108 
 109 /* device state */
 110 enum au0828_dev_state {
 111         DEV_INITIALIZED = 0,
 112         DEV_DISCONNECTED = 1,
 113         DEV_MISCONFIGURED = 2
 114 };
 115 
 116 struct au0828_dev;
 117 
 118 struct au0828_usb_isoc_ctl {
 119                 /* max packet size of isoc transaction */
 120         int                             max_pkt_size;
 121 
 122                 /* number of allocated urbs */
 123         int                             num_bufs;
 124 
 125                 /* urb for isoc transfers */
 126         struct urb                      **urb;
 127 
 128                 /* transfer buffers for isoc transfer */
 129         char                            **transfer_buffer;
 130 
 131                 /* Last buffer command and region */
 132         u8                              cmd;
 133         int                             pos, size, pktsize;
 134 
 135                 /* Last field: ODD or EVEN? */
 136         int                             field;
 137 
 138                 /* Stores incomplete commands */
 139         u32                             tmp_buf;
 140         int                             tmp_buf_len;
 141 
 142                 /* Stores already requested buffers */
 143         struct au0828_buffer            *buf;
 144         struct au0828_buffer            *vbi_buf;
 145 
 146                 /* Stores the number of received fields */
 147         int                             nfields;
 148 
 149                 /* isoc urb callback */
 150         int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb);
 151 
 152 };
 153 
 154 /* buffer for one video frame */
 155 struct au0828_buffer {
 156         /* common v4l buffer stuff -- must be first */
 157         struct vb2_v4l2_buffer vb;
 158         struct list_head list;
 159 
 160         void *mem;
 161         unsigned long length;
 162         int top_field;
 163         /* pointer to vmalloc memory address in vb */
 164         char *vb_buf;
 165 };
 166 
 167 struct au0828_dmaqueue {
 168         struct list_head       active;
 169         /* Counters to control buffer fill */
 170         int                    pos;
 171 };
 172 
 173 struct au0828_dev {
 174         struct mutex mutex;
 175         struct usb_device       *usbdev;
 176         int                     boardnr;
 177         struct au0828_board     board;
 178         u8                      ctrlmsg[64];
 179 
 180         /* I2C */
 181         struct i2c_adapter              i2c_adap;
 182         struct i2c_algorithm            i2c_algo;
 183         struct i2c_client               i2c_client;
 184         u32                             i2c_rc;
 185 
 186         /* Digital */
 187         struct au0828_dvb               dvb;
 188         struct work_struct              restart_streaming;
 189         struct timer_list               bulk_timeout;
 190         int                             bulk_timeout_running;
 191 
 192 #ifdef CONFIG_VIDEO_AU0828_V4L2
 193         /* Analog */
 194         struct v4l2_device v4l2_dev;
 195         struct v4l2_ctrl_handler v4l2_ctrl_hdl;
 196 #endif
 197 #ifdef CONFIG_VIDEO_AU0828_RC
 198         struct au0828_rc *ir;
 199 #endif
 200 
 201         struct video_device vdev;
 202         struct video_device vbi_dev;
 203 
 204         /* Videobuf2 */
 205         struct vb2_queue vb_vidq;
 206         struct vb2_queue vb_vbiq;
 207         struct mutex vb_queue_lock;
 208         struct mutex vb_vbi_queue_lock;
 209 
 210         unsigned int frame_count;
 211         unsigned int vbi_frame_count;
 212 
 213         struct timer_list vid_timeout;
 214         int vid_timeout_running;
 215         struct timer_list vbi_timeout;
 216         int vbi_timeout_running;
 217 
 218         int users;
 219         int streaming_users;
 220 
 221         int width;
 222         int height;
 223         int vbi_width;
 224         int vbi_height;
 225         u32 vbi_read;
 226         v4l2_std_id std;
 227         u32 field_size;
 228         u32 frame_size;
 229         u32 bytesperline;
 230         int type;
 231         u8 ctrl_ainput;
 232         __u8 isoc_in_endpointaddr;
 233         u8 isoc_init_ok;
 234         int greenscreen_detected;
 235         int ctrl_freq;
 236         int input_type;
 237         int std_set_in_tuner_core;
 238         unsigned int ctrl_input;
 239         long unsigned int dev_state; /* defined at enum au0828_dev_state */;
 240         enum au0828_stream_state stream_state;
 241         wait_queue_head_t open;
 242 
 243         struct mutex lock;
 244 
 245         /* Isoc control struct */
 246         struct au0828_dmaqueue vidq;
 247         struct au0828_dmaqueue vbiq;
 248         struct au0828_usb_isoc_ctl isoc_ctl;
 249         spinlock_t slock;
 250 
 251         /* usb transfer */
 252         int alt;                /* alternate */
 253         int max_pkt_size;       /* max packet size of isoc transaction */
 254         int num_alt;            /* Number of alternative settings */
 255         unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
 256         struct urb *urb[AU0828_MAX_ISO_BUFS];   /* urb for isoc transfers */
 257         char *transfer_buffer[AU0828_MAX_ISO_BUFS];/* transfer buffers for isoc
 258                                                    transfer */
 259 
 260         /* DVB USB / URB Related */
 261         bool            urb_streaming, need_urb_start;
 262         struct urb      *urbs[URB_COUNT];
 263 
 264         /* Preallocated transfer digital transfer buffers */
 265 
 266         char *dig_transfer_buffer[URB_COUNT];
 267 
 268 #ifdef CONFIG_MEDIA_CONTROLLER
 269         struct media_device *media_dev;
 270         struct media_pad video_pad, vbi_pad;
 271         struct media_entity *decoder;
 272         struct media_entity input_ent[AU0828_MAX_INPUT];
 273         struct media_pad input_pad[AU0828_MAX_INPUT];
 274         struct media_entity_notify entity_notify;
 275         struct media_entity *tuner;
 276         struct media_link *active_link;
 277         struct media_entity *active_source;
 278         struct media_entity *active_sink;
 279         struct media_entity *active_link_owner;
 280         struct media_entity *active_link_user;
 281         struct media_pipeline *active_link_user_pipe;
 282         bool active_link_shared;
 283 #endif
 284 };
 285 
 286 
 287 /* ----------------------------------------------------------- */
 288 #define au0828_read(dev, reg) au0828_readreg(dev, reg)
 289 #define au0828_write(dev, reg, value) au0828_writereg(dev, reg, value)
 290 #define au0828_andor(dev, reg, mask, value)                             \
 291          au0828_writereg(dev, reg,                                      \
 292         (au0828_readreg(dev, reg) & ~(mask)) | ((value) & (mask)))
 293 
 294 #define au0828_set(dev, reg, bit) au0828_andor(dev, (reg), (bit), (bit))
 295 #define au0828_clear(dev, reg, bit) au0828_andor(dev, (reg), (bit), 0)
 296 
 297 /* ----------------------------------------------------------- */
 298 /* au0828-core.c */
 299 extern u32 au0828_read(struct au0828_dev *dev, u16 reg);
 300 extern u32 au0828_write(struct au0828_dev *dev, u16 reg, u32 val);
 301 extern void au0828_usb_release(struct au0828_dev *dev);
 302 extern int au0828_debug;
 303 
 304 /* ----------------------------------------------------------- */
 305 /* au0828-cards.c */
 306 extern struct au0828_board au0828_boards[];
 307 extern struct usb_device_id au0828_usb_id_table[];
 308 extern void au0828_gpio_setup(struct au0828_dev *dev);
 309 extern int au0828_tuner_callback(void *priv, int component,
 310                                  int command, int arg);
 311 extern void au0828_card_setup(struct au0828_dev *dev);
 312 
 313 /* ----------------------------------------------------------- */
 314 /* au0828-i2c.c */
 315 extern int au0828_i2c_register(struct au0828_dev *dev);
 316 extern int au0828_i2c_unregister(struct au0828_dev *dev);
 317 
 318 /* ----------------------------------------------------------- */
 319 /* au0828-video.c */
 320 extern int au0828_start_analog_streaming(struct vb2_queue *vq,
 321                                                 unsigned int count);
 322 extern void au0828_stop_vbi_streaming(struct vb2_queue *vq);
 323 #ifdef CONFIG_VIDEO_AU0828_V4L2
 324 extern int au0828_v4l2_device_register(struct usb_interface *interface,
 325                                       struct au0828_dev *dev);
 326 
 327 extern int au0828_analog_register(struct au0828_dev *dev,
 328                            struct usb_interface *interface);
 329 extern int au0828_analog_unregister(struct au0828_dev *dev);
 330 extern void au0828_usb_v4l2_media_release(struct au0828_dev *dev);
 331 extern void au0828_v4l2_suspend(struct au0828_dev *dev);
 332 extern void au0828_v4l2_resume(struct au0828_dev *dev);
 333 #else
 334 static inline int au0828_v4l2_device_register(struct usb_interface *interface,
 335                                               struct au0828_dev *dev)
 336 { return 0; };
 337 static inline int au0828_analog_register(struct au0828_dev *dev,
 338                                      struct usb_interface *interface)
 339 { return 0; };
 340 static inline int au0828_analog_unregister(struct au0828_dev *dev)
 341 { return 0; };
 342 static inline void au0828_usb_v4l2_media_release(struct au0828_dev *dev) { };
 343 static inline void au0828_v4l2_suspend(struct au0828_dev *dev) { };
 344 static inline void au0828_v4l2_resume(struct au0828_dev *dev) { };
 345 #endif
 346 
 347 /* ----------------------------------------------------------- */
 348 /* au0828-dvb.c */
 349 extern int au0828_dvb_register(struct au0828_dev *dev);
 350 extern void au0828_dvb_unregister(struct au0828_dev *dev);
 351 void au0828_dvb_suspend(struct au0828_dev *dev);
 352 void au0828_dvb_resume(struct au0828_dev *dev);
 353 
 354 /* au0828-vbi.c */
 355 extern const struct vb2_ops au0828_vbi_qops;
 356 
 357 #define dprintk(level, fmt, arg...)\
 358         do { if (au0828_debug & level)\
 359                 printk(KERN_DEBUG pr_fmt(fmt), ## arg);\
 360         } while (0)
 361 
 362 /* au0828-input.c */
 363 #ifdef CONFIG_VIDEO_AU0828_RC
 364 extern int au0828_rc_register(struct au0828_dev *dev);
 365 extern void au0828_rc_unregister(struct au0828_dev *dev);
 366 extern int au0828_rc_suspend(struct au0828_dev *dev);
 367 extern int au0828_rc_resume(struct au0828_dev *dev);
 368 #else
 369 static inline int au0828_rc_register(struct au0828_dev *dev) { return 0; }
 370 static inline void au0828_rc_unregister(struct au0828_dev *dev) { }
 371 static inline int au0828_rc_suspend(struct au0828_dev *dev) { return 0; }
 372 static inline int au0828_rc_resume(struct au0828_dev *dev) { return 0; }
 373 #endif

/* [<][>][^][v][top][bottom][index][help] */