PageRenderTime 20ms CodeModel.GetById 6ms app.highlight 12ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/media/video/tlg2300/pd-common.h

https://bitbucket.org/ndreys/linux-sunxi
C++ Header | 282 lines | 203 code | 53 blank | 26 comment | 10 complexity | 8d30752a378429bea829b0e9619a3aad MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1#ifndef PD_COMMON_H
  2#define PD_COMMON_H
  3
  4#include <linux/version.h>
  5#include <linux/fs.h>
  6#include <linux/wait.h>
  7#include <linux/list.h>
  8#include <linux/videodev2.h>
  9#include <linux/semaphore.h>
 10#include <linux/usb.h>
 11#include <linux/poll.h>
 12#include <media/videobuf-vmalloc.h>
 13#include <media/v4l2-device.h>
 14
 15#include "dvb_frontend.h"
 16#include "dvbdev.h"
 17#include "dvb_demux.h"
 18#include "dmxdev.h"
 19
 20#define SBUF_NUM	8
 21#define MAX_BUFFER_NUM	6
 22#define PK_PER_URB	32
 23#define ISO_PKT_SIZE	3072
 24
 25#define POSEIDON_STATE_NONE		(0x0000)
 26#define POSEIDON_STATE_ANALOG		(0x0001)
 27#define POSEIDON_STATE_FM		(0x0002)
 28#define POSEIDON_STATE_DVBT		(0x0004)
 29#define POSEIDON_STATE_VBI		(0x0008)
 30#define POSEIDON_STATE_DISCONNECT	(0x0080)
 31
 32#define PM_SUSPEND_DELAY	3
 33
 34#define V4L_PAL_VBI_LINES	18
 35#define V4L_NTSC_VBI_LINES	12
 36#define V4L_PAL_VBI_FRAMESIZE	(V4L_PAL_VBI_LINES * 1440 * 2)
 37#define V4L_NTSC_VBI_FRAMESIZE	(V4L_NTSC_VBI_LINES * 1440 * 2)
 38
 39#define TUNER_FREQ_MIN		(45000000)
 40#define TUNER_FREQ_MAX		(862000000)
 41
 42struct vbi_data {
 43	struct video_device	*v_dev;
 44	struct video_data	*video;
 45	struct front_face	*front;
 46
 47	unsigned int		copied;
 48	unsigned int		vbi_size; /* the whole size of two fields */
 49	int 			users;
 50};
 51
 52/*
 53 * This is the running context of the video, it is useful for
 54 * resume()
 55 */
 56struct running_context {
 57	u32		freq;		/* VIDIOC_S_FREQUENCY */
 58	int		audio_idx;	/* VIDIOC_S_TUNER    */
 59	v4l2_std_id	tvnormid;	/* VIDIOC_S_STD     */
 60	int		sig_index;	/* VIDIOC_S_INPUT  */
 61	struct v4l2_pix_format pix;	/* VIDIOC_S_FMT   */
 62};
 63
 64struct video_data {
 65	/* v4l2 video device */
 66	struct video_device	*v_dev;
 67
 68	/* the working context */
 69	struct running_context	context;
 70
 71	/* for data copy */
 72	int		field_count;
 73
 74	char		*dst;
 75	int		lines_copied;
 76	int		prev_left;
 77
 78	int		lines_per_field;
 79	int		lines_size;
 80
 81	/* for communication */
 82	u8			endpoint_addr;
 83	struct urb 		*urb_array[SBUF_NUM];
 84	struct vbi_data		*vbi;
 85	struct poseidon 	*pd;
 86	struct front_face	*front;
 87
 88	int			is_streaming;
 89	int			users;
 90
 91	/* for bubble handler */
 92	struct work_struct	bubble_work;
 93};
 94
 95enum pcm_stream_state {
 96	STREAM_OFF,
 97	STREAM_ON,
 98	STREAM_SUSPEND,
 99};
