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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * stradis.c - stradis 4:2:2 mpeg decoder driver
  3.  *
  4.  * Stradis 4:2:2 MPEG-2 Decoder Driver
  5.  * Copyright (C) 1999 Nathan Laredo <laredo@gnu.org>
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  */
  21. #include <linux/module.h>
  22. #include <linux/version.h>
  23. #include <linux/delay.h>
  24. #include <linux/errno.h>
  25. #include <linux/fs.h>
  26. #include <linux/kernel.h>
  27. #include <linux/major.h>
  28. #include <linux/slab.h>
  29. #include <linux/mm.h>
  30. #include <linux/init.h>
  31. #include <linux/poll.h>
  32. #include <linux/pci.h>
  33. #include <linux/signal.h>
  34. #include <asm/io.h>
  35. #include <linux/ioport.h>
  36. #include <asm/pgtable.h>
  37. #include <asm/page.h>
  38. #include <linux/sched.h>
  39. #include <asm/segment.h>
  40. #include <asm/types.h>
  41. #include <linux/types.h>
  42. #include <linux/wrapper.h>
  43. #include <linux/interrupt.h>
  44. #include <asm/uaccess.h>
  45. #include <linux/vmalloc.h>
  46. #include <linux/videodev.h>
  47. #include <linux/i2c-old.h>
  48. #include "saa7146.h"
  49. #include "saa7146reg.h"
  50. #include "ibmmpeg2.h"
  51. #include "saa7121.h"
  52. #include "cs8420.h"
  53. #define DEBUG(x)  /* debug driver */
  54. #undef  IDEBUG   /* debug irq handler */
  55. #undef  MDEBUG   /* debug memory management */
  56. #define SAA7146_MAX 6
  57. static struct saa7146 saa7146s[SAA7146_MAX];
  58. static int saa_num = 0; /* number of SAA7146s in use */
  59. static int video_nr = -1;
  60. MODULE_PARM(video_nr,"i");
  61. MODULE_LICENSE("GPL");
  62. #define nDebNormal 0x00480000
  63. #define nDebNoInc 0x00480000
  64. #define nDebVideo 0xd0480000
  65. #define nDebAudio 0xd0400000
  66. #define nDebDMA 0x02c80000
  67. #define oDebNormal 0x13c80000
  68. #define oDebNoInc 0x13c80000
  69. #define oDebVideo 0xd1080000
  70. #define oDebAudio 0xd1080000
  71. #define oDebDMA 0x03080000
  72. #define NewCard (saa->boardcfg[3])
  73. #define ChipControl (saa->boardcfg[1])
  74. #define NTSCFirstActive (saa->boardcfg[4])
  75. #define PALFirstActive (saa->boardcfg[5])
  76. #define NTSCLastActive (saa->boardcfg[54])
  77. #define PALLastActive (saa->boardcfg[55])
  78. #define Have2MB (saa->boardcfg[18] & 0x40)
  79. #define HaveCS8420 (saa->boardcfg[18] & 0x04)
  80. #define IBMMPEGCD20 (saa->boardcfg[18] & 0x20)
  81. #define HaveCS3310 (saa->boardcfg[18] & 0x01)
  82. #define CS3310MaxLvl ((saa->boardcfg[30] << 8) | saa->boardcfg[31])
  83. #define HaveCS4341 (saa->boardcfg[40] == 2)
  84. #define SDIType (saa->boardcfg[27])
  85. #define CurrentMode (saa->boardcfg[2])
  86. #define debNormal (NewCard ? nDebNormal : oDebNormal)
  87. #define debNoInc (NewCard ? nDebNoInc : oDebNoInc)
  88. #define debVideo (NewCard ? nDebVideo : oDebVideo)
  89. #define debAudio (NewCard ? nDebAudio : oDebAudio)
  90. #define debDMA (NewCard ? nDebDMA : oDebDMA)
  91. #ifdef DEBUG
  92. int stradis_driver(void) /* for the benefit of ksymoops */
  93. {
  94. return 1;
  95. }
  96. #endif
  97. #ifdef USE_RESCUE_EEPROM_SDM275
  98. static unsigned char rescue_eeprom[64] = {
  99. 0x00,0x01,0x04,0x13,0x26,0x0f,0x10,0x00,0x00,0x00,0x43,0x63,0x22,0x01,0x29,0x15,0x73,0x00,0x1f, 'd', 'e', 'c', 'x', 'l', 'd', 'v', 'a',0x02,0x00,0x01,0x00,0xcc,0xa4,0x63,0x09,0xe2,0x10,0x00,0x0a,0x00,0x02,0x02, 'd', 'e', 'c', 'x', 'l', 'a',0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  100. };
  101. #endif
  102. /* ----------------------------------------------------------------------- */
  103. /* Hardware I2C functions */
  104. static void I2CWipe(struct saa7146 *saa)
  105. {
  106. int i;
  107. /* set i2c to ~=100kHz, abort transfer, clear busy */
  108. saawrite(0x600 | SAA7146_I2C_ABORT, SAA7146_I2C_STATUS);
  109. saawrite((SAA7146_MC2_UPLD_I2C << 16) |
  110.  SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
  111. /* wait for i2c registers to be programmed */
  112. for (i = 0; i < 1000 &&
  113.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
  114. schedule();
  115. saawrite(0x600, SAA7146_I2C_STATUS);
  116. saawrite((SAA7146_MC2_UPLD_I2C << 16) |
  117.  SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
  118. /* wait for i2c registers to be programmed */
  119. for (i = 0; i < 1000 &&
  120.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
  121. schedule();
  122. saawrite(0x600, SAA7146_I2C_STATUS);
  123. saawrite((SAA7146_MC2_UPLD_I2C << 16) |
  124.  SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
  125. /* wait for i2c registers to be programmed */
  126. for (i = 0; i < 1000 &&
  127.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
  128. schedule();
  129. }
  130. /* read I2C */
  131. static int I2CRead(struct i2c_bus *bus, unsigned char addr,
  132.    unsigned char subaddr, int dosub)
  133. {
  134. struct saa7146 *saa = (struct saa7146 *) bus->data;
  135. int i;
  136. if (saaread(SAA7146_I2C_STATUS) & 0x3c)
  137. I2CWipe(saa);
  138. for (i = 0; i < 1000 &&
  139.      (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY); i++)
  140. schedule();
  141. if (i == 1000)
  142. I2CWipe(saa);
  143. if (dosub)
  144. saawrite(((addr & 0xfe) << 24) | (((addr | 1) & 0xff) << 8) |
  145.   ((subaddr & 0xff) << 16) | 0xed, SAA7146_I2C_TRANSFER);
  146. else
  147. saawrite(((addr & 0xfe) << 24) | (((addr | 1) & 0xff) << 16) |
  148.  0xf1, SAA7146_I2C_TRANSFER);
  149. saawrite((SAA7146_MC2_UPLD_I2C << 16) |
  150.  SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
  151. /* wait for i2c registers to be programmed */
  152. for (i = 0; i < 1000 &&
  153.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
  154. schedule();
  155. /* wait for valid data */
  156. for (i = 0; i < 1000 &&
  157.      (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY); i++)
  158. schedule();
  159. if (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_ERR)
  160. return -1;
  161. if (i == 1000) 
  162. printk("i2c setup read timeoutn");
  163. saawrite(0x41, SAA7146_I2C_TRANSFER);
  164. saawrite((SAA7146_MC2_UPLD_I2C << 16) |
  165.  SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
  166. /* wait for i2c registers to be programmed */
  167. for (i = 0; i < 1000 &&
  168.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
  169. schedule();
  170. /* wait for valid data */
  171. for (i = 0; i < 1000 &&
  172.      (saaread(SAA7146_I2C_TRANSFER) & SAA7146_I2C_BUSY); i++)
  173. schedule();
  174. if (saaread(SAA7146_I2C_TRANSFER) & SAA7146_I2C_ERR)
  175. return -1;
  176. if (i == 1000) 
  177. printk("i2c read timeoutn");
  178. return ((saaread(SAA7146_I2C_TRANSFER) >> 24) & 0xff);
  179. }
  180. static int I2CReadOld(struct i2c_bus *bus, unsigned char addr)
  181. {
  182. return I2CRead(bus, addr, 0, 0);
  183. }
  184. /* set both to write both bytes, reset it to write only b1 */
  185. static int I2CWrite(struct i2c_bus *bus, unsigned char addr, unsigned char b1,
  186.     unsigned char b2, int both)
  187. {
  188. struct saa7146 *saa = (struct saa7146 *) bus->data;
  189. int i;
  190. u32 data;
  191. if (saaread(SAA7146_I2C_STATUS) & 0x3c)
  192. I2CWipe(saa);
  193. for (i = 0; i < 1000 &&
  194.      (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY); i++)
  195. schedule();
  196. if (i == 1000)
  197. I2CWipe(saa);
  198. data = ((addr & 0xfe) << 24) | ((b1 & 0xff) << 16);
  199. if (both)
  200. data |= ((b2 & 0xff) << 8) | 0xe5;
  201. else
  202. data |= 0xd1;
  203. saawrite(data, SAA7146_I2C_TRANSFER);
  204. saawrite((SAA7146_MC2_UPLD_I2C << 16) | SAA7146_MC2_UPLD_I2C,
  205.  SAA7146_MC2);
  206. return 0;
  207. }
  208. static void attach_inform(struct i2c_bus *bus, int id)
  209. {
  210. struct saa7146 *saa = (struct saa7146 *) bus->data;
  211. int i;
  212. DEBUG(printk(KERN_DEBUG "stradis%d: i2c: device found=%02xn", saa->nr, id));
  213. if (id == 0xa0) { /* we have rev2 or later board, fill in info */
  214. for (i = 0; i < 64; i++)
  215. saa->boardcfg[i] = I2CRead(bus, 0xa0, i, 1);
  216. #ifdef USE_RESCUE_EEPROM_SDM275
  217. if (saa->boardcfg[0] != 0) {
  218. printk("stradis%d: WARNING: EEPROM STORED VALUES HAVE BEEN IGNOREDn", saa->nr);
  219. for (i = 0; i < 64; i++)
  220. saa->boardcfg[i] = rescue_eeprom[i];
  221. }
  222. #endif
  223. printk("stradis%d: config =", saa->nr);
  224. for (i = 0; i < 51; i++) {
  225. printk(" %02x",saa->boardcfg[i]);
  226. }
  227. printk("n");
  228. }
  229. }
  230. static void detach_inform(struct i2c_bus *bus, int id)
  231. {
  232. struct saa7146 *saa = (struct saa7146 *) bus->data;
  233. int i;
  234. i = saa->nr;
  235. }
  236. static void I2CBusScan(struct i2c_bus *bus)
  237. {
  238. int i;
  239. for (i = 0; i < 0xff; i += 2)
  240. if ((I2CRead(bus, i, 0, 0)) >= 0)
  241. attach_inform(bus, i);
  242. }
  243. static struct i2c_bus saa7146_i2c_bus_template =
  244. {
  245. "saa7146",
  246. I2C_BUSID_BT848,
  247. NULL,
  248. SPIN_LOCK_UNLOCKED,
  249. attach_inform,
  250. detach_inform,
  251. NULL,
  252. NULL,
  253. I2CReadOld,
  254. I2CWrite,
  255. };
  256. static int debiwait_maxwait = 0;
  257. static int wait_for_debi_done(struct saa7146 *saa)
  258. {
  259. int i;
  260. /* wait for registers to be programmed */
  261. for (i = 0; i < 100000 &&
  262.      !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_DEBI); i++)
  263. saaread(SAA7146_MC2);
  264. /* wait for transfer to complete */
  265. for (i = 0; i < 500000 &&
  266.      (saaread(SAA7146_PSR) & SAA7146_PSR_DEBI_S); i++)
  267. saaread(SAA7146_MC2);
  268. if (i > debiwait_maxwait)
  269. printk("wait-for-debi-done maxwait: %dn",
  270. debiwait_maxwait = i);
  271. if (i == 500000)
  272. return -1;
  273. return 0;
  274. }
  275. static int debiwrite(struct saa7146 *saa, u32 config, int addr,
  276.       u32 val, int count)
  277. {
  278. u32 cmd;
  279. if (count <= 0 || count > 32764)
  280. return -1;
  281. if (wait_for_debi_done(saa) < 0)
  282. return -1;
  283. saawrite(config, SAA7146_DEBI_CONFIG);
  284. if (count <= 4) /* immediate transfer */
  285. saawrite(val, SAA7146_DEBI_AD);
  286. else /* block transfer */
  287. saawrite(virt_to_bus(saa->dmadebi), SAA7146_DEBI_AD);
  288. saawrite((cmd = (count << 17) | (addr & 0xffff)), SAA7146_DEBI_COMMAND);
  289. saawrite((SAA7146_MC2_UPLD_DEBI << 16) | SAA7146_MC2_UPLD_DEBI,
  290.  SAA7146_MC2);
  291. return 0;
  292. }
  293. static u32 debiread(struct saa7146 *saa, u32 config, int addr, int count)
  294. {
  295. u32 result = 0;
  296. if (count > 32764 || count <= 0)
  297. return 0;
  298. if (wait_for_debi_done(saa) < 0)
  299. return 0;
  300. saawrite(virt_to_bus(saa->dmadebi), SAA7146_DEBI_AD);
  301. saawrite((count << 17) | 0x10000 | (addr & 0xffff),
  302.  SAA7146_DEBI_COMMAND);
  303. saawrite(config, SAA7146_DEBI_CONFIG);
  304. saawrite((SAA7146_MC2_UPLD_DEBI << 16) | SAA7146_MC2_UPLD_DEBI,
  305.  SAA7146_MC2);
  306. if (count > 4) /* not an immediate transfer */
  307. return count;
  308. wait_for_debi_done(saa);
  309. result = saaread(SAA7146_DEBI_AD);
  310. if (count == 1)
  311. result &= 0xff;
  312. if (count == 2)
  313. result &= 0xffff;
  314. if (count == 3)
  315. result &= 0xffffff;
  316. return result;
  317. }
  318. #if 0 /* unused */
  319. /* MUST be a multiple of 8 bytes and 8-byte aligned and < 32768 bytes */
  320. /* data copied into saa->dmadebi buffer, caller must re-enable interrupts */
  321. static void ibm_block_dram_read(struct saa7146 *saa, int address, int bytes)
  322. {
  323. int i, j;
  324. u32 *buf;
  325. buf = (u32 *) saa->dmadebi;
  326. if (bytes > 0x7000)
  327. bytes = 0x7000;
  328. saawrite(0, SAA7146_IER); /* disable interrupts */
  329. for (i=0; i < 10000 &&
  330. (debiread(saa, debNormal, IBM_MP2_DRAM_CMD_STAT, 2)
  331. & 0x8000); i++)
  332. saaread(SAA7146_MC2);
  333. if (i == 10000)
  334. printk(KERN_ERR "stradis%d: dram_busy never clearedn",
  335. saa->nr);
  336. debiwrite(saa, debNormal, IBM_MP2_SRC_ADDR, (address<<16) |
  337. (address>>16), 4);
  338. debiwrite(saa, debNormal, IBM_MP2_BLOCK_SIZE, bytes, 2);
  339. debiwrite(saa, debNormal, IBM_MP2_CMD_STAT, 0x8a10, 2);
  340. for (j = 0; j < bytes/4; j++) {
  341. for (i = 0; i < 10000 &&
  342. (!(debiread(saa, debNormal, IBM_MP2_DRAM_CMD_STAT, 2)
  343. & 0x4000)); i++)
  344. saaread(SAA7146_MC2);
  345. if (i == 10000)
  346. printk(KERN_ERR "stradis%d: dram_ready never setn",
  347. saa->nr);
  348. buf[j] = debiread(saa, debNormal, IBM_MP2_DRAM_DATA, 4);
  349. }
  350. }
  351. #endif /* unused */
  352. static void do_irq_send_data(struct saa7146 *saa)
  353. {
  354. int split, audbytes, vidbytes;
  355. saawrite(SAA7146_PSR_PIN1, SAA7146_IER);
  356. /* if special feature mode in effect, disable audio sending */
  357. if (saa->playmode != VID_PLAY_NORMAL)
  358. saa->audtail = saa->audhead = 0;
  359. if (saa->audhead <= saa->audtail)
  360. audbytes = saa->audtail - saa->audhead;
  361. else
  362. audbytes = 65536 - (saa->audhead - saa->audtail);
  363. if (saa->vidhead <= saa->vidtail)
  364. vidbytes = saa->vidtail - saa->vidhead;
  365. else
  366. vidbytes = 524288 - (saa->vidhead - saa->vidtail);
  367. if (audbytes == 0 && vidbytes == 0 && saa->osdtail == saa->osdhead) {
  368. saawrite(0, SAA7146_IER);
  369. return;
  370. }
  371. /* if at least 1 block audio waiting and audio fifo isn't full */
  372. if (audbytes >= 2048 && (debiread(saa, debNormal,
  373. IBM_MP2_AUD_FIFO, 2) & 0xff) < 60) {
  374. if (saa->audhead > saa->audtail)
  375. split = 65536 - saa->audhead;
  376. else
  377. split = 0;
  378. audbytes = 2048;
  379. if (split > 0 && split < 2048) {
  380. memcpy(saa->dmadebi, saa->audbuf + saa->audhead,
  381. split);
  382. saa->audhead = 0;
  383. audbytes -= split;
  384. } else
  385. split = 0;
  386. memcpy(saa->dmadebi + split, saa->audbuf + saa->audhead,
  387. audbytes);
  388. saa->audhead += audbytes;
  389. saa->audhead &= 0xffff;
  390. debiwrite(saa, debAudio, (NewCard? IBM_MP2_AUD_FIFO :
  391.   IBM_MP2_AUD_FIFOW), 0, 2048);
  392. wake_up_interruptible(&saa->audq);
  393. /* if at least 1 block video waiting and video fifo isn't full */
  394. } else if (vidbytes >= 30720 && (debiread(saa, debNormal,
  395. IBM_MP2_FIFO, 2)) < 16384) {
  396. if (saa->vidhead > saa->vidtail)
  397. split = 524288 - saa->vidhead;
  398. else
  399. split = 0;
  400. vidbytes = 30720;
  401. if (split > 0 && split < 30720) {
  402. memcpy(saa->dmadebi, saa->vidbuf + saa->vidhead,
  403. split);
  404. saa->vidhead = 0;
  405. vidbytes -= split;
  406. } else
  407. split = 0;
  408. memcpy(saa->dmadebi + split, saa->vidbuf + saa->vidhead,
  409. vidbytes);
  410. saa->vidhead += vidbytes;
  411. saa->vidhead &= 0x7ffff;
  412. debiwrite(saa, debVideo, (NewCard ? IBM_MP2_FIFO :
  413.   IBM_MP2_FIFOW), 0, 30720);
  414. wake_up_interruptible(&saa->vidq);
  415. }
  416. saawrite(SAA7146_PSR_DEBI_S | SAA7146_PSR_PIN1, SAA7146_IER);
  417. }
  418. static void send_osd_data(struct saa7146 *saa)
  419. {
  420. int size = saa->osdtail - saa->osdhead;
  421. if (size > 30720)
  422. size = 30720;
  423. /* ensure some multiple of 8 bytes is transferred */
  424. size = 8 * ((size + 8)>>3);
  425. if (size) {
  426. debiwrite(saa, debNormal, IBM_MP2_OSD_ADDR,
  427.   (saa->osdhead>>3), 2);
  428. memcpy(saa->dmadebi, &saa->osdbuf[saa->osdhead], size);
  429. saa->osdhead += size;
  430. /* block transfer of next 8 bytes to ~32k bytes */
  431. debiwrite(saa, debNormal, IBM_MP2_OSD_DATA, 0, size);
  432. }
  433. if (saa->osdhead >= saa->osdtail) {
  434. saa->osdhead = saa->osdtail = 0;
  435. debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
  436. }
  437. }
  438. static void saa7146_irq(int irq, void *dev_id, struct pt_regs *regs)
  439. {
  440. struct saa7146 *saa = (struct saa7146 *) dev_id;
  441. u32 stat, astat;
  442. int count;
  443. count = 0;
  444. while (1) {
  445. /* get/clear interrupt status bits */
  446. stat = saaread(SAA7146_ISR);
  447. astat = stat & saaread(SAA7146_IER);
  448. if (!astat)
  449. return;
  450. saawrite(astat, SAA7146_ISR);
  451. if (astat & SAA7146_PSR_DEBI_S) {
  452. do_irq_send_data(saa);
  453. }
  454. if (astat & SAA7146_PSR_PIN1) {
  455. int istat;
  456. /* the following read will trigger DEBI_S */
  457. istat = debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
  458. if (istat & 1) {
  459. saawrite(0, SAA7146_IER);
  460. send_osd_data(saa);
  461. saawrite(SAA7146_PSR_DEBI_S |
  462.  SAA7146_PSR_PIN1, SAA7146_IER);
  463. }
  464. if (istat & 0x20) { /* Video Start */
  465. saa->vidinfo.frame_count++;
  466. }
  467. if (istat & 0x400) { /* Picture Start */
  468. /* update temporal reference */
  469. }
  470. if (istat & 0x200) { /* Picture Resolution Change */
  471. /* read new resolution */
  472. }
  473. if (istat & 0x100) { /* New User Data found */
  474. /* read new user data */
  475. }
  476. if (istat & 0x1000) { /* new GOP/SMPTE */
  477. /* read new SMPTE */
  478. }
  479. if (istat & 0x8000) { /* Sequence Start Code */
  480. /* reset frame counter, load sizes */
  481. saa->vidinfo.frame_count = 0;
  482. saa->vidinfo.h_size = 704;
  483. saa->vidinfo.v_size = 480;
  484. #if 0
  485. if (saa->endmarkhead != saa->endmarktail) {
  486. saa->audhead = 
  487. saa->endmark[saa->endmarkhead];
  488. saa->endmarkhead++;
  489. if (saa->endmarkhead >= MAX_MARKS)
  490. saa->endmarkhead = 0;
  491. }
  492. #endif
  493. }
  494. if (istat & 0x4000) { /* Sequence Error Code */
  495. if (saa->endmarkhead != saa->endmarktail) {
  496. saa->audhead = 
  497. saa->endmark[saa->endmarkhead];
  498. saa->endmarkhead++;
  499. if (saa->endmarkhead >= MAX_MARKS)
  500. saa->endmarkhead = 0;
  501. }
  502. }
  503. }
  504. #ifdef IDEBUG
  505. if (astat & SAA7146_PSR_PPEF) {
  506. IDEBUG(printk("stradis%d irq: PPEFn", saa->nr));
  507. }
  508. if (astat & SAA7146_PSR_PABO) {
  509. IDEBUG(printk("stradis%d irq: PABOn", saa->nr));
  510. }
  511. if (astat & SAA7146_PSR_PPED) {
  512. IDEBUG(printk("stradis%d irq: PPEDn", saa->nr));
  513. }
  514. if (astat & SAA7146_PSR_RPS_I1) {
  515. IDEBUG(printk("stradis%d irq: RPS_I1n", saa->nr));
  516. }
  517. if (astat & SAA7146_PSR_RPS_I0) {
  518. IDEBUG(printk("stradis%d irq: RPS_I0n", saa->nr));
  519. }
  520. if (astat & SAA7146_PSR_RPS_LATE1) {
  521. IDEBUG(printk("stradis%d irq: RPS_LATE1n", saa->nr));
  522. }
  523. if (astat & SAA7146_PSR_RPS_LATE0) {
  524. IDEBUG(printk("stradis%d irq: RPS_LATE0n", saa->nr));
  525. }
  526. if (astat & SAA7146_PSR_RPS_E1) {
  527. IDEBUG(printk("stradis%d irq: RPS_E1n", saa->nr));
  528. }
  529. if (astat & SAA7146_PSR_RPS_E0) {
  530. IDEBUG(printk("stradis%d irq: RPS_E0n", saa->nr));
  531. }
  532. if (astat & SAA7146_PSR_RPS_TO1) {
  533. IDEBUG(printk("stradis%d irq: RPS_TO1n", saa->nr));
  534. }
  535. if (astat & SAA7146_PSR_RPS_TO0) {
  536. IDEBUG(printk("stradis%d irq: RPS_TO0n", saa->nr));
  537. }
  538. if (astat & SAA7146_PSR_UPLD) {
  539. IDEBUG(printk("stradis%d irq: UPLDn", saa->nr));
  540. }
  541. if (astat & SAA7146_PSR_DEBI_E) {
  542. IDEBUG(printk("stradis%d irq: DEBI_En", saa->nr));
  543. }
  544. if (astat & SAA7146_PSR_I2C_S) {
  545. IDEBUG(printk("stradis%d irq: I2C_Sn", saa->nr));
  546. }
  547. if (astat & SAA7146_PSR_I2C_E) {
  548. IDEBUG(printk("stradis%d irq: I2C_En", saa->nr));
  549. }
  550. if (astat & SAA7146_PSR_A2_IN) {
  551. IDEBUG(printk("stradis%d irq: A2_INn", saa->nr));
  552. }
  553. if (astat & SAA7146_PSR_A2_OUT) {
  554. IDEBUG(printk("stradis%d irq: A2_OUTn", saa->nr));
  555. }
  556. if (astat & SAA7146_PSR_A1_IN) {
  557. IDEBUG(printk("stradis%d irq: A1_INn", saa->nr));
  558. }
  559. if (astat & SAA7146_PSR_A1_OUT) {
  560. IDEBUG(printk("stradis%d irq: A1_OUTn", saa->nr));
  561. }
  562. if (astat & SAA7146_PSR_AFOU) {
  563. IDEBUG(printk("stradis%d irq: AFOUn", saa->nr));
  564. }
  565. if (astat & SAA7146_PSR_V_PE) {
  566. IDEBUG(printk("stradis%d irq: V_PEn", saa->nr));
  567. }
  568. if (astat & SAA7146_PSR_VFOU) {
  569. IDEBUG(printk("stradis%d irq: VFOUn", saa->nr));
  570. }
  571. if (astat & SAA7146_PSR_FIDA) {
  572. IDEBUG(printk("stradis%d irq: FIDAn", saa->nr));
  573. }
  574. if (astat & SAA7146_PSR_FIDB) {
  575. IDEBUG(printk("stradis%d irq: FIDBn", saa->nr));
  576. }
  577. if (astat & SAA7146_PSR_PIN3) {
  578. IDEBUG(printk("stradis%d irq: PIN3n", saa->nr));
  579. }
  580. if (astat & SAA7146_PSR_PIN2) {
  581. IDEBUG(printk("stradis%d irq: PIN2n", saa->nr));
  582. }
  583. if (astat & SAA7146_PSR_PIN0) {
  584. IDEBUG(printk("stradis%d irq: PIN0n", saa->nr));
  585. }
  586. if (astat & SAA7146_PSR_ECS) {
  587. IDEBUG(printk("stradis%d irq: ECSn", saa->nr));
  588. }
  589. if (astat & SAA7146_PSR_EC3S) {
  590. IDEBUG(printk("stradis%d irq: EC3Sn", saa->nr));
  591. }
  592. if (astat & SAA7146_PSR_EC0S) {
  593. IDEBUG(printk("stradis%d irq: EC0Sn", saa->nr));
  594. }
  595. #endif
  596. count++;
  597. if (count > 15)
  598. printk(KERN_WARNING "stradis%d: irq loop %dn",
  599.        saa->nr, count);
  600. if (count > 20) {
  601. saawrite(0, SAA7146_IER);
  602. printk(KERN_ERR
  603.        "stradis%d: IRQ loop clearedn", saa->nr);
  604. }
  605. }
  606. }
  607. static int ibm_send_command(struct saa7146 *saa,
  608.     int command, int data, int chain)
  609. {
  610. int i;
  611. if (chain)
  612. debiwrite(saa, debNormal, IBM_MP2_COMMAND, (command << 1) | 1, 2);
  613. else
  614. debiwrite(saa, debNormal, IBM_MP2_COMMAND, command << 1, 2);
  615. debiwrite(saa, debNormal, IBM_MP2_CMD_DATA, data, 2);
  616. debiwrite(saa, debNormal, IBM_MP2_CMD_STAT, 1, 2);
  617. for (i = 0; i < 100 &&
  618.      (debiread(saa, debNormal, IBM_MP2_CMD_STAT, 2) & 1); i++)
  619. schedule();
  620. if (i == 100)
  621. return -1;
  622. return 0;
  623. }
  624. static void cs4341_setlevel(struct saa7146 *saa, int left, int right)
  625. {
  626. I2CWrite(&(saa->i2c), 0x22, 0x03,
  627.  left > 94 ? 94 : left, 2);
  628. I2CWrite(&(saa->i2c), 0x22, 0x04,
  629.  right > 94 ? 94 : right, 2);
  630. }
  631. static void initialize_cs4341(struct saa7146 *saa)
  632. {
  633. int i;
  634. for (i = 0; i < 200; i++) {
  635. /* auto mute off, power on, no de-emphasis */
  636. /* I2S data up to 24-bit 64xFs internal SCLK */
  637. I2CWrite(&(saa->i2c), 0x22, 0x01, 0x11, 2);
  638. /* ATAPI mixer settings */
  639. I2CWrite(&(saa->i2c), 0x22, 0x02, 0x49, 2);
  640. /* attenuation left 3db */
  641. I2CWrite(&(saa->i2c), 0x22, 0x03, 0x00, 2);
  642. /* attenuation right 3db */
  643. I2CWrite(&(saa->i2c), 0x22, 0x04, 0x00, 2);
  644. I2CWrite(&(saa->i2c), 0x22, 0x01, 0x10, 2);
  645. if (I2CRead(&(saa->i2c), 0x22, 0x02, 1) == 0x49)
  646. break;
  647. schedule();
  648. }
  649. printk("stradis%d: CS4341 initialized (%d)n", saa->nr, i);
  650. return;
  651. }
  652. static void initialize_cs8420(struct saa7146 *saa, int pro)
  653. {
  654. int i;
  655. u8 *sequence;
  656. if (pro)
  657. sequence = mode8420pro;
  658. else
  659. sequence = mode8420con;
  660. for (i = 0; i < INIT8420LEN; i++)
  661. I2CWrite(&(saa->i2c), 0x20, init8420[i * 2],
  662.  init8420[i * 2 + 1], 2);
  663. for (i = 0; i < MODE8420LEN; i++)
  664. I2CWrite(&(saa->i2c), 0x20, sequence[i * 2],
  665.  sequence[i * 2 + 1], 2);
  666. printk("stradis%d: CS8420 initializedn", saa->nr);
  667. }
  668. static void initialize_saa7121(struct saa7146 *saa, int dopal)
  669. {
  670. int i, mod;
  671. u8 *sequence;
  672. if (dopal)
  673. sequence = init7121pal;
  674. else
  675. sequence = init7121ntsc;
  676. mod = saaread(SAA7146_PSR) & 0x08;
  677. /* initialize PAL/NTSC video encoder */
  678. for (i = 0; i < INIT7121LEN; i++) {
  679. if (NewCard) { /* handle new card encoder differences */
  680. if (sequence[i*2] == 0x3a)
  681. I2CWrite(&(saa->i2c), 0x88, 0x3a, 0x13, 2);
  682. else if (sequence[i*2] == 0x6b)
  683. I2CWrite(&(saa->i2c), 0x88, 0x6b, 0x20, 2);
  684. else if (sequence[i*2] == 0x6c)
  685. I2CWrite(&(saa->i2c), 0x88, 0x6c,
  686.  dopal ? 0x09 : 0xf5, 2);
  687. else if (sequence[i*2] == 0x6d)
  688. I2CWrite(&(saa->i2c), 0x88, 0x6d,
  689.  dopal ? 0x20 : 0x00, 2);
  690. else if (sequence[i*2] == 0x7a)
  691. I2CWrite(&(saa->i2c), 0x88, 0x7a,
  692.  dopal ? (PALFirstActive - 1) :
  693.  (NTSCFirstActive - 4), 2);
  694. else if (sequence[i*2] == 0x7b)
  695. I2CWrite(&(saa->i2c), 0x88, 0x7b,
  696.  dopal ? PALLastActive :
  697.  NTSCLastActive, 2);
  698. else I2CWrite(&(saa->i2c), 0x88, sequence[i * 2],
  699.  sequence[i * 2 + 1], 2);
  700. } else {
  701. if (sequence[i*2] == 0x6b && mod)
  702. I2CWrite(&(saa->i2c), 0x88, 0x6b, 
  703. (sequence[i * 2 + 1] ^ 0x09), 2);
  704. else if (sequence[i*2] == 0x7a)
  705. I2CWrite(&(saa->i2c), 0x88, 0x7a,
  706.  dopal ? (PALFirstActive - 1) :
  707.  (NTSCFirstActive - 4), 2);
  708. else if (sequence[i*2] == 0x7b)
  709. I2CWrite(&(saa->i2c), 0x88, 0x7b,
  710.  dopal ? PALLastActive :
  711.  NTSCLastActive, 2);
  712. else
  713. I2CWrite(&(saa->i2c), 0x88, sequence[i * 2],
  714.  sequence[i * 2 + 1], 2);
  715. }
  716. }
  717. }
  718. static void set_genlock_offset(struct saa7146 *saa, int noffset)
  719. {
  720. int nCode;
  721. int PixelsPerLine = 858;
  722. if (CurrentMode == VIDEO_MODE_PAL)
  723. PixelsPerLine = 864;
  724. if (noffset > 500)
  725. noffset = 500;
  726. else if (noffset < -500)
  727. noffset = -500;
  728. nCode = noffset + 0x100;
  729. if (nCode == 1)
  730. nCode = 0x401;
  731. else if (nCode < 1) nCode = 0x400 + PixelsPerLine + nCode;
  732. debiwrite(saa, debNormal, XILINX_GLDELAY, nCode, 2);
  733. }
  734. static void set_out_format(struct saa7146 *saa, int mode)
  735. {
  736. initialize_saa7121(saa, (mode == VIDEO_MODE_NTSC ? 0 : 1));
  737. saa->boardcfg[2] = mode;
  738. /* do not adjust analog video parameters here, use saa7121 init */
  739. /* you will affect the SDI output on the new card */
  740. if (mode == VIDEO_MODE_PAL) { /* PAL */
  741. debiwrite(saa, debNormal, XILINX_CTL0, 0x0808, 2);
  742. mdelay(50);
  743. saawrite(0x012002c0, SAA7146_NUM_LINE_BYTE1);
  744. if (NewCard) {
  745. debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
  746.   0xe100, 2);
  747. mdelay(50);
  748. }
  749. debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
  750.   NewCard ? 0xe500: 0x6500, 2);
  751. debiwrite(saa, debNormal, IBM_MP2_DISP_DLY,
  752.   (1 << 8) |
  753.   (NewCard ? PALFirstActive : PALFirstActive-6), 2);
  754. } else { /* NTSC */
  755. debiwrite(saa, debNormal, XILINX_CTL0, 0x0800, 2);
  756. mdelay(50);
  757. saawrite(0x00f002c0, SAA7146_NUM_LINE_BYTE1);
  758. debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
  759.   NewCard ? 0xe100: 0x6100, 2);
  760. debiwrite(saa, debNormal, IBM_MP2_DISP_DLY,
  761.   (1 << 8) |
  762.   (NewCard ? NTSCFirstActive : NTSCFirstActive-6), 2);
  763. }
  764. }
  765. /* Intialize bitmangler to map from a byte value to the mangled word that
  766.  * must be output to program the Xilinx part through the DEBI port.
  767.  * Xilinx Data Bit->DEBI Bit: 0->15 1->7 2->6 3->12 4->11 5->2 6->1 7->0
  768.  * transfer FPGA code, init IBM chip, transfer IBM microcode
  769.  * rev2 card mangles: 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0
  770.  */
  771. static u16 bitmangler[256];
  772. static int initialize_fpga(struct video_code *bitdata)
  773. {
  774. int i, num, startindex, failure = 0, loadtwo, loadfile = 0;
  775. u16 *dmabuf;
  776. u8 *newdma;
  777. struct saa7146 *saa;
  778. /* verify fpga code */
  779. for (startindex = 0; startindex < bitdata->datasize; startindex++)
  780. if (bitdata->data[startindex] == 255)
  781. break;
  782. if (startindex == bitdata->datasize) {
  783. printk(KERN_INFO "stradis: bad fpga coden");
  784. return -1;
  785. }
  786. /* initialize all detected cards */
  787. for (num = 0; num < saa_num; num++) {
  788. saa = &saa7146s[num];
  789. if (saa->boardcfg[0] > 20)
  790. continue; /* card was programmed */
  791. loadtwo = (saa->boardcfg[18] & 0x10);
  792. if (!NewCard) /* we have an old board */
  793. for (i = 0; i < 256; i++)
  794.     bitmangler[i] = ((i & 0x01) << 15) |
  795. ((i & 0x02) << 6) | ((i & 0x04) << 4) |
  796. ((i & 0x08) << 9) | ((i & 0x10) << 7) |
  797. ((i & 0x20) >> 3) | ((i & 0x40) >> 5) |
  798. ((i & 0x80) >> 7);
  799. else /* else we have a new board */
  800. for (i = 0; i < 256; i++)
  801.     bitmangler[i] = ((i & 0x01) << 7) |
  802. ((i & 0x02) << 5) | ((i & 0x04) << 3) |
  803. ((i & 0x08) << 1) | ((i & 0x10) >> 1) |
  804. ((i & 0x20) >> 3) | ((i & 0x40) >> 5) |
  805. ((i & 0x80) >> 7);
  806. dmabuf = (u16 *) saa->dmadebi;
  807. newdma = (u8 *) saa->dmadebi;
  808. if (NewCard) { /* SDM2xxx */
  809. if (!strncmp(bitdata->loadwhat, "decoder2", 8))
  810. continue; /* fpga not for this card */
  811. if (!strncmp(&saa->boardcfg[42],
  812.      bitdata->loadwhat, 8)) {
  813. loadfile = 1;
  814. } else if (loadtwo && !strncmp(&saa->boardcfg[19],
  815.    bitdata->loadwhat, 8)) {
  816. loadfile = 2;
  817. } else if (!saa->boardcfg[42] && /* special */
  818.    !strncmp("decxl", bitdata->loadwhat, 8)) {
  819. loadfile = 1;
  820. } else
  821. continue; /* fpga not for this card */
  822. if (loadfile != 1 && loadfile != 2) {
  823. continue; /* skip to next card */
  824. }
  825. if (saa->boardcfg[0] && loadfile == 1 )
  826. continue; /* skip to next card */
  827. if (saa->boardcfg[0] != 1 && loadfile == 2)
  828. continue; /* skip to next card */
  829. saa->boardcfg[0]++; /* mark fpga handled */
  830. printk("stradis%d: loading %sn", saa->nr,
  831. bitdata->loadwhat);
  832. if (loadtwo && loadfile == 2)
  833. goto send_fpga_stuff;
  834. /* turn on the Audio interface to set PROG low */
  835. saawrite(0x00400040, SAA7146_GPIO_CTRL);
  836. saaread(SAA7146_PSR); /* ensure posted write */
  837. /* wait for everyone to reset */
  838. mdelay(10);
  839. saawrite(0x00400000, SAA7146_GPIO_CTRL);
  840. } else { /* original card */
  841. if (strncmp(bitdata->loadwhat, "decoder2", 8))
  842. continue; /* fpga not for this card */
  843. /* Pull the Xilinx PROG signal WS3 low */
  844. saawrite(0x02000200, SAA7146_MC1);
  845. /* Turn on the Audio interface so can set PROG low */
  846. saawrite(0x000000c0, SAA7146_ACON1);
  847. /* Pull the Xilinx INIT signal (GPIO2) low */
  848. saawrite(0x00400000, SAA7146_GPIO_CTRL);
  849. /* Make sure everybody resets */
  850. saaread(SAA7146_PSR); /* ensure posted write */
  851. mdelay(10);
  852. /* Release the Xilinx PROG signal */
  853. saawrite(0x00000000, SAA7146_ACON1);
  854. /* Turn off the Audio interface */
  855. saawrite(0x02000000, SAA7146_MC1);
  856. }
  857. /* Release Xilinx INIT signal (WS2) */
  858. saawrite(0x00000000, SAA7146_GPIO_CTRL);
  859. /* Wait for the INIT to go High */
  860. for (i = 0; i < 10000 &&
  861.      !(saaread(SAA7146_PSR) & SAA7146_PSR_PIN2); i++)
  862. schedule();
  863. if (i == 1000) {
  864. printk(KERN_INFO "stradis%d: no fpga INITn", saa->nr);
  865. return -1;
  866. }
  867. send_fpga_stuff:
  868. if (NewCard) {
  869. for (i = startindex; i < bitdata->datasize; i++)
  870. newdma[i - startindex] =
  871. bitmangler[bitdata->data[i]];
  872. debiwrite(saa, 0x01420000, 0, 0,
  873. ((bitdata->datasize - startindex) + 5));
  874. if (loadtwo) {
  875. if (loadfile == 1) {
  876. printk("stradis%d: "
  877. "awaiting 2nd FPGA bitfilen",
  878. saa->nr);
  879. continue; /* skip to next card */
  880. }
  881. }
  882. } else {
  883. for (i = startindex; i < bitdata->datasize; i++)
  884. dmabuf[i - startindex] =
  885. bitmangler[bitdata->data[i]];
  886. debiwrite(saa, 0x014a0000, 0, 0,
  887. ((bitdata->datasize - startindex) + 5) * 2);
  888. }
  889. for (i = 0; i < 1000 &&
  890.      !(saaread(SAA7146_PSR) & SAA7146_PSR_PIN2); i++)
  891. schedule();
  892. if (i == 1000) {
  893. printk(KERN_INFO "stradis%d: FPGA load failedn",
  894.        saa->nr);
  895. failure++;
  896. continue;
  897. }
  898. if (!NewCard) {
  899. /* Pull the Xilinx INIT signal (GPIO2) low */
  900. saawrite(0x00400000, SAA7146_GPIO_CTRL);
  901. saaread(SAA7146_PSR); /* ensure posted write */
  902. mdelay(2);
  903. saawrite(0x00000000, SAA7146_GPIO_CTRL);
  904. mdelay(2);
  905. }
  906. printk(KERN_INFO "stradis%d: FPGA Loadedn", saa->nr);
  907. saa->boardcfg[0] = 26; /* mark fpga programmed */
  908. /* set VXCO to its lowest frequency */
  909. debiwrite(saa, debNormal, XILINX_PWM, 0, 2);
  910. if (NewCard) {
  911. /* mute CS3310 */
  912. if (HaveCS3310)
  913. debiwrite(saa, debNormal, XILINX_CS3310_CMPLT,
  914.   0, 2);
  915. /* set VXCO to PWM mode, release reset, blank on */
  916. debiwrite(saa, debNormal, XILINX_CTL0, 0xffc4, 2);
  917. mdelay(10);
  918. /* unmute CS3310 */
  919. if (HaveCS3310)
  920. debiwrite(saa, debNormal, XILINX_CTL0,
  921.   0x2020, 2);
  922. }
  923. /* set source Black */
  924. debiwrite(saa, debNormal, XILINX_CTL0, 0x1707, 2);
  925. saa->boardcfg[4] = 22; /* set NTSC First Active Line */
  926. saa->boardcfg[5] = 23; /* set PAL First Active Line */
  927. saa->boardcfg[54] = 2; /* set NTSC Last Active Line - 256 */
  928. saa->boardcfg[55] = 54; /* set PAL Last Active Line - 256 */
  929. set_out_format(saa, VIDEO_MODE_NTSC);
  930. mdelay(50);
  931. /* begin IBM chip init */
  932. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 4, 2);
  933. saaread(SAA7146_PSR); /* wait for reset */
  934. mdelay(5);
  935. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0, 2);
  936. debiread(saa, debNormal, IBM_MP2_CHIP_CONTROL, 2);
  937. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0x10, 2);
  938. debiwrite(saa, debNormal, IBM_MP2_CMD_ADDR, 0, 2);
  939. debiwrite(saa, debNormal, IBM_MP2_CHIP_MODE, 0x2e, 2);
  940. if (NewCard) {
  941. mdelay(5);
  942. /* set i2s rate converter to 48KHz */
  943. debiwrite(saa, debNormal, 0x80c0, 6, 2);
  944. /* we must init CS8420 first since rev b pulls i2s */
  945. /* master clock low and CS4341 needs i2s master to */
  946. /* run the i2c port. */
  947. if (HaveCS8420) {
  948. /* 0=consumer, 1=pro */
  949. initialize_cs8420(saa, 0);
  950. }
  951. mdelay(5);
  952. if (HaveCS4341)
  953. initialize_cs4341(saa);
  954. }
  955. debiwrite(saa, debNormal, IBM_MP2_INFC_CTL, 0x48, 2);
  956. debiwrite(saa, debNormal, IBM_MP2_BEEP_CTL, 0xa000, 2);
  957. debiwrite(saa, debNormal, IBM_MP2_DISP_LBOR, 0, 2);
  958. debiwrite(saa, debNormal, IBM_MP2_DISP_TBOR, 0, 2);
  959. if (NewCard)
  960. set_genlock_offset(saa, 0);
  961. debiwrite(saa, debNormal, IBM_MP2_FRNT_ATTEN, 0, 2);
  962. #if 0
  963. /* enable genlock */
  964. debiwrite(saa, debNormal, XILINX_CTL0, 0x8000, 2);
  965. #else
  966. /* disable genlock */
  967. debiwrite(saa, debNormal, XILINX_CTL0, 0x8080, 2);
  968. #endif
  969. }
  970. return failure;
  971. }
  972. static int do_ibm_reset(struct saa7146 *saa)
  973. {
  974. /* failure if decoder not previously programmed */
  975. if (saa->boardcfg[0] < 37)
  976. return -EIO;
  977. /* mute CS3310 */
  978. if (HaveCS3310)
  979. debiwrite(saa, debNormal, XILINX_CS3310_CMPLT, 0, 2);
  980. /* disable interrupts */
  981. saawrite(0, SAA7146_IER);
  982. saa->audhead = saa->audtail = 0;
  983. saa->vidhead = saa->vidtail = 0;
  984. /* tristate debi bus, disable debi transfers */
  985. saawrite(0x00880000, SAA7146_MC1);
  986. /* ensure posted write */
  987. saaread(SAA7146_MC1);
  988. mdelay(50);
  989. /* re-enable debi transfers */
  990. saawrite(0x00880088, SAA7146_MC1);
  991. /* set source Black */
  992. debiwrite(saa, debNormal, XILINX_CTL0, 0x1707, 2);
  993. /* begin IBM chip init */
  994. set_out_format(saa, CurrentMode);
  995. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 4, 2);
  996. saaread(SAA7146_PSR); /* wait for reset */
  997. mdelay(5);
  998. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0, 2);
  999. debiread(saa, debNormal, IBM_MP2_CHIP_CONTROL, 2);
  1000. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, ChipControl, 2);
  1001. debiwrite(saa, debNormal, IBM_MP2_CHIP_MODE, 0x2e, 2);
  1002. if (NewCard) {
  1003. mdelay(5);
  1004. /* set i2s rate converter to 48KHz */
  1005. debiwrite(saa, debNormal, 0x80c0, 6, 2);
  1006. /* we must init CS8420 first since rev b pulls i2s */
  1007. /* master clock low and CS4341 needs i2s master to */
  1008. /* run the i2c port. */
  1009. if (HaveCS8420) {
  1010. /* 0=consumer, 1=pro */
  1011. initialize_cs8420(saa, 1);
  1012. }
  1013. mdelay(5);
  1014. if (HaveCS4341)
  1015. initialize_cs4341(saa);
  1016. }
  1017. debiwrite(saa, debNormal, IBM_MP2_INFC_CTL, 0x48, 2);
  1018. debiwrite(saa, debNormal, IBM_MP2_BEEP_CTL, 0xa000, 2);
  1019. debiwrite(saa, debNormal, IBM_MP2_DISP_LBOR, 0, 2);
  1020. debiwrite(saa, debNormal, IBM_MP2_DISP_TBOR, 0, 2);
  1021. if (NewCard)
  1022. set_genlock_offset(saa, 0);
  1023. debiwrite(saa, debNormal, IBM_MP2_FRNT_ATTEN, 0, 2);
  1024. debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0x2000, 2);
  1025. debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4552, 2);
  1026. if (ibm_send_command(saa, IBM_MP2_CONFIG_DECODER,
  1027. (ChipControl == 0x43 ? 0xe800 : 0xe000), 1)) {
  1028. printk(KERN_ERR "stradis%d: IBM config failedn", saa->nr);
  1029. }
  1030. if (HaveCS3310) {
  1031. int i = CS3310MaxLvl;
  1032. debiwrite(saa, debNormal, XILINX_CS3310_CMPLT, ((i<<8)|i), 2);
  1033. }
  1034. /* start video decoder */
  1035. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, ChipControl, 2);
  1036. /* 256k vid, 3520 bytes aud */
  1037. debiwrite(saa, debNormal, IBM_MP2_RB_THRESHOLD, 0x4037, 2);
  1038. debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4573, 2);
  1039. ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
  1040. /* enable buffer threshold irq */
  1041. debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
  1042. /* clear pending interrupts */
  1043. debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
  1044. debiwrite(saa, debNormal, XILINX_CTL0, 0x1711, 2);
  1045. return 0;
  1046. }
  1047. /* load the decoder microcode */
  1048. static int initialize_ibmmpeg2(struct video_code *microcode)
  1049. {
  1050. int i, num;
  1051. struct saa7146 *saa;
  1052. for (num = 0; num < saa_num; num++) {
  1053. saa = &saa7146s[num];
  1054. /* check that FPGA is loaded */
  1055. debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0xa55a, 2);
  1056. if ((i = debiread(saa, debNormal, IBM_MP2_OSD_SIZE, 2)) !=
  1057.      0xa55a) {
  1058. printk(KERN_INFO "stradis%d: %04x != 0xa55an",
  1059. saa->nr, i);
  1060. #if 0
  1061. return -1;
  1062. #endif
  1063. }
  1064. if (!strncmp(microcode->loadwhat, "decoder.vid", 11)) {
  1065. if (saa->boardcfg[0] > 27)
  1066. continue; /* skip to next card */
  1067. /* load video control store */
  1068. saa->boardcfg[1] = 0x13;  /* no-sync default */
  1069. debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 1, 2);
  1070. debiwrite(saa, debNormal, IBM_MP2_PROC_IADDR, 0, 2);
  1071. for (i = 0; i < microcode->datasize / 2; i++)
  1072. debiwrite(saa, debNormal, IBM_MP2_PROC_IDATA,
  1073. (microcode->data[i * 2] << 8) |
  1074.  microcode->data[i * 2 + 1], 2);
  1075. debiwrite(saa, debNormal, IBM_MP2_PROC_IADDR, 0, 2);
  1076. debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 0, 2);
  1077. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
  1078.   ChipControl, 2);
  1079. saa->boardcfg[0] = 28;
  1080. }
  1081. if (!strncmp(microcode->loadwhat, "decoder.aud", 11)) {
  1082. if (saa->boardcfg[0] > 35)
  1083. continue; /* skip to next card */
  1084. /* load audio control store */
  1085. debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 1, 2);
  1086. debiwrite(saa, debNormal, IBM_MP2_AUD_IADDR, 0, 2);
  1087. for (i = 0; i < microcode->datasize; i++)
  1088. debiwrite(saa, debNormal, IBM_MP2_AUD_IDATA,
  1089. microcode->data[i], 1);
  1090. debiwrite(saa, debNormal, IBM_MP2_AUD_IADDR, 0, 2);
  1091. debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 0, 2);
  1092. debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0x2000, 2);
  1093. debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4552, 2);
  1094. if (ibm_send_command(saa, IBM_MP2_CONFIG_DECODER,
  1095.     0xe000, 1)) {
  1096. printk(KERN_ERR
  1097.        "stradis%d: IBM config failedn",
  1098.        saa->nr);
  1099. return -1;
  1100. }
  1101. /* set PWM to center value */
  1102. if (NewCard) {
  1103. debiwrite(saa, debNormal, XILINX_PWM,
  1104.   saa->boardcfg[14] +
  1105.   (saa->boardcfg[13]<<8), 2);
  1106. } else
  1107. debiwrite(saa, debNormal, XILINX_PWM,
  1108.   0x46, 2);
  1109. if (HaveCS3310) {
  1110. i = CS3310MaxLvl;
  1111. debiwrite(saa, debNormal,
  1112. XILINX_CS3310_CMPLT, ((i<<8)|i), 2);
  1113. }
  1114. printk(KERN_INFO
  1115.        "stradis%d: IBM MPEGCD%d Initializedn",
  1116.        saa->nr, 18 + (debiread(saa, debNormal,
  1117.        IBM_MP2_CHIP_CONTROL, 2) >> 12));
  1118. /* start video decoder */
  1119. debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
  1120. ChipControl, 2);
  1121. debiwrite(saa, debNormal, IBM_MP2_RB_THRESHOLD,
  1122. 0x4037, 2); /* 256k vid, 3520 bytes aud */
  1123. debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4573, 2);
  1124. ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
  1125. /* enable buffer threshold irq */
  1126. debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
  1127. debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
  1128. /* enable gpio irq */
  1129. saawrite(0x00002000, SAA7146_GPIO_CTRL);
  1130. /* enable decoder output to HPS */
  1131. debiwrite(saa, debNormal, XILINX_CTL0, 0x1711, 2);
  1132. saa->boardcfg[0] = 37;
  1133. }
  1134. }
  1135. return 0;
  1136. }
  1137. static u32 palette2fmt[] =
  1138. { /* some of these YUV translations are wrong */
  1139.   0xffffffff, 0x86000000, 0x87000000, 0x80000000, 0x8100000, 0x82000000,
  1140.   0x83000000, 0x00000000, 0x03000000, 0x03000000, 0x0a00000, 0x03000000,
  1141.   0x06000000, 0x00000000, 0x03000000, 0x0a000000, 0x0300000
  1142. };
  1143. static int bpp2fmt[4] =
  1144. {
  1145. VIDEO_PALETTE_HI240, VIDEO_PALETTE_RGB565, VIDEO_PALETTE_RGB24,
  1146. VIDEO_PALETTE_RGB32
  1147. };
  1148. /* I wish I could find a formula to calculate these... */
  1149. static u32 h_prescale[64] =
  1150. {
  1151.   0x10000000, 0x18040202, 0x18080000, 0x380c0606, 0x38100204, 0x38140808,
  1152.   0x38180000, 0x381c0000, 0x3820161c, 0x38242a3b, 0x38281230, 0x382c4460,
  1153.   0x38301040, 0x38340080, 0x38380000, 0x383c0000, 0x3840fefe, 0x3844ee9f,
  1154.   0x3848ee9f, 0x384cee9f, 0x3850ee9f, 0x38542a3b, 0x38581230, 0x385c0000,
  1155.   0x38600000, 0x38640000, 0x38680000, 0x386c0000, 0x38700000, 0x38740000,
  1156.   0x38780000, 0x387c0000, 0x30800000, 0x38840000, 0x38880000, 0x388c0000,
  1157.   0x38900000, 0x38940000, 0x38980000, 0x389c0000, 0x38a00000, 0x38a40000,
  1158.   0x38a80000, 0x38ac0000, 0x38b00000, 0x38b40000, 0x38b80000, 0x38bc0000,
  1159.   0x38c00000, 0x38c40000, 0x38c80000, 0x38cc0000, 0x38d00000, 0x38d40000,
  1160.   0x38d80000, 0x38dc0000, 0x38e00000, 0x38e40000, 0x38e80000, 0x38ec0000,
  1161.   0x38f00000, 0x38f40000, 0x38f80000, 0x38fc0000,
  1162. };
  1163. static u32 v_gain[64] =
  1164. {
  1165.   0x016000ff, 0x016100ff, 0x016100ff, 0x016200ff, 0x016200ff, 0x016200ff,
  1166.   0x016200ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff,
  1167.   0x016300ff, 0x016300ff, 0x016300ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1168.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1169.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1170.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1171.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1172.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1173.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1174.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1175.   0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
  1176. };
  1177. static void saa7146_set_winsize(struct saa7146 *saa)
  1178. {
  1179. u32 format;
  1180. int offset, yacl, ysci;
  1181. saa->win.color_fmt = format =
  1182.     (saa->win.depth == 15) ? palette2fmt[VIDEO_PALETTE_RGB555] :
  1183.     palette2fmt[bpp2fmt[(saa->win.bpp - 1) & 3]];
  1184. offset = saa->win.x * saa->win.bpp + saa->win.y * saa->win.bpl;
  1185. saawrite(saa->win.vidadr + offset, SAA7146_BASE_EVEN1);
  1186. saawrite(saa->win.vidadr + offset + saa->win.bpl, SAA7146_BASE_ODD1);
  1187. saawrite(saa->win.bpl * 2, SAA7146_PITCH1);
  1188. saawrite(saa->win.vidadr + saa->win.bpl * saa->win.sheight,
  1189.  SAA7146_PROT_ADDR1);
  1190. saawrite(0, SAA7146_PAGE1);
  1191. saawrite(format|0x60, SAA7146_CLIP_FORMAT_CTRL);
  1192. offset = (704 / (saa->win.width - 1)) & 0x3f;
  1193. saawrite(h_prescale[offset], SAA7146_HPS_H_PRESCALE);
  1194. offset = (720896 / saa->win.width) / (offset + 1);
  1195. saawrite((offset<<12)|0x0c, SAA7146_HPS_H_SCALE);
  1196. if (CurrentMode == VIDEO_MODE_NTSC) {
  1197. yacl = /*(480 / saa->win.height - 1) & 0x3f*/ 0;
  1198. ysci = 1024 - (saa->win.height * 1024 / 480);
  1199. } else {
  1200. yacl = /*(576 / saa->win.height - 1) & 0x3f*/ 0;
  1201. ysci = 1024 - (saa->win.height * 1024 / 576);
  1202. }
  1203. saawrite((1<<31)|(ysci<<21)|(yacl<<15), SAA7146_HPS_V_SCALE);
  1204. saawrite(v_gain[yacl], SAA7146_HPS_V_GAIN);
  1205. saawrite(((SAA7146_MC2_UPLD_DMA1 | SAA7146_MC2_UPLD_HPS_V |
  1206.    SAA7146_MC2_UPLD_HPS_H) << 16) | (SAA7146_MC2_UPLD_DMA1 |
  1207.    SAA7146_MC2_UPLD_HPS_V | SAA7146_MC2_UPLD_HPS_H),
  1208.    SAA7146_MC2);
  1209. }
  1210. /* clip_draw_rectangle(cm,x,y,w,h) -- handle clipping an area
  1211.  * bitmap is fixed width, 128 bytes (1024 pixels represented) 
  1212.  * arranged most-sigificant-bit-left in 32-bit words 
  1213.  * based on saa7146 clipping hardware, it swaps bytes if LE 
  1214.  * much of this makes up for egcs brain damage -- so if you
  1215.  * are wondering "why did he do this?" it is because the C
  1216.  * was adjusted to generate the optimal asm output without
  1217.  * writing non-portable __asm__ directives.
  1218.  */
  1219. static void clip_draw_rectangle(u32 *clipmap, int x, int y, int w, int h)
  1220. {
  1221. register int startword, endword;
  1222. register u32 bitsleft, bitsright;
  1223. u32 *temp;
  1224. if (x < 0) {
  1225. w += x;
  1226. x = 0;
  1227. }
  1228. if (y < 0) {
  1229. h += y;
  1230. y = 0;
  1231. }
  1232. if (w <= 0 || h <= 0 || x > 1023 || y > 639)
  1233. return; /* throw away bad clips */
  1234. if (x + w > 1024)
  1235. w = 1024 - x;
  1236. if (y + h > 640)
  1237. h = 640 - y;
  1238. startword = (x >> 5);
  1239. endword = ((x + w) >> 5);
  1240. bitsleft = (0xffffffff >> (x & 31));
  1241. bitsright = (0xffffffff << (~((x + w) - (endword<<5))));
  1242. temp = &clipmap[(y<<5) + startword];
  1243. w = endword - startword;
  1244. if (!w) {
  1245. bitsleft |= bitsright;
  1246. for (y = 0; y < h; y++) {
  1247. *temp |= bitsleft;
  1248. temp += 32;
  1249. }
  1250. } else {
  1251. for (y = 0; y < h; y++) {
  1252. *temp++ |= bitsleft;
  1253. for (x = 1; x < w; x++)
  1254. *temp++ = 0xffffffff;
  1255. *temp |= bitsright;
  1256. temp += (32 - w);
  1257. }
  1258. }
  1259. }
  1260. static void make_clip_tab(struct saa7146 *saa, struct video_clip *cr, int ncr)
  1261. {
  1262. int i, width, height;
  1263. u32 *clipmap;
  1264. clipmap = saa->dmavid2;
  1265. if((width=saa->win.width)>1023)
  1266. width = 1023; /* sanity check */
  1267. if((height=saa->win.height)>640)
  1268. height = 639; /* sanity check */
  1269. if (ncr > 0) { /* rectangles pased */
  1270. /* convert rectangular clips to a bitmap */
  1271. memset(clipmap, 0, VIDEO_CLIPMAP_SIZE); /* clear map */
  1272. for (i = 0; i < ncr; i++)
  1273. clip_draw_rectangle(clipmap, cr[i].x, cr[i].y,
  1274. cr[i].width, cr[i].height);
  1275. }
  1276. /* clip against viewing window AND screen 
  1277.    so we do not have to rely on the user program
  1278.  */
  1279. clip_draw_rectangle(clipmap,(saa->win.x+width>saa->win.swidth) ?
  1280. (saa->win.swidth-saa->win.x) : width, 0, 1024, 768);
  1281. clip_draw_rectangle(clipmap,0,(saa->win.y+height>saa->win.sheight) ?
  1282. (saa->win.sheight-saa->win.y) : height,1024,768);
  1283. if (saa->win.x<0)
  1284. clip_draw_rectangle(clipmap, 0, 0, -(saa->win.x), 768);
  1285. if (saa->win.y<0)
  1286. clip_draw_rectangle(clipmap, 0, 0, 1024, -(saa->win.y));
  1287. }
  1288. static int saa_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
  1289. {
  1290. struct saa7146 *saa = (struct saa7146 *) dev;
  1291. switch (cmd) {
  1292. case VIDIOCGCAP:
  1293. {
  1294. struct video_capability b;
  1295. strcpy(b.name, saa->video_dev.name);
  1296. b.type = VID_TYPE_CAPTURE |
  1297.     VID_TYPE_OVERLAY |
  1298.     VID_TYPE_CLIPPING |
  1299.     VID_TYPE_FRAMERAM |
  1300.     VID_TYPE_SCALES;
  1301. b.channels = 1;
  1302. b.audios = 1;
  1303. b.maxwidth = 768;
  1304. b.maxheight = 576;
  1305. b.minwidth = 32;
  1306. b.minheight = 32;
  1307. if (copy_to_user(arg, &b, sizeof(b)))
  1308. return -EFAULT;
  1309. return 0;
  1310. }
  1311. case VIDIOCGPICT:
  1312. {
  1313. struct video_picture p = saa->picture;
  1314. if (saa->win.depth == 8)
  1315. p.palette = VIDEO_PALETTE_HI240;
  1316. if (saa->win.depth == 15)
  1317. p.palette = VIDEO_PALETTE_RGB555;
  1318. if (saa->win.depth == 16)
  1319. p.palette = VIDEO_PALETTE_RGB565;
  1320. if (saa->win.depth == 24)
  1321. p.palette = VIDEO_PALETTE_RGB24;
  1322. if (saa->win.depth == 32)
  1323. p.palette = VIDEO_PALETTE_RGB32;
  1324. if (copy_to_user(arg, &p, sizeof(p)))
  1325. return -EFAULT;
  1326. return 0;
  1327. }
  1328. case VIDIOCSPICT:
  1329. {
  1330. struct video_picture p;
  1331. u32 format;
  1332. if (copy_from_user(&p, arg, sizeof(p)))
  1333. return -EFAULT;
  1334. if (p.palette < sizeof(palette2fmt) / sizeof(u32)) {
  1335. format = palette2fmt[p.palette];
  1336. saa->win.color_fmt = format;
  1337. saawrite(format|0x60, SAA7146_CLIP_FORMAT_CTRL);
  1338. }
  1339. saawrite(((p.brightness & 0xff00) << 16) |
  1340.  ((p.contrast & 0xfe00) << 7) |
  1341.      ((p.colour & 0xfe00) >> 9), SAA7146_BCS_CTRL);
  1342. saa->picture = p;
  1343. /* upload changed registers */
  1344. saawrite(((SAA7146_MC2_UPLD_HPS_H |
  1345.  SAA7146_MC2_UPLD_HPS_V) << 16) |
  1346. SAA7146_MC2_UPLD_HPS_H | SAA7146_MC2_UPLD_HPS_V,
  1347.  SAA7146_MC2);
  1348. return 0;
  1349. }
  1350. case VIDIOCSWIN:
  1351. {
  1352. struct video_window vw;
  1353. struct video_clip *vcp = NULL;
  1354. if (copy_from_user(&vw, arg, sizeof(vw)))
  1355. return -EFAULT;
  1356. if (vw.flags || vw.width < 16 || vw.height < 16) { /* stop capture */
  1357. saawrite((SAA7146_MC1_TR_E_1 << 16), SAA7146_MC1);
  1358. return -EINVAL;
  1359. }
  1360. if (saa->win.bpp < 4) { /* 32-bit align start and adjust width */
  1361. int i = vw.x;
  1362. vw.x = (vw.x + 3) & ~3;
  1363. i = vw.x - i;
  1364. vw.width -= i;
  1365. }
  1366. saa->win.x = vw.x;
  1367. saa->win.y = vw.y;
  1368. saa->win.width = vw.width;
  1369. if (saa->win.width > 768)
  1370. saa->win.width = 768;
  1371. saa->win.height = vw.height;
  1372. if (CurrentMode == VIDEO_MODE_NTSC) {
  1373. if (saa->win.height > 480)
  1374. saa->win.height = 480;
  1375. } else {
  1376. if (saa->win.height > 576)
  1377. saa->win.height = 576;
  1378. }
  1379. /* stop capture */
  1380. saawrite((SAA7146_MC1_TR_E_1 << 16), SAA7146_MC1);
  1381. saa7146_set_winsize(saa);
  1382. /*
  1383.  *    Do any clips.
  1384.  */
  1385. if (vw.clipcount < 0) {
  1386. if (copy_from_user(saa->dmavid2, vw.clips,
  1387.    VIDEO_CLIPMAP_SIZE))
  1388. return -EFAULT;
  1389. }
  1390. else if (vw.clipcount > 16384) {
  1391. return -EINVAL;
  1392. } else if (vw.clipcount > 0) {
  1393. if ((vcp = vmalloc(sizeof(struct video_clip) *
  1394.         (vw.clipcount))) == NULL)
  1395.  return -ENOMEM;
  1396. if (copy_from_user(vcp, vw.clips,
  1397.       sizeof(struct video_clip) *
  1398.    vw.clipcount)) {
  1399. vfree(vcp);
  1400. return -EFAULT;
  1401. }
  1402. } else /* nothing clipped */
  1403. memset(saa->dmavid2, 0, VIDEO_CLIPMAP_SIZE);
  1404. make_clip_tab(saa, vcp, vw.clipcount);
  1405. if (vw.clipcount > 0)
  1406. vfree(vcp);
  1407. /* start capture & clip dma if we have an address */
  1408. if ((saa->cap & 3) && saa->win.vidadr != 0)
  1409. saawrite(((SAA7146_MC1_TR_E_1 |
  1410. SAA7146_MC1_TR_E_2) << 16) | 0xffff,
  1411. SAA7146_MC1);
  1412. return 0;
  1413. }
  1414. case VIDIOCGWIN:
  1415. {
  1416. struct video_window vw;
  1417. vw.x = saa->win.x;
  1418. vw.y = saa->win.y;
  1419. vw.width = saa->win.width;
  1420. vw.height = saa->win.height;
  1421. vw.chromakey = 0;
  1422. vw.flags = 0;
  1423. if (copy_to_user(arg, &vw, sizeof(vw)))
  1424. return -EFAULT;
  1425. return 0;
  1426. }
  1427. case VIDIOCCAPTURE:
  1428. {
  1429. int v;
  1430. if (copy_from_user(&v, arg, sizeof(v)))
  1431. return -EFAULT;
  1432. if (v == 0) {
  1433. saa->cap &= ~1;
  1434. saawrite((SAA7146_MC1_TR_E_1 << 16),
  1435.  SAA7146_MC1);
  1436. } else {
  1437. if (saa->win.vidadr == 0 || saa->win.width == 0
  1438.     || saa->win.height == 0)
  1439. return -EINVAL;
  1440. saa->cap |= 1;
  1441. saawrite((SAA7146_MC1_TR_E_1 << 16) | 0xffff,
  1442.  SAA7146_MC1);
  1443. }
  1444. return 0;
  1445. }
  1446. case VIDIOCGFBUF:
  1447. {
  1448. struct video_buffer v;
  1449. v.base = (void *) saa->win.vidadr;
  1450. v.height = saa->win.sheight;
  1451. v.width = saa->win.swidth;
  1452. v.depth = saa->win.depth;
  1453. v.bytesperline = saa->win.bpl;
  1454. if (copy_to_user(arg, &v, sizeof(v)))
  1455. return -EFAULT;
  1456. return 0;
  1457. }
  1458. case VIDIOCSFBUF:
  1459. {
  1460. struct video_buffer v;
  1461. if (!capable(CAP_SYS_ADMIN))
  1462. return -EPERM;
  1463. if (copy_from_user(&v, arg, sizeof(v)))
  1464. return -EFAULT;
  1465. if (v.depth != 8 && v.depth != 15 && v.depth != 16 &&
  1466. v.depth != 24 && v.depth != 32 && v.width > 16 &&
  1467.     v.height > 16 && v.bytesperline > 16)
  1468. return -EINVAL;
  1469. if (v.base)
  1470. saa->win.vidadr = (unsigned long) v.base;
  1471. saa->win.sheight = v.height;
  1472. saa->win.swidth = v.width;
  1473. saa->win.bpp = ((v.depth + 7) & 0x38) / 8;
  1474. saa->win.depth = v.depth;
  1475. saa->win.bpl = v.bytesperline;
  1476. DEBUG(printk("Display at %p is %d by %d, bytedepth %d, bpl %dn",
  1477.      v.base, v.width, v.height, saa->win.bpp, saa->win.bpl));
  1478. saa7146_set_winsize(saa);
  1479. return 0;
  1480. }
  1481. case VIDIOCKEY:
  1482. {
  1483. /* Will be handled higher up .. */
  1484. return 0;
  1485. }
  1486. case VIDIOCGAUDIO:
  1487. {
  1488. struct video_audio v;
  1489. v = saa->audio_dev;
  1490. v.flags &= ~(VIDEO_AUDIO_MUTE | VIDEO_AUDIO_MUTABLE);
  1491. v.flags |= VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME;
  1492. strcpy(v.name, "MPEG");
  1493. v.mode = VIDEO_SOUND_STEREO;
  1494. if (copy_to_user(arg, &v, sizeof(v)))
  1495. return -EFAULT;
  1496. return 0;
  1497. }
  1498. case VIDIOCSAUDIO:
  1499. {
  1500. struct video_audio v;
  1501. int i;
  1502. if (copy_from_user(&v, arg, sizeof(v)))
  1503. return -EFAULT;
  1504. i = (~(v.volume>>8))&0xff;
  1505. if (!HaveCS4341) {
  1506. if (v.flags & VIDEO_AUDIO_MUTE) {
  1507. debiwrite(saa, debNormal,
  1508. IBM_MP2_FRNT_ATTEN,
  1509. 0xffff, 2);
  1510. }
  1511. if (!(v.flags & VIDEO_AUDIO_MUTE))
  1512. debiwrite(saa, debNormal,
  1513. IBM_MP2_FRNT_ATTEN,
  1514.   0x0000, 2);
  1515. if (v.flags & VIDEO_AUDIO_VOLUME)
  1516. debiwrite(saa, debNormal,
  1517. IBM_MP2_FRNT_ATTEN,
  1518. (i<<8)|i, 2);
  1519. } else {
  1520. if (v.flags & VIDEO_AUDIO_MUTE)
  1521. cs4341_setlevel(saa, 0xff, 0xff);
  1522. if (!(v.flags & VIDEO_AUDIO_MUTE))
  1523. cs4341_setlevel(saa, 0, 0);
  1524. if (v.flags & VIDEO_AUDIO_VOLUME)
  1525. cs4341_setlevel(saa, i, i);
  1526. }
  1527. saa->audio_dev = v;
  1528. return 0;
  1529. }
  1530. case VIDIOCGUNIT:
  1531. {
  1532. struct video_unit vu;
  1533. vu.video = saa->video_dev.minor;
  1534. vu.vbi = VIDEO_NO_UNIT;
  1535. vu.radio = VIDEO_NO_UNIT;
  1536. vu.audio = VIDEO_NO_UNIT;
  1537. vu.teletext = VIDEO_NO_UNIT;
  1538. if (copy_to_user((void *) arg, (void *) &vu, sizeof(vu)))
  1539. return -EFAULT;
  1540. return 0;
  1541. }
  1542. case VIDIOCSPLAYMODE:
  1543. {
  1544. struct video_play_mode pmode;
  1545. if (copy_from_user((void *) &pmode, arg,
  1546. sizeof(struct video_play_mode)))
  1547. return -EFAULT;
  1548. switch (pmode.mode) {
  1549. case VID_PLAY_VID_OUT_MODE:
  1550. if (pmode.p1 != VIDEO_MODE_NTSC &&
  1551. pmode.p1 != VIDEO_MODE_PAL)
  1552. return -EINVAL;
  1553. set_out_format(saa, pmode.p1);
  1554. return 0;
  1555. case VID_PLAY_GENLOCK:
  1556. debiwrite(saa, debNormal,
  1557.   XILINX_CTL0,
  1558.   (pmode.p1 ? 0x8000 : 0x8080),
  1559.   2);
  1560. if (NewCard)
  1561. set_genlock_offset(saa,
  1562. pmode.p2);
  1563. return 0;
  1564. case VID_PLAY_NORMAL:
  1565. debiwrite(saa, debNormal,
  1566. IBM_MP2_CHIP_CONTROL,
  1567. ChipControl, 2);
  1568. ibm_send_command(saa,
  1569. IBM_MP2_PLAY, 0, 0);
  1570. saa->playmode = pmode.mode;
  1571. return 0;
  1572. case VID_PLAY_PAUSE:
  1573. /* IBM removed the PAUSE command */
  1574. /* they say use SINGLE_FRAME now */
  1575. case VID_PLAY_SINGLE_FRAME:
  1576. ibm_send_command(saa,
  1577. IBM_MP2_SINGLE_FRAME,
  1578. 0, 0);
  1579. if (saa->playmode == pmode.mode) {
  1580. debiwrite(saa, debNormal,
  1581. IBM_MP2_CHIP_CONTROL,
  1582. ChipControl, 2);
  1583. }
  1584. saa->playmode = pmode.mode;
  1585. return 0;
  1586. case VID_PLAY_FAST_FORWARD:
  1587. ibm_send_command(saa,
  1588. IBM_MP2_FAST_FORWARD, 0, 0);
  1589. saa->playmode = pmode.mode;
  1590. return 0;
  1591. case VID_PLAY_SLOW_MOTION:
  1592. ibm_send_command(saa,
  1593. IBM_MP2_SLOW_MOTION,
  1594. pmode.p1, 0);
  1595. saa->playmode = pmode.mode;
  1596. return 0;
  1597. case VID_PLAY_IMMEDIATE_NORMAL:
  1598. /* ensure transfers resume */
  1599. debiwrite(saa, debNormal,
  1600. IBM_MP2_CHIP_CONTROL,
  1601. ChipControl, 2);
  1602. ibm_send_command(saa,
  1603. IBM_MP2_IMED_NORM_PLAY, 0, 0);
  1604. saa->playmode = VID_PLAY_NORMAL;
  1605. return 0;
  1606. case VID_PLAY_SWITCH_CHANNELS:
  1607. saa->audhead = saa->audtail = 0;
  1608. saa->vidhead = saa->vidtail = 0;
  1609. ibm_send_command(saa,
  1610. IBM_MP2_FREEZE_FRAME, 0, 1);
  1611. ibm_send_command(saa,
  1612. IBM_MP2_RESET_AUD_RATE, 0, 1);
  1613. debiwrite(saa, debNormal,
  1614. IBM_MP2_CHIP_CONTROL, 0, 2);
  1615. ibm_send_command(saa,
  1616. IBM_MP2_CHANNEL_SWITCH, 0, 1);
  1617. debiwrite(saa, debNormal,
  1618. IBM_MP2_CHIP_CONTROL,
  1619. ChipControl, 2);
  1620. ibm_send_command(saa,
  1621. IBM_MP2_PLAY, 0, 0);
  1622. saa->playmode = VID_PLAY_NORMAL;
  1623. return 0;
  1624. case VID_PLAY_FREEZE_FRAME:
  1625. ibm_send_command(saa,
  1626. IBM_MP2_FREEZE_FRAME, 0, 0);
  1627. saa->playmode = pmode.mode;
  1628. return 0;
  1629. case VID_PLAY_STILL_MODE:
  1630. ibm_send_command(saa,
  1631. IBM_MP2_SET_STILL_MODE, 0, 0);
  1632. saa->playmode = pmode.mode;
  1633. return 0;
  1634. case VID_PLAY_MASTER_MODE:
  1635. if (pmode.p1 == VID_PLAY_MASTER_NONE)
  1636. saa->boardcfg[1] = 0x13;
  1637. else if (pmode.p1 ==
  1638. VID_PLAY_MASTER_VIDEO)
  1639. saa->boardcfg[1] = 0x23;
  1640. else if (pmode.p1 ==
  1641. VID_PLAY_MASTER_AUDIO)
  1642. saa->boardcfg[1] = 0x43;
  1643. else
  1644. return -EINVAL;
  1645. debiwrite(saa, debNormal,
  1646. IBM_MP2_CHIP_CONTROL,
  1647. ChipControl, 2);
  1648. return 0;
  1649. case VID_PLAY_ACTIVE_SCANLINES:
  1650. if (CurrentMode == VIDEO_MODE_PAL) {
  1651. if (pmode.p1 < 1 ||
  1652. pmode.p2 > 625)
  1653. return -EINVAL;
  1654. saa->boardcfg[5] = pmode.p1;
  1655. saa->boardcfg[55] = (pmode.p1 +
  1656. (pmode.p2/2) - 1) &
  1657. 0xff;
  1658. } else {
  1659. if (pmode.p1 < 4 ||
  1660. pmode.p2 > 525)
  1661. return -EINVAL;
  1662. saa->boardcfg[4] = pmode.p1;
  1663. saa->boardcfg[54] = (pmode.p1 +
  1664. (pmode.p2/2) - 4) &
  1665. 0xff;
  1666. }
  1667. set_out_format(saa, CurrentMode);
  1668. case VID_PLAY_RESET:
  1669. return do_ibm_reset(saa);
  1670. case VID_PLAY_END_MARK:
  1671. if (saa->endmarktail <  
  1672. saa->endmarkhead) {
  1673. if (saa->endmarkhead -
  1674. saa->endmarktail < 2)
  1675. return -ENOSPC;
  1676. } else if (saa->endmarkhead <=
  1677. saa->endmarktail) {
  1678. if (saa->endmarktail -
  1679. saa->endmarkhead >
  1680. (MAX_MARKS - 2))
  1681. return -ENOSPC;
  1682. } else
  1683. return -ENOSPC;
  1684. saa->endmark[saa->endmarktail] =
  1685. saa->audtail;
  1686. saa->endmarktail++;
  1687. if (saa->endmarktail >= MAX_MARKS)
  1688. saa->endmarktail = 0;
  1689. }
  1690. return -EINVAL;
  1691. }
  1692. case VIDIOCSWRITEMODE:
  1693. {
  1694. int mode;
  1695. if (copy_from_user((void *) &mode, arg, sizeof(int)))
  1696.  return -EFAULT;
  1697. if (mode == VID_WRITE_MPEG_AUD ||
  1698.     mode == VID_WRITE_MPEG_VID ||
  1699.     mode == VID_WRITE_CC ||
  1700.     mode == VID_WRITE_TTX ||
  1701.     mode == VID_WRITE_OSD) {
  1702. saa->writemode = mode;
  1703. return 0;
  1704. }
  1705. return -EINVAL;
  1706. }
  1707. case VIDIOCSMICROCODE:
  1708. {
  1709. struct video_code ucode;
  1710. __u8 *udata;
  1711. int i;
  1712. if (copy_from_user((void *) &ucode, arg,
  1713.     sizeof(ucode)))
  1714. return -EFAULT;
  1715. if (ucode.datasize > 65536 || ucode.datasize < 1024 ||
  1716.     strncmp(ucode.loadwhat, "dec", 3))
  1717. return -EINVAL;
  1718. if ((udata = vmalloc(ucode.datasize)) == NULL)
  1719. return -ENOMEM;
  1720. if (copy_from_user((void *) udata, ucode.data,
  1721.     ucode.datasize)) {
  1722. vfree(udata);
  1723. return -EFAULT;
  1724. }
  1725. ucode.data = udata;
  1726. if (!strncmp(ucode.loadwhat, "decoder.aud", 11)
  1727. || !strncmp(ucode.loadwhat, "decoder.vid", 11))
  1728. i = initialize_ibmmpeg2(&ucode);
  1729. else
  1730. i = initialize_fpga(&ucode);
  1731. vfree(udata);
  1732. if (i)
  1733. return -EINVAL;
  1734. return 0;
  1735. }
  1736. case VIDIOCGCHAN: /* this makes xawtv happy */
  1737. {
  1738. struct video_channel v;
  1739. if (copy_from_user(&v, arg, sizeof(v)))
  1740. return -EFAULT;
  1741. v.flags = VIDEO_VC_AUDIO;
  1742. v.tuners = 0;
  1743. v.type = VID_TYPE_MPEG_DECODER;
  1744. v.norm = CurrentMode;
  1745. strcpy(v.name, "MPEG2");
  1746. if (copy_to_user(arg, &v, sizeof(v)))
  1747. return -EFAULT;
  1748. return 0;
  1749. }
  1750. case VIDIOCSCHAN: /* this makes xawtv happy */
  1751. {
  1752. struct video_channel v;
  1753. if (copy_from_user(&v, arg, sizeof(v)))
  1754. return -EFAULT;
  1755. /* do nothing */
  1756. return 0;
  1757. }
  1758. default:
  1759. return -ENOIOCTLCMD;
  1760. }
  1761. return 0;
  1762. }
  1763. static int saa_mmap(struct video_device *dev, const char *adr,
  1764.     unsigned long size)
  1765. {
  1766. struct saa7146 *saa = (struct saa7146 *) dev;
  1767. printk(KERN_DEBUG "stradis%d: saa_mmap calledn", saa->nr);
  1768. return -EINVAL;
  1769. }
  1770. static long saa_read(struct video_device *dev, char *buf,
  1771.      unsigned long count, int nonblock)
  1772. {
  1773. return -EINVAL;
  1774. }
  1775. static long saa_write(struct video_device *dev, const char *buf,
  1776.       unsigned long count, int nonblock)
  1777. {
  1778. struct saa7146 *saa = (struct saa7146 *) dev;
  1779. unsigned long todo = count;
  1780. int blocksize, split;
  1781. unsigned long flags;
  1782. while (todo > 0) {
  1783. if (saa->writemode == VID_WRITE_MPEG_AUD) {
  1784. spin_lock_irqsave(&saa->lock, flags);
  1785. if (saa->audhead <= saa->audtail)
  1786. blocksize = 65536-(saa->audtail - saa->audhead);
  1787. else
  1788. blocksize = saa->audhead - saa->audtail;
  1789. spin_unlock_irqrestore(&saa->lock, flags);
  1790. if (blocksize < 16384) {
  1791. saawrite(SAA7146_PSR_DEBI_S |
  1792.  SAA7146_PSR_PIN1, SAA7146_IER);
  1793. saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
  1794. /* wait for buffer space to open */
  1795. interruptible_sleep_on(&saa->audq);
  1796. }
  1797. spin_lock_irqsave(&saa->lock, flags);
  1798. if (saa->audhead <= saa->audtail) {
  1799. blocksize = 65536-(saa->audtail - saa->audhead);
  1800. split = 65536 - saa->audtail;
  1801. } else {
  1802. blocksize = saa->audhead - saa->audtail;
  1803. split = 65536;
  1804. }
  1805. spin_unlock_irqrestore(&saa->lock, flags);
  1806. blocksize--;
  1807. if (blocksize > todo)
  1808. blocksize = todo;
  1809. /* double check that we really have space */
  1810. if (!blocksize)
  1811. return -ENOSPC;
  1812. if (split < blocksize) {
  1813. if (copy_from_user(saa->audbuf +
  1814. saa->audtail, buf, split)) 
  1815. return -EFAULT;
  1816. buf += split;
  1817. todo -= split;
  1818. blocksize -= split;
  1819. saa->audtail = 0;
  1820. }
  1821. if (copy_from_user(saa->audbuf + saa->audtail, buf,
  1822. blocksize)) 
  1823. return -EFAULT;
  1824. saa->audtail += blocksize;
  1825. todo -= blocksize;
  1826. buf += blocksize;
  1827. saa->audtail &= 0xffff;
  1828. } else if (saa->writemode == VID_WRITE_MPEG_VID) {
  1829. spin_lock_irqsave(&saa->lock, flags);
  1830. if (saa->vidhead <= saa->vidtail)
  1831. blocksize=524288-(saa->vidtail - saa->vidhead);
  1832. else
  1833. blocksize = saa->vidhead - saa->vidtail;
  1834. spin_unlock_irqrestore(&saa->lock, flags);
  1835. if (blocksize < 65536) {
  1836. saawrite(SAA7146_PSR_DEBI_S |
  1837.  SAA7146_PSR_PIN1, SAA7146_IER);
  1838. saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
  1839. /* wait for buffer space to open */
  1840. interruptible_sleep_on(&saa->vidq);
  1841. }
  1842. spin_lock_irqsave(&saa->lock, flags);
  1843. if (saa->vidhead <= saa->vidtail) {
  1844. blocksize=524288-(saa->vidtail - saa->vidhead);
  1845. split = 524288 - saa->vidtail;
  1846. } else {
  1847. blocksize = saa->vidhead - saa->vidtail;
  1848. split = 524288;
  1849. }
  1850. spin_unlock_irqrestore(&saa->lock, flags);
  1851. blocksize--;
  1852. if (blocksize > todo)
  1853. blocksize = todo;
  1854. /* double check that we really have space */
  1855. if (!blocksize)
  1856. return -ENOSPC;
  1857. if (split < blocksize) {
  1858. if (copy_from_user(saa->vidbuf +
  1859. saa->vidtail, buf, split)) 
  1860. return -EFAULT;
  1861. buf += split;
  1862. todo -= split;
  1863. blocksize -= split;
  1864. saa->vidtail = 0;
  1865. }
  1866. if (copy_from_user(saa->vidbuf + saa->vidtail, buf,
  1867. blocksize)) 
  1868. return -EFAULT;
  1869. saa->vidtail += blocksize;
  1870. todo -= blocksize;
  1871. buf += blocksize;
  1872. saa->vidtail &= 0x7ffff;
  1873. } else if (saa->writemode == VID_WRITE_OSD) {
  1874. if (count > 131072)
  1875. return -ENOSPC;
  1876. if (copy_from_user(saa->osdbuf, buf, count))
  1877. return -EFAULT;
  1878. buf += count;
  1879. saa->osdhead = 0;
  1880. saa->osdtail = count;
  1881. debiwrite(saa, debNormal, IBM_MP2_OSD_ADDR, 0, 2);
  1882. debiwrite(saa, debNormal, IBM_MP2_OSD_LINK_ADDR, 0, 2);
  1883. debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00d, 2);
  1884. debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
  1885.   debiread(saa, debNormal,
  1886.   IBM_MP2_DISP_MODE, 2) | 1, 2);
  1887. /* trigger osd data transfer */
  1888. saawrite(SAA7146_PSR_DEBI_S |
  1889.  SAA7146_PSR_PIN1, SAA7146_IER);
  1890. saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
  1891. }
  1892. }
  1893. return count;
  1894. }
  1895. static int saa_open(struct video_device *dev, int flags)
  1896. {
  1897. struct saa7146 *saa = (struct saa7146 *) dev;
  1898. /* FIXME: Don't do it this way, use the video_device->fops
  1899.  * registration for a sane implementation of multiple opens */
  1900. saa->video_dev.users--;
  1901. saa->user++;
  1902. if (saa->user > 1)
  1903. return 0; /* device open already, don't reset */
  1904. saa->writemode = VID_WRITE_MPEG_VID; /* default to video */
  1905. return 0;
  1906. }
  1907. static void saa_close(struct video_device *dev)
  1908. {
  1909. struct saa7146 *saa = (struct saa7146 *) dev;
  1910. saa->user--;
  1911. saa->video_dev.users++;
  1912. if (saa->user > 0) /* still someone using device */
  1913. return;
  1914. saawrite(0x007f0000, SAA7146_MC1); /* stop all overlay dma */
  1915. }
  1916. /* template for video_device-structure */
  1917. static struct video_device saa_template =
  1918. {
  1919. owner: THIS_MODULE,
  1920. name: "SAA7146A",
  1921. type: VID_TYPE_CAPTURE | VID_TYPE_OVERLAY,
  1922. hardware: VID_HARDWARE_SAA7146,
  1923. open: saa_open,
  1924. close: saa_close,
  1925. read: saa_read,
  1926. write: saa_write,
  1927. ioctl: saa_ioctl,
  1928. mmap: saa_mmap,
  1929. };
  1930. static int configure_saa7146(struct pci_dev *dev, int num)
  1931. {
  1932. int result;
  1933. struct saa7146 *saa;
  1934. saa = &saa7146s[num];
  1935. saa->endmarkhead = saa->endmarktail = 0;
  1936. saa->win.x = saa->win.y = 0;
  1937. saa->win.width = saa->win.cropwidth = 720;
  1938. saa->win.height = saa->win.cropheight = 480;
  1939. saa->win.cropx = saa->win.cropy = 0;
  1940. saa->win.bpp = 2;
  1941. saa->win.depth = 16;
  1942. saa->win.color_fmt = palette2fmt[VIDEO_PALETTE_RGB565];
  1943. saa->win.bpl = 1024 * saa->win.bpp;
  1944. saa->win.swidth = 1024;
  1945. saa->win.sheight = 768;
  1946. saa->picture.brightness = 32768;
  1947. saa->picture.contrast = 38768;
  1948. saa->picture.colour = 32768;
  1949. saa->cap = 0;
  1950. saa->dev = dev;
  1951. saa->nr = num;
  1952. saa->playmode = VID_PLAY_NORMAL;
  1953. memset(saa->boardcfg, 0, 64); /* clear board config area */
  1954. saa->saa7146_mem = NULL;
  1955. saa->dmavid1 = saa->dmavid2 = saa->dmavid3 = saa->dmaa1in =
  1956.     saa->dmaa1out = saa->dmaa2in = saa->dmaa2out =
  1957.     saa->pagevid1 = saa->pagevid2 = saa->pagevid3 = saa->pagea1in =
  1958.     saa->pagea1out = saa->pagea2in = saa->pagea2out =
  1959.     saa->pagedebi = saa->dmaRPS1 = saa->dmaRPS2 = saa->pageRPS1 =
  1960.     saa->pageRPS2 = NULL;
  1961. saa->audbuf = saa->vidbuf = saa->osdbuf = saa->dmadebi = NULL;
  1962. saa->audhead = saa->vidtail = 0;
  1963. init_waitqueue_head(&saa->i2cq);
  1964. init_waitqueue_head(&saa->audq);
  1965. init_waitqueue_head(&saa->debiq);
  1966. init_waitqueue_head(&saa->vidq);
  1967. spin_lock_init(&saa->lock);
  1968. if (pci_enable_device(dev))
  1969. return -EIO;
  1970. saa->id = dev->device;
  1971. saa->irq = dev->irq;
  1972. saa->video_dev.minor = -1;
  1973. saa->saa7146_adr = pci_resource_start(dev, 0);
  1974. pci_read_config_byte(dev, PCI_CLASS_REVISION, &saa->revision);
  1975. saa->saa7146_mem = ioremap(saa->saa7146_adr, 0x200);
  1976. if (!saa->saa7146_mem)
  1977. return -EIO;
  1978. memcpy(&(saa->i2c), &saa7146_i2c_bus_template, sizeof(struct i2c_bus));
  1979. memcpy(&saa->video_dev, &saa_template, sizeof(saa_template));
  1980. sprintf(saa->i2c.name, "stradis%d", num);
  1981. saa->i2c.data = saa;
  1982. saawrite(0, SAA7146_IER); /* turn off all interrupts */
  1983. result = request_irq(saa->irq, saa7146_irq,
  1984.        SA_SHIRQ | SA_INTERRUPT, "stradis", (void *) saa);
  1985. if (result == -EINVAL)
  1986. printk(KERN_ERR "stradis%d: Bad irq number or handlern",
  1987.        num);
  1988. if (result == -EBUSY)
  1989. printk(KERN_ERR "stradis%d: IRQ %ld busy, change your PnP"
  1990.        " config in BIOSn", num, saa->irq);
  1991. if (result < 0) {
  1992. iounmap(saa->saa7146_mem);
  1993. return result;
  1994. }
  1995. pci_set_master(dev);
  1996. if (video_register_device(&saa->video_dev, VFL_TYPE_GRABBER, video_nr) < 0) {
  1997. iounmap(saa->saa7146_mem);
  1998. return -1;
  1999. }
  2000. #if 0
  2001. /* i2c generic interface is currently BROKEN */
  2002. i2c_register_bus(&saa->i2c);
  2003. #endif
  2004. return 0;
  2005. }
  2006. static int init_saa7146(int i)
  2007. {
  2008. struct saa7146 *saa = &saa7146s[i];
  2009. saa->user = 0;
  2010. /* reset the saa7146 */
  2011. saawrite(0xffff0000, SAA7146_MC1);
  2012. mdelay(5);
  2013. /* enable debi and i2c transfers and pins */
  2014. saawrite(((SAA7146_MC1_EDP | SAA7146_MC1_EI2C |
  2015.    SAA7146_MC1_TR_E_DEBI) << 16) | 0xffff, SAA7146_MC1);
  2016. /* ensure proper state of chip */
  2017. saawrite(0x00000000, SAA7146_PAGE1);
  2018. saawrite(0x00f302c0, SAA7146_NUM_LINE_BYTE1);
  2019. saawrite(0x00000000, SAA7146_PAGE2);
  2020. saawrite(0x01400080, SAA7146_NUM_LINE_BYTE2);
  2021. saawrite(0x00000000, SAA7146_DD1_INIT);
  2022. saawrite(0x00000000, SAA7146_DD1_STREAM_B);
  2023. saawrite(0x00000000, SAA7146_DD1_STREAM_A);
  2024. saawrite(0x00000000, SAA7146_BRS_CTRL);
  2025. saawrite(0x80400040, SAA7146_BCS_CTRL);
  2026. saawrite(0x0000e000 /*| (1<<29)*/, SAA7146_HPS_CTRL);
  2027. saawrite(0x00000060, SAA7146_CLIP_FORMAT_CTRL);
  2028. saawrite(0x00000000, SAA7146_ACON1);
  2029. saawrite(0x00000000, SAA7146_ACON2);
  2030. saawrite(0x00000600, SAA7146_I2C_STATUS);
  2031. saawrite(((SAA7146_MC2_UPLD_D1_B | SAA7146_MC2_UPLD_D1_A |
  2032.    SAA7146_MC2_UPLD_BRS | SAA7146_MC2_UPLD_HPS_H |
  2033.    SAA7146_MC2_UPLD_HPS_V | SAA7146_MC2_UPLD_DMA2 |
  2034.    SAA7146_MC2_UPLD_DMA1 | SAA7146_MC2_UPLD_I2C) << 16) | 0xffff,
  2035.  SAA7146_MC2);
  2036. /* setup arbitration control registers */
  2037. saawrite(0x1412121a, SAA7146_PCI_BT_V1);
  2038. /* allocate 32k dma buffer + 4k for page table */
  2039. if ((saa->dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) {
  2040. printk(KERN_ERR "stradis%d: debi kmalloc failedn", i);
  2041. return -1;
  2042. }
  2043. #if 0
  2044. saa->pagedebi = saa->dmadebi + 32768; /* top 4k is for mmu */
  2045. saawrite(virt_to_bus(saa->pagedebi) /*|0x800 */ , SAA7146_DEBI_PAGE);
  2046. for (i = 0; i < 12; i++) /* setup mmu page table */
  2047. saa->pagedebi[i] = virt_to_bus((saa->dmadebi + i * 4096));
  2048. #endif
  2049. saa->audhead = saa->vidhead = saa->osdhead = 0;
  2050. saa->audtail = saa->vidtail = saa->osdtail = 0;
  2051. if (saa->vidbuf == NULL)
  2052. if ((saa->vidbuf = vmalloc(524288)) == NULL) {
  2053. printk(KERN_ERR "stradis%d: malloc failedn", saa->nr);
  2054. return -ENOMEM;
  2055. }
  2056. if (saa->audbuf == NULL)
  2057. if ((saa->audbuf = vmalloc(65536)) == NULL) {
  2058. printk(KERN_ERR "stradis%d: malloc failedn", saa->nr);
  2059. vfree(saa->vidbuf);
  2060. saa->vidbuf = NULL;
  2061. return -ENOMEM;
  2062. }
  2063. if (saa->osdbuf == NULL)
  2064. if ((saa->osdbuf = vmalloc(131072)) == NULL) {
  2065. printk(KERN_ERR "stradis%d: malloc failedn", saa->nr);
  2066. vfree(saa->vidbuf);
  2067. vfree(saa->audbuf);
  2068. saa->vidbuf = saa->audbuf = NULL;
  2069. return -ENOMEM;
  2070. }
  2071. /* allocate 81920 byte buffer for clipping */
  2072. if ((saa->dmavid2 = kmalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) {
  2073. printk(KERN_ERR "stradis%d: clip kmalloc failedn", saa->nr);
  2074. vfree(saa->vidbuf);
  2075. vfree(saa->audbuf);
  2076. vfree(saa->osdbuf);
  2077. saa->vidbuf = saa->audbuf = saa->osdbuf = NULL;
  2078. saa->dmavid2 = NULL;
  2079. return -1;
  2080. }
  2081. memset(saa->dmavid2, 0x00, VIDEO_CLIPMAP_SIZE); /* clip everything */
  2082. /* setup clipping registers */
  2083. saawrite(virt_to_bus(saa->dmavid2), SAA7146_BASE_EVEN2);
  2084. saawrite(virt_to_bus(saa->dmavid2) + 128, SAA7146_BASE_ODD2);
  2085. saawrite(virt_to_bus(saa->dmavid2) + VIDEO_CLIPMAP_SIZE,
  2086. SAA7146_PROT_ADDR2);
  2087. saawrite(256, SAA7146_PITCH2);
  2088. saawrite(4, SAA7146_PAGE2); /* dma direction: read, no byteswap */
  2089. saawrite(((SAA7146_MC2_UPLD_DMA2) << 16) | SAA7146_MC2_UPLD_DMA2,
  2090.  SAA7146_MC2);
  2091. I2CBusScan(&(saa->i2c));
  2092. return 0;
  2093. }
  2094. static void release_saa(void)
  2095. {
  2096. u8 command;
  2097. int i;
  2098. struct saa7146 *saa;
  2099. for (i = 0; i < saa_num; i++) {
  2100. saa = &saa7146s[i];
  2101. /* turn off all capturing, DMA and IRQs */
  2102. saawrite(0xffff0000, SAA7146_MC1); /* reset chip */
  2103. saawrite(0, SAA7146_MC2);
  2104. saawrite(0, SAA7146_IER);
  2105. saawrite(0xffffffffUL, SAA7146_ISR);
  2106. #if 0
  2107. /* unregister i2c_bus */
  2108. i2c_unregister_bus((&saa->i2c));
  2109. #endif
  2110. /* disable PCI bus-mastering */
  2111. pci_read_config_byte(saa->dev, PCI_COMMAND, &command);
  2112. command &= ~PCI_COMMAND_MASTER;
  2113. pci_write_config_byte(saa->dev, PCI_COMMAND, command);
  2114. /* unmap and free memory */
  2115. saa->audhead = saa->audtail = saa->osdhead = 0;
  2116. saa->vidhead = saa->vidtail = saa->osdtail = 0;
  2117. if (saa->vidbuf)
  2118. vfree(saa->vidbuf);
  2119. if (saa->audbuf)
  2120. vfree(saa->audbuf);
  2121. if (saa->osdbuf)
  2122. vfree(saa->osdbuf);
  2123. if (saa->dmavid2)
  2124. kfree((void *) saa->dmavid2);
  2125. saa->audbuf = saa->vidbuf = saa->osdbuf = NULL;
  2126. saa->dmavid2 = NULL;
  2127. if (saa->dmadebi)
  2128. kfree((void *) saa->dmadebi);
  2129. if (saa->dmavid1)
  2130. kfree((void *) saa->dmavid1);
  2131. if (saa->dmavid2)
  2132. kfree((void *) saa->dmavid2);
  2133. if (saa->dmavid3)
  2134. kfree((void *) saa->dmavid3);
  2135. if (saa->dmaa1in)
  2136. kfree((void *) saa->dmaa1in);
  2137. if (saa->dmaa1out)
  2138. kfree((void *) saa->dmaa1out);
  2139. if (saa->dmaa2in)
  2140. kfree((void *) saa->dmaa2in);
  2141. if (saa->dmaa2out)
  2142. kfree((void *) saa->dmaa2out);
  2143. if (saa->dmaRPS1)
  2144. kfree((void *) saa->dmaRPS1);
  2145. if (saa->dmaRPS2)
  2146. kfree((void *) saa->dmaRPS2);
  2147. free_irq(saa->irq, saa);
  2148. if (saa->saa7146_mem)
  2149. iounmap(saa->saa7146_mem);
  2150. if (saa->video_dev.minor != -1)
  2151. video_unregister_device(&saa->video_dev);
  2152. }
  2153. }
  2154. static int __init stradis_init (void)
  2155. {
  2156. struct pci_dev *dev = NULL;
  2157. int result = 0, i;
  2158. saa_num = 0;
  2159. while ((dev = pci_find_device(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146, dev))) {
  2160. if (!dev->subsystem_vendor)
  2161. printk(KERN_INFO "stradis%d: rev1 decodern", saa_num);
  2162. else
  2163. printk(KERN_INFO "stradis%d: SDM2xx foundn", saa_num); 
  2164. result = configure_saa7146(dev, saa_num++);
  2165. if (result)
  2166. return result;
  2167. }
  2168. if (saa_num)
  2169. printk(KERN_INFO "stradis: %d card(s) found.n", saa_num);
  2170. else
  2171. return -EINVAL;
  2172. for (i = 0; i < saa_num; i++)
  2173. if (init_saa7146(i) < 0) {
  2174. release_saa();
  2175. return -EIO;
  2176. }
  2177. return 0;
  2178. }
  2179. static void __exit stradis_exit (void)
  2180. {
  2181. release_saa();
  2182. printk(KERN_INFO "stradis: module cleanup completen");
  2183. }
  2184. module_init(stradis_init);
  2185. module_exit(stradis_exit);