18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Driver for the Auvitek AU0828 USB bridge 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2008 Steven Toth <stoth@linuxtv.org> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/bitops.h> 118c2ecf20Sopenharmony_ci#include <linux/usb.h> 128c2ecf20Sopenharmony_ci#include <linux/i2c.h> 138c2ecf20Sopenharmony_ci#include <linux/i2c-algo-bit.h> 148c2ecf20Sopenharmony_ci#include <media/tveeprom.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci/* Analog */ 178c2ecf20Sopenharmony_ci#include <linux/videodev2.h> 188c2ecf20Sopenharmony_ci#include <media/videobuf2-v4l2.h> 198c2ecf20Sopenharmony_ci#include <media/videobuf2-vmalloc.h> 208c2ecf20Sopenharmony_ci#include <media/v4l2-device.h> 218c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h> 228c2ecf20Sopenharmony_ci#include <media/v4l2-fh.h> 238c2ecf20Sopenharmony_ci#include <media/media-device.h> 248c2ecf20Sopenharmony_ci#include <media/media-dev-allocator.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/* DVB */ 278c2ecf20Sopenharmony_ci#include <media/demux.h> 288c2ecf20Sopenharmony_ci#include <media/dmxdev.h> 298c2ecf20Sopenharmony_ci#include <media/dvb_demux.h> 308c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h> 318c2ecf20Sopenharmony_ci#include <media/dvb_net.h> 328c2ecf20Sopenharmony_ci#include <media/dvbdev.h> 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#include "au0828-reg.h" 358c2ecf20Sopenharmony_ci#include "au0828-cards.h" 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define URB_COUNT 16 388c2ecf20Sopenharmony_ci#define URB_BUFSIZE (0xe522) 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* Analog constants */ 418c2ecf20Sopenharmony_ci#define NTSC_STD_W 720 428c2ecf20Sopenharmony_ci#define NTSC_STD_H 480 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define AU0828_INTERLACED_DEFAULT 1 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/* Definition for AU0828 USB transfer */ 478c2ecf20Sopenharmony_ci#define AU0828_MAX_ISO_BUFS 12 /* maybe resize this value in the future */ 488c2ecf20Sopenharmony_ci#define AU0828_ISO_PACKETS_PER_URB 128 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define AU0828_MIN_BUF 4 518c2ecf20Sopenharmony_ci#define AU0828_DEF_BUF 8 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#define AU0828_MAX_INPUT 4 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* au0828 resource types (used for res_get/res_lock etc */ 568c2ecf20Sopenharmony_ci#define AU0828_RESOURCE_VIDEO 0x01 578c2ecf20Sopenharmony_ci#define AU0828_RESOURCE_VBI 0x02 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cienum au0828_itype { 608c2ecf20Sopenharmony_ci AU0828_VMUX_UNDEFINED = 0, 618c2ecf20Sopenharmony_ci AU0828_VMUX_COMPOSITE, 628c2ecf20Sopenharmony_ci AU0828_VMUX_SVIDEO, 638c2ecf20Sopenharmony_ci AU0828_VMUX_CABLE, 648c2ecf20Sopenharmony_ci AU0828_VMUX_TELEVISION, 658c2ecf20Sopenharmony_ci AU0828_VMUX_DVB, 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistruct au0828_input { 698c2ecf20Sopenharmony_ci enum au0828_itype type; 708c2ecf20Sopenharmony_ci unsigned int vmux; 718c2ecf20Sopenharmony_ci unsigned int amux; 728c2ecf20Sopenharmony_ci void (*audio_setup) (void *priv, int enable); 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistruct au0828_board { 768c2ecf20Sopenharmony_ci char *name; 778c2ecf20Sopenharmony_ci unsigned int tuner_type; 788c2ecf20Sopenharmony_ci unsigned char tuner_addr; 798c2ecf20Sopenharmony_ci unsigned char i2c_clk_divider; 808c2ecf20Sopenharmony_ci unsigned char has_ir_i2c:1; 818c2ecf20Sopenharmony_ci unsigned char has_analog:1; 828c2ecf20Sopenharmony_ci struct au0828_input input[AU0828_MAX_INPUT]; 838c2ecf20Sopenharmony_ci}; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistruct au0828_dvb { 868c2ecf20Sopenharmony_ci struct mutex lock; 878c2ecf20Sopenharmony_ci struct dvb_adapter adapter; 888c2ecf20Sopenharmony_ci struct dvb_frontend *frontend; 898c2ecf20Sopenharmony_ci struct dvb_demux demux; 908c2ecf20Sopenharmony_ci struct dmxdev dmxdev; 918c2ecf20Sopenharmony_ci struct dmx_frontend fe_hw; 928c2ecf20Sopenharmony_ci struct dmx_frontend fe_mem; 938c2ecf20Sopenharmony_ci struct dvb_net net; 948c2ecf20Sopenharmony_ci int feeding; 958c2ecf20Sopenharmony_ci int start_count; 968c2ecf20Sopenharmony_ci int stop_count; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci int (*set_frontend)(struct dvb_frontend *fe); 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cienum au0828_stream_state { 1028c2ecf20Sopenharmony_ci STREAM_OFF, 1038c2ecf20Sopenharmony_ci STREAM_INTERRUPT, 1048c2ecf20Sopenharmony_ci STREAM_ON 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci#define AUVI_INPUT(nr) (dev->board.input[nr]) 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci/* device state */ 1108c2ecf20Sopenharmony_cienum au0828_dev_state { 1118c2ecf20Sopenharmony_ci DEV_INITIALIZED = 0, 1128c2ecf20Sopenharmony_ci DEV_DISCONNECTED = 1, 1138c2ecf20Sopenharmony_ci DEV_MISCONFIGURED = 2 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistruct au0828_dev; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistruct au0828_usb_isoc_ctl { 1198c2ecf20Sopenharmony_ci /* max packet size of isoc transaction */ 1208c2ecf20Sopenharmony_ci int max_pkt_size; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci /* number of allocated urbs */ 1238c2ecf20Sopenharmony_ci int num_bufs; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci /* urb for isoc transfers */ 1268c2ecf20Sopenharmony_ci struct urb **urb; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci /* transfer buffers for isoc transfer */ 1298c2ecf20Sopenharmony_ci char **transfer_buffer; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci /* Last buffer command and region */ 1328c2ecf20Sopenharmony_ci u8 cmd; 1338c2ecf20Sopenharmony_ci int pos, size, pktsize; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci /* Last field: ODD or EVEN? */ 1368c2ecf20Sopenharmony_ci int field; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci /* Stores incomplete commands */ 1398c2ecf20Sopenharmony_ci u32 tmp_buf; 1408c2ecf20Sopenharmony_ci int tmp_buf_len; 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci /* Stores already requested buffers */ 1438c2ecf20Sopenharmony_ci struct au0828_buffer *buf; 1448c2ecf20Sopenharmony_ci struct au0828_buffer *vbi_buf; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci /* Stores the number of received fields */ 1478c2ecf20Sopenharmony_ci int nfields; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci /* isoc urb callback */ 1508c2ecf20Sopenharmony_ci int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb); 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/* buffer for one video frame */ 1558c2ecf20Sopenharmony_cistruct au0828_buffer { 1568c2ecf20Sopenharmony_ci /* common v4l buffer stuff -- must be first */ 1578c2ecf20Sopenharmony_ci struct vb2_v4l2_buffer vb; 1588c2ecf20Sopenharmony_ci struct list_head list; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci void *mem; 1618c2ecf20Sopenharmony_ci unsigned long length; 1628c2ecf20Sopenharmony_ci int top_field; 1638c2ecf20Sopenharmony_ci /* pointer to vmalloc memory address in vb */ 1648c2ecf20Sopenharmony_ci char *vb_buf; 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistruct au0828_dmaqueue { 1688c2ecf20Sopenharmony_ci struct list_head active; 1698c2ecf20Sopenharmony_ci /* Counters to control buffer fill */ 1708c2ecf20Sopenharmony_ci int pos; 1718c2ecf20Sopenharmony_ci}; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistruct au0828_dev { 1748c2ecf20Sopenharmony_ci struct mutex mutex; 1758c2ecf20Sopenharmony_ci struct usb_device *usbdev; 1768c2ecf20Sopenharmony_ci int boardnr; 1778c2ecf20Sopenharmony_ci struct au0828_board board; 1788c2ecf20Sopenharmony_ci u8 ctrlmsg[64]; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci /* I2C */ 1818c2ecf20Sopenharmony_ci struct i2c_adapter i2c_adap; 1828c2ecf20Sopenharmony_ci struct i2c_algorithm i2c_algo; 1838c2ecf20Sopenharmony_ci struct i2c_client i2c_client; 1848c2ecf20Sopenharmony_ci u32 i2c_rc; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci /* Digital */ 1878c2ecf20Sopenharmony_ci struct au0828_dvb dvb; 1888c2ecf20Sopenharmony_ci struct work_struct restart_streaming; 1898c2ecf20Sopenharmony_ci struct timer_list bulk_timeout; 1908c2ecf20Sopenharmony_ci int bulk_timeout_running; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_V4L2 1938c2ecf20Sopenharmony_ci /* Analog */ 1948c2ecf20Sopenharmony_ci struct v4l2_device v4l2_dev; 1958c2ecf20Sopenharmony_ci struct v4l2_ctrl_handler v4l2_ctrl_hdl; 1968c2ecf20Sopenharmony_ci#endif 1978c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_RC 1988c2ecf20Sopenharmony_ci struct au0828_rc *ir; 1998c2ecf20Sopenharmony_ci#endif 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci struct video_device vdev; 2028c2ecf20Sopenharmony_ci struct video_device vbi_dev; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci /* Videobuf2 */ 2058c2ecf20Sopenharmony_ci struct vb2_queue vb_vidq; 2068c2ecf20Sopenharmony_ci struct vb2_queue vb_vbiq; 2078c2ecf20Sopenharmony_ci struct mutex vb_queue_lock; 2088c2ecf20Sopenharmony_ci struct mutex vb_vbi_queue_lock; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci unsigned int frame_count; 2118c2ecf20Sopenharmony_ci unsigned int vbi_frame_count; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci struct timer_list vid_timeout; 2148c2ecf20Sopenharmony_ci int vid_timeout_running; 2158c2ecf20Sopenharmony_ci struct timer_list vbi_timeout; 2168c2ecf20Sopenharmony_ci int vbi_timeout_running; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci int users; 2198c2ecf20Sopenharmony_ci int streaming_users; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci int width; 2228c2ecf20Sopenharmony_ci int height; 2238c2ecf20Sopenharmony_ci int vbi_width; 2248c2ecf20Sopenharmony_ci int vbi_height; 2258c2ecf20Sopenharmony_ci u32 vbi_read; 2268c2ecf20Sopenharmony_ci v4l2_std_id std; 2278c2ecf20Sopenharmony_ci u32 field_size; 2288c2ecf20Sopenharmony_ci u32 frame_size; 2298c2ecf20Sopenharmony_ci u32 bytesperline; 2308c2ecf20Sopenharmony_ci int type; 2318c2ecf20Sopenharmony_ci u8 ctrl_ainput; 2328c2ecf20Sopenharmony_ci __u8 isoc_in_endpointaddr; 2338c2ecf20Sopenharmony_ci u8 isoc_init_ok; 2348c2ecf20Sopenharmony_ci int greenscreen_detected; 2358c2ecf20Sopenharmony_ci int ctrl_freq; 2368c2ecf20Sopenharmony_ci int input_type; 2378c2ecf20Sopenharmony_ci int std_set_in_tuner_core; 2388c2ecf20Sopenharmony_ci unsigned int ctrl_input; 2398c2ecf20Sopenharmony_ci long unsigned int dev_state; /* defined at enum au0828_dev_state */; 2408c2ecf20Sopenharmony_ci enum au0828_stream_state stream_state; 2418c2ecf20Sopenharmony_ci wait_queue_head_t open; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci struct mutex lock; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci /* Isoc control struct */ 2468c2ecf20Sopenharmony_ci struct au0828_dmaqueue vidq; 2478c2ecf20Sopenharmony_ci struct au0828_dmaqueue vbiq; 2488c2ecf20Sopenharmony_ci struct au0828_usb_isoc_ctl isoc_ctl; 2498c2ecf20Sopenharmony_ci spinlock_t slock; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci /* usb transfer */ 2528c2ecf20Sopenharmony_ci int alt; /* alternate */ 2538c2ecf20Sopenharmony_ci int max_pkt_size; /* max packet size of isoc transaction */ 2548c2ecf20Sopenharmony_ci int num_alt; /* Number of alternative settings */ 2558c2ecf20Sopenharmony_ci unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ 2568c2ecf20Sopenharmony_ci struct urb *urb[AU0828_MAX_ISO_BUFS]; /* urb for isoc transfers */ 2578c2ecf20Sopenharmony_ci char *transfer_buffer[AU0828_MAX_ISO_BUFS];/* transfer buffers for isoc 2588c2ecf20Sopenharmony_ci transfer */ 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci /* DVB USB / URB Related */ 2618c2ecf20Sopenharmony_ci bool urb_streaming, need_urb_start; 2628c2ecf20Sopenharmony_ci struct urb *urbs[URB_COUNT]; 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci /* Preallocated transfer digital transfer buffers */ 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci char *dig_transfer_buffer[URB_COUNT]; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci#ifdef CONFIG_MEDIA_CONTROLLER 2698c2ecf20Sopenharmony_ci struct media_device *media_dev; 2708c2ecf20Sopenharmony_ci struct media_pad video_pad, vbi_pad; 2718c2ecf20Sopenharmony_ci struct media_entity *decoder; 2728c2ecf20Sopenharmony_ci struct media_entity input_ent[AU0828_MAX_INPUT]; 2738c2ecf20Sopenharmony_ci struct media_pad input_pad[AU0828_MAX_INPUT]; 2748c2ecf20Sopenharmony_ci struct media_entity_notify entity_notify; 2758c2ecf20Sopenharmony_ci struct media_entity *tuner; 2768c2ecf20Sopenharmony_ci struct media_link *active_link; 2778c2ecf20Sopenharmony_ci struct media_entity *active_source; 2788c2ecf20Sopenharmony_ci struct media_entity *active_sink; 2798c2ecf20Sopenharmony_ci struct media_entity *active_link_owner; 2808c2ecf20Sopenharmony_ci struct media_entity *active_link_user; 2818c2ecf20Sopenharmony_ci struct media_pipeline *active_link_user_pipe; 2828c2ecf20Sopenharmony_ci bool active_link_shared; 2838c2ecf20Sopenharmony_ci#endif 2848c2ecf20Sopenharmony_ci}; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 2888c2ecf20Sopenharmony_ci#define au0828_read(dev, reg) au0828_readreg(dev, reg) 2898c2ecf20Sopenharmony_ci#define au0828_write(dev, reg, value) au0828_writereg(dev, reg, value) 2908c2ecf20Sopenharmony_ci#define au0828_andor(dev, reg, mask, value) \ 2918c2ecf20Sopenharmony_ci au0828_writereg(dev, reg, \ 2928c2ecf20Sopenharmony_ci (au0828_readreg(dev, reg) & ~(mask)) | ((value) & (mask))) 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci#define au0828_set(dev, reg, bit) au0828_andor(dev, (reg), (bit), (bit)) 2958c2ecf20Sopenharmony_ci#define au0828_clear(dev, reg, bit) au0828_andor(dev, (reg), (bit), 0) 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 2988c2ecf20Sopenharmony_ci/* au0828-core.c */ 2998c2ecf20Sopenharmony_ciextern u32 au0828_read(struct au0828_dev *dev, u16 reg); 3008c2ecf20Sopenharmony_ciextern u32 au0828_write(struct au0828_dev *dev, u16 reg, u32 val); 3018c2ecf20Sopenharmony_ciextern void au0828_usb_release(struct au0828_dev *dev); 3028c2ecf20Sopenharmony_ciextern int au0828_debug; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 3058c2ecf20Sopenharmony_ci/* au0828-cards.c */ 3068c2ecf20Sopenharmony_ciextern struct au0828_board au0828_boards[]; 3078c2ecf20Sopenharmony_ciextern struct usb_device_id au0828_usb_id_table[]; 3088c2ecf20Sopenharmony_ciextern void au0828_gpio_setup(struct au0828_dev *dev); 3098c2ecf20Sopenharmony_ciextern int au0828_tuner_callback(void *priv, int component, 3108c2ecf20Sopenharmony_ci int command, int arg); 3118c2ecf20Sopenharmony_ciextern void au0828_card_setup(struct au0828_dev *dev); 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 3148c2ecf20Sopenharmony_ci/* au0828-i2c.c */ 3158c2ecf20Sopenharmony_ciextern int au0828_i2c_register(struct au0828_dev *dev); 3168c2ecf20Sopenharmony_ciextern int au0828_i2c_unregister(struct au0828_dev *dev); 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 3198c2ecf20Sopenharmony_ci/* au0828-video.c */ 3208c2ecf20Sopenharmony_ciextern int au0828_start_analog_streaming(struct vb2_queue *vq, 3218c2ecf20Sopenharmony_ci unsigned int count); 3228c2ecf20Sopenharmony_ciextern void au0828_stop_vbi_streaming(struct vb2_queue *vq); 3238c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_V4L2 3248c2ecf20Sopenharmony_ciextern int au0828_v4l2_device_register(struct usb_interface *interface, 3258c2ecf20Sopenharmony_ci struct au0828_dev *dev); 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ciextern int au0828_analog_register(struct au0828_dev *dev, 3288c2ecf20Sopenharmony_ci struct usb_interface *interface); 3298c2ecf20Sopenharmony_ciextern int au0828_analog_unregister(struct au0828_dev *dev); 3308c2ecf20Sopenharmony_ciextern void au0828_usb_v4l2_media_release(struct au0828_dev *dev); 3318c2ecf20Sopenharmony_ciextern void au0828_v4l2_suspend(struct au0828_dev *dev); 3328c2ecf20Sopenharmony_ciextern void au0828_v4l2_resume(struct au0828_dev *dev); 3338c2ecf20Sopenharmony_ci#else 3348c2ecf20Sopenharmony_cistatic inline int au0828_v4l2_device_register(struct usb_interface *interface, 3358c2ecf20Sopenharmony_ci struct au0828_dev *dev) 3368c2ecf20Sopenharmony_ci{ return 0; }; 3378c2ecf20Sopenharmony_cistatic inline int au0828_analog_register(struct au0828_dev *dev, 3388c2ecf20Sopenharmony_ci struct usb_interface *interface) 3398c2ecf20Sopenharmony_ci{ return 0; }; 3408c2ecf20Sopenharmony_cistatic inline int au0828_analog_unregister(struct au0828_dev *dev) 3418c2ecf20Sopenharmony_ci{ return 0; }; 3428c2ecf20Sopenharmony_cistatic inline void au0828_usb_v4l2_media_release(struct au0828_dev *dev) { }; 3438c2ecf20Sopenharmony_cistatic inline void au0828_v4l2_suspend(struct au0828_dev *dev) { }; 3448c2ecf20Sopenharmony_cistatic inline void au0828_v4l2_resume(struct au0828_dev *dev) { }; 3458c2ecf20Sopenharmony_ci#endif 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci/* ----------------------------------------------------------- */ 3488c2ecf20Sopenharmony_ci/* au0828-dvb.c */ 3498c2ecf20Sopenharmony_ciextern int au0828_dvb_register(struct au0828_dev *dev); 3508c2ecf20Sopenharmony_ciextern void au0828_dvb_unregister(struct au0828_dev *dev); 3518c2ecf20Sopenharmony_civoid au0828_dvb_suspend(struct au0828_dev *dev); 3528c2ecf20Sopenharmony_civoid au0828_dvb_resume(struct au0828_dev *dev); 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci/* au0828-vbi.c */ 3558c2ecf20Sopenharmony_ciextern const struct vb2_ops au0828_vbi_qops; 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ci#define dprintk(level, fmt, arg...)\ 3588c2ecf20Sopenharmony_ci do { if (au0828_debug & level)\ 3598c2ecf20Sopenharmony_ci printk(KERN_DEBUG pr_fmt(fmt), ## arg);\ 3608c2ecf20Sopenharmony_ci } while (0) 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci/* au0828-input.c */ 3638c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_AU0828_RC 3648c2ecf20Sopenharmony_ciextern int au0828_rc_register(struct au0828_dev *dev); 3658c2ecf20Sopenharmony_ciextern void au0828_rc_unregister(struct au0828_dev *dev); 3668c2ecf20Sopenharmony_ciextern int au0828_rc_suspend(struct au0828_dev *dev); 3678c2ecf20Sopenharmony_ciextern int au0828_rc_resume(struct au0828_dev *dev); 3688c2ecf20Sopenharmony_ci#else 3698c2ecf20Sopenharmony_cistatic inline int au0828_rc_register(struct au0828_dev *dev) { return 0; } 3708c2ecf20Sopenharmony_cistatic inline void au0828_rc_unregister(struct au0828_dev *dev) { } 3718c2ecf20Sopenharmony_cistatic inline int au0828_rc_suspend(struct au0828_dev *dev) { return 0; } 3728c2ecf20Sopenharmony_cistatic inline int au0828_rc_resume(struct au0828_dev *dev) { return 0; } 3738c2ecf20Sopenharmony_ci#endif 374