ark7116h.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963
  1. /*
  2. * ark7116h - Arkmicro ark7116h video decoder driver
  3. *
  4. * Copyright (c) 2020,2021 Arkmicro, Inc.
  5. * This code is placed under the terms of the GNU General Public License v2
  6. */
  7. #include <linux/module.h>
  8. #include <linux/init.h>
  9. #include <linux/errno.h>
  10. #include <linux/kernel.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/i2c.h>
  13. #include <linux/slab.h>
  14. #include <linux/of.h>
  15. #include <linux/gpio/consumer.h>
  16. #include <linux/videodev2.h>
  17. #include <media/v4l2-ioctl.h>
  18. #include <media/v4l2-event.h>
  19. #include <media/v4l2-device.h>
  20. #include <media/v4l2-ctrls.h>
  21. #include <linux/mutex.h>
  22. #include <linux/delay.h>
  23. //#define ARK7116H_DUMP_REGS
  24. #define ARK7116H_STATUS 0xFD26
  25. #define ARK7116H_INPUT_CTL 0xFDD4
  26. #define ARK7116H_CONTRAST_CTL 0xFE53
  27. #define ARK7116H_BRIGHT_CTL 0xFE54
  28. #define ARK7116H_HUE_CTL 0xFE55
  29. #define ARK7116H_SATURATION_CTL 0xFE56
  30. #define ARK7116H_AV0 0
  31. #define ARK7116H_AV1 1
  32. #define ARK7116H_AV2 2
  33. typedef enum {
  34. DISP_16_9 = 0,
  35. DISP_4_3,
  36. }ConfigDisplayMode;
  37. enum {
  38. TYPE_UNKNOWN = -1,
  39. TYPE_CVBS = 0,
  40. TYPE_720P,
  41. TYPE_1080P,
  42. };
  43. enum {
  44. TYPE_UNDEF = -1,
  45. TYPE_ARK7116 = 0,
  46. TYPE_ARK7116H,
  47. TYPE_RN6752,
  48. TYPE_PR2000,
  49. };
  50. typedef struct {
  51. unsigned int addr;
  52. unsigned char value;
  53. } PanlstaticPara;
  54. typedef struct {
  55. unsigned int addr;
  56. unsigned char value[6];
  57. }PanlPosDynPara;
  58. PanlstaticPara AV1_staticPara[]=
  59. {
  60. //GLOBAL
  61. {0XFB01,0X01},
  62. {0XFB02,0X40},
  63. {0XFB03,0X16},
  64. {0XFB04,0X00},
  65. {0XFB05,0X00},
  66. {0XFB06,0XC0},
  67. {0XFB07,0X00},
  68. {0XFB08,0X04},
  69. {0XFB09,0X04},
  70. {0XFB0A,0X5C},
  71. {0XFB0B,0XFF},
  72. {0XFB0C,0XF2},
  73. {0XFB0D,0XAA},
  74. {0XFB0E,0XAA},
  75. {0XFB0F,0X2A},
  76. {0XFB10,0X01},
  77. {0XFB11,0X02},
  78. {0XFB12,0X02},
  79. {0XFB13,0X28},
  80. {0XFB14,0X7F},
  81. {0XFB15,0X00},
  82. {0XFB16,0X07},
  83. {0XFB17,0X0C},
  84. {0XFB18,0X0C},
  85. {0XFB19,0X00},
  86. {0XFB1A,0X00},
  87. {0XFB1B,0X0C},
  88. {0XFB1C,0X0C},
  89. {0XFB1D,0X13},
  90. {0XFB1E,0X2B},
  91. {0XFB1F,0X12},
  92. {0XFB20,0X80},
  93. {0XFB21,0X00},
  94. {0XFB22,0X00},
  95. {0XFB23,0X2A},
  96. {0XFB24,0X11},
  97. {0XFB25,0XE8},
  98. {0XFB26,0X03},
  99. {0XFB27,0XFF},
  100. {0XFB28,0X0C},
  101. {0XFB29,0X95},
  102. {0XFB2A,0X55},
  103. {0XFB2B,0X55},
  104. {0XFB2C,0XC0},
  105. {0XFB2D,0X00},
  106. {0XFB2E,0X55},
  107. {0XFB2F,0X55},
  108. {0XFB30,0X55},
  109. {0XFB31,0X55},
  110. {0XFB32,0X55},
  111. {0XFB33,0XCC},
  112. {0XFB34,0X1A},
  113. {0XFB35,0X00},
  114. {0XFB36,0X04},
  115. {0XFB45,0XFF},
  116. {0XFB43,0X60},
  117. {0XFB37,0X8C},
  118. {0XFB38,0X10},
  119. {0XFB3D,0X8C},
  120. {0XFB41,0X28},
  121. {0XFB42,0X20},
  122. {0XFB44,0X04},
  123. {0XFB39,0X01},
  124. {0XFB3A,0X01},
  125. {0XFB3B,0X00},
  126. {0XFB3C,0X20},
  127. {0XFB3E,0X4C},
  128. {0XFB3F,0X20},
  129. {0XFB40,0X20},
  130. //DECODER
  131. {0XFD01,0X04},
  132. {0XFD02,0X00},
  133. {0XFD03,0X80},
  134. {0XFD04,0X80},
  135. {0XFD05,0X30},
  136. {0XFD06,0X02},
  137. {0XFD07,0X80},
  138. {0XFD08,0X00},
  139. {0XFD09,0X00},
  140. {0XFD0A,0X2F},
  141. {0XFD0B,0X40},
  142. {0XFD0C,0X12},
  143. {0XFD0D,0X03},
  144. {0XFD0E,0X72},
  145. {0XFD0F,0X07},
  146. {0XFD10,0X14},
  147. {0XFD11,0X09},
  148. {0XFD12,0X00},
  149. {0XFD13,0X1E},
  150. {0XFD14,0X22},
  151. {0XFD15,0X05},
  152. {0XFD26,0X0E},
  153. {0XFD27,0X00},
  154. {0XFD28,0X00},
  155. {0XFD2A,0X01},
  156. {0XFD35,0XAA},
  157. {0XFD36,0XAA},
  158. {0XFD37,0X60},
  159. {0XFD38,0X0F},
  160. {0XFD39,0X08},
  161. {0XFD48,0X07},
  162. {0XFD54,0X40},
  163. {0XFD55,0X8A},
  164. {0XFD5F,0XC0},
  165. {0XFD60,0X03},
  166. {0XFD61,0X2D},
  167. {0XFD62,0X41},
  168. {0XFD63,0XC0},
  169. {0XFD83,0X4F},
  170. {0XFDA0,0X0E},
  171. {0XFDAA,0X03},
  172. {0XFDAB,0X15},
  173. {0XFDAC,0X74},
  174. {0XFDB1,0X02},
  175. {0XFDB2,0X76},
  176. {0XFDB5,0X6F},
  177. {0XFDCA,0X4F},
  178. {0XFDCD,0X32},
  179. {0XFDD0,0X01},
  180. {0XFDD1,0X19},
  181. {0XFDD2,0X00},
  182. {0XFDD3,0X00},
  183. {0XFDD4,0X00},
  184. {0XFDD5,0XB1},
  185. {0XFDD6,0X08},
  186. {0XFDD7,0XF7},
  187. {0XFDD8,0XA3},
  188. {0XFDD9,0X40},
  189. {0XFDDA,0X29},
  190. {0XFDDB,0X00},
  191. {0XFDDC,0X00},
  192. {0XFDDD,0X4C},
  193. {0XFDDE,0X59},
  194. {0XFDDF,0X53},
  195. {0XFDE0,0X2E},
  196. {0XFDE1,0X17},
  197. {0XFDE2,0X00},
  198. {0XFD4F,0X40},
  199. {0XFD4F,0X40},
  200. {0XFD50,0X42},
  201. {0XFD31,0X20},
  202. {0XFD52,0X70},
  203. {0XFD4E,0X82},
  204. {0XFD7B,0XE5},
  205. {0XFD51,0X90},
  206. {0XFD16,0X4E},
  207. {0XFD98,0X0A},
  208. {0XFD1B,0X22},
  209. {0XFD1C,0X61},
  210. {0XFD41,0X8A},
  211. {0XFDCB,0X10},
  212. {0XFD43,0X80},
  213. {0XFD44,0X20},
  214. {0XFD45,0X80},
  215. {0XFD46,0X00},
  216. {0XFD56,0X07},
  217. {0XFD5D,0X03},
  218. {0XFD19,0X82},
  219. {0XFD1A,0X50},
  220. {0XFD1D,0X70},
  221. {0XFD8A,0X0A},
  222. {0XFD8B,0X00},
  223. {0XFDC8,0X00},
  224. {0XFDC9,0X01},
  225. {0XFDC6,0X00},
  226. {0XFD80,0X50},
  227. {0XFD7C,0X0A},
  228. {0XFD7D,0XFA},
  229. {0XFDB4,0XD2},
  230. //deinterlace
  231. {0XFE00,0X10},
  232. {0XFE01,0X00},
  233. {0XFE02,0X42},
  234. {0XFE03,0X0D},
  235. {0XFE04,0X30},
  236. {0XFE05,0X70},
  237. {0XFE06,0X00},
  238. {0XFE07,0X30},
  239. {0XFE08,0X02},
  240. {0XFE09,0X0B},
  241. {0XFE0A,0X02},
  242. {0XFE0B,0X00},
  243. {0XFE0C,0X40},
  244. {0XFE0D,0X00},
  245. {0XFE0E,0X08},
  246. {0XFE0F,0X00},
  247. {0XFE10,0X00},
  248. {0XFE11,0X00},
  249. {0XFE12,0XA0},
  250. {0XFE13,0XA0},
  251. {0XFE14,0X10},
  252. {0XFE15,0XA0},
  253. {0XFE16,0X20},
  254. {0XFE17,0X90},
  255. {0XFE18,0XA0},
  256. {0XFE19,0X60},
  257. {0XFE1A,0X40},
  258. {0XFE1B,0X04},
  259. {0XFE1C,0X04},
  260. {0XFE1D,0X00},
  261. {0XFE1E,0X10},
  262. {0XFE1F,0X22},
  263. {0XFEE0,0X30},
  264. {0XFEE1,0X00},
  265. {0XFEE2,0X36},
  266. {0XFE20,0XFF},
  267. {0XFE21,0XFF},
  268. {0XFE22,0XFF},
  269. {0XFE23,0XFF},
  270. {0XFE24,0XFF},
  271. {0XFE25,0XFF},
  272. {0XFE26,0XFF},
  273. //VP
  274. {0XFE30,0X27},
  275. {0XFE31,0X8F},
  276. {0XFE32,0X10},
  277. {0XFE33,0X10},
  278. {0XFE34,0X10},
  279. {0XFE35,0X60},
  280. {0XFE36,0X10},
  281. {0XFE37,0XD0},
  282. {0XFE38,0X10},
  283. {0XFE39,0X41},
  284. {0XFE3A,0X20},
  285. {0XFE3B,0X16},
  286. {0XFE3C,0X20},
  287. {0XFE3D,0X20},
  288. {0XFE3E,0X20},
  289. {0XFE3F,0X20},
  290. {0XFE40,0X64},
  291. {0XFE41,0X49},
  292. {0XFE42,0XFF},
  293. {0XFE43,0XFF},
  294. {0XFE44,0XFF},
  295. {0XFE45,0XFF},
  296. {0XFE46,0XFF},
  297. {0XFE47,0X4C},
  298. {0XFE48,0X1A},
  299. {0XFE49,0X15},
  300. {0XFE4A,0X55},
  301. {0XFE4B,0X80},
  302. {0XFE4C,0X80},
  303. {0XFE4D,0X00},
  304. {0XFE4E,0X00},
  305. {0XFE4F,0X80},
  306. {0XFE50,0X80},
  307. {0XFE51,0X0A},
  308. {0XFE52,0X4F},
  309. {0XFE53,0X80},
  310. {0XFE54,0X7A},
  311. {0XFE55,0X00},
  312. {0XFE56,0X38},
  313. {0XFE57,0X10},
  314. {0XFE58,0X80},
  315. {0XFE59,0X65},
  316. {0XFE5A,0X00},
  317. {0XFE5D,0XFF},
  318. {0XFE5E,0XFF},
  319. {0XFE5F,0XFF},
  320. {0XFE60,0X3C},
  321. {0XFE61,0XFF},
  322. {0XFE62,0XFF},
  323. {0XFE63,0XFF},
  324. {0XFE64,0XFF},
  325. {0XFE65,0XFF},
  326. {0XFE66,0XFF},
  327. {0XFE67,0X24},
  328. {0XFE68,0XFF},
  329. {0XFE69,0X20},
  330. {0XFE6A,0X9F},
  331. {0XFE70,0X42},
  332. {0XFE71,0XE0},
  333. {0XFE72,0XDE},
  334. {0XFE73,0XE1},
  335. {0XFE74,0XFD},
  336. {0XFE75,0X2E},
  337. {0XFE76,0XF0},
  338. {0XFE77,0XDD},
  339. {0XFE78,0XF0},
  340. {0XFE79,0XFD},
  341. {0XFE7A,0X33},
  342. {0XFE7B,0X81},
  343. //vi_regfile
  344. {0XFF01,0XFF},
  345. {0XFF02,0XFF},
  346. {0XFF03,0XFF},
  347. {0XFF04,0XFF},
  348. {0XFF05,0XFF},
  349. {0XFF06,0XFF},
  350. {0XFF07,0XFF},
  351. {0XFF08,0XFF},
  352. {0XFF09,0XFF},
  353. {0XFF0A,0XFF},
  354. {0XFF0B,0XFF},
  355. {0XFF0C,0XFF},
  356. {0XFF0D,0XFF},
  357. {0XFF0E,0XFF},
  358. {0XFF0F,0XFF},
  359. {0XFF10,0XFF},
  360. {0XFF11,0XFF},
  361. {0XFF12,0XFF},
  362. {0XFF13,0XFF},
  363. {0XFF14,0XFF},
  364. {0XFF15,0XFF},
  365. {0XFF16,0XFF},
  366. {0XFF17,0XFF},
  367. {0XFF18,0XFF},
  368. {0XFF19,0XFF},
  369. {0XFF1A,0XFF},
  370. {0XFF1B,0XFF},
  371. {0XFF1C,0XFF},
  372. {0XFF1D,0XFF},
  373. {0XFF1E,0XFF},
  374. {0XFF1F,0XFF},
  375. //scale
  376. {0XFF20,0XC0},
  377. {0XFF21,0X03},
  378. {0XFF22,0XA0}, //B6 ok //debug scale
  379. {0XFF23,0X03},
  380. {0XFF24,0XEE},
  381. {0XFF25,0X03},
  382. {0XFF26,0X07},
  383. {0XFF27,0X91},
  384. {0XFF28,0X51},
  385. {0XFF29,0X00},
  386. {0XFF2A,0X03},
  387. {0XFF2B,0X80},
  388. {0XFF2C,0X02},
  389. {0XFF2D,0XD0},
  390. {0XFF2E,0X02},
  391. {0XFF2F,0X40},
  392. {0XFF30,0X02},
  393. {0XFF31,0X02},
  394. {0XFF32,0X00},
  395. {0XFF33,0X28},
  396. {0XFF34,0X02},
  397. {0XFF35,0X00},
  398. {0XFF36,0X05},
  399. {0XFF37,0X11},
  400. {0XFF38,0X00},
  401. {0XFF39,0X27},
  402. {0XFF3A,0X03},
  403. {0XFF3B,0X00},
  404. {0XFF3C,0X00},
  405. {0XFF3D,0X37},
  406. {0XFF3E,0X02},
  407. {0XFF3F,0X00},
  408. {0XFF40,0X00},
  409. {0XFF41,0X00},
  410. {0XFF42,0X00},
  411. {0XFF43,0X00},
  412. {0XFF44,0X96},
  413. {0XFF45,0X00},
  414. {0XFF46,0X00},
  415. {0XFF47,0X00},
  416. {0XFF48,0X00},
  417. {0XFF49,0X19},
  418. {0XFF4A,0X00},
  419. {0XFF4B,0XE9},
  420. {0XFF4C,0X02},
  421. {0XFF4D,0X09},
  422. {0XFF4E,0X00},
  423. {0XFF4F,0X49},
  424. {0XFF50,0X02},
  425. {0XFF51,0X45},
  426. {0XFF52,0X00},
  427. {0XFF53,0X15},
  428. {0XFF54,0X03},
  429. {0XFF55,0X07},
  430. {0XFF56,0X00},
  431. {0XFF57,0X47},
  432. {0XFF58,0X02},
  433. {0XFF59,0XFF},
  434. {0XFF5A,0X03},
  435. {0XFF5B,0XFF},
  436. {0XFF5C,0XFD},
  437. {0XFF5D,0XFF},
  438. {0XFF68,0XFF},
  439. {0XFF69,0XFD},
  440. {0XFF6A,0XFF},
  441. {0XFF6B,0XFD},
  442. {0XFF6C,0XFD},
  443. {0XFF6D,0XFF},
  444. {0XFF6E,0XFD},
  445. {0XFF6F,0XFD},
  446. //GAMMA
  447. {0XFF80,0XC0},
  448. {0XFF81,0X00},
  449. {0XFF82,0X00},
  450. {0XFF83,0X03},
  451. {0XFF84,0X05},
  452. {0XFF85,0X0B},
  453. {0XFF86,0X12},
  454. {0XFF87,0X19},
  455. {0XFF88,0X21},
  456. {0XFF89,0X2A},
  457. {0XFF8A,0X33},
  458. {0XFF8B,0X3E},
  459. {0XFF8C,0X48},
  460. {0XFF8D,0X54},
  461. {0XFF8E,0X5F},
  462. {0XFF8F,0X6A},
  463. {0XFF90,0X74},
  464. {0XFF91,0X7F},
  465. {0XFF92,0X89},
  466. {0XFF93,0X93},
  467. {0XFF94,0X9E},
  468. {0XFF95,0XA9},
  469. {0XFF96,0XB3},
  470. {0XFF97,0XBD},
  471. {0XFF98,0XC6},
  472. {0XFF99,0XCE},
  473. {0XFF9A,0XD5},
  474. {0XFF9B,0XDC},
  475. {0XFF9C,0XE1},
  476. {0XFF9D,0XE7},
  477. {0XFF9E,0XEB},
  478. {0XFF9F,0XF0},
  479. {0XFFA0,0XF4},
  480. {0XFFA1,0XF8},
  481. //rgb_test_c
  482. {0XFFA8,0XFB},
  483. {0XFFA9,0X00},
  484. {0XFFAA,0X00},
  485. {0XFFAB,0X00},
  486. {0XFFAC,0X00},
  487. {0XFFAD,0X00},
  488. {0XFFC0,0X00},
  489. {0XFFC1,0X04},
  490. {0XFFC2,0X4C},
  491. {0XFFC3,0X02},
  492. {0XFFC4,0X5A},
  493. {0XFFC5,0X2C},
  494. {0XFFC6,0X74},
  495. {0XFFC7,0XDA},
  496. {0XFFC8,0X5C},
  497. {0XFFC9,0X10},
  498. {0XFFCA,0X43},
  499. {0XFFCB,0X6F},
  500. {0XFFCC,0X60},
  501. {0XFFCD,0X60},
  502. {0XFFCE,0X60},
  503. {0XFFCF,0X00},
  504. {0XFFD0,0X7E},
  505. {0XFFD1,0XEF},
  506. {0XFFD2,0XFF},
  507. {0XFFD3,0XFC},
  508. {0XFFD4,0X4E},
  509. {0XFFD5,0X22},
  510. {0XFFD6,0XE9},
  511. {0XFFD7,0X1B},
  512. {0XFFD8,0X00},
  513. {0XFFD9,0X00},
  514. {0XFFDA,0X00},
  515. {0XFFDB,0X00},
  516. {0XFFDC,0X00},
  517. {0XFFDD,0X00},
  518. {0XFFE8,0X00},
  519. {0XFFE9,0X4A},
  520. {0XFFEA,0X04},
  521. {0XFFEB,0X00},
  522. {0XFFEC,0X00},
  523. {0XFFED,0XFF},
  524. {0XFFEE,0XFF},
  525. {0XFFEF,0X00},
  526. };
  527. struct ark7116h {
  528. struct v4l2_ctrl_handler hdl;
  529. struct v4l2_subdev sd;
  530. struct gpio_desc *reset_gpio;
  531. u32 input;
  532. u8 brightness;
  533. u8 contrast;
  534. u8 saturation;
  535. u8 hue;
  536. struct i2c_client *client;
  537. unsigned short default_addr;
  538. PanlstaticPara *custom_para;
  539. };
  540. #define VIDIOC_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
  541. #define VIDIOC_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
  542. #define VIDIOC_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
  543. #define VIDIOC_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
  544. static inline struct ark7116h *to_ark7116h(struct v4l2_subdev *sd)
  545. {
  546. return container_of(sd, struct ark7116h, sd);
  547. }
  548. static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
  549. {
  550. return &container_of(ctrl->handler, struct ark7116h, hdl)->sd;
  551. }
  552. static unsigned char to_slave_addr(unsigned char addr)
  553. {
  554. switch(addr) {
  555. case 0XF9:
  556. case 0XFD:
  557. return 0xB4;
  558. case 0XF3:
  559. return 0xE6;
  560. case 0XFA:
  561. return 0xBA;
  562. case 0XFB:
  563. return 0xB8;
  564. case 0XFC:
  565. return 0xB6;
  566. case 0XFE:
  567. return 0xB2;
  568. case 0XFF:
  569. return 0XB0;
  570. case 0X00:
  571. return 0xBE;
  572. default:
  573. return 0xBE;
  574. }
  575. }
  576. static unsigned char amt_read_reg(struct ark7116h *decoder, unsigned int reg)
  577. {
  578. struct v4l2_subdev *sd = &decoder->sd;
  579. struct i2c_client *client = v4l2_get_subdevdata(sd);
  580. int rc;
  581. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  582. rc = i2c_smbus_read_byte_data(client, reg & 0xff);
  583. client->addr = decoder->default_addr;
  584. if (rc < 0) {
  585. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  586. return rc;
  587. }
  588. dev_dbg(sd->dev, "ark7116h: read 0x%04x = %02x\n", reg, rc);
  589. return rc;
  590. }
  591. static int amt_write_reg(struct ark7116h *decoder, unsigned int reg, unsigned char value)
  592. {
  593. struct v4l2_subdev *sd = &decoder->sd;
  594. struct i2c_client *client = v4l2_get_subdevdata(sd);
  595. int rc;
  596. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  597. rc = i2c_smbus_write_byte_data(client, reg & 0xff, value);
  598. client->addr = decoder->default_addr;
  599. if (rc < 0)
  600. printk(KERN_ALERT "i2c i/o error: rc == %d\n", rc);
  601. #ifdef ARK7116H_DUMP_REGS
  602. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  603. rc = i2c_smbus_read_byte_data(client, reg & 0xff);
  604. client->addr = decoder->default_addr;
  605. printk(KERN_ALERT "ark7116h: read 0x%04x = %02x\n", reg, rc);
  606. #endif
  607. return rc;
  608. }
  609. /****************************************************************************
  610. I2C Client & Driver
  611. ****************************************************************************/
  612. static int ark7116h_detect_signal(struct ark7116h *decoder)
  613. {
  614. return (amt_read_reg(decoder, ARK7116H_STATUS) & 0x2) == 0x2;
  615. }
  616. static int ark7116h_select_input(struct ark7116h *decoder, u32 input)
  617. {
  618. unsigned char val;
  619. if (input > ARK7116H_AV2)
  620. return -EINVAL;
  621. if (input == ARK7116H_AV0)
  622. val = 0;
  623. else if (input == ARK7116H_AV1)
  624. val = 0x10;
  625. else if (input == ARK7116H_AV2)
  626. val = 0x30;
  627. return amt_write_reg(decoder, ARK7116H_INPUT_CTL, val);
  628. }
  629. static int ark7116h_reset(struct ark7116h *decoder)
  630. {
  631. gpiod_set_value_cansleep(decoder->reset_gpio, 0);
  632. mdelay(1);
  633. gpiod_set_value_cansleep(decoder->reset_gpio, 1);
  634. mdelay(1);
  635. gpiod_set_value_cansleep(decoder->reset_gpio, 0);
  636. mdelay(10);
  637. return 0;
  638. };
  639. static void ark7116h_config_common(struct ark7116h *decoder)
  640. {
  641. int i;
  642. for (i = 0; i < sizeof(AV1_staticPara) / sizeof(AV1_staticPara[0]); i++)
  643. amt_write_reg(decoder, AV1_staticPara[i].addr, AV1_staticPara[i].value);
  644. }
  645. static int _ark7116h_init(struct ark7116h *decoder)
  646. {
  647. unsigned char val;
  648. reinit:
  649. ark7116h_reset(decoder);
  650. //soft reset 7116h
  651. amt_write_reg(decoder, 0xFB00, 0x5A);
  652. mdelay(10);
  653. amt_write_reg(decoder,0xC6, 0x40);
  654. val = amt_read_reg(decoder, 0xFAC6);
  655. val &= 0x80;
  656. if ( val != 0 ) {
  657. goto reinit;
  658. }
  659. ark7116h_config_common(decoder);
  660. //soft reset decoder
  661. val = amt_read_reg(decoder,0xFDA0);
  662. val |= 1;
  663. amt_write_reg(decoder,0xFDA0, val);
  664. mdelay(40);
  665. val &= ~1;
  666. amt_write_reg(decoder,0xFDA0, val);
  667. mdelay(40);
  668. ark7116h_select_input(decoder, decoder->input);
  669. return 0;
  670. }
  671. /* ----------------------------------------------------------------------- */
  672. static int ark7116h_s_ctrl(struct v4l2_ctrl *ctrl)
  673. {
  674. struct v4l2_subdev *sd = to_sd(ctrl);
  675. struct ark7116h *decoder = to_ark7116h(sd);
  676. switch (ctrl->id) {
  677. case V4L2_CID_BRIGHTNESS:
  678. amt_write_reg(decoder, ARK7116H_BRIGHT_CTL, ctrl->val);
  679. return 0;
  680. case V4L2_CID_CONTRAST:
  681. amt_write_reg(decoder, ARK7116H_CONTRAST_CTL, ctrl->val);
  682. return 0;
  683. case V4L2_CID_SATURATION:
  684. amt_write_reg(decoder, ARK7116H_SATURATION_CTL, ctrl->val);
  685. return 0;
  686. case V4L2_CID_HUE:
  687. amt_write_reg(decoder, ARK7116H_HUE_CTL, ctrl->val);
  688. return 0;
  689. }
  690. return -EINVAL;
  691. }
  692. static int ark7116h_g_input_status(struct v4l2_subdev *sd, u32 *status)
  693. {
  694. struct ark7116h *decoder = to_ark7116h(sd);
  695. if (status) {
  696. *status = 0;
  697. if (!ark7116h_detect_signal(decoder))
  698. *status |= V4L2_IN_ST_NO_SIGNAL;
  699. }
  700. return 0;
  701. }
  702. static int ark7116h_s_routing(struct v4l2_subdev *sd, u32 input,
  703. u32 output, u32 config)
  704. {
  705. struct ark7116h *decoder = to_ark7116h(sd);
  706. ark7116h_select_input(decoder, input);
  707. decoder->input = input;
  708. return 0;
  709. }
  710. static int ark7116h_init(struct v4l2_subdev *sd, u32 val)
  711. {
  712. struct ark7116h *decoder = to_ark7116h(sd);
  713. int ret;
  714. ret=_ark7116h_init(decoder);
  715. if(ret){
  716. printk(KERN_ALERT "_ark7116h_init error.\n");
  717. }
  718. return ret;
  719. }
  720. static long ark7116h_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
  721. {
  722. int ret = 0;
  723. switch (cmd) {
  724. case VIDIOC_GET_RESOLUTION:
  725. {
  726. int* temp = (int *)arg;
  727. *temp = TYPE_CVBS;
  728. break;
  729. }
  730. case VIDIOC_GET_PROGRESSIVE:
  731. {
  732. int* temp = (int *)arg;
  733. *temp = 1;
  734. break;
  735. }
  736. case VIDIOC_GET_CHIPINFO:
  737. {
  738. int* temp = (int *)arg;
  739. *temp = TYPE_ARK7116H;
  740. break;
  741. }
  742. case VIDIOC_GET_ITU601_ENABLE:
  743. {
  744. int* temp = (int *)arg;
  745. *temp = 1;
  746. break;
  747. }
  748. default:
  749. return -ENOIOCTLCMD;
  750. }
  751. return ret;
  752. }
  753. /* ----------------------------------------------------------------------- */
  754. static const struct v4l2_ctrl_ops ark7116h_ctrl_ops = {
  755. .s_ctrl = ark7116h_s_ctrl,
  756. };
  757. static const struct v4l2_subdev_video_ops ark7116h_video_ops = {
  758. .g_input_status = ark7116h_g_input_status,
  759. .s_routing = ark7116h_s_routing,
  760. };
  761. static const struct v4l2_subdev_core_ops ark7116h_core_ops = {
  762. .init = ark7116h_init,
  763. .ioctl = ark7116h_ioctl,
  764. };
  765. static const struct v4l2_subdev_ops ark7116h_ops = {
  766. .core = &ark7116h_core_ops,
  767. .video = &ark7116h_video_ops,
  768. };
  769. static int ark7116h_parse_dt(struct ark7116h *decoder, struct device_node *np)
  770. {
  771. int ret = 0;
  772. int value;
  773. if (of_property_read_u32(np, "default-channel", &decoder->input))
  774. decoder->input = 0;
  775. if(!of_property_read_u32(np, "carback-config", &value)) {
  776. if(value == 1){
  777. printk("Initialize in carback.\n");
  778. }
  779. else if(value == 0){
  780. ret=_ark7116h_init(decoder);
  781. if(ret){
  782. printk(KERN_ALERT "_ark7116h_init error.\n");
  783. }
  784. }
  785. }
  786. return ret;
  787. }
  788. static int ark7116h_probe(struct i2c_client *client,
  789. const struct i2c_device_id *id)
  790. {
  791. struct ark7116h *decoder;
  792. struct v4l2_subdev *sd;
  793. struct device_node *np = client->dev.of_node;
  794. int res;
  795. /* Check if the adapter supports the needed features */
  796. if (!i2c_check_functionality(client->adapter,
  797. I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  798. return -EIO;
  799. decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL);
  800. if (!decoder)
  801. return -ENOMEM;
  802. decoder->client = client;
  803. decoder->default_addr = client->addr;
  804. decoder->custom_para = (PanlstaticPara *)id->driver_data;
  805. sd = &decoder->sd;
  806. decoder->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
  807. GPIOD_OUT_HIGH);
  808. if (IS_ERR(decoder->reset_gpio)) {
  809. res = PTR_ERR(decoder->reset_gpio);
  810. v4l_err(client, "request for reset pin failed: %d\n", res);
  811. return res;
  812. }
  813. res = ark7116h_parse_dt(decoder, np);
  814. if (res) {
  815. dev_err(sd->dev, "DT parsing error: %d\n", res);
  816. return res;
  817. }
  818. v4l2_i2c_subdev_init(sd, client, &ark7116h_ops);
  819. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  820. v4l2_ctrl_handler_init(&decoder->hdl, 4);
  821. v4l2_ctrl_new_std(&decoder->hdl, &ark7116h_ctrl_ops,
  822. V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
  823. v4l2_ctrl_new_std(&decoder->hdl, &ark7116h_ctrl_ops,
  824. V4L2_CID_CONTRAST, 0, 255, 1, 128);
  825. v4l2_ctrl_new_std(&decoder->hdl, &ark7116h_ctrl_ops,
  826. V4L2_CID_SATURATION, 0, 255, 1, 128);
  827. v4l2_ctrl_new_std(&decoder->hdl, &ark7116h_ctrl_ops,
  828. V4L2_CID_HUE, -128, 127, 1, 0);
  829. sd->ctrl_handler = &decoder->hdl;
  830. if (decoder->hdl.error) {
  831. res = decoder->hdl.error;
  832. goto err;
  833. }
  834. res = v4l2_async_register_subdev(sd);
  835. if (res < 0)
  836. goto err;
  837. return 0;
  838. err:
  839. v4l2_ctrl_handler_free(&decoder->hdl);
  840. return res;
  841. printk("ark7116h_probe.\n");
  842. return 0;
  843. }
  844. static int ark7116h_remove(struct i2c_client *client)
  845. {
  846. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  847. struct ark7116h *decoder = to_ark7116h(sd);
  848. dev_dbg(sd->dev,
  849. "ark7116h.c: removing ark7116h adapter on address 0x%x\n",
  850. client->addr << 1);
  851. v4l2_async_unregister_subdev(sd);
  852. v4l2_ctrl_handler_free(&decoder->hdl);
  853. return 0;
  854. }
  855. /* ----------------------------------------------------------------------- */
  856. /* the length of name must less than 20 */
  857. static const struct i2c_device_id ark7116h_id[] = {
  858. { "ark7116h_1668e_devb", NULL},
  859. { }
  860. };
  861. MODULE_DEVICE_TABLE(i2c, ark7116h_id);
  862. #if IS_ENABLED(CONFIG_OF)
  863. static const struct of_device_id ark7116h_of_match[] = {
  864. { .compatible = "arkmicro,ark7116h_1668e_devb", },
  865. { /* sentinel */ },
  866. };
  867. MODULE_DEVICE_TABLE(of, ark7116h_of_match);
  868. #endif
  869. static struct i2c_driver ark7116h_driver = {
  870. .driver = {
  871. .of_match_table = of_match_ptr(ark7116h_of_match),
  872. .name = "ark7116h",
  873. },
  874. .probe = ark7116h_probe,
  875. .remove = ark7116h_remove,
  876. .id_table = ark7116h_id,
  877. };
  878. static int __init ark_7116h_init(void)
  879. {
  880. return i2c_add_driver(&ark7116h_driver);
  881. }
  882. static void __exit ark_7116h_exit(void)
  883. {
  884. i2c_del_driver(&ark7116h_driver);
  885. }
  886. device_initcall(ark_7116h_init);
  887. MODULE_AUTHOR("arkmicro");
  888. MODULE_DESCRIPTION("arkmicro 7116h decoder driver for v4l2");
  889. MODULE_LICENSE("GPL v2");