smi_variant_config_8173.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include <linux/of.h>
  2. #include <linux/of_irq.h>
  3. #include <linux/of_address.h>
  4. #include <linux/kobject.h>
  5. #include <linux/uaccess.h>
  6. #include <linux/module.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/cdev.h>
  9. #include <linux/mm.h>
  10. #include <linux/vmalloc.h>
  11. #include <linux/slab.h>
  12. #include <linux/clk.h>
  13. #include <linux/io.h>
  14. #include "smi_reg.h"
  15. #include "smi_common.h"
  16. #include "smi_priv.h"
  17. static void initSetting(struct mtk_smi_data *smidev, bool *default_saved,
  18. u32 *default_smi_val, unsigned int larbid)
  19. {
  20. /* save default larb regs */
  21. if (!(*default_saved)) {
  22. SMIMSG("Save default config:\n");
  23. default_smi_val[0] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  24. REG_OFFSET_SMI_L1ARB0);
  25. default_smi_val[1] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  26. REG_OFFSET_SMI_L1ARB1);
  27. default_smi_val[2] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  28. REG_OFFSET_SMI_L1ARB2);
  29. default_smi_val[3] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  30. REG_OFFSET_SMI_L1ARB3);
  31. default_smi_val[4] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  32. REG_OFFSET_SMI_L1ARB4);
  33. default_smi_val[5] = M4U_ReadReg32(SMI_COMMON_EXT_BASE,
  34. REG_OFFSET_SMI_L1ARB5);
  35. SMIMSG("l1arb[0-2]= 0x%x, 0x%x, 0x%x\n", default_smi_val[0],
  36. default_smi_val[1], default_smi_val[2]);
  37. SMIMSG("l1arb[3-4]= 0x%x, 0x%x 0x%x\n", default_smi_val[3],
  38. default_smi_val[4], default_smi_val[5]);
  39. *default_saved = true;
  40. }
  41. /* Keep the HW's init setting in REG_SMI_L1ARB0 ~ REG_SMI_L1ARB4 */
  42. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB0, default_smi_val[0]);
  43. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB1, default_smi_val[1]);
  44. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB2, default_smi_val[2]);
  45. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB3, default_smi_val[3]);
  46. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB4, default_smi_val[4]);
  47. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB5, default_smi_val[5]);
  48. M4U_WriteReg32(SMI_COMMON_EXT_BASE, 0x200, 0x1b);
  49. /* disp(larb0+larb4): emi0, other:emi1 */
  50. M4U_WriteReg32(SMI_COMMON_EXT_BASE, 0x220, (0x1<<0) | (0x1<<8));
  51. M4U_WriteReg32(SMI_COMMON_EXT_BASE, 0x234,
  52. (0x1 << 31) + (0x13 << 26) + (0x14 << 21) + (0x0 << 20) + (0x2 << 15) +
  53. (0x3 << 10) + (0x4 << 5) + 0x5);
  54. M4U_WriteReg32(SMI_COMMON_EXT_BASE, 0x238,
  55. (0x2 << 25) + (0x3 << 20) + (0x4 << 15) + (0x5 << 10) + (0x6 << 5) + 0x8);
  56. M4U_WriteReg32(SMI_COMMON_EXT_BASE, 0x230, 0x1f + (0x8 << 5) + (0x6 << 10));
  57. /* Set VC priority: MMSYS = ISP > VENC > VDEC = MJC */
  58. M4U_WriteReg32(LARB0_BASE, 0x20, 0x0); /* MMSYS */
  59. M4U_WriteReg32(LARB1_BASE, 0x20, 0x2); /* VDEC */
  60. M4U_WriteReg32(LARB2_BASE, 0x20, 0x0); /* ISP */
  61. M4U_WriteReg32(LARB3_BASE, 0x20, 0x1); /* VENC */
  62. M4U_WriteReg32(LARB4_BASE, 0x20, 0x0); /* DISP1 */
  63. M4U_WriteReg32(LARB5_BASE, 0x20, 0x1); /* VENC2 */
  64. /* turn off EMI empty double OSTD */
  65. M4U_WriteReg32(LARB0_BASE, 0x2c, M4U_ReadReg32(LARB0_BASE, 0x2c) | (1 << 2));
  66. M4U_WriteReg32(LARB1_BASE, 0x2c, M4U_ReadReg32(LARB1_BASE, 0x2c) | (1 << 2));
  67. M4U_WriteReg32(LARB2_BASE, 0x2c, M4U_ReadReg32(LARB2_BASE, 0x2c) | (1 << 2));
  68. M4U_WriteReg32(LARB3_BASE, 0x2c, M4U_ReadReg32(LARB3_BASE, 0x2c) | (1 << 2));
  69. M4U_WriteReg32(LARB4_BASE, 0x2c, M4U_ReadReg32(LARB4_BASE, 0x2c) | (1 << 2));
  70. M4U_WriteReg32(LARB5_BASE, 0x2c, M4U_ReadReg32(LARB5_BASE, 0x2c) | (1 << 2));
  71. /* confirm. sometimes the reg can not be wrote while its clock is disable */
  72. if ((M4U_ReadReg32(LARB1_BASE, 0x20) != 0x2) ||
  73. (M4U_ReadReg32(LARB0_BASE, 0x20) != 0x0)) {
  74. SMIMSG("warning setting failed. please check clk. 0x%x-0x%x\n",
  75. M4U_ReadReg32(LARB1_BASE , 0x20),
  76. M4U_ReadReg32(LARB0_BASE , 0x20));
  77. }
  78. }
  79. static void vpSetting(struct mtk_smi_data *smidev)
  80. {
  81. /* VP 4K */
  82. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB0, 0x17C0); /* LARB0, DISP+MDP */
  83. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB1, 0x161B); /* LARB1, VDEC */
  84. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB2, 0x1000); /* LARB2, ISP */
  85. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB3, 0x1000); /* LARB3, VENC+JPG */
  86. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB4, 0x17C0); /* LARB4, DISP2+MDP2 */
  87. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB5, 0x1000); /* LARB5, VENC2 */
  88. M4U_WriteReg32(LARB0_BASE, 0x200, 0x18); /* ovl_ch0_0/1 */
  89. M4U_WriteReg32(LARB0_BASE, 0x214, 0x4); /* mdp_rdma0; min(4,5) */
  90. M4U_WriteReg32(LARB0_BASE, 0x21c, 0x5); /* mdp_wrot0 */
  91. M4U_WriteReg32(LARB4_BASE, 0x200, 0x8); /* ovl_ch1_0/1 */
  92. M4U_WriteReg32(LARB4_BASE, 0x210, 0x4); /* mdp_rdma1; min(4,5) */
  93. M4U_WriteReg32(LARB4_BASE, 0x214, 0x3); /* mdp_wrot1 */
  94. M4U_WriteReg32(LARB1_BASE, 0x200, 0x1f); /* port#0, mc */
  95. M4U_WriteReg32(LARB1_BASE, 0x204, 0x06); /* port#1, pp */
  96. M4U_WriteReg32(LARB1_BASE, 0x208, 0x1); /* port#2, ufo */
  97. M4U_WriteReg32(LARB1_BASE, 0x20c, 0x1); /* port#3, vld */
  98. M4U_WriteReg32(LARB1_BASE, 0x210, 0x1); /* port#4, vld2 */
  99. M4U_WriteReg32(LARB1_BASE, 0x214, 0x2); /* port#5, mv */
  100. M4U_WriteReg32(LARB1_BASE, 0x218, 0x1); /* port#6, pred rd */
  101. M4U_WriteReg32(LARB1_BASE, 0x21c, 0x1); /* port#7, pred wr */
  102. M4U_WriteReg32(LARB1_BASE, 0x220, 0x1); /* port#8, ppwrap */
  103. }
  104. static void vrSetting(struct mtk_smi_data *smidev)
  105. {
  106. /* VR 4K */
  107. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB0, 0x1614); /* LARB0, DISP+MDP */
  108. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB1, 0x1000); /* LARB1, VDEC */
  109. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB2, 0x11F7); /* LARB2, ISP */
  110. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB3, 0x1584); /* LARB3, VENC+JPG */
  111. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB4, 0x1614); /* LARB4, DISP2+MDP2 */
  112. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB5, 0x1584); /* LARB5, VENC2 */
  113. M4U_WriteReg32(LARB0_BASE, 0x200, 0x1f); /* ovl_ch0_0+ovl_ch0_1 */
  114. M4U_WriteReg32(LARB0_BASE, 0x218, 0x2); /* mdp_wdma */
  115. M4U_WriteReg32(LARB0_BASE, 0x21C, 0x5); /* mdp_wrot0; min(9,5) */
  116. M4U_WriteReg32(LARB2_BASE, 0x200, 0x8); /* imgo */
  117. M4U_WriteReg32(LARB2_BASE, 0x208, 0x1); /* aao */
  118. M4U_WriteReg32(LARB2_BASE, 0x20c, 0x1); /* lsco */
  119. M4U_WriteReg32(LARB2_BASE, 0x210, 0x1); /* esfko */
  120. M4U_WriteReg32(LARB2_BASE, 0x218, 0x1); /* lsci */
  121. M4U_WriteReg32(LARB2_BASE, 0x220, 0x1); /* bpci */
  122. M4U_WriteReg32(LARB2_BASE, 0x22c, 0x4); /* imgi */
  123. M4U_WriteReg32(LARB2_BASE, 0x230, 0x1); /* img2o */
  124. M4U_WriteReg32(LARB2_BASE, 0x244, 0x1); /* lcei */
  125. M4U_WriteReg32(LARB3_BASE, 0x200, 0x1); /* venc_rcpu */
  126. M4U_WriteReg32(LARB3_BASE, 0x204, 0x4); /* venc_rec_frm */
  127. M4U_WriteReg32(LARB3_BASE, 0x208, 0x1); /* venc_bsdma */
  128. M4U_WriteReg32(LARB3_BASE, 0x20c, 0x1); /* venc_sv_comv */
  129. M4U_WriteReg32(LARB3_BASE, 0x210, 0x1); /* venc_rd_comv */
  130. M4U_WriteReg32(LARB3_BASE, 0x224, 0x8); /* venc_cur_luma */
  131. M4U_WriteReg32(LARB3_BASE, 0x228, 0x4); /* venc_cur_chroma */
  132. M4U_WriteReg32(LARB3_BASE, 0x230, 0x10); /* venc_ref_chroma */
  133. M4U_WriteReg32(LARB4_BASE, 0x200, 0x1f); /* ovl_ch1_0+ovl_ch1_1 */
  134. M4U_WriteReg32(LARB4_BASE, 0x218, 0x2); /* mdp_wdma */
  135. M4U_WriteReg32(LARB4_BASE, 0x21C, 0x5); /* mdp_wrot0; min(9,5) */
  136. /* VP concurrent settings */
  137. /* LARB0 */
  138. /*M4U_WriteReg32(LARB0_BASE, 0x210, 0x8); *//* port 4:ovl_ch1_0/1 */
  139. /*M4U_WriteReg32(LARB0_BASE, 0x21C, 0x4); *//* port 7:mdp_rdma0; min(4,5) */
  140. /*M4U_WriteReg32(LARB0_BASE, 0x22C, 0x3); *//* port11:mdp_wrot1 */
  141. /* VDEC */
  142. M4U_WriteReg32(LARB1_BASE, 0x200, 0x1f); /* port#0, mc */
  143. M4U_WriteReg32(LARB1_BASE, 0x204, 0x06); /* port#1, pp */
  144. M4U_WriteReg32(LARB1_BASE, 0x208, 0x1); /* port#2, ufo */
  145. M4U_WriteReg32(LARB1_BASE, 0x20c, 0x1); /* port#3, vld */
  146. M4U_WriteReg32(LARB1_BASE, 0x210, 0x1); /* port#4, vld2 */
  147. M4U_WriteReg32(LARB1_BASE, 0x214, 0x2); /* port#5, avc mv */
  148. M4U_WriteReg32(LARB1_BASE, 0x218, 0x1); /* port#6, pred rd */
  149. M4U_WriteReg32(LARB1_BASE, 0x21c, 0x1); /* port#7, pred wr */
  150. M4U_WriteReg32(LARB1_BASE, 0x220, 0x1); /* port#8, ppwrap */
  151. /*venc2 */
  152. M4U_WriteReg32(LARB5_BASE, 0x200, 0x1); /* venc_rcpu2 */
  153. M4U_WriteReg32(LARB5_BASE, 0x204, 0x4); /* venc_rec_frm2 */
  154. /* venc_ref_luma2 */
  155. M4U_WriteReg32(LARB5_BASE, 0x20c, 0x10); /* venc_ref_chroma2 */
  156. M4U_WriteReg32(LARB5_BASE, 0x210, 0x1); /* venc_bsdma2 */
  157. M4U_WriteReg32(LARB5_BASE, 0x214, 0x8); /* venc_cur_luma2 */
  158. M4U_WriteReg32(LARB5_BASE, 0x218, 0x4); /* venc_cur_chroma2 */
  159. M4U_WriteReg32(LARB5_BASE, 0x21c, 0x1); /* venc_rd_comv2 */
  160. M4U_WriteReg32(LARB5_BASE, 0x220, 0x1); /* venc_sv_comv2 */
  161. }
  162. static void hdmiSetting(struct mtk_smi_data *smidev)
  163. {
  164. /* VP 4K */
  165. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB0, 0x1117); /* LARB0, DISP+MDP */
  166. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB1, 0x1659); /* LARB1, VDEC */
  167. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB2, 0x1000); /* LARB2, ISP */
  168. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB3, 0x1000); /* LARB3, VENC+JPG */
  169. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB4, 0x1750); /* LARB4, DISP2+MDP2 */
  170. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB5, 0x1000); /* LARB5, VENC2 */
  171. M4U_WriteReg32(LARB0_BASE, 0x200, 0x18); /* ovl_ch0_0/1 */
  172. M4U_WriteReg32(LARB0_BASE, 0x214, 0x4); /* mdp_rdma0; min(4,5) */
  173. M4U_WriteReg32(LARB0_BASE, 0x21c, 0x5); /* mdp_wrot0 */
  174. M4U_WriteReg32(LARB4_BASE, 0x200, 0x8); /* ovl_ch1_0/1 */
  175. M4U_WriteReg32(LARB4_BASE, 0x210, 0x4); /* mdp_rdma1; min(4,5) */
  176. M4U_WriteReg32(LARB4_BASE, 0x214, 0x3); /* mdp_wrot1 */
  177. M4U_WriteReg32(LARB1_BASE, 0x200, 0x1f); /* port#0, mc */
  178. M4U_WriteReg32(LARB1_BASE, 0x204, 0x06); /* port#1, pp */
  179. M4U_WriteReg32(LARB1_BASE, 0x208, 0x1); /* port#2, ufo */
  180. M4U_WriteReg32(LARB1_BASE, 0x20c, 0x1); /* port#3, vld */
  181. M4U_WriteReg32(LARB1_BASE, 0x210, 0x1); /* port#4, vld2 */
  182. M4U_WriteReg32(LARB1_BASE, 0x214, 0x2); /* port#5, mv */
  183. M4U_WriteReg32(LARB1_BASE, 0x218, 0x1); /* port#6, pred rd */
  184. M4U_WriteReg32(LARB1_BASE, 0x21c, 0x1); /* port#7, pred wr */
  185. M4U_WriteReg32(LARB1_BASE, 0x220, 0x1); /* port#8, ppwrap */
  186. }
  187. static void hdmi4kSetting(struct mtk_smi_data *smidev)
  188. {
  189. /* VP 4K */
  190. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB0, 0x12A6); /* LARB0, DISP+MDP */
  191. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB1, 0x158B); /* LARB1, VDEC */
  192. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB2, 0x1000); /* LARB2, ISP */
  193. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB3, 0x1000); /* LARB3, VENC+JPG */
  194. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB4, 0x1A6D); /* LARB4, DISP2+MDP2 */
  195. M4U_WriteReg32(SMI_COMMON_EXT_BASE, REG_OFFSET_SMI_L1ARB5, 0x1000); /* LARB5, VENC2 */
  196. M4U_WriteReg32(LARB0_BASE, 0x200, 0x18); /* ovl_ch0_0/1 */
  197. M4U_WriteReg32(LARB0_BASE, 0x214, 0x4); /* mdp_rdma0; min(4,5) */
  198. M4U_WriteReg32(LARB0_BASE, 0x21c, 0x5); /* mdp_wrot0 */
  199. M4U_WriteReg32(LARB4_BASE, 0x200, 0x8); /* ovl_ch1_0/1 */
  200. M4U_WriteReg32(LARB4_BASE, 0x210, 0x4); /* mdp_rdma1; min(4,5) */
  201. M4U_WriteReg32(LARB4_BASE, 0x214, 0x3); /* mdp_wrot1 */
  202. M4U_WriteReg32(LARB1_BASE, 0x200, 0x1f); /* port#0, mc */
  203. M4U_WriteReg32(LARB1_BASE, 0x204, 0x06); /* port#1, pp */
  204. M4U_WriteReg32(LARB1_BASE, 0x208, 0x1); /* port#2, ufo */
  205. M4U_WriteReg32(LARB1_BASE, 0x20c, 0x1); /* port#3, vld */
  206. M4U_WriteReg32(LARB1_BASE, 0x210, 0x1); /* port#4, vld2 */
  207. M4U_WriteReg32(LARB1_BASE, 0x214, 0x2); /* port#5, mv */
  208. M4U_WriteReg32(LARB1_BASE, 0x218, 0x1); /* port#6, pred rd */
  209. M4U_WriteReg32(LARB1_BASE, 0x21c, 0x1); /* port#7, pred wr */
  210. M4U_WriteReg32(LARB1_BASE, 0x220, 0x1); /* port#8, ppwrap */
  211. }
  212. /* Make sure all the clock is enabled */
  213. const struct mtk_smi_priv smi_mt8173_priv = {
  214. .larb_port_num = {8, 9, 21, 15, 6, 9},
  215. .larb_vc_setting = { 0, 2, 0, 1, 0, 1 },
  216. .init_setting = initSetting,
  217. .vp_setting = vpSetting,
  218. .vr_setting = vrSetting,
  219. .hdmi_setting = hdmiSetting,
  220. .hdmi_4k_setting = hdmi4kSetting,
  221. };