saa7164-encoder.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471
  1. /*
  2. * Driver for the NXP SAA7164 PCIe bridge
  3. *
  4. * Copyright (c) 2010 Steven Toth <stoth@kernellabs.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. *
  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 "saa7164.h"
  22. #define ENCODER_MAX_BITRATE 6500000
  23. #define ENCODER_MIN_BITRATE 1000000
  24. #define ENCODER_DEF_BITRATE 5000000
  25. static struct saa7164_tvnorm saa7164_tvnorms[] = {
  26. {
  27. .name = "NTSC-M",
  28. .id = V4L2_STD_NTSC_M,
  29. }, {
  30. .name = "NTSC-JP",
  31. .id = V4L2_STD_NTSC_M_JP,
  32. }
  33. };
  34. static const u32 saa7164_v4l2_ctrls[] = {
  35. V4L2_CID_BRIGHTNESS,
  36. V4L2_CID_CONTRAST,
  37. V4L2_CID_SATURATION,
  38. V4L2_CID_HUE,
  39. V4L2_CID_AUDIO_VOLUME,
  40. V4L2_CID_SHARPNESS,
  41. V4L2_CID_MPEG_STREAM_TYPE,
  42. V4L2_CID_MPEG_VIDEO_ASPECT,
  43. V4L2_CID_MPEG_VIDEO_B_FRAMES,
  44. V4L2_CID_MPEG_VIDEO_GOP_SIZE,
  45. V4L2_CID_MPEG_AUDIO_MUTE,
  46. V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
  47. V4L2_CID_MPEG_VIDEO_BITRATE,
  48. V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
  49. 0
  50. };
  51. /* Take the encoder configuration form the port struct and
  52. * flush it to the hardware.
  53. */
  54. static void saa7164_encoder_configure(struct saa7164_port *port)
  55. {
  56. struct saa7164_dev *dev = port->dev;
  57. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  58. port->encoder_params.width = port->width;
  59. port->encoder_params.height = port->height;
  60. port->encoder_params.is_50hz =
  61. (port->encodernorm.id & V4L2_STD_625_50) != 0;
  62. /* Set up the DIF (enable it) for analog mode by default */
  63. saa7164_api_initialize_dif(port);
  64. /* Configure the correct video standard */
  65. saa7164_api_configure_dif(port, port->encodernorm.id);
  66. /* Ensure the audio decoder is correct configured */
  67. saa7164_api_set_audio_std(port);
  68. }
  69. static int saa7164_encoder_buffers_dealloc(struct saa7164_port *port)
  70. {
  71. struct list_head *c, *n, *p, *q, *l, *v;
  72. struct saa7164_dev *dev = port->dev;
  73. struct saa7164_buffer *buf;
  74. struct saa7164_user_buffer *ubuf;
  75. /* Remove any allocated buffers */
  76. mutex_lock(&port->dmaqueue_lock);
  77. dprintk(DBGLVL_ENC, "%s(port=%d) dmaqueue\n", __func__, port->nr);
  78. list_for_each_safe(c, n, &port->dmaqueue.list) {
  79. buf = list_entry(c, struct saa7164_buffer, list);
  80. list_del(c);
  81. saa7164_buffer_dealloc(buf);
  82. }
  83. dprintk(DBGLVL_ENC, "%s(port=%d) used\n", __func__, port->nr);
  84. list_for_each_safe(p, q, &port->list_buf_used.list) {
  85. ubuf = list_entry(p, struct saa7164_user_buffer, list);
  86. list_del(p);
  87. saa7164_buffer_dealloc_user(ubuf);
  88. }
  89. dprintk(DBGLVL_ENC, "%s(port=%d) free\n", __func__, port->nr);
  90. list_for_each_safe(l, v, &port->list_buf_free.list) {
  91. ubuf = list_entry(l, struct saa7164_user_buffer, list);
  92. list_del(l);
  93. saa7164_buffer_dealloc_user(ubuf);
  94. }
  95. mutex_unlock(&port->dmaqueue_lock);
  96. dprintk(DBGLVL_ENC, "%s(port=%d) done\n", __func__, port->nr);
  97. return 0;
  98. }
  99. /* Dynamic buffer switch at encoder start time */
  100. static int saa7164_encoder_buffers_alloc(struct saa7164_port *port)
  101. {
  102. struct saa7164_dev *dev = port->dev;
  103. struct saa7164_buffer *buf;
  104. struct saa7164_user_buffer *ubuf;
  105. struct tmHWStreamParameters *params = &port->hw_streamingparams;
  106. int result = -ENODEV, i;
  107. int len = 0;
  108. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  109. if (port->encoder_params.stream_type ==
  110. V4L2_MPEG_STREAM_TYPE_MPEG2_PS) {
  111. dprintk(DBGLVL_ENC,
  112. "%s() type=V4L2_MPEG_STREAM_TYPE_MPEG2_PS\n",
  113. __func__);
  114. params->samplesperline = 128;
  115. params->numberoflines = 256;
  116. params->pitch = 128;
  117. params->numpagetables = 2 +
  118. ((SAA7164_PS_NUMBER_OF_LINES * 128) / PAGE_SIZE);
  119. } else
  120. if (port->encoder_params.stream_type ==
  121. V4L2_MPEG_STREAM_TYPE_MPEG2_TS) {
  122. dprintk(DBGLVL_ENC,
  123. "%s() type=V4L2_MPEG_STREAM_TYPE_MPEG2_TS\n",
  124. __func__);
  125. params->samplesperline = 188;
  126. params->numberoflines = 312;
  127. params->pitch = 188;
  128. params->numpagetables = 2 +
  129. ((SAA7164_TS_NUMBER_OF_LINES * 188) / PAGE_SIZE);
  130. } else
  131. BUG();
  132. /* Init and establish defaults */
  133. params->bitspersample = 8;
  134. params->linethreshold = 0;
  135. params->pagetablelistvirt = NULL;
  136. params->pagetablelistphys = NULL;
  137. params->numpagetableentries = port->hwcfg.buffercount;
  138. /* Allocate the PCI resources, buffers (hard) */
  139. for (i = 0; i < port->hwcfg.buffercount; i++) {
  140. buf = saa7164_buffer_alloc(port,
  141. params->numberoflines *
  142. params->pitch);
  143. if (!buf) {
  144. printk(KERN_ERR "%s() failed "
  145. "(errno = %d), unable to allocate buffer\n",
  146. __func__, result);
  147. result = -ENOMEM;
  148. goto failed;
  149. } else {
  150. mutex_lock(&port->dmaqueue_lock);
  151. list_add_tail(&buf->list, &port->dmaqueue.list);
  152. mutex_unlock(&port->dmaqueue_lock);
  153. }
  154. }
  155. /* Allocate some kernel buffers for copying
  156. * to userpsace.
  157. */
  158. len = params->numberoflines * params->pitch;
  159. if (encoder_buffers < 16)
  160. encoder_buffers = 16;
  161. if (encoder_buffers > 512)
  162. encoder_buffers = 512;
  163. for (i = 0; i < encoder_buffers; i++) {
  164. ubuf = saa7164_buffer_alloc_user(dev, len);
  165. if (ubuf) {
  166. mutex_lock(&port->dmaqueue_lock);
  167. list_add_tail(&ubuf->list, &port->list_buf_free.list);
  168. mutex_unlock(&port->dmaqueue_lock);
  169. }
  170. }
  171. result = 0;
  172. failed:
  173. return result;
  174. }
  175. static int saa7164_encoder_initialize(struct saa7164_port *port)
  176. {
  177. saa7164_encoder_configure(port);
  178. return 0;
  179. }
  180. /* -- V4L2 --------------------------------------------------------- */
  181. static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id id)
  182. {
  183. struct saa7164_encoder_fh *fh = file->private_data;
  184. struct saa7164_port *port = fh->port;
  185. struct saa7164_dev *dev = port->dev;
  186. unsigned int i;
  187. dprintk(DBGLVL_ENC, "%s(id=0x%x)\n", __func__, (u32)id);
  188. for (i = 0; i < ARRAY_SIZE(saa7164_tvnorms); i++) {
  189. if (id & saa7164_tvnorms[i].id)
  190. break;
  191. }
  192. if (i == ARRAY_SIZE(saa7164_tvnorms))
  193. return -EINVAL;
  194. port->encodernorm = saa7164_tvnorms[i];
  195. port->std = id;
  196. /* Update the audio decoder while is not running in
  197. * auto detect mode.
  198. */
  199. saa7164_api_set_audio_std(port);
  200. dprintk(DBGLVL_ENC, "%s(id=0x%x) OK\n", __func__, (u32)id);
  201. return 0;
  202. }
  203. static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
  204. {
  205. struct saa7164_encoder_fh *fh = file->private_data;
  206. struct saa7164_port *port = fh->port;
  207. *id = port->std;
  208. return 0;
  209. }
  210. static int vidioc_enum_input(struct file *file, void *priv,
  211. struct v4l2_input *i)
  212. {
  213. int n;
  214. char *inputs[] = { "tuner", "composite", "svideo", "aux",
  215. "composite 2", "svideo 2", "aux 2" };
  216. if (i->index >= 7)
  217. return -EINVAL;
  218. strcpy(i->name, inputs[i->index]);
  219. if (i->index == 0)
  220. i->type = V4L2_INPUT_TYPE_TUNER;
  221. else
  222. i->type = V4L2_INPUT_TYPE_CAMERA;
  223. for (n = 0; n < ARRAY_SIZE(saa7164_tvnorms); n++)
  224. i->std |= saa7164_tvnorms[n].id;
  225. return 0;
  226. }
  227. static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
  228. {
  229. struct saa7164_encoder_fh *fh = file->private_data;
  230. struct saa7164_port *port = fh->port;
  231. struct saa7164_dev *dev = port->dev;
  232. if (saa7164_api_get_videomux(port) != SAA_OK)
  233. return -EIO;
  234. *i = (port->mux_input - 1);
  235. dprintk(DBGLVL_ENC, "%s() input=%d\n", __func__, *i);
  236. return 0;
  237. }
  238. static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
  239. {
  240. struct saa7164_encoder_fh *fh = file->private_data;
  241. struct saa7164_port *port = fh->port;
  242. struct saa7164_dev *dev = port->dev;
  243. dprintk(DBGLVL_ENC, "%s() input=%d\n", __func__, i);
  244. if (i >= 7)
  245. return -EINVAL;
  246. port->mux_input = i + 1;
  247. if (saa7164_api_set_videomux(port) != SAA_OK)
  248. return -EIO;
  249. return 0;
  250. }
  251. static int vidioc_g_tuner(struct file *file, void *priv,
  252. struct v4l2_tuner *t)
  253. {
  254. struct saa7164_encoder_fh *fh = file->private_data;
  255. struct saa7164_port *port = fh->port;
  256. struct saa7164_dev *dev = port->dev;
  257. if (0 != t->index)
  258. return -EINVAL;
  259. strcpy(t->name, "tuner");
  260. t->type = V4L2_TUNER_ANALOG_TV;
  261. t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO;
  262. dprintk(DBGLVL_ENC, "VIDIOC_G_TUNER: tuner type %d\n", t->type);
  263. return 0;
  264. }
  265. static int vidioc_s_tuner(struct file *file, void *priv,
  266. const struct v4l2_tuner *t)
  267. {
  268. /* Update the A/V core */
  269. return 0;
  270. }
  271. static int vidioc_g_frequency(struct file *file, void *priv,
  272. struct v4l2_frequency *f)
  273. {
  274. struct saa7164_encoder_fh *fh = file->private_data;
  275. struct saa7164_port *port = fh->port;
  276. f->type = V4L2_TUNER_ANALOG_TV;
  277. f->frequency = port->freq;
  278. return 0;
  279. }
  280. static int vidioc_s_frequency(struct file *file, void *priv,
  281. const struct v4l2_frequency *f)
  282. {
  283. struct saa7164_encoder_fh *fh = file->private_data;
  284. struct saa7164_port *port = fh->port;
  285. struct saa7164_dev *dev = port->dev;
  286. struct saa7164_port *tsport;
  287. struct dvb_frontend *fe;
  288. /* TODO: Pull this for the std */
  289. struct analog_parameters params = {
  290. .mode = V4L2_TUNER_ANALOG_TV,
  291. .audmode = V4L2_TUNER_MODE_STEREO,
  292. .std = port->encodernorm.id,
  293. .frequency = f->frequency
  294. };
  295. /* Stop the encoder */
  296. dprintk(DBGLVL_ENC, "%s() frequency=%d tuner=%d\n", __func__,
  297. f->frequency, f->tuner);
  298. if (f->tuner != 0)
  299. return -EINVAL;
  300. if (f->type != V4L2_TUNER_ANALOG_TV)
  301. return -EINVAL;
  302. port->freq = f->frequency;
  303. /* Update the hardware */
  304. if (port->nr == SAA7164_PORT_ENC1)
  305. tsport = &dev->ports[SAA7164_PORT_TS1];
  306. else
  307. if (port->nr == SAA7164_PORT_ENC2)
  308. tsport = &dev->ports[SAA7164_PORT_TS2];
  309. else
  310. BUG();
  311. fe = tsport->dvb.frontend;
  312. if (fe && fe->ops.tuner_ops.set_analog_params)
  313. fe->ops.tuner_ops.set_analog_params(fe, &params);
  314. else
  315. printk(KERN_ERR "%s() No analog tuner, aborting\n", __func__);
  316. saa7164_encoder_initialize(port);
  317. return 0;
  318. }
  319. static int vidioc_g_ctrl(struct file *file, void *priv,
  320. struct v4l2_control *ctl)
  321. {
  322. struct saa7164_encoder_fh *fh = file->private_data;
  323. struct saa7164_port *port = fh->port;
  324. struct saa7164_dev *dev = port->dev;
  325. dprintk(DBGLVL_ENC, "%s(id=%d, value=%d)\n", __func__,
  326. ctl->id, ctl->value);
  327. switch (ctl->id) {
  328. case V4L2_CID_BRIGHTNESS:
  329. ctl->value = port->ctl_brightness;
  330. break;
  331. case V4L2_CID_CONTRAST:
  332. ctl->value = port->ctl_contrast;
  333. break;
  334. case V4L2_CID_SATURATION:
  335. ctl->value = port->ctl_saturation;
  336. break;
  337. case V4L2_CID_HUE:
  338. ctl->value = port->ctl_hue;
  339. break;
  340. case V4L2_CID_SHARPNESS:
  341. ctl->value = port->ctl_sharpness;
  342. break;
  343. case V4L2_CID_AUDIO_VOLUME:
  344. ctl->value = port->ctl_volume;
  345. break;
  346. default:
  347. return -EINVAL;
  348. }
  349. return 0;
  350. }
  351. static int vidioc_s_ctrl(struct file *file, void *priv,
  352. struct v4l2_control *ctl)
  353. {
  354. struct saa7164_encoder_fh *fh = file->private_data;
  355. struct saa7164_port *port = fh->port;
  356. struct saa7164_dev *dev = port->dev;
  357. int ret = 0;
  358. dprintk(DBGLVL_ENC, "%s(id=%d, value=%d)\n", __func__,
  359. ctl->id, ctl->value);
  360. switch (ctl->id) {
  361. case V4L2_CID_BRIGHTNESS:
  362. if ((ctl->value >= 0) && (ctl->value <= 255)) {
  363. port->ctl_brightness = ctl->value;
  364. saa7164_api_set_usercontrol(port,
  365. PU_BRIGHTNESS_CONTROL);
  366. } else
  367. ret = -EINVAL;
  368. break;
  369. case V4L2_CID_CONTRAST:
  370. if ((ctl->value >= 0) && (ctl->value <= 255)) {
  371. port->ctl_contrast = ctl->value;
  372. saa7164_api_set_usercontrol(port, PU_CONTRAST_CONTROL);
  373. } else
  374. ret = -EINVAL;
  375. break;
  376. case V4L2_CID_SATURATION:
  377. if ((ctl->value >= 0) && (ctl->value <= 255)) {
  378. port->ctl_saturation = ctl->value;
  379. saa7164_api_set_usercontrol(port,
  380. PU_SATURATION_CONTROL);
  381. } else
  382. ret = -EINVAL;
  383. break;
  384. case V4L2_CID_HUE:
  385. if ((ctl->value >= 0) && (ctl->value <= 255)) {
  386. port->ctl_hue = ctl->value;
  387. saa7164_api_set_usercontrol(port, PU_HUE_CONTROL);
  388. } else
  389. ret = -EINVAL;
  390. break;
  391. case V4L2_CID_SHARPNESS:
  392. if ((ctl->value >= 0) && (ctl->value <= 255)) {
  393. port->ctl_sharpness = ctl->value;
  394. saa7164_api_set_usercontrol(port, PU_SHARPNESS_CONTROL);
  395. } else
  396. ret = -EINVAL;
  397. break;
  398. case V4L2_CID_AUDIO_VOLUME:
  399. if ((ctl->value >= -83) && (ctl->value <= 24)) {
  400. port->ctl_volume = ctl->value;
  401. saa7164_api_set_audio_volume(port, port->ctl_volume);
  402. } else
  403. ret = -EINVAL;
  404. break;
  405. default:
  406. ret = -EINVAL;
  407. }
  408. return ret;
  409. }
  410. static int saa7164_get_ctrl(struct saa7164_port *port,
  411. struct v4l2_ext_control *ctrl)
  412. {
  413. struct saa7164_encoder_params *params = &port->encoder_params;
  414. switch (ctrl->id) {
  415. case V4L2_CID_MPEG_VIDEO_BITRATE:
  416. ctrl->value = params->bitrate;
  417. break;
  418. case V4L2_CID_MPEG_STREAM_TYPE:
  419. ctrl->value = params->stream_type;
  420. break;
  421. case V4L2_CID_MPEG_AUDIO_MUTE:
  422. ctrl->value = params->ctl_mute;
  423. break;
  424. case V4L2_CID_MPEG_VIDEO_ASPECT:
  425. ctrl->value = params->ctl_aspect;
  426. break;
  427. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  428. ctrl->value = params->bitrate_mode;
  429. break;
  430. case V4L2_CID_MPEG_VIDEO_B_FRAMES:
  431. ctrl->value = params->refdist;
  432. break;
  433. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  434. ctrl->value = params->bitrate_peak;
  435. break;
  436. case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
  437. ctrl->value = params->gop_size;
  438. break;
  439. default:
  440. return -EINVAL;
  441. }
  442. return 0;
  443. }
  444. static int vidioc_g_ext_ctrls(struct file *file, void *priv,
  445. struct v4l2_ext_controls *ctrls)
  446. {
  447. struct saa7164_encoder_fh *fh = file->private_data;
  448. struct saa7164_port *port = fh->port;
  449. int i, err = 0;
  450. if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
  451. for (i = 0; i < ctrls->count; i++) {
  452. struct v4l2_ext_control *ctrl = ctrls->controls + i;
  453. err = saa7164_get_ctrl(port, ctrl);
  454. if (err) {
  455. ctrls->error_idx = i;
  456. break;
  457. }
  458. }
  459. return err;
  460. }
  461. return -EINVAL;
  462. }
  463. static int saa7164_try_ctrl(struct v4l2_ext_control *ctrl, int ac3)
  464. {
  465. int ret = -EINVAL;
  466. switch (ctrl->id) {
  467. case V4L2_CID_MPEG_VIDEO_BITRATE:
  468. if ((ctrl->value >= ENCODER_MIN_BITRATE) &&
  469. (ctrl->value <= ENCODER_MAX_BITRATE))
  470. ret = 0;
  471. break;
  472. case V4L2_CID_MPEG_STREAM_TYPE:
  473. if ((ctrl->value == V4L2_MPEG_STREAM_TYPE_MPEG2_PS) ||
  474. (ctrl->value == V4L2_MPEG_STREAM_TYPE_MPEG2_TS))
  475. ret = 0;
  476. break;
  477. case V4L2_CID_MPEG_AUDIO_MUTE:
  478. if ((ctrl->value >= 0) &&
  479. (ctrl->value <= 1))
  480. ret = 0;
  481. break;
  482. case V4L2_CID_MPEG_VIDEO_ASPECT:
  483. if ((ctrl->value >= V4L2_MPEG_VIDEO_ASPECT_1x1) &&
  484. (ctrl->value <= V4L2_MPEG_VIDEO_ASPECT_221x100))
  485. ret = 0;
  486. break;
  487. case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
  488. if ((ctrl->value >= 0) &&
  489. (ctrl->value <= 255))
  490. ret = 0;
  491. break;
  492. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  493. if ((ctrl->value == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) ||
  494. (ctrl->value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR))
  495. ret = 0;
  496. break;
  497. case V4L2_CID_MPEG_VIDEO_B_FRAMES:
  498. if ((ctrl->value >= 1) &&
  499. (ctrl->value <= 3))
  500. ret = 0;
  501. break;
  502. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  503. if ((ctrl->value >= ENCODER_MIN_BITRATE) &&
  504. (ctrl->value <= ENCODER_MAX_BITRATE))
  505. ret = 0;
  506. break;
  507. default:
  508. ret = -EINVAL;
  509. }
  510. return ret;
  511. }
  512. static int vidioc_try_ext_ctrls(struct file *file, void *priv,
  513. struct v4l2_ext_controls *ctrls)
  514. {
  515. int i, err = 0;
  516. if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
  517. for (i = 0; i < ctrls->count; i++) {
  518. struct v4l2_ext_control *ctrl = ctrls->controls + i;
  519. err = saa7164_try_ctrl(ctrl, 0);
  520. if (err) {
  521. ctrls->error_idx = i;
  522. break;
  523. }
  524. }
  525. return err;
  526. }
  527. return -EINVAL;
  528. }
  529. static int saa7164_set_ctrl(struct saa7164_port *port,
  530. struct v4l2_ext_control *ctrl)
  531. {
  532. struct saa7164_encoder_params *params = &port->encoder_params;
  533. int ret = 0;
  534. switch (ctrl->id) {
  535. case V4L2_CID_MPEG_VIDEO_BITRATE:
  536. params->bitrate = ctrl->value;
  537. break;
  538. case V4L2_CID_MPEG_STREAM_TYPE:
  539. params->stream_type = ctrl->value;
  540. break;
  541. case V4L2_CID_MPEG_AUDIO_MUTE:
  542. params->ctl_mute = ctrl->value;
  543. ret = saa7164_api_audio_mute(port, params->ctl_mute);
  544. if (ret != SAA_OK) {
  545. printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__,
  546. ret);
  547. ret = -EIO;
  548. }
  549. break;
  550. case V4L2_CID_MPEG_VIDEO_ASPECT:
  551. params->ctl_aspect = ctrl->value;
  552. ret = saa7164_api_set_aspect_ratio(port);
  553. if (ret != SAA_OK) {
  554. printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__,
  555. ret);
  556. ret = -EIO;
  557. }
  558. break;
  559. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  560. params->bitrate_mode = ctrl->value;
  561. break;
  562. case V4L2_CID_MPEG_VIDEO_B_FRAMES:
  563. params->refdist = ctrl->value;
  564. break;
  565. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  566. params->bitrate_peak = ctrl->value;
  567. break;
  568. case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
  569. params->gop_size = ctrl->value;
  570. break;
  571. default:
  572. return -EINVAL;
  573. }
  574. /* TODO: Update the hardware */
  575. return ret;
  576. }
  577. static int vidioc_s_ext_ctrls(struct file *file, void *priv,
  578. struct v4l2_ext_controls *ctrls)
  579. {
  580. struct saa7164_encoder_fh *fh = file->private_data;
  581. struct saa7164_port *port = fh->port;
  582. int i, err = 0;
  583. if (ctrls->ctrl_class == V4L2_CTRL_CLASS_MPEG) {
  584. for (i = 0; i < ctrls->count; i++) {
  585. struct v4l2_ext_control *ctrl = ctrls->controls + i;
  586. err = saa7164_try_ctrl(ctrl, 0);
  587. if (err) {
  588. ctrls->error_idx = i;
  589. break;
  590. }
  591. err = saa7164_set_ctrl(port, ctrl);
  592. if (err) {
  593. ctrls->error_idx = i;
  594. break;
  595. }
  596. }
  597. return err;
  598. }
  599. return -EINVAL;
  600. }
  601. static int vidioc_querycap(struct file *file, void *priv,
  602. struct v4l2_capability *cap)
  603. {
  604. struct saa7164_encoder_fh *fh = file->private_data;
  605. struct saa7164_port *port = fh->port;
  606. struct saa7164_dev *dev = port->dev;
  607. strcpy(cap->driver, dev->name);
  608. strlcpy(cap->card, saa7164_boards[dev->board].name,
  609. sizeof(cap->card));
  610. sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
  611. cap->capabilities =
  612. V4L2_CAP_VIDEO_CAPTURE |
  613. V4L2_CAP_READWRITE |
  614. 0;
  615. cap->capabilities |= V4L2_CAP_TUNER;
  616. cap->version = 0;
  617. return 0;
  618. }
  619. static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
  620. struct v4l2_fmtdesc *f)
  621. {
  622. if (f->index != 0)
  623. return -EINVAL;
  624. strlcpy(f->description, "MPEG", sizeof(f->description));
  625. f->pixelformat = V4L2_PIX_FMT_MPEG;
  626. return 0;
  627. }
  628. static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
  629. struct v4l2_format *f)
  630. {
  631. struct saa7164_encoder_fh *fh = file->private_data;
  632. struct saa7164_port *port = fh->port;
  633. struct saa7164_dev *dev = port->dev;
  634. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  635. f->fmt.pix.bytesperline = 0;
  636. f->fmt.pix.sizeimage =
  637. port->ts_packet_size * port->ts_packet_count;
  638. f->fmt.pix.colorspace = 0;
  639. f->fmt.pix.width = port->width;
  640. f->fmt.pix.height = port->height;
  641. dprintk(DBGLVL_ENC, "VIDIOC_G_FMT: w: %d, h: %d\n",
  642. port->width, port->height);
  643. return 0;
  644. }
  645. static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
  646. struct v4l2_format *f)
  647. {
  648. struct saa7164_encoder_fh *fh = file->private_data;
  649. struct saa7164_port *port = fh->port;
  650. struct saa7164_dev *dev = port->dev;
  651. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  652. f->fmt.pix.bytesperline = 0;
  653. f->fmt.pix.sizeimage =
  654. port->ts_packet_size * port->ts_packet_count;
  655. f->fmt.pix.colorspace = 0;
  656. dprintk(DBGLVL_ENC, "VIDIOC_TRY_FMT: w: %d, h: %d\n",
  657. port->width, port->height);
  658. return 0;
  659. }
  660. static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
  661. struct v4l2_format *f)
  662. {
  663. struct saa7164_encoder_fh *fh = file->private_data;
  664. struct saa7164_port *port = fh->port;
  665. struct saa7164_dev *dev = port->dev;
  666. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  667. f->fmt.pix.bytesperline = 0;
  668. f->fmt.pix.sizeimage =
  669. port->ts_packet_size * port->ts_packet_count;
  670. f->fmt.pix.colorspace = 0;
  671. dprintk(DBGLVL_ENC, "VIDIOC_S_FMT: w: %d, h: %d, f: %d\n",
  672. f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
  673. return 0;
  674. }
  675. static int fill_queryctrl(struct saa7164_encoder_params *params,
  676. struct v4l2_queryctrl *c)
  677. {
  678. switch (c->id) {
  679. case V4L2_CID_BRIGHTNESS:
  680. return v4l2_ctrl_query_fill(c, 0x0, 0xff, 1, 127);
  681. case V4L2_CID_CONTRAST:
  682. return v4l2_ctrl_query_fill(c, 0x0, 0xff, 1, 66);
  683. case V4L2_CID_SATURATION:
  684. return v4l2_ctrl_query_fill(c, 0x0, 0xff, 1, 62);
  685. case V4L2_CID_HUE:
  686. return v4l2_ctrl_query_fill(c, 0x0, 0xff, 1, 128);
  687. case V4L2_CID_SHARPNESS:
  688. return v4l2_ctrl_query_fill(c, 0x0, 0x0f, 1, 8);
  689. case V4L2_CID_MPEG_AUDIO_MUTE:
  690. return v4l2_ctrl_query_fill(c, 0x0, 0x01, 1, 0);
  691. case V4L2_CID_AUDIO_VOLUME:
  692. return v4l2_ctrl_query_fill(c, -83, 24, 1, 20);
  693. case V4L2_CID_MPEG_VIDEO_BITRATE:
  694. return v4l2_ctrl_query_fill(c,
  695. ENCODER_MIN_BITRATE, ENCODER_MAX_BITRATE,
  696. 100000, ENCODER_DEF_BITRATE);
  697. case V4L2_CID_MPEG_STREAM_TYPE:
  698. return v4l2_ctrl_query_fill(c,
  699. V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
  700. V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
  701. 1, V4L2_MPEG_STREAM_TYPE_MPEG2_PS);
  702. case V4L2_CID_MPEG_VIDEO_ASPECT:
  703. return v4l2_ctrl_query_fill(c,
  704. V4L2_MPEG_VIDEO_ASPECT_1x1,
  705. V4L2_MPEG_VIDEO_ASPECT_221x100,
  706. 1, V4L2_MPEG_VIDEO_ASPECT_4x3);
  707. case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
  708. return v4l2_ctrl_query_fill(c, 1, 255, 1, 15);
  709. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  710. return v4l2_ctrl_query_fill(c,
  711. V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
  712. V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
  713. 1, V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
  714. case V4L2_CID_MPEG_VIDEO_B_FRAMES:
  715. return v4l2_ctrl_query_fill(c,
  716. 1, 3, 1, 1);
  717. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  718. return v4l2_ctrl_query_fill(c,
  719. ENCODER_MIN_BITRATE, ENCODER_MAX_BITRATE,
  720. 100000, ENCODER_DEF_BITRATE);
  721. default:
  722. return -EINVAL;
  723. }
  724. }
  725. static int vidioc_queryctrl(struct file *file, void *priv,
  726. struct v4l2_queryctrl *c)
  727. {
  728. struct saa7164_encoder_fh *fh = priv;
  729. struct saa7164_port *port = fh->port;
  730. int i, next;
  731. u32 id = c->id;
  732. memset(c, 0, sizeof(*c));
  733. next = !!(id & V4L2_CTRL_FLAG_NEXT_CTRL);
  734. c->id = id & ~V4L2_CTRL_FLAG_NEXT_CTRL;
  735. for (i = 0; i < ARRAY_SIZE(saa7164_v4l2_ctrls); i++) {
  736. if (next) {
  737. if (c->id < saa7164_v4l2_ctrls[i])
  738. c->id = saa7164_v4l2_ctrls[i];
  739. else
  740. continue;
  741. }
  742. if (c->id == saa7164_v4l2_ctrls[i])
  743. return fill_queryctrl(&port->encoder_params, c);
  744. if (c->id < saa7164_v4l2_ctrls[i])
  745. break;
  746. }
  747. return -EINVAL;
  748. }
  749. static int saa7164_encoder_stop_port(struct saa7164_port *port)
  750. {
  751. struct saa7164_dev *dev = port->dev;
  752. int ret;
  753. ret = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
  754. if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
  755. printk(KERN_ERR "%s() stop transition failed, ret = 0x%x\n",
  756. __func__, ret);
  757. ret = -EIO;
  758. } else {
  759. dprintk(DBGLVL_ENC, "%s() Stopped\n", __func__);
  760. ret = 0;
  761. }
  762. return ret;
  763. }
  764. static int saa7164_encoder_acquire_port(struct saa7164_port *port)
  765. {
  766. struct saa7164_dev *dev = port->dev;
  767. int ret;
  768. ret = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
  769. if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
  770. printk(KERN_ERR "%s() acquire transition failed, ret = 0x%x\n",
  771. __func__, ret);
  772. ret = -EIO;
  773. } else {
  774. dprintk(DBGLVL_ENC, "%s() Acquired\n", __func__);
  775. ret = 0;
  776. }
  777. return ret;
  778. }
  779. static int saa7164_encoder_pause_port(struct saa7164_port *port)
  780. {
  781. struct saa7164_dev *dev = port->dev;
  782. int ret;
  783. ret = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
  784. if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
  785. printk(KERN_ERR "%s() pause transition failed, ret = 0x%x\n",
  786. __func__, ret);
  787. ret = -EIO;
  788. } else {
  789. dprintk(DBGLVL_ENC, "%s() Paused\n", __func__);
  790. ret = 0;
  791. }
  792. return ret;
  793. }
  794. /* Firmware is very windows centric, meaning you have to transition
  795. * the part through AVStream / KS Windows stages, forwards or backwards.
  796. * States are: stopped, acquired (h/w), paused, started.
  797. * We have to leave here will all of the soft buffers on the free list,
  798. * else the cfg_post() func won't have soft buffers to correctly configure.
  799. */
  800. static int saa7164_encoder_stop_streaming(struct saa7164_port *port)
  801. {
  802. struct saa7164_dev *dev = port->dev;
  803. struct saa7164_buffer *buf;
  804. struct saa7164_user_buffer *ubuf;
  805. struct list_head *c, *n;
  806. int ret;
  807. dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
  808. ret = saa7164_encoder_pause_port(port);
  809. ret = saa7164_encoder_acquire_port(port);
  810. ret = saa7164_encoder_stop_port(port);
  811. dprintk(DBGLVL_ENC, "%s(port=%d) Hardware stopped\n", __func__,
  812. port->nr);
  813. /* Reset the state of any allocated buffer resources */
  814. mutex_lock(&port->dmaqueue_lock);
  815. /* Reset the hard and soft buffer state */
  816. list_for_each_safe(c, n, &port->dmaqueue.list) {
  817. buf = list_entry(c, struct saa7164_buffer, list);
  818. buf->flags = SAA7164_BUFFER_FREE;
  819. buf->pos = 0;
  820. }
  821. list_for_each_safe(c, n, &port->list_buf_used.list) {
  822. ubuf = list_entry(c, struct saa7164_user_buffer, list);
  823. ubuf->pos = 0;
  824. list_move_tail(&ubuf->list, &port->list_buf_free.list);
  825. }
  826. mutex_unlock(&port->dmaqueue_lock);
  827. /* Free any allocated resources */
  828. saa7164_encoder_buffers_dealloc(port);
  829. dprintk(DBGLVL_ENC, "%s(port=%d) Released\n", __func__, port->nr);
  830. return ret;
  831. }
  832. static int saa7164_encoder_start_streaming(struct saa7164_port *port)
  833. {
  834. struct saa7164_dev *dev = port->dev;
  835. int result, ret = 0;
  836. dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
  837. port->done_first_interrupt = 0;
  838. /* allocate all of the PCIe DMA buffer resources on the fly,
  839. * allowing switching between TS and PS payloads without
  840. * requiring a complete driver reload.
  841. */
  842. saa7164_encoder_buffers_alloc(port);
  843. /* Configure the encoder with any cache values */
  844. saa7164_api_set_encoder(port);
  845. saa7164_api_get_encoder(port);
  846. /* Place the empty buffers on the hardware */
  847. saa7164_buffer_cfg_port(port);
  848. /* Acquire the hardware */
  849. result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
  850. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  851. printk(KERN_ERR "%s() acquire transition failed, res = 0x%x\n",
  852. __func__, result);
  853. /* Stop the hardware, regardless */
  854. result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
  855. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  856. printk(KERN_ERR "%s() acquire/forced stop transition "
  857. "failed, res = 0x%x\n", __func__, result);
  858. }
  859. ret = -EIO;
  860. goto out;
  861. } else
  862. dprintk(DBGLVL_ENC, "%s() Acquired\n", __func__);
  863. /* Pause the hardware */
  864. result = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
  865. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  866. printk(KERN_ERR "%s() pause transition failed, res = 0x%x\n",
  867. __func__, result);
  868. /* Stop the hardware, regardless */
  869. result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
  870. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  871. printk(KERN_ERR "%s() pause/forced stop transition "
  872. "failed, res = 0x%x\n", __func__, result);
  873. }
  874. ret = -EIO;
  875. goto out;
  876. } else
  877. dprintk(DBGLVL_ENC, "%s() Paused\n", __func__);
  878. /* Start the hardware */
  879. result = saa7164_api_transition_port(port, SAA_DMASTATE_RUN);
  880. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  881. printk(KERN_ERR "%s() run transition failed, result = 0x%x\n",
  882. __func__, result);
  883. /* Stop the hardware, regardless */
  884. result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
  885. if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
  886. printk(KERN_ERR "%s() run/forced stop transition "
  887. "failed, res = 0x%x\n", __func__, result);
  888. }
  889. ret = -EIO;
  890. } else
  891. dprintk(DBGLVL_ENC, "%s() Running\n", __func__);
  892. out:
  893. return ret;
  894. }
  895. static int fops_open(struct file *file)
  896. {
  897. struct saa7164_dev *dev;
  898. struct saa7164_port *port;
  899. struct saa7164_encoder_fh *fh;
  900. port = (struct saa7164_port *)video_get_drvdata(video_devdata(file));
  901. if (!port)
  902. return -ENODEV;
  903. dev = port->dev;
  904. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  905. /* allocate + initialize per filehandle data */
  906. fh = kzalloc(sizeof(*fh), GFP_KERNEL);
  907. if (NULL == fh)
  908. return -ENOMEM;
  909. file->private_data = fh;
  910. fh->port = port;
  911. return 0;
  912. }
  913. static int fops_release(struct file *file)
  914. {
  915. struct saa7164_encoder_fh *fh = file->private_data;
  916. struct saa7164_port *port = fh->port;
  917. struct saa7164_dev *dev = port->dev;
  918. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  919. /* Shut device down on last close */
  920. if (atomic_cmpxchg(&fh->v4l_reading, 1, 0) == 1) {
  921. if (atomic_dec_return(&port->v4l_reader_count) == 0) {
  922. /* stop mpeg capture then cancel buffers */
  923. saa7164_encoder_stop_streaming(port);
  924. }
  925. }
  926. file->private_data = NULL;
  927. kfree(fh);
  928. return 0;
  929. }
  930. static struct
  931. saa7164_user_buffer *saa7164_enc_next_buf(struct saa7164_port *port)
  932. {
  933. struct saa7164_user_buffer *ubuf = NULL;
  934. struct saa7164_dev *dev = port->dev;
  935. u32 crc;
  936. mutex_lock(&port->dmaqueue_lock);
  937. if (!list_empty(&port->list_buf_used.list)) {
  938. ubuf = list_first_entry(&port->list_buf_used.list,
  939. struct saa7164_user_buffer, list);
  940. if (crc_checking) {
  941. crc = crc32(0, ubuf->data, ubuf->actual_size);
  942. if (crc != ubuf->crc) {
  943. printk(KERN_ERR
  944. "%s() ubuf %p crc became invalid, was 0x%x became 0x%x\n",
  945. __func__,
  946. ubuf, ubuf->crc, crc);
  947. }
  948. }
  949. }
  950. mutex_unlock(&port->dmaqueue_lock);
  951. dprintk(DBGLVL_ENC, "%s() returns %p\n", __func__, ubuf);
  952. return ubuf;
  953. }
  954. static ssize_t fops_read(struct file *file, char __user *buffer,
  955. size_t count, loff_t *pos)
  956. {
  957. struct saa7164_encoder_fh *fh = file->private_data;
  958. struct saa7164_port *port = fh->port;
  959. struct saa7164_user_buffer *ubuf = NULL;
  960. struct saa7164_dev *dev = port->dev;
  961. int ret = 0;
  962. int rem, cnt;
  963. u8 *p;
  964. port->last_read_msecs_diff = port->last_read_msecs;
  965. port->last_read_msecs = jiffies_to_msecs(jiffies);
  966. port->last_read_msecs_diff = port->last_read_msecs -
  967. port->last_read_msecs_diff;
  968. saa7164_histogram_update(&port->read_interval,
  969. port->last_read_msecs_diff);
  970. if (*pos) {
  971. printk(KERN_ERR "%s() ESPIPE\n", __func__);
  972. return -ESPIPE;
  973. }
  974. if (atomic_cmpxchg(&fh->v4l_reading, 0, 1) == 0) {
  975. if (atomic_inc_return(&port->v4l_reader_count) == 1) {
  976. if (saa7164_encoder_initialize(port) < 0) {
  977. printk(KERN_ERR "%s() EINVAL\n", __func__);
  978. return -EINVAL;
  979. }
  980. saa7164_encoder_start_streaming(port);
  981. msleep(200);
  982. }
  983. }
  984. /* blocking wait for buffer */
  985. if ((file->f_flags & O_NONBLOCK) == 0) {
  986. if (wait_event_interruptible(port->wait_read,
  987. saa7164_enc_next_buf(port))) {
  988. printk(KERN_ERR "%s() ERESTARTSYS\n", __func__);
  989. return -ERESTARTSYS;
  990. }
  991. }
  992. /* Pull the first buffer from the used list */
  993. ubuf = saa7164_enc_next_buf(port);
  994. while ((count > 0) && ubuf) {
  995. /* set remaining bytes to copy */
  996. rem = ubuf->actual_size - ubuf->pos;
  997. cnt = rem > count ? count : rem;
  998. p = ubuf->data + ubuf->pos;
  999. dprintk(DBGLVL_ENC,
  1000. "%s() count=%d cnt=%d rem=%d buf=%p buf->pos=%d\n",
  1001. __func__, (int)count, cnt, rem, ubuf, ubuf->pos);
  1002. if (copy_to_user(buffer, p, cnt)) {
  1003. printk(KERN_ERR "%s() copy_to_user failed\n", __func__);
  1004. if (!ret) {
  1005. printk(KERN_ERR "%s() EFAULT\n", __func__);
  1006. ret = -EFAULT;
  1007. }
  1008. goto err;
  1009. }
  1010. ubuf->pos += cnt;
  1011. count -= cnt;
  1012. buffer += cnt;
  1013. ret += cnt;
  1014. if (ubuf->pos > ubuf->actual_size)
  1015. printk(KERN_ERR "read() pos > actual, huh?\n");
  1016. if (ubuf->pos == ubuf->actual_size) {
  1017. /* finished with current buffer, take next buffer */
  1018. /* Requeue the buffer on the free list */
  1019. ubuf->pos = 0;
  1020. mutex_lock(&port->dmaqueue_lock);
  1021. list_move_tail(&ubuf->list, &port->list_buf_free.list);
  1022. mutex_unlock(&port->dmaqueue_lock);
  1023. /* Dequeue next */
  1024. if ((file->f_flags & O_NONBLOCK) == 0) {
  1025. if (wait_event_interruptible(port->wait_read,
  1026. saa7164_enc_next_buf(port))) {
  1027. break;
  1028. }
  1029. }
  1030. ubuf = saa7164_enc_next_buf(port);
  1031. }
  1032. }
  1033. err:
  1034. if (!ret && !ubuf)
  1035. ret = -EAGAIN;
  1036. return ret;
  1037. }
  1038. static unsigned int fops_poll(struct file *file, poll_table *wait)
  1039. {
  1040. struct saa7164_encoder_fh *fh =
  1041. (struct saa7164_encoder_fh *)file->private_data;
  1042. struct saa7164_port *port = fh->port;
  1043. unsigned int mask = 0;
  1044. port->last_poll_msecs_diff = port->last_poll_msecs;
  1045. port->last_poll_msecs = jiffies_to_msecs(jiffies);
  1046. port->last_poll_msecs_diff = port->last_poll_msecs -
  1047. port->last_poll_msecs_diff;
  1048. saa7164_histogram_update(&port->poll_interval,
  1049. port->last_poll_msecs_diff);
  1050. if (!video_is_registered(port->v4l_device))
  1051. return -EIO;
  1052. if (atomic_cmpxchg(&fh->v4l_reading, 0, 1) == 0) {
  1053. if (atomic_inc_return(&port->v4l_reader_count) == 1) {
  1054. if (saa7164_encoder_initialize(port) < 0)
  1055. return -EINVAL;
  1056. saa7164_encoder_start_streaming(port);
  1057. msleep(200);
  1058. }
  1059. }
  1060. /* blocking wait for buffer */
  1061. if ((file->f_flags & O_NONBLOCK) == 0) {
  1062. if (wait_event_interruptible(port->wait_read,
  1063. saa7164_enc_next_buf(port))) {
  1064. return -ERESTARTSYS;
  1065. }
  1066. }
  1067. /* Pull the first buffer from the used list */
  1068. if (!list_empty(&port->list_buf_used.list))
  1069. mask |= POLLIN | POLLRDNORM;
  1070. return mask;
  1071. }
  1072. static const struct v4l2_file_operations mpeg_fops = {
  1073. .owner = THIS_MODULE,
  1074. .open = fops_open,
  1075. .release = fops_release,
  1076. .read = fops_read,
  1077. .poll = fops_poll,
  1078. .unlocked_ioctl = video_ioctl2,
  1079. };
  1080. static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
  1081. .vidioc_s_std = vidioc_s_std,
  1082. .vidioc_g_std = vidioc_g_std,
  1083. .vidioc_enum_input = vidioc_enum_input,
  1084. .vidioc_g_input = vidioc_g_input,
  1085. .vidioc_s_input = vidioc_s_input,
  1086. .vidioc_g_tuner = vidioc_g_tuner,
  1087. .vidioc_s_tuner = vidioc_s_tuner,
  1088. .vidioc_g_frequency = vidioc_g_frequency,
  1089. .vidioc_s_frequency = vidioc_s_frequency,
  1090. .vidioc_s_ctrl = vidioc_s_ctrl,
  1091. .vidioc_g_ctrl = vidioc_g_ctrl,
  1092. .vidioc_querycap = vidioc_querycap,
  1093. .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
  1094. .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
  1095. .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
  1096. .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
  1097. .vidioc_g_ext_ctrls = vidioc_g_ext_ctrls,
  1098. .vidioc_s_ext_ctrls = vidioc_s_ext_ctrls,
  1099. .vidioc_try_ext_ctrls = vidioc_try_ext_ctrls,
  1100. .vidioc_queryctrl = vidioc_queryctrl,
  1101. };
  1102. static struct video_device saa7164_mpeg_template = {
  1103. .name = "saa7164",
  1104. .fops = &mpeg_fops,
  1105. .ioctl_ops = &mpeg_ioctl_ops,
  1106. .minor = -1,
  1107. .tvnorms = SAA7164_NORMS,
  1108. };
  1109. static struct video_device *saa7164_encoder_alloc(
  1110. struct saa7164_port *port,
  1111. struct pci_dev *pci,
  1112. struct video_device *template,
  1113. char *type)
  1114. {
  1115. struct video_device *vfd;
  1116. struct saa7164_dev *dev = port->dev;
  1117. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  1118. vfd = video_device_alloc();
  1119. if (NULL == vfd)
  1120. return NULL;
  1121. *vfd = *template;
  1122. snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", dev->name,
  1123. type, saa7164_boards[dev->board].name);
  1124. vfd->v4l2_dev = &dev->v4l2_dev;
  1125. vfd->release = video_device_release;
  1126. return vfd;
  1127. }
  1128. int saa7164_encoder_register(struct saa7164_port *port)
  1129. {
  1130. struct saa7164_dev *dev = port->dev;
  1131. int result = -ENODEV;
  1132. dprintk(DBGLVL_ENC, "%s()\n", __func__);
  1133. if (port->type != SAA7164_MPEG_ENCODER)
  1134. BUG();
  1135. /* Sanity check that the PCI configuration space is active */
  1136. if (port->hwcfg.BARLocation == 0) {
  1137. printk(KERN_ERR "%s() failed "
  1138. "(errno = %d), NO PCI configuration\n",
  1139. __func__, result);
  1140. result = -ENOMEM;
  1141. goto failed;
  1142. }
  1143. /* Establish encoder defaults here */
  1144. /* Set default TV standard */
  1145. port->encodernorm = saa7164_tvnorms[0];
  1146. port->width = 720;
  1147. port->mux_input = 1; /* Composite */
  1148. port->video_format = EU_VIDEO_FORMAT_MPEG_2;
  1149. port->audio_format = 0;
  1150. port->video_resolution = 0;
  1151. port->ctl_brightness = 127;
  1152. port->ctl_contrast = 66;
  1153. port->ctl_hue = 128;
  1154. port->ctl_saturation = 62;
  1155. port->ctl_sharpness = 8;
  1156. port->encoder_params.bitrate = ENCODER_DEF_BITRATE;
  1157. port->encoder_params.bitrate_peak = ENCODER_DEF_BITRATE;
  1158. port->encoder_params.bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR;
  1159. port->encoder_params.stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS;
  1160. port->encoder_params.ctl_mute = 0;
  1161. port->encoder_params.ctl_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3;
  1162. port->encoder_params.refdist = 1;
  1163. port->encoder_params.gop_size = SAA7164_ENCODER_DEFAULT_GOP_SIZE;
  1164. port->std = V4L2_STD_NTSC_M;
  1165. if (port->encodernorm.id & V4L2_STD_525_60)
  1166. port->height = 480;
  1167. else
  1168. port->height = 576;
  1169. /* Allocate and register the video device node */
  1170. port->v4l_device = saa7164_encoder_alloc(port,
  1171. dev->pci, &saa7164_mpeg_template, "mpeg");
  1172. if (!port->v4l_device) {
  1173. printk(KERN_INFO "%s: can't allocate mpeg device\n",
  1174. dev->name);
  1175. result = -ENOMEM;
  1176. goto failed;
  1177. }
  1178. video_set_drvdata(port->v4l_device, port);
  1179. result = video_register_device(port->v4l_device,
  1180. VFL_TYPE_GRABBER, -1);
  1181. if (result < 0) {
  1182. printk(KERN_INFO "%s: can't register mpeg device\n",
  1183. dev->name);
  1184. /* TODO: We're going to leak here if we don't dealloc
  1185. The buffers above. The unreg function can't deal wit it.
  1186. */
  1187. goto failed;
  1188. }
  1189. printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
  1190. dev->name, port->v4l_device->num);
  1191. /* Configure the hardware defaults */
  1192. saa7164_api_set_videomux(port);
  1193. saa7164_api_set_usercontrol(port, PU_BRIGHTNESS_CONTROL);
  1194. saa7164_api_set_usercontrol(port, PU_CONTRAST_CONTROL);
  1195. saa7164_api_set_usercontrol(port, PU_HUE_CONTROL);
  1196. saa7164_api_set_usercontrol(port, PU_SATURATION_CONTROL);
  1197. saa7164_api_set_usercontrol(port, PU_SHARPNESS_CONTROL);
  1198. saa7164_api_audio_mute(port, 0);
  1199. saa7164_api_set_audio_volume(port, 20);
  1200. saa7164_api_set_aspect_ratio(port);
  1201. /* Disable audio standard detection, it's buggy */
  1202. saa7164_api_set_audio_detection(port, 0);
  1203. saa7164_api_set_encoder(port);
  1204. saa7164_api_get_encoder(port);
  1205. result = 0;
  1206. failed:
  1207. return result;
  1208. }
  1209. void saa7164_encoder_unregister(struct saa7164_port *port)
  1210. {
  1211. struct saa7164_dev *dev = port->dev;
  1212. dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
  1213. if (port->type != SAA7164_MPEG_ENCODER)
  1214. BUG();
  1215. if (port->v4l_device) {
  1216. if (port->v4l_device->minor != -1)
  1217. video_unregister_device(port->v4l_device);
  1218. else
  1219. video_device_release(port->v4l_device);
  1220. port->v4l_device = NULL;
  1221. }
  1222. dprintk(DBGLVL_ENC, "%s(port=%d) done\n", __func__, port->nr);
  1223. }