| @@ -277,46 +277,49 @@ gmbus_wait_hw_status(struct drm_i915_pri | | | @@ -277,46 +277,49 @@ gmbus_wait_hw_status(struct drm_i915_pri |
277 | #else | | 277 | #else |
278 | if (!HAS_GMBUS_IRQ(dev_priv->dev)) | | 278 | if (!HAS_GMBUS_IRQ(dev_priv->dev)) |
279 | gmbus4_irq_en = 0; | | 279 | gmbus4_irq_en = 0; |
280 | #endif | | 280 | #endif |
281 | | | 281 | |
282 | /* Important: The hw handles only the first bit, so set only one! Since | | 282 | /* Important: The hw handles only the first bit, so set only one! Since |
283 | * we also need to check for NAKs besides the hw ready/idle signal, we | | 283 | * we also need to check for NAKs besides the hw ready/idle signal, we |
284 | * need to wake up periodically and check that ourselves. */ | | 284 | * need to wake up periodically and check that ourselves. */ |
285 | I915_WRITE(GMBUS4 + reg_offset, gmbus4_irq_en); | | 285 | I915_WRITE(GMBUS4 + reg_offset, gmbus4_irq_en); |
286 | | | 286 | |
287 | #ifdef __NetBSD__ | | 287 | #ifdef __NetBSD__ |
288 | if (cold) { | | 288 | if (cold) { |
289 | i = 50; | | 289 | i = 50; |
290 | while (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset), | | 290 | do { |
291 | !ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status))) { | | 291 | gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset); |
292 | if (i-- == 0) | | 292 | if (ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status))) |
293 | break; | | 293 | break; |
294 | DELAY(1000); | | 294 | DELAY(1000); |
295 | } | | 295 | } while (i-- > 0); |
296 | } else { | | 296 | } else { |
297 | for (i = 0; i < mstohz(50); i++) { | | 297 | i = mstohz(50); |
| | | 298 | do { |
298 | int ret; | | 299 | int ret; |
299 | | | 300 | |
300 | spin_lock(&dev_priv->gmbus_wait_lock); | | 301 | spin_lock(&dev_priv->gmbus_wait_lock); |
301 | DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, | | 302 | DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, |
302 | &dev_priv->gmbus_wait_queue, | | 303 | &dev_priv->gmbus_wait_queue, |
303 | &dev_priv->gmbus_wait_lock, | | 304 | &dev_priv->gmbus_wait_lock, |
304 | 1, | | 305 | 1, |
305 | (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset), | | 306 | (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset), |
306 | ISSET(gmbus2, | | 307 | ISSET(gmbus2, |
307 | (GMBUS_SATOER | gmbus2_status)))); | | 308 | (GMBUS_SATOER | gmbus2_status)))); |
308 | spin_unlock(&dev_priv->gmbus_wait_lock); | | 309 | spin_unlock(&dev_priv->gmbus_wait_lock); |
309 | } | | 310 | if (ret) |
| | | 311 | break; |
| | | 312 | } while (i-- > 0); |
310 | } | | 313 | } |
311 | #else | | 314 | #else |
312 | for (i = 0; i < msecs_to_jiffies_timeout(50); i++) { | | 315 | for (i = 0; i < msecs_to_jiffies_timeout(50); i++) { |
313 | prepare_to_wait(&dev_priv->gmbus_wait_queue, &wait, | | 316 | prepare_to_wait(&dev_priv->gmbus_wait_queue, &wait, |
314 | TASK_UNINTERRUPTIBLE); | | 317 | TASK_UNINTERRUPTIBLE); |
315 | | | 318 | |
316 | gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset); | | 319 | gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset); |
317 | if (gmbus2 & (GMBUS_SATOER | gmbus2_status)) | | 320 | if (gmbus2 & (GMBUS_SATOER | gmbus2_status)) |
318 | break; | | 321 | break; |
319 | | | 322 | |
320 | schedule_timeout(1); | | 323 | schedule_timeout(1); |
321 | } | | 324 | } |
322 | finish_wait(&dev_priv->gmbus_wait_queue, &wait); | | 325 | finish_wait(&dev_priv->gmbus_wait_queue, &wait); |