diff options
Diffstat (limited to 'drivers/gpu/drm/drm_dp_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_dp_helper.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 7d58f594cffe..df64ed1c0139 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c | |||
@@ -179,7 +179,7 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | |||
179 | { | 179 | { |
180 | struct drm_dp_aux_msg msg; | 180 | struct drm_dp_aux_msg msg; |
181 | unsigned int retry; | 181 | unsigned int retry; |
182 | int err; | 182 | int err = 0; |
183 | 183 | ||
184 | memset(&msg, 0, sizeof(msg)); | 184 | memset(&msg, 0, sizeof(msg)); |
185 | msg.address = offset; | 185 | msg.address = offset; |
@@ -187,6 +187,8 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | |||
187 | msg.buffer = buffer; | 187 | msg.buffer = buffer; |
188 | msg.size = size; | 188 | msg.size = size; |
189 | 189 | ||
190 | mutex_lock(&aux->hw_mutex); | ||
191 | |||
190 | /* | 192 | /* |
191 | * The specification doesn't give any recommendation on how often to | 193 | * The specification doesn't give any recommendation on how often to |
192 | * retry native transactions. We used to retry 7 times like for | 194 | * retry native transactions. We used to retry 7 times like for |
@@ -195,25 +197,24 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | |||
195 | */ | 197 | */ |
196 | for (retry = 0; retry < 32; retry++) { | 198 | for (retry = 0; retry < 32; retry++) { |
197 | 199 | ||
198 | mutex_lock(&aux->hw_mutex); | ||
199 | err = aux->transfer(aux, &msg); | 200 | err = aux->transfer(aux, &msg); |
200 | mutex_unlock(&aux->hw_mutex); | ||
201 | if (err < 0) { | 201 | if (err < 0) { |
202 | if (err == -EBUSY) | 202 | if (err == -EBUSY) |
203 | continue; | 203 | continue; |
204 | 204 | ||
205 | return err; | 205 | goto unlock; |
206 | } | 206 | } |
207 | 207 | ||
208 | 208 | ||
209 | switch (msg.reply & DP_AUX_NATIVE_REPLY_MASK) { | 209 | switch (msg.reply & DP_AUX_NATIVE_REPLY_MASK) { |
210 | case DP_AUX_NATIVE_REPLY_ACK: | 210 | case DP_AUX_NATIVE_REPLY_ACK: |
211 | if (err < size) | 211 | if (err < size) |
212 | return -EPROTO; | 212 | err = -EPROTO; |
213 | return err; | 213 | goto unlock; |
214 | 214 | ||
215 | case DP_AUX_NATIVE_REPLY_NACK: | 215 | case DP_AUX_NATIVE_REPLY_NACK: |
216 | return -EIO; | 216 | err = -EIO; |
217 | goto unlock; | ||
217 | 218 | ||
218 | case DP_AUX_NATIVE_REPLY_DEFER: | 219 | case DP_AUX_NATIVE_REPLY_DEFER: |
219 | usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100); | 220 | usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100); |
@@ -222,7 +223,11 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | |||
222 | } | 223 | } |
223 | 224 | ||
224 | DRM_DEBUG_KMS("too many retries, giving up\n"); | 225 | DRM_DEBUG_KMS("too many retries, giving up\n"); |
225 | return -EIO; | 226 | err = -EIO; |
227 | |||
228 | unlock: | ||
229 | mutex_unlock(&aux->hw_mutex); | ||
230 | return err; | ||
226 | } | 231 | } |
227 | 232 | ||
228 | /** | 233 | /** |
@@ -544,9 +549,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | |||
544 | int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz)); | 549 | int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz)); |
545 | 550 | ||
546 | for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) { | 551 | for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) { |
547 | mutex_lock(&aux->hw_mutex); | ||
548 | ret = aux->transfer(aux, msg); | 552 | ret = aux->transfer(aux, msg); |
549 | mutex_unlock(&aux->hw_mutex); | ||
550 | if (ret < 0) { | 553 | if (ret < 0) { |
551 | if (ret == -EBUSY) | 554 | if (ret == -EBUSY) |
552 | continue; | 555 | continue; |
@@ -685,6 +688,8 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, | |||
685 | 688 | ||
686 | memset(&msg, 0, sizeof(msg)); | 689 | memset(&msg, 0, sizeof(msg)); |
687 | 690 | ||
691 | mutex_lock(&aux->hw_mutex); | ||
692 | |||
688 | for (i = 0; i < num; i++) { | 693 | for (i = 0; i < num; i++) { |
689 | msg.address = msgs[i].addr; | 694 | msg.address = msgs[i].addr; |
690 | drm_dp_i2c_msg_set_request(&msg, &msgs[i]); | 695 | drm_dp_i2c_msg_set_request(&msg, &msgs[i]); |
@@ -739,6 +744,8 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, | |||
739 | msg.size = 0; | 744 | msg.size = 0; |
740 | (void)drm_dp_i2c_do_msg(aux, &msg); | 745 | (void)drm_dp_i2c_do_msg(aux, &msg); |
741 | 746 | ||
747 | mutex_unlock(&aux->hw_mutex); | ||
748 | |||
742 | return err; | 749 | return err; |
743 | } | 750 | } |
744 | 751 | ||