Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #ifndef _DVB_USB_CXUSB_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #define _DVB_USB_CXUSB_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <linux/completion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <media/v4l2-common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <media/v4l2-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <media/videobuf2-core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <media/videobuf2-v4l2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define DVB_USB_LOG_PREFIX "cxusb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include "dvb-usb.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define CXUSB_VIDEO_URBS (5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define CXUSB_VIDEO_URB_MAX_SIZE (512 * 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define CXUSB_VIDEO_PKT_SIZE 3030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define CXUSB_VIDEO_MAX_FRAME_PKTS 346
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define CXUSB_VIDEO_MAX_FRAME_SIZE (CXUSB_VIDEO_MAX_FRAME_PKTS * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 					CXUSB_VIDEO_PKT_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) /* usb commands - some of it are guesses, don't have a reference yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define CMD_BLUEBIRD_GPIO_RW 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define CMD_I2C_WRITE     0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define CMD_I2C_READ      0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define CMD_GPIO_READ     0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define CMD_GPIO_WRITE    0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define     GPIO_TUNER         0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define CMD_POWER_OFF     0xdc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define CMD_POWER_ON      0xde
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define CMD_STREAMING_ON  0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define CMD_STREAMING_OFF 0x37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define CMD_AVER_STREAM_ON  0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define CMD_AVER_STREAM_OFF 0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define CMD_GET_IR_CODE   0x47
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #define CMD_ANALOG        0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define CMD_DIGITAL       0x51
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #define CXUSB_BT656_PREAMBLE ((const u8 *)"\xff\x00\x00")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) #define CXUSB_BT656_FIELD_MASK BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #define CXUSB_BT656_FIELD_1 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define CXUSB_BT656_FIELD_2 BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define CXUSB_BT656_VBI_MASK BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define CXUSB_BT656_VBI_ON BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) #define CXUSB_BT656_VBI_OFF 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #define CXUSB_BT656_SEAV_MASK BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define CXUSB_BT656_SEAV_EAV BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #define CXUSB_BT656_SEAV_SAV 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) /* Max transfer size done by I2C transfer functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #define MAX_XFER_SIZE  80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) struct cxusb_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	u8 gpio_write_state[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	bool gpio_write_refresh[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	struct i2c_client *i2c_client_demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	struct i2c_client *i2c_client_tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	unsigned char data[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	struct mutex stream_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	u8 last_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	int (*fe_read_status)(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 			      enum fe_status *status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) enum cxusb_open_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	CXUSB_OPEN_INIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	CXUSB_OPEN_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	CXUSB_OPEN_ANALOG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	CXUSB_OPEN_DIGITAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) struct cxusb_medion_auxbuf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	unsigned int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	unsigned int paylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) enum cxusb_bt656_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	NEW_FRAME, FIRST_FIELD, SECOND_FIELD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) enum cxusb_bt656_fmode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	START_SEARCH, LINE_SAMPLES, VBI_SAMPLES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct cxusb_bt656_params {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	enum cxusb_bt656_mode mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	enum cxusb_bt656_fmode fmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	unsigned int pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	unsigned int line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	unsigned int linesamples;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct cxusb_medion_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	/* has to be the first one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	struct cxusb_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	struct dvb_usb_device *dvbdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	enum cxusb_open_type open_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	unsigned int open_ctr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	struct mutex open_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef CONFIG_DVB_USB_CXUSB_ANALOG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	struct v4l2_device v4l2dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	struct v4l2_subdev *cx25840;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	struct v4l2_subdev *tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	struct v4l2_subdev *tda9887;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	struct video_device *videodev, *radiodev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	struct mutex dev_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	struct vb2_queue videoqueue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	u32 input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	bool stop_streaming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	u32 width, height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	u32 field_order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	struct cxusb_medion_auxbuf auxbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	v4l2_std_id norm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	struct urb *streamurbs[CXUSB_VIDEO_URBS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	unsigned long urbcomplete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	struct work_struct urbwork;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	unsigned int nexturb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	struct cxusb_bt656_params bt656;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	struct cxusb_medion_vbuffer *vbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	__u32 vbuf_sequence;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	struct list_head buflist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	struct completion v4l2_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct cxusb_medion_vbuffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	struct vb2_v4l2_buffer vb2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* defines for "debug" module parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define CXUSB_DBG_RC BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define CXUSB_DBG_I2C BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define CXUSB_DBG_MISC BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define CXUSB_DBG_BT656 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define CXUSB_DBG_URB BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define CXUSB_DBG_OPS BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define CXUSB_DBG_AUXB BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) extern int dvb_usb_cxusb_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define cxusb_vprintk(dvbdev, lvl, ...) do {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		struct cxusb_medion_dev *_cxdev = (dvbdev)->priv;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		if (dvb_usb_cxusb_debug & CXUSB_DBG_##lvl)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 			v4l2_printk(KERN_DEBUG,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 				    &_cxdev->v4l2dev, __VA_ARGS__);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	} while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) int cxusb_ctrl_msg(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		   u8 cmd, const u8 *wbuf, int wlen, u8 *rbuf, int rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #ifdef CONFIG_DVB_USB_CXUSB_ANALOG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) int cxusb_medion_analog_init(struct dvb_usb_device *dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int cxusb_medion_register_analog(struct dvb_usb_device *dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) void cxusb_medion_unregister_analog(struct dvb_usb_device *dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static inline int cxusb_medion_analog_init(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) static inline int cxusb_medion_register_analog(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) static inline void cxusb_medion_unregister_analog(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int cxusb_medion_get(struct dvb_usb_device *dvbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		     enum cxusb_open_type open_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) void cxusb_medion_put(struct dvb_usb_device *dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #endif