hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
....@@ -11,13 +11,14 @@
1111 #include <linux/platform_device.h>
1212 #include <linux/regmap.h>
1313 #include <linux/regulator/consumer.h>
14
-#include <drm/drm_crtc_helper.h>
14
+
1515 #include <sound/hdmi-codec.h>
1616
1717 #include <drm/drm_atomic_helper.h>
1818 #include <drm/drm_bridge.h>
1919 #include <drm/drm_mipi_dsi.h>
2020 #include <drm/drm_print.h>
21
+#include <drm/drm_probe_helper.h>
2122
2223 #define EDID_SEG_SIZE 256
2324 #define EDID_LEN 32
....@@ -46,6 +47,7 @@
4647 struct gpio_desc *enable_gpio;
4748
4849 bool power_on;
50
+ bool sleep;
4951
5052 struct regulator_bulk_data supplies[2];
5153
....@@ -437,6 +439,26 @@
437439 regmap_write(lt9611->regmap, 0x8207, 0x3f);
438440 }
439441
442
+static void lt9611_sleep_setup(struct lt9611 *lt9611)
443
+{
444
+ const struct reg_sequence sleep_setup[] = {
445
+ { 0x8024, 0x76 },
446
+ { 0x8023, 0x01 },
447
+ { 0x8157, 0x03 }, /* set addr pin as output */
448
+ { 0x8149, 0x0b },
449
+ { 0x8151, 0x30 }, /* disable IRQ */
450
+ { 0x8102, 0x48 }, /* MIPI Rx power down */
451
+ { 0x8123, 0x80 },
452
+ { 0x8130, 0x00 },
453
+ { 0x8100, 0x01 }, /* bandgap power down */
454
+ { 0x8101, 0x00 }, /* system clk power down */
455
+ };
456
+
457
+ regmap_multi_reg_write(lt9611->regmap,
458
+ sleep_setup, ARRAY_SIZE(sleep_setup));
459
+ lt9611->sleep = true;
460
+}
461
+
440462 static int lt9611_power_on(struct lt9611 *lt9611)
441463 {
442464 int ret;
....@@ -754,7 +776,8 @@
754776
755777 dsi->lanes = 4;
756778 dsi->format = MIPI_DSI_FMT_RGB888;
757
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST;
779
+ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
780
+ MIPI_DSI_MODE_VIDEO_HSE;
758781
759782 ret = mipi_dsi_attach(dsi);
760783 if (ret < 0) {
....@@ -793,20 +816,28 @@
793816
794817 drm_connector_helper_add(&lt9611->connector,
795818 &lt9611_bridge_connector_helper_funcs);
796
- drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
797819
798820 if (!bridge->encoder) {
799821 DRM_ERROR("Parent encoder object not found");
800822 return -ENODEV;
801823 }
802824
825
+ drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
826
+
803827 return 0;
804828 }
805829
806
-static int lt9611_bridge_attach(struct drm_bridge *bridge)
830
+static int lt9611_bridge_attach(struct drm_bridge *bridge,
831
+ enum drm_bridge_attach_flags flags)
807832 {
808833 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
809834 int ret;
835
+
836
+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
837
+ ret = lt9611_connector_init(bridge, lt9611);
838
+ if (ret < 0)
839
+ return ret;
840
+ }
810841
811842 /* Attach primary DSI */
812843 lt9611->dsi0 = lt9611_attach_dsi(lt9611, lt9611->dsi0_node);
....@@ -822,9 +853,7 @@
822853 }
823854 }
824855
825
- ret = lt9611_connector_init(bridge, lt9611);
826
-
827
- return ret;
856
+ return 0;
828857
829858 err_unregister_dsi0:
830859 lt9611_bridge_detach(bridge);
....@@ -835,30 +864,43 @@
835864 }
836865
837866 static enum drm_mode_status lt9611_bridge_mode_valid(struct drm_bridge *bridge,
867
+ const struct drm_display_info *info,
838868 const struct drm_display_mode *mode)
839869 {
840870 struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
871
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
841872
842
- return lt9611_mode ? MODE_OK : MODE_BAD;
873
+ if (!lt9611_mode)
874
+ return MODE_BAD;
875
+ else if (lt9611_mode->intfs > 1 && !lt9611->dsi1)
876
+ return MODE_PANEL;
877
+ else
878
+ return MODE_OK;
843879 }
844880
845881 static void lt9611_bridge_pre_enable(struct drm_bridge *bridge)
846882 {
847883 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
848884
885
+ if (!lt9611->sleep)
886
+ return;
887
+
849888 lt9611_reset(lt9611);
850889 regmap_write(lt9611->regmap, 0x80ee, 0x01);
851
- lt9611_enable_hpd_interrupts(lt9611);
852890
891
+ lt9611->sleep = false;
853892 }
854893
855894 static void lt9611_bridge_post_disable(struct drm_bridge *bridge)
856895 {
896
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
897
+
898
+ lt9611_sleep_setup(lt9611);
857899 }
858900
859901 static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
860
- struct drm_display_mode *mode,
861
- struct drm_display_mode *adj_mode)
902
+ const struct drm_display_mode *mode,
903
+ const struct drm_display_mode *adj_mode)
862904 {
863905 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
864906 struct hdmi_avi_infoframe avi_frame;
....@@ -871,9 +913,42 @@
871913 lt9611_mipi_video_setup(lt9611, mode);
872914 lt9611_pcr_setup(lt9611, mode);
873915
874
- ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame, mode, false);
916
+ ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
917
+ &lt9611->connector,
918
+ mode);
875919 if (!ret)
876920 lt9611->vic = avi_frame.video_code;
921
+}
922
+
923
+static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
924
+{
925
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
926
+ unsigned int reg_val = 0;
927
+ int connected;
928
+
929
+ regmap_read(lt9611->regmap, 0x825e, &reg_val);
930
+ connected = reg_val & BIT(2);
931
+
932
+ lt9611->status = connected ? connector_status_connected :
933
+ connector_status_disconnected;
934
+
935
+ return lt9611->status;
936
+}
937
+
938
+static struct edid *lt9611_bridge_get_edid(struct drm_bridge *bridge,
939
+ struct drm_connector *connector)
940
+{
941
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
942
+
943
+ lt9611_power_on(lt9611);
944
+ return drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
945
+}
946
+
947
+static void lt9611_bridge_hpd_enable(struct drm_bridge *bridge)
948
+{
949
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
950
+
951
+ lt9611_enable_hpd_interrupts(lt9611);
877952 }
878953
879954 static const struct drm_bridge_funcs lt9611_bridge_funcs = {
....@@ -884,6 +959,9 @@
884959 .disable = lt9611_bridge_disable,
885960 .post_disable = lt9611_bridge_post_disable,
886961 .mode_set = lt9611_bridge_mode_set,
962
+ .detect = lt9611_bridge_detect,
963
+ .get_edid = lt9611_bridge_get_edid,
964
+ .hpd_enable = lt9611_bridge_hpd_enable,
887965 };
888966
889967 static int lt9611_parse_dt(struct device *dev,
....@@ -1050,6 +1128,7 @@
10501128
10511129 lt9611->dev = &client->dev;
10521130 lt9611->client = client;
1131
+ lt9611->sleep = false;
10531132
10541133 lt9611->regmap = devm_regmap_init_i2c(client, &lt9611_regmap_config);
10551134 if (IS_ERR(lt9611->regmap)) {
....@@ -1087,8 +1166,7 @@
10871166
10881167 ret = devm_request_threaded_irq(dev, client->irq, NULL,
10891168 lt9611_irq_thread_handler,
1090
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1091
- "lt9611", lt9611);
1169
+ IRQF_ONESHOT, "lt9611", lt9611);
10921170 if (ret) {
10931171 dev_err(dev, "failed to request irq\n");
10941172 goto err_disable_regulators;
....@@ -1098,6 +1176,9 @@
10981176
10991177 lt9611->bridge.funcs = &lt9611_bridge_funcs;
11001178 lt9611->bridge.of_node = client->dev.of_node;
1179
+ lt9611->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
1180
+ DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES;
1181
+ lt9611->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
11011182
11021183 drm_bridge_add(&lt9611->bridge);
11031184