Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/exynos: split exynos_crtc->dpms in enable() and disable()

To follow more closely the new atomic API we split the dpms()
helper into the enable() and disable() helper to get exactly the
same semantics.

Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: Inki Dae <inki.dae@samsung.com>

authored by

Gustavo Padovan and committed by
Inki Dae
3cecda03 c4d96f16

+62 -187
+16 -71
drivers/gpu/drm/exynos/exynos7_drm_decon.c
··· 603 603 writel(VIDCON1_VCLK_HOLD, ctx->regs + VIDCON1(0)); 604 604 } 605 605 606 - static int decon_poweron(struct decon_context *ctx) 606 + static void decon_enable(struct exynos_drm_crtc *crtc) 607 607 { 608 - int ret; 608 + struct decon_context *ctx = crtc->ctx; 609 609 610 610 if (!ctx->suspended) 611 - return 0; 611 + return; 612 612 613 613 ctx->suspended = false; 614 614 615 615 pm_runtime_get_sync(ctx->dev); 616 616 617 - ret = clk_prepare_enable(ctx->pclk); 618 - if (ret < 0) { 619 - DRM_ERROR("Failed to prepare_enable the pclk [%d]\n", ret); 620 - goto pclk_err; 621 - } 622 - 623 - ret = clk_prepare_enable(ctx->aclk); 624 - if (ret < 0) { 625 - DRM_ERROR("Failed to prepare_enable the aclk [%d]\n", ret); 626 - goto aclk_err; 627 - } 628 - 629 - ret = clk_prepare_enable(ctx->eclk); 630 - if (ret < 0) { 631 - DRM_ERROR("Failed to prepare_enable the eclk [%d]\n", ret); 632 - goto eclk_err; 633 - } 634 - 635 - ret = clk_prepare_enable(ctx->vclk); 636 - if (ret < 0) { 637 - DRM_ERROR("Failed to prepare_enable the vclk [%d]\n", ret); 638 - goto vclk_err; 639 - } 617 + clk_prepare_enable(ctx->pclk); 618 + clk_prepare_enable(ctx->aclk); 619 + clk_prepare_enable(ctx->eclk); 620 + clk_prepare_enable(ctx->vclk); 640 621 641 622 decon_init(ctx); 642 623 643 624 /* if vblank was enabled status, enable it again. */ 644 - if (test_and_clear_bit(0, &ctx->irq_flags)) { 645 - ret = decon_enable_vblank(ctx->crtc); 646 - if (ret) { 647 - DRM_ERROR("Failed to re-enable vblank [%d]\n", ret); 648 - goto err; 649 - } 650 - } 625 + if (test_and_clear_bit(0, &ctx->irq_flags)) 626 + decon_enable_vblank(ctx->crtc); 651 627 652 628 decon_window_resume(ctx); 653 629 654 630 decon_apply(ctx); 655 - 656 - return 0; 657 - 658 - err: 659 - clk_disable_unprepare(ctx->vclk); 660 - vclk_err: 661 - clk_disable_unprepare(ctx->eclk); 662 - eclk_err: 663 - clk_disable_unprepare(ctx->aclk); 664 - aclk_err: 665 - clk_disable_unprepare(ctx->pclk); 666 - pclk_err: 667 - ctx->suspended = true; 668 - return ret; 669 631 } 670 632 671 - static int decon_poweroff(struct decon_context *ctx) 633 + static void decon_disable(struct exynos_drm_crtc *crtc) 672 634 { 635 + struct decon_context *ctx = crtc->ctx; 636 + 673 637 if (ctx->suspended) 674 - return 0; 638 + return; 675 639 676 640 /* 677 641 * We need to make sure that all windows are disabled before we ··· 652 688 pm_runtime_put_sync(ctx->dev); 653 689 654 690 ctx->suspended = true; 655 - return 0; 656 - } 657 - 658 - static void decon_dpms(struct exynos_drm_crtc *crtc, int mode) 659 - { 660 - DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode); 661 - 662 - switch (mode) { 663 - case DRM_MODE_DPMS_ON: 664 - decon_poweron(crtc->ctx); 665 - break; 666 - case DRM_MODE_DPMS_STANDBY: 667 - case DRM_MODE_DPMS_SUSPEND: 668 - case DRM_MODE_DPMS_OFF: 669 - decon_poweroff(crtc->ctx); 670 - break; 671 - default: 672 - DRM_DEBUG_KMS("unspecified mode %d\n", mode); 673 - break; 674 - } 675 691 } 676 692 677 693 static const struct exynos_drm_crtc_ops decon_crtc_ops = { 678 - .dpms = decon_dpms, 694 + .enable = decon_enable, 695 + .disable = decon_disable, 679 696 .mode_fixup = decon_mode_fixup, 680 697 .commit = decon_commit, 681 698 .enable_vblank = decon_enable_vblank, ··· 741 796 { 742 797 struct decon_context *ctx = dev_get_drvdata(dev); 743 798 744 - decon_dpms(ctx->crtc, DRM_MODE_DPMS_OFF); 799 + decon_disable(ctx->crtc); 745 800 746 801 if (ctx->display) 747 802 exynos_dpi_remove(ctx->display);
+4 -4
drivers/gpu/drm/exynos/exynos_drm_crtc.c
··· 29 29 if (exynos_crtc->enabled) 30 30 return; 31 31 32 - if (exynos_crtc->ops->dpms) 33 - exynos_crtc->ops->dpms(exynos_crtc, DRM_MODE_DPMS_ON); 32 + if (exynos_crtc->ops->enable) 33 + exynos_crtc->ops->enable(exynos_crtc); 34 34 35 35 exynos_crtc->enabled = true; 36 36 ··· 51 51 52 52 drm_crtc_vblank_off(crtc); 53 53 54 - if (exynos_crtc->ops->dpms) 55 - exynos_crtc->ops->dpms(exynos_crtc, DRM_MODE_DPMS_OFF); 54 + if (exynos_crtc->ops->disable) 55 + exynos_crtc->ops->disable(exynos_crtc); 56 56 57 57 exynos_crtc->enabled = false; 58 58 }
+4 -2
drivers/gpu/drm/exynos/exynos_drm_drv.h
··· 157 157 /* 158 158 * Exynos drm crtc ops 159 159 * 160 - * @dpms: control device power. 160 + * @enable: enable the device 161 + * @disable: disable the device 161 162 * @mode_fixup: fix mode data before applying it 162 163 * @commit: set current hw specific display mode to hw. 163 164 * @enable_vblank: specific driver callback for enabling vblank interrupt. ··· 176 175 */ 177 176 struct exynos_drm_crtc; 178 177 struct exynos_drm_crtc_ops { 179 - void (*dpms)(struct exynos_drm_crtc *crtc, int mode); 178 + void (*enable)(struct exynos_drm_crtc *crtc); 179 + void (*disable)(struct exynos_drm_crtc *crtc); 180 180 bool (*mode_fixup)(struct exynos_drm_crtc *crtc, 181 181 const struct drm_display_mode *mode, 182 182 struct drm_display_mode *adjusted_mode);
+14 -55
drivers/gpu/drm/exynos/exynos_drm_fimd.c
··· 805 805 fimd_commit(ctx->crtc); 806 806 } 807 807 808 - static int fimd_poweron(struct fimd_context *ctx) 808 + static void fimd_enable(struct exynos_drm_crtc *crtc) 809 809 { 810 - int ret; 810 + struct fimd_context *ctx = crtc->ctx; 811 811 812 812 if (!ctx->suspended) 813 - return 0; 813 + return; 814 814 815 815 ctx->suspended = false; 816 816 817 817 pm_runtime_get_sync(ctx->dev); 818 818 819 - ret = clk_prepare_enable(ctx->bus_clk); 820 - if (ret < 0) { 821 - DRM_ERROR("Failed to prepare_enable the bus clk [%d]\n", ret); 822 - goto bus_clk_err; 823 - } 824 - 825 - ret = clk_prepare_enable(ctx->lcd_clk); 826 - if (ret < 0) { 827 - DRM_ERROR("Failed to prepare_enable the lcd clk [%d]\n", ret); 828 - goto lcd_clk_err; 829 - } 819 + clk_prepare_enable(ctx->bus_clk); 820 + clk_prepare_enable(ctx->lcd_clk); 830 821 831 822 /* if vblank was enabled status, enable it again. */ 832 - if (test_and_clear_bit(0, &ctx->irq_flags)) { 833 - ret = fimd_enable_vblank(ctx->crtc); 834 - if (ret) { 835 - DRM_ERROR("Failed to re-enable vblank [%d]\n", ret); 836 - goto enable_vblank_err; 837 - } 838 - } 823 + if (test_and_clear_bit(0, &ctx->irq_flags)) 824 + fimd_enable_vblank(ctx->crtc); 839 825 840 826 fimd_window_resume(ctx); 841 827 842 828 fimd_apply(ctx); 843 - 844 - return 0; 845 - 846 - enable_vblank_err: 847 - clk_disable_unprepare(ctx->lcd_clk); 848 - lcd_clk_err: 849 - clk_disable_unprepare(ctx->bus_clk); 850 - bus_clk_err: 851 - ctx->suspended = true; 852 - return ret; 853 829 } 854 830 855 - static int fimd_poweroff(struct fimd_context *ctx) 831 + static void fimd_disable(struct exynos_drm_crtc *crtc) 856 832 { 833 + struct fimd_context *ctx = crtc->ctx; 834 + 857 835 if (ctx->suspended) 858 - return 0; 836 + return; 859 837 860 838 /* 861 839 * We need to make sure that all windows are disabled before we ··· 848 870 pm_runtime_put_sync(ctx->dev); 849 871 850 872 ctx->suspended = true; 851 - return 0; 852 - } 853 - 854 - static void fimd_dpms(struct exynos_drm_crtc *crtc, int mode) 855 - { 856 - DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode); 857 - 858 - switch (mode) { 859 - case DRM_MODE_DPMS_ON: 860 - fimd_poweron(crtc->ctx); 861 - break; 862 - case DRM_MODE_DPMS_STANDBY: 863 - case DRM_MODE_DPMS_SUSPEND: 864 - case DRM_MODE_DPMS_OFF: 865 - fimd_poweroff(crtc->ctx); 866 - break; 867 - default: 868 - DRM_DEBUG_KMS("unspecified mode %d\n", mode); 869 - break; 870 - } 871 873 } 872 874 873 875 static void fimd_trigger(struct device *dev) ··· 922 964 } 923 965 924 966 static const struct exynos_drm_crtc_ops fimd_crtc_ops = { 925 - .dpms = fimd_dpms, 967 + .enable = fimd_enable, 968 + .disable = fimd_disable, 926 969 .mode_fixup = fimd_mode_fixup, 927 970 .commit = fimd_commit, 928 971 .enable_vblank = fimd_enable_vblank, ··· 1010 1051 { 1011 1052 struct fimd_context *ctx = dev_get_drvdata(dev); 1012 1053 1013 - fimd_dpms(ctx->crtc, DRM_MODE_DPMS_OFF); 1054 + fimd_disable(ctx->crtc); 1014 1055 1015 1056 fimd_iommu_detach_devices(ctx); 1016 1057
+18 -35
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 153 153 /* TODO. */ 154 154 } 155 155 156 - static int vidi_power_on(struct vidi_context *ctx, bool enable) 156 + static void vidi_enable(struct exynos_drm_crtc *crtc) 157 157 { 158 + struct vidi_context *ctx = crtc->ctx; 158 159 struct exynos_drm_plane *plane; 159 160 int i; 160 161 161 - DRM_DEBUG_KMS("%s\n", __FILE__); 162 + mutex_lock(&ctx->lock); 162 163 163 - if (enable != false && enable != true) 164 - return -EINVAL; 164 + ctx->suspended = false; 165 165 166 - if (enable) { 167 - ctx->suspended = false; 166 + /* if vblank was enabled status, enable it again. */ 167 + if (test_and_clear_bit(0, &ctx->irq_flags)) 168 + vidi_enable_vblank(ctx->crtc); 168 169 169 - /* if vblank was enabled status, enable it again. */ 170 - if (test_and_clear_bit(0, &ctx->irq_flags)) 171 - vidi_enable_vblank(ctx->crtc); 172 - 173 - for (i = 0; i < WINDOWS_NR; i++) { 174 - plane = &ctx->planes[i]; 175 - if (plane->enabled) 176 - vidi_win_commit(ctx->crtc, i); 177 - } 178 - } else { 179 - ctx->suspended = true; 170 + for (i = 0; i < WINDOWS_NR; i++) { 171 + plane = &ctx->planes[i]; 172 + if (plane->enabled) 173 + vidi_win_commit(ctx->crtc, i); 180 174 } 181 175 182 - return 0; 176 + mutex_unlock(&ctx->lock); 183 177 } 184 178 185 - static void vidi_dpms(struct exynos_drm_crtc *crtc, int mode) 179 + static void vidi_disable(struct exynos_drm_crtc *crtc) 186 180 { 187 181 struct vidi_context *ctx = crtc->ctx; 188 - 189 - DRM_DEBUG_KMS("%d\n", mode); 182 + struct exynos_drm_plane *plane; 183 + int i; 190 184 191 185 mutex_lock(&ctx->lock); 192 186 193 - switch (mode) { 194 - case DRM_MODE_DPMS_ON: 195 - vidi_power_on(ctx, true); 196 - break; 197 - case DRM_MODE_DPMS_STANDBY: 198 - case DRM_MODE_DPMS_SUSPEND: 199 - case DRM_MODE_DPMS_OFF: 200 - vidi_power_on(ctx, false); 201 - break; 202 - default: 203 - DRM_DEBUG_KMS("unspecified mode %d\n", mode); 204 - break; 205 - } 187 + ctx->suspended = true; 206 188 207 189 mutex_unlock(&ctx->lock); 208 190 } ··· 201 219 } 202 220 203 221 static const struct exynos_drm_crtc_ops vidi_crtc_ops = { 204 - .dpms = vidi_dpms, 222 + .enable = vidi_enable, 223 + .disable = vidi_disable, 205 224 .enable_vblank = vidi_enable_vblank, 206 225 .disable_vblank = vidi_disable_vblank, 207 226 .win_commit = vidi_win_commit,
+6 -20
drivers/gpu/drm/exynos/exynos_mixer.c
··· 1027 1027 } 1028 1028 } 1029 1029 1030 - static void mixer_poweron(struct mixer_context *ctx) 1030 + static void mixer_enable(struct exynos_drm_crtc *crtc) 1031 1031 { 1032 + struct mixer_context *ctx = crtc->ctx; 1032 1033 struct mixer_resources *res = &ctx->mixer_res; 1033 1034 1034 1035 mutex_lock(&ctx->mixer_mutex); ··· 1062 1061 mixer_window_resume(ctx); 1063 1062 } 1064 1063 1065 - static void mixer_poweroff(struct mixer_context *ctx) 1064 + static void mixer_disable(struct exynos_drm_crtc *crtc) 1066 1065 { 1066 + struct mixer_context *ctx = crtc->ctx; 1067 1067 struct mixer_resources *res = &ctx->mixer_res; 1068 1068 1069 1069 mutex_lock(&ctx->mixer_mutex); ··· 1095 1093 pm_runtime_put_sync(ctx->dev); 1096 1094 } 1097 1095 1098 - static void mixer_dpms(struct exynos_drm_crtc *crtc, int mode) 1099 - { 1100 - switch (mode) { 1101 - case DRM_MODE_DPMS_ON: 1102 - mixer_poweron(crtc->ctx); 1103 - break; 1104 - case DRM_MODE_DPMS_STANDBY: 1105 - case DRM_MODE_DPMS_SUSPEND: 1106 - case DRM_MODE_DPMS_OFF: 1107 - mixer_poweroff(crtc->ctx); 1108 - break; 1109 - default: 1110 - DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode); 1111 - break; 1112 - } 1113 - } 1114 - 1115 1096 /* Only valid for Mixer version 16.0.33.0 */ 1116 1097 int mixer_check_mode(struct drm_display_mode *mode) 1117 1098 { ··· 1116 1131 } 1117 1132 1118 1133 static const struct exynos_drm_crtc_ops mixer_crtc_ops = { 1119 - .dpms = mixer_dpms, 1134 + .enable = mixer_enable, 1135 + .disable = mixer_disable, 1120 1136 .enable_vblank = mixer_enable_vblank, 1121 1137 .disable_vblank = mixer_disable_vblank, 1122 1138 .wait_for_vblank = mixer_wait_for_vblank,