diff options
author | Mark Yao <mark.yao@rock-chips.com> | 2015-01-22 01:37:56 -0500 |
---|---|---|
committer | Mark Yao <mark.yao@rock-chips.com> | 2015-03-16 01:50:04 -0400 |
commit | 31e980c5a2d35ce411034b7fd842433542c1c60e (patch) | |
tree | 010ab3ff3a243aa5910fe33bcc04915b3dad15f5 | |
parent | 44ddb7ef38ae720849cf81e71c370e55071b05a7 (diff) |
drm/rockchip: vop use is_enabled instead of dpms mode
drm dpms have many power modes: ON,OFF,SUSPEND,STANDBY, etc.
but vop only have enable/disable mode, maybe case such bug:
--> DRM_DPMS_ON: power on vop
--> DRM_DPMS_SUSPEND: power off vop
--> DRM_DPMS_OFF: already power off at SUSPEND, crash
so use a bool val is more suitable.
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 2b145ba5dc17..c75117a2f133 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
@@ -81,7 +81,7 @@ struct vop { | |||
81 | struct drm_crtc crtc; | 81 | struct drm_crtc crtc; |
82 | struct device *dev; | 82 | struct device *dev; |
83 | struct drm_device *drm_dev; | 83 | struct drm_device *drm_dev; |
84 | unsigned int dpms; | 84 | bool is_enabled; |
85 | 85 | ||
86 | int connector_type; | 86 | int connector_type; |
87 | int connector_out_mode; | 87 | int connector_out_mode; |
@@ -387,6 +387,9 @@ static void vop_enable(struct drm_crtc *crtc) | |||
387 | struct vop *vop = to_vop(crtc); | 387 | struct vop *vop = to_vop(crtc); |
388 | int ret; | 388 | int ret; |
389 | 389 | ||
390 | if (vop->is_enabled) | ||
391 | return; | ||
392 | |||
390 | ret = clk_enable(vop->hclk); | 393 | ret = clk_enable(vop->hclk); |
391 | if (ret < 0) { | 394 | if (ret < 0) { |
392 | dev_err(vop->dev, "failed to enable hclk - %d\n", ret); | 395 | dev_err(vop->dev, "failed to enable hclk - %d\n", ret); |
@@ -427,6 +430,8 @@ static void vop_enable(struct drm_crtc *crtc) | |||
427 | 430 | ||
428 | drm_vblank_on(vop->drm_dev, vop->pipe); | 431 | drm_vblank_on(vop->drm_dev, vop->pipe); |
429 | 432 | ||
433 | vop->is_enabled = true; | ||
434 | |||
430 | return; | 435 | return; |
431 | 436 | ||
432 | err_disable_aclk: | 437 | err_disable_aclk: |
@@ -441,6 +446,9 @@ static void vop_disable(struct drm_crtc *crtc) | |||
441 | { | 446 | { |
442 | struct vop *vop = to_vop(crtc); | 447 | struct vop *vop = to_vop(crtc); |
443 | 448 | ||
449 | if (!vop->is_enabled) | ||
450 | return; | ||
451 | |||
444 | drm_vblank_off(crtc->dev, vop->pipe); | 452 | drm_vblank_off(crtc->dev, vop->pipe); |
445 | 453 | ||
446 | disable_irq(vop->irq); | 454 | disable_irq(vop->irq); |
@@ -463,6 +471,8 @@ static void vop_disable(struct drm_crtc *crtc) | |||
463 | 471 | ||
464 | clk_disable(vop->aclk); | 472 | clk_disable(vop->aclk); |
465 | clk_disable(vop->hclk); | 473 | clk_disable(vop->hclk); |
474 | |||
475 | vop->is_enabled = false; | ||
466 | } | 476 | } |
467 | 477 | ||
468 | /* | 478 | /* |
@@ -742,7 +752,7 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) | |||
742 | struct vop *vop = to_vop(crtc); | 752 | struct vop *vop = to_vop(crtc); |
743 | unsigned long flags; | 753 | unsigned long flags; |
744 | 754 | ||
745 | if (vop->dpms != DRM_MODE_DPMS_ON) | 755 | if (!vop->is_enabled) |
746 | return -EPERM; | 756 | return -EPERM; |
747 | 757 | ||
748 | spin_lock_irqsave(&vop->irq_lock, flags); | 758 | spin_lock_irqsave(&vop->irq_lock, flags); |
@@ -759,8 +769,9 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc) | |||
759 | struct vop *vop = to_vop(crtc); | 769 | struct vop *vop = to_vop(crtc); |
760 | unsigned long flags; | 770 | unsigned long flags; |
761 | 771 | ||
762 | if (vop->dpms != DRM_MODE_DPMS_ON) | 772 | if (!vop->is_enabled) |
763 | return; | 773 | return; |
774 | |||
764 | spin_lock_irqsave(&vop->irq_lock, flags); | 775 | spin_lock_irqsave(&vop->irq_lock, flags); |
765 | vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(0)); | 776 | vop_mask_write(vop, INTR_CTRL0, FS_INTR_MASK, FS_INTR_EN(0)); |
766 | spin_unlock_irqrestore(&vop->irq_lock, flags); | 777 | spin_unlock_irqrestore(&vop->irq_lock, flags); |
@@ -773,15 +784,8 @@ static const struct rockchip_crtc_funcs private_crtc_funcs = { | |||
773 | 784 | ||
774 | static void vop_crtc_dpms(struct drm_crtc *crtc, int mode) | 785 | static void vop_crtc_dpms(struct drm_crtc *crtc, int mode) |
775 | { | 786 | { |
776 | struct vop *vop = to_vop(crtc); | ||
777 | |||
778 | DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); | 787 | DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); |
779 | 788 | ||
780 | if (vop->dpms == mode) { | ||
781 | DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n"); | ||
782 | return; | ||
783 | } | ||
784 | |||
785 | switch (mode) { | 789 | switch (mode) { |
786 | case DRM_MODE_DPMS_ON: | 790 | case DRM_MODE_DPMS_ON: |
787 | vop_enable(crtc); | 791 | vop_enable(crtc); |
@@ -795,8 +799,6 @@ static void vop_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
795 | DRM_DEBUG_KMS("unspecified mode %d\n", mode); | 799 | DRM_DEBUG_KMS("unspecified mode %d\n", mode); |
796 | break; | 800 | break; |
797 | } | 801 | } |
798 | |||
799 | vop->dpms = mode; | ||
800 | } | 802 | } |
801 | 803 | ||
802 | static void vop_crtc_prepare(struct drm_crtc *crtc) | 804 | static void vop_crtc_prepare(struct drm_crtc *crtc) |
@@ -934,9 +936,9 @@ static int vop_crtc_page_flip(struct drm_crtc *crtc, | |||
934 | struct drm_framebuffer *old_fb = crtc->primary->fb; | 936 | struct drm_framebuffer *old_fb = crtc->primary->fb; |
935 | int ret; | 937 | int ret; |
936 | 938 | ||
937 | /* when the page flip is requested, crtc's dpms should be on */ | 939 | /* when the page flip is requested, crtc should be on */ |
938 | if (vop->dpms > DRM_MODE_DPMS_ON) { | 940 | if (!vop->is_enabled) { |
939 | DRM_DEBUG("failed page flip request at dpms[%d].\n", vop->dpms); | 941 | DRM_DEBUG("page flip request rejected because crtc is off.\n"); |
940 | return 0; | 942 | return 0; |
941 | } | 943 | } |
942 | 944 | ||
@@ -1302,7 +1304,7 @@ static int vop_initial(struct vop *vop) | |||
1302 | 1304 | ||
1303 | clk_disable(vop->hclk); | 1305 | clk_disable(vop->hclk); |
1304 | 1306 | ||
1305 | vop->dpms = DRM_MODE_DPMS_OFF; | 1307 | vop->is_enabled = false; |
1306 | 1308 | ||
1307 | return 0; | 1309 | return 0; |
1308 | 1310 | ||