.. | .. |
---|
231 | 231 | |
---|
232 | 232 | bool force_hpd; |
---|
233 | 233 | bool force_output; |
---|
| 234 | + u32 max_link_rate; |
---|
234 | 235 | }; |
---|
235 | 236 | |
---|
236 | 237 | enum { |
---|
.. | .. |
---|
562 | 563 | !!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED); |
---|
563 | 564 | |
---|
564 | 565 | 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), |
---|
566 | 567 | drm_dp_max_link_rate(link->dpcd)); |
---|
567 | 568 | link->lanes = min_t(u8, dp->phy.attrs.bus_width, |
---|
568 | 569 | drm_dp_max_lane_count(link->dpcd)); |
---|
.. | .. |
---|
1704 | 1705 | return 0; |
---|
1705 | 1706 | } |
---|
1706 | 1707 | |
---|
| 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 | + |
---|
1707 | 1751 | static int dw_dp_probe(struct udevice *dev) |
---|
1708 | 1752 | { |
---|
1709 | 1753 | struct dw_dp *dp = dev_get_priv(dev); |
---|
.. | .. |
---|
1723 | 1767 | return ret; |
---|
1724 | 1768 | } |
---|
1725 | 1769 | |
---|
1726 | | - dp->force_hpd = dev_read_bool(dev, "force-hpd"); |
---|
1727 | | - |
---|
1728 | 1770 | ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio, |
---|
1729 | 1771 | GPIOD_IS_IN); |
---|
1730 | 1772 | if (ret && ret != -ENOENT) { |
---|
.. | .. |
---|
1736 | 1778 | |
---|
1737 | 1779 | dp->dev = dev; |
---|
1738 | 1780 | |
---|
| 1781 | + ret = dw_dp_parse_dt(dp); |
---|
| 1782 | + if (ret) { |
---|
| 1783 | + dev_err(dev, "failed to parse DT\n"); |
---|
| 1784 | + return ret; |
---|
| 1785 | + } |
---|
| 1786 | + |
---|
1739 | 1787 | dw_dp_ddc_init(dp); |
---|
1740 | 1788 | |
---|
1741 | 1789 | rockchip_connector_bind(&dp->connector, dev, dp->id, &dw_dp_connector_funcs, NULL, |
---|