kmb_dsi.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright © 2019-2020 Intel Corporation
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/delay.h>
  7. #include <linux/of.h>
  8. #include <linux/of_graph.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/regmap.h>
  12. #include <drm/drm_atomic_helper.h>
  13. #include <drm/drm_bridge.h>
  14. #include <drm/drm_bridge_connector.h>
  15. #include <drm/drm_mipi_dsi.h>
  16. #include <drm/drm_simple_kms_helper.h>
  17. #include <drm/drm_print.h>
  18. #include <drm/drm_probe_helper.h>
  19. #include "kmb_dsi.h"
  20. #include "kmb_regs.h"
  21. static struct mipi_dsi_host *dsi_host;
  22. static struct mipi_dsi_device *dsi_device;
  23. static struct drm_bridge *adv_bridge;
  24. /* Default setting is 1080p, 4 lanes */
  25. #define IMG_HEIGHT_LINES 1080
  26. #define IMG_WIDTH_PX 1920
  27. #define MIPI_TX_ACTIVE_LANES 4
  28. static struct mipi_tx_frame_section_cfg mipi_tx_frame0_sect_cfg = {
  29. .width_pixels = IMG_WIDTH_PX,
  30. .height_lines = IMG_HEIGHT_LINES,
  31. .data_type = DSI_LP_DT_PPS_RGB888_24B,
  32. .data_mode = MIPI_DATA_MODE1,
  33. .dma_packed = 0
  34. };
  35. static struct mipi_tx_frame_cfg mipitx_frame0_cfg = {
  36. .sections[0] = &mipi_tx_frame0_sect_cfg,
  37. .sections[1] = NULL,
  38. .sections[2] = NULL,
  39. .sections[3] = NULL,
  40. .vsync_width = 5,
  41. .v_backporch = 36,
  42. .v_frontporch = 4,
  43. .hsync_width = 44,
  44. .h_backporch = 148,
  45. .h_frontporch = 88
  46. };
  47. static const struct mipi_tx_dsi_cfg mipitx_dsi_cfg = {
  48. .hfp_blank_en = 0,
  49. .eotp_en = 0,
  50. .lpm_last_vfp_line = 0,
  51. .lpm_first_vsa_line = 0,
  52. .sync_pulse_eventn = DSI_VIDEO_MODE_NO_BURST_EVENT,
  53. .hfp_blanking = SEND_BLANK_PACKET,
  54. .hbp_blanking = SEND_BLANK_PACKET,
  55. .hsa_blanking = SEND_BLANK_PACKET,
  56. .v_blanking = SEND_BLANK_PACKET,
  57. };
  58. static struct mipi_ctrl_cfg mipi_tx_init_cfg = {
  59. .active_lanes = MIPI_TX_ACTIVE_LANES,
  60. .lane_rate_mbps = MIPI_TX_LANE_DATA_RATE_MBPS,
  61. .ref_clk_khz = MIPI_TX_REF_CLK_KHZ,
  62. .cfg_clk_khz = MIPI_TX_CFG_CLK_KHZ,
  63. .tx_ctrl_cfg = {
  64. .frames[0] = &mipitx_frame0_cfg,
  65. .frames[1] = NULL,
  66. .frames[2] = NULL,
  67. .frames[3] = NULL,
  68. .tx_dsi_cfg = &mipitx_dsi_cfg,
  69. .line_sync_pkt_en = 0,
  70. .line_counter_active = 0,
  71. .frame_counter_active = 0,
  72. .tx_always_use_hact = 1,
  73. .tx_hact_wait_stop = 1,
  74. }
  75. };
  76. struct mipi_hs_freq_range_cfg {
  77. u16 default_bit_rate_mbps;
  78. u8 hsfreqrange_code;
  79. };
  80. struct vco_params {
  81. u32 freq;
  82. u32 range;
  83. u32 divider;
  84. };
  85. static const struct vco_params vco_table[] = {
  86. {52, 0x3f, 8},
  87. {80, 0x39, 8},
  88. {105, 0x2f, 4},
  89. {160, 0x29, 4},
  90. {210, 0x1f, 2},
  91. {320, 0x19, 2},
  92. {420, 0x0f, 1},
  93. {630, 0x09, 1},
  94. {1100, 0x03, 1},
  95. {0xffff, 0x01, 1},
  96. };
  97. static const struct mipi_hs_freq_range_cfg
  98. mipi_hs_freq_range[MIPI_DPHY_DEFAULT_BIT_RATES] = {
  99. {.default_bit_rate_mbps = 80, .hsfreqrange_code = 0x00},
  100. {.default_bit_rate_mbps = 90, .hsfreqrange_code = 0x10},
  101. {.default_bit_rate_mbps = 100, .hsfreqrange_code = 0x20},
  102. {.default_bit_rate_mbps = 110, .hsfreqrange_code = 0x30},
  103. {.default_bit_rate_mbps = 120, .hsfreqrange_code = 0x01},
  104. {.default_bit_rate_mbps = 130, .hsfreqrange_code = 0x11},
  105. {.default_bit_rate_mbps = 140, .hsfreqrange_code = 0x21},
  106. {.default_bit_rate_mbps = 150, .hsfreqrange_code = 0x31},
  107. {.default_bit_rate_mbps = 160, .hsfreqrange_code = 0x02},
  108. {.default_bit_rate_mbps = 170, .hsfreqrange_code = 0x12},
  109. {.default_bit_rate_mbps = 180, .hsfreqrange_code = 0x22},
  110. {.default_bit_rate_mbps = 190, .hsfreqrange_code = 0x32},
  111. {.default_bit_rate_mbps = 205, .hsfreqrange_code = 0x03},
  112. {.default_bit_rate_mbps = 220, .hsfreqrange_code = 0x13},
  113. {.default_bit_rate_mbps = 235, .hsfreqrange_code = 0x23},
  114. {.default_bit_rate_mbps = 250, .hsfreqrange_code = 0x33},
  115. {.default_bit_rate_mbps = 275, .hsfreqrange_code = 0x04},
  116. {.default_bit_rate_mbps = 300, .hsfreqrange_code = 0x14},
  117. {.default_bit_rate_mbps = 325, .hsfreqrange_code = 0x25},
  118. {.default_bit_rate_mbps = 350, .hsfreqrange_code = 0x35},
  119. {.default_bit_rate_mbps = 400, .hsfreqrange_code = 0x05},
  120. {.default_bit_rate_mbps = 450, .hsfreqrange_code = 0x16},
  121. {.default_bit_rate_mbps = 500, .hsfreqrange_code = 0x26},
  122. {.default_bit_rate_mbps = 550, .hsfreqrange_code = 0x37},
  123. {.default_bit_rate_mbps = 600, .hsfreqrange_code = 0x07},
  124. {.default_bit_rate_mbps = 650, .hsfreqrange_code = 0x18},
  125. {.default_bit_rate_mbps = 700, .hsfreqrange_code = 0x28},
  126. {.default_bit_rate_mbps = 750, .hsfreqrange_code = 0x39},
  127. {.default_bit_rate_mbps = 800, .hsfreqrange_code = 0x09},
  128. {.default_bit_rate_mbps = 850, .hsfreqrange_code = 0x19},
  129. {.default_bit_rate_mbps = 900, .hsfreqrange_code = 0x29},
  130. {.default_bit_rate_mbps = 1000, .hsfreqrange_code = 0x0A},
  131. {.default_bit_rate_mbps = 1050, .hsfreqrange_code = 0x1A},
  132. {.default_bit_rate_mbps = 1100, .hsfreqrange_code = 0x2A},
  133. {.default_bit_rate_mbps = 1150, .hsfreqrange_code = 0x3B},
  134. {.default_bit_rate_mbps = 1200, .hsfreqrange_code = 0x0B},
  135. {.default_bit_rate_mbps = 1250, .hsfreqrange_code = 0x1B},
  136. {.default_bit_rate_mbps = 1300, .hsfreqrange_code = 0x2B},
  137. {.default_bit_rate_mbps = 1350, .hsfreqrange_code = 0x3C},
  138. {.default_bit_rate_mbps = 1400, .hsfreqrange_code = 0x0C},
  139. {.default_bit_rate_mbps = 1450, .hsfreqrange_code = 0x1C},
  140. {.default_bit_rate_mbps = 1500, .hsfreqrange_code = 0x2C},
  141. {.default_bit_rate_mbps = 1550, .hsfreqrange_code = 0x3D},
  142. {.default_bit_rate_mbps = 1600, .hsfreqrange_code = 0x0D},
  143. {.default_bit_rate_mbps = 1650, .hsfreqrange_code = 0x1D},
  144. {.default_bit_rate_mbps = 1700, .hsfreqrange_code = 0x2E},
  145. {.default_bit_rate_mbps = 1750, .hsfreqrange_code = 0x3E},
  146. {.default_bit_rate_mbps = 1800, .hsfreqrange_code = 0x0E},
  147. {.default_bit_rate_mbps = 1850, .hsfreqrange_code = 0x1E},
  148. {.default_bit_rate_mbps = 1900, .hsfreqrange_code = 0x2F},
  149. {.default_bit_rate_mbps = 1950, .hsfreqrange_code = 0x3F},
  150. {.default_bit_rate_mbps = 2000, .hsfreqrange_code = 0x0F},
  151. {.default_bit_rate_mbps = 2050, .hsfreqrange_code = 0x40},
  152. {.default_bit_rate_mbps = 2100, .hsfreqrange_code = 0x41},
  153. {.default_bit_rate_mbps = 2150, .hsfreqrange_code = 0x42},
  154. {.default_bit_rate_mbps = 2200, .hsfreqrange_code = 0x43},
  155. {.default_bit_rate_mbps = 2250, .hsfreqrange_code = 0x44},
  156. {.default_bit_rate_mbps = 2300, .hsfreqrange_code = 0x45},
  157. {.default_bit_rate_mbps = 2350, .hsfreqrange_code = 0x46},
  158. {.default_bit_rate_mbps = 2400, .hsfreqrange_code = 0x47},
  159. {.default_bit_rate_mbps = 2450, .hsfreqrange_code = 0x48},
  160. {.default_bit_rate_mbps = 2500, .hsfreqrange_code = 0x49}
  161. };
  162. static void kmb_dsi_clk_disable(struct kmb_dsi *kmb_dsi)
  163. {
  164. clk_disable_unprepare(kmb_dsi->clk_mipi);
  165. clk_disable_unprepare(kmb_dsi->clk_mipi_ecfg);
  166. clk_disable_unprepare(kmb_dsi->clk_mipi_cfg);
  167. }
  168. void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi)
  169. {
  170. kmb_dsi_clk_disable(kmb_dsi);
  171. mipi_dsi_host_unregister(kmb_dsi->host);
  172. }
  173. /*
  174. * This DSI can only be paired with bridges that do config through i2c
  175. * which is ADV 7535 in the KMB EVM
  176. */
  177. static ssize_t kmb_dsi_host_transfer(struct mipi_dsi_host *host,
  178. const struct mipi_dsi_msg *msg)
  179. {
  180. return 0;
  181. }
  182. static int kmb_dsi_host_attach(struct mipi_dsi_host *host,
  183. struct mipi_dsi_device *dev)
  184. {
  185. return 0;
  186. }
  187. static int kmb_dsi_host_detach(struct mipi_dsi_host *host,
  188. struct mipi_dsi_device *dev)
  189. {
  190. return 0;
  191. }
  192. static const struct mipi_dsi_host_ops kmb_dsi_host_ops = {
  193. .attach = kmb_dsi_host_attach,
  194. .detach = kmb_dsi_host_detach,
  195. .transfer = kmb_dsi_host_transfer,
  196. };
  197. int kmb_dsi_host_bridge_init(struct device *dev)
  198. {
  199. struct device_node *encoder_node, *dsi_out;
  200. /* Create and register MIPI DSI host */
  201. if (!dsi_host) {
  202. dsi_host = kzalloc(sizeof(*dsi_host), GFP_KERNEL);
  203. if (!dsi_host)
  204. return -ENOMEM;
  205. dsi_host->ops = &kmb_dsi_host_ops;
  206. if (!dsi_device) {
  207. dsi_device = kzalloc(sizeof(*dsi_device), GFP_KERNEL);
  208. if (!dsi_device) {
  209. kfree(dsi_host);
  210. return -ENOMEM;
  211. }
  212. }
  213. dsi_host->dev = dev;
  214. mipi_dsi_host_register(dsi_host);
  215. }
  216. /* Find ADV7535 node and initialize it */
  217. dsi_out = of_graph_get_endpoint_by_regs(dev->of_node, 0, 1);
  218. if (!dsi_out) {
  219. DRM_ERROR("Failed to get dsi_out node info from DT\n");
  220. return -EINVAL;
  221. }
  222. encoder_node = of_graph_get_remote_port_parent(dsi_out);
  223. if (!encoder_node) {
  224. of_node_put(dsi_out);
  225. DRM_ERROR("Failed to get bridge info from DT\n");
  226. return -EINVAL;
  227. }
  228. /* Locate drm bridge from the hdmi encoder DT node */
  229. adv_bridge = of_drm_find_bridge(encoder_node);
  230. of_node_put(dsi_out);
  231. of_node_put(encoder_node);
  232. if (!adv_bridge) {
  233. DRM_DEBUG("Wait for external bridge driver DT\n");
  234. return -EPROBE_DEFER;
  235. }
  236. return 0;
  237. }
  238. static u32 mipi_get_datatype_params(u32 data_type, u32 data_mode,
  239. struct mipi_data_type_params *params)
  240. {
  241. struct mipi_data_type_params data_type_param;
  242. switch (data_type) {
  243. case DSI_LP_DT_PPS_YCBCR420_12B:
  244. data_type_param.size_constraint_pixels = 2;
  245. data_type_param.size_constraint_bytes = 3;
  246. switch (data_mode) {
  247. /* Case 0 not supported according to MDK */
  248. case 1:
  249. case 2:
  250. case 3:
  251. data_type_param.pixels_per_pclk = 2;
  252. data_type_param.bits_per_pclk = 24;
  253. break;
  254. default:
  255. DRM_ERROR("DSI: Invalid data_mode %d\n", data_mode);
  256. return -EINVAL;
  257. }
  258. break;
  259. case DSI_LP_DT_PPS_YCBCR422_16B:
  260. data_type_param.size_constraint_pixels = 2;
  261. data_type_param.size_constraint_bytes = 4;
  262. switch (data_mode) {
  263. /* Case 0 and 1 not supported according
  264. * to MDK
  265. */
  266. case 2:
  267. data_type_param.pixels_per_pclk = 1;
  268. data_type_param.bits_per_pclk = 16;
  269. break;
  270. case 3:
  271. data_type_param.pixels_per_pclk = 2;
  272. data_type_param.bits_per_pclk = 32;
  273. break;
  274. default:
  275. DRM_ERROR("DSI: Invalid data_mode %d\n", data_mode);
  276. return -EINVAL;
  277. }
  278. break;
  279. case DSI_LP_DT_LPPS_YCBCR422_20B:
  280. case DSI_LP_DT_PPS_YCBCR422_24B:
  281. data_type_param.size_constraint_pixels = 2;
  282. data_type_param.size_constraint_bytes = 6;
  283. switch (data_mode) {
  284. /* Case 0 not supported according to MDK */
  285. case 1:
  286. case 2:
  287. case 3:
  288. data_type_param.pixels_per_pclk = 1;
  289. data_type_param.bits_per_pclk = 24;
  290. break;
  291. default:
  292. DRM_ERROR("DSI: Invalid data_mode %d\n", data_mode);
  293. return -EINVAL;
  294. }
  295. break;
  296. case DSI_LP_DT_PPS_RGB565_16B:
  297. data_type_param.size_constraint_pixels = 1;
  298. data_type_param.size_constraint_bytes = 2;
  299. switch (data_mode) {
  300. case 0:
  301. case 1:
  302. data_type_param.pixels_per_pclk = 1;
  303. data_type_param.bits_per_pclk = 16;
  304. break;
  305. case 2:
  306. case 3:
  307. data_type_param.pixels_per_pclk = 2;
  308. data_type_param.bits_per_pclk = 32;
  309. break;
  310. default:
  311. DRM_ERROR("DSI: Invalid data_mode %d\n", data_mode);
  312. return -EINVAL;
  313. }
  314. break;
  315. case DSI_LP_DT_PPS_RGB666_18B:
  316. data_type_param.size_constraint_pixels = 4;
  317. data_type_param.size_constraint_bytes = 9;
  318. data_type_param.bits_per_pclk = 18;
  319. data_type_param.pixels_per_pclk = 1;
  320. break;
  321. case DSI_LP_DT_LPPS_RGB666_18B:
  322. case DSI_LP_DT_PPS_RGB888_24B:
  323. data_type_param.size_constraint_pixels = 1;
  324. data_type_param.size_constraint_bytes = 3;
  325. data_type_param.bits_per_pclk = 24;
  326. data_type_param.pixels_per_pclk = 1;
  327. break;
  328. case DSI_LP_DT_PPS_RGB101010_30B:
  329. data_type_param.size_constraint_pixels = 4;
  330. data_type_param.size_constraint_bytes = 15;
  331. data_type_param.bits_per_pclk = 30;
  332. data_type_param.pixels_per_pclk = 1;
  333. break;
  334. default:
  335. DRM_ERROR("DSI: Invalid data_type %d\n", data_type);
  336. return -EINVAL;
  337. }
  338. *params = data_type_param;
  339. return 0;
  340. }
  341. static u32 compute_wc(u32 width_px, u8 size_constr_p, u8 size_constr_b)
  342. {
  343. /* Calculate the word count for each long packet */
  344. return (((width_px / size_constr_p) * size_constr_b) & 0xffff);
  345. }
  346. static u32 compute_unpacked_bytes(u32 wc, u8 bits_per_pclk)
  347. {
  348. /* Number of PCLK cycles needed to transfer a line
  349. * with each PCLK cycle, 4 Bytes are sent through the PPL module
  350. */
  351. return ((wc * 8) / bits_per_pclk) * 4;
  352. }
  353. static u32 mipi_tx_fg_section_cfg_regs(struct kmb_dsi *kmb_dsi,
  354. u8 frame_id, u8 section,
  355. u32 height_lines, u32 unpacked_bytes,
  356. struct mipi_tx_frame_sect_phcfg *ph_cfg)
  357. {
  358. u32 cfg = 0;
  359. u32 ctrl_no = MIPI_CTRL6;
  360. u32 reg_adr;
  361. /* Frame section packet header */
  362. /* Word count bits [15:0] */
  363. cfg = (ph_cfg->wc & MIPI_TX_SECT_WC_MASK) << 0;
  364. /* Data type (bits [21:16]) */
  365. cfg |= ((ph_cfg->data_type & MIPI_TX_SECT_DT_MASK)
  366. << MIPI_TX_SECT_DT_SHIFT);
  367. /* Virtual channel (bits [23:22]) */
  368. cfg |= ((ph_cfg->vchannel & MIPI_TX_SECT_VC_MASK)
  369. << MIPI_TX_SECT_VC_SHIFT);
  370. /* Data mode (bits [24:25]) */
  371. cfg |= ((ph_cfg->data_mode & MIPI_TX_SECT_DM_MASK)
  372. << MIPI_TX_SECT_DM_SHIFT);
  373. if (ph_cfg->dma_packed)
  374. cfg |= MIPI_TX_SECT_DMA_PACKED;
  375. dev_dbg(kmb_dsi->dev,
  376. "ctrl=%d frame_id=%d section=%d cfg=%x packed=%d\n",
  377. ctrl_no, frame_id, section, cfg, ph_cfg->dma_packed);
  378. kmb_write_mipi(kmb_dsi,
  379. (MIPI_TXm_HS_FGn_SECTo_PH(ctrl_no, frame_id, section)),
  380. cfg);
  381. /* Unpacked bytes */
  382. /* There are 4 frame generators and each fg has 4 sections
  383. * There are 2 registers for unpacked bytes (# bytes each
  384. * section occupies in memory)
  385. * REG_UNPACKED_BYTES0: [15:0]-BYTES0, [31:16]-BYTES1
  386. * REG_UNPACKED_BYTES1: [15:0]-BYTES2, [31:16]-BYTES3
  387. */
  388. reg_adr =
  389. MIPI_TXm_HS_FGn_SECT_UNPACKED_BYTES0(ctrl_no,
  390. frame_id) + (section / 2) * 4;
  391. kmb_write_bits_mipi(kmb_dsi, reg_adr, (section % 2) * 16, 16,
  392. unpacked_bytes);
  393. dev_dbg(kmb_dsi->dev,
  394. "unpacked_bytes = %d, wordcount = %d\n", unpacked_bytes,
  395. ph_cfg->wc);
  396. /* Line config */
  397. reg_adr = MIPI_TXm_HS_FGn_SECTo_LINE_CFG(ctrl_no, frame_id, section);
  398. kmb_write_mipi(kmb_dsi, reg_adr, height_lines);
  399. return 0;
  400. }
  401. static u32 mipi_tx_fg_section_cfg(struct kmb_dsi *kmb_dsi,
  402. u8 frame_id, u8 section,
  403. struct mipi_tx_frame_section_cfg *frame_scfg,
  404. u32 *bits_per_pclk, u32 *wc)
  405. {
  406. u32 ret = 0;
  407. u32 unpacked_bytes;
  408. struct mipi_data_type_params data_type_parameters;
  409. struct mipi_tx_frame_sect_phcfg ph_cfg;
  410. ret = mipi_get_datatype_params(frame_scfg->data_type,
  411. frame_scfg->data_mode,
  412. &data_type_parameters);
  413. if (ret)
  414. return ret;
  415. /* Packet width has to be a multiple of the minimum packet width
  416. * (in pixels) set for each data type
  417. */
  418. if (frame_scfg->width_pixels %
  419. data_type_parameters.size_constraint_pixels != 0)
  420. return -EINVAL;
  421. *wc = compute_wc(frame_scfg->width_pixels,
  422. data_type_parameters.size_constraint_pixels,
  423. data_type_parameters.size_constraint_bytes);
  424. unpacked_bytes = compute_unpacked_bytes(*wc,
  425. data_type_parameters.bits_per_pclk);
  426. ph_cfg.wc = *wc;
  427. ph_cfg.data_mode = frame_scfg->data_mode;
  428. ph_cfg.data_type = frame_scfg->data_type;
  429. ph_cfg.dma_packed = frame_scfg->dma_packed;
  430. ph_cfg.vchannel = frame_id;
  431. mipi_tx_fg_section_cfg_regs(kmb_dsi, frame_id, section,
  432. frame_scfg->height_lines,
  433. unpacked_bytes, &ph_cfg);
  434. /* Caller needs bits_per_clk for additional caluclations */
  435. *bits_per_pclk = data_type_parameters.bits_per_pclk;
  436. return 0;
  437. }
  438. #define CLK_DIFF_LOW 50
  439. #define CLK_DIFF_HI 60
  440. #define SYSCLK_500 500
  441. static void mipi_tx_fg_cfg_regs(struct kmb_dsi *kmb_dsi, u8 frame_gen,
  442. struct mipi_tx_frame_timing_cfg *fg_cfg)
  443. {
  444. u32 sysclk;
  445. u32 ppl_llp_ratio;
  446. u32 ctrl_no = MIPI_CTRL6, reg_adr, val, offset;
  447. /* 500 Mhz system clock minus 50 to account for the difference in
  448. * MIPI clock speed in RTL tests
  449. */
  450. if (kmb_dsi->sys_clk_mhz == SYSCLK_500) {
  451. sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_LOW;
  452. } else {
  453. /* 700 Mhz clk*/
  454. sysclk = kmb_dsi->sys_clk_mhz - CLK_DIFF_HI;
  455. }
  456. /* PPL-Pixel Packing Layer, LLP-Low Level Protocol
  457. * Frame genartor timing parameters are clocked on the system clock,
  458. * whereas as the equivalent parameters in the LLP blocks are clocked
  459. * on LLP Tx clock from the D-PHY - BYTE clock
  460. */
  461. /* Multiply by 1000 to maintain precision */
  462. ppl_llp_ratio = ((fg_cfg->bpp / 8) * sysclk * 1000) /
  463. ((fg_cfg->lane_rate_mbps / 8) * fg_cfg->active_lanes);
  464. dev_dbg(kmb_dsi->dev, "ppl_llp_ratio=%d\n", ppl_llp_ratio);
  465. dev_dbg(kmb_dsi->dev, "bpp=%d sysclk=%d lane-rate=%d active-lanes=%d\n",
  466. fg_cfg->bpp, sysclk, fg_cfg->lane_rate_mbps,
  467. fg_cfg->active_lanes);
  468. /* Frame generator number of lines */
  469. reg_adr = MIPI_TXm_HS_FGn_NUM_LINES(ctrl_no, frame_gen);
  470. kmb_write_mipi(kmb_dsi, reg_adr, fg_cfg->v_active);
  471. /* vsync width
  472. * There are 2 registers for vsync width (VSA in lines for
  473. * channels 0-3)
  474. * REG_VSYNC_WIDTH0: [15:0]-VSA for channel0, [31:16]-VSA for channel1
  475. * REG_VSYNC_WIDTH1: [15:0]-VSA for channel2, [31:16]-VSA for channel3
  476. */
  477. offset = (frame_gen % 2) * 16;
  478. reg_adr = MIPI_TXm_HS_VSYNC_WIDTHn(ctrl_no, frame_gen / 2);
  479. kmb_write_bits_mipi(kmb_dsi, reg_adr, offset, 16, fg_cfg->vsync_width);
  480. /* vertical backporch (vbp) */
  481. reg_adr = MIPI_TXm_HS_V_BACKPORCHESn(ctrl_no, frame_gen / 2);
  482. kmb_write_bits_mipi(kmb_dsi, reg_adr, offset, 16, fg_cfg->v_backporch);
  483. /* vertical frontporch (vfp) */
  484. reg_adr = MIPI_TXm_HS_V_FRONTPORCHESn(ctrl_no, frame_gen / 2);
  485. kmb_write_bits_mipi(kmb_dsi, reg_adr, offset, 16, fg_cfg->v_frontporch);
  486. /* vertical active (vactive) */
  487. reg_adr = MIPI_TXm_HS_V_ACTIVEn(ctrl_no, frame_gen / 2);
  488. kmb_write_bits_mipi(kmb_dsi, reg_adr, offset, 16, fg_cfg->v_active);
  489. /* hsync width */
  490. reg_adr = MIPI_TXm_HS_HSYNC_WIDTHn(ctrl_no, frame_gen);
  491. kmb_write_mipi(kmb_dsi, reg_adr,
  492. (fg_cfg->hsync_width * ppl_llp_ratio) / 1000);
  493. /* horizontal backporch (hbp) */
  494. reg_adr = MIPI_TXm_HS_H_BACKPORCHn(ctrl_no, frame_gen);
  495. kmb_write_mipi(kmb_dsi, reg_adr,
  496. (fg_cfg->h_backporch * ppl_llp_ratio) / 1000);
  497. /* horizontal frontporch (hfp) */
  498. reg_adr = MIPI_TXm_HS_H_FRONTPORCHn(ctrl_no, frame_gen);
  499. kmb_write_mipi(kmb_dsi, reg_adr,
  500. (fg_cfg->h_frontporch * ppl_llp_ratio) / 1000);
  501. /* horizontal active (ha) */
  502. reg_adr = MIPI_TXm_HS_H_ACTIVEn(ctrl_no, frame_gen);
  503. /* convert h_active which is wc in bytes to cycles */
  504. val = (fg_cfg->h_active * sysclk * 1000) /
  505. ((fg_cfg->lane_rate_mbps / 8) * fg_cfg->active_lanes);
  506. val /= 1000;
  507. kmb_write_mipi(kmb_dsi, reg_adr, val);
  508. /* llp hsync width */
  509. reg_adr = MIPI_TXm_HS_LLP_HSYNC_WIDTHn(ctrl_no, frame_gen);
  510. kmb_write_mipi(kmb_dsi, reg_adr, fg_cfg->hsync_width * (fg_cfg->bpp / 8));
  511. /* llp h backporch */
  512. reg_adr = MIPI_TXm_HS_LLP_H_BACKPORCHn(ctrl_no, frame_gen);
  513. kmb_write_mipi(kmb_dsi, reg_adr, fg_cfg->h_backporch * (fg_cfg->bpp / 8));
  514. /* llp h frontporch */
  515. reg_adr = MIPI_TXm_HS_LLP_H_FRONTPORCHn(ctrl_no, frame_gen);
  516. kmb_write_mipi(kmb_dsi, reg_adr,
  517. fg_cfg->h_frontporch * (fg_cfg->bpp / 8));
  518. }
  519. static void mipi_tx_fg_cfg(struct kmb_dsi *kmb_dsi, u8 frame_gen,
  520. u8 active_lanes, u32 bpp, u32 wc,
  521. u32 lane_rate_mbps, struct mipi_tx_frame_cfg *fg_cfg)
  522. {
  523. u32 i, fg_num_lines = 0;
  524. struct mipi_tx_frame_timing_cfg fg_t_cfg;
  525. /* Calculate the total frame generator number of
  526. * lines based on it's active sections
  527. */
  528. for (i = 0; i < MIPI_TX_FRAME_GEN_SECTIONS; i++) {
  529. if (fg_cfg->sections[i])
  530. fg_num_lines += fg_cfg->sections[i]->height_lines;
  531. }
  532. fg_t_cfg.bpp = bpp;
  533. fg_t_cfg.lane_rate_mbps = lane_rate_mbps;
  534. fg_t_cfg.hsync_width = fg_cfg->hsync_width;
  535. fg_t_cfg.h_backporch = fg_cfg->h_backporch;
  536. fg_t_cfg.h_frontporch = fg_cfg->h_frontporch;
  537. fg_t_cfg.h_active = wc;
  538. fg_t_cfg.vsync_width = fg_cfg->vsync_width;
  539. fg_t_cfg.v_backporch = fg_cfg->v_backporch;
  540. fg_t_cfg.v_frontporch = fg_cfg->v_frontporch;
  541. fg_t_cfg.v_active = fg_num_lines;
  542. fg_t_cfg.active_lanes = active_lanes;
  543. /* Apply frame generator timing setting */
  544. mipi_tx_fg_cfg_regs(kmb_dsi, frame_gen, &fg_t_cfg);
  545. }
  546. static void mipi_tx_multichannel_fifo_cfg(struct kmb_dsi *kmb_dsi,
  547. u8 active_lanes, u8 vchannel_id)
  548. {
  549. u32 fifo_size, fifo_rthreshold;
  550. u32 ctrl_no = MIPI_CTRL6;
  551. /* Clear all mc fifo channel sizes and thresholds */
  552. kmb_write_mipi(kmb_dsi, MIPI_TX_HS_MC_FIFO_CTRL_EN, 0);
  553. kmb_write_mipi(kmb_dsi, MIPI_TX_HS_MC_FIFO_CHAN_ALLOC0, 0);
  554. kmb_write_mipi(kmb_dsi, MIPI_TX_HS_MC_FIFO_CHAN_ALLOC1, 0);
  555. kmb_write_mipi(kmb_dsi, MIPI_TX_HS_MC_FIFO_RTHRESHOLD0, 0);
  556. kmb_write_mipi(kmb_dsi, MIPI_TX_HS_MC_FIFO_RTHRESHOLD1, 0);
  557. fifo_size = ((active_lanes > MIPI_D_LANES_PER_DPHY) ?
  558. MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC :
  559. MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC) - 1;
  560. /* MC fifo size for virtual channels 0-3
  561. * REG_MC_FIFO_CHAN_ALLOC0: [8:0]-channel0, [24:16]-channel1
  562. * REG_MC_FIFO_CHAN_ALLOC1: [8:0]-2, [24:16]-channel3
  563. */
  564. SET_MC_FIFO_CHAN_ALLOC(kmb_dsi, ctrl_no, vchannel_id, fifo_size);
  565. /* Set threshold to half the fifo size, actual size=size*16 */
  566. fifo_rthreshold = ((fifo_size) * 8) & BIT_MASK_16;
  567. SET_MC_FIFO_RTHRESHOLD(kmb_dsi, ctrl_no, vchannel_id, fifo_rthreshold);
  568. /* Enable the MC FIFO channel corresponding to the Virtual Channel */
  569. kmb_set_bit_mipi(kmb_dsi, MIPI_TXm_HS_MC_FIFO_CTRL_EN(ctrl_no),
  570. vchannel_id);
  571. }
  572. static void mipi_tx_ctrl_cfg(struct kmb_dsi *kmb_dsi, u8 fg_id,
  573. struct mipi_ctrl_cfg *ctrl_cfg)
  574. {
  575. u32 sync_cfg = 0, ctrl = 0, fg_en;
  576. u32 ctrl_no = MIPI_CTRL6;
  577. /* MIPI_TX_HS_SYNC_CFG */
  578. if (ctrl_cfg->tx_ctrl_cfg.line_sync_pkt_en)
  579. sync_cfg |= LINE_SYNC_PKT_ENABLE;
  580. if (ctrl_cfg->tx_ctrl_cfg.frame_counter_active)
  581. sync_cfg |= FRAME_COUNTER_ACTIVE;
  582. if (ctrl_cfg->tx_ctrl_cfg.line_counter_active)
  583. sync_cfg |= LINE_COUNTER_ACTIVE;
  584. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->v_blanking)
  585. sync_cfg |= DSI_V_BLANKING;
  586. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->hsa_blanking)
  587. sync_cfg |= DSI_HSA_BLANKING;
  588. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->hbp_blanking)
  589. sync_cfg |= DSI_HBP_BLANKING;
  590. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->hfp_blanking)
  591. sync_cfg |= DSI_HFP_BLANKING;
  592. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->sync_pulse_eventn)
  593. sync_cfg |= DSI_SYNC_PULSE_EVENTN;
  594. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->lpm_first_vsa_line)
  595. sync_cfg |= DSI_LPM_FIRST_VSA_LINE;
  596. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->lpm_last_vfp_line)
  597. sync_cfg |= DSI_LPM_LAST_VFP_LINE;
  598. /* Enable frame generator */
  599. fg_en = 1 << fg_id;
  600. sync_cfg |= FRAME_GEN_EN(fg_en);
  601. if (ctrl_cfg->tx_ctrl_cfg.tx_always_use_hact)
  602. sync_cfg |= ALWAYS_USE_HACT(fg_en);
  603. if (ctrl_cfg->tx_ctrl_cfg.tx_hact_wait_stop)
  604. sync_cfg |= HACT_WAIT_STOP(fg_en);
  605. dev_dbg(kmb_dsi->dev, "sync_cfg=%d fg_en=%d\n", sync_cfg, fg_en);
  606. /* MIPI_TX_HS_CTRL */
  607. /* type:DSI, source:LCD */
  608. ctrl = HS_CTRL_EN | TX_SOURCE;
  609. ctrl |= LCD_VC(fg_id);
  610. ctrl |= ACTIVE_LANES(ctrl_cfg->active_lanes - 1);
  611. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->eotp_en)
  612. ctrl |= DSI_EOTP_EN;
  613. if (ctrl_cfg->tx_ctrl_cfg.tx_dsi_cfg->hfp_blank_en)
  614. ctrl |= DSI_CMD_HFP_EN;
  615. /*67 ns stop time */
  616. ctrl |= HSEXIT_CNT(0x43);
  617. kmb_write_mipi(kmb_dsi, MIPI_TXm_HS_SYNC_CFG(ctrl_no), sync_cfg);
  618. kmb_write_mipi(kmb_dsi, MIPI_TXm_HS_CTRL(ctrl_no), ctrl);
  619. }
  620. static u32 mipi_tx_init_cntrl(struct kmb_dsi *kmb_dsi,
  621. struct mipi_ctrl_cfg *ctrl_cfg)
  622. {
  623. u32 ret = 0;
  624. u8 active_vchannels = 0;
  625. u8 frame_id, sect;
  626. u32 bits_per_pclk = 0;
  627. u32 word_count = 0;
  628. struct mipi_tx_frame_cfg *frame;
  629. /* This is the order to initialize MIPI TX:
  630. * 1. set frame section parameters
  631. * 2. set frame specific parameters
  632. * 3. connect lcd to mipi
  633. * 4. multi channel fifo cfg
  634. * 5. set mipitxcctrlcfg
  635. */
  636. for (frame_id = 0; frame_id < 4; frame_id++) {
  637. frame = ctrl_cfg->tx_ctrl_cfg.frames[frame_id];
  638. /* Find valid frame, assume only one valid frame */
  639. if (!frame)
  640. continue;
  641. /* Frame Section configuration */
  642. /* TODO - assume there is only one valid section in a frame,
  643. * so bits_per_pclk and word_count are only set once
  644. */
  645. for (sect = 0; sect < MIPI_CTRL_VIRTUAL_CHANNELS; sect++) {
  646. if (!frame->sections[sect])
  647. continue;
  648. ret = mipi_tx_fg_section_cfg(kmb_dsi, frame_id, sect,
  649. frame->sections[sect],
  650. &bits_per_pclk,
  651. &word_count);
  652. if (ret)
  653. return ret;
  654. }
  655. /* Set frame specific parameters */
  656. mipi_tx_fg_cfg(kmb_dsi, frame_id, ctrl_cfg->active_lanes,
  657. bits_per_pclk, word_count,
  658. ctrl_cfg->lane_rate_mbps, frame);
  659. active_vchannels++;
  660. /* Stop iterating as only one virtual channel
  661. * shall be used for LCD connection
  662. */
  663. break;
  664. }
  665. if (active_vchannels == 0)
  666. return -EINVAL;
  667. /* Multi-Channel FIFO Configuration */
  668. mipi_tx_multichannel_fifo_cfg(kmb_dsi, ctrl_cfg->active_lanes, frame_id);
  669. /* Frame Generator Enable */
  670. mipi_tx_ctrl_cfg(kmb_dsi, frame_id, ctrl_cfg);
  671. return ret;
  672. }
  673. static void test_mode_send(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  674. u32 test_code, u32 test_data)
  675. {
  676. /* Steps to send test code:
  677. * - set testclk HIGH
  678. * - set testdin with test code
  679. * - set testen HIGH
  680. * - set testclk LOW
  681. * - set testen LOW
  682. */
  683. /* Set testclk high */
  684. SET_DPHY_TEST_CTRL1_CLK(kmb_dsi, dphy_no);
  685. /* Set testdin */
  686. SET_TEST_DIN0_3(kmb_dsi, dphy_no, test_code);
  687. /* Set testen high */
  688. SET_DPHY_TEST_CTRL1_EN(kmb_dsi, dphy_no);
  689. /* Set testclk low */
  690. CLR_DPHY_TEST_CTRL1_CLK(kmb_dsi, dphy_no);
  691. /* Set testen low */
  692. CLR_DPHY_TEST_CTRL1_EN(kmb_dsi, dphy_no);
  693. if (test_code) {
  694. /* Steps to send test data:
  695. * - set testen LOW
  696. * - set testclk LOW
  697. * - set testdin with data
  698. * - set testclk HIGH
  699. */
  700. /* Set testen low */
  701. CLR_DPHY_TEST_CTRL1_EN(kmb_dsi, dphy_no);
  702. /* Set testclk low */
  703. CLR_DPHY_TEST_CTRL1_CLK(kmb_dsi, dphy_no);
  704. /* Set data in testdin */
  705. kmb_write_mipi(kmb_dsi,
  706. DPHY_TEST_DIN0_3 + ((dphy_no / 0x4) * 0x4),
  707. test_data << ((dphy_no % 4) * 8));
  708. /* Set testclk high */
  709. SET_DPHY_TEST_CTRL1_CLK(kmb_dsi, dphy_no);
  710. }
  711. }
  712. static inline void
  713. set_test_mode_src_osc_freq_target_low_bits(struct kmb_dsi *kmb_dsi,
  714. u32 dphy_no,
  715. u32 freq)
  716. {
  717. /* Typical rise/fall time=166, refer Table 1207 databook,
  718. * sr_osc_freq_target[7:0]
  719. */
  720. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_SLEW_RATE_DDL_CYCLES,
  721. (freq & 0x7f));
  722. }
  723. static inline void
  724. set_test_mode_src_osc_freq_target_hi_bits(struct kmb_dsi *kmb_dsi,
  725. u32 dphy_no,
  726. u32 freq)
  727. {
  728. u32 data;
  729. /* Flag this as high nibble */
  730. data = ((freq >> 6) & 0x1f) | (1 << 7);
  731. /* Typical rise/fall time=166, refer Table 1207 databook,
  732. * sr_osc_freq_target[11:7]
  733. */
  734. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_SLEW_RATE_DDL_CYCLES, data);
  735. }
  736. static void mipi_tx_get_vco_params(struct vco_params *vco)
  737. {
  738. int i;
  739. for (i = 0; i < ARRAY_SIZE(vco_table); i++) {
  740. if (vco->freq < vco_table[i].freq) {
  741. *vco = vco_table[i];
  742. return;
  743. }
  744. }
  745. WARN_ONCE(1, "Invalid vco freq = %u for PLL setup\n", vco->freq);
  746. }
  747. static void mipi_tx_pll_setup(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  748. u32 ref_clk_mhz, u32 target_freq_mhz)
  749. {
  750. u32 best_n = 0, best_m = 0;
  751. u32 n = 0, m = 0, div = 0, delta, freq = 0, t_freq;
  752. u32 best_freq_delta = 3000;
  753. /* pll_ref_clk: - valid range: 2~64 MHz; Typically 24 MHz
  754. * Fvco: - valid range: 320~1250 MHz (Gen3 D-PHY)
  755. * Fout: - valid range: 40~1250 MHz (Gen3 D-PHY)
  756. * n: - valid range [0 15]
  757. * N: - N = n + 1
  758. * -valid range: [1 16]
  759. * -conditions: - (pll_ref_clk / N) >= 2 MHz
  760. * -(pll_ref_clk / N) <= 8 MHz
  761. * m: valid range [62 623]
  762. * M: - M = m + 2
  763. * -valid range [64 625]
  764. * -Fvco = (M/N) * pll_ref_clk
  765. */
  766. struct vco_params vco_p = {
  767. .range = 0,
  768. .divider = 1,
  769. };
  770. vco_p.freq = target_freq_mhz;
  771. mipi_tx_get_vco_params(&vco_p);
  772. /* Search pll n parameter */
  773. for (n = PLL_N_MIN; n <= PLL_N_MAX; n++) {
  774. /* Calculate the pll input frequency division ratio
  775. * multiply by 1000 for precision -
  776. * no floating point, add n for rounding
  777. */
  778. div = ((ref_clk_mhz * 1000) + n) / (n + 1);
  779. /* Found a valid n parameter */
  780. if ((div < 2000 || div > 8000))
  781. continue;
  782. /* Search pll m parameter */
  783. for (m = PLL_M_MIN; m <= PLL_M_MAX; m++) {
  784. /* Calculate the Fvco(DPHY PLL output frequency)
  785. * using the current n,m params
  786. */
  787. freq = div * (m + 2);
  788. freq /= 1000;
  789. /* Trim the potential pll freq to max supported */
  790. if (freq > PLL_FVCO_MAX)
  791. continue;
  792. delta = abs(freq - target_freq_mhz);
  793. /* Select the best (closest to target pll freq)
  794. * n,m parameters so far
  795. */
  796. if (delta < best_freq_delta) {
  797. best_n = n;
  798. best_m = m;
  799. best_freq_delta = delta;
  800. }
  801. }
  802. }
  803. /* Program vco_cntrl parameter
  804. * PLL_VCO_Control[5:0] = pll_vco_cntrl_ovr,
  805. * PLL_VCO_Control[6] = pll_vco_cntrl_ovr_en
  806. */
  807. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_VCO_CTRL, (vco_p.range
  808. | (1 << 6)));
  809. /* Program m, n pll parameters */
  810. dev_dbg(kmb_dsi->dev, "m = %d n = %d\n", best_m, best_n);
  811. /* PLL_Input_Divider_Ratio[3:0] = pll_n_ovr */
  812. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_INPUT_DIVIDER,
  813. (best_n & 0x0f));
  814. /* m - low nibble PLL_Loop_Divider_Ratio[4:0]
  815. * pll_m_ovr[4:0]
  816. */
  817. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_FEEDBACK_DIVIDER,
  818. (best_m & 0x1f));
  819. /* m - high nibble PLL_Loop_Divider_Ratio[4:0]
  820. * pll_m_ovr[9:5]
  821. */
  822. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_FEEDBACK_DIVIDER,
  823. ((best_m >> 5) & 0x1f) | PLL_FEEDBACK_DIVIDER_HIGH);
  824. /* Enable overwrite of n,m parameters :pll_n_ovr_en, pll_m_ovr_en */
  825. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_OUTPUT_CLK_SEL,
  826. (PLL_N_OVR_EN | PLL_M_OVR_EN));
  827. /* Program Charge-Pump parameters */
  828. /* pll_prop_cntrl-fixed values for prop_cntrl from DPHY doc */
  829. t_freq = target_freq_mhz * vco_p.divider;
  830. test_mode_send(kmb_dsi, dphy_no,
  831. TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL,
  832. ((t_freq > 1150) ? 0x0C : 0x0B));
  833. /* pll_int_cntrl-fixed value for int_cntrl from DPHY doc */
  834. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL,
  835. 0x00);
  836. /* pll_gmp_cntrl-fixed value for gmp_cntrl from DPHY doci */
  837. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_GMP_CTRL, 0x10);
  838. /* pll_cpbias_cntrl-fixed value for cpbias_cntrl from DPHY doc */
  839. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_CHARGE_PUMP_BIAS, 0x10);
  840. /* pll_th1 -Lock Detector Phase error threshold,
  841. * document gives fixed value
  842. */
  843. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_PHASE_ERR_CTRL, 0x02);
  844. /* PLL Lock Configuration */
  845. /* pll_th2 - Lock Filter length, document gives fixed value */
  846. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_LOCK_FILTER, 0x60);
  847. /* pll_th3- PLL Unlocking filter, document gives fixed value */
  848. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_UNLOCK_FILTER, 0x03);
  849. /* pll_lock_sel-PLL Lock Detector Selection,
  850. * document gives fixed value
  851. */
  852. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_PLL_LOCK_DETECTOR, 0x02);
  853. }
  854. static void set_slewrate_gt_1500(struct kmb_dsi *kmb_dsi, u32 dphy_no)
  855. {
  856. u32 test_code = 0, test_data = 0;
  857. /* Bypass slew rate calibration algorithm
  858. * bits[1:0} srcal_en_ovr_en, srcal_en_ovr
  859. */
  860. test_code = TEST_CODE_SLEW_RATE_OVERRIDE_CTRL;
  861. test_data = 0x02;
  862. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  863. /* Disable slew rate calibration */
  864. test_code = TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL;
  865. test_data = 0x00;
  866. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  867. }
  868. static void set_slewrate_gt_1000(struct kmb_dsi *kmb_dsi, u32 dphy_no)
  869. {
  870. u32 test_code = 0, test_data = 0;
  871. /* BitRate: > 1 Gbps && <= 1.5 Gbps: - slew rate control ON
  872. * typical rise/fall times: 166 ps
  873. */
  874. /* Do not bypass slew rate calibration algorithm
  875. * bits[1:0}=srcal_en_ovr_en, srcal_en_ovr, bit[6]=sr_range
  876. */
  877. test_code = TEST_CODE_SLEW_RATE_OVERRIDE_CTRL;
  878. test_data = (0x03 | (1 << 6));
  879. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  880. /* Enable slew rate calibration */
  881. test_code = TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL;
  882. test_data = 0x01;
  883. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  884. /* Set sr_osc_freq_target[6:0] low nibble
  885. * typical rise/fall time=166, refer Table 1207 databook
  886. */
  887. test_code = TEST_CODE_SLEW_RATE_DDL_CYCLES;
  888. test_data = (0x72f & 0x7f);
  889. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  890. /* Set sr_osc_freq_target[11:7] high nibble
  891. * Typical rise/fall time=166, refer Table 1207 databook
  892. */
  893. test_code = TEST_CODE_SLEW_RATE_DDL_CYCLES;
  894. test_data = ((0x72f >> 6) & 0x1f) | (1 << 7);
  895. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  896. }
  897. static void set_slewrate_lt_1000(struct kmb_dsi *kmb_dsi, u32 dphy_no)
  898. {
  899. u32 test_code = 0, test_data = 0;
  900. /* lane_rate_mbps <= 1000 Mbps
  901. * BitRate: <= 1 Gbps:
  902. * - slew rate control ON
  903. * - typical rise/fall times: 225 ps
  904. */
  905. /* Do not bypass slew rate calibration algorithm */
  906. test_code = TEST_CODE_SLEW_RATE_OVERRIDE_CTRL;
  907. test_data = (0x03 | (1 << 6));
  908. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  909. /* Enable slew rate calibration */
  910. test_code = TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL;
  911. test_data = 0x01;
  912. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  913. /* Typical rise/fall time=255, refer Table 1207 databook */
  914. test_code = TEST_CODE_SLEW_RATE_DDL_CYCLES;
  915. test_data = (0x523 & 0x7f);
  916. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  917. /* Set sr_osc_freq_target[11:7] high nibble */
  918. test_code = TEST_CODE_SLEW_RATE_DDL_CYCLES;
  919. test_data = ((0x523 >> 6) & 0x1f) | (1 << 7);
  920. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  921. }
  922. static void setup_pll(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  923. struct mipi_ctrl_cfg *cfg)
  924. {
  925. u32 test_code = 0, test_data = 0;
  926. /* Set PLL regulator in bypass */
  927. test_code = TEST_CODE_PLL_ANALOG_PROG;
  928. test_data = 0x01;
  929. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  930. /* PLL Parameters Setup */
  931. mipi_tx_pll_setup(kmb_dsi, dphy_no, cfg->ref_clk_khz / 1000,
  932. cfg->lane_rate_mbps / 2);
  933. /* Set clksel */
  934. kmb_write_bits_mipi(kmb_dsi, DPHY_INIT_CTRL1, PLL_CLKSEL_0, 2, 0x01);
  935. /* Set pll_shadow_control */
  936. kmb_set_bit_mipi(kmb_dsi, DPHY_INIT_CTRL1, PLL_SHADOW_CTRL);
  937. }
  938. static void set_lane_data_rate(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  939. struct mipi_ctrl_cfg *cfg)
  940. {
  941. u32 i, test_code = 0, test_data = 0;
  942. for (i = 0; i < MIPI_DPHY_DEFAULT_BIT_RATES; i++) {
  943. if (mipi_hs_freq_range[i].default_bit_rate_mbps <
  944. cfg->lane_rate_mbps)
  945. continue;
  946. /* Send the test code and data */
  947. /* bit[6:0] = hsfreqrange_ovr bit[7] = hsfreqrange_ovr_en */
  948. test_code = TEST_CODE_HS_FREQ_RANGE_CFG;
  949. test_data = (mipi_hs_freq_range[i].hsfreqrange_code & 0x7f) |
  950. (1 << 7);
  951. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  952. break;
  953. }
  954. }
  955. static void dphy_init_sequence(struct kmb_dsi *kmb_dsi,
  956. struct mipi_ctrl_cfg *cfg, u32 dphy_no,
  957. int active_lanes, enum dphy_mode mode)
  958. {
  959. u32 test_code = 0, test_data = 0, val;
  960. /* Set D-PHY in shutdown mode */
  961. /* Assert RSTZ signal */
  962. CLR_DPHY_INIT_CTRL0(kmb_dsi, dphy_no, RESETZ);
  963. /* Assert SHUTDOWNZ signal */
  964. CLR_DPHY_INIT_CTRL0(kmb_dsi, dphy_no, SHUTDOWNZ);
  965. val = kmb_read_mipi(kmb_dsi, DPHY_INIT_CTRL0);
  966. /* Init D-PHY_n
  967. * Pulse testclear signal to make sure the d-phy configuration
  968. * starts from a clean base
  969. */
  970. CLR_DPHY_TEST_CTRL0(kmb_dsi, dphy_no);
  971. ndelay(15);
  972. SET_DPHY_TEST_CTRL0(kmb_dsi, dphy_no);
  973. ndelay(15);
  974. CLR_DPHY_TEST_CTRL0(kmb_dsi, dphy_no);
  975. ndelay(15);
  976. /* Set mastermacro bit - Master or slave mode */
  977. test_code = TEST_CODE_MULTIPLE_PHY_CTRL;
  978. /* DPHY has its own clock lane enabled (master) */
  979. if (mode == MIPI_DPHY_MASTER)
  980. test_data = 0x01;
  981. else
  982. test_data = 0x00;
  983. /* Send the test code and data */
  984. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  985. /* Set the lane data rate */
  986. set_lane_data_rate(kmb_dsi, dphy_no, cfg);
  987. /* High-Speed Tx Slew Rate Calibration
  988. * BitRate: > 1.5 Gbps && <= 2.5 Gbps: slew rate control OFF
  989. */
  990. if (cfg->lane_rate_mbps > 1500)
  991. set_slewrate_gt_1500(kmb_dsi, dphy_no);
  992. else if (cfg->lane_rate_mbps > 1000)
  993. set_slewrate_gt_1000(kmb_dsi, dphy_no);
  994. else
  995. set_slewrate_lt_1000(kmb_dsi, dphy_no);
  996. /* Set cfgclkfreqrange */
  997. val = (((cfg->cfg_clk_khz / 1000) - 17) * 4) & 0x3f;
  998. SET_DPHY_FREQ_CTRL0_3(kmb_dsi, dphy_no, val);
  999. /* Enable config clk for the corresponding d-phy */
  1000. kmb_set_bit_mipi(kmb_dsi, DPHY_CFG_CLK_EN, dphy_no);
  1001. /* PLL setup */
  1002. if (mode == MIPI_DPHY_MASTER)
  1003. setup_pll(kmb_dsi, dphy_no, cfg);
  1004. /* Send NORMAL OPERATION test code */
  1005. test_code = 0x0;
  1006. test_data = 0x0;
  1007. test_mode_send(kmb_dsi, dphy_no, test_code, test_data);
  1008. /* Configure BASEDIR for data lanes
  1009. * NOTE: basedir only applies to LANE_0 of each D-PHY.
  1010. * The other lanes keep their direction based on the D-PHY type,
  1011. * either Rx or Tx.
  1012. * bits[5:0] - BaseDir: 1 = Rx
  1013. * bits[9:6] - BaseDir: 0 = Tx
  1014. */
  1015. kmb_write_bits_mipi(kmb_dsi, DPHY_INIT_CTRL2, 0, 9, 0x03f);
  1016. ndelay(15);
  1017. /* Enable CLOCK LANE
  1018. * Clock lane should be enabled regardless of the direction
  1019. * set for the D-PHY (Rx/Tx)
  1020. */
  1021. kmb_set_bit_mipi(kmb_dsi, DPHY_INIT_CTRL2, 12 + dphy_no);
  1022. /* Enable DATA LANES */
  1023. kmb_write_bits_mipi(kmb_dsi, DPHY_ENABLE, dphy_no * 2, 2,
  1024. ((1 << active_lanes) - 1));
  1025. ndelay(15);
  1026. /* Take D-PHY out of shutdown mode */
  1027. /* Deassert SHUTDOWNZ signal */
  1028. SET_DPHY_INIT_CTRL0(kmb_dsi, dphy_no, SHUTDOWNZ);
  1029. ndelay(15);
  1030. /* Deassert RSTZ signal */
  1031. SET_DPHY_INIT_CTRL0(kmb_dsi, dphy_no, RESETZ);
  1032. }
  1033. static void dphy_wait_fsm(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  1034. enum dphy_tx_fsm fsm_state)
  1035. {
  1036. enum dphy_tx_fsm val = DPHY_TX_POWERDWN;
  1037. int i = 0;
  1038. int status = 1;
  1039. do {
  1040. test_mode_send(kmb_dsi, dphy_no, TEST_CODE_FSM_CONTROL, 0x80);
  1041. val = GET_TEST_DOUT4_7(kmb_dsi, dphy_no);
  1042. i++;
  1043. if (i > TIMEOUT) {
  1044. status = 0;
  1045. break;
  1046. }
  1047. } while (val != fsm_state);
  1048. dev_dbg(kmb_dsi->dev, "%s: dphy %d val = %x", __func__, dphy_no, val);
  1049. dev_dbg(kmb_dsi->dev, "* DPHY %d WAIT_FSM %s *",
  1050. dphy_no, status ? "SUCCESS" : "FAILED");
  1051. }
  1052. static void wait_init_done(struct kmb_dsi *kmb_dsi, u32 dphy_no,
  1053. u32 active_lanes)
  1054. {
  1055. u32 stopstatedata = 0;
  1056. u32 data_lanes = (1 << active_lanes) - 1;
  1057. int i = 0;
  1058. int status = 1;
  1059. do {
  1060. stopstatedata = GET_STOPSTATE_DATA(kmb_dsi, dphy_no)
  1061. & data_lanes;
  1062. /* TODO-need to add a time out and return failure */
  1063. i++;
  1064. if (i > TIMEOUT) {
  1065. status = 0;
  1066. dev_dbg(kmb_dsi->dev,
  1067. "! WAIT_INIT_DONE: TIMING OUT!(err_stat=%d)",
  1068. kmb_read_mipi(kmb_dsi, MIPI_DPHY_ERR_STAT6_7));
  1069. break;
  1070. }
  1071. } while (stopstatedata != data_lanes);
  1072. dev_dbg(kmb_dsi->dev, "* DPHY %d INIT - %s *",
  1073. dphy_no, status ? "SUCCESS" : "FAILED");
  1074. }
  1075. static void wait_pll_lock(struct kmb_dsi *kmb_dsi, u32 dphy_no)
  1076. {
  1077. int i = 0;
  1078. int status = 1;
  1079. do {
  1080. /* TODO-need to add a time out and return failure */
  1081. i++;
  1082. if (i > TIMEOUT) {
  1083. status = 0;
  1084. dev_dbg(kmb_dsi->dev, "%s: timing out", __func__);
  1085. break;
  1086. }
  1087. } while (!GET_PLL_LOCK(kmb_dsi, dphy_no));
  1088. dev_dbg(kmb_dsi->dev, "* PLL Locked for DPHY %d - %s *",
  1089. dphy_no, status ? "SUCCESS" : "FAILED");
  1090. }
  1091. static u32 mipi_tx_init_dphy(struct kmb_dsi *kmb_dsi,
  1092. struct mipi_ctrl_cfg *cfg)
  1093. {
  1094. u32 dphy_no = MIPI_DPHY6;
  1095. /* Multiple D-PHYs needed */
  1096. if (cfg->active_lanes > MIPI_DPHY_D_LANES) {
  1097. /*
  1098. *Initialization for Tx aggregation mode is done according to
  1099. *a. start init PHY1
  1100. *b. poll for PHY1 FSM state LOCK
  1101. * b1. reg addr 0x03[3:0] - state_main[3:0] == 5 (LOCK)
  1102. *c. poll for PHY1 calibrations done :
  1103. * c1. termination calibration lower section: addr 0x22[5]
  1104. * - rescal_done
  1105. * c2. slewrate calibration (if data rate < = 1500 Mbps):
  1106. * addr 0xA7[3:2] - srcal_done, sr_finished
  1107. *d. start init PHY0
  1108. *e. poll for PHY0 stopstate
  1109. *f. poll for PHY1 stopstate
  1110. */
  1111. /* PHY #N+1 ('slave') */
  1112. dphy_init_sequence(kmb_dsi, cfg, dphy_no + 1,
  1113. (cfg->active_lanes - MIPI_DPHY_D_LANES),
  1114. MIPI_DPHY_SLAVE);
  1115. dphy_wait_fsm(kmb_dsi, dphy_no + 1, DPHY_TX_LOCK);
  1116. /* PHY #N master */
  1117. dphy_init_sequence(kmb_dsi, cfg, dphy_no, MIPI_DPHY_D_LANES,
  1118. MIPI_DPHY_MASTER);
  1119. /* Wait for DPHY init to complete */
  1120. wait_init_done(kmb_dsi, dphy_no, MIPI_DPHY_D_LANES);
  1121. wait_init_done(kmb_dsi, dphy_no + 1,
  1122. cfg->active_lanes - MIPI_DPHY_D_LANES);
  1123. wait_pll_lock(kmb_dsi, dphy_no);
  1124. wait_pll_lock(kmb_dsi, dphy_no + 1);
  1125. dphy_wait_fsm(kmb_dsi, dphy_no, DPHY_TX_IDLE);
  1126. } else { /* Single DPHY */
  1127. dphy_init_sequence(kmb_dsi, cfg, dphy_no, cfg->active_lanes,
  1128. MIPI_DPHY_MASTER);
  1129. dphy_wait_fsm(kmb_dsi, dphy_no, DPHY_TX_IDLE);
  1130. wait_init_done(kmb_dsi, dphy_no, cfg->active_lanes);
  1131. wait_pll_lock(kmb_dsi, dphy_no);
  1132. }
  1133. return 0;
  1134. }
  1135. static void connect_lcd_to_mipi(struct kmb_dsi *kmb_dsi,
  1136. struct drm_atomic_state *old_state)
  1137. {
  1138. struct regmap *msscam;
  1139. msscam = syscon_regmap_lookup_by_compatible("intel,keembay-msscam");
  1140. if (IS_ERR(msscam)) {
  1141. dev_dbg(kmb_dsi->dev, "failed to get msscam syscon");
  1142. return;
  1143. }
  1144. drm_atomic_bridge_chain_enable(adv_bridge, old_state);
  1145. /* DISABLE MIPI->CIF CONNECTION */
  1146. regmap_write(msscam, MSS_MIPI_CIF_CFG, 0);
  1147. /* ENABLE LCD->MIPI CONNECTION */
  1148. regmap_write(msscam, MSS_LCD_MIPI_CFG, 1);
  1149. /* DISABLE LCD->CIF LOOPBACK */
  1150. regmap_write(msscam, MSS_LOOPBACK_CFG, 1);
  1151. }
  1152. int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
  1153. int sys_clk_mhz, struct drm_atomic_state *old_state)
  1154. {
  1155. u64 data_rate;
  1156. kmb_dsi->sys_clk_mhz = sys_clk_mhz;
  1157. mipi_tx_init_cfg.active_lanes = MIPI_TX_ACTIVE_LANES;
  1158. mipi_tx_frame0_sect_cfg.width_pixels = mode->crtc_hdisplay;
  1159. mipi_tx_frame0_sect_cfg.height_lines = mode->crtc_vdisplay;
  1160. mipitx_frame0_cfg.vsync_width =
  1161. mode->crtc_vsync_end - mode->crtc_vsync_start;
  1162. mipitx_frame0_cfg.v_backporch =
  1163. mode->crtc_vtotal - mode->crtc_vsync_end;
  1164. mipitx_frame0_cfg.v_frontporch =
  1165. mode->crtc_vsync_start - mode->crtc_vdisplay;
  1166. mipitx_frame0_cfg.hsync_width =
  1167. mode->crtc_hsync_end - mode->crtc_hsync_start;
  1168. mipitx_frame0_cfg.h_backporch =
  1169. mode->crtc_htotal - mode->crtc_hsync_end;
  1170. mipitx_frame0_cfg.h_frontporch =
  1171. mode->crtc_hsync_start - mode->crtc_hdisplay;
  1172. /* Lane rate = (vtotal*htotal*fps*bpp)/4 / 1000000
  1173. * to convert to Mbps
  1174. */
  1175. data_rate = ((((u32)mode->crtc_vtotal * (u32)mode->crtc_htotal) *
  1176. (u32)(drm_mode_vrefresh(mode)) *
  1177. MIPI_TX_BPP) / mipi_tx_init_cfg.active_lanes) / 1000000;
  1178. dev_dbg(kmb_dsi->dev, "data_rate=%u active_lanes=%d\n",
  1179. (u32)data_rate, mipi_tx_init_cfg.active_lanes);
  1180. /* When late rate < 800, modeset fails with 4 lanes,
  1181. * so switch to 2 lanes
  1182. */
  1183. if (data_rate < 800) {
  1184. mipi_tx_init_cfg.active_lanes = 2;
  1185. mipi_tx_init_cfg.lane_rate_mbps = data_rate * 2;
  1186. } else {
  1187. mipi_tx_init_cfg.lane_rate_mbps = data_rate;
  1188. }
  1189. /* Initialize mipi controller */
  1190. mipi_tx_init_cntrl(kmb_dsi, &mipi_tx_init_cfg);
  1191. /* Dphy initialization */
  1192. mipi_tx_init_dphy(kmb_dsi, &mipi_tx_init_cfg);
  1193. connect_lcd_to_mipi(kmb_dsi, old_state);
  1194. dev_info(kmb_dsi->dev, "mipi hw initialized");
  1195. return 0;
  1196. }
  1197. struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev)
  1198. {
  1199. struct kmb_dsi *kmb_dsi;
  1200. struct device *dev = get_device(&pdev->dev);
  1201. kmb_dsi = devm_kzalloc(dev, sizeof(*kmb_dsi), GFP_KERNEL);
  1202. if (!kmb_dsi) {
  1203. dev_err(dev, "failed to allocate kmb_dsi\n");
  1204. return ERR_PTR(-ENOMEM);
  1205. }
  1206. kmb_dsi->host = dsi_host;
  1207. kmb_dsi->host->ops = &kmb_dsi_host_ops;
  1208. dsi_device->host = kmb_dsi->host;
  1209. kmb_dsi->device = dsi_device;
  1210. return kmb_dsi;
  1211. }
  1212. int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi)
  1213. {
  1214. struct drm_encoder *encoder;
  1215. struct drm_connector *connector;
  1216. int ret = 0;
  1217. encoder = &kmb_dsi->base;
  1218. encoder->possible_crtcs = 1;
  1219. encoder->possible_clones = 0;
  1220. ret = drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_DSI);
  1221. if (ret) {
  1222. dev_err(kmb_dsi->dev, "Failed to init encoder %d\n", ret);
  1223. return ret;
  1224. }
  1225. /* Link drm_bridge to encoder */
  1226. ret = drm_bridge_attach(encoder, adv_bridge, NULL,
  1227. DRM_BRIDGE_ATTACH_NO_CONNECTOR);
  1228. if (ret) {
  1229. drm_encoder_cleanup(encoder);
  1230. return ret;
  1231. }
  1232. drm_info(dev, "Bridge attached : SUCCESS");
  1233. connector = drm_bridge_connector_init(dev, encoder);
  1234. if (IS_ERR(connector)) {
  1235. DRM_ERROR("Unable to create bridge connector");
  1236. drm_encoder_cleanup(encoder);
  1237. return PTR_ERR(connector);
  1238. }
  1239. drm_connector_attach_encoder(connector, encoder);
  1240. return 0;
  1241. }
  1242. int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi)
  1243. {
  1244. struct resource *res;
  1245. struct device *dev = kmb_dsi->dev;
  1246. res = platform_get_resource_byname(kmb_dsi->pdev, IORESOURCE_MEM,
  1247. "mipi");
  1248. if (!res) {
  1249. dev_err(dev, "failed to get resource for mipi");
  1250. return -ENOMEM;
  1251. }
  1252. kmb_dsi->mipi_mmio = devm_ioremap_resource(dev, res);
  1253. if (IS_ERR(kmb_dsi->mipi_mmio)) {
  1254. dev_err(dev, "failed to ioremap mipi registers");
  1255. return PTR_ERR(kmb_dsi->mipi_mmio);
  1256. }
  1257. return 0;
  1258. }
  1259. static int kmb_dsi_clk_enable(struct kmb_dsi *kmb_dsi)
  1260. {
  1261. int ret;
  1262. struct device *dev = kmb_dsi->dev;
  1263. ret = clk_prepare_enable(kmb_dsi->clk_mipi);
  1264. if (ret) {
  1265. dev_err(dev, "Failed to enable MIPI clock: %d\n", ret);
  1266. return ret;
  1267. }
  1268. ret = clk_prepare_enable(kmb_dsi->clk_mipi_ecfg);
  1269. if (ret) {
  1270. dev_err(dev, "Failed to enable MIPI_ECFG clock: %d\n", ret);
  1271. return ret;
  1272. }
  1273. ret = clk_prepare_enable(kmb_dsi->clk_mipi_cfg);
  1274. if (ret) {
  1275. dev_err(dev, "Failed to enable MIPI_CFG clock: %d\n", ret);
  1276. return ret;
  1277. }
  1278. dev_info(dev, "SUCCESS : enabled MIPI clocks\n");
  1279. return 0;
  1280. }
  1281. int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi)
  1282. {
  1283. struct device *dev = kmb_dsi->dev;
  1284. unsigned long clk;
  1285. kmb_dsi->clk_mipi = devm_clk_get(dev, "clk_mipi");
  1286. if (IS_ERR(kmb_dsi->clk_mipi)) {
  1287. dev_err(dev, "devm_clk_get() failed clk_mipi\n");
  1288. return PTR_ERR(kmb_dsi->clk_mipi);
  1289. }
  1290. kmb_dsi->clk_mipi_ecfg = devm_clk_get(dev, "clk_mipi_ecfg");
  1291. if (IS_ERR(kmb_dsi->clk_mipi_ecfg)) {
  1292. dev_err(dev, "devm_clk_get() failed clk_mipi_ecfg\n");
  1293. return PTR_ERR(kmb_dsi->clk_mipi_ecfg);
  1294. }
  1295. kmb_dsi->clk_mipi_cfg = devm_clk_get(dev, "clk_mipi_cfg");
  1296. if (IS_ERR(kmb_dsi->clk_mipi_cfg)) {
  1297. dev_err(dev, "devm_clk_get() failed clk_mipi_cfg\n");
  1298. return PTR_ERR(kmb_dsi->clk_mipi_cfg);
  1299. }
  1300. /* Set MIPI clock to 24 Mhz */
  1301. clk_set_rate(kmb_dsi->clk_mipi, KMB_MIPI_DEFAULT_CLK);
  1302. if (clk_get_rate(kmb_dsi->clk_mipi) != KMB_MIPI_DEFAULT_CLK) {
  1303. dev_err(dev, "failed to set to clk_mipi to %d\n",
  1304. KMB_MIPI_DEFAULT_CLK);
  1305. return -1;
  1306. }
  1307. dev_dbg(dev, "clk_mipi = %ld\n", clk_get_rate(kmb_dsi->clk_mipi));
  1308. clk = clk_get_rate(kmb_dsi->clk_mipi_ecfg);
  1309. if (clk != KMB_MIPI_DEFAULT_CFG_CLK) {
  1310. /* Set MIPI_ECFG clock to 24 Mhz */
  1311. clk_set_rate(kmb_dsi->clk_mipi_ecfg, KMB_MIPI_DEFAULT_CFG_CLK);
  1312. clk = clk_get_rate(kmb_dsi->clk_mipi_ecfg);
  1313. if (clk != KMB_MIPI_DEFAULT_CFG_CLK) {
  1314. dev_err(dev, "failed to set to clk_mipi_ecfg to %d\n",
  1315. KMB_MIPI_DEFAULT_CFG_CLK);
  1316. return -1;
  1317. }
  1318. }
  1319. clk = clk_get_rate(kmb_dsi->clk_mipi_cfg);
  1320. if (clk != KMB_MIPI_DEFAULT_CFG_CLK) {
  1321. /* Set MIPI_CFG clock to 24 Mhz */
  1322. clk_set_rate(kmb_dsi->clk_mipi_cfg, 24000000);
  1323. clk = clk_get_rate(kmb_dsi->clk_mipi_cfg);
  1324. if (clk != KMB_MIPI_DEFAULT_CFG_CLK) {
  1325. dev_err(dev, "failed to set clk_mipi_cfg to %d\n",
  1326. KMB_MIPI_DEFAULT_CFG_CLK);
  1327. return -1;
  1328. }
  1329. }
  1330. return kmb_dsi_clk_enable(kmb_dsi);
  1331. }