summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/bt8xx/bt878.h
blob: 22fa5211c493ec295ad4508dd7b1f3a7efe89b9b (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
/* 
    bt878.h - Bt878 audio module (register offsets)

    Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>

    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 of the License, 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.
*/

#ifndef _BT878_H_
#define _BT878_H_

#include <linux/interrupt.h>
#include <linux/pci.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include "bt848.h"
#include "bttv.h"

#define BT878_VERSION_CODE 0x000000

#define BT878_AINT_STAT		0x100
#define BT878_ARISCS		(0xf<<28)
#define BT878_ARISC_EN		(1<<27)
#define BT878_ASCERR		(1<<19)
#define BT878_AOCERR		(1<<18)
#define BT878_APABORT		(1<<17)
#define BT878_ARIPERR		(1<<16)
#define BT878_APPERR		(1<<15)
#define BT878_AFDSR		(1<<14)
#define BT878_AFTRGT		(1<<13)
#define BT878_AFBUS		(1<<12)
#define BT878_ARISCI		(1<<11)
#define BT878_AOFLOW		(1<<3)

#define BT878_AINT_MASK		0x104

#define BT878_AGPIO_DMA_CTL	0x10c
#define BT878_A_GAIN		(0xf<<28)
#define BT878_A_G2X		(1<<27)
#define BT878_A_PWRDN		(1<<26)
#define BT878_A_SEL		(3<<24)
#define BT878_DA_SCE		(1<<23)
#define BT878_DA_LRI		(1<<22)
#define BT878_DA_MLB		(1<<21)
#define BT878_DA_LRD		(0x1f<<16)
#define BT878_DA_DPM		(1<<15)
#define BT878_DA_SBR		(1<<14)
#define BT878_DA_ES2		(1<<13)
#define BT878_DA_LMT		(1<<12)
#define BT878_DA_SDR		(0xf<<8)
#define BT878_DA_IOM		(3<<6)
#define BT878_DA_APP		(1<<5)
#define BT878_ACAP_EN		(1<<4)
#define BT878_PKTP		(3<<2)
#define BT878_RISC_EN		(1<<1)
#define BT878_FIFO_EN		1

#define BT878_APACK_LEN		0x110
#define BT878_AFP_LEN		(0xff<<16)
#define BT878_ALP_LEN		0xfff

#define BT878_ARISC_START	0x114

#define BT878_ARISC_PC		0x120

/* BT878 FUNCTION 0 REGISTERS */
#define BT878_GPIO_DMA_CTL	0x10c

/* Interrupt register */
#define BT878_INT_STAT		0x100
#define BT878_INT_MASK		0x104
#define BT878_I2CRACK		(1<<25)
#define BT878_I2CDONE		(1<<8)

#define BT878_MAX 4

#define BT878_RISC_SYNC_MASK	(1 << 15)

extern int bt878_num;
extern struct bt878 bt878[BT878_MAX];

struct bt878 {
	struct semaphore  gpio_lock;
	unsigned int nr;
	unsigned int bttv_nr;
	struct i2c_adapter *adapter;
	struct pci_dev *dev;
	unsigned int id;
	unsigned int TS_Size;
	unsigned char revision;
	unsigned int irq;
	unsigned long bt878_adr;
	volatile void __iomem *bt878_mem; /* function 1 */

	volatile u32 finished_block;
	volatile u32 last_block;
	u32 block_count;
	u32 block_bytes;
	u32 line_bytes;
	u32 line_count;

	u32 buf_size;
	u8 *buf_cpu;
	dma_addr_t buf_dma;

	u32 risc_size;
	u32 *risc_cpu;
	dma_addr_t risc_dma;
	u32 risc_pos;

	struct tasklet_struct tasklet;
	int shutdown;	
};

void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
		u32 irq_err_ignore);
void bt878_stop(struct bt878 *bt);	     

#if defined(__powerpc__)	/* big-endian */
extern __inline__ void io_st_le32(volatile unsigned __iomem *addr, unsigned val)
{
	__asm__ __volatile__("stwbrx %1,0,%2":"=m"(*addr):"r"(val),
			     "r"(addr));
	__asm__ __volatile__("eieio":::"memory");
}

#define bmtwrite(dat,adr)  io_st_le32((adr),(dat))
#define bmtread(adr)       ld_le32((adr))
#else
#define bmtwrite(dat,adr)  writel((dat), (adr))
#define bmtread(adr)       readl(adr)
#endif

#endif