ark7116.c 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. /*
  2. * ark7116 - Arkmicro ark7116 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. #ifdef DEBUG
  24. #define ARK7116_DUMP_REGS
  25. #endif
  26. #define ARK7116_STATUS 0x26
  27. #define ARK7116_BUS_STATUS 0xaf
  28. #define ARK7116_CONTRAST_CTL 0xd3
  29. #define ARK7116_BRIGHT_CTL 0xd4
  30. #define ARK7116_HUE_CTL 0xd5
  31. #define ARK7116_SATURATION_CTL 0xd6
  32. #define ARK7116_INPUT_CTL 0xdc
  33. #define ARK7116_ENH_PLL 0XFD0E
  34. #define ARK7116_AV0 0
  35. #define ARK7116_AV1 1
  36. #define ARK7116_AV2 2
  37. typedef enum {
  38. DISP_16_9 = 0,
  39. DISP_4_3,
  40. }ConfigDisplayMode;
  41. enum {
  42. TYPE_UNKNOWN = -1,
  43. TYPE_CVBS = 0,
  44. TYPE_720P,
  45. TYPE_1080P,
  46. };
  47. enum {
  48. TYPE_UNDEF = -1,
  49. TYPE_ARK7116 = 0,
  50. TYPE_RN6752,
  51. };
  52. typedef struct {
  53. unsigned int addr;
  54. unsigned char value;
  55. } PanlstaticPara;
  56. typedef struct {
  57. unsigned int addr;
  58. unsigned char value[6];
  59. }PanlPosDynPara;
  60. PanlstaticPara AV1_staticPara[]= {
  61. //GLOBAL
  62. {0XFD0A,0X30},
  63. {0XFD0B,0X27},
  64. {0XFD0D,0XF0},
  65. {0XFD0F,0X03},
  66. {0XFD10,0X04},
  67. {0XFD11,0XFF},
  68. {0XFD12,0XFF},
  69. {0XFD13,0XFF},
  70. {0XFD14,0X02},
  71. {0XFD15,0X02},
  72. {0XFD16,0X0A},
  73. {0XFD1A,0X40},
  74. //DECODER
  75. {0XFE00,0X90},
  76. {0XFE83,0X7F},
  77. {0XFE26,0X0E},
  78. {0XFE27,0X00},
  79. {0XFE28,0X00},
  80. {0XFE2A,0X01},
  81. {0XFE42,0X00},
  82. {0XFE44,0X28},
  83. {0XFE83,0X7F},
  84. {0XFEAB,0X3E},
  85. {0XFEAC,0X77},
  86. {0XFEB1,0X01},
  87. {0XFEC9,0X00},
  88. {0XFED0,0X41},
  89. {0XFED7,0XF7},
  90. {0XFEE0,0X2E},
  91. {0XFEE1,0X94},
  92. {0XFEE2,0X01},
  93. //TCON
  94. {0XFC00,0X40},
  95. //SCALE
  96. {0XFC90,0X02},
  97. {0XFC91,0X01},
  98. {0XFC92,0X00},
  99. {0XFC93,0X0C},
  100. {0XFC94,0X00},
  101. {0XFC95,0X00},
  102. {0XFC98,0X00},
  103. {0XFC99,0X04},
  104. {0XFC9A,0X59},
  105. {0XFC9B,0X03},
  106. {0XFC9C,0X01},
  107. {0XFC9D,0X00},
  108. {0XFC9E,0X06},
  109. {0XFC9F,0X00},
  110. {0XFCA0,0X23},
  111. {0XFCA1,0X00},
  112. {0XFCA2,0XF5},
  113. {0XFCA3,0X02},
  114. {0XFCA4,0X03},
  115. {0XFCA5,0X00},
  116. {0XFCA6,0X05},
  117. {0XFCA7,0X00},
  118. {0XFCA8,0X0E},
  119. {0XFCA9,0X00},
  120. {0XFCAA,0X06},
  121. {0XFCAB,0X01},
  122. {0XFCB1,0X14},
  123. {0XFCB2,0X00},
  124. {0XFCB3,0X00},
  125. {0XFCB4,0X00},
  126. {0XFCB5,0X00},
  127. {0XFCB7,0X07},
  128. {0XFCB8,0X01},
  129. {0XFCBB,0X37},
  130. {0XFCBC,0X01},
  131. {0XFCBD,0X01},
  132. {0XFCBE,0X00},
  133. {0XFCBF,0X0C},
  134. {0XFCC0,0X00},
  135. {0XFCC1,0X00},
  136. {0XFCC4,0X00},
  137. {0XFCC5,0X04},
  138. {0XFCC6,0X62},
  139. {0XFCC7,0X03},
  140. {0XFCC8,0X01},
  141. {0XFCC9,0X00},
  142. {0XFCCA,0X06},
  143. {0XFCCB,0X00},
  144. {0XFCCC,0X20},
  145. {0XFCCD,0X00},
  146. {0XFCCE,0XF2},
  147. {0XFCCF,0X02},
  148. {0XFCD1,0X00},
  149. {0XFCD2,0X08},
  150. {0XFCD3,0X00},
  151. {0XFCD4,0X08},
  152. {0XFCD5,0X00},
  153. {0XFCD6,0X28},
  154. {0XFCD7,0X01},
  155. {0XFCDD,0X14},
  156. {0XFCDE,0X00},
  157. {0XFCDF,0X00},
  158. {0XFCE0,0X00},
  159. {0XFCE1,0X00},
  160. {0XFCD0,0X03},
  161. {0XFCE2,0X00},
  162. {0XFCB6,0X00},
  163. {0XFB35,0X00},
  164. {0XFB89,0X00},
  165. };
  166. PanlPosDynPara AV1_posDynPara[]=
  167. {
  168. //dispmode: 16:9 4:3 DM_EX0 DM_EX1 DM_EX2 DM_EX3
  169. //GLOBAL
  170. //PAD MUX
  171. //DECODER
  172. //VP
  173. //TCON
  174. //SCALE
  175. {0XFC96,{0XDE,0XD4,0XD4,0XD4,0XD4,0XD4}},
  176. {0XFC97,{0X03,0X03,0X03,0X03,0X03,0X03}},
  177. {0XFCAC,{0X1E,0X20,0X20,0X20,0X20,0X20}},
  178. {0XFCAD,{0X00,0X00,0X00,0X00,0X00,0X00}},
  179. {0XFCAE,{0X02,0X02,0X02,0X02,0X02,0X02}},
  180. {0XFCAF,{0X04,0X04,0X04,0X04,0X04,0X04}},
  181. {0XFCB0,{0X00,0X00,0X00,0X00,0X00,0X00}},
  182. {0XFCC2,{0XE0,0XE0,0XE0,0XE0,0XE0,0XE0}},
  183. {0XFCC3,{0X03,0X03,0X03,0X03,0X03,0X03}},
  184. {0XFCD8,{0X0F,0X0F,0X0F,0X0F,0X0F,0X0F}},
  185. {0XFCD9,{0X00,0X00,0X00,0X00,0X00,0X00}},
  186. {0XFCDA,{0X0A,0X0A,0X0A,0X0A,0X0A,0X0A}},
  187. {0XFCDB,{0X05,0X05,0X05,0X05,0X05,0X05}},
  188. {0XFCDC,{0X00,0X00,0X00,0X00,0X00,0X00}},
  189. };
  190. PanlstaticPara AMT_PadMuxStaticPara[]=
  191. {
  192. //PAD MUX
  193. {0XFD32,0X11},
  194. {0XFD33,0X11},
  195. {0XFD34,0X00},
  196. {0XFD35,0X40},
  197. {0XFD36,0X44},
  198. {0XFD37,0X44},
  199. {0XFD38,0X44},
  200. {0XFD39,0X44},
  201. {0XFD3A,0X00},
  202. {0XFD3B,0X00},
  203. {0XFD3C,0X00},
  204. {0XFD3D,0X00},
  205. {0XFD3E,0X00},
  206. {0XFD3F,0X00},
  207. {0XFD40,0X00},
  208. {0XFD41,0X00},
  209. {0XFD44,0X01},
  210. {0XFD45,0X00},
  211. {0XFD46,0X00},
  212. {0XFD47,0X00},
  213. {0XFD48,0X00},
  214. {0XFD49,0X00},
  215. {0XFD4A,0X00},
  216. {0XFD4B,0X00},
  217. {0XFD50,0X09},
  218. };
  219. PanlstaticPara ark169_custom_para[] = {
  220. //VP
  221. {0XFFB0,0X23},
  222. {0XFFB1,0X0F},
  223. {0XFFB2,0X12},
  224. {0XFFB3,0X15},
  225. {0XFFB4,0X15},
  226. {0XFFB7,0X90},
  227. {0XFFB8,0X10},
  228. {0XFFB9,0X62},
  229. {0XFFBA,0X20},
  230. {0XFFBB,0XAA},
  231. {0XFFBC,0X20},
  232. {0XFFBD,0X20},
  233. {0XFFC7,0X31},
  234. {0XFFC8,0X06},
  235. {0XFFC9,0X08},
  236. {0XFFCB,0XC0},
  237. {0XFFCC,0X80},
  238. {0XFFCD,0X2D},
  239. {0XFFCE,0X10},
  240. {0XFFCF,0X80},
  241. {0XFFD0,0X80},
  242. {0XFFD2,0X4F},
  243. {0XFFD3,0X80},
  244. {0XFFD4,0X80},
  245. {0XFFD7,0X1A},
  246. {0XFFD8,0X80},
  247. {0XFFE7,0X50},
  248. {0XFFE8,0XFF},
  249. {0XFFE9,0X22},
  250. {0XFFEA,0X20},
  251. {0XFFF0,0X4C},
  252. {0XFFF1,0XE8},
  253. {0XFFF2,0XE8},
  254. {0XFFF3,0XD7},
  255. {0XFFF4,0XFD},
  256. {0XFFF5,0X44},
  257. {0XFFF6,0XFA},
  258. {0XFFF7,0XE4},
  259. {0XFFF8,0XED},
  260. {0XFFF9,0XFD},
  261. {0XFFFA,0X4C},
  262. {0XFFFB,0X81},
  263. {0XFFD5,0X00},
  264. {0XFFD6,0X40},
  265. //GAMMA
  266. {0XFF00,0X03},
  267. {0XFF01,0X2A},
  268. {0XFF02,0X3C},
  269. {0XFF03,0X4A},
  270. {0XFF04,0X57},
  271. {0XFF05,0X63},
  272. {0XFF06,0X6E},
  273. {0XFF07,0X78},
  274. {0XFF08,0X80},
  275. {0XFF09,0X88},
  276. {0XFF0A,0X91},
  277. {0XFF0B,0X99},
  278. {0XFF0C,0XA1},
  279. {0XFF0D,0XA9},
  280. {0XFF0E,0XB0},
  281. {0XFF0F,0XB6},
  282. {0XFF10,0XBC},
  283. {0XFF11,0XC2},
  284. {0XFF12,0XC7},
  285. {0XFF13,0XCC},
  286. {0XFF14,0XD0},
  287. {0XFF15,0XD4},
  288. {0XFF16,0XD8},
  289. {0XFF17,0XDC},
  290. {0XFF18,0XE1},
  291. {0XFF19,0XE5},
  292. {0XFF1A,0XE9},
  293. {0XFF1B,0XEC},
  294. {0XFF1C,0XF0},
  295. {0XFF1D,0XF4},
  296. {0XFF1E,0XF8},
  297. {0XFF1F,0XFB},
  298. {0XFF20,0X2A},
  299. {0XFF21,0X3C},
  300. {0XFF22,0X4A},
  301. {0XFF23,0X57},
  302. {0XFF24,0X63},
  303. {0XFF25,0X6E},
  304. {0XFF26,0X78},
  305. {0XFF27,0X80},
  306. {0XFF28,0X88},
  307. {0XFF29,0X91},
  308. {0XFF2A,0X99},
  309. {0XFF2B,0XA1},
  310. {0XFF2C,0XA9},
  311. {0XFF2D,0XB0},
  312. {0XFF2E,0XB6},
  313. {0XFF2F,0XBC},
  314. {0XFF30,0XC2},
  315. {0XFF31,0XC7},
  316. {0XFF32,0XCC},
  317. {0XFF33,0XD0},
  318. {0XFF34,0XD4},
  319. {0XFF35,0XD8},
  320. {0XFF36,0XDC},
  321. {0XFF37,0XE1},
  322. {0XFF38,0XE5},
  323. {0XFF39,0XE9},
  324. {0XFF3A,0XEC},
  325. {0XFF3B,0XF0},
  326. {0XFF3C,0XF4},
  327. {0XFF3D,0XF8},
  328. {0XFF3E,0XFB},
  329. {0XFF3F,0X2A},
  330. {0XFF40,0X3C},
  331. {0XFF41,0X4A},
  332. {0XFF42,0X57},
  333. {0XFF43,0X63},
  334. {0XFF44,0X6E},
  335. {0XFF45,0X78},
  336. {0XFF46,0X80},
  337. {0XFF47,0X88},
  338. {0XFF48,0X91},
  339. {0XFF49,0X99},
  340. {0XFF4A,0XA1},
  341. {0XFF4B,0XA9},
  342. {0XFF4C,0XB0},
  343. {0XFF4D,0XB6},
  344. {0XFF4E,0XBC},
  345. {0XFF4F,0XC2},
  346. {0XFF50,0XC7},
  347. {0XFF51,0XCC},
  348. {0XFF52,0XD0},
  349. {0XFF53,0XD4},
  350. {0XFF54,0XD8},
  351. {0XFF55,0XDC},
  352. {0XFF56,0XE1},
  353. {0XFF57,0XE5},
  354. {0XFF58,0XE9},
  355. {0XFF59,0XEC},
  356. {0XFF5A,0XF0},
  357. {0XFF5B,0XF4},
  358. {0XFF5C,0XF8},
  359. {0XFF5D,0XFB},
  360. {0XFF5E,0XFF},
  361. {0XFF5F,0XFF},
  362. {0XFF60,0XFF},
  363. };
  364. PanlstaticPara ark1668e_devb_custom_para[] = {
  365. //VP
  366. {0XFFB0,0X23},
  367. {0XFFB1,0X0F},
  368. {0XFFB2,0X12},
  369. {0XFFB3,0X15},
  370. {0XFFB4,0X15},
  371. {0XFFB7,0X90},
  372. {0XFFB8,0X10},
  373. {0XFFB9,0X62},
  374. {0XFFBA,0X20},
  375. {0XFFBB,0XAA},
  376. {0XFFBC,0X20},
  377. {0XFFBD,0X20},
  378. {0XFFC7,0X31},
  379. {0XFFC8,0X06},
  380. {0XFFC9,0X08},
  381. {0XFFCB,0XC0},
  382. {0XFFCC,0X80},
  383. {0XFFCD,0X2D},
  384. {0XFFCE,0X10},
  385. {0XFFCF,0X80},
  386. {0XFFD0,0X80},
  387. {0XFFD2,0X4F},
  388. {0XFFD3,0X80},
  389. {0XFFD4,0X80},
  390. {0XFFD7,0X1A},
  391. {0XFFD8,0X80},
  392. {0XFFE7,0X50},
  393. {0XFFE8,0XFF},
  394. {0XFFE9,0X22},
  395. {0XFFEA,0X20},
  396. {0XFFF0,0X4C},
  397. {0XFFF1,0XE8},
  398. {0XFFF2,0XE8},
  399. {0XFFF3,0XD7},
  400. {0XFFF4,0XFD},
  401. {0XFFF5,0X44},
  402. {0XFFF6,0XFA},
  403. {0XFFF7,0XE4},
  404. {0XFFF8,0XED},
  405. {0XFFF9,0XFD},
  406. {0XFFFA,0X4C},
  407. {0XFFFB,0X81},
  408. {0XFFD5,0X00},
  409. {0XFFD6,0X40},
  410. //GAMMA
  411. {0XFF00,0X03},
  412. {0XFF01,0X2A},
  413. {0XFF02,0X3C},
  414. {0XFF03,0X4A},
  415. {0XFF04,0X57},
  416. {0XFF05,0X63},
  417. {0XFF06,0X6E},
  418. {0XFF07,0X78},
  419. {0XFF08,0X80},
  420. {0XFF09,0X88},
  421. {0XFF0A,0X91},
  422. {0XFF0B,0X99},
  423. {0XFF0C,0XA1},
  424. {0XFF0D,0XA9},
  425. {0XFF0E,0XB0},
  426. {0XFF0F,0XB6},
  427. {0XFF10,0XBC},
  428. {0XFF11,0XC2},
  429. {0XFF12,0XC7},
  430. {0XFF13,0XCC},
  431. {0XFF14,0XD0},
  432. {0XFF15,0XD4},
  433. {0XFF16,0XD8},
  434. {0XFF17,0XDC},
  435. {0XFF18,0XE1},
  436. {0XFF19,0XE5},
  437. {0XFF1A,0XE9},
  438. {0XFF1B,0XEC},
  439. {0XFF1C,0XF0},
  440. {0XFF1D,0XF4},
  441. {0XFF1E,0XF8},
  442. {0XFF1F,0XFB},
  443. {0XFF20,0X2A},
  444. {0XFF21,0X3C},
  445. {0XFF22,0X4A},
  446. {0XFF23,0X57},
  447. {0XFF24,0X63},
  448. {0XFF25,0X6E},
  449. {0XFF26,0X78},
  450. {0XFF27,0X80},
  451. {0XFF28,0X88},
  452. {0XFF29,0X91},
  453. {0XFF2A,0X99},
  454. {0XFF2B,0XA1},
  455. {0XFF2C,0XA9},
  456. {0XFF2D,0XB0},
  457. {0XFF2E,0XB6},
  458. {0XFF2F,0XBC},
  459. {0XFF30,0XC2},
  460. {0XFF31,0XC7},
  461. {0XFF32,0XCC},
  462. {0XFF33,0XD0},
  463. {0XFF34,0XD4},
  464. {0XFF35,0XD8},
  465. {0XFF36,0XDC},
  466. {0XFF37,0XE1},
  467. {0XFF38,0XE5},
  468. {0XFF39,0XE9},
  469. {0XFF3A,0XEC},
  470. {0XFF3B,0XF0},
  471. {0XFF3C,0XF4},
  472. {0XFF3D,0XF8},
  473. {0XFF3E,0XFB},
  474. {0XFF3F,0X2A},
  475. {0XFF40,0X3C},
  476. {0XFF41,0X4A},
  477. {0XFF42,0X57},
  478. {0XFF43,0X63},
  479. {0XFF44,0X6E},
  480. {0XFF45,0X78},
  481. {0XFF46,0X80},
  482. {0XFF47,0X88},
  483. {0XFF48,0X91},
  484. {0XFF49,0X99},
  485. {0XFF4A,0XA1},
  486. {0XFF4B,0XA9},
  487. {0XFF4C,0XB0},
  488. {0XFF4D,0XB6},
  489. {0XFF4E,0XBC},
  490. {0XFF4F,0XC2},
  491. {0XFF50,0XC7},
  492. {0XFF51,0XCC},
  493. {0XFF52,0XD0},
  494. {0XFF53,0XD4},
  495. {0XFF54,0XD8},
  496. {0XFF55,0XDC},
  497. {0XFF56,0XE1},
  498. {0XFF57,0XE5},
  499. {0XFF58,0XE9},
  500. {0XFF59,0XEC},
  501. {0XFF5A,0XF0},
  502. {0XFF5B,0XF4},
  503. {0XFF5C,0XF8},
  504. {0XFF5D,0XFB},
  505. {0XFF5E,0XFF},
  506. {0XFF5F,0XFF},
  507. {0XFF60,0XFF},
  508. };
  509. struct ark7116 {
  510. struct v4l2_ctrl_handler hdl;
  511. struct v4l2_subdev sd;
  512. struct gpio_desc *reset_gpio;
  513. u32 input;
  514. u8 brightness;
  515. u8 contrast;
  516. u8 saturation;
  517. u8 hue;
  518. struct i2c_client *client;
  519. unsigned short default_addr;
  520. PanlstaticPara *custom_para;
  521. };
  522. #define VIDIOC_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
  523. #define VIDIOC_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
  524. #define VIDIOC_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
  525. #define VIDIOC_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
  526. static inline struct ark7116 *to_ark7116(struct v4l2_subdev *sd)
  527. {
  528. return container_of(sd, struct ark7116, sd);
  529. }
  530. static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
  531. {
  532. return &container_of(ctrl->handler, struct ark7116, hdl)->sd;
  533. }
  534. static int ark7116_read(struct v4l2_subdev *sd, unsigned char addr)
  535. {
  536. struct i2c_client *client = v4l2_get_subdevdata(sd);
  537. int rc;
  538. rc = i2c_smbus_read_byte_data(client, addr);
  539. if (rc < 0) {
  540. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  541. return rc;
  542. }
  543. dev_dbg(sd->dev, "ark7116: read 0x%02x = %02x\n", addr, rc);
  544. return rc;
  545. }
  546. static int ark7116_write(struct v4l2_subdev *sd, unsigned char addr,
  547. unsigned char value)
  548. {
  549. struct i2c_client *client = v4l2_get_subdevdata(sd);
  550. int rc;
  551. dev_dbg(sd->dev, "ark7116: writing %02x %02x\n", addr, value);
  552. rc = i2c_smbus_write_byte_data(client, addr, value);
  553. if (rc < 0)
  554. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  555. #ifdef ARK7116_DUMP_REGS
  556. rc = i2c_smbus_read_byte_data(client, addr);
  557. dev_dbg(sd->dev, "ark7116: read 0x%02x = %02x\n", addr, rc);
  558. #endif
  559. return rc;
  560. }
  561. static unsigned char to_slave_addr(unsigned char addr)
  562. {
  563. switch(addr) {
  564. case 0XF9:
  565. case 0XFD:
  566. return 0xb0;
  567. case 0XFA:
  568. return 0xbe;
  569. case 0XFB:
  570. return 0xb6;
  571. case 0XFC:
  572. return 0xb8;
  573. case 0XFE:
  574. return 0xb2;
  575. case 0XFF:
  576. return 0Xb4;
  577. case 0X00:
  578. return 0xbe;
  579. default:
  580. return 0xb0;
  581. }
  582. }
  583. static unsigned char amt_read_reg(struct ark7116 *decoder, unsigned int reg)
  584. {
  585. struct v4l2_subdev *sd = &decoder->sd;
  586. struct i2c_client *client = v4l2_get_subdevdata(sd);
  587. int rc;
  588. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  589. rc = i2c_smbus_read_byte_data(client, reg & 0xff);
  590. client->addr = decoder->default_addr;
  591. if (rc < 0) {
  592. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  593. return rc;
  594. }
  595. dev_dbg(sd->dev, "ark7116: read 0x%04x = %02x\n", reg, rc);
  596. return rc;
  597. }
  598. static int amt_write_reg(struct ark7116 *decoder, unsigned int reg, unsigned char value)
  599. {
  600. struct v4l2_subdev *sd = &decoder->sd;
  601. struct i2c_client *client = v4l2_get_subdevdata(sd);
  602. int rc;
  603. dev_dbg(sd->dev, "ark7116: writing %04x %02x\n", reg, value);
  604. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  605. rc = i2c_smbus_write_byte_data(client, reg & 0xff, value);
  606. client->addr = decoder->default_addr;
  607. if (rc < 0)
  608. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  609. #ifdef ARK7116_DUMP_REGS
  610. client->addr = to_slave_addr((reg >> 8) & 0xff) >> 1;
  611. rc = i2c_smbus_read_byte_data(client, reg & 0xff);
  612. client->addr = decoder->default_addr;
  613. dev_dbg(sd->dev, "ark7116: read 0x%04x = %02x\n", reg, rc);
  614. #endif
  615. return rc;
  616. }
  617. /****************************************************************************
  618. I2C Client & Driver
  619. ****************************************************************************/
  620. static int ark7116_detect_signal(struct ark7116 *decoder)
  621. {
  622. return (ark7116_read(&decoder->sd, ARK7116_STATUS) & 0x6) == 0x6;
  623. }
  624. static int ark7116_select_input(struct ark7116 *decoder, u32 input)
  625. {
  626. unsigned char val;
  627. if (input > ARK7116_AV2)
  628. return -EINVAL;
  629. if (input == ARK7116_AV0)
  630. val = 0;
  631. else if (input == ARK7116_AV1)
  632. val = 0x10;
  633. else if (input == ARK7116_AV2)
  634. val = 0x30;
  635. return ark7116_write(&decoder->sd, ARK7116_INPUT_CTL, val);
  636. }
  637. static int ark7116_reset(struct ark7116 *decoder)
  638. {
  639. gpiod_set_value_cansleep(decoder->reset_gpio, 0);
  640. mdelay(1);
  641. gpiod_set_value_cansleep(decoder->reset_gpio, 1);
  642. mdelay(1);
  643. gpiod_set_value_cansleep(decoder->reset_gpio, 0);
  644. mdelay(10);
  645. return 0;
  646. };
  647. static void ark7116_config_slave_mode(struct ark7116 *decoder)
  648. {
  649. unsigned char addr_buf[6] = {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
  650. unsigned char data_buf[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
  651. unsigned char i;
  652. data_buf[0] = 0X55;
  653. data_buf[1] = 0xaa;
  654. data_buf[2] = 0X03;
  655. data_buf[3] = 0X50; //slave mode
  656. data_buf[4] = 0; // crc val
  657. data_buf[5] = data_buf[2] ^ data_buf[3] ^ data_buf[4];
  658. amt_write_reg(decoder, ARK7116_BUS_STATUS, 0x00); //I2c Write Start
  659. for(i =0;i < 6;i++)
  660. amt_write_reg(decoder, addr_buf[i], data_buf[i]);
  661. amt_write_reg(decoder, ARK7116_BUS_STATUS, 0x11); //I2c Write End
  662. udelay(10);
  663. amt_write_reg(decoder, 0xFAC6, 0x20);
  664. }
  665. static void ark7116_config_common(struct ark7116 *decoder)
  666. {
  667. int i;
  668. amt_write_reg(decoder, ARK7116_ENH_PLL, 0x20);
  669. for (i = 0; i < sizeof(AV1_staticPara) / sizeof(AV1_staticPara[0]); i++)
  670. amt_write_reg(decoder, AV1_staticPara[i].addr, AV1_staticPara[i].value);
  671. for (i = 0; i < sizeof(AV1_posDynPara) / sizeof(AV1_posDynPara[0]); i++)
  672. amt_write_reg(decoder, AV1_posDynPara[i].addr, AV1_posDynPara[i].value[DISP_16_9]);
  673. for (i = 0; i < sizeof(AMT_PadMuxStaticPara) / sizeof(AMT_PadMuxStaticPara[0]); i++)
  674. amt_write_reg(decoder, AMT_PadMuxStaticPara[i].addr, AMT_PadMuxStaticPara[i].value);
  675. amt_write_reg(decoder, ARK7116_ENH_PLL, 0x2C);
  676. }
  677. static int ark7116_config_custom(struct ark7116 *decoder)
  678. {
  679. int i;
  680. int paranum = 0;
  681. if (decoder->custom_para == ark169_custom_para)
  682. paranum = sizeof(ark169_custom_para) / sizeof(ark169_custom_para[0]);
  683. else if (decoder->custom_para == ark1668e_devb_custom_para)
  684. paranum = sizeof(ark1668e_devb_custom_para) / sizeof(ark1668e_devb_custom_para[0]);
  685. for (i = 0; i < paranum; i++)
  686. amt_write_reg(decoder, decoder->custom_para[i].addr, decoder->custom_para[i].value);
  687. return 0;
  688. }
  689. static int _ark7116_init(struct ark7116 *decoder)
  690. {
  691. int slave_mode, rom_sel;
  692. int retry_times = 10;
  693. unsigned char val;
  694. reinit:
  695. ark7116_reset(decoder);
  696. ark7116_config_slave_mode(decoder);
  697. //soft reset 7116
  698. amt_write_reg(decoder, 0xFD00, 0x5A);
  699. mdelay(10);
  700. ark7116_config_slave_mode(decoder);
  701. val = amt_read_reg(decoder, 0xFAC6);
  702. slave_mode = (val & 0x80) ? 0 : 1;
  703. rom_sel = (val & 0x02) ? 1 : 0;
  704. if (rom_sel || !slave_mode) {
  705. if (retry_times-- > 0) {
  706. goto reinit;
  707. } else {
  708. printk(KERN_ALERT "ark7116 slave config error.\n");
  709. return -1;
  710. }
  711. }
  712. ark7116_config_common(decoder);
  713. ark7116_config_custom(decoder);
  714. //soft reset decoder
  715. val = amt_read_reg(decoder, 0xFEA0);
  716. val |= 1;
  717. amt_write_reg(decoder, 0xFEA0, val);
  718. mdelay(10);
  719. val &= ~1;
  720. amt_write_reg(decoder, 0xFEA0, val);
  721. mdelay(1);
  722. ark7116_select_input(decoder, decoder->input);
  723. return 0;
  724. }
  725. /* ----------------------------------------------------------------------- */
  726. static int ark7116_s_ctrl(struct v4l2_ctrl *ctrl)
  727. {
  728. struct v4l2_subdev *sd = to_sd(ctrl);
  729. switch (ctrl->id) {
  730. case V4L2_CID_BRIGHTNESS:
  731. ark7116_write(sd, ARK7116_BRIGHT_CTL, ctrl->val);
  732. return 0;
  733. case V4L2_CID_CONTRAST:
  734. ark7116_write(sd, ARK7116_CONTRAST_CTL, ctrl->val);
  735. return 0;
  736. case V4L2_CID_SATURATION:
  737. ark7116_write(sd, ARK7116_SATURATION_CTL, ctrl->val);
  738. return 0;
  739. case V4L2_CID_HUE:
  740. ark7116_write(sd, ARK7116_HUE_CTL, ctrl->val);
  741. return 0;
  742. }
  743. return -EINVAL;
  744. }
  745. static int ark7116_g_input_status(struct v4l2_subdev *sd, u32 *status)
  746. {
  747. struct ark7116 *decoder = to_ark7116(sd);
  748. if (status) {
  749. *status = 0;
  750. if (!ark7116_detect_signal(decoder))
  751. *status |= V4L2_IN_ST_NO_SIGNAL;
  752. }
  753. return 0;
  754. }
  755. static int ark7116_s_routing(struct v4l2_subdev *sd, u32 input,
  756. u32 output, u32 config)
  757. {
  758. struct ark7116 *decoder = to_ark7116(sd);
  759. ark7116_select_input(decoder, input);
  760. decoder->input = input;
  761. return 0;
  762. }
  763. static int ark7116_init(struct v4l2_subdev *sd, u32 val)
  764. {
  765. struct ark7116 *decoder = to_ark7116(sd);
  766. int ret;
  767. ret=_ark7116_init(decoder);
  768. if(ret){
  769. printk(KERN_ALERT "_ark7116_init error.\n");
  770. }
  771. return ret;
  772. }
  773. static long ark7116_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
  774. {
  775. int ret = 0;
  776. switch (cmd) {
  777. case VIDIOC_GET_RESOLUTION:
  778. {
  779. int* temp = (int *)arg;
  780. *temp = TYPE_CVBS;
  781. break;
  782. }
  783. case VIDIOC_GET_PROGRESSIVE:
  784. {
  785. int* temp = (int *)arg;
  786. *temp = 0;
  787. break;
  788. }
  789. case VIDIOC_GET_CHIPINFO:
  790. {
  791. int* temp = (int *)arg;
  792. *temp = TYPE_ARK7116;
  793. break;
  794. }
  795. case VIDIOC_GET_ITU601_ENABLE:
  796. {
  797. int* temp = (int *)arg;
  798. *temp = 0;
  799. break;
  800. }
  801. default:
  802. return -ENOIOCTLCMD;
  803. }
  804. return ret;
  805. }
  806. /* ----------------------------------------------------------------------- */
  807. static const struct v4l2_ctrl_ops ark7116_ctrl_ops = {
  808. .s_ctrl = ark7116_s_ctrl,
  809. };
  810. static const struct v4l2_subdev_video_ops ark7116_video_ops = {
  811. .g_input_status = ark7116_g_input_status,
  812. .s_routing = ark7116_s_routing,
  813. };
  814. static const struct v4l2_subdev_core_ops ark7116_core_ops = {
  815. .init = ark7116_init,
  816. .ioctl = ark7116_ioctl,
  817. };
  818. static const struct v4l2_subdev_ops ark7116_ops = {
  819. .core = &ark7116_core_ops,
  820. .video = &ark7116_video_ops,
  821. };
  822. static int ark7116_parse_dt(struct ark7116 *decoder, struct device_node *np)
  823. {
  824. int ret = 0;
  825. int value;
  826. if (of_property_read_u32(np, "default-channel", &decoder->input))
  827. decoder->input = 0;
  828. if(!of_property_read_u32(np, "carback-config", &value)) {
  829. if(value == 1){
  830. printk("Initialize in carback.\n");
  831. }
  832. else if(value == 0){
  833. ret=_ark7116_init(decoder);
  834. if(ret){
  835. printk(KERN_ALERT "_ark7116_init error.\n");
  836. }
  837. }
  838. }
  839. return ret;
  840. }
  841. static int ark7116_probe(struct i2c_client *client,
  842. const struct i2c_device_id *id)
  843. {
  844. struct ark7116 *decoder;
  845. struct v4l2_subdev *sd;
  846. struct device_node *np = client->dev.of_node;
  847. int res;
  848. /* Check if the adapter supports the needed features */
  849. if (!i2c_check_functionality(client->adapter,
  850. I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  851. return -EIO;
  852. decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL);
  853. if (!decoder)
  854. return -ENOMEM;
  855. decoder->client = client;
  856. decoder->default_addr = client->addr;
  857. decoder->custom_para = (PanlstaticPara *)id->driver_data;
  858. sd = &decoder->sd;
  859. decoder->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
  860. GPIOD_OUT_HIGH);
  861. if (IS_ERR(decoder->reset_gpio)) {
  862. res = PTR_ERR(decoder->reset_gpio);
  863. v4l_err(client, "request for reset pin failed: %d\n", res);
  864. return res;
  865. }
  866. res = ark7116_parse_dt(decoder, np);
  867. if (res) {
  868. dev_err(sd->dev, "DT parsing error: %d\n", res);
  869. return res;
  870. }
  871. v4l2_i2c_subdev_init(sd, client, &ark7116_ops);
  872. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  873. v4l2_ctrl_handler_init(&decoder->hdl, 4);
  874. v4l2_ctrl_new_std(&decoder->hdl, &ark7116_ctrl_ops,
  875. V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
  876. v4l2_ctrl_new_std(&decoder->hdl, &ark7116_ctrl_ops,
  877. V4L2_CID_CONTRAST, 0, 255, 1, 128);
  878. v4l2_ctrl_new_std(&decoder->hdl, &ark7116_ctrl_ops,
  879. V4L2_CID_SATURATION, 0, 255, 1, 128);
  880. v4l2_ctrl_new_std(&decoder->hdl, &ark7116_ctrl_ops,
  881. V4L2_CID_HUE, -128, 127, 1, 0);
  882. sd->ctrl_handler = &decoder->hdl;
  883. if (decoder->hdl.error) {
  884. res = decoder->hdl.error;
  885. goto err;
  886. }
  887. res = v4l2_async_register_subdev(sd);
  888. if (res < 0)
  889. goto err;
  890. return 0;
  891. err:
  892. v4l2_ctrl_handler_free(&decoder->hdl);
  893. return res;
  894. printk("ark7116_probe.\n");
  895. return 0;
  896. }
  897. static int ark7116_remove(struct i2c_client *client)
  898. {
  899. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  900. struct ark7116 *decoder = to_ark7116(sd);
  901. dev_dbg(sd->dev,
  902. "ark7116.c: removing ark7116 adapter on address 0x%x\n",
  903. client->addr << 1);
  904. v4l2_async_unregister_subdev(sd);
  905. v4l2_ctrl_handler_free(&decoder->hdl);
  906. return 0;
  907. }
  908. /* ----------------------------------------------------------------------- */
  909. /* the length of name must less than 20 */
  910. static const struct i2c_device_id ark7116_id[] = {
  911. { "ark7116_ark169", (kernel_ulong_t)ark169_custom_para },
  912. { "ark7116_1668e_devb", (kernel_ulong_t)ark1668e_devb_custom_para },
  913. { }
  914. };
  915. MODULE_DEVICE_TABLE(i2c, ark7116_id);
  916. #if IS_ENABLED(CONFIG_OF)
  917. static const struct of_device_id ark7116_of_match[] = {
  918. { .compatible = "arkmicro,ark7116_ark169", },
  919. { .compatible = "arkmicro,ark7116_1668e_devb", },
  920. { /* sentinel */ },
  921. };
  922. MODULE_DEVICE_TABLE(of, ark7116_of_match);
  923. #endif
  924. static struct i2c_driver ark7116_driver = {
  925. .driver = {
  926. .of_match_table = of_match_ptr(ark7116_of_match),
  927. .name = "ark7116",
  928. },
  929. .probe = ark7116_probe,
  930. .remove = ark7116_remove,
  931. .id_table = ark7116_id,
  932. };
  933. static int __init ark_7116_init(void)
  934. {
  935. return i2c_add_driver(&ark7116_driver);
  936. }
  937. static void __exit ark_7116_exit(void)
  938. {
  939. i2c_del_driver(&ark7116_driver);
  940. }
  941. device_initcall(ark_7116_init);
  942. MODULE_AUTHOR("arkmicro");
  943. MODULE_DESCRIPTION("arkmicro 7116 decoder driver for v4l2");
  944. MODULE_LICENSE("GPL v2");