ark7116.c 23 KB

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