mirror of https://gitee.com/openkylin/linux.git
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: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
This commit is contained in:
parent
287bdf0303
commit
44ef7ed5ac
|
@ -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);
|
||||
|
||||
if (mode != DRM_MODE_DPMS_ON)
|
||||
mode = DRM_MODE_DPMS_OFF;
|
||||
|
||||
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,
|
||||
|
@ -110,8 +108,7 @@ static void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder)
|
|||
struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
|
||||
|
||||
if (renc->lvds)
|
||||
rcar_du_lvdsenc_dpms(renc->lvds, encoder->crtc,
|
||||
DRM_MODE_DPMS_OFF);
|
||||
rcar_du_lvdsenc_enable(renc->lvds, encoder->crtc, false);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (renc->lvds)
|
||||
rcar_du_lvdsenc_dpms(renc->lvds, encoder->crtc,
|
||||
DRM_MODE_DPMS_ON);
|
||||
rcar_du_lvdsenc_enable(renc->lvds, encoder->crtc, true);
|
||||
}
|
||||
|
||||
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)
|
|||
return;
|
||||
|
||||
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)
|
||||
sfuncs->dpms(encoder, mode);
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ struct rcar_du_lvdsenc {
|
|||
unsigned int index;
|
||||
void __iomem *mmio;
|
||||
struct clk *clock;
|
||||
int dpms;
|
||||
bool enabled;
|
||||
|
||||
enum rcar_lvds_input input;
|
||||
};
|
||||
|
@ -48,7 +48,7 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
|
|||
u32 pllcr;
|
||||
int ret;
|
||||
|
||||
if (lvds->dpms == DRM_MODE_DPMS_ON)
|
||||
if (lvds->enabled)
|
||||
return 0;
|
||||
|
||||
ret = clk_prepare_enable(lvds->clock);
|
||||
|
@ -110,13 +110,13 @@ static int rcar_du_lvdsenc_start(struct rcar_du_lvdsenc *lvds,
|
|||
lvdcr0 |= LVDCR0_LVRES;
|
||||
rcar_lvds_write(lvds, LVDCR0, lvdcr0);
|
||||
|
||||
lvds->dpms = DRM_MODE_DPMS_ON;
|
||||
lvds->enabled = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds)
|
||||
{
|
||||
if (lvds->dpms == DRM_MODE_DPMS_OFF)
|
||||
if (!lvds->enabled)
|
||||
return;
|
||||
|
||||
rcar_lvds_write(lvds, LVDCR0, 0);
|
||||
|
@ -124,13 +124,13 @@ static void rcar_du_lvdsenc_stop(struct rcar_du_lvdsenc *lvds)
|
|||
|
||||
clk_disable_unprepare(lvds->clock);
|
||||
|
||||
lvds->dpms = DRM_MODE_DPMS_OFF;
|
||||
lvds->enabled = false;
|
||||
}
|
||||
|
||||
int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds,
|
||||
struct drm_crtc *crtc, int mode)
|
||||
int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds, struct drm_crtc *crtc,
|
||||
bool enable)
|
||||
{
|
||||
if (mode == DRM_MODE_DPMS_OFF) {
|
||||
if (!enable) {
|
||||
rcar_du_lvdsenc_stop(lvds);
|
||||
return 0;
|
||||
} else if (crtc) {
|
||||
|
@ -179,7 +179,7 @@ int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu)
|
|||
lvds->dev = rcdu;
|
||||
lvds->index = i;
|
||||
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);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -28,15 +28,15 @@ enum rcar_lvds_input {
|
|||
|
||||
#if IS_ENABLED(CONFIG_DRM_RCAR_LVDS)
|
||||
int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu);
|
||||
int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds,
|
||||
struct drm_crtc *crtc, int mode);
|
||||
int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds,
|
||||
struct drm_crtc *crtc, bool enable);
|
||||
#else
|
||||
static inline int rcar_du_lvdsenc_init(struct rcar_du_device *rcdu)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int rcar_du_lvdsenc_dpms(struct rcar_du_lvdsenc *lvds,
|
||||
struct drm_crtc *crtc, int mode)
|
||||
static inline int rcar_du_lvdsenc_enable(struct rcar_du_lvdsenc *lvds,
|
||||
struct drm_crtc *crtc, bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue