drm/rockchip: rgb: support generic phy interface

Change-Id: Ia74a29ee0ac0c7322cc38faddff845d8c5cedfb3
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
Wyon Bi
2018-12-08 10:53:19 +08:00
parent af76341c31
commit 1b0421bebf

View File

@@ -25,6 +25,7 @@
#include <linux/of_graph.h>
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
#include <linux/phy/phy.h>
#include "rockchip_drm_drv.h"
#include "rockchip_drm_vop.h"
@@ -51,6 +52,7 @@ struct rockchip_rgb {
struct drm_bridge *bridge;
struct drm_connector connector;
struct drm_encoder encoder;
struct phy *phy;
struct regmap *grf;
bool data_sync;
const struct rockchip_rgb_funcs *funcs;
@@ -107,12 +109,23 @@ struct drm_connector_helper_funcs rockchip_rgb_connector_helper_funcs = {
static void rockchip_rgb_encoder_enable(struct drm_encoder *encoder)
{
struct rockchip_rgb *rgb = encoder_to_rgb(encoder);
int ret;
pinctrl_pm_select_default_state(rgb->dev);
if (rgb->funcs && rgb->funcs->enable)
rgb->funcs->enable(rgb);
if (rgb->phy) {
ret = phy_set_mode(rgb->phy, PHY_MODE_VIDEO_TTL);
if (ret) {
dev_err(rgb->dev, "failed to set phy mode: %d\n", ret);
return;
}
phy_power_on(rgb->phy);
}
if (rgb->panel) {
drm_panel_prepare(rgb->panel);
drm_panel_enable(rgb->panel);
@@ -128,6 +141,9 @@ static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder)
drm_panel_unprepare(rgb->panel);
}
if (rgb->phy)
phy_power_off(rgb->phy);
if (rgb->funcs && rgb->funcs->disable)
rgb->funcs->disable(rgb);
@@ -299,6 +315,13 @@ static int rockchip_rgb_probe(struct platform_device *pdev)
}
}
rgb->phy = devm_phy_optional_get(dev, "phy");
if (IS_ERR(rgb->phy)) {
ret = PTR_ERR(rgb->phy);
dev_err(dev, "failed to get phy: %d\n", ret);
return ret;
}
return component_add(dev, &rockchip_rgb_component_ops);
}