hdmi.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582
  1. /*
  2. * Copyright (C) 2012 Avionic Design GmbH
  3. * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <linux/clk.h>
  10. #include <linux/debugfs.h>
  11. #include <linux/hdmi.h>
  12. #include <linux/regulator/consumer.h>
  13. #include <linux/reset.h>
  14. #include "hdmi.h"
  15. #include "drm.h"
  16. #include "dc.h"
  17. struct tmds_config {
  18. unsigned int pclk;
  19. u32 pll0;
  20. u32 pll1;
  21. u32 pe_current;
  22. u32 drive_current;
  23. u32 peak_current;
  24. };
  25. struct tegra_hdmi_config {
  26. const struct tmds_config *tmds;
  27. unsigned int num_tmds;
  28. unsigned long fuse_override_offset;
  29. unsigned long fuse_override_value;
  30. bool has_sor_io_peak_current;
  31. };
  32. struct tegra_hdmi {
  33. struct host1x_client client;
  34. struct tegra_output output;
  35. struct device *dev;
  36. bool enabled;
  37. struct regulator *hdmi;
  38. struct regulator *pll;
  39. struct regulator *vdd;
  40. void __iomem *regs;
  41. unsigned int irq;
  42. struct clk *clk_parent;
  43. struct clk *clk;
  44. struct reset_control *rst;
  45. const struct tegra_hdmi_config *config;
  46. unsigned int audio_source;
  47. unsigned int audio_freq;
  48. bool stereo;
  49. bool dvi;
  50. struct drm_info_list *debugfs_files;
  51. struct drm_minor *minor;
  52. struct dentry *debugfs;
  53. };
  54. static inline struct tegra_hdmi *
  55. host1x_client_to_hdmi(struct host1x_client *client)
  56. {
  57. return container_of(client, struct tegra_hdmi, client);
  58. }
  59. static inline struct tegra_hdmi *to_hdmi(struct tegra_output *output)
  60. {
  61. return container_of(output, struct tegra_hdmi, output);
  62. }
  63. #define HDMI_AUDIOCLK_FREQ 216000000
  64. #define HDMI_REKEY_DEFAULT 56
  65. enum {
  66. AUTO = 0,
  67. SPDIF,
  68. HDA,
  69. };
  70. static inline unsigned long tegra_hdmi_readl(struct tegra_hdmi *hdmi,
  71. unsigned long reg)
  72. {
  73. return readl(hdmi->regs + (reg << 2));
  74. }
  75. static inline void tegra_hdmi_writel(struct tegra_hdmi *hdmi, unsigned long val,
  76. unsigned long reg)
  77. {
  78. writel(val, hdmi->regs + (reg << 2));
  79. }
  80. struct tegra_hdmi_audio_config {
  81. unsigned int pclk;
  82. unsigned int n;
  83. unsigned int cts;
  84. unsigned int aval;
  85. };
  86. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_32k[] = {
  87. { 25200000, 4096, 25200, 24000 },
  88. { 27000000, 4096, 27000, 24000 },
  89. { 74250000, 4096, 74250, 24000 },
  90. { 148500000, 4096, 148500, 24000 },
  91. { 0, 0, 0, 0 },
  92. };
  93. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_44_1k[] = {
  94. { 25200000, 5880, 26250, 25000 },
  95. { 27000000, 5880, 28125, 25000 },
  96. { 74250000, 4704, 61875, 20000 },
  97. { 148500000, 4704, 123750, 20000 },
  98. { 0, 0, 0, 0 },
  99. };
  100. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_48k[] = {
  101. { 25200000, 6144, 25200, 24000 },
  102. { 27000000, 6144, 27000, 24000 },
  103. { 74250000, 6144, 74250, 24000 },
  104. { 148500000, 6144, 148500, 24000 },
  105. { 0, 0, 0, 0 },
  106. };
  107. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_88_2k[] = {
  108. { 25200000, 11760, 26250, 25000 },
  109. { 27000000, 11760, 28125, 25000 },
  110. { 74250000, 9408, 61875, 20000 },
  111. { 148500000, 9408, 123750, 20000 },
  112. { 0, 0, 0, 0 },
  113. };
  114. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_96k[] = {
  115. { 25200000, 12288, 25200, 24000 },
  116. { 27000000, 12288, 27000, 24000 },
  117. { 74250000, 12288, 74250, 24000 },
  118. { 148500000, 12288, 148500, 24000 },
  119. { 0, 0, 0, 0 },
  120. };
  121. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_176_4k[] = {
  122. { 25200000, 23520, 26250, 25000 },
  123. { 27000000, 23520, 28125, 25000 },
  124. { 74250000, 18816, 61875, 20000 },
  125. { 148500000, 18816, 123750, 20000 },
  126. { 0, 0, 0, 0 },
  127. };
  128. static const struct tegra_hdmi_audio_config tegra_hdmi_audio_192k[] = {
  129. { 25200000, 24576, 25200, 24000 },
  130. { 27000000, 24576, 27000, 24000 },
  131. { 74250000, 24576, 74250, 24000 },
  132. { 148500000, 24576, 148500, 24000 },
  133. { 0, 0, 0, 0 },
  134. };
  135. static const struct tmds_config tegra20_tmds_config[] = {
  136. { /* slow pixel clock modes */
  137. .pclk = 27000000,
  138. .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
  139. SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(0) |
  140. SOR_PLL_TX_REG_LOAD(3),
  141. .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
  142. .pe_current = PE_CURRENT0(PE_CURRENT_0_0_mA) |
  143. PE_CURRENT1(PE_CURRENT_0_0_mA) |
  144. PE_CURRENT2(PE_CURRENT_0_0_mA) |
  145. PE_CURRENT3(PE_CURRENT_0_0_mA),
  146. .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_7_125_mA) |
  147. DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
  148. DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
  149. DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
  150. },
  151. { /* high pixel clock modes */
  152. .pclk = UINT_MAX,
  153. .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
  154. SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
  155. SOR_PLL_TX_REG_LOAD(3),
  156. .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
  157. .pe_current = PE_CURRENT0(PE_CURRENT_6_0_mA) |
  158. PE_CURRENT1(PE_CURRENT_6_0_mA) |
  159. PE_CURRENT2(PE_CURRENT_6_0_mA) |
  160. PE_CURRENT3(PE_CURRENT_6_0_mA),
  161. .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_7_125_mA) |
  162. DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
  163. DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
  164. DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
  165. },
  166. };
  167. static const struct tmds_config tegra30_tmds_config[] = {
  168. { /* 480p modes */
  169. .pclk = 27000000,
  170. .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
  171. SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(0) |
  172. SOR_PLL_TX_REG_LOAD(0),
  173. .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
  174. .pe_current = PE_CURRENT0(PE_CURRENT_0_0_mA) |
  175. PE_CURRENT1(PE_CURRENT_0_0_mA) |
  176. PE_CURRENT2(PE_CURRENT_0_0_mA) |
  177. PE_CURRENT3(PE_CURRENT_0_0_mA),
  178. .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_5_250_mA) |
  179. DRIVE_CURRENT_LANE1(DRIVE_CURRENT_5_250_mA) |
  180. DRIVE_CURRENT_LANE2(DRIVE_CURRENT_5_250_mA) |
  181. DRIVE_CURRENT_LANE3(DRIVE_CURRENT_5_250_mA),
  182. }, { /* 720p modes */
  183. .pclk = 74250000,
  184. .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
  185. SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
  186. SOR_PLL_TX_REG_LOAD(0),
  187. .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
  188. .pe_current = PE_CURRENT0(PE_CURRENT_5_0_mA) |
  189. PE_CURRENT1(PE_CURRENT_5_0_mA) |
  190. PE_CURRENT2(PE_CURRENT_5_0_mA) |
  191. PE_CURRENT3(PE_CURRENT_5_0_mA),
  192. .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_5_250_mA) |
  193. DRIVE_CURRENT_LANE1(DRIVE_CURRENT_5_250_mA) |
  194. DRIVE_CURRENT_LANE2(DRIVE_CURRENT_5_250_mA) |
  195. DRIVE_CURRENT_LANE3(DRIVE_CURRENT_5_250_mA),
  196. }, { /* 1080p modes */
  197. .pclk = UINT_MAX,
  198. .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
  199. SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(3) |
  200. SOR_PLL_TX_REG_LOAD(0),
  201. .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
  202. .pe_current = PE_CURRENT0(PE_CURRENT_5_0_mA) |
  203. PE_CURRENT1(PE_CURRENT_5_0_mA) |
  204. PE_CURRENT2(PE_CURRENT_5_0_mA) |
  205. PE_CURRENT3(PE_CURRENT_5_0_mA),
  206. .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_5_250_mA) |
  207. DRIVE_CURRENT_LANE1(DRIVE_CURRENT_5_250_mA) |
  208. DRIVE_CURRENT_LANE2(DRIVE_CURRENT_5_250_mA) |
  209. DRIVE_CURRENT_LANE3(DRIVE_CURRENT_5_250_mA),
  210. },
  211. };
  212. static const struct tmds_config tegra114_tmds_config[] = {
  213. { /* 480p/576p / 25.2MHz/27MHz modes */
  214. .pclk = 27000000,
  215. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  216. SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL,
  217. .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
  218. .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) |
  219. PE_CURRENT1(PE_CURRENT_0_mA_T114) |
  220. PE_CURRENT2(PE_CURRENT_0_mA_T114) |
  221. PE_CURRENT3(PE_CURRENT_0_mA_T114),
  222. .drive_current =
  223. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) |
  224. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) |
  225. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) |
  226. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114),
  227. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  228. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  229. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  230. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  231. }, { /* 720p / 74.25MHz modes */
  232. .pclk = 74250000,
  233. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  234. SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL,
  235. .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) |
  236. SOR_PLL_TMDS_TERMADJ(0),
  237. .pe_current = PE_CURRENT0(PE_CURRENT_15_mA_T114) |
  238. PE_CURRENT1(PE_CURRENT_15_mA_T114) |
  239. PE_CURRENT2(PE_CURRENT_15_mA_T114) |
  240. PE_CURRENT3(PE_CURRENT_15_mA_T114),
  241. .drive_current =
  242. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) |
  243. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) |
  244. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) |
  245. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114),
  246. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  247. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  248. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  249. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  250. }, { /* 1080p / 148.5MHz modes */
  251. .pclk = 148500000,
  252. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  253. SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL,
  254. .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) |
  255. SOR_PLL_TMDS_TERMADJ(0),
  256. .pe_current = PE_CURRENT0(PE_CURRENT_10_mA_T114) |
  257. PE_CURRENT1(PE_CURRENT_10_mA_T114) |
  258. PE_CURRENT2(PE_CURRENT_10_mA_T114) |
  259. PE_CURRENT3(PE_CURRENT_10_mA_T114),
  260. .drive_current =
  261. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_12_400_mA_T114) |
  262. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_12_400_mA_T114) |
  263. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_12_400_mA_T114) |
  264. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_12_400_mA_T114),
  265. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  266. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  267. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  268. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  269. }, { /* 225/297MHz modes */
  270. .pclk = UINT_MAX,
  271. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  272. SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL,
  273. .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
  274. | SOR_PLL_TMDS_TERM_ENABLE,
  275. .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) |
  276. PE_CURRENT1(PE_CURRENT_0_mA_T114) |
  277. PE_CURRENT2(PE_CURRENT_0_mA_T114) |
  278. PE_CURRENT3(PE_CURRENT_0_mA_T114),
  279. .drive_current =
  280. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_25_200_mA_T114) |
  281. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_25_200_mA_T114) |
  282. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_25_200_mA_T114) |
  283. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_19_200_mA_T114),
  284. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_3_000_mA) |
  285. PEAK_CURRENT_LANE1(PEAK_CURRENT_3_000_mA) |
  286. PEAK_CURRENT_LANE2(PEAK_CURRENT_3_000_mA) |
  287. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_800_mA),
  288. },
  289. };
  290. static const struct tmds_config tegra124_tmds_config[] = {
  291. { /* 480p/576p / 25.2MHz/27MHz modes */
  292. .pclk = 27000000,
  293. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  294. SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL,
  295. .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
  296. .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) |
  297. PE_CURRENT1(PE_CURRENT_0_mA_T114) |
  298. PE_CURRENT2(PE_CURRENT_0_mA_T114) |
  299. PE_CURRENT3(PE_CURRENT_0_mA_T114),
  300. .drive_current =
  301. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) |
  302. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) |
  303. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) |
  304. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114),
  305. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  306. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  307. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  308. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  309. }, { /* 720p / 74.25MHz modes */
  310. .pclk = 74250000,
  311. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  312. SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL,
  313. .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) |
  314. SOR_PLL_TMDS_TERMADJ(0),
  315. .pe_current = PE_CURRENT0(PE_CURRENT_15_mA_T114) |
  316. PE_CURRENT1(PE_CURRENT_15_mA_T114) |
  317. PE_CURRENT2(PE_CURRENT_15_mA_T114) |
  318. PE_CURRENT3(PE_CURRENT_15_mA_T114),
  319. .drive_current =
  320. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) |
  321. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) |
  322. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) |
  323. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114),
  324. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  325. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  326. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  327. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  328. }, { /* 1080p / 148.5MHz modes */
  329. .pclk = 148500000,
  330. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  331. SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL,
  332. .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) |
  333. SOR_PLL_TMDS_TERMADJ(0),
  334. .pe_current = PE_CURRENT0(PE_CURRENT_10_mA_T114) |
  335. PE_CURRENT1(PE_CURRENT_10_mA_T114) |
  336. PE_CURRENT2(PE_CURRENT_10_mA_T114) |
  337. PE_CURRENT3(PE_CURRENT_10_mA_T114),
  338. .drive_current =
  339. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_12_400_mA_T114) |
  340. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_12_400_mA_T114) |
  341. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_12_400_mA_T114) |
  342. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_12_400_mA_T114),
  343. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) |
  344. PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) |
  345. PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) |
  346. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA),
  347. }, { /* 225/297MHz modes */
  348. .pclk = UINT_MAX,
  349. .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
  350. SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL,
  351. .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
  352. | SOR_PLL_TMDS_TERM_ENABLE,
  353. .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) |
  354. PE_CURRENT1(PE_CURRENT_0_mA_T114) |
  355. PE_CURRENT2(PE_CURRENT_0_mA_T114) |
  356. PE_CURRENT3(PE_CURRENT_0_mA_T114),
  357. .drive_current =
  358. DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_25_200_mA_T114) |
  359. DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_25_200_mA_T114) |
  360. DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_25_200_mA_T114) |
  361. DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_19_200_mA_T114),
  362. .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_3_000_mA) |
  363. PEAK_CURRENT_LANE1(PEAK_CURRENT_3_000_mA) |
  364. PEAK_CURRENT_LANE2(PEAK_CURRENT_3_000_mA) |
  365. PEAK_CURRENT_LANE3(PEAK_CURRENT_0_800_mA),
  366. },
  367. };
  368. static const struct tegra_hdmi_audio_config *
  369. tegra_hdmi_get_audio_config(unsigned int audio_freq, unsigned int pclk)
  370. {
  371. const struct tegra_hdmi_audio_config *table;
  372. switch (audio_freq) {
  373. case 32000:
  374. table = tegra_hdmi_audio_32k;
  375. break;
  376. case 44100:
  377. table = tegra_hdmi_audio_44_1k;
  378. break;
  379. case 48000:
  380. table = tegra_hdmi_audio_48k;
  381. break;
  382. case 88200:
  383. table = tegra_hdmi_audio_88_2k;
  384. break;
  385. case 96000:
  386. table = tegra_hdmi_audio_96k;
  387. break;
  388. case 176400:
  389. table = tegra_hdmi_audio_176_4k;
  390. break;
  391. case 192000:
  392. table = tegra_hdmi_audio_192k;
  393. break;
  394. default:
  395. return NULL;
  396. }
  397. while (table->pclk) {
  398. if (table->pclk == pclk)
  399. return table;
  400. table++;
  401. }
  402. return NULL;
  403. }
  404. static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi)
  405. {
  406. const unsigned int freqs[] = {
  407. 32000, 44100, 48000, 88200, 96000, 176400, 192000
  408. };
  409. unsigned int i;
  410. for (i = 0; i < ARRAY_SIZE(freqs); i++) {
  411. unsigned int f = freqs[i];
  412. unsigned int eight_half;
  413. unsigned long value;
  414. unsigned int delta;
  415. if (f > 96000)
  416. delta = 2;
  417. else if (f > 48000)
  418. delta = 6;
  419. else
  420. delta = 9;
  421. eight_half = (8 * HDMI_AUDIOCLK_FREQ) / (f * 128);
  422. value = AUDIO_FS_LOW(eight_half - delta) |
  423. AUDIO_FS_HIGH(eight_half + delta);
  424. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_FS(i));
  425. }
  426. }
  427. static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi, unsigned int pclk)
  428. {
  429. struct device_node *node = hdmi->dev->of_node;
  430. const struct tegra_hdmi_audio_config *config;
  431. unsigned int offset = 0;
  432. unsigned long value;
  433. switch (hdmi->audio_source) {
  434. case HDA:
  435. value = AUDIO_CNTRL0_SOURCE_SELECT_HDAL;
  436. break;
  437. case SPDIF:
  438. value = AUDIO_CNTRL0_SOURCE_SELECT_SPDIF;
  439. break;
  440. default:
  441. value = AUDIO_CNTRL0_SOURCE_SELECT_AUTO;
  442. break;
  443. }
  444. if (of_device_is_compatible(node, "nvidia,tegra30-hdmi")) {
  445. value |= AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
  446. AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0);
  447. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0);
  448. } else {
  449. value |= AUDIO_CNTRL0_INJECT_NULLSMPL;
  450. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0);
  451. value = AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
  452. AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0);
  453. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0);
  454. }
  455. config = tegra_hdmi_get_audio_config(hdmi->audio_freq, pclk);
  456. if (!config) {
  457. dev_err(hdmi->dev, "cannot set audio to %u at %u pclk\n",
  458. hdmi->audio_freq, pclk);
  459. return -EINVAL;
  460. }
  461. tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL);
  462. value = AUDIO_N_RESETF | AUDIO_N_GENERATE_ALTERNATE |
  463. AUDIO_N_VALUE(config->n - 1);
  464. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N);
  465. tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config->n) | ACR_ENABLE,
  466. HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
  467. value = ACR_SUBPACK_CTS(config->cts);
  468. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
  469. value = SPARE_HW_CTS | SPARE_FORCE_SW_CTS | SPARE_CTS_RESET_VAL(1);
  470. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_SPARE);
  471. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_AUDIO_N);
  472. value &= ~AUDIO_N_RESETF;
  473. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N);
  474. if (of_device_is_compatible(node, "nvidia,tegra30-hdmi")) {
  475. switch (hdmi->audio_freq) {
  476. case 32000:
  477. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0320;
  478. break;
  479. case 44100:
  480. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0441;
  481. break;
  482. case 48000:
  483. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480;
  484. break;
  485. case 88200:
  486. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0882;
  487. break;
  488. case 96000:
  489. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0960;
  490. break;
  491. case 176400:
  492. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1764;
  493. break;
  494. case 192000:
  495. offset = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1920;
  496. break;
  497. }
  498. tegra_hdmi_writel(hdmi, config->aval, offset);
  499. }
  500. tegra_hdmi_setup_audio_fs_tables(hdmi);
  501. return 0;
  502. }
  503. static inline unsigned long tegra_hdmi_subpack(const u8 *ptr, size_t size)
  504. {
  505. unsigned long value = 0;
  506. size_t i;
  507. for (i = size; i > 0; i--)
  508. value = (value << 8) | ptr[i - 1];
  509. return value;
  510. }
  511. static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data,
  512. size_t size)
  513. {
  514. const u8 *ptr = data;
  515. unsigned long offset;
  516. unsigned long value;
  517. size_t i, j;
  518. switch (ptr[0]) {
  519. case HDMI_INFOFRAME_TYPE_AVI:
  520. offset = HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER;
  521. break;
  522. case HDMI_INFOFRAME_TYPE_AUDIO:
  523. offset = HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER;
  524. break;
  525. case HDMI_INFOFRAME_TYPE_VENDOR:
  526. offset = HDMI_NV_PDISP_HDMI_GENERIC_HEADER;
  527. break;
  528. default:
  529. dev_err(hdmi->dev, "unsupported infoframe type: %02x\n",
  530. ptr[0]);
  531. return;
  532. }
  533. value = INFOFRAME_HEADER_TYPE(ptr[0]) |
  534. INFOFRAME_HEADER_VERSION(ptr[1]) |
  535. INFOFRAME_HEADER_LEN(ptr[2]);
  536. tegra_hdmi_writel(hdmi, value, offset);
  537. offset++;
  538. /*
  539. * Each subpack contains 7 bytes, divided into:
  540. * - subpack_low: bytes 0 - 3
  541. * - subpack_high: bytes 4 - 6 (with byte 7 padded to 0x00)
  542. */
  543. for (i = 3, j = 0; i < size; i += 7, j += 8) {
  544. size_t rem = size - i, num = min_t(size_t, rem, 4);
  545. value = tegra_hdmi_subpack(&ptr[i], num);
  546. tegra_hdmi_writel(hdmi, value, offset++);
  547. num = min_t(size_t, rem - num, 3);
  548. value = tegra_hdmi_subpack(&ptr[i + 4], num);
  549. tegra_hdmi_writel(hdmi, value, offset++);
  550. }
  551. }
  552. static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi,
  553. struct drm_display_mode *mode)
  554. {
  555. struct hdmi_avi_infoframe frame;
  556. u8 buffer[17];
  557. ssize_t err;
  558. if (hdmi->dvi) {
  559. tegra_hdmi_writel(hdmi, 0,
  560. HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
  561. return;
  562. }
  563. err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
  564. if (err < 0) {
  565. dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err);
  566. return;
  567. }
  568. err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
  569. if (err < 0) {
  570. dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err);
  571. return;
  572. }
  573. tegra_hdmi_write_infopack(hdmi, buffer, err);
  574. tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
  575. HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
  576. }
  577. static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi)
  578. {
  579. struct hdmi_audio_infoframe frame;
  580. u8 buffer[14];
  581. ssize_t err;
  582. if (hdmi->dvi) {
  583. tegra_hdmi_writel(hdmi, 0,
  584. HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
  585. return;
  586. }
  587. err = hdmi_audio_infoframe_init(&frame);
  588. if (err < 0) {
  589. dev_err(hdmi->dev, "failed to setup audio infoframe: %zd\n",
  590. err);
  591. return;
  592. }
  593. frame.channels = 2;
  594. err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
  595. if (err < 0) {
  596. dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n",
  597. err);
  598. return;
  599. }
  600. /*
  601. * The audio infoframe has only one set of subpack registers, so the
  602. * infoframe needs to be truncated. One set of subpack registers can
  603. * contain 7 bytes. Including the 3 byte header only the first 10
  604. * bytes can be programmed.
  605. */
  606. tegra_hdmi_write_infopack(hdmi, buffer, min_t(size_t, 10, err));
  607. tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
  608. HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
  609. }
  610. static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
  611. {
  612. struct hdmi_vendor_infoframe frame;
  613. unsigned long value;
  614. u8 buffer[10];
  615. ssize_t err;
  616. if (!hdmi->stereo) {
  617. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  618. value &= ~GENERIC_CTRL_ENABLE;
  619. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  620. return;
  621. }
  622. hdmi_vendor_infoframe_init(&frame);
  623. frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
  624. err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
  625. if (err < 0) {
  626. dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
  627. err);
  628. return;
  629. }
  630. tegra_hdmi_write_infopack(hdmi, buffer, err);
  631. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  632. value |= GENERIC_CTRL_ENABLE;
  633. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  634. }
  635. static void tegra_hdmi_setup_tmds(struct tegra_hdmi *hdmi,
  636. const struct tmds_config *tmds)
  637. {
  638. unsigned long value;
  639. tegra_hdmi_writel(hdmi, tmds->pll0, HDMI_NV_PDISP_SOR_PLL0);
  640. tegra_hdmi_writel(hdmi, tmds->pll1, HDMI_NV_PDISP_SOR_PLL1);
  641. tegra_hdmi_writel(hdmi, tmds->pe_current, HDMI_NV_PDISP_PE_CURRENT);
  642. tegra_hdmi_writel(hdmi, tmds->drive_current,
  643. HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
  644. value = tegra_hdmi_readl(hdmi, hdmi->config->fuse_override_offset);
  645. value |= hdmi->config->fuse_override_value;
  646. tegra_hdmi_writel(hdmi, value, hdmi->config->fuse_override_offset);
  647. if (hdmi->config->has_sor_io_peak_current)
  648. tegra_hdmi_writel(hdmi, tmds->peak_current,
  649. HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
  650. }
  651. static bool tegra_output_is_hdmi(struct tegra_output *output)
  652. {
  653. struct edid *edid;
  654. if (!output->connector.edid_blob_ptr)
  655. return false;
  656. edid = (struct edid *)output->connector.edid_blob_ptr->data;
  657. return drm_detect_hdmi_monitor(edid);
  658. }
  659. static int tegra_output_hdmi_enable(struct tegra_output *output)
  660. {
  661. unsigned int h_sync_width, h_front_porch, h_back_porch, i, rekey;
  662. struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc);
  663. struct drm_display_mode *mode = &dc->base.mode;
  664. struct tegra_hdmi *hdmi = to_hdmi(output);
  665. struct device_node *node = hdmi->dev->of_node;
  666. unsigned int pulse_start, div82, pclk;
  667. unsigned long value;
  668. int retries = 1000;
  669. int err;
  670. if (hdmi->enabled)
  671. return 0;
  672. hdmi->dvi = !tegra_output_is_hdmi(output);
  673. pclk = mode->clock * 1000;
  674. h_sync_width = mode->hsync_end - mode->hsync_start;
  675. h_back_porch = mode->htotal - mode->hsync_end;
  676. h_front_porch = mode->hsync_start - mode->hdisplay;
  677. err = regulator_enable(hdmi->pll);
  678. if (err < 0) {
  679. dev_err(hdmi->dev, "failed to enable PLL regulator: %d\n", err);
  680. return err;
  681. }
  682. err = regulator_enable(hdmi->vdd);
  683. if (err < 0) {
  684. dev_err(hdmi->dev, "failed to enable VDD regulator: %d\n", err);
  685. return err;
  686. }
  687. err = clk_set_rate(hdmi->clk, pclk);
  688. if (err < 0)
  689. return err;
  690. err = clk_prepare_enable(hdmi->clk);
  691. if (err < 0) {
  692. dev_err(hdmi->dev, "failed to enable clock: %d\n", err);
  693. return err;
  694. }
  695. reset_control_assert(hdmi->rst);
  696. usleep_range(1000, 2000);
  697. reset_control_deassert(hdmi->rst);
  698. /* power up sequence */
  699. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0);
  700. value &= ~SOR_PLL_PDBG;
  701. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0);
  702. usleep_range(10, 20);
  703. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0);
  704. value &= ~SOR_PLL_PWR;
  705. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0);
  706. tegra_dc_writel(dc, VSYNC_H_POSITION(1),
  707. DC_DISP_DISP_TIMING_OPTIONS);
  708. tegra_dc_writel(dc, DITHER_CONTROL_DISABLE | BASE_COLOR_SIZE888,
  709. DC_DISP_DISP_COLOR_CONTROL);
  710. /* video_preamble uses h_pulse2 */
  711. pulse_start = 1 + h_sync_width + h_back_porch - 10;
  712. tegra_dc_writel(dc, H_PULSE_2_ENABLE, DC_DISP_DISP_SIGNAL_OPTIONS0);
  713. value = PULSE_MODE_NORMAL | PULSE_POLARITY_HIGH | PULSE_QUAL_VACTIVE |
  714. PULSE_LAST_END_A;
  715. tegra_dc_writel(dc, value, DC_DISP_H_PULSE2_CONTROL);
  716. value = PULSE_START(pulse_start) | PULSE_END(pulse_start + 8);
  717. tegra_dc_writel(dc, value, DC_DISP_H_PULSE2_POSITION_A);
  718. value = VSYNC_WINDOW_END(0x210) | VSYNC_WINDOW_START(0x200) |
  719. VSYNC_WINDOW_ENABLE;
  720. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
  721. if (dc->pipe)
  722. value = HDMI_SRC_DISPLAYB;
  723. else
  724. value = HDMI_SRC_DISPLAYA;
  725. if ((mode->hdisplay == 720) && ((mode->vdisplay == 480) ||
  726. (mode->vdisplay == 576)))
  727. tegra_hdmi_writel(hdmi,
  728. value | ARM_VIDEO_RANGE_FULL,
  729. HDMI_NV_PDISP_INPUT_CONTROL);
  730. else
  731. tegra_hdmi_writel(hdmi,
  732. value | ARM_VIDEO_RANGE_LIMITED,
  733. HDMI_NV_PDISP_INPUT_CONTROL);
  734. div82 = clk_get_rate(hdmi->clk) / 1000000 * 4;
  735. value = SOR_REFCLK_DIV_INT(div82 >> 2) | SOR_REFCLK_DIV_FRAC(div82);
  736. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_REFCLK);
  737. if (!hdmi->dvi) {
  738. err = tegra_hdmi_setup_audio(hdmi, pclk);
  739. if (err < 0)
  740. hdmi->dvi = true;
  741. }
  742. if (of_device_is_compatible(node, "nvidia,tegra20-hdmi")) {
  743. /*
  744. * TODO: add ELD support
  745. */
  746. }
  747. rekey = HDMI_REKEY_DEFAULT;
  748. value = HDMI_CTRL_REKEY(rekey);
  749. value |= HDMI_CTRL_MAX_AC_PACKET((h_sync_width + h_back_porch +
  750. h_front_porch - rekey - 18) / 32);
  751. if (!hdmi->dvi)
  752. value |= HDMI_CTRL_ENABLE;
  753. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_CTRL);
  754. if (hdmi->dvi)
  755. tegra_hdmi_writel(hdmi, 0x0,
  756. HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  757. else
  758. tegra_hdmi_writel(hdmi, GENERIC_CTRL_AUDIO,
  759. HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  760. tegra_hdmi_setup_avi_infoframe(hdmi, mode);
  761. tegra_hdmi_setup_audio_infoframe(hdmi);
  762. tegra_hdmi_setup_stereo_infoframe(hdmi);
  763. /* TMDS CONFIG */
  764. for (i = 0; i < hdmi->config->num_tmds; i++) {
  765. if (pclk <= hdmi->config->tmds[i].pclk) {
  766. tegra_hdmi_setup_tmds(hdmi, &hdmi->config->tmds[i]);
  767. break;
  768. }
  769. }
  770. tegra_hdmi_writel(hdmi,
  771. SOR_SEQ_CTL_PU_PC(0) |
  772. SOR_SEQ_PU_PC_ALT(0) |
  773. SOR_SEQ_PD_PC(8) |
  774. SOR_SEQ_PD_PC_ALT(8),
  775. HDMI_NV_PDISP_SOR_SEQ_CTL);
  776. value = SOR_SEQ_INST_WAIT_TIME(1) |
  777. SOR_SEQ_INST_WAIT_UNITS_VSYNC |
  778. SOR_SEQ_INST_HALT |
  779. SOR_SEQ_INST_PIN_A_LOW |
  780. SOR_SEQ_INST_PIN_B_LOW |
  781. SOR_SEQ_INST_DRIVE_PWM_OUT_LO;
  782. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(0));
  783. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(8));
  784. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_CSTM);
  785. value &= ~SOR_CSTM_ROTCLK(~0);
  786. value |= SOR_CSTM_ROTCLK(2);
  787. value |= SOR_CSTM_PLLDIV;
  788. value &= ~SOR_CSTM_LVDS_ENABLE;
  789. value &= ~SOR_CSTM_MODE_MASK;
  790. value |= SOR_CSTM_MODE_TMDS;
  791. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_CSTM);
  792. /* start SOR */
  793. tegra_hdmi_writel(hdmi,
  794. SOR_PWR_NORMAL_STATE_PU |
  795. SOR_PWR_NORMAL_START_NORMAL |
  796. SOR_PWR_SAFE_STATE_PD |
  797. SOR_PWR_SETTING_NEW_TRIGGER,
  798. HDMI_NV_PDISP_SOR_PWR);
  799. tegra_hdmi_writel(hdmi,
  800. SOR_PWR_NORMAL_STATE_PU |
  801. SOR_PWR_NORMAL_START_NORMAL |
  802. SOR_PWR_SAFE_STATE_PD |
  803. SOR_PWR_SETTING_NEW_DONE,
  804. HDMI_NV_PDISP_SOR_PWR);
  805. do {
  806. BUG_ON(--retries < 0);
  807. value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR);
  808. } while (value & SOR_PWR_SETTING_NEW_PENDING);
  809. value = SOR_STATE_ASY_CRCMODE_COMPLETE |
  810. SOR_STATE_ASY_OWNER_HEAD0 |
  811. SOR_STATE_ASY_SUBOWNER_BOTH |
  812. SOR_STATE_ASY_PROTOCOL_SINGLE_TMDS_A |
  813. SOR_STATE_ASY_DEPOL_POS;
  814. /* setup sync polarities */
  815. if (mode->flags & DRM_MODE_FLAG_PHSYNC)
  816. value |= SOR_STATE_ASY_HSYNCPOL_POS;
  817. if (mode->flags & DRM_MODE_FLAG_NHSYNC)
  818. value |= SOR_STATE_ASY_HSYNCPOL_NEG;
  819. if (mode->flags & DRM_MODE_FLAG_PVSYNC)
  820. value |= SOR_STATE_ASY_VSYNCPOL_POS;
  821. if (mode->flags & DRM_MODE_FLAG_NVSYNC)
  822. value |= SOR_STATE_ASY_VSYNCPOL_NEG;
  823. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE2);
  824. value = SOR_STATE_ASY_HEAD_OPMODE_AWAKE | SOR_STATE_ASY_ORMODE_NORMAL;
  825. tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE1);
  826. tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
  827. tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0);
  828. tegra_hdmi_writel(hdmi, value | SOR_STATE_ATTACHED,
  829. HDMI_NV_PDISP_SOR_STATE1);
  830. tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
  831. value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
  832. value |= HDMI_ENABLE;
  833. tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
  834. value = tegra_dc_readl(dc, DC_CMD_DISPLAY_COMMAND);
  835. value &= ~DISP_CTRL_MODE_MASK;
  836. value |= DISP_CTRL_MODE_C_DISPLAY;
  837. tegra_dc_writel(dc, value, DC_CMD_DISPLAY_COMMAND);
  838. value = tegra_dc_readl(dc, DC_CMD_DISPLAY_POWER_CONTROL);
  839. value |= PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
  840. PW4_ENABLE | PM0_ENABLE | PM1_ENABLE;
  841. tegra_dc_writel(dc, value, DC_CMD_DISPLAY_POWER_CONTROL);
  842. tegra_dc_writel(dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL);
  843. tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
  844. /* TODO: add HDCP support */
  845. hdmi->enabled = true;
  846. return 0;
  847. }
  848. static int tegra_output_hdmi_disable(struct tegra_output *output)
  849. {
  850. struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc);
  851. struct tegra_hdmi *hdmi = to_hdmi(output);
  852. unsigned long value;
  853. if (!hdmi->enabled)
  854. return 0;
  855. /*
  856. * The following accesses registers of the display controller, so make
  857. * sure it's only executed when the output is attached to one.
  858. */
  859. if (dc) {
  860. /*
  861. * XXX: We can't do this here because it causes HDMI to go
  862. * into an erroneous state with the result that HDMI won't
  863. * properly work once disabled. See also a similar symptom
  864. * for the SOR output.
  865. */
  866. /*
  867. value = tegra_dc_readl(dc, DC_CMD_DISPLAY_POWER_CONTROL);
  868. value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
  869. PW4_ENABLE | PM0_ENABLE | PM1_ENABLE);
  870. tegra_dc_writel(dc, value, DC_CMD_DISPLAY_POWER_CONTROL);
  871. */
  872. value = tegra_dc_readl(dc, DC_CMD_DISPLAY_COMMAND);
  873. value &= ~DISP_CTRL_MODE_MASK;
  874. tegra_dc_writel(dc, value, DC_CMD_DISPLAY_COMMAND);
  875. value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
  876. value &= ~HDMI_ENABLE;
  877. tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
  878. tegra_dc_writel(dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL);
  879. tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
  880. }
  881. clk_disable_unprepare(hdmi->clk);
  882. reset_control_assert(hdmi->rst);
  883. regulator_disable(hdmi->vdd);
  884. regulator_disable(hdmi->pll);
  885. hdmi->enabled = false;
  886. return 0;
  887. }
  888. static int tegra_output_hdmi_setup_clock(struct tegra_output *output,
  889. struct clk *clk, unsigned long pclk,
  890. unsigned int *div)
  891. {
  892. struct tegra_hdmi *hdmi = to_hdmi(output);
  893. int err;
  894. err = clk_set_parent(clk, hdmi->clk_parent);
  895. if (err < 0) {
  896. dev_err(output->dev, "failed to set parent: %d\n", err);
  897. return err;
  898. }
  899. err = clk_set_rate(hdmi->clk_parent, pclk);
  900. if (err < 0)
  901. dev_err(output->dev, "failed to set clock rate to %lu Hz\n",
  902. pclk);
  903. *div = 0;
  904. return 0;
  905. }
  906. static int tegra_output_hdmi_check_mode(struct tegra_output *output,
  907. struct drm_display_mode *mode,
  908. enum drm_mode_status *status)
  909. {
  910. struct tegra_hdmi *hdmi = to_hdmi(output);
  911. unsigned long pclk = mode->clock * 1000;
  912. struct clk *parent;
  913. long err;
  914. parent = clk_get_parent(hdmi->clk_parent);
  915. err = clk_round_rate(parent, pclk * 4);
  916. if (err <= 0)
  917. *status = MODE_NOCLOCK;
  918. else
  919. *status = MODE_OK;
  920. return 0;
  921. }
  922. static const struct tegra_output_ops hdmi_ops = {
  923. .enable = tegra_output_hdmi_enable,
  924. .disable = tegra_output_hdmi_disable,
  925. .setup_clock = tegra_output_hdmi_setup_clock,
  926. .check_mode = tegra_output_hdmi_check_mode,
  927. };
  928. static int tegra_hdmi_show_regs(struct seq_file *s, void *data)
  929. {
  930. struct drm_info_node *node = s->private;
  931. struct tegra_hdmi *hdmi = node->info_ent->data;
  932. int err;
  933. err = clk_prepare_enable(hdmi->clk);
  934. if (err)
  935. return err;
  936. #define DUMP_REG(name) \
  937. seq_printf(s, "%-56s %#05x %08lx\n", #name, name, \
  938. tegra_hdmi_readl(hdmi, name))
  939. DUMP_REG(HDMI_CTXSW);
  940. DUMP_REG(HDMI_NV_PDISP_SOR_STATE0);
  941. DUMP_REG(HDMI_NV_PDISP_SOR_STATE1);
  942. DUMP_REG(HDMI_NV_PDISP_SOR_STATE2);
  943. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_MSB);
  944. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_LSB);
  945. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_MSB);
  946. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_LSB);
  947. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_MSB);
  948. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_LSB);
  949. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_MSB);
  950. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_LSB);
  951. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_MSB);
  952. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_LSB);
  953. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_MSB);
  954. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_LSB);
  955. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CTRL);
  956. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CMODE);
  957. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_MSB);
  958. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_LSB);
  959. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_MSB);
  960. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB2);
  961. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB1);
  962. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_RI);
  963. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_MSB);
  964. DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_LSB);
  965. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU0);
  966. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU_RDATA0);
  967. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU1);
  968. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU2);
  969. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
  970. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_STATUS);
  971. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER);
  972. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW);
  973. DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH);
  974. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
  975. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_STATUS);
  976. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER);
  977. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_LOW);
  978. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_HIGH);
  979. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_LOW);
  980. DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_HIGH);
  981. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
  982. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_STATUS);
  983. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_HEADER);
  984. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_LOW);
  985. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_HIGH);
  986. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_LOW);
  987. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_HIGH);
  988. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_LOW);
  989. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_HIGH);
  990. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_LOW);
  991. DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_HIGH);
  992. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_CTRL);
  993. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_LOW);
  994. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_HIGH);
  995. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
  996. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
  997. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_LOW);
  998. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_HIGH);
  999. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_LOW);
  1000. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_HIGH);
  1001. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_LOW);
  1002. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_HIGH);
  1003. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_LOW);
  1004. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_HIGH);
  1005. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_LOW);
  1006. DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_HIGH);
  1007. DUMP_REG(HDMI_NV_PDISP_HDMI_CTRL);
  1008. DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_KEEPOUT);
  1009. DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
  1010. DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_CTRL);
  1011. DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_STATUS);
  1012. DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_SUBPACK);
  1013. DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS1);
  1014. DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS2);
  1015. DUMP_REG(HDMI_NV_PDISP_HDMI_EMU0);
  1016. DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1);
  1017. DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1_RDATA);
  1018. DUMP_REG(HDMI_NV_PDISP_HDMI_SPARE);
  1019. DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS1);
  1020. DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS2);
  1021. DUMP_REG(HDMI_NV_PDISP_HDMI_HDCPRIF_ROM_CTRL);
  1022. DUMP_REG(HDMI_NV_PDISP_SOR_CAP);
  1023. DUMP_REG(HDMI_NV_PDISP_SOR_PWR);
  1024. DUMP_REG(HDMI_NV_PDISP_SOR_TEST);
  1025. DUMP_REG(HDMI_NV_PDISP_SOR_PLL0);
  1026. DUMP_REG(HDMI_NV_PDISP_SOR_PLL1);
  1027. DUMP_REG(HDMI_NV_PDISP_SOR_PLL2);
  1028. DUMP_REG(HDMI_NV_PDISP_SOR_CSTM);
  1029. DUMP_REG(HDMI_NV_PDISP_SOR_LVDS);
  1030. DUMP_REG(HDMI_NV_PDISP_SOR_CRCA);
  1031. DUMP_REG(HDMI_NV_PDISP_SOR_CRCB);
  1032. DUMP_REG(HDMI_NV_PDISP_SOR_BLANK);
  1033. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_CTL);
  1034. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(0));
  1035. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(1));
  1036. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(2));
  1037. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(3));
  1038. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(4));
  1039. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(5));
  1040. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(6));
  1041. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(7));
  1042. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(8));
  1043. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(9));
  1044. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(10));
  1045. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(11));
  1046. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(12));
  1047. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(13));
  1048. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(14));
  1049. DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST(15));
  1050. DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA0);
  1051. DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA1);
  1052. DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA0);
  1053. DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA1);
  1054. DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA0);
  1055. DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA1);
  1056. DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA0);
  1057. DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA1);
  1058. DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA0);
  1059. DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA1);
  1060. DUMP_REG(HDMI_NV_PDISP_SOR_TRIG);
  1061. DUMP_REG(HDMI_NV_PDISP_SOR_MSCHECK);
  1062. DUMP_REG(HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
  1063. DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG0);
  1064. DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG1);
  1065. DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG2);
  1066. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(0));
  1067. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(1));
  1068. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(2));
  1069. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(3));
  1070. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(4));
  1071. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(5));
  1072. DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(6));
  1073. DUMP_REG(HDMI_NV_PDISP_AUDIO_PULSE_WIDTH);
  1074. DUMP_REG(HDMI_NV_PDISP_AUDIO_THRESHOLD);
  1075. DUMP_REG(HDMI_NV_PDISP_AUDIO_CNTRL0);
  1076. DUMP_REG(HDMI_NV_PDISP_AUDIO_N);
  1077. DUMP_REG(HDMI_NV_PDISP_HDCPRIF_ROM_TIMING);
  1078. DUMP_REG(HDMI_NV_PDISP_SOR_REFCLK);
  1079. DUMP_REG(HDMI_NV_PDISP_CRC_CONTROL);
  1080. DUMP_REG(HDMI_NV_PDISP_INPUT_CONTROL);
  1081. DUMP_REG(HDMI_NV_PDISP_SCRATCH);
  1082. DUMP_REG(HDMI_NV_PDISP_PE_CURRENT);
  1083. DUMP_REG(HDMI_NV_PDISP_KEY_CTRL);
  1084. DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG0);
  1085. DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG1);
  1086. DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG2);
  1087. DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_0);
  1088. DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_1);
  1089. DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_2);
  1090. DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_3);
  1091. DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_TRIG);
  1092. DUMP_REG(HDMI_NV_PDISP_KEY_SKEY_INDEX);
  1093. DUMP_REG(HDMI_NV_PDISP_SOR_AUDIO_CNTRL0);
  1094. DUMP_REG(HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR);
  1095. DUMP_REG(HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE);
  1096. DUMP_REG(HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
  1097. #undef DUMP_REG
  1098. clk_disable_unprepare(hdmi->clk);
  1099. return 0;
  1100. }
  1101. static struct drm_info_list debugfs_files[] = {
  1102. { "regs", tegra_hdmi_show_regs, 0, NULL },
  1103. };
  1104. static int tegra_hdmi_debugfs_init(struct tegra_hdmi *hdmi,
  1105. struct drm_minor *minor)
  1106. {
  1107. unsigned int i;
  1108. int err;
  1109. hdmi->debugfs = debugfs_create_dir("hdmi", minor->debugfs_root);
  1110. if (!hdmi->debugfs)
  1111. return -ENOMEM;
  1112. hdmi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
  1113. GFP_KERNEL);
  1114. if (!hdmi->debugfs_files) {
  1115. err = -ENOMEM;
  1116. goto remove;
  1117. }
  1118. for (i = 0; i < ARRAY_SIZE(debugfs_files); i++)
  1119. hdmi->debugfs_files[i].data = hdmi;
  1120. err = drm_debugfs_create_files(hdmi->debugfs_files,
  1121. ARRAY_SIZE(debugfs_files),
  1122. hdmi->debugfs, minor);
  1123. if (err < 0)
  1124. goto free;
  1125. hdmi->minor = minor;
  1126. return 0;
  1127. free:
  1128. kfree(hdmi->debugfs_files);
  1129. hdmi->debugfs_files = NULL;
  1130. remove:
  1131. debugfs_remove(hdmi->debugfs);
  1132. hdmi->debugfs = NULL;
  1133. return err;
  1134. }
  1135. static int tegra_hdmi_debugfs_exit(struct tegra_hdmi *hdmi)
  1136. {
  1137. drm_debugfs_remove_files(hdmi->debugfs_files, ARRAY_SIZE(debugfs_files),
  1138. hdmi->minor);
  1139. hdmi->minor = NULL;
  1140. kfree(hdmi->debugfs_files);
  1141. hdmi->debugfs_files = NULL;
  1142. debugfs_remove(hdmi->debugfs);
  1143. hdmi->debugfs = NULL;
  1144. return 0;
  1145. }
  1146. static int tegra_hdmi_init(struct host1x_client *client)
  1147. {
  1148. struct drm_device *drm = dev_get_drvdata(client->parent);
  1149. struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
  1150. int err;
  1151. hdmi->output.type = TEGRA_OUTPUT_HDMI;
  1152. hdmi->output.dev = client->dev;
  1153. hdmi->output.ops = &hdmi_ops;
  1154. err = tegra_output_init(drm, &hdmi->output);
  1155. if (err < 0) {
  1156. dev_err(client->dev, "output setup failed: %d\n", err);
  1157. return err;
  1158. }
  1159. if (IS_ENABLED(CONFIG_DEBUG_FS)) {
  1160. err = tegra_hdmi_debugfs_init(hdmi, drm->primary);
  1161. if (err < 0)
  1162. dev_err(client->dev, "debugfs setup failed: %d\n", err);
  1163. }
  1164. err = regulator_enable(hdmi->hdmi);
  1165. if (err < 0) {
  1166. dev_err(client->dev, "failed to enable HDMI regulator: %d\n",
  1167. err);
  1168. return err;
  1169. }
  1170. return 0;
  1171. }
  1172. static int tegra_hdmi_exit(struct host1x_client *client)
  1173. {
  1174. struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
  1175. int err;
  1176. regulator_disable(hdmi->hdmi);
  1177. if (IS_ENABLED(CONFIG_DEBUG_FS)) {
  1178. err = tegra_hdmi_debugfs_exit(hdmi);
  1179. if (err < 0)
  1180. dev_err(client->dev, "debugfs cleanup failed: %d\n",
  1181. err);
  1182. }
  1183. err = tegra_output_disable(&hdmi->output);
  1184. if (err < 0) {
  1185. dev_err(client->dev, "output failed to disable: %d\n", err);
  1186. return err;
  1187. }
  1188. err = tegra_output_exit(&hdmi->output);
  1189. if (err < 0) {
  1190. dev_err(client->dev, "output cleanup failed: %d\n", err);
  1191. return err;
  1192. }
  1193. return 0;
  1194. }
  1195. static const struct host1x_client_ops hdmi_client_ops = {
  1196. .init = tegra_hdmi_init,
  1197. .exit = tegra_hdmi_exit,
  1198. };
  1199. static const struct tegra_hdmi_config tegra20_hdmi_config = {
  1200. .tmds = tegra20_tmds_config,
  1201. .num_tmds = ARRAY_SIZE(tegra20_tmds_config),
  1202. .fuse_override_offset = HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT,
  1203. .fuse_override_value = 1 << 31,
  1204. .has_sor_io_peak_current = false,
  1205. };
  1206. static const struct tegra_hdmi_config tegra30_hdmi_config = {
  1207. .tmds = tegra30_tmds_config,
  1208. .num_tmds = ARRAY_SIZE(tegra30_tmds_config),
  1209. .fuse_override_offset = HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT,
  1210. .fuse_override_value = 1 << 31,
  1211. .has_sor_io_peak_current = false,
  1212. };
  1213. static const struct tegra_hdmi_config tegra114_hdmi_config = {
  1214. .tmds = tegra114_tmds_config,
  1215. .num_tmds = ARRAY_SIZE(tegra114_tmds_config),
  1216. .fuse_override_offset = HDMI_NV_PDISP_SOR_PAD_CTLS0,
  1217. .fuse_override_value = 1 << 31,
  1218. .has_sor_io_peak_current = true,
  1219. };
  1220. static const struct tegra_hdmi_config tegra124_hdmi_config = {
  1221. .tmds = tegra124_tmds_config,
  1222. .num_tmds = ARRAY_SIZE(tegra124_tmds_config),
  1223. .fuse_override_offset = HDMI_NV_PDISP_SOR_PAD_CTLS0,
  1224. .fuse_override_value = 1 << 31,
  1225. .has_sor_io_peak_current = true,
  1226. };
  1227. static const struct of_device_id tegra_hdmi_of_match[] = {
  1228. { .compatible = "nvidia,tegra124-hdmi", .data = &tegra124_hdmi_config },
  1229. { .compatible = "nvidia,tegra114-hdmi", .data = &tegra114_hdmi_config },
  1230. { .compatible = "nvidia,tegra30-hdmi", .data = &tegra30_hdmi_config },
  1231. { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },
  1232. { },
  1233. };
  1234. MODULE_DEVICE_TABLE(of, tegra_hdmi_of_match);
  1235. static int tegra_hdmi_probe(struct platform_device *pdev)
  1236. {
  1237. const struct of_device_id *match;
  1238. struct tegra_hdmi *hdmi;
  1239. struct resource *regs;
  1240. int err;
  1241. match = of_match_node(tegra_hdmi_of_match, pdev->dev.of_node);
  1242. if (!match)
  1243. return -ENODEV;
  1244. hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
  1245. if (!hdmi)
  1246. return -ENOMEM;
  1247. hdmi->config = match->data;
  1248. hdmi->dev = &pdev->dev;
  1249. hdmi->audio_source = AUTO;
  1250. hdmi->audio_freq = 44100;
  1251. hdmi->stereo = false;
  1252. hdmi->dvi = false;
  1253. hdmi->clk = devm_clk_get(&pdev->dev, NULL);
  1254. if (IS_ERR(hdmi->clk)) {
  1255. dev_err(&pdev->dev, "failed to get clock\n");
  1256. return PTR_ERR(hdmi->clk);
  1257. }
  1258. hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi");
  1259. if (IS_ERR(hdmi->rst)) {
  1260. dev_err(&pdev->dev, "failed to get reset\n");
  1261. return PTR_ERR(hdmi->rst);
  1262. }
  1263. hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent");
  1264. if (IS_ERR(hdmi->clk_parent))
  1265. return PTR_ERR(hdmi->clk_parent);
  1266. err = clk_set_parent(hdmi->clk, hdmi->clk_parent);
  1267. if (err < 0) {
  1268. dev_err(&pdev->dev, "failed to setup clocks: %d\n", err);
  1269. return err;
  1270. }
  1271. hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi");
  1272. if (IS_ERR(hdmi->hdmi)) {
  1273. dev_err(&pdev->dev, "failed to get HDMI regulator\n");
  1274. return PTR_ERR(hdmi->hdmi);
  1275. }
  1276. hdmi->pll = devm_regulator_get(&pdev->dev, "pll");
  1277. if (IS_ERR(hdmi->pll)) {
  1278. dev_err(&pdev->dev, "failed to get PLL regulator\n");
  1279. return PTR_ERR(hdmi->pll);
  1280. }
  1281. hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd");
  1282. if (IS_ERR(hdmi->vdd)) {
  1283. dev_err(&pdev->dev, "failed to get VDD regulator\n");
  1284. return PTR_ERR(hdmi->vdd);
  1285. }
  1286. hdmi->output.dev = &pdev->dev;
  1287. err = tegra_output_probe(&hdmi->output);
  1288. if (err < 0)
  1289. return err;
  1290. regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1291. hdmi->regs = devm_ioremap_resource(&pdev->dev, regs);
  1292. if (IS_ERR(hdmi->regs))
  1293. return PTR_ERR(hdmi->regs);
  1294. err = platform_get_irq(pdev, 0);
  1295. if (err < 0)
  1296. return err;
  1297. hdmi->irq = err;
  1298. INIT_LIST_HEAD(&hdmi->client.list);
  1299. hdmi->client.ops = &hdmi_client_ops;
  1300. hdmi->client.dev = &pdev->dev;
  1301. err = host1x_client_register(&hdmi->client);
  1302. if (err < 0) {
  1303. dev_err(&pdev->dev, "failed to register host1x client: %d\n",
  1304. err);
  1305. return err;
  1306. }
  1307. platform_set_drvdata(pdev, hdmi);
  1308. return 0;
  1309. }
  1310. static int tegra_hdmi_remove(struct platform_device *pdev)
  1311. {
  1312. struct tegra_hdmi *hdmi = platform_get_drvdata(pdev);
  1313. int err;
  1314. err = host1x_client_unregister(&hdmi->client);
  1315. if (err < 0) {
  1316. dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
  1317. err);
  1318. return err;
  1319. }
  1320. err = tegra_output_remove(&hdmi->output);
  1321. if (err < 0) {
  1322. dev_err(&pdev->dev, "failed to remove output: %d\n", err);
  1323. return err;
  1324. }
  1325. clk_disable_unprepare(hdmi->clk_parent);
  1326. clk_disable_unprepare(hdmi->clk);
  1327. return 0;
  1328. }
  1329. struct platform_driver tegra_hdmi_driver = {
  1330. .driver = {
  1331. .name = "tegra-hdmi",
  1332. .owner = THIS_MODULE,
  1333. .of_match_table = tegra_hdmi_of_match,
  1334. },
  1335. .probe = tegra_hdmi_probe,
  1336. .remove = tegra_hdmi_remove,
  1337. };