ark7116_zhonghong.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. #include<linux/gpio.h>
  2. #include <linux/delay.h>
  3. #include <linux/i2c.h>
  4. #include "ark7116.h"
  5. extern struct ark7116_private_data *g_ark7116_pdata;
  6. static int i2c_debug = 0;
  7. PanlstaticPara AV1_staticPara[]=
  8. {
  9. //GLOBAL
  10. {0XFD02,0X00},
  11. {0XFD0A,0X18},
  12. {0XFD0B,0X27},
  13. {0XFD0C,0X33},
  14. {0XFD0D,0XE0},
  15. {0XFD0E,0X2C},
  16. {0XFD0F,0X03},
  17. {0XFD10,0X04},
  18. {0XFD11,0XFF},
  19. {0XFD12,0XFF},
  20. {0XFD13,0XFF},
  21. {0XFD14,0X02},
  22. {0XFD15,0X02},
  23. {0XFD16,0X02},
  24. {0XFD1A,0X45},
  25. {0XFD19,0X42},
  26. //PWM
  27. //DECODER
  28. {0XFE01,0X06},
  29. {0XFE06,0X02},
  30. {0XFE07,0X80},
  31. {0XFE0F,0X07},
  32. {0XFE13,0X16},
  33. {0XFE14,0X22},
  34. {0XFE15,0X05},
  35. {0XFE26,0X0E},
  36. {0XFE27,0X00},
  37. {0XFE48,0X07},
  38. {0XFE54,0X00},
  39. {0XFE55,0X0A},
  40. {0XFE63,0XC0},
  41. {0XFE83,0X7F},
  42. {0XFED5,0XB1},
  43. {0XFED7,0XF7},
  44. {0XFEDC,0X00},
  45. {0XFE44,0X20},
  46. {0XFE45,0X80},
  47. {0XFE43,0X80},
  48. {0XFE56,0X07},
  49. {0XFEC9,0X01},
  50. {0XFE46,0X00},
  51. {0XFE42,0X00},
  52. {0XFE47,0X8A},
  53. {0XFE1E,0X0E},
  54. //VP
  55. {0XFFB0,0X23},
  56. {0XFFB1,0X0D}, //{0XFFB1,0X0F},
  57. {0XFFB2,0X12},
  58. {0XFFB3,0X15},
  59. {0XFFB4,0X15},
  60. {0XFFB7,0X90},
  61. {0XFFB8,0X10},
  62. {0XFFB9,0X62},
  63. {0XFFBA,0X20},
  64. {0XFFBB,0XAA},
  65. {0XFFBC,0X20},
  66. {0XFFC7,0X31},
  67. {0XFFC8,0X03}, //{0XFFC8,0X06},
  68. {0XFFC9,0X08},
  69. {0XFFCB,0XC0},
  70. {0XFFCC,0X80},
  71. {0XFFCD,0X2D},
  72. {0XFFCE,0X10},
  73. {0XFFCF,0X80},
  74. {0XFFD0,0X80},
  75. {0XFFD2,0X4F},
  76. {0XFFD3,0X80},
  77. {0XFFD4,0X80},
  78. {0XFFD7,0X1A},
  79. {0XFFD8,0X80},
  80. {0XFFE7,0X50},
  81. {0XFFE8,0XFF},
  82. {0XFFE9,0X22},
  83. {0XFFEA,0X20},
  84. {0XFFF0,0X29},
  85. {0XFFF1,0XF0},
  86. {0XFFF2,0XF0},
  87. {0XFFF3,0XDF},
  88. {0XFFF4,0XFD},
  89. {0XFFF5,0X20}, //{0XFFF5,0X27},
  90. {0XFFF6,0XFA},
  91. {0XFFF7,0XD6},
  92. {0XFFF8,0XFF},
  93. {0XFFF9,0XFD},
  94. {0XFFFA,0X2F},
  95. {0XFFFB,0X81},
  96. {0XFFD5,0X00},
  97. {0XFFD6,0X40},
  98. //TCON
  99. {0XFC00,0X40},
  100. {0XFC01,0X00},
  101. {0XFC02,0X00},
  102. {0XFC09,0X00},
  103. {0XFC0A,0X00},
  104. //SCALE
  105. {0XFC90,0X02},
  106. {0XFC91,0X01},
  107. {0XFC92,0X00},
  108. {0XFC93,0X0C},
  109. {0XFC94,0X00},
  110. {0XFC95,0X00},
  111. {0XFC96,0XDB},
  112. {0XFC97,0X03},
  113. {0XFC98,0X00},
  114. {0XFC99,0X04},
  115. {0XFC9A,0X59},
  116. {0XFC9B,0X03},
  117. {0XFC9C,0X01},
  118. {0XFC9D,0X00},
  119. {0XFC9E,0X06},
  120. {0XFC9F,0X00},
  121. {0XFCA0,0X23},
  122. {0XFCA1,0X00},
  123. {0XFCA2,0XF5},
  124. {0XFCA3,0X02},
  125. {0XFCA4,0X03},
  126. {0XFCA5,0X00},
  127. {0XFCA6,0X05},
  128. {0XFCA7,0X00},
  129. {0XFCA8,0X0C},
  130. {0XFCA9,0X00},
  131. {0XFCAA,0X04},
  132. {0XFCAB,0X01},
  133. {0XFCAC,0X20},
  134. {0XFCAD,0X00},
  135. {0XFCAE,0X00},
  136. {0XFCAF,0X00},
  137. {0XFCB0,0X00},
  138. {0XFCB1,0X14},
  139. {0XFCB2,0X00},
  140. {0XFCB3,0X00},
  141. {0XFCB4,0X00},
  142. {0XFCB5,0X00},
  143. {0XFCB7,0X06},
  144. {0XFCB8,0X01},
  145. {0XFCBB,0X39},
  146. {0XFCBC,0X01},
  147. {0XFCBD,0X01},
  148. {0XFCBE,0X00},
  149. {0XFCBF,0X0C},
  150. {0XFCC0,0X00},
  151. {0XFCC1,0X00},
  152. {0XFCC2,0XDB},
  153. {0XFCC3,0X03},
  154. {0XFCC4,0X00},
  155. {0XFCC5,0X04},
  156. {0XFCC6,0X5E},
  157. {0XFCC7,0X03},
  158. {0XFCC8,0X01},
  159. {0XFCC9,0X00},
  160. {0XFCCA,0X06},
  161. {0XFCCB,0X00},
  162. {0XFCCC,0X20},
  163. {0XFCCD,0X00},
  164. {0XFCCE,0XF2},
  165. {0XFCCF,0X02},
  166. {0XFCD1,0X00},
  167. {0XFCD2,0X08},
  168. {0XFCD3,0X00},
  169. {0XFCD4,0X0A},
  170. {0XFCD5,0X00},
  171. {0XFCD6,0X2A},
  172. {0XFCD7,0X01},
  173. {0XFCD8,0X0C},
  174. {0XFCD9,0X00},
  175. {0XFCDA,0X00},
  176. {0XFCDB,0X00},
  177. {0XFCDC,0X00},
  178. {0XFCDD,0X14},
  179. {0XFCDE,0X00},
  180. {0XFCDF,0X00},
  181. {0XFCE0,0X00},
  182. {0XFCE1,0X00},
  183. {0XFCE3,0X01},
  184. {0XFCE4,0X02},
  185. {0XFCE7,0X03},
  186. {0XFCD0,0X03},
  187. {0XFCE2,0X00},
  188. {0XFCB6,0X00},
  189. {0XFB35,0X00},
  190. {0XFB89,0X00},
  191. //GAMMA
  192. {0XFF00,0X03},
  193. {0XFF01,0X05},
  194. {0XFF02,0X0C},
  195. {0XFF03,0X12},
  196. {0XFF04,0X1A},
  197. {0XFF05,0X22},
  198. {0XFF06,0X2A},
  199. {0XFF07,0X33},
  200. {0XFF08,0X3C},
  201. {0XFF09,0X46},
  202. {0XFF0A,0X4F},
  203. {0XFF0B,0X59},
  204. {0XFF0C,0X62},
  205. {0XFF0D,0X6C},
  206. {0XFF0E,0X75},
  207. {0XFF0F,0X7F},
  208. {0XFF10,0X88},
  209. {0XFF11,0X92},
  210. {0XFF12,0X9C},
  211. {0XFF13,0XA6},
  212. {0XFF14,0XB0},
  213. {0XFF15,0XBA},
  214. {0XFF16,0XC3},
  215. {0XFF17,0XCB},
  216. {0XFF18,0XD2},
  217. {0XFF19,0XD9},
  218. {0XFF1A,0XE0},
  219. {0XFF1B,0XE5},
  220. {0XFF1C,0XEB},
  221. {0XFF1D,0XF0},
  222. {0XFF1E,0XF5},
  223. {0XFF1F,0XFA},
  224. {0XFF20,0X05},
  225. {0XFF21,0X0C},
  226. {0XFF22,0X12},
  227. {0XFF23,0X1A},
  228. {0XFF24,0X22},
  229. {0XFF25,0X2A},
  230. {0XFF26,0X33},
  231. {0XFF27,0X3C},
  232. {0XFF28,0X46},
  233. {0XFF29,0X4F},
  234. {0XFF2A,0X59},
  235. {0XFF2B,0X62},
  236. {0XFF2C,0X6C},
  237. {0XFF2D,0X75},
  238. {0XFF2E,0X7F},
  239. {0XFF2F,0X88},
  240. {0XFF30,0X92},
  241. {0XFF31,0X9C},
  242. {0XFF32,0XA6},
  243. {0XFF33,0XB0},
  244. {0XFF34,0XBA},
  245. {0XFF35,0XC3},
  246. {0XFF36,0XCB},
  247. {0XFF37,0XD2},
  248. {0XFF38,0XD9},
  249. {0XFF39,0XE0},
  250. {0XFF3A,0XE5},
  251. {0XFF3B,0XEB},
  252. {0XFF3C,0XF0},
  253. {0XFF3D,0XF5},
  254. {0XFF3E,0XFA},
  255. {0XFF3F,0X05},
  256. {0XFF40,0X0C},
  257. {0XFF41,0X12},
  258. {0XFF42,0X1A},
  259. {0XFF43,0X22},
  260. {0XFF44,0X2A},
  261. {0XFF45,0X33},
  262. {0XFF46,0X3C},
  263. {0XFF47,0X46},
  264. {0XFF48,0X4F},
  265. {0XFF49,0X59},
  266. {0XFF4A,0X62},
  267. {0XFF4B,0X6C},
  268. {0XFF4C,0X75},
  269. {0XFF4D,0X7F},
  270. {0XFF4E,0X88},
  271. {0XFF4F,0X92},
  272. {0XFF50,0X9C},
  273. {0XFF51,0XA6},
  274. {0XFF52,0XB0},
  275. {0XFF53,0XBA},
  276. {0XFF54,0XC3},
  277. {0XFF55,0XCB},
  278. {0XFF56,0XD2},
  279. {0XFF57,0XD9},
  280. {0XFF58,0XE0},
  281. {0XFF59,0XE5},
  282. {0XFF5A,0XEB},
  283. {0XFF5B,0XF0},
  284. {0XFF5C,0XF5},
  285. {0XFF5D,0XFA},
  286. {0XFF5E,0XFF},
  287. {0XFF5F,0XFF},
  288. {0XFF60,0XFF},
  289. };
  290. PanlPosDynPara AV1_posDynPara[]=
  291. {
  292. //dispmode: 16:9 4:3 DM_EX0 DM_EX1 DM_EX2 DM_EX3
  293. //GLOBAL
  294. //PAD MUX
  295. //DECODER
  296. //VP
  297. //TCON
  298. //SCALE
  299. #if 0
  300. {0XFC96,{0XDE,0XD4,0XD4,0XD4,0XD4,0XD4}},
  301. {0XFC97,{0X03,0X03,0X03,0X03,0X03,0X03}},
  302. {0XFCAC,{0X1E,0X20,0X20,0X20,0X20,0X20}},
  303. {0XFCAD,{0X00,0X00,0X00,0X00,0X00,0X00}},
  304. {0XFCAE,{0X02,0X02,0X02,0X02,0X02,0X02}},
  305. {0XFCAF,{0X04,0X04,0X04,0X04,0X04,0X04}},
  306. {0XFCB0,{0X00,0X00,0X00,0X00,0X00,0X00}},
  307. {0XFCC2,{0XE0,0XE0,0XE0,0XE0,0XE0,0XE0}},
  308. {0XFCC3,{0X03,0X03,0X03,0X03,0X03,0X03}},
  309. {0XFCD8,{0X0F,0X0F,0X0F,0X0F,0X0F,0X0F}},
  310. {0XFCD9,{0X00,0X00,0X00,0X00,0X00,0X00}},
  311. {0XFCDA,{0X0A,0X0A,0X0A,0X0A,0X0A,0X0A}},
  312. {0XFCDB,{0X05,0X05,0X05,0X05,0X05,0X05}},
  313. {0XFCDC,{0X00,0X00,0X00,0X00,0X00,0X00}},
  314. #endif
  315. };
  316. PanlSysDynPara AV1_sysDynPara[]=
  317. {
  318. //picSys: PAL PAL-N PAL-M NTSC SECAM PAL-60 NTSC-J NTSC-4.43
  319. //GLOBAL
  320. //PAD MUX
  321. //DECODER
  322. //VP
  323. #if 0
  324. {0XFFD3,{0X82, 0X80, 0X80, 0X82, 0X80, 0X80, 0X80, 0X80}},
  325. {0XFFD4,{0X77, 0X80, 0X80, 0X77, 0X80, 0X80, 0X80, 0X80}},
  326. {0XFFD5,{0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}},
  327. {0XFFD6,{0X40, 0X36, 0X36, 0X40, 0X36, 0X36, 0X36, 0X36}},
  328. #endif
  329. //TCON
  330. //SCALE
  331. //GAMMA
  332. };
  333. /*µãÆÁ PAD MUX ²ÎÊý*/
  334. PanlstaticPara AMT_PadMuxStaticPara[]=
  335. {
  336. //PAD MUX
  337. {0XFD30,0X22},
  338. {0XFD32,0X11},
  339. {0XFD33,0X11},
  340. {0XFD34,0X00},
  341. {0XFD35,0X40},
  342. {0XFD36,0X44},
  343. {0XFD37,0X44},
  344. {0XFD38,0X44},
  345. {0XFD39,0X44},
  346. {0XFD3A,0X00},
  347. {0XFD3B,0X00},
  348. {0XFD3C,0X00},
  349. {0XFD3D,0X00},
  350. {0XFD3E,0X00},
  351. {0XFD3F,0X00},
  352. {0XFD40,0X00},
  353. {0XFD41,0X00},
  354. {0XFD44,0X01},
  355. {0XFD45,0X00},
  356. {0XFD46,0X00},
  357. {0XFD47,0X00},
  358. {0XFD48,0X00},
  359. {0XFD49,0X00},
  360. {0XFD4A,0X00},
  361. {0XFD4B,0X00},
  362. {0XFD50,0X09},
  363. {0XFD51,0X55},
  364. {0XFD52,0X55},
  365. {0XFD53,0X57},
  366. {0XFD54,0X57},
  367. {0XFD55,0X55},
  368. {0XFD56,0X55},
  369. {0XFD57,0X55},
  370. {0XFD58,0X55},
  371. {0XFD59,0X5D},
  372. {0XFD5A,0X55},
  373. };
  374. unsigned char device_addr_convert(unsigned char device_addr)
  375. {
  376. unsigned char addr;
  377. switch(device_addr)
  378. {
  379. case 0XF9:
  380. case 0XFD:
  381. addr = 0XB0;
  382. break;
  383. case 0XFA:
  384. addr = 0XBE;
  385. break;
  386. case 0XFB:
  387. addr = 0XB6;
  388. break;
  389. case 0XFC:
  390. addr = 0XB8;
  391. break;
  392. case 0XFE:
  393. addr = 0XB2;
  394. break;
  395. case 0XFF:
  396. addr = 0XB4;
  397. break;
  398. case 0X00:
  399. addr = 0XBE;
  400. break;
  401. default:
  402. addr = 0XB0;
  403. break;
  404. }
  405. return addr;
  406. }
  407. static unsigned char amt_read_reg(unsigned int device_reg)
  408. {
  409. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  410. struct i2c_client *client;
  411. struct i2c_msg read_msgs[2];
  412. s32 ret = -1;
  413. s32 retries = 0;
  414. u8 reg_val = 0x00;
  415. u8 device_addr;
  416. u8 reg_addr;
  417. if(!ark7116_pdata)
  418. return -ENODEV;
  419. client = ark7116_pdata->client;
  420. if(!client)
  421. return -ENODEV;
  422. device_addr = device_addr_convert(device_reg>>8 & 0XFF);
  423. reg_addr = (u8)(device_reg & 0XFF);
  424. read_msgs[0].flags = !I2C_M_RD;
  425. //read_msgs[0].addr = 0xB2>>1;
  426. read_msgs[0].addr = device_addr >> 1;//client->addr;
  427. read_msgs[0].len = 1;
  428. read_msgs[0].buf = &reg_addr;
  429. read_msgs[1].flags = I2C_M_RD;
  430. //read_msgs[1].addr = 0xB2>>1;
  431. read_msgs[1].addr = device_addr >> 1;//client->addr;
  432. read_msgs[1].len = 1;
  433. read_msgs[1].buf = &reg_val;//low byte
  434. while(retries < 5){
  435. ret = i2c_transfer(client->adapter, read_msgs, 2);
  436. if(ret == 2)break;
  437. retries++;
  438. }
  439. //printk("regValue=%d.\n", regValue);
  440. if (reg_val == 0xFF) reg_val = 0;
  441. if((retries >= 5)){
  442. printk("ark7116_read_byte_data write error\n");
  443. }
  444. //gpioi2c_print("device_reg=0x%x-->0x%x,, regValue=0x%x \n",device_reg, device_addr,reg_val);
  445. return reg_val;
  446. }
  447. static int amt_write_reg(unsigned short device_reg,unsigned char reg_val)
  448. {
  449. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  450. struct i2c_client *client;
  451. struct i2c_msg msg;
  452. s32 ret = -1;
  453. s32 retries = 0;
  454. u8 buf[2] = {0};
  455. u8 device_addr;
  456. u8 reg_addr;
  457. if(!ark7116_pdata)
  458. return -ENODEV;
  459. client = ark7116_pdata->client;
  460. if(!client)
  461. return -ENODEV;
  462. device_addr = device_addr_convert(device_reg>>8 & 0XFF);
  463. reg_addr = (u8)(device_reg & 0XFF);
  464. buf[0] = reg_addr;
  465. buf[1] = reg_val;
  466. msg.flags = 0;
  467. //msg.addr = 0xB2>>1;
  468. msg.addr = device_addr >> 1;//client->addr;
  469. msg.len = 2;
  470. msg.buf = buf;
  471. while(retries < 5){
  472. ret = i2c_transfer(client->adapter, &msg, 1);
  473. if (ret == 1)break;
  474. retries++;
  475. }
  476. if((retries >= 5)){
  477. printk("ark7116_write_byte write error\n");
  478. }
  479. if(i2c_debug){
  480. unsigned char val;
  481. val = amt_read_reg(device_reg);
  482. if(val != reg_val)
  483. gpioi2c_print("device_reg=0x%x-->0x%x,, val=0x%x, regval=0x%x \n",device_reg, device_addr,val,reg_val);
  484. }
  485. return ret;
  486. }
  487. static int amt_write_static_para(PanlstaticPara * dataPt,unsigned int num)
  488. {
  489. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  490. struct i2c_client *client;
  491. struct i2c_msg msg;
  492. s32 ret = -1;
  493. s32 retries = 0;
  494. u8 buf[2] = {0};
  495. u8 device_addr;
  496. u8 reg_addr;
  497. if(!ark7116_pdata)
  498. return -ENODEV;
  499. client = ark7116_pdata->client;
  500. if(!client)
  501. return -ENODEV;
  502. while(num--){
  503. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  504. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  505. buf[0] = reg_addr;
  506. buf[1] = (*dataPt).dat;
  507. msg.flags = 0;
  508. //msg.addr = 0xB2>>1;
  509. msg.addr = device_addr >> 1;//client->addr;
  510. msg.len = 2;
  511. msg.buf = buf;
  512. while(retries < 5){
  513. ret = i2c_transfer(client->adapter, &msg, 1);
  514. if (ret == 1)break;
  515. retries++;
  516. }
  517. if((retries >= 5)){
  518. printk("ark7116_write_byte write error\n");
  519. }
  520. if(i2c_debug){
  521. unsigned char val;
  522. val = amt_read_reg((*dataPt).addr);
  523. if(val != (*dataPt).dat)
  524. gpioi2c_print("device_reg=0x%x-->0x%x,, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat);
  525. }
  526. dataPt++;
  527. }
  528. return ret;
  529. }
  530. static int amt_write_disp_zoom_dyn_para(PanlPosDynPara *dataPt,unsigned int num,unsigned char currentmode)
  531. {
  532. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  533. struct i2c_client *client;
  534. struct i2c_msg msg;
  535. s32 ret = -1;
  536. s32 retries = 0;
  537. u8 buf[2] = {0};
  538. u8 device_addr;
  539. u8 reg_addr;
  540. if(!ark7116_pdata)
  541. return -ENODEV;
  542. client = ark7116_pdata->client;
  543. if(!client)
  544. return -ENODEV;
  545. while(num--){
  546. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  547. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  548. buf[0] = reg_addr;
  549. buf[1] = (*dataPt).dat_posDyn[currentmode];
  550. msg.flags = 0;
  551. //msg.addr = 0xB2>>1;
  552. msg.addr = device_addr >> 1;//client->addr;
  553. msg.len = 2;
  554. msg.buf = buf;
  555. while(retries < 5){
  556. ret = i2c_transfer(client->adapter, &msg, 1);
  557. if (ret == 1)break;
  558. retries++;
  559. }
  560. if(retries >= 5){
  561. printk("ark7116_write_byte write error\n");
  562. }
  563. if(i2c_debug){
  564. unsigned char val;
  565. val = amt_read_reg((*dataPt).addr);
  566. if(val != (*dataPt).dat_posDyn[currentmode])
  567. gpioi2c_print("device_reg=0x%x-->0x%x, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat_posDyn[currentmode]);
  568. }
  569. dataPt++;
  570. }
  571. return ret;
  572. }
  573. static int amt_write_color_sys_dyn_para(PanlSysDynPara * dataPt,unsigned int num,unsigned char currentSys)
  574. {
  575. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  576. struct i2c_client *client;
  577. struct i2c_msg msg;
  578. s32 ret = -1;
  579. s32 retries = 0;
  580. u8 buf[2] = {0};
  581. u8 device_addr;
  582. u8 reg_addr;
  583. if(!ark7116_pdata)
  584. return -ENODEV;
  585. client = ark7116_pdata->client;
  586. if(!client)
  587. return -ENODEV;
  588. while(num--){
  589. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  590. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  591. buf[0] = reg_addr;
  592. buf[1] = (*dataPt).dat_sysDyn[currentSys];
  593. msg.flags = 0;
  594. //msg.addr = 0xB2>>1;
  595. msg.addr = device_addr >> 1;//client->addr;
  596. msg.len = 2;
  597. msg.buf = buf;
  598. while(retries < 5){
  599. ret = i2c_transfer(client->adapter, &msg, 1);
  600. if (ret == 1)break;
  601. retries++;
  602. }
  603. if(retries >= 5){
  604. printk("ark7116_write_byte write error\n");
  605. }
  606. if(i2c_debug){
  607. unsigned char val;
  608. val = amt_read_reg((*dataPt).addr);
  609. if(val != (*dataPt).dat_sysDyn[currentSys])
  610. gpioi2c_print("device_reg=0x%x-->0x%x, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat_sysDyn[currentSys]);
  611. }
  612. dataPt++;
  613. }
  614. return ret;
  615. }
  616. static void config_static_para(unsigned char curret_source)
  617. {
  618. gpioi2c_print("%s.\n",__FUNCTION__);
  619. amt_write_static_para(AV1_staticPara, sizeof(AV1_staticPara) / sizeof(AV1_staticPara[0]));
  620. }
  621. static void config_pad_mux_para(void)
  622. {
  623. gpioi2c_print("%s.\n",__FUNCTION__);
  624. amt_write_static_para(AMT_PadMuxStaticPara, sizeof(AMT_PadMuxStaticPara) / sizeof(AMT_PadMuxStaticPara[0]));
  625. }
  626. #if 0
  627. static void config_color_sys_dyn_para(unsigned char current_sys)
  628. {
  629. gpioi2c_print("%s.\n",__FUNCTION__);
  630. amt_write_color_sys_dyn_para(AV1_sysDynPara, sizeof(AV1_sysDynPara) / sizeof(AV1_sysDynPara[0]), current_sys);
  631. }
  632. #endif
  633. static void config_disp_zoom_dyn_para(unsigned char currentmode)
  634. {
  635. gpioi2c_print("%s.\n",__FUNCTION__);
  636. amt_write_disp_zoom_dyn_para(AV1_posDynPara, sizeof(AV1_posDynPara) / sizeof(AV1_posDynPara[0]), currentmode);
  637. }
  638. static void init_global_para(void)
  639. {
  640. gpioi2c_print("%s.\n",__FUNCTION__);
  641. amt_write_reg(ENH_PLL,0X20);
  642. config_static_para(INPUT_AV1);
  643. config_disp_zoom_dyn_para(DISP_16_9);
  644. //config_color_sys_dyn_para(PAL);
  645. config_pad_mux_para();
  646. amt_write_reg(ENH_PLL,0X2C);
  647. }
  648. static void ark7116_reset(void)
  649. {
  650. int reset_gpio = g_ark7116_pdata->gpio_reset;
  651. gpio_direction_output(reset_gpio, 0);
  652. gpio_set_value(reset_gpio, 0);
  653. mdelay(1);
  654. gpio_set_value(reset_gpio, 1);
  655. mdelay(100);//mdelay(1);
  656. gpio_set_value(reset_gpio, 0);
  657. mdelay(15);
  658. }
  659. static void config_slave_mode(void)
  660. {
  661. unsigned char AddrBuff[6] = {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
  662. unsigned char DataBuff[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
  663. unsigned char i;
  664. gpioi2c_print("+++%s.\n",__FUNCTION__);
  665. DataBuff[0] = 0X55;
  666. DataBuff[1] = 0xAA;
  667. DataBuff[2] = 0X03;
  668. DataBuff[3] = 0X50; //slave mode
  669. DataBuff[4] = 0; // crc val
  670. DataBuff[5] = DataBuff[2]^DataBuff[3]^DataBuff[4];
  671. amt_write_reg(BUS_STATUS_ADDR, 0x00); //I2c Write Start
  672. for(i =0;i < 6;i++)
  673. {
  674. amt_write_reg(AddrBuff[i], DataBuff[i]);
  675. }
  676. amt_write_reg(BUS_STATUS_ADDR, 0x11); //I2c Write End
  677. udelay(10);
  678. amt_write_reg(0xFAC6, 0x20);
  679. gpioi2c_print("---%s.\n",__FUNCTION__);
  680. }
  681. int ark7116_config(void)
  682. {
  683. unsigned char val,slave_mode,rom_sel;
  684. int times = 10;
  685. gpioi2c_print("zhong hong %s.\n",__FUNCTION__);
  686. if(g_ark7116_pdata->config_finish){
  687. return 0;
  688. }
  689. reset_ark7116:
  690. ark7116_reset();
  691. config_slave_mode();
  692. //soft reset 7116
  693. amt_write_reg(0xFD00, 0x5A);
  694. mdelay(15);
  695. config_slave_mode();
  696. val = amt_read_reg(0xFAC6);
  697. slave_mode = (val & 0x80)?0:1;
  698. rom_sel = (val & 0x02)?1:0;
  699. printk(KERN_ALERT "\n ark7116 slave status=0x%0x.slave_mode=%d,rom_sel=%d----->\n",val,slave_mode,rom_sel);
  700. if(rom_sel || !slave_mode){
  701. if(times-- > 0){
  702. goto reset_ark7116;
  703. }else{
  704. printk(KERN_ALERT "ark7116 slave config error.\n");
  705. return -1;
  706. }
  707. }
  708. init_global_para();
  709. //soft reset decoder
  710. val = amt_read_reg(0xFEA0);
  711. val |= 1;
  712. amt_write_reg(0xFEA0, val);
  713. mdelay(30);
  714. val &= ~1;
  715. amt_write_reg(0xFEA0, val);
  716. mdelay(1);
  717. ///////////////////////////////////////
  718. amt_write_reg(ENH_PLL,0X28);
  719. mdelay(200);
  720. amt_write_reg(ENH_PLL,0X2C);
  721. g_ark7116_pdata->config_finish = 1;
  722. return 0;
  723. }
  724. /*int amt_detect_signal(void)
  725. {
  726. return ((amt_read_reg(0xFE26) & 0x6) == 0x6);
  727. }*/