cx231xx-417.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * Support for a cx23417 mpeg encoder via cx231xx host port.
  5. *
  6. * (c) 2004 Jelle Foks <[email protected]>
  7. * (c) 2004 Gerd Knorr <[email protected]>
  8. * (c) 2008 Steven Toth <[email protected]>
  9. * - CX23885/7/8 support
  10. *
  11. * Includes parts from the ivtv driver( http://ivtv.sourceforge.net/),
  12. */
  13. #include "cx231xx.h"
  14. #include <linux/module.h>
  15. #include <linux/moduleparam.h>
  16. #include <linux/init.h>
  17. #include <linux/fs.h>
  18. #include <linux/delay.h>
  19. #include <linux/device.h>
  20. #include <linux/firmware.h>
  21. #include <linux/slab.h>
  22. #include <linux/vmalloc.h>
  23. #include <media/v4l2-common.h>
  24. #include <media/v4l2-ioctl.h>
  25. #include <media/v4l2-event.h>
  26. #include <media/drv-intf/cx2341x.h>
  27. #include <media/tuner.h>
  28. #define CX231xx_FIRM_IMAGE_SIZE 376836
  29. #define CX231xx_FIRM_IMAGE_NAME "v4l-cx23885-enc.fw"
  30. /* for polaris ITVC */
  31. #define ITVC_WRITE_DIR 0x03FDFC00
  32. #define ITVC_READ_DIR 0x0001FC00
  33. #define MCI_MEMORY_DATA_BYTE0 0x00
  34. #define MCI_MEMORY_DATA_BYTE1 0x08
  35. #define MCI_MEMORY_DATA_BYTE2 0x10
  36. #define MCI_MEMORY_DATA_BYTE3 0x18
  37. #define MCI_MEMORY_ADDRESS_BYTE2 0x20
  38. #define MCI_MEMORY_ADDRESS_BYTE1 0x28
  39. #define MCI_MEMORY_ADDRESS_BYTE0 0x30
  40. #define MCI_REGISTER_DATA_BYTE0 0x40
  41. #define MCI_REGISTER_DATA_BYTE1 0x48
  42. #define MCI_REGISTER_DATA_BYTE2 0x50
  43. #define MCI_REGISTER_DATA_BYTE3 0x58
  44. #define MCI_REGISTER_ADDRESS_BYTE0 0x60
  45. #define MCI_REGISTER_ADDRESS_BYTE1 0x68
  46. #define MCI_REGISTER_MODE 0x70
  47. /* Read and write modes for polaris ITVC */
  48. #define MCI_MODE_REGISTER_READ 0x000
  49. #define MCI_MODE_REGISTER_WRITE 0x100
  50. #define MCI_MODE_MEMORY_READ 0x000
  51. #define MCI_MODE_MEMORY_WRITE 0x4000
  52. static unsigned int mpeglines = 128;
  53. module_param(mpeglines, int, 0644);
  54. MODULE_PARM_DESC(mpeglines, "number of lines in an MPEG buffer, range 2-32");
  55. static unsigned int mpeglinesize = 512;
  56. module_param(mpeglinesize, int, 0644);
  57. MODULE_PARM_DESC(mpeglinesize,
  58. "number of bytes in each line of an MPEG buffer, range 512-1024");
  59. static unsigned int v4l_debug = 1;
  60. module_param(v4l_debug, int, 0644);
  61. MODULE_PARM_DESC(v4l_debug, "enable V4L debug messages");
  62. #define dprintk(level, fmt, arg...) \
  63. do { \
  64. if (v4l_debug >= level) \
  65. printk(KERN_DEBUG pr_fmt(fmt), ## arg); \
  66. } while (0)
  67. static struct cx231xx_tvnorm cx231xx_tvnorms[] = {
  68. {
  69. .name = "NTSC-M",
  70. .id = V4L2_STD_NTSC_M,
  71. }, {
  72. .name = "NTSC-JP",
  73. .id = V4L2_STD_NTSC_M_JP,
  74. }, {
  75. .name = "PAL-BG",
  76. .id = V4L2_STD_PAL_BG,
  77. }, {
  78. .name = "PAL-DK",
  79. .id = V4L2_STD_PAL_DK,
  80. }, {
  81. .name = "PAL-I",
  82. .id = V4L2_STD_PAL_I,
  83. }, {
  84. .name = "PAL-M",
  85. .id = V4L2_STD_PAL_M,
  86. }, {
  87. .name = "PAL-N",
  88. .id = V4L2_STD_PAL_N,
  89. }, {
  90. .name = "PAL-Nc",
  91. .id = V4L2_STD_PAL_Nc,
  92. }, {
  93. .name = "PAL-60",
  94. .id = V4L2_STD_PAL_60,
  95. }, {
  96. .name = "SECAM-L",
  97. .id = V4L2_STD_SECAM_L,
  98. }, {
  99. .name = "SECAM-DK",
  100. .id = V4L2_STD_SECAM_DK,
  101. }
  102. };
  103. /* ------------------------------------------------------------------ */
  104. enum cx231xx_capture_type {
  105. CX231xx_MPEG_CAPTURE,
  106. CX231xx_RAW_CAPTURE,
  107. CX231xx_RAW_PASSTHRU_CAPTURE
  108. };
  109. enum cx231xx_capture_bits {
  110. CX231xx_RAW_BITS_NONE = 0x00,
  111. CX231xx_RAW_BITS_YUV_CAPTURE = 0x01,
  112. CX231xx_RAW_BITS_PCM_CAPTURE = 0x02,
  113. CX231xx_RAW_BITS_VBI_CAPTURE = 0x04,
  114. CX231xx_RAW_BITS_PASSTHRU_CAPTURE = 0x08,
  115. CX231xx_RAW_BITS_TO_HOST_CAPTURE = 0x10
  116. };
  117. enum cx231xx_capture_end {
  118. CX231xx_END_AT_GOP, /* stop at the end of gop, generate irq */
  119. CX231xx_END_NOW, /* stop immediately, no irq */
  120. };
  121. enum cx231xx_framerate {
  122. CX231xx_FRAMERATE_NTSC_30, /* NTSC: 30fps */
  123. CX231xx_FRAMERATE_PAL_25 /* PAL: 25fps */
  124. };
  125. enum cx231xx_stream_port {
  126. CX231xx_OUTPUT_PORT_MEMORY,
  127. CX231xx_OUTPUT_PORT_STREAMING,
  128. CX231xx_OUTPUT_PORT_SERIAL
  129. };
  130. enum cx231xx_data_xfer_status {
  131. CX231xx_MORE_BUFFERS_FOLLOW,
  132. CX231xx_LAST_BUFFER,
  133. };
  134. enum cx231xx_picture_mask {
  135. CX231xx_PICTURE_MASK_NONE,
  136. CX231xx_PICTURE_MASK_I_FRAMES,
  137. CX231xx_PICTURE_MASK_I_P_FRAMES = 0x3,
  138. CX231xx_PICTURE_MASK_ALL_FRAMES = 0x7,
  139. };
  140. enum cx231xx_vbi_mode_bits {
  141. CX231xx_VBI_BITS_SLICED,
  142. CX231xx_VBI_BITS_RAW,
  143. };
  144. enum cx231xx_vbi_insertion_bits {
  145. CX231xx_VBI_BITS_INSERT_IN_XTENSION_USR_DATA,
  146. CX231xx_VBI_BITS_INSERT_IN_PRIVATE_PACKETS = 0x1 << 1,
  147. CX231xx_VBI_BITS_SEPARATE_STREAM = 0x2 << 1,
  148. CX231xx_VBI_BITS_SEPARATE_STREAM_USR_DATA = 0x4 << 1,
  149. CX231xx_VBI_BITS_SEPARATE_STREAM_PRV_DATA = 0x5 << 1,
  150. };
  151. enum cx231xx_dma_unit {
  152. CX231xx_DMA_BYTES,
  153. CX231xx_DMA_FRAMES,
  154. };
  155. enum cx231xx_dma_transfer_status_bits {
  156. CX231xx_DMA_TRANSFER_BITS_DONE = 0x01,
  157. CX231xx_DMA_TRANSFER_BITS_ERROR = 0x04,
  158. CX231xx_DMA_TRANSFER_BITS_LL_ERROR = 0x10,
  159. };
  160. enum cx231xx_pause {
  161. CX231xx_PAUSE_ENCODING,
  162. CX231xx_RESUME_ENCODING,
  163. };
  164. enum cx231xx_copyright {
  165. CX231xx_COPYRIGHT_OFF,
  166. CX231xx_COPYRIGHT_ON,
  167. };
  168. enum cx231xx_notification_type {
  169. CX231xx_NOTIFICATION_REFRESH,
  170. };
  171. enum cx231xx_notification_status {
  172. CX231xx_NOTIFICATION_OFF,
  173. CX231xx_NOTIFICATION_ON,
  174. };
  175. enum cx231xx_notification_mailbox {
  176. CX231xx_NOTIFICATION_NO_MAILBOX = -1,
  177. };
  178. enum cx231xx_field1_lines {
  179. CX231xx_FIELD1_SAA7114 = 0x00EF, /* 239 */
  180. CX231xx_FIELD1_SAA7115 = 0x00F0, /* 240 */
  181. CX231xx_FIELD1_MICRONAS = 0x0105, /* 261 */
  182. };
  183. enum cx231xx_field2_lines {
  184. CX231xx_FIELD2_SAA7114 = 0x00EF, /* 239 */
  185. CX231xx_FIELD2_SAA7115 = 0x00F0, /* 240 */
  186. CX231xx_FIELD2_MICRONAS = 0x0106, /* 262 */
  187. };
  188. enum cx231xx_custom_data_type {
  189. CX231xx_CUSTOM_EXTENSION_USR_DATA,
  190. CX231xx_CUSTOM_PRIVATE_PACKET,
  191. };
  192. enum cx231xx_mute {
  193. CX231xx_UNMUTE,
  194. CX231xx_MUTE,
  195. };
  196. enum cx231xx_mute_video_mask {
  197. CX231xx_MUTE_VIDEO_V_MASK = 0x0000FF00,
  198. CX231xx_MUTE_VIDEO_U_MASK = 0x00FF0000,
  199. CX231xx_MUTE_VIDEO_Y_MASK = 0xFF000000,
  200. };
  201. enum cx231xx_mute_video_shift {
  202. CX231xx_MUTE_VIDEO_V_SHIFT = 8,
  203. CX231xx_MUTE_VIDEO_U_SHIFT = 16,
  204. CX231xx_MUTE_VIDEO_Y_SHIFT = 24,
  205. };
  206. /* defines below are from ivtv-driver.h */
  207. #define IVTV_CMD_HW_BLOCKS_RST 0xFFFFFFFF
  208. /* Firmware API commands */
  209. #define IVTV_API_STD_TIMEOUT 500
  210. /* Registers */
  211. /* IVTV_REG_OFFSET */
  212. #define IVTV_REG_ENC_SDRAM_REFRESH (0x07F8)
  213. #define IVTV_REG_ENC_SDRAM_PRECHARGE (0x07FC)
  214. #define IVTV_REG_SPU (0x9050)
  215. #define IVTV_REG_HW_BLOCKS (0x9054)
  216. #define IVTV_REG_VPU (0x9058)
  217. #define IVTV_REG_APU (0xA064)
  218. /*
  219. * Bit definitions for MC417_RWD and MC417_OEN registers
  220. *
  221. * bits 31-16
  222. *+-----------+
  223. *| Reserved |
  224. *|+-----------+
  225. *| bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8
  226. *|+-------+-------+-------+-------+-------+-------+-------+-------+
  227. *|| MIWR# | MIRD# | MICS# |MIRDY# |MIADDR3|MIADDR2|MIADDR1|MIADDR0|
  228. *|+-------+-------+-------+-------+-------+-------+-------+-------+
  229. *| bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
  230. *|+-------+-------+-------+-------+-------+-------+-------+-------+
  231. *||MIDATA7|MIDATA6|MIDATA5|MIDATA4|MIDATA3|MIDATA2|MIDATA1|MIDATA0|
  232. *|+-------+-------+-------+-------+-------+-------+-------+-------+
  233. */
  234. #define MC417_MIWR 0x8000
  235. #define MC417_MIRD 0x4000
  236. #define MC417_MICS 0x2000
  237. #define MC417_MIRDY 0x1000
  238. #define MC417_MIADDR 0x0F00
  239. #define MC417_MIDATA 0x00FF
  240. /* Bit definitions for MC417_CTL register ****
  241. *bits 31-6 bits 5-4 bit 3 bits 2-1 Bit 0
  242. *+--------+-------------+--------+--------------+------------+
  243. *|Reserved|MC417_SPD_CTL|Reserved|MC417_GPIO_SEL|UART_GPIO_EN|
  244. *+--------+-------------+--------+--------------+------------+
  245. */
  246. #define MC417_SPD_CTL(x) (((x) << 4) & 0x00000030)
  247. #define MC417_GPIO_SEL(x) (((x) << 1) & 0x00000006)
  248. #define MC417_UART_GPIO_EN 0x00000001
  249. /* Values for speed control */
  250. #define MC417_SPD_CTL_SLOW 0x1
  251. #define MC417_SPD_CTL_MEDIUM 0x0
  252. #define MC417_SPD_CTL_FAST 0x3 /* b'1x, but we use b'11 */
  253. /* Values for GPIO select */
  254. #define MC417_GPIO_SEL_GPIO3 0x3
  255. #define MC417_GPIO_SEL_GPIO2 0x2
  256. #define MC417_GPIO_SEL_GPIO1 0x1
  257. #define MC417_GPIO_SEL_GPIO0 0x0
  258. #define CX23417_GPIO_MASK 0xFC0003FF
  259. static int set_itvc_reg(struct cx231xx *dev, u32 gpio_direction, u32 value)
  260. {
  261. int status = 0;
  262. u32 _gpio_direction = 0;
  263. _gpio_direction = _gpio_direction & CX23417_GPIO_MASK;
  264. _gpio_direction = _gpio_direction | gpio_direction;
  265. status = cx231xx_send_gpio_cmd(dev, _gpio_direction,
  266. (u8 *)&value, 4, 0, 0);
  267. return status;
  268. }
  269. static int get_itvc_reg(struct cx231xx *dev, u32 gpio_direction, u32 *val_ptr)
  270. {
  271. int status = 0;
  272. u32 _gpio_direction = 0;
  273. _gpio_direction = _gpio_direction & CX23417_GPIO_MASK;
  274. _gpio_direction = _gpio_direction | gpio_direction;
  275. status = cx231xx_send_gpio_cmd(dev, _gpio_direction,
  276. (u8 *)val_ptr, 4, 0, 1);
  277. return status;
  278. }
  279. static int wait_for_mci_complete(struct cx231xx *dev)
  280. {
  281. u32 gpio;
  282. u32 gpio_direction = 0;
  283. u8 count = 0;
  284. get_itvc_reg(dev, gpio_direction, &gpio);
  285. while (!(gpio&0x020000)) {
  286. msleep(10);
  287. get_itvc_reg(dev, gpio_direction, &gpio);
  288. if (count++ > 100) {
  289. dprintk(3, "ERROR: Timeout - gpio=%x\n", gpio);
  290. return -EIO;
  291. }
  292. }
  293. return 0;
  294. }
  295. static int mc417_register_write(struct cx231xx *dev, u16 address, u32 value)
  296. {
  297. u32 temp;
  298. int status = 0;
  299. temp = 0x82 | MCI_REGISTER_DATA_BYTE0 | ((value & 0x000000FF) << 8);
  300. temp = temp << 10;
  301. status = set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  302. if (status < 0)
  303. return status;
  304. temp = temp | (0x05 << 10);
  305. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  306. /*write data byte 1;*/
  307. temp = 0x82 | MCI_REGISTER_DATA_BYTE1 | (value & 0x0000FF00);
  308. temp = temp << 10;
  309. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  310. temp = temp | (0x05 << 10);
  311. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  312. /*write data byte 2;*/
  313. temp = 0x82 | MCI_REGISTER_DATA_BYTE2 | ((value & 0x00FF0000) >> 8);
  314. temp = temp << 10;
  315. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  316. temp = temp | (0x05 << 10);
  317. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  318. /*write data byte 3;*/
  319. temp = 0x82 | MCI_REGISTER_DATA_BYTE3 | ((value & 0xFF000000) >> 16);
  320. temp = temp << 10;
  321. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  322. temp = temp | (0x05 << 10);
  323. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  324. /*write address byte 0;*/
  325. temp = 0x82 | MCI_REGISTER_ADDRESS_BYTE0 | ((address & 0x000000FF) << 8);
  326. temp = temp << 10;
  327. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  328. temp = temp | (0x05 << 10);
  329. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  330. /*write address byte 1;*/
  331. temp = 0x82 | MCI_REGISTER_ADDRESS_BYTE1 | (address & 0x0000FF00);
  332. temp = temp << 10;
  333. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  334. temp = temp | (0x05 << 10);
  335. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  336. /*Write that the mode is write.*/
  337. temp = 0x82 | MCI_REGISTER_MODE | MCI_MODE_REGISTER_WRITE;
  338. temp = temp << 10;
  339. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  340. temp = temp | (0x05 << 10);
  341. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  342. return wait_for_mci_complete(dev);
  343. }
  344. static int mc417_register_read(struct cx231xx *dev, u16 address, u32 *value)
  345. {
  346. /*write address byte 0;*/
  347. u32 temp;
  348. u32 return_value = 0;
  349. int ret = 0;
  350. temp = 0x82 | MCI_REGISTER_ADDRESS_BYTE0 | ((address & 0x00FF) << 8);
  351. temp = temp << 10;
  352. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  353. temp = temp | ((0x05) << 10);
  354. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  355. /*write address byte 1;*/
  356. temp = 0x82 | MCI_REGISTER_ADDRESS_BYTE1 | (address & 0xFF00);
  357. temp = temp << 10;
  358. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  359. temp = temp | ((0x05) << 10);
  360. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  361. /*write that the mode is read;*/
  362. temp = 0x82 | MCI_REGISTER_MODE | MCI_MODE_REGISTER_READ;
  363. temp = temp << 10;
  364. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  365. temp = temp | ((0x05) << 10);
  366. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  367. /*wait for the MIRDY line to be asserted ,
  368. signalling that the read is done;*/
  369. ret = wait_for_mci_complete(dev);
  370. /*switch the DATA- GPIO to input mode;*/
  371. /*Read data byte 0;*/
  372. temp = (0x82 | MCI_REGISTER_DATA_BYTE0) << 10;
  373. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  374. temp = ((0x81 | MCI_REGISTER_DATA_BYTE0) << 10);
  375. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  376. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  377. return_value |= ((temp & 0x03FC0000) >> 18);
  378. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  379. /* Read data byte 1;*/
  380. temp = (0x82 | MCI_REGISTER_DATA_BYTE1) << 10;
  381. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  382. temp = ((0x81 | MCI_REGISTER_DATA_BYTE1) << 10);
  383. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  384. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  385. return_value |= ((temp & 0x03FC0000) >> 10);
  386. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  387. /*Read data byte 2;*/
  388. temp = (0x82 | MCI_REGISTER_DATA_BYTE2) << 10;
  389. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  390. temp = ((0x81 | MCI_REGISTER_DATA_BYTE2) << 10);
  391. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  392. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  393. return_value |= ((temp & 0x03FC0000) >> 2);
  394. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  395. /*Read data byte 3;*/
  396. temp = (0x82 | MCI_REGISTER_DATA_BYTE3) << 10;
  397. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  398. temp = ((0x81 | MCI_REGISTER_DATA_BYTE3) << 10);
  399. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  400. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  401. return_value |= ((temp & 0x03FC0000) << 6);
  402. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  403. *value = return_value;
  404. return ret;
  405. }
  406. static int mc417_memory_write(struct cx231xx *dev, u32 address, u32 value)
  407. {
  408. /*write data byte 0;*/
  409. u32 temp;
  410. int ret = 0;
  411. temp = 0x82 | MCI_MEMORY_DATA_BYTE0 | ((value & 0x000000FF) << 8);
  412. temp = temp << 10;
  413. ret = set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  414. if (ret < 0)
  415. return ret;
  416. temp = temp | (0x05 << 10);
  417. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  418. /*write data byte 1;*/
  419. temp = 0x82 | MCI_MEMORY_DATA_BYTE1 | (value & 0x0000FF00);
  420. temp = temp << 10;
  421. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  422. temp = temp | (0x05 << 10);
  423. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  424. /*write data byte 2;*/
  425. temp = 0x82 | MCI_MEMORY_DATA_BYTE2 | ((value & 0x00FF0000) >> 8);
  426. temp = temp << 10;
  427. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  428. temp = temp | (0x05 << 10);
  429. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  430. /*write data byte 3;*/
  431. temp = 0x82 | MCI_MEMORY_DATA_BYTE3 | ((value & 0xFF000000) >> 16);
  432. temp = temp << 10;
  433. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  434. temp = temp | (0x05 << 10);
  435. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  436. /* write address byte 2;*/
  437. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_WRITE |
  438. ((address & 0x003F0000) >> 8);
  439. temp = temp << 10;
  440. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  441. temp = temp | (0x05 << 10);
  442. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  443. /* write address byte 1;*/
  444. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
  445. temp = temp << 10;
  446. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  447. temp = temp | (0x05 << 10);
  448. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  449. /* write address byte 0;*/
  450. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE0 | ((address & 0x00FF) << 8);
  451. temp = temp << 10;
  452. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  453. temp = temp | (0x05 << 10);
  454. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  455. /*wait for MIRDY line;*/
  456. wait_for_mci_complete(dev);
  457. return 0;
  458. }
  459. static int mc417_memory_read(struct cx231xx *dev, u32 address, u32 *value)
  460. {
  461. u32 temp = 0;
  462. u32 return_value = 0;
  463. int ret = 0;
  464. /*write address byte 2;*/
  465. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_READ |
  466. ((address & 0x003F0000) >> 8);
  467. temp = temp << 10;
  468. ret = set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  469. if (ret < 0)
  470. return ret;
  471. temp = temp | (0x05 << 10);
  472. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  473. /*write address byte 1*/
  474. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
  475. temp = temp << 10;
  476. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  477. temp = temp | (0x05 << 10);
  478. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  479. /*write address byte 0*/
  480. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE0 | ((address & 0x00FF) << 8);
  481. temp = temp << 10;
  482. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  483. temp = temp | (0x05 << 10);
  484. set_itvc_reg(dev, ITVC_WRITE_DIR, temp);
  485. /*Wait for MIRDY line*/
  486. ret = wait_for_mci_complete(dev);
  487. /*Read data byte 3;*/
  488. temp = (0x82 | MCI_MEMORY_DATA_BYTE3) << 10;
  489. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  490. temp = ((0x81 | MCI_MEMORY_DATA_BYTE3) << 10);
  491. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  492. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  493. return_value |= ((temp & 0x03FC0000) << 6);
  494. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  495. /*Read data byte 2;*/
  496. temp = (0x82 | MCI_MEMORY_DATA_BYTE2) << 10;
  497. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  498. temp = ((0x81 | MCI_MEMORY_DATA_BYTE2) << 10);
  499. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  500. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  501. return_value |= ((temp & 0x03FC0000) >> 2);
  502. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  503. /* Read data byte 1;*/
  504. temp = (0x82 | MCI_MEMORY_DATA_BYTE1) << 10;
  505. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  506. temp = ((0x81 | MCI_MEMORY_DATA_BYTE1) << 10);
  507. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  508. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  509. return_value |= ((temp & 0x03FC0000) >> 10);
  510. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  511. /*Read data byte 0;*/
  512. temp = (0x82 | MCI_MEMORY_DATA_BYTE0) << 10;
  513. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  514. temp = ((0x81 | MCI_MEMORY_DATA_BYTE0) << 10);
  515. set_itvc_reg(dev, ITVC_READ_DIR, temp);
  516. get_itvc_reg(dev, ITVC_READ_DIR, &temp);
  517. return_value |= ((temp & 0x03FC0000) >> 18);
  518. set_itvc_reg(dev, ITVC_READ_DIR, (0x87 << 10));
  519. *value = return_value;
  520. return ret;
  521. }
  522. /* ------------------------------------------------------------------ */
  523. /* MPEG encoder API */
  524. static char *cmd_to_str(int cmd)
  525. {
  526. switch (cmd) {
  527. case CX2341X_ENC_PING_FW:
  528. return "PING_FW";
  529. case CX2341X_ENC_START_CAPTURE:
  530. return "START_CAPTURE";
  531. case CX2341X_ENC_STOP_CAPTURE:
  532. return "STOP_CAPTURE";
  533. case CX2341X_ENC_SET_AUDIO_ID:
  534. return "SET_AUDIO_ID";
  535. case CX2341X_ENC_SET_VIDEO_ID:
  536. return "SET_VIDEO_ID";
  537. case CX2341X_ENC_SET_PCR_ID:
  538. return "SET_PCR_PID";
  539. case CX2341X_ENC_SET_FRAME_RATE:
  540. return "SET_FRAME_RATE";
  541. case CX2341X_ENC_SET_FRAME_SIZE:
  542. return "SET_FRAME_SIZE";
  543. case CX2341X_ENC_SET_BIT_RATE:
  544. return "SET_BIT_RATE";
  545. case CX2341X_ENC_SET_GOP_PROPERTIES:
  546. return "SET_GOP_PROPERTIES";
  547. case CX2341X_ENC_SET_ASPECT_RATIO:
  548. return "SET_ASPECT_RATIO";
  549. case CX2341X_ENC_SET_DNR_FILTER_MODE:
  550. return "SET_DNR_FILTER_PROPS";
  551. case CX2341X_ENC_SET_DNR_FILTER_PROPS:
  552. return "SET_DNR_FILTER_PROPS";
  553. case CX2341X_ENC_SET_CORING_LEVELS:
  554. return "SET_CORING_LEVELS";
  555. case CX2341X_ENC_SET_SPATIAL_FILTER_TYPE:
  556. return "SET_SPATIAL_FILTER_TYPE";
  557. case CX2341X_ENC_SET_VBI_LINE:
  558. return "SET_VBI_LINE";
  559. case CX2341X_ENC_SET_STREAM_TYPE:
  560. return "SET_STREAM_TYPE";
  561. case CX2341X_ENC_SET_OUTPUT_PORT:
  562. return "SET_OUTPUT_PORT";
  563. case CX2341X_ENC_SET_AUDIO_PROPERTIES:
  564. return "SET_AUDIO_PROPERTIES";
  565. case CX2341X_ENC_HALT_FW:
  566. return "HALT_FW";
  567. case CX2341X_ENC_GET_VERSION:
  568. return "GET_VERSION";
  569. case CX2341X_ENC_SET_GOP_CLOSURE:
  570. return "SET_GOP_CLOSURE";
  571. case CX2341X_ENC_GET_SEQ_END:
  572. return "GET_SEQ_END";
  573. case CX2341X_ENC_SET_PGM_INDEX_INFO:
  574. return "SET_PGM_INDEX_INFO";
  575. case CX2341X_ENC_SET_VBI_CONFIG:
  576. return "SET_VBI_CONFIG";
  577. case CX2341X_ENC_SET_DMA_BLOCK_SIZE:
  578. return "SET_DMA_BLOCK_SIZE";
  579. case CX2341X_ENC_GET_PREV_DMA_INFO_MB_10:
  580. return "GET_PREV_DMA_INFO_MB_10";
  581. case CX2341X_ENC_GET_PREV_DMA_INFO_MB_9:
  582. return "GET_PREV_DMA_INFO_MB_9";
  583. case CX2341X_ENC_SCHED_DMA_TO_HOST:
  584. return "SCHED_DMA_TO_HOST";
  585. case CX2341X_ENC_INITIALIZE_INPUT:
  586. return "INITIALIZE_INPUT";
  587. case CX2341X_ENC_SET_FRAME_DROP_RATE:
  588. return "SET_FRAME_DROP_RATE";
  589. case CX2341X_ENC_PAUSE_ENCODER:
  590. return "PAUSE_ENCODER";
  591. case CX2341X_ENC_REFRESH_INPUT:
  592. return "REFRESH_INPUT";
  593. case CX2341X_ENC_SET_COPYRIGHT:
  594. return "SET_COPYRIGHT";
  595. case CX2341X_ENC_SET_EVENT_NOTIFICATION:
  596. return "SET_EVENT_NOTIFICATION";
  597. case CX2341X_ENC_SET_NUM_VSYNC_LINES:
  598. return "SET_NUM_VSYNC_LINES";
  599. case CX2341X_ENC_SET_PLACEHOLDER:
  600. return "SET_PLACEHOLDER";
  601. case CX2341X_ENC_MUTE_VIDEO:
  602. return "MUTE_VIDEO";
  603. case CX2341X_ENC_MUTE_AUDIO:
  604. return "MUTE_AUDIO";
  605. case CX2341X_ENC_MISC:
  606. return "MISC";
  607. default:
  608. return "UNKNOWN";
  609. }
  610. }
  611. static int cx231xx_mbox_func(void *priv, u32 command, int in, int out,
  612. u32 data[CX2341X_MBOX_MAX_DATA])
  613. {
  614. struct cx231xx *dev = priv;
  615. unsigned long timeout;
  616. u32 value, flag, retval = 0;
  617. int i;
  618. dprintk(3, "%s: command(0x%X) = %s\n", __func__, command,
  619. cmd_to_str(command));
  620. /* this may not be 100% safe if we can't read any memory location
  621. without side effects */
  622. mc417_memory_read(dev, dev->cx23417_mailbox - 4, &value);
  623. if (value != 0x12345678) {
  624. dprintk(3, "Firmware and/or mailbox pointer not initialized or corrupted, signature = 0x%x, cmd = %s\n",
  625. value, cmd_to_str(command));
  626. return -EIO;
  627. }
  628. /* This read looks at 32 bits, but flag is only 8 bits.
  629. * Seems we also bail if CMD or TIMEOUT bytes are set???
  630. */
  631. mc417_memory_read(dev, dev->cx23417_mailbox, &flag);
  632. if (flag) {
  633. dprintk(3, "ERROR: Mailbox appears to be in use (%x), cmd = %s\n",
  634. flag, cmd_to_str(command));
  635. return -EBUSY;
  636. }
  637. flag |= 1; /* tell 'em we're working on it */
  638. mc417_memory_write(dev, dev->cx23417_mailbox, flag);
  639. /* write command + args + fill remaining with zeros */
  640. /* command code */
  641. mc417_memory_write(dev, dev->cx23417_mailbox + 1, command);
  642. mc417_memory_write(dev, dev->cx23417_mailbox + 3,
  643. IVTV_API_STD_TIMEOUT); /* timeout */
  644. for (i = 0; i < in; i++) {
  645. mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, data[i]);
  646. dprintk(3, "API Input %d = %d\n", i, data[i]);
  647. }
  648. for (; i < CX2341X_MBOX_MAX_DATA; i++)
  649. mc417_memory_write(dev, dev->cx23417_mailbox + 4 + i, 0);
  650. flag |= 3; /* tell 'em we're done writing */
  651. mc417_memory_write(dev, dev->cx23417_mailbox, flag);
  652. /* wait for firmware to handle the API command */
  653. timeout = jiffies + msecs_to_jiffies(10);
  654. for (;;) {
  655. mc417_memory_read(dev, dev->cx23417_mailbox, &flag);
  656. if (0 != (flag & 4))
  657. break;
  658. if (time_after(jiffies, timeout)) {
  659. dprintk(3, "ERROR: API Mailbox timeout\n");
  660. return -EIO;
  661. }
  662. udelay(10);
  663. }
  664. /* read output values */
  665. for (i = 0; i < out; i++) {
  666. mc417_memory_read(dev, dev->cx23417_mailbox + 4 + i, data + i);
  667. dprintk(3, "API Output %d = %d\n", i, data[i]);
  668. }
  669. mc417_memory_read(dev, dev->cx23417_mailbox + 2, &retval);
  670. dprintk(3, "API result = %d\n", retval);
  671. flag = 0;
  672. mc417_memory_write(dev, dev->cx23417_mailbox, flag);
  673. return 0;
  674. }
  675. /* We don't need to call the API often, so using just one
  676. * mailbox will probably suffice
  677. */
  678. static int cx231xx_api_cmd(struct cx231xx *dev, u32 command,
  679. u32 inputcnt, u32 outputcnt, ...)
  680. {
  681. u32 data[CX2341X_MBOX_MAX_DATA];
  682. va_list vargs;
  683. int i, err;
  684. dprintk(3, "%s() cmds = 0x%08x\n", __func__, command);
  685. va_start(vargs, outputcnt);
  686. for (i = 0; i < inputcnt; i++)
  687. data[i] = va_arg(vargs, int);
  688. err = cx231xx_mbox_func(dev, command, inputcnt, outputcnt, data);
  689. for (i = 0; i < outputcnt; i++) {
  690. int *vptr = va_arg(vargs, int *);
  691. *vptr = data[i];
  692. }
  693. va_end(vargs);
  694. return err;
  695. }
  696. static int cx231xx_find_mailbox(struct cx231xx *dev)
  697. {
  698. u32 signature[4] = {
  699. 0x12345678, 0x34567812, 0x56781234, 0x78123456
  700. };
  701. int signaturecnt = 0;
  702. u32 value;
  703. int i;
  704. int ret = 0;
  705. dprintk(2, "%s()\n", __func__);
  706. for (i = 0; i < 0x100; i++) {/*CX231xx_FIRM_IMAGE_SIZE*/
  707. ret = mc417_memory_read(dev, i, &value);
  708. if (ret < 0)
  709. return ret;
  710. if (value == signature[signaturecnt])
  711. signaturecnt++;
  712. else
  713. signaturecnt = 0;
  714. if (4 == signaturecnt) {
  715. dprintk(1, "Mailbox signature found at 0x%x\n", i + 1);
  716. return i + 1;
  717. }
  718. }
  719. dprintk(3, "Mailbox signature values not found!\n");
  720. return -EIO;
  721. }
  722. static void mci_write_memory_to_gpio(struct cx231xx *dev, u32 address, u32 value,
  723. u32 *p_fw_image)
  724. {
  725. u32 temp = 0;
  726. int i = 0;
  727. temp = 0x82 | MCI_MEMORY_DATA_BYTE0 | ((value & 0x000000FF) << 8);
  728. temp = temp << 10;
  729. *p_fw_image = temp;
  730. p_fw_image++;
  731. temp = temp | (0x05 << 10);
  732. *p_fw_image = temp;
  733. p_fw_image++;
  734. /*write data byte 1;*/
  735. temp = 0x82 | MCI_MEMORY_DATA_BYTE1 | (value & 0x0000FF00);
  736. temp = temp << 10;
  737. *p_fw_image = temp;
  738. p_fw_image++;
  739. temp = temp | (0x05 << 10);
  740. *p_fw_image = temp;
  741. p_fw_image++;
  742. /*write data byte 2;*/
  743. temp = 0x82 | MCI_MEMORY_DATA_BYTE2 | ((value & 0x00FF0000) >> 8);
  744. temp = temp << 10;
  745. *p_fw_image = temp;
  746. p_fw_image++;
  747. temp = temp | (0x05 << 10);
  748. *p_fw_image = temp;
  749. p_fw_image++;
  750. /*write data byte 3;*/
  751. temp = 0x82 | MCI_MEMORY_DATA_BYTE3 | ((value & 0xFF000000) >> 16);
  752. temp = temp << 10;
  753. *p_fw_image = temp;
  754. p_fw_image++;
  755. temp = temp | (0x05 << 10);
  756. *p_fw_image = temp;
  757. p_fw_image++;
  758. /* write address byte 2;*/
  759. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE2 | MCI_MODE_MEMORY_WRITE |
  760. ((address & 0x003F0000) >> 8);
  761. temp = temp << 10;
  762. *p_fw_image = temp;
  763. p_fw_image++;
  764. temp = temp | (0x05 << 10);
  765. *p_fw_image = temp;
  766. p_fw_image++;
  767. /* write address byte 1;*/
  768. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE1 | (address & 0xFF00);
  769. temp = temp << 10;
  770. *p_fw_image = temp;
  771. p_fw_image++;
  772. temp = temp | (0x05 << 10);
  773. *p_fw_image = temp;
  774. p_fw_image++;
  775. /* write address byte 0;*/
  776. temp = 0x82 | MCI_MEMORY_ADDRESS_BYTE0 | ((address & 0x00FF) << 8);
  777. temp = temp << 10;
  778. *p_fw_image = temp;
  779. p_fw_image++;
  780. temp = temp | (0x05 << 10);
  781. *p_fw_image = temp;
  782. p_fw_image++;
  783. for (i = 0; i < 6; i++) {
  784. *p_fw_image = 0xFFFFFFFF;
  785. p_fw_image++;
  786. }
  787. }
  788. static int cx231xx_load_firmware(struct cx231xx *dev)
  789. {
  790. static const unsigned char magic[8] = {
  791. 0xa7, 0x0d, 0x00, 0x00, 0x66, 0xbb, 0x55, 0xaa
  792. };
  793. const struct firmware *firmware;
  794. int i, retval = 0;
  795. u32 value = 0;
  796. u32 gpio_output = 0;
  797. /*u32 checksum = 0;*/
  798. /*u32 *dataptr;*/
  799. u32 transfer_size = 0;
  800. u32 fw_data = 0;
  801. u32 address = 0;
  802. /*u32 current_fw[800];*/
  803. u32 *p_current_fw, *p_fw;
  804. u32 *p_fw_data;
  805. int frame = 0;
  806. u16 _buffer_size = 4096;
  807. u8 *p_buffer;
  808. p_current_fw = vmalloc(1884180 * 4);
  809. p_fw = p_current_fw;
  810. if (p_current_fw == NULL) {
  811. dprintk(2, "FAIL!!!\n");
  812. return -ENOMEM;
  813. }
  814. p_buffer = vmalloc(4096);
  815. if (p_buffer == NULL) {
  816. dprintk(2, "FAIL!!!\n");
  817. vfree(p_current_fw);
  818. return -ENOMEM;
  819. }
  820. dprintk(2, "%s()\n", __func__);
  821. /* Save GPIO settings before reset of APU */
  822. retval |= mc417_memory_read(dev, 0x9020, &gpio_output);
  823. retval |= mc417_memory_read(dev, 0x900C, &value);
  824. retval = mc417_register_write(dev,
  825. IVTV_REG_VPU, 0xFFFFFFED);
  826. retval |= mc417_register_write(dev,
  827. IVTV_REG_HW_BLOCKS, IVTV_CMD_HW_BLOCKS_RST);
  828. retval |= mc417_register_write(dev,
  829. IVTV_REG_ENC_SDRAM_REFRESH, 0x80000800);
  830. retval |= mc417_register_write(dev,
  831. IVTV_REG_ENC_SDRAM_PRECHARGE, 0x1A);
  832. retval |= mc417_register_write(dev,
  833. IVTV_REG_APU, 0);
  834. if (retval != 0) {
  835. dev_err(dev->dev,
  836. "%s: Error with mc417_register_write\n", __func__);
  837. vfree(p_current_fw);
  838. vfree(p_buffer);
  839. return retval;
  840. }
  841. retval = request_firmware(&firmware, CX231xx_FIRM_IMAGE_NAME,
  842. dev->dev);
  843. if (retval != 0) {
  844. dev_err(dev->dev,
  845. "ERROR: Hotplug firmware request failed (%s).\n",
  846. CX231xx_FIRM_IMAGE_NAME);
  847. dev_err(dev->dev,
  848. "Please fix your hotplug setup, the board will not work without firmware loaded!\n");
  849. vfree(p_current_fw);
  850. vfree(p_buffer);
  851. return retval;
  852. }
  853. if (firmware->size != CX231xx_FIRM_IMAGE_SIZE) {
  854. dev_err(dev->dev,
  855. "ERROR: Firmware size mismatch (have %zd, expected %d)\n",
  856. firmware->size, CX231xx_FIRM_IMAGE_SIZE);
  857. release_firmware(firmware);
  858. vfree(p_current_fw);
  859. vfree(p_buffer);
  860. return -EINVAL;
  861. }
  862. if (0 != memcmp(firmware->data, magic, 8)) {
  863. dev_err(dev->dev,
  864. "ERROR: Firmware magic mismatch, wrong file?\n");
  865. release_firmware(firmware);
  866. vfree(p_current_fw);
  867. vfree(p_buffer);
  868. return -EINVAL;
  869. }
  870. initGPIO(dev);
  871. /* transfer to the chip */
  872. dprintk(2, "Loading firmware to GPIO...\n");
  873. p_fw_data = (u32 *)firmware->data;
  874. dprintk(2, "firmware->size=%zd\n", firmware->size);
  875. for (transfer_size = 0; transfer_size < firmware->size;
  876. transfer_size += 4) {
  877. fw_data = *p_fw_data;
  878. mci_write_memory_to_gpio(dev, address, fw_data, p_current_fw);
  879. address = address + 1;
  880. p_current_fw += 20;
  881. p_fw_data += 1;
  882. }
  883. /*download the firmware by ep5-out*/
  884. for (frame = 0; frame < (int)(CX231xx_FIRM_IMAGE_SIZE*20/_buffer_size);
  885. frame++) {
  886. for (i = 0; i < _buffer_size; i++) {
  887. *(p_buffer + i) = (u8)(*(p_fw + (frame * 128 * 8 + (i / 4))) & 0x000000FF);
  888. i++;
  889. *(p_buffer + i) = (u8)((*(p_fw + (frame * 128 * 8 + (i / 4))) & 0x0000FF00) >> 8);
  890. i++;
  891. *(p_buffer + i) = (u8)((*(p_fw + (frame * 128 * 8 + (i / 4))) & 0x00FF0000) >> 16);
  892. i++;
  893. *(p_buffer + i) = (u8)((*(p_fw + (frame * 128 * 8 + (i / 4))) & 0xFF000000) >> 24);
  894. }
  895. cx231xx_ep5_bulkout(dev, p_buffer, _buffer_size);
  896. }
  897. p_current_fw = p_fw;
  898. vfree(p_current_fw);
  899. p_current_fw = NULL;
  900. vfree(p_buffer);
  901. uninitGPIO(dev);
  902. release_firmware(firmware);
  903. dprintk(1, "Firmware upload successful.\n");
  904. retval |= mc417_register_write(dev, IVTV_REG_HW_BLOCKS,
  905. IVTV_CMD_HW_BLOCKS_RST);
  906. if (retval < 0) {
  907. dev_err(dev->dev,
  908. "%s: Error with mc417_register_write\n",
  909. __func__);
  910. return retval;
  911. }
  912. /* F/W power up disturbs the GPIOs, restore state */
  913. retval |= mc417_register_write(dev, 0x9020, gpio_output);
  914. retval |= mc417_register_write(dev, 0x900C, value);
  915. retval |= mc417_register_read(dev, IVTV_REG_VPU, &value);
  916. retval |= mc417_register_write(dev, IVTV_REG_VPU, value & 0xFFFFFFE8);
  917. if (retval < 0) {
  918. dev_err(dev->dev,
  919. "%s: Error with mc417_register_write\n",
  920. __func__);
  921. return retval;
  922. }
  923. return 0;
  924. }
  925. static void cx231xx_codec_settings(struct cx231xx *dev)
  926. {
  927. dprintk(1, "%s()\n", __func__);
  928. /* assign frame size */
  929. cx231xx_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0,
  930. dev->ts1.height, dev->ts1.width);
  931. dev->mpeg_ctrl_handler.width = dev->ts1.width;
  932. dev->mpeg_ctrl_handler.height = dev->ts1.height;
  933. cx2341x_handler_setup(&dev->mpeg_ctrl_handler);
  934. cx231xx_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 3, 1);
  935. cx231xx_api_cmd(dev, CX2341X_ENC_MISC, 2, 0, 4, 1);
  936. }
  937. static int cx231xx_initialize_codec(struct cx231xx *dev)
  938. {
  939. int version;
  940. int retval;
  941. u32 i;
  942. u32 val = 0;
  943. dprintk(1, "%s()\n", __func__);
  944. cx231xx_disable656(dev);
  945. retval = cx231xx_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */
  946. if (retval < 0) {
  947. dprintk(2, "%s: PING OK\n", __func__);
  948. retval = cx231xx_load_firmware(dev);
  949. if (retval < 0) {
  950. dev_err(dev->dev,
  951. "%s: f/w load failed\n", __func__);
  952. return retval;
  953. }
  954. retval = cx231xx_find_mailbox(dev);
  955. if (retval < 0) {
  956. dev_err(dev->dev, "%s: mailbox < 0, error\n",
  957. __func__);
  958. return retval;
  959. }
  960. dev->cx23417_mailbox = retval;
  961. retval = cx231xx_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0);
  962. if (retval < 0) {
  963. dev_err(dev->dev,
  964. "ERROR: cx23417 firmware ping failed!\n");
  965. return retval;
  966. }
  967. retval = cx231xx_api_cmd(dev, CX2341X_ENC_GET_VERSION, 0, 1,
  968. &version);
  969. if (retval < 0) {
  970. dev_err(dev->dev,
  971. "ERROR: cx23417 firmware get encoder: version failed!\n");
  972. return retval;
  973. }
  974. dprintk(1, "cx23417 firmware version is 0x%08x\n", version);
  975. msleep(200);
  976. }
  977. for (i = 0; i < 1; i++) {
  978. retval = mc417_register_read(dev, 0x20f8, &val);
  979. dprintk(3, "***before enable656() VIM Capture Lines = %d ***\n",
  980. val);
  981. if (retval < 0)
  982. return retval;
  983. }
  984. cx231xx_enable656(dev);
  985. /* stop mpeg capture */
  986. cx231xx_api_cmd(dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, 1, 3, 4);
  987. cx231xx_codec_settings(dev);
  988. msleep(60);
  989. /* cx231xx_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0,
  990. CX231xx_FIELD1_SAA7115, CX231xx_FIELD2_SAA7115);
  991. cx231xx_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0,
  992. CX231xx_CUSTOM_EXTENSION_USR_DATA, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  993. 0, 0);
  994. */
  995. #if 0
  996. /* TODO */
  997. u32 data[7];
  998. /* Setup to capture VBI */
  999. data[0] = 0x0001BD00;
  1000. data[1] = 1; /* frames per interrupt */
  1001. data[2] = 4; /* total bufs */
  1002. data[3] = 0x91559155; /* start codes */
  1003. data[4] = 0x206080C0; /* stop codes */
  1004. data[5] = 6; /* lines */
  1005. data[6] = 64; /* BPL */
  1006. cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_CONFIG, 7, 0, data[0], data[1],
  1007. data[2], data[3], data[4], data[5], data[6]);
  1008. for (i = 2; i <= 24; i++) {
  1009. int valid;
  1010. valid = ((i >= 19) && (i <= 21));
  1011. cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0, i,
  1012. valid, 0 , 0, 0);
  1013. cx231xx_api_cmd(dev, CX2341X_ENC_SET_VBI_LINE, 5, 0,
  1014. i | 0x80000000, valid, 0, 0, 0);
  1015. }
  1016. #endif
  1017. /* cx231xx_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, CX231xx_UNMUTE);
  1018. msleep(60);
  1019. */
  1020. /* initialize the video input */
  1021. retval = cx231xx_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0);
  1022. if (retval < 0)
  1023. return retval;
  1024. msleep(60);
  1025. /* Enable VIP style pixel invalidation so we work with scaled mode */
  1026. mc417_memory_write(dev, 2120, 0x00000080);
  1027. /* start capturing to the host interface */
  1028. retval = cx231xx_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0,
  1029. CX231xx_MPEG_CAPTURE, CX231xx_RAW_BITS_NONE);
  1030. if (retval < 0)
  1031. return retval;
  1032. msleep(10);
  1033. for (i = 0; i < 1; i++) {
  1034. mc417_register_read(dev, 0x20f8, &val);
  1035. dprintk(3, "***VIM Capture Lines =%d ***\n", val);
  1036. }
  1037. return 0;
  1038. }
  1039. /* ------------------------------------------------------------------ */
  1040. static int queue_setup(struct vb2_queue *vq,
  1041. unsigned int *nbuffers, unsigned int *nplanes,
  1042. unsigned int sizes[], struct device *alloc_devs[])
  1043. {
  1044. struct cx231xx *dev = vb2_get_drv_priv(vq);
  1045. unsigned int size = mpeglinesize * mpeglines;
  1046. dev->ts1.ts_packet_size = mpeglinesize;
  1047. dev->ts1.ts_packet_count = mpeglines;
  1048. if (vq->num_buffers + *nbuffers < CX231XX_MIN_BUF)
  1049. *nbuffers = CX231XX_MIN_BUF - vq->num_buffers;
  1050. if (*nplanes)
  1051. return sizes[0] < size ? -EINVAL : 0;
  1052. *nplanes = 1;
  1053. sizes[0] = mpeglinesize * mpeglines;
  1054. return 0;
  1055. }
  1056. static void buffer_copy(struct cx231xx *dev, char *data, int len, struct urb *urb,
  1057. struct cx231xx_dmaqueue *dma_q)
  1058. {
  1059. void *vbuf;
  1060. struct cx231xx_buffer *buf;
  1061. u32 tail_data = 0;
  1062. char *p_data;
  1063. if (dma_q->mpeg_buffer_done == 0) {
  1064. if (list_empty(&dma_q->active))
  1065. return;
  1066. buf = list_entry(dma_q->active.next,
  1067. struct cx231xx_buffer, list);
  1068. dev->video_mode.isoc_ctl.buf = buf;
  1069. dma_q->mpeg_buffer_done = 1;
  1070. }
  1071. /* Fill buffer */
  1072. buf = dev->video_mode.isoc_ctl.buf;
  1073. vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
  1074. if ((dma_q->mpeg_buffer_completed+len) <
  1075. mpeglines*mpeglinesize) {
  1076. if (dma_q->add_ps_package_head ==
  1077. CX231XX_NEED_ADD_PS_PACKAGE_HEAD) {
  1078. memcpy(vbuf+dma_q->mpeg_buffer_completed,
  1079. dma_q->ps_head, 3);
  1080. dma_q->mpeg_buffer_completed =
  1081. dma_q->mpeg_buffer_completed + 3;
  1082. dma_q->add_ps_package_head =
  1083. CX231XX_NONEED_PS_PACKAGE_HEAD;
  1084. }
  1085. memcpy(vbuf+dma_q->mpeg_buffer_completed, data, len);
  1086. dma_q->mpeg_buffer_completed =
  1087. dma_q->mpeg_buffer_completed + len;
  1088. } else {
  1089. dma_q->mpeg_buffer_done = 0;
  1090. tail_data =
  1091. mpeglines*mpeglinesize - dma_q->mpeg_buffer_completed;
  1092. memcpy(vbuf+dma_q->mpeg_buffer_completed,
  1093. data, tail_data);
  1094. buf->vb.vb2_buf.timestamp = ktime_get_ns();
  1095. buf->vb.sequence = dma_q->sequence++;
  1096. list_del(&buf->list);
  1097. vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
  1098. dma_q->mpeg_buffer_completed = 0;
  1099. if (len - tail_data > 0) {
  1100. p_data = data + tail_data;
  1101. dma_q->left_data_count = len - tail_data;
  1102. memcpy(dma_q->p_left_data,
  1103. p_data, len - tail_data);
  1104. }
  1105. }
  1106. }
  1107. static void buffer_filled(char *data, int len, struct urb *urb,
  1108. struct cx231xx_dmaqueue *dma_q)
  1109. {
  1110. void *vbuf;
  1111. struct cx231xx_buffer *buf;
  1112. if (list_empty(&dma_q->active))
  1113. return;
  1114. buf = list_entry(dma_q->active.next, struct cx231xx_buffer, list);
  1115. /* Fill buffer */
  1116. vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
  1117. memcpy(vbuf, data, len);
  1118. buf->vb.sequence = dma_q->sequence++;
  1119. buf->vb.vb2_buf.timestamp = ktime_get_ns();
  1120. list_del(&buf->list);
  1121. vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
  1122. }
  1123. static int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
  1124. {
  1125. struct cx231xx_dmaqueue *dma_q = urb->context;
  1126. unsigned char *p_buffer;
  1127. u32 buffer_size = 0;
  1128. u32 i = 0;
  1129. for (i = 0; i < urb->number_of_packets; i++) {
  1130. if (dma_q->left_data_count > 0) {
  1131. buffer_copy(dev, dma_q->p_left_data,
  1132. dma_q->left_data_count, urb, dma_q);
  1133. dma_q->mpeg_buffer_completed = dma_q->left_data_count;
  1134. dma_q->left_data_count = 0;
  1135. }
  1136. p_buffer = urb->transfer_buffer +
  1137. urb->iso_frame_desc[i].offset;
  1138. buffer_size = urb->iso_frame_desc[i].actual_length;
  1139. if (buffer_size > 0)
  1140. buffer_copy(dev, p_buffer, buffer_size, urb, dma_q);
  1141. }
  1142. return 0;
  1143. }
  1144. static int cx231xx_bulk_copy(struct cx231xx *dev, struct urb *urb)
  1145. {
  1146. struct cx231xx_dmaqueue *dma_q = urb->context;
  1147. unsigned char *p_buffer, *buffer;
  1148. u32 buffer_size = 0;
  1149. p_buffer = urb->transfer_buffer;
  1150. buffer_size = urb->actual_length;
  1151. buffer = kmalloc(buffer_size, GFP_ATOMIC);
  1152. if (!buffer)
  1153. return -ENOMEM;
  1154. memcpy(buffer, dma_q->ps_head, 3);
  1155. memcpy(buffer+3, p_buffer, buffer_size-3);
  1156. memcpy(dma_q->ps_head, p_buffer+buffer_size-3, 3);
  1157. p_buffer = buffer;
  1158. buffer_filled(p_buffer, buffer_size, urb, dma_q);
  1159. kfree(buffer);
  1160. return 0;
  1161. }
  1162. static void buffer_queue(struct vb2_buffer *vb)
  1163. {
  1164. struct cx231xx_buffer *buf =
  1165. container_of(vb, struct cx231xx_buffer, vb.vb2_buf);
  1166. struct cx231xx *dev = vb2_get_drv_priv(vb->vb2_queue);
  1167. struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
  1168. unsigned long flags;
  1169. spin_lock_irqsave(&dev->video_mode.slock, flags);
  1170. list_add_tail(&buf->list, &vidq->active);
  1171. spin_unlock_irqrestore(&dev->video_mode.slock, flags);
  1172. }
  1173. static void return_all_buffers(struct cx231xx *dev,
  1174. enum vb2_buffer_state state)
  1175. {
  1176. struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
  1177. struct cx231xx_buffer *buf, *node;
  1178. unsigned long flags;
  1179. spin_lock_irqsave(&dev->video_mode.slock, flags);
  1180. list_for_each_entry_safe(buf, node, &vidq->active, list) {
  1181. vb2_buffer_done(&buf->vb.vb2_buf, state);
  1182. list_del(&buf->list);
  1183. }
  1184. spin_unlock_irqrestore(&dev->video_mode.slock, flags);
  1185. }
  1186. static int start_streaming(struct vb2_queue *vq, unsigned int count)
  1187. {
  1188. struct cx231xx *dev = vb2_get_drv_priv(vq);
  1189. struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
  1190. int ret = 0;
  1191. vidq->sequence = 0;
  1192. dev->mode_tv = 1;
  1193. cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
  1194. cx231xx_set_gpio_value(dev, 2, 0);
  1195. cx231xx_initialize_codec(dev);
  1196. cx231xx_start_TS1(dev);
  1197. cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
  1198. cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
  1199. if (dev->USE_ISO)
  1200. ret = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
  1201. CX231XX_NUM_BUFS,
  1202. dev->ts1_mode.max_pkt_size,
  1203. cx231xx_isoc_copy);
  1204. else
  1205. ret = cx231xx_init_bulk(dev, 320, 5,
  1206. dev->ts1_mode.max_pkt_size,
  1207. cx231xx_bulk_copy);
  1208. if (ret)
  1209. return_all_buffers(dev, VB2_BUF_STATE_QUEUED);
  1210. call_all(dev, video, s_stream, 1);
  1211. return ret;
  1212. }
  1213. static void stop_streaming(struct vb2_queue *vq)
  1214. {
  1215. struct cx231xx *dev = vb2_get_drv_priv(vq);
  1216. unsigned long flags;
  1217. call_all(dev, video, s_stream, 0);
  1218. cx231xx_stop_TS1(dev);
  1219. /* do this before setting alternate! */
  1220. if (dev->USE_ISO)
  1221. cx231xx_uninit_isoc(dev);
  1222. else
  1223. cx231xx_uninit_bulk(dev);
  1224. cx231xx_set_mode(dev, CX231XX_SUSPEND);
  1225. cx231xx_api_cmd(dev, CX2341X_ENC_STOP_CAPTURE, 3, 0,
  1226. CX231xx_END_NOW, CX231xx_MPEG_CAPTURE,
  1227. CX231xx_RAW_BITS_NONE);
  1228. spin_lock_irqsave(&dev->video_mode.slock, flags);
  1229. if (dev->USE_ISO)
  1230. dev->video_mode.isoc_ctl.buf = NULL;
  1231. else
  1232. dev->video_mode.bulk_ctl.buf = NULL;
  1233. spin_unlock_irqrestore(&dev->video_mode.slock, flags);
  1234. return_all_buffers(dev, VB2_BUF_STATE_ERROR);
  1235. }
  1236. static struct vb2_ops cx231xx_video_qops = {
  1237. .queue_setup = queue_setup,
  1238. .buf_queue = buffer_queue,
  1239. .start_streaming = start_streaming,
  1240. .stop_streaming = stop_streaming,
  1241. .wait_prepare = vb2_ops_wait_prepare,
  1242. .wait_finish = vb2_ops_wait_finish,
  1243. };
  1244. /* ------------------------------------------------------------------ */
  1245. static int vidioc_g_pixelaspect(struct file *file, void *priv,
  1246. int type, struct v4l2_fract *f)
  1247. {
  1248. struct cx231xx *dev = video_drvdata(file);
  1249. bool is_50hz = dev->encodernorm.id & V4L2_STD_625_50;
  1250. if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1251. return -EINVAL;
  1252. f->numerator = is_50hz ? 54 : 11;
  1253. f->denominator = is_50hz ? 59 : 10;
  1254. return 0;
  1255. }
  1256. static int vidioc_g_selection(struct file *file, void *priv,
  1257. struct v4l2_selection *s)
  1258. {
  1259. struct cx231xx *dev = video_drvdata(file);
  1260. if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1261. return -EINVAL;
  1262. switch (s->target) {
  1263. case V4L2_SEL_TGT_CROP_BOUNDS:
  1264. case V4L2_SEL_TGT_CROP_DEFAULT:
  1265. s->r.left = 0;
  1266. s->r.top = 0;
  1267. s->r.width = dev->ts1.width;
  1268. s->r.height = dev->ts1.height;
  1269. break;
  1270. default:
  1271. return -EINVAL;
  1272. }
  1273. return 0;
  1274. }
  1275. static int vidioc_g_std(struct file *file, void *fh0, v4l2_std_id *norm)
  1276. {
  1277. struct cx231xx *dev = video_drvdata(file);
  1278. *norm = dev->encodernorm.id;
  1279. return 0;
  1280. }
  1281. static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id id)
  1282. {
  1283. struct cx231xx *dev = video_drvdata(file);
  1284. unsigned int i;
  1285. for (i = 0; i < ARRAY_SIZE(cx231xx_tvnorms); i++)
  1286. if (id & cx231xx_tvnorms[i].id)
  1287. break;
  1288. if (i == ARRAY_SIZE(cx231xx_tvnorms))
  1289. return -EINVAL;
  1290. dev->encodernorm = cx231xx_tvnorms[i];
  1291. if (dev->encodernorm.id & 0xb000) {
  1292. dprintk(3, "encodernorm set to NTSC\n");
  1293. dev->norm = V4L2_STD_NTSC;
  1294. dev->ts1.height = 480;
  1295. cx2341x_handler_set_50hz(&dev->mpeg_ctrl_handler, false);
  1296. } else {
  1297. dprintk(3, "encodernorm set to PAL\n");
  1298. dev->norm = V4L2_STD_PAL_B;
  1299. dev->ts1.height = 576;
  1300. cx2341x_handler_set_50hz(&dev->mpeg_ctrl_handler, true);
  1301. }
  1302. call_all(dev, video, s_std, dev->norm);
  1303. /* do mode control overrides */
  1304. cx231xx_do_mode_ctrl_overrides(dev);
  1305. dprintk(3, "exit vidioc_s_std() i=0x%x\n", i);
  1306. return 0;
  1307. }
  1308. static int vidioc_s_ctrl(struct file *file, void *priv,
  1309. struct v4l2_control *ctl)
  1310. {
  1311. struct cx231xx *dev = video_drvdata(file);
  1312. struct v4l2_subdev *sd;
  1313. dprintk(3, "enter vidioc_s_ctrl()\n");
  1314. /* Update the A/V core */
  1315. v4l2_device_for_each_subdev(sd, &dev->v4l2_dev)
  1316. v4l2_s_ctrl(NULL, sd->ctrl_handler, ctl);
  1317. dprintk(3, "exit vidioc_s_ctrl()\n");
  1318. return 0;
  1319. }
  1320. static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
  1321. struct v4l2_fmtdesc *f)
  1322. {
  1323. if (f->index != 0)
  1324. return -EINVAL;
  1325. f->pixelformat = V4L2_PIX_FMT_MPEG;
  1326. return 0;
  1327. }
  1328. static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
  1329. struct v4l2_format *f)
  1330. {
  1331. struct cx231xx *dev = video_drvdata(file);
  1332. dprintk(3, "enter vidioc_g_fmt_vid_cap()\n");
  1333. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  1334. f->fmt.pix.bytesperline = 0;
  1335. f->fmt.pix.sizeimage = mpeglines * mpeglinesize;
  1336. f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
  1337. f->fmt.pix.width = dev->ts1.width;
  1338. f->fmt.pix.height = dev->ts1.height;
  1339. f->fmt.pix.field = V4L2_FIELD_INTERLACED;
  1340. dprintk(1, "VIDIOC_G_FMT: w: %d, h: %d\n",
  1341. dev->ts1.width, dev->ts1.height);
  1342. dprintk(3, "exit vidioc_g_fmt_vid_cap()\n");
  1343. return 0;
  1344. }
  1345. static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
  1346. struct v4l2_format *f)
  1347. {
  1348. struct cx231xx *dev = video_drvdata(file);
  1349. dprintk(3, "enter vidioc_try_fmt_vid_cap()\n");
  1350. f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
  1351. f->fmt.pix.bytesperline = 0;
  1352. f->fmt.pix.sizeimage = mpeglines * mpeglinesize;
  1353. f->fmt.pix.field = V4L2_FIELD_INTERLACED;
  1354. f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
  1355. dprintk(1, "VIDIOC_TRY_FMT: w: %d, h: %d\n",
  1356. dev->ts1.width, dev->ts1.height);
  1357. dprintk(3, "exit vidioc_try_fmt_vid_cap()\n");
  1358. return 0;
  1359. }
  1360. static int vidioc_log_status(struct file *file, void *priv)
  1361. {
  1362. struct cx231xx *dev = video_drvdata(file);
  1363. call_all(dev, core, log_status);
  1364. return v4l2_ctrl_log_status(file, priv);
  1365. }
  1366. static const struct v4l2_file_operations mpeg_fops = {
  1367. .owner = THIS_MODULE,
  1368. .open = v4l2_fh_open,
  1369. .release = vb2_fop_release,
  1370. .read = vb2_fop_read,
  1371. .poll = vb2_fop_poll,
  1372. .mmap = vb2_fop_mmap,
  1373. .unlocked_ioctl = video_ioctl2,
  1374. };
  1375. static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
  1376. .vidioc_s_std = vidioc_s_std,
  1377. .vidioc_g_std = vidioc_g_std,
  1378. .vidioc_g_tuner = cx231xx_g_tuner,
  1379. .vidioc_s_tuner = cx231xx_s_tuner,
  1380. .vidioc_g_frequency = cx231xx_g_frequency,
  1381. .vidioc_s_frequency = cx231xx_s_frequency,
  1382. .vidioc_enum_input = cx231xx_enum_input,
  1383. .vidioc_g_input = cx231xx_g_input,
  1384. .vidioc_s_input = cx231xx_s_input,
  1385. .vidioc_s_ctrl = vidioc_s_ctrl,
  1386. .vidioc_g_pixelaspect = vidioc_g_pixelaspect,
  1387. .vidioc_g_selection = vidioc_g_selection,
  1388. .vidioc_querycap = cx231xx_querycap,
  1389. .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
  1390. .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
  1391. .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
  1392. .vidioc_s_fmt_vid_cap = vidioc_try_fmt_vid_cap,
  1393. .vidioc_reqbufs = vb2_ioctl_reqbufs,
  1394. .vidioc_querybuf = vb2_ioctl_querybuf,
  1395. .vidioc_qbuf = vb2_ioctl_qbuf,
  1396. .vidioc_dqbuf = vb2_ioctl_dqbuf,
  1397. .vidioc_streamon = vb2_ioctl_streamon,
  1398. .vidioc_streamoff = vb2_ioctl_streamoff,
  1399. .vidioc_log_status = vidioc_log_status,
  1400. #ifdef CONFIG_VIDEO_ADV_DEBUG
  1401. .vidioc_g_register = cx231xx_g_register,
  1402. .vidioc_s_register = cx231xx_s_register,
  1403. #endif
  1404. .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
  1405. .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
  1406. };
  1407. static struct video_device cx231xx_mpeg_template = {
  1408. .name = "cx231xx",
  1409. .fops = &mpeg_fops,
  1410. .ioctl_ops = &mpeg_ioctl_ops,
  1411. .minor = -1,
  1412. .tvnorms = V4L2_STD_ALL,
  1413. };
  1414. void cx231xx_417_unregister(struct cx231xx *dev)
  1415. {
  1416. dprintk(1, "%s()\n", __func__);
  1417. dprintk(3, "%s()\n", __func__);
  1418. if (video_is_registered(&dev->v4l_device)) {
  1419. video_unregister_device(&dev->v4l_device);
  1420. v4l2_ctrl_handler_free(&dev->mpeg_ctrl_handler.hdl);
  1421. }
  1422. }
  1423. static int cx231xx_s_video_encoding(struct cx2341x_handler *cxhdl, u32 val)
  1424. {
  1425. struct cx231xx *dev = container_of(cxhdl, struct cx231xx, mpeg_ctrl_handler);
  1426. int is_mpeg1 = val == V4L2_MPEG_VIDEO_ENCODING_MPEG_1;
  1427. struct v4l2_subdev_format format = {
  1428. .which = V4L2_SUBDEV_FORMAT_ACTIVE,
  1429. };
  1430. /* fix videodecoder resolution */
  1431. format.format.width = cxhdl->width / (is_mpeg1 ? 2 : 1);
  1432. format.format.height = cxhdl->height;
  1433. format.format.code = MEDIA_BUS_FMT_FIXED;
  1434. v4l2_subdev_call(dev->sd_cx25840, pad, set_fmt, NULL, &format);
  1435. return 0;
  1436. }
  1437. static int cx231xx_s_audio_sampling_freq(struct cx2341x_handler *cxhdl, u32 idx)
  1438. {
  1439. static const u32 freqs[3] = { 44100, 48000, 32000 };
  1440. struct cx231xx *dev = container_of(cxhdl, struct cx231xx, mpeg_ctrl_handler);
  1441. /* The audio clock of the digitizer must match the codec sample
  1442. rate otherwise you get some very strange effects. */
  1443. if (idx < ARRAY_SIZE(freqs))
  1444. call_all(dev, audio, s_clock_freq, freqs[idx]);
  1445. return 0;
  1446. }
  1447. static const struct cx2341x_handler_ops cx231xx_ops = {
  1448. /* needed for the video clock freq */
  1449. .s_audio_sampling_freq = cx231xx_s_audio_sampling_freq,
  1450. /* needed for setting up the video resolution */
  1451. .s_video_encoding = cx231xx_s_video_encoding,
  1452. };
  1453. static void cx231xx_video_dev_init(
  1454. struct cx231xx *dev,
  1455. struct usb_device *usbdev,
  1456. struct video_device *vfd,
  1457. const struct video_device *template,
  1458. const char *type)
  1459. {
  1460. dprintk(1, "%s()\n", __func__);
  1461. *vfd = *template;
  1462. snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", dev->name,
  1463. type, cx231xx_boards[dev->model].name);
  1464. vfd->v4l2_dev = &dev->v4l2_dev;
  1465. vfd->lock = &dev->lock;
  1466. vfd->release = video_device_release_empty;
  1467. vfd->ctrl_handler = &dev->mpeg_ctrl_handler.hdl;
  1468. video_set_drvdata(vfd, dev);
  1469. if (dev->tuner_type == TUNER_ABSENT) {
  1470. v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
  1471. v4l2_disable_ioctl(vfd, VIDIOC_S_FREQUENCY);
  1472. v4l2_disable_ioctl(vfd, VIDIOC_G_TUNER);
  1473. v4l2_disable_ioctl(vfd, VIDIOC_S_TUNER);
  1474. }
  1475. }
  1476. int cx231xx_417_register(struct cx231xx *dev)
  1477. {
  1478. /* FIXME: Port1 hardcoded here */
  1479. int err;
  1480. struct cx231xx_tsport *tsport = &dev->ts1;
  1481. struct vb2_queue *q;
  1482. dprintk(1, "%s()\n", __func__);
  1483. /* Set default TV standard */
  1484. dev->encodernorm = cx231xx_tvnorms[0];
  1485. if (dev->encodernorm.id & V4L2_STD_525_60)
  1486. tsport->height = 480;
  1487. else
  1488. tsport->height = 576;
  1489. tsport->width = 720;
  1490. err = cx2341x_handler_init(&dev->mpeg_ctrl_handler, 50);
  1491. if (err) {
  1492. dprintk(3, "%s: can't init cx2341x controls\n", dev->name);
  1493. return err;
  1494. }
  1495. dev->mpeg_ctrl_handler.func = cx231xx_mbox_func;
  1496. dev->mpeg_ctrl_handler.priv = dev;
  1497. dev->mpeg_ctrl_handler.ops = &cx231xx_ops;
  1498. if (dev->sd_cx25840)
  1499. v4l2_ctrl_add_handler(&dev->mpeg_ctrl_handler.hdl,
  1500. dev->sd_cx25840->ctrl_handler, NULL, false);
  1501. if (dev->mpeg_ctrl_handler.hdl.error) {
  1502. err = dev->mpeg_ctrl_handler.hdl.error;
  1503. dprintk(3, "%s: can't add cx25840 controls\n", dev->name);
  1504. v4l2_ctrl_handler_free(&dev->mpeg_ctrl_handler.hdl);
  1505. return err;
  1506. }
  1507. dev->norm = V4L2_STD_NTSC;
  1508. dev->mpeg_ctrl_handler.port = CX2341X_PORT_SERIAL;
  1509. cx2341x_handler_set_50hz(&dev->mpeg_ctrl_handler, false);
  1510. /* Allocate and initialize V4L video device */
  1511. cx231xx_video_dev_init(dev, dev->udev,
  1512. &dev->v4l_device, &cx231xx_mpeg_template, "mpeg");
  1513. q = &dev->mpegq;
  1514. q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1515. q->io_modes = VB2_USERPTR | VB2_MMAP | VB2_DMABUF | VB2_READ;
  1516. q->drv_priv = dev;
  1517. q->buf_struct_size = sizeof(struct cx231xx_buffer);
  1518. q->ops = &cx231xx_video_qops;
  1519. q->mem_ops = &vb2_vmalloc_memops;
  1520. q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
  1521. q->min_buffers_needed = 1;
  1522. q->lock = &dev->lock;
  1523. err = vb2_queue_init(q);
  1524. if (err)
  1525. return err;
  1526. dev->v4l_device.queue = q;
  1527. err = video_register_device(&dev->v4l_device,
  1528. VFL_TYPE_VIDEO, -1);
  1529. if (err < 0) {
  1530. dprintk(3, "%s: can't register mpeg device\n", dev->name);
  1531. v4l2_ctrl_handler_free(&dev->mpeg_ctrl_handler.hdl);
  1532. return err;
  1533. }
  1534. dprintk(3, "%s: registered device video%d [mpeg]\n",
  1535. dev->name, dev->v4l_device.num);
  1536. return 0;
  1537. }
  1538. MODULE_FIRMWARE(CX231xx_FIRM_IMAGE_NAME);