saa7134-core.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. /*
  2. *
  3. * device driver for philips saa7134 based TV cards
  4. * driver core
  5. *
  6. * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22. #include <linux/config.h>
  23. #include <linux/init.h>
  24. #include <linux/list.h>
  25. #include <linux/module.h>
  26. #include <linux/moduleparam.h>
  27. #include <linux/kernel.h>
  28. #include <linux/slab.h>
  29. #include <linux/kmod.h>
  30. #include <linux/sound.h>
  31. #include <linux/interrupt.h>
  32. #include <linux/delay.h>
  33. #include "saa7134-reg.h"
  34. #include "saa7134.h"
  35. MODULE_DESCRIPTION("v4l2 driver module for saa7130/34 based TV cards");
  36. MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
  37. MODULE_LICENSE("GPL");
  38. /* ------------------------------------------------------------------ */
  39. static unsigned int irq_debug = 0;
  40. module_param(irq_debug, int, 0644);
  41. MODULE_PARM_DESC(irq_debug,"enable debug messages [IRQ handler]");
  42. static unsigned int core_debug = 0;
  43. module_param(core_debug, int, 0644);
  44. MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
  45. static unsigned int gpio_tracking = 0;
  46. module_param(gpio_tracking, int, 0644);
  47. MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
  48. static unsigned int alsa = 0;
  49. module_param(alsa, int, 0644);
  50. MODULE_PARM_DESC(alsa,"enable ALSA DMA sound [dmasound]");
  51. static unsigned int oss = 0;
  52. module_param(oss, int, 0644);
  53. MODULE_PARM_DESC(oss,"enable OSS DMA sound [dmasound]");
  54. static unsigned int latency = UNSET;
  55. module_param(latency, int, 0444);
  56. MODULE_PARM_DESC(latency,"pci latency timer");
  57. static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  58. static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  59. static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  60. static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  61. static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  62. module_param_array(video_nr, int, NULL, 0444);
  63. module_param_array(vbi_nr, int, NULL, 0444);
  64. module_param_array(radio_nr, int, NULL, 0444);
  65. module_param_array(tuner, int, NULL, 0444);
  66. module_param_array(card, int, NULL, 0444);
  67. MODULE_PARM_DESC(video_nr, "video device number");
  68. MODULE_PARM_DESC(vbi_nr, "vbi device number");
  69. MODULE_PARM_DESC(radio_nr, "radio device number");
  70. MODULE_PARM_DESC(tuner, "tuner type");
  71. MODULE_PARM_DESC(card, "card type");
  72. static DECLARE_MUTEX(devlist_lock);
  73. LIST_HEAD(saa7134_devlist);
  74. static LIST_HEAD(mops_list);
  75. static unsigned int saa7134_devcount;
  76. int (*dmasound_init)(struct saa7134_dev *dev);
  77. int (*dmasound_exit)(struct saa7134_dev *dev);
  78. #define dprintk(fmt, arg...) if (core_debug) \
  79. printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
  80. /* ------------------------------------------------------------------ */
  81. /* debug help functions */
  82. static const char *v4l1_ioctls[] = {
  83. "0", "GCAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
  84. "CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ",
  85. "SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT",
  86. "GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO",
  87. "SMICROCODE", "GVBIFMT", "SVBIFMT" };
  88. #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
  89. static const char *v4l2_ioctls[] = {
  90. "QUERYCAP", "1", "ENUM_PIXFMT", "ENUM_FBUFFMT", "G_FMT", "S_FMT",
  91. "G_COMP", "S_COMP", "REQBUFS", "QUERYBUF", "G_FBUF", "S_FBUF",
  92. "G_WIN", "S_WIN", "PREVIEW", "QBUF", "16", "DQBUF", "STREAMON",
  93. "STREAMOFF", "G_PERF", "G_PARM", "S_PARM", "G_STD", "S_STD",
  94. "ENUMSTD", "ENUMINPUT", "G_CTRL", "S_CTRL", "G_TUNER", "S_TUNER",
  95. "G_FREQ", "S_FREQ", "G_AUDIO", "S_AUDIO", "35", "QUERYCTRL",
  96. "QUERYMENU", "G_INPUT", "S_INPUT", "ENUMCVT", "41", "42", "43",
  97. "44", "45", "G_OUTPUT", "S_OUTPUT", "ENUMOUTPUT", "G_AUDOUT",
  98. "S_AUDOUT", "ENUMFX", "G_EFFECT", "S_EFFECT", "G_MODULATOR",
  99. "S_MODULATOR"
  100. };
  101. #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
  102. static const char *osspcm_ioctls[] = {
  103. "RESET", "SYNC", "SPEED", "STEREO", "GETBLKSIZE", "SETFMT",
  104. "CHANNELS", "?", "POST", "SUBDIVIDE", "SETFRAGMENT", "GETFMTS",
  105. "GETOSPACE", "GETISPACE", "NONBLOCK", "GETCAPS", "GET/SETTRIGGER",
  106. "GETIPTR", "GETOPTR", "MAPINBUF", "MAPOUTBUF", "SETSYNCRO",
  107. "SETDUPLEX", "GETODELAY"
  108. };
  109. #define OSSPCM_IOCTLS ARRAY_SIZE(v4l2_ioctls)
  110. void saa7134_print_ioctl(char *name, unsigned int cmd)
  111. {
  112. char *dir;
  113. switch (_IOC_DIR(cmd)) {
  114. case _IOC_NONE: dir = "--"; break;
  115. case _IOC_READ: dir = "r-"; break;
  116. case _IOC_WRITE: dir = "-w"; break;
  117. case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
  118. default: dir = "??"; break;
  119. }
  120. switch (_IOC_TYPE(cmd)) {
  121. case 'v':
  122. printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l1, %s, VIDIOC%s)\n",
  123. name, cmd, dir, (_IOC_NR(cmd) < V4L1_IOCTLS) ?
  124. v4l1_ioctls[_IOC_NR(cmd)] : "???");
  125. break;
  126. case 'V':
  127. printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l2, %s, VIDIOC_%s)\n",
  128. name, cmd, dir, (_IOC_NR(cmd) < V4L2_IOCTLS) ?
  129. v4l2_ioctls[_IOC_NR(cmd)] : "???");
  130. break;
  131. case 'P':
  132. printk(KERN_DEBUG "%s: ioctl 0x%08x (oss dsp, %s, SNDCTL_DSP_%s)\n",
  133. name, cmd, dir, (_IOC_NR(cmd) < OSSPCM_IOCTLS) ?
  134. osspcm_ioctls[_IOC_NR(cmd)] : "???");
  135. break;
  136. case 'M':
  137. printk(KERN_DEBUG "%s: ioctl 0x%08x (oss mixer, %s, #%d)\n",
  138. name, cmd, dir, _IOC_NR(cmd));
  139. break;
  140. default:
  141. printk(KERN_DEBUG "%s: ioctl 0x%08x (???, %s, #%d)\n",
  142. name, cmd, dir, _IOC_NR(cmd));
  143. }
  144. }
  145. void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
  146. {
  147. unsigned long mode,status;
  148. if (!gpio_tracking)
  149. return;
  150. /* rising SAA7134_GPIO_GPRESCAN reads the status */
  151. saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,0);
  152. saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,SAA7134_GPIO_GPRESCAN);
  153. mode = saa_readl(SAA7134_GPIO_GPMODE0 >> 2) & 0xfffffff;
  154. status = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & 0xfffffff;
  155. printk(KERN_DEBUG
  156. "%s: gpio: mode=0x%07lx in=0x%07lx out=0x%07lx [%s]\n",
  157. dev->name, mode, (~mode) & status, mode & status, msg);
  158. }
  159. /* ------------------------------------------------------------------ */
  160. /* ----------------------------------------------------------- */
  161. /* delayed request_module */
  162. #if defined(CONFIG_MODULES) && defined(MODULE)
  163. static int need_empress;
  164. static int need_dvb;
  165. static int need_alsa;
  166. static int need_oss;
  167. static int pending_call(struct notifier_block *self, unsigned long state,
  168. void *module)
  169. {
  170. if (module != THIS_MODULE || state != MODULE_STATE_LIVE)
  171. return NOTIFY_DONE;
  172. if (need_empress)
  173. request_module("saa7134-empress");
  174. if (need_dvb)
  175. request_module("saa7134-dvb");
  176. if (need_alsa)
  177. request_module("saa7134-alsa");
  178. if (need_oss)
  179. request_module("saa7134-oss");
  180. return NOTIFY_DONE;
  181. }
  182. static int pending_registered=0;
  183. static struct notifier_block pending_notifier = {
  184. .notifier_call = pending_call,
  185. };
  186. static void request_module_depend(char *name, int *flag)
  187. {
  188. int err;
  189. switch (THIS_MODULE->state) {
  190. case MODULE_STATE_COMING:
  191. if (!pending_registered) {
  192. err = register_module_notifier(&pending_notifier);
  193. pending_registered = 1;
  194. }
  195. *flag = 1;
  196. break;
  197. case MODULE_STATE_LIVE:
  198. request_module(name);
  199. break;
  200. default:
  201. /* nothing */;
  202. break;
  203. }
  204. }
  205. #else
  206. #define request_module_depend(name,flag)
  207. #endif /* CONFIG_MODULES */
  208. /* ------------------------------------------------------------------ */
  209. /* nr of (saa7134-)pages for the given buffer size */
  210. static int saa7134_buffer_pages(int size)
  211. {
  212. size = PAGE_ALIGN(size);
  213. size += PAGE_SIZE; /* for non-page-aligned buffers */
  214. size /= 4096;
  215. return size;
  216. }
  217. /* calc max # of buffers from size (must not exceed the 4MB virtual
  218. * address space per DMA channel) */
  219. int saa7134_buffer_count(unsigned int size, unsigned int count)
  220. {
  221. unsigned int maxcount;
  222. maxcount = 1024 / saa7134_buffer_pages(size);
  223. if (count > maxcount)
  224. count = maxcount;
  225. return count;
  226. }
  227. int saa7134_buffer_startpage(struct saa7134_buf *buf)
  228. {
  229. return saa7134_buffer_pages(buf->vb.bsize) * buf->vb.i;
  230. }
  231. unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
  232. {
  233. unsigned long base;
  234. base = saa7134_buffer_startpage(buf) * 4096;
  235. base += buf->vb.dma.sglist[0].offset;
  236. return base;
  237. }
  238. /* ------------------------------------------------------------------ */
  239. int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
  240. {
  241. __le32 *cpu;
  242. dma_addr_t dma_addr;
  243. cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
  244. if (NULL == cpu)
  245. return -ENOMEM;
  246. pt->size = SAA7134_PGTABLE_SIZE;
  247. pt->cpu = cpu;
  248. pt->dma = dma_addr;
  249. return 0;
  250. }
  251. int saa7134_pgtable_build(struct pci_dev *pci, struct saa7134_pgtable *pt,
  252. struct scatterlist *list, unsigned int length,
  253. unsigned int startpage)
  254. {
  255. __le32 *ptr;
  256. unsigned int i,p;
  257. BUG_ON(NULL == pt || NULL == pt->cpu);
  258. ptr = pt->cpu + startpage;
  259. for (i = 0; i < length; i++, list++)
  260. for (p = 0; p * 4096 < list->length; p++, ptr++)
  261. *ptr = cpu_to_le32(sg_dma_address(list) - list->offset);
  262. return 0;
  263. }
  264. void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt)
  265. {
  266. if (NULL == pt->cpu)
  267. return;
  268. pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
  269. pt->cpu = NULL;
  270. }
  271. /* ------------------------------------------------------------------ */
  272. void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf)
  273. {
  274. if (in_interrupt())
  275. BUG();
  276. videobuf_waiton(&buf->vb,0,0);
  277. videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
  278. videobuf_dma_free(&buf->vb.dma);
  279. buf->vb.state = STATE_NEEDS_INIT;
  280. }
  281. /* ------------------------------------------------------------------ */
  282. int saa7134_buffer_queue(struct saa7134_dev *dev,
  283. struct saa7134_dmaqueue *q,
  284. struct saa7134_buf *buf)
  285. {
  286. struct saa7134_buf *next = NULL;
  287. assert_spin_locked(&dev->slock);
  288. dprintk("buffer_queue %p\n",buf);
  289. if (NULL == q->curr) {
  290. if (!q->need_two) {
  291. q->curr = buf;
  292. buf->activate(dev,buf,NULL);
  293. } else if (list_empty(&q->queue)) {
  294. list_add_tail(&buf->vb.queue,&q->queue);
  295. buf->vb.state = STATE_QUEUED;
  296. } else {
  297. next = list_entry(q->queue.next,struct saa7134_buf,
  298. vb.queue);
  299. q->curr = buf;
  300. buf->activate(dev,buf,next);
  301. }
  302. } else {
  303. list_add_tail(&buf->vb.queue,&q->queue);
  304. buf->vb.state = STATE_QUEUED;
  305. }
  306. return 0;
  307. }
  308. void saa7134_buffer_finish(struct saa7134_dev *dev,
  309. struct saa7134_dmaqueue *q,
  310. unsigned int state)
  311. {
  312. assert_spin_locked(&dev->slock);
  313. dprintk("buffer_finish %p\n",q->curr);
  314. /* finish current buffer */
  315. q->curr->vb.state = state;
  316. do_gettimeofday(&q->curr->vb.ts);
  317. wake_up(&q->curr->vb.done);
  318. q->curr = NULL;
  319. }
  320. void saa7134_buffer_next(struct saa7134_dev *dev,
  321. struct saa7134_dmaqueue *q)
  322. {
  323. struct saa7134_buf *buf,*next = NULL;
  324. assert_spin_locked(&dev->slock);
  325. BUG_ON(NULL != q->curr);
  326. if (!list_empty(&q->queue)) {
  327. /* activate next one from queue */
  328. buf = list_entry(q->queue.next,struct saa7134_buf,vb.queue);
  329. dprintk("buffer_next %p [prev=%p/next=%p]\n",
  330. buf,q->queue.prev,q->queue.next);
  331. list_del(&buf->vb.queue);
  332. if (!list_empty(&q->queue))
  333. next = list_entry(q->queue.next,struct saa7134_buf,
  334. vb.queue);
  335. q->curr = buf;
  336. buf->activate(dev,buf,next);
  337. dprintk("buffer_next #2 prev=%p/next=%p\n",
  338. q->queue.prev,q->queue.next);
  339. } else {
  340. /* nothing to do -- just stop DMA */
  341. dprintk("buffer_next %p\n",NULL);
  342. saa7134_set_dmabits(dev);
  343. del_timer(&q->timeout);
  344. }
  345. }
  346. void saa7134_buffer_timeout(unsigned long data)
  347. {
  348. struct saa7134_dmaqueue *q = (struct saa7134_dmaqueue*)data;
  349. struct saa7134_dev *dev = q->dev;
  350. unsigned long flags;
  351. spin_lock_irqsave(&dev->slock,flags);
  352. /* try to reset the hardware (SWRST) */
  353. saa_writeb(SAA7134_REGION_ENABLE, 0x00);
  354. saa_writeb(SAA7134_REGION_ENABLE, 0x80);
  355. saa_writeb(SAA7134_REGION_ENABLE, 0x00);
  356. /* flag current buffer as failed,
  357. try to start over with the next one. */
  358. if (q->curr) {
  359. dprintk("timeout on %p\n",q->curr);
  360. saa7134_buffer_finish(dev,q,STATE_ERROR);
  361. }
  362. saa7134_buffer_next(dev,q);
  363. spin_unlock_irqrestore(&dev->slock,flags);
  364. }
  365. /* ------------------------------------------------------------------ */
  366. int saa7134_set_dmabits(struct saa7134_dev *dev)
  367. {
  368. u32 split, task=0, ctrl=0, irq=0;
  369. enum v4l2_field cap = V4L2_FIELD_ANY;
  370. enum v4l2_field ov = V4L2_FIELD_ANY;
  371. assert_spin_locked(&dev->slock);
  372. /* video capture -- dma 0 + video task A */
  373. if (dev->video_q.curr) {
  374. task |= 0x01;
  375. ctrl |= SAA7134_MAIN_CTRL_TE0;
  376. irq |= SAA7134_IRQ1_INTE_RA0_1 |
  377. SAA7134_IRQ1_INTE_RA0_0;
  378. cap = dev->video_q.curr->vb.field;
  379. }
  380. /* video capture -- dma 1+2 (planar modes) */
  381. if (dev->video_q.curr &&
  382. dev->video_q.curr->fmt->planar) {
  383. ctrl |= SAA7134_MAIN_CTRL_TE4 |
  384. SAA7134_MAIN_CTRL_TE5;
  385. }
  386. /* screen overlay -- dma 0 + video task B */
  387. if (dev->ovenable) {
  388. task |= 0x10;
  389. ctrl |= SAA7134_MAIN_CTRL_TE1;
  390. ov = dev->ovfield;
  391. }
  392. /* vbi capture -- dma 0 + vbi task A+B */
  393. if (dev->vbi_q.curr) {
  394. task |= 0x22;
  395. ctrl |= SAA7134_MAIN_CTRL_TE2 |
  396. SAA7134_MAIN_CTRL_TE3;
  397. irq |= SAA7134_IRQ1_INTE_RA0_7 |
  398. SAA7134_IRQ1_INTE_RA0_6 |
  399. SAA7134_IRQ1_INTE_RA0_5 |
  400. SAA7134_IRQ1_INTE_RA0_4;
  401. }
  402. /* audio capture -- dma 3 */
  403. if (dev->dmasound.dma_running) {
  404. ctrl |= SAA7134_MAIN_CTRL_TE6;
  405. irq |= SAA7134_IRQ1_INTE_RA3_1 |
  406. SAA7134_IRQ1_INTE_RA3_0;
  407. }
  408. /* TS capture -- dma 5 */
  409. if (dev->ts_q.curr) {
  410. ctrl |= SAA7134_MAIN_CTRL_TE5;
  411. irq |= SAA7134_IRQ1_INTE_RA2_3 |
  412. SAA7134_IRQ1_INTE_RA2_2 |
  413. SAA7134_IRQ1_INTE_RA2_1 |
  414. SAA7134_IRQ1_INTE_RA2_0;
  415. }
  416. /* set task conditions + field handling */
  417. if (V4L2_FIELD_HAS_BOTH(cap) || V4L2_FIELD_HAS_BOTH(ov) || cap == ov) {
  418. /* default config -- use full frames */
  419. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
  420. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
  421. saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x02);
  422. saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x02);
  423. split = 0;
  424. } else {
  425. /* split fields between tasks */
  426. if (V4L2_FIELD_TOP == cap) {
  427. /* odd A, even B, repeat */
  428. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
  429. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0e);
  430. } else {
  431. /* odd B, even A, repeat */
  432. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0e);
  433. saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
  434. }
  435. saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x01);
  436. saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x01);
  437. split = 1;
  438. }
  439. /* irqs */
  440. saa_writeb(SAA7134_REGION_ENABLE, task);
  441. saa_writel(SAA7134_IRQ1, irq);
  442. saa_andorl(SAA7134_MAIN_CTRL,
  443. SAA7134_MAIN_CTRL_TE0 |
  444. SAA7134_MAIN_CTRL_TE1 |
  445. SAA7134_MAIN_CTRL_TE2 |
  446. SAA7134_MAIN_CTRL_TE3 |
  447. SAA7134_MAIN_CTRL_TE4 |
  448. SAA7134_MAIN_CTRL_TE5 |
  449. SAA7134_MAIN_CTRL_TE6,
  450. ctrl);
  451. dprintk("dmabits: task=0x%02x ctrl=0x%02x irq=0x%x split=%s\n",
  452. task, ctrl, irq, split ? "no" : "yes");
  453. return 0;
  454. }
  455. /* ------------------------------------------------------------------ */
  456. /* IRQ handler + helpers */
  457. static char *irqbits[] = {
  458. "DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3",
  459. "AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC",
  460. "TRIG_ERR", "CONF_ERR", "LOAD_ERR",
  461. "GPIO16?", "GPIO18", "GPIO22", "GPIO23"
  462. };
  463. #define IRQBITS ARRAY_SIZE(irqbits)
  464. static void print_irqstatus(struct saa7134_dev *dev, int loop,
  465. unsigned long report, unsigned long status)
  466. {
  467. unsigned int i;
  468. printk(KERN_DEBUG "%s/irq[%d,%ld]: r=0x%lx s=0x%02lx",
  469. dev->name,loop,jiffies,report,status);
  470. for (i = 0; i < IRQBITS; i++) {
  471. if (!(report & (1 << i)))
  472. continue;
  473. printk(" %s",irqbits[i]);
  474. }
  475. if (report & SAA7134_IRQ_REPORT_DONE_RA0) {
  476. printk(" | RA0=%s,%s,%s,%ld",
  477. (status & 0x40) ? "vbi" : "video",
  478. (status & 0x20) ? "b" : "a",
  479. (status & 0x10) ? "odd" : "even",
  480. (status & 0x0f));
  481. }
  482. printk("\n");
  483. }
  484. static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
  485. {
  486. struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
  487. unsigned long report,status;
  488. int loop, handled = 0;
  489. for (loop = 0; loop < 10; loop++) {
  490. report = saa_readl(SAA7134_IRQ_REPORT);
  491. status = saa_readl(SAA7134_IRQ_STATUS);
  492. if (0 == report) {
  493. if (irq_debug > 1)
  494. printk(KERN_DEBUG "%s/irq: no (more) work\n",
  495. dev->name);
  496. goto out;
  497. }
  498. /* If dmasound support is active and we get a sound report, exit
  499. and let the saa7134-alsa/oss module deal with it */
  500. if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
  501. (dev->dmasound.priv_data != NULL) )
  502. {
  503. if (irq_debug > 1)
  504. printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n",
  505. dev->name);
  506. goto out;
  507. }
  508. handled = 1;
  509. saa_writel(SAA7134_IRQ_REPORT,report);
  510. if (irq_debug)
  511. print_irqstatus(dev,loop,report,status);
  512. if (report & SAA7134_IRQ_REPORT_RDCAP /* _INTL */)
  513. saa7134_irq_video_intl(dev);
  514. if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
  515. (status & 0x60) == 0)
  516. saa7134_irq_video_done(dev,status);
  517. if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
  518. (status & 0x40) == 0x40)
  519. saa7134_irq_vbi_done(dev,status);
  520. if ((report & SAA7134_IRQ_REPORT_DONE_RA2) &&
  521. card_has_mpeg(dev))
  522. saa7134_irq_ts_done(dev,status);
  523. if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
  524. SAA7134_IRQ_REPORT_GPIO18)) &&
  525. dev->remote)
  526. saa7134_input_irq(dev);
  527. }
  528. if (10 == loop) {
  529. print_irqstatus(dev,loop,report,status);
  530. if (report & SAA7134_IRQ_REPORT_PE) {
  531. /* disable all parity error */
  532. printk(KERN_WARNING "%s/irq: looping -- "
  533. "clearing PE (parity error!) enable bit\n",dev->name);
  534. saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
  535. } else if (report & (SAA7134_IRQ_REPORT_GPIO16 |
  536. SAA7134_IRQ_REPORT_GPIO18)) {
  537. /* disable gpio IRQs */
  538. printk(KERN_WARNING "%s/irq: looping -- "
  539. "clearing GPIO enable bits\n",dev->name);
  540. saa_clearl(SAA7134_IRQ2, (SAA7134_IRQ2_INTE_GPIO16 |
  541. SAA7134_IRQ2_INTE_GPIO18));
  542. } else {
  543. /* disable all irqs */
  544. printk(KERN_WARNING "%s/irq: looping -- "
  545. "clearing all enable bits\n",dev->name);
  546. saa_writel(SAA7134_IRQ1,0);
  547. saa_writel(SAA7134_IRQ2,0);
  548. }
  549. }
  550. out:
  551. return IRQ_RETVAL(handled);
  552. }
  553. /* ------------------------------------------------------------------ */
  554. /* early init (no i2c, no irq) */
  555. static int saa7134_hwinit1(struct saa7134_dev *dev)
  556. {
  557. dprintk("hwinit1\n");
  558. saa_writel(SAA7134_IRQ1, 0);
  559. saa_writel(SAA7134_IRQ2, 0);
  560. init_MUTEX(&dev->lock);
  561. spin_lock_init(&dev->slock);
  562. saa7134_track_gpio(dev,"pre-init");
  563. saa7134_video_init1(dev);
  564. saa7134_vbi_init1(dev);
  565. if (card_has_mpeg(dev))
  566. saa7134_ts_init1(dev);
  567. saa7134_input_init1(dev);
  568. /* RAM FIFO config */
  569. saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
  570. saa_writel(SAA7134_THRESHOULD,0x02020202);
  571. /* enable audio + video processing */
  572. saa_writel(SAA7134_MAIN_CTRL,
  573. SAA7134_MAIN_CTRL_VPLLE |
  574. SAA7134_MAIN_CTRL_APLLE |
  575. SAA7134_MAIN_CTRL_EXOSC |
  576. SAA7134_MAIN_CTRL_EVFE1 |
  577. SAA7134_MAIN_CTRL_EVFE2 |
  578. SAA7134_MAIN_CTRL_ESFE |
  579. SAA7134_MAIN_CTRL_EBDAC);
  580. /*
  581. * Initialize OSS _after_ enabling audio clock PLL and audio processing.
  582. * OSS initialization writes to registers via the audio DSP; these
  583. * writes will fail unless the audio clock has been started. At worst,
  584. * audio will not work.
  585. */
  586. /* enable peripheral devices */
  587. saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
  588. /* set vertical line numbering start (vbi needs this) */
  589. saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
  590. return 0;
  591. }
  592. /* late init (with i2c + irq) */
  593. static int saa7134_hwinit2(struct saa7134_dev *dev)
  594. {
  595. unsigned int irq2_mask;
  596. dprintk("hwinit2\n");
  597. saa7134_video_init2(dev);
  598. saa7134_tvaudio_init2(dev);
  599. /* enable IRQ's */
  600. irq2_mask =
  601. SAA7134_IRQ2_INTE_DEC3 |
  602. SAA7134_IRQ2_INTE_DEC2 |
  603. SAA7134_IRQ2_INTE_DEC1 |
  604. SAA7134_IRQ2_INTE_DEC0 |
  605. SAA7134_IRQ2_INTE_PE |
  606. SAA7134_IRQ2_INTE_AR;
  607. if (dev->has_remote == SAA7134_REMOTE_GPIO)
  608. irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 |
  609. SAA7134_IRQ2_INTE_GPIO18A |
  610. SAA7134_IRQ2_INTE_GPIO16 );
  611. saa_writel(SAA7134_IRQ1, 0);
  612. saa_writel(SAA7134_IRQ2, irq2_mask);
  613. return 0;
  614. }
  615. /* shutdown */
  616. static int saa7134_hwfini(struct saa7134_dev *dev)
  617. {
  618. dprintk("hwfini\n");
  619. if (card_has_mpeg(dev))
  620. saa7134_ts_fini(dev);
  621. saa7134_input_fini(dev);
  622. saa7134_vbi_fini(dev);
  623. saa7134_video_fini(dev);
  624. saa7134_tvaudio_fini(dev);
  625. return 0;
  626. }
  627. static void __devinit must_configure_manually(void)
  628. {
  629. unsigned int i,p;
  630. printk(KERN_WARNING
  631. "saa7134: <rant>\n"
  632. "saa7134: Congratulations! Your TV card vendor saved a few\n"
  633. "saa7134: cents for a eeprom, thus your pci board has no\n"
  634. "saa7134: subsystem ID and I can't identify it automatically\n"
  635. "saa7134: </rant>\n"
  636. "saa7134: I feel better now. Ok, here are the good news:\n"
  637. "saa7134: You can use the card=<nr> insmod option to specify\n"
  638. "saa7134: which board do you have. The list:\n");
  639. for (i = 0; i < saa7134_bcount; i++) {
  640. printk(KERN_WARNING "saa7134: card=%d -> %-40.40s",
  641. i,saa7134_boards[i].name);
  642. for (p = 0; saa7134_pci_tbl[p].driver_data; p++) {
  643. if (saa7134_pci_tbl[p].driver_data != i)
  644. continue;
  645. printk(" %04x:%04x",
  646. saa7134_pci_tbl[p].subvendor,
  647. saa7134_pci_tbl[p].subdevice);
  648. }
  649. printk("\n");
  650. }
  651. }
  652. static struct video_device *vdev_init(struct saa7134_dev *dev,
  653. struct video_device *template,
  654. char *type)
  655. {
  656. struct video_device *vfd;
  657. vfd = video_device_alloc();
  658. if (NULL == vfd)
  659. return NULL;
  660. *vfd = *template;
  661. vfd->minor = -1;
  662. vfd->dev = &dev->pci->dev;
  663. vfd->release = video_device_release;
  664. snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
  665. dev->name, type, saa7134_boards[dev->board].name);
  666. return vfd;
  667. }
  668. static void saa7134_unregister_video(struct saa7134_dev *dev)
  669. {
  670. if (dev->video_dev) {
  671. if (-1 != dev->video_dev->minor)
  672. video_unregister_device(dev->video_dev);
  673. else
  674. video_device_release(dev->video_dev);
  675. dev->video_dev = NULL;
  676. }
  677. if (dev->vbi_dev) {
  678. if (-1 != dev->vbi_dev->minor)
  679. video_unregister_device(dev->vbi_dev);
  680. else
  681. video_device_release(dev->vbi_dev);
  682. dev->vbi_dev = NULL;
  683. }
  684. if (dev->radio_dev) {
  685. if (-1 != dev->radio_dev->minor)
  686. video_unregister_device(dev->radio_dev);
  687. else
  688. video_device_release(dev->radio_dev);
  689. dev->radio_dev = NULL;
  690. }
  691. }
  692. static void mpeg_ops_attach(struct saa7134_mpeg_ops *ops,
  693. struct saa7134_dev *dev)
  694. {
  695. int err;
  696. if (NULL != dev->mops)
  697. return;
  698. if (saa7134_boards[dev->board].mpeg != ops->type)
  699. return;
  700. err = ops->init(dev);
  701. if (0 != err)
  702. return;
  703. dev->mops = ops;
  704. }
  705. static void mpeg_ops_detach(struct saa7134_mpeg_ops *ops,
  706. struct saa7134_dev *dev)
  707. {
  708. if (NULL == dev->mops)
  709. return;
  710. if (dev->mops != ops)
  711. return;
  712. dev->mops->fini(dev);
  713. dev->mops = NULL;
  714. }
  715. static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
  716. const struct pci_device_id *pci_id)
  717. {
  718. struct saa7134_dev *dev;
  719. struct list_head *item;
  720. struct saa7134_mpeg_ops *mops;
  721. int err;
  722. dev = kmalloc(sizeof(*dev),GFP_KERNEL);
  723. if (NULL == dev)
  724. return -ENOMEM;
  725. memset(dev,0,sizeof(*dev));
  726. /* pci init */
  727. dev->pci = pci_dev;
  728. if (pci_enable_device(pci_dev)) {
  729. err = -EIO;
  730. goto fail1;
  731. }
  732. dev->nr = saa7134_devcount;
  733. sprintf(dev->name,"saa%x[%d]",pci_dev->device,dev->nr);
  734. /* pci quirks */
  735. if (pci_pci_problems) {
  736. if (pci_pci_problems & PCIPCI_TRITON)
  737. printk(KERN_INFO "%s: quirk: PCIPCI_TRITON\n", dev->name);
  738. if (pci_pci_problems & PCIPCI_NATOMA)
  739. printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA\n", dev->name);
  740. if (pci_pci_problems & PCIPCI_VIAETBF)
  741. printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF\n", dev->name);
  742. if (pci_pci_problems & PCIPCI_VSFX)
  743. printk(KERN_INFO "%s: quirk: PCIPCI_VSFX\n",dev->name);
  744. #ifdef PCIPCI_ALIMAGIK
  745. if (pci_pci_problems & PCIPCI_ALIMAGIK) {
  746. printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
  747. dev->name);
  748. latency = 0x0A;
  749. }
  750. #endif
  751. }
  752. if (UNSET != latency) {
  753. printk(KERN_INFO "%s: setting pci latency timer to %d\n",
  754. dev->name,latency);
  755. pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
  756. }
  757. /* print pci info */
  758. pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
  759. pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
  760. printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
  761. "latency: %d, mmio: 0x%lx\n", dev->name,
  762. pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
  763. dev->pci_lat,pci_resource_start(pci_dev,0));
  764. pci_set_master(pci_dev);
  765. if (!pci_dma_supported(pci_dev,0xffffffff)) {
  766. printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name);
  767. err = -EIO;
  768. goto fail1;
  769. }
  770. /* board config */
  771. dev->board = pci_id->driver_data;
  772. if (card[dev->nr] >= 0 &&
  773. card[dev->nr] < saa7134_bcount)
  774. dev->board = card[dev->nr];
  775. if (SAA7134_BOARD_NOAUTO == dev->board) {
  776. must_configure_manually();
  777. dev->board = SAA7134_BOARD_UNKNOWN;
  778. }
  779. dev->tuner_type = saa7134_boards[dev->board].tuner_type;
  780. dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
  781. if (UNSET != tuner[dev->nr])
  782. dev->tuner_type = tuner[dev->nr];
  783. printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
  784. dev->name,pci_dev->subsystem_vendor,
  785. pci_dev->subsystem_device,saa7134_boards[dev->board].name,
  786. dev->board, card[dev->nr] == dev->board ?
  787. "insmod option" : "autodetected");
  788. /* get mmio */
  789. if (!request_mem_region(pci_resource_start(pci_dev,0),
  790. pci_resource_len(pci_dev,0),
  791. dev->name)) {
  792. err = -EBUSY;
  793. printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n",
  794. dev->name,pci_resource_start(pci_dev,0));
  795. goto fail1;
  796. }
  797. dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000);
  798. dev->bmmio = (__u8 __iomem *)dev->lmmio;
  799. if (NULL == dev->lmmio) {
  800. err = -EIO;
  801. printk(KERN_ERR "%s: can't ioremap() MMIO memory\n",
  802. dev->name);
  803. goto fail2;
  804. }
  805. /* initialize hardware #1 */
  806. saa7134_board_init1(dev);
  807. saa7134_hwinit1(dev);
  808. /* get irq */
  809. err = request_irq(pci_dev->irq, saa7134_irq,
  810. SA_SHIRQ | SA_INTERRUPT, dev->name, dev);
  811. if (err < 0) {
  812. printk(KERN_ERR "%s: can't get IRQ %d\n",
  813. dev->name,pci_dev->irq);
  814. goto fail3;
  815. }
  816. /* wait a bit, register i2c bus */
  817. msleep(100);
  818. saa7134_i2c_register(dev);
  819. /* initialize hardware #2 */
  820. saa7134_board_init2(dev);
  821. saa7134_hwinit2(dev);
  822. /* load i2c helpers */
  823. if (TUNER_ABSENT != dev->tuner_type)
  824. request_module("tuner");
  825. if (dev->tda9887_conf)
  826. request_module("tda9887");
  827. if (card_is_empress(dev)) {
  828. request_module("saa6752hs");
  829. request_module_depend("saa7134-empress",&need_empress);
  830. }
  831. if (card_is_dvb(dev))
  832. request_module_depend("saa7134-dvb",&need_dvb);
  833. if (alsa)
  834. request_module_depend("saa7134-alsa",&need_alsa);
  835. if (oss)
  836. request_module_depend("saa7134-oss",&need_oss);
  837. v4l2_prio_init(&dev->prio);
  838. /* register v4l devices */
  839. dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
  840. err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
  841. video_nr[dev->nr]);
  842. if (err < 0) {
  843. printk(KERN_INFO "%s: can't register video device\n",
  844. dev->name);
  845. goto fail4;
  846. }
  847. printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
  848. dev->name,dev->video_dev->minor & 0x1f);
  849. dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi");
  850. err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
  851. vbi_nr[dev->nr]);
  852. if (err < 0)
  853. goto fail4;
  854. printk(KERN_INFO "%s: registered device vbi%d\n",
  855. dev->name,dev->vbi_dev->minor & 0x1f);
  856. if (card_has_radio(dev)) {
  857. dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
  858. err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
  859. radio_nr[dev->nr]);
  860. if (err < 0)
  861. goto fail4;
  862. printk(KERN_INFO "%s: registered device radio%d\n",
  863. dev->name,dev->radio_dev->minor & 0x1f);
  864. }
  865. /* everything worked */
  866. pci_set_drvdata(pci_dev,dev);
  867. saa7134_devcount++;
  868. down(&devlist_lock);
  869. list_for_each(item,&mops_list) {
  870. mops = list_entry(item, struct saa7134_mpeg_ops, next);
  871. mpeg_ops_attach(mops, dev);
  872. }
  873. list_add_tail(&dev->devlist,&saa7134_devlist);
  874. up(&devlist_lock);
  875. /* check for signal */
  876. saa7134_irq_video_intl(dev);
  877. if (dmasound_init && !dev->dmasound.priv_data) {
  878. dmasound_init(dev);
  879. }
  880. return 0;
  881. fail4:
  882. saa7134_unregister_video(dev);
  883. saa7134_i2c_unregister(dev);
  884. free_irq(pci_dev->irq, dev);
  885. fail3:
  886. saa7134_hwfini(dev);
  887. iounmap(dev->lmmio);
  888. fail2:
  889. release_mem_region(pci_resource_start(pci_dev,0),
  890. pci_resource_len(pci_dev,0));
  891. fail1:
  892. kfree(dev);
  893. return err;
  894. }
  895. static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
  896. {
  897. struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
  898. struct list_head *item;
  899. struct saa7134_mpeg_ops *mops;
  900. /* Release DMA sound modules if present */
  901. if (dmasound_exit && dev->dmasound.priv_data) {
  902. dmasound_exit(dev);
  903. }
  904. /* debugging ... */
  905. if (irq_debug) {
  906. u32 report = saa_readl(SAA7134_IRQ_REPORT);
  907. u32 status = saa_readl(SAA7134_IRQ_STATUS);
  908. print_irqstatus(dev,42,report,status);
  909. }
  910. /* disable peripheral devices */
  911. saa_writeb(SAA7134_SPECIAL_MODE,0);
  912. /* shutdown hardware */
  913. saa_writel(SAA7134_IRQ1,0);
  914. saa_writel(SAA7134_IRQ2,0);
  915. saa_writel(SAA7134_MAIN_CTRL,0);
  916. /* shutdown subsystems */
  917. saa7134_hwfini(dev);
  918. /* unregister */
  919. down(&devlist_lock);
  920. list_del(&dev->devlist);
  921. list_for_each(item,&mops_list) {
  922. mops = list_entry(item, struct saa7134_mpeg_ops, next);
  923. mpeg_ops_detach(mops, dev);
  924. }
  925. up(&devlist_lock);
  926. saa7134_devcount--;
  927. saa7134_i2c_unregister(dev);
  928. saa7134_unregister_video(dev);
  929. /* the DMA sound modules should be unloaded before reaching
  930. this, but just in case they are still present... */
  931. if (dev->dmasound.priv_data != NULL) {
  932. free_irq(pci_dev->irq, &dev->dmasound);
  933. dev->dmasound.priv_data = NULL;
  934. }
  935. /* release resources */
  936. free_irq(pci_dev->irq, dev);
  937. iounmap(dev->lmmio);
  938. release_mem_region(pci_resource_start(pci_dev,0),
  939. pci_resource_len(pci_dev,0));
  940. pci_set_drvdata(pci_dev, NULL);
  941. /* free memory */
  942. kfree(dev);
  943. }
  944. /* ----------------------------------------------------------- */
  945. int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
  946. {
  947. struct list_head *item;
  948. struct saa7134_dev *dev;
  949. down(&devlist_lock);
  950. list_for_each(item,&saa7134_devlist) {
  951. dev = list_entry(item, struct saa7134_dev, devlist);
  952. mpeg_ops_attach(ops, dev);
  953. }
  954. list_add_tail(&ops->next,&mops_list);
  955. up(&devlist_lock);
  956. return 0;
  957. }
  958. void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops)
  959. {
  960. struct list_head *item;
  961. struct saa7134_dev *dev;
  962. down(&devlist_lock);
  963. list_del(&ops->next);
  964. list_for_each(item,&saa7134_devlist) {
  965. dev = list_entry(item, struct saa7134_dev, devlist);
  966. mpeg_ops_detach(ops, dev);
  967. }
  968. up(&devlist_lock);
  969. }
  970. EXPORT_SYMBOL(saa7134_ts_register);
  971. EXPORT_SYMBOL(saa7134_ts_unregister);
  972. /* ----------------------------------------------------------- */
  973. static struct pci_driver saa7134_pci_driver = {
  974. .name = "saa7134",
  975. .id_table = saa7134_pci_tbl,
  976. .probe = saa7134_initdev,
  977. .remove = __devexit_p(saa7134_finidev),
  978. };
  979. static int saa7134_init(void)
  980. {
  981. INIT_LIST_HEAD(&saa7134_devlist);
  982. printk(KERN_INFO "saa7130/34: v4l2 driver version %d.%d.%d loaded\n",
  983. (SAA7134_VERSION_CODE >> 16) & 0xff,
  984. (SAA7134_VERSION_CODE >> 8) & 0xff,
  985. SAA7134_VERSION_CODE & 0xff);
  986. #ifdef SNAPSHOT
  987. printk(KERN_INFO "saa7130/34: snapshot date %04d-%02d-%02d\n",
  988. SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
  989. #endif
  990. return pci_register_driver(&saa7134_pci_driver);
  991. }
  992. static void saa7134_fini(void)
  993. {
  994. #if defined(CONFIG_MODULES) && defined(MODULE)
  995. if (pending_registered)
  996. unregister_module_notifier(&pending_notifier);
  997. #endif /* CONFIG_MODULES */
  998. pci_unregister_driver(&saa7134_pci_driver);
  999. }
  1000. module_init(saa7134_init);
  1001. module_exit(saa7134_fini);
  1002. /* ----------------------------------------------------------- */
  1003. EXPORT_SYMBOL(saa7134_print_ioctl);
  1004. EXPORT_SYMBOL(saa7134_i2c_call_clients);
  1005. EXPORT_SYMBOL(saa7134_devlist);
  1006. EXPORT_SYMBOL(saa7134_boards);
  1007. /* ----------------- for the DMA sound modules --------------- */
  1008. EXPORT_SYMBOL(dmasound_init);
  1009. EXPORT_SYMBOL(dmasound_exit);
  1010. EXPORT_SYMBOL(saa7134_pgtable_free);
  1011. EXPORT_SYMBOL(saa7134_pgtable_build);
  1012. EXPORT_SYMBOL(saa7134_pgtable_alloc);
  1013. EXPORT_SYMBOL(saa7134_set_dmabits);
  1014. /* ----------------------------------------------------------- */
  1015. /*
  1016. * Local variables:
  1017. * c-basic-offset: 8
  1018. * End:
  1019. */