2017년 02월 03일 15:38에 Inki Dae 이(가) 쓴 글: > > > 2017년 02월 01일 17:29에 Andrzej Hajda 이(가) 쓴 글: >> On TM2/TM2e platforms HDMI output is connected to MHL bridge >> SiI8620. To allow configure UltraHD modes on the bridge >> and to eliminate unsupported modes this bridge should be >> attached to drm_encoder implemented in exynos_hdmi. >> >> Signed-off-by: Andrzej Hajda <a.hajda@xxxxxxxxxxx> >> --- >> drivers/gpu/drm/exynos/exynos_hdmi.c | 56 +++++++++++++++++++++++++++++------- >> 1 file changed, 46 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c >> index a73b192..41fb894 100644 >> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c >> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c >> @@ -35,6 +35,7 @@ >> #include <linux/io.h> >> #include <linux/of_address.h> >> #include <linux/of_device.h> >> +#include <linux/of_graph.h> >> #include <linux/hdmi.h> >> #include <linux/component.h> >> #include <linux/mfd/syscon.h> >> @@ -133,6 +134,7 @@ struct hdmi_context { >> struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)]; >> struct regulator *reg_hdmi_en; >> struct exynos_drm_clk phy_clk; >> + struct drm_bridge *bridge; >> }; >> >> static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) >> @@ -922,7 +924,15 @@ static int hdmi_create_connector(struct drm_encoder *encoder) >> drm_connector_register(connector); >> drm_mode_connector_attach_encoder(connector, encoder); >> >> - return 0; >> + if (hdata->bridge) { >> + encoder->bridge = hdata->bridge; >> + hdata->bridge->encoder = encoder; >> + ret = drm_bridge_attach(encoder->dev, hdata->bridge); > > arguments of drm_bridge_attach function has been changed so fixed it - trivial thing. > Applied it including other patches. The argument was changed by below patch, drm: bridge: Link encoder and bridge in core code Thanks. > > Thanks, > Inki Dae > >> + if (ret) >> + DRM_ERROR("Failed to attach bridge\n"); >> + } >> + >> + return ret; >> } >> >> static bool hdmi_mode_fixup(struct drm_encoder *encoder, >> @@ -1591,6 +1601,31 @@ static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable) >> hdmiphy_disable(hdata); >> } >> >> +static int hdmi_bridge_init(struct hdmi_context *hdata) >> +{ >> + struct device *dev = hdata->dev; >> + struct device_node *ep, *np; >> + >> + ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1); >> + if (!ep) >> + return 0; >> + >> + np = of_graph_get_remote_port_parent(ep); >> + of_node_put(ep); >> + if (!np) { >> + DRM_ERROR("failed to get remote port parent"); >> + return -EINVAL; >> + } >> + >> + hdata->bridge = of_drm_find_bridge(np); >> + of_node_put(np); >> + >> + if (!hdata->bridge) >> + return -EPROBE_DEFER; >> + >> + return 0; >> +} >> + >> static int hdmi_resources_init(struct hdmi_context *hdata) >> { >> struct device *dev = hdata->dev; >> @@ -1630,17 +1665,18 @@ static int hdmi_resources_init(struct hdmi_context *hdata) >> >> hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en"); >> >> - if (PTR_ERR(hdata->reg_hdmi_en) == -ENODEV) >> - return 0; >> + if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV) { >> + if (IS_ERR(hdata->reg_hdmi_en)) >> + return PTR_ERR(hdata->reg_hdmi_en); >> >> - if (IS_ERR(hdata->reg_hdmi_en)) >> - return PTR_ERR(hdata->reg_hdmi_en); >> - >> - ret = regulator_enable(hdata->reg_hdmi_en); >> - if (ret) >> - DRM_ERROR("failed to enable hdmi-en regulator\n"); >> + ret = regulator_enable(hdata->reg_hdmi_en); >> + if (ret) { >> + DRM_ERROR("failed to enable hdmi-en regulator\n"); >> + return ret; >> + } >> + } >> >> - return ret; >> + return hdmi_bridge_init(hdata); >> } >> >> static struct of_device_id hdmi_match_types[] = { >> _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel