mtk_dpi.c 30 KB

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