aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/media/as102/as102_drv.h
blob: fd33f5a12dcc2167cf9dada508b13521f7159b8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Abilis Systems Single DVB-T Receiver
 * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#if defined(CONFIG_AS102_USB)
#include <linux/usb.h>
extern struct usb_driver as102_usb_driver;
#endif

#if defined(CONFIG_AS102_SPI)
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/cdev.h>

extern struct spi_driver as102_spi_driver;
#endif

#include "dvb_demux.h"
#include "dvb_frontend.h"
#include "dmxdev.h"

#define DRIVER_FULL_NAME "Abilis Systems as10x usb driver"
#define DRIVER_NAME "as10x_usb"

extern int as102_debug;
#define debug	as102_debug

#define dprintk(debug, args...) \
	do { if (debug) {	\
		printk(KERN_DEBUG "%s: ",__FUNCTION__);	\
		printk(args);	\
	} } while (0)

#ifdef TRACE
#define ENTER()                 printk(">> enter %s\n", __FUNCTION__)
#define LEAVE()                 printk("<< leave %s\n", __FUNCTION__)
#else
#define ENTER()
#define LEAVE()
#endif

#define AS102_DEVICE_MAJOR	192

#define AS102_USB_BUF_SIZE	512
#define MAX_STREAM_URB		32

#include "as10x_cmd.h"

#if defined(CONFIG_AS102_USB)
#include "as102_usb_drv.h"
#endif

#if defined(CONFIG_AS102_SPI)
#include "as10x_spi_drv.h"
#endif


struct as102_bus_adapter_t {
#if defined(CONFIG_AS102_USB)
	struct usb_device *usb_dev;
#elif defined(CONFIG_AS102_SPI)
	struct spi_device *spi_dev;
	struct cdev cdev; /* spidev raw device */

	struct timer_list timer;
	struct completion xfer_done;
#endif
	/* bus token lock */
	struct mutex lock;
	/* low level interface for bus adapter */
	union as10x_bus_token_t {
#if defined(CONFIG_AS102_USB)
		/* usb token */
		struct as10x_usb_token_cmd_t usb;
#endif
#if defined(CONFIG_AS102_SPI)
		/* spi token */
		struct as10x_spi_token_cmd_t spi;
#endif
	} token;

	/* token cmd xfer id */
	uint16_t cmd_xid;

	/* as10x command and response for dvb interface*/
	struct as10x_cmd_t *cmd, *rsp;

	/* bus adapter private ops callback */
	struct as102_priv_ops_t *ops;
};

struct as102_dev_t {
	const char *name;
	struct as102_bus_adapter_t bus_adap;
	struct list_head device_entry;
	struct kref kref;
	unsigned long minor;

	struct dvb_adapter dvb_adap;
	struct dvb_frontend dvb_fe;
	struct dvb_demux dvb_dmx;
	struct dmxdev dvb_dmxdev;

	/* demodulator stats */
	struct as10x_demod_stats demod_stats;
	/* signal strength */
	uint16_t signal_strength;
	/* bit error rate */
	uint32_t ber;

	/* timer handle to trig ts stream download */
	struct timer_list timer_handle;

	struct mutex sem;
	dma_addr_t dma_addr;
	void *stream;
	int streaming;
	struct urb *stream_urb[MAX_STREAM_URB];
};

int as102_dvb_register(struct as102_dev_t *dev);
void as102_dvb_unregister(struct as102_dev_t *dev);

int as102_dvb_register_fe(struct as102_dev_t *dev, struct dvb_frontend *fe);
int as102_dvb_unregister_fe(struct dvb_frontend *dev);

/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */