Lakka-LibreELEC/projects/NXP/devices/iMX8/patches/linux/0037-MLK-25199-1-drm-mhdp-Add-hdmi-phy-reset-poweroff-fun.patch

162 lines
5.9 KiB
Diff

From 38f1f4ecd038628f4ce7a47114455123e5db3367 Mon Sep 17 00:00:00 2001
From: Sandor Yu <Sandor.yu@nxp.com>
Date: Wed, 30 Dec 2020 16:02:52 +0800
Subject: [PATCH 37/49] MLK-25199-1: drm: mhdp: Add hdmi phy reset/poweroff
function
Add hdmi phy reset and power off function.
Signed-off-by: Sandor Yu <Sandor.yu@nxp.com>
Reviewed-by: Robby Cai <robby.cai@nxp.com>
---
drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c | 28 ++++++++++++++++++-
drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h | 3 +-
drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 4 +--
drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c | 2 ++
drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h | 3 +-
5 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c
index 120300e6a2df..212f3f4f1e26 100644
--- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c
+++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-hdmi-phy.c
@@ -1,7 +1,7 @@
/*
* Cadence High-Definition Multimedia Interface (HDMI) driver
*
- * Copyright (C) 2019 NXP Semiconductor, Inc.
+ * Copyright (C) 2019-2021 NXP Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@
#include <drm/bridge/cdns-mhdp.h>
#include "cdns-mhdp-phy.h"
+#include "cdns-mhdp-imx.h"
/* HDMI TX clock control settings */
struct hdmi_ctrl {
@@ -746,6 +747,7 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp)
DRM_ERROR("NO HDMI FW running\n");
return -ENXIO;
}
+ imx8qm_phy_reset(0);
/* Configure PHY */
mhdp->hdmi.char_rate = hdmi_phy_cfg_ss28fdsoi(mhdp, mode);
@@ -753,6 +755,7 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp)
DRM_ERROR("failed to set phy pclock\n");
return -EINVAL;
}
+ imx8qm_phy_reset(1);
ret = hdmi_phy_power_up(mhdp);
if (ret < 0)
@@ -762,3 +765,26 @@ int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *mhdp)
return true;
}
+
+int cdns_hdmi_phy_shutdown(struct cdns_mhdp_device *mhdp)
+{
+ int timeout;
+ u32 reg_val;
+
+ reg_val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL);
+ reg_val &= 0xfff0;
+ /* PHY_DP_MODE_CTL set to A3 power state*/
+ cdns_phy_reg_write(mhdp, PHY_HDP_MODE_CTRL, reg_val | 0x8);
+
+ /* PHY_DP_MODE_CTL */
+ timeout = 0;
+ do {
+ reg_val = cdns_phy_reg_read(mhdp, PHY_HDP_MODE_CTRL);
+ DRM_INFO("Reg val is 0x%04x\n", reg_val);
+ timeout++;
+ msleep(100);
+ } while (!(reg_val & (0x8 << 4)) && (timeout < 10)); /* Wait for A3 acknowledge */
+
+ DRM_INFO("hdmi phy shutdown complete\n");
+ return 0;
+}
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h
index fc3247dada2d..a12005ae4c53 100644
--- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h
+++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx.h
@@ -1,7 +1,7 @@
/*
* Cadence High-Definition Multimedia Interface (HDMI) driver
*
- * Copyright (C) 2019 NXP Semiconductor, Inc.
+ * Copyright (C) 2019-2021 NXP Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -72,4 +72,5 @@ int cdns_mhdp_suspend_imx8qm(struct cdns_mhdp_device *mhdp);
int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp);
int cdns_mhdp_power_on_ls1028a(struct cdns_mhdp_device *mhdp);
void cdns_mhdp_pclk_rate_ls1028a(struct cdns_mhdp_device *mhdp);
+void imx8qm_phy_reset(u8 reset);
#endif /* CDNS_MHDP_IMX_H_ */
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c
index 38f9defa42f8..46c0500da4c3 100644
--- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c
+++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019 NXP semiconductor, inc.
+ * Copyright (c) 2019-2021 NXP semiconductor, inc.
*
* this program is free software; you can redistribute it and/or modify
* it under the terms of the gnu general public license version 2 as
@@ -102,7 +102,7 @@ static void imx8qm_pixel_link_sync_disable(u32 dual_mode)
imx_sc_misc_set_control(handle, IMX_SC_R_DC_0, IMX_SC_C_SYNC_CTRL0, 0);
}
-static void imx8qm_phy_reset(u8 reset)
+void imx8qm_phy_reset(u8 reset)
{
struct imx_sc_ipc *handle;
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c
index 9fa0df74ad7c..4c4ce9d3c847 100644
--- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c
+++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imxdrv.c
@@ -22,6 +22,7 @@ static void cdns_mhdp_imx_encoder_disable(struct drm_encoder *encoder)
struct drm_bridge *bridge = drm_bridge_chain_get_first_bridge(encoder);
struct cdns_mhdp_device *mhdp = bridge->driver_private;
+ cdns_hdmi_phy_shutdown(mhdp);
cdns_mhdp_plat_call(mhdp, plat_init);
}
@@ -184,6 +185,7 @@ static int cdns_mhdp_imx_bind(struct device *dev, struct device *master,
imx_mhdp->mhdp.plat_data = plat_data;
imx_mhdp->mhdp.dev = dev;
+ imx_mhdp->mhdp.drm_dev = drm;
imx_mhdp->mhdp.bus_type = plat_data->bus_type;
ret = plat_data->bind(pdev, encoder, &imx_mhdp->mhdp);
/*
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h
index 5682b9fbc90f..9035f1f71eee 100644
--- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h
+++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-phy.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 NXP Semiconductor, Inc.
+ * Copyright (C) 2019-2021 NXP Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -152,4 +152,5 @@ bool cdns_hdmi_phy_video_valid_imx8mq(struct cdns_mhdp_device *hdp);
bool cdns_hdmi_phy_video_valid_imx8qm(struct cdns_mhdp_device *hdp);
int cdns_hdmi_phy_set_imx8mq(struct cdns_mhdp_device *hdp);
int cdns_hdmi_phy_set_imx8qm(struct cdns_mhdp_device *hdp);
+int cdns_hdmi_phy_shutdown(struct cdns_mhdp_device *mhdp);
#endif /* _CDNS_MHDP_PHY_H */
--
2.29.2