1 // SPDX-License-Identifier: GPL-2.0
3 * Lontium LT9211 bridge driver
5 * LT9211 is capable of converting:
6 * 2xDSI/2xLVDS/1xDPI -> 2xDSI/2xLVDS/1xDPI
7 * Currently supported is:
13 #include <linux/bits.h>
14 #include <linux/clk.h>
15 #include <linux/gpio/consumer.h>
16 #include <linux/i2c.h>
17 #include <linux/media-bus-format.h>
18 #include <linux/module.h>
19 #include <linux/of_device.h>
20 #include <linux/of_graph.h>
21 #include <linux/regmap.h>
22 #include <linux/regulator/consumer.h>
24 #include <drm/drm_atomic_helper.h>
25 #include <drm/drm_bridge.h>
26 #include <drm/drm_mipi_dsi.h>
27 #include <drm/drm_of.h>
28 #include <drm/drm_panel.h>
29 #include <drm/drm_print.h>
30 #include <drm/drm_probe_helper.h>
32 #define REG_PAGE_CONTROL 0xff
33 #define REG_CHIPID0 0x8100
34 #define REG_CHIPID0_VALUE 0x18
35 #define REG_CHIPID1 0x8101
36 #define REG_CHIPID1_VALUE 0x01
37 #define REG_CHIPID2 0x8102
38 #define REG_CHIPID2_VALUE 0xe3
40 #define REG_DSI_LANE 0xd000
41 /* DSI lane count - 0 means 4 lanes ; 1, 2, 3 means 1, 2, 3 lanes. */
42 #define REG_DSI_LANE_COUNT(n) ((n) & 3)
45 struct drm_bridge bridge;
47 struct regmap *regmap;
48 struct mipi_dsi_device *dsi;
49 struct drm_bridge *panel_bridge;
50 struct gpio_desc *reset_gpio;
51 struct regulator *vccio;
53 bool lvds_dual_link_even_odd_swap;
56 static const struct regmap_range lt9211_rw_ranges[] = {
57 regmap_reg_range(0xff, 0xff),
58 regmap_reg_range(0x8100, 0x816b),
59 regmap_reg_range(0x8200, 0x82aa),
60 regmap_reg_range(0x8500, 0x85ff),
61 regmap_reg_range(0x8600, 0x86a0),
62 regmap_reg_range(0x8700, 0x8746),
63 regmap_reg_range(0xd000, 0xd0a7),
64 regmap_reg_range(0xd400, 0xd42c),
65 regmap_reg_range(0xd800, 0xd838),
66 regmap_reg_range(0xd9c0, 0xd9d5),
69 static const struct regmap_access_table lt9211_rw_table = {
70 .yes_ranges = lt9211_rw_ranges,
71 .n_yes_ranges = ARRAY_SIZE(lt9211_rw_ranges),
74 static const struct regmap_range_cfg lt9211_range = {
78 .selector_reg = REG_PAGE_CONTROL,
79 .selector_mask = 0xff,
85 static const struct regmap_config lt9211_regmap_config = {
88 .rd_table = <9211_rw_table,
89 .wr_table = <9211_rw_table,
90 .volatile_table = <9211_rw_table,
91 .ranges = <9211_range,
93 .cache_type = REGCACHE_RBTREE,
94 .max_register = 0xda00,
97 static struct lt9211 *bridge_to_lt9211(struct drm_bridge *bridge)
99 return container_of(bridge, struct lt9211, bridge);
102 static int lt9211_attach(struct drm_bridge *bridge,
103 enum drm_bridge_attach_flags flags)
105 struct lt9211 *ctx = bridge_to_lt9211(bridge);
107 return drm_bridge_attach(bridge->encoder, ctx->panel_bridge,
108 &ctx->bridge, flags);
111 static int lt9211_read_chipid(struct lt9211 *ctx)
116 /* Read Chip ID registers and verify the chip can communicate. */
117 ret = regmap_bulk_read(ctx->regmap, REG_CHIPID0, chipid, 3);
119 dev_err(ctx->dev, "Failed to read Chip ID: %d\n", ret);
123 /* Test for known Chip ID. */
124 if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE ||
125 chipid[2] != REG_CHIPID2_VALUE) {
126 dev_err(ctx->dev, "Unknown Chip ID: 0x%02x 0x%02x 0x%02x\n",
127 chipid[0], chipid[1], chipid[2]);
134 static int lt9211_system_init(struct lt9211 *ctx)
136 const struct reg_sequence lt9211_system_init_seq[] = {
149 return regmap_multi_reg_write(ctx->regmap, lt9211_system_init_seq,
150 ARRAY_SIZE(lt9211_system_init_seq));
153 static int lt9211_configure_rx(struct lt9211 *ctx)
155 const struct reg_sequence lt9211_rx_phy_seq[] = {
161 /* ORR with 0xf8 here to enable DSI DN/DP swap. */
167 const struct reg_sequence lt9211_rx_cal_reset_seq[] = {
172 const struct reg_sequence lt9211_rx_dig_seq[] = {
174 /* 0x8588: BIT 6 set = MIPI-RX, BIT 4 unset = LVDS-TX */
177 { REG_DSI_LANE, REG_DSI_LANE_COUNT(ctx->dsi->lanes) },
181 const struct reg_sequence lt9211_rx_div_reset_seq[] = {
186 const struct reg_sequence lt9211_rx_div_clear_seq[] = {
193 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_phy_seq,
194 ARRAY_SIZE(lt9211_rx_phy_seq));
198 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_cal_reset_seq,
199 ARRAY_SIZE(lt9211_rx_cal_reset_seq));
203 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_dig_seq,
204 ARRAY_SIZE(lt9211_rx_dig_seq));
208 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_reset_seq,
209 ARRAY_SIZE(lt9211_rx_div_reset_seq));
213 usleep_range(10000, 15000);
215 return regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_clear_seq,
216 ARRAY_SIZE(lt9211_rx_div_clear_seq));
219 static int lt9211_autodetect_rx(struct lt9211 *ctx,
220 const struct drm_display_mode *mode)
229 /* Measure ByteClock frequency. */
230 ret = regmap_write(ctx->regmap, 0x8600, 0x01);
234 /* Give the chip time to lock onto RX stream. */
237 /* Read the ByteClock frequency from the chip. */
238 ret = regmap_bulk_read(ctx->regmap, 0x8608, bc, sizeof(bc));
242 /* RX ByteClock in kHz */
243 byteclk = ((bc[0] & 0xf) << 16) | (bc[1] << 8) | bc[2];
245 /* Width/Height/Format Auto-detection */
246 ret = regmap_bulk_read(ctx->regmap, 0xd082, buf, sizeof(buf));
250 width = (buf[0] << 8) | buf[1];
251 height = (buf[3] << 8) | buf[4];
252 format = buf[2] & 0xf;
254 if (format == 0x3) { /* YUV422 16bit */
256 } else if (format == 0xa) { /* RGB888 24bit */
259 dev_err(ctx->dev, "Unsupported DSI pixel format 0x%01x\n",
264 if (width != mode->hdisplay) {
266 "RX: Detected DSI width (%d) does not match mode hdisplay (%d)\n",
267 width, mode->hdisplay);
271 if (height != mode->vdisplay) {
273 "RX: Detected DSI height (%d) does not match mode vdisplay (%d)\n",
274 height, mode->vdisplay);
278 dev_dbg(ctx->dev, "RX: %dx%d format=0x%01x byteclock=%d kHz\n",
279 width, height, format, byteclk);
284 static int lt9211_configure_timing(struct lt9211 *ctx,
285 const struct drm_display_mode *mode)
287 const struct reg_sequence lt9211_timing[] = {
288 { 0xd00d, (mode->vtotal >> 8) & 0xff },
289 { 0xd00e, mode->vtotal & 0xff },
290 { 0xd00f, (mode->vdisplay >> 8) & 0xff },
291 { 0xd010, mode->vdisplay & 0xff },
292 { 0xd011, (mode->htotal >> 8) & 0xff },
293 { 0xd012, mode->htotal & 0xff },
294 { 0xd013, (mode->hdisplay >> 8) & 0xff },
295 { 0xd014, mode->hdisplay & 0xff },
296 { 0xd015, (mode->vsync_end - mode->vsync_start) & 0xff },
297 { 0xd016, (mode->hsync_end - mode->hsync_start) & 0xff },
298 { 0xd017, ((mode->vsync_start - mode->vdisplay) >> 8) & 0xff },
299 { 0xd018, (mode->vsync_start - mode->vdisplay) & 0xff },
300 { 0xd019, ((mode->hsync_start - mode->hdisplay) >> 8) & 0xff },
301 { 0xd01a, (mode->hsync_start - mode->hdisplay) & 0xff },
304 return regmap_multi_reg_write(ctx->regmap, lt9211_timing,
305 ARRAY_SIZE(lt9211_timing));
308 static int lt9211_configure_plls(struct lt9211 *ctx,
309 const struct drm_display_mode *mode)
311 const struct reg_sequence lt9211_pcr_seq[] = {
331 /* DeSSC PLL reference clock is 25 MHz XTal. */
332 ret = regmap_write(ctx->regmap, 0x822d, 0x48);
336 if (mode->clock < 44000) {
337 ret = regmap_write(ctx->regmap, 0x8235, 0x83);
338 } else if (mode->clock < 88000) {
339 ret = regmap_write(ctx->regmap, 0x8235, 0x82);
340 } else if (mode->clock < 176000) {
341 ret = regmap_write(ctx->regmap, 0x8235, 0x81);
344 "Unsupported mode clock (%d kHz) above 176 MHz.\n",
352 /* Wait for the DeSSC PLL to stabilize. */
355 ret = regmap_multi_reg_write(ctx->regmap, lt9211_pcr_seq,
356 ARRAY_SIZE(lt9211_pcr_seq));
360 /* PCR stability test takes seconds. */
361 ret = regmap_read_poll_timeout(ctx->regmap, 0xd087, pval, pval & 0x8,
364 dev_err(ctx->dev, "PCR unstable, ret=%i\n", ret);
369 static int lt9211_configure_tx(struct lt9211 *ctx, bool jeida,
372 const struct reg_sequence system_lt9211_tx_phy_seq[] = {
373 /* DPI output disable */
375 /* BIT(7) is LVDS dual-port */
376 { 0x823b, 0x38 | (ctx->lvds_dual_link ? BIT(7) : 0) },
390 /* LVDS channel order, Odd:Even 0x10..A:B, 0x40..B:A */
391 { 0x8646, ctx->lvds_dual_link_even_odd_swap ? 0x40 : 0x10 },
396 const struct reg_sequence system_lt9211_tx_dig_seq[] = {
397 { 0x8559, 0x40 | (jeida ? BIT(7) : 0) |
398 (de ? BIT(5) : 0) | (bpp24 ? BIT(4) : 0) },
401 { 0x855c, ctx->lvds_dual_link ? BIT(0) : 0 },
411 const struct reg_sequence system_lt9211_tx_pll_seq[] = {
412 /* TX PLL power down */
414 { 0x8237, ctx->lvds_dual_link ? 0x2a : 0x29 },
426 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_phy_seq,
427 ARRAY_SIZE(system_lt9211_tx_phy_seq));
431 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_dig_seq,
432 ARRAY_SIZE(system_lt9211_tx_dig_seq));
436 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_pll_seq,
437 ARRAY_SIZE(system_lt9211_tx_pll_seq));
441 ret = regmap_read_poll_timeout(ctx->regmap, 0x871f, pval, pval & 0x80,
444 dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret);
448 ret = regmap_read_poll_timeout(ctx->regmap, 0x8720, pval, pval & 0x80,
451 dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret);
458 static void lt9211_atomic_enable(struct drm_bridge *bridge,
459 struct drm_bridge_state *old_bridge_state)
461 struct lt9211 *ctx = bridge_to_lt9211(bridge);
462 struct drm_atomic_state *state = old_bridge_state->base.state;
463 const struct drm_bridge_state *bridge_state;
464 const struct drm_crtc_state *crtc_state;
465 const struct drm_display_mode *mode;
466 struct drm_connector *connector;
467 struct drm_crtc *crtc;
468 bool lvds_format_24bpp;
469 bool lvds_format_jeida;
473 ret = regulator_enable(ctx->vccio);
475 dev_err(ctx->dev, "Failed to enable vccio: %d\n", ret);
480 gpiod_set_value(ctx->reset_gpio, 1);
481 usleep_range(20000, 21000); /* Very long post-reset delay. */
483 /* Get the LVDS format from the bridge state. */
484 bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
485 bus_flags = bridge_state->output_bus_cfg.flags;
487 switch (bridge_state->output_bus_cfg.format) {
488 case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
489 lvds_format_24bpp = false;
490 lvds_format_jeida = true;
492 case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
493 lvds_format_24bpp = true;
494 lvds_format_jeida = true;
496 case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
497 lvds_format_24bpp = true;
498 lvds_format_jeida = false;
502 * Some bridges still don't set the correct
503 * LVDS bus pixel format, use SPWG24 default
504 * format until those are fixed.
506 lvds_format_24bpp = true;
507 lvds_format_jeida = false;
509 "Unsupported LVDS bus format 0x%04x, please check output bridge driver. Falling back to SPWG24.\n",
510 bridge_state->output_bus_cfg.format);
515 * Retrieve the CRTC adjusted mode. This requires a little dance to go
516 * from the bridge to the encoder, to the connector and to the CRTC.
518 connector = drm_atomic_get_new_connector_for_encoder(state,
520 crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
521 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
522 mode = &crtc_state->adjusted_mode;
524 ret = lt9211_read_chipid(ctx);
528 ret = lt9211_system_init(ctx);
532 ret = lt9211_configure_rx(ctx);
536 ret = lt9211_autodetect_rx(ctx, mode);
540 ret = lt9211_configure_timing(ctx, mode);
544 ret = lt9211_configure_plls(ctx, mode);
548 ret = lt9211_configure_tx(ctx, lvds_format_jeida, lvds_format_24bpp,
549 bus_flags & DRM_BUS_FLAG_DE_HIGH);
553 dev_dbg(ctx->dev, "LT9211 enabled.\n");
556 static void lt9211_atomic_disable(struct drm_bridge *bridge,
557 struct drm_bridge_state *old_bridge_state)
559 struct lt9211 *ctx = bridge_to_lt9211(bridge);
563 * Put the chip in reset, pull nRST line low,
564 * and assure lengthy 10ms reset low timing.
566 gpiod_set_value(ctx->reset_gpio, 0);
567 usleep_range(10000, 11000); /* Very long reset duration. */
569 ret = regulator_disable(ctx->vccio);
571 dev_err(ctx->dev, "Failed to disable vccio: %d\n", ret);
573 regcache_mark_dirty(ctx->regmap);
576 static enum drm_mode_status
577 lt9211_mode_valid(struct drm_bridge *bridge,
578 const struct drm_display_info *info,
579 const struct drm_display_mode *mode)
581 /* LVDS output clock range 25..176 MHz */
582 if (mode->clock < 25000)
583 return MODE_CLOCK_LOW;
584 if (mode->clock > 176000)
585 return MODE_CLOCK_HIGH;
590 #define MAX_INPUT_SEL_FORMATS 1
593 lt9211_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
594 struct drm_bridge_state *bridge_state,
595 struct drm_crtc_state *crtc_state,
596 struct drm_connector_state *conn_state,
598 unsigned int *num_input_fmts)
604 input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
609 /* This is the DSI-end bus format */
610 input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
616 static const struct drm_bridge_funcs lt9211_funcs = {
617 .attach = lt9211_attach,
618 .mode_valid = lt9211_mode_valid,
619 .atomic_enable = lt9211_atomic_enable,
620 .atomic_disable = lt9211_atomic_disable,
621 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
622 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
623 .atomic_get_input_bus_fmts = lt9211_atomic_get_input_bus_fmts,
624 .atomic_reset = drm_atomic_helper_bridge_reset,
627 static int lt9211_parse_dt(struct lt9211 *ctx)
629 struct device_node *port2, *port3;
630 struct drm_bridge *panel_bridge;
631 struct device *dev = ctx->dev;
632 struct drm_panel *panel;
636 ctx->vccio = devm_regulator_get(dev, "vccio");
637 if (IS_ERR(ctx->vccio))
638 return dev_err_probe(dev, PTR_ERR(ctx->vccio),
639 "Failed to get supply 'vccio'\n");
641 ctx->lvds_dual_link = false;
642 ctx->lvds_dual_link_even_odd_swap = false;
644 port2 = of_graph_get_port_by_id(dev->of_node, 2);
645 port3 = of_graph_get_port_by_id(dev->of_node, 3);
646 dual_link = drm_of_lvds_get_dual_link_pixel_order(port2, port3);
650 if (dual_link == DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS) {
651 ctx->lvds_dual_link = true;
652 /* Odd pixels to LVDS Channel A, even pixels to B */
653 ctx->lvds_dual_link_even_odd_swap = false;
654 } else if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
655 ctx->lvds_dual_link = true;
656 /* Even pixels to LVDS Channel A, odd pixels to B */
657 ctx->lvds_dual_link_even_odd_swap = true;
660 ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &panel_bridge);
664 panel_bridge = devm_drm_panel_bridge_add(dev, panel);
665 if (IS_ERR(panel_bridge))
666 return PTR_ERR(panel_bridge);
669 ctx->panel_bridge = panel_bridge;
674 static int lt9211_host_attach(struct lt9211 *ctx)
676 const struct mipi_dsi_device_info info = {
681 struct device *dev = ctx->dev;
682 struct device_node *host_node;
683 struct device_node *endpoint;
684 struct mipi_dsi_device *dsi;
685 struct mipi_dsi_host *host;
689 endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
690 dsi_lanes = drm_of_get_data_lanes_count(endpoint, 1, 4);
691 host_node = of_graph_get_remote_port_parent(endpoint);
692 host = of_find_mipi_dsi_host_by_node(host_node);
693 of_node_put(host_node);
694 of_node_put(endpoint);
697 return -EPROBE_DEFER;
702 dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
704 return dev_err_probe(dev, PTR_ERR(dsi),
705 "failed to create dsi device\n");
709 dsi->lanes = dsi_lanes;
710 dsi->format = MIPI_DSI_FMT_RGB888;
711 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
712 MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO_NO_HSA |
713 MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
714 MIPI_DSI_MODE_NO_EOT_PACKET;
716 ret = devm_mipi_dsi_attach(dev, dsi);
718 dev_err(dev, "failed to attach dsi to host: %d\n", ret);
725 static int lt9211_probe(struct i2c_client *client)
727 struct device *dev = &client->dev;
731 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
738 * Put the chip in reset, pull nRST line low,
739 * and assure lengthy 10ms reset low timing.
741 ctx->reset_gpio = devm_gpiod_get_optional(ctx->dev, "reset",
743 if (IS_ERR(ctx->reset_gpio))
744 return PTR_ERR(ctx->reset_gpio);
746 usleep_range(10000, 11000); /* Very long reset duration. */
748 ret = lt9211_parse_dt(ctx);
752 ctx->regmap = devm_regmap_init_i2c(client, <9211_regmap_config);
753 if (IS_ERR(ctx->regmap))
754 return PTR_ERR(ctx->regmap);
756 dev_set_drvdata(dev, ctx);
757 i2c_set_clientdata(client, ctx);
759 ctx->bridge.funcs = <9211_funcs;
760 ctx->bridge.of_node = dev->of_node;
761 drm_bridge_add(&ctx->bridge);
763 ret = lt9211_host_attach(ctx);
765 drm_bridge_remove(&ctx->bridge);
770 static void lt9211_remove(struct i2c_client *client)
772 struct lt9211 *ctx = i2c_get_clientdata(client);
774 drm_bridge_remove(&ctx->bridge);
777 static struct i2c_device_id lt9211_id[] = {
778 { "lontium,lt9211" },
781 MODULE_DEVICE_TABLE(i2c, lt9211_id);
783 static const struct of_device_id lt9211_match_table[] = {
784 { .compatible = "lontium,lt9211" },
787 MODULE_DEVICE_TABLE(of, lt9211_match_table);
789 static struct i2c_driver lt9211_driver = {
790 .probe = lt9211_probe,
791 .remove = lt9211_remove,
792 .id_table = lt9211_id,
795 .of_match_table = lt9211_match_table,
798 module_i2c_driver(lt9211_driver);
801 MODULE_DESCRIPTION("Lontium LT9211 DSI/LVDS/DPI bridge driver");
802 MODULE_LICENSE("GPL");