saa7134-ts.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. *
  3. * device driver for philips saa7134 based TV cards
  4. * video4linux video interface
  5. *
  6. * (c) 2001,02 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 "saa7134.h"
  23. #include "saa7134-reg.h"
  24. #include <linux/init.h>
  25. #include <linux/list.h>
  26. #include <linux/module.h>
  27. #include <linux/kernel.h>
  28. #include <linux/delay.h>
  29. /* ------------------------------------------------------------------ */
  30. static unsigned int ts_debug;
  31. module_param(ts_debug, int, 0644);
  32. MODULE_PARM_DESC(ts_debug,"enable debug messages [ts]");
  33. #define ts_dbg(fmt, arg...) do { \
  34. if (ts_debug) \
  35. printk(KERN_DEBUG pr_fmt("ts: " fmt), ## arg); \
  36. } while (0)
  37. /* ------------------------------------------------------------------ */
  38. static int buffer_activate(struct saa7134_dev *dev,
  39. struct saa7134_buf *buf,
  40. struct saa7134_buf *next)
  41. {
  42. ts_dbg("buffer_activate [%p]", buf);
  43. buf->top_seen = 0;
  44. if (!dev->ts_started)
  45. dev->ts_field = V4L2_FIELD_TOP;
  46. if (NULL == next)
  47. next = buf;
  48. if (V4L2_FIELD_TOP == dev->ts_field) {
  49. ts_dbg("- [top] buf=%p next=%p\n", buf, next);
  50. saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(buf));
  51. saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(next));
  52. dev->ts_field = V4L2_FIELD_BOTTOM;
  53. } else {
  54. ts_dbg("- [bottom] buf=%p next=%p\n", buf, next);
  55. saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next));
  56. saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf));
  57. dev->ts_field = V4L2_FIELD_TOP;
  58. }
  59. /* start DMA */
  60. saa7134_set_dmabits(dev);
  61. mod_timer(&dev->ts_q.timeout, jiffies+TS_BUFFER_TIMEOUT);
  62. if (!dev->ts_started)
  63. saa7134_ts_start(dev);
  64. return 0;
  65. }
  66. int saa7134_ts_buffer_init(struct vb2_buffer *vb2)
  67. {
  68. struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb2);
  69. struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv;
  70. struct saa7134_buf *buf = container_of(vbuf, struct saa7134_buf, vb2);
  71. dmaq->curr = NULL;
  72. buf->activate = buffer_activate;
  73. return 0;
  74. }
  75. EXPORT_SYMBOL_GPL(saa7134_ts_buffer_init);
  76. int saa7134_ts_buffer_prepare(struct vb2_buffer *vb2)
  77. {
  78. struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb2);
  79. struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv;
  80. struct saa7134_dev *dev = dmaq->dev;
  81. struct saa7134_buf *buf = container_of(vbuf, struct saa7134_buf, vb2);
  82. struct sg_table *dma = vb2_dma_sg_plane_desc(vb2, 0);
  83. unsigned int lines, llength, size;
  84. ts_dbg("buffer_prepare [%p]\n", buf);
  85. llength = TS_PACKET_SIZE;
  86. lines = dev->ts.nr_packets;
  87. size = lines * llength;
  88. if (vb2_plane_size(vb2, 0) < size)
  89. return -EINVAL;
  90. vb2_set_plane_payload(vb2, 0, size);
  91. vbuf->field = dev->field;
  92. return saa7134_pgtable_build(dev->pci, &dmaq->pt, dma->sgl, dma->nents,
  93. saa7134_buffer_startpage(buf));
  94. }
  95. EXPORT_SYMBOL_GPL(saa7134_ts_buffer_prepare);
  96. int saa7134_ts_queue_setup(struct vb2_queue *q,
  97. unsigned int *nbuffers, unsigned int *nplanes,
  98. unsigned int sizes[], struct device *alloc_devs[])
  99. {
  100. struct saa7134_dmaqueue *dmaq = q->drv_priv;
  101. struct saa7134_dev *dev = dmaq->dev;
  102. int size = TS_PACKET_SIZE * dev->ts.nr_packets;
  103. if (0 == *nbuffers)
  104. *nbuffers = dev->ts.nr_bufs;
  105. *nbuffers = saa7134_buffer_count(size, *nbuffers);
  106. if (*nbuffers < 3)
  107. *nbuffers = 3;
  108. *nplanes = 1;
  109. sizes[0] = size;
  110. return 0;
  111. }
  112. EXPORT_SYMBOL_GPL(saa7134_ts_queue_setup);
  113. int saa7134_ts_start_streaming(struct vb2_queue *vq, unsigned int count)
  114. {
  115. struct saa7134_dmaqueue *dmaq = vq->drv_priv;
  116. struct saa7134_dev *dev = dmaq->dev;
  117. /*
  118. * Planar video capture and TS share the same DMA channel,
  119. * so only one can be active at a time.
  120. */
  121. if (vb2_is_busy(&dev->video_vbq) && dev->fmt->planar) {
  122. struct saa7134_buf *buf, *tmp;
  123. list_for_each_entry_safe(buf, tmp, &dmaq->queue, entry) {
  124. list_del(&buf->entry);
  125. vb2_buffer_done(&buf->vb2.vb2_buf,
  126. VB2_BUF_STATE_QUEUED);
  127. }
  128. if (dmaq->curr) {
  129. vb2_buffer_done(&dmaq->curr->vb2.vb2_buf,
  130. VB2_BUF_STATE_QUEUED);
  131. dmaq->curr = NULL;
  132. }
  133. return -EBUSY;
  134. }
  135. dmaq->seq_nr = 0;
  136. return 0;
  137. }
  138. EXPORT_SYMBOL_GPL(saa7134_ts_start_streaming);
  139. void saa7134_ts_stop_streaming(struct vb2_queue *vq)
  140. {
  141. struct saa7134_dmaqueue *dmaq = vq->drv_priv;
  142. struct saa7134_dev *dev = dmaq->dev;
  143. saa7134_ts_stop(dev);
  144. saa7134_stop_streaming(dev, dmaq);
  145. }
  146. EXPORT_SYMBOL_GPL(saa7134_ts_stop_streaming);
  147. struct vb2_ops saa7134_ts_qops = {
  148. .queue_setup = saa7134_ts_queue_setup,
  149. .buf_init = saa7134_ts_buffer_init,
  150. .buf_prepare = saa7134_ts_buffer_prepare,
  151. .buf_queue = saa7134_vb2_buffer_queue,
  152. .wait_prepare = vb2_ops_wait_prepare,
  153. .wait_finish = vb2_ops_wait_finish,
  154. .stop_streaming = saa7134_ts_stop_streaming,
  155. };
  156. EXPORT_SYMBOL_GPL(saa7134_ts_qops);
  157. /* ----------------------------------------------------------- */
  158. /* exported stuff */
  159. static unsigned int tsbufs = 8;
  160. module_param(tsbufs, int, 0444);
  161. MODULE_PARM_DESC(tsbufs, "number of ts buffers for read/write IO, range 2-32");
  162. static unsigned int ts_nr_packets = 64;
  163. module_param(ts_nr_packets, int, 0444);
  164. MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");
  165. int saa7134_ts_init_hw(struct saa7134_dev *dev)
  166. {
  167. /* deactivate TS softreset */
  168. saa_writeb(SAA7134_TS_SERIAL1, 0x00);
  169. /* TSSOP high active, TSVAL high active, TSLOCK ignored */
  170. saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
  171. saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
  172. saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
  173. saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
  174. /* TSNOPIT=0, TSCOLAP=0 */
  175. saa_writeb(SAA7134_TS_DMA2,
  176. ((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00));
  177. return 0;
  178. }
  179. int saa7134_ts_init1(struct saa7134_dev *dev)
  180. {
  181. /* sanitycheck insmod options */
  182. if (tsbufs < 2)
  183. tsbufs = 2;
  184. if (tsbufs > VIDEO_MAX_FRAME)
  185. tsbufs = VIDEO_MAX_FRAME;
  186. if (ts_nr_packets < 4)
  187. ts_nr_packets = 4;
  188. if (ts_nr_packets > 312)
  189. ts_nr_packets = 312;
  190. dev->ts.nr_bufs = tsbufs;
  191. dev->ts.nr_packets = ts_nr_packets;
  192. INIT_LIST_HEAD(&dev->ts_q.queue);
  193. init_timer(&dev->ts_q.timeout);
  194. dev->ts_q.timeout.function = saa7134_buffer_timeout;
  195. dev->ts_q.timeout.data = (unsigned long)(&dev->ts_q);
  196. dev->ts_q.dev = dev;
  197. dev->ts_q.need_two = 1;
  198. dev->ts_started = 0;
  199. saa7134_pgtable_alloc(dev->pci, &dev->ts_q.pt);
  200. /* init TS hw */
  201. saa7134_ts_init_hw(dev);
  202. return 0;
  203. }
  204. /* Function for stop TS */
  205. int saa7134_ts_stop(struct saa7134_dev *dev)
  206. {
  207. ts_dbg("TS stop\n");
  208. if (!dev->ts_started)
  209. return 0;
  210. /* Stop TS stream */
  211. switch (saa7134_boards[dev->board].ts_type) {
  212. case SAA7134_MPEG_TS_PARALLEL:
  213. saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
  214. dev->ts_started = 0;
  215. break;
  216. case SAA7134_MPEG_TS_SERIAL:
  217. saa_writeb(SAA7134_TS_SERIAL0, 0x40);
  218. dev->ts_started = 0;
  219. break;
  220. }
  221. return 0;
  222. }
  223. /* Function for start TS */
  224. int saa7134_ts_start(struct saa7134_dev *dev)
  225. {
  226. ts_dbg("TS start\n");
  227. if (WARN_ON(dev->ts_started))
  228. return 0;
  229. /* dma: setup channel 5 (= TS) */
  230. saa_writeb(SAA7134_TS_DMA0, (dev->ts.nr_packets - 1) & 0xff);
  231. saa_writeb(SAA7134_TS_DMA1,
  232. ((dev->ts.nr_packets - 1) >> 8) & 0xff);
  233. /* TSNOPIT=0, TSCOLAP=0 */
  234. saa_writeb(SAA7134_TS_DMA2,
  235. (((dev->ts.nr_packets - 1) >> 16) & 0x3f) | 0x00);
  236. saa_writel(SAA7134_RS_PITCH(5), TS_PACKET_SIZE);
  237. saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_16 |
  238. SAA7134_RS_CONTROL_ME |
  239. (dev->ts_q.pt.dma >> 12));
  240. /* reset hardware TS buffers */
  241. saa_writeb(SAA7134_TS_SERIAL1, 0x00);
  242. saa_writeb(SAA7134_TS_SERIAL1, 0x03);
  243. saa_writeb(SAA7134_TS_SERIAL1, 0x00);
  244. saa_writeb(SAA7134_TS_SERIAL1, 0x01);
  245. /* TS clock non-inverted */
  246. saa_writeb(SAA7134_TS_SERIAL1, 0x00);
  247. /* Start TS stream */
  248. switch (saa7134_boards[dev->board].ts_type) {
  249. case SAA7134_MPEG_TS_PARALLEL:
  250. saa_writeb(SAA7134_TS_SERIAL0, 0x40);
  251. saa_writeb(SAA7134_TS_PARALLEL, 0xec |
  252. (saa7134_boards[dev->board].ts_force_val << 4));
  253. break;
  254. case SAA7134_MPEG_TS_SERIAL:
  255. saa_writeb(SAA7134_TS_SERIAL0, 0xd8);
  256. saa_writeb(SAA7134_TS_PARALLEL, 0x6c |
  257. (saa7134_boards[dev->board].ts_force_val << 4));
  258. saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc);
  259. saa_writeb(SAA7134_TS_SERIAL1, 0x02);
  260. break;
  261. }
  262. dev->ts_started = 1;
  263. return 0;
  264. }
  265. int saa7134_ts_fini(struct saa7134_dev *dev)
  266. {
  267. saa7134_pgtable_free(dev->pci, &dev->ts_q.pt);
  268. return 0;
  269. }
  270. void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status)
  271. {
  272. enum v4l2_field field;
  273. spin_lock(&dev->slock);
  274. if (dev->ts_q.curr) {
  275. field = dev->ts_field;
  276. if (field != V4L2_FIELD_TOP) {
  277. if ((status & 0x100000) != 0x000000)
  278. goto done;
  279. } else {
  280. if ((status & 0x100000) != 0x100000)
  281. goto done;
  282. }
  283. saa7134_buffer_finish(dev, &dev->ts_q, VB2_BUF_STATE_DONE);
  284. }
  285. saa7134_buffer_next(dev,&dev->ts_q);
  286. done:
  287. spin_unlock(&dev->slock);
  288. }