Commit 44ef7ed5 authored by Laurent Pinchart's avatar Laurent Pinchart

drm: rcar-du: Replace LVDS encoder DPMS by enable/disable

The LVDS encoder doesn't support DPMS states, replace the DPMS operation
by enable/disable to avoid propagating DPMS states down to the encoder
code.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
parent 287bdf03
...@@ -46,11 +46,9 @@ static void rcar_du_encoder_dpms(struct drm_encoder *encoder, int mode) ...@@ -46,11 +46,9 @@ static void rcar_du_encoder_dpms(struct drm_encoder *encoder, int mode)
{ {
struct rcar_du_encoder *renc = to_rcar_encoder(encoder); struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
if (mode != DRM_MODE_DPMS_ON)
mode = DRM_MODE_DPMS_OFF;
if (renc->lvds) if (renc->lvds)
rcar_du_lvdsenc_dpms(renc->lvds, encoder->crtc, mode); rcar_du_lvdsenc_enable(renc->lvds, encoder->crtc,
mode == DRM_MODE_DPMS_ON);
} }
static bool rcar_du_encoder_mode_fixup(struct drm_encoder *encoder, static bool rcar_du_encoder_mode_fixup(struct drm_encoder *encoder,
...@@ -110,8 +108,7 @@ static void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder) ...@@ -110,8 +108,7 @@ static void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder)
struct rcar_du_encoder *renc = to_rcar_encoder(encoder); struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
if (renc->lvds) if (renc->lvds)
rcar_du_lvdsenc_dpms(renc->lvds, encoder->crtc, rcar_du_lvdsenc_enable(renc->lvds, encoder->crtc, false);
DRM_MODE_DPMS_OFF);
} }
static void rcar_du_encoder_mode_commit(struct drm_encoder *encoder) static void rcar_du_encoder_mode_commit(struct drm_encoder *encoder)
...@@ -119,8 +116,7 @@ static void rcar_du_encoder_mode_commit(struct drm_encoder *encoder) ...@@ -119,8 +116,7 @@ static void rcar_du_encoder_mode_commit(struct drm_encoder *encoder)
struct rcar_du_encoder *renc = to_rcar_encoder(encoder); struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
if (renc->lvds) if (renc->lvds)
rcar_du_lvdsenc_dpms(renc->lvds, encoder->crtc, rcar_du_lvdsenc_enable(renc->lvds, encoder->crtc, true);
DRM_MODE_DPMS_ON);
} }
static void rcar_du_encoder_mode_set(struct drm_encoder *encoder, static void rcar_du_encoder_mode_set(struct drm_encoder *encoder,
......
...@@ -44,13 +44,15 @@ static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode) ...@@ -44,13 +44,15 @@ static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode)
return; return;
if (mode == DRM_MODE_DPMS_ON && hdmienc->renc->lvds) if (mode == DRM_MODE_DPMS_ON && hdmienc->renc->lvds)
rcar_du_lvdsenc_dpms(hdmienc->renc->lvds, encoder->crtc, mode); rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
true);
if (sfuncs->dpms) if (sfuncs->dpms)
sfuncs->dpms(encoder, mode); sfuncs->dpms(encoder, mode);
if (mode != DRM_MODE_DPMS_ON && hdmienc->renc->lvds) if (mode != DRM_MODE_DPMS_ON && hdmienc->renc->lvds)
rcar_du_lvdsenc_dpms(hdmienc->renc->lvds, encoder->crtc, mode); rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
false);
hdmienc->dpms = mode; hdmienc->dpms = mode;
} }
......
...@@ -28,7 +28,7 @@ struct rcar_du_lvdsenc { ...@@ -28,7 +28,7 @@ struct rcar_du_lvdsenc {
unsigned int index; unsigned int index;
void __iomem *mmio; void __iomem *mmio;
struct clk *clock; struct clk *clock;
int dpms; bool enabled;
enum rcar_lvds_input input; enum rcar_lvds_input input;
}; };
...@@ -48,7 +48,7 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds, ...@@ -48,7 +48,7 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
u32 pllcr; u32 pllcr;
int ret; int ret;
if (lvds->dpms == DRM_MODE_DPMS_ON) if (lvds->enabled)
return 0; return 0;
ret = clk_prepare_enable(lvds->clock); ret = clk_prepare_enable(lvds->clock);
...@@ -110,13 +110,13 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds, ...@@ -110,13 +110,13 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
lvdcr0 |= LVDCR0_LVRES; lvdcr0 |= LVDCR0_LVRES;
rcar_lvds_write(lvds, LVDCR0, lvdcr0); rcar_lvds_write(lvds, LVDCR0, lvdcr0);
lvds->dpms = DRM_MODE_DPMS_ON; lvds->enabled = true;
return 0; return 0;
} }
static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds) static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds)
{ {
if (lvds->dpms == DRM_MODE_DPMS_OFF) if (!lvds->enabled)
return; return;
rcar_lvds_write(lvds, LVDCR0, 0); rcar_lvds_write(lvds, LVDCR0, 0);
...@@ -124,13 +124,13 @@ static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds) ...@@ -124,13 +124,13 @@ static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds)
clk_disable_unprepare(lvds->clock); clk_disable_unprepare(lvds->clock);
lvds->dpms = DRM_MODE_DPMS_OFF; lvds->enabled = false;
} }
int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds, int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds, struct drm_crtc *crtc,
struct drm_crtc *crtc, int mode) bool enable)
{ {
if (mode == DRM_MODE_DPMS_OFF) { if (!enable) {
rcar_du_lvdsenc_stop(lvds); rcar_du_lvdsenc_stop(lvds);
return 0; return 0;
} else if (crtc) { } else if (crtc) {
...@@ -179,7 +179,7 @@ int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu) ...@@ -179,7 +179,7 @@ int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu)
lvds->dev = rcdu; lvds->dev = rcdu;
lvds->index = i; lvds->index = i;
lvds->input = i ? RCAR_LVDS_INPUT_DU1 : RCAR_LVDS_INPUT_DU0; lvds->input = i ? RCAR_LVDS_INPUT_DU1 : RCAR_LVDS_INPUT_DU0;
lvds->dpms = DRM_MODE_DPMS_OFF; lvds->enabled = false;
ret = rcar_du_lvdsenc_get_resources(lvds, pdev); ret = rcar_du_lvdsenc_get_resources(lvds, pdev);
if (ret < 0) if (ret < 0)
......
...@@ -28,15 +28,15 @@ enum rcar_lvds_input { ...@@ -28,15 +28,15 @@ enum rcar_lvds_input {
#if IS_ENABLED(CONFIG_DRM_RCAR_LVDS) #if IS_ENABLED(CONFIG_DRM_RCAR_LVDS)
int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu); int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu);
int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds, int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds,
struct drm_crtc *crtc, int mode); struct drm_crtc *crtc, bool enable);
#else #else
static inline int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu) static inline int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu)
{ {
return 0; return 0;
} }
static inline int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds, static inline int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds,
struct drm_crtc *crtc, int mode) struct drm_crtc *crtc, bool enable)
{ {
return 0; return 0;
} }
......
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