hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
u-boot/drivers/video/drm/dw-dp.c
....@@ -231,6 +231,7 @@
231231
232232 bool force_hpd;
233233 bool force_output;
234
+ u32 max_link_rate;
234235 };
235236
236237 enum {
....@@ -562,7 +563,7 @@
562563 !!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED);
563564
564565 link->revision = link->dpcd[DP_DPCD_REV];
565
- link->rate = min_t(u32, dp->phy.attrs.max_link_rate * 100,
566
+ link->rate = min_t(u32, min(dp->max_link_rate, dp->phy.attrs.max_link_rate * 100),
566567 drm_dp_max_link_rate(link->dpcd));
567568 link->lanes = min_t(u8, dp->phy.attrs.bus_width,
568569 drm_dp_max_lane_count(link->dpcd));
....@@ -1704,6 +1705,49 @@
17041705 return 0;
17051706 }
17061707
1708
+static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp)
1709
+{
1710
+ struct udevice *dev = dp->dev;
1711
+ const struct device_node *endpoint;
1712
+ u64 frequency = 0;
1713
+
1714
+ endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0);
1715
+ if (!endpoint)
1716
+ return 0;
1717
+
1718
+ if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0)
1719
+ return 0;
1720
+
1721
+ if (!frequency)
1722
+ return 0;
1723
+
1724
+ do_div(frequency, 10 * 1000); /* symbol rate kbytes */
1725
+
1726
+ switch (frequency) {
1727
+ case 162000:
1728
+ case 270000:
1729
+ case 540000:
1730
+ case 810000:
1731
+ break;
1732
+ default:
1733
+ dev_err(dev, "invalid link frequency value: %llu\n", frequency);
1734
+ return 0;
1735
+ }
1736
+
1737
+ return frequency;
1738
+}
1739
+
1740
+static int dw_dp_parse_dt(struct dw_dp *dp)
1741
+{
1742
+ dp->force_hpd = dev_read_bool(dp->dev, "force-hpd");
1743
+
1744
+ dp->max_link_rate = dw_dp_parse_link_frequencies(dp);
1745
+ if (!dp->max_link_rate)
1746
+ dp->max_link_rate = 810000;
1747
+
1748
+ return 0;
1749
+}
1750
+
17071751 static int dw_dp_probe(struct udevice *dev)
17081752 {
17091753 struct dw_dp *dp = dev_get_priv(dev);
....@@ -1723,8 +1767,6 @@
17231767 return ret;
17241768 }
17251769
1726
- dp->force_hpd = dev_read_bool(dev, "force-hpd");
1727
-
17281770 ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio,
17291771 GPIOD_IS_IN);
17301772 if (ret && ret != -ENOENT) {
....@@ -1736,6 +1778,12 @@
17361778
17371779 dp->dev = dev;
17381780
1781
+ ret = dw_dp_parse_dt(dp);
1782
+ if (ret) {
1783
+ dev_err(dev, "failed to parse DT\n");
1784
+ return ret;
1785
+ }
1786
+
17391787 dw_dp_ddc_init(dp);
17401788
17411789 rockchip_connector_bind(&dp->connector, dev, dp->id, &dw_dp_connector_funcs, NULL,