mtk_dpi.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2014 MediaTek Inc.
  4. * Author: Jie Qiu <jie.qiu@mediatek.com>
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/clk.h>
  8. #include <linux/component.h>
  9. #include <linux/debugfs.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/kernel.h>
  12. #include <linux/media-bus-format.h>
  13. #include <linux/of.h>
  14. #include <linux/of_graph.h>
  15. #include <linux/pinctrl/consumer.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/soc/mediatek/mtk-mmsys.h>
  18. #include <linux/types.h>
  19. #include <video/videomode.h>
  20. #include <drm/drm_atomic_helper.h>
  21. #include <drm/drm_bridge.h>
  22. #include <drm/drm_bridge_connector.h>
  23. #include <drm/drm_crtc.h>
  24. #include <drm/drm_edid.h>
  25. #include <drm/drm_of.h>
  26. #include <drm/drm_simple_kms_helper.h>
  27. #include "mtk_ddp_comp.h"
  28. #include "mtk_disp_drv.h"
  29. #include "mtk_dpi_regs.h"
  30. #include "mtk_drm_drv.h"
  31. enum mtk_dpi_out_bit_num {
  32. MTK_DPI_OUT_BIT_NUM_8BITS,
  33. MTK_DPI_OUT_BIT_NUM_10BITS,
  34. MTK_DPI_OUT_BIT_NUM_12BITS,
  35. MTK_DPI_OUT_BIT_NUM_16BITS
  36. };
  37. enum mtk_dpi_out_yc_map {
  38. MTK_DPI_OUT_YC_MAP_RGB,
  39. MTK_DPI_OUT_YC_MAP_CYCY,
  40. MTK_DPI_OUT_YC_MAP_YCYC,
  41. MTK_DPI_OUT_YC_MAP_CY,
  42. MTK_DPI_OUT_YC_MAP_YC
  43. };
  44. enum mtk_dpi_out_channel_swap {
  45. MTK_DPI_OUT_CHANNEL_SWAP_RGB,
  46. MTK_DPI_OUT_CHANNEL_SWAP_GBR,
  47. MTK_DPI_OUT_CHANNEL_SWAP_BRG,
  48. MTK_DPI_OUT_CHANNEL_SWAP_RBG,
  49. MTK_DPI_OUT_CHANNEL_SWAP_GRB,
  50. MTK_DPI_OUT_CHANNEL_SWAP_BGR
  51. };
  52. enum mtk_dpi_out_color_format {
  53. MTK_DPI_COLOR_FORMAT_RGB,
  54. MTK_DPI_COLOR_FORMAT_YCBCR_422,
  55. MTK_DPI_COLOR_FORMAT_YCBCR_444
  56. };
  57. struct mtk_dpi {
  58. struct drm_encoder encoder;
  59. struct drm_bridge bridge;
  60. struct drm_bridge *next_bridge;
  61. struct drm_connector *connector;
  62. void __iomem *regs;
  63. struct device *dev;
  64. struct device *mmsys_dev;
  65. struct clk *engine_clk;
  66. struct clk *pixel_clk;
  67. struct clk *tvd_clk;
  68. int irq;
  69. struct drm_display_mode mode;
  70. const struct mtk_dpi_conf *conf;
  71. enum mtk_dpi_out_color_format color_format;
  72. enum mtk_dpi_out_yc_map yc_map;
  73. enum mtk_dpi_out_bit_num bit_num;
  74. enum mtk_dpi_out_channel_swap channel_swap;
  75. struct pinctrl *pinctrl;
  76. struct pinctrl_state *pins_gpio;
  77. struct pinctrl_state *pins_dpi;
  78. u32 output_fmt;
  79. int refcount;
  80. };
  81. static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b)
  82. {
  83. return container_of(b, struct mtk_dpi, bridge);
  84. }
  85. enum mtk_dpi_polarity {
  86. MTK_DPI_POLARITY_RISING,
  87. MTK_DPI_POLARITY_FALLING,
  88. };
  89. struct mtk_dpi_polarities {
  90. enum mtk_dpi_polarity de_pol;
  91. enum mtk_dpi_polarity ck_pol;
  92. enum mtk_dpi_polarity hsync_pol;
  93. enum mtk_dpi_polarity vsync_pol;
  94. };
  95. struct mtk_dpi_sync_param {
  96. u32 sync_width;
  97. u32 front_porch;
  98. u32 back_porch;
  99. bool shift_half_line;
  100. };
  101. struct mtk_dpi_yc_limit {
  102. u16 y_top;
  103. u16 y_bottom;
  104. u16 c_top;
  105. u16 c_bottom;
  106. };
  107. struct mtk_dpi_factor {
  108. u32 clock;
  109. u8 factor;
  110. };
  111. /**
  112. * struct mtk_dpi_conf - Configuration of mediatek dpi.
  113. * @dpi_factor: SoC-specific pixel clock PLL factor values.
  114. * @num_dpi_factor: Number of pixel clock PLL factor values.
  115. * @reg_h_fre_con: Register address of frequency control.
  116. * @max_clock_khz: Max clock frequency supported for this SoCs in khz units.
  117. * @edge_sel_en: Enable of edge selection.
  118. * @output_fmts: Array of supported output formats.
  119. * @num_output_fmts: Quantity of supported output formats.
  120. * @is_ck_de_pol: Support CK/DE polarity.
  121. * @swap_input_support: Support input swap function.
  122. * @support_direct_pin: IP supports direct connection to dpi panels.
  123. * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and VSYNC_PORCH
  124. * (no shift).
  125. * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift).
  126. * @channel_swap_shift: Shift value of channel swap.
  127. * @yuv422_en_bit: Enable bit of yuv422.
  128. * @csc_enable_bit: Enable bit of CSC.
  129. * @input_2p_en_bit: Enable bit for input two pixel per round feature.
  130. * If present, implies that the feature must be enabled.
  131. * @pixels_per_iter: Quantity of transferred pixels per iteration.
  132. * @edge_cfg_in_mmsys: If the edge configuration for DPI's output needs to be set in MMSYS.
  133. * @clocked_by_hdmi: HDMI IP outputs clock to dpi_pixel_clk input clock, needed
  134. * for DPI registers access.
  135. * @output_1pixel: Enable outputting one pixel per round; if the input is two pixel per
  136. * round, the DPI hardware will internally transform it to 1T1P.
  137. */
  138. struct mtk_dpi_conf {
  139. const struct mtk_dpi_factor *dpi_factor;
  140. const u8 num_dpi_factor;
  141. u32 reg_h_fre_con;
  142. u32 max_clock_khz;
  143. bool edge_sel_en;
  144. const u32 *output_fmts;
  145. u32 num_output_fmts;
  146. bool is_ck_de_pol;
  147. bool swap_input_support;
  148. bool support_direct_pin;
  149. u32 dimension_mask;
  150. u32 hvsize_mask;
  151. u32 channel_swap_shift;
  152. u32 yuv422_en_bit;
  153. u32 csc_enable_bit;
  154. u32 input_2p_en_bit;
  155. u32 pixels_per_iter;
  156. bool edge_cfg_in_mmsys;
  157. bool clocked_by_hdmi;
  158. bool output_1pixel;
  159. };
  160. static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask)
  161. {
  162. u32 tmp = readl(dpi->regs + offset) & ~mask;
  163. tmp |= (val & mask);
  164. writel(tmp, dpi->regs + offset);
  165. }
  166. static void mtk_dpi_test_pattern_en(struct mtk_dpi *dpi, u8 type, bool enable)
  167. {
  168. u32 val;
  169. if (enable)
  170. val = FIELD_PREP(DPI_PAT_SEL, type) | DPI_PAT_EN;
  171. else
  172. val = 0;
  173. mtk_dpi_mask(dpi, DPI_PATTERN0, val, DPI_PAT_SEL | DPI_PAT_EN);
  174. }
  175. static void mtk_dpi_sw_reset(struct mtk_dpi *dpi, bool reset)
  176. {
  177. mtk_dpi_mask(dpi, DPI_RET, reset ? RST : 0, RST);
  178. }
  179. static void mtk_dpi_enable(struct mtk_dpi *dpi)
  180. {
  181. mtk_dpi_mask(dpi, DPI_EN, EN, EN);
  182. }
  183. static void mtk_dpi_disable(struct mtk_dpi *dpi)
  184. {
  185. mtk_dpi_mask(dpi, DPI_EN, 0, EN);
  186. }
  187. static void mtk_dpi_config_hsync(struct mtk_dpi *dpi,
  188. struct mtk_dpi_sync_param *sync)
  189. {
  190. mtk_dpi_mask(dpi, DPI_TGEN_HWIDTH, sync->sync_width << HPW,
  191. dpi->conf->dimension_mask << HPW);
  192. mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, sync->back_porch << HBP,
  193. dpi->conf->dimension_mask << HBP);
  194. mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, sync->front_porch << HFP,
  195. dpi->conf->dimension_mask << HFP);
  196. }
  197. static void mtk_dpi_config_vsync(struct mtk_dpi *dpi,
  198. struct mtk_dpi_sync_param *sync,
  199. u32 width_addr, u32 porch_addr)
  200. {
  201. mtk_dpi_mask(dpi, width_addr,
  202. sync->shift_half_line << VSYNC_HALF_LINE_SHIFT,
  203. VSYNC_HALF_LINE_MASK);
  204. mtk_dpi_mask(dpi, width_addr,
  205. sync->sync_width << VSYNC_WIDTH_SHIFT,
  206. dpi->conf->dimension_mask << VSYNC_WIDTH_SHIFT);
  207. mtk_dpi_mask(dpi, porch_addr,
  208. sync->back_porch << VSYNC_BACK_PORCH_SHIFT,
  209. dpi->conf->dimension_mask << VSYNC_BACK_PORCH_SHIFT);
  210. mtk_dpi_mask(dpi, porch_addr,
  211. sync->front_porch << VSYNC_FRONT_PORCH_SHIFT,
  212. dpi->conf->dimension_mask << VSYNC_FRONT_PORCH_SHIFT);
  213. }
  214. static void mtk_dpi_config_vsync_lodd(struct mtk_dpi *dpi,
  215. struct mtk_dpi_sync_param *sync)
  216. {
  217. mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH, DPI_TGEN_VPORCH);
  218. }
  219. static void mtk_dpi_config_vsync_leven(struct mtk_dpi *dpi,
  220. struct mtk_dpi_sync_param *sync)
  221. {
  222. mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_LEVEN,
  223. DPI_TGEN_VPORCH_LEVEN);
  224. }
  225. static void mtk_dpi_config_vsync_rodd(struct mtk_dpi *dpi,
  226. struct mtk_dpi_sync_param *sync)
  227. {
  228. mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_RODD,
  229. DPI_TGEN_VPORCH_RODD);
  230. }
  231. static void mtk_dpi_config_vsync_reven(struct mtk_dpi *dpi,
  232. struct mtk_dpi_sync_param *sync)
  233. {
  234. mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_REVEN,
  235. DPI_TGEN_VPORCH_REVEN);
  236. }
  237. static void mtk_dpi_config_pol(struct mtk_dpi *dpi,
  238. struct mtk_dpi_polarities *dpi_pol)
  239. {
  240. unsigned int pol;
  241. unsigned int mask;
  242. mask = HSYNC_POL | VSYNC_POL;
  243. pol = (dpi_pol->hsync_pol == MTK_DPI_POLARITY_RISING ? 0 : HSYNC_POL) |
  244. (dpi_pol->vsync_pol == MTK_DPI_POLARITY_RISING ? 0 : VSYNC_POL);
  245. if (dpi->conf->is_ck_de_pol) {
  246. mask |= CK_POL | DE_POL;
  247. pol |= (dpi_pol->ck_pol == MTK_DPI_POLARITY_RISING ?
  248. 0 : CK_POL) |
  249. (dpi_pol->de_pol == MTK_DPI_POLARITY_RISING ?
  250. 0 : DE_POL);
  251. }
  252. mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, pol, mask);
  253. }
  254. static void mtk_dpi_config_3d(struct mtk_dpi *dpi, bool en_3d)
  255. {
  256. mtk_dpi_mask(dpi, DPI_CON, en_3d ? TDFP_EN : 0, TDFP_EN);
  257. }
  258. static void mtk_dpi_config_interface(struct mtk_dpi *dpi, bool inter)
  259. {
  260. mtk_dpi_mask(dpi, DPI_CON, inter ? INTL_EN : 0, INTL_EN);
  261. }
  262. static void mtk_dpi_config_fb_size(struct mtk_dpi *dpi, u32 width, u32 height)
  263. {
  264. mtk_dpi_mask(dpi, DPI_SIZE, width << HSIZE,
  265. dpi->conf->hvsize_mask << HSIZE);
  266. mtk_dpi_mask(dpi, DPI_SIZE, height << VSIZE,
  267. dpi->conf->hvsize_mask << VSIZE);
  268. }
  269. static void mtk_dpi_config_channel_limit(struct mtk_dpi *dpi)
  270. {
  271. struct mtk_dpi_yc_limit limit;
  272. if (drm_default_rgb_quant_range(&dpi->mode) ==
  273. HDMI_QUANTIZATION_RANGE_LIMITED) {
  274. limit.y_bottom = 0x10;
  275. limit.y_top = 0xfe0;
  276. limit.c_bottom = 0x10;
  277. limit.c_top = 0xfe0;
  278. } else {
  279. limit.y_bottom = 0;
  280. limit.y_top = 0xfff;
  281. limit.c_bottom = 0;
  282. limit.c_top = 0xfff;
  283. }
  284. mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit.y_bottom << Y_LIMINT_BOT,
  285. Y_LIMINT_BOT_MASK);
  286. mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit.y_top << Y_LIMINT_TOP,
  287. Y_LIMINT_TOP_MASK);
  288. mtk_dpi_mask(dpi, DPI_C_LIMIT, limit.c_bottom << C_LIMIT_BOT,
  289. C_LIMIT_BOT_MASK);
  290. mtk_dpi_mask(dpi, DPI_C_LIMIT, limit.c_top << C_LIMIT_TOP,
  291. C_LIMIT_TOP_MASK);
  292. }
  293. static void mtk_dpi_config_bit_num(struct mtk_dpi *dpi,
  294. enum mtk_dpi_out_bit_num num)
  295. {
  296. u32 val;
  297. switch (num) {
  298. case MTK_DPI_OUT_BIT_NUM_8BITS:
  299. val = OUT_BIT_8;
  300. break;
  301. case MTK_DPI_OUT_BIT_NUM_10BITS:
  302. val = OUT_BIT_10;
  303. break;
  304. case MTK_DPI_OUT_BIT_NUM_12BITS:
  305. val = OUT_BIT_12;
  306. break;
  307. case MTK_DPI_OUT_BIT_NUM_16BITS:
  308. val = OUT_BIT_16;
  309. break;
  310. default:
  311. val = OUT_BIT_8;
  312. break;
  313. }
  314. mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << OUT_BIT,
  315. OUT_BIT_MASK);
  316. }
  317. static void mtk_dpi_config_yc_map(struct mtk_dpi *dpi,
  318. enum mtk_dpi_out_yc_map map)
  319. {
  320. u32 val;
  321. switch (map) {
  322. case MTK_DPI_OUT_YC_MAP_RGB:
  323. val = YC_MAP_RGB;
  324. break;
  325. case MTK_DPI_OUT_YC_MAP_CYCY:
  326. val = YC_MAP_CYCY;
  327. break;
  328. case MTK_DPI_OUT_YC_MAP_YCYC:
  329. val = YC_MAP_YCYC;
  330. break;
  331. case MTK_DPI_OUT_YC_MAP_CY:
  332. val = YC_MAP_CY;
  333. break;
  334. case MTK_DPI_OUT_YC_MAP_YC:
  335. val = YC_MAP_YC;
  336. break;
  337. default:
  338. val = YC_MAP_RGB;
  339. break;
  340. }
  341. mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << YC_MAP, YC_MAP_MASK);
  342. }
  343. static void mtk_dpi_config_channel_swap(struct mtk_dpi *dpi,
  344. enum mtk_dpi_out_channel_swap swap)
  345. {
  346. u32 val;
  347. switch (swap) {
  348. case MTK_DPI_OUT_CHANNEL_SWAP_RGB:
  349. val = SWAP_RGB;
  350. break;
  351. case MTK_DPI_OUT_CHANNEL_SWAP_GBR:
  352. val = SWAP_GBR;
  353. break;
  354. case MTK_DPI_OUT_CHANNEL_SWAP_BRG:
  355. val = SWAP_BRG;
  356. break;
  357. case MTK_DPI_OUT_CHANNEL_SWAP_RBG:
  358. val = SWAP_RBG;
  359. break;
  360. case MTK_DPI_OUT_CHANNEL_SWAP_GRB:
  361. val = SWAP_GRB;
  362. break;
  363. case MTK_DPI_OUT_CHANNEL_SWAP_BGR:
  364. val = SWAP_BGR;
  365. break;
  366. default:
  367. val = SWAP_RGB;
  368. break;
  369. }
  370. mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING,
  371. val << dpi->conf->channel_swap_shift,
  372. CH_SWAP_MASK << dpi->conf->channel_swap_shift);
  373. }
  374. static void mtk_dpi_config_yuv422_enable(struct mtk_dpi *dpi, bool enable)
  375. {
  376. mtk_dpi_mask(dpi, DPI_CON, enable ? dpi->conf->yuv422_en_bit : 0,
  377. dpi->conf->yuv422_en_bit);
  378. }
  379. static void mtk_dpi_config_csc_enable(struct mtk_dpi *dpi, bool enable)
  380. {
  381. mtk_dpi_mask(dpi, DPI_CON, enable ? dpi->conf->csc_enable_bit : 0,
  382. dpi->conf->csc_enable_bit);
  383. }
  384. static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool enable)
  385. {
  386. mtk_dpi_mask(dpi, DPI_CON, enable ? IN_RB_SWAP : 0, IN_RB_SWAP);
  387. }
  388. static void mtk_dpi_config_2n_h_fre(struct mtk_dpi *dpi)
  389. {
  390. if (dpi->conf->reg_h_fre_con)
  391. mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N);
  392. }
  393. static void mtk_dpi_config_disable_edge(struct mtk_dpi *dpi)
  394. {
  395. if (dpi->conf->edge_sel_en && dpi->conf->reg_h_fre_con)
  396. mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, EDGE_SEL_EN);
  397. }
  398. static void mtk_dpi_config_color_format(struct mtk_dpi *dpi,
  399. enum mtk_dpi_out_color_format format)
  400. {
  401. mtk_dpi_config_channel_swap(dpi, dpi->channel_swap);
  402. switch (format) {
  403. case MTK_DPI_COLOR_FORMAT_YCBCR_444:
  404. mtk_dpi_config_yuv422_enable(dpi, false);
  405. mtk_dpi_config_csc_enable(dpi, true);
  406. if (dpi->conf->swap_input_support)
  407. mtk_dpi_config_swap_input(dpi, false);
  408. break;
  409. case MTK_DPI_COLOR_FORMAT_YCBCR_422:
  410. mtk_dpi_config_yuv422_enable(dpi, true);
  411. mtk_dpi_config_csc_enable(dpi, true);
  412. /*
  413. * If height is smaller than 720, we need to use RGB_TO_BT601
  414. * to transfer to yuv422. Otherwise, we use RGB_TO_JPEG.
  415. */
  416. mtk_dpi_mask(dpi, DPI_MATRIX_SET, dpi->mode.hdisplay <= 720 ?
  417. MATRIX_SEL_RGB_TO_BT601 : MATRIX_SEL_RGB_TO_JPEG,
  418. INT_MATRIX_SEL_MASK);
  419. break;
  420. default:
  421. case MTK_DPI_COLOR_FORMAT_RGB:
  422. mtk_dpi_config_yuv422_enable(dpi, false);
  423. mtk_dpi_config_csc_enable(dpi, false);
  424. if (dpi->conf->swap_input_support)
  425. mtk_dpi_config_swap_input(dpi, false);
  426. break;
  427. }
  428. }
  429. static void mtk_dpi_dual_edge(struct mtk_dpi *dpi)
  430. {
  431. if ((dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_LE) ||
  432. (dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_BE)) {
  433. mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE,
  434. DDR_EN | DDR_4PHASE);
  435. mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING,
  436. dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_LE ?
  437. EDGE_SEL : 0, EDGE_SEL);
  438. if (dpi->conf->edge_cfg_in_mmsys)
  439. mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, MTK_DPI_RGB888_DDR_CON);
  440. } else {
  441. mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE, 0);
  442. if (dpi->conf->edge_cfg_in_mmsys)
  443. mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, MTK_DPI_RGB888_SDR_CON);
  444. }
  445. }
  446. static void mtk_dpi_power_off(struct mtk_dpi *dpi)
  447. {
  448. if (WARN_ON(dpi->refcount == 0))
  449. return;
  450. if (--dpi->refcount != 0)
  451. return;
  452. mtk_dpi_disable(dpi);
  453. clk_disable_unprepare(dpi->pixel_clk);
  454. clk_disable_unprepare(dpi->tvd_clk);
  455. clk_disable_unprepare(dpi->engine_clk);
  456. }
  457. static int mtk_dpi_power_on(struct mtk_dpi *dpi)
  458. {
  459. int ret;
  460. if (++dpi->refcount != 1)
  461. return 0;
  462. ret = clk_prepare_enable(dpi->engine_clk);
  463. if (ret) {
  464. dev_err(dpi->dev, "Failed to enable engine clock: %d\n", ret);
  465. goto err_refcount;
  466. }
  467. ret = clk_prepare_enable(dpi->tvd_clk);
  468. if (ret) {
  469. dev_err(dpi->dev, "Failed to enable tvd pll: %d\n", ret);
  470. goto err_engine;
  471. }
  472. ret = clk_prepare_enable(dpi->pixel_clk);
  473. if (ret) {
  474. dev_err(dpi->dev, "Failed to enable pixel clock: %d\n", ret);
  475. goto err_pixel;
  476. }
  477. return 0;
  478. err_pixel:
  479. clk_disable_unprepare(dpi->tvd_clk);
  480. err_engine:
  481. clk_disable_unprepare(dpi->engine_clk);
  482. err_refcount:
  483. dpi->refcount--;
  484. return ret;
  485. }
  486. static unsigned int mtk_dpi_calculate_factor(struct mtk_dpi *dpi, int mode_clk)
  487. {
  488. const struct mtk_dpi_factor *dpi_factor = dpi->conf->dpi_factor;
  489. int i;
  490. for (i = 0; i < dpi->conf->num_dpi_factor; i++) {
  491. if (mode_clk <= dpi_factor[i].clock)
  492. return dpi_factor[i].factor;
  493. }
  494. /* If no match try the lowest possible factor */
  495. return dpi_factor[dpi->conf->num_dpi_factor - 1].factor;
  496. }
  497. static void mtk_dpi_set_pixel_clk(struct mtk_dpi *dpi, struct videomode *vm, int mode_clk)
  498. {
  499. unsigned long pll_rate;
  500. unsigned int factor;
  501. /* let pll_rate can fix the valid range of tvdpll (1G~2GHz) */
  502. factor = mtk_dpi_calculate_factor(dpi, mode_clk);
  503. pll_rate = vm->pixelclock * factor;
  504. dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n",
  505. pll_rate, vm->pixelclock);
  506. clk_set_rate(dpi->tvd_clk, pll_rate);
  507. pll_rate = clk_get_rate(dpi->tvd_clk);
  508. /*
  509. * Depending on the IP version, we may output a different amount of
  510. * pixels for each iteration: divide the clock by this number and
  511. * adjust the display porches accordingly.
  512. */
  513. vm->pixelclock = pll_rate / factor;
  514. vm->pixelclock /= dpi->conf->pixels_per_iter;
  515. if ((dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_LE) ||
  516. (dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_BE))
  517. clk_set_rate(dpi->pixel_clk, vm->pixelclock * 2);
  518. else
  519. clk_set_rate(dpi->pixel_clk, vm->pixelclock);
  520. vm->pixelclock = clk_get_rate(dpi->pixel_clk);
  521. dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n",
  522. pll_rate, vm->pixelclock);
  523. }
  524. static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
  525. struct drm_display_mode *mode)
  526. {
  527. struct mtk_dpi_polarities dpi_pol;
  528. struct mtk_dpi_sync_param hsync;
  529. struct mtk_dpi_sync_param vsync_lodd = { 0 };
  530. struct mtk_dpi_sync_param vsync_leven = { 0 };
  531. struct mtk_dpi_sync_param vsync_rodd = { 0 };
  532. struct mtk_dpi_sync_param vsync_reven = { 0 };
  533. struct videomode vm = { 0 };
  534. drm_display_mode_to_videomode(mode, &vm);
  535. if (!dpi->conf->clocked_by_hdmi)
  536. mtk_dpi_set_pixel_clk(dpi, &vm, mode->clock);
  537. dpi_pol.ck_pol = MTK_DPI_POLARITY_FALLING;
  538. dpi_pol.de_pol = MTK_DPI_POLARITY_RISING;
  539. dpi_pol.hsync_pol = vm.flags & DISPLAY_FLAGS_HSYNC_HIGH ?
  540. MTK_DPI_POLARITY_FALLING : MTK_DPI_POLARITY_RISING;
  541. dpi_pol.vsync_pol = vm.flags & DISPLAY_FLAGS_VSYNC_HIGH ?
  542. MTK_DPI_POLARITY_FALLING : MTK_DPI_POLARITY_RISING;
  543. /*
  544. * Depending on the IP version, we may output a different amount of
  545. * pixels for each iteration: divide the clock by this number and
  546. * adjust the display porches accordingly.
  547. */
  548. hsync.sync_width = vm.hsync_len / dpi->conf->pixels_per_iter;
  549. hsync.back_porch = vm.hback_porch / dpi->conf->pixels_per_iter;
  550. hsync.front_porch = vm.hfront_porch / dpi->conf->pixels_per_iter;
  551. hsync.shift_half_line = false;
  552. vsync_lodd.sync_width = vm.vsync_len;
  553. vsync_lodd.back_porch = vm.vback_porch;
  554. vsync_lodd.front_porch = vm.vfront_porch;
  555. vsync_lodd.shift_half_line = false;
  556. if (vm.flags & DISPLAY_FLAGS_INTERLACED &&
  557. mode->flags & DRM_MODE_FLAG_3D_MASK) {
  558. vsync_leven = vsync_lodd;
  559. vsync_rodd = vsync_lodd;
  560. vsync_reven = vsync_lodd;
  561. vsync_leven.shift_half_line = true;
  562. vsync_reven.shift_half_line = true;
  563. } else if (vm.flags & DISPLAY_FLAGS_INTERLACED &&
  564. !(mode->flags & DRM_MODE_FLAG_3D_MASK)) {
  565. vsync_leven = vsync_lodd;
  566. vsync_leven.shift_half_line = true;
  567. } else if (!(vm.flags & DISPLAY_FLAGS_INTERLACED) &&
  568. mode->flags & DRM_MODE_FLAG_3D_MASK) {
  569. vsync_rodd = vsync_lodd;
  570. }
  571. mtk_dpi_sw_reset(dpi, true);
  572. mtk_dpi_config_pol(dpi, &dpi_pol);
  573. mtk_dpi_config_hsync(dpi, &hsync);
  574. mtk_dpi_config_vsync_lodd(dpi, &vsync_lodd);
  575. mtk_dpi_config_vsync_rodd(dpi, &vsync_rodd);
  576. mtk_dpi_config_vsync_leven(dpi, &vsync_leven);
  577. mtk_dpi_config_vsync_reven(dpi, &vsync_reven);
  578. mtk_dpi_config_3d(dpi, !!(mode->flags & DRM_MODE_FLAG_3D_MASK));
  579. mtk_dpi_config_interface(dpi, !!(vm.flags &
  580. DISPLAY_FLAGS_INTERLACED));
  581. if (vm.flags & DISPLAY_FLAGS_INTERLACED)
  582. mtk_dpi_config_fb_size(dpi, vm.hactive, vm.vactive >> 1);
  583. else
  584. mtk_dpi_config_fb_size(dpi, vm.hactive, vm.vactive);
  585. mtk_dpi_config_channel_limit(dpi);
  586. mtk_dpi_config_bit_num(dpi, dpi->bit_num);
  587. mtk_dpi_config_channel_swap(dpi, dpi->channel_swap);
  588. mtk_dpi_config_color_format(dpi, dpi->color_format);
  589. if (dpi->conf->support_direct_pin) {
  590. mtk_dpi_config_yc_map(dpi, dpi->yc_map);
  591. mtk_dpi_config_2n_h_fre(dpi);
  592. /* DPI can connect to either an external bridge or the internal HDMI encoder */
  593. if (dpi->conf->output_1pixel)
  594. mtk_dpi_mask(dpi, DPI_CON, DPI_OUTPUT_1T1P_EN, DPI_OUTPUT_1T1P_EN);
  595. else
  596. mtk_dpi_dual_edge(dpi);
  597. mtk_dpi_config_disable_edge(dpi);
  598. }
  599. if (dpi->conf->input_2p_en_bit) {
  600. mtk_dpi_mask(dpi, DPI_CON, dpi->conf->input_2p_en_bit,
  601. dpi->conf->input_2p_en_bit);
  602. }
  603. mtk_dpi_sw_reset(dpi, false);
  604. return 0;
  605. }
  606. static u32 *mtk_dpi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
  607. struct drm_bridge_state *bridge_state,
  608. struct drm_crtc_state *crtc_state,
  609. struct drm_connector_state *conn_state,
  610. unsigned int *num_output_fmts)
  611. {
  612. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  613. u32 *output_fmts;
  614. *num_output_fmts = 0;
  615. if (!dpi->conf->output_fmts) {
  616. dev_err(dpi->dev, "output_fmts should not be null\n");
  617. return NULL;
  618. }
  619. output_fmts = kcalloc(dpi->conf->num_output_fmts, sizeof(*output_fmts),
  620. GFP_KERNEL);
  621. if (!output_fmts)
  622. return NULL;
  623. *num_output_fmts = dpi->conf->num_output_fmts;
  624. memcpy(output_fmts, dpi->conf->output_fmts,
  625. sizeof(*output_fmts) * dpi->conf->num_output_fmts);
  626. return output_fmts;
  627. }
  628. static u32 *mtk_dpi_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  629. struct drm_bridge_state *bridge_state,
  630. struct drm_crtc_state *crtc_state,
  631. struct drm_connector_state *conn_state,
  632. u32 output_fmt,
  633. unsigned int *num_input_fmts)
  634. {
  635. u32 *input_fmts;
  636. *num_input_fmts = 0;
  637. input_fmts = kcalloc(1, sizeof(*input_fmts),
  638. GFP_KERNEL);
  639. if (!input_fmts)
  640. return NULL;
  641. *num_input_fmts = 1;
  642. input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
  643. return input_fmts;
  644. }
  645. static unsigned int mtk_dpi_bus_fmt_bit_num(unsigned int out_bus_format)
  646. {
  647. switch (out_bus_format) {
  648. default:
  649. case MEDIA_BUS_FMT_RGB888_1X24:
  650. case MEDIA_BUS_FMT_BGR888_1X24:
  651. case MEDIA_BUS_FMT_RGB888_2X12_LE:
  652. case MEDIA_BUS_FMT_RGB888_2X12_BE:
  653. case MEDIA_BUS_FMT_YUYV8_1X16:
  654. case MEDIA_BUS_FMT_YUV8_1X24:
  655. return MTK_DPI_OUT_BIT_NUM_8BITS;
  656. case MEDIA_BUS_FMT_RGB101010_1X30:
  657. case MEDIA_BUS_FMT_YUYV10_1X20:
  658. case MEDIA_BUS_FMT_YUV10_1X30:
  659. return MTK_DPI_OUT_BIT_NUM_10BITS;
  660. case MEDIA_BUS_FMT_YUYV12_1X24:
  661. return MTK_DPI_OUT_BIT_NUM_12BITS;
  662. }
  663. }
  664. static unsigned int mtk_dpi_bus_fmt_channel_swap(unsigned int out_bus_format)
  665. {
  666. switch (out_bus_format) {
  667. default:
  668. case MEDIA_BUS_FMT_RGB888_1X24:
  669. case MEDIA_BUS_FMT_RGB888_2X12_LE:
  670. case MEDIA_BUS_FMT_RGB888_2X12_BE:
  671. case MEDIA_BUS_FMT_RGB101010_1X30:
  672. case MEDIA_BUS_FMT_YUYV8_1X16:
  673. case MEDIA_BUS_FMT_YUYV10_1X20:
  674. case MEDIA_BUS_FMT_YUYV12_1X24:
  675. return MTK_DPI_OUT_CHANNEL_SWAP_RGB;
  676. case MEDIA_BUS_FMT_BGR888_1X24:
  677. case MEDIA_BUS_FMT_YUV8_1X24:
  678. case MEDIA_BUS_FMT_YUV10_1X30:
  679. return MTK_DPI_OUT_CHANNEL_SWAP_BGR;
  680. }
  681. }
  682. static unsigned int mtk_dpi_bus_fmt_color_format(unsigned int out_bus_format)
  683. {
  684. switch (out_bus_format) {
  685. default:
  686. case MEDIA_BUS_FMT_RGB888_1X24:
  687. case MEDIA_BUS_FMT_BGR888_1X24:
  688. case MEDIA_BUS_FMT_RGB888_2X12_LE:
  689. case MEDIA_BUS_FMT_RGB888_2X12_BE:
  690. case MEDIA_BUS_FMT_RGB101010_1X30:
  691. return MTK_DPI_COLOR_FORMAT_RGB;
  692. case MEDIA_BUS_FMT_YUYV8_1X16:
  693. case MEDIA_BUS_FMT_YUYV10_1X20:
  694. case MEDIA_BUS_FMT_YUYV12_1X24:
  695. return MTK_DPI_COLOR_FORMAT_YCBCR_422;
  696. case MEDIA_BUS_FMT_YUV8_1X24:
  697. case MEDIA_BUS_FMT_YUV10_1X30:
  698. return MTK_DPI_COLOR_FORMAT_YCBCR_444;
  699. }
  700. }
  701. static int mtk_dpi_bridge_atomic_check(struct drm_bridge *bridge,
  702. struct drm_bridge_state *bridge_state,
  703. struct drm_crtc_state *crtc_state,
  704. struct drm_connector_state *conn_state)
  705. {
  706. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  707. unsigned int out_bus_format;
  708. out_bus_format = bridge_state->output_bus_cfg.format;
  709. if (out_bus_format == MEDIA_BUS_FMT_FIXED)
  710. if (dpi->conf->num_output_fmts)
  711. out_bus_format = dpi->conf->output_fmts[0];
  712. dev_dbg(dpi->dev, "input format 0x%04x, output format 0x%04x\n",
  713. bridge_state->input_bus_cfg.format,
  714. bridge_state->output_bus_cfg.format);
  715. dpi->output_fmt = out_bus_format;
  716. dpi->bit_num = mtk_dpi_bus_fmt_bit_num(out_bus_format);
  717. dpi->channel_swap = mtk_dpi_bus_fmt_channel_swap(out_bus_format);
  718. dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB;
  719. dpi->color_format = mtk_dpi_bus_fmt_color_format(out_bus_format);
  720. return 0;
  721. }
  722. static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
  723. struct drm_encoder *encoder,
  724. enum drm_bridge_attach_flags flags)
  725. {
  726. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  727. return drm_bridge_attach(encoder, dpi->next_bridge,
  728. &dpi->bridge, flags);
  729. }
  730. static void mtk_dpi_bridge_mode_set(struct drm_bridge *bridge,
  731. const struct drm_display_mode *mode,
  732. const struct drm_display_mode *adjusted_mode)
  733. {
  734. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  735. drm_mode_copy(&dpi->mode, adjusted_mode);
  736. }
  737. static void mtk_dpi_bridge_disable(struct drm_bridge *bridge)
  738. {
  739. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  740. mtk_dpi_power_off(dpi);
  741. if (dpi->pinctrl && dpi->pins_gpio)
  742. pinctrl_select_state(dpi->pinctrl, dpi->pins_gpio);
  743. }
  744. static void mtk_dpi_bridge_enable(struct drm_bridge *bridge)
  745. {
  746. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  747. if (dpi->pinctrl && dpi->pins_dpi)
  748. pinctrl_select_state(dpi->pinctrl, dpi->pins_dpi);
  749. mtk_dpi_power_on(dpi);
  750. mtk_dpi_set_display_mode(dpi, &dpi->mode);
  751. mtk_dpi_enable(dpi);
  752. }
  753. static enum drm_mode_status
  754. mtk_dpi_bridge_mode_valid(struct drm_bridge *bridge,
  755. const struct drm_display_info *info,
  756. const struct drm_display_mode *mode)
  757. {
  758. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  759. if (mode->clock > dpi->conf->max_clock_khz)
  760. return MODE_CLOCK_HIGH;
  761. return MODE_OK;
  762. }
  763. static int mtk_dpi_debug_tp_show(struct seq_file *m, void *arg)
  764. {
  765. struct mtk_dpi *dpi = m->private;
  766. bool en;
  767. u32 val;
  768. if (!dpi)
  769. return -EINVAL;
  770. val = readl(dpi->regs + DPI_PATTERN0);
  771. en = val & DPI_PAT_EN;
  772. val = FIELD_GET(DPI_PAT_SEL, val);
  773. seq_printf(m, "DPI Test Pattern: %s\n", en ? "Enabled" : "Disabled");
  774. if (en) {
  775. seq_printf(m, "Internal pattern %d: ", val);
  776. switch (val) {
  777. case 0:
  778. seq_puts(m, "256 Vertical Gray\n");
  779. break;
  780. case 1:
  781. seq_puts(m, "1024 Vertical Gray\n");
  782. break;
  783. case 2:
  784. seq_puts(m, "256 Horizontal Gray\n");
  785. break;
  786. case 3:
  787. seq_puts(m, "1024 Horizontal Gray\n");
  788. break;
  789. case 4:
  790. seq_puts(m, "Vertical Color bars\n");
  791. break;
  792. case 6:
  793. seq_puts(m, "Frame border\n");
  794. break;
  795. case 7:
  796. seq_puts(m, "Dot moire\n");
  797. break;
  798. default:
  799. seq_puts(m, "Invalid selection\n");
  800. break;
  801. }
  802. }
  803. return 0;
  804. }
  805. static ssize_t mtk_dpi_debug_tp_write(struct file *file, const char __user *ubuf,
  806. size_t len, loff_t *offp)
  807. {
  808. struct seq_file *m = file->private_data;
  809. u32 en, type;
  810. char buf[6];
  811. if (!m || !m->private || *offp || len > sizeof(buf) - 1)
  812. return -EINVAL;
  813. memset(buf, 0, sizeof(buf));
  814. if (copy_from_user(buf, ubuf, len))
  815. return -EFAULT;
  816. if (sscanf(buf, "%u %u", &en, &type) != 2)
  817. return -EINVAL;
  818. if (en < 0 || en > 1 || type < 0 || type > 7)
  819. return -EINVAL;
  820. mtk_dpi_test_pattern_en((struct mtk_dpi *)m->private, type, en);
  821. return len;
  822. }
  823. static int mtk_dpi_debug_tp_open(struct inode *inode, struct file *file)
  824. {
  825. return single_open(file, mtk_dpi_debug_tp_show, inode->i_private);
  826. }
  827. static const struct file_operations mtk_dpi_debug_tp_fops = {
  828. .owner = THIS_MODULE,
  829. .open = mtk_dpi_debug_tp_open,
  830. .read = seq_read,
  831. .write = mtk_dpi_debug_tp_write,
  832. .llseek = seq_lseek,
  833. .release = single_release,
  834. };
  835. static void mtk_dpi_debugfs_init(struct drm_bridge *bridge, struct dentry *root)
  836. {
  837. struct mtk_dpi *dpi = bridge_to_dpi(bridge);
  838. debugfs_create_file("dpi_test_pattern", 0640, root, dpi, &mtk_dpi_debug_tp_fops);
  839. }
  840. static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
  841. .attach = mtk_dpi_bridge_attach,
  842. .mode_set = mtk_dpi_bridge_mode_set,
  843. .mode_valid = mtk_dpi_bridge_mode_valid,
  844. .disable = mtk_dpi_bridge_disable,
  845. .enable = mtk_dpi_bridge_enable,
  846. .atomic_check = mtk_dpi_bridge_atomic_check,
  847. .atomic_get_output_bus_fmts = mtk_dpi_bridge_atomic_get_output_bus_fmts,
  848. .atomic_get_input_bus_fmts = mtk_dpi_bridge_atomic_get_input_bus_fmts,
  849. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  850. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  851. .atomic_reset = drm_atomic_helper_bridge_reset,
  852. .debugfs_init = mtk_dpi_debugfs_init,
  853. };
  854. void mtk_dpi_start(struct device *dev)
  855. {
  856. struct mtk_dpi *dpi = dev_get_drvdata(dev);
  857. if (!dpi->conf->clocked_by_hdmi)
  858. mtk_dpi_power_on(dpi);
  859. }
  860. void mtk_dpi_stop(struct device *dev)
  861. {
  862. struct mtk_dpi *dpi = dev_get_drvdata(dev);
  863. if (!dpi->conf->clocked_by_hdmi)
  864. mtk_dpi_power_off(dpi);
  865. }
  866. unsigned int mtk_dpi_encoder_index(struct device *dev)
  867. {
  868. struct mtk_dpi *dpi = dev_get_drvdata(dev);
  869. unsigned int encoder_index = drm_encoder_index(&dpi->encoder);
  870. dev_dbg(dev, "encoder index:%d\n", encoder_index);
  871. return encoder_index;
  872. }
  873. static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
  874. {
  875. struct mtk_dpi *dpi = dev_get_drvdata(dev);
  876. struct drm_device *drm_dev = data;
  877. struct mtk_drm_private *priv = drm_dev->dev_private;
  878. int ret;
  879. dpi->mmsys_dev = priv->mmsys_dev;
  880. ret = drm_simple_encoder_init(drm_dev, &dpi->encoder,
  881. DRM_MODE_ENCODER_TMDS);
  882. if (ret) {
  883. dev_err(dev, "Failed to initialize decoder: %d\n", ret);
  884. return ret;
  885. }
  886. ret = mtk_find_possible_crtcs(drm_dev, dpi->dev);
  887. if (ret < 0)
  888. goto err_cleanup;
  889. dpi->encoder.possible_crtcs = ret;
  890. ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL,
  891. DRM_BRIDGE_ATTACH_NO_CONNECTOR);
  892. if (ret)
  893. goto err_cleanup;
  894. dpi->connector = drm_bridge_connector_init(drm_dev, &dpi->encoder);
  895. if (IS_ERR(dpi->connector)) {
  896. dev_err(dev, "Unable to create bridge connector\n");
  897. ret = PTR_ERR(dpi->connector);
  898. goto err_cleanup;
  899. }
  900. drm_connector_attach_encoder(dpi->connector, &dpi->encoder);
  901. return 0;
  902. err_cleanup:
  903. drm_encoder_cleanup(&dpi->encoder);
  904. return ret;
  905. }
  906. static void mtk_dpi_unbind(struct device *dev, struct device *master,
  907. void *data)
  908. {
  909. struct mtk_dpi *dpi = dev_get_drvdata(dev);
  910. drm_encoder_cleanup(&dpi->encoder);
  911. }
  912. static const struct component_ops mtk_dpi_component_ops = {
  913. .bind = mtk_dpi_bind,
  914. .unbind = mtk_dpi_unbind,
  915. };
  916. static const u32 mt8173_output_fmts[] = {
  917. MEDIA_BUS_FMT_RGB888_1X24,
  918. };
  919. static const u32 mt8183_output_fmts[] = {
  920. MEDIA_BUS_FMT_RGB888_2X12_LE,
  921. MEDIA_BUS_FMT_RGB888_2X12_BE,
  922. };
  923. static const u32 mt8195_dpi_output_fmts[] = {
  924. MEDIA_BUS_FMT_RGB888_1X24,
  925. MEDIA_BUS_FMT_RGB888_2X12_LE,
  926. MEDIA_BUS_FMT_RGB888_2X12_BE,
  927. MEDIA_BUS_FMT_RGB101010_1X30,
  928. MEDIA_BUS_FMT_YUYV8_1X16,
  929. MEDIA_BUS_FMT_YUYV10_1X20,
  930. MEDIA_BUS_FMT_YUYV12_1X24,
  931. MEDIA_BUS_FMT_BGR888_1X24,
  932. MEDIA_BUS_FMT_YUV8_1X24,
  933. MEDIA_BUS_FMT_YUV10_1X30,
  934. };
  935. static const u32 mt8195_dp_intf_output_fmts[] = {
  936. MEDIA_BUS_FMT_RGB888_1X24,
  937. MEDIA_BUS_FMT_RGB888_2X12_LE,
  938. MEDIA_BUS_FMT_RGB888_2X12_BE,
  939. MEDIA_BUS_FMT_RGB101010_1X30,
  940. MEDIA_BUS_FMT_YUYV8_1X16,
  941. MEDIA_BUS_FMT_YUYV10_1X20,
  942. MEDIA_BUS_FMT_BGR888_1X24,
  943. MEDIA_BUS_FMT_YUV8_1X24,
  944. MEDIA_BUS_FMT_YUV10_1X30,
  945. };
  946. static const struct mtk_dpi_factor dpi_factor_mt2701[] = {
  947. { 64000, 4 }, { 128000, 2 }, { U32_MAX, 1 }
  948. };
  949. static const struct mtk_dpi_factor dpi_factor_mt8173[] = {
  950. { 27000, 48 }, { 84000, 24 }, { 167000, 12 }, { U32_MAX, 6 }
  951. };
  952. static const struct mtk_dpi_factor dpi_factor_mt8183[] = {
  953. { 27000, 8 }, { 167000, 4 }, { U32_MAX, 2 }
  954. };
  955. static const struct mtk_dpi_factor dpi_factor_mt8195_dp_intf[] = {
  956. { 70000 - 1, 4 }, { 200000 - 1, 2 }, { U32_MAX, 1 }
  957. };
  958. static const struct mtk_dpi_conf mt8173_conf = {
  959. .dpi_factor = dpi_factor_mt8173,
  960. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt8173),
  961. .reg_h_fre_con = 0xe0,
  962. .max_clock_khz = 300000,
  963. .output_fmts = mt8173_output_fmts,
  964. .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts),
  965. .pixels_per_iter = 1,
  966. .is_ck_de_pol = true,
  967. .swap_input_support = true,
  968. .support_direct_pin = true,
  969. .dimension_mask = HPW_MASK,
  970. .hvsize_mask = HSIZE_MASK,
  971. .channel_swap_shift = CH_SWAP,
  972. .yuv422_en_bit = YUV422_EN,
  973. .csc_enable_bit = CSC_ENABLE,
  974. };
  975. static const struct mtk_dpi_conf mt2701_conf = {
  976. .dpi_factor = dpi_factor_mt2701,
  977. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt2701),
  978. .reg_h_fre_con = 0xb0,
  979. .edge_sel_en = true,
  980. .max_clock_khz = 150000,
  981. .output_fmts = mt8173_output_fmts,
  982. .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts),
  983. .pixels_per_iter = 1,
  984. .is_ck_de_pol = true,
  985. .swap_input_support = true,
  986. .support_direct_pin = true,
  987. .dimension_mask = HPW_MASK,
  988. .hvsize_mask = HSIZE_MASK,
  989. .channel_swap_shift = CH_SWAP,
  990. .yuv422_en_bit = YUV422_EN,
  991. .csc_enable_bit = CSC_ENABLE,
  992. };
  993. static const struct mtk_dpi_conf mt8183_conf = {
  994. .dpi_factor = dpi_factor_mt8183,
  995. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt8183),
  996. .reg_h_fre_con = 0xe0,
  997. .max_clock_khz = 100000,
  998. .output_fmts = mt8183_output_fmts,
  999. .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts),
  1000. .pixels_per_iter = 1,
  1001. .is_ck_de_pol = true,
  1002. .swap_input_support = true,
  1003. .support_direct_pin = true,
  1004. .dimension_mask = HPW_MASK,
  1005. .hvsize_mask = HSIZE_MASK,
  1006. .channel_swap_shift = CH_SWAP,
  1007. .yuv422_en_bit = YUV422_EN,
  1008. .csc_enable_bit = CSC_ENABLE,
  1009. };
  1010. static const struct mtk_dpi_conf mt8186_conf = {
  1011. .dpi_factor = dpi_factor_mt8183,
  1012. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt8183),
  1013. .reg_h_fre_con = 0xe0,
  1014. .max_clock_khz = 150000,
  1015. .output_fmts = mt8183_output_fmts,
  1016. .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts),
  1017. .edge_cfg_in_mmsys = true,
  1018. .pixels_per_iter = 1,
  1019. .is_ck_de_pol = true,
  1020. .swap_input_support = true,
  1021. .support_direct_pin = true,
  1022. .dimension_mask = HPW_MASK,
  1023. .hvsize_mask = HSIZE_MASK,
  1024. .channel_swap_shift = CH_SWAP,
  1025. .yuv422_en_bit = YUV422_EN,
  1026. .csc_enable_bit = CSC_ENABLE,
  1027. };
  1028. static const struct mtk_dpi_conf mt8192_conf = {
  1029. .dpi_factor = dpi_factor_mt8183,
  1030. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt8183),
  1031. .reg_h_fre_con = 0xe0,
  1032. .max_clock_khz = 150000,
  1033. .output_fmts = mt8183_output_fmts,
  1034. .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts),
  1035. .pixels_per_iter = 1,
  1036. .is_ck_de_pol = true,
  1037. .swap_input_support = true,
  1038. .support_direct_pin = true,
  1039. .dimension_mask = HPW_MASK,
  1040. .hvsize_mask = HSIZE_MASK,
  1041. .channel_swap_shift = CH_SWAP,
  1042. .yuv422_en_bit = YUV422_EN,
  1043. .csc_enable_bit = CSC_ENABLE,
  1044. };
  1045. static const struct mtk_dpi_conf mt8195_conf = {
  1046. .max_clock_khz = 594000,
  1047. .output_fmts = mt8195_dpi_output_fmts,
  1048. .num_output_fmts = ARRAY_SIZE(mt8195_dpi_output_fmts),
  1049. .pixels_per_iter = 1,
  1050. .is_ck_de_pol = true,
  1051. .swap_input_support = true,
  1052. .support_direct_pin = true,
  1053. .dimension_mask = HPW_MASK,
  1054. .hvsize_mask = HSIZE_MASK,
  1055. .channel_swap_shift = CH_SWAP,
  1056. .yuv422_en_bit = YUV422_EN,
  1057. .csc_enable_bit = CSC_ENABLE,
  1058. .input_2p_en_bit = DPI_INPUT_2P_EN,
  1059. .clocked_by_hdmi = true,
  1060. .output_1pixel = true,
  1061. };
  1062. static const struct mtk_dpi_conf mt8195_dpintf_conf = {
  1063. .dpi_factor = dpi_factor_mt8195_dp_intf,
  1064. .num_dpi_factor = ARRAY_SIZE(dpi_factor_mt8195_dp_intf),
  1065. .max_clock_khz = 600000,
  1066. .output_fmts = mt8195_dp_intf_output_fmts,
  1067. .num_output_fmts = ARRAY_SIZE(mt8195_dp_intf_output_fmts),
  1068. .pixels_per_iter = 4,
  1069. .dimension_mask = DPINTF_HPW_MASK,
  1070. .hvsize_mask = DPINTF_HSIZE_MASK,
  1071. .channel_swap_shift = DPINTF_CH_SWAP,
  1072. .yuv422_en_bit = DPINTF_YUV422_EN,
  1073. .csc_enable_bit = DPINTF_CSC_ENABLE,
  1074. .input_2p_en_bit = DPINTF_INPUT_2P_EN,
  1075. };
  1076. static int mtk_dpi_probe(struct platform_device *pdev)
  1077. {
  1078. struct device *dev = &pdev->dev;
  1079. struct mtk_dpi *dpi;
  1080. int ret;
  1081. dpi = devm_drm_bridge_alloc(dev, struct mtk_dpi, bridge,
  1082. &mtk_dpi_bridge_funcs);
  1083. if (IS_ERR(dpi))
  1084. return PTR_ERR(dpi);
  1085. dpi->dev = dev;
  1086. dpi->conf = (struct mtk_dpi_conf *)of_device_get_match_data(dev);
  1087. dpi->output_fmt = MEDIA_BUS_FMT_RGB888_1X24;
  1088. dpi->pinctrl = devm_pinctrl_get(&pdev->dev);
  1089. if (IS_ERR(dpi->pinctrl)) {
  1090. dpi->pinctrl = NULL;
  1091. dev_dbg(&pdev->dev, "Cannot find pinctrl!\n");
  1092. }
  1093. if (dpi->pinctrl) {
  1094. dpi->pins_gpio = pinctrl_lookup_state(dpi->pinctrl, "sleep");
  1095. if (IS_ERR(dpi->pins_gpio)) {
  1096. dpi->pins_gpio = NULL;
  1097. dev_dbg(&pdev->dev, "Cannot find pinctrl idle!\n");
  1098. }
  1099. if (dpi->pins_gpio)
  1100. pinctrl_select_state(dpi->pinctrl, dpi->pins_gpio);
  1101. dpi->pins_dpi = pinctrl_lookup_state(dpi->pinctrl, "default");
  1102. if (IS_ERR(dpi->pins_dpi)) {
  1103. dpi->pins_dpi = NULL;
  1104. dev_dbg(&pdev->dev, "Cannot find pinctrl active!\n");
  1105. }
  1106. }
  1107. dpi->regs = devm_platform_ioremap_resource(pdev, 0);
  1108. if (IS_ERR(dpi->regs))
  1109. return dev_err_probe(dev, PTR_ERR(dpi->regs),
  1110. "Failed to ioremap mem resource\n");
  1111. dpi->engine_clk = devm_clk_get(dev, "engine");
  1112. if (IS_ERR(dpi->engine_clk))
  1113. return dev_err_probe(dev, PTR_ERR(dpi->engine_clk),
  1114. "Failed to get engine clock\n");
  1115. dpi->pixel_clk = devm_clk_get(dev, "pixel");
  1116. if (IS_ERR(dpi->pixel_clk))
  1117. return dev_err_probe(dev, PTR_ERR(dpi->pixel_clk),
  1118. "Failed to get pixel clock\n");
  1119. dpi->tvd_clk = devm_clk_get(dev, "pll");
  1120. if (IS_ERR(dpi->tvd_clk))
  1121. return dev_err_probe(dev, PTR_ERR(dpi->tvd_clk),
  1122. "Failed to get tvdpll clock\n");
  1123. dpi->irq = platform_get_irq(pdev, 0);
  1124. if (dpi->irq < 0)
  1125. return dpi->irq;
  1126. dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 1, -1);
  1127. if (IS_ERR(dpi->next_bridge) && PTR_ERR(dpi->next_bridge) == -ENODEV) {
  1128. /* Old devicetree has only one endpoint */
  1129. dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 0, 0);
  1130. }
  1131. if (IS_ERR(dpi->next_bridge))
  1132. return dev_err_probe(dpi->dev, PTR_ERR(dpi->next_bridge),
  1133. "Failed to get bridge\n");
  1134. platform_set_drvdata(pdev, dpi);
  1135. dpi->bridge.of_node = dev->of_node;
  1136. dpi->bridge.type = DRM_MODE_CONNECTOR_DPI;
  1137. ret = devm_drm_bridge_add(dev, &dpi->bridge);
  1138. if (ret)
  1139. return ret;
  1140. ret = component_add(dev, &mtk_dpi_component_ops);
  1141. if (ret)
  1142. return dev_err_probe(dev, ret, "Failed to add component.\n");
  1143. return 0;
  1144. }
  1145. static void mtk_dpi_remove(struct platform_device *pdev)
  1146. {
  1147. component_del(&pdev->dev, &mtk_dpi_component_ops);
  1148. }
  1149. static const struct of_device_id mtk_dpi_of_ids[] = {
  1150. { .compatible = "mediatek,mt2701-dpi", .data = &mt2701_conf },
  1151. { .compatible = "mediatek,mt8173-dpi", .data = &mt8173_conf },
  1152. { .compatible = "mediatek,mt8183-dpi", .data = &mt8183_conf },
  1153. { .compatible = "mediatek,mt8186-dpi", .data = &mt8186_conf },
  1154. { .compatible = "mediatek,mt8188-dp-intf", .data = &mt8195_dpintf_conf },
  1155. { .compatible = "mediatek,mt8192-dpi", .data = &mt8192_conf },
  1156. { .compatible = "mediatek,mt8195-dp-intf", .data = &mt8195_dpintf_conf },
  1157. { .compatible = "mediatek,mt8195-dpi", .data = &mt8195_conf },
  1158. { /* sentinel */ },
  1159. };
  1160. MODULE_DEVICE_TABLE(of, mtk_dpi_of_ids);
  1161. struct platform_driver mtk_dpi_driver = {
  1162. .probe = mtk_dpi_probe,
  1163. .remove = mtk_dpi_remove,
  1164. .driver = {
  1165. .name = "mediatek-dpi",
  1166. .of_match_table = mtk_dpi_of_ids,
  1167. },
  1168. };