100
101#define AUDIO_BUFS (3)
102#define CAPTURE_STREAM_EN 1
103struct poseidon_audio {
104	struct urb		*urb_array[AUDIO_BUFS];
105	unsigned int 		copied_position;
106	struct snd_pcm_substream   *capture_pcm_substream;
107
108	unsigned int 		rcv_position;
109	struct	snd_card	*card;
110	int 			card_close;
111
112	int 			users;
113	int			pm_state;
114	enum pcm_stream_state 	capture_stream;
115};
116
117struct radio_data {
118	__u32		fm_freq;
119	int		users;
120	unsigned int	is_radio_streaming;
121	int		pre_emphasis;
122	struct video_device *fm_dev;
123};
124
125#define DVB_SBUF_NUM		4
126#define DVB_URB_BUF_SIZE	0x2000
127struct pd_dvb_adapter {
128	struct dvb_adapter	dvb_adap;
129	struct dvb_frontend	dvb_fe;
130	struct dmxdev		dmxdev;
131	struct dvb_demux	demux;
132
133	atomic_t		users;
134	atomic_t		active_feed;
135
136	/* data transfer */
137	s32			is_streaming;
138	struct urb		*urb_array[DVB_SBUF_NUM];
139	struct poseidon		*pd_device;
140	u8			ep_addr;
141	u8			reserved[3];
142
143	/* data for power resume*/
144	struct dvb_frontend_parameters fe_param;
145
146	/* for channel scanning */
147	int		prev_freq;
148	int		bandwidth;
149	unsigned long	last_jiffies;
150};
151
152struct front_face {
153	/* use this field to distinguish VIDEO and VBI */
154	enum v4l2_buf_type	type;
155
156	/* for host */
157	struct videobuf_queue	q;
158
159	/* the bridge for host and device */
160	struct videobuf_buffer	*curr_frame;
161
162	/* for device */
163	spinlock_t		queue_lock;
164	struct list_head	active;
165	struct poseidon		*pd;
166};
167
168struct poseidon {
169	struct list_head	device_list;
170
171	struct mutex		lock;
172	struct kref		kref;
173
174	/* for V4L2 */
175	struct v4l2_device	v4l2_dev;
176
177	/* hardware info */
178	struct usb_device	*udev;
179	struct usb_interface	*interface;
180	int 			cur_transfer_mode;
181
182	struct video_data	video_data;	/* video */
183	struct vbi_data		vbi_data;	/* vbi	 */
184	struct poseidon_audio	audio;		/* audio (alsa) */
185	struct radio_data	radio_data;	/* FM	 */
186	struct pd_dvb_adapter	dvb_data;	/* DVB	 */
187
188	u32			state;
189	struct file		*file_for_stream; /* the active stream*/
190
191#ifdef CONFIG_PM
192	int (*pm_suspend)(struct poseidon *);
193	int (*pm_resume)(struct poseidon *);
194	pm_message_t		msg;
195
196	struct work_struct	pm_work;
197	u8			portnum;
198#endif
199};
200
201struct poseidon_format {
202	char 	*name;
203	int	fourcc;		 /* video4linux 2	  */
204	int	depth;		 /* bit/pixel		  */
205	int	flags;
206};
207
208struct poseidon_tvnorm {
209	v4l2_std_id	v4l2_id;
210	char		name[12];
211	u32		tlg_tvnorm;
212};
213
214/* video */
215int pd_video_init(struct poseidon *);
216void pd_video_exit(struct poseidon *);
217int stop_all_video_stream(struct poseidon *);
218
219/* alsa audio */
220int poseidon_audio_init(struct poseidon *);
221int poseidon_audio_free(struct poseidon *);
222#ifdef CONFIG_PM
223int pm_alsa_suspend(struct poseidon *);
224int pm_alsa_resume(struct poseidon *);
225#endif
226
227/* dvb */
228int pd_dvb_usb_device_init(struct poseidon *);
229void pd_dvb_usb_device_exit(struct poseidon *);
230void pd_dvb_usb_device_cleanup(struct poseidon *);
231int pd_dvb_get_adapter_num(struct pd_dvb_adapter *);
232void dvb_stop_streaming(struct pd_dvb_adapter *);
233
234/* FM */
235int poseidon_fm_init(struct poseidon *);
236int poseidon_fm_exit(struct poseidon *);
237struct video_device *vdev_init(struct poseidon *, struct video_device *);
238
239/* vendor command ops */
240int send_set_req(struct poseidon*, u8, s32, s32*);
241int send_get_req(struct poseidon*, u8, s32, void*, s32*, s32);
242s32 set_tuner_mode(struct poseidon*, unsigned char);
243
244/* bulk urb alloc/free */
245int alloc_bulk_urbs_generic(struct urb **urb_array, int num,
246			struct usb_device *udev, u8 ep_addr,
247			int buf_size, gfp_t gfp_flags,
248			usb_complete_t complete_fn, void *context);
249void free_all_urb_generic(struct urb **urb_array, int num);
250
251/* misc */
252void poseidon_delete(struct kref *kref);
253void destroy_video_device(struct video_device **v_dev);
254extern int debug_mode;
255void set_debug_mode(struct video_device *vfd, int debug_mode);
256
257#ifdef CONFIG_PM
258#define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE)
259#else
260#define in_hibernation(pd) (0)
261#endif
262#define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt))
263
264#define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \
265				__func__, __LINE__,  ## __VA_ARGS__)
266
267/* for power management */
268#define logpm(pd) do {\
269			if (debug_mode & 0x10)\
270				log();\
271		} while (0)
272
273#define logs(f) do { \
274			if ((debug_mode & 0x4) && \
275				(f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \
276					log("type : VBI");\
277								\
278			if ((debug_mode & 0x8) && \
279				(f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \
280					log("type : VIDEO");\
281		} while (0)
282#endif