dw_hdmi.c 46 KB

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