Commit 5970af8b authored by Zhihui Chen's avatar Zhihui Chen Committed by Xinliang Liu

drm/hisilicon/hibmc: add DPMS on/off function

add DPMS function to turn on/off signal of monitor
Signed-off-by: default avatarZhihui Chen <chenzhihui4@huawei.com>
Signed-off-by: default avatarXinliang Liu <xinliang.liu@linaro.org>
Acked-by: default avatarXinliang Liu <xinliang.liu@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191220023112.2728-1-chenzhihui4@huawei.com
parent f2f8653e
...@@ -187,6 +187,20 @@ static struct drm_plane *hibmc_plane_init(struct hibmc_drm_private *priv) ...@@ -187,6 +187,20 @@ static struct drm_plane *hibmc_plane_init(struct hibmc_drm_private *priv)
return plane; return plane;
} }
static void hibmc_crtc_dpms(struct drm_crtc *crtc, int dpms)
{
struct hibmc_drm_private *priv = crtc->dev->dev_private;
unsigned int reg;
reg = readl(priv->mmio + HIBMC_CRT_DISP_CTL);
reg &= ~HIBMC_CRT_DISP_CTL_DPMS_MASK;
reg |= HIBMC_FIELD(HIBMC_CRT_DISP_CTL_DPMS, dpms);
reg &= ~HIBMC_CRT_DISP_CTL_TIMING_MASK;
if (dpms == HIBMC_CRT_DPMS_ON)
reg |= HIBMC_CRT_DISP_CTL_TIMING(1);
writel(reg, priv->mmio + HIBMC_CRT_DISP_CTL);
}
static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc, static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc,
struct drm_crtc_state *old_state) struct drm_crtc_state *old_state)
{ {
...@@ -203,6 +217,7 @@ static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -203,6 +217,7 @@ static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc,
reg |= HIBMC_CURR_GATE_DISPLAY(1); reg |= HIBMC_CURR_GATE_DISPLAY(1);
hibmc_set_current_gate(priv, reg); hibmc_set_current_gate(priv, reg);
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
hibmc_crtc_dpms(crtc, HIBMC_CRT_DPMS_ON);
} }
static void hibmc_crtc_atomic_disable(struct drm_crtc *crtc, static void hibmc_crtc_atomic_disable(struct drm_crtc *crtc,
...@@ -211,6 +226,7 @@ static void hibmc_crtc_atomic_disable(struct drm_crtc *crtc, ...@@ -211,6 +226,7 @@ static void hibmc_crtc_atomic_disable(struct drm_crtc *crtc,
unsigned int reg; unsigned int reg;
struct hibmc_drm_private *priv = crtc->dev->dev_private; struct hibmc_drm_private *priv = crtc->dev->dev_private;
hibmc_crtc_dpms(crtc, HIBMC_CRT_DPMS_OFF);
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
hibmc_set_power_mode(priv, HIBMC_PW_MODE_CTL_MODE_SLEEP); hibmc_set_power_mode(priv, HIBMC_PW_MODE_CTL_MODE_SLEEP);
......
...@@ -68,6 +68,12 @@ ...@@ -68,6 +68,12 @@
#define HIBMC_CRT_DISP_CTL 0x80200 #define HIBMC_CRT_DISP_CTL 0x80200
#define HIBMC_CRT_DISP_CTL_DPMS(x) ((x) << 30)
#define HIBMC_CRT_DISP_CTL_DPMS_MASK 0xc0000000
#define HIBMC_CRT_DPMS_ON 0
#define HIBMC_CRT_DPMS_OFF 3
#define HIBMC_CRT_DISP_CTL_CRTSELECT(x) ((x) << 25) #define HIBMC_CRT_DISP_CTL_CRTSELECT(x) ((x) << 25)
#define HIBMC_CRT_DISP_CTL_CRTSELECT_MASK 0x2000000 #define HIBMC_CRT_DISP_CTL_CRTSELECT_MASK 0x2000000
......
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