18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * tm6000.h - driver for TM5600/TM6000/TM6010 USB video capture devices
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2006-2007 Mauro Carvalho Chehab <mchehab@kernel.org>
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (c) 2007 Michel Ludwig <michel.ludwig@gmail.com>
88c2ecf20Sopenharmony_ci *	- DVB-T support
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/videodev2.h>
128c2ecf20Sopenharmony_ci#include <media/v4l2-common.h>
138c2ecf20Sopenharmony_ci#include <media/videobuf-vmalloc.h>
148c2ecf20Sopenharmony_ci#include "tm6000-usb-isoc.h"
158c2ecf20Sopenharmony_ci#include <linux/i2c.h>
168c2ecf20Sopenharmony_ci#include <linux/mutex.h>
178c2ecf20Sopenharmony_ci#include <media/v4l2-device.h>
188c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h>
198c2ecf20Sopenharmony_ci#include <media/v4l2-fh.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include <linux/dvb/frontend.h>
228c2ecf20Sopenharmony_ci#include <media/dvb_demux.h>
238c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
248c2ecf20Sopenharmony_ci#include <media/dmxdev.h>
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/* Inputs */
278c2ecf20Sopenharmony_cienum tm6000_itype {
288c2ecf20Sopenharmony_ci	TM6000_INPUT_TV	= 1,
298c2ecf20Sopenharmony_ci	TM6000_INPUT_COMPOSITE1,
308c2ecf20Sopenharmony_ci	TM6000_INPUT_COMPOSITE2,
318c2ecf20Sopenharmony_ci	TM6000_INPUT_SVIDEO,
328c2ecf20Sopenharmony_ci	TM6000_INPUT_DVB,
338c2ecf20Sopenharmony_ci	TM6000_INPUT_RADIO,
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cienum tm6000_mux {
378c2ecf20Sopenharmony_ci	TM6000_VMUX_VIDEO_A = 1,
388c2ecf20Sopenharmony_ci	TM6000_VMUX_VIDEO_B,
398c2ecf20Sopenharmony_ci	TM6000_VMUX_VIDEO_AB,
408c2ecf20Sopenharmony_ci	TM6000_AMUX_ADC1,
418c2ecf20Sopenharmony_ci	TM6000_AMUX_ADC2,
428c2ecf20Sopenharmony_ci	TM6000_AMUX_SIF1,
438c2ecf20Sopenharmony_ci	TM6000_AMUX_SIF2,
448c2ecf20Sopenharmony_ci	TM6000_AMUX_I2S,
458c2ecf20Sopenharmony_ci};
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cienum tm6000_devtype {
488c2ecf20Sopenharmony_ci	TM6000 = 0,
498c2ecf20Sopenharmony_ci	TM5600,
508c2ecf20Sopenharmony_ci	TM6010,
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistruct tm6000_input {
548c2ecf20Sopenharmony_ci	enum tm6000_itype	type;
558c2ecf20Sopenharmony_ci	enum tm6000_mux		vmux;
568c2ecf20Sopenharmony_ci	enum tm6000_mux		amux;
578c2ecf20Sopenharmony_ci	unsigned int		v_gpio;
588c2ecf20Sopenharmony_ci	unsigned int		a_gpio;
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/* ------------------------------------------------------------------
628c2ecf20Sopenharmony_ci *	Basic structures
638c2ecf20Sopenharmony_ci * ------------------------------------------------------------------
648c2ecf20Sopenharmony_ci */
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistruct tm6000_fmt {
678c2ecf20Sopenharmony_ci	u32   fourcc;          /* v4l2 format id */
688c2ecf20Sopenharmony_ci	int   depth;
698c2ecf20Sopenharmony_ci};
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci/* buffer for one video frame */
728c2ecf20Sopenharmony_cistruct tm6000_buffer {
738c2ecf20Sopenharmony_ci	/* common v4l buffer stuff -- must be first */
748c2ecf20Sopenharmony_ci	struct videobuf_buffer vb;
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	struct tm6000_fmt      *fmt;
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistruct tm6000_dmaqueue {
808c2ecf20Sopenharmony_ci	struct list_head       active;
818c2ecf20Sopenharmony_ci	struct list_head       queued;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	/* thread for generating video stream*/
848c2ecf20Sopenharmony_ci	struct task_struct         *kthread;
858c2ecf20Sopenharmony_ci	wait_queue_head_t          wq;
868c2ecf20Sopenharmony_ci	/* Counters to control fps rate */
878c2ecf20Sopenharmony_ci	int                        frame;
888c2ecf20Sopenharmony_ci	int                        ini_jiffies;
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci/* device states */
928c2ecf20Sopenharmony_cienum tm6000_core_state {
938c2ecf20Sopenharmony_ci	DEV_INITIALIZED   = 0x01,
948c2ecf20Sopenharmony_ci	DEV_DISCONNECTED  = 0x02,
958c2ecf20Sopenharmony_ci	DEV_MISCONFIGURED = 0x04,
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci/* io methods */
998c2ecf20Sopenharmony_cienum tm6000_io_method {
1008c2ecf20Sopenharmony_ci	IO_NONE,
1018c2ecf20Sopenharmony_ci	IO_READ,
1028c2ecf20Sopenharmony_ci	IO_MMAP,
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cienum tm6000_mode {
1068c2ecf20Sopenharmony_ci	TM6000_MODE_UNKNOWN = 0,
1078c2ecf20Sopenharmony_ci	TM6000_MODE_ANALOG,
1088c2ecf20Sopenharmony_ci	TM6000_MODE_DIGITAL,
1098c2ecf20Sopenharmony_ci};
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cistruct tm6000_gpio {
1128c2ecf20Sopenharmony_ci	int		tuner_reset;
1138c2ecf20Sopenharmony_ci	int		tuner_on;
1148c2ecf20Sopenharmony_ci	int		demod_reset;
1158c2ecf20Sopenharmony_ci	int		demod_on;
1168c2ecf20Sopenharmony_ci	int		power_led;
1178c2ecf20Sopenharmony_ci	int		dvb_led;
1188c2ecf20Sopenharmony_ci	int		ir;
1198c2ecf20Sopenharmony_ci};
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cistruct tm6000_capabilities {
1228c2ecf20Sopenharmony_ci	unsigned int    has_tuner:1;
1238c2ecf20Sopenharmony_ci	unsigned int    has_tda9874:1;
1248c2ecf20Sopenharmony_ci	unsigned int    has_dvb:1;
1258c2ecf20Sopenharmony_ci	unsigned int    has_zl10353:1;
1268c2ecf20Sopenharmony_ci	unsigned int    has_eeprom:1;
1278c2ecf20Sopenharmony_ci	unsigned int    has_remote:1;
1288c2ecf20Sopenharmony_ci	unsigned int    has_radio:1;
1298c2ecf20Sopenharmony_ci};
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cistruct tm6000_dvb {
1328c2ecf20Sopenharmony_ci	struct dvb_adapter	adapter;
1338c2ecf20Sopenharmony_ci	struct dvb_demux	demux;
1348c2ecf20Sopenharmony_ci	struct dvb_frontend	*frontend;
1358c2ecf20Sopenharmony_ci	struct dmxdev		dmxdev;
1368c2ecf20Sopenharmony_ci	unsigned int		streams;
1378c2ecf20Sopenharmony_ci	struct urb		*bulk_urb;
1388c2ecf20Sopenharmony_ci	struct mutex		mutex;
1398c2ecf20Sopenharmony_ci};
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cistruct snd_tm6000_card {
1428c2ecf20Sopenharmony_ci	struct snd_card			*card;
1438c2ecf20Sopenharmony_ci	spinlock_t			reg_lock;
1448c2ecf20Sopenharmony_ci	struct tm6000_core		*core;
1458c2ecf20Sopenharmony_ci	struct snd_pcm_substream	*substream;
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	/* temporary data for buffer fill processing */
1488c2ecf20Sopenharmony_ci	unsigned			buf_pos;
1498c2ecf20Sopenharmony_ci	unsigned			period_pos;
1508c2ecf20Sopenharmony_ci};
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_cistruct tm6000_endpoint {
1538c2ecf20Sopenharmony_ci	struct usb_host_endpoint	*endp;
1548c2ecf20Sopenharmony_ci	__u8				bInterfaceNumber;
1558c2ecf20Sopenharmony_ci	__u8				bAlternateSetting;
1568c2ecf20Sopenharmony_ci	unsigned			maxsize;
1578c2ecf20Sopenharmony_ci};
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci#define TM6000_QUIRK_NO_USB_DELAY (1 << 0)
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cistruct tm6000_core {
1628c2ecf20Sopenharmony_ci	/* generic device properties */
1638c2ecf20Sopenharmony_ci	char				name[30];	/* name (including minor) of the device */
1648c2ecf20Sopenharmony_ci	int				model;		/* index in the device_data struct */
1658c2ecf20Sopenharmony_ci	int				devno;		/* marks the number of this device */
1668c2ecf20Sopenharmony_ci	enum tm6000_devtype		dev_type;	/* type of device */
1678c2ecf20Sopenharmony_ci	unsigned char			eedata[256];	/* Eeprom data */
1688c2ecf20Sopenharmony_ci	unsigned			eedata_size;	/* Size of the eeprom info */
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	v4l2_std_id                     norm;           /* Current norm */
1718c2ecf20Sopenharmony_ci	int				width, height;	/* Selected resolution */
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	enum tm6000_core_state		state;
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	/* Device Capabilities*/
1768c2ecf20Sopenharmony_ci	struct tm6000_capabilities	caps;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	/* Used to load alsa/dvb */
1798c2ecf20Sopenharmony_ci	struct work_struct		request_module_wk;
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	/* Tuner configuration */
1828c2ecf20Sopenharmony_ci	int				tuner_type;		/* type of the tuner */
1838c2ecf20Sopenharmony_ci	int				tuner_addr;		/* tuner address */
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	struct tm6000_gpio		gpio;
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	char				*ir_codes;
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	__u8				radio;
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	/* Demodulator configuration */
1928c2ecf20Sopenharmony_ci	int				demod_addr;	/* demodulator address */
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	int				audio_bitrate;
1958c2ecf20Sopenharmony_ci	/* i2c i/o */
1968c2ecf20Sopenharmony_ci	struct i2c_adapter		i2c_adap;
1978c2ecf20Sopenharmony_ci	struct i2c_client		i2c_client;
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci	/* extension */
2018c2ecf20Sopenharmony_ci	struct list_head		devlist;
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	/* video for linux */
2048c2ecf20Sopenharmony_ci	int				users;
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	/* various device info */
2078c2ecf20Sopenharmony_ci	struct tm6000_fh		*resources;	/* Points to fh that is streaming */
2088c2ecf20Sopenharmony_ci	bool				is_res_read;
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	struct video_device		vfd;
2118c2ecf20Sopenharmony_ci	struct video_device		radio_dev;
2128c2ecf20Sopenharmony_ci	struct tm6000_dmaqueue		vidq;
2138c2ecf20Sopenharmony_ci	struct v4l2_device		v4l2_dev;
2148c2ecf20Sopenharmony_ci	struct v4l2_ctrl_handler	ctrl_handler;
2158c2ecf20Sopenharmony_ci	struct v4l2_ctrl_handler	radio_ctrl_handler;
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci	int				input;
2188c2ecf20Sopenharmony_ci	struct tm6000_input		vinput[3];	/* video input */
2198c2ecf20Sopenharmony_ci	struct tm6000_input		rinput;		/* radio input */
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci	int				freq;
2228c2ecf20Sopenharmony_ci	unsigned int			fourcc;
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	enum tm6000_mode		mode;
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	int				ctl_mute;             /* audio */
2278c2ecf20Sopenharmony_ci	int				ctl_volume;
2288c2ecf20Sopenharmony_ci	int				amode;
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	/* DVB-T support */
2318c2ecf20Sopenharmony_ci	struct tm6000_dvb		*dvb;
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	/* audio support */
2348c2ecf20Sopenharmony_ci	struct snd_tm6000_card		*adev;
2358c2ecf20Sopenharmony_ci	struct work_struct		wq_trigger;   /* Trigger to start/stop audio for alsa module */
2368c2ecf20Sopenharmony_ci	atomic_t			stream_started;  /* stream should be running if true */
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	struct tm6000_IR		*ir;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci	/* locks */
2418c2ecf20Sopenharmony_ci	struct mutex			lock;
2428c2ecf20Sopenharmony_ci	struct mutex			usb_lock;
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	/* usb transfer */
2458c2ecf20Sopenharmony_ci	struct usb_device		*udev;		/* the usb device */
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	struct tm6000_endpoint		bulk_in, bulk_out, isoc_in, isoc_out;
2488c2ecf20Sopenharmony_ci	struct tm6000_endpoint		int_in, int_out;
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci	/* scaler!=0 if scaler is active*/
2518c2ecf20Sopenharmony_ci	int				scaler;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci		/* Isoc control struct */
2548c2ecf20Sopenharmony_ci	struct usb_isoc_ctl          isoc_ctl;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	spinlock_t                   slock;
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci	/* urb dma buffers */
2598c2ecf20Sopenharmony_ci	char				**urb_buffer;
2608c2ecf20Sopenharmony_ci	dma_addr_t			*urb_dma;
2618c2ecf20Sopenharmony_ci	unsigned int			urb_size;
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci	unsigned long quirks;
2648c2ecf20Sopenharmony_ci};
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_cienum tm6000_ops_type {
2678c2ecf20Sopenharmony_ci	TM6000_AUDIO = 0x10,
2688c2ecf20Sopenharmony_ci	TM6000_DVB = 0x20,
2698c2ecf20Sopenharmony_ci};
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_cistruct tm6000_ops {
2728c2ecf20Sopenharmony_ci	struct list_head	next;
2738c2ecf20Sopenharmony_ci	char			*name;
2748c2ecf20Sopenharmony_ci	enum tm6000_ops_type	type;
2758c2ecf20Sopenharmony_ci	int (*init)(struct tm6000_core *);
2768c2ecf20Sopenharmony_ci	int (*fini)(struct tm6000_core *);
2778c2ecf20Sopenharmony_ci	int (*fillbuf)(struct tm6000_core *, char *buf, int size);
2788c2ecf20Sopenharmony_ci};
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_cistruct tm6000_fh {
2818c2ecf20Sopenharmony_ci	struct v4l2_fh		     fh;
2828c2ecf20Sopenharmony_ci	struct tm6000_core           *dev;
2838c2ecf20Sopenharmony_ci	unsigned int                 radio;
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	/* video capture */
2868c2ecf20Sopenharmony_ci	struct tm6000_fmt            *fmt;
2878c2ecf20Sopenharmony_ci	unsigned int                 width, height;
2888c2ecf20Sopenharmony_ci	struct videobuf_queue        vb_vidq;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci	enum v4l2_buf_type           type;
2918c2ecf20Sopenharmony_ci};
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci#define TM6000_STD	(V4L2_STD_PAL|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|    \
2948c2ecf20Sopenharmony_ci			V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \
2958c2ecf20Sopenharmony_ci			V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM)
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci/* In tm6000-cards.c */
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ciint tm6000_tuner_callback(void *ptr, int component, int command, int arg);
3008c2ecf20Sopenharmony_ciint tm6000_xc5000_callback(void *ptr, int component, int command, int arg);
3018c2ecf20Sopenharmony_ciint tm6000_cards_setup(struct tm6000_core *dev);
3028c2ecf20Sopenharmony_civoid tm6000_flash_led(struct tm6000_core *dev, u8 state);
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci/* In tm6000-core.c */
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ciint tm6000_read_write_usb(struct tm6000_core *dev, u8 reqtype, u8 req,
3078c2ecf20Sopenharmony_ci			   u16 value, u16 index, u8 *buf, u16 len);
3088c2ecf20Sopenharmony_ciint tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3098c2ecf20Sopenharmony_ciint tm6000_get_reg16(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3108c2ecf20Sopenharmony_ciint tm6000_get_reg32(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3118c2ecf20Sopenharmony_ciint tm6000_set_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index);
3128c2ecf20Sopenharmony_ciint tm6000_set_reg_mask(struct tm6000_core *dev, u8 req, u16 value,
3138c2ecf20Sopenharmony_ci						u16 index, u16 mask);
3148c2ecf20Sopenharmony_ciint tm6000_i2c_reset(struct tm6000_core *dev, u16 tsleep);
3158c2ecf20Sopenharmony_ciint tm6000_init(struct tm6000_core *dev);
3168c2ecf20Sopenharmony_ciint tm6000_reset(struct tm6000_core *dev);
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_ciint tm6000_init_analog_mode(struct tm6000_core *dev);
3198c2ecf20Sopenharmony_ciint tm6000_init_digital_mode(struct tm6000_core *dev);
3208c2ecf20Sopenharmony_ciint tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate);
3218c2ecf20Sopenharmony_ciint tm6000_set_audio_rinput(struct tm6000_core *dev);
3228c2ecf20Sopenharmony_ciint tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute);
3238c2ecf20Sopenharmony_civoid tm6000_set_volume(struct tm6000_core *dev, int vol);
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ciint tm6000_v4l2_register(struct tm6000_core *dev);
3268c2ecf20Sopenharmony_ciint tm6000_v4l2_unregister(struct tm6000_core *dev);
3278c2ecf20Sopenharmony_ciint tm6000_v4l2_exit(void);
3288c2ecf20Sopenharmony_civoid tm6000_set_fourcc_format(struct tm6000_core *dev);
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_civoid tm6000_remove_from_devlist(struct tm6000_core *dev);
3318c2ecf20Sopenharmony_civoid tm6000_add_into_devlist(struct tm6000_core *dev);
3328c2ecf20Sopenharmony_ciint tm6000_register_extension(struct tm6000_ops *ops);
3338c2ecf20Sopenharmony_civoid tm6000_unregister_extension(struct tm6000_ops *ops);
3348c2ecf20Sopenharmony_civoid tm6000_init_extension(struct tm6000_core *dev);
3358c2ecf20Sopenharmony_civoid tm6000_close_extension(struct tm6000_core *dev);
3368c2ecf20Sopenharmony_ciint tm6000_call_fillbuf(struct tm6000_core *dev, enum tm6000_ops_type type,
3378c2ecf20Sopenharmony_ci			char *buf, int size);
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci/* In tm6000-stds.c */
3418c2ecf20Sopenharmony_civoid tm6000_get_std_res(struct tm6000_core *dev);
3428c2ecf20Sopenharmony_ciint tm6000_set_standard(struct tm6000_core *dev);
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_ci/* In tm6000-i2c.c */
3458c2ecf20Sopenharmony_ciint tm6000_i2c_register(struct tm6000_core *dev);
3468c2ecf20Sopenharmony_ciint tm6000_i2c_unregister(struct tm6000_core *dev);
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci/* In tm6000-queue.c */
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ciint tm6000_v4l2_mmap(struct file *filp, struct vm_area_struct *vma);
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ciint tm6000_vidioc_streamon(struct file *file, void *priv,
3538c2ecf20Sopenharmony_ci			   enum v4l2_buf_type i);
3548c2ecf20Sopenharmony_ciint tm6000_vidioc_streamoff(struct file *file, void *priv,
3558c2ecf20Sopenharmony_ci			    enum v4l2_buf_type i);
3568c2ecf20Sopenharmony_ciint tm6000_vidioc_reqbufs(struct file *file, void *priv,
3578c2ecf20Sopenharmony_ci			  struct v4l2_requestbuffers *rb);
3588c2ecf20Sopenharmony_ciint tm6000_vidioc_querybuf(struct file *file, void *priv,
3598c2ecf20Sopenharmony_ci			   struct v4l2_buffer *b);
3608c2ecf20Sopenharmony_ciint tm6000_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b);
3618c2ecf20Sopenharmony_ciint tm6000_vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b);
3628c2ecf20Sopenharmony_cissize_t tm6000_v4l2_read(struct file *filp, char __user * buf, size_t count,
3638c2ecf20Sopenharmony_ci			 loff_t *f_pos);
3648c2ecf20Sopenharmony_ciunsigned int tm6000_v4l2_poll(struct file *file,
3658c2ecf20Sopenharmony_ci			      struct poll_table_struct *wait);
3668c2ecf20Sopenharmony_ciint tm6000_queue_init(struct tm6000_core *dev);
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci/* In tm6000-alsa.c */
3698c2ecf20Sopenharmony_ci/*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci/* In tm6000-input.c */
3728c2ecf20Sopenharmony_ciint tm6000_ir_init(struct tm6000_core *dev);
3738c2ecf20Sopenharmony_ciint tm6000_ir_fini(struct tm6000_core *dev);
3748c2ecf20Sopenharmony_civoid tm6000_ir_wait(struct tm6000_core *dev, u8 state);
3758c2ecf20Sopenharmony_ciint tm6000_ir_int_start(struct tm6000_core *dev);
3768c2ecf20Sopenharmony_civoid tm6000_ir_int_stop(struct tm6000_core *dev);
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci/* Debug stuff */
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ciextern int tm6000_debug;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci#define dprintk(dev, level, fmt, arg...) do {\
3838c2ecf20Sopenharmony_ci	if (tm6000_debug & level) \
3848c2ecf20Sopenharmony_ci		printk(KERN_INFO "(%lu) %s %s :"fmt, jiffies, \
3858c2ecf20Sopenharmony_ci			 dev->name, __func__ , ##arg); } while (0)
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci#define V4L2_DEBUG_REG		0x0004
3888c2ecf20Sopenharmony_ci#define V4L2_DEBUG_I2C		0x0008
3898c2ecf20Sopenharmony_ci#define V4L2_DEBUG_QUEUE	0x0010
3908c2ecf20Sopenharmony_ci#define V4L2_DEBUG_ISOC		0x0020
3918c2ecf20Sopenharmony_ci#define V4L2_DEBUG_RES_LOCK	0x0040	/* Resource locking */
3928c2ecf20Sopenharmony_ci#define V4L2_DEBUG_OPEN		0x0080	/* video open/close debug */
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci#define tm6000_err(fmt, arg...) do {\
3958c2ecf20Sopenharmony_ci	printk(KERN_ERR "tm6000 %s :"fmt, \
3968c2ecf20Sopenharmony_ci		__func__ , ##arg); } while (0)
397