diff options
| -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 | ||
