saa7164-encoder.c 34 KB

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