dw_hdmi.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711
  1. /*
  2. * Copyright (C) 2011-2013 Freescale Semiconductor, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * Designware High-Definition Multimedia Interface (HDMI) driver
  10. *
  11. * Copyright (C) 2010, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  12. */
  13. #include <linux/module.h>
  14. #include <linux/irq.h>
  15. #include <linux/delay.h>
  16. #include <linux/err.h>
  17. #include <linux/clk.h>
  18. #include <linux/hdmi.h>
  19. #include <linux/mutex.h>
  20. #include <linux/of_device.h>
  21. #include <drm/drm_of.h>
  22. #include <drm/drmP.h>
  23. #include <drm/drm_crtc_helper.h>
  24. #include <drm/drm_edid.h>
  25. #include <drm/drm_encoder_slave.h>
  26. #include <drm/bridge/dw_hdmi.h>
  27. #include "dw_hdmi.h"
  28. #define HDMI_EDID_LEN 512
  29. #define RGB 0
  30. #define YCBCR444 1
  31. #define YCBCR422_16BITS 2
  32. #define YCBCR422_8BITS 3
  33. #define XVYCC444 4
  34. enum hdmi_datamap {
  35. RGB444_8B = 0x01,
  36. RGB444_10B = 0x03,
  37. RGB444_12B = 0x05,
  38. RGB444_16B = 0x07,
  39. YCbCr444_8B = 0x09,
  40. YCbCr444_10B = 0x0B,
  41. YCbCr444_12B = 0x0D,
  42. YCbCr444_16B = 0x0F,
  43. YCbCr422_8B = 0x16,
  44. YCbCr422_10B = 0x14,
  45. YCbCr422_12B = 0x12,
  46. };
  47. static const u16 csc_coeff_default[3][4] = {
  48. { 0x2000, 0x0000, 0x0000, 0x0000 },
  49. { 0x0000, 0x2000, 0x0000, 0x0000 },
  50. { 0x0000, 0x0000, 0x2000, 0x0000 }
  51. };
  52. static const u16 csc_coeff_rgb_out_eitu601[3][4] = {
  53. { 0x2000, 0x6926, 0x74fd, 0x010e },
  54. { 0x2000, 0x2cdd, 0x0000, 0x7e9a },
  55. { 0x2000, 0x0000, 0x38b4, 0x7e3b }
  56. };
  57. static const u16 csc_coeff_rgb_out_eitu709[3][4] = {
  58. { 0x2000, 0x7106, 0x7a02, 0x00a7 },
  59. { 0x2000, 0x3264, 0x0000, 0x7e6d },
  60. { 0x2000, 0x0000, 0x3b61, 0x7e25 }
  61. };
  62. static const u16 csc_coeff_rgb_in_eitu601[3][4] = {
  63. { 0x2591, 0x1322, 0x074b, 0x0000 },
  64. { 0x6535, 0x2000, 0x7acc, 0x0200 },
  65. { 0x6acd, 0x7534, 0x2000, 0x0200 }
  66. };
  67. static const u16 csc_coeff_rgb_in_eitu709[3][4] = {
  68. { 0x2dc5, 0x0d9b, 0x049e, 0x0000 },
  69. { 0x62f0, 0x2000, 0x7d11, 0x0200 },
  70. { 0x6756, 0x78ab, 0x2000, 0x0200 }
  71. };
  72. struct hdmi_vmode {
  73. bool mdvi;
  74. bool mhsyncpolarity;
  75. bool mvsyncpolarity;
  76. bool minterlaced;
  77. bool mdataenablepolarity;
  78. unsigned int mpixelclock;
  79. unsigned int mpixelrepetitioninput;
  80. unsigned int mpixelrepetitionoutput;
  81. };
  82. struct hdmi_data_info {
  83. unsigned int enc_in_format;
  84. unsigned int enc_out_format;
  85. unsigned int enc_color_depth;
  86. unsigned int colorimetry;
  87. unsigned int pix_repet_factor;
  88. unsigned int hdcp_enable;
  89. struct hdmi_vmode video_mode;
  90. };
  91. struct dw_hdmi {
  92. struct drm_connector connector;
  93. struct drm_encoder *encoder;
  94. struct drm_bridge *bridge;
  95. enum dw_hdmi_devtype dev_type;
  96. struct device *dev;
  97. struct clk *isfr_clk;
  98. struct clk *iahb_clk;
  99. struct hdmi_data_info hdmi_data;
  100. const struct dw_hdmi_plat_data *plat_data;
  101. int vic;
  102. u8 edid[HDMI_EDID_LEN];
  103. bool cable_plugin;
  104. bool phy_enabled;
  105. struct drm_display_mode previous_mode;
  106. struct regmap *regmap;
  107. struct i2c_adapter *ddc;
  108. void __iomem *regs;
  109. struct mutex audio_mutex;
  110. unsigned int sample_rate;
  111. int ratio;
  112. void (*write)(struct dw_hdmi *hdmi, u8 val, int offset);
  113. u8 (*read)(struct dw_hdmi *hdmi, int offset);
  114. };
  115. static void dw_hdmi_writel(struct dw_hdmi *hdmi, u8 val, int offset)
  116. {
  117. writel(val, hdmi->regs + (offset << 2));
  118. }
  119. static u8 dw_hdmi_readl(struct dw_hdmi *hdmi, int offset)
  120. {
  121. return readl(hdmi->regs + (offset << 2));
  122. }
  123. static void dw_hdmi_writeb(struct dw_hdmi *hdmi, u8 val, int offset)
  124. {
  125. writeb(val, hdmi->regs + offset);
  126. }
  127. static u8 dw_hdmi_readb(struct dw_hdmi *hdmi, int offset)
  128. {
  129. return readb(hdmi->regs + offset);
  130. }
  131. static inline void hdmi_writeb(struct dw_hdmi *hdmi, u8 val, int offset)
  132. {
  133. hdmi->write(hdmi, val, offset);
  134. }
  135. static inline u8 hdmi_readb(struct dw_hdmi *hdmi, int offset)
  136. {
  137. return hdmi->read(hdmi, offset);
  138. }
  139. static void hdmi_modb(struct dw_hdmi *hdmi, u8 data, u8 mask, unsigned reg)
  140. {
  141. u8 val = hdmi_readb(hdmi, reg) & ~mask;
  142. val |= data & mask;
  143. hdmi_writeb(hdmi, val, reg);
  144. }
  145. static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 data, unsigned int reg,
  146. u8 shift, u8 mask)
  147. {
  148. hdmi_modb(hdmi, data << shift, mask, reg);
  149. }
  150. static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts,
  151. unsigned int n)
  152. {
  153. /* Must be set/cleared first */
  154. hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
  155. /* nshift factor = 0 */
  156. hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
  157. hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
  158. HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
  159. hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
  160. hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);
  161. hdmi_writeb(hdmi, (n >> 16) & 0x0f, HDMI_AUD_N3);
  162. hdmi_writeb(hdmi, (n >> 8) & 0xff, HDMI_AUD_N2);
  163. hdmi_writeb(hdmi, n & 0xff, HDMI_AUD_N1);
  164. }
  165. static unsigned int hdmi_compute_n(unsigned int freq, unsigned long pixel_clk,
  166. unsigned int ratio)
  167. {
  168. unsigned int n = (128 * freq) / 1000;
  169. switch (freq) {
  170. case 32000:
  171. if (pixel_clk == 25170000)
  172. n = (ratio == 150) ? 9152 : 4576;
  173. else if (pixel_clk == 27020000)
  174. n = (ratio == 150) ? 8192 : 4096;
  175. else if (pixel_clk == 74170000 || pixel_clk == 148350000)
  176. n = 11648;
  177. else
  178. n = 4096;
  179. break;
  180. case 44100:
  181. if (pixel_clk == 25170000)
  182. n = 7007;
  183. else if (pixel_clk == 74170000)
  184. n = 17836;
  185. else if (pixel_clk == 148350000)
  186. n = (ratio == 150) ? 17836 : 8918;
  187. else
  188. n = 6272;
  189. break;
  190. case 48000:
  191. if (pixel_clk == 25170000)
  192. n = (ratio == 150) ? 9152 : 6864;
  193. else if (pixel_clk == 27020000)
  194. n = (ratio == 150) ? 8192 : 6144;
  195. else if (pixel_clk == 74170000)
  196. n = 11648;
  197. else if (pixel_clk == 148350000)
  198. n = (ratio == 150) ? 11648 : 5824;
  199. else
  200. n = 6144;
  201. break;
  202. case 88200:
  203. n = hdmi_compute_n(44100, pixel_clk, ratio) * 2;
  204. break;
  205. case 96000:
  206. n = hdmi_compute_n(48000, pixel_clk, ratio) * 2;
  207. break;
  208. case 176400:
  209. n = hdmi_compute_n(44100, pixel_clk, ratio) * 4;
  210. break;
  211. case 192000:
  212. n = hdmi_compute_n(48000, pixel_clk, ratio) * 4;
  213. break;
  214. default:
  215. break;
  216. }
  217. return n;
  218. }
  219. static unsigned int hdmi_compute_cts(unsigned int freq, unsigned long pixel_clk,
  220. unsigned int ratio)
  221. {
  222. unsigned int cts = 0;
  223. pr_debug("%s: freq: %d pixel_clk: %ld ratio: %d\n", __func__, freq,
  224. pixel_clk, ratio);
  225. switch (freq) {
  226. case 32000:
  227. if (pixel_clk == 297000000) {
  228. cts = 222750;
  229. break;
  230. }
  231. case 48000:
  232. case 96000:
  233. case 192000:
  234. switch (pixel_clk) {
  235. case 25200000:
  236. case 27000000:
  237. case 54000000:
  238. case 74250000:
  239. case 148500000:
  240. cts = pixel_clk / 1000;
  241. break;
  242. case 297000000:
  243. cts = 247500;
  244. break;
  245. /*
  246. * All other TMDS clocks are not supported by
  247. * DWC_hdmi_tx. The TMDS clocks divided or
  248. * multiplied by 1,001 coefficients are not
  249. * supported.
  250. */
  251. default:
  252. break;
  253. }
  254. break;
  255. case 44100:
  256. case 88200:
  257. case 176400:
  258. switch (pixel_clk) {
  259. case 25200000:
  260. cts = 28000;
  261. break;
  262. case 27000000:
  263. cts = 30000;
  264. break;
  265. case 54000000:
  266. cts = 60000;
  267. break;
  268. case 74250000:
  269. cts = 82500;
  270. break;
  271. case 148500000:
  272. cts = 165000;
  273. break;
  274. case 297000000:
  275. cts = 247500;
  276. break;
  277. default:
  278. break;
  279. }
  280. break;
  281. default:
  282. break;
  283. }
  284. if (ratio == 100)
  285. return cts;
  286. return (cts * ratio) / 100;
  287. }
  288. static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
  289. unsigned long pixel_clk)
  290. {
  291. unsigned int clk_n, clk_cts;
  292. clk_n = hdmi_compute_n(hdmi->sample_rate, pixel_clk,
  293. hdmi->ratio);
  294. clk_cts = hdmi_compute_cts(hdmi->sample_rate, pixel_clk,
  295. hdmi->ratio);
  296. if (!clk_cts) {
  297. dev_dbg(hdmi->dev, "%s: pixel clock not supported: %lu\n",
  298. __func__, pixel_clk);
  299. return;
  300. }
  301. dev_dbg(hdmi->dev, "%s: samplerate=%d ratio=%d pixelclk=%lu N=%d cts=%d\n",
  302. __func__, hdmi->sample_rate, hdmi->ratio,
  303. pixel_clk, clk_n, clk_cts);
  304. hdmi_set_cts_n(hdmi, clk_cts, clk_n);
  305. }
  306. static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi)
  307. {
  308. mutex_lock(&hdmi->audio_mutex);
  309. hdmi_set_clk_regenerator(hdmi, 74250000);
  310. mutex_unlock(&hdmi->audio_mutex);
  311. }
  312. static void hdmi_clk_regenerator_update_pixel_clock(struct dw_hdmi *hdmi)
  313. {
  314. mutex_lock(&hdmi->audio_mutex);
  315. hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock);
  316. mutex_unlock(&hdmi->audio_mutex);
  317. }
  318. /*
  319. * this submodule is responsible for the video data synchronization.
  320. * for example, for RGB 4:4:4 input, the data map is defined as
  321. * pin{47~40} <==> R[7:0]
  322. * pin{31~24} <==> G[7:0]
  323. * pin{15~8} <==> B[7:0]
  324. */
  325. static void hdmi_video_sample(struct dw_hdmi *hdmi)
  326. {
  327. int color_format = 0;
  328. u8 val;
  329. if (hdmi->hdmi_data.enc_in_format == RGB) {
  330. if (hdmi->hdmi_data.enc_color_depth == 8)
  331. color_format = 0x01;
  332. else if (hdmi->hdmi_data.enc_color_depth == 10)
  333. color_format = 0x03;
  334. else if (hdmi->hdmi_data.enc_color_depth == 12)
  335. color_format = 0x05;
  336. else if (hdmi->hdmi_data.enc_color_depth == 16)
  337. color_format = 0x07;
  338. else
  339. return;
  340. } else if (hdmi->hdmi_data.enc_in_format == YCBCR444) {
  341. if (hdmi->hdmi_data.enc_color_depth == 8)
  342. color_format = 0x09;
  343. else if (hdmi->hdmi_data.enc_color_depth == 10)
  344. color_format = 0x0B;
  345. else if (hdmi->hdmi_data.enc_color_depth == 12)
  346. color_format = 0x0D;
  347. else if (hdmi->hdmi_data.enc_color_depth == 16)
  348. color_format = 0x0F;
  349. else
  350. return;
  351. } else if (hdmi->hdmi_data.enc_in_format == YCBCR422_8BITS) {
  352. if (hdmi->hdmi_data.enc_color_depth == 8)
  353. color_format = 0x16;
  354. else if (hdmi->hdmi_data.enc_color_depth == 10)
  355. color_format = 0x14;
  356. else if (hdmi->hdmi_data.enc_color_depth == 12)
  357. color_format = 0x12;
  358. else
  359. return;
  360. }
  361. val = HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE |
  362. ((color_format << HDMI_TX_INVID0_VIDEO_MAPPING_OFFSET) &
  363. HDMI_TX_INVID0_VIDEO_MAPPING_MASK);
  364. hdmi_writeb(hdmi, val, HDMI_TX_INVID0);
  365. /* Enable TX stuffing: When DE is inactive, fix the output data to 0 */
  366. val = HDMI_TX_INSTUFFING_BDBDATA_STUFFING_ENABLE |
  367. HDMI_TX_INSTUFFING_RCRDATA_STUFFING_ENABLE |
  368. HDMI_TX_INSTUFFING_GYDATA_STUFFING_ENABLE;
  369. hdmi_writeb(hdmi, val, HDMI_TX_INSTUFFING);
  370. hdmi_writeb(hdmi, 0x0, HDMI_TX_GYDATA0);
  371. hdmi_writeb(hdmi, 0x0, HDMI_TX_GYDATA1);
  372. hdmi_writeb(hdmi, 0x0, HDMI_TX_RCRDATA0);
  373. hdmi_writeb(hdmi, 0x0, HDMI_TX_RCRDATA1);
  374. hdmi_writeb(hdmi, 0x0, HDMI_TX_BCBDATA0);
  375. hdmi_writeb(hdmi, 0x0, HDMI_TX_BCBDATA1);
  376. }
  377. static int is_color_space_conversion(struct dw_hdmi *hdmi)
  378. {
  379. return hdmi->hdmi_data.enc_in_format != hdmi->hdmi_data.enc_out_format;
  380. }
  381. static int is_color_space_decimation(struct dw_hdmi *hdmi)
  382. {
  383. if (hdmi->hdmi_data.enc_out_format != YCBCR422_8BITS)
  384. return 0;
  385. if (hdmi->hdmi_data.enc_in_format == RGB ||
  386. hdmi->hdmi_data.enc_in_format == YCBCR444)
  387. return 1;
  388. return 0;
  389. }
  390. static int is_color_space_interpolation(struct dw_hdmi *hdmi)
  391. {
  392. if (hdmi->hdmi_data.enc_in_format != YCBCR422_8BITS)
  393. return 0;
  394. if (hdmi->hdmi_data.enc_out_format == RGB ||
  395. hdmi->hdmi_data.enc_out_format == YCBCR444)
  396. return 1;
  397. return 0;
  398. }
  399. static void dw_hdmi_update_csc_coeffs(struct dw_hdmi *hdmi)
  400. {
  401. const u16 (*csc_coeff)[3][4] = &csc_coeff_default;
  402. unsigned i;
  403. u32 csc_scale = 1;
  404. if (is_color_space_conversion(hdmi)) {
  405. if (hdmi->hdmi_data.enc_out_format == RGB) {
  406. if (hdmi->hdmi_data.colorimetry ==
  407. HDMI_COLORIMETRY_ITU_601)
  408. csc_coeff = &csc_coeff_rgb_out_eitu601;
  409. else
  410. csc_coeff = &csc_coeff_rgb_out_eitu709;
  411. } else if (hdmi->hdmi_data.enc_in_format == RGB) {
  412. if (hdmi->hdmi_data.colorimetry ==
  413. HDMI_COLORIMETRY_ITU_601)
  414. csc_coeff = &csc_coeff_rgb_in_eitu601;
  415. else
  416. csc_coeff = &csc_coeff_rgb_in_eitu709;
  417. csc_scale = 0;
  418. }
  419. }
  420. /* The CSC registers are sequential, alternating MSB then LSB */
  421. for (i = 0; i < ARRAY_SIZE(csc_coeff_default[0]); i++) {
  422. u16 coeff_a = (*csc_coeff)[0][i];
  423. u16 coeff_b = (*csc_coeff)[1][i];
  424. u16 coeff_c = (*csc_coeff)[2][i];
  425. hdmi_writeb(hdmi, coeff_a & 0xff, HDMI_CSC_COEF_A1_LSB + i * 2);
  426. hdmi_writeb(hdmi, coeff_a >> 8, HDMI_CSC_COEF_A1_MSB + i * 2);
  427. hdmi_writeb(hdmi, coeff_b & 0xff, HDMI_CSC_COEF_B1_LSB + i * 2);
  428. hdmi_writeb(hdmi, coeff_b >> 8, HDMI_CSC_COEF_B1_MSB + i * 2);
  429. hdmi_writeb(hdmi, coeff_c & 0xff, HDMI_CSC_COEF_C1_LSB + i * 2);
  430. hdmi_writeb(hdmi, coeff_c >> 8, HDMI_CSC_COEF_C1_MSB + i * 2);
  431. }
  432. hdmi_modb(hdmi, csc_scale, HDMI_CSC_SCALE_CSCSCALE_MASK,
  433. HDMI_CSC_SCALE);
  434. }
  435. static void hdmi_video_csc(struct dw_hdmi *hdmi)
  436. {
  437. int color_depth = 0;
  438. int interpolation = HDMI_CSC_CFG_INTMODE_DISABLE;
  439. int decimation = 0;
  440. /* YCC422 interpolation to 444 mode */
  441. if (is_color_space_interpolation(hdmi))
  442. interpolation = HDMI_CSC_CFG_INTMODE_CHROMA_INT_FORMULA1;
  443. else if (is_color_space_decimation(hdmi))
  444. decimation = HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA3;
  445. if (hdmi->hdmi_data.enc_color_depth == 8)
  446. color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP;
  447. else if (hdmi->hdmi_data.enc_color_depth == 10)
  448. color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_30BPP;
  449. else if (hdmi->hdmi_data.enc_color_depth == 12)
  450. color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_36BPP;
  451. else if (hdmi->hdmi_data.enc_color_depth == 16)
  452. color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_48BPP;
  453. else
  454. return;
  455. /* Configure the CSC registers */
  456. hdmi_writeb(hdmi, interpolation | decimation, HDMI_CSC_CFG);
  457. hdmi_modb(hdmi, color_depth, HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK,
  458. HDMI_CSC_SCALE);
  459. dw_hdmi_update_csc_coeffs(hdmi);
  460. }
  461. /*
  462. * HDMI video packetizer is used to packetize the data.
  463. * for example, if input is YCC422 mode or repeater is used,
  464. * data should be repacked this module can be bypassed.
  465. */
  466. static void hdmi_video_packetize(struct dw_hdmi *hdmi)
  467. {
  468. unsigned int color_depth = 0;
  469. unsigned int remap_size = HDMI_VP_REMAP_YCC422_16bit;
  470. unsigned int output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_PP;
  471. struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
  472. u8 val, vp_conf;
  473. if (hdmi_data->enc_out_format == RGB ||
  474. hdmi_data->enc_out_format == YCBCR444) {
  475. if (!hdmi_data->enc_color_depth) {
  476. output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
  477. } else if (hdmi_data->enc_color_depth == 8) {
  478. color_depth = 4;
  479. output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
  480. } else if (hdmi_data->enc_color_depth == 10) {
  481. color_depth = 5;
  482. } else if (hdmi_data->enc_color_depth == 12) {
  483. color_depth = 6;
  484. } else if (hdmi_data->enc_color_depth == 16) {
  485. color_depth = 7;
  486. } else {
  487. return;
  488. }
  489. } else if (hdmi_data->enc_out_format == YCBCR422_8BITS) {
  490. if (!hdmi_data->enc_color_depth ||
  491. hdmi_data->enc_color_depth == 8)
  492. remap_size = HDMI_VP_REMAP_YCC422_16bit;
  493. else if (hdmi_data->enc_color_depth == 10)
  494. remap_size = HDMI_VP_REMAP_YCC422_20bit;
  495. else if (hdmi_data->enc_color_depth == 12)
  496. remap_size = HDMI_VP_REMAP_YCC422_24bit;
  497. else
  498. return;
  499. output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422;
  500. } else {
  501. return;
  502. }
  503. /* set the packetizer registers */
  504. val = ((color_depth << HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET) &
  505. HDMI_VP_PR_CD_COLOR_DEPTH_MASK) |
  506. ((hdmi_data->pix_repet_factor <<
  507. HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET) &
  508. HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK);
  509. hdmi_writeb(hdmi, val, HDMI_VP_PR_CD);
  510. hdmi_modb(hdmi, HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE,
  511. HDMI_VP_STUFF_PR_STUFFING_MASK, HDMI_VP_STUFF);
  512. /* Data from pixel repeater block */
  513. if (hdmi_data->pix_repet_factor > 1) {
  514. vp_conf = HDMI_VP_CONF_PR_EN_ENABLE |
  515. HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER;
  516. } else { /* data from packetizer block */
  517. vp_conf = HDMI_VP_CONF_PR_EN_DISABLE |
  518. HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER;
  519. }
  520. hdmi_modb(hdmi, vp_conf,
  521. HDMI_VP_CONF_PR_EN_MASK |
  522. HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
  523. hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
  524. HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
  525. hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP);
  526. if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
  527. vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
  528. HDMI_VP_CONF_PP_EN_ENABLE |
  529. HDMI_VP_CONF_YCC422_EN_DISABLE;
  530. } else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422) {
  531. vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
  532. HDMI_VP_CONF_PP_EN_DISABLE |
  533. HDMI_VP_CONF_YCC422_EN_ENABLE;
  534. } else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS) {
  535. vp_conf = HDMI_VP_CONF_BYPASS_EN_ENABLE |
  536. HDMI_VP_CONF_PP_EN_DISABLE |
  537. HDMI_VP_CONF_YCC422_EN_DISABLE;
  538. } else {
  539. return;
  540. }
  541. hdmi_modb(hdmi, vp_conf,
  542. HDMI_VP_CONF_BYPASS_EN_MASK | HDMI_VP_CONF_PP_EN_ENMASK |
  543. HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);
  544. hdmi_modb(hdmi, HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
  545. HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE,
  546. HDMI_VP_STUFF_PP_STUFFING_MASK |
  547. HDMI_VP_STUFF_YCC422_STUFFING_MASK, HDMI_VP_STUFF);
  548. hdmi_modb(hdmi, output_select, HDMI_VP_CONF_OUTPUT_SELECTOR_MASK,
  549. HDMI_VP_CONF);
  550. }
  551. static inline void hdmi_phy_test_clear(struct dw_hdmi *hdmi,
  552. unsigned char bit)
  553. {
  554. hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLR_OFFSET,
  555. HDMI_PHY_TST0_TSTCLR_MASK, HDMI_PHY_TST0);
  556. }
  557. static inline void hdmi_phy_test_enable(struct dw_hdmi *hdmi,
  558. unsigned char bit)
  559. {
  560. hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTEN_OFFSET,
  561. HDMI_PHY_TST0_TSTEN_MASK, HDMI_PHY_TST0);
  562. }
  563. static inline void hdmi_phy_test_clock(struct dw_hdmi *hdmi,
  564. unsigned char bit)
  565. {
  566. hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLK_OFFSET,
  567. HDMI_PHY_TST0_TSTCLK_MASK, HDMI_PHY_TST0);
  568. }
  569. static inline void hdmi_phy_test_din(struct dw_hdmi *hdmi,
  570. unsigned char bit)
  571. {
  572. hdmi_writeb(hdmi, bit, HDMI_PHY_TST1);
  573. }
  574. static inline void hdmi_phy_test_dout(struct dw_hdmi *hdmi,
  575. unsigned char bit)
  576. {
  577. hdmi_writeb(hdmi, bit, HDMI_PHY_TST2);
  578. }
  579. static bool hdmi_phy_wait_i2c_done(struct dw_hdmi *hdmi, int msec)
  580. {
  581. u32 val;
  582. while ((val = hdmi_readb(hdmi, HDMI_IH_I2CMPHY_STAT0) & 0x3) == 0) {
  583. if (msec-- == 0)
  584. return false;
  585. udelay(1000);
  586. }
  587. hdmi_writeb(hdmi, val, HDMI_IH_I2CMPHY_STAT0);
  588. return true;
  589. }
  590. static void __hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
  591. unsigned char addr)
  592. {
  593. hdmi_writeb(hdmi, 0xFF, HDMI_IH_I2CMPHY_STAT0);
  594. hdmi_writeb(hdmi, addr, HDMI_PHY_I2CM_ADDRESS_ADDR);
  595. hdmi_writeb(hdmi, (unsigned char)(data >> 8),
  596. HDMI_PHY_I2CM_DATAO_1_ADDR);
  597. hdmi_writeb(hdmi, (unsigned char)(data >> 0),
  598. HDMI_PHY_I2CM_DATAO_0_ADDR);
  599. hdmi_writeb(hdmi, HDMI_PHY_I2CM_OPERATION_ADDR_WRITE,
  600. HDMI_PHY_I2CM_OPERATION_ADDR);
  601. hdmi_phy_wait_i2c_done(hdmi, 1000);
  602. }
  603. static int hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
  604. unsigned char addr)
  605. {
  606. __hdmi_phy_i2c_write(hdmi, data, addr);
  607. return 0;
  608. }
  609. static void dw_hdmi_phy_enable_power(struct dw_hdmi *hdmi, u8 enable)
  610. {
  611. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  612. HDMI_PHY_CONF0_PDZ_OFFSET,
  613. HDMI_PHY_CONF0_PDZ_MASK);
  614. }
  615. static void dw_hdmi_phy_enable_tmds(struct dw_hdmi *hdmi, u8 enable)
  616. {
  617. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  618. HDMI_PHY_CONF0_ENTMDS_OFFSET,
  619. HDMI_PHY_CONF0_ENTMDS_MASK);
  620. }
  621. static void dw_hdmi_phy_enable_spare(struct dw_hdmi *hdmi, u8 enable)
  622. {
  623. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  624. HDMI_PHY_CONF0_SPARECTRL_OFFSET,
  625. HDMI_PHY_CONF0_SPARECTRL_MASK);
  626. }
  627. static void dw_hdmi_phy_gen2_pddq(struct dw_hdmi *hdmi, u8 enable)
  628. {
  629. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  630. HDMI_PHY_CONF0_GEN2_PDDQ_OFFSET,
  631. HDMI_PHY_CONF0_GEN2_PDDQ_MASK);
  632. }
  633. static void dw_hdmi_phy_gen2_txpwron(struct dw_hdmi *hdmi, u8 enable)
  634. {
  635. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  636. HDMI_PHY_CONF0_GEN2_TXPWRON_OFFSET,
  637. HDMI_PHY_CONF0_GEN2_TXPWRON_MASK);
  638. }
  639. static void dw_hdmi_phy_sel_data_en_pol(struct dw_hdmi *hdmi, u8 enable)
  640. {
  641. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  642. HDMI_PHY_CONF0_SELDATAENPOL_OFFSET,
  643. HDMI_PHY_CONF0_SELDATAENPOL_MASK);
  644. }
  645. static void dw_hdmi_phy_sel_interface_control(struct dw_hdmi *hdmi, u8 enable)
  646. {
  647. hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
  648. HDMI_PHY_CONF0_SELDIPIF_OFFSET,
  649. HDMI_PHY_CONF0_SELDIPIF_MASK);
  650. }
  651. static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep,
  652. unsigned char res, int cscon)
  653. {
  654. unsigned res_idx, i;
  655. u8 val, msec;
  656. const struct dw_hdmi_plat_data *plat_data = hdmi->plat_data;
  657. const struct dw_hdmi_mpll_config *mpll_config = plat_data->mpll_cfg;
  658. const struct dw_hdmi_curr_ctrl *curr_ctrl = plat_data->cur_ctr;
  659. const struct dw_hdmi_phy_config *phy_config = plat_data->phy_config;
  660. if (prep)
  661. return -EINVAL;
  662. switch (res) {
  663. case 0: /* color resolution 0 is 8 bit colour depth */
  664. case 8:
  665. res_idx = DW_HDMI_RES_8;
  666. break;
  667. case 10:
  668. res_idx = DW_HDMI_RES_10;
  669. break;
  670. case 12:
  671. res_idx = DW_HDMI_RES_12;
  672. break;
  673. default:
  674. return -EINVAL;
  675. }
  676. /* Enable csc path */
  677. if (cscon)
  678. val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH;
  679. else
  680. val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS;
  681. hdmi_writeb(hdmi, val, HDMI_MC_FLOWCTRL);
  682. /* gen2 tx power off */
  683. dw_hdmi_phy_gen2_txpwron(hdmi, 0);
  684. /* gen2 pddq */
  685. dw_hdmi_phy_gen2_pddq(hdmi, 1);
  686. /* PHY reset */
  687. hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_DEASSERT, HDMI_MC_PHYRSTZ);
  688. hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_ASSERT, HDMI_MC_PHYRSTZ);
  689. hdmi_writeb(hdmi, HDMI_MC_HEACPHY_RST_ASSERT, HDMI_MC_HEACPHY_RST);
  690. hdmi_phy_test_clear(hdmi, 1);
  691. hdmi_writeb(hdmi, HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2,
  692. HDMI_PHY_I2CM_SLAVE_ADDR);
  693. hdmi_phy_test_clear(hdmi, 0);
  694. /* PLL/MPLL Cfg - always match on final entry */
  695. for (i = 0; mpll_config[i].mpixelclock != (~0UL); i++)
  696. if (hdmi->hdmi_data.video_mode.mpixelclock <=
  697. mpll_config[i].mpixelclock)
  698. break;
  699. hdmi_phy_i2c_write(hdmi, mpll_config[i].res[res_idx].cpce, 0x06);
  700. hdmi_phy_i2c_write(hdmi, mpll_config[i].res[res_idx].gmp, 0x15);
  701. for (i = 0; curr_ctrl[i].mpixelclock != (~0UL); i++)
  702. if (hdmi->hdmi_data.video_mode.mpixelclock <=
  703. curr_ctrl[i].mpixelclock)
  704. break;
  705. if (curr_ctrl[i].mpixelclock == (~0UL)) {
  706. dev_err(hdmi->dev, "Pixel clock %d - unsupported by HDMI\n",
  707. hdmi->hdmi_data.video_mode.mpixelclock);
  708. return -EINVAL;
  709. }
  710. /* CURRCTRL */
  711. hdmi_phy_i2c_write(hdmi, curr_ctrl[i].curr[res_idx], 0x10);
  712. hdmi_phy_i2c_write(hdmi, 0x0000, 0x13); /* PLLPHBYCTRL */
  713. hdmi_phy_i2c_write(hdmi, 0x0006, 0x17);
  714. for (i = 0; phy_config[i].mpixelclock != (~0UL); i++)
  715. if (hdmi->hdmi_data.video_mode.mpixelclock <=
  716. phy_config[i].mpixelclock)
  717. break;
  718. /* RESISTANCE TERM 133Ohm Cfg */
  719. hdmi_phy_i2c_write(hdmi, phy_config[i].term, 0x19); /* TXTERM */
  720. /* PREEMP Cgf 0.00 */
  721. hdmi_phy_i2c_write(hdmi, phy_config[i].sym_ctr, 0x09); /* CKSYMTXCTRL */
  722. /* TX/CK LVL 10 */
  723. hdmi_phy_i2c_write(hdmi, phy_config[i].vlev_ctr, 0x0E); /* VLEVCTRL */
  724. /* REMOVE CLK TERM */
  725. hdmi_phy_i2c_write(hdmi, 0x8000, 0x05); /* CKCALCTRL */
  726. dw_hdmi_phy_enable_power(hdmi, 1);
  727. /* toggle TMDS enable */
  728. dw_hdmi_phy_enable_tmds(hdmi, 0);
  729. dw_hdmi_phy_enable_tmds(hdmi, 1);
  730. /* gen2 tx power on */
  731. dw_hdmi_phy_gen2_txpwron(hdmi, 1);
  732. dw_hdmi_phy_gen2_pddq(hdmi, 0);
  733. if (hdmi->dev_type == RK3288_HDMI)
  734. dw_hdmi_phy_enable_spare(hdmi, 1);
  735. /*Wait for PHY PLL lock */
  736. msec = 5;
  737. do {
  738. val = hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_TX_PHY_LOCK;
  739. if (!val)
  740. break;
  741. if (msec == 0) {
  742. dev_err(hdmi->dev, "PHY PLL not locked\n");
  743. return -ETIMEDOUT;
  744. }
  745. udelay(1000);
  746. msec--;
  747. } while (1);
  748. return 0;
  749. }
  750. static int dw_hdmi_phy_init(struct dw_hdmi *hdmi)
  751. {
  752. int i, ret;
  753. bool cscon = false;
  754. /*check csc whether needed activated in HDMI mode */
  755. cscon = (is_color_space_conversion(hdmi) &&
  756. !hdmi->hdmi_data.video_mode.mdvi);
  757. /* HDMI Phy spec says to do the phy initialization sequence twice */
  758. for (i = 0; i < 2; i++) {
  759. dw_hdmi_phy_sel_data_en_pol(hdmi, 1);
  760. dw_hdmi_phy_sel_interface_control(hdmi, 0);
  761. dw_hdmi_phy_enable_tmds(hdmi, 0);
  762. dw_hdmi_phy_enable_power(hdmi, 0);
  763. /* Enable CSC */
  764. ret = hdmi_phy_configure(hdmi, 0, 8, cscon);
  765. if (ret)
  766. return ret;
  767. }
  768. hdmi->phy_enabled = true;
  769. return 0;
  770. }
  771. static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi)
  772. {
  773. u8 de;
  774. if (hdmi->hdmi_data.video_mode.mdataenablepolarity)
  775. de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_HIGH;
  776. else
  777. de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_LOW;
  778. /* disable rx detect */
  779. hdmi_modb(hdmi, HDMI_A_HDCPCFG0_RXDETECT_DISABLE,
  780. HDMI_A_HDCPCFG0_RXDETECT_MASK, HDMI_A_HDCPCFG0);
  781. hdmi_modb(hdmi, de, HDMI_A_VIDPOLCFG_DATAENPOL_MASK, HDMI_A_VIDPOLCFG);
  782. hdmi_modb(hdmi, HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_DISABLE,
  783. HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_MASK, HDMI_A_HDCPCFG1);
  784. }
  785. static void hdmi_config_AVI(struct dw_hdmi *hdmi)
  786. {
  787. u8 val, pix_fmt, under_scan;
  788. u8 act_ratio, coded_ratio, colorimetry, ext_colorimetry;
  789. bool aspect_16_9;
  790. aspect_16_9 = false; /* FIXME */
  791. /* AVI Data Byte 1 */
  792. if (hdmi->hdmi_data.enc_out_format == YCBCR444)
  793. pix_fmt = HDMI_FC_AVICONF0_PIX_FMT_YCBCR444;
  794. else if (hdmi->hdmi_data.enc_out_format == YCBCR422_8BITS)
  795. pix_fmt = HDMI_FC_AVICONF0_PIX_FMT_YCBCR422;
  796. else
  797. pix_fmt = HDMI_FC_AVICONF0_PIX_FMT_RGB;
  798. under_scan = HDMI_FC_AVICONF0_SCAN_INFO_NODATA;
  799. /*
  800. * Active format identification data is present in the AVI InfoFrame.
  801. * Under scan info, no bar data
  802. */
  803. val = pix_fmt | under_scan |
  804. HDMI_FC_AVICONF0_ACTIVE_FMT_INFO_PRESENT |
  805. HDMI_FC_AVICONF0_BAR_DATA_NO_DATA;
  806. hdmi_writeb(hdmi, val, HDMI_FC_AVICONF0);
  807. /* AVI Data Byte 2 -Set the Aspect Ratio */
  808. if (aspect_16_9) {
  809. act_ratio = HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_16_9;
  810. coded_ratio = HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_16_9;
  811. } else {
  812. act_ratio = HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_4_3;
  813. coded_ratio = HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_4_3;
  814. }
  815. /* Set up colorimetry */
  816. if (hdmi->hdmi_data.enc_out_format == XVYCC444) {
  817. colorimetry = HDMI_FC_AVICONF1_COLORIMETRY_EXTENDED_INFO;
  818. if (hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_601)
  819. ext_colorimetry =
  820. HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC601;
  821. else /*hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_709*/
  822. ext_colorimetry =
  823. HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC709;
  824. } else if (hdmi->hdmi_data.enc_out_format != RGB) {
  825. if (hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_601)
  826. colorimetry = HDMI_FC_AVICONF1_COLORIMETRY_SMPTE;
  827. else /*hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_709*/
  828. colorimetry = HDMI_FC_AVICONF1_COLORIMETRY_ITUR;
  829. ext_colorimetry = HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC601;
  830. } else { /* Carries no data */
  831. colorimetry = HDMI_FC_AVICONF1_COLORIMETRY_NO_DATA;
  832. ext_colorimetry = HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC601;
  833. }
  834. val = colorimetry | coded_ratio | act_ratio;
  835. hdmi_writeb(hdmi, val, HDMI_FC_AVICONF1);
  836. /* AVI Data Byte 3 */
  837. val = HDMI_FC_AVICONF2_IT_CONTENT_NO_DATA | ext_colorimetry |
  838. HDMI_FC_AVICONF2_RGB_QUANT_DEFAULT |
  839. HDMI_FC_AVICONF2_SCALING_NONE;
  840. hdmi_writeb(hdmi, val, HDMI_FC_AVICONF2);
  841. /* AVI Data Byte 4 */
  842. hdmi_writeb(hdmi, hdmi->vic, HDMI_FC_AVIVID);
  843. /* AVI Data Byte 5- set up input and output pixel repetition */
  844. val = (((hdmi->hdmi_data.video_mode.mpixelrepetitioninput + 1) <<
  845. HDMI_FC_PRCONF_INCOMING_PR_FACTOR_OFFSET) &
  846. HDMI_FC_PRCONF_INCOMING_PR_FACTOR_MASK) |
  847. ((hdmi->hdmi_data.video_mode.mpixelrepetitionoutput <<
  848. HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_OFFSET) &
  849. HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_MASK);
  850. hdmi_writeb(hdmi, val, HDMI_FC_PRCONF);
  851. /* IT Content and quantization range = don't care */
  852. val = HDMI_FC_AVICONF3_IT_CONTENT_TYPE_GRAPHICS |
  853. HDMI_FC_AVICONF3_QUANT_RANGE_LIMITED;
  854. hdmi_writeb(hdmi, val, HDMI_FC_AVICONF3);
  855. /* AVI Data Bytes 6-13 */
  856. hdmi_writeb(hdmi, 0, HDMI_FC_AVIETB0);
  857. hdmi_writeb(hdmi, 0, HDMI_FC_AVIETB1);
  858. hdmi_writeb(hdmi, 0, HDMI_FC_AVISBB0);
  859. hdmi_writeb(hdmi, 0, HDMI_FC_AVISBB1);
  860. hdmi_writeb(hdmi, 0, HDMI_FC_AVIELB0);
  861. hdmi_writeb(hdmi, 0, HDMI_FC_AVIELB1);
  862. hdmi_writeb(hdmi, 0, HDMI_FC_AVISRB0);
  863. hdmi_writeb(hdmi, 0, HDMI_FC_AVISRB1);
  864. }
  865. static void hdmi_av_composer(struct dw_hdmi *hdmi,
  866. const struct drm_display_mode *mode)
  867. {
  868. u8 inv_val;
  869. struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode;
  870. int hblank, vblank, h_de_hs, v_de_vs, hsync_len, vsync_len;
  871. vmode->mhsyncpolarity = !!(mode->flags & DRM_MODE_FLAG_PHSYNC);
  872. vmode->mvsyncpolarity = !!(mode->flags & DRM_MODE_FLAG_PVSYNC);
  873. vmode->minterlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
  874. vmode->mpixelclock = mode->clock * 1000;
  875. dev_dbg(hdmi->dev, "final pixclk = %d\n", vmode->mpixelclock);
  876. /* Set up HDMI_FC_INVIDCONF */
  877. inv_val = (hdmi->hdmi_data.hdcp_enable ?
  878. HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE :
  879. HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE);
  880. inv_val |= (vmode->mvsyncpolarity ?
  881. HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH :
  882. HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_LOW);
  883. inv_val |= (vmode->mhsyncpolarity ?
  884. HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_HIGH :
  885. HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_LOW);
  886. inv_val |= (vmode->mdataenablepolarity ?
  887. HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_HIGH :
  888. HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_LOW);
  889. if (hdmi->vic == 39)
  890. inv_val |= HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_HIGH;
  891. else
  892. inv_val |= (vmode->minterlaced ?
  893. HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_HIGH :
  894. HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_LOW);
  895. inv_val |= (vmode->minterlaced ?
  896. HDMI_FC_INVIDCONF_IN_I_P_INTERLACED :
  897. HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE);
  898. inv_val |= (vmode->mdvi ?
  899. HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE :
  900. HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE);
  901. hdmi_writeb(hdmi, inv_val, HDMI_FC_INVIDCONF);
  902. /* Set up horizontal active pixel width */
  903. hdmi_writeb(hdmi, mode->hdisplay >> 8, HDMI_FC_INHACTV1);
  904. hdmi_writeb(hdmi, mode->hdisplay, HDMI_FC_INHACTV0);
  905. /* Set up vertical active lines */
  906. hdmi_writeb(hdmi, mode->vdisplay >> 8, HDMI_FC_INVACTV1);
  907. hdmi_writeb(hdmi, mode->vdisplay, HDMI_FC_INVACTV0);
  908. /* Set up horizontal blanking pixel region width */
  909. hblank = mode->htotal - mode->hdisplay;
  910. hdmi_writeb(hdmi, hblank >> 8, HDMI_FC_INHBLANK1);
  911. hdmi_writeb(hdmi, hblank, HDMI_FC_INHBLANK0);
  912. /* Set up vertical blanking pixel region width */
  913. vblank = mode->vtotal - mode->vdisplay;
  914. hdmi_writeb(hdmi, vblank, HDMI_FC_INVBLANK);
  915. /* Set up HSYNC active edge delay width (in pixel clks) */
  916. h_de_hs = mode->hsync_start - mode->hdisplay;
  917. hdmi_writeb(hdmi, h_de_hs >> 8, HDMI_FC_HSYNCINDELAY1);
  918. hdmi_writeb(hdmi, h_de_hs, HDMI_FC_HSYNCINDELAY0);
  919. /* Set up VSYNC active edge delay (in lines) */
  920. v_de_vs = mode->vsync_start - mode->vdisplay;
  921. hdmi_writeb(hdmi, v_de_vs, HDMI_FC_VSYNCINDELAY);
  922. /* Set up HSYNC active pulse width (in pixel clks) */
  923. hsync_len = mode->hsync_end - mode->hsync_start;
  924. hdmi_writeb(hdmi, hsync_len >> 8, HDMI_FC_HSYNCINWIDTH1);
  925. hdmi_writeb(hdmi, hsync_len, HDMI_FC_HSYNCINWIDTH0);
  926. /* Set up VSYNC active edge delay (in lines) */
  927. vsync_len = mode->vsync_end - mode->vsync_start;
  928. hdmi_writeb(hdmi, vsync_len, HDMI_FC_VSYNCINWIDTH);
  929. }
  930. static void dw_hdmi_phy_disable(struct dw_hdmi *hdmi)
  931. {
  932. if (!hdmi->phy_enabled)
  933. return;
  934. dw_hdmi_phy_enable_tmds(hdmi, 0);
  935. dw_hdmi_phy_enable_power(hdmi, 0);
  936. hdmi->phy_enabled = false;
  937. }
  938. /* HDMI Initialization Step B.4 */
  939. static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
  940. {
  941. u8 clkdis;
  942. /* control period minimum duration */
  943. hdmi_writeb(hdmi, 12, HDMI_FC_CTRLDUR);
  944. hdmi_writeb(hdmi, 32, HDMI_FC_EXCTRLDUR);
  945. hdmi_writeb(hdmi, 1, HDMI_FC_EXCTRLSPAC);
  946. /* Set to fill TMDS data channels */
  947. hdmi_writeb(hdmi, 0x0B, HDMI_FC_CH0PREAM);
  948. hdmi_writeb(hdmi, 0x16, HDMI_FC_CH1PREAM);
  949. hdmi_writeb(hdmi, 0x21, HDMI_FC_CH2PREAM);
  950. /* Enable pixel clock and tmds data path */
  951. clkdis = 0x7F;
  952. clkdis &= ~HDMI_MC_CLKDIS_PIXELCLK_DISABLE;
  953. hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);
  954. clkdis &= ~HDMI_MC_CLKDIS_TMDSCLK_DISABLE;
  955. hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);
  956. /* Enable csc path */
  957. if (is_color_space_conversion(hdmi)) {
  958. clkdis &= ~HDMI_MC_CLKDIS_CSCCLK_DISABLE;
  959. hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);
  960. }
  961. }
  962. static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi)
  963. {
  964. hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS);
  965. }
  966. /* Workaround to clear the overflow condition */
  967. static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi)
  968. {
  969. int count;
  970. u8 val;
  971. /* TMDS software reset */
  972. hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ, HDMI_MC_SWRSTZ);
  973. val = hdmi_readb(hdmi, HDMI_FC_INVIDCONF);
  974. if (hdmi->dev_type == IMX6DL_HDMI) {
  975. hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF);
  976. return;
  977. }
  978. for (count = 0; count < 4; count++)
  979. hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF);
  980. }
  981. static void hdmi_enable_overflow_interrupts(struct dw_hdmi *hdmi)
  982. {
  983. hdmi_writeb(hdmi, 0, HDMI_FC_MASK2);
  984. hdmi_writeb(hdmi, 0, HDMI_IH_MUTE_FC_STAT2);
  985. }
  986. static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
  987. {
  988. hdmi_writeb(hdmi, HDMI_IH_MUTE_FC_STAT2_OVERFLOW_MASK,
  989. HDMI_IH_MUTE_FC_STAT2);
  990. }
  991. static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
  992. {
  993. int ret;
  994. hdmi_disable_overflow_interrupts(hdmi);
  995. hdmi->vic = drm_match_cea_mode(mode);
  996. if (!hdmi->vic) {
  997. dev_dbg(hdmi->dev, "Non-CEA mode used in HDMI\n");
  998. hdmi->hdmi_data.video_mode.mdvi = true;
  999. } else {
  1000. dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic);
  1001. hdmi->hdmi_data.video_mode.mdvi = false;
  1002. }
  1003. if ((hdmi->vic == 6) || (hdmi->vic == 7) ||
  1004. (hdmi->vic == 21) || (hdmi->vic == 22) ||
  1005. (hdmi->vic == 2) || (hdmi->vic == 3) ||
  1006. (hdmi->vic == 17) || (hdmi->vic == 18))
  1007. hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_601;
  1008. else
  1009. hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_709;
  1010. if ((hdmi->vic == 10) || (hdmi->vic == 11) ||
  1011. (hdmi->vic == 12) || (hdmi->vic == 13) ||
  1012. (hdmi->vic == 14) || (hdmi->vic == 15) ||
  1013. (hdmi->vic == 25) || (hdmi->vic == 26) ||
  1014. (hdmi->vic == 27) || (hdmi->vic == 28) ||
  1015. (hdmi->vic == 29) || (hdmi->vic == 30) ||
  1016. (hdmi->vic == 35) || (hdmi->vic == 36) ||
  1017. (hdmi->vic == 37) || (hdmi->vic == 38))
  1018. hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 1;
  1019. else
  1020. hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
  1021. hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
  1022. /* TODO: Get input format from IPU (via FB driver interface) */
  1023. hdmi->hdmi_data.enc_in_format = RGB;
  1024. hdmi->hdmi_data.enc_out_format = RGB;
  1025. hdmi->hdmi_data.enc_color_depth = 8;
  1026. hdmi->hdmi_data.pix_repet_factor = 0;
  1027. hdmi->hdmi_data.hdcp_enable = 0;
  1028. hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
  1029. /* HDMI Initialization Step B.1 */
  1030. hdmi_av_composer(hdmi, mode);
  1031. /* HDMI Initializateion Step B.2 */
  1032. ret = dw_hdmi_phy_init(hdmi);
  1033. if (ret)
  1034. return ret;
  1035. /* HDMI Initialization Step B.3 */
  1036. dw_hdmi_enable_video_path(hdmi);
  1037. /* not for DVI mode */
  1038. if (hdmi->hdmi_data.video_mode.mdvi) {
  1039. dev_dbg(hdmi->dev, "%s DVI mode\n", __func__);
  1040. } else {
  1041. dev_dbg(hdmi->dev, "%s CEA mode\n", __func__);
  1042. /* HDMI Initialization Step E - Configure audio */
  1043. hdmi_clk_regenerator_update_pixel_clock(hdmi);
  1044. hdmi_enable_audio_clk(hdmi);
  1045. /* HDMI Initialization Step F - Configure AVI InfoFrame */
  1046. hdmi_config_AVI(hdmi);
  1047. }
  1048. hdmi_video_packetize(hdmi);
  1049. hdmi_video_csc(hdmi);
  1050. hdmi_video_sample(hdmi);
  1051. hdmi_tx_hdcp_config(hdmi);
  1052. dw_hdmi_clear_overflow(hdmi);
  1053. if (hdmi->cable_plugin && !hdmi->hdmi_data.video_mode.mdvi)
  1054. hdmi_enable_overflow_interrupts(hdmi);
  1055. return 0;
  1056. }
  1057. /* Wait until we are registered to enable interrupts */
  1058. static int dw_hdmi_fb_registered(struct dw_hdmi *hdmi)
  1059. {
  1060. hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL,
  1061. HDMI_PHY_I2CM_INT_ADDR);
  1062. hdmi_writeb(hdmi, HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL |
  1063. HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL,
  1064. HDMI_PHY_I2CM_CTLINT_ADDR);
  1065. /* enable cable hot plug irq */
  1066. hdmi_writeb(hdmi, (u8)~HDMI_PHY_HPD, HDMI_PHY_MASK0);
  1067. /* Clear Hotplug interrupts */
  1068. hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
  1069. return 0;
  1070. }
  1071. static void initialize_hdmi_ih_mutes(struct dw_hdmi *hdmi)
  1072. {
  1073. u8 ih_mute;
  1074. /*
  1075. * Boot up defaults are:
  1076. * HDMI_IH_MUTE = 0x03 (disabled)
  1077. * HDMI_IH_MUTE_* = 0x00 (enabled)
  1078. *
  1079. * Disable top level interrupt bits in HDMI block
  1080. */
  1081. ih_mute = hdmi_readb(hdmi, HDMI_IH_MUTE) |
  1082. HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
  1083. HDMI_IH_MUTE_MUTE_ALL_INTERRUPT;
  1084. hdmi_writeb(hdmi, ih_mute, HDMI_IH_MUTE);
  1085. /* by default mask all interrupts */
  1086. hdmi_writeb(hdmi, 0xff, HDMI_VP_MASK);
  1087. hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK0);
  1088. hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK1);
  1089. hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK2);
  1090. hdmi_writeb(hdmi, 0xff, HDMI_PHY_MASK0);
  1091. hdmi_writeb(hdmi, 0xff, HDMI_PHY_I2CM_INT_ADDR);
  1092. hdmi_writeb(hdmi, 0xff, HDMI_PHY_I2CM_CTLINT_ADDR);
  1093. hdmi_writeb(hdmi, 0xff, HDMI_AUD_INT);
  1094. hdmi_writeb(hdmi, 0xff, HDMI_AUD_SPDIFINT);
  1095. hdmi_writeb(hdmi, 0xff, HDMI_AUD_HBR_MASK);
  1096. hdmi_writeb(hdmi, 0xff, HDMI_GP_MASK);
  1097. hdmi_writeb(hdmi, 0xff, HDMI_A_APIINTMSK);
  1098. hdmi_writeb(hdmi, 0xff, HDMI_CEC_MASK);
  1099. hdmi_writeb(hdmi, 0xff, HDMI_I2CM_INT);
  1100. hdmi_writeb(hdmi, 0xff, HDMI_I2CM_CTLINT);
  1101. /* Disable interrupts in the IH_MUTE_* registers */
  1102. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT0);
  1103. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT1);
  1104. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT2);
  1105. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_AS_STAT0);
  1106. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_PHY_STAT0);
  1107. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_I2CM_STAT0);
  1108. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_CEC_STAT0);
  1109. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_VP_STAT0);
  1110. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_I2CMPHY_STAT0);
  1111. hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_AHBDMAAUD_STAT0);
  1112. /* Enable top level interrupt bits in HDMI block */
  1113. ih_mute &= ~(HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
  1114. HDMI_IH_MUTE_MUTE_ALL_INTERRUPT);
  1115. hdmi_writeb(hdmi, ih_mute, HDMI_IH_MUTE);
  1116. }
  1117. static void dw_hdmi_poweron(struct dw_hdmi *hdmi)
  1118. {
  1119. dw_hdmi_setup(hdmi, &hdmi->previous_mode);
  1120. }
  1121. static void dw_hdmi_poweroff(struct dw_hdmi *hdmi)
  1122. {
  1123. dw_hdmi_phy_disable(hdmi);
  1124. }
  1125. static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
  1126. struct drm_display_mode *orig_mode,
  1127. struct drm_display_mode *mode)
  1128. {
  1129. struct dw_hdmi *hdmi = bridge->driver_private;
  1130. dw_hdmi_setup(hdmi, mode);
  1131. /* Store the display mode for plugin/DKMS poweron events */
  1132. memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode));
  1133. }
  1134. static bool dw_hdmi_bridge_mode_fixup(struct drm_bridge *bridge,
  1135. const struct drm_display_mode *mode,
  1136. struct drm_display_mode *adjusted_mode)
  1137. {
  1138. return true;
  1139. }
  1140. static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
  1141. {
  1142. struct dw_hdmi *hdmi = bridge->driver_private;
  1143. dw_hdmi_poweroff(hdmi);
  1144. }
  1145. static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
  1146. {
  1147. struct dw_hdmi *hdmi = bridge->driver_private;
  1148. dw_hdmi_poweron(hdmi);
  1149. }
  1150. static void dw_hdmi_bridge_nop(struct drm_bridge *bridge)
  1151. {
  1152. /* do nothing */
  1153. }
  1154. static enum drm_connector_status
  1155. dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
  1156. {
  1157. struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
  1158. connector);
  1159. return hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD ?
  1160. connector_status_connected : connector_status_disconnected;
  1161. }
  1162. static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
  1163. {
  1164. struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
  1165. connector);
  1166. struct edid *edid;
  1167. int ret;
  1168. if (!hdmi->ddc)
  1169. return 0;
  1170. edid = drm_get_edid(connector, hdmi->ddc);
  1171. if (edid) {
  1172. dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
  1173. edid->width_cm, edid->height_cm);
  1174. drm_mode_connector_update_edid_property(connector, edid);
  1175. ret = drm_add_edid_modes(connector, edid);
  1176. kfree(edid);
  1177. } else {
  1178. dev_dbg(hdmi->dev, "failed to get edid\n");
  1179. }
  1180. return 0;
  1181. }
  1182. static enum drm_mode_status
  1183. dw_hdmi_connector_mode_valid(struct drm_connector *connector,
  1184. struct drm_display_mode *mode)
  1185. {
  1186. struct dw_hdmi *hdmi = container_of(connector,
  1187. struct dw_hdmi, connector);
  1188. enum drm_mode_status mode_status = MODE_OK;
  1189. if (hdmi->plat_data->mode_valid)
  1190. mode_status = hdmi->plat_data->mode_valid(connector, mode);
  1191. return mode_status;
  1192. }
  1193. static struct drm_encoder *dw_hdmi_connector_best_encoder(struct drm_connector
  1194. *connector)
  1195. {
  1196. struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
  1197. connector);
  1198. return hdmi->encoder;
  1199. }
  1200. static void dw_hdmi_connector_destroy(struct drm_connector *connector)
  1201. {
  1202. drm_connector_unregister(connector);
  1203. drm_connector_cleanup(connector);
  1204. }
  1205. static struct drm_connector_funcs dw_hdmi_connector_funcs = {
  1206. .dpms = drm_helper_connector_dpms,
  1207. .fill_modes = drm_helper_probe_single_connector_modes,
  1208. .detect = dw_hdmi_connector_detect,
  1209. .destroy = dw_hdmi_connector_destroy,
  1210. };
  1211. static struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs = {
  1212. .get_modes = dw_hdmi_connector_get_modes,
  1213. .mode_valid = dw_hdmi_connector_mode_valid,
  1214. .best_encoder = dw_hdmi_connector_best_encoder,
  1215. };
  1216. struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
  1217. .enable = dw_hdmi_bridge_enable,
  1218. .disable = dw_hdmi_bridge_disable,
  1219. .pre_enable = dw_hdmi_bridge_nop,
  1220. .post_disable = dw_hdmi_bridge_nop,
  1221. .mode_set = dw_hdmi_bridge_mode_set,
  1222. .mode_fixup = dw_hdmi_bridge_mode_fixup,
  1223. };
  1224. static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
  1225. {
  1226. struct dw_hdmi *hdmi = dev_id;
  1227. u8 intr_stat;
  1228. intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
  1229. if (intr_stat)
  1230. hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);
  1231. return intr_stat ? IRQ_WAKE_THREAD : IRQ_NONE;
  1232. }
  1233. static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
  1234. {
  1235. struct dw_hdmi *hdmi = dev_id;
  1236. u8 intr_stat;
  1237. u8 phy_int_pol;
  1238. intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
  1239. phy_int_pol = hdmi_readb(hdmi, HDMI_PHY_POL0);
  1240. if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
  1241. if (phy_int_pol & HDMI_PHY_HPD) {
  1242. dev_dbg(hdmi->dev, "EVENT=plugin\n");
  1243. hdmi_modb(hdmi, 0, HDMI_PHY_HPD, HDMI_PHY_POL0);
  1244. dw_hdmi_poweron(hdmi);
  1245. } else {
  1246. dev_dbg(hdmi->dev, "EVENT=plugout\n");
  1247. hdmi_modb(hdmi, HDMI_PHY_HPD, HDMI_PHY_HPD,
  1248. HDMI_PHY_POL0);
  1249. dw_hdmi_poweroff(hdmi);
  1250. }
  1251. drm_helper_hpd_irq_event(hdmi->connector.dev);
  1252. }
  1253. hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0);
  1254. hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
  1255. return IRQ_HANDLED;
  1256. }
  1257. static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
  1258. {
  1259. struct drm_encoder *encoder = hdmi->encoder;
  1260. struct drm_bridge *bridge;
  1261. int ret;
  1262. bridge = devm_kzalloc(drm->dev, sizeof(*bridge), GFP_KERNEL);
  1263. if (!bridge) {
  1264. DRM_ERROR("Failed to allocate drm bridge\n");
  1265. return -ENOMEM;
  1266. }
  1267. hdmi->bridge = bridge;
  1268. bridge->driver_private = hdmi;
  1269. bridge->funcs = &dw_hdmi_bridge_funcs;
  1270. ret = drm_bridge_attach(drm, bridge);
  1271. if (ret) {
  1272. DRM_ERROR("Failed to initialize bridge with drm\n");
  1273. return -EINVAL;
  1274. }
  1275. encoder->bridge = bridge;
  1276. hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
  1277. drm_connector_helper_add(&hdmi->connector,
  1278. &dw_hdmi_connector_helper_funcs);
  1279. drm_connector_init(drm, &hdmi->connector, &dw_hdmi_connector_funcs,
  1280. DRM_MODE_CONNECTOR_HDMIA);
  1281. hdmi->connector.encoder = encoder;
  1282. drm_mode_connector_attach_encoder(&hdmi->connector, encoder);
  1283. return 0;
  1284. }
  1285. int dw_hdmi_bind(struct device *dev, struct device *master,
  1286. void *data, struct drm_encoder *encoder,
  1287. struct resource *iores, int irq,
  1288. const struct dw_hdmi_plat_data *plat_data)
  1289. {
  1290. struct drm_device *drm = data;
  1291. struct device_node *np = dev->of_node;
  1292. struct device_node *ddc_node;
  1293. struct dw_hdmi *hdmi;
  1294. int ret;
  1295. u32 val = 1;
  1296. hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
  1297. if (!hdmi)
  1298. return -ENOMEM;
  1299. hdmi->plat_data = plat_data;
  1300. hdmi->dev = dev;
  1301. hdmi->dev_type = plat_data->dev_type;
  1302. hdmi->sample_rate = 48000;
  1303. hdmi->ratio = 100;
  1304. hdmi->encoder = encoder;
  1305. mutex_init(&hdmi->audio_mutex);
  1306. of_property_read_u32(np, "reg-io-width", &val);
  1307. switch (val) {
  1308. case 4:
  1309. hdmi->write = dw_hdmi_writel;
  1310. hdmi->read = dw_hdmi_readl;
  1311. break;
  1312. case 1:
  1313. hdmi->write = dw_hdmi_writeb;
  1314. hdmi->read = dw_hdmi_readb;
  1315. break;
  1316. default:
  1317. dev_err(dev, "reg-io-width must be 1 or 4\n");
  1318. return -EINVAL;
  1319. }
  1320. ddc_node = of_parse_phandle(np, "ddc-i2c-bus", 0);
  1321. if (ddc_node) {
  1322. hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node);
  1323. of_node_put(ddc_node);
  1324. if (!hdmi->ddc) {
  1325. dev_dbg(hdmi->dev, "failed to read ddc node\n");
  1326. return -EPROBE_DEFER;
  1327. }
  1328. } else {
  1329. dev_dbg(hdmi->dev, "no ddc property found\n");
  1330. }
  1331. hdmi->regs = devm_ioremap_resource(dev, iores);
  1332. if (IS_ERR(hdmi->regs))
  1333. return PTR_ERR(hdmi->regs);
  1334. hdmi->isfr_clk = devm_clk_get(hdmi->dev, "isfr");
  1335. if (IS_ERR(hdmi->isfr_clk)) {
  1336. ret = PTR_ERR(hdmi->isfr_clk);
  1337. dev_err(hdmi->dev, "Unable to get HDMI isfr clk: %d\n", ret);
  1338. return ret;
  1339. }
  1340. ret = clk_prepare_enable(hdmi->isfr_clk);
  1341. if (ret) {
  1342. dev_err(hdmi->dev, "Cannot enable HDMI isfr clock: %d\n", ret);
  1343. return ret;
  1344. }
  1345. hdmi->iahb_clk = devm_clk_get(hdmi->dev, "iahb");
  1346. if (IS_ERR(hdmi->iahb_clk)) {
  1347. ret = PTR_ERR(hdmi->iahb_clk);
  1348. dev_err(hdmi->dev, "Unable to get HDMI iahb clk: %d\n", ret);
  1349. goto err_isfr;
  1350. }
  1351. ret = clk_prepare_enable(hdmi->iahb_clk);
  1352. if (ret) {
  1353. dev_err(hdmi->dev, "Cannot enable HDMI iahb clock: %d\n", ret);
  1354. goto err_isfr;
  1355. }
  1356. /* Product and revision IDs */
  1357. dev_info(dev,
  1358. "Detected HDMI controller 0x%x:0x%x:0x%x:0x%x\n",
  1359. hdmi_readb(hdmi, HDMI_DESIGN_ID),
  1360. hdmi_readb(hdmi, HDMI_REVISION_ID),
  1361. hdmi_readb(hdmi, HDMI_PRODUCT_ID0),
  1362. hdmi_readb(hdmi, HDMI_PRODUCT_ID1));
  1363. initialize_hdmi_ih_mutes(hdmi);
  1364. ret = devm_request_threaded_irq(dev, irq, dw_hdmi_hardirq,
  1365. dw_hdmi_irq, IRQF_SHARED,
  1366. dev_name(dev), hdmi);
  1367. if (ret)
  1368. goto err_iahb;
  1369. /*
  1370. * To prevent overflows in HDMI_IH_FC_STAT2, set the clk regenerator
  1371. * N and cts values before enabling phy
  1372. */
  1373. hdmi_init_clk_regenerator(hdmi);
  1374. /*
  1375. * Configure registers related to HDMI interrupt
  1376. * generation before registering IRQ.
  1377. */
  1378. hdmi_writeb(hdmi, HDMI_PHY_HPD, HDMI_PHY_POL0);
  1379. /* Clear Hotplug interrupts */
  1380. hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
  1381. ret = dw_hdmi_fb_registered(hdmi);
  1382. if (ret)
  1383. goto err_iahb;
  1384. ret = dw_hdmi_register(drm, hdmi);
  1385. if (ret)
  1386. goto err_iahb;
  1387. /* Unmute interrupts */
  1388. hdmi_writeb(hdmi, ~HDMI_IH_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
  1389. dev_set_drvdata(dev, hdmi);
  1390. return 0;
  1391. err_iahb:
  1392. clk_disable_unprepare(hdmi->iahb_clk);
  1393. err_isfr:
  1394. clk_disable_unprepare(hdmi->isfr_clk);
  1395. return ret;
  1396. }
  1397. EXPORT_SYMBOL_GPL(dw_hdmi_bind);
  1398. void dw_hdmi_unbind(struct device *dev, struct device *master, void *data)
  1399. {
  1400. struct dw_hdmi *hdmi = dev_get_drvdata(dev);
  1401. /* Disable all interrupts */
  1402. hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);
  1403. hdmi->connector.funcs->destroy(&hdmi->connector);
  1404. hdmi->encoder->funcs->destroy(hdmi->encoder);
  1405. clk_disable_unprepare(hdmi->iahb_clk);
  1406. clk_disable_unprepare(hdmi->isfr_clk);
  1407. i2c_put_adapter(hdmi->ddc);
  1408. }
  1409. EXPORT_SYMBOL_GPL(dw_hdmi_unbind);
  1410. MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
  1411. MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
  1412. MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
  1413. MODULE_DESCRIPTION("DW HDMI transmitter driver");
  1414. MODULE_LICENSE("GPL");
  1415. MODULE_ALIAS("platform:dw-hdmi");