Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
[pandora-kernel.git] / drivers / media / video / saa7164 / saa7164-types.h
1 /*
2  *  Driver for the NXP SAA7164 PCIe bridge
3  *
4  *  Copyright (c) 2010 Steven Toth <stoth@kernellabs.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 /* TODO: Cleanup and shorten the namespace */
23
24 /* Some structues are passed directly to/from the firmware and
25  * have strict alignment requirements. This is one of them.
26  */
27 struct tmComResHWDescr {
28         u8      bLength;
29         u8      bDescriptorType;
30         u8      bDescriptorSubtype;
31         u16     bcdSpecVersion;
32         u32     dwClockFrequency;
33         u32     dwClockUpdateRes;
34         u8      bCapabilities;
35         u32     dwDeviceRegistersLocation;
36         u32     dwHostMemoryRegion;
37         u32     dwHostMemoryRegionSize;
38         u32     dwHostHibernatMemRegion;
39         u32     dwHostHibernatMemRegionSize;
40 } __attribute__((packed));
41
42 /* This is DWORD aligned on windows but I can't find the right
43  * gcc syntax to match the binary data from the device.
44  * I've manually padded with Reserved[3] bytes to match the hardware,
45  * but this could break if GCC decies to pack in a different way.
46  */
47 struct tmComResInterfaceDescr {
48         u8      bLength;
49         u8      bDescriptorType;
50         u8      bDescriptorSubtype;
51         u8      bFlags;
52         u8      bInterfaceType;
53         u8      bInterfaceId;
54         u8      bBaseInterface;
55         u8      bInterruptId;
56         u8      bDebugInterruptId;
57         u8      BARLocation;
58         u8      Reserved[3];
59 };
60
61 struct tmComResBusDescr {
62         u64     CommandRing;
63         u64     ResponseRing;
64         u32     CommandWrite;
65         u32     CommandRead;
66         u32     ResponseWrite;
67         u32     ResponseRead;
68 };
69
70 enum tmBusType {
71         NONE            = 0,
72         TYPE_BUS_PCI    = 1,
73         TYPE_BUS_PCIe   = 2,
74         TYPE_BUS_USB    = 3,
75         TYPE_BUS_I2C    = 4
76 };
77
78 struct tmComResBusInfo {
79         enum tmBusType Type;
80         u16     m_wMaxReqSize;
81         u8      *m_pdwSetRing;
82         u32     m_dwSizeSetRing;
83         u8      *m_pdwGetRing;
84         u32     m_dwSizeGetRing;
85         u32     m_dwSetWritePos;
86         u32     m_dwSetReadPos;
87         u32     m_dwGetWritePos;
88         u32     m_dwGetReadPos;
89
90         /* All access is protected */
91         struct mutex lock;
92
93 };
94
95 struct tmComResInfo {
96         u8      id;
97         u8      flags;
98         u16     size;
99         u32     command;
100         u16     controlselector;
101         u8      seqno;
102 } __attribute__((packed));
103
104 enum tmComResCmd {
105         SET_CUR  = 0x01,
106         GET_CUR  = 0x81,
107         GET_MIN  = 0x82,
108         GET_MAX  = 0x83,
109         GET_RES  = 0x84,
110         GET_LEN  = 0x85,
111         GET_INFO = 0x86,
112         GET_DEF  = 0x87
113 };
114
115 struct cmd {
116         u8 seqno;
117         u32 inuse;
118         u32 timeout;
119         u32 signalled;
120         struct mutex lock;
121         wait_queue_head_t wait;
122 };
123
124 struct tmDescriptor {
125         u32     pathid;
126         u32     size;
127         void    *descriptor;
128 };
129
130 struct tmComResDescrHeader {
131         u8      len;
132         u8      type;
133         u8      subtype;
134         u8      unitid;
135 } __attribute__((packed));
136
137 struct tmComResExtDevDescrHeader {
138         u8      len;
139         u8      type;
140         u8      subtype;
141         u8      unitid;
142         u32     devicetype;
143         u16     deviceid;
144         u32     numgpiopins;
145         u8      numgpiogroups;
146         u8      controlsize;
147 } __attribute__((packed));
148
149 struct tmComResGPIO {
150         u32     pin;
151         u8      state;
152 } __attribute__((packed));
153
154 struct tmComResPathDescrHeader {
155         u8      len;
156         u8      type;
157         u8      subtype;
158         u8      pathid;
159 } __attribute__((packed));
160
161 /* terminaltype */
162 enum tmComResTermType {
163         ITT_ANTENNA              = 0x0203,
164         LINE_CONNECTOR           = 0x0603,
165         SPDIF_CONNECTOR          = 0x0605,
166         COMPOSITE_CONNECTOR      = 0x0401,
167         SVIDEO_CONNECTOR         = 0x0402,
168         COMPONENT_CONNECTOR      = 0x0403,
169         STANDARD_DMA             = 0xF101
170 };
171
172 struct tmComResAntTermDescrHeader {
173         u8      len;
174         u8      type;
175         u8      subtype;
176         u8      terminalid;
177         u16     terminaltype;
178         u8      assocterminal;
179         u8      iterminal;
180         u8      controlsize;
181 } __attribute__((packed));
182
183 struct tmComResTunerDescrHeader {
184         u8      len;
185         u8      type;
186         u8      subtype;
187         u8      unitid;
188         u8      sourceid;
189         u8      iunit;
190         u32     tuningstandards;
191         u8      controlsize;
192         u32     controls;
193 } __attribute__((packed));
194
195 enum tmBufferFlag {
196         /* the buffer does not contain any valid data */
197         TM_BUFFER_FLAG_EMPTY,
198
199         /* the buffer is filled with valid data */
200         TM_BUFFER_FLAG_DONE,
201
202         /* the buffer is the dummy buffer - TODO??? */
203         TM_BUFFER_FLAG_DUMMY_BUFFER
204 };
205
206 struct tmBuffer {
207         u64             *pagetablevirt;
208         u64             pagetablephys;
209         u16             offset;
210         u8              *context;
211         u64             timestamp;
212         enum tmBufferFlag BufferFlag;
213         u32             lostbuffers;
214         u32             validbuffers;
215         u64             *dummypagevirt;
216         u64             dummypagephys;
217         u64             *addressvirt;
218 };
219
220 struct tmHWStreamParameters {
221         u32     bitspersample;
222         u32     samplesperline;
223         u32     numberoflines;
224         u32     pitch;
225         u32     linethreshold;
226         u64     **pagetablelistvirt;
227         u64     *pagetablelistphys;
228         u32     numpagetables;
229         u32     numpagetableentries;
230 };
231
232 struct tmStreamParameters {
233         struct tmHWStreamParameters     HWStreamParameters;
234         u64                             qwDummyPageTablePhys;
235         u64                             *pDummyPageTableVirt;
236 };
237
238 struct tmComResDMATermDescrHeader {
239         u8      len;
240         u8      type;
241         u8      subtyle;
242         u8      unitid;
243         u16     terminaltype;
244         u8      assocterminal;
245         u8      sourceid;
246         u8      iterminal;
247         u32     BARLocation;
248         u8      flags;
249         u8      interruptid;
250         u8      buffercount;
251         u8      metadatasize;
252         u8      numformats;
253         u8      controlsize;
254 } __attribute__((packed));
255
256 /*
257  *
258  * Description:
259  *  This is the transport stream format header.
260  *
261  * Settings:
262  *  bLength                 - The size of this descriptor in bytes.
263  *  bDescriptorType         - CS_INTERFACE.
264  *  bDescriptorSubtype      - VS_FORMAT_MPEG2TS descriptor subtype.
265  *  bFormatIndex            - A non-zero constant that uniquely identifies the
266  *                            format.
267  *  bDataOffset             - Offset to TSP packet within MPEG-2 TS transport
268  *                            stride, in bytes.
269  *  bPacketLength           - Length of TSP packet, in bytes (typically 188).
270  *  bStrideLength           - Length of MPEG-2 TS transport stride.
271  *  guidStrideFormat        - A Globally Unique Identifier indicating the
272  *                            format of the stride data (if any). Set to zeros
273  *                            if there is no Stride Data, or if the Stride
274  *                            Data is to be ignored by the application.
275  *
276  */
277 struct tmComResTSFormatDescrHeader {
278         u8      len;
279         u8      type;
280         u8      subtype;
281         u8      bFormatIndex;
282         u8      bDataOffset;
283         u8      bPacketLength;
284         u8      bStrideLength;
285         u8      guidStrideFormat[16];
286 } __attribute__((packed));
287
288 /* Encoder related structures */
289
290 /* A/V Mux Selector */
291 struct tmComResSelDescrHeader {
292         u8      len;
293         u8      type;
294         u8      subtype;
295         u8      unitid;
296         u8      nrinpins;
297         u8      sourceid;
298 } __attribute__((packed));
299
300 /* A/V Audio processor definitions */
301 struct tmComResProcDescrHeader {
302         u8      len;
303         u8      type;
304         u8      subtype;
305         u8      unitid;
306         u8      sourceid;
307         u16     wreserved;
308         u8      controlsize;
309 } __attribute__((packed));
310
311 /* Video bitrate control message */
312 #define EU_VIDEO_BIT_RATE_MODE_CONSTANT         (0)
313 #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_AVERAGE (1)
314 #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK    (2)
315 struct tmComResEncVideoBitRate {
316         u8      ucVideoBitRateMode;
317         u32     dwVideoBitRate;
318         u32     dwVideoBitRatePeak;
319 } __attribute__((packed));
320
321 /* Video Encoder Aspect Ratio message */
322 struct tmComResEncVideoInputAspectRatio {
323         u8      width;
324         u8      height;
325 } __attribute__((packed));
326
327 /* Video Encoder GOP IBP message */
328 /* 1. IPPPPPPPPPPPPPP */
329 /* 2. IBPBPBPBPBPBPBP */
330 /* 3. IBBPBBPBBPBBP   */
331 #define SAA7164_ENCODER_DEFAULT_GOP_DIST (1)
332 #define SAA7164_ENCODER_DEFAULT_GOP_SIZE (15)
333 struct tmComResEncVideoGopStructure {
334         u8      ucGOPSize;      /* GOP Size 12, 15 */
335         u8      ucRefFrameDist; /* Reference Frame Distance */
336 } __attribute__((packed));
337
338 /* Encoder processor definition */
339 struct tmComResEncoderDescrHeader {
340         u8      len;
341         u8      type;
342         u8      subtype;
343         u8      unitid;
344         u8      vsourceid;
345         u8      asourceid;
346         u8      iunit;
347         u32     dwmControlCap;
348         u32     dwmProfileCap;
349         u32     dwmVidFormatCap;
350         u8      bmVidBitrateCap;
351         u16     wmVidResolutionsCap;
352         u16     wmVidFrmRateCap;
353         u32     dwmAudFormatCap;
354         u8      bmAudBitrateCap;
355 } __attribute__((packed));
356
357 /* Audio processor definition */
358 struct tmComResAFeatureDescrHeader {
359         u8      len;
360         u8      type;
361         u8      subtype;
362         u8      unitid;
363         u8      sourceid;
364         u8      controlsize;
365 } __attribute__((packed));
366
367 /* Audio control messages */
368 struct tmComResAudioDefaults {
369         u8      ucDecoderLevel;
370         u8      ucDecoderFM_Level;
371         u8      ucMonoLevel;
372         u8      ucNICAM_Level;
373         u8      ucSAP_Level;
374         u8      ucADC_Level;
375 } __attribute__((packed));
376
377 /* Audio bitrate control message */
378 struct tmComResEncAudioBitRate {
379         u8      ucAudioBitRateMode;
380         u32     dwAudioBitRate;
381         u32     dwAudioBitRatePeak;
382 } __attribute__((packed));
383
384 /* Tuner / AV Decoder messages */
385 struct tmComResTunerStandard {
386         u8      std;
387         u32     country;
388 } __attribute__((packed));
389
390 struct tmComResTunerStandardAuto {
391         u8      mode;
392 } __attribute__((packed));
393
394 /* EEPROM definition for PS stream types */
395 struct tmComResPSFormatDescrHeader {
396         u8      len;
397         u8      type;
398         u8      subtype;
399         u8      bFormatIndex;
400         u16     wPacketLength;
401         u16     wPackLength;
402         u8      bPackDataType;
403 } __attribute__((packed));
404
405 /* VBI control structure */
406 struct tmComResVBIFormatDescrHeader {
407         u8      len;
408         u8      type;
409         u8      subtype; /* VS_FORMAT_VBI */
410         u8      bFormatIndex;
411         u32     VideoStandard; /* See KS_AnalogVideoStandard, NTSC = 1 */
412         u8      StartLine; /* NTSC Start = 10 */
413         u8      EndLine; /* NTSC = 21 */
414         u8      FieldRate; /* 60 for NTSC */
415         u8      bNumLines; /* Unsed - scheduled for removal */
416 } __attribute__((packed));
417
418 struct tmComResProbeCommit {
419         u16     bmHint;
420         u8      bFormatIndex;
421         u8      bFrameIndex;
422 } __attribute__((packed));
423
424 struct tmComResDebugSetLevel {
425         u32     dwDebugLevel;
426 } __attribute__((packed));
427
428 struct tmComResDebugGetData {
429         u32     dwResult;
430         u8      ucDebugData[256];
431 } __attribute__((packed));
432
433 struct tmFwInfoStruct {
434         u32     status;
435         u32     mode;
436         u32     devicespec;
437         u32     deviceinst;
438         u32     CPULoad;
439         u32     RemainHeap;
440         u32     CPUClock;
441         u32     RAMSpeed;
442 } __attribute__((packed));