1*1802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2866b8695SGreg Kroah-Hartman /* 3866b8695SGreg Kroah-Hartman * Copyright (C) 2005-2006 Micronas USA Inc. 4866b8695SGreg Kroah-Hartman */ 5866b8695SGreg Kroah-Hartman 6866b8695SGreg Kroah-Hartman /* 7866b8695SGreg Kroah-Hartman * This is the private include file for the go7007 driver. It should not 8866b8695SGreg Kroah-Hartman * be included by anybody but the driver itself, and especially not by 9866b8695SGreg Kroah-Hartman * user-space applications. 10866b8695SGreg Kroah-Hartman */ 11866b8695SGreg Kroah-Hartman 120b398f4fSPete Eberlein #include <media/v4l2-device.h> 139b8451d5SHans Verkuil #include <media/v4l2-ctrls.h> 14bae74320SHans Verkuil #include <media/v4l2-fh.h> 15c139990eSJunghak Sung #include <media/videobuf2-v4l2.h> 160b398f4fSPete Eberlein 17866b8695SGreg Kroah-Hartman struct go7007; 18866b8695SGreg Kroah-Hartman 19866b8695SGreg Kroah-Hartman /* IDs to activate board-specific support code */ 20866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_MATRIX_II 0 21866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_MATRIX_RELOAD 1 22866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_STAR_TREK 2 23866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_PCI_VOYAGER 3 24866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_XMEN 4 25866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_XMEN_II 5 26866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_XMEN_III 6 27866b8695SGreg Kroah-Hartman #define GO7007_BOARDID_MATRIX_REV 7 289ff76e36SHans Verkuil #define GO7007_BOARDID_PX_M402U 8 299ff76e36SHans Verkuil #define GO7007_BOARDID_PX_TV402U 9 309ff76e36SHans Verkuil #define GO7007_BOARDID_LIFEVIEW_LR192 10 /* TV Walker Ultra */ 319ff76e36SHans Verkuil #define GO7007_BOARDID_ENDURA 11 329ff76e36SHans Verkuil #define GO7007_BOARDID_ADLINK_MPG24 12 339ff76e36SHans Verkuil #define GO7007_BOARDID_SENSORAY_2250 13 /* Sensoray 2250/2251 */ 341f1aed2eSHans Verkuil #define GO7007_BOARDID_ADS_USBAV_709 14 35866b8695SGreg Kroah-Hartman 36866b8695SGreg Kroah-Hartman /* Various characteristics of each board */ 37866b8695SGreg Kroah-Hartman #define GO7007_BOARD_HAS_AUDIO (1<<0) 38866b8695SGreg Kroah-Hartman #define GO7007_BOARD_USE_ONBOARD_I2C (1<<1) 39866b8695SGreg Kroah-Hartman #define GO7007_BOARD_HAS_TUNER (1<<2) 40866b8695SGreg Kroah-Hartman 41866b8695SGreg Kroah-Hartman /* Characteristics of sensor devices */ 42866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_VALID_POLAR (1<<0) 43866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_HREF_POLAR (1<<1) 44866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_VREF_POLAR (1<<2) 45866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_FIELD_ID_POLAR (1<<3) 46866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_BIT_WIDTH (1<<4) 47866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_VALID_ENABLE (1<<5) 48866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_656 (1<<6) 49866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_CONFIG_MASK 0x7f 50866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_TV (1<<7) 51866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_VBI (1<<8) 52866b8695SGreg Kroah-Hartman #define GO7007_SENSOR_SCALING (1<<9) 53b95dd82cSHans Verkuil #define GO7007_SENSOR_SAA7115 (1<<10) 54866b8695SGreg Kroah-Hartman 55866b8695SGreg Kroah-Hartman /* Characteristics of audio sensor devices */ 56866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_I2S_MODE_1 (1) 57866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_I2S_MODE_2 (2) 58866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_I2S_MODE_3 (3) 59866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_BCLK_POLAR (1<<2) 60866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_WORD_14 (14<<4) 61866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_WORD_16 (16<<4) 62866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_ONE_CHANNEL (1<<11) 63866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_I2S_MASTER (1<<16) 64866b8695SGreg Kroah-Hartman #define GO7007_AUDIO_OKI_MODE (1<<17) 65866b8695SGreg Kroah-Hartman 660ee58f84SHans Verkuil #define GO7007_CID_CUSTOM_BASE (V4L2_CID_DETECT_CLASS_BASE + 0x1000) 670ee58f84SHans Verkuil #define V4L2_CID_PIXEL_THRESHOLD0 (GO7007_CID_CUSTOM_BASE+1) 680ee58f84SHans Verkuil #define V4L2_CID_MOTION_THRESHOLD0 (GO7007_CID_CUSTOM_BASE+2) 690ee58f84SHans Verkuil #define V4L2_CID_MB_THRESHOLD0 (GO7007_CID_CUSTOM_BASE+3) 700ee58f84SHans Verkuil #define V4L2_CID_PIXEL_THRESHOLD1 (GO7007_CID_CUSTOM_BASE+4) 710ee58f84SHans Verkuil #define V4L2_CID_MOTION_THRESHOLD1 (GO7007_CID_CUSTOM_BASE+5) 720ee58f84SHans Verkuil #define V4L2_CID_MB_THRESHOLD1 (GO7007_CID_CUSTOM_BASE+6) 730ee58f84SHans Verkuil #define V4L2_CID_PIXEL_THRESHOLD2 (GO7007_CID_CUSTOM_BASE+7) 740ee58f84SHans Verkuil #define V4L2_CID_MOTION_THRESHOLD2 (GO7007_CID_CUSTOM_BASE+8) 750ee58f84SHans Verkuil #define V4L2_CID_MB_THRESHOLD2 (GO7007_CID_CUSTOM_BASE+9) 760ee58f84SHans Verkuil #define V4L2_CID_PIXEL_THRESHOLD3 (GO7007_CID_CUSTOM_BASE+10) 770ee58f84SHans Verkuil #define V4L2_CID_MOTION_THRESHOLD3 (GO7007_CID_CUSTOM_BASE+11) 780ee58f84SHans Verkuil #define V4L2_CID_MB_THRESHOLD3 (GO7007_CID_CUSTOM_BASE+12) 790ee58f84SHans Verkuil 80866b8695SGreg Kroah-Hartman struct go7007_board_info { 81866b8695SGreg Kroah-Hartman unsigned int flags; 82866b8695SGreg Kroah-Hartman int hpi_buffer_cap; 83866b8695SGreg Kroah-Hartman unsigned int sensor_flags; 84866b8695SGreg Kroah-Hartman int sensor_width; 85866b8695SGreg Kroah-Hartman int sensor_height; 86866b8695SGreg Kroah-Hartman int sensor_framerate; 87866b8695SGreg Kroah-Hartman int sensor_h_offset; 88866b8695SGreg Kroah-Hartman int sensor_v_offset; 89866b8695SGreg Kroah-Hartman unsigned int audio_flags; 90866b8695SGreg Kroah-Hartman int audio_rate; 91866b8695SGreg Kroah-Hartman int audio_bclk_div; 92866b8695SGreg Kroah-Hartman int audio_main_div; 93866b8695SGreg Kroah-Hartman int num_i2c_devs; 94dcafb6deSVolokh Konstantin struct go_i2c { 957400516aSJean Delvare const char *type; 968c93c400SDan Carpenter unsigned int is_video:1; 978c93c400SDan Carpenter unsigned int is_audio:1; 98866b8695SGreg Kroah-Hartman int addr; 99dcafb6deSVolokh Konstantin u32 flags; 1003acd16abSHans Verkuil } i2c_devs[5]; 101866b8695SGreg Kroah-Hartman int num_inputs; 102866b8695SGreg Kroah-Hartman struct { 103866b8695SGreg Kroah-Hartman int video_input; 1043acd16abSHans Verkuil int audio_index; 105866b8695SGreg Kroah-Hartman char *name; 106866b8695SGreg Kroah-Hartman } inputs[4]; 1073acd16abSHans Verkuil int video_config; 1083acd16abSHans Verkuil int num_aud_inputs; 1093acd16abSHans Verkuil struct { 1103acd16abSHans Verkuil int audio_input; 1113acd16abSHans Verkuil char *name; 1123acd16abSHans Verkuil } aud_inputs[3]; 113866b8695SGreg Kroah-Hartman }; 114866b8695SGreg Kroah-Hartman 115866b8695SGreg Kroah-Hartman struct go7007_hpi_ops { 116866b8695SGreg Kroah-Hartman int (*interface_reset)(struct go7007 *go); 117866b8695SGreg Kroah-Hartman int (*write_interrupt)(struct go7007 *go, int addr, int data); 118866b8695SGreg Kroah-Hartman int (*read_interrupt)(struct go7007 *go); 119866b8695SGreg Kroah-Hartman int (*stream_start)(struct go7007 *go); 120866b8695SGreg Kroah-Hartman int (*stream_stop)(struct go7007 *go); 121866b8695SGreg Kroah-Hartman int (*send_firmware)(struct go7007 *go, u8 *data, int len); 122d73f822cSPete Eberlein int (*send_command)(struct go7007 *go, unsigned int cmd, void *arg); 123d5d3a7ccSHans Verkuil void (*release)(struct go7007 *go); 124866b8695SGreg Kroah-Hartman }; 125866b8695SGreg Kroah-Hartman 126866b8695SGreg Kroah-Hartman /* The video buffer size must be a multiple of PAGE_SIZE */ 127866b8695SGreg Kroah-Hartman #define GO7007_BUF_PAGES (128 * 1024 / PAGE_SIZE) 128866b8695SGreg Kroah-Hartman #define GO7007_BUF_SIZE (GO7007_BUF_PAGES << PAGE_SHIFT) 129866b8695SGreg Kroah-Hartman 130866b8695SGreg Kroah-Hartman struct go7007_buffer { 1312d700715SJunghak Sung struct vb2_v4l2_buffer vb; 132ffcc1c08SHans Verkuil struct list_head list; 133866b8695SGreg Kroah-Hartman unsigned int frame_offset; 134866b8695SGreg Kroah-Hartman u32 modet_active; 135866b8695SGreg Kroah-Hartman }; 136866b8695SGreg Kroah-Hartman 137866b8695SGreg Kroah-Hartman #define GO7007_RATIO_1_1 0 138866b8695SGreg Kroah-Hartman #define GO7007_RATIO_4_3 1 139866b8695SGreg Kroah-Hartman #define GO7007_RATIO_16_9 2 140866b8695SGreg Kroah-Hartman 141866b8695SGreg Kroah-Hartman enum go7007_parser_state { 142866b8695SGreg Kroah-Hartman STATE_DATA, 143866b8695SGreg Kroah-Hartman STATE_00, 144866b8695SGreg Kroah-Hartman STATE_00_00, 145866b8695SGreg Kroah-Hartman STATE_00_00_01, 146866b8695SGreg Kroah-Hartman STATE_FF, 147866b8695SGreg Kroah-Hartman STATE_VBI_LEN_A, 148866b8695SGreg Kroah-Hartman STATE_VBI_LEN_B, 149866b8695SGreg Kroah-Hartman STATE_MODET_MAP, 150866b8695SGreg Kroah-Hartman STATE_UNPARSED, 151866b8695SGreg Kroah-Hartman }; 152866b8695SGreg Kroah-Hartman 153866b8695SGreg Kroah-Hartman struct go7007 { 154866b8695SGreg Kroah-Hartman struct device *dev; 1554d217b83SHans Verkuil u8 bus_info[32]; 1560a6ecbb4SHans Verkuil const struct go7007_board_info *board_info; 157866b8695SGreg Kroah-Hartman unsigned int board_id; 158866b8695SGreg Kroah-Hartman int tuner_type; 159866b8695SGreg Kroah-Hartman int channel_number; /* for multi-channel boards like Adlink PCI-MPG24 */ 160866b8695SGreg Kroah-Hartman char name[64]; 1616bb0e65dSHans Verkuil struct video_device vdev; 16295ef3940SHans Verkuil void *boot_fw; 16395ef3940SHans Verkuil unsigned boot_fw_len; 1640b398f4fSPete Eberlein struct v4l2_device v4l2_dev; 1659b8451d5SHans Verkuil struct v4l2_ctrl_handler hdl; 16635d2d76dSHans Verkuil struct v4l2_ctrl *mpeg_video_encoding; 16735d2d76dSHans Verkuil struct v4l2_ctrl *mpeg_video_gop_size; 16835d2d76dSHans Verkuil struct v4l2_ctrl *mpeg_video_gop_closure; 16935d2d76dSHans Verkuil struct v4l2_ctrl *mpeg_video_bitrate; 17035d2d76dSHans Verkuil struct v4l2_ctrl *mpeg_video_aspect_ratio; 1717e4bfb9eSVolokh Konstantin struct v4l2_ctrl *mpeg_video_b_frames; 172778ca511SHans Verkuil struct v4l2_ctrl *mpeg_video_rep_seqheader; 1730ee58f84SHans Verkuil struct v4l2_ctrl *modet_mode; 174866b8695SGreg Kroah-Hartman enum { STATUS_INIT, STATUS_ONLINE, STATUS_SHUTDOWN } status; 175866b8695SGreg Kroah-Hartman spinlock_t spinlock; 176fd9a40daSMauro Carvalho Chehab struct mutex hw_lock; 177ffcc1c08SHans Verkuil struct mutex serialize_lock; 178866b8695SGreg Kroah-Hartman int audio_enabled; 1793acd16abSHans Verkuil struct v4l2_subdev *sd_video; 1803acd16abSHans Verkuil struct v4l2_subdev *sd_audio; 1819b6ebf33SHans Verkuil u8 usb_buf[16]; 182866b8695SGreg Kroah-Hartman 183866b8695SGreg Kroah-Hartman /* Video input */ 184866b8695SGreg Kroah-Hartman int input; 1853acd16abSHans Verkuil int aud_input; 186866b8695SGreg Kroah-Hartman enum { GO7007_STD_NTSC, GO7007_STD_PAL, GO7007_STD_OTHER } standard; 18750deb749SHans Verkuil v4l2_std_id std; 188866b8695SGreg Kroah-Hartman int sensor_framerate; 189866b8695SGreg Kroah-Hartman int width; 190866b8695SGreg Kroah-Hartman int height; 191866b8695SGreg Kroah-Hartman int encoder_h_offset; 192866b8695SGreg Kroah-Hartman int encoder_v_offset; 193866b8695SGreg Kroah-Hartman unsigned int encoder_h_halve:1; 194866b8695SGreg Kroah-Hartman unsigned int encoder_v_halve:1; 195866b8695SGreg Kroah-Hartman unsigned int encoder_subsample:1; 196866b8695SGreg Kroah-Hartman 197866b8695SGreg Kroah-Hartman /* Encoder config */ 19835d2d76dSHans Verkuil u32 format; 199866b8695SGreg Kroah-Hartman int bitrate; 200866b8695SGreg Kroah-Hartman int fps_scale; 201866b8695SGreg Kroah-Hartman int pali; 202866b8695SGreg Kroah-Hartman int aspect_ratio; 203866b8695SGreg Kroah-Hartman int gop_size; 204866b8695SGreg Kroah-Hartman unsigned int ipb:1; 205866b8695SGreg Kroah-Hartman unsigned int closed_gop:1; 206866b8695SGreg Kroah-Hartman unsigned int repeat_seqhead:1; 207866b8695SGreg Kroah-Hartman unsigned int seq_header_enable:1; 208866b8695SGreg Kroah-Hartman unsigned int gop_header_enable:1; 209866b8695SGreg Kroah-Hartman unsigned int dvd_mode:1; 210866b8695SGreg Kroah-Hartman unsigned int interlace_coding:1; 211866b8695SGreg Kroah-Hartman 212866b8695SGreg Kroah-Hartman /* Motion detection */ 213866b8695SGreg Kroah-Hartman unsigned int modet_enable:1; 214866b8695SGreg Kroah-Hartman struct { 215866b8695SGreg Kroah-Hartman unsigned int enable:1; 216866b8695SGreg Kroah-Hartman int pixel_threshold; 217866b8695SGreg Kroah-Hartman int motion_threshold; 218866b8695SGreg Kroah-Hartman int mb_threshold; 219866b8695SGreg Kroah-Hartman } modet[4]; 220866b8695SGreg Kroah-Hartman unsigned char modet_map[1624]; 221866b8695SGreg Kroah-Hartman unsigned char active_map[216]; 2220ee58f84SHans Verkuil u32 modet_event_status; 223866b8695SGreg Kroah-Hartman 224866b8695SGreg Kroah-Hartman /* Video streaming */ 225ffcc1c08SHans Verkuil struct mutex queue_lock; 226ffcc1c08SHans Verkuil struct vb2_queue vidq; 227866b8695SGreg Kroah-Hartman enum go7007_parser_state state; 228866b8695SGreg Kroah-Hartman int parse_length; 229866b8695SGreg Kroah-Hartman u16 modet_word; 230866b8695SGreg Kroah-Hartman int seen_frame; 231866b8695SGreg Kroah-Hartman u32 next_seq; 232ffcc1c08SHans Verkuil struct list_head vidq_active; 233866b8695SGreg Kroah-Hartman wait_queue_head_t frame_waitq; 234ffcc1c08SHans Verkuil struct go7007_buffer *active_buf; 235866b8695SGreg Kroah-Hartman 236866b8695SGreg Kroah-Hartman /* Audio streaming */ 237866b8695SGreg Kroah-Hartman void (*audio_deliver)(struct go7007 *go, u8 *buf, int length); 238866b8695SGreg Kroah-Hartman void *snd_context; 239866b8695SGreg Kroah-Hartman 240866b8695SGreg Kroah-Hartman /* I2C */ 241866b8695SGreg Kroah-Hartman int i2c_adapter_online; 242866b8695SGreg Kroah-Hartman struct i2c_adapter i2c_adapter; 243866b8695SGreg Kroah-Hartman 244866b8695SGreg Kroah-Hartman /* HPI driver */ 245ff880348SJulia Lawall const struct go7007_hpi_ops *hpi_ops; 246866b8695SGreg Kroah-Hartman void *hpi_context; 247866b8695SGreg Kroah-Hartman int interrupt_available; 248866b8695SGreg Kroah-Hartman wait_queue_head_t interrupt_waitq; 249866b8695SGreg Kroah-Hartman unsigned short interrupt_value; 250866b8695SGreg Kroah-Hartman unsigned short interrupt_data; 251866b8695SGreg Kroah-Hartman }; 252866b8695SGreg Kroah-Hartman 2530b398f4fSPete Eberlein static inline struct go7007 *to_go7007(struct v4l2_device *v4l2_dev) 2540b398f4fSPete Eberlein { 2550b398f4fSPete Eberlein return container_of(v4l2_dev, struct go7007, v4l2_dev); 2560b398f4fSPete Eberlein } 2570b398f4fSPete Eberlein 258fd9a40daSMauro Carvalho Chehab /* All of these must be called with the hpi_lock mutex held! */ 259866b8695SGreg Kroah-Hartman #define go7007_interface_reset(go) \ 260866b8695SGreg Kroah-Hartman ((go)->hpi_ops->interface_reset(go)) 261866b8695SGreg Kroah-Hartman #define go7007_write_interrupt(go, x, y) \ 262866b8695SGreg Kroah-Hartman ((go)->hpi_ops->write_interrupt)((go), (x), (y)) 263866b8695SGreg Kroah-Hartman #define go7007_stream_start(go) \ 264866b8695SGreg Kroah-Hartman ((go)->hpi_ops->stream_start(go)) 265866b8695SGreg Kroah-Hartman #define go7007_stream_stop(go) \ 266866b8695SGreg Kroah-Hartman ((go)->hpi_ops->stream_stop(go)) 267866b8695SGreg Kroah-Hartman #define go7007_send_firmware(go, x, y) \ 268866b8695SGreg Kroah-Hartman ((go)->hpi_ops->send_firmware)((go), (x), (y)) 269866b8695SGreg Kroah-Hartman #define go7007_write_addr(go, x, y) \ 270866b8695SGreg Kroah-Hartman ((go)->hpi_ops->write_interrupt)((go), (x)|0x8000, (y)) 271866b8695SGreg Kroah-Hartman 272866b8695SGreg Kroah-Hartman /* go7007-driver.c */ 273866b8695SGreg Kroah-Hartman int go7007_read_addr(struct go7007 *go, u16 addr, u16 *data); 274866b8695SGreg Kroah-Hartman int go7007_read_interrupt(struct go7007 *go, u16 *value, u16 *data); 275866b8695SGreg Kroah-Hartman int go7007_boot_encoder(struct go7007 *go, int init_i2c); 276866b8695SGreg Kroah-Hartman int go7007_reset_encoder(struct go7007 *go); 2773acd16abSHans Verkuil int go7007_register_encoder(struct go7007 *go, unsigned num_i2c_devs); 278866b8695SGreg Kroah-Hartman int go7007_start_encoder(struct go7007 *go); 279866b8695SGreg Kroah-Hartman void go7007_parse_video_stream(struct go7007 *go, u8 *buf, int length); 2800a6ecbb4SHans Verkuil struct go7007 *go7007_alloc(const struct go7007_board_info *board, 281866b8695SGreg Kroah-Hartman struct device *dev); 28250deb749SHans Verkuil void go7007_update_board(struct go7007 *go); 28350deb749SHans Verkuil 284866b8695SGreg Kroah-Hartman /* go7007-fw.c */ 285866b8695SGreg Kroah-Hartman int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen); 286866b8695SGreg Kroah-Hartman 287866b8695SGreg Kroah-Hartman /* go7007-i2c.c */ 288866b8695SGreg Kroah-Hartman int go7007_i2c_init(struct go7007 *go); 289866b8695SGreg Kroah-Hartman int go7007_i2c_remove(struct go7007 *go); 290866b8695SGreg Kroah-Hartman 291866b8695SGreg Kroah-Hartman /* go7007-v4l2.c */ 292866b8695SGreg Kroah-Hartman int go7007_v4l2_init(struct go7007 *go); 2939b8451d5SHans Verkuil int go7007_v4l2_ctrl_init(struct go7007 *go); 294866b8695SGreg Kroah-Hartman void go7007_v4l2_remove(struct go7007 *go); 295866b8695SGreg Kroah-Hartman 296866b8695SGreg Kroah-Hartman /* snd-go7007.c */ 297866b8695SGreg Kroah-Hartman int go7007_snd_init(struct go7007 *go); 298866b8695SGreg Kroah-Hartman int go7007_snd_remove(struct go7007 *go); 299