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