saa6752hs.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. /*
  2. saa6752hs - i2c-driver for the saa6752hs by Philips
  3. Copyright (C) 2004 Andrew de Quincey
  4. AC-3 support:
  5. Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl>
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License vs published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mvss Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/string.h>
  21. #include <linux/timer.h>
  22. #include <linux/delay.h>
  23. #include <linux/errno.h>
  24. #include <linux/slab.h>
  25. #include <linux/poll.h>
  26. #include <linux/i2c.h>
  27. #include <linux/types.h>
  28. #include <linux/videodev2.h>
  29. #include <media/v4l2-device.h>
  30. #include <media/v4l2-common.h>
  31. #include <media/v4l2-chip-ident.h>
  32. #include <linux/init.h>
  33. #include <linux/crc32.h>
  34. #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
  35. #define MPEG_VIDEO_MAX_BITRATE_MAX 27000
  36. #define MPEG_TOTAL_TARGET_BITRATE_MAX 27000
  37. #define MPEG_PID_MAX ((1 << 14) - 1)
  38. MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
  39. MODULE_AUTHOR("Andrew de Quincey");
  40. MODULE_LICENSE("GPL");
  41. enum saa6752hs_videoformat {
  42. SAA6752HS_VF_D1 = 0, /* standard D1 video format: 720x576 */
  43. SAA6752HS_VF_2_3_D1 = 1,/* 2/3D1 video format: 480x576 */
  44. SAA6752HS_VF_1_2_D1 = 2,/* 1/2D1 video format: 352x576 */
  45. SAA6752HS_VF_SIF = 3, /* SIF video format: 352x288 */
  46. SAA6752HS_VF_UNKNOWN,
  47. };
  48. struct saa6752hs_mpeg_params {
  49. /* transport streams */
  50. __u16 ts_pid_pmt;
  51. __u16 ts_pid_audio;
  52. __u16 ts_pid_video;
  53. __u16 ts_pid_pcr;
  54. /* audio */
  55. enum v4l2_mpeg_audio_encoding au_encoding;
  56. enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate;
  57. enum v4l2_mpeg_audio_ac3_bitrate au_ac3_bitrate;
  58. /* video */
  59. enum v4l2_mpeg_video_aspect vi_aspect;
  60. enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode;
  61. __u32 vi_bitrate;
  62. __u32 vi_bitrate_peak;
  63. };
  64. static const struct v4l2_format v4l2_format_table[] =
  65. {
  66. [SAA6752HS_VF_D1] =
  67. { .fmt = { .pix = { .width = 720, .height = 576 }}},
  68. [SAA6752HS_VF_2_3_D1] =
  69. { .fmt = { .pix = { .width = 480, .height = 576 }}},
  70. [SAA6752HS_VF_1_2_D1] =
  71. { .fmt = { .pix = { .width = 352, .height = 576 }}},
  72. [SAA6752HS_VF_SIF] =
  73. { .fmt = { .pix = { .width = 352, .height = 288 }}},
  74. [SAA6752HS_VF_UNKNOWN] =
  75. { .fmt = { .pix = { .width = 0, .height = 0}}},
  76. };
  77. struct saa6752hs_state {
  78. struct v4l2_subdev sd;
  79. int chip;
  80. u32 revision;
  81. int has_ac3;
  82. struct saa6752hs_mpeg_params params;
  83. enum saa6752hs_videoformat video_format;
  84. v4l2_std_id standard;
  85. };
  86. enum saa6752hs_command {
  87. SAA6752HS_COMMAND_RESET = 0,
  88. SAA6752HS_COMMAND_STOP = 1,
  89. SAA6752HS_COMMAND_START = 2,
  90. SAA6752HS_COMMAND_PAUSE = 3,
  91. SAA6752HS_COMMAND_RECONFIGURE = 4,
  92. SAA6752HS_COMMAND_SLEEP = 5,
  93. SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6,
  94. SAA6752HS_COMMAND_MAX
  95. };
  96. static inline struct saa6752hs_state *to_state(struct v4l2_subdev *sd)
  97. {
  98. return container_of(sd, struct saa6752hs_state, sd);
  99. }
  100. /* ---------------------------------------------------------------------- */
  101. static u8 PAT[] = {
  102. 0xc2, /* i2c register */
  103. 0x00, /* table number for encoder */
  104. 0x47, /* sync */
  105. 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */
  106. 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
  107. 0x00, /* PSI pointer to start of table */
  108. 0x00, /* tid(0) */
  109. 0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */
  110. 0x00, 0x01, /* transport_stream_id(1) */
  111. 0xc1, /* version_number(0), current_next_indicator(1) */
  112. 0x00, 0x00, /* section_number(0), last_section_number(0) */
  113. 0x00, 0x01, /* program_number(1) */
  114. 0xe0, 0x00, /* PMT PID */
  115. 0x00, 0x00, 0x00, 0x00 /* CRC32 */
  116. };
  117. static u8 PMT[] = {
  118. 0xc2, /* i2c register */
  119. 0x01, /* table number for encoder */
  120. 0x47, /* sync */
  121. 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */
  122. 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
  123. 0x00, /* PSI pointer to start of table */
  124. 0x02, /* tid(2) */
  125. 0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */
  126. 0x00, 0x01, /* program_number(1) */
  127. 0xc1, /* version_number(0), current_next_indicator(1) */
  128. 0x00, 0x00, /* section_number(0), last_section_number(0) */
  129. 0xe0, 0x00, /* PCR_PID */
  130. 0xf0, 0x00, /* program_info_length(0) */
  131. 0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
  132. 0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */
  133. 0x00, 0x00, 0x00, 0x00 /* CRC32 */
  134. };
  135. static u8 PMT_AC3[] = {
  136. 0xc2, /* i2c register */
  137. 0x01, /* table number for encoder(1) */
  138. 0x47, /* sync */
  139. 0x40, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0) */
  140. 0x10, /* PMT PID (0x0010) */
  141. 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
  142. 0x00, /* PSI pointer to start of table */
  143. 0x02, /* TID (2) */
  144. 0xb0, 0x1a, /* section_syntax_indicator(1), section_length(26) */
  145. 0x00, 0x01, /* program_number(1) */
  146. 0xc1, /* version_number(0), current_next_indicator(1) */
  147. 0x00, 0x00, /* section_number(0), last_section_number(0) */
  148. 0xe1, 0x04, /* PCR_PID (0x0104) */
  149. 0xf0, 0x00, /* program_info_length(0) */
  150. 0x02, 0xe1, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
  151. 0x06, 0xe1, 0x03, 0xf0, 0x03, /* audio stream type(6), pid */
  152. 0x6a, /* AC3 */
  153. 0x01, /* Descriptor_length(1) */
  154. 0x00, /* component_type_flag(0), bsid_flag(0), mainid_flag(0), asvc_flag(0), reserved flags(0) */
  155. 0xED, 0xDE, 0x2D, 0xF3 /* CRC32 BE */
  156. };
  157. static struct saa6752hs_mpeg_params param_defaults =
  158. {
  159. .ts_pid_pmt = 16,
  160. .ts_pid_video = 260,
  161. .ts_pid_audio = 256,
  162. .ts_pid_pcr = 259,
  163. .vi_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
  164. .vi_bitrate = 4000,
  165. .vi_bitrate_peak = 6000,
  166. .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
  167. .au_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
  168. .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K,
  169. .au_ac3_bitrate = V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
  170. };
  171. /* ---------------------------------------------------------------------- */
  172. static int saa6752hs_chip_command(struct i2c_client *client,
  173. enum saa6752hs_command command)
  174. {
  175. unsigned char buf[3];
  176. unsigned long timeout;
  177. int status = 0;
  178. /* execute the command */
  179. switch(command) {
  180. case SAA6752HS_COMMAND_RESET:
  181. buf[0] = 0x00;
  182. break;
  183. case SAA6752HS_COMMAND_STOP:
  184. buf[0] = 0x03;
  185. break;
  186. case SAA6752HS_COMMAND_START:
  187. buf[0] = 0x02;
  188. break;
  189. case SAA6752HS_COMMAND_PAUSE:
  190. buf[0] = 0x04;
  191. break;
  192. case SAA6752HS_COMMAND_RECONFIGURE:
  193. buf[0] = 0x05;
  194. break;
  195. case SAA6752HS_COMMAND_SLEEP:
  196. buf[0] = 0x06;
  197. break;
  198. case SAA6752HS_COMMAND_RECONFIGURE_FORCE:
  199. buf[0] = 0x07;
  200. break;
  201. default:
  202. return -EINVAL;
  203. }
  204. /* set it and wait for it to be so */
  205. i2c_master_send(client, buf, 1);
  206. timeout = jiffies + HZ * 3;
  207. for (;;) {
  208. /* get the current status */
  209. buf[0] = 0x10;
  210. i2c_master_send(client, buf, 1);
  211. i2c_master_recv(client, buf, 1);
  212. if (!(buf[0] & 0x20))
  213. break;
  214. if (time_after(jiffies,timeout)) {
  215. status = -ETIMEDOUT;
  216. break;
  217. }
  218. msleep(10);
  219. }
  220. /* delay a bit to let encoder settle */
  221. msleep(50);
  222. return status;
  223. }
  224. static inline void set_reg8(struct i2c_client *client, uint8_t reg, uint8_t val)
  225. {
  226. u8 buf[2];
  227. buf[0] = reg;
  228. buf[1] = val;
  229. i2c_master_send(client, buf, 2);
  230. }
  231. static inline void set_reg16(struct i2c_client *client, uint8_t reg, uint16_t val)
  232. {
  233. u8 buf[3];
  234. buf[0] = reg;
  235. buf[1] = val >> 8;
  236. buf[2] = val & 0xff;
  237. i2c_master_send(client, buf, 3);
  238. }
  239. static int saa6752hs_set_bitrate(struct i2c_client *client,
  240. struct saa6752hs_state *h)
  241. {
  242. struct saa6752hs_mpeg_params *params = &h->params;
  243. int tot_bitrate;
  244. int is_384k;
  245. /* set the bitrate mode */
  246. set_reg8(client, 0x71,
  247. params->vi_bitrate_mode != V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
  248. /* set the video bitrate */
  249. if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
  250. /* set the target bitrate */
  251. set_reg16(client, 0x80, params->vi_bitrate);
  252. /* set the max bitrate */
  253. set_reg16(client, 0x81, params->vi_bitrate_peak);
  254. tot_bitrate = params->vi_bitrate_peak;
  255. } else {
  256. /* set the target bitrate (no max bitrate for CBR) */
  257. set_reg16(client, 0x81, params->vi_bitrate);
  258. tot_bitrate = params->vi_bitrate;
  259. }
  260. /* set the audio encoding */
  261. set_reg8(client, 0x93,
  262. params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3);
  263. /* set the audio bitrate */
  264. if (params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3)
  265. is_384k = V4L2_MPEG_AUDIO_AC3_BITRATE_384K == params->au_ac3_bitrate;
  266. else
  267. is_384k = V4L2_MPEG_AUDIO_L2_BITRATE_384K == params->au_l2_bitrate;
  268. set_reg8(client, 0x94, is_384k);
  269. tot_bitrate += is_384k ? 384 : 256;
  270. /* Note: the total max bitrate is determined by adding the video and audio
  271. bitrates together and also adding an extra 768kbit/s to stay on the
  272. safe side. If more control should be required, then an extra MPEG control
  273. should be added. */
  274. tot_bitrate += 768;
  275. if (tot_bitrate > MPEG_TOTAL_TARGET_BITRATE_MAX)
  276. tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX;
  277. /* set the total bitrate */
  278. set_reg16(client, 0xb1, tot_bitrate);
  279. return 0;
  280. }
  281. static int get_ctrl(int has_ac3, struct saa6752hs_mpeg_params *params,
  282. struct v4l2_ext_control *ctrl)
  283. {
  284. switch (ctrl->id) {
  285. case V4L2_CID_MPEG_STREAM_TYPE:
  286. ctrl->value = V4L2_MPEG_STREAM_TYPE_MPEG2_TS;
  287. break;
  288. case V4L2_CID_MPEG_STREAM_PID_PMT:
  289. ctrl->value = params->ts_pid_pmt;
  290. break;
  291. case V4L2_CID_MPEG_STREAM_PID_AUDIO:
  292. ctrl->value = params->ts_pid_audio;
  293. break;
  294. case V4L2_CID_MPEG_STREAM_PID_VIDEO:
  295. ctrl->value = params->ts_pid_video;
  296. break;
  297. case V4L2_CID_MPEG_STREAM_PID_PCR:
  298. ctrl->value = params->ts_pid_pcr;
  299. break;
  300. case V4L2_CID_MPEG_AUDIO_ENCODING:
  301. ctrl->value = params->au_encoding;
  302. break;
  303. case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
  304. ctrl->value = params->au_l2_bitrate;
  305. break;
  306. case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
  307. if (!has_ac3)
  308. return -EINVAL;
  309. ctrl->value = params->au_ac3_bitrate;
  310. break;
  311. case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
  312. ctrl->value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
  313. break;
  314. case V4L2_CID_MPEG_VIDEO_ENCODING:
  315. ctrl->value = V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
  316. break;
  317. case V4L2_CID_MPEG_VIDEO_ASPECT:
  318. ctrl->value = params->vi_aspect;
  319. break;
  320. case V4L2_CID_MPEG_VIDEO_BITRATE:
  321. ctrl->value = params->vi_bitrate * 1000;
  322. break;
  323. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  324. ctrl->value = params->vi_bitrate_peak * 1000;
  325. break;
  326. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  327. ctrl->value = params->vi_bitrate_mode;
  328. break;
  329. default:
  330. return -EINVAL;
  331. }
  332. return 0;
  333. }
  334. static int handle_ctrl(int has_ac3, struct saa6752hs_mpeg_params *params,
  335. struct v4l2_ext_control *ctrl, int set)
  336. {
  337. int old = 0, new;
  338. new = ctrl->value;
  339. switch (ctrl->id) {
  340. case V4L2_CID_MPEG_STREAM_TYPE:
  341. old = V4L2_MPEG_STREAM_TYPE_MPEG2_TS;
  342. if (set && new != old)
  343. return -ERANGE;
  344. new = old;
  345. break;
  346. case V4L2_CID_MPEG_STREAM_PID_PMT:
  347. old = params->ts_pid_pmt;
  348. if (set && new > MPEG_PID_MAX)
  349. return -ERANGE;
  350. if (new > MPEG_PID_MAX)
  351. new = MPEG_PID_MAX;
  352. params->ts_pid_pmt = new;
  353. break;
  354. case V4L2_CID_MPEG_STREAM_PID_AUDIO:
  355. old = params->ts_pid_audio;
  356. if (set && new > MPEG_PID_MAX)
  357. return -ERANGE;
  358. if (new > MPEG_PID_MAX)
  359. new = MPEG_PID_MAX;
  360. params->ts_pid_audio = new;
  361. break;
  362. case V4L2_CID_MPEG_STREAM_PID_VIDEO:
  363. old = params->ts_pid_video;
  364. if (set && new > MPEG_PID_MAX)
  365. return -ERANGE;
  366. if (new > MPEG_PID_MAX)
  367. new = MPEG_PID_MAX;
  368. params->ts_pid_video = new;
  369. break;
  370. case V4L2_CID_MPEG_STREAM_PID_PCR:
  371. old = params->ts_pid_pcr;
  372. if (set && new > MPEG_PID_MAX)
  373. return -ERANGE;
  374. if (new > MPEG_PID_MAX)
  375. new = MPEG_PID_MAX;
  376. params->ts_pid_pcr = new;
  377. break;
  378. case V4L2_CID_MPEG_AUDIO_ENCODING:
  379. old = params->au_encoding;
  380. if (set && new != V4L2_MPEG_AUDIO_ENCODING_LAYER_2 &&
  381. (!has_ac3 || new != V4L2_MPEG_AUDIO_ENCODING_AC3))
  382. return -ERANGE;
  383. params->au_encoding = new;
  384. break;
  385. case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
  386. old = params->au_l2_bitrate;
  387. if (set && new != V4L2_MPEG_AUDIO_L2_BITRATE_256K &&
  388. new != V4L2_MPEG_AUDIO_L2_BITRATE_384K)
  389. return -ERANGE;
  390. if (new <= V4L2_MPEG_AUDIO_L2_BITRATE_256K)
  391. new = V4L2_MPEG_AUDIO_L2_BITRATE_256K;
  392. else
  393. new = V4L2_MPEG_AUDIO_L2_BITRATE_384K;
  394. params->au_l2_bitrate = new;
  395. break;
  396. case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
  397. if (!has_ac3)
  398. return -EINVAL;
  399. old = params->au_ac3_bitrate;
  400. if (set && new != V4L2_MPEG_AUDIO_AC3_BITRATE_256K &&
  401. new != V4L2_MPEG_AUDIO_AC3_BITRATE_384K)
  402. return -ERANGE;
  403. if (new <= V4L2_MPEG_AUDIO_AC3_BITRATE_256K)
  404. new = V4L2_MPEG_AUDIO_AC3_BITRATE_256K;
  405. else
  406. new = V4L2_MPEG_AUDIO_AC3_BITRATE_384K;
  407. params->au_ac3_bitrate = new;
  408. break;
  409. case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
  410. old = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
  411. if (set && new != old)
  412. return -ERANGE;
  413. new = old;
  414. break;
  415. case V4L2_CID_MPEG_VIDEO_ENCODING:
  416. old = V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
  417. if (set && new != old)
  418. return -ERANGE;
  419. new = old;
  420. break;
  421. case V4L2_CID_MPEG_VIDEO_ASPECT:
  422. old = params->vi_aspect;
  423. if (set && new != V4L2_MPEG_VIDEO_ASPECT_16x9 &&
  424. new != V4L2_MPEG_VIDEO_ASPECT_4x3)
  425. return -ERANGE;
  426. if (new != V4L2_MPEG_VIDEO_ASPECT_16x9)
  427. new = V4L2_MPEG_VIDEO_ASPECT_4x3;
  428. params->vi_aspect = new;
  429. break;
  430. case V4L2_CID_MPEG_VIDEO_BITRATE:
  431. old = params->vi_bitrate * 1000;
  432. new = 1000 * (new / 1000);
  433. if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
  434. return -ERANGE;
  435. if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
  436. new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000;
  437. params->vi_bitrate = new / 1000;
  438. break;
  439. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  440. old = params->vi_bitrate_peak * 1000;
  441. new = 1000 * (new / 1000);
  442. if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
  443. return -ERANGE;
  444. if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
  445. new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000;
  446. params->vi_bitrate_peak = new / 1000;
  447. break;
  448. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  449. old = params->vi_bitrate_mode;
  450. params->vi_bitrate_mode = new;
  451. break;
  452. default:
  453. return -EINVAL;
  454. }
  455. ctrl->value = new;
  456. return 0;
  457. }
  458. static int saa6752hs_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qctrl)
  459. {
  460. struct saa6752hs_state *h = to_state(sd);
  461. struct saa6752hs_mpeg_params *params = &h->params;
  462. int err;
  463. switch (qctrl->id) {
  464. case V4L2_CID_MPEG_AUDIO_ENCODING:
  465. return v4l2_ctrl_query_fill(qctrl,
  466. V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
  467. h->has_ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 :
  468. V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
  469. 1, V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
  470. case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
  471. return v4l2_ctrl_query_fill(qctrl,
  472. V4L2_MPEG_AUDIO_L2_BITRATE_256K,
  473. V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
  474. V4L2_MPEG_AUDIO_L2_BITRATE_256K);
  475. case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
  476. if (!h->has_ac3)
  477. return -EINVAL;
  478. return v4l2_ctrl_query_fill(qctrl,
  479. V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
  480. V4L2_MPEG_AUDIO_AC3_BITRATE_384K, 1,
  481. V4L2_MPEG_AUDIO_AC3_BITRATE_256K);
  482. case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
  483. return v4l2_ctrl_query_fill(qctrl,
  484. V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
  485. V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000, 1,
  486. V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
  487. case V4L2_CID_MPEG_VIDEO_ENCODING:
  488. return v4l2_ctrl_query_fill(qctrl,
  489. V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
  490. V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
  491. V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
  492. case V4L2_CID_MPEG_VIDEO_ASPECT:
  493. return v4l2_ctrl_query_fill(qctrl,
  494. V4L2_MPEG_VIDEO_ASPECT_4x3,
  495. V4L2_MPEG_VIDEO_ASPECT_16x9, 1,
  496. V4L2_MPEG_VIDEO_ASPECT_4x3);
  497. case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
  498. err = v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 8000000);
  499. if (err == 0 &&
  500. params->vi_bitrate_mode ==
  501. V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
  502. qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
  503. return err;
  504. case V4L2_CID_MPEG_STREAM_TYPE:
  505. return v4l2_ctrl_query_fill(qctrl,
  506. V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
  507. V4L2_MPEG_STREAM_TYPE_MPEG2_TS, 1,
  508. V4L2_MPEG_STREAM_TYPE_MPEG2_TS);
  509. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  510. return v4l2_ctrl_query_fill(qctrl,
  511. V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
  512. V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 1,
  513. V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
  514. case V4L2_CID_MPEG_VIDEO_BITRATE:
  515. return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 6000000);
  516. case V4L2_CID_MPEG_STREAM_PID_PMT:
  517. return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 16);
  518. case V4L2_CID_MPEG_STREAM_PID_AUDIO:
  519. return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 260);
  520. case V4L2_CID_MPEG_STREAM_PID_VIDEO:
  521. return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 256);
  522. case V4L2_CID_MPEG_STREAM_PID_PCR:
  523. return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 259);
  524. default:
  525. break;
  526. }
  527. return -EINVAL;
  528. }
  529. static int saa6752hs_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qmenu)
  530. {
  531. static const u32 mpeg_audio_encoding[] = {
  532. V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
  533. V4L2_CTRL_MENU_IDS_END
  534. };
  535. static const u32 mpeg_audio_ac3_encoding[] = {
  536. V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
  537. V4L2_MPEG_AUDIO_ENCODING_AC3,
  538. V4L2_CTRL_MENU_IDS_END
  539. };
  540. static u32 mpeg_audio_l2_bitrate[] = {
  541. V4L2_MPEG_AUDIO_L2_BITRATE_256K,
  542. V4L2_MPEG_AUDIO_L2_BITRATE_384K,
  543. V4L2_CTRL_MENU_IDS_END
  544. };
  545. static u32 mpeg_audio_ac3_bitrate[] = {
  546. V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
  547. V4L2_MPEG_AUDIO_AC3_BITRATE_384K,
  548. V4L2_CTRL_MENU_IDS_END
  549. };
  550. struct saa6752hs_state *h = to_state(sd);
  551. struct v4l2_queryctrl qctrl;
  552. int err;
  553. qctrl.id = qmenu->id;
  554. err = saa6752hs_queryctrl(sd, &qctrl);
  555. if (err)
  556. return err;
  557. switch (qmenu->id) {
  558. case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
  559. return v4l2_ctrl_query_menu_valid_items(qmenu,
  560. mpeg_audio_l2_bitrate);
  561. case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
  562. if (!h->has_ac3)
  563. return -EINVAL;
  564. return v4l2_ctrl_query_menu_valid_items(qmenu,
  565. mpeg_audio_ac3_bitrate);
  566. case V4L2_CID_MPEG_AUDIO_ENCODING:
  567. return v4l2_ctrl_query_menu_valid_items(qmenu,
  568. h->has_ac3 ? mpeg_audio_ac3_encoding :
  569. mpeg_audio_encoding);
  570. }
  571. return v4l2_ctrl_query_menu(qmenu, &qctrl, NULL);
  572. }
  573. static int saa6752hs_init(struct v4l2_subdev *sd, u32 leading_null_bytes)
  574. {
  575. unsigned char buf[9], buf2[4];
  576. struct saa6752hs_state *h = to_state(sd);
  577. struct i2c_client *client = v4l2_get_subdevdata(sd);
  578. unsigned size;
  579. u32 crc;
  580. unsigned char localPAT[256];
  581. unsigned char localPMT[256];
  582. /* Set video format - must be done first as it resets other settings */
  583. set_reg8(client, 0x41, h->video_format);
  584. /* Set number of lines in input signal */
  585. set_reg8(client, 0x40, (h->standard & V4L2_STD_525_60) ? 1 : 0);
  586. /* set bitrate */
  587. saa6752hs_set_bitrate(client, h);
  588. /* Set GOP structure {3, 13} */
  589. set_reg16(client, 0x72, 0x030d);
  590. /* Set minimum Q-scale {4} */
  591. set_reg8(client, 0x82, 0x04);
  592. /* Set maximum Q-scale {12} */
  593. set_reg8(client, 0x83, 0x0c);
  594. /* Set Output Protocol */
  595. set_reg8(client, 0xd0, 0x81);
  596. /* Set video output stream format {TS} */
  597. set_reg8(client, 0xb0, 0x05);
  598. /* Set leading null byte for TS */
  599. set_reg16(client, 0xf6, leading_null_bytes);
  600. /* compute PAT */
  601. memcpy(localPAT, PAT, sizeof(PAT));
  602. localPAT[17] = 0xe0 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
  603. localPAT[18] = h->params.ts_pid_pmt & 0xff;
  604. crc = crc32_be(~0, &localPAT[7], sizeof(PAT) - 7 - 4);
  605. localPAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF;
  606. localPAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF;
  607. localPAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF;
  608. localPAT[sizeof(PAT) - 1] = crc & 0xFF;
  609. /* compute PMT */
  610. if (h->params.au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3) {
  611. size = sizeof(PMT_AC3);
  612. memcpy(localPMT, PMT_AC3, size);
  613. } else {
  614. size = sizeof(PMT);
  615. memcpy(localPMT, PMT, size);
  616. }
  617. localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
  618. localPMT[4] = h->params.ts_pid_pmt & 0xff;
  619. localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);
  620. localPMT[16] = h->params.ts_pid_pcr & 0xFF;
  621. localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F);
  622. localPMT[21] = h->params.ts_pid_video & 0xFF;
  623. localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F);
  624. localPMT[26] = h->params.ts_pid_audio & 0xFF;
  625. crc = crc32_be(~0, &localPMT[7], size - 7 - 4);
  626. localPMT[size - 4] = (crc >> 24) & 0xFF;
  627. localPMT[size - 3] = (crc >> 16) & 0xFF;
  628. localPMT[size - 2] = (crc >> 8) & 0xFF;
  629. localPMT[size - 1] = crc & 0xFF;
  630. /* Set Audio PID */
  631. set_reg16(client, 0xc1, h->params.ts_pid_audio);
  632. /* Set Video PID */
  633. set_reg16(client, 0xc0, h->params.ts_pid_video);
  634. /* Set PCR PID */
  635. set_reg16(client, 0xc4, h->params.ts_pid_pcr);
  636. /* Send SI tables */
  637. i2c_master_send(client, localPAT, sizeof(PAT));
  638. i2c_master_send(client, localPMT, size);
  639. /* mute then unmute audio. This removes buzzing artefacts */
  640. set_reg8(client, 0xa4, 1);
  641. set_reg8(client, 0xa4, 0);
  642. /* start it going */
  643. saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
  644. /* readout current state */
  645. buf[0] = 0xE1;
  646. buf[1] = 0xA7;
  647. buf[2] = 0xFE;
  648. buf[3] = 0x82;
  649. buf[4] = 0xB0;
  650. i2c_master_send(client, buf, 5);
  651. i2c_master_recv(client, buf2, 4);
  652. /* change aspect ratio */
  653. buf[0] = 0xE0;
  654. buf[1] = 0xA7;
  655. buf[2] = 0xFE;
  656. buf[3] = 0x82;
  657. buf[4] = 0xB0;
  658. buf[5] = buf2[0];
  659. switch (h->params.vi_aspect) {
  660. case V4L2_MPEG_VIDEO_ASPECT_16x9:
  661. buf[6] = buf2[1] | 0x40;
  662. break;
  663. case V4L2_MPEG_VIDEO_ASPECT_4x3:
  664. default:
  665. buf[6] = buf2[1] & 0xBF;
  666. break;
  667. }
  668. buf[7] = buf2[2];
  669. buf[8] = buf2[3];
  670. i2c_master_send(client, buf, 9);
  671. return 0;
  672. }
  673. static int saa6752hs_do_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls, int set)
  674. {
  675. struct saa6752hs_state *h = to_state(sd);
  676. struct saa6752hs_mpeg_params params;
  677. int i;
  678. if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
  679. return -EINVAL;
  680. params = h->params;
  681. for (i = 0; i < ctrls->count; i++) {
  682. int err = handle_ctrl(h->has_ac3, &params, ctrls->controls + i, set);
  683. if (err) {
  684. ctrls->error_idx = i;
  685. return err;
  686. }
  687. }
  688. if (set)
  689. h->params = params;
  690. return 0;
  691. }
  692. static int saa6752hs_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
  693. {
  694. return saa6752hs_do_ext_ctrls(sd, ctrls, 1);
  695. }
  696. static int saa6752hs_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
  697. {
  698. return saa6752hs_do_ext_ctrls(sd, ctrls, 0);
  699. }
  700. static int saa6752hs_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
  701. {
  702. struct saa6752hs_state *h = to_state(sd);
  703. int i;
  704. if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
  705. return -EINVAL;
  706. for (i = 0; i < ctrls->count; i++) {
  707. int err = get_ctrl(h->has_ac3, &h->params, ctrls->controls + i);
  708. if (err) {
  709. ctrls->error_idx = i;
  710. return err;
  711. }
  712. }
  713. return 0;
  714. }
  715. static int saa6752hs_g_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
  716. {
  717. struct saa6752hs_state *h = to_state(sd);
  718. if (h->video_format == SAA6752HS_VF_UNKNOWN)
  719. h->video_format = SAA6752HS_VF_D1;
  720. f->width = v4l2_format_table[h->video_format].fmt.pix.width;
  721. f->height = v4l2_format_table[h->video_format].fmt.pix.height;
  722. f->code = V4L2_MBUS_FMT_FIXED;
  723. f->field = V4L2_FIELD_INTERLACED;
  724. f->colorspace = V4L2_COLORSPACE_SMPTE170M;
  725. return 0;
  726. }
  727. static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
  728. {
  729. struct saa6752hs_state *h = to_state(sd);
  730. int dist_352, dist_480, dist_720;
  731. if (f->code != V4L2_MBUS_FMT_FIXED)
  732. return -EINVAL;
  733. /*
  734. FIXME: translate and round width/height into EMPRESS
  735. subsample type:
  736. type | PAL | NTSC
  737. ---------------------------
  738. SIF | 352x288 | 352x240
  739. 1/2 D1 | 352x576 | 352x480
  740. 2/3 D1 | 480x576 | 480x480
  741. D1 | 720x576 | 720x480
  742. */
  743. dist_352 = abs(f->width - 352);
  744. dist_480 = abs(f->width - 480);
  745. dist_720 = abs(f->width - 720);
  746. if (dist_720 < dist_480) {
  747. f->width = 720;
  748. f->height = 576;
  749. h->video_format = SAA6752HS_VF_D1;
  750. } else if (dist_480 < dist_352) {
  751. f->width = 480;
  752. f->height = 576;
  753. h->video_format = SAA6752HS_VF_2_3_D1;
  754. } else {
  755. f->width = 352;
  756. if (abs(f->height - 576) <
  757. abs(f->height - 288)) {
  758. f->height = 576;
  759. h->video_format = SAA6752HS_VF_1_2_D1;
  760. } else {
  761. f->height = 288;
  762. h->video_format = SAA6752HS_VF_SIF;
  763. }
  764. }
  765. f->field = V4L2_FIELD_INTERLACED;
  766. f->colorspace = V4L2_COLORSPACE_SMPTE170M;
  767. return 0;
  768. }
  769. static int saa6752hs_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
  770. {
  771. struct saa6752hs_state *h = to_state(sd);
  772. h->standard = std;
  773. return 0;
  774. }
  775. static int saa6752hs_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
  776. {
  777. struct i2c_client *client = v4l2_get_subdevdata(sd);
  778. struct saa6752hs_state *h = to_state(sd);
  779. return v4l2_chip_ident_i2c_client(client,
  780. chip, h->chip, h->revision);
  781. }
  782. /* ----------------------------------------------------------------------- */
  783. static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
  784. .g_chip_ident = saa6752hs_g_chip_ident,
  785. .init = saa6752hs_init,
  786. .queryctrl = saa6752hs_queryctrl,
  787. .querymenu = saa6752hs_querymenu,
  788. .g_ext_ctrls = saa6752hs_g_ext_ctrls,
  789. .s_ext_ctrls = saa6752hs_s_ext_ctrls,
  790. .try_ext_ctrls = saa6752hs_try_ext_ctrls,
  791. .s_std = saa6752hs_s_std,
  792. };
  793. static const struct v4l2_subdev_video_ops saa6752hs_video_ops = {
  794. .s_mbus_fmt = saa6752hs_s_mbus_fmt,
  795. .g_mbus_fmt = saa6752hs_g_mbus_fmt,
  796. };
  797. static const struct v4l2_subdev_ops saa6752hs_ops = {
  798. .core = &saa6752hs_core_ops,
  799. .video = &saa6752hs_video_ops,
  800. };
  801. static int saa6752hs_probe(struct i2c_client *client,
  802. const struct i2c_device_id *id)
  803. {
  804. struct saa6752hs_state *h = kzalloc(sizeof(*h), GFP_KERNEL);
  805. struct v4l2_subdev *sd;
  806. u8 addr = 0x13;
  807. u8 data[12];
  808. v4l_info(client, "chip found @ 0x%x (%s)\n",
  809. client->addr << 1, client->adapter->name);
  810. if (h == NULL)
  811. return -ENOMEM;
  812. sd = &h->sd;
  813. v4l2_i2c_subdev_init(sd, client, &saa6752hs_ops);
  814. i2c_master_send(client, &addr, 1);
  815. i2c_master_recv(client, data, sizeof(data));
  816. h->chip = V4L2_IDENT_SAA6752HS;
  817. h->revision = (data[8] << 8) | data[9];
  818. h->has_ac3 = 0;
  819. if (h->revision == 0x0206) {
  820. h->chip = V4L2_IDENT_SAA6752HS_AC3;
  821. h->has_ac3 = 1;
  822. v4l_info(client, "support AC-3\n");
  823. }
  824. h->params = param_defaults;
  825. h->standard = 0; /* Assume 625 input lines */
  826. return 0;
  827. }
  828. static int saa6752hs_remove(struct i2c_client *client)
  829. {
  830. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  831. v4l2_device_unregister_subdev(sd);
  832. kfree(to_state(sd));
  833. return 0;
  834. }
  835. static const struct i2c_device_id saa6752hs_id[] = {
  836. { "saa6752hs", 0 },
  837. { }
  838. };
  839. MODULE_DEVICE_TABLE(i2c, saa6752hs_id);
  840. static struct i2c_driver saa6752hs_driver = {
  841. .driver = {
  842. .owner = THIS_MODULE,
  843. .name = "saa6752hs",
  844. },
  845. .probe = saa6752hs_probe,
  846. .remove = saa6752hs_remove,
  847. .id_table = saa6752hs_id,
  848. };
  849. module_i2c_driver(saa6752hs_driver);
  850. /*
  851. * Overrides for Emacs so that we follow Linus's tabbing style.
  852. * ---------------------------------------------------------------------------
  853. * Local variables:
  854. * c-basic-offset: 8
  855. * End:
  856. */