xref: /freebsd-12.1/sys/dev/bktr/bktr_core.c (revision b7841bd0)
1 /*-
2  * SPDX-License-Identifier: BSD-4-Clause
3  *
4  * 1. Redistributions of source code must retain the
5  * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by Amancio Hasty and
19  *      Roger Hardiman
20  * 4. The name of the author may not be used to endorse or promote products
21  *    derived from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED.	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
35 /*-
36  * 1. Redistributions of source code must retain the
37  * Copyright (c) 1995 Mark Tinguely and Jim Lowe
38  * All rights reserved.
39  *
40  * Redistribution and use in source and binary forms, with or without
41  * modification, are permitted provided that the following conditions
42  * are met:
43  * 1. Redistributions of source code must retain the above copyright
44  *    notice, this list of conditions and the following disclaimer.
45  * 2. Redistributions in binary form must reproduce the above copyright
46  *    notice, this list of conditions and the following disclaimer in the
47  *    documentation and/or other materials provided with the distribution.
48  * 3. All advertising materials mentioning features or use of this software
49  *    must display the following acknowledgement:
50  *	This product includes software developed by Mark Tinguely and Jim Lowe
51  * 4. The name of the author may not be used to endorse or promote products
52  *    derived from this software without specific prior written permission.
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
56  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
57  * DISCLAIMED.	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
58  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
59  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
60  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
62  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
63  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
64  * POSSIBILITY OF SUCH DAMAGE.
65  */
66 
67 #include <sys/cdefs.h>
68 __FBSDID("$FreeBSD$");
69 
70 /*
71  * This is part of the Driver for Video Capture Cards (Frame grabbers)
72  * and TV Tuner cards using the Brooktree Bt848, Bt848A, Bt849A, Bt878, Bt879
73  * chipset.
74  * Copyright Roger Hardiman and Amancio Hasty.
75  *
76  * bktr_core : This deals with the Bt848/849/878/879 PCI Frame Grabber,
77  *               Handles all the open, close, ioctl and read userland calls.
78  *               Sets the Bt848 registers and generates RISC pograms.
79  *               Controls the i2c bus and GPIO interface.
80  *               Contains the interface to the kernel.
81  *               (eg probe/attach and open/close/ioctl)
82  */
83 
84  /*
85    The Brooktree BT848 Driver driver is based upon Mark Tinguely and
86    Jim Lowe's driver for the Matrox Meteor PCI card . The
87    Philips SAA 7116 and SAA 7196 are very different chipsets than
88    the BT848.
89 
90    The original copyright notice by Mark and Jim is included mostly
91    to honor their fantastic work in the Matrox Meteor driver!
92  */
93 
94 #include "opt_bktr.h"		/* Include any kernel config options */
95 
96 #if (                                                            \
97        (defined(__FreeBSD__))                                    \
98     || (defined(__bsdi__))                                       \
99     || (defined(__OpenBSD__))                                    \
100     || (defined(__NetBSD__))                                     \
101     )
102 
103 
104 /*******************/
105 /* *** FreeBSD *** */
106 /*******************/
107 #ifdef __FreeBSD__
108 
109 #include <sys/param.h>
110 #include <sys/systm.h>
111 #include <sys/kernel.h>
112 #include <sys/fcntl.h>
113 #include <sys/lock.h>
114 #include <sys/malloc.h>
115 #include <sys/mutex.h>
116 #include <sys/proc.h>
117 #include <sys/signalvar.h>
118 #include <sys/selinfo.h>
119 #include <sys/uio.h>
120 
121 #include <vm/vm.h>
122 #include <vm/vm_kern.h>
123 #include <vm/pmap.h>
124 #include <vm/vm_extern.h>
125 
126 #include <sys/bus.h>		/* used by smbus and newbus */
127 
128 #if (__FreeBSD_version < 500000)
129 #include <machine/clock.h>              /* for DELAY */
130 #define	PROC_LOCK(p)
131 #define	PROC_UNLOCK(p)
132 #include <pci/pcivar.h>
133 #else
134 #include <dev/pci/pcivar.h>
135 #endif
136 
137 #include <machine/bus.h>
138 #include <sys/bus.h>
139 
140 #include <dev/bktr/ioctl_meteor.h>
141 #include <dev/bktr/ioctl_bt848.h>	/* extensions to ioctl_meteor.h */
142 #include <dev/bktr/bktr_reg.h>
143 #include <dev/bktr/bktr_tuner.h>
144 #include <dev/bktr/bktr_card.h>
145 #include <dev/bktr/bktr_audio.h>
146 #include <dev/bktr/bktr_os.h>
147 #include <dev/bktr/bktr_core.h>
148 #if defined(BKTR_FREEBSD_MODULE)
149 #include <dev/bktr/bktr_mem.h>
150 #endif
151 
152 #if defined(BKTR_USE_FREEBSD_SMBUS)
153 #include <dev/bktr/bktr_i2c.h>
154 #include <dev/smbus/smbconf.h>
155 #include <dev/iicbus/iiconf.h>
156 #include "smbus_if.h"
157 #include "iicbus_if.h"
158 #endif
159 
160 const char *
bktr_name(bktr_ptr_t bktr)161 bktr_name(bktr_ptr_t bktr)
162 {
163   return bktr->bktr_xname;
164 }
165 
166 
167 #endif  /* __FreeBSD__ */
168 
169 
170 /****************/
171 /* *** BSDI *** */
172 /****************/
173 #ifdef __bsdi__
174 #define	PROC_LOCK(p)
175 #define	PROC_UNLOCK(p)
176 #endif /* __bsdi__ */
177 
178 
179 /**************************/
180 /* *** OpenBSD/NetBSD *** */
181 /**************************/
182 #if defined(__NetBSD__) || defined(__OpenBSD__)
183 
184 #include <sys/param.h>
185 #include <sys/systm.h>
186 #include <sys/kernel.h>
187 #include <sys/signalvar.h>
188 #include <sys/vnode.h>
189 
190 #ifdef __NetBSD__
191 #include <uvm/uvm_extern.h>
192 #else
193 #include <vm/vm.h>
194 #include <vm/vm_kern.h>
195 #include <vm/pmap.h>
196 #include <vm/vm_extern.h>
197 #endif
198 
199 #include <sys/inttypes.h>		/* uintptr_t */
200 #include <dev/ic/bt8xx.h>
201 #include <dev/pci/bktr/bktr_reg.h>
202 #include <dev/pci/bktr/bktr_tuner.h>
203 #include <dev/pci/bktr/bktr_card.h>
204 #include <dev/pci/bktr/bktr_audio.h>
205 #include <dev/pci/bktr/bktr_core.h>
206 #include <dev/pci/bktr/bktr_os.h>
207 
208 static int bt848_format = -1;
209 
210 const char *
bktr_name(bktr_ptr_t bktr)211 bktr_name(bktr_ptr_t bktr)
212 {
213         return (bktr->bktr_dev.dv_xname);
214 }
215 
216 #define	PROC_LOCK(p)
217 #define	PROC_UNLOCK(p)
218 
219 #endif /* __NetBSD__ || __OpenBSD__ */
220 
221 
222 typedef u_char bool_t;
223 
224 #define BKTRPRI (PZERO+8)|PCATCH
225 #define VBIPRI  (PZERO-4)|PCATCH
226 
227 
228 /*
229  * memory allocated for DMA programs
230  */
231 #define DMA_PROG_ALLOC		(8 * PAGE_SIZE)
232 
233 /* When to split a dma transfer , the bt848 has timing as well as
234    dma transfer size limitations so that we have to split dma
235    transfers into two dma requests
236    */
237 #define DMA_BT848_SPLIT 319*2
238 
239 /*
240  * Allocate enough memory for:
241  *	768x576 RGB 16 or YUV (16 storage bits/pixel) = 884736 = 216 pages
242  *
243  * You may override this using the options "BROOKTREE_ALLOC_PAGES=value"
244  * in your  kernel configuration file.
245  */
246 
247 #ifndef BROOKTREE_ALLOC_PAGES
248 #define BROOKTREE_ALLOC_PAGES	217*4
249 #endif
250 #define BROOKTREE_ALLOC		(BROOKTREE_ALLOC_PAGES * PAGE_SIZE)
251 
252 /* Definitions for VBI capture.
253  * There are 16 VBI lines in a PAL video field (32 in a frame),
254  * and we take 2044 samples from each line (placed in a 2048 byte buffer
255  * for alignment).
256  * VBI lines are held in a circular buffer before being read by a
257  * user program from /dev/vbi.
258  */
259 
260 #define MAX_VBI_LINES	      16   /* Maximum for all vidoe formats */
261 #define	VBI_LINE_SIZE         2048 /* Store up to 2048 bytes per line */
262 #define VBI_BUFFER_ITEMS      20   /* Number of frames we buffer */
263 #define VBI_DATA_SIZE         (VBI_LINE_SIZE * MAX_VBI_LINES * 2)
264 #define VBI_BUFFER_SIZE       (VBI_DATA_SIZE * VBI_BUFFER_ITEMS)
265 
266 
267 /*  Defines for fields  */
268 #define ODD_F  0x01
269 #define EVEN_F 0x02
270 
271 
272 /*
273  * Parameters describing size of transmitted image.
274  */
275 
276 static struct format_params format_params[] = {
277 /* # define BT848_IFORM_F_AUTO             (0x0) - don't matter. */
278   { 525, 26, 480,  910, 135, 754, 640,  780, 30, 0x68, 0x5d, BT848_IFORM_X_AUTO,
279     12,  1600 },
280 /* # define BT848_IFORM_F_NTSCM            (0x1) */
281   { 525, 26, 480,  910, 135, 754, 640,  780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0,
282     12, 1600 },
283 /* # define BT848_IFORM_F_NTSCJ            (0x2) */
284   { 525, 22, 480,  910, 135, 754, 640,  780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0,
285     12, 1600 },
286 /* # define BT848_IFORM_F_PALBDGHI         (0x3) */
287   { 625, 32, 576, 1135, 186, 924, 768,  944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1,
288     16,  2044 },
289 /* # define BT848_IFORM_F_PALM             (0x4) */
290   { 525, 22, 480,  910, 135, 754, 640,  780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0,
291     12, 1600 },
292 /* # define BT848_IFORM_F_PALN             (0x5) */
293   { 625, 32, 576, 1135, 186, 924, 768,  944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1,
294     16, 2044 },
295 /* # define BT848_IFORM_F_SECAM            (0x6) */
296   { 625, 32, 576, 1135, 186, 924, 768,  944, 25, 0x7f, 0xa0, BT848_IFORM_X_XT1,
297     16, 2044 },
298 /* # define BT848_IFORM_F_RSVD             (0x7) - ???? */
299   { 625, 32, 576, 1135, 186, 924, 768,  944, 25, 0x7f, 0x72, BT848_IFORM_X_XT0,
300     16, 2044 },
301 };
302 
303 /*
304  * Table of supported Pixel Formats
305  */
306 
307 static struct meteor_pixfmt_internal {
308 	struct meteor_pixfmt public;
309 	u_int                color_fmt;
310 } pixfmt_table[] = {
311 
312 { { 0, METEOR_PIXTYPE_RGB, 2, {   0x7c00,  0x03e0,  0x001f }, 0,0 }, 0x33 },
313 { { 0, METEOR_PIXTYPE_RGB, 2, {   0x7c00,  0x03e0,  0x001f }, 1,0 }, 0x33 },
314 
315 { { 0, METEOR_PIXTYPE_RGB, 2, {   0xf800,  0x07e0,  0x001f }, 0,0 }, 0x22 },
316 { { 0, METEOR_PIXTYPE_RGB, 2, {   0xf800,  0x07e0,  0x001f }, 1,0 }, 0x22 },
317 
318 { { 0, METEOR_PIXTYPE_RGB, 3, { 0xff0000,0x00ff00,0x0000ff }, 1,0 }, 0x11 },
319 
320 { { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 0,0 }, 0x00 },
321 { { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 0,1 }, 0x00 },
322 { { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 1,0 }, 0x00 },
323 { { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x00 },
324 { { 0, METEOR_PIXTYPE_YUV, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x88 },
325 { { 0, METEOR_PIXTYPE_YUV_PACKED, 2, { 0xff0000,0x00ff00,0x0000ff }, 0,1 }, 0x44 },
326 { { 0, METEOR_PIXTYPE_YUV_12, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }, 0x88 },
327 
328 };
329 #define	PIXFMT_TABLE_SIZE nitems(pixfmt_table)
330 
331 /*
332  * Table of Meteor-supported Pixel Formats (for SETGEO compatibility)
333  */
334 
335 /*  FIXME:  Also add YUV_422 and YUV_PACKED as well  */
336 static struct {
337 	u_long               meteor_format;
338 	struct meteor_pixfmt public;
339 } meteor_pixfmt_table[] = {
340     { METEOR_GEO_YUV_12,
341       { 0, METEOR_PIXTYPE_YUV_12, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }
342     },
343 
344       /* FIXME: Should byte swap flag be on for this one; negative in drvr? */
345     { METEOR_GEO_YUV_422,
346       { 0, METEOR_PIXTYPE_YUV, 2, { 0xff0000,0x00ff00,0x0000ff }, 1,1 }
347     },
348     { METEOR_GEO_YUV_PACKED,
349       { 0, METEOR_PIXTYPE_YUV_PACKED, 2, { 0xff0000,0x00ff00,0x0000ff }, 0,1 }
350     },
351     { METEOR_GEO_RGB16,
352       { 0, METEOR_PIXTYPE_RGB, 2, {   0x7c00,   0x03e0,   0x001f }, 0, 0 }
353     },
354     { METEOR_GEO_RGB24,
355       { 0, METEOR_PIXTYPE_RGB, 4, { 0xff0000, 0x00ff00, 0x0000ff }, 0, 0 }
356     },
357 
358 };
359 #define	METEOR_PIXFMT_TABLE_SIZE nitems(meteor_pixfmt_table)
360 
361 
362 #define BSWAP (BT848_COLOR_CTL_BSWAP_ODD | BT848_COLOR_CTL_BSWAP_EVEN)
363 #define WSWAP (BT848_COLOR_CTL_WSWAP_ODD | BT848_COLOR_CTL_WSWAP_EVEN)
364 
365 
366 
367 /* sync detect threshold */
368 #if 0
369 #define SYNC_LEVEL		(BT848_ADC_RESERVED |	\
370 				 BT848_ADC_CRUSH)	/* threshold ~125 mV */
371 #else
372 #define SYNC_LEVEL		(BT848_ADC_RESERVED |	\
373 				 BT848_ADC_SYNC_T)	/* threshold ~75 mV */
374 #endif
375 
376 
377 
378 
379 /* debug utility for holding previous INT_STAT contents */
380 #define STATUS_SUM
381 static u_long	status_sum = 0;
382 
383 /*
384  * defines to make certain bit-fiddles understandable
385  */
386 #define FIFO_ENABLED		BT848_DMA_CTL_FIFO_EN
387 #define RISC_ENABLED		BT848_DMA_CTL_RISC_EN
388 #define FIFO_RISC_ENABLED	(BT848_DMA_CTL_FIFO_EN | BT848_DMA_CTL_RISC_EN)
389 #define FIFO_RISC_DISABLED	0
390 
391 #define ALL_INTS_DISABLED	0
392 #define ALL_INTS_CLEARED	0xffffffff
393 #define CAPTURE_OFF		0
394 
395 #define BIT_SEVEN_HIGH		(1<<7)
396 #define BIT_EIGHT_HIGH		(1<<8)
397 
398 #define I2C_BITS		(BT848_INT_RACK | BT848_INT_I2CDONE)
399 #define TDEC_BITS               (BT848_INT_FDSR | BT848_INT_FBUS)
400 
401 
402 
403 static int		oformat_meteor_to_bt( u_long format );
404 
405 static u_int		pixfmt_swap_flags( int pixfmt );
406 
407 /*
408  * bt848 RISC programming routines.
409  */
410 #ifdef BT848_DUMP
411 static int	dump_bt848( bktr_ptr_t bktr );
412 #endif
413 
414 static void	yuvpack_prog( bktr_ptr_t bktr, char i_flag, int cols,
415 			      int rows,  int interlace );
416 static void	yuv422_prog( bktr_ptr_t bktr, char i_flag, int cols,
417 			     int rows, int interlace );
418 static void	yuv12_prog( bktr_ptr_t bktr, char i_flag, int cols,
419 			     int rows, int interlace );
420 static void	rgb_prog( bktr_ptr_t bktr, char i_flag, int cols,
421 			  int rows, int interlace );
422 static void	rgb_vbi_prog( bktr_ptr_t bktr, char i_flag, int cols,
423 			  int rows, int interlace );
424 static void	build_dma_prog( bktr_ptr_t bktr, char i_flag );
425 
426 static bool_t   getline(bktr_reg_t *, int);
427 static bool_t   notclipped(bktr_reg_t * , int , int);
428 static bool_t   split(bktr_reg_t *, volatile uint32_t **, int, u_long, int,
429 		      volatile u_char ** , int  );
430 
431 static void	start_capture( bktr_ptr_t bktr, unsigned type );
432 static void	set_fps( bktr_ptr_t bktr, u_short fps );
433 
434 
435 
436 /*
437  * Remote Control Functions
438  */
439 static void	remote_read(bktr_ptr_t bktr, struct bktr_remote *remote);
440 
441 
442 /*
443  * ioctls common to both video & tuner.
444  */
445 static int	common_ioctl( bktr_ptr_t bktr, ioctl_cmd_t cmd, caddr_t arg );
446 
447 
448 #if !defined(BKTR_USE_FREEBSD_SMBUS)
449 /*
450  * i2c primitives for low level control of i2c bus. Added for MSP34xx control
451  */
452 static void     i2c_start( bktr_ptr_t bktr);
453 static void     i2c_stop( bktr_ptr_t bktr);
454 static int      i2c_write_byte( bktr_ptr_t bktr, unsigned char data);
455 static int      i2c_read_byte( bktr_ptr_t bktr, unsigned char *data, int last );
456 #endif
457 
458 
459 
460 /*
461  * the common attach code, used by all OS versions.
462  */
463 void
common_bktr_attach(bktr_ptr_t bktr,int unit,u_long pci_id,u_int rev)464 common_bktr_attach( bktr_ptr_t bktr, int unit, u_long pci_id, u_int rev )
465 {
466 	vm_offset_t	buf = 0;
467 	int		need_to_allocate_memory = 1;
468 #ifdef BKTR_NEW_MSP34XX_DRIVER
469 	int 		err;
470 #endif
471 
472 /***************************************/
473 /* *** OS Specific memory routines *** */
474 /***************************************/
475 #if defined(__NetBSD__) || defined(__OpenBSD__)
476         /* allocate space for dma program */
477         bktr->dma_prog = get_bktr_mem(bktr, &bktr->dm_prog,
478 				      DMA_PROG_ALLOC);
479         bktr->odd_dma_prog = get_bktr_mem(bktr, &bktr->dm_oprog,
480 					  DMA_PROG_ALLOC);
481 
482 	/* allocate space for the VBI buffer */
483 	bktr->vbidata  = get_bktr_mem(bktr, &bktr->dm_vbidata,
484 				      VBI_DATA_SIZE);
485 	bktr->vbibuffer = get_bktr_mem(bktr, &bktr->dm_vbibuffer,
486 				       VBI_BUFFER_SIZE);
487 
488         /* allocate space for pixel buffer */
489         if ( BROOKTREE_ALLOC )
490                 buf = get_bktr_mem(bktr, &bktr->dm_mem, BROOKTREE_ALLOC);
491         else
492                 buf = 0;
493 #endif
494 
495 #if defined(__FreeBSD__) || defined(__bsdi__)
496 
497 /* If this is a module, check if there is any currently saved contiguous memory */
498 #if defined(BKTR_FREEBSD_MODULE)
499 	if (bktr_has_stored_addresses(unit) == 1) {
500 		/* recover the addresses */
501 		bktr->dma_prog     = bktr_retrieve_address(unit, BKTR_MEM_DMA_PROG);
502 		bktr->odd_dma_prog = bktr_retrieve_address(unit, BKTR_MEM_ODD_DMA_PROG);
503 		bktr->vbidata      = bktr_retrieve_address(unit, BKTR_MEM_VBIDATA);
504 		bktr->vbibuffer    = bktr_retrieve_address(unit, BKTR_MEM_VBIBUFFER);
505 		buf                = bktr_retrieve_address(unit, BKTR_MEM_BUF);
506 		need_to_allocate_memory = 0;
507 	}
508 #endif
509 
510 	if (need_to_allocate_memory == 1) {
511 		/* allocate space for dma program */
512 		bktr->dma_prog     = get_bktr_mem(unit, DMA_PROG_ALLOC);
513 		bktr->odd_dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
514 
515 		/* allocte space for the VBI buffer */
516 		bktr->vbidata  = get_bktr_mem(unit, VBI_DATA_SIZE);
517 		bktr->vbibuffer = get_bktr_mem(unit, VBI_BUFFER_SIZE);
518 
519 		/* allocate space for pixel buffer */
520 		if ( BROOKTREE_ALLOC )
521 			buf = get_bktr_mem(unit, BROOKTREE_ALLOC);
522 		else
523 			buf = 0;
524 	}
525 #endif	/* FreeBSD or BSDi */
526 
527 #ifdef USE_VBIMUTEX
528 	mtx_init(&bktr->vbimutex, "bktr vbi lock", NULL, MTX_DEF);
529 #endif
530 
531 /* If this is a module, save the current contiguous memory */
532 #if defined(BKTR_FREEBSD_MODULE)
533 bktr_store_address(unit, BKTR_MEM_DMA_PROG,     bktr->dma_prog);
534 bktr_store_address(unit, BKTR_MEM_ODD_DMA_PROG, bktr->odd_dma_prog);
535 bktr_store_address(unit, BKTR_MEM_VBIDATA,      bktr->vbidata);
536 bktr_store_address(unit, BKTR_MEM_VBIBUFFER,    bktr->vbibuffer);
537 bktr_store_address(unit, BKTR_MEM_BUF,          buf);
538 #endif
539 
540 
541 	if ( bootverbose ) {
542 		printf("%s: buffer size %d, addr %p\n",
543 			bktr_name(bktr), (int)BROOKTREE_ALLOC,
544 			(void *)(uintptr_t)vtophys(buf));
545 	}
546 
547 	if ( buf != 0 ) {
548 		bktr->bigbuf = buf;
549 		bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
550 		bzero((caddr_t) bktr->bigbuf, BROOKTREE_ALLOC);
551 	} else {
552 		bktr->alloc_pages = 0;
553 	}
554 
555 
556 	bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE |
557 		      METEOR_DEV0 | METEOR_RGB16;
558 	bktr->dma_prog_loaded = FALSE;
559 	bktr->cols = 640;
560 	bktr->rows = 480;
561 	bktr->frames = 1;		/* one frame */
562 	bktr->format = METEOR_GEO_RGB16;
563 	bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
564 	bktr->pixfmt_compat = TRUE;
565 
566 
567 	bktr->vbiinsert = 0;
568 	bktr->vbistart = 0;
569 	bktr->vbisize = 0;
570 	bktr->vbiflags = 0;
571 
572 
573 	/* using the pci device id and revision id */
574 	/* and determine the card type            */
575 	if (BKTR_PCI_VENDOR(pci_id) == PCI_VENDOR_BROOKTREE)
576 	{
577 		switch (BKTR_PCI_PRODUCT(pci_id)) {
578 		case PCI_PRODUCT_BROOKTREE_BT848:
579 			if (rev == 0x12)
580 				bktr->id = BROOKTREE_848A;
581 			else
582 				bktr->id = BROOKTREE_848;
583 			break;
584 		case PCI_PRODUCT_BROOKTREE_BT849:
585 			bktr->id = BROOKTREE_849A;
586 			break;
587 		case PCI_PRODUCT_BROOKTREE_BT878:
588 			bktr->id = BROOKTREE_878;
589 			break;
590 		case PCI_PRODUCT_BROOKTREE_BT879:
591 			bktr->id = BROOKTREE_879;
592 			break;
593 		}
594 	}
595 
596 	bktr->clr_on_start = FALSE;
597 
598 	/* defaults for the tuner section of the card */
599 	bktr->tflags = TUNER_INITALIZED;
600 	bktr->tuner.frequency = 0;
601 	bktr->tuner.channel = 0;
602 	bktr->tuner.chnlset = DEFAULT_CHNLSET;
603 	bktr->tuner.afc = 0;
604 	bktr->tuner.radio_mode = 0;
605 	bktr->audio_mux_select = 0;
606 	bktr->audio_mute_state = FALSE;
607 	bktr->bt848_card = -1;
608 	bktr->bt848_tuner = -1;
609 	bktr->reverse_mute = -1;
610 	bktr->slow_msp_audio = 0;
611 	bktr->msp_use_mono_source = 0;
612         bktr->msp_source_selected = -1;
613 	bktr->audio_mux_present = 1;
614 
615 #if defined(__FreeBSD__)
616 #ifdef BKTR_NEW_MSP34XX_DRIVER
617 	/* get hint on short programming of the msp34xx, so we know */
618 	/* if the decision what thread to start should be overwritten */
619 	if ( (err = resource_int_value("bktr", unit, "mspsimple",
620 			&(bktr->mspsimple)) ) != 0 )
621 		bktr->mspsimple = -1;	/* fall back to default */
622 #endif
623 #endif
624 
625 	probeCard( bktr, TRUE, unit );
626 
627 	/* Initialise any MSP34xx or TDA98xx audio chips */
628 	init_audio_devices( bktr );
629 
630 #ifdef BKTR_NEW_MSP34XX_DRIVER
631 	/* setup the kernel thread */
632 	err = msp_attach( bktr );
633 	if ( err != 0 ) /* error doing kernel thread stuff, disable msp3400c */
634 		bktr->card.msp3400c = 0;
635 #endif
636 
637 
638 }
639 
640 
641 /* Copy the vbi lines from 'vbidata' into the circular buffer, 'vbibuffer'.
642  * The circular buffer holds 'n' fixed size data blocks.
643  * vbisize   is the number of bytes in the circular buffer
644  * vbiread   is the point we reading data out of the circular buffer
645  * vbiinsert is the point we insert data into the circular buffer
646  */
vbidecode(bktr_ptr_t bktr)647 static void vbidecode(bktr_ptr_t bktr) {
648         unsigned char *dest;
649 	unsigned int *seq_dest;
650 
651 	/* Check if there is room in the buffer to insert the data. */
652 	if (bktr->vbisize + VBI_DATA_SIZE > VBI_BUFFER_SIZE) return;
653 
654 	/* Copy the VBI data into the next free slot in the buffer. */
655 	/* 'dest' is the point in vbibuffer where we want to insert new data */
656         dest = (unsigned char *)bktr->vbibuffer + bktr->vbiinsert;
657         memcpy(dest, (unsigned char*)bktr->vbidata, VBI_DATA_SIZE);
658 
659 	/* Write the VBI sequence number to the end of the vbi data */
660 	/* This is used by the AleVT teletext program */
661 	seq_dest = (unsigned int *)((unsigned char *)bktr->vbibuffer
662 			+ bktr->vbiinsert
663 			+ (VBI_DATA_SIZE - sizeof(bktr->vbi_sequence_number)));
664 	*seq_dest = bktr->vbi_sequence_number;
665 
666 	/* And increase the VBI sequence number */
667 	/* This can wrap around */
668 	bktr->vbi_sequence_number++;
669 
670 
671 	/* Increment the vbiinsert pointer */
672 	/* This can wrap around */
673 	bktr->vbiinsert += VBI_DATA_SIZE;
674 	bktr->vbiinsert = (bktr->vbiinsert % VBI_BUFFER_SIZE);
675 
676 	/* And increase the amount of vbi data in the buffer */
677 	bktr->vbisize = bktr->vbisize + VBI_DATA_SIZE;
678 
679 }
680 
681 
682 /*
683  * the common interrupt handler.
684  * Returns a 0 or 1 depending on whether the interrupt has handled.
685  * In the OS specific section, bktr_intr() is defined which calls this
686  * common interrupt handler.
687  */
688 int
common_bktr_intr(void * arg)689 common_bktr_intr( void *arg )
690 {
691 	bktr_ptr_t		bktr;
692 	u_long			bktr_status;
693 	u_char			dstatus;
694 	u_long                  field;
695 	u_long                  w_field;
696 	u_long                  req_field;
697 
698 	bktr = (bktr_ptr_t) arg;
699 
700 	/*
701 	 * check to see if any interrupts are unmasked on this device.  If
702 	 * none are, then we likely got here by way of being on a PCI shared
703 	 * interrupt dispatch list.
704 	 */
705 	if (INL(bktr, BKTR_INT_MASK) == ALL_INTS_DISABLED)
706 	  	return 0;	/* bail out now, before we do something we
707 				   shouldn't */
708 
709 	if (!(bktr->flags & METEOR_OPEN)) {
710 		OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
711 		OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
712 		/* return; ?? */
713 	}
714 
715 	/* record and clear the INTerrupt status bits */
716 	bktr_status = INL(bktr, BKTR_INT_STAT);
717 	OUTL(bktr, BKTR_INT_STAT, bktr_status & ~I2C_BITS);	/* don't touch i2c */
718 
719 	/* record and clear the device status register */
720 	dstatus = INB(bktr, BKTR_DSTATUS);
721 	OUTB(bktr, BKTR_DSTATUS, 0x00);
722 
723 #if defined( STATUS_SUM )
724 	/* add any new device status or INTerrupt status bits */
725 	status_sum |= (bktr_status & ~(BT848_INT_RSV0|BT848_INT_RSV1));
726 	status_sum |= ((dstatus & (BT848_DSTATUS_COF|BT848_DSTATUS_LOF)) << 6);
727 #endif /* STATUS_SUM */
728 	/* printf( "%s: STATUS %x %x %x \n", bktr_name(bktr),
729 		dstatus, bktr_status, INL(bktr, BKTR_RISC_COUNT) );
730 	*/
731 
732 
733 	/* if risc was disabled re-start process again */
734 	/* if there was one of the following errors re-start again */
735 	if ( !(bktr_status & BT848_INT_RISC_EN) ||
736 	     ((bktr_status &(/* BT848_INT_FBUS   | */
737 			     /* BT848_INT_FTRGT  | */
738 			     /* BT848_INT_FDSR   | */
739 			      BT848_INT_PPERR  |
740 			      BT848_INT_RIPERR | BT848_INT_PABORT |
741 			      BT848_INT_OCERR  | BT848_INT_SCERR) ) != 0)
742 		|| ((INB(bktr, BKTR_TDEC) == 0) && (bktr_status & TDEC_BITS)) ) {
743 
744 		u_short	tdec_save = INB(bktr, BKTR_TDEC);
745 
746 		OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
747 		OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF);
748 
749 		OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
750 
751 		/*  Reset temporal decimation counter  */
752 		OUTB(bktr, BKTR_TDEC, 0);
753 		OUTB(bktr, BKTR_TDEC, tdec_save);
754 
755 		/*  Reset to no-fields captured state  */
756 		if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) {
757 			switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
758 			case METEOR_ONLY_ODD_FIELDS:
759 				bktr->flags |= METEOR_WANT_ODD;
760 				break;
761 			case METEOR_ONLY_EVEN_FIELDS:
762 				bktr->flags |= METEOR_WANT_EVEN;
763 				break;
764 			default:
765 				bktr->flags |= METEOR_WANT_MASK;
766 				break;
767 			}
768 		}
769 
770 		OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog));
771 		OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
772 		OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol);
773 
774 		OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT |
775 				    BT848_INT_RISCI      |
776 				    BT848_INT_VSYNC      |
777 				    BT848_INT_FMTCHG);
778 
779 		OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl);
780 		return 1;
781 	}
782 
783 	/* If this is not a RISC program interrupt, return */
784 	if (!(bktr_status & BT848_INT_RISCI))
785 		return 0;
786 
787 /**
788 	printf( "%s: intr status %x %x %x\n", bktr_name(bktr),
789 		bktr_status, dstatus, INL(bktr, BKTR_RISC_COUNT) );
790  */
791 
792 
793 	/*
794 	 * Disable future interrupts if a capture mode is not selected.
795 	 * This can happen when we are in the process of closing or
796 	 * changing capture modes, otherwise it shouldn't happen.
797 	 */
798 	if (!(bktr->flags & METEOR_CAP_MASK))
799 		OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF);
800 
801 
802 	/* Determine which field generated this interrupt */
803 	field = ( bktr_status & BT848_INT_FIELD ) ? EVEN_F : ODD_F;
804 
805 
806 	/*
807 	 * Process the VBI data if it is being captured. We do this once
808 	 * both Odd and Even VBI data is captured. Therefore we do this
809 	 * in the Even field interrupt handler.
810 	 */
811 	LOCK_VBI(bktr);
812 	if (  (bktr->vbiflags & VBI_CAPTURE)
813 	    &&(bktr->vbiflags & VBI_OPEN)
814             &&(field==EVEN_F)) {
815 		/* Put VBI data into circular buffer */
816                	vbidecode(bktr);
817 
818 		/* If someone is blocked on reading from /dev/vbi, wake them */
819 		if (bktr->vbi_read_blocked) {
820 			bktr->vbi_read_blocked = FALSE;
821           	     	wakeup(VBI_SLEEP);
822 		}
823 
824 		/* If someone has a select() on /dev/vbi, inform them */
825 		if (SEL_WAITING(&bktr->vbi_select)) {
826 			selwakeuppri(&bktr->vbi_select, VBIPRI);
827 		}
828 
829 
830 	}
831 	UNLOCK_VBI(bktr);
832 
833 	/*
834 	 *  Register the completed field
835 	 *    (For dual-field mode, require fields from the same frame)
836 	 */
837 	switch ( bktr->flags & METEOR_WANT_MASK ) {
838 		case METEOR_WANT_ODD  : w_field = ODD_F         ;  break;
839 		case METEOR_WANT_EVEN : w_field = EVEN_F        ;  break;
840 		default               : w_field = (ODD_F|EVEN_F);  break;
841 	}
842 	switch ( bktr->flags & METEOR_ONLY_FIELDS_MASK ) {
843 		case METEOR_ONLY_ODD_FIELDS  : req_field = ODD_F  ;  break;
844 		case METEOR_ONLY_EVEN_FIELDS : req_field = EVEN_F ;  break;
845 		default                      : req_field = (ODD_F|EVEN_F);
846 			                       break;
847 	}
848 
849 	if (( field == EVEN_F ) && ( w_field == EVEN_F ))
850 		bktr->flags &= ~METEOR_WANT_EVEN;
851 	else if (( field == ODD_F ) && ( req_field == ODD_F ) &&
852 		 ( w_field == ODD_F ))
853 		bktr->flags &= ~METEOR_WANT_ODD;
854 	else if (( field == ODD_F ) && ( req_field == (ODD_F|EVEN_F) ) &&
855 		 ( w_field == (ODD_F|EVEN_F) ))
856 		bktr->flags &= ~METEOR_WANT_ODD;
857 	else if (( field == ODD_F ) && ( req_field == (ODD_F|EVEN_F) ) &&
858 		 ( w_field == ODD_F )) {
859 		bktr->flags &= ~METEOR_WANT_ODD;
860 		bktr->flags |=  METEOR_WANT_EVEN;
861 	}
862 	else {
863 		/*  We're out of sync.  Start over.  */
864 		if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) {
865 			switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
866 			case METEOR_ONLY_ODD_FIELDS:
867 				bktr->flags |= METEOR_WANT_ODD;
868 				break;
869 			case METEOR_ONLY_EVEN_FIELDS:
870 				bktr->flags |= METEOR_WANT_EVEN;
871 				break;
872 			default:
873 				bktr->flags |= METEOR_WANT_MASK;
874 				break;
875 			}
876 		}
877 		return 1;
878 	}
879 
880 	/*
881 	 * If we have a complete frame.
882 	 */
883 	if (!(bktr->flags & METEOR_WANT_MASK)) {
884 		bktr->frames_captured++;
885 		/*
886 		 * post the completion time.
887 		 */
888 		if (bktr->flags & METEOR_WANT_TS) {
889 			struct timeval *ts;
890 
891 			if ((u_int) bktr->alloc_pages * PAGE_SIZE
892 			   <= (bktr->frame_size + sizeof(struct timeval))) {
893 				ts =(struct timeval *)bktr->bigbuf +
894 				  bktr->frame_size;
895 				/* doesn't work in synch mode except
896 				 *  for first frame */
897 				/* XXX */
898 				microtime(ts);
899 			}
900 		}
901 
902 
903 		/*
904 		 * Wake up the user in single capture mode.
905 		 */
906 		if (bktr->flags & METEOR_SINGLE) {
907 
908 			/* stop dma */
909 			OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
910 
911 			/* disable risc, leave fifo running */
912 			OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
913 			wakeup(BKTR_SLEEP);
914 		}
915 
916 		/*
917 		 * If the user requested to be notified via signal,
918 		 * let them know the frame is complete.
919 		 */
920 
921 		if (bktr->proc != NULL) {
922 			PROC_LOCK(bktr->proc);
923 			kern_psignal( bktr->proc, bktr->signal);
924 			PROC_UNLOCK(bktr->proc);
925 		}
926 
927 		/*
928 		 * Reset the want flags if in continuous or
929 		 * synchronous capture mode.
930 		 */
931 /*
932 * XXX NOTE (Luigi):
933 * currently we only support 3 capture modes: odd only, even only,
934 * odd+even interlaced (odd field first). A fourth mode (non interlaced,
935 * either even OR odd) could provide 60 (50 for PAL) pictures per
936 * second, but it would require this routine to toggle the desired frame
937 * each time, and one more different DMA program for the Bt848.
938 * As a consequence, this fourth mode is currently unsupported.
939 */
940 
941 		if (bktr->flags & (METEOR_CONTIN | METEOR_SYNCAP)) {
942 			switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
943 			case METEOR_ONLY_ODD_FIELDS:
944 				bktr->flags |= METEOR_WANT_ODD;
945 				break;
946 			case METEOR_ONLY_EVEN_FIELDS:
947 				bktr->flags |= METEOR_WANT_EVEN;
948 				break;
949 			default:
950 				bktr->flags |= METEOR_WANT_MASK;
951 				break;
952 			}
953 		}
954 	}
955 
956 	return 1;
957 }
958 
959 
960 
961 
962 /*
963  *
964  */
965 extern int bt848_format; /* used to set the default format, PAL or NTSC */
966 int
video_open(bktr_ptr_t bktr)967 video_open( bktr_ptr_t bktr )
968 {
969 	int frame_rate, video_format=0;
970 
971 	if (bktr->flags & METEOR_OPEN)		/* device is busy */
972 		return( EBUSY );
973 
974 	bktr->flags |= METEOR_OPEN;
975 
976 #ifdef BT848_DUMP
977 	dump_bt848(bktr);
978 #endif
979 
980         bktr->clr_on_start = FALSE;
981 
982 	OUTB(bktr, BKTR_DSTATUS, 0x00);			/* clear device status reg. */
983 
984 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
985 
986 #if defined(BKTR_SYSTEM_DEFAULT) && BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL
987 	video_format = 0;
988 #else
989 	video_format = 1;
990 #endif
991 
992 	if (bt848_format == 0 )
993 	  video_format = 0;
994 
995 	if (bt848_format == 1 )
996 	  video_format = 1;
997 
998 	if (video_format == 1 ) {
999 	  OUTB(bktr, BKTR_IFORM, BT848_IFORM_F_NTSCM);
1000 	  bktr->format_params = BT848_IFORM_F_NTSCM;
1001 
1002 	} else {
1003 	  OUTB(bktr, BKTR_IFORM, BT848_IFORM_F_PALBDGHI);
1004 	  bktr->format_params = BT848_IFORM_F_PALBDGHI;
1005 
1006 	}
1007 
1008 	OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | format_params[bktr->format_params].iform_xtsel);
1009 
1010 	/* work around for new Hauppauge 878 cards */
1011 	if ((bktr->card.card_id == CARD_HAUPPAUGE) &&
1012 	    (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) )
1013 		OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3);
1014 	else
1015 		OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1);
1016 
1017 	OUTB(bktr, BKTR_ADELAY, format_params[bktr->format_params].adelay);
1018 	OUTB(bktr, BKTR_BDELAY, format_params[bktr->format_params].bdelay);
1019 	frame_rate    = format_params[bktr->format_params].frame_rate;
1020 
1021 	/* enable PLL mode using 28Mhz crystal for PAL/SECAM users */
1022 	if (bktr->xtal_pll_mode == BT848_USE_PLL) {
1023 		OUTB(bktr, BKTR_TGCTRL, 0);
1024 		OUTB(bktr, BKTR_PLL_F_LO, 0xf9);
1025 		OUTB(bktr, BKTR_PLL_F_HI, 0xdc);
1026 		OUTB(bktr, BKTR_PLL_F_XCI, 0x8e);
1027 	}
1028 
1029 	bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0;
1030 
1031 	bktr->max_clip_node = 0;
1032 
1033 	OUTB(bktr, BKTR_COLOR_CTL, BT848_COLOR_CTL_GAMMA | BT848_COLOR_CTL_RGB_DED);
1034 
1035 	OUTB(bktr, BKTR_E_HSCALE_LO, 170);
1036 	OUTB(bktr, BKTR_O_HSCALE_LO, 170);
1037 
1038 	OUTB(bktr, BKTR_E_DELAY_LO, 0x72);
1039 	OUTB(bktr, BKTR_O_DELAY_LO, 0x72);
1040 	OUTB(bktr, BKTR_E_SCLOOP, 0);
1041 	OUTB(bktr, BKTR_O_SCLOOP, 0);
1042 
1043 	OUTB(bktr, BKTR_VBI_PACK_SIZE, 0);
1044 	OUTB(bktr, BKTR_VBI_PACK_DEL, 0);
1045 
1046 	bktr->fifo_errors = 0;
1047 	bktr->dma_errors = 0;
1048 	bktr->frames_captured = 0;
1049 	bktr->even_fields_captured = 0;
1050 	bktr->odd_fields_captured = 0;
1051 	bktr->proc = NULL;
1052 	set_fps(bktr, frame_rate);
1053 	bktr->video.addr = 0;
1054 	bktr->video.width = 0;
1055 	bktr->video.banksize = 0;
1056 	bktr->video.ramsize = 0;
1057 	bktr->pixfmt_compat = TRUE;
1058 	bktr->format = METEOR_GEO_RGB16;
1059 	bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
1060 
1061 	bktr->capture_area_enabled = FALSE;
1062 
1063 	OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT);	/* if you take this out triton
1064                                                    based motherboards will
1065 						   operate unreliably */
1066 	return( 0 );
1067 }
1068 
1069 int
vbi_open(bktr_ptr_t bktr)1070 vbi_open( bktr_ptr_t bktr )
1071 {
1072 
1073 	LOCK_VBI(bktr);
1074 
1075 	if (bktr->vbiflags & VBI_OPEN) {	/* device is busy */
1076 		UNLOCK_VBI(bktr);
1077 		return( EBUSY );
1078 	}
1079 
1080 	bktr->vbiflags |= VBI_OPEN;
1081 
1082 	/* reset the VBI circular buffer pointers and clear the buffers */
1083 	bktr->vbiinsert = 0;
1084 	bktr->vbistart = 0;
1085 	bktr->vbisize = 0;
1086 	bktr->vbi_sequence_number = 0;
1087 	bktr->vbi_read_blocked = FALSE;
1088 
1089 	bzero((caddr_t) bktr->vbibuffer, VBI_BUFFER_SIZE);
1090 	bzero((caddr_t) bktr->vbidata,  VBI_DATA_SIZE);
1091 
1092 	UNLOCK_VBI(bktr);
1093 
1094 	return( 0 );
1095 }
1096 
1097 /*
1098  *
1099  */
1100 int
tuner_open(bktr_ptr_t bktr)1101 tuner_open( bktr_ptr_t bktr )
1102 {
1103 	if ( !(bktr->tflags & TUNER_INITALIZED) )	/* device not found */
1104 		return( ENXIO );
1105 
1106 	if ( bktr->tflags & TUNER_OPEN )		/* already open */
1107 		return( 0 );
1108 
1109 	bktr->tflags |= TUNER_OPEN;
1110 	bktr->tuner.frequency = 0;
1111 	bktr->tuner.channel = 0;
1112 	bktr->tuner.chnlset = DEFAULT_CHNLSET;
1113 	bktr->tuner.afc = 0;
1114 	bktr->tuner.radio_mode = 0;
1115 
1116 	/* enable drivers on the GPIO port that control the MUXes */
1117 	OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | bktr->card.gpio_mux_bits);
1118 
1119 	/* unmute the audio stream */
1120 	set_audio( bktr, AUDIO_UNMUTE );
1121 
1122 	/* Initialise any audio chips, eg MSP34xx or TDA98xx */
1123 	init_audio_devices( bktr );
1124 
1125 	return( 0 );
1126 }
1127 
1128 
1129 
1130 
1131 /*
1132  *
1133  */
1134 int
video_close(bktr_ptr_t bktr)1135 video_close( bktr_ptr_t bktr )
1136 {
1137 	bktr->flags &= ~(METEOR_OPEN     |
1138 			 METEOR_SINGLE   |
1139 			 METEOR_CAP_MASK |
1140 			 METEOR_WANT_MASK);
1141 
1142 	OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
1143 	OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF);
1144 
1145 	bktr->dma_prog_loaded = FALSE;
1146 	OUTB(bktr, BKTR_TDEC, 0);
1147 	OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
1148 
1149 /** FIXME: is 0xf magic, wouldn't 0x00 work ??? */
1150 	OUTL(bktr, BKTR_SRESET, 0xf);
1151 	OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED);
1152 
1153 	return( 0 );
1154 }
1155 
1156 
1157 /*
1158  * tuner close handle,
1159  *  place holder for tuner specific operations on a close.
1160  */
1161 int
tuner_close(bktr_ptr_t bktr)1162 tuner_close( bktr_ptr_t bktr )
1163 {
1164 	bktr->tflags &= ~TUNER_OPEN;
1165 
1166 	/* mute the audio by switching the mux */
1167 	set_audio( bktr, AUDIO_MUTE );
1168 
1169 	/* disable drivers on the GPIO port that control the MUXes */
1170 	OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) & ~bktr->card.gpio_mux_bits);
1171 
1172 	return( 0 );
1173 }
1174 
1175 int
vbi_close(bktr_ptr_t bktr)1176 vbi_close( bktr_ptr_t bktr )
1177 {
1178 
1179 	LOCK_VBI(bktr);
1180 
1181 	bktr->vbiflags &= ~VBI_OPEN;
1182 
1183 	UNLOCK_VBI(bktr);
1184 
1185 	return( 0 );
1186 }
1187 
1188 /*
1189  *
1190  */
1191 int
video_read(bktr_ptr_t bktr,int unit,struct cdev * dev,struct uio * uio)1192 video_read(bktr_ptr_t bktr, int unit, struct cdev *dev, struct uio *uio)
1193 {
1194         int             status;
1195         int             count;
1196 
1197 
1198 	if (bktr->bigbuf == 0)	/* no frame buffer allocated (ioctl failed) */
1199 		return( ENOMEM );
1200 
1201 	if (bktr->flags & METEOR_CAP_MASK)
1202 		return( EIO );	/* already capturing */
1203 
1204         OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl);
1205 
1206 
1207 	count = bktr->rows * bktr->cols *
1208 		pixfmt_table[ bktr->pixfmt ].public.Bpp;
1209 
1210 	if ((int) uio->uio_iov->iov_len < count)
1211 		return( EINVAL );
1212 
1213 	bktr->flags &= ~(METEOR_CAP_MASK | METEOR_WANT_MASK);
1214 
1215 	/* capture one frame */
1216 	start_capture(bktr, METEOR_SINGLE);
1217 	/* wait for capture to complete */
1218 	OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED);
1219 	OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
1220 	OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol);
1221 	OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT |
1222                             BT848_INT_RISCI      |
1223                             BT848_INT_VSYNC      |
1224                             BT848_INT_FMTCHG);
1225 
1226 
1227 	status = tsleep(BKTR_SLEEP, BKTRPRI, "captur", 0);
1228 	if (!status)		/* successful capture */
1229 		status = uiomove((caddr_t)bktr->bigbuf, count, uio);
1230 	else
1231 		printf ("%s: read: tsleep error %d\n",
1232 			bktr_name(bktr), status);
1233 
1234 	bktr->flags &= ~(METEOR_SINGLE | METEOR_WANT_MASK);
1235 
1236 	return( status );
1237 }
1238 
1239 /*
1240  * Read VBI data from the vbi circular buffer
1241  * The buffer holds vbi data blocks which are the same size
1242  * vbiinsert is the position we will insert the next item into the buffer
1243  * vbistart is the actual position in the buffer we want to read from
1244  * vbisize is the exact number of bytes in the buffer left to read
1245  */
1246 int
vbi_read(bktr_ptr_t bktr,struct uio * uio,int ioflag)1247 vbi_read(bktr_ptr_t bktr, struct uio *uio, int ioflag)
1248 {
1249 	int             readsize, readsize2, start;
1250 	int             status;
1251 
1252 	/*
1253 	 * XXX - vbi_read() should be protected against being re-entered
1254 	 * while it is unlocked for the uiomove.
1255 	 */
1256 	LOCK_VBI(bktr);
1257 
1258 	while(bktr->vbisize == 0) {
1259 		if (ioflag & FNDELAY) {
1260 			status = EWOULDBLOCK;
1261 			goto out;
1262 		}
1263 
1264 		bktr->vbi_read_blocked = TRUE;
1265 #ifdef USE_VBIMUTEX
1266 		if ((status = msleep(VBI_SLEEP, &bktr->vbimutex, VBIPRI, "vbi",
1267 		    0))) {
1268 			goto out;
1269 		}
1270 #else
1271 		if ((status = tsleep(VBI_SLEEP, VBIPRI, "vbi", 0))) {
1272 			goto out;
1273 		}
1274 #endif
1275 	}
1276 
1277 	/* Now we have some data to give to the user */
1278 
1279 	/* We cannot read more bytes than there are in
1280 	 * the circular buffer
1281 	 */
1282 	readsize = (int)uio->uio_iov->iov_len;
1283 
1284 	if (readsize > bktr->vbisize) readsize = bktr->vbisize;
1285 
1286 	/* Check if we can read this number of bytes without having
1287 	 * to wrap around the circular buffer */
1288 	if((bktr->vbistart + readsize) >= VBI_BUFFER_SIZE) {
1289 		/* We need to wrap around */
1290 
1291 		readsize2 = VBI_BUFFER_SIZE - bktr->vbistart;
1292 		start =  bktr->vbistart;
1293 		UNLOCK_VBI(bktr);
1294                	status = uiomove((caddr_t)bktr->vbibuffer + start, readsize2, uio);
1295 		if (status == 0)
1296 			status = uiomove((caddr_t)bktr->vbibuffer, (readsize - readsize2), uio);
1297 	} else {
1298 		UNLOCK_VBI(bktr);
1299 		/* We do not need to wrap around */
1300 		status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize, uio);
1301 	}
1302 
1303 	LOCK_VBI(bktr);
1304 
1305 	/* Update the number of bytes left to read */
1306 	bktr->vbisize -= readsize;
1307 
1308 	/* Update vbistart */
1309 	bktr->vbistart += readsize;
1310 	bktr->vbistart = bktr->vbistart % VBI_BUFFER_SIZE; /* wrap around if needed */
1311 
1312 out:
1313 	UNLOCK_VBI(bktr);
1314 
1315 	return( status );
1316 
1317 }
1318 
1319 
1320 
1321 /*
1322  * video ioctls
1323  */
1324 int
video_ioctl(bktr_ptr_t bktr,int unit,ioctl_cmd_t cmd,caddr_t arg,struct thread * td)1325 video_ioctl( bktr_ptr_t bktr, int unit, ioctl_cmd_t cmd, caddr_t arg, struct thread* td )
1326 {
1327 	volatile u_char		c_temp;
1328 	unsigned int		temp;
1329 	unsigned int		temp_iform;
1330 	unsigned int		error;
1331 	struct meteor_geomet	*geo;
1332 	struct meteor_counts	*counts;
1333 	struct meteor_video	*video;
1334 	struct bktr_capture_area *cap_area;
1335 	vm_offset_t		buf;
1336 	int                     i;
1337 	int			sig;
1338 	char                    char_temp;
1339 
1340 	switch ( cmd ) {
1341 
1342 	case BT848SCLIP: /* set clip region */
1343 	    bktr->max_clip_node = 0;
1344 	    memcpy(&bktr->clip_list, arg, sizeof(bktr->clip_list));
1345 
1346 	    for (i = 0; i < BT848_MAX_CLIP_NODE; i++) {
1347 		if (bktr->clip_list[i].y_min ==  0 &&
1348 		    bktr->clip_list[i].y_max == 0)
1349 		    break;
1350 	    }
1351 	    bktr->max_clip_node = i;
1352 
1353 	    /* make sure that the list contains a valid clip secquence */
1354 	    /* the clip rectangles should be sorted by x then by y as the
1355                second order sort key */
1356 
1357 	    /* clip rectangle list is terminated by y_min and y_max set to 0 */
1358 
1359 	    /* to disable clipping set  y_min and y_max to 0 in the first
1360                clip rectangle . The first clip rectangle is clip_list[0].
1361              */
1362 
1363 
1364 
1365 	    if (bktr->max_clip_node == 0 &&
1366 		(bktr->clip_list[0].y_min != 0 &&
1367 		 bktr->clip_list[0].y_max != 0)) {
1368 		return EINVAL;
1369 	    }
1370 
1371 	    for (i = 0; i < BT848_MAX_CLIP_NODE - 1 ; i++) {
1372 		if (bktr->clip_list[i].y_min == 0 &&
1373 		    bktr->clip_list[i].y_max == 0) {
1374 		    break;
1375 		}
1376 		if ( bktr->clip_list[i+1].y_min != 0 &&
1377 		     bktr->clip_list[i+1].y_max != 0 &&
1378 		     bktr->clip_list[i].x_min > bktr->clip_list[i+1].x_min ) {
1379 
1380 		    bktr->max_clip_node = 0;
1381 		    return (EINVAL);
1382 
1383 		 }
1384 
1385 		if (bktr->clip_list[i].x_min >= bktr->clip_list[i].x_max ||
1386 		    bktr->clip_list[i].y_min >= bktr->clip_list[i].y_max ||
1387 		    bktr->clip_list[i].x_min < 0 ||
1388 		    bktr->clip_list[i].x_max < 0 ||
1389 		    bktr->clip_list[i].y_min < 0 ||
1390 		    bktr->clip_list[i].y_max < 0 ) {
1391 		    bktr->max_clip_node = 0;
1392 		    return (EINVAL);
1393 		}
1394 	    }
1395 
1396 	    bktr->dma_prog_loaded = FALSE;
1397 
1398 	    break;
1399 
1400 	case METEORSTATUS:	/* get Bt848 status */
1401 		c_temp = INB(bktr, BKTR_DSTATUS);
1402 		temp = 0;
1403 		if (!(c_temp & 0x40)) temp |= METEOR_STATUS_HCLK;
1404 		if (!(c_temp & 0x10)) temp |= METEOR_STATUS_FIDT;
1405 		*(u_short *)arg = temp;
1406 		break;
1407 
1408 	case BT848SFMT:		/* set input format */
1409 		temp = *(unsigned long*)arg & BT848_IFORM_FORMAT;
1410 		temp_iform = INB(bktr, BKTR_IFORM);
1411 		temp_iform &= ~BT848_IFORM_FORMAT;
1412 		temp_iform &= ~BT848_IFORM_XTSEL;
1413 		OUTB(bktr, BKTR_IFORM, (temp_iform | temp | format_params[temp].iform_xtsel));
1414 		switch( temp ) {
1415 		case BT848_IFORM_F_AUTO:
1416 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1417 			METEOR_AUTOMODE;
1418 			break;
1419 
1420 		case BT848_IFORM_F_NTSCM:
1421 		case BT848_IFORM_F_NTSCJ:
1422 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1423 				METEOR_NTSC;
1424 			OUTB(bktr, BKTR_ADELAY, format_params[temp].adelay);
1425 			OUTB(bktr, BKTR_BDELAY, format_params[temp].bdelay);
1426 			bktr->format_params = temp;
1427 			break;
1428 
1429 		case BT848_IFORM_F_PALBDGHI:
1430 		case BT848_IFORM_F_PALN:
1431 		case BT848_IFORM_F_SECAM:
1432 		case BT848_IFORM_F_RSVD:
1433 		case BT848_IFORM_F_PALM:
1434 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1435 				METEOR_PAL;
1436 			OUTB(bktr, BKTR_ADELAY, format_params[temp].adelay);
1437 			OUTB(bktr, BKTR_BDELAY, format_params[temp].bdelay);
1438 			bktr->format_params = temp;
1439 			break;
1440 
1441 		}
1442 		bktr->dma_prog_loaded = FALSE;
1443 		break;
1444 
1445 	case METEORSFMT:	/* set input format */
1446 		temp_iform = INB(bktr, BKTR_IFORM);
1447 		temp_iform &= ~BT848_IFORM_FORMAT;
1448 		temp_iform &= ~BT848_IFORM_XTSEL;
1449 		switch(*(unsigned long *)arg & METEOR_FORM_MASK ) {
1450 		case 0:		/* default */
1451 		case METEOR_FMT_NTSC:
1452 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1453 				METEOR_NTSC;
1454 			OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_NTSCM |
1455 		                         format_params[BT848_IFORM_F_NTSCM].iform_xtsel);
1456 			OUTB(bktr, BKTR_ADELAY, format_params[BT848_IFORM_F_NTSCM].adelay);
1457 			OUTB(bktr, BKTR_BDELAY, format_params[BT848_IFORM_F_NTSCM].bdelay);
1458 			bktr->format_params = BT848_IFORM_F_NTSCM;
1459 			break;
1460 
1461 		case METEOR_FMT_PAL:
1462 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1463 				METEOR_PAL;
1464 			OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_PALBDGHI |
1465 		                         format_params[BT848_IFORM_F_PALBDGHI].iform_xtsel);
1466 			OUTB(bktr, BKTR_ADELAY, format_params[BT848_IFORM_F_PALBDGHI].adelay);
1467 			OUTB(bktr, BKTR_BDELAY, format_params[BT848_IFORM_F_PALBDGHI].bdelay);
1468 			bktr->format_params = BT848_IFORM_F_PALBDGHI;
1469 			break;
1470 
1471 		case METEOR_FMT_AUTOMODE:
1472 			bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
1473 				METEOR_AUTOMODE;
1474 			OUTB(bktr, BKTR_IFORM, temp_iform | BT848_IFORM_F_AUTO |
1475 		                         format_params[BT848_IFORM_F_AUTO].iform_xtsel);
1476 			break;
1477 
1478 		default:
1479 			return( EINVAL );
1480 		}
1481 		bktr->dma_prog_loaded = FALSE;
1482 		break;
1483 
1484 	case METEORGFMT:	/* get input format */
1485 		*(u_long *)arg = bktr->flags & METEOR_FORM_MASK;
1486 		break;
1487 
1488 
1489 	case BT848GFMT:		/* get input format */
1490 	        *(u_long *)arg = INB(bktr, BKTR_IFORM) & BT848_IFORM_FORMAT;
1491 		break;
1492 
1493 	case METEORSCOUNT:	/* (re)set error counts */
1494 		counts = (struct meteor_counts *) arg;
1495 		bktr->fifo_errors = counts->fifo_errors;
1496 		bktr->dma_errors = counts->dma_errors;
1497 		bktr->frames_captured = counts->frames_captured;
1498 		bktr->even_fields_captured = counts->even_fields_captured;
1499 		bktr->odd_fields_captured = counts->odd_fields_captured;
1500 		break;
1501 
1502 	case METEORGCOUNT:	/* get error counts */
1503 		counts = (struct meteor_counts *) arg;
1504 		counts->fifo_errors = bktr->fifo_errors;
1505 		counts->dma_errors = bktr->dma_errors;
1506 		counts->frames_captured = bktr->frames_captured;
1507 		counts->even_fields_captured = bktr->even_fields_captured;
1508 		counts->odd_fields_captured = bktr->odd_fields_captured;
1509 		break;
1510 
1511 	case METEORGVIDEO:
1512 		video = (struct meteor_video *)arg;
1513 		video->addr = bktr->video.addr;
1514 		video->width = bktr->video.width;
1515 		video->banksize = bktr->video.banksize;
1516 		video->ramsize = bktr->video.ramsize;
1517 		break;
1518 
1519 	case METEORSVIDEO:
1520 		video = (struct meteor_video *)arg;
1521 		bktr->video.addr = video->addr;
1522 		bktr->video.width = video->width;
1523 		bktr->video.banksize = video->banksize;
1524 		bktr->video.ramsize = video->ramsize;
1525 		break;
1526 
1527 	case METEORSFPS:
1528 		set_fps(bktr, *(u_short *)arg);
1529 		break;
1530 
1531 	case METEORGFPS:
1532 		*(u_short *)arg = bktr->fps;
1533 		break;
1534 
1535 	case METEORSHUE:	/* set hue */
1536 		OUTB(bktr, BKTR_HUE, (*(u_char *) arg) & 0xff);
1537 		break;
1538 
1539 	case METEORGHUE:	/* get hue */
1540 		*(u_char *)arg = INB(bktr, BKTR_HUE);
1541 		break;
1542 
1543 	case METEORSBRIG:	/* set brightness */
1544 	        char_temp =    ( *(u_char *)arg & 0xff) - 128;
1545 		OUTB(bktr, BKTR_BRIGHT, char_temp);
1546 
1547 		break;
1548 
1549 	case METEORGBRIG:	/* get brightness */
1550 		*(u_char *)arg = INB(bktr, BKTR_BRIGHT) + 128;
1551 		break;
1552 
1553 	case METEORSCSAT:	/* set chroma saturation */
1554 		temp = (int)*(u_char *)arg;
1555 
1556 		OUTB(bktr, BKTR_SAT_U_LO, (temp << 1) & 0xff);
1557 		OUTB(bktr, BKTR_SAT_V_LO, (temp << 1) & 0xff);
1558 		OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL)
1559 		                     & ~(BT848_E_CONTROL_SAT_U_MSB
1560 					 | BT848_E_CONTROL_SAT_V_MSB));
1561 		OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL)
1562 		                     & ~(BT848_O_CONTROL_SAT_U_MSB |
1563 					 BT848_O_CONTROL_SAT_V_MSB));
1564 
1565 		if ( temp & BIT_SEVEN_HIGH ) {
1566 		        OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL)
1567 			                     | (BT848_E_CONTROL_SAT_U_MSB
1568 						| BT848_E_CONTROL_SAT_V_MSB));
1569 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL)
1570 			                     | (BT848_O_CONTROL_SAT_U_MSB
1571 						| BT848_O_CONTROL_SAT_V_MSB));
1572 		}
1573 		break;
1574 
1575 	case METEORGCSAT:	/* get chroma saturation */
1576 		temp = (INB(bktr, BKTR_SAT_V_LO) >> 1) & 0xff;
1577 		if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB )
1578 			temp |= BIT_SEVEN_HIGH;
1579 		*(u_char *)arg = (u_char)temp;
1580 		break;
1581 
1582 	case METEORSCONT:	/* set contrast */
1583 		temp = (int)*(u_char *)arg & 0xff;
1584 		temp <<= 1;
1585 		OUTB(bktr, BKTR_CONTRAST_LO, temp & 0xff);
1586 		OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_CON_MSB);
1587 		OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_CON_MSB);
1588 		OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) |
1589 			(((temp & 0x100) >> 6 ) & BT848_E_CONTROL_CON_MSB));
1590 		OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) |
1591 			(((temp & 0x100) >> 6 ) & BT848_O_CONTROL_CON_MSB));
1592 		break;
1593 
1594 	case METEORGCONT:	/* get contrast */
1595 		temp = (int)INB(bktr, BKTR_CONTRAST_LO) & 0xff;
1596 		temp |= ((int)INB(bktr, BKTR_O_CONTROL) & 0x04) << 6;
1597 		*(u_char *)arg = (u_char)((temp >> 1) & 0xff);
1598 		break;
1599 
1600 	case BT848SCBUF:	/* set Clear-Buffer-on-start flag */
1601 		bktr->clr_on_start = (*(int *)arg != 0);
1602 		break;
1603 
1604 	case BT848GCBUF:	/* get Clear-Buffer-on-start flag */
1605 		*(int *)arg = (int) bktr->clr_on_start;
1606 		break;
1607 
1608 	case METEORSSIGNAL:
1609 		sig = *(int *)arg;
1610 		/* Historically, applications used METEOR_SIG_MODE_MASK
1611 		 * to reset signal delivery.
1612 		 */
1613 		if (sig == METEOR_SIG_MODE_MASK)
1614 			sig = 0;
1615 		if (sig < 0 || sig > _SIG_MAXSIG)
1616 			return (EINVAL);
1617 		bktr->signal = sig;
1618 		bktr->proc = sig ? td->td_proc : NULL;
1619 		break;
1620 
1621 	case METEORGSIGNAL:
1622 		*(int *)arg = bktr->signal;
1623 		break;
1624 
1625 	case METEORCAPTUR:
1626 		temp = bktr->flags;
1627 		switch (*(int *) arg) {
1628 		case METEOR_CAP_SINGLE:
1629 
1630 			if (bktr->bigbuf==0)	/* no frame buffer allocated */
1631 				return( ENOMEM );
1632 			/* already capturing */
1633 			if (temp & METEOR_CAP_MASK)
1634 				return( EIO );
1635 
1636 
1637 
1638 			start_capture(bktr, METEOR_SINGLE);
1639 
1640 			/* wait for capture to complete */
1641 			OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED);
1642 			OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
1643 			OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol);
1644 
1645 			OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT |
1646 			     		    BT848_INT_RISCI      |
1647 					    BT848_INT_VSYNC      |
1648 					    BT848_INT_FMTCHG);
1649 
1650 			OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl);
1651 			error = tsleep(BKTR_SLEEP, BKTRPRI, "captur", hz);
1652 			if (error && (error != ERESTART)) {
1653 				/*  Here if we didn't get complete frame  */
1654 #ifdef DIAGNOSTIC
1655 				printf( "%s: ioctl: tsleep error %d %x\n",
1656 					bktr_name(bktr), error,
1657 					INL(bktr, BKTR_RISC_COUNT));
1658 #endif
1659 
1660 				/* stop dma */
1661 				OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
1662 
1663 				/* disable risc, leave fifo running */
1664 				OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
1665 			}
1666 
1667 			bktr->flags &= ~(METEOR_SINGLE|METEOR_WANT_MASK);
1668 			/* FIXME: should we set bt848->int_stat ??? */
1669 			break;
1670 
1671 		case METEOR_CAP_CONTINOUS:
1672 			if (bktr->bigbuf==0)	/* no frame buffer allocated */
1673 				return( ENOMEM );
1674 			/* already capturing */
1675 			if (temp & METEOR_CAP_MASK)
1676 			    return( EIO );
1677 
1678 
1679 			start_capture(bktr, METEOR_CONTIN);
1680 
1681 			/* Clear the interrypt status register */
1682 			OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT));
1683 
1684 			OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
1685 			OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol);
1686 			OUTB(bktr, BKTR_CAP_CTL, bktr->bktr_cap_ctl);
1687 
1688 			OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT |
1689 					    BT848_INT_RISCI      |
1690 			                    BT848_INT_VSYNC      |
1691 					    BT848_INT_FMTCHG);
1692 #ifdef BT848_DUMP
1693 			dump_bt848(bktr);
1694 #endif
1695 			break;
1696 
1697 		case METEOR_CAP_STOP_CONT:
1698 			if (bktr->flags & METEOR_CONTIN) {
1699 				/* turn off capture */
1700 				OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
1701 				OUTB(bktr, BKTR_CAP_CTL, CAPTURE_OFF);
1702 				OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
1703 				bktr->flags &=
1704 					~(METEOR_CONTIN | METEOR_WANT_MASK);
1705 
1706 			}
1707 		}
1708 		break;
1709 
1710 	case METEORSETGEO:
1711 		/* can't change parameters while capturing */
1712 		if (bktr->flags & METEOR_CAP_MASK)
1713 			return( EBUSY );
1714 
1715 
1716 		geo = (struct meteor_geomet *) arg;
1717 
1718 		error = 0;
1719 		/* Either even or odd, if even & odd, then these a zero */
1720 		if ((geo->oformat & METEOR_GEO_ODD_ONLY) &&
1721 			(geo->oformat & METEOR_GEO_EVEN_ONLY)) {
1722 			printf( "%s: ioctl: Geometry odd or even only.\n",
1723 				bktr_name(bktr));
1724 			return( EINVAL );
1725 		}
1726 
1727 		/* set/clear even/odd flags */
1728 		if (geo->oformat & METEOR_GEO_ODD_ONLY)
1729 			bktr->flags |= METEOR_ONLY_ODD_FIELDS;
1730 		else
1731 			bktr->flags &= ~METEOR_ONLY_ODD_FIELDS;
1732 		if (geo->oformat & METEOR_GEO_EVEN_ONLY)
1733 			bktr->flags |= METEOR_ONLY_EVEN_FIELDS;
1734 		else
1735 			bktr->flags &= ~METEOR_ONLY_EVEN_FIELDS;
1736 
1737 		if (geo->columns <= 0) {
1738 			printf(
1739 			"%s: ioctl: %d: columns must be greater than zero.\n",
1740 				bktr_name(bktr), geo->columns);
1741 			error = EINVAL;
1742 		}
1743 		else if ((geo->columns & 0x3fe) != geo->columns) {
1744 			printf(
1745 			"%s: ioctl: %d: columns too large or not even.\n",
1746 				bktr_name(bktr), geo->columns);
1747 			error = EINVAL;
1748 		}
1749 
1750 		if (geo->rows <= 0) {
1751 			printf(
1752 			"%s: ioctl: %d: rows must be greater than zero.\n",
1753 				bktr_name(bktr), geo->rows);
1754 			error = EINVAL;
1755 		}
1756 		else if (((geo->rows & 0x7fe) != geo->rows) ||
1757 			((geo->oformat & METEOR_GEO_FIELD_MASK) &&
1758 				((geo->rows & 0x3fe) != geo->rows)) ) {
1759 			printf(
1760 			"%s: ioctl: %d: rows too large or not even.\n",
1761 				bktr_name(bktr), geo->rows);
1762 			error = EINVAL;
1763 		}
1764 
1765 		if (geo->frames > 32) {
1766 			printf("%s: ioctl: too many frames.\n",
1767 			       bktr_name(bktr));
1768 
1769 			error = EINVAL;
1770 		}
1771 
1772 		if (error)
1773 			return( error );
1774 
1775 		bktr->dma_prog_loaded = FALSE;
1776 		OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
1777 
1778 		OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
1779 
1780 		if ((temp=(geo->rows * geo->columns * geo->frames * 2))) {
1781 			if (geo->oformat & METEOR_GEO_RGB24) temp = temp * 2;
1782 
1783 			/* meteor_mem structure for SYNC Capture */
1784 			if (geo->frames > 1) temp += PAGE_SIZE;
1785 
1786 			temp = btoc(temp);
1787 			if ((int) temp > bktr->alloc_pages
1788 			    && bktr->video.addr == 0) {
1789 
1790 /*****************************/
1791 /* *** OS Dependent code *** */
1792 /*****************************/
1793 #if defined(__NetBSD__) || defined(__OpenBSD__)
1794                                 bus_dmamap_t dmamap;
1795 
1796                                 buf = get_bktr_mem(bktr, &dmamap,
1797                                                    temp * PAGE_SIZE);
1798                                 if (buf != 0) {
1799                                         free_bktr_mem(bktr, bktr->dm_mem,
1800                                                       bktr->bigbuf);
1801                                         bktr->dm_mem = dmamap;
1802 
1803 #else
1804                                 buf = get_bktr_mem(unit, temp*PAGE_SIZE);
1805                                 if (buf != 0) {
1806 					contigfree(
1807 					  (void *)(uintptr_t)bktr->bigbuf,
1808                                           (bktr->alloc_pages * PAGE_SIZE),
1809 					  M_DEVBUF);
1810 #endif
1811 
1812 					bktr->bigbuf = buf;
1813 					bktr->alloc_pages = temp;
1814 					if (bootverbose)
1815 						printf("%s: ioctl: Allocating %d bytes\n",
1816 							bktr_name(bktr), (int)(temp*PAGE_SIZE));
1817 				}
1818 				else
1819 					error = ENOMEM;
1820 			}
1821 		}
1822 
1823 		if (error)
1824 			return error;
1825 
1826 		bktr->rows = geo->rows;
1827 		bktr->cols = geo->columns;
1828 		bktr->frames = geo->frames;
1829 
1830 		/*  Pixel format (if in meteor pixfmt compatibility mode)  */
1831 		if ( bktr->pixfmt_compat ) {
1832 			bktr->format = METEOR_GEO_YUV_422;
1833 			switch (geo->oformat & METEOR_GEO_OUTPUT_MASK) {
1834 			case 0:			/* default */
1835 			case METEOR_GEO_RGB16:
1836 				    bktr->format = METEOR_GEO_RGB16;
1837 				    break;
1838 			case METEOR_GEO_RGB24:
1839 				    bktr->format = METEOR_GEO_RGB24;
1840 				    break;
1841 			case METEOR_GEO_YUV_422:
1842 				    bktr->format = METEOR_GEO_YUV_422;
1843                                     if (geo->oformat & METEOR_GEO_YUV_12)
1844 					bktr->format = METEOR_GEO_YUV_12;
1845 				    break;
1846 			case METEOR_GEO_YUV_PACKED:
1847 				    bktr->format = METEOR_GEO_YUV_PACKED;
1848 				    break;
1849 			}
1850 			bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
1851 		}
1852 
1853 		if (bktr->flags & METEOR_CAP_MASK) {
1854 
1855 			if (bktr->flags & (METEOR_CONTIN|METEOR_SYNCAP)) {
1856 				switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
1857 				case METEOR_ONLY_ODD_FIELDS:
1858 					bktr->flags |= METEOR_WANT_ODD;
1859 					break;
1860 				case METEOR_ONLY_EVEN_FIELDS:
1861 					bktr->flags |= METEOR_WANT_EVEN;
1862 					break;
1863 				default:
1864 					bktr->flags |= METEOR_WANT_MASK;
1865 					break;
1866 				}
1867 
1868 				start_capture(bktr, METEOR_CONTIN);
1869 				OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT));
1870 				OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_ENABLED);
1871 				OUTW(bktr, BKTR_GPIO_DMA_CTL, bktr->capcontrol);
1872 				OUTL(bktr, BKTR_INT_MASK, BT848_INT_MYSTERYBIT |
1873 						    BT848_INT_VSYNC      |
1874 						    BT848_INT_FMTCHG);
1875 			}
1876 		}
1877 		break;
1878 	/* end of METEORSETGEO */
1879 
1880 	/* FIXME. The Capture Area currently has the following restrictions:
1881 	GENERAL
1882 	 y_offset may need to be even in interlaced modes
1883 	RGB24 - Interlaced mode
1884 	 x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
1885 	 y_size must be greater than or equal to METEORSETGEO height (rows)
1886 	RGB24 - Even Only (or Odd Only) mode
1887 	 x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
1888 	 y_size must be greater than or equal to 2*METEORSETGEO height (rows)
1889 	YUV12 - Interlaced mode
1890 	 x_size must be greater than or equal to METEORSETGEO width (cols)
1891 	 y_size must be greater than or equal to METEORSETGEO height (rows)
1892 	YUV12 - Even Only (or Odd Only) mode
1893 	 x_size must be greater than or equal to METEORSETGEO width (cols)
1894 	 y_size must be greater than or equal to 2*METEORSETGEO height (rows)
1895 	*/
1896 
1897 	case BT848_SCAPAREA: /* set capture area of each video frame */
1898 		/* can't change parameters while capturing */
1899 		if (bktr->flags & METEOR_CAP_MASK)
1900 			return( EBUSY );
1901 
1902 		cap_area = (struct bktr_capture_area *) arg;
1903 		bktr->capture_area_x_offset = cap_area->x_offset;
1904 		bktr->capture_area_y_offset = cap_area->y_offset;
1905 		bktr->capture_area_x_size   = cap_area->x_size;
1906 		bktr->capture_area_y_size   = cap_area->y_size;
1907 		bktr->capture_area_enabled  = TRUE;
1908 
1909 		bktr->dma_prog_loaded = FALSE;
1910 		break;
1911 
1912 	case BT848_GCAPAREA: /* get capture area of each video frame */
1913 		cap_area = (struct bktr_capture_area *) arg;
1914 		if (bktr->capture_area_enabled == FALSE) {
1915 			cap_area->x_offset = 0;
1916 			cap_area->y_offset = 0;
1917 			cap_area->x_size   = format_params[
1918 				bktr->format_params].scaled_hactive;
1919 			cap_area->y_size   = format_params[
1920 				bktr->format_params].vactive;
1921 		} else {
1922 			cap_area->x_offset = bktr->capture_area_x_offset;
1923 			cap_area->y_offset = bktr->capture_area_y_offset;
1924 			cap_area->x_size   = bktr->capture_area_x_size;
1925 			cap_area->y_size   = bktr->capture_area_y_size;
1926 		}
1927 		break;
1928 
1929 	default:
1930 		return common_ioctl( bktr, cmd, arg );
1931 	}
1932 
1933 	return( 0 );
1934 }
1935 
1936 /*
1937  * tuner ioctls
1938  */
1939 int
1940 tuner_ioctl( bktr_ptr_t bktr, int unit, ioctl_cmd_t cmd, caddr_t arg, struct thread* td )
1941 {
1942 	int		tmp_int;
1943 	int		temp, temp1;
1944 	int		offset;
1945 	int		count;
1946 	u_char		*buf;
1947 	u_long          par;
1948 	u_char          write;
1949 	int             i2c_addr;
1950 	int             i2c_port;
1951 	u_long          data;
1952 
1953 	switch ( cmd ) {
1954 
1955 	case REMOTE_GETKEY:
1956 		/* Read the last key pressed by the Remote Control */
1957 		if (bktr->remote_control == 0) return (EINVAL);
1958 		remote_read(bktr, (struct bktr_remote *)arg);
1959 		break;
1960 
1961 #if defined( TUNER_AFC )
1962 	case TVTUNER_SETAFC:
1963 		bktr->tuner.afc = (*(int *)arg != 0);
1964 		break;
1965 
1966 	case TVTUNER_GETAFC:
1967 		*(int *)arg = bktr->tuner.afc;
1968 		/* XXX Perhaps use another bit to indicate AFC success? */
1969 		break;
1970 #endif /* TUNER_AFC */
1971 
1972 	case TVTUNER_SETCHNL:
1973 		temp_mute( bktr, TRUE );
1974 		temp = tv_channel( bktr, (int)*(unsigned long *)arg );
1975 		if ( temp < 0 ) {
1976 			temp_mute( bktr, FALSE );
1977 			return( EINVAL );
1978 		}
1979 		*(unsigned long *)arg = temp;
1980 
1981 		/* after every channel change, we must restart the MSP34xx */
1982 		/* audio chip to reselect NICAM STEREO or MONO audio */
1983 		if ( bktr->card.msp3400c )
1984 		  msp_autodetect( bktr );
1985 
1986 		/* after every channel change, we must restart the DPL35xx */
1987 		if ( bktr->card.dpl3518a )
1988 		  dpl_autodetect( bktr );
1989 
1990 		temp_mute( bktr, FALSE );
1991 		break;
1992 
1993 	case TVTUNER_GETCHNL:
1994 		*(unsigned long *)arg = bktr->tuner.channel;
1995 		break;
1996 
1997 	case TVTUNER_SETTYPE:
1998 		temp = *(unsigned long *)arg;
1999 		if ( (temp < CHNLSET_MIN) || (temp > CHNLSET_MAX) )
2000 			return( EINVAL );
2001 		bktr->tuner.chnlset = temp;
2002 		break;
2003 
2004 	case TVTUNER_GETTYPE:
2005 		*(unsigned long *)arg = bktr->tuner.chnlset;
2006 		break;
2007 
2008 	case TVTUNER_GETSTATUS:
2009 		temp = get_tuner_status( bktr );
2010 		*(unsigned long *)arg = temp & 0xff;
2011 		break;
2012 
2013 	case TVTUNER_SETFREQ:
2014 		temp_mute( bktr, TRUE );
2015 		temp = tv_freq( bktr, (int)*(unsigned long *)arg, TV_FREQUENCY);
2016 		temp_mute( bktr, FALSE );
2017 		if ( temp < 0 ) {
2018 			temp_mute( bktr, FALSE );
2019 			return( EINVAL );
2020 		}
2021 		*(unsigned long *)arg = temp;
2022 
2023 		/* after every channel change, we must restart the MSP34xx */
2024 		/* audio chip to reselect NICAM STEREO or MONO audio */
2025 		if ( bktr->card.msp3400c )
2026 		  msp_autodetect( bktr );
2027 
2028 		/* after every channel change, we must restart the DPL35xx */
2029 		if ( bktr->card.dpl3518a )
2030 		  dpl_autodetect( bktr );
2031 
2032 		temp_mute( bktr, FALSE );
2033 		break;
2034 
2035 	case TVTUNER_GETFREQ:
2036 		*(unsigned long *)arg = bktr->tuner.frequency;
2037 		break;
2038 
2039 	case TVTUNER_GETCHNLSET:
2040 		return tuner_getchnlset((struct bktr_chnlset *)arg);
2041 
2042 	case BT848_SAUDIO:	/* set audio channel */
2043 		if ( set_audio( bktr, *(int*)arg ) < 0 )
2044 			return( EIO );
2045 		break;
2046 
2047 	/* hue is a 2's compliment number, -90' to +89.3' in 0.7' steps */
2048 	case BT848_SHUE:	/* set hue */
2049 		OUTB(bktr, BKTR_HUE, (u_char)(*(int*)arg & 0xff));
2050 		break;
2051 
2052 	case BT848_GHUE:	/* get hue */
2053 		*(int*)arg = (signed char)(INB(bktr, BKTR_HUE) & 0xff);
2054 		break;
2055 
2056 	/* brightness is a 2's compliment #, -50 to +%49.6% in 0.39% steps */
2057 	case BT848_SBRIG:	/* set brightness */
2058 		OUTB(bktr, BKTR_BRIGHT, (u_char)(*(int *)arg & 0xff));
2059 		break;
2060 
2061 	case BT848_GBRIG:	/* get brightness */
2062 		*(int *)arg = (signed char)(INB(bktr, BKTR_BRIGHT) & 0xff);
2063 		break;
2064 
2065 	/*  */
2066 	case BT848_SCSAT:	/* set chroma saturation */
2067 		tmp_int = *(int*)arg;
2068 
2069 		temp = INB(bktr, BKTR_E_CONTROL);
2070 		temp1 = INB(bktr, BKTR_O_CONTROL);
2071 		if ( tmp_int & BIT_EIGHT_HIGH ) {
2072 			temp |= (BT848_E_CONTROL_SAT_U_MSB |
2073 				 BT848_E_CONTROL_SAT_V_MSB);
2074 			temp1 |= (BT848_O_CONTROL_SAT_U_MSB |
2075 				  BT848_O_CONTROL_SAT_V_MSB);
2076 		}
2077 		else {
2078 			temp &= ~(BT848_E_CONTROL_SAT_U_MSB |
2079 				  BT848_E_CONTROL_SAT_V_MSB);
2080 			temp1 &= ~(BT848_O_CONTROL_SAT_U_MSB |
2081 				   BT848_O_CONTROL_SAT_V_MSB);
2082 		}
2083 
2084 		OUTB(bktr, BKTR_SAT_U_LO, (u_char)(tmp_int & 0xff));
2085 		OUTB(bktr, BKTR_SAT_V_LO, (u_char)(tmp_int & 0xff));
2086 		OUTB(bktr, BKTR_E_CONTROL, temp);
2087 		OUTB(bktr, BKTR_O_CONTROL, temp1);
2088 		break;
2089 
2090 	case BT848_GCSAT:	/* get chroma saturation */
2091 		tmp_int = (int)(INB(bktr, BKTR_SAT_V_LO) & 0xff);
2092 		if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB )
2093 			tmp_int |= BIT_EIGHT_HIGH;
2094 		*(int*)arg = tmp_int;
2095 		break;
2096 
2097 	/*  */
2098 	case BT848_SVSAT:	/* set chroma V saturation */
2099 		tmp_int = *(int*)arg;
2100 
2101 		temp = INB(bktr, BKTR_E_CONTROL);
2102 		temp1 = INB(bktr, BKTR_O_CONTROL);
2103 		if ( tmp_int & BIT_EIGHT_HIGH) {
2104 			temp |= BT848_E_CONTROL_SAT_V_MSB;
2105 			temp1 |= BT848_O_CONTROL_SAT_V_MSB;
2106 		}
2107 		else {
2108 			temp &= ~BT848_E_CONTROL_SAT_V_MSB;
2109 			temp1 &= ~BT848_O_CONTROL_SAT_V_MSB;
2110 		}
2111 
2112 		OUTB(bktr, BKTR_SAT_V_LO, (u_char)(tmp_int & 0xff));
2113 		OUTB(bktr, BKTR_E_CONTROL, temp);
2114 		OUTB(bktr, BKTR_O_CONTROL, temp1);
2115 		break;
2116 
2117 	case BT848_GVSAT:	/* get chroma V saturation */
2118 		tmp_int = (int)INB(bktr, BKTR_SAT_V_LO) & 0xff;
2119 		if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_V_MSB )
2120 			tmp_int |= BIT_EIGHT_HIGH;
2121 		*(int*)arg = tmp_int;
2122 		break;
2123 
2124 	/*  */
2125 	case BT848_SUSAT:	/* set chroma U saturation */
2126 		tmp_int = *(int*)arg;
2127 
2128 		temp = INB(bktr, BKTR_E_CONTROL);
2129 		temp1 = INB(bktr, BKTR_O_CONTROL);
2130 		if ( tmp_int & BIT_EIGHT_HIGH ) {
2131 			temp |= BT848_E_CONTROL_SAT_U_MSB;
2132 			temp1 |= BT848_O_CONTROL_SAT_U_MSB;
2133 		}
2134 		else {
2135 			temp &= ~BT848_E_CONTROL_SAT_U_MSB;
2136 			temp1 &= ~BT848_O_CONTROL_SAT_U_MSB;
2137 		}
2138 
2139 		OUTB(bktr, BKTR_SAT_U_LO, (u_char)(tmp_int & 0xff));
2140 		OUTB(bktr, BKTR_E_CONTROL, temp);
2141 		OUTB(bktr, BKTR_O_CONTROL, temp1);
2142 		break;
2143 
2144 	case BT848_GUSAT:	/* get chroma U saturation */
2145 		tmp_int = (int)INB(bktr, BKTR_SAT_U_LO) & 0xff;
2146 		if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_SAT_U_MSB )
2147 			tmp_int |= BIT_EIGHT_HIGH;
2148 		*(int*)arg = tmp_int;
2149 		break;
2150 
2151 /* lr 970528 luma notch etc - 3 high bits of e_control/o_control */
2152 
2153 	case BT848_SLNOTCH:	/* set luma notch */
2154 		tmp_int = (*(int *)arg & 0x7) << 5 ;
2155 		OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~0xe0);
2156 		OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~0xe0);
2157 		OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | tmp_int);
2158 		OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | tmp_int);
2159 		break;
2160 
2161 	case BT848_GLNOTCH:	/* get luma notch */
2162 		*(int *)arg = (int) ( (INB(bktr, BKTR_E_CONTROL) & 0xe0) >> 5) ;
2163 		break;
2164 
2165 
2166 	/*  */
2167 	case BT848_SCONT:	/* set contrast */
2168 		tmp_int = *(int*)arg;
2169 
2170 		temp = INB(bktr, BKTR_E_CONTROL);
2171 		temp1 = INB(bktr, BKTR_O_CONTROL);
2172 		if ( tmp_int & BIT_EIGHT_HIGH ) {
2173 			temp |= BT848_E_CONTROL_CON_MSB;
2174 			temp1 |= BT848_O_CONTROL_CON_MSB;
2175 		}
2176 		else {
2177 			temp &= ~BT848_E_CONTROL_CON_MSB;
2178 			temp1 &= ~BT848_O_CONTROL_CON_MSB;
2179 		}
2180 
2181 		OUTB(bktr, BKTR_CONTRAST_LO, (u_char)(tmp_int & 0xff));
2182 		OUTB(bktr, BKTR_E_CONTROL, temp);
2183 		OUTB(bktr, BKTR_O_CONTROL, temp1);
2184 		break;
2185 
2186 	case BT848_GCONT:	/* get contrast */
2187 		tmp_int = (int)INB(bktr, BKTR_CONTRAST_LO) & 0xff;
2188 		if ( INB(bktr, BKTR_E_CONTROL) & BT848_E_CONTROL_CON_MSB )
2189 			tmp_int |= BIT_EIGHT_HIGH;
2190 		*(int*)arg = tmp_int;
2191 		break;
2192 
2193 		/*  FIXME:  SCBARS and CCBARS require a valid int *        */
2194 		/*    argument to succeed, but its not used; consider      */
2195 		/*    using the arg to store the on/off state so           */
2196 		/*    there's only one ioctl() needed to turn cbars on/off */
2197 	case BT848_SCBARS:	/* set colorbar output */
2198 		OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_COLOR_BARS);
2199 		break;
2200 
2201 	case BT848_CCBARS:	/* clear colorbar output */
2202 		OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) & ~(BT848_COLOR_CTL_COLOR_BARS));
2203 		break;
2204 
2205 	case BT848_GAUDIO:	/* get audio channel */
2206 		temp = bktr->audio_mux_select;
2207 		if ( bktr->audio_mute_state == TRUE )
2208 			temp |= AUDIO_MUTE;
2209 		*(int*)arg = temp;
2210 		break;
2211 
2212 	case BT848_SBTSC:	/* set audio channel */
2213 		if ( set_BTSC( bktr, *(int*)arg ) < 0 )
2214 			return( EIO );
2215 		break;
2216 
2217 	case BT848_WEEPROM:	/* write eeprom */
2218 		offset = (((struct eeProm *)arg)->offset);
2219 		count = (((struct eeProm *)arg)->count);
2220 		buf = &(((struct eeProm *)arg)->bytes[ 0 ]);
2221 		if ( writeEEProm( bktr, offset, count, buf ) < 0 )
2222 			return( EIO );
2223 		break;
2224 
2225 	case BT848_REEPROM:	/* read eeprom */
2226 		offset = (((struct eeProm *)arg)->offset);
2227 		count = (((struct eeProm *)arg)->count);
2228 		buf = &(((struct eeProm *)arg)->bytes[ 0 ]);
2229 		if ( readEEProm( bktr, offset, count, buf ) < 0 )
2230 			return( EIO );
2231 		break;
2232 
2233 	case BT848_SIGNATURE:
2234 		offset = (((struct eeProm *)arg)->offset);
2235 		count = (((struct eeProm *)arg)->count);
2236 		buf = &(((struct eeProm *)arg)->bytes[ 0 ]);
2237 		if ( signCard( bktr, offset, count, buf ) < 0 )
2238 			return( EIO );
2239 		break;
2240 
2241         /* Ioctl's for direct gpio access */
2242 #ifdef BKTR_GPIO_ACCESS
2243         case BT848_GPIO_GET_EN:
2244                 *(int*)arg = INL(bktr, BKTR_GPIO_OUT_EN);
2245                 break;
2246 
2247         case BT848_GPIO_SET_EN:
2248                 OUTL(bktr, BKTR_GPIO_OUT_EN, *(int*)arg);
2249                 break;
2250 
2251         case BT848_GPIO_GET_DATA:
2252                 *(int*)arg = INL(bktr, BKTR_GPIO_DATA);
2253                 break;
2254 
2255         case BT848_GPIO_SET_DATA:
2256                 OUTL(bktr, BKTR_GPIO_DATA, *(int*)arg);
2257                 break;
2258 #endif /* BKTR_GPIO_ACCESS */
2259 
2260 	/* Ioctl's for running the tuner device in radio mode		*/
2261 
2262 	case RADIO_GETMODE:
2263             *(unsigned char *)arg = bktr->tuner.radio_mode;
2264 	    break;
2265 
2266 	case RADIO_SETMODE:
2267             bktr->tuner.radio_mode = *(unsigned char *)arg;
2268             break;
2269 
2270  	case RADIO_GETFREQ:
2271             *(unsigned long *)arg = bktr->tuner.frequency;
2272             break;
2273 
2274 	case RADIO_SETFREQ:
2275 	    /* The argument to this ioctl is NOT freq*16. It is
2276 	    ** freq*100.
2277 	    */
2278 
2279             temp=(int)*(unsigned long *)arg;
2280 
2281 #ifdef BKTR_RADIO_DEBUG
2282 	    printf("%s: arg=%d temp=%d\n", bktr_name(bktr),
2283 		   (int)*(unsigned long *)arg, temp);
2284 #endif
2285 
2286 #ifndef BKTR_RADIO_NOFREQCHECK
2287 	    /* According to the spec. sheet the band: 87.5MHz-108MHz	*/
2288 	    /* is supported.						*/
2289 	    if(temp<8750 || temp>10800) {
2290 	      printf("%s: Radio frequency out of range\n", bktr_name(bktr));
2291 	      return(EINVAL);
2292 	      }
2293 #endif
2294 	    temp_mute( bktr, TRUE );
2295 	    temp = tv_freq( bktr, temp, FM_RADIO_FREQUENCY );
2296 	    temp_mute( bktr, FALSE );
2297 #ifdef BKTR_RADIO_DEBUG
2298   if(temp)
2299     printf("%s: tv_freq returned: %d\n", bktr_name(bktr), temp);
2300 #endif
2301 	    if ( temp < 0 )
2302 		    return( EINVAL );
2303 	    *(unsigned long *)arg = temp;
2304 	    break;
2305 
2306 	/* Luigi's I2CWR ioctl */
2307 	case BT848_I2CWR:
2308 		par = *(u_long *)arg;
2309 		write = (par >> 24) & 0xff ;
2310 		i2c_addr = (par >> 16) & 0xff ;
2311 		i2c_port = (par >> 8) & 0xff ;
2312 		data = (par) & 0xff ;
2313 
2314 		if (write) {
2315 			i2cWrite( bktr, i2c_addr, i2c_port, data);
2316 		} else {
2317 			data = i2cRead( bktr, i2c_addr);
2318 		}
2319 		*(u_long *)arg = (par & 0xffffff00) | ( data & 0xff );
2320 		break;
2321 
2322 
2323 #ifdef BT848_MSP_READ
2324 	/* I2C ioctls to allow userland access to the MSP chip */
2325 	case BT848_MSP_READ:
2326 		{
2327 		struct bktr_msp_control *msp;
2328 		msp = (struct bktr_msp_control *) arg;
2329 		msp->data = msp_dpl_read(bktr, bktr->msp_addr,
2330 		                         msp->function, msp->address);
2331 		break;
2332 		}
2333 
2334 	case BT848_MSP_WRITE:
2335 		{
2336 		struct bktr_msp_control *msp;
2337 		msp = (struct bktr_msp_control *) arg;
2338 		msp_dpl_write(bktr, bktr->msp_addr, msp->function,
2339 		             msp->address, msp->data );
2340 		break;
2341 		}
2342 
2343 	case BT848_MSP_RESET:
2344 		msp_dpl_reset(bktr, bktr->msp_addr);
2345 		break;
2346 #endif
2347 
2348 	default:
2349 		return common_ioctl( bktr, cmd, arg );
2350 	}
2351 
2352 	return( 0 );
2353 }
2354 
2355 
2356 /*
2357  * common ioctls
2358  */
2359 static int
2360 common_ioctl( bktr_ptr_t bktr, ioctl_cmd_t cmd, caddr_t arg )
2361 {
2362         int                           pixfmt;
2363 	unsigned int	              temp;
2364 	struct meteor_pixfmt          *pf_pub;
2365 
2366 	switch (cmd) {
2367 
2368 	case METEORSINPUT:	/* set input device */
2369 		/*Bt848 has 3 MUX Inputs. Bt848A/849A/878/879 has 4 MUX Inputs*/
2370 		/* On the original bt848 boards, */
2371 		/*   Tuner is MUX0, RCA is MUX1, S-Video is MUX2 */
2372 		/* On the Hauppauge bt878 boards, */
2373 		/*   Tuner is MUX0, RCA is MUX3 */
2374 		/* Unfortunately Meteor driver codes DEV_RCA as DEV_0, so we */
2375 		/* stick with this system in our Meteor Emulation */
2376 
2377 		switch(*(unsigned long *)arg & METEOR_DEV_MASK) {
2378 
2379 		/* this is the RCA video input */
2380 		case 0:		/* default */
2381 		case METEOR_INPUT_DEV0:
2382 		  /* METEOR_INPUT_DEV_RCA: */
2383 		        bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
2384 			  | METEOR_DEV0;
2385 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM)
2386 			                 & ~BT848_IFORM_MUXSEL);
2387 
2388 			/* work around for new Hauppauge 878 cards */
2389 			if ((bktr->card.card_id == CARD_HAUPPAUGE) &&
2390 				(bktr->id==BROOKTREE_878 ||
2391 				 bktr->id==BROOKTREE_879) )
2392 				OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3);
2393 			else
2394 				OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1);
2395 
2396 			OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP);
2397 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP);
2398 			set_audio( bktr, AUDIO_EXTERN );
2399 			break;
2400 
2401 		/* this is the tuner input */
2402 		case METEOR_INPUT_DEV1:
2403 			bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
2404 				| METEOR_DEV1;
2405 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL);
2406 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX0);
2407 			OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP);
2408 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP);
2409 			set_audio( bktr, AUDIO_TUNER );
2410 			break;
2411 
2412 		/* this is the S-VHS input, but with a composite camera */
2413 		case METEOR_INPUT_DEV2:
2414 			bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
2415 				| METEOR_DEV2;
2416 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL);
2417 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX2);
2418 			OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP);
2419 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_O_CONTROL_COMP);
2420 			set_audio( bktr, AUDIO_EXTERN );
2421 			break;
2422 
2423 		/* this is the S-VHS input */
2424 		case METEOR_INPUT_DEV_SVIDEO:
2425 			bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
2426 				| METEOR_DEV_SVIDEO;
2427 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL);
2428 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX2);
2429 			OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | BT848_E_CONTROL_COMP);
2430 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | BT848_O_CONTROL_COMP);
2431 			set_audio( bktr, AUDIO_EXTERN );
2432 			break;
2433 
2434 		case METEOR_INPUT_DEV3:
2435 		  if ((bktr->id == BROOKTREE_848A) ||
2436 		      (bktr->id == BROOKTREE_849A) ||
2437 		      (bktr->id == BROOKTREE_878) ||
2438 		      (bktr->id == BROOKTREE_879) ) {
2439 			bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
2440 				| METEOR_DEV3;
2441 			OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) & ~BT848_IFORM_MUXSEL);
2442 
2443 			/* work around for new Hauppauge 878 cards */
2444 			if ((bktr->card.card_id == CARD_HAUPPAUGE) &&
2445 				(bktr->id==BROOKTREE_878 ||
2446 				 bktr->id==BROOKTREE_879) )
2447 				OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX1);
2448 			else
2449 				OUTB(bktr, BKTR_IFORM, INB(bktr, BKTR_IFORM) | BT848_IFORM_M_MUX3);
2450 
2451 			OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) & ~BT848_E_CONTROL_COMP);
2452 			OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) & ~BT848_O_CONTROL_COMP);
2453 			set_audio( bktr, AUDIO_EXTERN );
2454 
2455 			break;
2456 		  }
2457 
2458 		default:
2459 			return( EINVAL );
2460 		}
2461 		break;
2462 
2463 	case METEORGINPUT:	/* get input device */
2464 		*(u_long *)arg = bktr->flags & METEOR_DEV_MASK;
2465 		break;
2466 
2467 	case METEORSACTPIXFMT:
2468 		if (( *(int *)arg < 0 ) ||
2469 		    ( *(int *)arg >= PIXFMT_TABLE_SIZE ))
2470 			return( EINVAL );
2471 
2472 		bktr->pixfmt          = *(int *)arg;
2473 		OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0)
2474 		     | pixfmt_swap_flags( bktr->pixfmt ));
2475 		bktr->pixfmt_compat   = FALSE;
2476 		break;
2477 
2478 	case METEORGACTPIXFMT:
2479 		*(int *)arg = bktr->pixfmt;
2480 		break;
2481 
2482 	case METEORGSUPPIXFMT :
2483 		pf_pub = (struct meteor_pixfmt *)arg;
2484 		pixfmt = pf_pub->index;
2485 
2486 		if (( pixfmt < 0 ) || ( pixfmt >= PIXFMT_TABLE_SIZE ))
2487 			return( EINVAL );
2488 
2489 		memcpy( pf_pub, &pixfmt_table[ pixfmt ].public,
2490 			sizeof( *pf_pub ) );
2491 
2492 		/*  Patch in our format index  */
2493 		pf_pub->index       = pixfmt;
2494 		break;
2495 
2496 #if defined( STATUS_SUM )
2497 	case BT848_GSTATUS:	/* reap status */
2498 		{
2499                 DECLARE_INTR_MASK(s);
2500 		DISABLE_INTR(s);
2501 		temp = status_sum;
2502 		status_sum = 0;
2503 		ENABLE_INTR(s);
2504 		*(u_int*)arg = temp;
2505 		break;
2506 		}
2507 #endif /* STATUS_SUM */
2508 
2509 	default:
2510 		return( ENOTTY );
2511 	}
2512 
2513 	return( 0 );
2514 }
2515 
2516 
2517 
2518 
2519 /******************************************************************************
2520  * bt848 RISC programming routines:
2521  */
2522 
2523 
2524 /*
2525  *
2526  */
2527 #if defined(BT848_DEBUG) || defined(BT848_DUMP)
2528 static int
2529 dump_bt848( bktr_ptr_t bktr )
2530 {
2531 	int	r[60]={
2532 			   4,    8, 0xc, 0x8c, 0x10, 0x90, 0x14, 0x94,
2533 			0x18, 0x98, 0x1c, 0x9c, 0x20, 0xa0, 0x24, 0xa4,
2534 			0x28, 0x2c, 0xac, 0x30, 0x34, 0x38, 0x3c, 0x40,
2535 			0xc0, 0x48, 0x4c, 0xcc, 0x50, 0xd0, 0xd4, 0x60,
2536 			0x64, 0x68, 0x6c, 0xec, 0xd8, 0xdc, 0xe0, 0xe4,
2537 			0,	 0,    0,    0
2538 		   };
2539 	int	i;
2540 
2541 	for (i = 0; i < 40; i+=4) {
2542 		printf("%s: Reg:value : \t%x:%x \t%x:%x \t %x:%x \t %x:%x\n",
2543 		       bktr_name(bktr),
2544 		       r[i], INL(bktr, r[i]),
2545 		       r[i+1], INL(bktr, r[i+1]),
2546 		       r[i+2], INL(bktr, r[i+2]),
2547 		       r[i+3], INL(bktr, r[i+3]));
2548 	}
2549 
2550 	printf("%s: INT STAT %x \n", bktr_name(bktr),
2551 	       INL(bktr, BKTR_INT_STAT));
2552 	printf("%s: Reg INT_MASK %x \n", bktr_name(bktr),
2553 	       INL(bktr, BKTR_INT_MASK));
2554 	printf("%s: Reg GPIO_DMA_CTL %x \n", bktr_name(bktr),
2555 	       INW(bktr, BKTR_GPIO_DMA_CTL));
2556 
2557 	return( 0 );
2558 }
2559 
2560 #endif
2561 
2562 /*
2563  * build write instruction
2564  */
2565 #define BKTR_FM1      0x6	/* packed data to follow */
2566 #define BKTR_FM3      0xe	/* planar data to follow */
2567 #define BKTR_VRE      0x4	/* Marks the end of the even field */
2568 #define BKTR_VRO      0xC	/* Marks the end of the odd field */
2569 #define BKTR_PXV      0x0	/* valid word (never used) */
2570 #define BKTR_EOL      0x1	/* last dword, 4 bytes */
2571 #define BKTR_SOL      0x2	/* first dword */
2572 
2573 #define OP_WRITE      (0x1 << 28)
2574 #define OP_SKIP       (0x2 << 28)
2575 #define OP_WRITEC     (0x5 << 28)
2576 #define OP_JUMP	      (0x7 << 28)
2577 #define OP_SYNC	      (0x8 << 28)
2578 #define OP_WRITE123   (0x9 << 28)
2579 #define OP_WRITES123  (0xb << 28)
2580 #define OP_SOL	      (1 << 27)		/* first instr for scanline */
2581 #define OP_EOL	      (1 << 26)
2582 
2583 #define BKTR_RESYNC   (1 << 15)
2584 #define BKTR_GEN_IRQ  (1 << 24)
2585 
2586 /*
2587  * The RISC status bits can be set/cleared in the RISC programs
2588  * and tested in the Interrupt Handler
2589  */
2590 #define BKTR_SET_RISC_STATUS_BIT0 (1 << 16)
2591 #define BKTR_SET_RISC_STATUS_BIT1 (1 << 17)
2592 #define BKTR_SET_RISC_STATUS_BIT2 (1 << 18)
2593 #define BKTR_SET_RISC_STATUS_BIT3 (1 << 19)
2594 
2595 #define BKTR_CLEAR_RISC_STATUS_BIT0 (1 << 20)
2596 #define BKTR_CLEAR_RISC_STATUS_BIT1 (1 << 21)
2597 #define BKTR_CLEAR_RISC_STATUS_BIT2 (1 << 22)
2598 #define BKTR_CLEAR_RISC_STATUS_BIT3 (1 << 23)
2599 
2600 #define BKTR_TEST_RISC_STATUS_BIT0 (1 << 28)
2601 #define BKTR_TEST_RISC_STATUS_BIT1 (1 << 29)
2602 #define BKTR_TEST_RISC_STATUS_BIT2 (1 << 30)
2603 #define BKTR_TEST_RISC_STATUS_BIT3 (1U << 31)
2604 
2605 static bool_t notclipped (bktr_reg_t * bktr, int x, int width) {
2606     int i;
2607     bktr_clip_t * clip_node;
2608     bktr->clip_start = -1;
2609     bktr->last_y = 0;
2610     bktr->y = 0;
2611     bktr->y2 = width;
2612     bktr->line_length = width;
2613     bktr->yclip = -1;
2614     bktr->yclip2 = -1;
2615     bktr->current_col = 0;
2616 
2617     if (bktr->max_clip_node == 0 ) return TRUE;
2618     clip_node = (bktr_clip_t *) &bktr->clip_list[0];
2619 
2620 
2621     for (i = 0; i < bktr->max_clip_node; i++ ) {
2622 	clip_node = (bktr_clip_t *) &bktr->clip_list[i];
2623 	if (x >= clip_node->x_min && x <= clip_node->x_max  ) {
2624 	    bktr->clip_start = i;
2625 	    return FALSE;
2626 	}
2627     }
2628 
2629     return TRUE;
2630 }
2631 
2632 static bool_t getline(bktr_reg_t *bktr, int x ) {
2633     int i, j;
2634     bktr_clip_t * clip_node ;
2635 
2636     if (bktr->line_length == 0 ||
2637 	bktr->current_col >= bktr->line_length) return FALSE;
2638 
2639     bktr->y = min(bktr->last_y, bktr->line_length);
2640     bktr->y2 = bktr->line_length;
2641 
2642     bktr->yclip = bktr->yclip2 = -1;
2643     for (i = bktr->clip_start; i < bktr->max_clip_node; i++ ) {
2644 	clip_node = (bktr_clip_t *) &bktr->clip_list[i];
2645 	if (x >= clip_node->x_min && x <= clip_node->x_max) {
2646 	    if (bktr->last_y <= clip_node->y_min) {
2647 		bktr->y =      min(bktr->last_y, bktr->line_length);
2648 		bktr->y2 =     min(clip_node->y_min, bktr->line_length);
2649 		bktr->yclip =  min(clip_node->y_min, bktr->line_length);
2650 		bktr->yclip2 = min(clip_node->y_max, bktr->line_length);
2651 		bktr->last_y = bktr->yclip2;
2652 		bktr->clip_start = i;
2653 
2654 		for (j = i+1; j  < bktr->max_clip_node; j++ ) {
2655 		    clip_node = (bktr_clip_t *) &bktr->clip_list[j];
2656 		    if (x >= clip_node->x_min && x <= clip_node->x_max) {
2657 			if (bktr->last_y >= clip_node->y_min) {
2658 			    bktr->yclip2 = min(clip_node->y_max, bktr->line_length);
2659 			    bktr->last_y = bktr->yclip2;
2660 			    bktr->clip_start = j;
2661 			}
2662 		    } else break  ;
2663 		}
2664 		return TRUE;
2665 	    }
2666 	}
2667     }
2668 
2669     if (bktr->current_col <= bktr->line_length) {
2670 	bktr->current_col = bktr->line_length;
2671 	return TRUE;
2672     }
2673     return FALSE;
2674 }
2675 
2676 static bool_t split(bktr_reg_t * bktr, volatile uint32_t **dma_prog, int width ,
2677 		    u_long operation, int pixel_width,
2678 		    volatile u_char ** target_buffer, int cols ) {
2679 
2680  u_long flag, flag2;
2681  struct meteor_pixfmt *pf = &pixfmt_table[ bktr->pixfmt ].public;
2682  u_int  skip, start_skip;
2683 
2684   /*  For RGB24, we need to align the component in FIFO Byte Lane 0         */
2685   /*    to the 1st byte in the mem dword containing our start addr.         */
2686   /*    BTW, we know this pixfmt's 1st byte is Blue; thus the start addr    */
2687   /*     must be Blue.                                                      */
2688   start_skip = 0;
2689   if (( pf->type == METEOR_PIXTYPE_RGB ) && ( pf->Bpp == 3 ))
2690 	  switch ( ((uintptr_t) (volatile void *) *target_buffer) % 4 ) {
2691 	  case 2 : start_skip = 4 ; break;
2692 	  case 1 : start_skip = 8 ; break;
2693 	  }
2694 
2695  if ((width * pixel_width) < DMA_BT848_SPLIT ) {
2696      if (  width == cols) {
2697 	 flag = OP_SOL | OP_EOL;
2698        } else if (bktr->current_col == 0 ) {
2699 	    flag  = OP_SOL;
2700        } else if (bktr->current_col == cols) {
2701 	    flag = OP_EOL;
2702        } else flag = 0;
2703 
2704      skip = 0;
2705      if (( flag & OP_SOL ) && ( start_skip > 0 )) {
2706 	     *(*dma_prog)++ = OP_SKIP | OP_SOL | start_skip;
2707 	     flag &= ~OP_SOL;
2708 	     skip = start_skip;
2709      }
2710 
2711      *(*dma_prog)++ = operation | flag  | (width * pixel_width - skip);
2712      if (operation != OP_SKIP )
2713 	 *(*dma_prog)++ = (uintptr_t) (volatile void *) *target_buffer;
2714 
2715      *target_buffer += width * pixel_width;
2716      bktr->current_col += width;
2717 
2718  } else {
2719 
2720 	if (bktr->current_col == 0 && width == cols) {
2721 	    flag = OP_SOL ;
2722 	    flag2 = OP_EOL;
2723         } else if (bktr->current_col == 0 ) {
2724 	    flag = OP_SOL;
2725 	    flag2 = 0;
2726 	} else if (bktr->current_col >= cols)  {
2727 	    flag =  0;
2728 	    flag2 = OP_EOL;
2729 	} else {
2730 	    flag =  0;
2731 	    flag2 = 0;
2732 	}
2733 
2734 	skip = 0;
2735 	if (( flag & OP_SOL ) && ( start_skip > 0 )) {
2736 		*(*dma_prog)++ = OP_SKIP | OP_SOL | start_skip;
2737 		flag &= ~OP_SOL;
2738 		skip = start_skip;
2739 	}
2740 
2741 	*(*dma_prog)++ = operation  | flag |
2742 	      (width * pixel_width / 2 - skip);
2743 	if (operation != OP_SKIP )
2744 	      *(*dma_prog)++ = (uintptr_t) (volatile void *) *target_buffer ;
2745 	*target_buffer +=  (width * pixel_width / 2) ;
2746 
2747 	if ( operation == OP_WRITE )
2748 		operation = OP_WRITEC;
2749 	*(*dma_prog)++ = operation | flag2 |
2750 	    (width * pixel_width / 2);
2751 	*target_buffer +=  (width * pixel_width / 2) ;
2752 	  bktr->current_col += width;
2753 
2754     }
2755  return TRUE;
2756 }
2757 
2758 
2759 /*
2760  * Generate the RISC instructions to capture both VBI and video images
2761  */
2762 static void
2763 rgb_vbi_prog( bktr_ptr_t bktr, char i_flag, int cols, int rows, int interlace )
2764 {
2765 	int			i;
2766 	volatile uint32_t	target_buffer, buffer, target,width;
2767 	volatile uint32_t	pitch;
2768 	volatile uint32_t	*dma_prog;	/* DMA prog is an array of
2769 						32 bit RISC instructions */
2770 	volatile uint32_t	*loop_point;
2771         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
2772 	u_int                   Bpp = pf_int->public.Bpp;
2773 	unsigned int            vbisamples;     /* VBI samples per line */
2774 	unsigned int            vbilines;       /* VBI lines per field */
2775 	unsigned int            num_dwords;     /* DWORDS per line */
2776 
2777 	vbisamples = format_params[bktr->format_params].vbi_num_samples;
2778 	vbilines   = format_params[bktr->format_params].vbi_num_lines;
2779 	num_dwords = vbisamples/4;
2780 
2781 	OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt);
2782 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
2783 	OUTB(bktr, BKTR_VBI_PACK_SIZE, ((num_dwords)) & 0xff);
2784 	OUTB(bktr, BKTR_VBI_PACK_DEL, ((num_dwords)>> 8) & 0x01); /* no hdelay    */
2785 							    /* no ext frame */
2786 
2787 	OUTB(bktr, BKTR_OFORM, 0x00);
2788 
2789  	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */
2790  	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40);
2791 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */
2792 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80);
2793 
2794  	/* disable gamma correction removal */
2795  	OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA);
2796 
2797 	if (cols > 385 ) {
2798 	    OUTB(bktr, BKTR_E_VTC, 0);
2799 	    OUTB(bktr, BKTR_O_VTC, 0);
2800 	} else {
2801 	    OUTB(bktr, BKTR_E_VTC, 1);
2802 	    OUTB(bktr, BKTR_O_VTC, 1);
2803 	}
2804 	bktr->capcontrol = 3 << 2 |  3;
2805 
2806 	dma_prog = (uint32_t *) bktr->dma_prog;
2807 
2808 	/* Construct Write */
2809 
2810 	if (bktr->video.addr) {
2811 		target_buffer = (u_long) bktr->video.addr;
2812 		pitch = bktr->video.width;
2813 	}
2814 	else {
2815 		target_buffer = (u_long) vtophys(bktr->bigbuf);
2816 		pitch = cols*Bpp;
2817 	}
2818 
2819 	buffer = target_buffer;
2820 
2821 	/* Wait for the VRE sync marking the end of the Even and
2822 	 * the start of the Odd field. Resync here.
2823 	 */
2824 	*dma_prog++ = OP_SYNC | BKTR_RESYNC |BKTR_VRE;
2825 	*dma_prog++ = 0;
2826 
2827 	loop_point = dma_prog;
2828 
2829 	/* store the VBI data */
2830 	/* look for sync with packed data */
2831 	*dma_prog++ = OP_SYNC | BKTR_FM1;
2832 	*dma_prog++ = 0;
2833 	for(i = 0; i < vbilines; i++) {
2834 		*dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples;
2835 		*dma_prog++ = (u_long) vtophys((caddr_t)bktr->vbidata +
2836 					(i * VBI_LINE_SIZE));
2837 	}
2838 
2839 	if ( (i_flag == 2/*Odd*/) || (i_flag==3) /*interlaced*/ ) {
2840 		/* store the Odd field video image */
2841 		/* look for sync with packed data */
2842 		*dma_prog++ = OP_SYNC  | BKTR_FM1;
2843 		*dma_prog++ = 0;  /* NULL WORD */
2844 		width = cols;
2845 		for (i = 0; i < (rows/interlace); i++) {
2846 		    target = target_buffer;
2847 		    if ( notclipped(bktr, i, width)) {
2848 			split(bktr, (volatile uint32_t **) &dma_prog,
2849 			      bktr->y2 - bktr->y, OP_WRITE,
2850 			      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
2851 
2852 		    } else {
2853 			while(getline(bktr, i)) {
2854 			    if (bktr->y != bktr->y2 ) {
2855 				split(bktr, (volatile uint32_t **) &dma_prog,
2856 				      bktr->y2 - bktr->y, OP_WRITE,
2857 				      Bpp, (volatile u_char **)(uintptr_t)&target, cols);
2858 			    }
2859 			    if (bktr->yclip != bktr->yclip2 ) {
2860 				split(bktr,(volatile uint32_t **) &dma_prog,
2861 				      bktr->yclip2 - bktr->yclip,
2862 				      OP_SKIP,
2863 				      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
2864 			    }
2865 			}
2866 
2867 		    }
2868 
2869 		    target_buffer += interlace * pitch;
2870 
2871 		}
2872 
2873 	} /* end if */
2874 
2875 	/* Grab the Even field */
2876 	/* Look for the VRO, end of Odd field, marker */
2877 	*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
2878 	*dma_prog++ = 0;  /* NULL WORD */
2879 
2880 	/* store the VBI data */
2881 	/* look for sync with packed data */
2882 	*dma_prog++ = OP_SYNC | BKTR_FM1;
2883 	*dma_prog++ = 0;
2884 	for(i = 0; i < vbilines; i++) {
2885 		*dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples;
2886 		*dma_prog++ = (u_long) vtophys((caddr_t)bktr->vbidata +
2887 				((i+MAX_VBI_LINES) * VBI_LINE_SIZE));
2888 	}
2889 
2890 	/* store the video image */
2891 	if (i_flag == 1) /*Even Only*/
2892 	        target_buffer = buffer;
2893 	if (i_flag == 3) /*interlaced*/
2894 	        target_buffer = buffer+pitch;
2895 
2896 
2897 	if ((i_flag == 1) /*Even Only*/ || (i_flag==3) /*interlaced*/) {
2898 		/* look for sync with packed data */
2899 		*dma_prog++ = OP_SYNC | BKTR_FM1;
2900 		*dma_prog++ = 0;  /* NULL WORD */
2901 		width = cols;
2902 		for (i = 0; i < (rows/interlace); i++) {
2903 		    target = target_buffer;
2904 		    if ( notclipped(bktr, i, width)) {
2905 			split(bktr, (volatile uint32_t **) &dma_prog,
2906 			      bktr->y2 - bktr->y, OP_WRITE,
2907 			      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
2908 		    } else {
2909 			while(getline(bktr, i)) {
2910 			    if (bktr->y != bktr->y2 ) {
2911 				split(bktr, (volatile uint32_t **) &dma_prog,
2912 				      bktr->y2 - bktr->y, OP_WRITE,
2913 				      Bpp, (volatile u_char **)(uintptr_t)&target,
2914 				      cols);
2915 			    }
2916 			    if (bktr->yclip != bktr->yclip2 ) {
2917 				split(bktr, (volatile uint32_t **) &dma_prog,
2918 				      bktr->yclip2 - bktr->yclip, OP_SKIP,
2919 				      Bpp, (volatile u_char **)(uintptr_t) &target,  cols);
2920 			    }
2921 
2922 			}
2923 
2924 		    }
2925 
2926 		    target_buffer += interlace * pitch;
2927 
2928 		}
2929 	}
2930 
2931 	/* Look for end of 'Even Field' */
2932 	*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE;
2933 	*dma_prog++ = 0;  /* NULL WORD */
2934 
2935 	*dma_prog++ = OP_JUMP ;
2936 	*dma_prog++ = (u_long ) vtophys(loop_point) ;
2937 	*dma_prog++ = 0;  /* NULL WORD */
2938 
2939 }
2940 
2941 
2942 
2943 
2944 static void
2945 rgb_prog( bktr_ptr_t bktr, char i_flag, int cols, int rows, int interlace )
2946 {
2947 	int			i;
2948 	volatile uint32_t		target_buffer, buffer, target,width;
2949 	volatile uint32_t	pitch;
2950 	volatile  uint32_t	*dma_prog;
2951         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
2952 	u_int                   Bpp = pf_int->public.Bpp;
2953 
2954 	OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt);
2955 	OUTB(bktr, BKTR_VBI_PACK_SIZE, 0);
2956 	OUTB(bktr, BKTR_VBI_PACK_DEL, 0);
2957 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
2958 
2959 	OUTB(bktr, BKTR_OFORM, 0x00);
2960 
2961  	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */
2962  	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40);
2963 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */
2964 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80);
2965 
2966  	/* disable gamma correction removal */
2967 	OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA);
2968 
2969 	if (cols > 385 ) {
2970 	    OUTB(bktr, BKTR_E_VTC, 0);
2971 	    OUTB(bktr, BKTR_O_VTC, 0);
2972 	} else {
2973 	    OUTB(bktr, BKTR_E_VTC, 1);
2974 	    OUTB(bktr, BKTR_O_VTC, 1);
2975 	}
2976 	bktr->capcontrol = 3 << 2 |  3;
2977 
2978 	dma_prog = (uint32_t *) bktr->dma_prog;
2979 
2980 	/* Construct Write */
2981 
2982 	if (bktr->video.addr) {
2983 		target_buffer = (uint32_t) bktr->video.addr;
2984 		pitch = bktr->video.width;
2985 	}
2986 	else {
2987 		target_buffer = (uint32_t) vtophys(bktr->bigbuf);
2988 		pitch = cols*Bpp;
2989 	}
2990 
2991 	buffer = target_buffer;
2992 
2993 	/* contruct sync : for video packet format */
2994 	*dma_prog++ = OP_SYNC  | BKTR_RESYNC | BKTR_FM1;
2995 
2996 	/* sync, mode indicator packed data */
2997 	*dma_prog++ = 0;  /* NULL WORD */
2998 	width = cols;
2999 	for (i = 0; i < (rows/interlace); i++) {
3000 	    target = target_buffer;
3001 	    if ( notclipped(bktr, i, width)) {
3002 		split(bktr, (volatile uint32_t **) &dma_prog,
3003 		      bktr->y2 - bktr->y, OP_WRITE,
3004 		      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
3005 
3006 	    } else {
3007 		while(getline(bktr, i)) {
3008 		    if (bktr->y != bktr->y2 ) {
3009 			split(bktr, (volatile uint32_t **) &dma_prog,
3010 			      bktr->y2 - bktr->y, OP_WRITE,
3011 			      Bpp, (volatile u_char **)(uintptr_t)&target, cols);
3012 		    }
3013 		    if (bktr->yclip != bktr->yclip2 ) {
3014 			split(bktr,(volatile uint32_t **) &dma_prog,
3015 			      bktr->yclip2 - bktr->yclip,
3016 			      OP_SKIP,
3017 			      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
3018 		    }
3019 		}
3020 
3021 	    }
3022 
3023 	    target_buffer += interlace * pitch;
3024 
3025 	}
3026 
3027 	switch (i_flag) {
3028 	case 1:
3029 		/* sync vre */
3030 		*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRO;
3031 		*dma_prog++ = 0;  /* NULL WORD */
3032 
3033 		*dma_prog++ = OP_JUMP;
3034 		*dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog);
3035 		return;
3036 
3037 	case 2:
3038 		/* sync vro */
3039 		*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_VRE;
3040 		*dma_prog++ = 0;  /* NULL WORD */
3041 
3042 		*dma_prog++ = OP_JUMP;
3043 		*dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog);
3044 		return;
3045 
3046 	case 3:
3047 		/* sync vro */
3048 		*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
3049 		*dma_prog++ = 0;  /* NULL WORD */
3050 		*dma_prog++ = OP_JUMP;
3051 		*dma_prog = (uint32_t ) vtophys(bktr->odd_dma_prog);
3052 		break;
3053 	}
3054 
3055 	if (interlace == 2) {
3056 
3057 	        target_buffer = buffer + pitch;
3058 
3059 		dma_prog = (uint32_t *) bktr->odd_dma_prog;
3060 
3061 		/* sync vre IRQ bit */
3062 		*dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
3063 		*dma_prog++ = 0;  /* NULL WORD */
3064                 width = cols;
3065 		for (i = 0; i < (rows/interlace); i++) {
3066 		    target = target_buffer;
3067 		    if ( notclipped(bktr, i, width)) {
3068 			split(bktr, (volatile uint32_t **) &dma_prog,
3069 			      bktr->y2 - bktr->y, OP_WRITE,
3070 			      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
3071 		    } else {
3072 			while(getline(bktr, i)) {
3073 			    if (bktr->y != bktr->y2 ) {
3074 				split(bktr, (volatile uint32_t **) &dma_prog,
3075 				      bktr->y2 - bktr->y, OP_WRITE,
3076 				      Bpp, (volatile u_char **)(uintptr_t)&target,
3077 				      cols);
3078 			    }
3079 			    if (bktr->yclip != bktr->yclip2 ) {
3080 				split(bktr, (volatile uint32_t **) &dma_prog,
3081 				      bktr->yclip2 - bktr->yclip, OP_SKIP,
3082 				      Bpp, (volatile u_char **)(uintptr_t)&target,  cols);
3083 			    }
3084 
3085 			}
3086 
3087 		    }
3088 
3089 		    target_buffer += interlace * pitch;
3090 
3091 		}
3092 	}
3093 
3094 	/* sync vre IRQ bit */
3095 	*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE;
3096 	*dma_prog++ = 0;  /* NULL WORD */
3097 	*dma_prog++ = OP_JUMP ;
3098 	*dma_prog++ = (uint32_t ) vtophys(bktr->dma_prog) ;
3099 	*dma_prog++ = 0;  /* NULL WORD */
3100 }
3101 
3102 
3103 /*
3104  *
3105  */
3106 static void
3107 yuvpack_prog( bktr_ptr_t bktr, char i_flag,
3108 	      int cols, int rows, int interlace )
3109 {
3110 	int			i;
3111 	volatile unsigned int	inst;
3112 	volatile unsigned int	inst3;
3113 	volatile uint32_t	target_buffer, buffer;
3114 	volatile  uint32_t	*dma_prog;
3115         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
3116 	int			b;
3117 
3118 	OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt);
3119 
3120 	OUTB(bktr, BKTR_E_SCLOOP, INB(bktr, BKTR_E_SCLOOP) | BT848_E_SCLOOP_CAGC); /* enable chroma comb */
3121 	OUTB(bktr, BKTR_O_SCLOOP, INB(bktr, BKTR_O_SCLOOP) | BT848_O_SCLOOP_CAGC);
3122 
3123 	OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_RGB_DED | BT848_COLOR_CTL_GAMMA);
3124 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
3125 
3126 	bktr->capcontrol = 3 << 2 |  3;
3127 
3128 	dma_prog = (uint32_t *) bktr->dma_prog;
3129 
3130 	/* Construct Write */
3131 
3132 	/* write , sol, eol */
3133 	inst = OP_WRITE	 | OP_SOL | (cols);
3134 	/* write , sol, eol */
3135 	inst3 = OP_WRITE | OP_EOL | (cols);
3136 
3137 	if (bktr->video.addr)
3138 		target_buffer = (uint32_t) bktr->video.addr;
3139 	else
3140 		target_buffer = (uint32_t) vtophys(bktr->bigbuf);
3141 
3142 	buffer = target_buffer;
3143 
3144 	/* contruct sync : for video packet format */
3145 	/* sync, mode indicator packed data */
3146 	*dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
3147 	*dma_prog++ = 0;  /* NULL WORD */
3148 
3149 	b = cols;
3150 
3151 	for (i = 0; i < (rows/interlace); i++) {
3152 		*dma_prog++ = inst;
3153 		*dma_prog++ = target_buffer;
3154 		*dma_prog++ = inst3;
3155 		*dma_prog++ = target_buffer + b;
3156 		target_buffer += interlace*(cols * 2);
3157 	}
3158 
3159 	switch (i_flag) {
3160 	case 1:
3161 		/* sync vre */
3162 		*dma_prog++ = OP_SYNC  | BKTR_GEN_IRQ | BKTR_VRE;
3163 		*dma_prog++ = 0;  /* NULL WORD */
3164 
3165 		*dma_prog++ = OP_JUMP;
3166 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3167 		return;
3168 
3169 	case 2:
3170 		/* sync vro */
3171 		*dma_prog++ = OP_SYNC  | BKTR_GEN_IRQ | BKTR_VRO;
3172 		*dma_prog++ = 0;  /* NULL WORD */
3173 		*dma_prog++ = OP_JUMP;
3174 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3175 		return;
3176 
3177 	case 3:
3178 		/* sync vro */
3179 		*dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
3180 		*dma_prog++ = 0;  /* NULL WORD */
3181 		*dma_prog++ = OP_JUMP  ;
3182 		*dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog);
3183 		break;
3184 	}
3185 
3186 	if (interlace == 2) {
3187 
3188 		target_buffer =	 (uint32_t) buffer + cols*2;
3189 
3190 		dma_prog = (uint32_t *) bktr->odd_dma_prog;
3191 
3192 		/* sync vre */
3193 		*dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
3194 		*dma_prog++ = 0;  /* NULL WORD */
3195 
3196 		for (i = 0; i < (rows/interlace) ; i++) {
3197 			*dma_prog++ = inst;
3198 			*dma_prog++ = target_buffer;
3199 			*dma_prog++ = inst3;
3200 			*dma_prog++ = target_buffer + b;
3201 			target_buffer += interlace * ( cols*2);
3202 		}
3203 	}
3204 
3205 	/* sync vro IRQ bit */
3206 	*dma_prog++ = OP_SYNC   |  BKTR_GEN_IRQ  | BKTR_RESYNC |  BKTR_VRE;
3207 	*dma_prog++ = 0;  /* NULL WORD */
3208 	*dma_prog++ = OP_JUMP ;
3209 	*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3210 
3211 	*dma_prog++ = OP_JUMP;
3212 	*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3213 	*dma_prog++ = 0;  /* NULL WORD */
3214 }
3215 
3216 
3217 /*
3218  *
3219  */
3220 static void
3221 yuv422_prog( bktr_ptr_t bktr, char i_flag,
3222 	     int cols, int rows, int interlace ){
3223 
3224 	int			i;
3225 	volatile unsigned int	inst;
3226 	volatile uint32_t	target_buffer, t1, buffer;
3227 	volatile uint32_t	*dma_prog;
3228         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
3229 
3230 	OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt);
3231 
3232 	dma_prog = (uint32_t*) bktr->dma_prog;
3233 
3234 	bktr->capcontrol =   1 << 6 | 1 << 4 |	3;
3235 
3236 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
3237 	OUTB(bktr, BKTR_OFORM, 0x00);
3238 
3239 	OUTB(bktr, BKTR_E_CONTROL, INB(bktr, BKTR_E_CONTROL) | BT848_E_CONTROL_LDEC); /* disable luma decimation */
3240 	OUTB(bktr, BKTR_O_CONTROL, INB(bktr, BKTR_O_CONTROL) | BT848_O_CONTROL_LDEC);
3241 
3242 	OUTB(bktr, BKTR_E_SCLOOP, INB(bktr, BKTR_E_SCLOOP) | BT848_E_SCLOOP_CAGC);	/* chroma agc enable */
3243 	OUTB(bktr, BKTR_O_SCLOOP, INB(bktr, BKTR_O_SCLOOP) | BT848_O_SCLOOP_CAGC);
3244 
3245 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x80); /* clear Ycomb */
3246 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x80);
3247 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x40); /* set chroma comb */
3248 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x40);
3249 
3250 	/* disable gamma correction removal */
3251 	OUTB(bktr, BKTR_COLOR_CTL, INB(bktr, BKTR_COLOR_CTL) | BT848_COLOR_CTL_GAMMA);
3252 
3253 	/* Construct Write */
3254 	inst  = OP_WRITE123  | OP_SOL | OP_EOL |  (cols);
3255 	if (bktr->video.addr)
3256 		target_buffer = (uint32_t) bktr->video.addr;
3257 	else
3258 		target_buffer = (uint32_t) vtophys(bktr->bigbuf);
3259 
3260 	buffer = target_buffer;
3261 
3262 	t1 = buffer;
3263 
3264 	/* contruct sync : for video packet format */
3265 	*dma_prog++ = OP_SYNC  | 1 << 15 |	BKTR_FM3; /*sync, mode indicator packed data*/
3266 	*dma_prog++ = 0;  /* NULL WORD */
3267 
3268 	for (i = 0; i < (rows/interlace ) ; i++) {
3269 		*dma_prog++ = inst;
3270 		*dma_prog++ = cols/2 | cols/2 << 16;
3271 		*dma_prog++ = target_buffer;
3272 		*dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace;
3273 		*dma_prog++ = t1 + (cols*rows) + (cols*rows/2) + i*cols/2 * interlace;
3274 		target_buffer += interlace*cols;
3275 	}
3276 
3277 	switch (i_flag) {
3278 	case 1:
3279 		*dma_prog++ = OP_SYNC  | 1 << 24 | BKTR_VRE;  /*sync vre*/
3280 		*dma_prog++ = 0;  /* NULL WORD */
3281 
3282 		*dma_prog++ = OP_JUMP ;
3283 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3284 		return;
3285 
3286 	case 2:
3287 		*dma_prog++ = OP_SYNC  | 1 << 24 | BKTR_VRO;  /*sync vre*/
3288 		*dma_prog++ = 0;  /* NULL WORD */
3289 
3290 		*dma_prog++ = OP_JUMP;
3291 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3292 		return;
3293 
3294 	case 3:
3295 		*dma_prog++ = OP_SYNC	| 1 << 24 |  1 << 15 |   BKTR_VRO;
3296 		*dma_prog++ = 0;  /* NULL WORD */
3297 
3298 		*dma_prog++ = OP_JUMP  ;
3299 		*dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog);
3300 		break;
3301 	}
3302 
3303 	if (interlace == 2) {
3304 
3305 		dma_prog = (uint32_t *) bktr->odd_dma_prog;
3306 
3307 		target_buffer  = (uint32_t) buffer + cols;
3308 		t1 = buffer + cols/2;
3309 		*dma_prog++ = OP_SYNC	|   1 << 15 | BKTR_FM3;
3310 		*dma_prog++ = 0;  /* NULL WORD */
3311 
3312 		for (i = 0; i < (rows/interlace )  ; i++) {
3313 			*dma_prog++ = inst;
3314 			*dma_prog++ = cols/2 | cols/2 << 16;
3315 			*dma_prog++ = target_buffer;
3316 			*dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace;
3317 			*dma_prog++ = t1 + (cols*rows) + (cols*rows/2) + i*cols/2 * interlace;
3318 			target_buffer += interlace*cols;
3319 		}
3320 	}
3321 
3322 	*dma_prog++ = OP_SYNC  | 1 << 24 | 1 << 15 |   BKTR_VRE;
3323 	*dma_prog++ = 0;  /* NULL WORD */
3324 	*dma_prog++ = OP_JUMP ;
3325 	*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog) ;
3326 	*dma_prog++ = 0;  /* NULL WORD */
3327 }
3328 
3329 
3330 /*
3331  *
3332  */
3333 static void
3334 yuv12_prog( bktr_ptr_t bktr, char i_flag,
3335 	     int cols, int rows, int interlace ){
3336 
3337 	int			i;
3338 	volatile unsigned int	inst;
3339 	volatile unsigned int	inst1;
3340 	volatile uint32_t	target_buffer, t1, buffer;
3341 	volatile uint32_t	*dma_prog;
3342         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
3343 
3344 	OUTB(bktr, BKTR_COLOR_FMT, pf_int->color_fmt);
3345 
3346 	dma_prog = (uint32_t *) bktr->dma_prog;
3347 
3348 	bktr->capcontrol =   1 << 6 | 1 << 4 |	3;
3349 
3350 	OUTB(bktr, BKTR_ADC, SYNC_LEVEL);
3351 	OUTB(bktr, BKTR_OFORM, 0x0);
3352 
3353 	/* Construct Write */
3354  	inst  = OP_WRITE123  | OP_SOL | OP_EOL |  (cols);
3355  	inst1  = OP_WRITES123  | OP_SOL | OP_EOL |  (cols);
3356  	if (bktr->video.addr)
3357  		target_buffer = (uint32_t) bktr->video.addr;
3358  	else
3359  		target_buffer = (uint32_t) vtophys(bktr->bigbuf);
3360 
3361 	buffer = target_buffer;
3362  	t1 = buffer;
3363 
3364  	*dma_prog++ = OP_SYNC  | 1 << 15 |	BKTR_FM3; /*sync, mode indicator packed data*/
3365  	*dma_prog++ = 0;  /* NULL WORD */
3366 
3367  	for (i = 0; i < (rows/interlace )/2 ; i++) {
3368 		*dma_prog++ = inst;
3369  		*dma_prog++ = cols/2 | (cols/2 << 16);
3370  		*dma_prog++ = target_buffer;
3371  		*dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace;
3372  		*dma_prog++ = t1 + (cols*rows) + (cols*rows/4) + i*cols/2 * interlace;
3373  		target_buffer += interlace*cols;
3374  		*dma_prog++ = inst1;
3375  		*dma_prog++ = cols/2 | (cols/2 << 16);
3376  		*dma_prog++ = target_buffer;
3377  		target_buffer += interlace*cols;
3378 
3379  	}
3380 
3381  	switch (i_flag) {
3382  	case 1:
3383  		*dma_prog++ = OP_SYNC  | 1 << 24 | BKTR_VRE;  /*sync vre*/
3384  		*dma_prog++ = 0;  /* NULL WORD */
3385 
3386 		*dma_prog++ = OP_JUMP;
3387 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3388  		return;
3389 
3390  	case 2:
3391  		*dma_prog++ = OP_SYNC  | 1 << 24 | BKTR_VRO;  /*sync vro*/
3392  		*dma_prog++ = 0;  /* NULL WORD */
3393 
3394 		*dma_prog++ = OP_JUMP;
3395 		*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3396  		return;
3397 
3398  	case 3:
3399  		*dma_prog++ = OP_SYNC |  1 << 24 | 1 << 15 | BKTR_VRO;
3400 		*dma_prog++ = 0;  /* NULL WORD */
3401 		*dma_prog++ = OP_JUMP ;
3402 		*dma_prog = (uint32_t) vtophys(bktr->odd_dma_prog);
3403 		break;
3404 	}
3405 
3406 	if (interlace == 2) {
3407 
3408 		dma_prog = (uint32_t *) bktr->odd_dma_prog;
3409 
3410 		target_buffer  = (uint32_t) buffer + cols;
3411 		t1 = buffer + cols/2;
3412 		*dma_prog++ = OP_SYNC   | 1 << 15 | BKTR_FM3;
3413 		*dma_prog++ = 0;  /* NULL WORD */
3414 
3415 		for (i = 0; i < ((rows/interlace )/2 ) ; i++) {
3416 		    *dma_prog++ = inst;
3417 		    *dma_prog++ = cols/2 | (cols/2 << 16);
3418          	    *dma_prog++ = target_buffer;
3419 		    *dma_prog++ = t1 + (cols*rows) + i*cols/2 * interlace;
3420 		    *dma_prog++ = t1 + (cols*rows) + (cols*rows/4) + i*cols/2 * interlace;
3421 		    target_buffer += interlace*cols;
3422 		    *dma_prog++ = inst1;
3423 		    *dma_prog++ = cols/2 | (cols/2 << 16);
3424 		    *dma_prog++ = target_buffer;
3425 		    target_buffer += interlace*cols;
3426 
3427 		}
3428 
3429 
3430 	}
3431 
3432 	*dma_prog++ = OP_SYNC |  1 << 24 | 1 << 15 | BKTR_VRE;
3433 	*dma_prog++ = 0;  /* NULL WORD */
3434 	*dma_prog++ = OP_JUMP;
3435 	*dma_prog++ = (uint32_t) vtophys(bktr->dma_prog);
3436 	*dma_prog++ = 0;  /* NULL WORD */
3437 }
3438 
3439 
3440 
3441 /*
3442  *
3443  */
3444 static void
3445 build_dma_prog( bktr_ptr_t bktr, char i_flag )
3446 {
3447 	int			rows, cols,  interlace;
3448 	int			tmp_int;
3449 	unsigned int		temp;
3450 	struct format_params	*fp;
3451         struct meteor_pixfmt_internal *pf_int = &pixfmt_table[ bktr->pixfmt ];
3452 
3453 
3454 	fp = &format_params[bktr->format_params];
3455 
3456 	OUTL(bktr, BKTR_INT_MASK,  ALL_INTS_DISABLED);
3457 
3458 	/* disable FIFO & RISC, leave other bits alone */
3459 	OUTW(bktr, BKTR_GPIO_DMA_CTL, INW(bktr, BKTR_GPIO_DMA_CTL) & ~FIFO_RISC_ENABLED);
3460 
3461 	/* set video parameters */
3462 	if (bktr->capture_area_enabled)
3463 	  temp = ((quad_t ) fp->htotal* (quad_t) bktr->capture_area_x_size * 4096
3464 		  / fp->scaled_htotal / bktr->cols) -  4096;
3465 	else
3466 	  temp = ((quad_t ) fp->htotal* (quad_t) fp->scaled_hactive * 4096
3467 		  / fp->scaled_htotal / bktr->cols) -  4096;
3468 
3469 	/* printf("%s: HSCALE value is %d\n", bktr_name(bktr), temp); */
3470 	OUTB(bktr, BKTR_E_HSCALE_LO, temp & 0xff);
3471 	OUTB(bktr, BKTR_O_HSCALE_LO, temp & 0xff);
3472 	OUTB(bktr, BKTR_E_HSCALE_HI, (temp >> 8) & 0xff);
3473 	OUTB(bktr, BKTR_O_HSCALE_HI, (temp >> 8) & 0xff);
3474 
3475 	/* horizontal active */
3476 	temp = bktr->cols;
3477 	/* printf("%s: HACTIVE value is %d\n", bktr_name(bktr), temp); */
3478 	OUTB(bktr, BKTR_E_HACTIVE_LO, temp & 0xff);
3479 	OUTB(bktr, BKTR_O_HACTIVE_LO, temp & 0xff);
3480 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0x3);
3481 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0x3);
3482 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 8) & 0x3));
3483 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 8) & 0x3));
3484 
3485 	/* horizontal delay */
3486 	if (bktr->capture_area_enabled)
3487 	  temp = ( (fp->hdelay* fp->scaled_hactive + bktr->capture_area_x_offset* fp->scaled_htotal)
3488 		 * bktr->cols) / (bktr->capture_area_x_size * fp->hactive);
3489 	else
3490 	  temp = (fp->hdelay * bktr->cols) / fp->hactive;
3491 
3492 	temp = temp & 0x3fe;
3493 
3494 	/* printf("%s: HDELAY value is %d\n", bktr_name(bktr), temp); */
3495 	OUTB(bktr, BKTR_E_DELAY_LO, temp & 0xff);
3496 	OUTB(bktr, BKTR_O_DELAY_LO, temp & 0xff);
3497 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0xc);
3498 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0xc);
3499 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 6) & 0xc));
3500 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 6) & 0xc));
3501 
3502 	/* vertical scale */
3503 
3504 	if (bktr->capture_area_enabled) {
3505 	  if (bktr->flags  & METEOR_ONLY_ODD_FIELDS ||
3506 	      bktr->flags & METEOR_ONLY_EVEN_FIELDS)
3507 	    tmp_int = 65536 -
3508 	    (((bktr->capture_area_y_size  * 256 + (bktr->rows/2)) / bktr->rows) - 512);
3509 	  else {
3510 	    tmp_int = 65536 -
3511 	    (((bktr->capture_area_y_size * 512 + (bktr->rows / 2)) /  bktr->rows) - 512);
3512 	  }
3513 	} else {
3514 	  if (bktr->flags  & METEOR_ONLY_ODD_FIELDS ||
3515 	      bktr->flags & METEOR_ONLY_EVEN_FIELDS)
3516 	    tmp_int = 65536 -
3517 	    (((fp->vactive  * 256 + (bktr->rows/2)) / bktr->rows) - 512);
3518 	  else {
3519 	    tmp_int = 65536  -
3520 	    (((fp->vactive * 512 + (bktr->rows / 2)) /  bktr->rows) - 512);
3521 	  }
3522 	}
3523 
3524 	tmp_int &= 0x1fff;
3525 	/* printf("%s: VSCALE value is %d\n", bktr_name(bktr), tmp_int); */
3526 	OUTB(bktr, BKTR_E_VSCALE_LO, tmp_int & 0xff);
3527 	OUTB(bktr, BKTR_O_VSCALE_LO, tmp_int & 0xff);
3528 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x1f);
3529 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x1f);
3530 	OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | ((tmp_int >> 8) & 0x1f));
3531 	OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | ((tmp_int >> 8) & 0x1f));
3532 
3533 
3534 	/* vertical active */
3535 	if (bktr->capture_area_enabled)
3536 	  temp = bktr->capture_area_y_size;
3537 	else
3538 	  temp = fp->vactive;
3539 	/* printf("%s: VACTIVE is %d\n", bktr_name(bktr), temp); */
3540 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0x30);
3541 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 4) & 0x30));
3542 	OUTB(bktr, BKTR_E_VACTIVE_LO, temp & 0xff);
3543 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0x30);
3544 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 4) & 0x30));
3545 	OUTB(bktr, BKTR_O_VACTIVE_LO, temp & 0xff);
3546 
3547 	/* vertical delay */
3548 	if (bktr->capture_area_enabled)
3549 	  temp = fp->vdelay + (bktr->capture_area_y_offset);
3550 	else
3551 	  temp = fp->vdelay;
3552 	/* printf("%s: VDELAY is %d\n", bktr_name(bktr), temp); */
3553 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) & ~0xC0);
3554 	OUTB(bktr, BKTR_E_CROP, INB(bktr, BKTR_E_CROP) | ((temp >> 2) & 0xC0));
3555 	OUTB(bktr, BKTR_E_VDELAY_LO, temp & 0xff);
3556 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) & ~0xC0);
3557 	OUTB(bktr, BKTR_O_CROP, INB(bktr, BKTR_O_CROP) | ((temp >> 2) & 0xC0));
3558 	OUTB(bktr, BKTR_O_VDELAY_LO, temp & 0xff);
3559 
3560 	/* end of video params */
3561 
3562 	if ((bktr->xtal_pll_mode == BT848_USE_PLL)
3563 	   && (fp->iform_xtsel==BT848_IFORM_X_XT1)) {
3564 		OUTB(bktr, BKTR_TGCTRL, BT848_TGCTRL_TGCKI_PLL); /* Select PLL mode */
3565 	} else {
3566 		OUTB(bktr, BKTR_TGCTRL, BT848_TGCTRL_TGCKI_XTAL); /* Select Normal xtal 0/xtal 1 mode */
3567 	}
3568 
3569 	/* capture control */
3570 	switch (i_flag) {
3571 	case 1:
3572 	        bktr->bktr_cap_ctl =
3573 		    (BT848_CAP_CTL_DITH_FRAME | BT848_CAP_CTL_EVEN);
3574 		OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x20);
3575 		OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x20);
3576 		interlace = 1;
3577 		break;
3578 	 case 2:
3579  	        bktr->bktr_cap_ctl =
3580 			(BT848_CAP_CTL_DITH_FRAME | BT848_CAP_CTL_ODD);
3581 		OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) & ~0x20);
3582 		OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) & ~0x20);
3583 		interlace = 1;
3584 		break;
3585 	 default:
3586  	        bktr->bktr_cap_ctl =
3587 			(BT848_CAP_CTL_DITH_FRAME |
3588 			 BT848_CAP_CTL_EVEN | BT848_CAP_CTL_ODD);
3589 		OUTB(bktr, BKTR_E_VSCALE_HI, INB(bktr, BKTR_E_VSCALE_HI) | 0x20);
3590 		OUTB(bktr, BKTR_O_VSCALE_HI, INB(bktr, BKTR_O_VSCALE_HI) | 0x20);
3591 		interlace = 2;
3592 		break;
3593 	}
3594 
3595 	OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog));
3596 
3597 	rows = bktr->rows;
3598 	cols = bktr->cols;
3599 
3600 	bktr->vbiflags &= ~VBI_CAPTURE;	/* default - no vbi capture */
3601 
3602 	/* RGB Grabs. If /dev/vbi is already open, or we are a PAL/SECAM */
3603 	/* user, then use the rgb_vbi RISC program. */
3604 	/* Otherwise, use the normal rgb RISC program */
3605 	if (pf_int->public.type == METEOR_PIXTYPE_RGB) {
3606 		if ( (bktr->vbiflags & VBI_OPEN)
3607 		   ||(bktr->format_params == BT848_IFORM_F_PALBDGHI)
3608 		   ||(bktr->format_params == BT848_IFORM_F_SECAM)
3609                    ){
3610 			bktr->bktr_cap_ctl |=
3611 		                BT848_CAP_CTL_VBI_EVEN | BT848_CAP_CTL_VBI_ODD;
3612 			bktr->vbiflags |= VBI_CAPTURE;
3613 			rgb_vbi_prog(bktr, i_flag, cols, rows, interlace);
3614 			return;
3615 		} else {
3616 			rgb_prog(bktr, i_flag, cols, rows, interlace);
3617 			return;
3618 		}
3619 	}
3620 
3621 	if ( pf_int->public.type  == METEOR_PIXTYPE_YUV ) {
3622 		yuv422_prog(bktr, i_flag, cols, rows, interlace);
3623 		OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0)
3624 		     | pixfmt_swap_flags( bktr->pixfmt ));
3625 		return;
3626 	}
3627 
3628 	if ( pf_int->public.type  == METEOR_PIXTYPE_YUV_PACKED ) {
3629 		yuvpack_prog(bktr, i_flag, cols, rows, interlace);
3630 		OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0)
3631 		     | pixfmt_swap_flags( bktr->pixfmt ));
3632 		return;
3633 	}
3634 
3635 	if ( pf_int->public.type  == METEOR_PIXTYPE_YUV_12 ) {
3636 		yuv12_prog(bktr, i_flag, cols, rows, interlace);
3637 		OUTB(bktr, BKTR_COLOR_CTL, (INB(bktr, BKTR_COLOR_CTL) & 0xf0)
3638 		     | pixfmt_swap_flags( bktr->pixfmt ));
3639 		return;
3640 	}
3641 	return;
3642 }
3643 
3644 
3645 /******************************************************************************
3646  * video & video capture specific routines:
3647  */
3648 
3649 
3650 /*
3651  *
3652  */
3653 static void
3654 start_capture( bktr_ptr_t bktr, unsigned type )
3655 {
3656 	u_char			i_flag;
3657 	struct format_params   *fp;
3658 
3659 	fp = &format_params[bktr->format_params];
3660 
3661 	/*  If requested, clear out capture buf first  */
3662 	if (bktr->clr_on_start && (bktr->video.addr == 0)) {
3663 		bzero((caddr_t)bktr->bigbuf,
3664 		      (size_t)bktr->rows * bktr->cols * bktr->frames *
3665 			pixfmt_table[ bktr->pixfmt ].public.Bpp);
3666 	}
3667 
3668 	OUTB(bktr, BKTR_DSTATUS,  0);
3669 	OUTL(bktr, BKTR_INT_STAT, INL(bktr, BKTR_INT_STAT));
3670 
3671 	bktr->flags |= type;
3672 	bktr->flags &= ~METEOR_WANT_MASK;
3673 	switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
3674 	case METEOR_ONLY_EVEN_FIELDS:
3675 		bktr->flags |= METEOR_WANT_EVEN;
3676 		i_flag = 1;
3677 		break;
3678 	case METEOR_ONLY_ODD_FIELDS:
3679 		bktr->flags |= METEOR_WANT_ODD;
3680 		i_flag = 2;
3681 		break;
3682 	default:
3683 		bktr->flags |= METEOR_WANT_MASK;
3684 		i_flag = 3;
3685 		break;
3686 	}
3687 
3688 	/*  TDEC is only valid for continuous captures  */
3689 	if ( type == METEOR_SINGLE ) {
3690 		u_short	fps_save = bktr->fps;
3691 
3692 		set_fps(bktr, fp->frame_rate);
3693 		bktr->fps = fps_save;
3694 	}
3695 	else
3696 		set_fps(bktr, bktr->fps);
3697 
3698 	if (bktr->dma_prog_loaded == FALSE) {
3699 		build_dma_prog(bktr, i_flag);
3700 		bktr->dma_prog_loaded = TRUE;
3701 	}
3702 
3703 
3704 	OUTL(bktr, BKTR_RISC_STRT_ADD, vtophys(bktr->dma_prog));
3705 
3706 }
3707 
3708 
3709 /*
3710  * Set the temporal decimation register to get the desired frame rate.
3711  * We use the 'skip frame' modus always and always start dropping on an
3712  * odd field.
3713  */
3714 static void
3715 set_fps( bktr_ptr_t bktr, u_short fps )
3716 {
3717 	struct format_params	*fp;
3718 
3719 	fp = &format_params[bktr->format_params];
3720 
3721 	switch(bktr->flags & METEOR_ONLY_FIELDS_MASK) {
3722 	case METEOR_ONLY_EVEN_FIELDS:
3723 		bktr->flags |= METEOR_WANT_EVEN;
3724 		break;
3725 	case METEOR_ONLY_ODD_FIELDS:
3726 		bktr->flags |= METEOR_WANT_ODD;
3727 		break;
3728 	default:
3729 		bktr->flags |= METEOR_WANT_MASK;
3730 		break;
3731 	}
3732 
3733 	OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
3734 	OUTL(bktr, BKTR_INT_STAT, ALL_INTS_CLEARED);
3735 
3736 	bktr->fps = fps;
3737 	OUTB(bktr, BKTR_TDEC, 0);
3738 
3739 	if (fps < fp->frame_rate)
3740 		OUTB(bktr, BKTR_TDEC, (fp->frame_rate - fps) & 0x3f);
3741 	else
3742 		OUTB(bktr, BKTR_TDEC, 0);
3743 	return;
3744 
3745 }
3746 
3747 
3748 
3749 
3750 
3751 /*
3752  * Given a pixfmt index, compute the bt848 swap_flags necessary to
3753  *   achieve the specified swapping.
3754  * Note that without bt swapping, 2Bpp and 3Bpp modes are written
3755  *   byte-swapped, and 4Bpp modes are byte and word swapped (see Table 6
3756  *   and read R->L).
3757  * Note also that for 3Bpp, we may additionally need to do some creative
3758  *   SKIPing to align the FIFO bytelines with the target buffer (see split()).
3759  * This is abstracted here: e.g. no swaps = RGBA; byte & short swap = ABGR
3760  *   as one would expect.
3761  */
3762 
3763 static u_int pixfmt_swap_flags( int pixfmt )
3764 {
3765 	struct meteor_pixfmt *pf = &pixfmt_table[ pixfmt ].public;
3766 	u_int		      swapf = 0;
3767 
3768 	switch ( pf->Bpp ) {
3769 	case 2 : swapf = ( pf->swap_bytes ? 0 : BSWAP );
3770 		 break;
3771 
3772 	case 3 : /* no swaps supported for 3bpp - makes no sense w/ bt848 */
3773 		 break;
3774 
3775 	case 4 : if ( pf->swap_bytes )
3776 			swapf = pf->swap_shorts ? 0 : WSWAP;
3777 		 else
3778 			swapf = pf->swap_shorts ? BSWAP : (BSWAP | WSWAP);
3779 		 break;
3780 	}
3781 	return swapf;
3782 }
3783 
3784 
3785 
3786 /*
3787  * Converts meteor-defined pixel formats (e.g. METEOR_GEO_RGB16) into
3788  *   our pixfmt_table indices.
3789  */
3790 
3791 static int oformat_meteor_to_bt( u_long format )
3792 {
3793 	int    i;
3794         struct meteor_pixfmt *pf1, *pf2;
3795 
3796 	/*  Find format in compatibility table  */
3797 	for ( i = 0; i < METEOR_PIXFMT_TABLE_SIZE; i++ )
3798 		if ( meteor_pixfmt_table[i].meteor_format == format )
3799 			break;
3800 
3801 	if ( i >= METEOR_PIXFMT_TABLE_SIZE )
3802 		return -1;
3803 	pf1 = &meteor_pixfmt_table[i].public;
3804 
3805 	/*  Match it with an entry in master pixel format table  */
3806 	for ( i = 0; i < PIXFMT_TABLE_SIZE; i++ ) {
3807 		pf2 = &pixfmt_table[i].public;
3808 
3809 		if (( pf1->type        == pf2->type        ) &&
3810 		    ( pf1->Bpp         == pf2->Bpp         ) &&
3811 		    !bcmp( pf1->masks, pf2->masks, sizeof( pf1->masks )) &&
3812 		    ( pf1->swap_bytes  == pf2->swap_bytes  ) &&
3813 		    ( pf1->swap_shorts == pf2->swap_shorts ))
3814 			break;
3815 	}
3816 	if ( i >= PIXFMT_TABLE_SIZE )
3817 		return -1;
3818 
3819 	return i;
3820 }
3821 
3822 /******************************************************************************
3823  * i2c primitives:
3824  */
3825 
3826 /* */
3827 #define I2CBITTIME		(0x5<<4)	/* 5 * 0.48uS */
3828 #define I2CBITTIME_878              (1 << 7)
3829 #define I2C_READ		0x01
3830 #define I2C_COMMAND		(I2CBITTIME |			\
3831 				 BT848_DATA_CTL_I2CSCL |	\
3832 				 BT848_DATA_CTL_I2CSDA)
3833 
3834 #define I2C_COMMAND_878		(I2CBITTIME_878 |			\
3835 				 BT848_DATA_CTL_I2CSCL |	\
3836 				 BT848_DATA_CTL_I2CSDA)
3837 
3838 /* Select between old i2c code and new iicbus / smbus code */
3839 #if defined(BKTR_USE_FREEBSD_SMBUS)
3840 
3841 /*
3842  * The hardware interface is actually SMB commands
3843  */
3844 int
3845 i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 )
3846 {
3847 	char cmd;
3848 
3849 	if (bktr->id == BROOKTREE_848  ||
3850 	    bktr->id == BROOKTREE_848A ||
3851 	    bktr->id == BROOKTREE_849A)
3852 		cmd = I2C_COMMAND;
3853 	else
3854 		cmd = I2C_COMMAND_878;
3855 
3856 	if (byte2 != -1) {
3857 		if (smbus_writew(bktr->i2c_sc.smbus, addr, cmd,
3858 			(short)(((byte2 & 0xff) << 8) | (byte1 & 0xff))))
3859 			return (-1);
3860 	} else {
3861 		if (smbus_writeb(bktr->i2c_sc.smbus, addr, cmd,
3862 			(char)(byte1 & 0xff)))
3863 			return (-1);
3864 	}
3865 
3866 	/* return OK */
3867 	return( 0 );
3868 }
3869 
3870 int
3871 i2cRead( bktr_ptr_t bktr, int addr )
3872 {
3873 	char result;
3874 	char cmd;
3875 
3876 	if (bktr->id == BROOKTREE_848  ||
3877 	    bktr->id == BROOKTREE_848A ||
3878 	    bktr->id == BROOKTREE_849A)
3879 		cmd = I2C_COMMAND;
3880 	else
3881 		cmd = I2C_COMMAND_878;
3882 
3883 	if (smbus_readb(bktr->i2c_sc.smbus, addr, cmd, &result))
3884 		return (-1);
3885 
3886 	return ((int)((unsigned char)result));
3887 }
3888 
3889 #define IICBUS(bktr) ((bktr)->i2c_sc.iicbb)
3890 
3891 /* The MSP34xx and DPL35xx Audio chip require i2c bus writes of up */
3892 /* to 5 bytes which the bt848 automated i2c bus controller cannot handle */
3893 /* Therefore we need low level control of the i2c bus hardware */
3894 
3895 /* Write to the MSP or DPL registers */
3896 void
3897 msp_dpl_write(bktr_ptr_t bktr, int i2c_addr,  unsigned char dev, unsigned int addr, unsigned int data)
3898 {
3899 	unsigned char addr_l, addr_h, data_h, data_l ;
3900 
3901 	addr_h = (addr >>8) & 0xff;
3902 	addr_l = addr & 0xff;
3903 	data_h = (data >>8) & 0xff;
3904 	data_l = data & 0xff;
3905 
3906 	iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */);
3907 
3908 	iicbus_write_byte(IICBUS(bktr), dev, 0);
3909 	iicbus_write_byte(IICBUS(bktr), addr_h, 0);
3910 	iicbus_write_byte(IICBUS(bktr), addr_l, 0);
3911 	iicbus_write_byte(IICBUS(bktr), data_h, 0);
3912 	iicbus_write_byte(IICBUS(bktr), data_l, 0);
3913 
3914 	iicbus_stop(IICBUS(bktr));
3915 
3916 	return;
3917 }
3918 
3919 /* Read from the MSP or DPL registers */
3920 unsigned int
3921 msp_dpl_read(bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr)
3922 {
3923 	unsigned int data;
3924 	unsigned char addr_l, addr_h, dev_r;
3925 	int read;
3926 	u_char data_read[2];
3927 
3928 	addr_h = (addr >>8) & 0xff;
3929 	addr_l = addr & 0xff;
3930 	dev_r = dev+1;
3931 
3932 	/* XXX errors ignored */
3933 	iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */);
3934 
3935 	iicbus_write_byte(IICBUS(bktr), dev_r, 0);
3936 	iicbus_write_byte(IICBUS(bktr), addr_h, 0);
3937 	iicbus_write_byte(IICBUS(bktr), addr_l, 0);
3938 
3939 	iicbus_repeated_start(IICBUS(bktr), i2c_addr +1, 0 /* no timeout? */);
3940 	iicbus_read(IICBUS(bktr), data_read, 2, &read, IIC_LAST_READ, 0);
3941 	iicbus_stop(IICBUS(bktr));
3942 
3943 	data = (data_read[0]<<8) | data_read[1];
3944 
3945 	return (data);
3946 }
3947 
3948 /* Reset the MSP or DPL chip */
3949 /* The user can block the reset (which is handy if you initialise the
3950  * MSP and/or DPL audio in another operating system first (eg in Windows)
3951  */
3952 void
3953 msp_dpl_reset( bktr_ptr_t bktr, int i2c_addr )
3954 {
3955 
3956 #ifndef BKTR_NO_MSP_RESET
3957 	/* put into reset mode */
3958 	iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */);
3959 	iicbus_write_byte(IICBUS(bktr), 0x00, 0);
3960 	iicbus_write_byte(IICBUS(bktr), 0x80, 0);
3961 	iicbus_write_byte(IICBUS(bktr), 0x00, 0);
3962 	iicbus_stop(IICBUS(bktr));
3963 
3964 	/* put back to operational mode */
3965 	iicbus_start(IICBUS(bktr), i2c_addr, 0 /* no timeout? */);
3966 	iicbus_write_byte(IICBUS(bktr), 0x00, 0);
3967 	iicbus_write_byte(IICBUS(bktr), 0x00, 0);
3968 	iicbus_write_byte(IICBUS(bktr), 0x00, 0);
3969 	iicbus_stop(IICBUS(bktr));
3970 #endif
3971 	return;
3972 }
3973 
3974 static void remote_read(bktr_ptr_t bktr, struct bktr_remote *remote) {
3975 	int read;
3976 
3977 	/* XXX errors ignored */
3978 	iicbus_start(IICBUS(bktr), bktr->remote_control_addr, 0 /* no timeout? */);
3979 	iicbus_read(IICBUS(bktr),  remote->data, 3, &read, IIC_LAST_READ, 0);
3980 	iicbus_stop(IICBUS(bktr));
3981 
3982 	return;
3983 }
3984 
3985 #else /* defined(BKTR_USE_FREEBSD_SMBUS) */
3986 
3987 /*
3988  * Program the i2c bus directly
3989  */
3990 int
3991 i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 )
3992 {
3993 	u_long		x;
3994 	u_long		data;
3995 
3996 	/* clear status bits */
3997 	OUTL(bktr, BKTR_INT_STAT, BT848_INT_RACK | BT848_INT_I2CDONE);
3998 
3999 	/* build the command datum */
4000 	if (bktr->id == BROOKTREE_848  ||
4001 	    bktr->id == BROOKTREE_848A ||
4002 	    bktr->id == BROOKTREE_849A) {
4003 	  data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND;
4004 	} else {
4005 	  data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND_878;
4006 	}
4007 	if ( byte2 != -1 ) {
4008 		data |= ((byte2 & 0xff) << 8);
4009 		data |= BT848_DATA_CTL_I2CW3B;
4010 	}
4011 
4012 	/* write the address and data */
4013 	OUTL(bktr, BKTR_I2C_DATA_CTL, data);
4014 
4015 	/* wait for completion */
4016 	for ( x = 0x7fffffff; x; --x ) {	/* safety valve */
4017 		if ( INL(bktr, BKTR_INT_STAT) & BT848_INT_I2CDONE )
4018 			break;
4019 	}
4020 
4021 	/* check for ACK */
4022 	if ( !x || !(INL(bktr, BKTR_INT_STAT) & BT848_INT_RACK) )
4023 		return( -1 );
4024 
4025 	/* return OK */
4026 	return( 0 );
4027 }
4028 
4029 
4030 /*
4031  *
4032  */
4033 int
4034 i2cRead( bktr_ptr_t bktr, int addr )
4035 {
4036 	u_long		x;
4037 
4038 	/* clear status bits */
4039 	OUTL(bktr, BKTR_INT_STAT, BT848_INT_RACK | BT848_INT_I2CDONE);
4040 
4041 	/* write the READ address */
4042 	/* The Bt878 and Bt879  differed on the treatment of i2c commands */
4043 
4044 	if (bktr->id == BROOKTREE_848  ||
4045 	    bktr->id == BROOKTREE_848A ||
4046 	    bktr->id == BROOKTREE_849A) {
4047 		OUTL(bktr, BKTR_I2C_DATA_CTL, ((addr & 0xff) << 24) | I2C_COMMAND);
4048 	} else {
4049 		OUTL(bktr, BKTR_I2C_DATA_CTL, ((addr & 0xff) << 24) | I2C_COMMAND_878);
4050 	}
4051 
4052 	/* wait for completion */
4053 	for ( x = 0x7fffffff; x; --x ) {	/* safety valve */
4054 		if ( INL(bktr, BKTR_INT_STAT) & BT848_INT_I2CDONE )
4055 			break;
4056 	}
4057 
4058 	/* check for ACK */
4059 	if ( !x || !(INL(bktr, BKTR_INT_STAT) & BT848_INT_RACK) )
4060 		return( -1 );
4061 
4062 	/* it was a read */
4063 	return( (INL(bktr, BKTR_I2C_DATA_CTL) >> 8) & 0xff );
4064 }
4065 
4066 /* The MSP34xx Audio chip require i2c bus writes of up to 5 bytes which the */
4067 /* bt848 automated i2c bus controller cannot handle */
4068 /* Therefore we need low level control of the i2c bus hardware */
4069 /* Idea for the following functions are from elsewhere in this driver and */
4070 /* from the Linux BTTV i2c driver by Gerd Knorr <[email protected]> */
4071 
4072 #define BITD    40
4073 static void i2c_start( bktr_ptr_t bktr) {
4074         OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD ); /* release data */
4075         OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* release clock */
4076         OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD ); /* lower data */
4077         OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD ); /* lower clock */
4078 }
4079 
4080 static void i2c_stop( bktr_ptr_t bktr) {
4081         OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD ); /* lower clock & data */
4082         OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD ); /* release clock */
4083         OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* release data */
4084 }
4085 
4086 static int i2c_write_byte( bktr_ptr_t bktr, unsigned char data) {
4087         int x;
4088         int status;
4089 
4090         /* write out the byte */
4091         for ( x = 7; x >= 0; --x ) {
4092                 if ( data & (1<<x) ) {
4093 			OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4094                         DELAY( BITD );          /* assert HI data */
4095 			OUTL(bktr, BKTR_I2C_DATA_CTL, 3);
4096                         DELAY( BITD );          /* strobe clock */
4097 			OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4098                         DELAY( BITD );          /* release clock */
4099                 }
4100                 else {
4101 			OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4102                         DELAY( BITD );          /* assert LO data */
4103 			OUTL(bktr, BKTR_I2C_DATA_CTL, 2);
4104                         DELAY( BITD );          /* strobe clock */
4105 			OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4106                         DELAY( BITD );          /* release clock */
4107                 }
4108         }
4109 
4110         /* look for an ACK */
4111 	OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD ); /* float data */
4112 	OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD ); /* strobe clock */
4113         status = INL(bktr, BKTR_I2C_DATA_CTL) & 1;       /* read the ACK bit */
4114         OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD ); /* release clock */
4115 
4116         return( status );
4117 }
4118 
4119 static int i2c_read_byte( bktr_ptr_t bktr, unsigned char *data, int last ) {
4120         int x;
4121         int bit;
4122         int byte = 0;
4123 
4124         /* read in the byte */
4125 	OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4126         DELAY( BITD );                          /* float data */
4127         for ( x = 7; x >= 0; --x ) {
4128 		OUTL(bktr, BKTR_I2C_DATA_CTL, 3);
4129                 DELAY( BITD );                  /* strobe clock */
4130                 bit = INL(bktr, BKTR_I2C_DATA_CTL) & 1;  /* read the data bit */
4131                 if ( bit ) byte |= (1<<x);
4132 		OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4133                 DELAY( BITD );                  /* release clock */
4134         }
4135         /* After reading the byte, send an ACK */
4136         /* (unless that was the last byte, for which we send a NAK */
4137         if (last) { /* send NAK - same a writing a 1 */
4138 		OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4139                 DELAY( BITD );                  /* set data bit */
4140 		OUTL(bktr, BKTR_I2C_DATA_CTL, 3);
4141                 DELAY( BITD );                  /* strobe clock */
4142 		OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4143                 DELAY( BITD );                  /* release clock */
4144         } else { /* send ACK - same as writing a 0 */
4145 		OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4146                 DELAY( BITD );                  /* set data bit */
4147 		OUTL(bktr, BKTR_I2C_DATA_CTL, 2);
4148                 DELAY( BITD );                  /* strobe clock */
4149 		OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4150                 DELAY( BITD );                  /* release clock */
4151         }
4152 
4153         *data=byte;
4154 	return 0;
4155 }
4156 #undef BITD
4157 
4158 /* Write to the MSP or DPL registers */
4159 void msp_dpl_write( bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr,
4160 		    unsigned int data){
4161 	unsigned int msp_w_addr = i2c_addr;
4162 	unsigned char addr_l, addr_h, data_h, data_l ;
4163 	addr_h = (addr >>8) & 0xff;
4164 	addr_l = addr & 0xff;
4165 	data_h = (data >>8) & 0xff;
4166 	data_l = data & 0xff;
4167 
4168 	i2c_start(bktr);
4169 	i2c_write_byte(bktr, msp_w_addr);
4170 	i2c_write_byte(bktr, dev);
4171 	i2c_write_byte(bktr, addr_h);
4172 	i2c_write_byte(bktr, addr_l);
4173 	i2c_write_byte(bktr, data_h);
4174 	i2c_write_byte(bktr, data_l);
4175 	i2c_stop(bktr);
4176 }
4177 
4178 /* Read from the MSP or DPL registers */
4179 unsigned int msp_dpl_read(bktr_ptr_t bktr, int i2c_addr, unsigned char dev, unsigned int addr){
4180 	unsigned int data;
4181 	unsigned char addr_l, addr_h, data_1, data_2, dev_r ;
4182 	addr_h = (addr >>8) & 0xff;
4183 	addr_l = addr & 0xff;
4184 	dev_r = dev+1;
4185 
4186 	i2c_start(bktr);
4187 	i2c_write_byte(bktr,i2c_addr);
4188 	i2c_write_byte(bktr,dev_r);
4189 	i2c_write_byte(bktr,addr_h);
4190 	i2c_write_byte(bktr,addr_l);
4191 
4192 	i2c_start(bktr);
4193 	i2c_write_byte(bktr,i2c_addr+1);
4194 	i2c_read_byte(bktr,&data_1, 0);
4195 	i2c_read_byte(bktr,&data_2, 1);
4196 	i2c_stop(bktr);
4197 	data = (data_1<<8) | data_2;
4198 	return data;
4199 }
4200 
4201 /* Reset the MSP or DPL chip */
4202 /* The user can block the reset (which is handy if you initialise the
4203  * MSP audio in another operating system first (eg in Windows)
4204  */
4205 void msp_dpl_reset( bktr_ptr_t bktr, int i2c_addr ) {
4206 
4207 #ifndef BKTR_NO_MSP_RESET
4208 	/* put into reset mode */
4209 	i2c_start(bktr);
4210 	i2c_write_byte(bktr, i2c_addr);
4211 	i2c_write_byte(bktr, 0x00);
4212 	i2c_write_byte(bktr, 0x80);
4213 	i2c_write_byte(bktr, 0x00);
4214 	i2c_stop(bktr);
4215 
4216 	/* put back to operational mode */
4217 	i2c_start(bktr);
4218 	i2c_write_byte(bktr, i2c_addr);
4219 	i2c_write_byte(bktr, 0x00);
4220 	i2c_write_byte(bktr, 0x00);
4221 	i2c_write_byte(bktr, 0x00);
4222 	i2c_stop(bktr);
4223 #endif
4224 	return;
4225 
4226 }
4227 
4228 static void remote_read(bktr_ptr_t bktr, struct bktr_remote *remote) {
4229 
4230 	/* XXX errors ignored */
4231 	i2c_start(bktr);
4232 	i2c_write_byte(bktr,bktr->remote_control_addr);
4233 	i2c_read_byte(bktr,&(remote->data[0]), 0);
4234 	i2c_read_byte(bktr,&(remote->data[1]), 0);
4235 	i2c_read_byte(bktr,&(remote->data[2]), 0);
4236 	i2c_stop(bktr);
4237 
4238 	return;
4239 }
4240 
4241 #endif /* defined(BKTR_USE_FREEBSD_SMBUS) */
4242 
4243 
4244 #if defined( I2C_SOFTWARE_PROBE )
4245 
4246 /*
4247  * we are keeping this around for any parts that we need to probe
4248  * but that CANNOT be probed via an i2c read.
4249  * this is necessary because the hardware i2c mechanism
4250  * cannot be programmed for 1 byte writes.
4251  * currently there are no known i2c parts that we need to probe
4252  * and that cannot be safely read.
4253  */
4254 static int	i2cProbe( bktr_ptr_t bktr, int addr );
4255 #define BITD		40
4256 #define EXTRA_START
4257 
4258 /*
4259  * probe for an I2C device at addr.
4260  */
4261 static int
4262 i2cProbe( bktr_ptr_t bktr, int addr )
4263 {
4264 	int		x, status;
4265 
4266 	/* the START */
4267 #if defined( EXTRA_START )
4268 	OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD );	/* release data */
4269 	OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD );	/* release clock */
4270 #endif /* EXTRA_START */
4271 	OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD );	/* lower data */
4272 	OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD );	/* lower clock */
4273 
4274 	/* write addr */
4275 	for ( x = 7; x >= 0; --x ) {
4276 		if ( addr & (1<<x) ) {
4277 			OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4278 			DELAY( BITD );		/* assert HI data */
4279 			OUTL(bktr, BKTR_I2C_DATA_CTL, 3);
4280 			DELAY( BITD );		/* strobe clock */
4281 			OUTL(bktr, BKTR_I2C_DATA_CTL, 1);
4282 			DELAY( BITD );		/* release clock */
4283 		}
4284 		else {
4285 			OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4286 			DELAY( BITD );		/* assert LO data */
4287 			OUTL(bktr, BKTR_I2C_DATA_CTL, 2);
4288 			DELAY( BITD );		/* strobe clock */
4289 			OUTL(bktr, BKTR_I2C_DATA_CTL, 0);
4290 			DELAY( BITD );		/* release clock */
4291 		}
4292 	}
4293 
4294 	/* look for an ACK */
4295 	OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD );	/* float data */
4296 	OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD );	/* strobe clock */
4297 	status = INL(bktr, BKTR_I2C_DATA_CTL) & 1;	/* read the ACK bit */
4298 	OUTL(bktr, BKTR_I2C_DATA_CTL, 1); DELAY( BITD );	/* release clock */
4299 
4300 	/* the STOP */
4301 	OUTL(bktr, BKTR_I2C_DATA_CTL, 0); DELAY( BITD );	/* lower clock & data */
4302 	OUTL(bktr, BKTR_I2C_DATA_CTL, 2); DELAY( BITD );	/* release clock */
4303 	OUTL(bktr, BKTR_I2C_DATA_CTL, 3); DELAY( BITD );	/* release data */
4304 
4305 	return( status );
4306 }
4307 #undef EXTRA_START
4308 #undef BITD
4309 
4310 #endif /* I2C_SOFTWARE_PROBE */
4311 
4312 
4313 #define ABSENT		(-1)
4314 
4315 #endif /* FreeBSD, BSDI, NetBSD, OpenBSD */
4316 
4317