diff options
author | Dave Airlie <airlied@redhat.com> | 2015-04-07 21:10:56 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-04-07 21:10:56 -0400 |
commit | 4d0982c6eab072d17201c83d5c7af495fb1dec33 (patch) | |
tree | 3c12d30f49c9ebd33c3eac44a1efc358bdb26581 | |
parent | 502e95c6678505474f1056480310cd9382bacbac (diff) | |
parent | 5d82d1a785155fe4ff65628a88b677cfacea863b (diff) |
Merge branch 'drm-next0401' of git://github.com/markyzq/kernel-drm-rockchip into drm-next
These are based on drm-next branch, fix some drm/rockchip problem.
Please pull them.
* 'drm-next0401' of git://github.com/markyzq/kernel-drm-rockchip:
drm/rockchip: vop: add vop power domain support
drm: rockchip: Turn off VT switching on suspend
drm/rockchip: register all connectors after bind
drm/rockchip: fix clk enable disable mismatch in vop_crtc_mode_set
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 25 |
3 files changed, 39 insertions, 8 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 21a481b224eb..30da7813d53e 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | |||
@@ -129,6 +129,7 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags) | |||
129 | struct rockchip_drm_private *private; | 129 | struct rockchip_drm_private *private; |
130 | struct dma_iommu_mapping *mapping; | 130 | struct dma_iommu_mapping *mapping; |
131 | struct device *dev = drm_dev->dev; | 131 | struct device *dev = drm_dev->dev; |
132 | struct drm_connector *connector; | ||
132 | int ret; | 133 | int ret; |
133 | 134 | ||
134 | private = devm_kzalloc(drm_dev->dev, sizeof(*private), GFP_KERNEL); | 135 | private = devm_kzalloc(drm_dev->dev, sizeof(*private), GFP_KERNEL); |
@@ -171,6 +172,23 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags) | |||
171 | if (ret) | 172 | if (ret) |
172 | goto err_detach_device; | 173 | goto err_detach_device; |
173 | 174 | ||
175 | /* | ||
176 | * All components are now added, we can publish the connector sysfs | ||
177 | * entries to userspace. This will generate hotplug events and so | ||
178 | * userspace will expect to be able to access DRM at this point. | ||
179 | */ | ||
180 | list_for_each_entry(connector, &drm_dev->mode_config.connector_list, | ||
181 | head) { | ||
182 | ret = drm_connector_register(connector); | ||
183 | if (ret) { | ||
184 | dev_err(drm_dev->dev, | ||
185 | "[CONNECTOR:%d:%s] drm_connector_register failed: %d\n", | ||
186 | connector->base.id, | ||
187 | connector->name, ret); | ||
188 | goto err_unbind; | ||
189 | } | ||
190 | } | ||
191 | |||
174 | /* init kms poll for handling hpd */ | 192 | /* init kms poll for handling hpd */ |
175 | drm_kms_helper_poll_init(drm_dev); | 193 | drm_kms_helper_poll_init(drm_dev); |
176 | 194 | ||
@@ -200,6 +218,7 @@ err_vblank_cleanup: | |||
200 | drm_vblank_cleanup(drm_dev); | 218 | drm_vblank_cleanup(drm_dev); |
201 | err_kms_helper_poll_fini: | 219 | err_kms_helper_poll_fini: |
202 | drm_kms_helper_poll_fini(drm_dev); | 220 | drm_kms_helper_poll_fini(drm_dev); |
221 | err_unbind: | ||
203 | component_unbind_all(dev, drm_dev); | 222 | component_unbind_all(dev, drm_dev); |
204 | err_detach_device: | 223 | err_detach_device: |
205 | arm_iommu_detach_device(dev); | 224 | arm_iommu_detach_device(dev); |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c index d5c1248916b2..5b0dc0f6fd94 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c | |||
@@ -119,6 +119,9 @@ static int rockchip_drm_fbdev_create(struct drm_fb_helper *helper, | |||
119 | DRM_DEBUG_KMS("FB [%dx%d]-%d kvaddr=%p offset=%ld size=%d\n", | 119 | DRM_DEBUG_KMS("FB [%dx%d]-%d kvaddr=%p offset=%ld size=%d\n", |
120 | fb->width, fb->height, fb->depth, rk_obj->kvaddr, | 120 | fb->width, fb->height, fb->depth, rk_obj->kvaddr, |
121 | offset, size); | 121 | offset, size); |
122 | |||
123 | fbi->skip_vt_switch = true; | ||
124 | |||
122 | return 0; | 125 | return 0; |
123 | 126 | ||
124 | err_drm_framebuffer_unref: | 127 | err_drm_framebuffer_unref: |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index d041921b3bb9..ccb0ce073ef2 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
@@ -421,6 +421,12 @@ static void vop_enable(struct drm_crtc *crtc) | |||
421 | if (vop->is_enabled) | 421 | if (vop->is_enabled) |
422 | return; | 422 | return; |
423 | 423 | ||
424 | ret = pm_runtime_get_sync(vop->dev); | ||
425 | if (ret < 0) { | ||
426 | dev_err(vop->dev, "failed to get pm runtime: %d\n", ret); | ||
427 | return; | ||
428 | } | ||
429 | |||
424 | ret = clk_enable(vop->hclk); | 430 | ret = clk_enable(vop->hclk); |
425 | if (ret < 0) { | 431 | if (ret < 0) { |
426 | dev_err(vop->dev, "failed to enable hclk - %d\n", ret); | 432 | dev_err(vop->dev, "failed to enable hclk - %d\n", ret); |
@@ -517,6 +523,7 @@ static void vop_disable(struct drm_crtc *crtc) | |||
517 | clk_disable(vop->dclk); | 523 | clk_disable(vop->dclk); |
518 | clk_disable(vop->aclk); | 524 | clk_disable(vop->aclk); |
519 | clk_disable(vop->hclk); | 525 | clk_disable(vop->hclk); |
526 | pm_runtime_put(vop->dev); | ||
520 | } | 527 | } |
521 | 528 | ||
522 | /* | 529 | /* |
@@ -893,7 +900,7 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc, | |||
893 | u16 vsync_len = adjusted_mode->vsync_end - adjusted_mode->vsync_start; | 900 | u16 vsync_len = adjusted_mode->vsync_end - adjusted_mode->vsync_start; |
894 | u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start; | 901 | u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start; |
895 | u16 vact_end = vact_st + vdisplay; | 902 | u16 vact_end = vact_st + vdisplay; |
896 | int ret; | 903 | int ret, ret_clk; |
897 | uint32_t val; | 904 | uint32_t val; |
898 | 905 | ||
899 | /* | 906 | /* |
@@ -915,7 +922,8 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc, | |||
915 | default: | 922 | default: |
916 | DRM_ERROR("unsupport connector_type[%d]\n", | 923 | DRM_ERROR("unsupport connector_type[%d]\n", |
917 | vop->connector_type); | 924 | vop->connector_type); |
918 | return -EINVAL; | 925 | ret = -EINVAL; |
926 | goto out; | ||
919 | }; | 927 | }; |
920 | VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode); | 928 | VOP_CTRL_SET(vop, out_mode, vop->connector_out_mode); |
921 | 929 | ||
@@ -938,7 +946,7 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc, | |||
938 | 946 | ||
939 | ret = vop_crtc_mode_set_base(crtc, x, y, fb); | 947 | ret = vop_crtc_mode_set_base(crtc, x, y, fb); |
940 | if (ret) | 948 | if (ret) |
941 | return ret; | 949 | goto out; |
942 | 950 | ||
943 | /* | 951 | /* |
944 | * reset dclk, take all mode config affect, so the clk would run in | 952 | * reset dclk, take all mode config affect, so the clk would run in |
@@ -949,13 +957,14 @@ static int vop_crtc_mode_set(struct drm_crtc *crtc, | |||
949 | reset_control_deassert(vop->dclk_rst); | 957 | reset_control_deassert(vop->dclk_rst); |
950 | 958 | ||
951 | clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); | 959 | clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); |
952 | ret = clk_enable(vop->dclk); | 960 | out: |
953 | if (ret < 0) { | 961 | ret_clk = clk_enable(vop->dclk); |
954 | dev_err(vop->dev, "failed to enable dclk - %d\n", ret); | 962 | if (ret_clk < 0) { |
955 | return ret; | 963 | dev_err(vop->dev, "failed to enable dclk - %d\n", ret_clk); |
964 | return ret_clk; | ||
956 | } | 965 | } |
957 | 966 | ||
958 | return 0; | 967 | return ret; |
959 | } | 968 | } |
960 | 969 | ||
961 | static void vop_crtc_commit(struct drm_crtc *crtc) | 970 | static void vop_crtc_commit(struct drm_crtc *crtc) |