aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_dp_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_dp_helper.c')
-rw-r--r--drivers/gpu/drm/drm_dp_helper.c27
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
228unlock:
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