summaryrefslogtreecommitdiffstats
path: root/drivers/media/pci/ddbridge/ddbridge.h
blob: 185b423818d38376028d9d0b79a5f6ebf6c21be2 (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 * ddbridge.h: Digital Devices PCIe bridge driver
 *
 * Copyright (C) 2010-2011 Digital Devices GmbH
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 only, as published by the Free Software Foundation.
 *
 *
 * 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.
 *
 * To obtain the license, point your browser to
 * http://www.gnu.org/copyleft/gpl.html
 */

#ifndef _DDBRIDGE_H_
#define _DDBRIDGE_H_

#include <linux/types.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/mutex.h>
#include <asm/dma.h>
#include <linux/dvb/frontend.h>
#include <linux/dvb/ca.h>
#include <linux/socket.h>

#include "dmxdev.h"
#include "dvbdev.h"
#include "dvb_demux.h"
#include "dvb_frontend.h"
#include "dvb_ringbuffer.h"
#include "dvb_ca_en50221.h"
#include "dvb_net.h"
#include "cxd2099.h"

#define DDB_MAX_I2C     4
#define DDB_MAX_PORT    4
#define DDB_MAX_INPUT   8
#define DDB_MAX_OUTPUT  4

struct ddb_info {
	int   type;
#define DDB_NONE         0
#define DDB_OCTOPUS      1
	char *name;
	int   port_num;
	u32   port_type[DDB_MAX_PORT];
};

/* DMA_SIZE MUST be divisible by 188 and 128 !!! */

#define INPUT_DMA_MAX_BUFS 32      /* hardware table limit */
#define INPUT_DMA_BUFS 8
#define INPUT_DMA_SIZE (128*47*21)

#define OUTPUT_DMA_MAX_BUFS 32
#define OUTPUT_DMA_BUFS 8
#define OUTPUT_DMA_SIZE (128*47*21)

struct ddb;
struct ddb_port;

struct ddb_input {
	struct ddb_port       *port;
	u32                    nr;
	int                    attached;

	dma_addr_t             pbuf[INPUT_DMA_MAX_BUFS];
	u8                    *vbuf[INPUT_DMA_MAX_BUFS];
	u32                    dma_buf_num;
	u32                    dma_buf_size;

	struct tasklet_struct  tasklet;
	spinlock_t             lock;
	wait_queue_head_t      wq;
	int                    running;
	u32                    stat;
	u32                    cbuf;
	u32                    coff;

	struct dvb_adapter     adap;
	struct dvb_device     *dev;
	struct dvb_frontend   *fe;
	struct dvb_frontend   *fe2;
	struct dmxdev          dmxdev;
	struct dvb_demux       demux;
	struct dvb_net         dvbnet;
	struct dmx_frontend    hw_frontend;
	struct dmx_frontend    mem_frontend;
	int                    users;
	int (*gate_ctrl)(struct dvb_frontend *, int);
};

struct ddb_output {
	struct ddb_port       *port;
	u32                    nr;
	dma_addr_t             pbuf[OUTPUT_DMA_MAX_BUFS];
	u8                    *vbuf[OUTPUT_DMA_MAX_BUFS];
	u32                    dma_buf_num;
	u32                    dma_buf_size;
	struct tasklet_struct  tasklet;
	spinlock_t             lock;
	wait_queue_head_t      wq;
	int                    running;
	u32                    stat;
	u32                    cbuf;
	u32                    coff;

	struct dvb_adapter     adap;
	struct dvb_device     *dev;
};

struct ddb_i2c {
	struct ddb            *dev;
	u32                    nr;
	struct i2c_adapter     adap;
	struct i2c_adapter     adap2;
	u32                    regs;
	u32                    rbuf;
	u32                    wbuf;
	int                    done;
	wait_queue_head_t      wq;
};

struct ddb_port {
	struct ddb            *dev;
	u32                    nr;
	struct ddb_i2c        *i2c;
	struct mutex           i2c_gate_lock;
	u32                    class;
#define DDB_PORT_NONE           0
#define DDB_PORT_CI             1
#define DDB_PORT_TUNER          2
	u32                    type;
#define DDB_TUNER_NONE          0
#define DDB_TUNER_DVBS_ST       1
#define DDB_TUNER_DVBS_ST_AA    2
#define DDB_TUNER_DVBCT_TR     16
#define DDB_TUNER_DVBCT_ST     17
	u32                    adr;

	struct ddb_input      *input[2];
	struct ddb_output     *output;
	struct dvb_ca_en50221 *en;
};

struct ddb {
	struct pci_dev        *pdev;
	unsigned char __iomem *regs;
	struct ddb_port        port[DDB_MAX_PORT];
	struct ddb_i2c         i2c[DDB_MAX_I2C];
	struct ddb_input       input[DDB_MAX_INPUT];
	struct ddb_output      output[DDB_MAX_OUTPUT];

	struct device         *ddb_dev;
	int                    nr;
	u8                     iobuf[1028];

	struct ddb_info       *info;
	int                    msi;
};

/****************************************************************************/

#define ddbwritel(_val, _adr)        writel((_val), \
				     dev->regs+(_adr))
#define ddbreadl(_adr)               readl(dev->regs+(_adr))
#define ddbcpyto(_adr, _src, _count) memcpy_toio(dev->regs+(_adr), (_src), (_count))
#define ddbcpyfrom(_dst, _adr, _count) memcpy_fromio((_dst), dev->regs+(_adr), (_count))

/****************************************************************************/

#endif