cyberpro.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:48k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * CyberPro 2000 video capture driver for the Rebel.com NetWinder
  3.  *
  4.  * (C) 1999-2000 Russell King
  5.  *
  6.  *  Re-written from Rebel.com's vidcap driver.
  7.  *
  8.  * Architecture
  9.  * ------------
  10.  *  The NetWinder video capture consists of a SAA7111 video decoder chip
  11.  *  connected to the CyberPro feature bus.  The video data is captured to
  12.  *  the VGA memory, where the CyberPro can overlay (by chromakeying) the
  13.  *  data onto the VGA display.
  14.  *
  15.  *  The CyberPro also has some nifty features, including a second overlay
  16.  *  and picture in picture mode.  We do not currently use these features.
  17.  *
  18.  * Power Saving
  19.  * ------------
  20.  *  Please note that rev.5 NetWinders have the ability to hold the SAA7111
  21.  *  decoder chip into reset, which saves power.  The only time at which
  22.  *  this is done is when the driver is unloaded, which implies that this
  23.  *  is compiled as a module.
  24.  *
  25.  *  In this case, you will want the kernel to automatically load this
  26.  *  driver when required.  Place the following line in /etc/modules.conf
  27.  *  to enable this:
  28.  *
  29.  *   alias char-major-81-0 cyberpro
  30.  *
  31.  *  The relevant modules will be automatically loaded by modprobe on a
  32.  *  as and when needed basis.
  33.  *
  34.  * Capture resolution
  35.  * ------------------
  36.  *  The maximum useful capture resolution is:
  37.  *     625-line UK: 716x576
  38.  *     525-line US: ?
  39.  *
  40.  * Bugs
  41.  * ----
  42.  *  1. The CyberPro chip seems to be prone to randomly scribbling over VGA
  43.  *     memory [hopefully fixed with new capture enable/freeze stuff]
  44.  *  2. read()ing pauses video capture, and sometimes triggers bug 1.
  45.  *  3. mmap() is not supported (requires BM-DMA - see bug 4)
  46.  *  4. Really, we want to do scatter BM-DMA.  Is the CyberPro capable of this?
  47.  *     The Cyberpro seems to randomly scribble to various PCI addresses if you
  48.  *     transfer >16 words.
  49.  *  5. We shouldn't ignore O_NONBLOCK when reading a frame.
  50.  *  6. The incoming stream on the NetWinder is CCIR656, which is YUV422.
  51.  *     CyberPro docs also call the format we capture and overlay "YUV422",
  52.  *     but we actually seem to have Y, U, Y, V bytes (is this YUYV format?)
  53.  */
  54. #include <linux/config.h>
  55. #include <linux/module.h>
  56. #include <linux/videodev.h>
  57. #include <linux/video_decoder.h>
  58. #include <linux/mm.h>
  59. #include <linux/i2c-old.h>
  60. #include <linux/spinlock.h>
  61. #include <linux/slab.h>
  62. #include <linux/vmalloc.h>
  63. #include <linux/delay.h>
  64. #include <linux/sched.h>
  65. #include <linux/kmod.h>
  66. #include <linux/pci.h>
  67. #include <linux/init.h>
  68. #include <asm/io.h>
  69. #include <asm/irq.h>
  70. #include <asm/pgtable.h>
  71. #include <asm/pgalloc.h>
  72. MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
  73. MODULE_DESCRIPTION("CyberPro v4l video grabber");
  74. MODULE_LICENSE("GPL");
  75. #include "../../video/cyber2000fb.h"
  76. /*
  77.  * These enable various experimental features.  Most of these
  78.  * are just plain broken or just don't work at the moment.
  79.  */
  80. /*
  81.  * Enable this if you want mmap() access. (see bug 4)
  82.  */
  83. #undef USE_MMAP
  84. /*
  85.  * Enable this if you want mmio access. (slow)
  86.  */
  87. #define USE_MMIO
  88. /*
  89.  * The V4L API is unclear whether VIDIOCSCAPTURE call is allowed while
  90.  * capture is running.  The default is to disallow the call.
  91.  *
  92.  * Define this if you do want to allow the call while capture is active.
  93.  */
  94. #undef ALLOW_SCAPTURE_WHILE_CAP
  95. /*
  96.  * We capture two frames
  97.  */
  98. #define NR_FRAMES 2
  99. /*
  100.  * One frame of video is 202 pages, assuming YUV422 format, 716x576
  101.  */
  102. #define NR_PAGES 202
  103. struct src_info {
  104. unsigned int offset; /* offset of source data */
  105. unsigned int x; /* source x */
  106. unsigned int y; /* source y */
  107. unsigned int width; /* source width */
  108. unsigned int height; /* source height */
  109. unsigned int format; /* source format */
  110. };
  111. struct dst_info {
  112. unsigned int x; /* destination x */
  113. unsigned int y; /* destination y */
  114. unsigned int width; /* destination width */
  115. unsigned int height; /* destination height */
  116. unsigned int chromakey; /* chromakey */
  117. unsigned int flags; /* flags (eg, chromakey enable) */
  118. };
  119. struct cyberpro_vidinfo;
  120. struct win_info {
  121. void (*init)(struct cyberpro_vidinfo *dp, struct win_info *wi);
  122. void (*set_src)(struct cyberpro_vidinfo *dp, struct win_info *wi);
  123. void (*set_win)(struct cyberpro_vidinfo *dp, struct win_info *wi);
  124. void (*ctl)(struct cyberpro_vidinfo *dp, struct win_info *wi, int on_off);
  125. /* public */
  126. struct src_info src;
  127. struct dst_info dst;
  128. /* private */
  129. unsigned short vid_fifo_ctl;
  130. unsigned char vid_fmt;
  131. unsigned char vid_disp_ctl1;
  132. unsigned char vid_fifo_ctl1;
  133. unsigned char vid_misc_ctl1;
  134. };
  135. struct framebuf {
  136. unsigned int offset; /* mmap offset for this frame */
  137. unsigned int status;
  138. #define FRAME_FREE 0
  139. #define FRAME_DONE 1
  140. #define FRAME_WAITING 2
  141. #define FRAME_GRABBING 3
  142. /*
  143.  * Bus-Master DMA stuff.  Note that we should
  144.  * probably use the kiovec stuff instead.
  145.  */
  146. unsigned long bus_addr[NR_PAGES]; /* list of pages */
  147. struct page *pages[NR_PAGES];
  148. void *buffer;
  149. int dbg;
  150. };
  151. struct cyberpro_vidinfo {
  152. struct video_device *dev;
  153. struct i2c_bus *bus;
  154. struct cyberpro_info info; /* host information */
  155. unsigned char *regs;
  156. unsigned int irq; /* PCI interrupt number */
  157. /* hardware configuration */
  158. unsigned int stream_fmt; /* format of stream from decoder*/
  159. /* software settings */
  160. unsigned int decoder:1; /* decoder loaded */
  161. unsigned int interlace:1; /* interlace */
  162. unsigned int buf_set:1; /* VIDIOCSFBUF has been issued */
  163. unsigned int win_set:1; /* VIDIOCSWIN has been issued  */
  164. unsigned int cap_active:1; /* capture is active */
  165. unsigned int ovl_active:1; /* overlay is active */
  166. unsigned int mmaped:1; /* buffer is mmap()d */
  167. unsigned int unused:25;
  168. unsigned int users; /* number of users */
  169. unsigned long cap_mem_offset; /* capture framebuffer offset */
  170. void * buffer; /* kernel capture buffer */
  171. unsigned int norm; /* video standard */
  172. struct video_capability cap; /* capabilities */
  173. struct video_picture pic; /* current picture settings */
  174. struct video_buffer buf; /* display parameters */
  175. struct video_capture capt; /* video capture params */
  176. struct win_info *ovl; /* overlay window set */
  177. struct win_info ext; /* "Extended" window info */
  178. struct win_info v2; /* "V2" window info */
  179. struct win_info x2; /* "X2" window info */
  180. unsigned int bm_offset; /* Cap memory bus master offset */
  181. unsigned int bm_index; /* Cap page index */
  182. #ifdef USE_MMAP
  183. unsigned int frame_idx; /* currently grabbing frame */
  184. unsigned int frame_size;
  185. struct framebuf frame[NR_FRAMES];
  186. wait_queue_head_t frame_wait;
  187. #endif
  188. wait_queue_head_t vbl_wait;
  189. /*
  190.  * cyberpro registers
  191.  */
  192. unsigned char cap_mode1;
  193. unsigned char cap_mode2;
  194. unsigned char cap_miscctl;
  195. unsigned char vfac1;
  196. unsigned char vfac3;
  197. };
  198. /*
  199.  * Our access methods.
  200.  */
  201. #define cyberpro_writel(val,reg,dp) writel(val, (dp)->regs + (reg))
  202. #define cyberpro_writew(val,reg,dp) writew(val, (dp)->regs + (reg))
  203. #define cyberpro_writeb(val,reg,dp) writeb(val, (dp)->regs + (reg))
  204. #define cyberpro_readb(reg,dp) readb((dp)->regs + (reg))
  205. static inline void
  206. cyberpro_grphw(unsigned int reg, unsigned int val, struct cyberpro_vidinfo *dp)
  207. {
  208. cyberpro_writew((reg & 255) | val << 8, 0x3ce, dp);
  209. }
  210. static void cyberpro_grphw8(unsigned int reg, unsigned int val, struct cyberpro_vidinfo *dp)
  211. {
  212. cyberpro_grphw(reg, val, dp);
  213. }
  214. static unsigned char cyberpro_grphr8(int reg, struct cyberpro_vidinfo *dp)
  215. {
  216. cyberpro_writeb(reg, 0x3ce, dp);
  217. return cyberpro_readb(0x3cf, dp);
  218. }
  219. static void cyberpro_grphw16(int reg, unsigned int val, struct cyberpro_vidinfo *dp)
  220. {
  221. cyberpro_grphw(reg, val, dp);
  222. cyberpro_grphw(reg + 1, val >> 8, dp);
  223. }
  224. static void cyberpro_grphw24(int reg, unsigned int val, struct cyberpro_vidinfo *dp)
  225. {
  226. cyberpro_grphw(reg, val, dp);
  227. cyberpro_grphw(reg + 1, val >> 8, dp);
  228. cyberpro_grphw(reg + 2, val >> 16, dp);
  229. }
  230. #if 0
  231. static void
  232. cyberpro_dbg_dump(void)
  233. {
  234. int i;
  235. unsigned char idx[] =
  236. { 0x30, 0x3e, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,
  237.   0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad };
  238. printk(KERN_DEBUG);
  239. for (i = 0; i < sizeof(idx); i++)
  240. printk("%02x ", idx[i]);
  241. printk("n" KERN_DEBUG);
  242. for (i = 0; i < sizeof(idx); i++)
  243. printk("%02x ", cyberpro_grphr8(idx[i]));
  244. printk("n");
  245. }
  246. #endif
  247. /*
  248.  * On the NetWinder, we can put the SAA7111 to sleep by holding
  249.  * it in reset.
  250.  *
  251.  * Note: once we have initialised the SAA7111, we can't put it back to
  252.  * sleep and expect it to keep its settings.  Maybe a better solution
  253.  * is to register/de-register the i2c bus in open/release?
  254.  */
  255. static void
  256. decoder_sleep(int sleep)
  257. {
  258. #ifdef CONFIG_ARCH_NETWINDER
  259. extern spinlock_t gpio_lock;
  260. spin_lock_irq(&gpio_lock);
  261. cpld_modify(CPLD_7111_DISABLE, sleep ? CPLD_7111_DISABLE : 0);
  262. spin_unlock_irq(&gpio_lock);
  263. if (!sleep) {
  264. /*
  265.  * wait 20ms for device to wake up
  266.  */
  267. set_current_state(TASK_UNINTERRUPTIBLE);
  268. schedule_timeout(HZ / 50);
  269. }
  270. #endif
  271. }
  272. /* -------------------------------- I2C support ---------------------------- */
  273. #define I2C_DELAY 100
  274. static void
  275. cyberpro_i2c_setlines(struct i2c_bus *bus, int ctrl, int data)
  276. {
  277. struct cyberpro_vidinfo *dp = bus->data;
  278. int v;
  279. v = (ctrl ? EXT_LATCH2_I2C_CLKEN : 0x00) | (data ? EXT_LATCH2_I2C_DATEN : 0x00);
  280. cyberpro_grphw8(EXT_LATCH2, v, dp);
  281. udelay(I2C_DELAY);
  282. }
  283. static int
  284. cyberpro_i2c_getdataline(struct i2c_bus *bus)
  285. {
  286. struct cyberpro_vidinfo *dp = bus->data;
  287. unsigned long flags;
  288. int v;
  289. save_flags(flags);
  290. cli();
  291. v = cyberpro_grphr8(EXT_LATCH2, dp);
  292. restore_flags(flags);
  293. return v & EXT_LATCH2_I2C_DAT ? 1 : 0;
  294. }
  295. static void
  296. cyberpro_i2c_attach(struct i2c_bus *bus, int id)
  297. {
  298. struct cyberpro_vidinfo *dp = bus->data;
  299. int zero = 0;
  300. if (id == I2C_DRIVERID_VIDEODECODER) {
  301. __u16 norm = dp->norm;
  302. i2c_control_device(bus, id, DECODER_SET_NORM, &norm);
  303. i2c_control_device(bus, id, DECODER_SET_PICTURE, &dp->pic);
  304. i2c_control_device(bus, id, DECODER_ENABLE_OUTPUT, &zero);
  305. dp->decoder = 1;
  306. }
  307. }
  308. static void
  309. cyberpro_i2c_detach(struct i2c_bus *bus, int id)
  310. {
  311. struct cyberpro_vidinfo *dp = bus->data;
  312. if (id == I2C_DRIVERID_VIDEODECODER)
  313. dp->decoder = 0;
  314. }
  315. static struct i2c_bus cyberpro_i2c_bus = {
  316. name: "",
  317. id: I2C_BUSID_CYBER2000,
  318. bus_lock: SPIN_LOCK_UNLOCKED,
  319. attach_inform: cyberpro_i2c_attach,
  320. detach_inform: cyberpro_i2c_detach,
  321. i2c_setlines: cyberpro_i2c_setlines,
  322. i2c_getdataline: cyberpro_i2c_getdataline,
  323. };
  324. /*------------------------- Extended Overlay Window -------------------------
  325.  * Initialise 1st overlay window (works)
  326.  */
  327. static void
  328. cyberpro_ext_init(struct cyberpro_vidinfo *dp, struct win_info *wi)
  329. {
  330. wi->vid_fifo_ctl  = 0xf87c;
  331. wi->vid_fmt       = EXT_VID_FMT_YUV422;
  332. wi->vid_disp_ctl1 = EXT_VID_DISP_CTL1_VINTERPOL_OFF |
  333.     EXT_VID_DISP_CTL1_NOCLIP;
  334. wi->vid_fifo_ctl1 = EXT_VID_FIFO_CTL1_INTERLEAVE |
  335.     EXT_VID_FIFO_CTL1_OE_HIGH;
  336. wi->vid_misc_ctl1 = 0;
  337. cyberpro_grphw8 (EXT_VID_DISP_CTL1,  wi->vid_disp_ctl1, dp);
  338. cyberpro_grphw16(EXT_DDA_X_INIT,     0x0800, dp);
  339. cyberpro_grphw16(EXT_DDA_Y_INIT,     0x0800, dp);
  340. cyberpro_grphw16(EXT_VID_FIFO_CTL,   wi->vid_fifo_ctl, dp);
  341. cyberpro_grphw8 (EXT_VID_FIFO_CTL1,  wi->vid_fifo_ctl1, dp);
  342. }
  343. /*
  344.  * Set the source parameters for the extended window
  345.  */
  346. static void
  347. cyberpro_ext_set_src(struct cyberpro_vidinfo *dp, struct win_info *wi)
  348. {
  349. unsigned int phase, pitch;
  350. pitch = (wi->src.width >> 2) & 0x0fff;
  351. phase = (wi->src.width + 3) >> 2;
  352. wi->vid_fmt &= ~7;
  353. switch (wi->src.format) {
  354. case VIDEO_PALETTE_RGB565: wi->vid_fmt |= EXT_VID_FMT_RGB565;    break;
  355. case VIDEO_PALETTE_RGB24:  wi->vid_fmt |= EXT_VID_FMT_RGB888_24; break;
  356. case VIDEO_PALETTE_RGB32:  wi->vid_fmt |= EXT_VID_FMT_RGB888_32; break;
  357. case VIDEO_PALETTE_RGB555: wi->vid_fmt |= EXT_VID_FMT_RGB555;    break;
  358. case VIDEO_PALETTE_YUV422: wi->vid_fmt |= EXT_VID_FMT_YUV422;    break;
  359. }
  360. cyberpro_grphw24(EXT_MEM_START, wi->src.offset, dp);
  361. cyberpro_grphw16(EXT_SRC_WIDTH, pitch | ((phase << 4) & 0xf000), dp);
  362. cyberpro_grphw8 (EXT_SRC_WIN_WIDTH, phase, dp);
  363. cyberpro_grphw8 (EXT_VID_FMT, wi->vid_fmt, dp);
  364. }
  365. /*
  366.  * Set overlay1 window
  367.  */
  368. static void
  369. cyberpro_ext_set_win(struct cyberpro_vidinfo *dp, struct win_info *wi)
  370. {
  371. unsigned int xscale, yscale;
  372. unsigned int xoff, yoff;
  373. /*
  374.  * Note: the offset does not appear to be influenced by
  375.  * hardware scrolling.
  376.  */
  377. xoff = yoff = 0;
  378. xoff += wi->dst.x;
  379. yoff += wi->dst.y;
  380. xscale = wi->src.width;
  381. if (wi->dst.width >= wi->src.width * 2) {
  382. wi->vid_fmt |= EXT_VID_FMT_DBL_H_PIX;
  383. xscale *= 2;
  384. } else {
  385. wi->vid_fmt &= ~EXT_VID_FMT_DBL_H_PIX;
  386. }
  387. xscale = ((xscale - /*2*/0) * 4096) / wi->dst.width;
  388. yscale = ((wi->src.height - /*2*/0) * 4096) / wi->dst.height;
  389. cyberpro_grphw16(EXT_X_START, xoff, dp);
  390. cyberpro_grphw16(EXT_X_END,   xoff + wi->dst.width, dp);
  391. cyberpro_grphw16(EXT_Y_START, yoff, dp);
  392. cyberpro_grphw16(EXT_Y_END,   yoff + wi->dst.height, dp);
  393. cyberpro_grphw24(EXT_COLOUR_COMPARE, wi->dst.chromakey, dp);
  394. cyberpro_grphw16(EXT_DDA_X_INC, xscale, dp);
  395. cyberpro_grphw16(EXT_DDA_Y_INC, yscale, dp);
  396. cyberpro_grphw8(EXT_VID_FMT, wi->vid_fmt, dp);
  397. if (wi->dst.flags & VIDEO_WINDOW_CHROMAKEY)
  398. wi->vid_disp_ctl1 &= ~EXT_VID_DISP_CTL1_IGNORE_CCOMP;
  399. else
  400. wi->vid_disp_ctl1 |= EXT_VID_DISP_CTL1_IGNORE_CCOMP;
  401. }
  402. /*
  403.  * Enable or disable the 1st overlay window.  Note that for anything
  404.  * useful to be displayed, we must have capture enabled.
  405.  */
  406. static void
  407. cyberpro_ext_ctl(struct cyberpro_vidinfo *dp, struct win_info *wi, int on)
  408. {
  409. if (on)
  410. wi->vid_disp_ctl1 |= EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  411. else
  412. wi->vid_disp_ctl1 &= ~EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  413. cyberpro_grphw8(EXT_VID_DISP_CTL1, wi->vid_disp_ctl1, dp);
  414. }
  415. /*------------------------------- V2 Overlay Window -------------------------
  416.  * Initialise 2nd overlay window (guesswork)
  417.  */
  418. static void
  419. cyberpro_v2_init(struct cyberpro_vidinfo *dp, struct win_info *wi)
  420. {
  421. wi->vid_fifo_ctl  = 0xf87c;
  422. wi->vid_fmt       = EXT_VID_FMT_YUV422;
  423. wi->vid_disp_ctl1 = EXT_VID_DISP_CTL1_VINTERPOL_OFF |
  424.     EXT_VID_DISP_CTL1_NOCLIP;
  425. wi->vid_fifo_ctl1 = 0x06;
  426. wi->vid_misc_ctl1 = 0;
  427. cyberpro_grphw8(REG_BANK, REG_BANK_Y, dp);
  428. cyberpro_grphw8 (Y_V2_VID_DISP_CTL1, wi->vid_disp_ctl1, dp);
  429. /* No DDA init values */
  430. cyberpro_grphw16(Y_V2_VID_FIFO_CTL,  wi->vid_fifo_ctl, dp);
  431. cyberpro_grphw8 (Y_V2_VID_FIFO_CTL1, wi->vid_fifo_ctl1, dp);
  432. }
  433. /*
  434.  * Set the source parameters for the v2 window
  435.  */
  436. static void
  437. cyberpro_v2_set_src(struct cyberpro_vidinfo *dp, struct win_info *wi)
  438. {
  439. unsigned int phase, pitch;
  440. pitch = (wi->src.width >> 2) & 0x0fff;
  441. phase = (wi->src.width + 3) >> 2;
  442. wi->vid_fmt &= ~7;
  443. switch (wi->src.format) {
  444. case VIDEO_PALETTE_RGB565: wi->vid_fmt |= EXT_VID_FMT_RGB565;    break;
  445. case VIDEO_PALETTE_RGB24:  wi->vid_fmt |= EXT_VID_FMT_RGB888_24; break;
  446. case VIDEO_PALETTE_RGB32:  wi->vid_fmt |= EXT_VID_FMT_RGB888_32; break;
  447. case VIDEO_PALETTE_RGB555: wi->vid_fmt |= EXT_VID_FMT_RGB555;    break;
  448. case VIDEO_PALETTE_YUV422: wi->vid_fmt |= EXT_VID_FMT_YUV422;    break;
  449. }
  450. cyberpro_grphw8(REG_BANK, REG_BANK_X, dp);
  451. cyberpro_grphw24(X_V2_VID_MEM_START, wi->src.offset, dp);
  452. cyberpro_grphw16(X_V2_VID_SRC_WIDTH, pitch | ((phase << 4) & 0xf000), dp);
  453. cyberpro_grphw8 (X_V2_VID_SRC_WIN_WIDTH, phase, dp);
  454. cyberpro_grphw8(REG_BANK, REG_BANK_Y, dp);
  455. cyberpro_grphw8(Y_V2_VID_FMT, wi->vid_fmt, dp);
  456. }
  457. /*
  458.  * Set v2 window
  459.  */
  460. static void
  461. cyberpro_v2_set_win(struct cyberpro_vidinfo *dp, struct win_info *wi)
  462. {
  463. unsigned int xscale, yscale;
  464. unsigned int xoff, yoff;
  465. /*
  466.  * Note: the offset does not appear to be influenced by
  467.  * hardware scrolling.
  468.  */
  469. xoff = yoff = 0;
  470. xoff += wi->dst.x;
  471. yoff += wi->dst.y;
  472. xscale = (wi->src.width  * 4096) / wi->dst.width;
  473. yscale = (wi->src.height * 4096) / wi->dst.height;
  474. cyberpro_grphw8(REG_BANK, REG_BANK_X, dp);
  475. cyberpro_grphw16(X_V2_X_START, xoff, dp);
  476. cyberpro_grphw16(X_V2_X_END, xoff + wi->dst.width, dp);
  477. cyberpro_grphw16(X_V2_Y_START, yoff, dp);
  478. cyberpro_grphw16(X_V2_Y_END, yoff + wi->dst.height, dp);
  479. cyberpro_grphw8(REG_BANK, REG_BANK_Y, dp);
  480. cyberpro_grphw16(Y_V2_DDA_X_INC, xscale, dp);
  481. cyberpro_grphw16(Y_V2_DDA_Y_INC, yscale, dp);
  482. }
  483. /*
  484.  * Enable or disable the 2nd overlay window.  Note that for anything
  485.  * useful to be displayed, we must have capture enabled.
  486.  */
  487. static void
  488. cyberpro_v2_ctl(struct cyberpro_vidinfo *dp, struct win_info *wi, int on)
  489. {
  490. if (on)
  491. wi->vid_disp_ctl1 |= EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  492. else
  493. wi->vid_disp_ctl1 &= ~EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  494. cyberpro_grphw8(REG_BANK, REG_BANK_Y, dp);
  495. cyberpro_grphw8(Y_V2_VID_DISP_CTL1, wi->vid_disp_ctl1, dp);
  496. }
  497. /*--------------------------- X2 Overlay Window -----------------------------
  498.  * Initialise 3rd overlay window (guesswork)
  499.  */
  500. static void
  501. cyberpro_x2_init(struct cyberpro_vidinfo *dp, struct win_info *wi)
  502. {
  503. wi->vid_fmt       = EXT_VID_FMT_YUV422;
  504. wi->vid_disp_ctl1 = 0x40;
  505. wi->vid_misc_ctl1 = 0;
  506. cyberpro_grphw8(REG_BANK, REG_BANK_K, dp);
  507. cyberpro_grphw8 (K_X2_VID_DISP_CTL1, wi->vid_disp_ctl1, dp);
  508. cyberpro_grphw16(K_X2_DDA_X_INIT, 0x0800, dp);
  509. cyberpro_grphw16(K_X2_DDA_Y_INIT, 0x0800, dp);
  510. }
  511. /*
  512.  * Set the source parameters for the x2 window
  513.  */
  514. static void
  515. cyberpro_x2_set_src(struct cyberpro_vidinfo *dp, struct win_info *wi)
  516. {
  517. unsigned int phase, pitch;
  518. pitch = (wi->src.width >> 2) & 0x0fff;
  519. phase = (wi->src.width + 3) >> 2;
  520. wi->vid_fmt &= ~7;
  521. switch (wi->src.format) {
  522. case VIDEO_PALETTE_RGB565: wi->vid_fmt |= EXT_VID_FMT_RGB565;    break;
  523. case VIDEO_PALETTE_RGB24:  wi->vid_fmt |= EXT_VID_FMT_RGB888_24; break;
  524. case VIDEO_PALETTE_RGB32:  wi->vid_fmt |= EXT_VID_FMT_RGB888_32; break;
  525. case VIDEO_PALETTE_RGB555: wi->vid_fmt |= EXT_VID_FMT_RGB555;    break;
  526. case VIDEO_PALETTE_YUV422: wi->vid_fmt |= EXT_VID_FMT_YUV422;    break;
  527. }
  528. cyberpro_grphw8(REG_BANK, REG_BANK_J, dp);
  529. cyberpro_grphw24(J_X2_VID_MEM_START, wi->src.offset, dp);
  530. cyberpro_grphw16(J_X2_VID_SRC_WIDTH, pitch | ((phase << 4) & 0xf000), dp);
  531. cyberpro_grphw8 (J_X2_VID_SRC_WIN_WIDTH, phase, dp);
  532. cyberpro_grphw8(REG_BANK, REG_BANK_K, dp);
  533. cyberpro_grphw8(K_X2_VID_FMT, wi->vid_fmt, dp);
  534. }
  535. /*
  536.  * Set x2 window
  537.  */
  538. static void
  539. cyberpro_x2_set_win(struct cyberpro_vidinfo *dp, struct win_info *wi)
  540. {
  541. unsigned int xscale, yscale;
  542. unsigned int xoff, yoff;
  543. /*
  544.  * Note: the offset does not appear to be influenced by
  545.  * hardware scrolling.
  546.  */
  547. xoff = yoff = 0;
  548. xoff += wi->dst.x;
  549. yoff += wi->dst.y;
  550. xscale = (wi->src.width  * 4096) / wi->dst.width;
  551. yscale = (wi->src.height * 4096) / wi->dst.height;
  552. cyberpro_grphw8(REG_BANK, REG_BANK_J, dp);
  553. cyberpro_grphw16(J_X2_X_START, xoff, dp);
  554. cyberpro_grphw16(J_X2_X_END, xoff + wi->dst.width, dp);
  555. cyberpro_grphw16(J_X2_Y_START, yoff, dp);
  556. cyberpro_grphw16(J_X2_Y_END, yoff + wi->dst.height, dp);
  557. cyberpro_grphw8(REG_BANK, REG_BANK_K, dp);
  558. cyberpro_grphw16(K_X2_DDA_X_INC, xscale, dp);
  559. cyberpro_grphw16(K_X2_DDA_Y_INC, yscale, dp);
  560. }
  561. /*
  562.  * Enable or disable the 3rd overlay window.  Note that for anything
  563.  * useful to be displayed, we must have capture enabled.
  564.  */
  565. static void
  566. cyberpro_x2_ctl(struct cyberpro_vidinfo *dp, struct win_info *wi, int on)
  567. {
  568. if (on)
  569. wi->vid_disp_ctl1 |= EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  570. else
  571. wi->vid_disp_ctl1 &= ~EXT_VID_DISP_CTL1_ENABLE_WINDOW;
  572. cyberpro_grphw8(REG_BANK, REG_BANK_K, dp);
  573. cyberpro_grphw8(K_X2_VID_DISP_CTL1, wi->vid_disp_ctl1, dp);
  574. }
  575. /* ------------------------------------------------------------------------- */
  576. #if 0
  577. static void reset_seq(struct cyberpro_vidinfo *dp)
  578. {
  579. unsigned char ext_mem_ctl = cyberpro_grphr8(0x70, dp);
  580. cyberpro_grphw8(ext_mem_ctl | 0x80, 0x70, dp);
  581. cyberpro_grphw8(ext_mem_ctl, 0x70, dp);
  582. }
  583. #endif
  584. #ifdef USE_MMAP
  585. /*
  586.  * Buffer support
  587.  */
  588. static int
  589. cyberpro_alloc_frame_buffer(struct cyberpro_vidinfo *dp,
  590.     struct framebuf *frame)
  591. {
  592. unsigned long addr;
  593. void *buffer;
  594. int pgidx;
  595. if (frame->buffer)
  596. return 0;
  597. /*
  598.  * Allocate frame buffer
  599.  */
  600. buffer = vmalloc(NR_PAGES * PAGE_SIZE);
  601. if (frame->buffer) {
  602. vfree(buffer);
  603. return 0;
  604. }
  605. if (!buffer)
  606. return -ENOMEM;
  607. printk("Buffer allocated @ %p [", buffer);
  608. frame->buffer = buffer;
  609. frame->dbg = 1;
  610. /*
  611.  * Don't leak information from the kernel.
  612.  */
  613. memset(buffer, 0x5a, NR_PAGES * PAGE_SIZE);
  614. /*
  615.  * Now, reserve all the pages, and calculate
  616.  * each pages' bus address.
  617.  */
  618. addr = (unsigned long)buffer;
  619. for (pgidx = 0; pgidx < NR_PAGES; pgidx++, addr += PAGE_SIZE) {
  620. struct page *page;
  621. pgd_t *pgd;
  622. pmd_t *pmd;
  623. pte_t *pte;
  624. /*
  625.  * The page should be present.  If not,
  626.  * vmalloc has gone nuts.
  627.  */
  628. pgd = pgd_offset_k(addr);
  629. if (pgd_none(*pgd))
  630. BUG();
  631. pmd = pmd_offset(pgd, addr);
  632. if (pmd_none(*pmd))
  633. BUG();
  634. pte = pte_offset(pmd, addr);
  635. if (!pte_present(*pte))
  636. BUG();
  637. page = pte_page(*pte);
  638. frame->bus_addr[pgidx] = virt_to_bus((void *)page_address(page));
  639. frame->pages[pgidx] = page;
  640. SetPageReserved(page);
  641. printk("%08lx (%08lx) ", page_address(page), frame->bus_addr[pgidx]);
  642. }
  643. printk("n");
  644. return 0;
  645. }
  646. static void
  647. cyberpro_frames_free_one(struct cyberpro_vidinfo *dp, struct framebuf *frame)
  648. {
  649. void *buffer;
  650. int pgidx;
  651. frame->status = FRAME_FREE;
  652. buffer = frame->buffer;
  653. frame->buffer = NULL;
  654. if (buffer) {
  655. for (pgidx = 0; pgidx < NR_PAGES; pgidx++) {
  656. frame->bus_addr[pgidx] = 0;
  657. ClearPageReserved(frame->pages[pgidx]);
  658. frame->pages[pgidx] = NULL;
  659. }
  660. vfree(buffer);
  661. }
  662. }
  663. static void
  664. cyberpro_busmaster_frame(struct cyberpro_vidinfo *dp, struct framebuf *frame)
  665. {
  666. unsigned long bus_addr;
  667. bus_addr = frame->bus_addr[dp->bm_index];
  668. if (frame->dbg) {
  669. printk("Frame%d: %06x -> %08lxn",
  670. dp->frame_idx,
  671. dp->bm_offset,
  672. bus_addr);
  673. }
  674. cyber2000_outw(dp->bm_offset, BM_VID_ADDR_LOW);
  675. cyber2000_outw(dp->bm_offset >> 16, BM_VID_ADDR_HIGH);
  676. cyber2000_outw(bus_addr, BM_ADDRESS_LOW);
  677. cyber2000_outw(bus_addr >> 16, BM_ADDRESS_HIGH);
  678. /*
  679.  * One page-full only
  680.  */
  681. cyber2000_outw(1023, BM_LENGTH);
  682. /*
  683.  * Load length
  684.  */
  685. cyber2000_outw(BM_CONTROL_INIT, BM_CONTROL);
  686. /*
  687.  * Enable transfer
  688.  */
  689. cyber2000_outw(BM_CONTROL_ENABLE|BM_CONTROL_IRQEN, BM_CONTROL);
  690. dp->bm_offset += 1024;
  691. dp->bm_index += 1;
  692. }
  693. static void cyberpro_busmaster_interrupt(struct cyberpro_vidinfo *dp)
  694. {
  695. struct framebuf *frame = dp->frame + dp->frame_idx;
  696. /*
  697.  * Disable Busmaster operations
  698.  */
  699. cyber2000_outw(0, BM_CONTROL);
  700. if (frame->status == FRAME_GRABBING) {
  701. /*
  702.  * We are still grabbing this frame to system
  703.  * memory.  Transfer next page if there are
  704.  * more, or else flag this frame as complete.
  705.  */
  706. if (dp->bm_index < NR_PAGES)
  707. cyberpro_busmaster_frame(dp);
  708. else {
  709. unsigned int idx;
  710. frame->status = FRAME_DONE;
  711. frame->dbg = 0;
  712. idx = dp->frame_idx + 1;
  713. if (idx >= NR_FRAMES)
  714. idx = 0;
  715. dp->frame_idx = idx;
  716. wake_up(&dp->frame_wait);
  717. }
  718. }
  719. }
  720. static void cyberpro_frames_vbl(struct cyberpro_vidinfo *dp, unsigned int stat)
  721. {
  722. struct framebuf *frame = dp->frame + dp->frame_idx;
  723. /*
  724.  * No point capturing frames if the grabber isn't active.
  725.  */
  726. if (stat & EXT_ROM_UCB4GH_FREEZE)
  727. return;
  728. /*
  729.  * If the next buffer is ready for grabbing,
  730.  * set up the bus master registers for the
  731.  * transfer.
  732.  */
  733. if (frame->status == FRAME_WAITING) {
  734. frame->status = FRAME_GRABBING;
  735. dp->bm_offset = dp->cap_mem_offset;
  736. dp->bm_index  = 0;
  737. cyberpro_busmaster_frame(dp, frame);
  738. }
  739. }
  740. static void __init cyberpro_frames_init(struct cyberpro_vidinfo *dp)
  741. {
  742. unsigned int offset, maxsize;
  743. int i;
  744. init_waitqueue_head(&dp->frame_wait);
  745. maxsize = 2 * dp->cap.maxwidth * dp->cap.maxheight;
  746. dp->frame_size = PAGE_ALIGN(maxsize);
  747. dp->frame_idx = 0;
  748. for (i = offset = 0; i < NR_FRAMES; i++) {
  749. dp->frame[i].offset = offset;
  750. dp->frame[i].status = FRAME_FREE;
  751. offset += dp->frame_size;
  752. }
  753. }
  754. static void cyberpro_frames_free(struct cyberpro_vidinfo *dp)
  755. {
  756. int i;
  757. dp->mmaped = 0;
  758. /*
  759.  * Free all frame buffers
  760.  */
  761. for (i = 0; i < NR_FRAMES; i++)
  762. cyberpro_frames_free_one(dp, dp->frame + i);
  763. }
  764. #else
  765. #define cyberpro_frames_vbl(dp,stat) do { } while (0)
  766. #define cyberpro_frames_init(dp)     do { } while (0)
  767. #define cyberpro_frames_free(dp)     do { } while (0)
  768. #endif
  769. /*
  770.  * CyberPro Interrupts
  771.  * -------------------
  772.  *
  773.  *  We don't really know how to signal an IRQ clear to the chip.  However,
  774.  *  disabling and re-enabling the capture interrupt enable seems to do what
  775.  *  we want.
  776.  */
  777. static void cyberpro_interrupt(int nr, void *dev_id, struct pt_regs *regs)
  778. {
  779. struct cyberpro_vidinfo *dp = dev_id;
  780. unsigned char old_grphidx;
  781. unsigned int status;
  782. /*
  783.  * Save old graphics index register
  784.  */
  785. old_grphidx = cyberpro_readb(0x3ce, dp);
  786. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  787. /*
  788.  * Was it due to the Capture VSYNC?
  789.  */
  790. if (status & EXT_ROM_UCB4GH_INTSTAT) {
  791. /*
  792.  * Frob the IRQ enable bit to drop the request.
  793.  */
  794. cyberpro_grphw8(VFAC_CTL3, dp->vfac3 & ~VFAC_CTL3_CAP_IRQ, dp);
  795. cyberpro_grphw8(VFAC_CTL3, dp->vfac3, dp);
  796. cyberpro_frames_vbl(dp, status);
  797. wake_up(&dp->vbl_wait);
  798. }
  799. /*
  800.  * Restore graphics controller index
  801.  */
  802. cyberpro_writeb(old_grphidx, 0x3ce, dp);
  803. #ifdef USE_MMAP
  804. /*
  805.  * Do Bus-Master IRQ stuff
  806.  */
  807. if (cyber2000_inb(BM_CONTROL) & (1 << 7))
  808. cyberpro_busmaster_interrupt(dp);
  809. #endif
  810. }
  811. static void cyberpro_capture(struct cyberpro_vidinfo *dp, int on)
  812. {
  813. DECLARE_WAITQUEUE(wait, current);
  814. unsigned int status;
  815. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  816. add_wait_queue(&dp->vbl_wait, &wait);
  817. set_current_state(TASK_UNINTERRUPTIBLE);
  818. if (!!on ^ !(status & EXT_ROM_UCB4GH_FREEZE)) {
  819. if (on) {
  820. schedule_timeout(40 * HZ / 1000);
  821. dp->vfac1 &= ~(VFAC_CTL1_FREEZE_CAPTURE|VFAC_CTL1_FREEZE_CAPTURE_SYNC);
  822. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  823. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  824. } else {
  825. dp->vfac1 |= VFAC_CTL1_FREEZE_CAPTURE_SYNC;
  826. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  827. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  828. if (!(status & EXT_ROM_UCB4GH_FREEZE))
  829. schedule_timeout(40 * HZ / 1000);
  830. }
  831. }
  832. current->state = TASK_RUNNING;
  833. remove_wait_queue(&dp->vbl_wait, &wait);
  834. }
  835. static void cyberpro_capture_one(struct cyberpro_vidinfo *dp)
  836. {
  837. struct task_struct *tsk = current;
  838. DECLARE_WAITQUEUE(wait, tsk);
  839. unsigned int status;
  840. unsigned long policy, rt_priority;
  841. policy = tsk->policy;
  842. rt_priority = tsk->rt_priority;
  843. tsk->policy = SCHED_FIFO;
  844. tsk->rt_priority = 1;
  845. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  846. add_wait_queue(&dp->vbl_wait, &wait);
  847. set_current_state(TASK_UNINTERRUPTIBLE);
  848. schedule_timeout(40 * HZ / 1000);
  849. dp->vfac1 &= ~(VFAC_CTL1_FREEZE_CAPTURE|VFAC_CTL1_FREEZE_CAPTURE_SYNC);
  850. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  851. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  852. set_current_state(TASK_UNINTERRUPTIBLE);
  853. schedule_timeout(40 * HZ / 1000);
  854. set_current_state(TASK_UNINTERRUPTIBLE);
  855. schedule_timeout(40 * HZ / 1000);
  856. dp->vfac1 |= VFAC_CTL1_FREEZE_CAPTURE_SYNC;
  857. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  858. set_current_state(TASK_UNINTERRUPTIBLE);
  859. status = cyberpro_grphr8(EXT_ROM_UCB4GH, dp);
  860. current->state = TASK_RUNNING;
  861. remove_wait_queue(&dp->vbl_wait, &wait);
  862. tsk->policy = policy;
  863. tsk->rt_priority = rt_priority;
  864. }
  865. static void cyberpro_capture_set_win(struct cyberpro_vidinfo *dp)
  866. {
  867. unsigned int xstart, xend, ystart, yend;
  868. xstart = 4 + dp->capt.x;
  869. xend   = xstart + dp->capt.width;
  870. if (dp->cap_mode1 & EXT_CAP_MODE1_8BIT) {
  871. /* 8-bit capture */
  872. xstart *= 2;
  873. xend   *= 2;
  874. }
  875. xstart -= 1;
  876. xend   -= 1;
  877. ystart = 18 + dp->capt.y;
  878. yend   = ystart + dp->capt.height / 2;
  879. cyberpro_grphw16(CAP_X_START, xstart, dp);
  880. cyberpro_grphw16(CAP_X_END, xend + 1, dp);
  881. cyberpro_grphw16(CAP_Y_START, ystart, dp);
  882. cyberpro_grphw16(CAP_Y_END, yend + 2, dp);
  883. /*
  884.  * This should take account of capt.decimation
  885.  */
  886. cyberpro_grphw16(CAP_DDA_X_INIT, 0x0800, dp);
  887. cyberpro_grphw16(CAP_DDA_X_INC, 0x1000, dp);
  888. cyberpro_grphw16(CAP_DDA_Y_INIT, 0x0800, dp);
  889. cyberpro_grphw16(CAP_DDA_Y_INC, 0x1000, dp);
  890. cyberpro_grphw8(CAP_PITCH, dp->capt.width >> 2, dp);
  891. }
  892. static void cyberpro_set_interlace(struct cyberpro_vidinfo *dp)
  893. {
  894. /*
  895.  * set interlace mode
  896.  */
  897. if (dp->interlace) {
  898. dp->vfac3 |= VFAC_CTL3_CAP_INTERLACE;
  899. dp->cap_miscctl &= ~CAP_CTL_MISC_ODDEVEN;
  900. dp->ovl->src.height = dp->capt.height;
  901. } else {
  902. dp->vfac3 &= ~VFAC_CTL3_CAP_INTERLACE;
  903. dp->cap_miscctl |= CAP_CTL_MISC_ODDEVEN;
  904. dp->ovl->src.height = dp->capt.height / 2;
  905. }
  906. cyberpro_grphw8(VFAC_CTL3,    dp->vfac3, dp);
  907. cyberpro_grphw8(CAP_CTL_MISC, dp->cap_miscctl, dp);
  908. dp->ovl->set_src(dp, dp->ovl);
  909. if (dp->win_set)
  910. dp->ovl->set_win(dp, dp->ovl);
  911. }
  912. /*
  913.  * Calculate and set the address of the capture buffer.  Note we
  914.  * also update the extended memory buffer for the overlay window.
  915.  *
  916.  *  base:         phys base address of display
  917.  *  width:        pixel width of display
  918.  *  height:       height of display
  919.  *  depth:        depth of display (8/16/24)
  920.  *  bytesperline: number of bytes on a line
  921.  *
  922.  * We place the capture buffer 16K after the screen.
  923.  */
  924. static int
  925. cyberpro_set_buffer(struct cyberpro_vidinfo *dp, struct video_buffer *b)
  926. {
  927. unsigned long screensize, maxbufsz;
  928. if (b->height <= 0 || b->width <= 0 || b->bytesperline <= 0)
  929. return -EINVAL;
  930. maxbufsz = dp->cap.maxwidth * dp->cap.maxheight * 2;
  931. screensize = b->height * b->bytesperline + 16384;
  932. if ((screensize + maxbufsz) >= dp->info.fb_size)
  933. return -EINVAL;
  934. dp->buf.base         = b->base;
  935. dp->buf.width        = b->width;
  936. dp->buf.height       = b->height;
  937. dp->buf.depth        = b->depth;
  938. dp->buf.bytesperline = b->bytesperline;
  939. dp->cap_mem_offset   = screensize >> 2;
  940. cyberpro_grphw24(CAP_MEM_START, dp->cap_mem_offset, dp);
  941. /*
  942.  * Setup the overlay source information.
  943.  */
  944. dp->ovl->src.offset = dp->cap_mem_offset;
  945. dp->ovl->set_src(dp, dp->ovl);
  946. return 0;
  947. }
  948. static void cyberpro_hw_init(struct cyberpro_vidinfo *dp)
  949. {
  950. unsigned char old;
  951. /*
  952.  * Enable access to bus-master registers
  953.  */
  954. dp->info.enable_extregs(dp->info.info);
  955. dp->vfac1 = VFAC_CTL1_PHILIPS |
  956.     VFAC_CTL1_FREEZE_CAPTURE |
  957.     VFAC_CTL1_FREEZE_CAPTURE_SYNC;
  958. dp->vfac3 = VFAC_CTL3_CAP_IRQ;
  959. dp->cap_miscctl = CAP_CTL_MISC_DISPUSED |
  960.   CAP_CTL_MISC_SYNCTZOR |
  961.   CAP_CTL_MISC_SYNCTZHIGH;
  962. /*
  963.  * Setup bus-master mode
  964.  */
  965. cyberpro_grphw8(BM_CTRL1, 0x88, dp);
  966. cyberpro_grphw8(PCI_BM_CTL, PCI_BM_CTL_ENABLE, dp);
  967. cyberpro_grphw8(BM_CTRL0, 0x44, dp);
  968. cyberpro_grphw8(BM_CTRL1, 0x84, dp);
  969. cyberpro_grphw24(CAP_MEM_START, 0, dp);
  970. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  971. cyberpro_grphw8(VFAC_CTL3, dp->vfac3, dp);
  972. cyberpro_grphw8(VFAC_CTL2, 0, dp);
  973. cyberpro_grphw8(REG_BANK, REG_BANK_Y, dp);
  974. cyberpro_grphw8(EXT_TV_CTL, 0x80, dp);
  975. cyberpro_grphw8(EXT_CAP_CTL1, 0x3f, dp); /* disable PIP */
  976. cyberpro_grphw8(EXT_CAP_CTL2, 0xc0 | EXT_CAP_CTL2_ODDFRAMEIRQ, dp);
  977. /*
  978.  * Configure capture mode to match the
  979.  * external video processor format
  980.  */
  981. cyberpro_grphw8(EXT_CAP_MODE1, dp->cap_mode1, dp);
  982. cyberpro_grphw8(EXT_CAP_MODE2, dp->cap_mode2, dp);
  983. /* setup overlay */
  984. cyberpro_grphw16(EXT_FIFO_CTL, 0x1010, dp);
  985. // cyberpro_grphw16(EXT_FIFO_CTL, 0x1b0f, dp);
  986. /*
  987.  * Always reset the capture parameters on each open.
  988.  */
  989. dp->capt.x          = 0;
  990. dp->capt.y          = 0;
  991. dp->capt.width      = dp->cap.maxwidth;
  992. dp->capt.height     = dp->cap.maxheight;
  993. dp->capt.decimation = 0;
  994. dp->capt.flags     = 0;
  995. cyberpro_capture_set_win(dp);
  996. /*
  997.  * Enable VAFC
  998.  */
  999. old = cyberpro_grphr8(EXT_LATCH1, dp);
  1000. cyberpro_grphw8(EXT_LATCH1, old | EXT_LATCH1_VAFC_EN, dp);
  1001. /*
  1002.  * Enable capture (we hope that VSYNC=1)
  1003.  */
  1004. dp->vfac1 |= VFAC_CTL1_CAPTURE;
  1005. cyberpro_grphw8(VFAC_CTL1, dp->vfac1, dp);
  1006. /*
  1007.  * The overlay source format is always the
  1008.  * same as the capture stream format.
  1009.  */
  1010. dp->ovl->src.width  = dp->capt.width;
  1011. dp->ovl->src.height = dp->capt.height;
  1012. dp->ovl->src.format = dp->stream_fmt;
  1013. /*
  1014.  * Initialise the overlay windows
  1015.  */
  1016. dp->ext.init(dp, &dp->ext);
  1017. dp->v2.init(dp, &dp->v2);
  1018. dp->x2.init(dp, &dp->x2);
  1019. }
  1020. static void cyberpro_deinit(struct cyberpro_vidinfo *dp)
  1021. {
  1022. unsigned char old;
  1023. /*
  1024.  * Stop any bus-master activity
  1025.  */
  1026. cyberpro_writew(0, BM_CONTROL, dp);
  1027. /*
  1028.  * Shut down overlay
  1029.  */
  1030. if (dp->ovl_active)
  1031. dp->ovl->ctl(dp, dp->ovl, 0);
  1032. dp->ovl_active = 0;
  1033. /*
  1034.  * Shut down capture
  1035.  */
  1036. if (dp->cap_active)
  1037. cyberpro_capture(dp, 0);
  1038. dp->cap_active = 0;
  1039. /*
  1040.  * Disable all capture
  1041.  */
  1042. cyberpro_grphw8(VFAC_CTL1, 0, dp);
  1043. /*
  1044.  * Disable VAFC
  1045.  */
  1046. old = cyberpro_grphr8(EXT_LATCH1, dp);
  1047. cyberpro_grphw8(EXT_LATCH1, old & ~EXT_LATCH1_VAFC_EN, dp);
  1048. /*
  1049.  * Disable interrupt (this allows it to float)
  1050.  */
  1051. dp->vfac3 &= ~VFAC_CTL3_CAP_IRQ;
  1052. cyberpro_grphw8(VFAC_CTL3, dp->vfac3, dp);
  1053. /*
  1054.  * Switch off bus-master mode
  1055.  */
  1056. cyberpro_grphw8(PCI_BM_CTL, 0, dp);
  1057. /*
  1058.  * Disable access to bus-master registers
  1059.  */
  1060. dp->info.disable_extregs(dp->info.info);
  1061. }
  1062. static int cyberpro_grabber_open(struct video_device *dev, int flags)
  1063. {
  1064. struct cyberpro_vidinfo *dp = dev->priv;
  1065. int ret, one = 1;
  1066. MOD_INC_USE_COUNT;
  1067. ret = -EBUSY;
  1068. if (flags || dp->users)
  1069. goto out;
  1070. dp->users += 1;
  1071. if (dp->users == 1) {
  1072. ret = request_irq(dp->irq, cyberpro_interrupt, SA_SHIRQ,
  1073.   dp->info.dev_name, dp);
  1074. if (ret) {
  1075. dp->users -= 1;
  1076. goto out;
  1077. }
  1078. /*
  1079.  * Initialise the VGA chip
  1080.  */
  1081. cyberpro_hw_init(dp);
  1082. /*
  1083.  * Enable the IRQ.  This allows the IRQ to work as expected
  1084.  * even if the IRQ line is missing the pull-up resistor.
  1085.  */
  1086. enable_irq(dp->irq);
  1087. i2c_control_device(dp->bus, I2C_DRIVERID_VIDEODECODER,
  1088.    DECODER_ENABLE_OUTPUT, &one);
  1089. }
  1090. ret = 0;
  1091. out:
  1092. if (ret)
  1093. MOD_DEC_USE_COUNT;
  1094. return ret;
  1095. }
  1096. static void cyberpro_grabber_close(struct video_device *dev)
  1097. {
  1098. struct cyberpro_vidinfo *dp = dev->priv;
  1099. if (dp->users == 1) {
  1100. int zero = 0;
  1101. /*
  1102.  * Disable the IRQ.  This prevents problems with missing
  1103.  * pull-up resistors on the PCI interrupt line.
  1104.  */
  1105. disable_irq(dp->irq);
  1106. cyberpro_frames_free(dp);
  1107. /*
  1108.  * Turn off the SAA7111 decoder
  1109.  */
  1110. i2c_control_device(dp->bus, I2C_DRIVERID_VIDEODECODER,
  1111.    DECODER_ENABLE_OUTPUT, &zero);
  1112. /*
  1113.  * Disable grabber
  1114.  */
  1115. cyberpro_deinit(dp);
  1116. free_irq(dp->irq, dp);
  1117. }
  1118. dp->users -= 1;
  1119. MOD_DEC_USE_COUNT;
  1120. }
  1121. /*
  1122.  * Our general plan here is:
  1123.  *  1. Set the CyberPro to perform a BM-DMA of one frame to this memory
  1124.  *  2. Copy the frame to the userspace
  1125.  *
  1126.  * However, BM-DMA seems to be unreliable at the moment, especially on
  1127.  * rev. 4 NetWinders.
  1128.  */
  1129. static long
  1130. cyberpro_grabber_read(struct video_device *dev, char *buf,
  1131.       unsigned long count, int noblock)
  1132. {
  1133. struct cyberpro_vidinfo *dp = dev->priv;
  1134. int ret = -EINVAL;
  1135. #ifdef USE_MMIO
  1136. unsigned long maxbufsz = dp->capt.width * dp->capt.height * 2;
  1137. char *disp = dp->info.fb + (dp->cap_mem_offset << 2);
  1138. /*
  1139.  * If the buffer is mmap()'d, we shouldn't be using read()
  1140.  */
  1141. if (dp->mmaped)
  1142. return -EINVAL;
  1143. if (count > maxbufsz)
  1144. count = maxbufsz;
  1145. if (dp->cap_active)
  1146. cyberpro_capture(dp, 0);
  1147. else
  1148. cyberpro_capture_one(dp);
  1149. ret = (int)count;
  1150. if (copy_to_user(buf, disp, count))
  1151. ret = -EFAULT;
  1152. /*
  1153.  * unfreeze capture
  1154.  */
  1155. if (dp->cap_active)
  1156. cyberpro_capture(dp, 1);
  1157. #endif
  1158. return ret;
  1159. }
  1160. /*
  1161.  * We don't support writing to the grabber
  1162.  * (In theory, we could allow writing to a separate region of VGA memory,
  1163.  * and display this using the second overlay window.  This would allow us
  1164.  * to do video conferencing for example).
  1165.  */
  1166. static long
  1167. cyberpro_grabber_write(struct video_device *dev, const char *buf,
  1168.        unsigned long count, int noblock)
  1169. {
  1170. return -EINVAL;
  1171. }
  1172. static int
  1173. cyberpro_grabber_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  1174. {
  1175. struct cyberpro_vidinfo *dp = dev->priv;
  1176. switch (cmd) {
  1177. case VIDIOCGCAP:
  1178. return copy_to_user(arg, &dp->cap, sizeof(dp->cap))
  1179. ? -EFAULT : 0;
  1180. case VIDIOCGCHAN:
  1181. {
  1182. struct video_channel chan;
  1183. chan.channel = 0;
  1184. strcpy(chan.name, "Composite");
  1185. chan.tuners = 0;
  1186. chan.flags = 0;
  1187. chan.type = VIDEO_TYPE_CAMERA;
  1188. chan.norm = dp->norm;
  1189. return copy_to_user(arg, &chan, sizeof(chan)) ? -EFAULT : 0;
  1190. }
  1191. case VIDIOCGPICT:
  1192. return copy_to_user(arg, &dp->pic, sizeof(dp->pic))
  1193. ? -EINVAL : 0;
  1194. case VIDIOCGWIN:
  1195. {
  1196. struct video_window win;
  1197. win.x         = dp->ovl->dst.x;
  1198. win.y         = dp->ovl->dst.y;
  1199. win.width     = dp->ovl->dst.width;
  1200. win.height    = dp->ovl->dst.height;
  1201. win.chromakey = dp->ovl->dst.chromakey;
  1202. win.flags     = VIDEO_WINDOW_CHROMAKEY |
  1203. (dp->interlace ? VIDEO_WINDOW_INTERLACE : 0);
  1204. win.clips     = NULL;
  1205. win.clipcount = 0;
  1206. return copy_to_user(arg, &win, sizeof(win))
  1207. ? -EINVAL : 0;
  1208. }
  1209. case VIDIOCGFBUF:
  1210. return copy_to_user(arg, &dp->buf, sizeof(dp->buf))
  1211. ? -EINVAL : 0;
  1212. case VIDIOCGUNIT:
  1213. {
  1214. struct video_unit unit;
  1215. unit.video    = dev->minor;
  1216. unit.vbi      = VIDEO_NO_UNIT;
  1217. unit.radio    = VIDEO_NO_UNIT;
  1218. unit.audio    = VIDEO_NO_UNIT;
  1219. unit.teletext = VIDEO_NO_UNIT;
  1220. return copy_to_user(arg, &unit, sizeof(unit))
  1221. ? -EINVAL : 0;
  1222. }
  1223. case VIDIOCGCAPTURE:
  1224. return copy_to_user(arg, &dp->capt, sizeof(dp->capt))
  1225. ? -EFAULT : 0;
  1226. case VIDIOCSCHAN:
  1227. {
  1228. struct video_decoder_capability vdc;
  1229. struct video_channel v;
  1230. int ok;
  1231. if (copy_from_user(&v, arg, sizeof(v)))
  1232. return -EFAULT;
  1233. if (v.channel != 0)
  1234. return -EINVAL;
  1235. i2c_control_device(dp->bus, I2C_DRIVERID_VIDEODECODER,
  1236.    DECODER_GET_CAPABILITIES, &vdc);
  1237. switch (v.norm) {
  1238. case VIDEO_MODE_PAL:
  1239. ok = vdc.flags & VIDEO_DECODER_PAL;
  1240. break;
  1241. case VIDEO_MODE_NTSC:
  1242. ok = vdc.flags & VIDEO_DECODER_NTSC;
  1243. break;
  1244. case VIDEO_MODE_AUTO:
  1245. ok = vdc.flags & VIDEO_DECODER_AUTO;
  1246. break;
  1247. default:
  1248. ok = 0;
  1249. }
  1250. if (!ok)
  1251. return -EINVAL;
  1252. dp->norm = v.norm;
  1253. i2c_control_device(dp->bus, I2C_DRIVERID_VIDEODECODER,
  1254.    DECODER_SET_NORM, &v.norm);
  1255. return 0;
  1256. }
  1257. case VIDIOCSPICT:
  1258. {
  1259. struct video_picture p;
  1260. if (copy_from_user(&p, arg, sizeof(p)))
  1261. return -EFAULT;
  1262. if (p.palette != dp->stream_fmt ||
  1263.     p.depth != 8)
  1264. return -EINVAL;
  1265. dp->pic = p;
  1266. /* p.depth sets the capture depth */
  1267. /* p.palette sets the capture palette */
  1268. i2c_control_device(dp->bus, I2C_DRIVERID_VIDEODECODER,
  1269.    DECODER_SET_PICTURE, &p);
  1270. return 0;
  1271. }
  1272. case VIDIOCSWIN: /* set the size & position of the overlay window */
  1273. {
  1274. struct video_window w;
  1275. int diff;
  1276. if (!dp->buf_set)
  1277. return -EINVAL;
  1278. if (copy_from_user(&w, arg, sizeof(w)))
  1279. return -EFAULT;
  1280. if (w.clipcount)
  1281. return -EINVAL;
  1282. /*
  1283.  * Bound the overlay window by the size of the screen
  1284.  */
  1285. if (w.x < 0)
  1286. w.x = 0;
  1287. if (w.y < 0)
  1288. w.y = 0;
  1289. if (w.x > dp->buf.width)
  1290. w.x = dp->buf.width;
  1291. if (w.y > dp->buf.height)
  1292. w.y = dp->buf.height;
  1293. if (w.width < dp->capt.width)
  1294. w.width = dp->capt.width;
  1295. if (w.height < dp->capt.height)
  1296. w.height = dp->capt.height;
  1297. if (w.x + w.width > dp->buf.width)
  1298. w.width = dp->buf.width - w.x;
  1299. if (w.y + w.height > dp->buf.height)
  1300. w.height = dp->buf.height - w.y;
  1301. /*
  1302.  * We've tried to make the values fit, but
  1303.  * they just won't.
  1304.  */
  1305. if (w.width < dp->capt.width || w.height < dp->capt.height)
  1306. return -EINVAL;
  1307. diff = dp->ovl->dst.x != w.x ||
  1308.        dp->ovl->dst.y != w.y ||
  1309.        dp->ovl->dst.width != w.width  ||
  1310.        dp->ovl->dst.height != w.height ||
  1311.        dp->ovl->dst.chromakey != w.chromakey ||
  1312.        dp->ovl->dst.flags != w.flags;
  1313. if (!dp->win_set || diff) {
  1314. dp->ovl->dst.x         = w.x;
  1315. dp->ovl->dst.y         = w.y;
  1316. dp->ovl->dst.width     = w.width;
  1317. dp->ovl->dst.height    = w.height;
  1318. dp->ovl->dst.chromakey = w.chromakey;
  1319. dp->ovl->dst.flags     = w.flags;
  1320. if (dp->ovl_active)
  1321. dp->ovl->ctl(dp, dp->ovl, 0);
  1322. dp->ovl->set_win(dp, dp->ovl);
  1323. if (dp->ovl_active)
  1324. dp->ovl->ctl(dp, dp->ovl, 1);
  1325. diff = w.flags & VIDEO_WINDOW_INTERLACE ? 1 : 0;
  1326. if (!dp->win_set || dp->interlace != diff) {
  1327. dp->interlace = diff;
  1328. cyberpro_set_interlace(dp);
  1329. }
  1330. }
  1331. dp->win_set = 1;
  1332. return 0;
  1333. }
  1334. case VIDIOCSFBUF: /* set frame buffer info */
  1335. {
  1336. struct video_buffer b;
  1337. int ret;
  1338. if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
  1339. return -EPERM;
  1340. if (dp->cap_active)
  1341. return -EINVAL;
  1342. if (copy_from_user(&b, arg, sizeof(b)))
  1343. return -EFAULT;
  1344. ret = cyberpro_set_buffer(dp, &b);
  1345. if (ret == 0) {
  1346. dp->buf_set = 1;
  1347. dp->win_set = 0;
  1348. }
  1349. return ret;
  1350. }
  1351. case VIDIOCCAPTURE:
  1352. {
  1353. int on;
  1354. if (get_user(on, (int *)arg))
  1355. return -EFAULT;
  1356. if (( on &&  dp->ovl_active) ||
  1357.     (!on && !dp->ovl_active))
  1358. return 0;
  1359. if (on && (!dp->buf_set || !dp->win_set))
  1360. return -EINVAL;
  1361. cyberpro_capture(dp, on);
  1362. dp->cap_active = on;
  1363. dp->ovl->ctl(dp, dp->ovl, on);
  1364. dp->ovl_active = on;
  1365. return 0;
  1366. }
  1367. #ifdef USE_MMAP
  1368. case VIDIOCSYNC:
  1369. {
  1370. DECLARE_WAITQUEUE(wait, current);
  1371. int buf;
  1372. /*
  1373.  * The buffer must have been mmaped
  1374.  * for this call to work.
  1375.  */
  1376. if (!dp->mmaped)
  1377. return -EINVAL;
  1378. if (get_user(buf, (int *)arg))
  1379. return -EFAULT;
  1380. if (buf < 0 || buf >= NR_FRAMES)
  1381. return -EINVAL;
  1382. switch (dp->frame[buf].status) {
  1383. case FRAME_FREE:
  1384. return -EINVAL;
  1385. case FRAME_WAITING:
  1386. case FRAME_GRABBING:
  1387. add_wait_queue(&dp->frame_wait, &wait);
  1388. while (1) {
  1389. set_current_state(TASK_INTERRUPTIBLE);
  1390. if (signal_pending(current))
  1391. break;
  1392. if (dp->frame[buf].status == FRAME_DONE)
  1393. break;
  1394. schedule();
  1395. }
  1396. set_current_state(TASK_RUNNING);
  1397. remove_wait_queue(&dp->frame_wait, &wait);
  1398. if (signal_pending(current))
  1399. return -EINTR;
  1400. /*FALLTHROUGH*/
  1401. case FRAME_DONE:
  1402. dp->frame[buf].status = FRAME_FREE;
  1403. break;
  1404. }
  1405. return 0;
  1406. }
  1407. case VIDIOCMCAPTURE:
  1408. {
  1409. struct video_mmap vmap;
  1410. /*
  1411.  * The buffer must have been mmaped
  1412.  * for this call to work.
  1413.  */
  1414. if (!dp->mmaped)
  1415. return -EINVAL;
  1416. if (copy_from_user(&vmap, arg, sizeof(vmap)))
  1417. return -EFAULT;
  1418. /*
  1419.  * We can only capture in our source format/size.
  1420.  */
  1421. if (vmap.frame  >= NR_FRAMES ||
  1422.     vmap.format != dp->stream_fmt ||
  1423.     vmap.width  != dp->capt.width ||
  1424.     vmap.height != dp->capt.height)
  1425. return -EINVAL;
  1426. if (dp->frame[vmap.frame].status == FRAME_WAITING ||
  1427.     dp->frame[vmap.frame].status == FRAME_GRABBING)
  1428. return -EBUSY;
  1429. dp->frame[vmap.frame].status = FRAME_WAITING;
  1430. return 0;
  1431. }
  1432. case VIDIOCGMBUF:
  1433. {
  1434. struct video_mbuf vmb;
  1435. unsigned int i;
  1436. vmb.frames = NR_FRAMES;
  1437. vmb.size   = dp->frame_size * NR_FRAMES;
  1438. for (i = 0; i < NR_FRAMES; i++)
  1439. vmb.offsets[i] = dp->frame[i].offset;
  1440. return copy_to_user(arg, &vmb, sizeof(vmb)) ? -EFAULT : 0;
  1441. }
  1442. #endif
  1443. case VIDIOCSCAPTURE:
  1444. {
  1445. struct video_capture capt;
  1446. #ifndef ALLOW_SCAPTURE_WHILE_CAP
  1447. if (dp->cap_active)
  1448. return -EINVAL;
  1449. #endif
  1450. if (copy_from_user(&capt, arg, sizeof(capt)))
  1451. return -EFAULT;
  1452. if (capt.x < 0 || capt.width < 0 ||
  1453.     capt.y < 0 || capt.height < 0 ||
  1454.     capt.x + capt.width > dp->cap.maxwidth ||
  1455.     capt.y + capt.height > dp->cap.maxheight)
  1456. return -EINVAL;
  1457. /*
  1458.  * The capture width must be a multiple of 4
  1459.  */
  1460. if (dp->capt.width & 3)
  1461. return -EINVAL;
  1462. dp->capt.x = capt.x;
  1463. dp->capt.y = capt.y;
  1464. dp->capt.width = capt.width;
  1465. dp->capt.height = capt.height;
  1466. #ifdef ALLOW_SCAPTURE_WHILE_CAP
  1467. if (dp->ovl_active)
  1468. dp->ovl->ctl(dp, dp->ovl, 0);
  1469. if (dp->cap_active)
  1470. cyberpro_capture(dp, 0);
  1471. #endif
  1472. cyberpro_capture_set_win(dp);
  1473. /*
  1474.  * Update the overlay window information
  1475.  */
  1476. dp->ovl->src.width  = capt.width;
  1477. dp->ovl->src.height = capt.height;
  1478. dp->ovl->set_src(dp, dp->ovl);
  1479. if (dp->win_set)
  1480. dp->ovl->set_win(dp, dp->ovl);
  1481. #ifdef ALLOW_SCAPTURE_WHILE_CAP
  1482. if (dp->cap_active)
  1483. cyberpro_capture(dp, 1);
  1484. if (dp->ovl_active)
  1485. dp->ovl->ctl(dp, dp->ovl, 1);
  1486. #endif
  1487. return 0;
  1488. }
  1489. case VIDIOCGTUNER: /* no tuner */
  1490. case VIDIOCSTUNER:
  1491. return -EINVAL;
  1492. }
  1493. return -EINVAL;
  1494. }
  1495. #ifdef USE_MMAP
  1496. static int
  1497. cyberpro_grabber_mmap(struct video_device *dev, const char *addr, unsigned long size)
  1498. {
  1499. struct cyberpro_vidinfo *dp = dev->priv;
  1500. unsigned long vaddr = (unsigned long)addr;
  1501. pgprot_t prot;
  1502. int frame_idx, ret = -EINVAL;
  1503. #if defined(__arm__)
  1504. prot = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_USER | L_PTE_WRITE | L_PTE_DIRTY);
  1505. #elif defined(__i386__)
  1506. prot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED);
  1507. if (boot_cpu_data.x86 > 3)
  1508. pgprot_val(prot) |= _PAGE_PCD;
  1509. #else
  1510. #error "Unsupported architecture"
  1511. #endif
  1512. /*
  1513.  * The mmap() request must have the correct size.
  1514.  */
  1515. if (size != NR_FRAMES * dp->frame_size)
  1516. goto out;
  1517. /*
  1518.  * If it's already mapped, don't re-do
  1519.  */
  1520. if (dp->mmaped)
  1521. goto out;
  1522. dp->mmaped = 1;
  1523. /*
  1524.  * Map in each frame
  1525.  */
  1526. for (frame_idx = 0; frame_idx < NR_FRAMES; frame_idx++) {
  1527. struct framebuf *frame;
  1528. int pgidx;
  1529. frame = dp->frame + frame_idx;
  1530. ret = cyberpro_alloc_frame_buffer(dp, frame);
  1531. /*
  1532.  * If an error occurs, we can be lazy and leave what we've
  1533.  * been able to do.  Our release function will free any
  1534.  * allocated buffers, and do_mmap_pgoff() will zap any
  1535.  * inserted mappings.
  1536.  */
  1537. if (ret)
  1538. goto out2;
  1539. /*
  1540.  * Map in each page on a page by page basis.  This is just
  1541.  * a little on the inefficient side, but it's only run once.
  1542.  */
  1543. for (pgidx = 0; pgidx < NR_PAGES; pgidx++) {
  1544. unsigned long virt;
  1545. virt = page_address(frame->pages[pgidx]);
  1546. ret = remap_page_range(vaddr, virt_to_phys((void *)virt),
  1547.        PAGE_SIZE, prot);
  1548. if (ret)
  1549. goto out2;
  1550. vaddr += PAGE_SIZE;
  1551. }
  1552. }
  1553.  out2:
  1554. if (ret)
  1555. dp->mmaped = 0;
  1556.  out:
  1557. return ret;
  1558. }
  1559. #endif
  1560. static int __init cyberpro_grabber_init_done(struct video_device *dev)
  1561. {
  1562. struct cyberpro_vidinfo *dp;
  1563. struct cyberpro_info *info = dev->priv;
  1564. int ret;
  1565. dp = kmalloc(sizeof(*dp), GFP_KERNEL);
  1566. if (!dp)
  1567. return -ENOMEM;
  1568. memset(dp, 0, sizeof(*dp));
  1569. dev->priv = dp;
  1570. dp->info = *info;
  1571. dp->dev = dev;
  1572. dp->bus = &cyberpro_i2c_bus;
  1573. dp->regs = info->regs;
  1574. dp->irq = info->dev->irq;
  1575. strcpy(dp->cap.name, dev->name);
  1576. dp->cap.type = dev->type;
  1577. dp->cap.channels = 1;
  1578. dp->cap.audios = 0;
  1579. dp->cap.minwidth = 32;
  1580. dp->cap.maxwidth = 716;
  1581. dp->cap.minheight = 32;
  1582. dp->cap.maxheight = 576;
  1583. dp->pic.brightness = 32768;
  1584. dp->pic.hue = 32768;
  1585. dp->pic.colour = 32768;
  1586. dp->pic.contrast = 32768;
  1587. dp->pic.whiteness = 0;
  1588. dp->pic.depth = 8;
  1589. dp->pic.palette = VIDEO_PALETTE_YUV422;
  1590. /* dp->buf is setup by the user */
  1591. /* dp->cap_mem_offset setup by dp->buf */
  1592. dp->norm = VIDEO_MODE_AUTO;
  1593. /*
  1594.  * The extended overlay window
  1595.  */
  1596. dp->ext.init = cyberpro_ext_init;
  1597. dp->ext.set_src = cyberpro_ext_set_src;
  1598. dp->ext.set_win = cyberpro_ext_set_win;
  1599. dp->ext.ctl = cyberpro_ext_ctl;
  1600. /*
  1601.  * The V2 overlay window
  1602.  */
  1603. dp->v2.init = cyberpro_v2_init;
  1604. dp->v2.set_src = cyberpro_v2_set_src;
  1605. dp->v2.set_win = cyberpro_v2_set_win;
  1606. dp->v2.ctl = cyberpro_v2_ctl;
  1607. /*
  1608.  * The X2 overlay window
  1609.  */
  1610. dp->x2.init = cyberpro_x2_init;
  1611. dp->x2.set_src = cyberpro_x2_set_src;
  1612. dp->x2.set_win = cyberpro_x2_set_win;
  1613. dp->x2.ctl = cyberpro_x2_ctl;
  1614. /*
  1615.  * Set the overlay window which we shall be using
  1616.  */
  1617. dp->ovl = &dp->ext;
  1618. dp->cap_mode1 = EXT_CAP_MODE1_ALTFIFO;
  1619. /*
  1620.  * Initialise hardware specific values.
  1621.  *  - CCIR656 8bit mode (YUV422 data)
  1622.  *  - Ignore Hgood signal
  1623.  *  - Invert Odd/Even field signal
  1624.  */
  1625. dp->cap_mode1 |= EXT_CAP_MODE1_CCIR656 | EXT_CAP_MODE1_8BIT;
  1626. dp->cap_mode2  = EXT_CAP_MODE2_FIXSONY | EXT_CAP_MODE2_DATEND |
  1627.  EXT_CAP_MODE2_CCIRINVOE;
  1628. dp->stream_fmt = VIDEO_PALETTE_YUV422;
  1629. init_waitqueue_head(&dp->vbl_wait);
  1630. cyberpro_frames_init(dp);
  1631. /*
  1632.  * wake up the decoder
  1633.  */
  1634. decoder_sleep(0);
  1635. dp->bus->data = dp;
  1636. strncpy(dp->bus->name, dev->name, sizeof(dp->bus->name));
  1637. pci_set_master(dp->info.dev);
  1638. ret = i2c_register_bus(dp->bus);
  1639. /*
  1640.  * If we successfully registered the bus, but didn't initialise
  1641.  * the decoder (because its driver is not present), request
  1642.  * that it is loaded.
  1643.  */
  1644. if (ret == 0 && !dp->decoder)
  1645. request_module("saa7111");
  1646. /*
  1647.  * If that didn't work, then we're out of luck.
  1648.  */
  1649. if (ret == 0 && !dp->decoder) {
  1650. i2c_unregister_bus(dp->bus);
  1651. ret = -ENXIO;
  1652. }
  1653. if (ret) {
  1654. kfree(dp);
  1655. /*
  1656.  * put the decoder back to sleep
  1657.  */
  1658. decoder_sleep(1);
  1659. }
  1660. return ret;
  1661. }
  1662. static struct video_device cyberpro_grabber = {
  1663. name: "",
  1664. type: VID_TYPE_CAPTURE   | VID_TYPE_OVERLAY |
  1665. VID_TYPE_CHROMAKEY | VID_TYPE_SCALES  |
  1666. VID_TYPE_SUBCAPTURE,
  1667. hardware: 0,
  1668. open: cyberpro_grabber_open,
  1669. close: cyberpro_grabber_close,
  1670. read: cyberpro_grabber_read,
  1671. write: cyberpro_grabber_write,
  1672. ioctl: cyberpro_grabber_ioctl,
  1673. #ifdef USE_MMAP
  1674. mmap: cyberpro_grabber_mmap,
  1675. #endif
  1676. initialize: cyberpro_grabber_init_done,
  1677. };
  1678. int init_cyber2000fb_viddev(void)
  1679. {
  1680. struct cyberpro_info info;
  1681. if (!cyber2000fb_attach(&info, 0))
  1682. return -ENXIO;
  1683. strncpy(cyberpro_grabber.name, info.dev_name, sizeof(cyberpro_grabber.name));
  1684. cyberpro_grabber.priv = &info;
  1685. return video_register_device(&cyberpro_grabber, VFL_TYPE_GRABBER, -1);
  1686. }
  1687. /*
  1688.  * This can be cleaned up when the SAA7111 code is fixed.
  1689.  */
  1690. #ifdef MODULE
  1691. static int __init cyberpro_init(void)
  1692. {
  1693. disable_irq(35);
  1694. return init_cyber2000fb_viddev();
  1695. }
  1696. static void __exit cyberpro_exit(void)
  1697. {
  1698. video_unregister_device(&cyberpro_grabber);
  1699. kfree(cyberpro_grabber.priv);
  1700. i2c_unregister_bus(&cyberpro_i2c_bus);
  1701. /*
  1702.  * put the decoder back to sleep
  1703.  */
  1704. decoder_sleep(1);
  1705. cyber2000fb_detach(0);
  1706. }
  1707. module_init(cyberpro_init);
  1708. module_exit(cyberpro_exit);
  1709. #endif