@@ -8,6 +8,7 @@
#include <linux/component.h>
#include <linux/media-bus-format.h>
#include <linux/of_graph.h>
+#include <linux/phy/phy.h>
#include <drm/display/drm_dp_helper.h>
#include <drm/drm_atomic_helper.h>
@@ -30,6 +31,7 @@ struct rockchip_rgb {
struct drm_bridge *bridge;
struct drm_encoder encoder;
struct drm_connector connector;
+ struct phy *dphy;
int output_mode;
};
@@ -168,6 +170,22 @@ struct rockchip_rgb *rockchip_rgb_init(struct device *dev,
goto err_free_connector;
}
+ /* PHY */
+ rgb->dphy = devm_phy_get(dev, "dphy");
+ if (!IS_ERR(rgb->dphy)) {
+ ret = phy_init(rgb->dphy);
+ if (ret)
+ return ERR_PTR(ret);
+
+ ret = phy_set_mode(rgb->dphy, PHY_MODE_TTL);
+ if (ret)
+ return ERR_PTR(ret);
+
+ ret = phy_power_on(rgb->dphy);
+ if (ret)
+ return ERR_PTR(ret);
+ }
+
return rgb;
err_free_connector:
Dispite the commit 1f0f015151727, the rgb output has an option to allow to sent the output pin using the dsi/lvds/ttl logic. The only way to do and stay on the same design is let the rockchip_rgb block to grab the handle if it is present and enable it. The present of this handle depends on dts configuration I have a full working example with an hardware with mixed lines on direct logic and using the phy, with the follow dts example: panel: panel { compatible = "panel-dpi"; ... panel-timing { clock-frequency = <30000000>; ... }; port { panel_rgb_in: endpoint { remote-endpoint = <&vopb_out_rgb>; }; }; }; &vopb_out { vopb_out_rgb: endpoint@2 { reg = <2>; remote-endpoint = <&panel_rgb_in>; }; }; &vopb { status = "okay"; pinctrl-names = "default", "sleep"; pinctrl-0 = <&lcdc_rgb_pins>; pinctrl-1 = <&lcdc_sleep_pins>; phys = <&dsi_dphy>; phy-names = "dphy"; }; Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com> --- drivers/gpu/drm/rockchip/rockchip_rgb.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)