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