ddbridge.h 5.0 KB
Newer Older
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
/*
 * 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.
 *
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 * Or, 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         *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), \
				     (char *) (dev->regs+(_adr)))
#define ddbreadl(_adr)               readl((char *) (dev->regs+(_adr)))
178 179 180 181
#define ddbcpyto(_adr, _src, _count) memcpy_toio((char *)	\
				     (dev->regs+(_adr)), (_src), (_count))
#define ddbcpyfrom(_dst, _adr, _count) memcpy_fromio((_dst), (char *) \
				       (dev->regs+(_adr)), (_count))
182 183 184 185

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

#endif