mtk_dp.c 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2019-2022 MediaTek Inc.
  4. * Copyright (c) 2022 BayLibre
  5. */
  6. #include <drm/display/drm_dp.h>
  7. #include <drm/display/drm_dp_helper.h>
  8. #include <drm/drm_atomic_helper.h>
  9. #include <drm/drm_bridge.h>
  10. #include <drm/drm_crtc.h>
  11. #include <drm/drm_edid.h>
  12. #include <drm/drm_of.h>
  13. #include <drm/drm_panel.h>
  14. #include <drm/drm_print.h>
  15. #include <drm/drm_probe_helper.h>
  16. #include <linux/arm-smccc.h>
  17. #include <linux/clk.h>
  18. #include <linux/delay.h>
  19. #include <linux/errno.h>
  20. #include <linux/kernel.h>
  21. #include <linux/media-bus-format.h>
  22. #include <linux/nvmem-consumer.h>
  23. #include <linux/of.h>
  24. #include <linux/of_irq.h>
  25. #include <linux/of_platform.h>
  26. #include <linux/phy/phy.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/pm_runtime.h>
  29. #include <linux/regmap.h>
  30. #include <linux/soc/mediatek/mtk_sip_svc.h>
  31. #include <sound/hdmi-codec.h>
  32. #include <video/videomode.h>
  33. #include "mtk_dp_reg.h"
  34. #define MTK_DP_SIP_CONTROL_AARCH32 MTK_SIP_SMC_CMD(0x523)
  35. #define MTK_DP_SIP_ATF_EDP_VIDEO_UNMUTE (BIT(0) | BIT(5))
  36. #define MTK_DP_SIP_ATF_VIDEO_UNMUTE BIT(5)
  37. #define MTK_DP_THREAD_CABLE_STATE_CHG BIT(0)
  38. #define MTK_DP_THREAD_HPD_EVENT BIT(1)
  39. #define MTK_DP_4P1T 4
  40. #define MTK_DP_HDE 2
  41. #define MTK_DP_PIX_PER_ADDR 2
  42. #define MTK_DP_AUX_WAIT_REPLY_COUNT 20
  43. #define MTK_DP_TBC_BUF_READ_START_ADDR 0x8
  44. #define MTK_DP_TRAIN_VOLTAGE_LEVEL_RETRY 5
  45. #define MTK_DP_TRAIN_DOWNSCALE_RETRY 10
  46. #define MTK_DP_VERSION 0x11
  47. #define MTK_DP_SDP_AUI 0x4
  48. enum {
  49. MTK_DP_CAL_GLB_BIAS_TRIM = 0,
  50. MTK_DP_CAL_CLKTX_IMPSE,
  51. MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0,
  52. MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1,
  53. MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2,
  54. MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3,
  55. MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0,
  56. MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1,
  57. MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2,
  58. MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3,
  59. MTK_DP_CAL_MAX,
  60. };
  61. struct mtk_dp_train_info {
  62. bool sink_ssc;
  63. bool cable_plugged_in;
  64. /* link_rate is in multiple of 0.27Gbps */
  65. int link_rate;
  66. int lane_count;
  67. unsigned int channel_eq_pattern;
  68. };
  69. struct mtk_dp_audio_cfg {
  70. bool detect_monitor;
  71. int sad_count;
  72. int sample_rate;
  73. int word_length_bits;
  74. int channels;
  75. };
  76. struct mtk_dp_info {
  77. enum dp_pixelformat format;
  78. struct videomode vm;
  79. struct mtk_dp_audio_cfg audio_cur_cfg;
  80. };
  81. struct mtk_dp_efuse_fmt {
  82. unsigned short idx;
  83. unsigned short shift;
  84. unsigned short mask;
  85. unsigned short min_val;
  86. unsigned short max_val;
  87. unsigned short default_val;
  88. };
  89. struct mtk_dp {
  90. bool enabled;
  91. bool need_debounce;
  92. u8 max_lanes;
  93. u8 max_linkrate;
  94. u8 rx_cap[DP_RECEIVER_CAP_SIZE];
  95. u32 cal_data[MTK_DP_CAL_MAX];
  96. u32 irq_thread_handle;
  97. /* irq_thread_lock is used to protect irq_thread_handle */
  98. spinlock_t irq_thread_lock;
  99. struct device *dev;
  100. struct drm_bridge bridge;
  101. struct drm_bridge *next_bridge;
  102. struct drm_connector *conn;
  103. struct drm_device *drm_dev;
  104. struct drm_dp_aux aux;
  105. const struct mtk_dp_data *data;
  106. struct mtk_dp_info info;
  107. struct mtk_dp_train_info train_info;
  108. struct platform_device *phy_dev;
  109. struct phy *phy;
  110. struct regmap *regs;
  111. struct timer_list debounce_timer;
  112. /* For audio */
  113. bool audio_enable;
  114. hdmi_codec_plugged_cb plugged_cb;
  115. struct platform_device *audio_pdev;
  116. struct device *codec_dev;
  117. /* protect the plugged_cb as it's used in both bridge ops and audio */
  118. struct mutex update_plugged_status_lock;
  119. };
  120. struct mtk_dp_data {
  121. int bridge_type;
  122. unsigned int smc_cmd;
  123. const struct mtk_dp_efuse_fmt *efuse_fmt;
  124. bool audio_supported;
  125. };
  126. static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
  127. [MTK_DP_CAL_GLB_BIAS_TRIM] = {
  128. .idx = 3,
  129. .shift = 27,
  130. .mask = 0x1f,
  131. .min_val = 1,
  132. .max_val = 0x1e,
  133. .default_val = 0xf,
  134. },
  135. [MTK_DP_CAL_CLKTX_IMPSE] = {
  136. .idx = 0,
  137. .shift = 9,
  138. .mask = 0xf,
  139. .min_val = 1,
  140. .max_val = 0xe,
  141. .default_val = 0x8,
  142. },
  143. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
  144. .idx = 2,
  145. .shift = 28,
  146. .mask = 0xf,
  147. .min_val = 1,
  148. .max_val = 0xe,
  149. .default_val = 0x8,
  150. },
  151. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
  152. .idx = 2,
  153. .shift = 20,
  154. .mask = 0xf,
  155. .min_val = 1,
  156. .max_val = 0xe,
  157. .default_val = 0x8,
  158. },
  159. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
  160. .idx = 2,
  161. .shift = 12,
  162. .mask = 0xf,
  163. .min_val = 1,
  164. .max_val = 0xe,
  165. .default_val = 0x8,
  166. },
  167. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
  168. .idx = 2,
  169. .shift = 4,
  170. .mask = 0xf,
  171. .min_val = 1,
  172. .max_val = 0xe,
  173. .default_val = 0x8,
  174. },
  175. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
  176. .idx = 2,
  177. .shift = 24,
  178. .mask = 0xf,
  179. .min_val = 1,
  180. .max_val = 0xe,
  181. .default_val = 0x8,
  182. },
  183. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
  184. .idx = 2,
  185. .shift = 16,
  186. .mask = 0xf,
  187. .min_val = 1,
  188. .max_val = 0xe,
  189. .default_val = 0x8,
  190. },
  191. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
  192. .idx = 2,
  193. .shift = 8,
  194. .mask = 0xf,
  195. .min_val = 1,
  196. .max_val = 0xe,
  197. .default_val = 0x8,
  198. },
  199. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
  200. .idx = 2,
  201. .shift = 0,
  202. .mask = 0xf,
  203. .min_val = 1,
  204. .max_val = 0xe,
  205. .default_val = 0x8,
  206. },
  207. };
  208. static const struct mtk_dp_efuse_fmt mt8195_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
  209. [MTK_DP_CAL_GLB_BIAS_TRIM] = {
  210. .idx = 0,
  211. .shift = 27,
  212. .mask = 0x1f,
  213. .min_val = 1,
  214. .max_val = 0x1e,
  215. .default_val = 0xf,
  216. },
  217. [MTK_DP_CAL_CLKTX_IMPSE] = {
  218. .idx = 0,
  219. .shift = 13,
  220. .mask = 0xf,
  221. .min_val = 1,
  222. .max_val = 0xe,
  223. .default_val = 0x8,
  224. },
  225. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
  226. .idx = 1,
  227. .shift = 28,
  228. .mask = 0xf,
  229. .min_val = 1,
  230. .max_val = 0xe,
  231. .default_val = 0x8,
  232. },
  233. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
  234. .idx = 1,
  235. .shift = 20,
  236. .mask = 0xf,
  237. .min_val = 1,
  238. .max_val = 0xe,
  239. .default_val = 0x8,
  240. },
  241. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
  242. .idx = 1,
  243. .shift = 12,
  244. .mask = 0xf,
  245. .min_val = 1,
  246. .max_val = 0xe,
  247. .default_val = 0x8,
  248. },
  249. [MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
  250. .idx = 1,
  251. .shift = 4,
  252. .mask = 0xf,
  253. .min_val = 1,
  254. .max_val = 0xe,
  255. .default_val = 0x8,
  256. },
  257. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
  258. .idx = 1,
  259. .shift = 24,
  260. .mask = 0xf,
  261. .min_val = 1,
  262. .max_val = 0xe,
  263. .default_val = 0x8,
  264. },
  265. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
  266. .idx = 1,
  267. .shift = 16,
  268. .mask = 0xf,
  269. .min_val = 1,
  270. .max_val = 0xe,
  271. .default_val = 0x8,
  272. },
  273. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
  274. .idx = 1,
  275. .shift = 8,
  276. .mask = 0xf,
  277. .min_val = 1,
  278. .max_val = 0xe,
  279. .default_val = 0x8,
  280. },
  281. [MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
  282. .idx = 1,
  283. .shift = 0,
  284. .mask = 0xf,
  285. .min_val = 1,
  286. .max_val = 0xe,
  287. .default_val = 0x8,
  288. },
  289. };
  290. static struct regmap_config mtk_dp_regmap_config = {
  291. .reg_bits = 32,
  292. .val_bits = 32,
  293. .reg_stride = 4,
  294. .max_register = SEC_OFFSET + 0x90,
  295. .name = "mtk-dp-registers",
  296. };
  297. static struct mtk_dp *mtk_dp_from_bridge(struct drm_bridge *b)
  298. {
  299. return container_of(b, struct mtk_dp, bridge);
  300. }
  301. static u32 mtk_dp_read(struct mtk_dp *mtk_dp, u32 offset)
  302. {
  303. u32 read_val;
  304. int ret;
  305. ret = regmap_read(mtk_dp->regs, offset, &read_val);
  306. if (ret) {
  307. dev_err(mtk_dp->dev, "Failed to read register 0x%x: %d\n",
  308. offset, ret);
  309. return 0;
  310. }
  311. return read_val;
  312. }
  313. static int mtk_dp_write(struct mtk_dp *mtk_dp, u32 offset, u32 val)
  314. {
  315. int ret = regmap_write(mtk_dp->regs, offset, val);
  316. if (ret)
  317. dev_err(mtk_dp->dev,
  318. "Failed to write register 0x%x with value 0x%x\n",
  319. offset, val);
  320. return ret;
  321. }
  322. static int mtk_dp_update_bits(struct mtk_dp *mtk_dp, u32 offset,
  323. u32 val, u32 mask)
  324. {
  325. int ret = regmap_update_bits(mtk_dp->regs, offset, mask, val);
  326. if (ret)
  327. dev_err(mtk_dp->dev,
  328. "Failed to update register 0x%x with value 0x%x, mask 0x%x\n",
  329. offset, val, mask);
  330. return ret;
  331. }
  332. static void mtk_dp_bulk_16bit_write(struct mtk_dp *mtk_dp, u32 offset, u8 *buf,
  333. size_t length)
  334. {
  335. int i;
  336. /* 2 bytes per register */
  337. for (i = 0; i < length; i += 2) {
  338. u32 val = buf[i] | (i + 1 < length ? buf[i + 1] << 8 : 0);
  339. if (mtk_dp_write(mtk_dp, offset + i * 2, val))
  340. return;
  341. }
  342. }
  343. static void mtk_dp_msa_bypass_enable(struct mtk_dp *mtk_dp, bool enable)
  344. {
  345. u32 mask = HTOTAL_SEL_DP_ENC0_P0 | VTOTAL_SEL_DP_ENC0_P0 |
  346. HSTART_SEL_DP_ENC0_P0 | VSTART_SEL_DP_ENC0_P0 |
  347. HWIDTH_SEL_DP_ENC0_P0 | VHEIGHT_SEL_DP_ENC0_P0 |
  348. HSP_SEL_DP_ENC0_P0 | HSW_SEL_DP_ENC0_P0 |
  349. VSP_SEL_DP_ENC0_P0 | VSW_SEL_DP_ENC0_P0;
  350. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3030, enable ? 0 : mask, mask);
  351. }
  352. static void mtk_dp_set_msa(struct mtk_dp *mtk_dp)
  353. {
  354. struct drm_display_mode mode;
  355. struct videomode *vm = &mtk_dp->info.vm;
  356. drm_display_mode_from_videomode(vm, &mode);
  357. /* horizontal */
  358. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3010,
  359. mode.htotal, HTOTAL_SW_DP_ENC0_P0_MASK);
  360. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3018,
  361. vm->hsync_len + vm->hback_porch,
  362. HSTART_SW_DP_ENC0_P0_MASK);
  363. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3028,
  364. vm->hsync_len, HSW_SW_DP_ENC0_P0_MASK);
  365. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3028,
  366. 0, HSP_SW_DP_ENC0_P0_MASK);
  367. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3020,
  368. vm->hactive, HWIDTH_SW_DP_ENC0_P0_MASK);
  369. /* vertical */
  370. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3014,
  371. mode.vtotal, VTOTAL_SW_DP_ENC0_P0_MASK);
  372. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_301C,
  373. vm->vsync_len + vm->vback_porch,
  374. VSTART_SW_DP_ENC0_P0_MASK);
  375. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_302C,
  376. vm->vsync_len, VSW_SW_DP_ENC0_P0_MASK);
  377. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_302C,
  378. 0, VSP_SW_DP_ENC0_P0_MASK);
  379. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3024,
  380. vm->vactive, VHEIGHT_SW_DP_ENC0_P0_MASK);
  381. /* horizontal */
  382. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3064,
  383. vm->hactive, HDE_NUM_LAST_DP_ENC0_P0_MASK);
  384. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3154,
  385. mode.htotal, PGEN_HTOTAL_DP_ENC0_P0_MASK);
  386. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3158,
  387. vm->hfront_porch,
  388. PGEN_HSYNC_RISING_DP_ENC0_P0_MASK);
  389. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_315C,
  390. vm->hsync_len,
  391. PGEN_HSYNC_PULSE_WIDTH_DP_ENC0_P0_MASK);
  392. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3160,
  393. vm->hback_porch + vm->hsync_len,
  394. PGEN_HFDE_START_DP_ENC0_P0_MASK);
  395. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3164,
  396. vm->hactive,
  397. PGEN_HFDE_ACTIVE_WIDTH_DP_ENC0_P0_MASK);
  398. /* vertical */
  399. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3168,
  400. mode.vtotal,
  401. PGEN_VTOTAL_DP_ENC0_P0_MASK);
  402. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_316C,
  403. vm->vfront_porch,
  404. PGEN_VSYNC_RISING_DP_ENC0_P0_MASK);
  405. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3170,
  406. vm->vsync_len,
  407. PGEN_VSYNC_PULSE_WIDTH_DP_ENC0_P0_MASK);
  408. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3174,
  409. vm->vback_porch + vm->vsync_len,
  410. PGEN_VFDE_START_DP_ENC0_P0_MASK);
  411. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3178,
  412. vm->vactive,
  413. PGEN_VFDE_ACTIVE_WIDTH_DP_ENC0_P0_MASK);
  414. }
  415. static int mtk_dp_set_color_format(struct mtk_dp *mtk_dp,
  416. enum dp_pixelformat color_format)
  417. {
  418. u32 val;
  419. /* update MISC0 */
  420. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034,
  421. color_format << DP_TEST_COLOR_FORMAT_SHIFT,
  422. DP_TEST_COLOR_FORMAT_MASK);
  423. switch (color_format) {
  424. case DP_PIXELFORMAT_YUV422:
  425. val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_YCBCR422;
  426. break;
  427. case DP_PIXELFORMAT_RGB:
  428. val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_RGB;
  429. break;
  430. default:
  431. drm_warn(mtk_dp->drm_dev, "Unsupported color format: %d\n",
  432. color_format);
  433. return -EINVAL;
  434. }
  435. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,
  436. val, PIXEL_ENCODE_FORMAT_DP_ENC0_P0_MASK);
  437. return 0;
  438. }
  439. static void mtk_dp_set_color_depth(struct mtk_dp *mtk_dp)
  440. {
  441. /* Only support 8 bits currently */
  442. /* Update MISC0 */
  443. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034,
  444. DP_MSA_MISC_8_BPC, DP_TEST_BIT_DEPTH_MASK);
  445. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,
  446. VIDEO_COLOR_DEPTH_DP_ENC0_P0_8BIT,
  447. VIDEO_COLOR_DEPTH_DP_ENC0_P0_MASK);
  448. }
  449. static void mtk_dp_config_mn_mode(struct mtk_dp *mtk_dp)
  450. {
  451. /* 0: hw mode, 1: sw mode */
  452. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
  453. 0, VIDEO_M_CODE_SEL_DP_ENC0_P0_MASK);
  454. }
  455. static void mtk_dp_set_sram_read_start(struct mtk_dp *mtk_dp, u32 val)
  456. {
  457. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,
  458. val, SRAM_START_READ_THRD_DP_ENC0_P0_MASK);
  459. }
  460. static void mtk_dp_setup_encoder(struct mtk_dp *mtk_dp)
  461. {
  462. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,
  463. VIDEO_MN_GEN_EN_DP_ENC0_P0,
  464. VIDEO_MN_GEN_EN_DP_ENC0_P0);
  465. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3040,
  466. SDP_DOWN_CNT_DP_ENC0_P0_VAL,
  467. SDP_DOWN_CNT_INIT_DP_ENC0_P0_MASK);
  468. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3364,
  469. SDP_DOWN_CNT_IN_HBLANK_DP_ENC1_P0_VAL,
  470. SDP_DOWN_CNT_INIT_IN_HBLANK_DP_ENC1_P0_MASK);
  471. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3300,
  472. VIDEO_AFIFO_RDY_SEL_DP_ENC1_P0_VAL << 8,
  473. VIDEO_AFIFO_RDY_SEL_DP_ENC1_P0_MASK);
  474. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3364,
  475. FIFO_READ_START_POINT_DP_ENC1_P0_VAL << 12,
  476. FIFO_READ_START_POINT_DP_ENC1_P0_MASK);
  477. mtk_dp_write(mtk_dp, MTK_DP_ENC1_P0_3368, DP_ENC1_P0_3368_VAL);
  478. }
  479. static void mtk_dp_pg_enable(struct mtk_dp *mtk_dp, bool enable)
  480. {
  481. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3038,
  482. enable ? VIDEO_SOURCE_SEL_DP_ENC0_P0_MASK : 0,
  483. VIDEO_SOURCE_SEL_DP_ENC0_P0_MASK);
  484. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_31B0,
  485. PGEN_PATTERN_SEL_VAL << 4, PGEN_PATTERN_SEL_MASK);
  486. }
  487. static void mtk_dp_audio_setup_channels(struct mtk_dp *mtk_dp,
  488. struct mtk_dp_audio_cfg *cfg)
  489. {
  490. u32 channel_enable_bits;
  491. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3324,
  492. AUDIO_SOURCE_MUX_DP_ENC1_P0_DPRX,
  493. AUDIO_SOURCE_MUX_DP_ENC1_P0_MASK);
  494. /* audio channel count change reset */
  495. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_33F4,
  496. DP_ENC_DUMMY_RW_1, DP_ENC_DUMMY_RW_1);
  497. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3304,
  498. AU_PRTY_REGEN_DP_ENC1_P0_MASK |
  499. AU_CH_STS_REGEN_DP_ENC1_P0_MASK |
  500. AUDIO_SAMPLE_PRSENT_REGEN_DP_ENC1_P0_MASK,
  501. AU_PRTY_REGEN_DP_ENC1_P0_MASK |
  502. AU_CH_STS_REGEN_DP_ENC1_P0_MASK |
  503. AUDIO_SAMPLE_PRSENT_REGEN_DP_ENC1_P0_MASK);
  504. switch (cfg->channels) {
  505. case 2:
  506. channel_enable_bits = AUDIO_2CH_SEL_DP_ENC0_P0_MASK |
  507. AUDIO_2CH_EN_DP_ENC0_P0_MASK;
  508. break;
  509. case 8:
  510. default:
  511. channel_enable_bits = AUDIO_8CH_SEL_DP_ENC0_P0_MASK |
  512. AUDIO_8CH_EN_DP_ENC0_P0_MASK;
  513. break;
  514. }
  515. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3088,
  516. channel_enable_bits | AU_EN_DP_ENC0_P0,
  517. AUDIO_2CH_SEL_DP_ENC0_P0_MASK |
  518. AUDIO_2CH_EN_DP_ENC0_P0_MASK |
  519. AUDIO_8CH_SEL_DP_ENC0_P0_MASK |
  520. AUDIO_8CH_EN_DP_ENC0_P0_MASK |
  521. AU_EN_DP_ENC0_P0);
  522. /* audio channel count change reset */
  523. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_33F4, 0, DP_ENC_DUMMY_RW_1);
  524. /* enable audio reset */
  525. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_33F4,
  526. DP_ENC_DUMMY_RW_1_AUDIO_RST_EN,
  527. DP_ENC_DUMMY_RW_1_AUDIO_RST_EN);
  528. }
  529. static void mtk_dp_audio_channel_status_set(struct mtk_dp *mtk_dp,
  530. struct mtk_dp_audio_cfg *cfg)
  531. {
  532. struct snd_aes_iec958 iec = { 0 };
  533. switch (cfg->sample_rate) {
  534. case 32000:
  535. iec.status[3] = IEC958_AES3_CON_FS_32000;
  536. break;
  537. case 44100:
  538. iec.status[3] = IEC958_AES3_CON_FS_44100;
  539. break;
  540. case 48000:
  541. iec.status[3] = IEC958_AES3_CON_FS_48000;
  542. break;
  543. case 88200:
  544. iec.status[3] = IEC958_AES3_CON_FS_88200;
  545. break;
  546. case 96000:
  547. iec.status[3] = IEC958_AES3_CON_FS_96000;
  548. break;
  549. case 192000:
  550. iec.status[3] = IEC958_AES3_CON_FS_192000;
  551. break;
  552. default:
  553. iec.status[3] = IEC958_AES3_CON_FS_NOTID;
  554. break;
  555. }
  556. switch (cfg->word_length_bits) {
  557. case 16:
  558. iec.status[4] = IEC958_AES4_CON_WORDLEN_20_16;
  559. break;
  560. case 20:
  561. iec.status[4] = IEC958_AES4_CON_WORDLEN_20_16 |
  562. IEC958_AES4_CON_MAX_WORDLEN_24;
  563. break;
  564. case 24:
  565. iec.status[4] = IEC958_AES4_CON_WORDLEN_24_20 |
  566. IEC958_AES4_CON_MAX_WORDLEN_24;
  567. break;
  568. default:
  569. iec.status[4] = IEC958_AES4_CON_WORDLEN_NOTID;
  570. }
  571. /* IEC 60958 consumer channel status bits */
  572. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_308C,
  573. 0, CH_STATUS_0_DP_ENC0_P0_MASK);
  574. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3090,
  575. iec.status[3] << 8, CH_STATUS_1_DP_ENC0_P0_MASK);
  576. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3094,
  577. iec.status[4], CH_STATUS_2_DP_ENC0_P0_MASK);
  578. }
  579. static void mtk_dp_audio_sdp_asp_set_channels(struct mtk_dp *mtk_dp,
  580. int channels)
  581. {
  582. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_312C,
  583. (min(8, channels) - 1) << 8,
  584. ASP_HB2_DP_ENC0_P0_MASK | ASP_HB3_DP_ENC0_P0_MASK);
  585. }
  586. static void mtk_dp_audio_set_divider(struct mtk_dp *mtk_dp)
  587. {
  588. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_30BC,
  589. AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,
  590. AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_MASK);
  591. }
  592. static void mtk_dp_sdp_trigger_aui(struct mtk_dp *mtk_dp)
  593. {
  594. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3280,
  595. MTK_DP_SDP_AUI, SDP_PACKET_TYPE_DP_ENC1_P0_MASK);
  596. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3280,
  597. SDP_PACKET_W_DP_ENC1_P0, SDP_PACKET_W_DP_ENC1_P0);
  598. }
  599. static void mtk_dp_sdp_set_data(struct mtk_dp *mtk_dp, u8 *data_bytes)
  600. {
  601. mtk_dp_bulk_16bit_write(mtk_dp, MTK_DP_ENC1_P0_3200,
  602. data_bytes, 0x10);
  603. }
  604. static void mtk_dp_sdp_set_header_aui(struct mtk_dp *mtk_dp,
  605. struct dp_sdp_header *header)
  606. {
  607. u32 db_addr = MTK_DP_ENC0_P0_30D8 + (MTK_DP_SDP_AUI - 1) * 8;
  608. mtk_dp_bulk_16bit_write(mtk_dp, db_addr, (u8 *)header, 4);
  609. }
  610. static void mtk_dp_disable_sdp_aui(struct mtk_dp *mtk_dp)
  611. {
  612. /* Disable periodic send */
  613. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_30A8 & 0xfffc, 0,
  614. 0xff << ((MTK_DP_ENC0_P0_30A8 & 3) * 8));
  615. }
  616. static void mtk_dp_setup_sdp_aui(struct mtk_dp *mtk_dp,
  617. struct dp_sdp *sdp)
  618. {
  619. u32 shift;
  620. mtk_dp_sdp_set_data(mtk_dp, sdp->db);
  621. mtk_dp_sdp_set_header_aui(mtk_dp, &sdp->sdp_header);
  622. mtk_dp_disable_sdp_aui(mtk_dp);
  623. shift = (MTK_DP_ENC0_P0_30A8 & 3) * 8;
  624. mtk_dp_sdp_trigger_aui(mtk_dp);
  625. /* Enable periodic sending */
  626. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_30A8 & 0xfffc,
  627. 0x05 << shift, 0xff << shift);
  628. }
  629. static void mtk_dp_aux_irq_clear(struct mtk_dp *mtk_dp)
  630. {
  631. mtk_dp_write(mtk_dp, MTK_DP_AUX_P0_3640, DP_AUX_P0_3640_VAL);
  632. }
  633. static void mtk_dp_aux_set_cmd(struct mtk_dp *mtk_dp, u8 cmd, u32 addr)
  634. {
  635. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3644,
  636. cmd, MCU_REQUEST_COMMAND_AUX_TX_P0_MASK);
  637. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3648,
  638. addr, MCU_REQUEST_ADDRESS_LSB_AUX_TX_P0_MASK);
  639. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_364C,
  640. addr >> 16, MCU_REQUEST_ADDRESS_MSB_AUX_TX_P0_MASK);
  641. }
  642. static void mtk_dp_aux_clear_fifo(struct mtk_dp *mtk_dp)
  643. {
  644. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3650,
  645. MCU_ACK_TRAN_COMPLETE_AUX_TX_P0,
  646. MCU_ACK_TRAN_COMPLETE_AUX_TX_P0 |
  647. PHY_FIFO_RST_AUX_TX_P0_MASK |
  648. MCU_REQ_DATA_NUM_AUX_TX_P0_MASK);
  649. }
  650. static void mtk_dp_aux_request_ready(struct mtk_dp *mtk_dp)
  651. {
  652. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3630,
  653. AUX_TX_REQUEST_READY_AUX_TX_P0,
  654. AUX_TX_REQUEST_READY_AUX_TX_P0);
  655. }
  656. static void mtk_dp_aux_fill_write_fifo(struct mtk_dp *mtk_dp, u8 *buf,
  657. size_t length)
  658. {
  659. mtk_dp_bulk_16bit_write(mtk_dp, MTK_DP_AUX_P0_3708, buf, length);
  660. }
  661. static void mtk_dp_aux_read_rx_fifo(struct mtk_dp *mtk_dp, u8 *buf,
  662. size_t length, int read_delay)
  663. {
  664. int read_pos;
  665. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3620,
  666. 0, AUX_RD_MODE_AUX_TX_P0_MASK);
  667. for (read_pos = 0; read_pos < length; read_pos++) {
  668. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3620,
  669. AUX_RX_FIFO_READ_PULSE_TX_P0,
  670. AUX_RX_FIFO_READ_PULSE_TX_P0);
  671. /* Hardware needs time to update the data */
  672. usleep_range(read_delay, read_delay * 2);
  673. buf[read_pos] = (u8)(mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3620) &
  674. AUX_RX_FIFO_READ_DATA_AUX_TX_P0_MASK);
  675. }
  676. }
  677. static void mtk_dp_aux_set_length(struct mtk_dp *mtk_dp, size_t length)
  678. {
  679. if (length > 0) {
  680. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3650,
  681. (length - 1) << 12,
  682. MCU_REQ_DATA_NUM_AUX_TX_P0_MASK);
  683. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_362C,
  684. 0,
  685. AUX_NO_LENGTH_AUX_TX_P0 |
  686. AUX_TX_AUXTX_OV_EN_AUX_TX_P0_MASK |
  687. AUX_RESERVED_RW_0_AUX_TX_P0_MASK);
  688. } else {
  689. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_362C,
  690. AUX_NO_LENGTH_AUX_TX_P0,
  691. AUX_NO_LENGTH_AUX_TX_P0 |
  692. AUX_TX_AUXTX_OV_EN_AUX_TX_P0_MASK |
  693. AUX_RESERVED_RW_0_AUX_TX_P0_MASK);
  694. }
  695. }
  696. static int mtk_dp_aux_wait_for_completion(struct mtk_dp *mtk_dp, bool is_read)
  697. {
  698. int wait_reply = MTK_DP_AUX_WAIT_REPLY_COUNT;
  699. while (--wait_reply) {
  700. u32 aux_irq_status;
  701. if (is_read) {
  702. u32 fifo_status = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3618);
  703. if (fifo_status &
  704. (AUX_RX_FIFO_WRITE_POINTER_AUX_TX_P0_MASK |
  705. AUX_RX_FIFO_FULL_AUX_TX_P0_MASK)) {
  706. return 0;
  707. }
  708. }
  709. aux_irq_status = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3640);
  710. if (aux_irq_status & AUX_RX_AUX_RECV_COMPLETE_IRQ_AUX_TX_P0)
  711. return 0;
  712. if (aux_irq_status & AUX_400US_TIMEOUT_IRQ_AUX_TX_P0)
  713. return -ETIMEDOUT;
  714. /* Give the hardware a chance to reach completion before retrying */
  715. usleep_range(100, 500);
  716. }
  717. return -ETIMEDOUT;
  718. }
  719. static int mtk_dp_aux_do_transfer(struct mtk_dp *mtk_dp, bool is_read, u8 cmd,
  720. u32 addr, u8 *buf, size_t length, u8 *reply_cmd)
  721. {
  722. int ret;
  723. if (is_read && (length > DP_AUX_MAX_PAYLOAD_BYTES ||
  724. (cmd == DP_AUX_NATIVE_READ && !length)))
  725. return -EINVAL;
  726. if (!is_read)
  727. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3704,
  728. AUX_TX_FIFO_NEW_MODE_EN_AUX_TX_P0,
  729. AUX_TX_FIFO_NEW_MODE_EN_AUX_TX_P0);
  730. /* We need to clear fifo and irq before sending commands to the sink device. */
  731. mtk_dp_aux_clear_fifo(mtk_dp);
  732. mtk_dp_aux_irq_clear(mtk_dp);
  733. mtk_dp_aux_set_cmd(mtk_dp, cmd, addr);
  734. mtk_dp_aux_set_length(mtk_dp, length);
  735. if (!is_read) {
  736. if (length)
  737. mtk_dp_aux_fill_write_fifo(mtk_dp, buf, length);
  738. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3704,
  739. AUX_TX_FIFO_WDATA_NEW_MODE_T_AUX_TX_P0_MASK,
  740. AUX_TX_FIFO_WDATA_NEW_MODE_T_AUX_TX_P0_MASK);
  741. }
  742. mtk_dp_aux_request_ready(mtk_dp);
  743. /* Wait for feedback from sink device. */
  744. ret = mtk_dp_aux_wait_for_completion(mtk_dp, is_read);
  745. *reply_cmd = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3624) &
  746. AUX_RX_REPLY_COMMAND_AUX_TX_P0_MASK;
  747. if (ret) {
  748. u32 phy_status = mtk_dp_read(mtk_dp, MTK_DP_AUX_P0_3628) &
  749. AUX_RX_PHY_STATE_AUX_TX_P0_MASK;
  750. if (phy_status != AUX_RX_PHY_STATE_AUX_TX_P0_RX_IDLE) {
  751. dev_err(mtk_dp->dev,
  752. "AUX Rx Aux hang, need SW reset\n");
  753. return -EIO;
  754. }
  755. return -ETIMEDOUT;
  756. }
  757. if (!length) {
  758. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_362C,
  759. 0,
  760. AUX_NO_LENGTH_AUX_TX_P0 |
  761. AUX_TX_AUXTX_OV_EN_AUX_TX_P0_MASK |
  762. AUX_RESERVED_RW_0_AUX_TX_P0_MASK);
  763. } else if (is_read) {
  764. int read_delay;
  765. if (cmd == (DP_AUX_I2C_READ | DP_AUX_I2C_MOT) ||
  766. cmd == DP_AUX_I2C_READ)
  767. read_delay = 500;
  768. else
  769. read_delay = 100;
  770. mtk_dp_aux_read_rx_fifo(mtk_dp, buf, length, read_delay);
  771. }
  772. return 0;
  773. }
  774. static void mtk_dp_set_swing_pre_emphasis(struct mtk_dp *mtk_dp, int lane_num,
  775. int swing_val, int preemphasis)
  776. {
  777. u32 lane_shift = lane_num * DP_TX1_VOLT_SWING_SHIFT;
  778. dev_dbg(mtk_dp->dev,
  779. "link training: swing_val = 0x%x, pre-emphasis = 0x%x\n",
  780. swing_val, preemphasis);
  781. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_SWING_EMP,
  782. swing_val << (DP_TX0_VOLT_SWING_SHIFT + lane_shift),
  783. DP_TX0_VOLT_SWING_MASK << lane_shift);
  784. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_SWING_EMP,
  785. preemphasis << (DP_TX0_PRE_EMPH_SHIFT + lane_shift),
  786. DP_TX0_PRE_EMPH_MASK << lane_shift);
  787. }
  788. static void mtk_dp_reset_swing_pre_emphasis(struct mtk_dp *mtk_dp)
  789. {
  790. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_SWING_EMP,
  791. 0,
  792. DP_TX0_VOLT_SWING_MASK |
  793. DP_TX1_VOLT_SWING_MASK |
  794. DP_TX2_VOLT_SWING_MASK |
  795. DP_TX3_VOLT_SWING_MASK |
  796. DP_TX0_PRE_EMPH_MASK |
  797. DP_TX1_PRE_EMPH_MASK |
  798. DP_TX2_PRE_EMPH_MASK |
  799. DP_TX3_PRE_EMPH_MASK);
  800. }
  801. static u32 mtk_dp_swirq_get_clear(struct mtk_dp *mtk_dp)
  802. {
  803. u32 irq_status = mtk_dp_read(mtk_dp, MTK_DP_TRANS_P0_35D0) &
  804. SW_IRQ_FINAL_STATUS_DP_TRANS_P0_MASK;
  805. if (irq_status) {
  806. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35C8,
  807. irq_status, SW_IRQ_CLR_DP_TRANS_P0_MASK);
  808. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35C8,
  809. 0, SW_IRQ_CLR_DP_TRANS_P0_MASK);
  810. }
  811. return irq_status;
  812. }
  813. static u32 mtk_dp_hwirq_get_clear(struct mtk_dp *mtk_dp)
  814. {
  815. u32 irq_status = (mtk_dp_read(mtk_dp, MTK_DP_TRANS_P0_3418) &
  816. IRQ_STATUS_DP_TRANS_P0_MASK) >> 12;
  817. if (irq_status) {
  818. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3418,
  819. irq_status, IRQ_CLR_DP_TRANS_P0_MASK);
  820. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3418,
  821. 0, IRQ_CLR_DP_TRANS_P0_MASK);
  822. }
  823. return irq_status;
  824. }
  825. static void mtk_dp_hwirq_enable(struct mtk_dp *mtk_dp, bool enable)
  826. {
  827. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3418,
  828. enable ? 0 :
  829. IRQ_MASK_DP_TRANS_P0_DISC_IRQ |
  830. IRQ_MASK_DP_TRANS_P0_CONN_IRQ |
  831. IRQ_MASK_DP_TRANS_P0_INT_IRQ,
  832. IRQ_MASK_DP_TRANS_P0_MASK);
  833. }
  834. static void mtk_dp_initialize_settings(struct mtk_dp *mtk_dp)
  835. {
  836. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_342C,
  837. XTAL_FREQ_DP_TRANS_P0_DEFAULT,
  838. XTAL_FREQ_DP_TRANS_P0_MASK);
  839. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3540,
  840. FEC_CLOCK_EN_MODE_DP_TRANS_P0,
  841. FEC_CLOCK_EN_MODE_DP_TRANS_P0);
  842. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_31EC,
  843. AUDIO_CH_SRC_SEL_DP_ENC0_P0,
  844. AUDIO_CH_SRC_SEL_DP_ENC0_P0);
  845. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_304C,
  846. 0, SDP_VSYNC_RISING_MASK_DP_ENC0_P0_MASK);
  847. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_IRQ_MASK,
  848. IRQ_MASK_AUX_TOP_IRQ, IRQ_MASK_AUX_TOP_IRQ);
  849. }
  850. static void mtk_dp_initialize_hpd_detect_settings(struct mtk_dp *mtk_dp)
  851. {
  852. u32 val;
  853. /* Debounce threshold */
  854. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3410,
  855. 8, HPD_DEB_THD_DP_TRANS_P0_MASK);
  856. val = (HPD_INT_THD_DP_TRANS_P0_LOWER_500US |
  857. HPD_INT_THD_DP_TRANS_P0_UPPER_1100US) << 4;
  858. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3410,
  859. val, HPD_INT_THD_DP_TRANS_P0_MASK);
  860. /*
  861. * Connect threshold 1.5ms + 5 x 0.1ms = 2ms
  862. * Disconnect threshold 1.5ms + 5 x 0.1ms = 2ms
  863. */
  864. val = (5 << 8) | (5 << 12);
  865. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3410,
  866. val,
  867. HPD_DISC_THD_DP_TRANS_P0_MASK |
  868. HPD_CONN_THD_DP_TRANS_P0_MASK);
  869. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3430,
  870. HPD_INT_THD_ECO_DP_TRANS_P0_HIGH_BOUND_EXT,
  871. HPD_INT_THD_ECO_DP_TRANS_P0_MASK);
  872. }
  873. static void mtk_dp_initialize_aux_settings(struct mtk_dp *mtk_dp)
  874. {
  875. /* modify timeout threshold = 0x1595 */
  876. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_360C,
  877. AUX_TIMEOUT_THR_AUX_TX_P0_VAL,
  878. AUX_TIMEOUT_THR_AUX_TX_P0_MASK);
  879. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3658,
  880. 0, AUX_TX_OV_EN_AUX_TX_P0_MASK);
  881. /* 25 for 26M */
  882. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3634,
  883. AUX_TX_OVER_SAMPLE_RATE_FOR_26M << 8,
  884. AUX_TX_OVER_SAMPLE_RATE_AUX_TX_P0_MASK);
  885. /* 13 for 26M */
  886. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3614,
  887. AUX_RX_UI_CNT_THR_AUX_FOR_26M,
  888. AUX_RX_UI_CNT_THR_AUX_TX_P0_MASK);
  889. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_37C8,
  890. MTK_ATOP_EN_AUX_TX_P0,
  891. MTK_ATOP_EN_AUX_TX_P0);
  892. }
  893. static void mtk_dp_initialize_digital_settings(struct mtk_dp *mtk_dp)
  894. {
  895. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_304C,
  896. 0, VBID_VIDEO_MUTE_DP_ENC0_P0_MASK);
  897. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3368,
  898. BS2BS_MODE_DP_ENC1_P0_VAL << 12,
  899. BS2BS_MODE_DP_ENC1_P0_MASK);
  900. /* dp tx encoder reset all sw */
  901. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
  902. DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0,
  903. DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0);
  904. /* Wait for sw reset to complete */
  905. usleep_range(1000, 5000);
  906. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
  907. 0, DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0);
  908. }
  909. static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
  910. {
  911. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_340C,
  912. DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0,
  913. DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
  914. /* Wait for sw reset to complete */
  915. usleep_range(1000, 5000);
  916. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_340C,
  917. 0, DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
  918. }
  919. static void mtk_dp_set_lanes(struct mtk_dp *mtk_dp, int lanes)
  920. {
  921. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35F0,
  922. lanes == 0 ? 0 : DP_TRANS_DUMMY_RW_0,
  923. DP_TRANS_DUMMY_RW_0_MASK);
  924. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3000,
  925. lanes, LANE_NUM_DP_ENC0_P0_MASK);
  926. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_34A4,
  927. lanes << 2, LANE_NUM_DP_TRANS_P0_MASK);
  928. }
  929. static void mtk_dp_get_calibration_data(struct mtk_dp *mtk_dp)
  930. {
  931. const struct mtk_dp_efuse_fmt *fmt;
  932. struct device *dev = mtk_dp->dev;
  933. struct nvmem_cell *cell;
  934. u32 *cal_data = mtk_dp->cal_data;
  935. u32 *buf;
  936. int i;
  937. size_t len;
  938. cell = nvmem_cell_get(dev, "dp_calibration_data");
  939. if (IS_ERR(cell)) {
  940. dev_warn(dev, "Failed to get nvmem cell dp_calibration_data\n");
  941. goto use_default_val;
  942. }
  943. buf = (u32 *)nvmem_cell_read(cell, &len);
  944. nvmem_cell_put(cell);
  945. if (IS_ERR(buf) || ((len / sizeof(u32)) != 4)) {
  946. dev_warn(dev, "Failed to read nvmem_cell_read\n");
  947. if (!IS_ERR(buf))
  948. kfree(buf);
  949. goto use_default_val;
  950. }
  951. for (i = 0; i < MTK_DP_CAL_MAX; i++) {
  952. fmt = &mtk_dp->data->efuse_fmt[i];
  953. cal_data[i] = (buf[fmt->idx] >> fmt->shift) & fmt->mask;
  954. if (cal_data[i] < fmt->min_val || cal_data[i] > fmt->max_val) {
  955. dev_warn(mtk_dp->dev, "Invalid efuse data, idx = %d\n", i);
  956. kfree(buf);
  957. goto use_default_val;
  958. }
  959. }
  960. kfree(buf);
  961. return;
  962. use_default_val:
  963. dev_warn(mtk_dp->dev, "Use default calibration data\n");
  964. for (i = 0; i < MTK_DP_CAL_MAX; i++)
  965. cal_data[i] = mtk_dp->data->efuse_fmt[i].default_val;
  966. }
  967. static void mtk_dp_set_calibration_data(struct mtk_dp *mtk_dp)
  968. {
  969. u32 *cal_data = mtk_dp->cal_data;
  970. mtk_dp_update_bits(mtk_dp, DP_PHY_GLB_DPAUX_TX,
  971. cal_data[MTK_DP_CAL_CLKTX_IMPSE] << 20,
  972. RG_CKM_PT0_CKTX_IMPSEL);
  973. mtk_dp_update_bits(mtk_dp, DP_PHY_GLB_BIAS_GEN_00,
  974. cal_data[MTK_DP_CAL_GLB_BIAS_TRIM] << 16,
  975. RG_XTP_GLB_BIAS_INTR_CTRL);
  976. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_0,
  977. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] << 12,
  978. RG_XTP_LN0_TX_IMPSEL_PMOS);
  979. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_0,
  980. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] << 16,
  981. RG_XTP_LN0_TX_IMPSEL_NMOS);
  982. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_1,
  983. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] << 12,
  984. RG_XTP_LN1_TX_IMPSEL_PMOS);
  985. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_1,
  986. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] << 16,
  987. RG_XTP_LN1_TX_IMPSEL_NMOS);
  988. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_2,
  989. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] << 12,
  990. RG_XTP_LN2_TX_IMPSEL_PMOS);
  991. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_2,
  992. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] << 16,
  993. RG_XTP_LN2_TX_IMPSEL_NMOS);
  994. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_3,
  995. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] << 12,
  996. RG_XTP_LN3_TX_IMPSEL_PMOS);
  997. mtk_dp_update_bits(mtk_dp, DP_PHY_LANE_TX_3,
  998. cal_data[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] << 16,
  999. RG_XTP_LN3_TX_IMPSEL_NMOS);
  1000. }
  1001. static int mtk_dp_phy_configure(struct mtk_dp *mtk_dp,
  1002. u32 link_rate, int lane_count)
  1003. {
  1004. int ret;
  1005. union phy_configure_opts phy_opts = {
  1006. .dp = {
  1007. .link_rate = drm_dp_bw_code_to_link_rate(link_rate) / 100,
  1008. .set_rate = 1,
  1009. .lanes = lane_count,
  1010. .set_lanes = 1,
  1011. .ssc = mtk_dp->train_info.sink_ssc,
  1012. }
  1013. };
  1014. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE, DP_PWR_STATE_BANDGAP,
  1015. DP_PWR_STATE_MASK);
  1016. ret = phy_configure(mtk_dp->phy, &phy_opts);
  1017. if (ret)
  1018. return ret;
  1019. mtk_dp_set_calibration_data(mtk_dp);
  1020. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1021. DP_PWR_STATE_BANDGAP_TPLL_LANE, DP_PWR_STATE_MASK);
  1022. return 0;
  1023. }
  1024. static void mtk_dp_set_idle_pattern(struct mtk_dp *mtk_dp, bool enable)
  1025. {
  1026. u32 val = POST_MISC_DATA_LANE0_OV_DP_TRANS_P0_MASK |
  1027. POST_MISC_DATA_LANE1_OV_DP_TRANS_P0_MASK |
  1028. POST_MISC_DATA_LANE2_OV_DP_TRANS_P0_MASK |
  1029. POST_MISC_DATA_LANE3_OV_DP_TRANS_P0_MASK;
  1030. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3580,
  1031. enable ? val : 0, val);
  1032. }
  1033. static void mtk_dp_train_set_pattern(struct mtk_dp *mtk_dp, int pattern)
  1034. {
  1035. /* TPS1 */
  1036. if (pattern == 1)
  1037. mtk_dp_set_idle_pattern(mtk_dp, false);
  1038. mtk_dp_update_bits(mtk_dp,
  1039. MTK_DP_TRANS_P0_3400,
  1040. pattern ? BIT(pattern - 1) << 12 : 0,
  1041. PATTERN1_EN_DP_TRANS_P0_MASK |
  1042. PATTERN2_EN_DP_TRANS_P0_MASK |
  1043. PATTERN3_EN_DP_TRANS_P0_MASK |
  1044. PATTERN4_EN_DP_TRANS_P0_MASK);
  1045. }
  1046. static void mtk_dp_set_enhanced_frame_mode(struct mtk_dp *mtk_dp)
  1047. {
  1048. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3000,
  1049. ENHANCED_FRAME_EN_DP_ENC0_P0,
  1050. ENHANCED_FRAME_EN_DP_ENC0_P0);
  1051. }
  1052. static void mtk_dp_training_set_scramble(struct mtk_dp *mtk_dp, bool enable)
  1053. {
  1054. mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_3404,
  1055. enable ? DP_SCR_EN_DP_TRANS_P0_MASK : 0,
  1056. DP_SCR_EN_DP_TRANS_P0_MASK);
  1057. }
  1058. static void mtk_dp_video_mute(struct mtk_dp *mtk_dp, bool enable)
  1059. {
  1060. struct arm_smccc_res res;
  1061. u32 val = VIDEO_MUTE_SEL_DP_ENC0_P0 |
  1062. (enable ? VIDEO_MUTE_SW_DP_ENC0_P0 : 0);
  1063. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3000,
  1064. val,
  1065. VIDEO_MUTE_SEL_DP_ENC0_P0 |
  1066. VIDEO_MUTE_SW_DP_ENC0_P0);
  1067. arm_smccc_smc(MTK_DP_SIP_CONTROL_AARCH32,
  1068. mtk_dp->data->smc_cmd, enable,
  1069. 0, 0, 0, 0, 0, &res);
  1070. dev_dbg(mtk_dp->dev, "smc cmd: 0x%x, p1: %s, ret: 0x%lx-0x%lx\n",
  1071. mtk_dp->data->smc_cmd, enable ? "enable" : "disable", res.a0, res.a1);
  1072. }
  1073. static void mtk_dp_audio_mute(struct mtk_dp *mtk_dp, bool mute)
  1074. {
  1075. u32 val[3];
  1076. if (mute) {
  1077. val[0] = VBID_AUDIO_MUTE_FLAG_SW_DP_ENC0_P0 |
  1078. VBID_AUDIO_MUTE_FLAG_SEL_DP_ENC0_P0;
  1079. val[1] = 0;
  1080. val[2] = 0;
  1081. } else {
  1082. val[0] = 0;
  1083. val[1] = AU_EN_DP_ENC0_P0;
  1084. /* Send one every two frames */
  1085. val[2] = 0x0F;
  1086. }
  1087. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3030,
  1088. val[0],
  1089. VBID_AUDIO_MUTE_FLAG_SW_DP_ENC0_P0 |
  1090. VBID_AUDIO_MUTE_FLAG_SEL_DP_ENC0_P0);
  1091. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3088,
  1092. val[1], AU_EN_DP_ENC0_P0);
  1093. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_30A4,
  1094. val[2], AU_TS_CFG_DP_ENC0_P0_MASK);
  1095. }
  1096. static void mtk_dp_power_enable(struct mtk_dp *mtk_dp)
  1097. {
  1098. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_RESET_AND_PROBE,
  1099. 0, SW_RST_B_PHYD);
  1100. /* Wait for power enable */
  1101. usleep_range(10, 200);
  1102. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_RESET_AND_PROBE,
  1103. SW_RST_B_PHYD, SW_RST_B_PHYD);
  1104. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1105. DP_PWR_STATE_BANDGAP_TPLL, DP_PWR_STATE_MASK);
  1106. mtk_dp_write(mtk_dp, MTK_DP_1040,
  1107. RG_DPAUX_RX_VALID_DEGLITCH_EN | RG_XTP_GLB_CKDET_EN |
  1108. RG_DPAUX_RX_EN);
  1109. mtk_dp_update_bits(mtk_dp, MTK_DP_0034, 0, DA_CKM_CKTX0_EN_FORCE_EN);
  1110. }
  1111. static void mtk_dp_power_disable(struct mtk_dp *mtk_dp)
  1112. {
  1113. mtk_dp_write(mtk_dp, MTK_DP_TOP_PWR_STATE, 0);
  1114. mtk_dp_update_bits(mtk_dp, MTK_DP_0034,
  1115. DA_CKM_CKTX0_EN_FORCE_EN, DA_CKM_CKTX0_EN_FORCE_EN);
  1116. /* Disable RX */
  1117. mtk_dp_write(mtk_dp, MTK_DP_1040, 0);
  1118. mtk_dp_write(mtk_dp, MTK_DP_TOP_MEM_PD,
  1119. 0x550 | FUSE_SEL | MEM_ISO_EN);
  1120. }
  1121. static void mtk_dp_initialize_priv_data(struct mtk_dp *mtk_dp)
  1122. {
  1123. mtk_dp->train_info.link_rate = DP_LINK_BW_5_4;
  1124. mtk_dp->train_info.lane_count = mtk_dp->max_lanes;
  1125. mtk_dp->train_info.cable_plugged_in = false;
  1126. mtk_dp->info.format = DP_PIXELFORMAT_RGB;
  1127. memset(&mtk_dp->info.vm, 0, sizeof(struct videomode));
  1128. mtk_dp->audio_enable = false;
  1129. }
  1130. static void mtk_dp_sdp_set_down_cnt_init(struct mtk_dp *mtk_dp,
  1131. u32 sram_read_start)
  1132. {
  1133. u32 sdp_down_cnt_init = 0;
  1134. struct drm_display_mode mode;
  1135. struct videomode *vm = &mtk_dp->info.vm;
  1136. drm_display_mode_from_videomode(vm, &mode);
  1137. if (mode.clock > 0)
  1138. sdp_down_cnt_init = sram_read_start *
  1139. mtk_dp->train_info.link_rate * 2700 * 8 /
  1140. (mode.clock * 4);
  1141. switch (mtk_dp->train_info.lane_count) {
  1142. case 1:
  1143. sdp_down_cnt_init = max_t(u32, sdp_down_cnt_init, 0x1A);
  1144. break;
  1145. case 2:
  1146. /* case for LowResolution && High Audio Sample Rate */
  1147. sdp_down_cnt_init = max_t(u32, sdp_down_cnt_init, 0x10);
  1148. sdp_down_cnt_init += mode.vtotal <= 525 ? 4 : 0;
  1149. break;
  1150. case 4:
  1151. default:
  1152. sdp_down_cnt_init = max_t(u32, sdp_down_cnt_init, 6);
  1153. break;
  1154. }
  1155. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3040,
  1156. sdp_down_cnt_init,
  1157. SDP_DOWN_CNT_INIT_DP_ENC0_P0_MASK);
  1158. }
  1159. static void mtk_dp_sdp_set_down_cnt_init_in_hblank(struct mtk_dp *mtk_dp)
  1160. {
  1161. int pix_clk_mhz;
  1162. u32 dc_offset;
  1163. u32 spd_down_cnt_init = 0;
  1164. struct drm_display_mode mode;
  1165. struct videomode *vm = &mtk_dp->info.vm;
  1166. drm_display_mode_from_videomode(vm, &mode);
  1167. pix_clk_mhz = mtk_dp->info.format == DP_PIXELFORMAT_YUV420 ?
  1168. mode.clock / 2000 : mode.clock / 1000;
  1169. switch (mtk_dp->train_info.lane_count) {
  1170. case 1:
  1171. spd_down_cnt_init = 0x20;
  1172. break;
  1173. case 2:
  1174. dc_offset = (mode.vtotal <= 525) ? 0x14 : 0x00;
  1175. spd_down_cnt_init = 0x18 + dc_offset;
  1176. break;
  1177. case 4:
  1178. default:
  1179. dc_offset = (mode.vtotal <= 525) ? 0x08 : 0x00;
  1180. if (pix_clk_mhz > mtk_dp->train_info.link_rate * 27)
  1181. spd_down_cnt_init = 0x8;
  1182. else
  1183. spd_down_cnt_init = 0x10 + dc_offset;
  1184. break;
  1185. }
  1186. mtk_dp_update_bits(mtk_dp, MTK_DP_ENC1_P0_3364, spd_down_cnt_init,
  1187. SDP_DOWN_CNT_INIT_IN_HBLANK_DP_ENC1_P0_MASK);
  1188. }
  1189. static void mtk_dp_setup_tu(struct mtk_dp *mtk_dp)
  1190. {
  1191. u32 sram_read_start = min_t(u32, MTK_DP_TBC_BUF_READ_START_ADDR,
  1192. mtk_dp->info.vm.hactive /
  1193. mtk_dp->train_info.lane_count /
  1194. MTK_DP_4P1T / MTK_DP_HDE /
  1195. MTK_DP_PIX_PER_ADDR);
  1196. mtk_dp_set_sram_read_start(mtk_dp, sram_read_start);
  1197. mtk_dp_setup_encoder(mtk_dp);
  1198. mtk_dp_sdp_set_down_cnt_init_in_hblank(mtk_dp);
  1199. mtk_dp_sdp_set_down_cnt_init(mtk_dp, sram_read_start);
  1200. }
  1201. static void mtk_dp_set_tx_out(struct mtk_dp *mtk_dp)
  1202. {
  1203. mtk_dp_setup_tu(mtk_dp);
  1204. }
  1205. static void mtk_dp_train_update_swing_pre(struct mtk_dp *mtk_dp, int lanes,
  1206. u8 dpcd_adjust_req[2])
  1207. {
  1208. int lane;
  1209. for (lane = 0; lane < lanes; ++lane) {
  1210. u8 val;
  1211. u8 swing;
  1212. u8 preemphasis;
  1213. int index = lane / 2;
  1214. int shift = lane % 2 ? DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : 0;
  1215. swing = (dpcd_adjust_req[index] >> shift) &
  1216. DP_ADJUST_VOLTAGE_SWING_LANE0_MASK;
  1217. preemphasis = ((dpcd_adjust_req[index] >> shift) &
  1218. DP_ADJUST_PRE_EMPHASIS_LANE0_MASK) >>
  1219. DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT;
  1220. val = swing << DP_TRAIN_VOLTAGE_SWING_SHIFT |
  1221. preemphasis << DP_TRAIN_PRE_EMPHASIS_SHIFT;
  1222. if (swing == DP_TRAIN_VOLTAGE_SWING_LEVEL_3)
  1223. val |= DP_TRAIN_MAX_SWING_REACHED;
  1224. if (preemphasis == 3)
  1225. val |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
  1226. mtk_dp_set_swing_pre_emphasis(mtk_dp, lane, swing, preemphasis);
  1227. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_TRAINING_LANE0_SET + lane,
  1228. val);
  1229. }
  1230. }
  1231. static void mtk_dp_pattern(struct mtk_dp *mtk_dp, bool is_tps1)
  1232. {
  1233. int pattern;
  1234. unsigned int aux_offset;
  1235. if (is_tps1) {
  1236. pattern = 1;
  1237. aux_offset = DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_1;
  1238. } else {
  1239. aux_offset = mtk_dp->train_info.channel_eq_pattern;
  1240. switch (mtk_dp->train_info.channel_eq_pattern) {
  1241. case DP_TRAINING_PATTERN_4:
  1242. pattern = 4;
  1243. break;
  1244. case DP_TRAINING_PATTERN_3:
  1245. pattern = 3;
  1246. aux_offset |= DP_LINK_SCRAMBLING_DISABLE;
  1247. break;
  1248. case DP_TRAINING_PATTERN_2:
  1249. default:
  1250. pattern = 2;
  1251. aux_offset |= DP_LINK_SCRAMBLING_DISABLE;
  1252. break;
  1253. }
  1254. }
  1255. mtk_dp_train_set_pattern(mtk_dp, pattern);
  1256. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_TRAINING_PATTERN_SET, aux_offset);
  1257. }
  1258. static int mtk_dp_train_setting(struct mtk_dp *mtk_dp, u8 target_link_rate,
  1259. u8 target_lane_count)
  1260. {
  1261. int ret;
  1262. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_LINK_BW_SET, target_link_rate);
  1263. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_LANE_COUNT_SET,
  1264. target_lane_count | DP_LANE_COUNT_ENHANCED_FRAME_EN);
  1265. if (mtk_dp->train_info.sink_ssc)
  1266. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_DOWNSPREAD_CTRL,
  1267. DP_SPREAD_AMP_0_5);
  1268. mtk_dp_set_lanes(mtk_dp, target_lane_count / 2);
  1269. ret = mtk_dp_phy_configure(mtk_dp, target_link_rate, target_lane_count);
  1270. if (ret)
  1271. return ret;
  1272. dev_dbg(mtk_dp->dev,
  1273. "Link train target_link_rate = 0x%x, target_lane_count = 0x%x\n",
  1274. target_link_rate, target_lane_count);
  1275. return 0;
  1276. }
  1277. static int mtk_dp_train_cr(struct mtk_dp *mtk_dp, u8 target_lane_count)
  1278. {
  1279. u8 lane_adjust[2] = {};
  1280. u8 link_status[DP_LINK_STATUS_SIZE] = {};
  1281. u8 prev_lane_adjust = 0xff;
  1282. int train_retries = 0;
  1283. int voltage_retries = 0;
  1284. mtk_dp_pattern(mtk_dp, true);
  1285. /* In DP spec 1.4, the retry count of CR is defined as 10. */
  1286. do {
  1287. train_retries++;
  1288. if (!mtk_dp->train_info.cable_plugged_in) {
  1289. mtk_dp_train_set_pattern(mtk_dp, 0);
  1290. return -ENODEV;
  1291. }
  1292. drm_dp_dpcd_read(&mtk_dp->aux, DP_ADJUST_REQUEST_LANE0_1,
  1293. lane_adjust, sizeof(lane_adjust));
  1294. mtk_dp_train_update_swing_pre(mtk_dp, target_lane_count,
  1295. lane_adjust);
  1296. drm_dp_link_train_clock_recovery_delay(&mtk_dp->aux,
  1297. mtk_dp->rx_cap);
  1298. /* check link status from sink device */
  1299. drm_dp_dpcd_read_link_status(&mtk_dp->aux, link_status);
  1300. if (drm_dp_clock_recovery_ok(link_status,
  1301. target_lane_count)) {
  1302. dev_dbg(mtk_dp->dev, "Link train CR pass\n");
  1303. return 0;
  1304. }
  1305. /*
  1306. * In DP spec 1.4, if current voltage level is the same
  1307. * with previous voltage level, we need to retry 5 times.
  1308. */
  1309. if (prev_lane_adjust == link_status[4]) {
  1310. voltage_retries++;
  1311. /*
  1312. * Condition of CR fail:
  1313. * 1. Failed to pass CR using the same voltage
  1314. * level over five times.
  1315. * 2. Failed to pass CR when the current voltage
  1316. * level is the same with previous voltage
  1317. * level and reach max voltage level (3).
  1318. */
  1319. if (voltage_retries > MTK_DP_TRAIN_VOLTAGE_LEVEL_RETRY ||
  1320. (prev_lane_adjust & DP_ADJUST_VOLTAGE_SWING_LANE0_MASK) == 3) {
  1321. dev_dbg(mtk_dp->dev, "Link train CR fail\n");
  1322. break;
  1323. }
  1324. } else {
  1325. /*
  1326. * If the voltage level is changed, we need to
  1327. * re-calculate this retry count.
  1328. */
  1329. voltage_retries = 0;
  1330. }
  1331. prev_lane_adjust = link_status[4];
  1332. } while (train_retries < MTK_DP_TRAIN_DOWNSCALE_RETRY);
  1333. /* Failed to train CR, and disable pattern. */
  1334. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_TRAINING_PATTERN_SET,
  1335. DP_TRAINING_PATTERN_DISABLE);
  1336. mtk_dp_train_set_pattern(mtk_dp, 0);
  1337. return -ETIMEDOUT;
  1338. }
  1339. static int mtk_dp_train_eq(struct mtk_dp *mtk_dp, u8 target_lane_count)
  1340. {
  1341. u8 lane_adjust[2] = {};
  1342. u8 link_status[DP_LINK_STATUS_SIZE] = {};
  1343. int train_retries = 0;
  1344. mtk_dp_pattern(mtk_dp, false);
  1345. do {
  1346. train_retries++;
  1347. if (!mtk_dp->train_info.cable_plugged_in) {
  1348. mtk_dp_train_set_pattern(mtk_dp, 0);
  1349. return -ENODEV;
  1350. }
  1351. drm_dp_dpcd_read(&mtk_dp->aux, DP_ADJUST_REQUEST_LANE0_1,
  1352. lane_adjust, sizeof(lane_adjust));
  1353. mtk_dp_train_update_swing_pre(mtk_dp, target_lane_count,
  1354. lane_adjust);
  1355. drm_dp_link_train_channel_eq_delay(&mtk_dp->aux,
  1356. mtk_dp->rx_cap);
  1357. /* check link status from sink device */
  1358. drm_dp_dpcd_read_link_status(&mtk_dp->aux, link_status);
  1359. if (drm_dp_channel_eq_ok(link_status, target_lane_count)) {
  1360. dev_dbg(mtk_dp->dev, "Link train EQ pass\n");
  1361. /* Training done, and disable pattern. */
  1362. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_TRAINING_PATTERN_SET,
  1363. DP_TRAINING_PATTERN_DISABLE);
  1364. mtk_dp_train_set_pattern(mtk_dp, 0);
  1365. return 0;
  1366. }
  1367. dev_dbg(mtk_dp->dev, "Link train EQ fail\n");
  1368. } while (train_retries < MTK_DP_TRAIN_DOWNSCALE_RETRY);
  1369. /* Failed to train EQ, and disable pattern. */
  1370. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_TRAINING_PATTERN_SET,
  1371. DP_TRAINING_PATTERN_DISABLE);
  1372. mtk_dp_train_set_pattern(mtk_dp, 0);
  1373. return -ETIMEDOUT;
  1374. }
  1375. static int mtk_dp_parse_capabilities(struct mtk_dp *mtk_dp)
  1376. {
  1377. u8 val;
  1378. ssize_t ret;
  1379. ret = drm_dp_read_dpcd_caps(&mtk_dp->aux, mtk_dp->rx_cap);
  1380. if (ret < 0)
  1381. return ret;
  1382. if (drm_dp_tps4_supported(mtk_dp->rx_cap))
  1383. mtk_dp->train_info.channel_eq_pattern = DP_TRAINING_PATTERN_4;
  1384. else if (drm_dp_tps3_supported(mtk_dp->rx_cap))
  1385. mtk_dp->train_info.channel_eq_pattern = DP_TRAINING_PATTERN_3;
  1386. else
  1387. mtk_dp->train_info.channel_eq_pattern = DP_TRAINING_PATTERN_2;
  1388. mtk_dp->train_info.sink_ssc = drm_dp_max_downspread(mtk_dp->rx_cap);
  1389. ret = drm_dp_dpcd_readb(&mtk_dp->aux, DP_MSTM_CAP, &val);
  1390. if (ret < 1) {
  1391. drm_err(mtk_dp->drm_dev, "Read mstm cap failed\n");
  1392. return ret == 0 ? -EIO : ret;
  1393. }
  1394. if (val & DP_MST_CAP) {
  1395. /* Clear DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0 */
  1396. ret = drm_dp_dpcd_readb(&mtk_dp->aux,
  1397. DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0,
  1398. &val);
  1399. if (ret < 1) {
  1400. drm_err(mtk_dp->drm_dev, "Read irq vector failed\n");
  1401. return ret == 0 ? -EIO : ret;
  1402. }
  1403. if (val) {
  1404. ret = drm_dp_dpcd_writeb(&mtk_dp->aux,
  1405. DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0,
  1406. val);
  1407. if (ret < 0)
  1408. return ret;
  1409. }
  1410. }
  1411. return 0;
  1412. }
  1413. static bool mtk_dp_edid_parse_audio_capabilities(struct mtk_dp *mtk_dp,
  1414. struct mtk_dp_audio_cfg *cfg)
  1415. {
  1416. if (!mtk_dp->data->audio_supported)
  1417. return false;
  1418. if (mtk_dp->info.audio_cur_cfg.sad_count <= 0) {
  1419. drm_info(mtk_dp->drm_dev, "The SADs is NULL\n");
  1420. return false;
  1421. }
  1422. return true;
  1423. }
  1424. static void mtk_dp_train_change_mode(struct mtk_dp *mtk_dp)
  1425. {
  1426. phy_reset(mtk_dp->phy);
  1427. mtk_dp_reset_swing_pre_emphasis(mtk_dp);
  1428. }
  1429. static int mtk_dp_training(struct mtk_dp *mtk_dp)
  1430. {
  1431. int ret;
  1432. u8 lane_count, link_rate, train_limit, max_link_rate;
  1433. link_rate = min_t(u8, mtk_dp->max_linkrate,
  1434. mtk_dp->rx_cap[DP_MAX_LINK_RATE]);
  1435. max_link_rate = link_rate;
  1436. lane_count = min_t(u8, mtk_dp->max_lanes,
  1437. drm_dp_max_lane_count(mtk_dp->rx_cap));
  1438. /*
  1439. * TPS are generated by the hardware pattern generator. From the
  1440. * hardware setting we need to disable this scramble setting before
  1441. * use the TPS pattern generator.
  1442. */
  1443. mtk_dp_training_set_scramble(mtk_dp, false);
  1444. for (train_limit = 6; train_limit > 0; train_limit--) {
  1445. mtk_dp_train_change_mode(mtk_dp);
  1446. ret = mtk_dp_train_setting(mtk_dp, link_rate, lane_count);
  1447. if (ret)
  1448. return ret;
  1449. ret = mtk_dp_train_cr(mtk_dp, lane_count);
  1450. if (ret == -ENODEV) {
  1451. return ret;
  1452. } else if (ret) {
  1453. /* reduce link rate */
  1454. switch (link_rate) {
  1455. case DP_LINK_BW_1_62:
  1456. lane_count = lane_count / 2;
  1457. link_rate = max_link_rate;
  1458. if (lane_count == 0)
  1459. return -EIO;
  1460. break;
  1461. case DP_LINK_BW_2_7:
  1462. link_rate = DP_LINK_BW_1_62;
  1463. break;
  1464. case DP_LINK_BW_5_4:
  1465. link_rate = DP_LINK_BW_2_7;
  1466. break;
  1467. case DP_LINK_BW_8_1:
  1468. link_rate = DP_LINK_BW_5_4;
  1469. break;
  1470. default:
  1471. return -EINVAL;
  1472. };
  1473. continue;
  1474. }
  1475. ret = mtk_dp_train_eq(mtk_dp, lane_count);
  1476. if (ret == -ENODEV) {
  1477. return ret;
  1478. } else if (ret) {
  1479. /* reduce lane count */
  1480. if (lane_count == 0)
  1481. return -EIO;
  1482. lane_count /= 2;
  1483. continue;
  1484. }
  1485. /* if we can run to this, training is done. */
  1486. break;
  1487. }
  1488. if (train_limit == 0)
  1489. return -ETIMEDOUT;
  1490. mtk_dp->train_info.link_rate = link_rate;
  1491. mtk_dp->train_info.lane_count = lane_count;
  1492. /*
  1493. * After training done, we need to output normal stream instead of TPS,
  1494. * so we need to enable scramble.
  1495. */
  1496. mtk_dp_training_set_scramble(mtk_dp, true);
  1497. mtk_dp_set_enhanced_frame_mode(mtk_dp);
  1498. return 0;
  1499. }
  1500. static void mtk_dp_video_enable(struct mtk_dp *mtk_dp, bool enable)
  1501. {
  1502. /* the mute sequence is different between enable and disable */
  1503. if (enable) {
  1504. mtk_dp_msa_bypass_enable(mtk_dp, false);
  1505. mtk_dp_pg_enable(mtk_dp, false);
  1506. mtk_dp_set_tx_out(mtk_dp);
  1507. mtk_dp_video_mute(mtk_dp, false);
  1508. } else {
  1509. mtk_dp_video_mute(mtk_dp, true);
  1510. mtk_dp_pg_enable(mtk_dp, true);
  1511. mtk_dp_msa_bypass_enable(mtk_dp, true);
  1512. }
  1513. }
  1514. static void mtk_dp_audio_sdp_setup(struct mtk_dp *mtk_dp,
  1515. struct mtk_dp_audio_cfg *cfg)
  1516. {
  1517. struct dp_sdp sdp;
  1518. struct hdmi_audio_infoframe frame;
  1519. hdmi_audio_infoframe_init(&frame);
  1520. frame.coding_type = HDMI_AUDIO_CODING_TYPE_PCM;
  1521. frame.channels = cfg->channels;
  1522. frame.sample_frequency = cfg->sample_rate;
  1523. switch (cfg->word_length_bits) {
  1524. case 16:
  1525. frame.sample_size = HDMI_AUDIO_SAMPLE_SIZE_16;
  1526. break;
  1527. case 20:
  1528. frame.sample_size = HDMI_AUDIO_SAMPLE_SIZE_20;
  1529. break;
  1530. case 24:
  1531. default:
  1532. frame.sample_size = HDMI_AUDIO_SAMPLE_SIZE_24;
  1533. break;
  1534. }
  1535. hdmi_audio_infoframe_pack_for_dp(&frame, &sdp, MTK_DP_VERSION);
  1536. mtk_dp_audio_sdp_asp_set_channels(mtk_dp, cfg->channels);
  1537. mtk_dp_setup_sdp_aui(mtk_dp, &sdp);
  1538. }
  1539. static void mtk_dp_audio_setup(struct mtk_dp *mtk_dp,
  1540. struct mtk_dp_audio_cfg *cfg)
  1541. {
  1542. mtk_dp_audio_sdp_setup(mtk_dp, cfg);
  1543. mtk_dp_audio_channel_status_set(mtk_dp, cfg);
  1544. mtk_dp_audio_setup_channels(mtk_dp, cfg);
  1545. mtk_dp_audio_set_divider(mtk_dp);
  1546. }
  1547. static int mtk_dp_video_config(struct mtk_dp *mtk_dp)
  1548. {
  1549. mtk_dp_config_mn_mode(mtk_dp);
  1550. mtk_dp_set_msa(mtk_dp);
  1551. mtk_dp_set_color_depth(mtk_dp);
  1552. return mtk_dp_set_color_format(mtk_dp, mtk_dp->info.format);
  1553. }
  1554. static void mtk_dp_init_port(struct mtk_dp *mtk_dp)
  1555. {
  1556. mtk_dp_set_idle_pattern(mtk_dp, true);
  1557. mtk_dp_initialize_priv_data(mtk_dp);
  1558. mtk_dp_initialize_settings(mtk_dp);
  1559. mtk_dp_initialize_aux_settings(mtk_dp);
  1560. mtk_dp_initialize_digital_settings(mtk_dp);
  1561. mtk_dp_update_bits(mtk_dp, MTK_DP_AUX_P0_3690,
  1562. RX_REPLY_COMPLETE_MODE_AUX_TX_P0,
  1563. RX_REPLY_COMPLETE_MODE_AUX_TX_P0);
  1564. mtk_dp_initialize_hpd_detect_settings(mtk_dp);
  1565. mtk_dp_digital_sw_reset(mtk_dp);
  1566. }
  1567. static irqreturn_t mtk_dp_hpd_event_thread(int hpd, void *dev)
  1568. {
  1569. struct mtk_dp *mtk_dp = dev;
  1570. unsigned long flags;
  1571. u32 status;
  1572. if (mtk_dp->need_debounce && mtk_dp->train_info.cable_plugged_in)
  1573. msleep(100);
  1574. spin_lock_irqsave(&mtk_dp->irq_thread_lock, flags);
  1575. status = mtk_dp->irq_thread_handle;
  1576. mtk_dp->irq_thread_handle = 0;
  1577. spin_unlock_irqrestore(&mtk_dp->irq_thread_lock, flags);
  1578. if (status & MTK_DP_THREAD_CABLE_STATE_CHG) {
  1579. if (mtk_dp->bridge.dev)
  1580. drm_helper_hpd_irq_event(mtk_dp->bridge.dev);
  1581. if (!mtk_dp->train_info.cable_plugged_in) {
  1582. mtk_dp_disable_sdp_aui(mtk_dp);
  1583. memset(&mtk_dp->info.audio_cur_cfg, 0,
  1584. sizeof(mtk_dp->info.audio_cur_cfg));
  1585. mtk_dp->need_debounce = false;
  1586. mod_timer(&mtk_dp->debounce_timer,
  1587. jiffies + msecs_to_jiffies(100) - 1);
  1588. }
  1589. }
  1590. if (status & MTK_DP_THREAD_HPD_EVENT)
  1591. dev_dbg(mtk_dp->dev, "Receive IRQ from sink devices\n");
  1592. return IRQ_HANDLED;
  1593. }
  1594. static irqreturn_t mtk_dp_hpd_event(int hpd, void *dev)
  1595. {
  1596. struct mtk_dp *mtk_dp = dev;
  1597. bool cable_sta_chg = false;
  1598. unsigned long flags;
  1599. u32 irq_status = mtk_dp_swirq_get_clear(mtk_dp) |
  1600. mtk_dp_hwirq_get_clear(mtk_dp);
  1601. if (!irq_status)
  1602. return IRQ_HANDLED;
  1603. spin_lock_irqsave(&mtk_dp->irq_thread_lock, flags);
  1604. if (irq_status & MTK_DP_HPD_INTERRUPT)
  1605. mtk_dp->irq_thread_handle |= MTK_DP_THREAD_HPD_EVENT;
  1606. /* Cable state is changed. */
  1607. if (irq_status != MTK_DP_HPD_INTERRUPT) {
  1608. mtk_dp->irq_thread_handle |= MTK_DP_THREAD_CABLE_STATE_CHG;
  1609. cable_sta_chg = true;
  1610. }
  1611. spin_unlock_irqrestore(&mtk_dp->irq_thread_lock, flags);
  1612. if (cable_sta_chg) {
  1613. if (!!(mtk_dp_read(mtk_dp, MTK_DP_TRANS_P0_3414) &
  1614. HPD_DB_DP_TRANS_P0_MASK))
  1615. mtk_dp->train_info.cable_plugged_in = true;
  1616. else
  1617. mtk_dp->train_info.cable_plugged_in = false;
  1618. }
  1619. return IRQ_WAKE_THREAD;
  1620. }
  1621. static int mtk_dp_dt_parse(struct mtk_dp *mtk_dp,
  1622. struct platform_device *pdev)
  1623. {
  1624. struct device_node *endpoint;
  1625. struct device *dev = &pdev->dev;
  1626. int ret;
  1627. void __iomem *base;
  1628. u32 linkrate;
  1629. int len;
  1630. base = devm_platform_ioremap_resource(pdev, 0);
  1631. if (IS_ERR(base))
  1632. return PTR_ERR(base);
  1633. mtk_dp->regs = devm_regmap_init_mmio(dev, base, &mtk_dp_regmap_config);
  1634. if (IS_ERR(mtk_dp->regs))
  1635. return PTR_ERR(mtk_dp->regs);
  1636. endpoint = of_graph_get_endpoint_by_regs(pdev->dev.of_node, 1, -1);
  1637. len = of_property_count_elems_of_size(endpoint,
  1638. "data-lanes", sizeof(u32));
  1639. if (len < 0 || len > 4 || len == 3) {
  1640. dev_err(dev, "invalid data lane size: %d\n", len);
  1641. return -EINVAL;
  1642. }
  1643. mtk_dp->max_lanes = len;
  1644. ret = device_property_read_u32(dev, "max-linkrate-mhz", &linkrate);
  1645. if (ret) {
  1646. dev_err(dev, "failed to read max linkrate: %d\n", ret);
  1647. return ret;
  1648. }
  1649. mtk_dp->max_linkrate = drm_dp_link_rate_to_bw_code(linkrate * 100);
  1650. return 0;
  1651. }
  1652. static void mtk_dp_update_plugged_status(struct mtk_dp *mtk_dp)
  1653. {
  1654. mutex_lock(&mtk_dp->update_plugged_status_lock);
  1655. if (mtk_dp->plugged_cb && mtk_dp->codec_dev)
  1656. mtk_dp->plugged_cb(mtk_dp->codec_dev,
  1657. mtk_dp->enabled &
  1658. mtk_dp->info.audio_cur_cfg.detect_monitor);
  1659. mutex_unlock(&mtk_dp->update_plugged_status_lock);
  1660. }
  1661. static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
  1662. {
  1663. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1664. enum drm_connector_status ret = connector_status_disconnected;
  1665. bool enabled = mtk_dp->enabled;
  1666. u8 sink_count = 0;
  1667. if (!mtk_dp->train_info.cable_plugged_in)
  1668. return ret;
  1669. if (!enabled) {
  1670. /* power on aux */
  1671. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1672. DP_PWR_STATE_BANDGAP_TPLL_LANE,
  1673. DP_PWR_STATE_MASK);
  1674. /* power on panel */
  1675. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D0);
  1676. usleep_range(2000, 5000);
  1677. }
  1678. /*
  1679. * Some dongles still source HPD when they do not connect to any
  1680. * sink device. To avoid this, we need to read the sink count
  1681. * to make sure we do connect to sink devices. After this detect
  1682. * function, we just need to check the HPD connection to check
  1683. * whether we connect to a sink device.
  1684. */
  1685. drm_dp_dpcd_readb(&mtk_dp->aux, DP_SINK_COUNT, &sink_count);
  1686. if (DP_GET_SINK_COUNT(sink_count))
  1687. ret = connector_status_connected;
  1688. if (!enabled) {
  1689. /* power off panel */
  1690. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
  1691. usleep_range(2000, 3000);
  1692. /* power off aux */
  1693. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1694. DP_PWR_STATE_BANDGAP_TPLL,
  1695. DP_PWR_STATE_MASK);
  1696. }
  1697. return ret;
  1698. }
  1699. static struct edid *mtk_dp_get_edid(struct drm_bridge *bridge,
  1700. struct drm_connector *connector)
  1701. {
  1702. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1703. bool enabled = mtk_dp->enabled;
  1704. struct edid *new_edid = NULL;
  1705. struct mtk_dp_audio_cfg *audio_caps = &mtk_dp->info.audio_cur_cfg;
  1706. if (!enabled) {
  1707. drm_bridge_chain_pre_enable(bridge);
  1708. /* power on aux */
  1709. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1710. DP_PWR_STATE_BANDGAP_TPLL_LANE,
  1711. DP_PWR_STATE_MASK);
  1712. /* power on panel */
  1713. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D0);
  1714. usleep_range(2000, 5000);
  1715. }
  1716. new_edid = drm_get_edid(connector, &mtk_dp->aux.ddc);
  1717. /*
  1718. * Parse capability here to let atomic_get_input_bus_fmts and
  1719. * mode_valid use the capability to calculate sink bitrates.
  1720. */
  1721. if (mtk_dp_parse_capabilities(mtk_dp)) {
  1722. drm_err(mtk_dp->drm_dev, "Can't parse capabilities\n");
  1723. kfree(new_edid);
  1724. new_edid = NULL;
  1725. }
  1726. if (new_edid) {
  1727. struct cea_sad *sads;
  1728. audio_caps->sad_count = drm_edid_to_sad(new_edid, &sads);
  1729. kfree(sads);
  1730. audio_caps->detect_monitor = drm_detect_monitor_audio(new_edid);
  1731. }
  1732. if (!enabled) {
  1733. /* power off panel */
  1734. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
  1735. usleep_range(2000, 3000);
  1736. /* power off aux */
  1737. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1738. DP_PWR_STATE_BANDGAP_TPLL,
  1739. DP_PWR_STATE_MASK);
  1740. drm_bridge_chain_post_disable(bridge);
  1741. }
  1742. return new_edid;
  1743. }
  1744. static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
  1745. struct drm_dp_aux_msg *msg)
  1746. {
  1747. struct mtk_dp *mtk_dp;
  1748. bool is_read;
  1749. u8 request;
  1750. size_t accessed_bytes = 0;
  1751. int ret;
  1752. mtk_dp = container_of(mtk_aux, struct mtk_dp, aux);
  1753. if (!mtk_dp->train_info.cable_plugged_in) {
  1754. ret = -EAGAIN;
  1755. goto err;
  1756. }
  1757. switch (msg->request) {
  1758. case DP_AUX_I2C_MOT:
  1759. case DP_AUX_I2C_WRITE:
  1760. case DP_AUX_NATIVE_WRITE:
  1761. case DP_AUX_I2C_WRITE_STATUS_UPDATE:
  1762. case DP_AUX_I2C_WRITE_STATUS_UPDATE | DP_AUX_I2C_MOT:
  1763. request = msg->request & ~DP_AUX_I2C_WRITE_STATUS_UPDATE;
  1764. is_read = false;
  1765. break;
  1766. case DP_AUX_I2C_READ:
  1767. case DP_AUX_NATIVE_READ:
  1768. case DP_AUX_I2C_READ | DP_AUX_I2C_MOT:
  1769. request = msg->request;
  1770. is_read = true;
  1771. break;
  1772. default:
  1773. dev_err(mtk_dp->dev, "invalid aux cmd = %d\n",
  1774. msg->request);
  1775. ret = -EINVAL;
  1776. goto err;
  1777. }
  1778. do {
  1779. size_t to_access = min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES,
  1780. msg->size - accessed_bytes);
  1781. ret = mtk_dp_aux_do_transfer(mtk_dp, is_read, request,
  1782. msg->address + accessed_bytes,
  1783. msg->buffer + accessed_bytes,
  1784. to_access, &msg->reply);
  1785. if (ret) {
  1786. dev_info(mtk_dp->dev,
  1787. "Failed to do AUX transfer: %d\n", ret);
  1788. goto err;
  1789. }
  1790. accessed_bytes += to_access;
  1791. } while (accessed_bytes < msg->size);
  1792. return msg->size;
  1793. err:
  1794. msg->reply = DP_AUX_NATIVE_REPLY_NACK | DP_AUX_I2C_REPLY_NACK;
  1795. return ret;
  1796. }
  1797. static int mtk_dp_poweron(struct mtk_dp *mtk_dp)
  1798. {
  1799. int ret;
  1800. ret = phy_init(mtk_dp->phy);
  1801. if (ret) {
  1802. dev_err(mtk_dp->dev, "Failed to initialize phy: %d\n", ret);
  1803. return ret;
  1804. }
  1805. mtk_dp_init_port(mtk_dp);
  1806. mtk_dp_power_enable(mtk_dp);
  1807. return 0;
  1808. }
  1809. static void mtk_dp_poweroff(struct mtk_dp *mtk_dp)
  1810. {
  1811. mtk_dp_power_disable(mtk_dp);
  1812. phy_exit(mtk_dp->phy);
  1813. }
  1814. static int mtk_dp_bridge_attach(struct drm_bridge *bridge,
  1815. enum drm_bridge_attach_flags flags)
  1816. {
  1817. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1818. int ret;
  1819. if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
  1820. dev_err(mtk_dp->dev, "Driver does not provide a connector!");
  1821. return -EINVAL;
  1822. }
  1823. mtk_dp->aux.drm_dev = bridge->dev;
  1824. ret = drm_dp_aux_register(&mtk_dp->aux);
  1825. if (ret) {
  1826. dev_err(mtk_dp->dev,
  1827. "failed to register DP AUX channel: %d\n", ret);
  1828. return ret;
  1829. }
  1830. ret = mtk_dp_poweron(mtk_dp);
  1831. if (ret)
  1832. goto err_aux_register;
  1833. if (mtk_dp->next_bridge) {
  1834. ret = drm_bridge_attach(bridge->encoder, mtk_dp->next_bridge,
  1835. &mtk_dp->bridge, flags);
  1836. if (ret) {
  1837. drm_warn(mtk_dp->drm_dev,
  1838. "Failed to attach external bridge: %d\n", ret);
  1839. goto err_bridge_attach;
  1840. }
  1841. }
  1842. mtk_dp->drm_dev = bridge->dev;
  1843. mtk_dp_hwirq_enable(mtk_dp, true);
  1844. return 0;
  1845. err_bridge_attach:
  1846. mtk_dp_poweroff(mtk_dp);
  1847. err_aux_register:
  1848. drm_dp_aux_unregister(&mtk_dp->aux);
  1849. return ret;
  1850. }
  1851. static void mtk_dp_bridge_detach(struct drm_bridge *bridge)
  1852. {
  1853. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1854. mtk_dp_hwirq_enable(mtk_dp, false);
  1855. mtk_dp->drm_dev = NULL;
  1856. mtk_dp_poweroff(mtk_dp);
  1857. drm_dp_aux_unregister(&mtk_dp->aux);
  1858. }
  1859. static void mtk_dp_bridge_atomic_enable(struct drm_bridge *bridge,
  1860. struct drm_bridge_state *old_state)
  1861. {
  1862. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1863. int ret;
  1864. mtk_dp->conn = drm_atomic_get_new_connector_for_encoder(old_state->base.state,
  1865. bridge->encoder);
  1866. if (!mtk_dp->conn) {
  1867. drm_err(mtk_dp->drm_dev,
  1868. "Can't enable bridge as connector is missing\n");
  1869. return;
  1870. }
  1871. /* power on aux */
  1872. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1873. DP_PWR_STATE_BANDGAP_TPLL_LANE,
  1874. DP_PWR_STATE_MASK);
  1875. if (mtk_dp->train_info.cable_plugged_in) {
  1876. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D0);
  1877. usleep_range(2000, 5000);
  1878. }
  1879. /* Training */
  1880. ret = mtk_dp_training(mtk_dp);
  1881. if (ret) {
  1882. drm_err(mtk_dp->drm_dev, "Training failed, %d\n", ret);
  1883. goto power_off_aux;
  1884. }
  1885. ret = mtk_dp_video_config(mtk_dp);
  1886. if (ret)
  1887. goto power_off_aux;
  1888. mtk_dp_video_enable(mtk_dp, true);
  1889. mtk_dp->audio_enable =
  1890. mtk_dp_edid_parse_audio_capabilities(mtk_dp,
  1891. &mtk_dp->info.audio_cur_cfg);
  1892. if (mtk_dp->audio_enable) {
  1893. mtk_dp_audio_setup(mtk_dp, &mtk_dp->info.audio_cur_cfg);
  1894. mtk_dp_audio_mute(mtk_dp, false);
  1895. } else {
  1896. memset(&mtk_dp->info.audio_cur_cfg, 0,
  1897. sizeof(mtk_dp->info.audio_cur_cfg));
  1898. }
  1899. mtk_dp->enabled = true;
  1900. mtk_dp_update_plugged_status(mtk_dp);
  1901. return;
  1902. power_off_aux:
  1903. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1904. DP_PWR_STATE_BANDGAP_TPLL,
  1905. DP_PWR_STATE_MASK);
  1906. }
  1907. static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
  1908. struct drm_bridge_state *old_state)
  1909. {
  1910. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1911. mtk_dp->enabled = false;
  1912. mtk_dp_update_plugged_status(mtk_dp);
  1913. mtk_dp_video_enable(mtk_dp, false);
  1914. mtk_dp_audio_mute(mtk_dp, true);
  1915. if (mtk_dp->train_info.cable_plugged_in) {
  1916. drm_dp_dpcd_writeb(&mtk_dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
  1917. usleep_range(2000, 3000);
  1918. }
  1919. /* power off aux */
  1920. mtk_dp_update_bits(mtk_dp, MTK_DP_TOP_PWR_STATE,
  1921. DP_PWR_STATE_BANDGAP_TPLL,
  1922. DP_PWR_STATE_MASK);
  1923. /* Ensure the sink is muted */
  1924. msleep(20);
  1925. }
  1926. static enum drm_mode_status
  1927. mtk_dp_bridge_mode_valid(struct drm_bridge *bridge,
  1928. const struct drm_display_info *info,
  1929. const struct drm_display_mode *mode)
  1930. {
  1931. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1932. u32 bpp = info->color_formats & DRM_COLOR_FORMAT_YCBCR422 ? 16 : 24;
  1933. u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) *
  1934. drm_dp_max_lane_count(mtk_dp->rx_cap),
  1935. drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) *
  1936. mtk_dp->max_lanes);
  1937. if (rate < mode->clock * bpp / 8)
  1938. return MODE_CLOCK_HIGH;
  1939. return MODE_OK;
  1940. }
  1941. static u32 *mtk_dp_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
  1942. struct drm_bridge_state *bridge_state,
  1943. struct drm_crtc_state *crtc_state,
  1944. struct drm_connector_state *conn_state,
  1945. unsigned int *num_output_fmts)
  1946. {
  1947. u32 *output_fmts;
  1948. *num_output_fmts = 0;
  1949. output_fmts = kmalloc(sizeof(*output_fmts), GFP_KERNEL);
  1950. if (!output_fmts)
  1951. return NULL;
  1952. *num_output_fmts = 1;
  1953. output_fmts[0] = MEDIA_BUS_FMT_FIXED;
  1954. return output_fmts;
  1955. }
  1956. static const u32 mt8195_input_fmts[] = {
  1957. MEDIA_BUS_FMT_RGB888_1X24,
  1958. MEDIA_BUS_FMT_YUV8_1X24,
  1959. MEDIA_BUS_FMT_YUYV8_1X16,
  1960. };
  1961. static u32 *mtk_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  1962. struct drm_bridge_state *bridge_state,
  1963. struct drm_crtc_state *crtc_state,
  1964. struct drm_connector_state *conn_state,
  1965. u32 output_fmt,
  1966. unsigned int *num_input_fmts)
  1967. {
  1968. u32 *input_fmts;
  1969. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  1970. struct drm_display_mode *mode = &crtc_state->adjusted_mode;
  1971. struct drm_display_info *display_info =
  1972. &conn_state->connector->display_info;
  1973. u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) *
  1974. drm_dp_max_lane_count(mtk_dp->rx_cap),
  1975. drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) *
  1976. mtk_dp->max_lanes);
  1977. *num_input_fmts = 0;
  1978. /*
  1979. * If the linkrate is smaller than datarate of RGB888, larger than
  1980. * datarate of YUV422 and sink device supports YUV422, we output YUV422
  1981. * format. Use this condition, we can support more resolution.
  1982. */
  1983. if ((rate < (mode->clock * 24 / 8)) &&
  1984. (rate > (mode->clock * 16 / 8)) &&
  1985. (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {
  1986. input_fmts = kcalloc(1, sizeof(*input_fmts), GFP_KERNEL);
  1987. if (!input_fmts)
  1988. return NULL;
  1989. *num_input_fmts = 1;
  1990. input_fmts[0] = MEDIA_BUS_FMT_YUYV8_1X16;
  1991. } else {
  1992. input_fmts = kcalloc(ARRAY_SIZE(mt8195_input_fmts),
  1993. sizeof(*input_fmts),
  1994. GFP_KERNEL);
  1995. if (!input_fmts)
  1996. return NULL;
  1997. *num_input_fmts = ARRAY_SIZE(mt8195_input_fmts);
  1998. memcpy(input_fmts, mt8195_input_fmts, sizeof(mt8195_input_fmts));
  1999. }
  2000. return input_fmts;
  2001. }
  2002. static int mtk_dp_bridge_atomic_check(struct drm_bridge *bridge,
  2003. struct drm_bridge_state *bridge_state,
  2004. struct drm_crtc_state *crtc_state,
  2005. struct drm_connector_state *conn_state)
  2006. {
  2007. struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
  2008. struct drm_crtc *crtc = conn_state->crtc;
  2009. unsigned int input_bus_format;
  2010. input_bus_format = bridge_state->input_bus_cfg.format;
  2011. dev_dbg(mtk_dp->dev, "input format 0x%04x, output format 0x%04x\n",
  2012. bridge_state->input_bus_cfg.format,
  2013. bridge_state->output_bus_cfg.format);
  2014. if (input_bus_format == MEDIA_BUS_FMT_YUYV8_1X16)
  2015. mtk_dp->info.format = DP_PIXELFORMAT_YUV422;
  2016. else
  2017. mtk_dp->info.format = DP_PIXELFORMAT_RGB;
  2018. if (!crtc) {
  2019. drm_err(mtk_dp->drm_dev,
  2020. "Can't enable bridge as connector state doesn't have a crtc\n");
  2021. return -EINVAL;
  2022. }
  2023. drm_display_mode_to_videomode(&crtc_state->adjusted_mode, &mtk_dp->info.vm);
  2024. return 0;
  2025. }
  2026. static const struct drm_bridge_funcs mtk_dp_bridge_funcs = {
  2027. .atomic_check = mtk_dp_bridge_atomic_check,
  2028. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  2029. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  2030. .atomic_get_output_bus_fmts = mtk_dp_bridge_atomic_get_output_bus_fmts,
  2031. .atomic_get_input_bus_fmts = mtk_dp_bridge_atomic_get_input_bus_fmts,
  2032. .atomic_reset = drm_atomic_helper_bridge_reset,
  2033. .attach = mtk_dp_bridge_attach,
  2034. .detach = mtk_dp_bridge_detach,
  2035. .atomic_enable = mtk_dp_bridge_atomic_enable,
  2036. .atomic_disable = mtk_dp_bridge_atomic_disable,
  2037. .mode_valid = mtk_dp_bridge_mode_valid,
  2038. .get_edid = mtk_dp_get_edid,
  2039. .detect = mtk_dp_bdg_detect,
  2040. };
  2041. static void mtk_dp_debounce_timer(struct timer_list *t)
  2042. {
  2043. struct mtk_dp *mtk_dp = from_timer(mtk_dp, t, debounce_timer);
  2044. mtk_dp->need_debounce = true;
  2045. }
  2046. /*
  2047. * HDMI audio codec callbacks
  2048. */
  2049. static int mtk_dp_audio_hw_params(struct device *dev, void *data,
  2050. struct hdmi_codec_daifmt *daifmt,
  2051. struct hdmi_codec_params *params)
  2052. {
  2053. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2054. if (!mtk_dp->enabled) {
  2055. dev_err(mtk_dp->dev, "%s, DP is not ready!\n", __func__);
  2056. return -ENODEV;
  2057. }
  2058. mtk_dp->info.audio_cur_cfg.channels = params->cea.channels;
  2059. mtk_dp->info.audio_cur_cfg.sample_rate = params->sample_rate;
  2060. mtk_dp_audio_setup(mtk_dp, &mtk_dp->info.audio_cur_cfg);
  2061. return 0;
  2062. }
  2063. static int mtk_dp_audio_startup(struct device *dev, void *data)
  2064. {
  2065. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2066. mtk_dp_audio_mute(mtk_dp, false);
  2067. return 0;
  2068. }
  2069. static void mtk_dp_audio_shutdown(struct device *dev, void *data)
  2070. {
  2071. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2072. mtk_dp_audio_mute(mtk_dp, true);
  2073. }
  2074. static int mtk_dp_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
  2075. size_t len)
  2076. {
  2077. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2078. if (mtk_dp->enabled)
  2079. memcpy(buf, mtk_dp->conn->eld, len);
  2080. else
  2081. memset(buf, 0, len);
  2082. return 0;
  2083. }
  2084. static int mtk_dp_audio_hook_plugged_cb(struct device *dev, void *data,
  2085. hdmi_codec_plugged_cb fn,
  2086. struct device *codec_dev)
  2087. {
  2088. struct mtk_dp *mtk_dp = data;
  2089. mutex_lock(&mtk_dp->update_plugged_status_lock);
  2090. mtk_dp->plugged_cb = fn;
  2091. mtk_dp->codec_dev = codec_dev;
  2092. mutex_unlock(&mtk_dp->update_plugged_status_lock);
  2093. mtk_dp_update_plugged_status(mtk_dp);
  2094. return 0;
  2095. }
  2096. static const struct hdmi_codec_ops mtk_dp_audio_codec_ops = {
  2097. .hw_params = mtk_dp_audio_hw_params,
  2098. .audio_startup = mtk_dp_audio_startup,
  2099. .audio_shutdown = mtk_dp_audio_shutdown,
  2100. .get_eld = mtk_dp_audio_get_eld,
  2101. .hook_plugged_cb = mtk_dp_audio_hook_plugged_cb,
  2102. .no_capture_mute = 1,
  2103. };
  2104. static int mtk_dp_register_audio_driver(struct device *dev)
  2105. {
  2106. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2107. struct hdmi_codec_pdata codec_data = {
  2108. .ops = &mtk_dp_audio_codec_ops,
  2109. .max_i2s_channels = 8,
  2110. .i2s = 1,
  2111. .data = mtk_dp,
  2112. };
  2113. mtk_dp->audio_pdev = platform_device_register_data(dev,
  2114. HDMI_CODEC_DRV_NAME,
  2115. PLATFORM_DEVID_AUTO,
  2116. &codec_data,
  2117. sizeof(codec_data));
  2118. return PTR_ERR_OR_ZERO(mtk_dp->audio_pdev);
  2119. }
  2120. static int mtk_dp_probe(struct platform_device *pdev)
  2121. {
  2122. struct mtk_dp *mtk_dp;
  2123. struct device *dev = &pdev->dev;
  2124. int ret, irq_num;
  2125. mtk_dp = devm_kzalloc(dev, sizeof(*mtk_dp), GFP_KERNEL);
  2126. if (!mtk_dp)
  2127. return -ENOMEM;
  2128. mtk_dp->dev = dev;
  2129. mtk_dp->data = (struct mtk_dp_data *)of_device_get_match_data(dev);
  2130. irq_num = platform_get_irq(pdev, 0);
  2131. if (irq_num < 0)
  2132. return dev_err_probe(dev, irq_num,
  2133. "failed to request dp irq resource\n");
  2134. mtk_dp->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
  2135. if (IS_ERR(mtk_dp->next_bridge) &&
  2136. PTR_ERR(mtk_dp->next_bridge) == -ENODEV)
  2137. mtk_dp->next_bridge = NULL;
  2138. else if (IS_ERR(mtk_dp->next_bridge))
  2139. return dev_err_probe(dev, PTR_ERR(mtk_dp->next_bridge),
  2140. "Failed to get bridge\n");
  2141. ret = mtk_dp_dt_parse(mtk_dp, pdev);
  2142. if (ret)
  2143. return dev_err_probe(dev, ret, "Failed to parse dt\n");
  2144. drm_dp_aux_init(&mtk_dp->aux);
  2145. mtk_dp->aux.name = "aux_mtk_dp";
  2146. mtk_dp->aux.transfer = mtk_dp_aux_transfer;
  2147. spin_lock_init(&mtk_dp->irq_thread_lock);
  2148. ret = devm_request_threaded_irq(dev, irq_num, mtk_dp_hpd_event,
  2149. mtk_dp_hpd_event_thread,
  2150. IRQ_TYPE_LEVEL_HIGH, dev_name(dev),
  2151. mtk_dp);
  2152. if (ret)
  2153. return dev_err_probe(dev, ret,
  2154. "failed to request mediatek dptx irq\n");
  2155. mutex_init(&mtk_dp->update_plugged_status_lock);
  2156. platform_set_drvdata(pdev, mtk_dp);
  2157. if (mtk_dp->data->audio_supported) {
  2158. ret = mtk_dp_register_audio_driver(dev);
  2159. if (ret) {
  2160. dev_err(dev, "Failed to register audio driver: %d\n",
  2161. ret);
  2162. return ret;
  2163. }
  2164. }
  2165. mtk_dp->phy_dev = platform_device_register_data(dev, "mediatek-dp-phy",
  2166. PLATFORM_DEVID_AUTO,
  2167. &mtk_dp->regs,
  2168. sizeof(struct regmap *));
  2169. if (IS_ERR(mtk_dp->phy_dev))
  2170. return dev_err_probe(dev, PTR_ERR(mtk_dp->phy_dev),
  2171. "Failed to create device mediatek-dp-phy\n");
  2172. mtk_dp_get_calibration_data(mtk_dp);
  2173. mtk_dp->phy = devm_phy_get(&mtk_dp->phy_dev->dev, "dp");
  2174. if (IS_ERR(mtk_dp->phy)) {
  2175. platform_device_unregister(mtk_dp->phy_dev);
  2176. return dev_err_probe(dev, PTR_ERR(mtk_dp->phy),
  2177. "Failed to get phy\n");
  2178. }
  2179. mtk_dp->bridge.funcs = &mtk_dp_bridge_funcs;
  2180. mtk_dp->bridge.of_node = dev->of_node;
  2181. mtk_dp->bridge.ops =
  2182. DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HPD;
  2183. mtk_dp->bridge.type = mtk_dp->data->bridge_type;
  2184. drm_bridge_add(&mtk_dp->bridge);
  2185. mtk_dp->need_debounce = true;
  2186. timer_setup(&mtk_dp->debounce_timer, mtk_dp_debounce_timer, 0);
  2187. pm_runtime_enable(dev);
  2188. pm_runtime_get_sync(dev);
  2189. return 0;
  2190. }
  2191. static int mtk_dp_remove(struct platform_device *pdev)
  2192. {
  2193. struct mtk_dp *mtk_dp = platform_get_drvdata(pdev);
  2194. pm_runtime_put(&pdev->dev);
  2195. pm_runtime_disable(&pdev->dev);
  2196. del_timer_sync(&mtk_dp->debounce_timer);
  2197. drm_bridge_remove(&mtk_dp->bridge);
  2198. platform_device_unregister(mtk_dp->phy_dev);
  2199. if (mtk_dp->audio_pdev)
  2200. platform_device_unregister(mtk_dp->audio_pdev);
  2201. return 0;
  2202. }
  2203. #ifdef CONFIG_PM_SLEEP
  2204. static int mtk_dp_suspend(struct device *dev)
  2205. {
  2206. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2207. mtk_dp_power_disable(mtk_dp);
  2208. mtk_dp_hwirq_enable(mtk_dp, false);
  2209. pm_runtime_put_sync(dev);
  2210. return 0;
  2211. }
  2212. static int mtk_dp_resume(struct device *dev)
  2213. {
  2214. struct mtk_dp *mtk_dp = dev_get_drvdata(dev);
  2215. pm_runtime_get_sync(dev);
  2216. mtk_dp_init_port(mtk_dp);
  2217. mtk_dp_hwirq_enable(mtk_dp, true);
  2218. mtk_dp_power_enable(mtk_dp);
  2219. return 0;
  2220. }
  2221. #endif
  2222. static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
  2223. static const struct mtk_dp_data mt8195_edp_data = {
  2224. .bridge_type = DRM_MODE_CONNECTOR_eDP,
  2225. .smc_cmd = MTK_DP_SIP_ATF_EDP_VIDEO_UNMUTE,
  2226. .efuse_fmt = mt8195_edp_efuse_fmt,
  2227. .audio_supported = false,
  2228. };
  2229. static const struct mtk_dp_data mt8195_dp_data = {
  2230. .bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
  2231. .smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
  2232. .efuse_fmt = mt8195_dp_efuse_fmt,
  2233. .audio_supported = true,
  2234. };
  2235. static const struct of_device_id mtk_dp_of_match[] = {
  2236. {
  2237. .compatible = "mediatek,mt8195-edp-tx",
  2238. .data = &mt8195_edp_data,
  2239. },
  2240. {
  2241. .compatible = "mediatek,mt8195-dp-tx",
  2242. .data = &mt8195_dp_data,
  2243. },
  2244. {},
  2245. };
  2246. MODULE_DEVICE_TABLE(of, mtk_dp_of_match);
  2247. static struct platform_driver mtk_dp_driver = {
  2248. .probe = mtk_dp_probe,
  2249. .remove = mtk_dp_remove,
  2250. .driver = {
  2251. .name = "mediatek-drm-dp",
  2252. .of_match_table = mtk_dp_of_match,
  2253. .pm = &mtk_dp_pm_ops,
  2254. },
  2255. };
  2256. module_platform_driver(mtk_dp_driver);
  2257. MODULE_AUTHOR("Jitao Shi <[email protected]>");
  2258. MODULE_AUTHOR("Markus Schneider-Pargmann <[email protected]>");
  2259. MODULE_AUTHOR("Bo-Chen Chen <[email protected]>");
  2260. MODULE_DESCRIPTION("MediaTek DisplayPort Driver");
  2261. MODULE_LICENSE("GPL");