hdmi.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581
  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. static int tegra_hdmi_probe(struct platform_device *pdev)
  1235. {
  1236. const struct of_device_id *match;
  1237. struct tegra_hdmi *hdmi;
  1238. struct resource *regs;
  1239. int err;
  1240. match = of_match_node(tegra_hdmi_of_match, pdev->dev.of_node);
  1241. if (!match)
  1242. return -ENODEV;
  1243. hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
  1244. if (!hdmi)
  1245. return -ENOMEM;
  1246. hdmi->config = match->data;
  1247. hdmi->dev = &pdev->dev;
  1248. hdmi->audio_source = AUTO;
  1249. hdmi->audio_freq = 44100;
  1250. hdmi->stereo = false;
  1251. hdmi->dvi = false;
  1252. hdmi->clk = devm_clk_get(&pdev->dev, NULL);
  1253. if (IS_ERR(hdmi->clk)) {
  1254. dev_err(&pdev->dev, "failed to get clock\n");
  1255. return PTR_ERR(hdmi->clk);
  1256. }
  1257. hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi");
  1258. if (IS_ERR(hdmi->rst)) {
  1259. dev_err(&pdev->dev, "failed to get reset\n");
  1260. return PTR_ERR(hdmi->rst);
  1261. }
  1262. hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent");
  1263. if (IS_ERR(hdmi->clk_parent))
  1264. return PTR_ERR(hdmi->clk_parent);
  1265. err = clk_set_parent(hdmi->clk, hdmi->clk_parent);
  1266. if (err < 0) {
  1267. dev_err(&pdev->dev, "failed to setup clocks: %d\n", err);
  1268. return err;
  1269. }
  1270. hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi");
  1271. if (IS_ERR(hdmi->hdmi)) {
  1272. dev_err(&pdev->dev, "failed to get HDMI regulator\n");
  1273. return PTR_ERR(hdmi->hdmi);
  1274. }
  1275. hdmi->pll = devm_regulator_get(&pdev->dev, "pll");
  1276. if (IS_ERR(hdmi->pll)) {
  1277. dev_err(&pdev->dev, "failed to get PLL regulator\n");
  1278. return PTR_ERR(hdmi->pll);
  1279. }
  1280. hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd");
  1281. if (IS_ERR(hdmi->vdd)) {
  1282. dev_err(&pdev->dev, "failed to get VDD regulator\n");
  1283. return PTR_ERR(hdmi->vdd);
  1284. }
  1285. hdmi->output.dev = &pdev->dev;
  1286. err = tegra_output_probe(&hdmi->output);
  1287. if (err < 0)
  1288. return err;
  1289. regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1290. hdmi->regs = devm_ioremap_resource(&pdev->dev, regs);
  1291. if (IS_ERR(hdmi->regs))
  1292. return PTR_ERR(hdmi->regs);
  1293. err = platform_get_irq(pdev, 0);
  1294. if (err < 0)
  1295. return err;
  1296. hdmi->irq = err;
  1297. INIT_LIST_HEAD(&hdmi->client.list);
  1298. hdmi->client.ops = &hdmi_client_ops;
  1299. hdmi->client.dev = &pdev->dev;
  1300. err = host1x_client_register(&hdmi->client);
  1301. if (err < 0) {
  1302. dev_err(&pdev->dev, "failed to register host1x client: %d\n",
  1303. err);
  1304. return err;
  1305. }
  1306. platform_set_drvdata(pdev, hdmi);
  1307. return 0;
  1308. }
  1309. static int tegra_hdmi_remove(struct platform_device *pdev)
  1310. {
  1311. struct tegra_hdmi *hdmi = platform_get_drvdata(pdev);
  1312. int err;
  1313. err = host1x_client_unregister(&hdmi->client);
  1314. if (err < 0) {
  1315. dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
  1316. err);
  1317. return err;
  1318. }
  1319. err = tegra_output_remove(&hdmi->output);
  1320. if (err < 0) {
  1321. dev_err(&pdev->dev, "failed to remove output: %d\n", err);
  1322. return err;
  1323. }
  1324. clk_disable_unprepare(hdmi->clk_parent);
  1325. clk_disable_unprepare(hdmi->clk);
  1326. return 0;
  1327. }
  1328. struct platform_driver tegra_hdmi_driver = {
  1329. .driver = {
  1330. .name = "tegra-hdmi",
  1331. .owner = THIS_MODULE,
  1332. .of_match_table = tegra_hdmi_of_match,
  1333. },
  1334. .probe = tegra_hdmi_probe,
  1335. .remove = tegra_hdmi_remove,
  1336. };