drm/exynos: add plane enable/disable
The plane enable/disable can control only a power of plane, so they will be helpful to handle planes with dpms. Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
d55ab76efb
commit
cf5188ac1c
|
@ -71,23 +71,8 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
|
|
||||||
switch (mode) {
|
exynos_drm_fn_encoder(crtc, &mode, exynos_drm_encoder_crtc_dpms);
|
||||||
case DRM_MODE_DPMS_ON:
|
|
||||||
exynos_drm_fn_encoder(crtc, &mode,
|
|
||||||
exynos_drm_encoder_crtc_dpms);
|
|
||||||
exynos_crtc->dpms = mode;
|
exynos_crtc->dpms = mode;
|
||||||
break;
|
|
||||||
case DRM_MODE_DPMS_STANDBY:
|
|
||||||
case DRM_MODE_DPMS_SUSPEND:
|
|
||||||
case DRM_MODE_DPMS_OFF:
|
|
||||||
exynos_drm_fn_encoder(crtc, &mode,
|
|
||||||
exynos_drm_encoder_crtc_dpms);
|
|
||||||
exynos_crtc->dpms = mode;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DRM_ERROR("unspecified mode %d\n", mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
}
|
}
|
||||||
|
@ -106,6 +91,7 @@ static void exynos_drm_crtc_commit(struct drm_crtc *crtc)
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
exynos_plane_commit(exynos_crtc->plane);
|
exynos_plane_commit(exynos_crtc->plane);
|
||||||
|
exynos_plane_dpms(exynos_crtc->plane, DRM_MODE_DPMS_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
|
@ -59,12 +59,14 @@ enum exynos_drm_output_type {
|
||||||
*
|
*
|
||||||
* @mode_set: copy drm overlay info to hw specific overlay info.
|
* @mode_set: copy drm overlay info to hw specific overlay info.
|
||||||
* @commit: apply hardware specific overlay data to registers.
|
* @commit: apply hardware specific overlay data to registers.
|
||||||
|
* @enable: enable hardware specific overlay.
|
||||||
* @disable: disable hardware specific overlay.
|
* @disable: disable hardware specific overlay.
|
||||||
*/
|
*/
|
||||||
struct exynos_drm_overlay_ops {
|
struct exynos_drm_overlay_ops {
|
||||||
void (*mode_set)(struct device *subdrv_dev,
|
void (*mode_set)(struct device *subdrv_dev,
|
||||||
struct exynos_drm_overlay *overlay);
|
struct exynos_drm_overlay *overlay);
|
||||||
void (*commit)(struct device *subdrv_dev, int zpos);
|
void (*commit)(struct device *subdrv_dev, int zpos);
|
||||||
|
void (*enable)(struct device *subdrv_dev, int zpos);
|
||||||
void (*disable)(struct device *subdrv_dev, int zpos);
|
void (*disable)(struct device *subdrv_dev, int zpos);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -392,6 +392,22 @@ void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void *data)
|
||||||
overlay_ops->commit(manager->dev, zpos);
|
overlay_ops->commit(manager->dev, zpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exynos_drm_encoder_plane_enable(struct drm_encoder *encoder, void *data)
|
||||||
|
{
|
||||||
|
struct exynos_drm_manager *manager =
|
||||||
|
to_exynos_encoder(encoder)->manager;
|
||||||
|
struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
|
||||||
|
int zpos = DEFAULT_ZPOS;
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
zpos = *(int *)data;
|
||||||
|
|
||||||
|
if (overlay_ops && overlay_ops->enable)
|
||||||
|
overlay_ops->enable(manager->dev, zpos);
|
||||||
|
}
|
||||||
|
|
||||||
void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data)
|
void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data)
|
||||||
{
|
{
|
||||||
struct exynos_drm_manager *manager =
|
struct exynos_drm_manager *manager =
|
||||||
|
|
|
@ -44,6 +44,7 @@ void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_crtc_pipe(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_crtc_pipe(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_plane_mode_set(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_plane_mode_set(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_plane_commit(struct drm_encoder *encoder, void *data);
|
||||||
|
void exynos_drm_encoder_plane_enable(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -107,8 +107,32 @@ void exynos_plane_commit(struct drm_plane *plane)
|
||||||
|
|
||||||
exynos_drm_fn_encoder(plane->crtc, &overlay->zpos,
|
exynos_drm_fn_encoder(plane->crtc, &overlay->zpos,
|
||||||
exynos_drm_encoder_plane_commit);
|
exynos_drm_encoder_plane_commit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void exynos_plane_dpms(struct drm_plane *plane, int mode)
|
||||||
|
{
|
||||||
|
struct exynos_plane *exynos_plane = to_exynos_plane(plane);
|
||||||
|
struct exynos_drm_overlay *overlay = &exynos_plane->overlay;
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
||||||
|
|
||||||
|
if (mode == DRM_MODE_DPMS_ON) {
|
||||||
|
if (exynos_plane->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
exynos_drm_fn_encoder(plane->crtc, &overlay->zpos,
|
||||||
|
exynos_drm_encoder_plane_enable);
|
||||||
|
|
||||||
exynos_plane->enabled = true;
|
exynos_plane->enabled = true;
|
||||||
|
} else {
|
||||||
|
if (!exynos_plane->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
exynos_drm_fn_encoder(plane->crtc, &overlay->zpos,
|
||||||
|
exynos_drm_encoder_plane_disable);
|
||||||
|
|
||||||
|
exynos_plane->enabled = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -132,24 +156,16 @@ exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
|
||||||
plane->fb = crtc->fb;
|
plane->fb = crtc->fb;
|
||||||
|
|
||||||
exynos_plane_commit(plane);
|
exynos_plane_commit(plane);
|
||||||
|
exynos_plane_dpms(plane, DRM_MODE_DPMS_ON);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int exynos_disable_plane(struct drm_plane *plane)
|
static int exynos_disable_plane(struct drm_plane *plane)
|
||||||
{
|
{
|
||||||
struct exynos_plane *exynos_plane = to_exynos_plane(plane);
|
|
||||||
struct exynos_drm_overlay *overlay = &exynos_plane->overlay;
|
|
||||||
|
|
||||||
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
||||||
|
|
||||||
if (!exynos_plane->enabled)
|
exynos_plane_dpms(plane, DRM_MODE_DPMS_OFF);
|
||||||
return 0;
|
|
||||||
|
|
||||||
exynos_drm_fn_encoder(plane->crtc, &overlay->zpos,
|
|
||||||
exynos_drm_encoder_plane_disable);
|
|
||||||
|
|
||||||
exynos_plane->enabled = false;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,5 +15,6 @@ int exynos_plane_mode_set(struct drm_plane *plane, struct drm_crtc *crtc,
|
||||||
uint32_t src_x, uint32_t src_y,
|
uint32_t src_x, uint32_t src_y,
|
||||||
uint32_t src_w, uint32_t src_h);
|
uint32_t src_w, uint32_t src_h);
|
||||||
void exynos_plane_commit(struct drm_plane *plane);
|
void exynos_plane_commit(struct drm_plane *plane);
|
||||||
|
void exynos_plane_dpms(struct drm_plane *plane, int mode);
|
||||||
struct drm_plane *exynos_plane_init(struct drm_device *dev,
|
struct drm_plane *exynos_plane_init(struct drm_device *dev,
|
||||||
unsigned int possible_crtcs, bool priv);
|
unsigned int possible_crtcs, bool priv);
|
||||||
|
|
Loading…
Reference in New Issue