forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
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
....@@ -93,8 +95,6 @@
9395 { 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */
9496 { 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */
9597 { 1920, 1080, 24, 3, 1 },
96
- { 1280, 720, 60, 4, 1 },
97
- { 1280, 720, 30, 4, 1 },
9898 { 720, 480, 60, 4, 1 },
9999 { 720, 576, 50, 2, 1 },
100100 { 640, 480, 60, 2, 1 },
....@@ -185,12 +185,14 @@
185185
186186 regmap_write(lt9611->regmap, 0x8319, (u8)(hfront_porch % 256));
187187
188
- regmap_write(lt9611->regmap, 0x831a, (u8)(hsync_porch / 256));
188
+ regmap_write(lt9611->regmap, 0x831a, (u8)(hsync_porch / 256) |
189
+ ((hfront_porch / 256) << 4));
189190 regmap_write(lt9611->regmap, 0x831b, (u8)(hsync_porch % 256));
190191 }
191192
192
-static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
193
+static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int postdiv)
193194 {
195
+ unsigned int pcr_m = mode->clock * 5 * postdiv / 27000;
194196 const struct reg_sequence reg_cfg[] = {
195197 { 0x830b, 0x01 },
196198 { 0x830c, 0x10 },
....@@ -205,7 +207,6 @@
205207
206208 /* stage 2 */
207209 { 0x834a, 0x40 },
208
- { 0x831d, 0x10 },
209210
210211 /* MK limit */
211212 { 0x832d, 0x38 },
....@@ -220,36 +221,28 @@
220221 { 0x8325, 0x00 },
221222 { 0x832a, 0x01 },
222223 { 0x834a, 0x10 },
223
- { 0x831d, 0x10 },
224
- { 0x8326, 0x37 },
225224 };
225
+ u8 pol = 0x10;
226226
227
- regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
227
+ if (mode->flags & DRM_MODE_FLAG_NHSYNC)
228
+ pol |= 0x2;
229
+ if (mode->flags & DRM_MODE_FLAG_NVSYNC)
230
+ pol |= 0x1;
231
+ regmap_write(lt9611->regmap, 0x831d, pol);
228232
229
- switch (mode->hdisplay) {
230
- case 640:
231
- regmap_write(lt9611->regmap, 0x8326, 0x14);
232
- break;
233
- case 1280:
234
- regmap_write(lt9611->regmap, 0x8326, 0x1c);
235
- break;
236
- case 1920:
237
- if (drm_mode_vrefresh(mode) == 30)
238
- regmap_write(lt9611->regmap, 0x8326, 0x1c);
239
- else
240
- regmap_write(lt9611->regmap, 0x8326, 0x37);
241
- break;
242
- case 3840:
233
+ if (mode->hdisplay == 3840)
243234 regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2));
244
- break;
245
- }
235
+ else
236
+ regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
237
+
238
+ regmap_write(lt9611->regmap, 0x8326, pcr_m);
246239
247240 /* pcr rst */
248241 regmap_write(lt9611->regmap, 0x8011, 0x5a);
249242 regmap_write(lt9611->regmap, 0x8011, 0xfa);
250243 }
251244
252
-static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
245
+static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int *postdiv)
253246 {
254247 unsigned int pclk = mode->clock;
255248 const struct reg_sequence reg_cfg[] = {
....@@ -263,16 +256,21 @@
263256 { 0x8126, 0x55 },
264257 { 0x8127, 0x66 },
265258 { 0x8128, 0x88 },
259
+ { 0x812a, 0x20 },
266260 };
267261
268262 regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
269263
270
- if (pclk > 150000)
264
+ if (pclk > 150000) {
271265 regmap_write(lt9611->regmap, 0x812d, 0x88);
272
- else if (pclk > 70000)
266
+ *postdiv = 1;
267
+ } else if (pclk > 70000) {
273268 regmap_write(lt9611->regmap, 0x812d, 0x99);
274
- else
269
+ *postdiv = 2;
270
+ } else {
275271 regmap_write(lt9611->regmap, 0x812d, 0xaa);
272
+ *postdiv = 4;
273
+ }
276274
277275 /*
278276 * first divide pclk by 2 first
....@@ -443,6 +441,25 @@
443441 regmap_write(lt9611->regmap, 0x8203, val);
444442 regmap_write(lt9611->regmap, 0x8207, 0xff); /* clear */
445443 regmap_write(lt9611->regmap, 0x8207, 0x3f);
444
+}
445
+
446
+static void lt9611_sleep_setup(struct lt9611 *lt9611)
447
+{
448
+ const struct reg_sequence sleep_setup[] = {
449
+ { 0x8024, 0x76 },
450
+ { 0x8023, 0x01 },
451
+ { 0x8157, 0x03 }, /* set addr pin as output */
452
+ { 0x8149, 0x0b },
453
+
454
+ { 0x8102, 0x48 }, /* MIPI Rx power down */
455
+ { 0x8123, 0x80 },
456
+ { 0x8130, 0x00 },
457
+ { 0x8011, 0x0a },
458
+ };
459
+
460
+ regmap_multi_reg_write(lt9611->regmap,
461
+ sleep_setup, ARRAY_SIZE(sleep_setup));
462
+ lt9611->sleep = true;
446463 }
447464
448465 static int lt9611_power_on(struct lt9611 *lt9611)
....@@ -743,7 +760,7 @@
743760 static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
744761 struct device_node *dsi_node)
745762 {
746
- const struct mipi_dsi_device_info info = { "lt9611", 0, NULL };
763
+ const struct mipi_dsi_device_info info = { "lt9611", 0, lt9611->dev->of_node};
747764 struct mipi_dsi_device *dsi;
748765 struct mipi_dsi_host *host;
749766 int ret;
....@@ -762,7 +779,8 @@
762779
763780 dsi->lanes = 4;
764781 dsi->format = MIPI_DSI_FMT_RGB888;
765
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST;
782
+ dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
783
+ MIPI_DSI_MODE_VIDEO_HSE;
766784
767785 ret = mipi_dsi_attach(dsi);
768786 if (ret < 0) {
....@@ -801,20 +819,28 @@
801819
802820 drm_connector_helper_add(&lt9611->connector,
803821 &lt9611_bridge_connector_helper_funcs);
804
- drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
805822
806823 if (!bridge->encoder) {
807824 DRM_ERROR("Parent encoder object not found");
808825 return -ENODEV;
809826 }
810827
828
+ drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
829
+
811830 return 0;
812831 }
813832
814
-static int lt9611_bridge_attach(struct drm_bridge *bridge)
833
+static int lt9611_bridge_attach(struct drm_bridge *bridge,
834
+ enum drm_bridge_attach_flags flags)
815835 {
816836 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
817837 int ret;
838
+
839
+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
840
+ ret = lt9611_connector_init(bridge, lt9611);
841
+ if (ret < 0)
842
+ return ret;
843
+ }
818844
819845 /* Attach primary DSI */
820846 lt9611->dsi0 = lt9611_attach_dsi(lt9611, lt9611->dsi0_node);
....@@ -830,9 +856,7 @@
830856 }
831857 }
832858
833
- ret = lt9611_connector_init(bridge, lt9611);
834
-
835
- return ret;
859
+ return 0;
836860
837861 err_unregister_dsi0:
838862 lt9611_bridge_detach(bridge);
....@@ -843,45 +867,98 @@
843867 }
844868
845869 static enum drm_mode_status lt9611_bridge_mode_valid(struct drm_bridge *bridge,
870
+ const struct drm_display_info *info,
846871 const struct drm_display_mode *mode)
847872 {
848873 struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
874
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
849875
850
- return lt9611_mode ? MODE_OK : MODE_BAD;
876
+ if (!lt9611_mode)
877
+ return MODE_BAD;
878
+ else if (lt9611_mode->intfs > 1 && !lt9611->dsi1)
879
+ return MODE_PANEL;
880
+ else
881
+ return MODE_OK;
851882 }
852883
853884 static void lt9611_bridge_pre_enable(struct drm_bridge *bridge)
854885 {
855886 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
887
+ static const struct reg_sequence reg_cfg[] = {
888
+ { 0x8102, 0x12 },
889
+ { 0x8123, 0x40 },
890
+ { 0x8130, 0xea },
891
+ { 0x8011, 0xfa },
892
+ };
856893
857
- lt9611_reset(lt9611);
858
- regmap_write(lt9611->regmap, 0x80ee, 0x01);
859
- lt9611_enable_hpd_interrupts(lt9611);
894
+ if (!lt9611->sleep)
895
+ return;
860896
897
+ regmap_multi_reg_write(lt9611->regmap,
898
+ reg_cfg, ARRAY_SIZE(reg_cfg));
899
+
900
+ lt9611->sleep = false;
861901 }
862902
863903 static void lt9611_bridge_post_disable(struct drm_bridge *bridge)
864904 {
905
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
906
+
907
+ lt9611_sleep_setup(lt9611);
865908 }
866909
867910 static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
868
- struct drm_display_mode *mode,
869
- struct drm_display_mode *adj_mode)
911
+ const struct drm_display_mode *mode,
912
+ const struct drm_display_mode *adj_mode)
870913 {
871914 struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
872915 struct hdmi_avi_infoframe avi_frame;
916
+ unsigned int postdiv;
873917 int ret;
874918
875919 lt9611_bridge_pre_enable(bridge);
876920
877921 lt9611_mipi_input_digital(lt9611, mode);
878
- lt9611_pll_setup(lt9611, mode);
922
+ lt9611_pll_setup(lt9611, mode, &postdiv);
879923 lt9611_mipi_video_setup(lt9611, mode);
880
- lt9611_pcr_setup(lt9611, mode);
924
+ lt9611_pcr_setup(lt9611, mode, postdiv);
881925
882
- ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame, mode, false);
926
+ ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
927
+ &lt9611->connector,
928
+ mode);
883929 if (!ret)
884930 lt9611->vic = avi_frame.video_code;
931
+}
932
+
933
+static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
934
+{
935
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
936
+ unsigned int reg_val = 0;
937
+ int connected;
938
+
939
+ regmap_read(lt9611->regmap, 0x825e, &reg_val);
940
+ connected = reg_val & BIT(2);
941
+
942
+ lt9611->status = connected ? connector_status_connected :
943
+ connector_status_disconnected;
944
+
945
+ return lt9611->status;
946
+}
947
+
948
+static struct edid *lt9611_bridge_get_edid(struct drm_bridge *bridge,
949
+ struct drm_connector *connector)
950
+{
951
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
952
+
953
+ lt9611_power_on(lt9611);
954
+ return drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
955
+}
956
+
957
+static void lt9611_bridge_hpd_enable(struct drm_bridge *bridge)
958
+{
959
+ struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
960
+
961
+ lt9611_enable_hpd_interrupts(lt9611);
885962 }
886963
887964 static const struct drm_bridge_funcs lt9611_bridge_funcs = {
....@@ -892,6 +969,9 @@
892969 .disable = lt9611_bridge_disable,
893970 .post_disable = lt9611_bridge_post_disable,
894971 .mode_set = lt9611_bridge_mode_set,
972
+ .detect = lt9611_bridge_detect,
973
+ .get_edid = lt9611_bridge_get_edid,
974
+ .hpd_enable = lt9611_bridge_hpd_enable,
895975 };
896976
897977 static int lt9611_parse_dt(struct device *dev,
....@@ -1058,6 +1138,7 @@
10581138
10591139 lt9611->dev = &client->dev;
10601140 lt9611->client = client;
1141
+ lt9611->sleep = false;
10611142
10621143 lt9611->regmap = devm_regmap_init_i2c(client, &lt9611_regmap_config);
10631144 if (IS_ERR(lt9611->regmap)) {
....@@ -1095,8 +1176,7 @@
10951176
10961177 ret = devm_request_threaded_irq(dev, client->irq, NULL,
10971178 lt9611_irq_thread_handler,
1098
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1099
- "lt9611", lt9611);
1179
+ IRQF_ONESHOT, "lt9611", lt9611);
11001180 if (ret) {
11011181 dev_err(dev, "failed to request irq\n");
11021182 goto err_disable_regulators;
....@@ -1106,6 +1186,9 @@
11061186
11071187 lt9611->bridge.funcs = &lt9611_bridge_funcs;
11081188 lt9611->bridge.of_node = client->dev.of_node;
1189
+ lt9611->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
1190
+ DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES;
1191
+ lt9611->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
11091192
11101193 drm_bridge_add(&lt9611->bridge);
11111194