Commit 875a4d53 authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: drv: Disable the CRTC at boot time

In order to prevent issues during the firmware to KMS transition, we need
to make sure the pixelvalve are disabled at boot time so that the DRM state
matches the hardware state.
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Tested-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Tested-by: default avatarHoegeun Kwon <hoegeun.kwon@samsung.com>
Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: default avatarEric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/ad57f1bdeae7a99631713b0fc193c86f223de042.1599120059.git-series.maxime@cerno.tech
parent 2d14ffe2
...@@ -427,6 +427,31 @@ static int vc4_crtc_disable(struct drm_crtc *crtc, unsigned int channel) ...@@ -427,6 +427,31 @@ static int vc4_crtc_disable(struct drm_crtc *crtc, unsigned int channel)
return 0; return 0;
} }
int vc4_crtc_disable_at_boot(struct drm_crtc *crtc)
{
struct drm_device *drm = crtc->dev;
struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
int channel;
if (!(of_device_is_compatible(vc4_crtc->pdev->dev.of_node,
"brcm,bcm2711-pixelvalve2") ||
of_device_is_compatible(vc4_crtc->pdev->dev.of_node,
"brcm,bcm2711-pixelvalve4")))
return 0;
if (!(CRTC_READ(PV_CONTROL) & PV_CONTROL_EN))
return 0;
if (!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN))
return 0;
channel = vc4_hvs_get_fifo_from_output(drm, vc4_crtc->data->hvs_output);
if (channel < 0)
return 0;
return vc4_crtc_disable(crtc, channel);
}
static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
struct drm_crtc_state *old_state) struct drm_crtc_state *old_state)
{ {
......
...@@ -252,6 +252,7 @@ static int vc4_drm_bind(struct device *dev) ...@@ -252,6 +252,7 @@ static int vc4_drm_bind(struct device *dev)
struct drm_device *drm; struct drm_device *drm;
struct vc4_dev *vc4; struct vc4_dev *vc4;
struct device_node *node; struct device_node *node;
struct drm_crtc *crtc;
int ret = 0; int ret = 0;
dev->coherent_dma_mask = DMA_BIT_MASK(32); dev->coherent_dma_mask = DMA_BIT_MASK(32);
...@@ -298,6 +299,9 @@ static int vc4_drm_bind(struct device *dev) ...@@ -298,6 +299,9 @@ static int vc4_drm_bind(struct device *dev)
if (ret < 0) if (ret < 0)
goto unbind_all; goto unbind_all;
drm_for_each_crtc(crtc, drm)
vc4_crtc_disable_at_boot(crtc);
ret = drm_dev_register(drm, 0); ret = drm_dev_register(drm, 0);
if (ret < 0) if (ret < 0)
goto unbind_all; goto unbind_all;
......
...@@ -813,6 +813,7 @@ void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo); ...@@ -813,6 +813,7 @@ void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo);
/* vc4_crtc.c */ /* vc4_crtc.c */
extern struct platform_driver vc4_crtc_driver; extern struct platform_driver vc4_crtc_driver;
int vc4_crtc_disable_at_boot(struct drm_crtc *crtc);
int vc4_crtc_init(struct drm_device *drm, struct vc4_crtc *vc4_crtc, int vc4_crtc_init(struct drm_device *drm, struct vc4_crtc *vc4_crtc,
const struct drm_crtc_funcs *crtc_funcs, const struct drm_crtc_funcs *crtc_funcs,
const struct drm_crtc_helper_funcs *crtc_helper_funcs); const struct drm_crtc_helper_funcs *crtc_helper_funcs);
......
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