Commit e00012b2 authored by Archit Taneja's avatar Archit Taneja Committed by Rob Clark

drm/msm/hdmi: Make HDMI core get its PHY

Make HDMI core get its PHY by parsing the "phys" phandle. The core will use
this PHY reference to enable/disable PHY. The driver defers probe until PHY
isn't available.

The DT bindings used here is the same as the one used for PHYs using the
common PHY framework bindings.
Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent ea184891
...@@ -81,12 +81,46 @@ static void hdmi_destroy(struct hdmi *hdmi) ...@@ -81,12 +81,46 @@ static void hdmi_destroy(struct hdmi *hdmi)
if (phy) if (phy)
phy->funcs->destroy(phy); phy->funcs->destroy(phy);
if (hdmi->phy_dev) {
put_device(hdmi->phy_dev);
hdmi->phy = NULL;
hdmi->phy_dev = NULL;
}
if (hdmi->i2c) if (hdmi->i2c)
hdmi_i2c_destroy(hdmi->i2c); hdmi_i2c_destroy(hdmi->i2c);
platform_set_drvdata(hdmi->pdev, NULL); platform_set_drvdata(hdmi->pdev, NULL);
} }
static int hdmi_get_phy(struct hdmi *hdmi)
{
struct platform_device *pdev = hdmi->pdev;
struct platform_device *phy_pdev;
struct device_node *phy_node;
phy_node = of_parse_phandle(pdev->dev.of_node, "phys", 0);
if (!phy_node) {
dev_err(&pdev->dev, "cannot find phy device\n");
return -ENXIO;
}
phy_pdev = of_find_device_by_node(phy_node);
if (phy_pdev)
hdmi->phy = platform_get_drvdata(phy_pdev);
of_node_put(phy_node);
if (!phy_pdev || !hdmi->phy) {
dev_err(&pdev->dev, "phy driver is not ready\n");
return -EPROBE_DEFER;
}
hdmi->phy_dev = get_device(&phy_pdev->dev);
return 0;
}
/* construct hdmi at bind/probe time, grab all the resources. If /* construct hdmi at bind/probe time, grab all the resources. If
* we are to EPROBE_DEFER we want to do it here, rather than later * we are to EPROBE_DEFER we want to do it here, rather than later
* at modeset_init() time * at modeset_init() time
...@@ -230,6 +264,12 @@ static struct hdmi *hdmi_init(struct platform_device *pdev) ...@@ -230,6 +264,12 @@ static struct hdmi *hdmi_init(struct platform_device *pdev)
goto fail; goto fail;
} }
ret = hdmi_get_phy(hdmi);
if (ret) {
dev_err(&pdev->dev, "failed to get phy\n");
goto fail;
}
hdmi->hdcp_ctrl = hdmi_hdcp_init(hdmi); hdmi->hdcp_ctrl = hdmi_hdcp_init(hdmi);
if (IS_ERR(hdmi->hdcp_ctrl)) { if (IS_ERR(hdmi->hdcp_ctrl)) {
dev_warn(&pdev->dev, "failed to init hdcp: disabled\n"); dev_warn(&pdev->dev, "failed to init hdcp: disabled\n");
......
...@@ -70,6 +70,8 @@ struct hdmi { ...@@ -70,6 +70,8 @@ struct hdmi {
struct clk **pwr_clks; struct clk **pwr_clks;
struct hdmi_phy *phy; struct hdmi_phy *phy;
struct device *phy_dev;
struct i2c_adapter *i2c; struct i2c_adapter *i2c;
struct drm_connector *connector; struct drm_connector *connector;
struct drm_bridge *bridge; struct drm_bridge *bridge;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment