Commit ebe32c3e authored by Pierre-Hugues Husson's avatar Pierre-Hugues Husson Committed by Archit Taneja

drm/bridge: synopsys/dw-hdmi: Enable cec clock

Support the "cec" optional clock. The documentation already mentions "cec"
optional clock and it is used by several boards, but currently the driver
doesn't enable it, thus preventing cec from working on those boards.

And even worse: a /dev/cecX device will appear for those boards, but it
won't be functioning without configuring this clock.

Changes:
v4:
- Change commit message to stress the importance of this patch

v3:
- Drop useless braces

v2:
- Separate ENOENT errors from others
- Propagate other errors (especially -EPROBE_DEFER)
Signed-off-by: default avatarPierre-Hugues Husson <phh@phh.me>
Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20171125201844.11353-1-phh@phh.me
parent 1b6fba45
...@@ -138,6 +138,7 @@ struct dw_hdmi { ...@@ -138,6 +138,7 @@ struct dw_hdmi {
struct device *dev; struct device *dev;
struct clk *isfr_clk; struct clk *isfr_clk;
struct clk *iahb_clk; struct clk *iahb_clk;
struct clk *cec_clk;
struct dw_hdmi_i2c *i2c; struct dw_hdmi_i2c *i2c;
struct hdmi_data_info hdmi_data; struct hdmi_data_info hdmi_data;
...@@ -2382,6 +2383,26 @@ __dw_hdmi_probe(struct platform_device *pdev, ...@@ -2382,6 +2383,26 @@ __dw_hdmi_probe(struct platform_device *pdev,
goto err_isfr; goto err_isfr;
} }
hdmi->cec_clk = devm_clk_get(hdmi->dev, "cec");
if (PTR_ERR(hdmi->cec_clk) == -ENOENT) {
hdmi->cec_clk = NULL;
} else if (IS_ERR(hdmi->cec_clk)) {
ret = PTR_ERR(hdmi->cec_clk);
if (ret != -EPROBE_DEFER)
dev_err(hdmi->dev, "Cannot get HDMI cec clock: %d\n",
ret);
hdmi->cec_clk = NULL;
goto err_iahb;
} else {
ret = clk_prepare_enable(hdmi->cec_clk);
if (ret) {
dev_err(hdmi->dev, "Cannot enable HDMI cec clock: %d\n",
ret);
goto err_iahb;
}
}
/* Product and revision IDs */ /* Product and revision IDs */
hdmi->version = (hdmi_readb(hdmi, HDMI_DESIGN_ID) << 8) hdmi->version = (hdmi_readb(hdmi, HDMI_DESIGN_ID) << 8)
| (hdmi_readb(hdmi, HDMI_REVISION_ID) << 0); | (hdmi_readb(hdmi, HDMI_REVISION_ID) << 0);
...@@ -2518,6 +2539,8 @@ __dw_hdmi_probe(struct platform_device *pdev, ...@@ -2518,6 +2539,8 @@ __dw_hdmi_probe(struct platform_device *pdev,
cec_notifier_put(hdmi->cec_notifier); cec_notifier_put(hdmi->cec_notifier);
clk_disable_unprepare(hdmi->iahb_clk); clk_disable_unprepare(hdmi->iahb_clk);
if (hdmi->cec_clk)
clk_disable_unprepare(hdmi->cec_clk);
err_isfr: err_isfr:
clk_disable_unprepare(hdmi->isfr_clk); clk_disable_unprepare(hdmi->isfr_clk);
err_res: err_res:
...@@ -2541,6 +2564,8 @@ static void __dw_hdmi_remove(struct dw_hdmi *hdmi) ...@@ -2541,6 +2564,8 @@ static void __dw_hdmi_remove(struct dw_hdmi *hdmi)
clk_disable_unprepare(hdmi->iahb_clk); clk_disable_unprepare(hdmi->iahb_clk);
clk_disable_unprepare(hdmi->isfr_clk); clk_disable_unprepare(hdmi->isfr_clk);
if (hdmi->cec_clk)
clk_disable_unprepare(hdmi->cec_clk);
if (hdmi->i2c) if (hdmi->i2c)
i2c_del_adapter(&hdmi->i2c->adap); i2c_del_adapter(&hdmi->i2c->adap);
......
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