/drivers/media/video/saa7134/saa7134-empress.c

https://bitbucket.org/slukk/jb-tsm-kernel-4.2 · C · 591 lines · 436 code · 113 blank · 42 comment · 39 complexity · 6f6df54896c692ed81b528853774b885 MD5 · raw file

  1. /*
  2. *
  3. * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <linux/init.h>
  20. #include <linux/list.h>
  21. #include <linux/module.h>
  22. #include <linux/kernel.h>
  23. #include <linux/delay.h>
  24. #include "saa7134-reg.h"
  25. #include "saa7134.h"
  26. #include <media/saa6752hs.h>
  27. #include <media/v4l2-common.h>
  28. #include <media/v4l2-chip-ident.h>
  29. /* ------------------------------------------------------------------ */
  30. MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
  31. MODULE_LICENSE("GPL");
  32. static unsigned int empress_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
  33. module_param_array(empress_nr, int, NULL, 0444);
  34. MODULE_PARM_DESC(empress_nr,"ts device number");
  35. static unsigned int debug;
  36. module_param(debug, int, 0644);
  37. MODULE_PARM_DESC(debug,"enable debug messages");
  38. #define dprintk(fmt, arg...) if (debug) \
  39. printk(KERN_DEBUG "%s/empress: " fmt, dev->name , ## arg)
  40. /* ------------------------------------------------------------------ */
  41. static void ts_reset_encoder(struct saa7134_dev* dev)
  42. {
  43. if (!dev->empress_started)
  44. return;
  45. saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
  46. msleep(10);
  47. saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
  48. msleep(100);
  49. dev->empress_started = 0;
  50. }
  51. static int ts_init_encoder(struct saa7134_dev* dev)
  52. {
  53. u32 leading_null_bytes = 0;
  54. /* If more cards start to need this, then this
  55. should probably be added to the card definitions. */
  56. switch (dev->board) {
  57. case SAA7134_BOARD_BEHOLD_M6:
  58. case SAA7134_BOARD_BEHOLD_M63:
  59. case SAA7134_BOARD_BEHOLD_M6_EXTRA:
  60. leading_null_bytes = 1;
  61. break;
  62. }
  63. ts_reset_encoder(dev);
  64. saa_call_all(dev, core, init, leading_null_bytes);
  65. dev->empress_started = 1;
  66. return 0;
  67. }
  68. /* ------------------------------------------------------------------ */
  69. static int ts_open(struct file *file)
  70. {
  71. struct video_device *vdev = video_devdata(file);
  72. struct saa7134_dev *dev = video_drvdata(file);
  73. int err;
  74. dprintk("open dev=%s\n", video_device_node_name(vdev));
  75. err = -EBUSY;
  76. if (!mutex_trylock(&dev->empress_tsq.vb_lock))
  77. return err;
  78. if (atomic_read(&dev->empress_users))
  79. goto done;
  80. /* Unmute audio */
  81. saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
  82. saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6));
  83. atomic_inc(&dev->empress_users);
  84. file->private_data = dev;
  85. err = 0;
  86. done:
  87. mutex_unlock(&dev->empress_tsq.vb_lock);
  88. return err;
  89. }
  90. static int ts_release(struct file *file)
  91. {
  92. struct saa7134_dev *dev = file->private_data;
  93. videobuf_stop(&dev->empress_tsq);
  94. videobuf_mmap_free(&dev->empress_tsq);
  95. /* stop the encoder */
  96. ts_reset_encoder(dev);
  97. /* Mute audio */
  98. saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
  99. saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6));
  100. atomic_dec(&dev->empress_users);
  101. return 0;
  102. }
  103. static ssize_t
  104. ts_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
  105. {
  106. struct saa7134_dev *dev = file->private_data;
  107. if (!dev->empress_started)
  108. ts_init_encoder(dev);
  109. return videobuf_read_stream(&dev->empress_tsq,
  110. data, count, ppos, 0,
  111. file->f_flags & O_NONBLOCK);
  112. }
  113. static unsigned int
  114. ts_poll(struct file *file, struct poll_table_struct *wait)
  115. {
  116. struct saa7134_dev *dev = file->private_data;
  117. return videobuf_poll_stream(file, &dev->empress_tsq, wait);
  118. }
  119. static int
  120. ts_mmap(struct file *file, struct vm_area_struct * vma)
  121. {
  122. struct saa7134_dev *dev = file->private_data;
  123. return videobuf_mmap_mapper(&dev->empress_tsq, vma);
  124. }
  125. /*
  126. * This function is _not_ called directly, but from
  127. * video_generic_ioctl (and maybe others). userspace
  128. * copying is done already, arg is a kernel pointer.
  129. */
  130. static int empress_querycap(struct file *file, void *priv,
  131. struct v4l2_capability *cap)
  132. {
  133. struct saa7134_dev *dev = file->private_data;
  134. strcpy(cap->driver, "saa7134");
  135. strlcpy(cap->card, saa7134_boards[dev->board].name,
  136. sizeof(cap->card));
  137. sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
  138. cap->version = SAA7134_VERSION_CODE;
  139. cap->capabilities =
  140. V4L2_CAP_VIDEO_CAPTURE |
  141. V4L2_CAP_READWRITE |
  142. V4L2_CAP_STREAMING;
  143. return 0;
  144. }
  145. static int empress_enum_input(struct file *file, void *priv,
  146. struct v4l2_input *i)
  147. {
  148. if (i->index != 0)
  149. return -EINVAL;
  150. i->type = V4L2_INPUT_TYPE_CAMERA;
  151. strcpy(i->name, "CCIR656");
  152. return 0;
  153. }
  154. static int empress_g_input(struct file *file, void *priv, unsigned int *i)
  155. {
  156. *i = 0;
  157. return 0;
  158. }
  159. static int empress_s_input(struct file *file, void *priv, unsigned int i)
  160. {
  161. if (i != 0)
  162. return -EINVAL;
  163. return 0;
  164. }
  165. static int empress_enum_fmt_vid_cap(struct file *file, void *priv,
  166. struct v4l2_fmtdesc *f)
  167. {
  168. if (f->index != 0)
  169. return -EINVAL;
  170. strlcpy(f->description, "MPEG TS", sizeof(f->description));
  171. f->pixelformat = V4L2_PIX_FMT_MPEG;
  172. return 0;
  173. }
  174. static int empress_g_fmt_vid_cap(struct file *file, void *priv,
  175. struct v4l2_format *f)
  176. {
  177. struct saa7134_dev *dev = file->private_data;
  178. struct v4l2_mbus_framefmt mbus_fmt;
  179. saa_call_all(dev, video, g_mbus_fmt, &mbus_fmt);
  180. v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
  181. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  182. f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
  183. return 0;
  184. }
  185. static int empress_s_fmt_vid_cap(struct file *file, void *priv,
  186. struct v4l2_format *f)
  187. {
  188. struct saa7134_dev *dev = file->private_data;
  189. struct v4l2_mbus_framefmt mbus_fmt;
  190. v4l2_fill_mbus_format(&mbus_fmt, &f->fmt.pix, V4L2_MBUS_FMT_FIXED);
  191. saa_call_all(dev, video, s_mbus_fmt, &mbus_fmt);
  192. v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
  193. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  194. f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
  195. return 0;
  196. }
  197. static int empress_try_fmt_vid_cap(struct file *file, void *priv,
  198. struct v4l2_format *f)
  199. {
  200. struct saa7134_dev *dev = file->private_data;
  201. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  202. f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
  203. return 0;
  204. }
  205. static int empress_reqbufs(struct file *file, void *priv,
  206. struct v4l2_requestbuffers *p)
  207. {
  208. struct saa7134_dev *dev = file->private_data;
  209. return videobuf_reqbufs(&dev->empress_tsq, p);
  210. }
  211. static int empress_querybuf(struct file *file, void *priv,
  212. struct v4l2_buffer *b)
  213. {
  214. struct saa7134_dev *dev = file->private_data;
  215. return videobuf_querybuf(&dev->empress_tsq, b);
  216. }
  217. static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
  218. {
  219. struct saa7134_dev *dev = file->private_data;
  220. return videobuf_qbuf(&dev->empress_tsq, b);
  221. }
  222. static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
  223. {
  224. struct saa7134_dev *dev = file->private_data;
  225. return videobuf_dqbuf(&dev->empress_tsq, b,
  226. file->f_flags & O_NONBLOCK);
  227. }
  228. static int empress_streamon(struct file *file, void *priv,
  229. enum v4l2_buf_type type)
  230. {
  231. struct saa7134_dev *dev = file->private_data;
  232. return videobuf_streamon(&dev->empress_tsq);
  233. }
  234. static int empress_streamoff(struct file *file, void *priv,
  235. enum v4l2_buf_type type)
  236. {
  237. struct saa7134_dev *dev = file->private_data;
  238. return videobuf_streamoff(&dev->empress_tsq);
  239. }
  240. static int empress_s_ext_ctrls(struct file *file, void *priv,
  241. struct v4l2_ext_controls *ctrls)
  242. {
  243. struct saa7134_dev *dev = file->private_data;
  244. int err;
  245. /* count == 0 is abused in saa6752hs.c, so that special
  246. case is handled here explicitly. */
  247. if (ctrls->count == 0)
  248. return 0;
  249. if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
  250. return -EINVAL;
  251. err = saa_call_empress(dev, core, s_ext_ctrls, ctrls);
  252. ts_init_encoder(dev);
  253. return err;
  254. }
  255. static int empress_g_ext_ctrls(struct file *file, void *priv,
  256. struct v4l2_ext_controls *ctrls)
  257. {
  258. struct saa7134_dev *dev = file->private_data;
  259. if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
  260. return -EINVAL;
  261. return saa_call_empress(dev, core, g_ext_ctrls, ctrls);
  262. }
  263. static int empress_g_ctrl(struct file *file, void *priv,
  264. struct v4l2_control *c)
  265. {
  266. struct saa7134_dev *dev = file->private_data;
  267. return saa7134_g_ctrl_internal(dev, NULL, c);
  268. }
  269. static int empress_s_ctrl(struct file *file, void *priv,
  270. struct v4l2_control *c)
  271. {
  272. struct saa7134_dev *dev = file->private_data;
  273. return saa7134_s_ctrl_internal(dev, NULL, c);
  274. }
  275. static int empress_queryctrl(struct file *file, void *priv,
  276. struct v4l2_queryctrl *c)
  277. {
  278. /* Must be sorted from low to high control ID! */
  279. static const u32 user_ctrls[] = {
  280. V4L2_CID_USER_CLASS,
  281. V4L2_CID_BRIGHTNESS,
  282. V4L2_CID_CONTRAST,
  283. V4L2_CID_SATURATION,
  284. V4L2_CID_HUE,
  285. V4L2_CID_AUDIO_VOLUME,
  286. V4L2_CID_AUDIO_MUTE,
  287. V4L2_CID_HFLIP,
  288. 0
  289. };
  290. /* Must be sorted from low to high control ID! */
  291. static const u32 mpeg_ctrls[] = {
  292. V4L2_CID_MPEG_CLASS,
  293. V4L2_CID_MPEG_STREAM_TYPE,
  294. V4L2_CID_MPEG_STREAM_PID_PMT,
  295. V4L2_CID_MPEG_STREAM_PID_AUDIO,
  296. V4L2_CID_MPEG_STREAM_PID_VIDEO,
  297. V4L2_CID_MPEG_STREAM_PID_PCR,
  298. V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
  299. V4L2_CID_MPEG_AUDIO_ENCODING,
  300. V4L2_CID_MPEG_AUDIO_L2_BITRATE,
  301. V4L2_CID_MPEG_VIDEO_ENCODING,
  302. V4L2_CID_MPEG_VIDEO_ASPECT,
  303. V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
  304. V4L2_CID_MPEG_VIDEO_BITRATE,
  305. V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
  306. 0
  307. };
  308. static const u32 *ctrl_classes[] = {
  309. user_ctrls,
  310. mpeg_ctrls,
  311. NULL
  312. };
  313. struct saa7134_dev *dev = file->private_data;
  314. c->id = v4l2_ctrl_next(ctrl_classes, c->id);
  315. if (c->id == 0)
  316. return -EINVAL;
  317. if (c->id == V4L2_CID_USER_CLASS || c->id == V4L2_CID_MPEG_CLASS)
  318. return v4l2_ctrl_query_fill(c, 0, 0, 0, 0);
  319. if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
  320. return saa7134_queryctrl(file, priv, c);
  321. return saa_call_empress(dev, core, queryctrl, c);
  322. }
  323. static int empress_querymenu(struct file *file, void *priv,
  324. struct v4l2_querymenu *c)
  325. {
  326. struct saa7134_dev *dev = file->private_data;
  327. if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
  328. return -EINVAL;
  329. return saa_call_empress(dev, core, querymenu, c);
  330. }
  331. static int empress_g_chip_ident(struct file *file, void *fh,
  332. struct v4l2_dbg_chip_ident *chip)
  333. {
  334. struct saa7134_dev *dev = file->private_data;
  335. chip->ident = V4L2_IDENT_NONE;
  336. chip->revision = 0;
  337. if (chip->match.type == V4L2_CHIP_MATCH_I2C_DRIVER &&
  338. !strcmp(chip->match.name, "saa6752hs"))
  339. return saa_call_empress(dev, core, g_chip_ident, chip);
  340. if (chip->match.type == V4L2_CHIP_MATCH_I2C_ADDR)
  341. return saa_call_empress(dev, core, g_chip_ident, chip);
  342. return -EINVAL;
  343. }
  344. static int empress_s_std(struct file *file, void *priv, v4l2_std_id *id)
  345. {
  346. struct saa7134_dev *dev = file->private_data;
  347. return saa7134_s_std_internal(dev, NULL, id);
  348. }
  349. static int empress_g_std(struct file *file, void *priv, v4l2_std_id *id)
  350. {
  351. struct saa7134_dev *dev = file->private_data;
  352. *id = dev->tvnorm->id;
  353. return 0;
  354. }
  355. static const struct v4l2_file_operations ts_fops =
  356. {
  357. .owner = THIS_MODULE,
  358. .open = ts_open,
  359. .release = ts_release,
  360. .read = ts_read,
  361. .poll = ts_poll,
  362. .mmap = ts_mmap,
  363. .ioctl = video_ioctl2,
  364. };
  365. static const struct v4l2_ioctl_ops ts_ioctl_ops = {
  366. .vidioc_querycap = empress_querycap,
  367. .vidioc_enum_fmt_vid_cap = empress_enum_fmt_vid_cap,
  368. .vidioc_try_fmt_vid_cap = empress_try_fmt_vid_cap,
  369. .vidioc_s_fmt_vid_cap = empress_s_fmt_vid_cap,
  370. .vidioc_g_fmt_vid_cap = empress_g_fmt_vid_cap,
  371. .vidioc_reqbufs = empress_reqbufs,
  372. .vidioc_querybuf = empress_querybuf,
  373. .vidioc_qbuf = empress_qbuf,
  374. .vidioc_dqbuf = empress_dqbuf,
  375. .vidioc_streamon = empress_streamon,
  376. .vidioc_streamoff = empress_streamoff,
  377. .vidioc_s_ext_ctrls = empress_s_ext_ctrls,
  378. .vidioc_g_ext_ctrls = empress_g_ext_ctrls,
  379. .vidioc_enum_input = empress_enum_input,
  380. .vidioc_g_input = empress_g_input,
  381. .vidioc_s_input = empress_s_input,
  382. .vidioc_queryctrl = empress_queryctrl,
  383. .vidioc_querymenu = empress_querymenu,
  384. .vidioc_g_ctrl = empress_g_ctrl,
  385. .vidioc_s_ctrl = empress_s_ctrl,
  386. .vidioc_g_chip_ident = empress_g_chip_ident,
  387. .vidioc_s_std = empress_s_std,
  388. .vidioc_g_std = empress_g_std,
  389. };
  390. /* ----------------------------------------------------------- */
  391. static struct video_device saa7134_empress_template = {
  392. .name = "saa7134-empress",
  393. .fops = &ts_fops,
  394. .ioctl_ops = &ts_ioctl_ops,
  395. .tvnorms = SAA7134_NORMS,
  396. .current_norm = V4L2_STD_PAL,
  397. };
  398. static void empress_signal_update(struct work_struct *work)
  399. {
  400. struct saa7134_dev* dev =
  401. container_of(work, struct saa7134_dev, empress_workqueue);
  402. if (dev->nosignal) {
  403. dprintk("no video signal\n");
  404. } else {
  405. dprintk("video signal acquired\n");
  406. }
  407. }
  408. static void empress_signal_change(struct saa7134_dev *dev)
  409. {
  410. schedule_work(&dev->empress_workqueue);
  411. }
  412. static int empress_init(struct saa7134_dev *dev)
  413. {
  414. int err;
  415. dprintk("%s: %s\n",dev->name,__func__);
  416. dev->empress_dev = video_device_alloc();
  417. if (NULL == dev->empress_dev)
  418. return -ENOMEM;
  419. *(dev->empress_dev) = saa7134_empress_template;
  420. dev->empress_dev->parent = &dev->pci->dev;
  421. dev->empress_dev->release = video_device_release;
  422. snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name),
  423. "%s empress (%s)", dev->name,
  424. saa7134_boards[dev->board].name);
  425. INIT_WORK(&dev->empress_workqueue, empress_signal_update);
  426. video_set_drvdata(dev->empress_dev, dev);
  427. err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER,
  428. empress_nr[dev->nr]);
  429. if (err < 0) {
  430. printk(KERN_INFO "%s: can't register video device\n",
  431. dev->name);
  432. video_device_release(dev->empress_dev);
  433. dev->empress_dev = NULL;
  434. return err;
  435. }
  436. printk(KERN_INFO "%s: registered device %s [mpeg]\n",
  437. dev->name, video_device_node_name(dev->empress_dev));
  438. videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops,
  439. &dev->pci->dev, &dev->slock,
  440. V4L2_BUF_TYPE_VIDEO_CAPTURE,
  441. V4L2_FIELD_ALTERNATE,
  442. sizeof(struct saa7134_buf),
  443. dev, NULL);
  444. empress_signal_update(&dev->empress_workqueue);
  445. return 0;
  446. }
  447. static int empress_fini(struct saa7134_dev *dev)
  448. {
  449. dprintk("%s: %s\n",dev->name,__func__);
  450. if (NULL == dev->empress_dev)
  451. return 0;
  452. flush_work_sync(&dev->empress_workqueue);
  453. video_unregister_device(dev->empress_dev);
  454. dev->empress_dev = NULL;
  455. return 0;
  456. }
  457. static struct saa7134_mpeg_ops empress_ops = {
  458. .type = SAA7134_MPEG_EMPRESS,
  459. .init = empress_init,
  460. .fini = empress_fini,
  461. .signal_change = empress_signal_change,
  462. };
  463. static int __init empress_register(void)
  464. {
  465. return saa7134_ts_register(&empress_ops);
  466. }
  467. static void __exit empress_unregister(void)
  468. {
  469. saa7134_ts_unregister(&empress_ops);
  470. }
  471. module_init(empress_register);
  472. module_exit(empress_unregister);
  473. /* ----------------------------------------------------------- */
  474. /*
  475. * Local variables:
  476. * c-basic-offset: 8
  477. * End:
  478. */