bttv-driver.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:79k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.     bttv - Bt848 frame grabber driver
  3.     Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
  4.                            & Marcus Metzler (mocm@thp.uni-koeln.de)
  5.     (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <linux/version.h>
  19. #include <linux/module.h>
  20. #include <linux/delay.h>
  21. #include <linux/errno.h>
  22. #include <linux/fs.h>
  23. #include <linux/kernel.h>
  24. #include <linux/major.h>
  25. #include <linux/slab.h>
  26. #include <linux/mm.h>
  27. #include <linux/poll.h>
  28. #include <linux/pci.h>
  29. #include <linux/signal.h>
  30. #include <asm/io.h>
  31. #include <linux/ioport.h>
  32. #include <asm/pgtable.h>
  33. #include <asm/page.h>
  34. #include <linux/sched.h>
  35. #include <linux/types.h>
  36. #include <linux/wrapper.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/kmod.h>
  39. #include <linux/vmalloc.h>
  40. #include <linux/init.h>
  41. #include <linux/pagemap.h>
  42. #include "bttvp.h"
  43. #include "tuner.h"
  44. #define DEBUG(x) /* Debug driver */
  45. #define MIN(a,b) (((a)>(b))?(b):(a))
  46. #define MAX(a,b) (((a)>(b))?(a):(b))
  47. static void bt848_set_risc_jmps(struct bttv *btv, int state);
  48. int bttv_num; /* number of Bt848s in use */
  49. struct bttv bttvs[BTTV_MAX];
  50. /* configuration variables */
  51. #if defined(__sparc__) || defined(__powerpc__) || defined(__hppa__)
  52. static unsigned int bigendian=1;
  53. #else
  54. static unsigned int bigendian=0;
  55. #endif
  56. static unsigned int radio[BTTV_MAX];
  57. static unsigned int fieldnr = 0;
  58. static unsigned int irq_debug = 0;
  59. static unsigned int gbuffers = 4;
  60. static unsigned int gbufsize = BTTV_MAX_FBUF;
  61. static int latency = -1;
  62. static unsigned int combfilter = 0;
  63. static unsigned int lumafilter = 0;
  64. static unsigned int automute = 1;
  65. static unsigned int chroma_agc = 0;
  66. static unsigned int adc_crush = 1;
  67. static int video_nr = -1;
  68. static int radio_nr = -1;
  69. static int vbi_nr = -1;
  70. unsigned int bttv_debug = 0;
  71. unsigned int bttv_verbose = 1;
  72. unsigned int bttv_gpio = 0;
  73. /* insmod options */
  74. MODULE_PARM(radio,"1-" __stringify(BTTV_MAX) "i");
  75. MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
  76. MODULE_PARM(bigendian,"i");
  77. MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
  78. MODULE_PARM(fieldnr,"i");
  79. MODULE_PARM_DESC(fieldnr,"count fields, default is 0 (no)");
  80. MODULE_PARM(bttv_verbose,"i");
  81. MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
  82. MODULE_PARM(bttv_gpio,"i");
  83. MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
  84. MODULE_PARM(bttv_debug,"i");
  85. MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
  86. MODULE_PARM(irq_debug,"i");
  87. MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
  88. MODULE_PARM(gbuffers,"i");
  89. MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (64 max)");
  90. MODULE_PARM(gbufsize,"i");
  91. MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
  92. MODULE_PARM(latency,"i");
  93. MODULE_PARM_DESC(latency,"pci latency timer");
  94. MODULE_PARM(combfilter,"i");
  95. MODULE_PARM(lumafilter,"i");
  96. MODULE_PARM(automute,"i");
  97. MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
  98. MODULE_PARM(chroma_agc,"i");
  99. MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
  100. MODULE_PARM(adc_crush,"i");
  101. MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
  102. MODULE_PARM(video_nr,"i");
  103. MODULE_PARM(radio_nr,"i");
  104. MODULE_PARM(vbi_nr,"i");
  105. MODULE_DESCRIPTION("bttv - v4l driver module for bt848/878 based cards");
  106. MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
  107. MODULE_LICENSE("GPL");
  108. /* kernel args */
  109. #ifndef MODULE
  110. static int __init p_radio(char *str) { return bttv_parse(str,BTTV_MAX,radio); }
  111. __setup("bttv.radio=", p_radio);
  112. #endif
  113. #define I2C_TIMING (0x7<<4)
  114. #define I2C_DELAY   10
  115. #define I2C_SET(CTRL,DATA) 
  116.     { btwrite((CTRL<<1)|(DATA), BT848_I2C); udelay(I2C_DELAY); }
  117. #define I2C_GET()   (btread(BT848_I2C)&1)
  118. #define BURSTOFFSET 76
  119. #define BTTV_ERRORS 5
  120. /*******************************/
  121. /* Memory management functions */
  122. /*******************************/
  123. static inline unsigned long kvirt_to_bus(unsigned long adr) 
  124. {
  125.         unsigned long kva;
  126. kva = (unsigned long)page_address(vmalloc_to_page((void *)adr));
  127. kva |= adr & (PAGE_SIZE-1); /* restore the offset */   
  128. return virt_to_bus((void *)kva);
  129. }
  130. /* Here we want the physical address of the memory.
  131.  * This is used when initializing the contents of the
  132.  * area and marking the pages as reserved.
  133.  */
  134. static inline unsigned long kvirt_to_pa(unsigned long adr) 
  135. {
  136.         unsigned long kva;
  137. kva = (unsigned long)page_address(vmalloc_to_page((void *)adr));
  138. kva |= adr & (PAGE_SIZE-1); /* restore the offset */
  139. return __pa(kva);
  140. }
  141. static void * rvmalloc(signed long size)
  142. {
  143. struct page *page;
  144. void * mem;
  145. unsigned long adr;
  146. mem=vmalloc_32(size);
  147. if (NULL == mem)
  148. printk(KERN_INFO "bttv: vmalloc_32(%ld) failedn",size);
  149. else {
  150. /* Clear the ram out, no junk to the user */
  151. memset(mem, 0, size);
  152.         adr=(unsigned long) mem;
  153. while (size > 0) {
  154. page = vmalloc_to_page((void *)adr);
  155. mem_map_reserve(page);
  156. adr+=PAGE_SIZE;
  157. size-=PAGE_SIZE;
  158. }
  159. }
  160. return mem;
  161. }
  162. static void rvfree(void * mem, signed long size)
  163. {
  164. struct page *page;
  165.         unsigned long adr;
  166.         
  167. if (mem) {
  168.         adr=(unsigned long) mem;
  169. while (size > 0) {
  170. page = vmalloc_to_page((void *)adr);
  171. mem_map_unreserve(page);
  172. adr+=PAGE_SIZE;
  173. size-=PAGE_SIZE;
  174. }
  175. vfree(mem);
  176. }
  177. }
  178. /*
  179.  * Create the giant waste of buffer space we need for now
  180.  * until we get DMA to user space sorted out (probably 2.3.x)
  181.  *
  182.  * We only create this as and when someone uses mmap
  183.  */
  184.  
  185. static int fbuffer_alloc(struct bttv *btv)
  186. {
  187. if(!btv->fbuffer)
  188. btv->fbuffer=(unsigned char *) rvmalloc(gbuffers*gbufsize);
  189. else
  190. printk(KERN_ERR "bttv%d: Double alloc of fbuffer!n",
  191. btv->nr);
  192. if(!btv->fbuffer)
  193. return -ENOBUFS;
  194. return 0;
  195. }
  196. /* ----------------------------------------------------------------------- */
  197. void bttv_gpio_tracking(struct bttv *btv, char *comment)
  198. {
  199. unsigned int outbits, data;
  200. outbits = btread(BT848_GPIO_OUT_EN);
  201. data    = btread(BT848_GPIO_DATA);
  202. printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]n",
  203.        btv->nr,outbits,data & outbits, data & ~outbits, comment);
  204. }
  205. static char *audio_modes[] = { "audio: tuner", "audio: radio", "audio: extern",
  206.        "audio: intern", "audio: off" };
  207. static void audio(struct bttv *btv, int mode)
  208. {
  209. if (bttv_tvcards[btv->type].gpiomask)
  210. btaor(bttv_tvcards[btv->type].gpiomask,
  211.       ~bttv_tvcards[btv->type].gpiomask,
  212.       BT848_GPIO_OUT_EN);
  213. switch (mode)
  214. {
  215.         case AUDIO_MUTE:
  216.                         btv->audio|=AUDIO_MUTE;
  217. break;
  218.   case AUDIO_UNMUTE:
  219. btv->audio&=~AUDIO_MUTE;
  220. mode=btv->audio;
  221. break;
  222. case AUDIO_OFF:
  223. mode=AUDIO_OFF;
  224. break;
  225. case AUDIO_ON:
  226. mode=btv->audio;
  227. break;
  228. default:
  229. btv->audio&=AUDIO_MUTE;
  230. btv->audio|=mode;
  231. break;
  232. }
  233.         /* if audio mute or not in H-lock, turn audio off */
  234. if ((btv->audio&AUDIO_MUTE))
  235.         mode=AUDIO_OFF;
  236.         if ((mode == AUDIO_TUNER) && (btv->radio))
  237. mode = AUDIO_RADIO;
  238. if (bttv_tvcards[btv->type].gpiomask)
  239. btaor(bttv_tvcards[btv->type].audiomux[mode],
  240.       ~bttv_tvcards[btv->type].gpiomask,
  241.       BT848_GPIO_DATA);
  242. if (bttv_gpio)
  243. bttv_gpio_tracking(btv,audio_modes[mode]);
  244. if (!in_interrupt())
  245. bttv_call_i2c_clients(btv,AUDC_SET_INPUT,&(mode));
  246. }
  247. static inline void bt848_dma(struct bttv *btv, uint state)
  248. {
  249. if (state)
  250. btor(3, BT848_GPIO_DMA_CTL);
  251. else
  252. btand(~3, BT848_GPIO_DMA_CTL);
  253. }
  254. /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC*/
  255. /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C 
  256.    PLL_X = Reference pre-divider (0=1, 1=2) 
  257.    PLL_C = Post divider (0=6, 1=4)
  258.    PLL_I = Integer input 
  259.    PLL_F = Fractional input 
  260.    
  261.    F_input = 28.636363 MHz: 
  262.    PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
  263. */
  264. static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
  265. {
  266.         unsigned char fl, fh, fi;
  267.         
  268.         /* prevent overflows */
  269.         fin/=4;
  270.         fout/=4;
  271.         fout*=12;
  272.         fi=fout/fin;
  273.         fout=(fout%fin)*256;
  274.         fh=fout/fin;
  275.         fout=(fout%fin)*256;
  276.         fl=fout/fin;
  277.         /*printk("0x%02x 0x%02x 0x%02xn", fi, fh, fl);*/
  278.         btwrite(fl, BT848_PLL_F_LO);
  279.         btwrite(fh, BT848_PLL_F_HI);
  280.         btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
  281. }
  282. static int set_pll(struct bttv *btv)
  283. {
  284.         int i;
  285. unsigned long tv;
  286.         if (!btv->pll.pll_crystal)
  287.                 return 0;
  288.         if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
  289.                 /* no PLL needed */
  290.                 if (btv->pll.pll_current == 0) {
  291.                         /* printk ("bttv%d: PLL: is offn",btv->nr); */
  292.                         return 0;
  293.                 }
  294. if (bttv_verbose)
  295. printk ("bttv%d: PLL: switching offn",btv->nr);
  296.                 btwrite(0x00,BT848_TGCTRL);
  297.                 btwrite(0x00,BT848_PLL_XCI);
  298.                 btv->pll.pll_current = 0;
  299.                 return 0;
  300.         }
  301.         if (btv->pll.pll_ofreq == btv->pll.pll_current) {
  302.                 /* printk("bttv%d: PLL: no change requiredn",btv->nr); */
  303.                 return 1;
  304.         }
  305.         if (bttv_verbose)
  306. printk("bttv%d: PLL: %d => %d ... ",btv->nr,
  307.        btv->pll.pll_ifreq, btv->pll.pll_ofreq);
  308. set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
  309. /*  Let other people run while the PLL stabilizes */
  310. tv=jiffies+HZ/10;       /* .1 seconds */
  311. do
  312. {
  313. schedule();
  314. }
  315. while(time_before(jiffies,tv));
  316.         for (i=0; i<100; i++) 
  317.         {
  318.                 if ((btread(BT848_DSTATUS)&BT848_DSTATUS_PLOCK))
  319.                         btwrite(0,BT848_DSTATUS);
  320.                 else
  321.                 {
  322.                         btwrite(0x08,BT848_TGCTRL);
  323.                         btv->pll.pll_current = btv->pll.pll_ofreq;
  324. if (bttv_verbose)
  325. printk("okn");
  326.                         return 1;
  327.                 }
  328.                 mdelay(10);
  329.         }
  330.         btv->pll.pll_current = 0;
  331. if (bttv_verbose)
  332. printk("oopsn");
  333.         return -1;
  334. }
  335. static void bt848_muxsel(struct bttv *btv, unsigned int input)
  336. {
  337.         /* needed by RemoteVideo MX */
  338. if (bttv_tvcards[btv->type].gpiomask2)
  339. btaor(bttv_tvcards[btv->type].gpiomask2,
  340.       ~bttv_tvcards[btv->type].gpiomask2,
  341.       BT848_GPIO_OUT_EN);
  342. /* This seems to get rid of some synchronization problems */
  343. btand(~(3<<5), BT848_IFORM);
  344. mdelay(10);
  345. input %= bttv_tvcards[btv->type].video_inputs;
  346. if (input==bttv_tvcards[btv->type].svhs)
  347. {
  348. btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
  349. btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
  350. }
  351. else
  352. {
  353. btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
  354. btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
  355. }
  356. btaor((bttv_tvcards[btv->type].muxsel[input]&3)<<5, ~(3<<5), BT848_IFORM);
  357. audio(btv, (input!=bttv_tvcards[btv->type].tuner) ?
  358.               AUDIO_EXTERN : AUDIO_TUNER);
  359. if (bttv_tvcards[btv->type].gpiomask2)
  360. btaor(bttv_tvcards[btv->type].muxsel[input]>>4,
  361.       ~bttv_tvcards[btv->type].gpiomask2,
  362.       BT848_GPIO_DATA);
  363. /* card specific hook */
  364. if (bttv_tvcards[btv->type].muxsel_hook)
  365. bttv_tvcards[btv->type].muxsel_hook(btv, input);
  366. if (bttv_gpio)
  367. bttv_gpio_tracking(btv,"muxsel");
  368. }
  369. struct tvnorm
  370. {
  371.         u32 Fsc;
  372.         u16 swidth, sheight; /* scaled standard width, height */
  373. u16 totalwidth;
  374. u8 adelay, bdelay, iform;
  375. u32 scaledtwidth;
  376. u16 hdelayx1, hactivex1;
  377. u16 vdelay;
  378.         u8 vbipack;
  379. };
  380. static struct tvnorm tvnorms[] = {
  381. /* PAL-BDGHI */
  382.         /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
  383.   /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
  384.         { 35468950,
  385.           924, 576, 1135, 0x7f, 0x72, (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
  386.           1135, 186, 924,
  387. #ifdef VIDEODAT_HACK
  388.   VBI_MAXLINES*2,
  389. #else
  390.   0x20,
  391. #endif
  392.   255},
  393. /* NTSC */
  394. { 28636363,
  395.           768, 480,  910, 0x68, 0x5d, (BT848_IFORM_NTSC|BT848_IFORM_XT0),
  396.           910, 128, 910, 0x1a, 144},
  397. #if 0
  398. /* SECAM EAST */
  399. { 35468950, 
  400.           768, 576, 1135, 0x7f, 0xb0, (BT848_IFORM_SECAM|BT848_IFORM_XT1),
  401.   944, 186, 922, 0x20, 255},
  402. #else
  403. /* SECAM L */
  404.         { 35468950,
  405.           924, 576, 1135, 0x7f, 0xb0, (BT848_IFORM_SECAM|BT848_IFORM_XT1),
  406.           1135, 186, 922, 0x20, 255},
  407. #endif
  408.         /* PAL-NC */
  409.         { 28636363,
  410.           640, 576,  910, 0x68, 0x5d, (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
  411.           780, 130, 734, 0x1a, 144},
  412. /* PAL-M */
  413. { 28636363, 
  414.           640, 480, 910, 0x68, 0x5d, (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
  415.   780, 135, 754, 0x1a, 144},
  416. /* PAL-N */
  417. { 35468950, 
  418.           768, 576, 1135, 0x7f, 0x72, (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
  419.   944, 186, 922, 0x20, 144},
  420. /* NTSC-Japan */
  421. { 28636363,
  422.           640, 480,  910, 0x68, 0x5d, (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
  423.   780, 135, 754, 0x16, 144},
  424. };
  425. #define TVNORMS (sizeof(tvnorms)/sizeof(tvnorm))
  426. #define VBI_SPL 2044
  427. /* RISC command to write one VBI data line */
  428. #define VBI_RISC BT848_RISC_WRITE|VBI_SPL|BT848_RISC_EOL|BT848_RISC_SOL
  429. static void make_vbitab(struct bttv *btv)
  430. {
  431. int i;
  432. unsigned int *po=(unsigned int *) btv->vbi_odd;
  433. unsigned int *pe=(unsigned int *) btv->vbi_even;
  434.   
  435. if (bttv_debug > 1)
  436. printk("bttv%d: vbi1: po=%08lx pe=%08lxn",
  437.        btv->nr,virt_to_bus(po), virt_to_bus(pe));
  438.         
  439. *(po++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1); *(po++)=0;
  440. for (i=0; i<VBI_MAXLINES; i++) 
  441. {
  442. *(po++)=cpu_to_le32(VBI_RISC);
  443. *(po++)=cpu_to_le32(kvirt_to_bus((unsigned long)btv->vbibuf+i*2048));
  444. }
  445. *(po++)=cpu_to_le32(BT848_RISC_JUMP);
  446. *(po++)=cpu_to_le32(virt_to_bus(btv->risc_jmp+4));
  447. *(pe++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1); *(pe++)=0;
  448. for (i=VBI_MAXLINES; i<VBI_MAXLINES*2; i++) 
  449. {
  450. *(pe++)=cpu_to_le32(VBI_RISC);
  451. *(pe++)=cpu_to_le32(kvirt_to_bus((unsigned long)btv->vbibuf+i*2048));
  452. }
  453. *(pe++)=cpu_to_le32(BT848_RISC_JUMP|BT848_RISC_IRQ|(0x01<<16));
  454. *(pe++)=cpu_to_le32(virt_to_bus(btv->risc_jmp+10));
  455. if (bttv_debug > 1)
  456. printk("bttv%d: vbi2: po=%08lx pe=%08lxn",
  457.        btv->nr,virt_to_bus(po), virt_to_bus(pe));
  458. }
  459. static int fmtbppx2[16] = {
  460.         8, 6, 4, 4, 4, 3, 2, 2, 4, 3, 0, 0, 0, 0, 2, 0 
  461. };
  462. static int palette2fmt[] = {
  463. 0,
  464. BT848_COLOR_FMT_Y8,
  465. BT848_COLOR_FMT_RGB8,
  466. BT848_COLOR_FMT_RGB16,
  467. BT848_COLOR_FMT_RGB24,
  468. BT848_COLOR_FMT_RGB32,
  469. BT848_COLOR_FMT_RGB15,
  470. BT848_COLOR_FMT_YUY2,
  471. BT848_COLOR_FMT_YUY2,
  472. -1,
  473. -1,
  474. -1,
  475. BT848_COLOR_FMT_RAW,
  476. BT848_COLOR_FMT_YCrCb422,
  477. BT848_COLOR_FMT_YCrCb411,
  478. BT848_COLOR_FMT_YCrCb422,
  479. BT848_COLOR_FMT_YCrCb411,
  480. };
  481. #define PALETTEFMT_MAX (sizeof(palette2fmt)/sizeof(int))
  482. static int make_rawrisctab(struct bttv *btv, unsigned int *ro,
  483.    unsigned int *re, unsigned int *vbuf)
  484. {
  485.         unsigned long line;
  486. unsigned long bpl=1024; /* bytes per line */
  487. unsigned long vadr=(unsigned long) vbuf;
  488. *(ro++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1); 
  489.         *(ro++)=cpu_to_le32(0);
  490. *(re++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1);
  491.         *(re++)=cpu_to_le32(0);
  492.   
  493.         /* In PAL 650 blocks of 256 DWORDs are sampled, but only if VDELAY
  494.            is 2 and without separate VBI grabbing.
  495.            We'll have to handle this inside the IRQ handler ... */
  496. for (line=0; line < 640; line++)
  497. {
  498.                 *(ro++)=cpu_to_le32(BT848_RISC_WRITE|bpl|BT848_RISC_SOL|BT848_RISC_EOL);
  499.                 *(ro++)=cpu_to_le32(kvirt_to_bus(vadr));
  500.                 *(re++)=cpu_to_le32(BT848_RISC_WRITE|bpl|BT848_RISC_SOL|BT848_RISC_EOL);
  501.                 *(re++)=cpu_to_le32(kvirt_to_bus(vadr+gbufsize/2));
  502.                 vadr+=bpl;
  503. }
  504. *(ro++)=cpu_to_le32(BT848_RISC_JUMP);
  505. *(ro++)=cpu_to_le32(btv->bus_vbi_even);
  506. *(re++)=cpu_to_le32(BT848_RISC_JUMP|BT848_RISC_IRQ|(2<<16));
  507. *(re++)=cpu_to_le32(btv->bus_vbi_odd);
  508. return 0;
  509. }
  510. static int  make_prisctab(struct bttv *btv, unsigned int *ro,
  511.                           unsigned int *re, 
  512.                           unsigned int *vbuf, unsigned short width,
  513.                           unsigned short height, unsigned short fmt)
  514. {
  515.         unsigned long line, lmask;
  516. unsigned long bl, blcr, blcb, rcmd;
  517. unsigned long todo;
  518. unsigned int **rp;
  519. int inter;
  520. unsigned long cbadr, cradr;
  521. unsigned long vadr=(unsigned long) vbuf;
  522. int shift, csize;
  523. if (bttv_debug > 1)
  524. printk("bttv%d: prisc1: ro=%08lx re=%08lxn",
  525.        btv->nr,virt_to_bus(ro), virt_to_bus(re));
  526. switch(fmt)
  527. {
  528.         case VIDEO_PALETTE_YUV422P:
  529.                 csize=(width*height)>>1;
  530.                 shift=1;
  531.                 lmask=0;
  532.                 break;
  533.                 
  534.         case VIDEO_PALETTE_YUV411P:
  535.                 csize=(width*height)>>2;
  536.                 shift=2;
  537.                 lmask=0;
  538.                 break;
  539.  
  540.  case VIDEO_PALETTE_YUV420P:
  541.                 csize=(width*height)>>2;
  542.                 shift=1;
  543.                 lmask=1;
  544.                 break;
  545.                 
  546.  case VIDEO_PALETTE_YUV410P:
  547.                 csize=(width*height)>>4;
  548.                 shift=2;
  549.                 lmask=3;
  550.                 break;
  551.                 
  552.         default:
  553.                 return -1;
  554. }
  555. cbadr=vadr+(width*height);
  556. cradr=cbadr+csize;
  557. inter = (height>tvnorms[btv->win.norm].sheight/2) ? 1 : 0;
  558. *(ro++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM3);
  559.         *(ro++)=0;
  560. *(re++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM3);
  561.         *(re++)=0;
  562.   
  563. for (line=0; line < (height<<(1^inter)); line++)
  564. {
  565. if(line==height)
  566. {
  567. vadr+=csize<<1;
  568. cbadr=vadr+(width*height);
  569. cradr=cbadr+csize;
  570. }
  571.         if (inter) 
  572.         rp= (line&1) ? &re : &ro;
  573. else 
  574.                 rp= (line>=height) ? &ro : &re; 
  575.                 
  576.         if(line&lmask)
  577.          rcmd=BT848_RISC_WRITE1S23|BT848_RISC_SOL;
  578.         else
  579.          rcmd=BT848_RISC_WRITE123|BT848_RISC_SOL;
  580.         todo=width;
  581. while(todo)
  582. {
  583.                  bl=PAGE_SIZE-((PAGE_SIZE-1)&vadr);
  584.                  blcr=(PAGE_SIZE-((PAGE_SIZE-1)&cradr))<<shift;
  585.  blcb=(PAGE_SIZE-((PAGE_SIZE-1)&cbadr))<<shift;
  586.  bl=(blcr<bl) ? blcr : bl;
  587.  bl=(blcb<bl) ? blcb : bl;
  588.  bl=(bl>todo) ? todo : bl;
  589.  blcr=bl>>shift;
  590.  blcb=blcr;
  591.  /* bl now containts the longest row that can be written */
  592.  todo-=bl;
  593.  if(!todo) rcmd|=BT848_RISC_EOL; /* if this is the last EOL */
  594.  
  595.  *((*rp)++)=cpu_to_le32(rcmd|bl);
  596.  *((*rp)++)=cpu_to_le32(blcb|(blcr<<16));
  597.  *((*rp)++)=cpu_to_le32(kvirt_to_bus(vadr));
  598.  vadr+=bl;
  599.  if((rcmd&(15<<28))==BT848_RISC_WRITE123)
  600.  {
  601.   *((*rp)++)=cpu_to_le32(kvirt_to_bus(cbadr));
  602.   cbadr+=blcb;
  603.   *((*rp)++)=cpu_to_le32(kvirt_to_bus(cradr));
  604.   cradr+=blcr;
  605.  }
  606.  
  607.  rcmd&=~BT848_RISC_SOL; /* only the first has SOL */
  608. }
  609. }
  610. *(ro++)=cpu_to_le32(BT848_RISC_JUMP);
  611. *(ro++)=cpu_to_le32(btv->bus_vbi_even);
  612. *(re++)=cpu_to_le32(BT848_RISC_JUMP|BT848_RISC_IRQ|(2<<16));
  613. *(re++)=cpu_to_le32(btv->bus_vbi_odd);
  614. if (bttv_debug > 1)
  615. printk("bttv%d: prisc2: ro=%08lx re=%08lxn",
  616.        btv->nr,virt_to_bus(ro), virt_to_bus(re));
  617. return 0;
  618. }
  619.  
  620. static int  make_vrisctab(struct bttv *btv, unsigned int *ro,
  621.                           unsigned int *re, 
  622.                           unsigned int *vbuf, unsigned short width,
  623.                           unsigned short height, unsigned short palette)
  624. {
  625.         unsigned long line;
  626. unsigned long bpl;  /* bytes per line */
  627. unsigned long bl;
  628. unsigned long todo;
  629. unsigned int **rp;
  630. int inter;
  631. unsigned long vadr=(unsigned long) vbuf;
  632.         if (palette==VIDEO_PALETTE_RAW) 
  633.                 return make_rawrisctab(btv, ro, re, vbuf);
  634.         if (palette>=VIDEO_PALETTE_PLANAR)
  635.                 return make_prisctab(btv, ro, re, vbuf, width, height, palette);
  636. if (bttv_debug > 1)
  637. printk("bttv%d: vrisc1: ro=%08lx re=%08lxn",
  638.        btv->nr,virt_to_bus(ro), virt_to_bus(re));
  639. inter = (height>tvnorms[btv->win.norm].sheight/2) ? 1 : 0;
  640. bpl=width*fmtbppx2[palette2fmt[palette]&0xf]/2;
  641. *(ro++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1); 
  642.         *(ro++)=cpu_to_le32(0);
  643. *(re++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1);
  644.         *(re++)=cpu_to_le32(0);
  645.   
  646. for (line=0; line < (height<<(1^inter)); line++)
  647. {
  648.         if (inter) 
  649.         rp= (line&1) ? &re : &ro;
  650. else 
  651.                 rp= (line>=height) ? &ro : &re; 
  652. bl=PAGE_SIZE-((PAGE_SIZE-1)&vadr);
  653. if (bpl<=bl)
  654.                 {
  655.         *((*rp)++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL|
  656.         BT848_RISC_EOL|bpl); 
  657. *((*rp)++)=cpu_to_le32(kvirt_to_bus(vadr));
  658. vadr+=bpl;
  659. }
  660. else
  661. {
  662.         todo=bpl;
  663.         *((*rp)++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL|bl);
  664. *((*rp)++)=cpu_to_le32(kvirt_to_bus(vadr));
  665. vadr+=bl;
  666. todo-=bl;
  667. while (todo>PAGE_SIZE)
  668. {
  669.         *((*rp)++)=cpu_to_le32(BT848_RISC_WRITE|PAGE_SIZE);
  670. *((*rp)++)=cpu_to_le32(kvirt_to_bus(vadr));
  671. vadr+=PAGE_SIZE;
  672. todo-=PAGE_SIZE;
  673. }
  674. *((*rp)++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_EOL|todo);
  675. *((*rp)++)=cpu_to_le32(kvirt_to_bus(vadr));
  676. vadr+=todo;
  677. }
  678. }
  679. *(ro++)=cpu_to_le32(BT848_RISC_JUMP);
  680. *(ro++)=cpu_to_le32(btv->bus_vbi_even);
  681. *(re++)=cpu_to_le32(BT848_RISC_JUMP|BT848_RISC_IRQ|(2<<16));
  682. *(re++)=cpu_to_le32(btv->bus_vbi_odd);
  683. if (bttv_debug > 1)
  684. printk("bttv%d: vrisc2: ro=%08lx re=%08lxn",
  685.        btv->nr,virt_to_bus(ro), virt_to_bus(re));
  686. return 0;
  687. }
  688. static unsigned char lmaskt[8] = 
  689. { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80};
  690. static unsigned char rmaskt[8] = 
  691. { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
  692. static void clip_draw_rectangle(unsigned char *clipmap, int x, int y, int w, int h)
  693. {
  694.         unsigned char lmask, rmask, *p;
  695.         int W, l, r;
  696. int i;
  697. if (bttv_debug > 1)
  698. printk("bttv clip: %dx%d+%d+%dn",w,h,x,y);
  699. /* bitmap is fixed width, 128 bytes (1024 pixels represented) */
  700.         if (x<0)
  701.         {
  702.                 w+=x;
  703.                 x=0;
  704.         }
  705.         if (y<0)
  706.         {
  707.                 h+=y;
  708.                 y=0;
  709.         }
  710. if (w < 0 || h < 0) /* catch bad clips */
  711. return;
  712. /* out of range data should just fall through */
  713.         if (y+h>=625)
  714.                 h=625-y;
  715.         if (x+w>=1024)
  716.                 w=1024-x;
  717.         l=x>>3;
  718.         r=(x+w-1)>>3;
  719.         W=r-l-1;
  720.         lmask=lmaskt[x&7];
  721.         rmask=rmaskt[(x+w-1)&7];
  722.         p=clipmap+128*y+l;
  723.         
  724.         if (W>0) 
  725.         {
  726.                 for (i=0; i<h; i++, p+=128) 
  727.                 {
  728.                         *p|=lmask;
  729.                         memset(p+1, 0xff, W);
  730.                         p[W+1]|=rmask;
  731.                 }
  732.         } else if (!W) {
  733.                 for (i=0; i<h; i++, p+=128) 
  734.                 {
  735.                         p[0]|=lmask;
  736.                         p[1]|=rmask;
  737.                 }
  738.         } else {
  739.                 for (i=0; i<h; i++, p+=128) 
  740.                         p[0]|=lmask&rmask;
  741.         }
  742.                
  743. }
  744. static void make_clip_tab(struct bttv *btv, struct video_clip *cr, int ncr)
  745. {
  746. int i, line, x, y, bpl, width, height, inter, maxw;
  747. unsigned int bpp, dx, sx, **rp, *ro, *re, flags, len;
  748. unsigned long adr;
  749. unsigned char *clipmap, *clipline, cbit, lastbit, outofmem;
  750. /* take care: bpp != btv->win.bpp is allowed here */
  751. bpp = fmtbppx2[btv->win.color_fmt&0xf]/2;
  752. bpl=btv->win.bpl;
  753. adr=btv->win.vidadr + btv->win.x * btv->win.bpp + btv->win.y * bpl;
  754. inter=(btv->win.interlace&1)^1;
  755. width=btv->win.width;
  756. height=btv->win.height;
  757. if (bttv_debug > 1)
  758. printk("bttv%d: clip1: pal=%d size=%dx%d, bpl=%d bpp=%dn",
  759.        btv->nr,btv->picture.palette,width,height,bpl,bpp);
  760. if(width > 1023)
  761. width = 1023; /* sanity check */
  762. if(height > 625)
  763. height = 625; /* sanity check */
  764. ro=btv->risc_scr_odd;
  765. re=btv->risc_scr_even;
  766. if (bttv_debug)
  767. printk("bttv%d: clip: ro=%08lx re=%08lxn",
  768.        btv->nr,virt_to_bus(ro), virt_to_bus(re));
  769. if ((clipmap=vmalloc(VIDEO_CLIPMAP_SIZE))==NULL) {
  770. /* can't clip, don't generate any risc code */
  771. *(ro++)=cpu_to_le32(BT848_RISC_JUMP);
  772. *(ro++)=cpu_to_le32(btv->bus_vbi_even);
  773. *(re++)=cpu_to_le32(BT848_RISC_JUMP);
  774. *(re++)=cpu_to_le32(btv->bus_vbi_odd);
  775. }
  776. if (ncr < 0) { /* bitmap was pased */
  777. memcpy(clipmap, (unsigned char *)cr, VIDEO_CLIPMAP_SIZE);
  778. } else { /* convert rectangular clips to a bitmap */
  779. memset(clipmap, 0, VIDEO_CLIPMAP_SIZE); /* clear map */
  780. for (i=0; i<ncr; i++)
  781. clip_draw_rectangle(clipmap, cr[i].x, cr[i].y,
  782. cr[i].width, cr[i].height);
  783. }
  784. /* clip against viewing window AND screen 
  785.    so we do not have to rely on the user program
  786.  */
  787. maxw = (bpl - btv->win.x * btv->win.bpp) / bpp;
  788. clip_draw_rectangle(clipmap, (width > maxw) ? maxw : width,
  789.     0, 1024, 768);
  790. clip_draw_rectangle(clipmap,0,(btv->win.y+height>btv->win.sheight) ?
  791.     (btv->win.sheight-btv->win.y) : height,1024,768);
  792. if (btv->win.x<0)
  793. clip_draw_rectangle(clipmap, 0, 0, -(btv->win.x), 768);
  794. if (btv->win.y<0)
  795. clip_draw_rectangle(clipmap, 0, 0, 1024, -(btv->win.y));
  796. *(ro++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1);
  797.         *(ro++)=cpu_to_le32(0);
  798. *(re++)=cpu_to_le32(BT848_RISC_SYNC|BT848_FIFO_STATUS_FM1);
  799.         *(re++)=cpu_to_le32(0);
  800. /* translate bitmap to risc code */
  801.         for (line=outofmem=0; line < (height<<inter) && !outofmem; line++)
  802.         {
  803. y = line>>inter;
  804. rp= (line&1) ? &re : &ro;
  805. clipline = clipmap + (y<<7); /* running pointers ... */
  806. lastbit = *clipline & 1;
  807. for(x=dx=0,sx=0; x<=width && !outofmem;) {
  808. if (0 == (x&7)) {
  809. /* check bytes not bits if we can ... */
  810. if (lastbit) {
  811. while (0xff==*clipline && x<width-8) {
  812. x  += 8;
  813. dx += 8;
  814. clipline++;
  815. }
  816. } else {
  817. while (0x00==*clipline && x<width-8) {
  818. x  += 8;
  819. dx += 8;
  820. clipline++;
  821. }
  822. }
  823. }
  824. cbit = *clipline & (1<<(x&7));
  825. if (x < width && !lastbit == !cbit) {
  826. dx++;
  827. } else {
  828. /* generate the dma controller code */
  829. len = dx * bpp;
  830. flags = ((bpp==4) ? BT848_RISC_BYTE3 : 0);
  831. flags |= ((!sx) ? BT848_RISC_SOL : 0);
  832. flags |= ((sx + dx == width) ? BT848_RISC_EOL : 0);
  833. if (!lastbit) {
  834. *((*rp)++)=cpu_to_le32(BT848_RISC_WRITE|flags|len);
  835. *((*rp)++)=cpu_to_le32(adr + bpp * sx);
  836. } else {
  837. *((*rp)++)=cpu_to_le32(BT848_RISC_SKIP|flags|len);
  838. }
  839. lastbit=cbit;
  840. sx += dx;
  841. dx = 1;
  842. if (ro - btv->risc_scr_odd>(RISCMEM_LEN>>3) - 16)
  843. outofmem++;
  844. if (re - btv->risc_scr_even>(RISCMEM_LEN>>3) - 16)
  845. outofmem++;
  846. }
  847. x++;
  848. if (0 == (x&7))
  849. clipline++;
  850. }
  851. if ((!inter)||(line&1))
  852.                         adr+=bpl;
  853. }
  854. vfree(clipmap);
  855. /* outofmem flag relies on the following code to discard extra data */
  856. *(ro++)=cpu_to_le32(BT848_RISC_JUMP);
  857. *(ro++)=cpu_to_le32(btv->bus_vbi_even);
  858. *(re++)=cpu_to_le32(BT848_RISC_JUMP);
  859. *(re++)=cpu_to_le32(btv->bus_vbi_odd);
  860. if (bttv_debug > 1)
  861. printk("bttv%d: clip2: pal=%d size=%dx%d, bpl=%d bpp=%dn",
  862.        btv->nr,btv->picture.palette,width,height,bpl,bpp);
  863. }
  864. /*
  865.  * Set the registers for the size we have specified. Don't bother
  866.  * trying to understand this without the BT848 manual in front of
  867.  * you [AC]. 
  868.  *
  869.  * PS: The manual is free for download in .pdf format from 
  870.  * www.brooktree.com - nicely done those folks.
  871.  */
  872.  
  873. static inline void bt848_set_eogeo(struct bttv *btv, struct tvnorm *tvn,
  874.    int odd, int width, int height)
  875. {
  876.         u16 vscale, hscale;
  877. u32 xsf, sr;
  878. u16 hdelay;
  879. u8 crop, vtc;
  880. int inter = (height>tvn->sheight/2) ? 0 : 1;
  881.         int off = odd ? 0x80 : 0x00;
  882. xsf = (width*tvn->scaledtwidth)/tvn->swidth;
  883. hscale = ((tvn->totalwidth*4096UL)/xsf-4096);
  884. hdelay =  tvn->hdelayx1;
  885. hdelay =  (hdelay*width)/tvn->swidth;
  886. hdelay &= 0x3fe;
  887. sr=((tvn->sheight>>inter)*512)/height-512;
  888. vscale=(0x10000UL-sr)&0x1fff;
  889. crop=((width>>8)&0x03)|((hdelay>>6)&0x0c)|
  890. ((tvn->sheight>>4)&0x30)|((tvn->vdelay>>2)&0xc0);
  891. vscale |= inter ? (BT848_VSCALE_INT<<8) : 0;
  892. if (combfilter) {
  893. /* Some people say interpolation looks bad ... */
  894. vtc = (width < 193) ? 2 : ((width < 385) ? 1 : 0);
  895. if (width < 769)
  896. btor(BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
  897. else
  898. btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
  899. } else {
  900. vtc = 0;
  901. btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
  902. }
  903. btwrite(vtc, BT848_E_VTC+off);
  904. btwrite(hscale>>8, BT848_E_HSCALE_HI+off);
  905. btwrite(hscale&0xff, BT848_E_HSCALE_LO+off);
  906. btaor((vscale>>8), 0xe0, BT848_E_VSCALE_HI+off);
  907. btwrite(vscale&0xff, BT848_E_VSCALE_LO+off);
  908. btwrite(width&0xff, BT848_E_HACTIVE_LO+off);
  909. btwrite(hdelay&0xff, BT848_E_HDELAY_LO+off);
  910. btwrite(tvn->sheight&0xff, BT848_E_VACTIVE_LO+off);
  911. btwrite(tvn->vdelay&0xff, BT848_E_VDELAY_LO+off);
  912. btwrite(crop, BT848_E_CROP+off);
  913. }
  914. static void bt848_set_geo(struct bttv *btv)
  915. {
  916. u16 ewidth, eheight, owidth, oheight;
  917. u16 format, bswap;
  918. struct tvnorm *tvn;
  919. tvn=&tvnorms[btv->win.norm];
  920. btwrite(tvn->adelay, BT848_ADELAY);
  921. btwrite(tvn->bdelay, BT848_BDELAY);
  922. btaor(tvn->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH), BT848_IFORM);
  923. btwrite(tvn->vbipack, BT848_VBI_PACK_SIZE);
  924. btwrite(1, BT848_VBI_PACK_DEL);
  925.         btv->pll.pll_ofreq = tvn->Fsc;
  926. if (!in_interrupt())
  927. set_pll(btv);
  928. btv->win.interlace = (btv->win.height>tvn->sheight/2) ? 1 : 0;
  929. if (0 == btv->risc_cap_odd &&
  930.     0 == btv->risc_cap_even) {
  931. /* overlay only */
  932. owidth  = btv->win.width;
  933. oheight = btv->win.height;
  934. ewidth  = btv->win.width;
  935. eheight = btv->win.height;
  936. format  = btv->win.color_fmt;
  937. bswap   = btv->fb_color_ctl;
  938. } else if (-1 != btv->gq_grab      &&
  939.    0  == btv->risc_cap_odd &&
  940.    !btv->win.interlace     &&
  941.    btv->scr_on) {
  942. /* odd field -> overlay, even field -> capture */
  943. owidth  = btv->win.width;
  944. oheight = btv->win.height;
  945. ewidth  = btv->gbuf[btv->gq_grab].width;
  946. eheight = btv->gbuf[btv->gq_grab].height;
  947. format  = (btv->win.color_fmt & 0xf0) |
  948. (btv->gbuf[btv->gq_grab].fmt & 0x0f);
  949. bswap   = btv->fb_color_ctl & 0x0a;
  950. } else {
  951. /* capture only */
  952. owidth  = btv->gbuf[btv->gq_grab].width;
  953. oheight = btv->gbuf[btv->gq_grab].height;
  954. ewidth  = btv->gbuf[btv->gq_grab].width;
  955. eheight = btv->gbuf[btv->gq_grab].height;
  956. format  = btv->gbuf[btv->gq_grab].fmt;
  957. bswap   = 0;
  958. }
  959. /* program odd + even fields */
  960. bt848_set_eogeo(btv, tvn, 1, owidth, oheight);
  961. bt848_set_eogeo(btv, tvn, 0, ewidth, eheight);
  962. btwrite(format, BT848_COLOR_FMT);
  963. btwrite(bswap | BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
  964. }
  965. static int bpp2fmt[4] = {
  966.         BT848_COLOR_FMT_RGB8, BT848_COLOR_FMT_RGB16,
  967.         BT848_COLOR_FMT_RGB24, BT848_COLOR_FMT_RGB32 
  968. };
  969. static void bt848_set_winsize(struct bttv *btv)
  970. {
  971.         unsigned short format;
  972. if (btv->picture.palette > 0 && btv->picture.palette <= VIDEO_PALETTE_YUV422) {
  973. /* format set by VIDIOCSPICT */
  974. format = palette2fmt[btv->picture.palette];
  975. } else {
  976. /* use default for the given color depth */
  977. format = (btv->win.depth==15) ? BT848_COLOR_FMT_RGB15 :
  978. bpp2fmt[(btv->win.bpp-1)&3];
  979. }
  980. btv->win.color_fmt = format;
  981. if (bigendian &&
  982.     format == BT848_COLOR_FMT_RGB32) {
  983. btv->fb_color_ctl =
  984. BT848_COLOR_CTL_WSWAP_ODD |
  985. BT848_COLOR_CTL_WSWAP_EVEN |
  986. BT848_COLOR_CTL_BSWAP_ODD |
  987. BT848_COLOR_CTL_BSWAP_EVEN;
  988.         } else if (bigendian &&
  989.    (format == BT848_COLOR_FMT_RGB16 ||
  990.                     format == BT848_COLOR_FMT_RGB15)) {
  991. btv->fb_color_ctl =
  992. BT848_COLOR_CTL_BSWAP_ODD |
  993. BT848_COLOR_CTL_BSWAP_EVEN;
  994.         } else {
  995. btv->fb_color_ctl = 0;
  996. }
  997. /* RGB8 seems to be a 9x5x5 GRB color cube starting at
  998.  * color 16. Why the h... can't they even mention this in the
  999.  * data sheet?  [AC - because it's a standard format so I guess
  1000.  * it never occurred to them]
  1001.  * Enable dithering in this mode.
  1002.  */
  1003. if (format==BT848_COLOR_FMT_RGB8)
  1004.                 btand(~BT848_CAP_CTL_DITH_FRAME, BT848_CAP_CTL); 
  1005. else
  1006.         btor(BT848_CAP_CTL_DITH_FRAME, BT848_CAP_CTL);
  1007.         bt848_set_geo(btv);
  1008. }
  1009. /*
  1010.  * Grab into virtual memory.
  1011.  */
  1012. static int vgrab(struct bttv *btv, struct video_mmap *mp)
  1013. {
  1014. unsigned int *ro, *re;
  1015. unsigned int *vbuf;
  1016. unsigned long flags;
  1017. if(btv->fbuffer==NULL)
  1018. {
  1019. if(fbuffer_alloc(btv))
  1020. return -ENOBUFS;
  1021. }
  1022. if(mp->frame >= gbuffers || mp->frame < 0)
  1023. return -EINVAL;
  1024. if(btv->gbuf[mp->frame].stat != GBUFFER_UNUSED)
  1025. return -EBUSY;
  1026. if(mp->height < 32 || mp->width < 48)
  1027. return -EINVAL;
  1028. if (mp->format >= PALETTEFMT_MAX)
  1029. return -EINVAL;
  1030. if (mp->height*mp->width*fmtbppx2[palette2fmt[mp->format]&0x0f]/2
  1031.     > gbufsize)
  1032. return -EINVAL;
  1033. if (-1 == palette2fmt[mp->format])
  1034. return -EINVAL;
  1035. /*
  1036.  * Ok load up the BT848
  1037.  */
  1038.  
  1039. vbuf=(unsigned int *)(btv->fbuffer+gbufsize*mp->frame);
  1040. ro=btv->gbuf[mp->frame].risc;
  1041. re=ro+2048;
  1042.         make_vrisctab(btv, ro, re, vbuf, mp->width, mp->height, mp->format);
  1043. if (bttv_debug)
  1044. printk("bttv%d: cap vgrab: queue %d (%d:%dx%d)n",
  1045.        btv->nr,mp->frame,mp->format,mp->width,mp->height);
  1046.         spin_lock_irqsave(&btv->s_lock, flags); 
  1047.         btv->gbuf[mp->frame].stat    = GBUFFER_GRABBING;
  1048. btv->gbuf[mp->frame].fmt     = palette2fmt[mp->format];
  1049. btv->gbuf[mp->frame].width   = mp->width;
  1050. btv->gbuf[mp->frame].height  = mp->height;
  1051. btv->gbuf[mp->frame].ro      = virt_to_bus(ro);
  1052. btv->gbuf[mp->frame].re      = virt_to_bus(re);
  1053. #if 1
  1054. if (mp->height <= tvnorms[btv->win.norm].sheight/2 &&
  1055.     mp->format != VIDEO_PALETTE_RAW)
  1056. btv->gbuf[mp->frame].ro = 0;
  1057. #endif
  1058. if (-1 == btv->gq_grab && btv->gq_in == btv->gq_out) {
  1059. btv->gq_start = 1;
  1060. btv->risc_jmp[12]=cpu_to_le32(BT848_RISC_JUMP|(0x8<<16)|BT848_RISC_IRQ);
  1061.         }
  1062. btv->gqueue[btv->gq_in++] = mp->frame;
  1063. btv->gq_in = btv->gq_in % MAX_GBUFFERS;
  1064. btor(3, BT848_CAP_CTL);
  1065. btor(3, BT848_GPIO_DMA_CTL);
  1066. spin_unlock_irqrestore(&btv->s_lock, flags);
  1067. return 0;
  1068. }
  1069. static long bttv_write(struct video_device *v, const char *buf, unsigned long count, int nonblock)
  1070. {
  1071. return -EINVAL;
  1072. }
  1073. static long bttv_read(struct video_device *v, char *buf, unsigned long count, int nonblock)
  1074. {
  1075. struct bttv *btv= (struct bttv *)v;
  1076. int q;
  1077. unsigned long todo;
  1078. DECLARE_WAITQUEUE(wait, current);
  1079. /* BROKEN: RETURNS VBI WHEN IT SHOULD RETURN GRABBED VIDEO FRAME */
  1080. todo=count;
  1081. while (todo && todo>(q=VBIBUF_SIZE-btv->vbip)) 
  1082. {
  1083. if(copy_to_user((void *) buf, (void *) btv->vbibuf+btv->vbip, q))
  1084. return -EFAULT;
  1085. todo-=q;
  1086. buf+=q;
  1087. add_wait_queue(&btv->vbiq, &wait);
  1088. current->state = TASK_INTERRUPTIBLE;
  1089. if (todo && q==VBIBUF_SIZE-btv->vbip) 
  1090. {
  1091. if(nonblock)
  1092. {
  1093. remove_wait_queue(&btv->vbiq, &wait);
  1094.                                 current->state = TASK_RUNNING;
  1095. if(count==todo)
  1096. return -EWOULDBLOCK;
  1097. return count-todo;
  1098. }
  1099. schedule();
  1100. if(signal_pending(current))
  1101. {
  1102. remove_wait_queue(&btv->vbiq, &wait);
  1103.                                 current->state = TASK_RUNNING;
  1104. if(todo==count)
  1105. return -EINTR;
  1106. else
  1107. return count-todo;
  1108. }
  1109. }
  1110. remove_wait_queue(&btv->vbiq, &wait);
  1111.                 current->state = TASK_RUNNING;
  1112. }
  1113. if (todo) 
  1114. {
  1115. if(copy_to_user((void *) buf, (void *) btv->vbibuf+btv->vbip, todo))
  1116. return -EFAULT;
  1117. btv->vbip+=todo;
  1118. }
  1119. return count;
  1120. }
  1121. static inline void burst(int on)
  1122. {
  1123. tvnorms[0].scaledtwidth = 1135 - (on?BURSTOFFSET-2:0);
  1124. tvnorms[0].hdelayx1     = 186  - (on?BURSTOFFSET  :0);
  1125. tvnorms[2].scaledtwidth = 1135 - (on?BURSTOFFSET-2:0);
  1126. tvnorms[2].hdelayx1     = 186  - (on?BURSTOFFSET  :0);
  1127. }
  1128. /*
  1129.  * called from irq handler on fatal errors.  Takes the grabber chip
  1130.  * offline, flag it needs a reinitialization (which can't be done
  1131.  * from irq context) and wake up all sleeping proccesses.  They would
  1132.  * block forever else.  We also need someone who actually does the
  1133.  * reinitialization from process context...
  1134.  */
  1135. static void bt848_offline(struct bttv *btv)
  1136. {
  1137. int i;
  1138. spin_lock(&btv->s_lock);
  1139. /* cancel all outstanding grab requests */
  1140. btv->gq_in = 0;
  1141. btv->gq_out = 0;
  1142. btv->gq_grab = -1;
  1143. for (i = 0; i < gbuffers; i++)
  1144. if (btv->gbuf[i].stat == GBUFFER_GRABBING)
  1145. btv->gbuf[i].stat = GBUFFER_ERROR;
  1146. /* disable screen overlay and DMA */
  1147. btv->risc_cap_odd  = 0;
  1148. btv->risc_cap_even = 0;
  1149. bt848_set_risc_jmps(btv,0);
  1150. /* flag the chip needs a restart */
  1151. btv->needs_restart = 1;
  1152. spin_unlock(&btv->s_lock);
  1153. wake_up_interruptible(&btv->vbiq);
  1154. wake_up_interruptible(&btv->capq);
  1155. }
  1156. static void bt848_restart(struct bttv *btv)
  1157. {
  1158.   unsigned long irq_flags;
  1159. if (bttv_verbose)
  1160. printk("bttv%d: resetting chipn",btv->nr);
  1161. btwrite(0xfffffUL, BT848_INT_STAT);
  1162. btand(~15, BT848_GPIO_DMA_CTL);
  1163. btwrite(0, BT848_SRESET);
  1164. btwrite(virt_to_bus(btv->risc_jmp+2),
  1165. BT848_RISC_STRT_ADD);
  1166. /* enforce pll reprogramming */
  1167. btv->pll.pll_current = 0;
  1168. set_pll(btv);
  1169. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1170. btv->errors = 0;
  1171. btv->needs_restart = 0;
  1172. bt848_set_geo(btv);
  1173. bt848_set_risc_jmps(btv,-1);
  1174. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1175. }
  1176. /*
  1177.  * Open a bttv card. Right now the flags stuff is just playing
  1178.  */
  1179. static int bttv_open(struct video_device *dev, int flags)
  1180. {
  1181. struct bttv *btv = (struct bttv *)dev;
  1182.         int i,ret;
  1183. ret = -EBUSY;
  1184. if (bttv_debug)
  1185. printk("bttv%d: open calledn",btv->nr);
  1186. down(&btv->lock);
  1187. if (btv->user)
  1188. goto out_unlock;
  1189. btv->fbuffer=(unsigned char *) rvmalloc(gbuffers*gbufsize);
  1190. ret = -ENOMEM;
  1191. if (!btv->fbuffer)
  1192. goto out_unlock;
  1193.         btv->gq_in = 0;
  1194.         btv->gq_out = 0;
  1195. btv->gq_grab = -1;
  1196.         for (i = 0; i < gbuffers; i++)
  1197.                 btv->gbuf[i].stat = GBUFFER_UNUSED;
  1198. if (btv->needs_restart)
  1199. bt848_restart(btv);
  1200.         burst(0);
  1201. set_pll(btv);
  1202.         btv->user++;
  1203. up(&btv->lock);
  1204.         return 0;
  1205.  out_unlock:
  1206. up(&btv->lock);
  1207. return ret;
  1208. }
  1209. static void bttv_close(struct video_device *dev)
  1210. {
  1211. struct bttv *btv=(struct bttv *)dev;
  1212.   unsigned long irq_flags;
  1213. int need_wait;
  1214. down(&btv->lock);
  1215. btv->user--;
  1216. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1217. need_wait = (-1 != btv->gq_grab);
  1218. btv->gq_start = 0;
  1219. btv->gq_in = 0;
  1220. btv->gq_out = 0;
  1221. btv->gq_grab = -1;
  1222. btv->scr_on = 0;
  1223. btv->risc_cap_odd = 0;
  1224. btv->risc_cap_even = 0;
  1225. bt848_set_risc_jmps(btv,-1);
  1226. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1227. /*
  1228.  * A word of warning. At this point the chip
  1229.  * is still capturing because its FIFO hasn't emptied
  1230.  * and the DMA control operations are posted PCI 
  1231.  * operations.
  1232.  */
  1233. btread(BT848_I2C);  /* This fixes the PCI posting delay */
  1234. if (need_wait) {
  1235. /*
  1236.  * This is sucky but right now I can't find a good way to
  1237.  * be sure its safe to free the buffer. We wait 5-6 fields
  1238.  * which is more than sufficient to be sure.
  1239.  */
  1240. current->state = TASK_UNINTERRUPTIBLE;
  1241. schedule_timeout(HZ/10); /* Wait 1/10th of a second */
  1242. }
  1243. /*
  1244.  * We have allowed it to drain.
  1245.  */
  1246. if(btv->fbuffer)
  1247. rvfree((void *) btv->fbuffer, gbuffers*gbufsize);
  1248. btv->fbuffer=0;
  1249. up(&btv->lock);
  1250. }
  1251. /***********************************/
  1252. /* ioctls and supporting functions */
  1253. /***********************************/
  1254. static inline void bt848_bright(struct bttv *btv, uint bright)
  1255. {
  1256. btwrite(bright&0xff, BT848_BRIGHT);
  1257. }
  1258. static inline void bt848_hue(struct bttv *btv, uint hue)
  1259. {
  1260. btwrite(hue&0xff, BT848_HUE);
  1261. }
  1262. static inline void bt848_contrast(struct bttv *btv, uint cont)
  1263. {
  1264. unsigned int conthi;
  1265. conthi=(cont>>6)&4;
  1266. btwrite(cont&0xff, BT848_CONTRAST_LO);
  1267. btaor(conthi, ~4, BT848_E_CONTROL);
  1268. btaor(conthi, ~4, BT848_O_CONTROL);
  1269. }
  1270. static inline void bt848_sat_u(struct bttv *btv, unsigned long data)
  1271. {
  1272. u32 datahi;
  1273. datahi=(data>>7)&2;
  1274. btwrite(data&0xff, BT848_SAT_U_LO);
  1275. btaor(datahi, ~2, BT848_E_CONTROL);
  1276. btaor(datahi, ~2, BT848_O_CONTROL);
  1277. }
  1278. static inline void bt848_sat_v(struct bttv *btv, unsigned long data)
  1279. {
  1280. u32 datahi;
  1281. datahi=(data>>8)&1;
  1282. btwrite(data&0xff, BT848_SAT_V_LO);
  1283. btaor(datahi, ~1, BT848_E_CONTROL);
  1284. btaor(datahi, ~1, BT848_O_CONTROL);
  1285. }
  1286. /*
  1287.  * ioctl routine
  1288.  */
  1289. static int bttv_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  1290. {
  1291. struct bttv *btv=(struct bttv *)dev;
  1292.   unsigned long irq_flags;
  1293.   int i,ret = 0;
  1294. if (bttv_debug > 1)
  1295. printk("bttv%d: ioctl 0x%xn",btv->nr,cmd);
  1296. switch (cmd) {
  1297. case VIDIOCGCAP:
  1298. {
  1299. struct video_capability b;
  1300. strcpy(b.name,btv->video_dev.name);
  1301. b.type = VID_TYPE_CAPTURE|
  1302. ((bttv_tvcards[btv->type].tuner != -1) ? VID_TYPE_TUNER : 0) |
  1303. VID_TYPE_OVERLAY|
  1304. VID_TYPE_CLIPPING|
  1305. VID_TYPE_FRAMERAM|
  1306. VID_TYPE_SCALES;
  1307. b.channels = bttv_tvcards[btv->type].video_inputs;
  1308. b.audios = bttv_tvcards[btv->type].audio_inputs;
  1309. b.maxwidth = tvnorms[btv->win.norm].swidth;
  1310. b.maxheight = tvnorms[btv->win.norm].sheight;
  1311. b.minwidth = 48;
  1312. b.minheight = 32;
  1313. if(copy_to_user(arg,&b,sizeof(b)))
  1314. return -EFAULT;
  1315. return 0;
  1316. }
  1317. case VIDIOCGCHAN:
  1318. {
  1319. struct video_channel v;
  1320. if(copy_from_user(&v, arg,sizeof(v)))
  1321. return -EFAULT;
  1322. v.flags=VIDEO_VC_AUDIO;
  1323. v.tuners=0;
  1324. v.type=VIDEO_TYPE_CAMERA;
  1325. v.norm = btv->win.norm;
  1326. if (v.channel>=bttv_tvcards[btv->type].video_inputs)
  1327. return -EINVAL;
  1328. if(v.channel==bttv_tvcards[btv->type].tuner) 
  1329. {
  1330. strcpy(v.name,"Television");
  1331. v.flags|=VIDEO_VC_TUNER;
  1332. v.type=VIDEO_TYPE_TV;
  1333. v.tuners=1;
  1334. else if(v.channel==bttv_tvcards[btv->type].svhs) 
  1335. strcpy(v.name,"S-Video");
  1336. else
  1337. sprintf(v.name,"Composite%d",v.channel);
  1338. if(copy_to_user(arg,&v,sizeof(v)))
  1339. return -EFAULT;
  1340. return 0;
  1341. }
  1342. /*
  1343.  * Each channel has 1 tuner
  1344.  */
  1345. case VIDIOCSCHAN:
  1346. {
  1347. struct video_channel v;
  1348. if(copy_from_user(&v, arg,sizeof(v)))
  1349. return -EFAULT;
  1350. if (v.channel>bttv_tvcards[btv->type].video_inputs)
  1351. return -EINVAL;
  1352. if (v.norm > (sizeof(tvnorms)/sizeof(*tvnorms)))
  1353. return -EOPNOTSUPP;
  1354. bttv_call_i2c_clients(btv,cmd,&v);
  1355. down(&btv->lock);
  1356. bt848_muxsel(btv, v.channel);
  1357. btv->channel=v.channel;
  1358. if (btv->win.norm != v.norm) {
  1359. if (btv->type == BTTV_VOODOOTV_FM)
  1360. bttv_tda9880_setnorm(btv,v.norm);
  1361. btv->win.norm = v.norm;
  1362. make_vbitab(btv);
  1363. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1364. bt848_set_winsize(btv);
  1365. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1366. }
  1367. up(&btv->lock);
  1368. return 0;
  1369. }
  1370. case VIDIOCGTUNER:
  1371. {
  1372. struct video_tuner v;
  1373. if(copy_from_user(&v,arg,sizeof(v))!=0)
  1374. return -EFAULT;
  1375. #if 0 /* tuner.signal might be of intrest for non-tuner sources too ... */
  1376. if(v.tuner||btv->channel) /* Only tuner 0 */
  1377. return -EINVAL;
  1378. #endif
  1379. strcpy(v.name, "Television");
  1380. v.rangelow=0;
  1381. v.rangehigh=0xFFFFFFFF;
  1382. v.flags=VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
  1383. v.mode = btv->win.norm;
  1384. v.signal = (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) ? 0xFFFF : 0;
  1385. bttv_call_i2c_clients(btv,cmd,&v);
  1386. if(copy_to_user(arg,&v,sizeof(v)))
  1387. return -EFAULT;
  1388. return 0;
  1389. }
  1390. /* We have but one tuner */
  1391. case VIDIOCSTUNER:
  1392. {
  1393. struct video_tuner v;
  1394. if(copy_from_user(&v, arg, sizeof(v)))
  1395. return -EFAULT;
  1396. /* Only one channel has a tuner */
  1397. if(v.tuner!=bttv_tvcards[btv->type].tuner)
  1398. return -EINVAL;
  1399.  
  1400. if(v.mode!=VIDEO_MODE_PAL&&v.mode!=VIDEO_MODE_NTSC
  1401.    &&v.mode!=VIDEO_MODE_SECAM)
  1402. return -EOPNOTSUPP;
  1403. bttv_call_i2c_clients(btv,cmd,&v);
  1404. if (btv->win.norm != v.mode) {
  1405. btv->win.norm = v.mode;
  1406.                         down(&btv->lock);
  1407. set_pll(btv);
  1408. make_vbitab(btv);
  1409. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1410. bt848_set_winsize(btv);
  1411. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1412. up(&btv->lock);
  1413. }
  1414. return 0;
  1415. }
  1416. case VIDIOCGPICT:
  1417. {
  1418. struct video_picture p=btv->picture;
  1419. if(copy_to_user(arg, &p, sizeof(p)))
  1420. return -EFAULT;
  1421. return 0;
  1422. }
  1423. case VIDIOCSPICT:
  1424. {
  1425. struct video_picture p;
  1426. if (copy_from_user(&p, arg,sizeof(p)))
  1427. return -EFAULT;
  1428. if (p.palette > PALETTEFMT_MAX)
  1429. return -EINVAL;
  1430. if (-1 == palette2fmt[p.palette])
  1431. return -EINVAL;
  1432. down(&btv->lock);
  1433. /* We want -128 to 127 we get 0-65535 */
  1434. bt848_bright(btv, (p.brightness>>8)-128);
  1435. /* 0-511 for the colour */
  1436. bt848_sat_u(btv, p.colour>>7);
  1437. bt848_sat_v(btv, ((p.colour>>7)*201L)/237);
  1438. /* -128 to 127 */
  1439. bt848_hue(btv, (p.hue>>8)-128);
  1440. /* 0-511 */
  1441. bt848_contrast(btv, p.contrast>>7);
  1442. btv->picture = p;
  1443. up(&btv->lock);
  1444. return 0;
  1445. }
  1446. case VIDIOCSWIN:
  1447. {
  1448. struct video_window vw;
  1449. struct video_clip *vcp = NULL;
  1450. if(copy_from_user(&vw,arg,sizeof(vw)))
  1451. return -EFAULT;
  1452. down(&btv->lock);
  1453. if(vw.flags || vw.width < 16 || vw.height < 16) 
  1454. {
  1455. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1456. btv->scr_on = 0;
  1457. bt848_set_risc_jmps(btv,-1);
  1458. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1459. up(&btv->lock);
  1460. return -EINVAL;
  1461. }
  1462. if (btv->win.bpp < 4) 
  1463. { /* adjust and align writes */
  1464. vw.x = (vw.x + 3) & ~3;
  1465. vw.width &= ~3;
  1466. }
  1467. if (btv->needs_restart)
  1468. bt848_restart(btv);
  1469. btv->win.x=vw.x;
  1470. btv->win.y=vw.y;
  1471. btv->win.width=vw.width;
  1472. btv->win.height=vw.height;
  1473. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1474. bt848_set_risc_jmps(btv,0);
  1475. bt848_set_winsize(btv);
  1476. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1477. /*
  1478.  * Do any clips.
  1479.  */
  1480. if(vw.clipcount<0) {
  1481. if((vcp=vmalloc(VIDEO_CLIPMAP_SIZE))==NULL) {
  1482. up(&btv->lock);
  1483. return -ENOMEM;
  1484. }
  1485. if(copy_from_user(vcp, vw.clips,
  1486.   VIDEO_CLIPMAP_SIZE)) {
  1487. up(&btv->lock);
  1488. vfree(vcp);
  1489. return -EFAULT;
  1490. }
  1491. } else if (vw.clipcount > 2048) {
  1492. up(&btv->lock);
  1493. return -EINVAL;
  1494. } else if (vw.clipcount) {
  1495. if((vcp=vmalloc(sizeof(struct video_clip)*
  1496. (vw.clipcount))) == NULL) {
  1497. up(&btv->lock);
  1498. return -ENOMEM;
  1499. }
  1500. if(copy_from_user(vcp,vw.clips,
  1501.   sizeof(struct video_clip)*
  1502.   vw.clipcount)) {
  1503. up(&btv->lock);
  1504. vfree(vcp);
  1505. return -EFAULT;
  1506. }
  1507. }
  1508. make_clip_tab(btv, vcp, vw.clipcount);
  1509. if (vw.clipcount != 0)
  1510. vfree(vcp);
  1511. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1512. bt848_set_risc_jmps(btv,-1);
  1513. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1514. up(&btv->lock);
  1515. return 0;
  1516. }
  1517. case VIDIOCGWIN:
  1518. {
  1519. struct video_window vw;
  1520. memset(&vw,0,sizeof(vw));
  1521. vw.x=btv->win.x;
  1522. vw.y=btv->win.y;
  1523. vw.width=btv->win.width;
  1524. vw.height=btv->win.height;
  1525. if(btv->win.interlace)
  1526. vw.flags|=VIDEO_WINDOW_INTERLACE;
  1527. if(copy_to_user(arg,&vw,sizeof(vw)))
  1528. return -EFAULT;
  1529. return 0;
  1530. }
  1531. case VIDIOCCAPTURE:
  1532. {
  1533. int v;
  1534. if(copy_from_user(&v, arg,sizeof(v)))
  1535. return -EFAULT;
  1536. if(btv->win.vidadr == 0)
  1537. return -EINVAL;
  1538. if (btv->win.width==0 || btv->win.height==0)
  1539. return -EINVAL;
  1540. if (1 == no_overlay)
  1541. return -EIO;
  1542. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1543. if (v == 1 && btv->win.vidadr != 0)
  1544. btv->scr_on = 1;
  1545. if (v == 0)
  1546. btv->scr_on = 0;
  1547. bt848_set_risc_jmps(btv,-1);
  1548. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1549. return 0;
  1550. }
  1551. case VIDIOCGFBUF:
  1552. {
  1553. struct video_buffer v;
  1554. v.base=(void *)btv->win.vidadr;
  1555. v.height=btv->win.sheight;
  1556. v.width=btv->win.swidth;
  1557. v.depth=btv->win.depth;
  1558. v.bytesperline=btv->win.bpl;
  1559. if(copy_to_user(arg, &v,sizeof(v)))
  1560. return -EFAULT;
  1561. return 0;
  1562. }
  1563. case VIDIOCSFBUF:
  1564. {
  1565. struct video_buffer v;
  1566. if(!capable(CAP_SYS_ADMIN) &&
  1567.    !capable(CAP_SYS_RAWIO))
  1568. return -EPERM;
  1569. if(copy_from_user(&v, arg,sizeof(v)))
  1570. return -EFAULT;
  1571. if(v.depth!=8 && v.depth!=15 && v.depth!=16 && 
  1572.    v.depth!=24 && v.depth!=32 && v.width > 16 &&
  1573.    v.height > 16 && v.bytesperline > 16)
  1574. return -EINVAL;
  1575. down(&btv->lock);
  1576. if (v.base)
  1577. btv->win.vidadr=(unsigned long)v.base;
  1578. btv->win.sheight=v.height;
  1579. btv->win.swidth=v.width;
  1580. btv->win.bpp=((v.depth+7)&0x38)/8;
  1581. btv->win.depth=v.depth;
  1582. btv->win.bpl=v.bytesperline;
  1583. #if 0 /* was broken for ages and nobody noticed.  Looks like we don't need
  1584.  it any more as everybody explicitly sets the palette using VIDIOCSPICT
  1585.  these days */
  1586. /* set sefault color format */
  1587. switch (v.depth) {
  1588. case  8: btv->picture.palette = VIDEO_PALETTE_HI240;  break;
  1589. case 15: btv->picture.palette = VIDEO_PALETTE_RGB555; break;
  1590. case 16: btv->picture.palette = VIDEO_PALETTE_RGB565; break;
  1591. case 24: btv->picture.palette = VIDEO_PALETTE_RGB24;  break;
  1592. case 32: btv->picture.palette = VIDEO_PALETTE_RGB32;  break;
  1593. }
  1594. #endif
  1595. if (bttv_debug)
  1596. printk("Display at %p is %d by %d, bytedepth %d, bpl %dn",
  1597.        v.base, v.width,v.height, btv->win.bpp, btv->win.bpl);
  1598. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1599. bt848_set_winsize(btv);
  1600. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1601. up(&btv->lock);
  1602. return 0;
  1603. }
  1604. case VIDIOCKEY:
  1605. {
  1606. /* Will be handled higher up .. */
  1607. return 0;
  1608. }
  1609. case VIDIOCGFREQ:
  1610. {
  1611. unsigned long v=btv->win.freq;
  1612. if(copy_to_user(arg,&v,sizeof(v)))
  1613. return -EFAULT;
  1614. return 0;
  1615. }
  1616. case VIDIOCSFREQ:
  1617. {
  1618. unsigned long v;
  1619. if(copy_from_user(&v, arg, sizeof(v)))
  1620. return -EFAULT;
  1621. btv->win.freq=v;
  1622. bttv_call_i2c_clients(btv,cmd,&v);
  1623. #if 1
  1624. if (btv->radio && btv->has_matchbox)
  1625. tea5757_set_freq(btv,v);
  1626. #endif
  1627. return 0;
  1628. }
  1629. case VIDIOCGAUDIO:
  1630. {
  1631. struct video_audio v;
  1632. v=btv->audio_dev;
  1633. v.flags&=~(VIDEO_AUDIO_MUTE|VIDEO_AUDIO_MUTABLE);
  1634. v.flags|=VIDEO_AUDIO_MUTABLE;
  1635. strcpy(v.name,"TV");
  1636. v.mode = VIDEO_SOUND_MONO;
  1637. bttv_call_i2c_clients(btv,cmd,&v);
  1638. /* card specific hooks */
  1639. if (btv->audio_hook)
  1640. btv->audio_hook(btv,&v,0);
  1641. if(copy_to_user(arg,&v,sizeof(v)))
  1642. return -EFAULT;
  1643. return 0;
  1644. }
  1645. case VIDIOCSAUDIO:
  1646. {
  1647. struct video_audio v;
  1648. if(copy_from_user(&v,arg, sizeof(v)))
  1649. return -EFAULT;
  1650. down(&btv->lock);
  1651. if(v.flags&VIDEO_AUDIO_MUTE)
  1652. audio(btv, AUDIO_MUTE);
  1653. /* One audio source per tuner -- huh? <GA> */
  1654. if(v.audio<0 || v.audio >= bttv_tvcards[btv->type].audio_inputs) {
  1655. up(&btv->lock);
  1656. return -EINVAL;
  1657. }
  1658. /* bt848_muxsel(btv,v.audio); */
  1659. if(!(v.flags&VIDEO_AUDIO_MUTE))
  1660. audio(btv, AUDIO_UNMUTE);
  1661. bttv_call_i2c_clients(btv,cmd,&v);
  1662. /* card specific hooks */
  1663. if (btv->audio_hook)
  1664. btv->audio_hook(btv,&v,1);
  1665. btv->audio_dev=v;
  1666. up(&btv->lock);
  1667. return 0;
  1668. }
  1669. case VIDIOCSYNC:
  1670. {
  1671. DECLARE_WAITQUEUE(wait, current);
  1672. if(copy_from_user((void *)&i,arg,sizeof(int)))
  1673. return -EFAULT;
  1674. if (i < 0 || i >= gbuffers)
  1675. return -EINVAL;
  1676. switch (btv->gbuf[i].stat) {
  1677. case GBUFFER_UNUSED:
  1678. ret = -EINVAL;
  1679. break;
  1680. case GBUFFER_GRABBING:
  1681. add_wait_queue(&btv->capq, &wait);
  1682. current->state = TASK_INTERRUPTIBLE;
  1683. while(btv->gbuf[i].stat==GBUFFER_GRABBING) {
  1684. if (bttv_debug)
  1685. printk("bttv%d: cap sync: sleep on %dn",btv->nr,i);
  1686. schedule();
  1687. if(signal_pending(current)) {
  1688. remove_wait_queue(&btv->capq, &wait);
  1689. current->state = TASK_RUNNING;
  1690. return -EINTR;
  1691. }
  1692. }
  1693. remove_wait_queue(&btv->capq, &wait);
  1694. current->state = TASK_RUNNING;
  1695. /* fall throuth */
  1696. case GBUFFER_DONE:
  1697. case GBUFFER_ERROR:
  1698. ret = (btv->gbuf[i].stat == GBUFFER_ERROR) ? -EIO : 0;
  1699. if (bttv_debug)
  1700. printk("bttv%d: cap sync: buffer %d, retval %dn",btv->nr,i,ret);
  1701. btv->gbuf[i].stat = GBUFFER_UNUSED;
  1702. }
  1703. if (btv->needs_restart) {
  1704. down(&btv->lock);
  1705. bt848_restart(btv);
  1706. up(&btv->lock);
  1707. }
  1708. return ret;
  1709. }
  1710. case BTTV_FIELDNR: 
  1711. if(copy_to_user((void *) arg, (void *) &btv->last_field, 
  1712. sizeof(btv->last_field)))
  1713. return -EFAULT;
  1714. break;
  1715.       
  1716. case BTTV_PLLSET: {
  1717. struct bttv_pll_info p;
  1718. if(!capable(CAP_SYS_ADMIN))
  1719. return -EPERM;
  1720. if(copy_from_user(&p , (void *) arg, sizeof(btv->pll)))
  1721. return -EFAULT;
  1722. down(&btv->lock);
  1723. btv->pll.pll_ifreq = p.pll_ifreq;
  1724. btv->pll.pll_ofreq = p.pll_ofreq;
  1725. btv->pll.pll_crystal = p.pll_crystal;
  1726. up(&btv->lock);
  1727. break;
  1728. }
  1729. case VIDIOCMCAPTURE:
  1730. {
  1731. struct video_mmap vm;
  1732. int ret;
  1733. if(copy_from_user((void *) &vm, (void *) arg, sizeof(vm)))
  1734. return -EFAULT;
  1735. down(&btv->lock);
  1736. ret = vgrab(btv, &vm);
  1737. up(&btv->lock);
  1738. return ret;
  1739. }
  1740. case VIDIOCGMBUF:
  1741. {
  1742. struct video_mbuf vm;
  1743. memset(&vm, 0 , sizeof(vm));
  1744. vm.size=gbufsize*gbuffers;
  1745. vm.frames=gbuffers;
  1746. for (i = 0; i < gbuffers; i++)
  1747. vm.offsets[i]=i*gbufsize;
  1748. if(copy_to_user((void *)arg, (void *)&vm, sizeof(vm)))
  1749. return -EFAULT;
  1750. return 0;
  1751. }
  1752. case VIDIOCGUNIT:
  1753. {
  1754. struct video_unit vu;
  1755. vu.video=btv->video_dev.minor;
  1756. vu.vbi=btv->vbi_dev.minor;
  1757. if(btv->radio_dev.minor!=-1)
  1758. vu.radio=btv->radio_dev.minor;
  1759. else
  1760. vu.radio=VIDEO_NO_UNIT;
  1761. vu.audio=VIDEO_NO_UNIT;
  1762. vu.teletext=VIDEO_NO_UNIT;
  1763. if(copy_to_user((void *)arg, (void *)&vu, sizeof(vu)))
  1764. return -EFAULT;
  1765. return 0;
  1766. }
  1767. case BTTV_BURST_ON:
  1768. {
  1769. burst(1);
  1770. return 0;
  1771. }
  1772. case BTTV_BURST_OFF:
  1773. {
  1774. burst(0);
  1775. return 0;
  1776. }
  1777. case BTTV_VERSION:
  1778. {
  1779. return BTTV_VERSION_CODE;
  1780. }
  1781.                         
  1782. case BTTV_PICNR:
  1783. {
  1784. /* return picture;*/
  1785. return  0;
  1786. }
  1787. default:
  1788. return -ENOIOCTLCMD;
  1789. }
  1790. return 0;
  1791. }
  1792. /*
  1793.  * This maps the vmalloced and reserved fbuffer to user space.
  1794.  *
  1795.  *  FIXME: 
  1796.  *  - PAGE_READONLY should suffice!?
  1797.  *  - remap_page_range is kind of inefficient for page by page remapping.
  1798.  *    But e.g. pte_alloc() does not work in modules ... :-(
  1799.  */
  1800. static int do_bttv_mmap(struct bttv *btv, const char *adr, unsigned long size)
  1801. {
  1802.         unsigned long start=(unsigned long) adr;
  1803.         unsigned long page,pos;
  1804.         if (size>gbuffers*gbufsize)
  1805.                 return -EINVAL;
  1806.         if (!btv->fbuffer) {
  1807.                 if(fbuffer_alloc(btv))
  1808.                         return -EINVAL;
  1809.         }
  1810.         pos=(unsigned long) btv->fbuffer;
  1811.         while (size > 0) {
  1812.                 page = kvirt_to_pa(pos);
  1813.                 if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
  1814.                         return -EAGAIN;
  1815.                 start+=PAGE_SIZE;
  1816.                 pos+=PAGE_SIZE;
  1817.                 size-=PAGE_SIZE;
  1818.         }
  1819.         return 0;
  1820. }
  1821. static int bttv_mmap(struct video_device *dev, const char *adr, unsigned long size)
  1822. {
  1823.         struct bttv *btv=(struct bttv *)dev;
  1824.         int r;
  1825.         down(&btv->lock);
  1826.         r=do_bttv_mmap(btv, adr, size);
  1827.         up(&btv->lock);
  1828.         return r;
  1829. }
  1830. static struct video_device bttv_template=
  1831. {
  1832. owner: THIS_MODULE,
  1833. name: "UNSET",
  1834. type: VID_TYPE_TUNER|VID_TYPE_CAPTURE|VID_TYPE_OVERLAY|VID_TYPE_TELETEXT,
  1835. hardware: VID_HARDWARE_BT848,
  1836. open: bttv_open,
  1837. close: bttv_close,
  1838. read: bttv_read,
  1839. write: bttv_write,
  1840. ioctl: bttv_ioctl,
  1841. mmap: bttv_mmap,
  1842. minor: -1,
  1843. };
  1844. static long vbi_read(struct video_device *v, char *buf, unsigned long count,
  1845.      int nonblock)
  1846. {
  1847. struct bttv *btv=(struct bttv *)(v-2);
  1848. int q,todo;
  1849. DECLARE_WAITQUEUE(wait, current);
  1850. todo=count;
  1851. while (todo && todo>(q=VBIBUF_SIZE-btv->vbip)) 
  1852. {
  1853. if (btv->needs_restart) {
  1854. down(&btv->lock);
  1855. bt848_restart(btv);
  1856. up(&btv->lock);
  1857. }
  1858. if(copy_to_user((void *) buf, (void *) btv->vbibuf+btv->vbip, q))
  1859. return -EFAULT;
  1860. todo-=q;
  1861. buf+=q;
  1862. add_wait_queue(&btv->vbiq, &wait);
  1863. current->state = TASK_INTERRUPTIBLE;
  1864. if (todo && q==VBIBUF_SIZE-btv->vbip) 
  1865. {
  1866. if(nonblock)
  1867. {
  1868. remove_wait_queue(&btv->vbiq, &wait);
  1869. current->state = TASK_RUNNING;
  1870. if(count==todo)
  1871. return -EWOULDBLOCK;
  1872. return count-todo;
  1873. }
  1874. schedule();
  1875. if(signal_pending(current))
  1876. {
  1877. remove_wait_queue(&btv->vbiq, &wait);
  1878.                                 current->state = TASK_RUNNING;
  1879. if(todo==count)
  1880. return -EINTR;
  1881. else
  1882. return count-todo;
  1883. }
  1884. }
  1885. remove_wait_queue(&btv->vbiq, &wait);
  1886. current->state = TASK_RUNNING;
  1887. }
  1888. if (todo) 
  1889. {
  1890. if(copy_to_user((void *) buf, (void *) btv->vbibuf+btv->vbip, todo))
  1891. return -EFAULT;
  1892. btv->vbip+=todo;
  1893. }
  1894. return count;
  1895. }
  1896. static unsigned int vbi_poll(struct video_device *dev, struct file *file,
  1897. poll_table *wait)
  1898. {
  1899. struct bttv *btv=(struct bttv *)(dev-2);
  1900. unsigned int mask = 0;
  1901. poll_wait(file, &btv->vbiq, wait);
  1902. if (btv->vbip < VBIBUF_SIZE)
  1903. mask |= (POLLIN | POLLRDNORM);
  1904. return mask;
  1905. }
  1906. static int vbi_open(struct video_device *dev, int flags)
  1907. {
  1908. struct bttv *btv=(struct bttv *)(dev-2);
  1909.   unsigned long irq_flags;
  1910.         down(&btv->lock);
  1911. if (btv->needs_restart)
  1912. bt848_restart(btv);
  1913. set_pll(btv);
  1914. btv->vbip=VBIBUF_SIZE;
  1915. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1916. btv->vbi_on = 1;
  1917. bt848_set_risc_jmps(btv,-1);
  1918. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1919. up(&btv->lock);
  1920. return 0;   
  1921. }
  1922. static void vbi_close(struct video_device *dev)
  1923. {
  1924. struct bttv *btv=(struct bttv *)(dev-2);
  1925.   unsigned long irq_flags;
  1926. spin_lock_irqsave(&btv->s_lock, irq_flags);
  1927. btv->vbi_on = 0;
  1928. bt848_set_risc_jmps(btv,-1);
  1929. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  1930. }
  1931. static int vbi_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  1932. {
  1933. struct bttv *btv=(struct bttv *)(dev-2);
  1934. switch (cmd) {
  1935. case VIDIOCGCAP:
  1936. {
  1937. struct video_capability b;
  1938. strcpy(b.name,btv->vbi_dev.name);
  1939. b.type = ((bttv_tvcards[btv->type].tuner != -1) ? VID_TYPE_TUNER : 0) |
  1940. VID_TYPE_TELETEXT;
  1941. b.channels = 0;
  1942. b.audios = 0;
  1943. b.maxwidth = 0;
  1944. b.maxheight = 0;
  1945. b.minwidth = 0;
  1946. b.minheight = 0;
  1947. if(copy_to_user(arg,&b,sizeof(b)))
  1948. return -EFAULT;
  1949. return 0;
  1950. }
  1951. case VIDIOCGFREQ:
  1952. case VIDIOCSFREQ:
  1953. case VIDIOCGTUNER:
  1954. case VIDIOCSTUNER:
  1955. case VIDIOCGCHAN:
  1956. case VIDIOCSCHAN:
  1957. case BTTV_VERSION:
  1958. return bttv_ioctl(dev-2,cmd,arg);
  1959. case BTTV_VBISIZE:
  1960. /* make alevt happy :-) */
  1961. return VBIBUF_SIZE;
  1962. default:
  1963. return -EINVAL;
  1964. }
  1965. }
  1966. static struct video_device vbi_template=
  1967. {
  1968. owner: THIS_MODULE,
  1969. name: "bttv vbi",
  1970. type: VID_TYPE_CAPTURE|VID_TYPE_TELETEXT,
  1971. hardware: VID_HARDWARE_BT848,
  1972. open: vbi_open,
  1973. close: vbi_close,
  1974. read: vbi_read,
  1975. write: bttv_write,
  1976. poll: vbi_poll,
  1977. ioctl: vbi_ioctl,
  1978. minor: -1,
  1979. };
  1980. static int radio_open(struct video_device *dev, int flags)
  1981. {
  1982. struct bttv *btv = (struct bttv *)(dev-1);
  1983. unsigned long v;
  1984.         down(&btv->lock);
  1985. if (btv->user)
  1986. goto busy_unlock;
  1987. btv->user++;
  1988. btv->radio = 1;
  1989. v = 400*16;
  1990. bttv_call_i2c_clients(btv,VIDIOCSFREQ,&v);
  1991. bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
  1992. bt848_muxsel(btv,0);
  1993. up(&btv->lock);
  1994. return 0;   
  1995.  busy_unlock:
  1996. up(&btv->lock);
  1997. return -EBUSY;
  1998. }
  1999. static void radio_close(struct video_device *dev)
  2000. {
  2001. struct bttv *btv=(struct bttv *)(dev-1);
  2002. down(&btv->lock);
  2003. btv->user--;
  2004. btv->radio = 0;
  2005. up(&btv->lock);
  2006. }
  2007. static long radio_read(struct video_device *v, char *buf, unsigned long count, int nonblock)
  2008. {
  2009. return -EINVAL;
  2010. }
  2011. static int radio_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  2012. {
  2013.         struct bttv *btv=(struct bttv *)(dev-1);
  2014. switch (cmd) {
  2015. case VIDIOCGCAP:
  2016. {
  2017. struct video_capability v;
  2018. strcpy(v.name,btv->video_dev.name);
  2019. v.type = VID_TYPE_TUNER;
  2020. v.channels = 1;
  2021. v.audios = 1;
  2022. /* No we don't do pictures */
  2023. v.maxwidth = 0;
  2024. v.maxheight = 0;
  2025. v.minwidth = 0;
  2026. v.minheight = 0;
  2027. if (copy_to_user(arg, &v, sizeof(v)))
  2028. return -EFAULT;
  2029. return 0;
  2030. break;
  2031. }
  2032. case VIDIOCGTUNER:
  2033. {
  2034. struct video_tuner v;
  2035. if(copy_from_user(&v,arg,sizeof(v))!=0)
  2036. return -EFAULT;
  2037. if(v.tuner||btv->channel) /* Only tuner 0 */
  2038. return -EINVAL;
  2039. strcpy(v.name, "Radio");
  2040. /* japan:          76.0 MHz -  89.9 MHz
  2041.    western europe: 87.5 MHz - 108.0 MHz
  2042.    russia:         65.0 MHz - 108.0 MHz */
  2043. v.rangelow=(int)(65*16);
  2044. v.rangehigh=(int)(108*16);
  2045. v.flags= 0; /* XXX */
  2046. v.mode = 0; /* XXX */
  2047. bttv_call_i2c_clients(btv,cmd,&v);
  2048. if(copy_to_user(arg,&v,sizeof(v)))
  2049. return -EFAULT;
  2050. return 0;
  2051. }
  2052. case VIDIOCSTUNER:
  2053. {
  2054. struct video_tuner v;
  2055. if(copy_from_user(&v, arg, sizeof(v)))
  2056. return -EFAULT;
  2057. /* Only channel 0 has a tuner */
  2058. if(v.tuner!=0 || btv->channel)
  2059. return -EINVAL;
  2060. /* XXX anything to do ??? */
  2061. return 0;
  2062. }
  2063. case VIDIOCGFREQ:
  2064. case VIDIOCSFREQ:
  2065. case VIDIOCGAUDIO:
  2066. case VIDIOCSAUDIO:
  2067. bttv_ioctl((struct video_device *)btv,cmd,arg);
  2068. break;
  2069. default:
  2070. return -ENOIOCTLCMD;
  2071. }
  2072. return 0;
  2073. }
  2074. static struct video_device radio_template=
  2075. {
  2076. owner: THIS_MODULE,
  2077. name: "bttv radio",
  2078. type: VID_TYPE_TUNER,
  2079. hardware: VID_HARDWARE_BT848,
  2080. open: radio_open,
  2081. close: radio_close,
  2082. read: radio_read,          /* just returns -EINVAL */
  2083. write: bttv_write,          /* just returns -EINVAL */
  2084. ioctl: radio_ioctl,
  2085. minor: -1,
  2086. };
  2087. static void bt848_set_risc_jmps(struct bttv *btv, int flags)
  2088. {
  2089. if (-1 == flags) {
  2090. /* defaults */
  2091. flags = 0;
  2092. if (btv->scr_on)
  2093. flags |= 0x03;
  2094. if (btv->vbi_on)
  2095. flags |= 0x0c;
  2096. #if 0
  2097. /* Hmm ... */
  2098. if ((0 != btv->risc_cap_even) ||
  2099.     (0 != btv->risc_cap_odd))
  2100. flags |= 0x0c;
  2101. #endif
  2102. }
  2103. if (bttv_debug > 1)
  2104. printk("bttv%d: set_risc_jmp %08lx:",
  2105.        btv->nr,virt_to_bus(btv->risc_jmp));
  2106. /* Sync to start of odd field */
  2107. btv->risc_jmp[0]=cpu_to_le32(BT848_RISC_SYNC|BT848_RISC_RESYNC
  2108.                                 |BT848_FIFO_STATUS_VRE);
  2109. btv->risc_jmp[1]=cpu_to_le32(0);
  2110. /* Jump to odd vbi sub */
  2111. btv->risc_jmp[2]=cpu_to_le32(BT848_RISC_JUMP|(0xd<<20));
  2112. if (flags&8) {
  2113. if (bttv_debug > 1)
  2114. printk(" ev=%08lx",virt_to_bus(btv->vbi_odd));
  2115. btv->risc_jmp[3]=cpu_to_le32(virt_to_bus(btv->vbi_odd));
  2116. } else {
  2117. if (bttv_debug > 1)
  2118. printk(" -----------");
  2119. btv->risc_jmp[3]=cpu_to_le32(virt_to_bus(btv->risc_jmp+4));
  2120. }
  2121.         /* Jump to odd sub */
  2122. btv->risc_jmp[4]=cpu_to_le32(BT848_RISC_JUMP|(0xe<<20));
  2123. if (0 != btv->risc_cap_odd) {
  2124. if (bttv_debug > 1)
  2125. printk(" e%d=%08x",btv->gq_grab,btv->risc_cap_odd);
  2126. flags |= 3;
  2127. btv->risc_jmp[5]=cpu_to_le32(btv->risc_cap_odd);
  2128. } else if ((flags&2) &&
  2129.    (!btv->win.interlace || 0 == btv->risc_cap_even)) {
  2130. if (bttv_debug > 1)
  2131. printk(" eo=%08lx",virt_to_bus(btv->risc_scr_odd));
  2132. btv->risc_jmp[5]=cpu_to_le32(virt_to_bus(btv->risc_scr_odd));
  2133. } else {
  2134. if (bttv_debug > 1)
  2135. printk(" -----------");
  2136. btv->risc_jmp[5]=cpu_to_le32(virt_to_bus(btv->risc_jmp+6));
  2137. }
  2138. /* Sync to start of even field */
  2139. btv->risc_jmp[6]=cpu_to_le32(BT848_RISC_SYNC|BT848_RISC_RESYNC
  2140.                                 |BT848_FIFO_STATUS_VRO);
  2141. btv->risc_jmp[7]=cpu_to_le32(0);
  2142. /* Jump to even vbi sub */
  2143. btv->risc_jmp[8]=cpu_to_le32(BT848_RISC_JUMP);
  2144. if (flags&4) {
  2145. if (bttv_debug > 1)
  2146. printk(" ov=%08lx",virt_to_bus(btv->vbi_even));
  2147. btv->risc_jmp[9]=cpu_to_le32(virt_to_bus(btv->vbi_even));
  2148. } else {
  2149. if (bttv_debug > 1)
  2150. printk(" -----------");
  2151. btv->risc_jmp[9]=cpu_to_le32(virt_to_bus(btv->risc_jmp+10));
  2152. }
  2153. /* Jump to even sub */
  2154. btv->risc_jmp[10]=cpu_to_le32(BT848_RISC_JUMP|(8<<20));
  2155. if (0 != btv->risc_cap_even) {
  2156. if (bttv_debug > 1)
  2157. printk(" o%d=%08x",btv->gq_grab,btv->risc_cap_even);
  2158. flags |= 3;
  2159. btv->risc_jmp[11]=cpu_to_le32(btv->risc_cap_even);
  2160. } else if ((flags&1) &&
  2161.    btv->win.interlace) {
  2162. if (bttv_debug > 1)
  2163. printk(" oo=%08lx",virt_to_bus(btv->risc_scr_even));
  2164. btv->risc_jmp[11]=cpu_to_le32(virt_to_bus(btv->risc_scr_even));
  2165. } else {
  2166. if (bttv_debug > 1)
  2167. printk(" -----------");
  2168. btv->risc_jmp[11]=cpu_to_le32(virt_to_bus(btv->risc_jmp+12));
  2169. }
  2170. if (btv->gq_start) {
  2171. btv->risc_jmp[12]=cpu_to_le32(BT848_RISC_JUMP|(0x8<<16)|BT848_RISC_IRQ);
  2172. } else {
  2173. btv->risc_jmp[12]=cpu_to_le32(BT848_RISC_JUMP);
  2174. }
  2175. btv->risc_jmp[13]=cpu_to_le32(virt_to_bus(btv->risc_jmp));
  2176. /* enable cpaturing and DMA */
  2177. if (bttv_debug > 1)
  2178. printk(" flags=0x%x dma=%sn",
  2179.        flags,(flags&0x0f) ? "on" : "off");
  2180. btaor(flags, ~0x0f, BT848_CAP_CTL);
  2181. if (flags&0x0f)
  2182. bt848_dma(btv, 3);
  2183. else
  2184. bt848_dma(btv, 0);
  2185. }
  2186. static int __devinit init_video_dev(struct bttv *btv)
  2187. {
  2188. audio(btv, AUDIO_MUTE);
  2189.         
  2190. if (video_register_device(&btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
  2191. return -1;
  2192. printk(KERN_INFO "bttv%d: registered device video%dn",
  2193.        btv->nr,btv->video_dev.minor & 0x1f);
  2194. if (video_register_device(&btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0) {
  2195.         video_unregister_device(&btv->video_dev);
  2196. return -1;
  2197. }
  2198. printk(KERN_INFO "bttv%d: registered device vbi%dn",
  2199.        btv->nr,btv->vbi_dev.minor & 0x1f);
  2200. if (btv->has_radio) {
  2201. if(video_register_device(&btv->radio_dev, VFL_TYPE_RADIO, radio_nr)<0) {
  2202.         video_unregister_device(&btv->vbi_dev);
  2203.         video_unregister_device(&btv->video_dev);
  2204. return -1;
  2205. }
  2206. printk(KERN_INFO "bttv%d: registered device radio%dn",
  2207.        btv->nr,btv->radio_dev.minor & 0x1f);
  2208. }
  2209.         return 1;
  2210. }
  2211. static int __devinit init_bt848(struct bttv *btv)
  2212. {
  2213. int j,val;
  2214.   unsigned long irq_flags;
  2215. btv->user=0; 
  2216.         init_MUTEX(&btv->lock);
  2217. /* dump current state of the gpio registers before changing them,
  2218.  * might help to make a new card work */
  2219. if (bttv_gpio) {
  2220. bttv_gpio_tracking(btv,"init #1");
  2221. bttv_gpio_tracking(btv,"init #1");
  2222. }
  2223. /* reset the bt848 */
  2224. btwrite(0, BT848_SRESET);
  2225. /* not registered yet */
  2226. btv->video_dev.minor = -1;
  2227. btv->radio_dev.minor = -1;
  2228. btv->vbi_dev.minor = -1;
  2229. /* default setup for max. PAL size in a 1024xXXX hicolor framebuffer */
  2230. btv->win.norm=0; /* change this to 1 for NTSC, 2 for SECAM */
  2231. btv->win.interlace=1;
  2232. btv->win.x=0;
  2233. btv->win.y=0;
  2234. btv->win.width=320;
  2235. btv->win.height=240;
  2236. btv->win.bpp=2;
  2237. btv->win.depth=16;
  2238. btv->win.color_fmt=BT848_COLOR_FMT_RGB16;
  2239. btv->win.bpl=1024*btv->win.bpp;
  2240. btv->win.swidth=1024;
  2241. btv->win.sheight=768;
  2242. btv->win.vidadr=0;
  2243. btv->vbi_on=0;
  2244. btv->scr_on=0;
  2245. btv->risc_scr_odd=0;
  2246. btv->risc_scr_even=0;
  2247. btv->risc_cap_odd=0;
  2248. btv->risc_cap_even=0;
  2249. btv->risc_jmp=0;
  2250. btv->vbibuf=0;
  2251.         btv->field=btv->last_field=0;
  2252. btv->errors=0;
  2253. btv->needs_restart=0;
  2254. btv->has_radio=radio[btv->nr];
  2255. if (!(btv->risc_scr_odd=(unsigned int *) kmalloc(RISCMEM_LEN/2, GFP_KERNEL)))
  2256. return -1;
  2257. if (!(btv->risc_scr_even=(unsigned int *) kmalloc(RISCMEM_LEN/2, GFP_KERNEL)))
  2258. return -1;
  2259. if (!(btv->risc_jmp =(unsigned int *) kmalloc(2048, GFP_KERNEL)))
  2260. return -1;
  2261. btv->vbi_odd=btv->risc_jmp+16;
  2262. btv->vbi_even=btv->vbi_odd+256;
  2263. btv->bus_vbi_odd=virt_to_bus(btv->risc_jmp+12);
  2264. btv->bus_vbi_even=virt_to_bus(btv->risc_jmp+6);
  2265. btwrite(virt_to_bus(btv->risc_jmp+2), BT848_RISC_STRT_ADD);
  2266. btv->vbibuf=(unsigned char *) vmalloc_32(VBIBUF_SIZE);
  2267. if (!btv->vbibuf) 
  2268. return -1;
  2269. if (!(btv->gbuf = kmalloc(sizeof(struct bttv_gbuf)*gbuffers,GFP_KERNEL)))
  2270. return -1;
  2271. for (j = 0; j < gbuffers; j++) {
  2272. if (!(btv->gbuf[j].risc = kmalloc(16384,GFP_KERNEL)))
  2273. return -1;
  2274. }
  2275. memset(btv->vbibuf, 0, VBIBUF_SIZE); /* We don't want to return random
  2276.                                         memory to the user */
  2277. btv->fbuffer=NULL;
  2278. /* btwrite(0, BT848_TDEC); */
  2279.         btwrite(0x10, BT848_COLOR_CTL);
  2280. btwrite(0x00, BT848_CAP_CTL);
  2281. /* set planar and packed mode trigger points and         */
  2282. /* set rising edge of inverted GPINTR pin as irq trigger */
  2283. btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
  2284. BT848_GPIO_DMA_CTL_PLTP1_16|
  2285. BT848_GPIO_DMA_CTL_PLTP23_16|
  2286. BT848_GPIO_DMA_CTL_GPINTC|
  2287. BT848_GPIO_DMA_CTL_GPINTI, 
  2288. BT848_GPIO_DMA_CTL);
  2289.         /* select direct input */
  2290. btwrite(0x00, BT848_GPIO_REG_INP);
  2291. btwrite(0x00, BT848_GPIO_OUT_EN);
  2292. if (bttv_gpio)
  2293. bttv_gpio_tracking(btv,"init #2");
  2294. btwrite(BT848_IFORM_MUX1 | BT848_IFORM_XTAUTO | BT848_IFORM_AUTO,
  2295. BT848_IFORM);
  2296. btwrite(0xd8, BT848_CONTRAST_LO);
  2297. bt848_bright(btv, 0x10);
  2298. btwrite(0x20, BT848_E_VSCALE_HI);
  2299. btwrite(0x20, BT848_O_VSCALE_HI);
  2300. btwrite(BT848_ADC_RESERVED | (adc_crush ? BT848_ADC_CRUSH : 0),
  2301. BT848_ADC);
  2302. if (lumafilter) {
  2303. btwrite(0, BT848_E_CONTROL);
  2304. btwrite(0, BT848_O_CONTROL);
  2305. } else {
  2306. btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
  2307. btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
  2308. }
  2309. btv->picture.colour=254<<7;
  2310. btv->picture.brightness=128<<8;
  2311. btv->picture.hue=128<<8;
  2312. btv->picture.contrast=0xd8<<7;
  2313. val = chroma_agc ? BT848_SCLOOP_CAGC : 0;
  2314.         btwrite(val, BT848_E_SCLOOP);
  2315.         btwrite(val, BT848_O_SCLOOP);
  2316. /* clear interrupt status */
  2317. btwrite(0xfffffUL, BT848_INT_STAT);
  2318.         
  2319. /* set interrupt mask */
  2320. btwrite(btv->triton1|
  2321.                 /*BT848_INT_PABORT|BT848_INT_RIPERR|BT848_INT_PPERR|
  2322.                   BT848_INT_FDSR|BT848_INT_FTRGT|BT848_INT_FBUS|*/
  2323.                 (fieldnr ? BT848_INT_VSYNC : 0)|
  2324. BT848_INT_GPINT|
  2325. BT848_INT_SCERR|
  2326. BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
  2327. BT848_INT_FMTCHG|BT848_INT_HLOCK,
  2328. BT848_INT_MASK);
  2329. bt848_muxsel(btv, 1);
  2330. bt848_set_winsize(btv);
  2331. make_vbitab(btv);
  2332. spin_lock_irqsave(&btv->s_lock, irq_flags);
  2333. bt848_set_risc_jmps(btv,-1);
  2334. spin_unlock_irqrestore(&btv->s_lock, irq_flags);
  2335. /* needs to be done before i2c is registered */
  2336. bttv_init_card1(btv);
  2337. /* register i2c */
  2338.         btv->tuner_type=-1;
  2339.         init_bttv_i2c(btv);
  2340. /* some card-specific stuff (needs working i2c) */
  2341. bttv_init_card2(btv);
  2342. /*
  2343.  * Now add the template and register the device unit.
  2344.  */
  2345.         init_video_dev(btv);
  2346. return 0;
  2347. }
  2348. /* ----------------------------------------------------------------------- */
  2349. static char *irq_name[] = { "FMTCHG", "VSYNC", "HSYNC", "OFLOW", "HLOCK",
  2350.     "VPRES", "6", "7", "I2CDONE", "GPINT", "10",
  2351.     "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
  2352.     "RIPERR", "PABORT", "OCERR", "SCERR" };
  2353. static void bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
  2354. {
  2355. u32 stat,astat;
  2356. u32 dstat;
  2357. int count;
  2358. struct bttv *btv;
  2359. btv=(struct bttv *)dev_id;
  2360. count=0;
  2361. while (1) 
  2362. {
  2363. /* get/clear interrupt status bits */
  2364. stat=btread(BT848_INT_STAT);
  2365. astat=stat&btread(BT848_INT_MASK);
  2366. if (!astat)
  2367. return;
  2368. btwrite(stat,BT848_INT_STAT);
  2369. /* get device status bits */
  2370. dstat=btread(BT848_DSTATUS);
  2371. if (irq_debug) {
  2372. int i;
  2373. printk(KERN_DEBUG "bttv%d: irq loop=%d risc=%x, bits:",
  2374.        btv->nr, count, stat>>28);
  2375. for (i = 0; i < (sizeof(irq_name)/sizeof(char*)); i++) {
  2376. if (stat & (1 << i))
  2377. printk(" %s",irq_name[i]);
  2378. if (astat & (1 << i))
  2379. printk("*");
  2380. }
  2381. if (stat & BT848_INT_HLOCK)
  2382. printk("   HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
  2383.        ? "yes" : "no");
  2384. if (stat & BT848_INT_VPRES)
  2385. printk("   PRES => %s", (dstat & BT848_DSTATUS_PRES)
  2386.        ? "yes" : "no");
  2387. if (stat & BT848_INT_FMTCHG)
  2388. printk("   NUML => %s", (dstat & BT848_DSTATUS_PRES)
  2389.        ? "625" : "525");
  2390. printk("n");
  2391. }
  2392. if (astat&BT848_INT_GPINT)
  2393. wake_up_interruptible(&btv->gpioq);
  2394. if (astat&BT848_INT_VSYNC) 
  2395.                         btv->field++;
  2396. if (astat&(BT848_INT_SCERR|BT848_INT_OCERR)) {
  2397. if (bttv_verbose)
  2398. printk("bttv%d: irq:%s%s risc_count=%08xn",
  2399.        btv->nr,
  2400.        (astat&BT848_INT_SCERR) ? " SCERR" : "",
  2401.        (astat&BT848_INT_OCERR) ? " OCERR" : "",
  2402.        btread(BT848_RISC_COUNT));
  2403. btv->errors++;
  2404. if (btv->errors < BTTV_ERRORS) {
  2405. spin_lock(&btv->s_lock);
  2406. btand(~15, BT848_GPIO_DMA_CTL);
  2407. btwrite(virt_to_bus(btv->risc_jmp+2),
  2408. BT848_RISC_STRT_ADD);
  2409. bt848_set_geo(btv);
  2410. bt848_set_risc_jmps(btv,-1);
  2411. spin_unlock(&btv->s_lock);
  2412. } else {
  2413. if (bttv_verbose)
  2414. printk("bttv%d: aiee: error loopsn",btv->nr);
  2415. bt848_offline(btv);
  2416. }
  2417. }
  2418. if (astat&BT848_INT_RISCI) 
  2419. {
  2420. if (bttv_debug > 1)
  2421. printk("bttv%d: IRQ_RISCIn",btv->nr);
  2422. /* captured VBI frame */
  2423. if (stat&(1<<28)) 
  2424. {
  2425. btv->vbip=0;
  2426. /* inc vbi frame count for detecting drops */
  2427. (*(u32 *)&(btv->vbibuf[VBIBUF_SIZE - 4]))++;
  2428. wake_up_interruptible(&btv->vbiq);
  2429. }
  2430. /* captured full frame */
  2431. if (stat&(2<<28) && btv->gq_grab != -1) 
  2432. {
  2433.                                 btv->last_field=btv->field;
  2434. if (bttv_debug)
  2435. printk("bttv%d: cap irq: done %dn",btv->nr,btv->gq_grab);
  2436. do_gettimeofday(&btv->gbuf[btv->gq_grab].tv);
  2437. spin_lock(&btv->s_lock);
  2438. btv->gbuf[btv->gq_grab].stat = GBUFFER_DONE;
  2439. btv->gq_grab = -1;
  2440.         if (btv->gq_in != btv->gq_out)
  2441. {
  2442. btv->gq_grab = btv->gqueue[btv->gq_out++];
  2443. btv->gq_out  = btv->gq_out % MAX_GBUFFERS;
  2444. if (bttv_debug)
  2445. printk("bttv%d: cap irq: capture %dn",btv->nr,btv->gq_grab);
  2446.                                         btv->risc_cap_odd  = btv->gbuf[btv->gq_grab].ro;
  2447. btv->risc_cap_even = btv->gbuf[btv->gq_grab].re;
  2448. bt848_set_risc_jmps(btv,-1);
  2449. bt848_set_geo(btv);
  2450. btwrite(BT848_COLOR_CTL_GAMMA,
  2451. BT848_COLOR_CTL);
  2452. } else {
  2453.                                         btv->risc_cap_odd  = 0;
  2454. btv->risc_cap_even = 0;
  2455. bt848_set_risc_jmps(btv,-1);
  2456.                                         bt848_set_geo(btv);
  2457. btwrite(btv->fb_color_ctl | BT848_COLOR_CTL_GAMMA,
  2458. BT848_COLOR_CTL);
  2459. }
  2460. spin_unlock(&btv->s_lock);
  2461. wake_up_interruptible(&btv->capq);
  2462. break;
  2463. }
  2464. if (stat&(8<<28) && btv->gq_start) 
  2465. {
  2466. spin_lock(&btv->s_lock);
  2467. btv->gq_start = 0;
  2468. btv->gq_grab = btv->gqueue[btv->gq_out++];
  2469. btv->gq_out  = btv->gq_out % MAX_GBUFFERS;
  2470. if (bttv_debug)
  2471. printk("bttv%d: cap irq: capture %d [start]n",btv->nr,btv->gq_grab);
  2472. btv->risc_cap_odd  = btv->gbuf[btv->gq_grab].ro;
  2473. btv->risc_cap_even = btv->gbuf[btv->gq_grab].re;
  2474. bt848_set_risc_jmps(btv,-1);
  2475. bt848_set_geo(btv);
  2476. btwrite(BT848_COLOR_CTL_GAMMA,
  2477. BT848_COLOR_CTL);
  2478. spin_unlock(&btv->s_lock);
  2479. }
  2480. }
  2481. if (automute && (astat&BT848_INT_HLOCK)) {
  2482. if ((dstat&BT848_DSTATUS_HLOC) || (btv->radio))
  2483. audio(btv, AUDIO_ON);
  2484. else
  2485. audio(btv, AUDIO_OFF);
  2486. }
  2487.     
  2488. count++;
  2489. if (count > 20) {
  2490. btwrite(0, BT848_INT_MASK);
  2491. printk(KERN_ERR 
  2492.        "bttv%d: IRQ lockup, cleared int maskn", btv->nr);
  2493. bt848_offline(btv);
  2494. }
  2495. }
  2496. }
  2497. /*
  2498.  * Scan for a Bt848 card, request the irq and map the io memory 
  2499.  */
  2500. static void bttv_remove(struct pci_dev *pci_dev)
  2501. {
  2502.         u8 command;
  2503.         int j;
  2504.         struct bttv *btv = pci_get_drvdata(pci_dev);
  2505. if (bttv_verbose)
  2506. printk("bttv%d: unloadingn",btv->nr);
  2507.         /* unregister i2c_bus */
  2508. if (0 == btv->i2c_rc)
  2509. i2c_bit_del_bus(&btv->i2c_adap);
  2510.         /* turn off all capturing, DMA and IRQs */
  2511.         btand(~15, BT848_GPIO_DMA_CTL);
  2512.         /* first disable interrupts before unmapping the memory! */
  2513.         btwrite(0, BT848_INT_MASK);
  2514.         btwrite(~0x0UL,BT848_INT_STAT);
  2515.         btwrite(0x0, BT848_GPIO_OUT_EN);
  2516. if (bttv_gpio)
  2517. bttv_gpio_tracking(btv,"cleanup");
  2518.         /* disable PCI bus-mastering */
  2519.         pci_read_config_byte(btv->dev, PCI_COMMAND, &command);
  2520.         command &= ~PCI_COMMAND_MASTER;
  2521.         pci_write_config_byte(btv->dev, PCI_COMMAND, command);
  2522.         /* unmap and free memory */
  2523.         for (j = 0; j < gbuffers; j++)
  2524.                 if (btv->gbuf[j].risc)
  2525.                         kfree(btv->gbuf[j].risc);
  2526.         if (btv->gbuf)
  2527.                 kfree((void *) btv->gbuf);
  2528.         if (btv->risc_scr_odd)
  2529.                 kfree((void *) btv->risc_scr_odd);
  2530.         if (btv->risc_scr_even)
  2531.                 kfree((void *) btv->risc_scr_even);
  2532.         DEBUG(printk(KERN_DEBUG "free: risc_jmp: 0x%p.n", btv->risc_jmp));
  2533.         if (btv->risc_jmp)
  2534.                 kfree((void *) btv->risc_jmp);
  2535.         DEBUG(printk(KERN_DEBUG "bt848_vbibuf: 0x%p.n", btv->vbibuf));
  2536.         if (btv->vbibuf)
  2537.                 vfree((void *) btv->vbibuf);
  2538.         free_irq(btv->dev->irq,btv);
  2539.         DEBUG(printk(KERN_DEBUG "bt848_mem: 0x%p.n", btv->bt848_mem));
  2540.         if (btv->bt848_mem)
  2541.                 iounmap(btv->bt848_mem);
  2542.         if (btv->video_dev.minor!=-1)
  2543.                 video_unregister_device(&btv->video_dev);
  2544.         if (btv->vbi_dev.minor!=-1)
  2545.                 video_unregister_device(&btv->vbi_dev);
  2546.         if (btv->radio_dev.minor != -1)
  2547.                 video_unregister_device(&btv->radio_dev);
  2548.         release_mem_region(pci_resource_start(btv->dev,0),
  2549.                            pci_resource_len(btv->dev,0));
  2550.         /* wake up any waiting processes
  2551.            because shutdown flag is set, no new processes (in this queue)
  2552.            are expected
  2553.         */
  2554.         btv->shutdown=1;
  2555.         wake_up(&btv->gpioq);
  2556. pci_set_drvdata(pci_dev, NULL);
  2557.         return;
  2558. }
  2559. static int __devinit bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
  2560. {
  2561. int result;
  2562. unsigned char lat;
  2563. struct bttv *btv;
  2564. #if defined(__powerpc__)
  2565.         unsigned int cmd;
  2566. #endif
  2567. if (bttv_num == BTTV_MAX)
  2568. return -ENOMEM;
  2569. printk(KERN_INFO "bttv: Bt8xx card found (%d).n", bttv_num);
  2570.         btv=&bttvs[bttv_num];
  2571.         btv->dev=dev;
  2572.         btv->nr = bttv_num;
  2573.         btv->bt848_mem=NULL;
  2574.         btv->vbibuf=NULL;
  2575.         btv->risc_jmp=NULL;
  2576.         btv->vbi_odd=NULL;
  2577.         btv->vbi_even=NULL;
  2578.         init_waitqueue_head(&btv->vbiq);
  2579.         init_waitqueue_head(&btv->capq);
  2580.         btv->vbip=VBIBUF_SIZE;
  2581. btv->s_lock = SPIN_LOCK_UNLOCKED;
  2582. init_waitqueue_head(&btv->gpioq);
  2583. btv->shutdown=0;
  2584. memcpy(&btv->video_dev,&bttv_template, sizeof(bttv_template));
  2585. memcpy(&btv->vbi_dev,&vbi_template, sizeof(vbi_template));
  2586. memcpy(&btv->radio_dev,&radio_template,sizeof(radio_template));
  2587.         btv->id=dev->device;
  2588. btv->bt848_adr=pci_resource_start(dev,0);
  2589. if (pci_enable_device(dev)) {
  2590.                 printk(KERN_WARNING "bttv%d: Can't enable device.n",
  2591.        btv->nr);
  2592. return -EIO;
  2593. }
  2594.         if (pci_set_dma_mask(dev, 0xffffffff)) {
  2595.                 printk(KERN_WARNING "bttv%d: No suitable DMA available.n",
  2596.        btv->nr);
  2597. return -EIO;
  2598.         }
  2599. if (!request_mem_region(pci_resource_start(dev,0),
  2600. pci_resource_len(dev,0),
  2601. "bttv")) {
  2602. return -EBUSY;
  2603. }
  2604.         if (btv->id >= 878)
  2605.                 btv->i2c_command = 0x83;                   
  2606.         else
  2607.                 btv->i2c_command=(I2C_TIMING | BT848_I2C_SCL | BT848_I2C_SDA);
  2608. if (-1 != latency) {
  2609. printk(KERN_INFO "bttv%d: setting pci latency timer to %dn",
  2610.        bttv_num,latency);
  2611. pci_write_config_byte(dev, PCI_LATENCY_TIMER, latency);
  2612. }
  2613.         pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
  2614.         pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
  2615.         printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %02x:%02x.%x, ",
  2616.                bttv_num,btv->id, btv->revision, dev->bus->number,
  2617.        PCI_SLOT(dev->devfn),PCI_FUNC(dev->devfn));
  2618.         printk("irq: %d, latency: %d, mmio: 0x%lxn",
  2619.        btv->dev->irq, lat, btv->bt848_adr);
  2620. bttv_idcard(btv);
  2621. #if defined(__powerpc__)
  2622.         /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
  2623.         /* response on cards with no firmware is not enabled by OF */
  2624.         pci_read_config_dword(dev, PCI_COMMAND, &cmd);
  2625.         cmd = (cmd | PCI_COMMAND_MEMORY ); 
  2626.         pci_write_config_dword(dev, PCI_COMMAND, cmd);
  2627. #endif
  2628. #ifdef __sparc__
  2629. btv->bt848_mem=(unsigned char *)btv->bt848_adr;
  2630. #else
  2631. btv->bt848_mem=ioremap(btv->bt848_adr, 0x1000);
  2632. #endif
  2633.         
  2634.         /* clear interrupt mask */
  2635. btwrite(0, BT848_INT_MASK);
  2636.         result = request_irq(btv->dev->irq, bttv_irq,
  2637.                              SA_SHIRQ | SA_INTERRUPT,"bttv",(void *)btv);
  2638.         if (result==-EINVAL) 
  2639.         {
  2640.                 printk(KERN_ERR "bttv%d: Bad irq number or handlern",
  2641.                        bttv_num);
  2642. goto fail1;
  2643.         }
  2644.         if (result==-EBUSY)
  2645.         {
  2646.                 printk(KERN_ERR "bttv%d: IRQ %d busy, change your PnP config in BIOSn",bttv_num,btv->dev->irq);
  2647. goto fail1;
  2648.         }
  2649.         if (result < 0) 
  2650. goto fail1;
  2651.         
  2652. if (0 != bttv_handle_chipset(btv)) {
  2653. result = -1;
  2654. goto fail2;
  2655. }
  2656.         pci_set_master(dev);
  2657. pci_set_drvdata(dev,btv);
  2658. if(init_bt848(btv) < 0) {
  2659. bttv_remove(dev);
  2660. return -EIO;
  2661. }
  2662. bttv_num++;
  2663.         return 0;
  2664.  fail2:
  2665.         free_irq(btv->dev->irq,btv);
  2666.  fail1:
  2667. release_mem_region(pci_resource_start(btv->dev,0),
  2668.    pci_resource_len(btv->dev,0));
  2669. return result;
  2670. }
  2671. static struct pci_device_id bttv_pci_tbl[] __devinitdata = {
  2672.         {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
  2673.          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
  2674. {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
  2675.          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
  2676. {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
  2677.          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
  2678. {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
  2679.          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
  2680.         {0,}
  2681. };
  2682. MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
  2683. static struct pci_driver bttv_pci_driver = {
  2684.         name:     "bttv",
  2685.         id_table: bttv_pci_tbl,
  2686.         probe:    bttv_probe,
  2687.         remove:   bttv_remove,
  2688. };
  2689. static int bttv_init_module(void)
  2690. {
  2691. bttv_num = 0;
  2692. printk(KERN_INFO "bttv: driver version %d.%d.%d loadedn",
  2693.        (BTTV_VERSION_CODE >> 16) & 0xff,
  2694.        (BTTV_VERSION_CODE >> 8) & 0xff,
  2695.        BTTV_VERSION_CODE & 0xff);
  2696. if (gbuffers < 2 || gbuffers > MAX_GBUFFERS)
  2697. gbuffers = 2;
  2698. if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
  2699. gbufsize = BTTV_MAX_FBUF;
  2700. if (bttv_verbose)
  2701. printk(KERN_INFO "bttv: using %d buffers with %dk (%dk total) for capturen",
  2702.        gbuffers,gbufsize/1024,gbuffers*gbufsize/1024);
  2703. bttv_check_chipset();
  2704. return pci_module_init(&bttv_pci_driver);
  2705. }
  2706. static void bttv_cleanup_module(void)
  2707. {
  2708. pci_unregister_driver(&bttv_pci_driver);
  2709. return;
  2710. }
  2711. module_init(bttv_init_module);
  2712. module_exit(bttv_cleanup_module);
  2713. /*
  2714.  * Local variables:
  2715.  * c-basic-offset: 8
  2716.  * End:
  2717.  */