Thu Mar 5 21:13:48 2015 UTC ()
Write the loops the same way, leaving i containing the number of tries
left. Also break early in the hot case.


(christos)
diff -r1.12 -r1.13 src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c

cvs diff -r1.12 -r1.13 src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_i2c.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_i2c.c 2015/03/02 23:05:03 1.12
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_i2c.c 2015/03/05 21:13:48 1.13
@@ -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);