diff options
author | Sean Paul <seanpaul@chromium.org> | 2018-03-09 17:22:53 -0500 |
---|---|---|
committer | Heiko Stuebner <heiko@sntech.de> | 2018-03-14 06:29:31 -0400 |
commit | baa2f0240144c28502c09902f6a116138a354561 (patch) | |
tree | 9e9fd5b0a3175c3344410c1101517aa271cc9708 | |
parent | 1d38e421bebd6ca24283dd88c4416378ee89825e (diff) |
drm/rockchip: Remove analogix psr worker
Now that the spinlocks and timers are gone, we can remove the psr
worker located in rockchip's analogix driver and do the enable/disable
directly. This should simplify the code and remove races on disable.
Cc: 征增 王 <wzz@rock-chips.com>
Cc: Stéphane Marchesin <marcheu@chromium.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Thierry Escande <thierry.escande@collabora.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20180309222327.18689-3-enric.balletbo@collabora.com
-rw-r--r-- | drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 31 |
1 files changed, 2 insertions, 29 deletions
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 7d76ff47028d..36334839a3f8 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | |||
@@ -71,10 +71,6 @@ struct rockchip_dp_device { | |||
71 | struct regmap *grf; | 71 | struct regmap *grf; |
72 | struct reset_control *rst; | 72 | struct reset_control *rst; |
73 | 73 | ||
74 | struct work_struct psr_work; | ||
75 | struct mutex psr_lock; | ||
76 | unsigned int psr_state; | ||
77 | |||
78 | const struct rockchip_dp_chip_data *data; | 74 | const struct rockchip_dp_chip_data *data; |
79 | 75 | ||
80 | struct analogix_dp_device *adp; | 76 | struct analogix_dp_device *adp; |
@@ -84,28 +80,13 @@ struct rockchip_dp_device { | |||
84 | static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled) | 80 | static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled) |
85 | { | 81 | { |
86 | struct rockchip_dp_device *dp = to_dp(encoder); | 82 | struct rockchip_dp_device *dp = to_dp(encoder); |
83 | int ret; | ||
87 | 84 | ||
88 | if (!analogix_dp_psr_supported(dp->adp)) | 85 | if (!analogix_dp_psr_supported(dp->adp)) |
89 | return; | 86 | return; |
90 | 87 | ||
91 | DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit"); | 88 | DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit"); |
92 | 89 | ||
93 | mutex_lock(&dp->psr_lock); | ||
94 | if (enabled) | ||
95 | dp->psr_state = EDP_VSC_PSR_STATE_ACTIVE; | ||
96 | else | ||
97 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; | ||
98 | |||
99 | schedule_work(&dp->psr_work); | ||
100 | mutex_unlock(&dp->psr_lock); | ||
101 | } | ||
102 | |||
103 | static void analogix_dp_psr_work(struct work_struct *work) | ||
104 | { | ||
105 | struct rockchip_dp_device *dp = | ||
106 | container_of(work, typeof(*dp), psr_work); | ||
107 | int ret; | ||
108 | |||
109 | ret = rockchip_drm_wait_vact_end(dp->encoder.crtc, | 90 | ret = rockchip_drm_wait_vact_end(dp->encoder.crtc, |
110 | PSR_WAIT_LINE_FLAG_TIMEOUT_MS); | 91 | PSR_WAIT_LINE_FLAG_TIMEOUT_MS); |
111 | if (ret) { | 92 | if (ret) { |
@@ -113,12 +94,10 @@ static void analogix_dp_psr_work(struct work_struct *work) | |||
113 | return; | 94 | return; |
114 | } | 95 | } |
115 | 96 | ||
116 | mutex_lock(&dp->psr_lock); | 97 | if (enabled) |
117 | if (dp->psr_state == EDP_VSC_PSR_STATE_ACTIVE) | ||
118 | analogix_dp_enable_psr(dp->adp); | 98 | analogix_dp_enable_psr(dp->adp); |
119 | else | 99 | else |
120 | analogix_dp_disable_psr(dp->adp); | 100 | analogix_dp_disable_psr(dp->adp); |
121 | mutex_unlock(&dp->psr_lock); | ||
122 | } | 101 | } |
123 | 102 | ||
124 | static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) | 103 | static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) |
@@ -135,8 +114,6 @@ static int rockchip_dp_poweron(struct analogix_dp_plat_data *plat_data) | |||
135 | struct rockchip_dp_device *dp = to_dp(plat_data); | 114 | struct rockchip_dp_device *dp = to_dp(plat_data); |
136 | int ret; | 115 | int ret; |
137 | 116 | ||
138 | cancel_work_sync(&dp->psr_work); | ||
139 | |||
140 | ret = clk_prepare_enable(dp->pclk); | 117 | ret = clk_prepare_enable(dp->pclk); |
141 | if (ret < 0) { | 118 | if (ret < 0) { |
142 | DRM_DEV_ERROR(dp->dev, "failed to enable pclk %d\n", ret); | 119 | DRM_DEV_ERROR(dp->dev, "failed to enable pclk %d\n", ret); |
@@ -355,10 +332,6 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, | |||
355 | dp->plat_data.power_off = rockchip_dp_powerdown; | 332 | dp->plat_data.power_off = rockchip_dp_powerdown; |
356 | dp->plat_data.get_modes = rockchip_dp_get_modes; | 333 | dp->plat_data.get_modes = rockchip_dp_get_modes; |
357 | 334 | ||
358 | mutex_init(&dp->psr_lock); | ||
359 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; | ||
360 | INIT_WORK(&dp->psr_work, analogix_dp_psr_work); | ||
361 | |||
362 | ret = rockchip_drm_psr_register(&dp->encoder, analogix_dp_psr_set); | 335 | ret = rockchip_drm_psr_register(&dp->encoder, analogix_dp_psr_set); |
363 | if (ret < 0) | 336 | if (ret < 0) |
364 | goto err_cleanup_encoder; | 337 | goto err_cleanup_encoder; |