ddp_dpi.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070
  1. #ifdef BUILD_UBOOT
  2. #define ENABLE_DSI_INTERRUPT 0
  3. #include <asm/arch/disp_drv_platform.h>
  4. #else
  5. #include <linux/delay.h>
  6. #include <linux/time.h>
  7. #include <linux/string.h>
  8. #include <linux/mutex.h>
  9. #include "cmdq_record.h"
  10. #include <disp_drv_log.h>
  11. #endif
  12. #include <debug.h>
  13. /*#include "mach/mt_typedefs.h"*/
  14. #include <linux/types.h>
  15. /*#include <mach/sync_write.h>*/
  16. #include <mt-plat/sync_write.h>
  17. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  18. #include <mach/mt_clkmgr.h>
  19. #endif
  20. #include <mach/irqs.h>
  21. #include <linux/sched.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/wait.h>
  24. #include "mtkfb.h"
  25. #include "ddp_drv.h"
  26. #include "ddp_hal.h"
  27. #include "ddp_manager.h"
  28. #include "ddp_dpi_reg.h"
  29. #include "ddp_dpi.h"
  30. #include "ddp_reg.h"
  31. #include "ddp_log.h"
  32. #include <linux/of.h>
  33. #include <linux/of_irq.h>
  34. #include <linux/of_address.h>
  35. /*#include <mach/eint.h>*/
  36. #ifndef LOG_TAG
  37. #define LOG_TAG "DPI"
  38. #endif
  39. #define ENABLE_DPI_INTERRUPT 0
  40. /*#define DISABLE_CLOCK_API */
  41. #define K2_SMT
  42. #undef LCD_BASE
  43. #define LCD_BASE (0xF4024000)
  44. #define DPI_REG_OFFSET(r) offsetof(struct DPI_REGS, r)
  45. #define REG_ADDR(base, offset) (((BYTE *)(base)) + (offset))
  46. #ifdef INREG32
  47. #undef INREG32
  48. #define INREG32(x) (__raw_readl((unsigned long *)(x)))
  49. #endif
  50. #define DPI_OUTREG32(cmdq, addr, val) DISP_REG_SET(cmdq, addr, val)
  51. #define DPI_OUTREGBIT(cmdq, TYPE, REG, bit, value) \
  52. do {\
  53. TYPE r;\
  54. TYPE v;\
  55. if (cmdq) { \
  56. *(unsigned int *)(&r) = ((unsigned int)0x00000000); r.bit = ~(r.bit); \
  57. *(unsigned int *)(&v) = ((unsigned int)0x00000000); v.bit = value; \
  58. DISP_REG_MASK(cmdq, &REG, AS_UINT32(&v), AS_UINT32(&r)); \
  59. } else { \
  60. mt_reg_sync_writel(INREG32(&REG), &r); r.bit = (value); DISP_REG_SET(cmdq, &REG, INREG32(&r)); \
  61. } \
  62. } while (0)
  63. #define DPI_MASKREG32(cmdq, REG, MASK, VALUE) DISP_REG_MASK((cmdq), (REG), (VALUE), (MASK))
  64. /*
  65. #if !defined(CONFIG_MTK_LEGACY)
  66. static void __iomem *clk_apmixed_base;
  67. #ifndef TVDPLL_CON0
  68. #define TVDPLL_CON0 (clk_apmixed_base + 0x270)
  69. #endif
  70. #ifndef TVDPLL_CON1
  71. #define TVDPLL_CON1 (clk_apmixed_base + 0x274)
  72. #endif
  73. #endif
  74. */
  75. static int cache_bg_parameter;
  76. static unsigned char s_isDpiPowerOn;
  77. static unsigned char s_isDpiStart;
  78. static unsigned char s_isDpiConfig;
  79. static int dpi_vsync_irq_count;
  80. static int dpi_undflow_irq_count;
  81. /*static DPI_REGS regBackup;*/
  82. struct DPI_REGS *DPI_REG = 0;
  83. unsigned long DPI_TVDPLL_CON0 = 0;
  84. unsigned long DPI_TVDPLL_CON1 = 0;
  85. static const LCM_UTIL_FUNCS lcm_utils_dpi;
  86. const unsigned BACKUP_DPI_REG_OFFSETS[] = {
  87. DPI_REG_OFFSET(INT_ENABLE),
  88. DPI_REG_OFFSET(CNTL),
  89. DPI_REG_OFFSET(SIZE),
  90. DPI_REG_OFFSET(TGEN_HWIDTH),
  91. DPI_REG_OFFSET(TGEN_HPORCH),
  92. DPI_REG_OFFSET(TGEN_VWIDTH_LODD),
  93. DPI_REG_OFFSET(TGEN_VPORCH_LODD),
  94. DPI_REG_OFFSET(BG_HCNTL),
  95. DPI_REG_OFFSET(BG_VCNTL),
  96. DPI_REG_OFFSET(BG_COLOR),
  97. DPI_REG_OFFSET(TGEN_VWIDTH_LEVEN),
  98. DPI_REG_OFFSET(TGEN_VPORCH_LEVEN),
  99. DPI_REG_OFFSET(TGEN_VWIDTH_RODD),
  100. DPI_REG_OFFSET(TGEN_VPORCH_RODD),
  101. DPI_REG_OFFSET(TGEN_VWIDTH_REVEN),
  102. DPI_REG_OFFSET(TGEN_VPORCH_REVEN),
  103. DPI_REG_OFFSET(ESAV_VTIM_LOAD),
  104. DPI_REG_OFFSET(ESAV_VTIM_ROAD),
  105. DPI_REG_OFFSET(ESAV_FTIM),
  106. };
  107. /*the static functions declare*/
  108. static void lcm_udelay(unsigned us)
  109. {
  110. udelay(us);
  111. }
  112. static void lcm_mdelay(unsigned ms)
  113. {
  114. msleep(ms);
  115. }
  116. static void lcm_set_reset_pin(unsigned value)
  117. {
  118. #ifndef K2_SMT
  119. DPI_OUTREG32(0, MMSYS_CONFIG_BASE + 0x150, value);
  120. #endif
  121. }
  122. static void lcm_send_cmd(unsigned cmd)
  123. {
  124. #ifndef K2_SMT
  125. DPI_OUTREG32(0, LCD_BASE + 0x0F80, cmd);
  126. #endif
  127. }
  128. static void lcm_send_data(unsigned data)
  129. {
  130. #ifndef K2_SMT
  131. DPI_OUTREG32(0, LCD_BASE + 0x0F90, data);
  132. #endif
  133. }
  134. /*
  135. static void _BackupDPIRegisters(void)
  136. {
  137. UINT32 i;
  138. DPI_REGS *reg = &regBackup;
  139. for (i = 0; i < ARY_SIZE(BACKUP_DPI_REG_OFFSETS); ++i)
  140. {
  141. DPI_OUTREG32(0, REG_ADDR(reg, BACKUP_DPI_REG_OFFSETS[i]), \
  142. AS_UINT32(REG_ADDR(DPI_REG, BACKUP_DPI_REG_OFFSETS[i])));
  143. }
  144. }
  145. static void _RestoreDPIRegisters(void)
  146. {
  147. UINT32 i;
  148. DPI_REGS *reg = &regBackup;
  149. for (i = 0; i < ARY_SIZE(BACKUP_DPI_REG_OFFSETS); ++i)
  150. {
  151. DPI_OUTREG32(0, REG_ADDR(DPI_REG, BACKUP_DPI_REG_OFFSETS[i]), \
  152. AS_UINT32(REG_ADDR(reg, BACKUP_DPI_REG_OFFSETS[i])));
  153. }
  154. }
  155. */
  156. /*the functions declare*/
  157. /*DPI clock setting - use TVDPLL provide DPI clock*/
  158. enum DPI_STATUS ddp_dpi_ConfigPclk(cmdqRecHandle cmdq, unsigned int clk_req, enum DPI_POLARITY polarity)
  159. {
  160. unsigned clksrc = 0;
  161. #ifdef CONFIG_FOR_ARCH_M3
  162. unsigned temp = 0;
  163. #endif
  164. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  165. unsigned prediv = 0x8316D89D;
  166. #else
  167. unsigned long bclk = 0;
  168. #endif
  169. struct DPI_REG_OUTPUT_SETTING ctrl = DPI_REG->OUTPUT_SETTING;
  170. unsigned permission = INREG32(DISPSYS_EFUSE_PERMISSION);
  171. switch (clk_req) {
  172. case DPI_CLK_480p:
  173. {
  174. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  175. #ifdef HDMI_MT8193_SUPPORT
  176. clksrc = 3;
  177. #else
  178. clksrc = 4;
  179. #endif
  180. prediv = 0x83109D89; /*54M*/
  181. #else
  182. clksrc = TVDPLL_D4;
  183. bclk = 108000000;
  184. #endif
  185. break;
  186. }
  187. case DPI_CLK_480p_3D:
  188. {
  189. pr_err("DISP/DPI " "DPI_CLK_480p_3D\n");
  190. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  191. clksrc = 4;
  192. prediv = 0x83109D89; /*54M*/
  193. #else
  194. clksrc = TVDPLL_D4;
  195. bclk = 108000000;
  196. #endif
  197. break;
  198. }
  199. case DPI_CLK_720p:
  200. {
  201. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  202. clksrc = 2; /*148M*/
  203. #else
  204. clksrc = TVDPLL_CK;
  205. bclk = 148500000;
  206. #endif
  207. break;
  208. }
  209. case DPI_CLK_1080p:
  210. {
  211. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  212. clksrc = 1; /*296M*/
  213. #else
  214. clksrc = TVDPLL_CK;
  215. bclk = 148500000;
  216. #endif
  217. break;
  218. }
  219. }
  220. pr_err("DISP/DPI,TVDPLL clock setting clk %d, clksrc: %d\n", clk_req, clksrc);
  221. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  222. clkmux_sel(MT_MUX_DPI0, clksrc, "DPI");
  223. DPI_OUTREG32(NULL, DPI_TVDPLL_CON0, 0xc0000101); /*TVDPLL enable*/
  224. DPI_OUTREG32(NULL, DPI_TVDPLL_CON1, prediv); /*set TVDPLL output clock frequency*/
  225. pr_err("DISP/DPI,TVDPLL_CON0: 0x%x, TVDPLL_CON1: 0x%x\n", INREG32(DPI_TVDPLL_CON0), INREG32(DPI_TVDPLL_CON1));
  226. #else
  227. ddp_clk_enable(MUX_DPI0);
  228. ddp_clk_set_parent(MUX_DPI0, clksrc);
  229. ddp_clk_disable(MUX_DPI0);
  230. ddp_clk_prepare_enable(TVDPLL);
  231. ddp_clk_set_rate(TVDPLL, bclk);
  232. ddp_clk_disable_unprepare(TVDPLL);
  233. pr_err("DISP/DPI,TVDPLL %ld\n", bclk);
  234. #endif
  235. /*IO driving setting */
  236. /*data 8ma, vs/hs/de/ck*/
  237. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING1, 0x6000, 0x2 << 13);
  238. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0600, 0x3 << 9);
  239. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0060, 0x3 << 5);
  240. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0006, 0x3 << 1);
  241. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING3, 0x0006, 0x3 << 1);
  242. if ((permission & 0xC0000000) == 0) {
  243. /*
  244. DPI_OUTREG32(NULL, DISPSYS_EFUSE_KEY, 0xFD885CAE);
  245. DPI_OUTREG32(NULL, DISPSYS_EFUSE, 0x3600000);
  246. */
  247. pr_err("DISP/DPI,DISPSYS_EFUSE_KEY: 0x%x, DISPSYS_EFUSE: 0x%x\n",
  248. INREG32(DISPSYS_EFUSE_KEY), INREG32(DISPSYS_EFUSE));
  249. }
  250. #ifdef CONFIG_FOR_ARCH_M1
  251. pr_warn("DISP/DPI,CONFIG_FOR_ARCH_M1 is defined!\n");
  252. if((permission & 0xC0000000) == 0)
  253. {
  254. DPI_OUTREG32(NULL, DISPSYS_EFUSE_KEY, 0xFD885CAE);
  255. DPI_OUTREG32(NULL, DISPSYS_EFUSE, 0x3600000);
  256. pr_warn("DISP/DPI,DISPSYS_EFUSE_KEY: 0x%x, DISPSYS_EFUSE: 0x%x\n", INREG32(DISPSYS_EFUSE_KEY), INREG32(DISPSYS_EFUSE));
  257. }
  258. #endif
  259. #ifdef CONFIG_FOR_ARCH_M3
  260. pr_warn("DISP/DPI,CONFIG_FOR_ARCH_M3 is defined!\n");
  261. if((permission & 0xC0000000) == 0)
  262. {
  263. DPI_OUTREG32(NULL, DISPSYS_EFUSE_KEY, 0xFD885CAE);
  264. temp = INREG32(DISPSYS_EFUSE);
  265. temp = (temp & 0xFC7FFFFF) | (5 << 23);
  266. DPI_OUTREG32(NULL, DISPSYS_EFUSE, temp);
  267. pr_warn("DISP/DPI,DISPSYS_EFUSE_KEY: 0x%x, DISPSYS_EFUSE: 0x%x\n", INREG32(DISPSYS_EFUSE_KEY), INREG32(DISPSYS_EFUSE));
  268. }
  269. //IO Driving Set
  270. //data 4ma, firt vs/hs/de/ck 4ma, sencond 6ma
  271. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING1, 0x6000, 0x0 << 13);
  272. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0600, 0x0 << 9);
  273. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0060, 0x0 << 5);
  274. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0006, 0x0 << 1);
  275. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING3, 0x0006, 0x2 << 1);
  276. #endif
  277. /*DPI output clock polarity */
  278. ctrl.CLK_POL = (DPI_POLARITY_FALLING == polarity) ? 1 : 0;
  279. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, CLK_POL, ctrl.CLK_POL);
  280. return DPI_STATUS_OK;
  281. }
  282. enum DPI_STATUS ddp_dpi_ConfigDE(cmdqRecHandle cmdq, enum DPI_POLARITY polarity)
  283. {
  284. struct DPI_REG_OUTPUT_SETTING pol = DPI_REG->OUTPUT_SETTING;
  285. pol.DE_POL = (DPI_POLARITY_FALLING == polarity) ? 1 : 0;
  286. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, DE_POL, pol.DE_POL);
  287. return DPI_STATUS_OK;
  288. }
  289. enum DPI_STATUS ddp_dpi_ConfigVsync(cmdqRecHandle cmdq, enum DPI_POLARITY polarity, unsigned pulseWidth,
  290. unsigned backPorch, unsigned frontPorch)
  291. {
  292. struct DPI_REG_TGEN_VWIDTH_LODD vwidth_lodd = DPI_REG->TGEN_VWIDTH_LODD;
  293. struct DPI_REG_TGEN_VPORCH_LODD vporch_lodd = DPI_REG->TGEN_VPORCH_LODD;
  294. struct DPI_REG_OUTPUT_SETTING pol = DPI_REG->OUTPUT_SETTING;
  295. struct DPI_REG_CNTL VS = DPI_REG->CNTL;
  296. pol.VSYNC_POL = (DPI_POLARITY_FALLING == polarity) ? 1 : 0;
  297. vwidth_lodd.VPW_LODD = pulseWidth;
  298. vporch_lodd.VBP_LODD = backPorch;
  299. vporch_lodd.VFP_LODD = frontPorch;
  300. VS.VS_LODD_EN = 1;
  301. VS.VS_LEVEN_EN = 0;
  302. VS.VS_RODD_EN = 0;
  303. VS.VS_REVEN_EN = 0;
  304. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, VSYNC_POL,
  305. pol.VSYNC_POL);
  306. DPI_OUTREGBIT(cmdq, struct DPI_REG_TGEN_VWIDTH_LODD, DPI_REG->TGEN_VWIDTH_LODD, VPW_LODD,
  307. vwidth_lodd.VPW_LODD);
  308. DPI_OUTREGBIT(cmdq, struct DPI_REG_TGEN_VPORCH_LODD, DPI_REG->TGEN_VPORCH_LODD, VBP_LODD,
  309. vporch_lodd.VBP_LODD);
  310. DPI_OUTREGBIT(cmdq, struct DPI_REG_TGEN_VPORCH_LODD, DPI_REG->TGEN_VPORCH_LODD, VFP_LODD,
  311. vporch_lodd.VFP_LODD);
  312. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, VS_LODD_EN, VS.VS_LODD_EN);
  313. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, VS_LEVEN_EN, VS.VS_LEVEN_EN);
  314. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, VS_RODD_EN, VS.VS_RODD_EN);
  315. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, VS_REVEN_EN, VS.VS_REVEN_EN);
  316. return DPI_STATUS_OK;
  317. }
  318. enum DPI_STATUS ddp_dpi_ConfigHsync(cmdqRecHandle cmdq, enum DPI_POLARITY polarity, unsigned pulseWidth,
  319. unsigned backPorch, unsigned frontPorch)
  320. {
  321. struct DPI_REG_TGEN_HPORCH hporch = DPI_REG->TGEN_HPORCH;
  322. struct DPI_REG_OUTPUT_SETTING pol = DPI_REG->OUTPUT_SETTING;
  323. hporch.HBP = backPorch;
  324. hporch.HFP = frontPorch;
  325. pol.HSYNC_POL = (DPI_POLARITY_FALLING == polarity) ? 1 : 0;
  326. DPI_REG->TGEN_HWIDTH = pulseWidth;
  327. DPI_OUTREG32(cmdq, &DPI_REG->TGEN_HWIDTH, pulseWidth);
  328. DPI_OUTREGBIT(cmdq, struct DPI_REG_TGEN_HPORCH, DPI_REG->TGEN_HPORCH, HBP, hporch.HBP);
  329. DPI_OUTREGBIT(cmdq, struct DPI_REG_TGEN_HPORCH, DPI_REG->TGEN_HPORCH, HFP, hporch.HFP);
  330. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, HSYNC_POL,
  331. pol.HSYNC_POL);
  332. return DPI_STATUS_OK;
  333. }
  334. enum DPI_STATUS ddp_dpi_ConfigDualEdge(cmdqRecHandle cmdq, bool enable, unsigned mode)
  335. {
  336. struct DPI_REG_OUTPUT_SETTING ctrl = DPI_REG->OUTPUT_SETTING;
  337. struct DPI_REG_DDR_SETTING ddr_setting = DPI_REG->DDR_SETTING;
  338. ctrl.DUAL_EDGE_SEL = enable;
  339. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, DUAL_EDGE_SEL,
  340. ctrl.DUAL_EDGE_SEL);
  341. ddr_setting.DDR_4PHASE = 1;
  342. ddr_setting.DDR_EN = 1;
  343. DPI_OUTREGBIT(cmdq, struct DPI_REG_DDR_SETTING, DPI_REG->DDR_SETTING, DDR_4PHASE,
  344. ddr_setting.DDR_4PHASE);
  345. DPI_OUTREGBIT(cmdq, struct DPI_REG_DDR_SETTING, DPI_REG->DDR_SETTING, DDR_EN, ddr_setting.DDR_EN);
  346. return DPI_STATUS_OK;
  347. }
  348. enum DPI_STATUS ddp_dpi_ConfigBG(cmdqRecHandle cmdq, bool enable, int BG_W, int BG_H)
  349. {
  350. if (enable == false) {
  351. struct DPI_REG_CNTL pol = DPI_REG->CNTL;
  352. pol.BG_EN = 0;
  353. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, BG_EN, pol.BG_EN);
  354. } else {
  355. struct DPI_REG_CNTL pol = DPI_REG->CNTL;
  356. struct DPI_REG_BG_HCNTL pol2 = DPI_REG->BG_HCNTL;
  357. struct DPI_REG_BG_VCNTL pol3 = DPI_REG->BG_VCNTL;
  358. struct DPI_REG_BG_COLOR pol4 = DPI_REG->BG_COLOR;
  359. pol.BG_EN = 1;
  360. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, BG_EN, pol.BG_EN);
  361. pol2.BG_RIGHT = BG_W / 2;
  362. pol2.BG_LEFT = BG_W - pol2.BG_RIGHT;
  363. DPI_OUTREG32(cmdq, &DPI_REG->BG_HCNTL, pol2.BG_LEFT << 16 | pol2.BG_RIGHT);
  364. pol3.BG_BOT = BG_H / 2;
  365. pol3.BG_TOP = BG_H - pol3.BG_BOT;
  366. DPI_OUTREGBIT(cmdq, struct DPI_REG_BG_VCNTL, DPI_REG->BG_VCNTL, BG_BOT, pol3.BG_BOT);
  367. DPI_OUTREGBIT(cmdq, struct DPI_REG_BG_VCNTL, DPI_REG->BG_VCNTL, BG_TOP, pol3.BG_TOP);
  368. pol4.BG_B = 0;
  369. pol4.BG_G = 0;
  370. pol4.BG_R = 0;
  371. DPI_OUTREGBIT(cmdq, struct DPI_REG_BG_COLOR, DPI_REG->BG_COLOR, BG_B, pol4.BG_B);
  372. DPI_OUTREGBIT(cmdq, struct DPI_REG_BG_COLOR, DPI_REG->BG_COLOR, BG_G, pol4.BG_G);
  373. DPI_OUTREGBIT(cmdq, struct DPI_REG_BG_COLOR, DPI_REG->BG_COLOR, BG_R, pol4.BG_R);
  374. }
  375. return DPI_STATUS_OK;
  376. }
  377. enum DPI_STATUS ddp_dpi_ConfigSize(cmdqRecHandle cmdq, unsigned width, unsigned height)
  378. {
  379. unsigned totalSize = 0;
  380. struct DPI_REG_SIZE size = DPI_REG->SIZE;
  381. size.WIDTH = width;
  382. size.HEIGHT = height;
  383. /*
  384. DPI_OUTREGBIT(cmdq, struct DPI_REG_SIZE, DPI_REG->SIZE, WIDTH, size.WIDTH);
  385. DPI_OUTREGBIT(cmdq, struct DPI_REG_SIZE, DPI_REG->SIZE, HEIGHT, size.HEIGHT);
  386. */
  387. totalSize = height << 16 | width;
  388. DPI_OUTREG32(cmdq, &DPI_REG->SIZE, totalSize);
  389. return DPI_STATUS_OK;
  390. }
  391. #ifdef HDMI_MT8193_SUPPORT
  392. enum DPI_STATUS ddp_dpi_ConfigCCIR656(cmdqRecHandle cmdq, bool enable)
  393. {
  394. struct DPI_REG_CNTL csc = DPI_REG->CNTL;
  395. struct DPI_REG_OUTPUT_SETTING outputsetting = DPI_REG->OUTPUT_SETTING;
  396. struct DPI_REG_Y_LIMIT ylimit = DPI_REG->Y_LIMIT;
  397. struct DPI_REG_C_LIMIT climit = DPI_REG->C_LIMIT;
  398. struct DPI_REG_YUV422_SETTING yuv422setting = DPI_REG->YUV422_SETTING;
  399. struct DPI_REG_EMBSYNC_SETTING embsync = DPI_REG->EMBSYNC_SETTING;
  400. struct DPI_REG_ESAV_VTIM_LOAD esavtimload = DPI_REG->ESAV_VTIM_LOAD;
  401. if (enable == FALSE)
  402. return DPI_STATUS_OK;
  403. csc.YUV422_EN = 1;
  404. csc.RGB2YUV_EN = 1;
  405. csc.EMBSYNC_EN = 1;
  406. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, YUV422_EN, csc.YUV422_EN);
  407. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, RGB2YUV_EN, csc.RGB2YUV_EN);
  408. DPI_OUTREGBIT(cmdq, struct DPI_REG_CNTL, DPI_REG->CNTL, EMBSYNC_EN, csc.EMBSYNC_EN);
  409. outputsetting.YC_MAP = 7;
  410. outputsetting.CLK_POL = 1;
  411. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, YC_MAP, outputsetting.YC_MAP);
  412. DPI_OUTREGBIT(cmdq, struct DPI_REG_OUTPUT_SETTING, DPI_REG->OUTPUT_SETTING, CLK_POL, outputsetting.CLK_POL);
  413. ylimit.Y_LIMIT_BOT = 0x100;
  414. ylimit.Y_LIMIT_TOP = 0xF00;
  415. climit.C_LIMIT_BOT = 0x100;
  416. climit.C_LIMIT_TOP = 0xF00;
  417. DPI_OUTREGBIT(cmdq, struct DPI_REG_Y_LIMIT, DPI_REG->Y_LIMIT, Y_LIMIT_BOT, ylimit.Y_LIMIT_BOT);
  418. DPI_OUTREGBIT(cmdq, struct DPI_REG_Y_LIMIT, DPI_REG->Y_LIMIT, Y_LIMIT_TOP, ylimit.Y_LIMIT_TOP);
  419. DPI_OUTREGBIT(cmdq, struct DPI_REG_C_LIMIT, DPI_REG->C_LIMIT, C_LIMIT_BOT, climit.C_LIMIT_BOT);
  420. DPI_OUTREGBIT(cmdq, struct DPI_REG_C_LIMIT, DPI_REG->C_LIMIT, C_LIMIT_TOP, climit.C_LIMIT_TOP);
  421. yuv422setting.UV_SWAP = 1;
  422. DPI_OUTREGBIT(cmdq, struct DPI_REG_YUV422_SETTING, DPI_REG->YUV422_SETTING, UV_SWAP, yuv422setting.UV_SWAP);
  423. embsync.EMBVSYNC_R_CR = 1;
  424. embsync.EMBVSYNC_G_Y = 1;
  425. embsync.EMBVSYNC_B_CB = 1;
  426. DPI_OUTREGBIT(cmdq, struct DPI_REG_EMBSYNC_SETTING, DPI_REG->EMBSYNC_SETTING, EMBVSYNC_R_CR,
  427. embsync.EMBVSYNC_R_CR);
  428. DPI_OUTREGBIT(cmdq, struct DPI_REG_EMBSYNC_SETTING, DPI_REG->EMBSYNC_SETTING, EMBVSYNC_G_Y,
  429. embsync.EMBVSYNC_G_Y);
  430. DPI_OUTREGBIT(cmdq, struct DPI_REG_EMBSYNC_SETTING, DPI_REG->EMBSYNC_SETTING, EMBVSYNC_B_CB,
  431. embsync.EMBVSYNC_B_CB);
  432. esavtimload.ESAV_VWID_LODD = 0x1E;
  433. DPI_OUTREGBIT(cmdq, struct DPI_REG_ESAV_VTIM_LOAD, DPI_REG->ESAV_VTIM_LOAD, ESAV_VWID_LODD,
  434. esavtimload.ESAV_VWID_LODD);
  435. return DPI_STATUS_OK;
  436. }
  437. #endif
  438. enum DPI_STATUS ddp_dpi_EnableColorBar(void)
  439. {
  440. /*enable internal pattern - color bar */
  441. DPI_OUTREG32(0, DISPSYS_DPI_BASE + 0xF00, 0x41);
  442. return DPI_STATUS_OK;
  443. }
  444. int ddp_dpi_power_on(DISP_MODULE_ENUM module, void *cmdq_handle)
  445. {
  446. int ret = 0;
  447. pr_err("DISP/DPI,ddp_dpi_power_on, s_isDpiPowerOn %d\n", s_isDpiPowerOn);
  448. if (!s_isDpiPowerOn) {
  449. #ifndef DISABLE_CLOCK_API
  450. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  451. ret += enable_clock(MT_CG_DISP1_DPI_PIXEL, "DPI");
  452. ret += enable_clock(MT_CG_DISP1_DPI_ENGINE, "DPI");
  453. #else
  454. ret += ddp_clk_enable(DISP1_DPI_PIXEL);
  455. ret += ddp_clk_enable(DISP1_DPI_ENGINE);
  456. #endif
  457. #endif
  458. if (ret > 0)
  459. pr_err("DISP/DPI,power manager API return FALSE\n");
  460. /*_RestoreDPIRegisters();*/
  461. s_isDpiPowerOn = TRUE;
  462. }
  463. return 0;
  464. }
  465. int ddp_dpi_power_off(DISP_MODULE_ENUM module, void *cmdq_handle)
  466. {
  467. int ret = 0;
  468. pr_err("DISP/DPI,ddp_dpi_power_off, s_isDpiPowerOn %d\n", s_isDpiPowerOn);
  469. if (s_isDpiPowerOn) {
  470. #ifndef DISABLE_CLOCK_API
  471. /*_BackupDPIRegisters();*/
  472. #if defined(CONFIG_MTK_LEGACY) || defined(CONFIG_MTK_CLKMGR)
  473. ret += disable_clock(MT_CG_DISP1_DPI_PIXEL, "DPI");
  474. ret += disable_clock(MT_CG_DISP1_DPI_ENGINE, "DPI");
  475. #else
  476. ddp_clk_disable(DISP1_DPI_PIXEL);
  477. ddp_clk_disable(DISP1_DPI_ENGINE);
  478. #endif
  479. #endif
  480. if (ret > 0)
  481. pr_err("DISP/DPI,power manager API return FALSE\n");
  482. s_isDpiPowerOn = FALSE;
  483. }
  484. return 0;
  485. }
  486. int ddp_dpi_config(DISP_MODULE_ENUM module, disp_ddp_path_config *config, void *cmdq_handle)
  487. {
  488. if (s_isDpiConfig == FALSE) {
  489. LCM_DPI_PARAMS *dpi_config = &(config->dispif_config.dpi);
  490. pr_err("DISP/DPI,ddp_dpi_config DPI status:%x, cmdq:%p\n", INREG32(&DPI_REG->STATUS), cmdq_handle);
  491. ddp_dpi_ConfigPclk(cmdq_handle, dpi_config->dpi_clock, dpi_config->clk_pol);
  492. ddp_dpi_ConfigSize(cmdq_handle, dpi_config->width, dpi_config->height);
  493. ddp_dpi_ConfigBG(cmdq_handle, true, dpi_config->bg_width, dpi_config->bg_height);
  494. cache_bg_parameter = dpi_config->bg_width << 16 | dpi_config->bg_height;
  495. pr_err("DISP/DPI,dpi_config->bg_width: %d, dpi_config->bg_height: %d\n",
  496. dpi_config->bg_width, dpi_config->bg_height);
  497. ddp_dpi_ConfigDE(cmdq_handle, dpi_config->de_pol);
  498. ddp_dpi_ConfigVsync(cmdq_handle, dpi_config->vsync_pol,
  499. dpi_config->vsync_pulse_width, dpi_config->vsync_back_porch,
  500. dpi_config->vsync_front_porch);
  501. ddp_dpi_ConfigHsync(cmdq_handle, dpi_config->hsync_pol,
  502. dpi_config->hsync_pulse_width, dpi_config->hsync_back_porch,
  503. dpi_config->hsync_front_porch);
  504. ddp_dpi_ConfigDualEdge(cmdq_handle, dpi_config->i2x_en, dpi_config->i2x_edge);
  505. #ifdef HDMI_MT8193_SUPPORT
  506. ddp_dpi_ConfigCCIR656(cmdq_handle, true);
  507. #endif
  508. s_isDpiConfig = TRUE;
  509. pr_err("DISP/DPI,ddp_dpi_config done\n");
  510. }
  511. if (s_isDpiConfig == TRUE) {
  512. LCM_DPI_PARAMS *dpi_config = &(config->dispif_config.dpi);
  513. int now_bg_parameters = dpi_config->bg_width << 16 | dpi_config->bg_height;
  514. pr_err("DISP/DPI,now_bg_parameters: 0x%x, cache_bg_parameter: 0x%x\n",
  515. now_bg_parameters, cache_bg_parameter);
  516. if (now_bg_parameters != cache_bg_parameter) {
  517. pr_err("DISP/DPI,Need to rechange DPI BG\n");
  518. ddp_dpi_ConfigSize(cmdq_handle, dpi_config->width, dpi_config->height);
  519. ddp_dpi_ConfigBG(cmdq_handle, true, dpi_config->bg_width,
  520. dpi_config->bg_height);
  521. cache_bg_parameter = now_bg_parameters;
  522. }
  523. ddp_dpi_dump(DISP_MODULE_DPI, 1);
  524. }
  525. return 0;
  526. }
  527. int ddp_dpi_reset(DISP_MODULE_ENUM module, void *cmdq_handle)
  528. {
  529. struct DPI_REG_RST reset;
  530. pr_err("DISP/DPI,ddp_dpi_reset\n");
  531. reset = DPI_REG->DPI_RST;
  532. reset.RST = 1;
  533. DPI_OUTREGBIT(cmdq_handle, struct DPI_REG_RST, DPI_REG->DPI_RST, RST, reset.RST);
  534. reset.RST = 0;
  535. DPI_OUTREGBIT(cmdq_handle, struct DPI_REG_RST, DPI_REG->DPI_RST, RST, reset.RST);
  536. return 0;
  537. }
  538. int ddp_dpi_start(DISP_MODULE_ENUM module, void *cmdq)
  539. {
  540. return 0;
  541. }
  542. int ddp_dpi_trigger(DISP_MODULE_ENUM module, void *cmdq)
  543. {
  544. if (s_isDpiStart == FALSE) {
  545. pr_err("DISP/DPI,ddp_dpi_start\n");
  546. ddp_dpi_reset(module, cmdq);
  547. /*enable DPI */
  548. DPI_OUTREG32(cmdq, DISPSYS_DPI_BASE, 0x00000001);
  549. ddp_dpi_dump(module, 1);
  550. s_isDpiStart = TRUE;
  551. }
  552. return 0;
  553. }
  554. int ddp_dpi_stop(DISP_MODULE_ENUM module, void *cmdq_handle)
  555. {
  556. pr_err("DISP/DPI,ddp_dpi_stop\n");
  557. /*disable DPI and background, and reset DPI */
  558. pr_err("DISP/DPI,DISPSYS_DPI_BASE: 0x%x\n", INREG32(DISPSYS_DPI_BASE));
  559. DPI_OUTREG32(cmdq_handle, DISPSYS_DPI_BASE, 0x00000000);
  560. pr_err("DISP/DPI,DISPSYS_DPI_BASE: 0x%x\n", INREG32(DISPSYS_DPI_BASE));
  561. ddp_dpi_ConfigBG(cmdq_handle, false, 0, 0);
  562. ddp_dpi_reset(module, cmdq_handle);
  563. s_isDpiStart = FALSE;
  564. s_isDpiConfig = FALSE;
  565. dpi_vsync_irq_count = 0;
  566. dpi_undflow_irq_count = 0;
  567. return 0;
  568. }
  569. int ddp_dpi_is_busy(DISP_MODULE_ENUM module)
  570. {
  571. unsigned int status = INREG32(DISPSYS_DPI_BASE + 0x40);
  572. return (status & (0x1 << 16) ? 1 : 0);
  573. }
  574. int ddp_dpi_is_idle(DISP_MODULE_ENUM module)
  575. {
  576. return !ddp_dpi_is_busy(module);
  577. }
  578. #if ENABLE_DPI_INTERRUPT
  579. irqreturn_t _DPI_InterruptHandler(int irq, void *dev_id)
  580. {
  581. unsigned int status = (unsigned int)readDPIIntrStatus();
  582. if (status & 0x01) {
  583. unsigned int checkSumNum = (INREG32(DISPSYS_DPI_BASE + 0x48) & 0x00FFFFFF);
  584. dpi_vsync_irq_count++;
  585. if (dpi_vsync_irq_count > 30)
  586. dpi_vsync_irq_count = 0;
  587. } else if ((status >> 1) & 0x01) {
  588. /*DDPMSG("status.VDE interrupt coming\n");*/
  589. } else if ((status >> 2) & 0x01) {
  590. /*DDPMSG("status.UNDERFLOW interrupt coming\n");*/
  591. }
  592. ClearDPIIntrStatus();
  593. return IRQ_HANDLED;
  594. }
  595. #endif
  596. int ddp_dpi_init(DISP_MODULE_ENUM module, void *cmdq)
  597. {
  598. pr_err("DISP/DPI,ddp_dpi_init- %p\n", cmdq);
  599. /*_BackupDPIRegisters();*/
  600. ddp_dpi_power_on(DISP_MODULE_DPI, cmdq);
  601. #if ENABLE_DPI_INTERRUPT
  602. /*
  603. if (request_irq(DPI0_IRQ_BIT_ID, _DPI_InterruptHandler, IRQF_TRIGGER_LOW, "mtkdpi", NULL) < 0)
  604. {
  605. pr_info("DISP/DPI " "[ERROR] fail to request DPI irq\n");
  606. return DPI_STATUS_ERROR;
  607. }
  608. */
  609. /*
  610. struct DPI_REG_INTERRUPT enInt = DPI_REG->INT_ENABLE;
  611. enInt.VSYNC = 1;
  612. DPI_OUTREGBIT(cmdq, struct DPI_REG_INTERRUPT, DPI_REG->INT_ENABLE, VSYNC, enInt.VSYNC);
  613. enInt.VDE = 1;
  614. DPI_OUTREGBIT(cmdq, struct DPI_REG_INTERRUPT, DPI_REG->INT_ENABLE, VDE, enInt.VDE);
  615. enInt.UNDERFLOW = 1;
  616. DPI_OUTREGBIT(cmdq, struct DPI_REG_INTERRUPT, DPI_REG->INT_ENABLE, UNDERFLOW, enInt.UNDERFLOW);
  617. */
  618. #endif
  619. /*
  620. #if !defined(CONFIG_MTK_LEGACY)
  621. struct device_node *node;
  622. node = of_find_compatible_node(NULL, NULL, "mediatek,APMIXED");
  623. if (!node)
  624. pr_debug("[CLK_APMIXED] find node failed\n");
  625. clk_apmixed_base = of_iomap(node, 0);
  626. if (!clk_apmixed_base)
  627. pr_debug("[CLK_APMIXED] base failed\n");
  628. #endif
  629. */
  630. /*_Enable_Interrupt();*/
  631. pr_err("DISP/DPI,ddp_dpi_init done %p\n", cmdq);
  632. return 0;
  633. }
  634. int ddp_dpi_deinit(DISP_MODULE_ENUM module, void *cmdq_handle)
  635. {
  636. pr_err("DISP/DPI,ddp_dpi_deinit- %p\n", cmdq_handle);
  637. ddp_dpi_stop(DISP_MODULE_DPI, cmdq_handle);
  638. ddp_dpi_power_off(DISP_MODULE_DPI, cmdq_handle);
  639. return 0;
  640. }
  641. int ddp_dpi_set_lcm_utils(DISP_MODULE_ENUM module, LCM_DRIVER *lcm_drv)
  642. {
  643. LCM_UTIL_FUNCS *utils = NULL;
  644. DISPFUNC();
  645. if (lcm_drv == NULL) {
  646. pr_err("DISP/DPI,lcm_drv is null!\n");
  647. return -1;
  648. }
  649. utils = (LCM_UTIL_FUNCS *)&lcm_utils_dpi;
  650. utils->set_reset_pin = lcm_set_reset_pin;
  651. utils->udelay = lcm_udelay;
  652. utils->mdelay = lcm_mdelay;
  653. utils->send_cmd = lcm_send_cmd,
  654. utils->send_data = lcm_send_data, lcm_drv->set_util_funcs(utils);
  655. return 0;
  656. }
  657. int ddp_dpi_build_cmdq(DISP_MODULE_ENUM module, void *cmdq_trigger_handle, CMDQ_STATE state)
  658. {
  659. return 0;
  660. }
  661. int ddp_dpi_dump(DISP_MODULE_ENUM module, int level)
  662. {
  663. unsigned i;
  664. DDPDUMP("---------- Start dump DPI registers ----------\n");
  665. for (i = 0; i <= 0x50; i += 4)
  666. DDPDUMP("DPI+%04x : 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  667. for (i = 0x68; i <= 0xd8; i += 4)
  668. DDPDUMP("DPI+%04x : 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  669. /*
  670. DDPDUMP("DPI+Color Bar : %04x : 0x%08x\n", 0xF00, INREG32(DISPSYS_DPI_BASE + 0xF00));
  671. DDPDUMP("DPI TVDPLL CON0 : 0x%08x\n", INREG32(DDP_REG_TVDPLL_CON0));
  672. DDPDUMP("DPI TVDPLL CON1 : 0x%08x\n", INREG32(DDP_REG_TVDPLL_CON1));
  673. DDPDUMP("DPI TVDPLL CON6 : 0x%08x\n", INREG32(DDP_REG_TVDPLL_CON6));
  674. DDPDUMP("DPI MMSYS_CG_CON1:0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON1));
  675. DDPDUMP("io_driving1:0x:%08x\n", INREG32(DISPSYS_IO_DRIVING1));
  676. DDPDUMP("io_driving2:0x:%08x\n", INREG32(DISPSYS_IO_DRIVING2));
  677. */
  678. return 0;
  679. }
  680. void ddp_dpi_change_io_driving(LCM_DRIVING_CURRENT io_driving)
  681. {
  682. LCM_DRIVING_CURRENT vsync_io_driving = (io_driving >> 8) & 0xFF;
  683. LCM_DRIVING_CURRENT data_io_driving = io_driving & 0xFF;
  684. DDPDUMP("vsync_io_driving: 0x%x, data_io_driving: 0x%x\n", vsync_io_driving,
  685. data_io_driving);
  686. switch (data_io_driving) {
  687. case 2:
  688. /*
  689. * D[11,9] 4mA, D[8,4] 4mA, D[3,0] 4mA
  690. */
  691. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING1, 0x6000, 0x0 << 13);
  692. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0600, 0x0 << 9);
  693. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0060, 0x0 << 5);
  694. break;
  695. case 4:
  696. /*
  697. * D[11,9] 8mA, D[8,4] 8mA, D[3,0] 8mA
  698. */
  699. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING1, 0x6000, 0x1 << 13);
  700. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0600, 0x1 << 9);
  701. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0060, 0x1 << 5);
  702. break;
  703. case 8:
  704. /*
  705. * D[11,9] 16mA, D[8,4] 16mA, D[3,0] 16mA
  706. */
  707. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING1, 0x6000, 0x3 << 13);
  708. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0600, 0x3 << 9);
  709. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0060, 0x3 << 5);
  710. break;
  711. default:
  712. break;
  713. }
  714. switch (vsync_io_driving) {
  715. case 2:
  716. /*
  717. * First VS/HS/DE/CK 4mA
  718. */
  719. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0006, 0x0 << 1);
  720. break;
  721. case 4:
  722. /*
  723. * First VS/HS/DE/CK 8mA
  724. */
  725. DPI_MASKREG32(NULL, DISPSYS_IO_DRIVING2, 0x0006, 0x1 << 1);
  726. break;
  727. default:
  728. break;
  729. }
  730. pr_err
  731. ("DISP/DPI,DISPSYS_IO_DRIVING1: 0x%x, DISPSYS_IO_DRIVING2: 0x%x, DISPSYS_IO_DRIVING3: 0x%x\n",
  732. INREG32(DISPSYS_IO_DRIVING1), INREG32(DISPSYS_IO_DRIVING2),
  733. INREG32(DISPSYS_IO_DRIVING3));
  734. }
  735. int ddp_dpi_ioctl(DISP_MODULE_ENUM module, void *cmdq_handle, unsigned int ioctl_cmd,
  736. unsigned long *params)
  737. {
  738. int ret = 0;
  739. DDP_IOCTL_NAME ioctl = (DDP_IOCTL_NAME) ioctl_cmd;
  740. switch (ioctl) {
  741. case DDP_DPI_FACTORY_TEST:
  742. {
  743. disp_ddp_path_config *config_info = (disp_ddp_path_config *) params;
  744. ddp_dpi_power_on(module, NULL);
  745. ddp_dpi_stop(module, NULL);
  746. ddp_dpi_config(module, config_info, NULL);
  747. ddp_dpi_EnableColorBar();
  748. pr_err
  749. ("DISP/DPI,Before: DRIVING1: 0x%x, DRIVING2: 0x%x, DRIVING3: 0x%x\n",
  750. INREG32(DISPSYS_IO_DRIVING1), INREG32(DISPSYS_IO_DRIVING2),
  751. INREG32(DISPSYS_IO_DRIVING3));
  752. if (config_info->dispif_config.dpi.io_driving_current !=
  753. LCM_DRIVING_CURRENT_DEFAULT) {
  754. pr_err
  755. ("DISP/DPI,Before: DRIVING1: 0x%x, DRIVING2: 0x%x, DRIVING3: 0x%x\n",
  756. INREG32(DISPSYS_IO_DRIVING1), INREG32(DISPSYS_IO_DRIVING2),
  757. INREG32(DISPSYS_IO_DRIVING3));
  758. pr_debug("DISP/DPI,Change IO Driving: 0x%x\n",
  759. config_info->dispif_config.dpi.io_driving_current);
  760. ddp_dpi_change_io_driving(config_info->dispif_config.dpi.
  761. io_driving_current);
  762. }
  763. ddp_dpi_trigger(module, NULL);
  764. ddp_dpi_start(module, NULL);
  765. ddp_dpi_dump(module, 1);
  766. break;
  767. }
  768. default:
  769. break;
  770. }
  771. return ret;
  772. }
  773. DDP_MODULE_DRIVER ddp_driver_dpi = {
  774. .module = DISP_MODULE_DPI,
  775. .init = ddp_dpi_init,
  776. .deinit = ddp_dpi_deinit,
  777. .config = ddp_dpi_config,
  778. .build_cmdq = ddp_dpi_build_cmdq,
  779. .trigger = ddp_dpi_trigger,
  780. .start = ddp_dpi_start,
  781. .stop = ddp_dpi_stop,
  782. .reset = ddp_dpi_reset,
  783. .power_on = ddp_dpi_power_on,
  784. .power_off = ddp_dpi_power_off,
  785. .is_idle = ddp_dpi_is_idle,
  786. .is_busy = ddp_dpi_is_busy,
  787. .dump_info = ddp_dpi_dump,
  788. .set_lcm_utils = ddp_dpi_set_lcm_utils,
  789. .ioctl = ddp_dpi_ioctl
  790. };
  791. /*****************************DPI DVT Case Start********************************/
  792. enum DPI_STATUS DPI_EnableColorBar(unsigned int pattern)
  793. {
  794. /*OUTREG32(DISPSYS_DPI_BASE + 0xF00, 0x41);*/
  795. OUTREG32(DISPSYS_DPI_BASE + 0xF00, pattern);
  796. return DPI_STATUS_OK;
  797. }
  798. enum DPI_STATUS DPI_DisableColorBar(void)
  799. {
  800. OUTREG32(DISPSYS_DPI_BASE + 0xF00, 0);
  801. return DPI_STATUS_OK;
  802. }
  803. enum DPI_STATUS ddp_dpi_EnableColorBar_16(void)
  804. {
  805. /*enable internal pattern - color bar */
  806. DPI_OUTREG32(0, DISPSYS_DPI_BASE + 0xF00, 0x10101051);
  807. return DPI_STATUS_OK;
  808. }
  809. enum DPI_STATUS ddp_dpi_EnableColorBar_0(void)
  810. {
  811. /*enable internal pattern - color bar */
  812. DPI_OUTREG32(0, DISPSYS_DPI_BASE + 0xF00, 0x51);
  813. return DPI_STATUS_OK;
  814. }
  815. /****************************Platform IRQ*****************************/
  816. #if ENABLE_DPI_INTERRUPT
  817. static int dpi_irq; /*dpi IRQ*/
  818. int get_eint_dpi_irq(void)
  819. {
  820. dpi_irq = 0;
  821. if (dpi_irq < 1) {
  822. struct device_node *node;
  823. node = of_find_compatible_node(NULL, NULL, "mediatek,DPI0");
  824. if (node) {
  825. /*this step will set irq feature by dtsi*/
  826. dpi_irq = irq_of_parse_and_map(node, 0);
  827. if (!dpi_irq) {
  828. pr_err("can't irq_of_parse_and_map!\n");
  829. dpi_irq = 0;
  830. } else {
  831. pr_err("DISP/DPI,DPI Irq Num: %d\n", dpi_irq);
  832. }
  833. } else {
  834. pr_err("DISP/DPI,mediatek,DPI0 not find\n");
  835. }
  836. }
  837. return dpi_irq;
  838. }
  839. #endif
  840. int _Enable_Interrupt(void)
  841. {
  842. #if ENABLE_DPI_INTERRUPT
  843. int ret;
  844. int dpi_irq_num = get_eint_dpi_irq();
  845. if (dpi_irq_num > 0) {
  846. ret =
  847. request_irq(dpi_irq_num, &_DPI_InterruptHandler, IRQF_TRIGGER_NONE,
  848. "mediatek,DPI0", NULL);
  849. if (ret > 0)
  850. pr_err("eint irq %d not available\n", dpi_irq_num);
  851. } else {
  852. pr_err("%s,%d Error: DPI intr is not defined\n", __func__, __LINE__);
  853. }
  854. #else
  855. /*
  856. if (request_irq(DPI0_IRQ_BIT_ID,
  857. _DPI_InterruptHandler, IRQF_TRIGGER_LOW, "mtkdpi", NULL) < 0)
  858. {
  859. pr_info("DISP/DPI " "[ERROR] fail to request DPI irq\n");
  860. return DPI_STATUS_ERROR;
  861. }
  862. */
  863. #endif
  864. struct DPI_REG_INTERRUPT enInt = DPI_REG->INT_ENABLE;
  865. enInt.VSYNC = 1;
  866. enInt.VDE = 1;
  867. enInt.UNDERFLOW = 1;
  868. OUTREG32(&DPI_REG->INT_ENABLE, AS_UINT32(&enInt));
  869. return 0;
  870. }