Hi Keith,
On Fri, Jun 02, 2023 at 03:40:43PM +0800, Keith Zhao wrote:
Add HDMI dirver for StarFive SoC JH7110.
Signed-off-by: Keith Zhao keith.zhao@starfivetech.com
drivers/gpu/drm/verisilicon/Kconfig | 11 + drivers/gpu/drm/verisilicon/Makefile | 1 + drivers/gpu/drm/verisilicon/starfive_hdmi.c | 928 ++++++++++++++++++++ drivers/gpu/drm/verisilicon/starfive_hdmi.h | 296 +++++++ drivers/gpu/drm/verisilicon/vs_drv.c | 6 + drivers/gpu/drm/verisilicon/vs_drv.h | 4 + 6 files changed, 1246 insertions(+) create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.c create mode 100644 drivers/gpu/drm/verisilicon/starfive_hdmi.h
[...]
diff --git a/drivers/gpu/drm/verisilicon/starfive_hdmi.c b/drivers/gpu/drm/verisilicon/starfive_hdmi.c new file mode 100644 index 000000000000..128ecca03309 --- /dev/null +++ b/drivers/gpu/drm/verisilicon/starfive_hdmi.c @@ -0,0 +1,928 @@
[...]
+static int starfive_hdmi_enable_clk_deassert_rst(struct device *dev, struct starfive_hdmi *hdmi) +{
- int ret;
- ret = clk_prepare_enable(hdmi->sys_clk);
- if (ret) {
DRM_DEV_ERROR(dev, "Cannot enable HDMI sys clock: %d\n", ret);
return ret;
- }
- ret = clk_prepare_enable(hdmi->mclk);
- if (ret) {
DRM_DEV_ERROR(dev, "Cannot enable HDMI mclk clock: %d\n", ret);
return ret;
- }
- ret = clk_prepare_enable(hdmi->bclk);
- if (ret) {
DRM_DEV_ERROR(dev, "Cannot enable HDMI bclk clock: %d\n", ret);
return ret;
- }
- ret = reset_control_deassert(hdmi->tx_rst);
- if (ret < 0) {
dev_err(dev, "failed to deassert tx_rst\n");
The error paths should clk_disable_unprepare() enabled clocks.
return ret;
- }
- return 0;
+}
[...]
+static int starfive_hdmi_get_clk_rst(struct device *dev, struct starfive_hdmi *hdmi) +{
- hdmi->sys_clk = devm_clk_get(dev, "sysclk");
- if (IS_ERR(hdmi->sys_clk)) {
DRM_DEV_ERROR(dev, "Unable to get HDMI sysclk clk\n");
return PTR_ERR(hdmi->sys_clk);
- }
- hdmi->mclk = devm_clk_get(dev, "mclk");
- if (IS_ERR(hdmi->mclk)) {
DRM_DEV_ERROR(dev, "Unable to get HDMI mclk clk\n");
return PTR_ERR(hdmi->mclk);
- }
- hdmi->bclk = devm_clk_get(dev, "bclk");
- if (IS_ERR(hdmi->bclk)) {
DRM_DEV_ERROR(dev, "Unable to get HDMI bclk clk\n");
return PTR_ERR(hdmi->bclk);
- }
- hdmi->tx_rst = reset_control_get_shared(dev, "hdmi_tx");
Use devm_reset_control_get_shared() for consistency, otherwise this is missing a reset_control_put() somewhere.
regards Philipp