diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-10 17:26:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-10 17:26:00 -0500 |
commit | 33175d84ee3fa29991adb80513683e010769e807 (patch) | |
tree | 3731f61cf82451b6892cf1368701e57e35d92908 /drivers | |
parent | c5908939b2738bafe1b309bc2465cb9f2e6184c5 (diff) | |
parent | 6dfbd87a20a737641ef228230c77f4262434fa24 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/bnx2x/bnx2x_cmn.c
Diffstat (limited to 'drivers')
66 files changed, 675 insertions, 204 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 7855f9f45b8e..62787e30d508 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -900,6 +900,14 @@ static void sender(void *send_info, | |||
900 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); | 900 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); |
901 | #endif | 901 | #endif |
902 | 902 | ||
903 | /* | ||
904 | * last_timeout_jiffies is updated here to avoid | ||
905 | * smi_timeout() handler passing very large time_diff | ||
906 | * value to smi_event_handler() that causes | ||
907 | * the send command to abort. | ||
908 | */ | ||
909 | smi_info->last_timeout_jiffies = jiffies; | ||
910 | |||
903 | mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); | 911 | mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); |
904 | 912 | ||
905 | if (smi_info->thread) | 913 | if (smi_info->thread) |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 490393186338..84b164d1eb2b 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -388,6 +388,10 @@ static void discard_port_data(struct port *port) | |||
388 | unsigned int len; | 388 | unsigned int len; |
389 | int ret; | 389 | int ret; |
390 | 390 | ||
391 | if (!port->portdev) { | ||
392 | /* Device has been unplugged. vqs are already gone. */ | ||
393 | return; | ||
394 | } | ||
391 | vq = port->in_vq; | 395 | vq = port->in_vq; |
392 | if (port->inbuf) | 396 | if (port->inbuf) |
393 | buf = port->inbuf; | 397 | buf = port->inbuf; |
@@ -470,6 +474,10 @@ static void reclaim_consumed_buffers(struct port *port) | |||
470 | void *buf; | 474 | void *buf; |
471 | unsigned int len; | 475 | unsigned int len; |
472 | 476 | ||
477 | if (!port->portdev) { | ||
478 | /* Device has been unplugged. vqs are already gone. */ | ||
479 | return; | ||
480 | } | ||
473 | while ((buf = virtqueue_get_buf(port->out_vq, &len))) { | 481 | while ((buf = virtqueue_get_buf(port->out_vq, &len))) { |
474 | kfree(buf); | 482 | kfree(buf); |
475 | port->outvq_full = false; | 483 | port->outvq_full = false; |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 6977a1ce9d98..f73ef4390db6 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -672,7 +672,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
672 | struct drm_crtc_helper_funcs *crtc_funcs; | 672 | struct drm_crtc_helper_funcs *crtc_funcs; |
673 | u16 *red, *green, *blue, *transp; | 673 | u16 *red, *green, *blue, *transp; |
674 | struct drm_crtc *crtc; | 674 | struct drm_crtc *crtc; |
675 | int i, rc = 0; | 675 | int i, j, rc = 0; |
676 | int start; | 676 | int start; |
677 | 677 | ||
678 | for (i = 0; i < fb_helper->crtc_count; i++) { | 678 | for (i = 0; i < fb_helper->crtc_count; i++) { |
@@ -685,7 +685,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
685 | transp = cmap->transp; | 685 | transp = cmap->transp; |
686 | start = cmap->start; | 686 | start = cmap->start; |
687 | 687 | ||
688 | for (i = 0; i < cmap->len; i++) { | 688 | for (j = 0; j < cmap->len; j++) { |
689 | u16 hred, hgreen, hblue, htransp = 0xffff; | 689 | u16 hred, hgreen, hblue, htransp = 0xffff; |
690 | 690 | ||
691 | hred = *red++; | 691 | hred = *red++; |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 3601466c5502..4ff9b6cc973f 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -865,7 +865,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
865 | int max_freq; | 865 | int max_freq; |
866 | 866 | ||
867 | /* RPSTAT1 is in the GT power well */ | 867 | /* RPSTAT1 is in the GT power well */ |
868 | __gen6_force_wake_get(dev_priv); | 868 | __gen6_gt_force_wake_get(dev_priv); |
869 | 869 | ||
870 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); | 870 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); |
871 | seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); | 871 | seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); |
@@ -888,7 +888,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
888 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", | 888 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", |
889 | max_freq * 100); | 889 | max_freq * 100); |
890 | 890 | ||
891 | __gen6_force_wake_put(dev_priv); | 891 | __gen6_gt_force_wake_put(dev_priv); |
892 | } else { | 892 | } else { |
893 | seq_printf(m, "no P-state info available\n"); | 893 | seq_printf(m, "no P-state info available\n"); |
894 | } | 894 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 0ad533f06af9..22ec066adae6 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -46,6 +46,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400); | |||
46 | unsigned int i915_powersave = 1; | 46 | unsigned int i915_powersave = 1; |
47 | module_param_named(powersave, i915_powersave, int, 0600); | 47 | module_param_named(powersave, i915_powersave, int, 0600); |
48 | 48 | ||
49 | unsigned int i915_semaphores = 0; | ||
50 | module_param_named(semaphores, i915_semaphores, int, 0600); | ||
51 | |||
49 | unsigned int i915_enable_rc6 = 0; | 52 | unsigned int i915_enable_rc6 = 0; |
50 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | 53 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); |
51 | 54 | ||
@@ -254,7 +257,7 @@ void intel_detect_pch (struct drm_device *dev) | |||
254 | } | 257 | } |
255 | } | 258 | } |
256 | 259 | ||
257 | void __gen6_force_wake_get(struct drm_i915_private *dev_priv) | 260 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
258 | { | 261 | { |
259 | int count; | 262 | int count; |
260 | 263 | ||
@@ -270,12 +273,22 @@ void __gen6_force_wake_get(struct drm_i915_private *dev_priv) | |||
270 | udelay(10); | 273 | udelay(10); |
271 | } | 274 | } |
272 | 275 | ||
273 | void __gen6_force_wake_put(struct drm_i915_private *dev_priv) | 276 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
274 | { | 277 | { |
275 | I915_WRITE_NOTRACE(FORCEWAKE, 0); | 278 | I915_WRITE_NOTRACE(FORCEWAKE, 0); |
276 | POSTING_READ(FORCEWAKE); | 279 | POSTING_READ(FORCEWAKE); |
277 | } | 280 | } |
278 | 281 | ||
282 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) | ||
283 | { | ||
284 | int loop = 500; | ||
285 | u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); | ||
286 | while (fifo < 20 && loop--) { | ||
287 | udelay(10); | ||
288 | fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES); | ||
289 | } | ||
290 | } | ||
291 | |||
279 | static int i915_drm_freeze(struct drm_device *dev) | 292 | static int i915_drm_freeze(struct drm_device *dev) |
280 | { | 293 | { |
281 | struct drm_i915_private *dev_priv = dev->dev_private; | 294 | struct drm_i915_private *dev_priv = dev->dev_private; |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 65dfe81d0035..456f40484838 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -956,6 +956,7 @@ extern struct drm_ioctl_desc i915_ioctls[]; | |||
956 | extern int i915_max_ioctl; | 956 | extern int i915_max_ioctl; |
957 | extern unsigned int i915_fbpercrtc; | 957 | extern unsigned int i915_fbpercrtc; |
958 | extern unsigned int i915_powersave; | 958 | extern unsigned int i915_powersave; |
959 | extern unsigned int i915_semaphores; | ||
959 | extern unsigned int i915_lvds_downclock; | 960 | extern unsigned int i915_lvds_downclock; |
960 | extern unsigned int i915_panel_use_ssc; | 961 | extern unsigned int i915_panel_use_ssc; |
961 | extern unsigned int i915_enable_rc6; | 962 | extern unsigned int i915_enable_rc6; |
@@ -1177,6 +1178,9 @@ void i915_gem_detach_phys_object(struct drm_device *dev, | |||
1177 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 1178 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
1178 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); | 1179 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
1179 | 1180 | ||
1181 | uint32_t | ||
1182 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj); | ||
1183 | |||
1180 | /* i915_gem_gtt.c */ | 1184 | /* i915_gem_gtt.c */ |
1181 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | 1185 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); |
1182 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); | 1186 | int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj); |
@@ -1353,22 +1357,32 @@ __i915_write(64, q) | |||
1353 | * must be set to prevent GT core from power down and stale values being | 1357 | * must be set to prevent GT core from power down and stale values being |
1354 | * returned. | 1358 | * returned. |
1355 | */ | 1359 | */ |
1356 | void __gen6_force_wake_get(struct drm_i915_private *dev_priv); | 1360 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); |
1357 | void __gen6_force_wake_put (struct drm_i915_private *dev_priv); | 1361 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); |
1358 | static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) | 1362 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); |
1363 | |||
1364 | static inline u32 i915_gt_read(struct drm_i915_private *dev_priv, u32 reg) | ||
1359 | { | 1365 | { |
1360 | u32 val; | 1366 | u32 val; |
1361 | 1367 | ||
1362 | if (dev_priv->info->gen >= 6) { | 1368 | if (dev_priv->info->gen >= 6) { |
1363 | __gen6_force_wake_get(dev_priv); | 1369 | __gen6_gt_force_wake_get(dev_priv); |
1364 | val = I915_READ(reg); | 1370 | val = I915_READ(reg); |
1365 | __gen6_force_wake_put(dev_priv); | 1371 | __gen6_gt_force_wake_put(dev_priv); |
1366 | } else | 1372 | } else |
1367 | val = I915_READ(reg); | 1373 | val = I915_READ(reg); |
1368 | 1374 | ||
1369 | return val; | 1375 | return val; |
1370 | } | 1376 | } |
1371 | 1377 | ||
1378 | static inline void i915_gt_write(struct drm_i915_private *dev_priv, | ||
1379 | u32 reg, u32 val) | ||
1380 | { | ||
1381 | if (dev_priv->info->gen >= 6) | ||
1382 | __gen6_gt_wait_for_fifo(dev_priv); | ||
1383 | I915_WRITE(reg, val); | ||
1384 | } | ||
1385 | |||
1372 | static inline void | 1386 | static inline void |
1373 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | 1387 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) |
1374 | { | 1388 | { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index cf4f74c7c6fb..36e66cc5225e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1398,7 +1398,7 @@ i915_gem_get_gtt_alignment(struct drm_i915_gem_object *obj) | |||
1398 | * Return the required GTT alignment for an object, only taking into account | 1398 | * Return the required GTT alignment for an object, only taking into account |
1399 | * unfenced tiled surface requirements. | 1399 | * unfenced tiled surface requirements. |
1400 | */ | 1400 | */ |
1401 | static uint32_t | 1401 | uint32_t |
1402 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) | 1402 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) |
1403 | { | 1403 | { |
1404 | struct drm_device *dev = obj->base.dev; | 1404 | struct drm_device *dev = obj->base.dev; |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d2f445e825f2..50ab1614571c 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -772,8 +772,8 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, | |||
772 | if (from == NULL || to == from) | 772 | if (from == NULL || to == from) |
773 | return 0; | 773 | return 0; |
774 | 774 | ||
775 | /* XXX gpu semaphores are currently causing hard hangs on SNB mobile */ | 775 | /* XXX gpu semaphores are implicated in various hard hangs on SNB */ |
776 | if (INTEL_INFO(obj->base.dev)->gen < 6 || IS_MOBILE(obj->base.dev)) | 776 | if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores) |
777 | return i915_gem_object_wait_rendering(obj, true); | 777 | return i915_gem_object_wait_rendering(obj, true); |
778 | 778 | ||
779 | idx = intel_ring_sync_index(from, to); | 779 | idx = intel_ring_sync_index(from, to); |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 79a04fde69b5..d64843e18df2 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
@@ -184,7 +184,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
184 | static bool | 184 | static bool |
185 | i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | 185 | i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) |
186 | { | 186 | { |
187 | int tile_width, tile_height; | 187 | int tile_width; |
188 | 188 | ||
189 | /* Linear is always fine */ | 189 | /* Linear is always fine */ |
190 | if (tiling_mode == I915_TILING_NONE) | 190 | if (tiling_mode == I915_TILING_NONE) |
@@ -215,20 +215,6 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
215 | } | 215 | } |
216 | } | 216 | } |
217 | 217 | ||
218 | if (IS_GEN2(dev) || | ||
219 | (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) | ||
220 | tile_height = 32; | ||
221 | else | ||
222 | tile_height = 8; | ||
223 | /* i8xx is strange: It has 2 interleaved rows of tiles, so needs an even | ||
224 | * number of tile rows. */ | ||
225 | if (IS_GEN2(dev)) | ||
226 | tile_height *= 2; | ||
227 | |||
228 | /* Size needs to be aligned to a full tile row */ | ||
229 | if (size & (tile_height * stride - 1)) | ||
230 | return false; | ||
231 | |||
232 | /* 965+ just needs multiples of tile width */ | 218 | /* 965+ just needs multiples of tile width */ |
233 | if (INTEL_INFO(dev)->gen >= 4) { | 219 | if (INTEL_INFO(dev)->gen >= 4) { |
234 | if (stride & (tile_width - 1)) | 220 | if (stride & (tile_width - 1)) |
@@ -363,14 +349,27 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
363 | (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end && | 349 | (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end && |
364 | i915_gem_object_fence_ok(obj, args->tiling_mode)); | 350 | i915_gem_object_fence_ok(obj, args->tiling_mode)); |
365 | 351 | ||
366 | obj->tiling_changed = true; | 352 | /* Rebind if we need a change of alignment */ |
367 | obj->tiling_mode = args->tiling_mode; | 353 | if (!obj->map_and_fenceable) { |
368 | obj->stride = args->stride; | 354 | u32 unfenced_alignment = |
355 | i915_gem_get_unfenced_gtt_alignment(obj); | ||
356 | if (obj->gtt_offset & (unfenced_alignment - 1)) | ||
357 | ret = i915_gem_object_unbind(obj); | ||
358 | } | ||
359 | |||
360 | if (ret == 0) { | ||
361 | obj->tiling_changed = true; | ||
362 | obj->tiling_mode = args->tiling_mode; | ||
363 | obj->stride = args->stride; | ||
364 | } | ||
369 | } | 365 | } |
366 | /* we have to maintain this existing ABI... */ | ||
367 | args->stride = obj->stride; | ||
368 | args->tiling_mode = obj->tiling_mode; | ||
370 | drm_gem_object_unreference(&obj->base); | 369 | drm_gem_object_unreference(&obj->base); |
371 | mutex_unlock(&dev->struct_mutex); | 370 | mutex_unlock(&dev->struct_mutex); |
372 | 371 | ||
373 | return 0; | 372 | return ret; |
374 | } | 373 | } |
375 | 374 | ||
376 | /** | 375 | /** |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 729d4233b763..2abe240dae58 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -1553,7 +1553,17 @@ | |||
1553 | 1553 | ||
1554 | /* Backlight control */ | 1554 | /* Backlight control */ |
1555 | #define BLC_PWM_CTL 0x61254 | 1555 | #define BLC_PWM_CTL 0x61254 |
1556 | #define BACKLIGHT_MODULATION_FREQ_SHIFT (17) | ||
1556 | #define BLC_PWM_CTL2 0x61250 /* 965+ only */ | 1557 | #define BLC_PWM_CTL2 0x61250 /* 965+ only */ |
1558 | #define BLM_COMBINATION_MODE (1 << 30) | ||
1559 | /* | ||
1560 | * This is the most significant 15 bits of the number of backlight cycles in a | ||
1561 | * complete cycle of the modulated backlight control. | ||
1562 | * | ||
1563 | * The actual value is this field multiplied by two. | ||
1564 | */ | ||
1565 | #define BACKLIGHT_MODULATION_FREQ_MASK (0x7fff << 17) | ||
1566 | #define BLM_LEGACY_MODE (1 << 16) | ||
1557 | /* | 1567 | /* |
1558 | * This is the number of cycles out of the backlight modulation cycle for which | 1568 | * This is the number of cycles out of the backlight modulation cycle for which |
1559 | * the backlight is on. | 1569 | * the backlight is on. |
@@ -3261,6 +3271,8 @@ | |||
3261 | #define FORCEWAKE 0xA18C | 3271 | #define FORCEWAKE 0xA18C |
3262 | #define FORCEWAKE_ACK 0x130090 | 3272 | #define FORCEWAKE_ACK 0x130090 |
3263 | 3273 | ||
3274 | #define GT_FIFO_FREE_ENTRIES 0x120008 | ||
3275 | |||
3264 | #define GEN6_RPNSWREQ 0xA008 | 3276 | #define GEN6_RPNSWREQ 0xA008 |
3265 | #define GEN6_TURBO_DISABLE (1<<31) | 3277 | #define GEN6_TURBO_DISABLE (1<<31) |
3266 | #define GEN6_FREQUENCY(x) ((x)<<25) | 3278 | #define GEN6_FREQUENCY(x) ((x)<<25) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e79b25bbee6c..49fb54fd9a18 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -1219,7 +1219,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev) | |||
1219 | u32 blt_ecoskpd; | 1219 | u32 blt_ecoskpd; |
1220 | 1220 | ||
1221 | /* Make sure blitter notifies FBC of writes */ | 1221 | /* Make sure blitter notifies FBC of writes */ |
1222 | __gen6_force_wake_get(dev_priv); | 1222 | __gen6_gt_force_wake_get(dev_priv); |
1223 | blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); | 1223 | blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); |
1224 | blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << | 1224 | blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << |
1225 | GEN6_BLITTER_LOCK_SHIFT; | 1225 | GEN6_BLITTER_LOCK_SHIFT; |
@@ -1230,7 +1230,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev) | |||
1230 | GEN6_BLITTER_LOCK_SHIFT); | 1230 | GEN6_BLITTER_LOCK_SHIFT); |
1231 | I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); | 1231 | I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); |
1232 | POSTING_READ(GEN6_BLITTER_ECOSKPD); | 1232 | POSTING_READ(GEN6_BLITTER_ECOSKPD); |
1233 | __gen6_force_wake_put(dev_priv); | 1233 | __gen6_gt_force_wake_put(dev_priv); |
1234 | } | 1234 | } |
1235 | 1235 | ||
1236 | static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | 1236 | static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) |
@@ -6282,7 +6282,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6282 | * userspace... | 6282 | * userspace... |
6283 | */ | 6283 | */ |
6284 | I915_WRITE(GEN6_RC_STATE, 0); | 6284 | I915_WRITE(GEN6_RC_STATE, 0); |
6285 | __gen6_force_wake_get(dev_priv); | 6285 | __gen6_gt_force_wake_get(dev_priv); |
6286 | 6286 | ||
6287 | /* disable the counters and set deterministic thresholds */ | 6287 | /* disable the counters and set deterministic thresholds */ |
6288 | I915_WRITE(GEN6_RC_CONTROL, 0); | 6288 | I915_WRITE(GEN6_RC_CONTROL, 0); |
@@ -6380,7 +6380,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6380 | /* enable all PM interrupts */ | 6380 | /* enable all PM interrupts */ |
6381 | I915_WRITE(GEN6_PMINTRMSK, 0); | 6381 | I915_WRITE(GEN6_PMINTRMSK, 0); |
6382 | 6382 | ||
6383 | __gen6_force_wake_put(dev_priv); | 6383 | __gen6_gt_force_wake_put(dev_priv); |
6384 | } | 6384 | } |
6385 | 6385 | ||
6386 | void intel_enable_clock_gating(struct drm_device *dev) | 6386 | void intel_enable_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index d860abeda70f..f8f86e57df22 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -30,6 +30,8 @@ | |||
30 | 30 | ||
31 | #include "intel_drv.h" | 31 | #include "intel_drv.h" |
32 | 32 | ||
33 | #define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ | ||
34 | |||
33 | void | 35 | void |
34 | intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, | 36 | intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, |
35 | struct drm_display_mode *adjusted_mode) | 37 | struct drm_display_mode *adjusted_mode) |
@@ -110,6 +112,19 @@ done: | |||
110 | dev_priv->pch_pf_size = (width << 16) | height; | 112 | dev_priv->pch_pf_size = (width << 16) | height; |
111 | } | 113 | } |
112 | 114 | ||
115 | static int is_backlight_combination_mode(struct drm_device *dev) | ||
116 | { | ||
117 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
118 | |||
119 | if (INTEL_INFO(dev)->gen >= 4) | ||
120 | return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE; | ||
121 | |||
122 | if (IS_GEN2(dev)) | ||
123 | return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE; | ||
124 | |||
125 | return 0; | ||
126 | } | ||
127 | |||
113 | static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) | 128 | static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) |
114 | { | 129 | { |
115 | u32 val; | 130 | u32 val; |
@@ -166,6 +181,9 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
166 | if (INTEL_INFO(dev)->gen < 4) | 181 | if (INTEL_INFO(dev)->gen < 4) |
167 | max &= ~1; | 182 | max &= ~1; |
168 | } | 183 | } |
184 | |||
185 | if (is_backlight_combination_mode(dev)) | ||
186 | max *= 0xff; | ||
169 | } | 187 | } |
170 | 188 | ||
171 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); | 189 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); |
@@ -183,6 +201,14 @@ u32 intel_panel_get_backlight(struct drm_device *dev) | |||
183 | val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 201 | val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; |
184 | if (IS_PINEVIEW(dev)) | 202 | if (IS_PINEVIEW(dev)) |
185 | val >>= 1; | 203 | val >>= 1; |
204 | |||
205 | if (is_backlight_combination_mode(dev)){ | ||
206 | u8 lbpc; | ||
207 | |||
208 | val &= ~1; | ||
209 | pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc); | ||
210 | val *= lbpc; | ||
211 | } | ||
186 | } | 212 | } |
187 | 213 | ||
188 | DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); | 214 | DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); |
@@ -205,6 +231,16 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level) | |||
205 | 231 | ||
206 | if (HAS_PCH_SPLIT(dev)) | 232 | if (HAS_PCH_SPLIT(dev)) |
207 | return intel_pch_panel_set_backlight(dev, level); | 233 | return intel_pch_panel_set_backlight(dev, level); |
234 | |||
235 | if (is_backlight_combination_mode(dev)){ | ||
236 | u32 max = intel_panel_get_max_backlight(dev); | ||
237 | u8 lbpc; | ||
238 | |||
239 | lbpc = level * 0xfe / max + 1; | ||
240 | level /= lbpc; | ||
241 | pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc); | ||
242 | } | ||
243 | |||
208 | tmp = I915_READ(BLC_PWM_CTL); | 244 | tmp = I915_READ(BLC_PWM_CTL); |
209 | if (IS_PINEVIEW(dev)) { | 245 | if (IS_PINEVIEW(dev)) { |
210 | tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); | 246 | tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 6d6fde85a636..34306865a5df 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -14,22 +14,23 @@ struct intel_hw_status_page { | |||
14 | struct drm_i915_gem_object *obj; | 14 | struct drm_i915_gem_object *obj; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | #define I915_RING_READ(reg) i915_safe_read(dev_priv, reg) | 17 | #define I915_RING_READ(reg) i915_gt_read(dev_priv, reg) |
18 | #define I915_RING_WRITE(reg, val) i915_gt_write(dev_priv, reg, val) | ||
18 | 19 | ||
19 | #define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) | 20 | #define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL((ring)->mmio_base)) |
20 | #define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val) | 21 | #define I915_WRITE_TAIL(ring, val) I915_RING_WRITE(RING_TAIL((ring)->mmio_base), val) |
21 | 22 | ||
22 | #define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) | 23 | #define I915_READ_START(ring) I915_RING_READ(RING_START((ring)->mmio_base)) |
23 | #define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val) | 24 | #define I915_WRITE_START(ring, val) I915_RING_WRITE(RING_START((ring)->mmio_base), val) |
24 | 25 | ||
25 | #define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD((ring)->mmio_base)) | 26 | #define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD((ring)->mmio_base)) |
26 | #define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val) | 27 | #define I915_WRITE_HEAD(ring, val) I915_RING_WRITE(RING_HEAD((ring)->mmio_base), val) |
27 | 28 | ||
28 | #define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) | 29 | #define I915_READ_CTL(ring) I915_RING_READ(RING_CTL((ring)->mmio_base)) |
29 | #define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val) | 30 | #define I915_WRITE_CTL(ring, val) I915_RING_WRITE(RING_CTL((ring)->mmio_base), val) |
30 | 31 | ||
31 | #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) | ||
32 | #define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) | 32 | #define I915_READ_IMR(ring) I915_RING_READ(RING_IMR((ring)->mmio_base)) |
33 | #define I915_WRITE_IMR(ring, val) I915_RING_WRITE(RING_IMR((ring)->mmio_base), val) | ||
33 | 34 | ||
34 | #define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base)) | 35 | #define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID((ring)->mmio_base)) |
35 | #define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) | 36 | #define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0((ring)->mmio_base)) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index 65699bfaaaea..b368ed74aad7 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c | |||
@@ -83,7 +83,8 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
83 | return ret; | 83 | return ret; |
84 | 84 | ||
85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ | 85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ |
86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); | 86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfd0, 0x1000, |
87 | &chan->m2mf_ntfy); | ||
87 | if (ret) | 88 | if (ret) |
88 | return ret; | 89 | return ret; |
89 | 90 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 9821fcacc3d2..982d70b12722 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
@@ -852,7 +852,8 @@ extern const struct ttm_mem_type_manager_func nouveau_vram_manager; | |||
852 | extern int nouveau_notifier_init_channel(struct nouveau_channel *); | 852 | extern int nouveau_notifier_init_channel(struct nouveau_channel *); |
853 | extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); | 853 | extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); |
854 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, | 854 | extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, |
855 | int cout, uint32_t *offset); | 855 | int cout, uint32_t start, uint32_t end, |
856 | uint32_t *offset); | ||
856 | extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); | 857 | extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); |
857 | extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, | 858 | extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, |
858 | struct drm_file *); | 859 | struct drm_file *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 26347b7cd872..b0fb9bdcddb7 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
@@ -725,8 +725,10 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man, | |||
725 | ret = vram->get(dev, mem->num_pages << PAGE_SHIFT, | 725 | ret = vram->get(dev, mem->num_pages << PAGE_SHIFT, |
726 | mem->page_alignment << PAGE_SHIFT, size_nc, | 726 | mem->page_alignment << PAGE_SHIFT, size_nc, |
727 | (nvbo->tile_flags >> 8) & 0xff, &node); | 727 | (nvbo->tile_flags >> 8) & 0xff, &node); |
728 | if (ret) | 728 | if (ret) { |
729 | return ret; | 729 | mem->mm_node = NULL; |
730 | return (ret == -ENOSPC) ? 0 : ret; | ||
731 | } | ||
730 | 732 | ||
731 | node->page_shift = 12; | 733 | node->page_shift = 12; |
732 | if (nvbo->vma.node) | 734 | if (nvbo->vma.node) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.c b/drivers/gpu/drm/nouveau/nouveau_mm.c index 8844b50c3e54..7609756b6faf 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mm.c +++ b/drivers/gpu/drm/nouveau/nouveau_mm.c | |||
@@ -123,7 +123,7 @@ nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc, | |||
123 | return 0; | 123 | return 0; |
124 | } | 124 | } |
125 | 125 | ||
126 | return -ENOMEM; | 126 | return -ENOSPC; |
127 | } | 127 | } |
128 | 128 | ||
129 | int | 129 | int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index fe29d604b820..5ea167623a82 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
@@ -96,7 +96,8 @@ nouveau_notifier_gpuobj_dtor(struct drm_device *dev, | |||
96 | 96 | ||
97 | int | 97 | int |
98 | nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | 98 | nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, |
99 | int size, uint32_t *b_offset) | 99 | int size, uint32_t start, uint32_t end, |
100 | uint32_t *b_offset) | ||
100 | { | 101 | { |
101 | struct drm_device *dev = chan->dev; | 102 | struct drm_device *dev = chan->dev; |
102 | struct nouveau_gpuobj *nobj = NULL; | 103 | struct nouveau_gpuobj *nobj = NULL; |
@@ -104,9 +105,10 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | |||
104 | uint32_t offset; | 105 | uint32_t offset; |
105 | int target, ret; | 106 | int target, ret; |
106 | 107 | ||
107 | mem = drm_mm_search_free(&chan->notifier_heap, size, 0, 0); | 108 | mem = drm_mm_search_free_in_range(&chan->notifier_heap, size, 0, |
109 | start, end, 0); | ||
108 | if (mem) | 110 | if (mem) |
109 | mem = drm_mm_get_block(mem, size, 0); | 111 | mem = drm_mm_get_block_range(mem, size, 0, start, end); |
110 | if (!mem) { | 112 | if (!mem) { |
111 | NV_ERROR(dev, "Channel %d notifier block full\n", chan->id); | 113 | NV_ERROR(dev, "Channel %d notifier block full\n", chan->id); |
112 | return -ENOMEM; | 114 | return -ENOMEM; |
@@ -177,7 +179,8 @@ nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data, | |||
177 | if (IS_ERR(chan)) | 179 | if (IS_ERR(chan)) |
178 | return PTR_ERR(chan); | 180 | return PTR_ERR(chan); |
179 | 181 | ||
180 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, &na->offset); | 182 | ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000, |
183 | &na->offset); | ||
181 | nouveau_channel_put(&chan); | 184 | nouveau_channel_put(&chan); |
182 | return ret; | 185 | return ret; |
183 | } | 186 | } |
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c index ea0041810ae3..e57caa2a00e3 100644 --- a/drivers/gpu/drm/nouveau/nv50_instmem.c +++ b/drivers/gpu/drm/nouveau/nv50_instmem.c | |||
@@ -403,16 +403,24 @@ nv50_instmem_unmap(struct nouveau_gpuobj *gpuobj) | |||
403 | void | 403 | void |
404 | nv50_instmem_flush(struct drm_device *dev) | 404 | nv50_instmem_flush(struct drm_device *dev) |
405 | { | 405 | { |
406 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
407 | |||
408 | spin_lock(&dev_priv->ramin_lock); | ||
406 | nv_wr32(dev, 0x00330c, 0x00000001); | 409 | nv_wr32(dev, 0x00330c, 0x00000001); |
407 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) | 410 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) |
408 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 411 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
412 | spin_unlock(&dev_priv->ramin_lock); | ||
409 | } | 413 | } |
410 | 414 | ||
411 | void | 415 | void |
412 | nv84_instmem_flush(struct drm_device *dev) | 416 | nv84_instmem_flush(struct drm_device *dev) |
413 | { | 417 | { |
418 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
419 | |||
420 | spin_lock(&dev_priv->ramin_lock); | ||
414 | nv_wr32(dev, 0x070000, 0x00000001); | 421 | nv_wr32(dev, 0x070000, 0x00000001); |
415 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) | 422 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) |
416 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 423 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
424 | spin_unlock(&dev_priv->ramin_lock); | ||
417 | } | 425 | } |
418 | 426 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c index 459ff08241e5..6144156f255a 100644 --- a/drivers/gpu/drm/nouveau/nv50_vm.c +++ b/drivers/gpu/drm/nouveau/nv50_vm.c | |||
@@ -169,7 +169,11 @@ nv50_vm_flush(struct nouveau_vm *vm) | |||
169 | void | 169 | void |
170 | nv50_vm_flush_engine(struct drm_device *dev, int engine) | 170 | nv50_vm_flush_engine(struct drm_device *dev, int engine) |
171 | { | 171 | { |
172 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
173 | |||
174 | spin_lock(&dev_priv->ramin_lock); | ||
172 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); | 175 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); |
173 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) | 176 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) |
174 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); | 177 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); |
178 | spin_unlock(&dev_priv->ramin_lock); | ||
175 | } | 179 | } |
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c index 2e067dd2ee51..50ea1f43bdc1 100644 --- a/drivers/i2c/busses/i2c-eg20t.c +++ b/drivers/i2c/busses/i2c-eg20t.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
31 | #include <linux/ktime.h> | 31 | #include <linux/ktime.h> |
32 | #include <linux/slab.h> | ||
32 | 33 | ||
33 | #define PCH_EVENT_SET 0 /* I2C Interrupt Event Set Status */ | 34 | #define PCH_EVENT_SET 0 /* I2C Interrupt Event Set Status */ |
34 | #define PCH_EVENT_NONE 1 /* I2C Interrupt Event Clear Status */ | 35 | #define PCH_EVENT_NONE 1 /* I2C Interrupt Event Clear Status */ |
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index ef3bcb1ce864..61653f079671 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
@@ -249,7 +249,7 @@ static struct i2c_adapter ocores_adapter = { | |||
249 | static int ocores_i2c_of_probe(struct platform_device* pdev, | 249 | static int ocores_i2c_of_probe(struct platform_device* pdev, |
250 | struct ocores_i2c* i2c) | 250 | struct ocores_i2c* i2c) |
251 | { | 251 | { |
252 | __be32* val; | 252 | const __be32* val; |
253 | 253 | ||
254 | val = of_get_property(pdev->dev.of_node, "regstep", NULL); | 254 | val = of_get_property(pdev->dev.of_node, "regstep", NULL); |
255 | if (!val) { | 255 | if (!val) { |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 829a2a1029f7..58a58c7eaa17 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -378,9 +378,7 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) | |||
378 | * REVISIT: Some wkup sources might not be needed. | 378 | * REVISIT: Some wkup sources might not be needed. |
379 | */ | 379 | */ |
380 | dev->westate = OMAP_I2C_WE_ALL; | 380 | dev->westate = OMAP_I2C_WE_ALL; |
381 | if (dev->rev < OMAP_I2C_REV_ON_4430) | 381 | omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate); |
382 | omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, | ||
383 | dev->westate); | ||
384 | } | 382 | } |
385 | } | 383 | } |
386 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | 384 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); |
diff --git a/drivers/media/common/tuners/tda8290.c b/drivers/media/common/tuners/tda8290.c index bc6a67768af1..8c4852114eeb 100644 --- a/drivers/media/common/tuners/tda8290.c +++ b/drivers/media/common/tuners/tda8290.c | |||
@@ -658,13 +658,13 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props) | |||
658 | #define TDA8290_ID 0x89 | 658 | #define TDA8290_ID 0x89 |
659 | u8 reg = 0x1f, id; | 659 | u8 reg = 0x1f, id; |
660 | struct i2c_msg msg_read[] = { | 660 | struct i2c_msg msg_read[] = { |
661 | { .addr = 0x4b, .flags = 0, .len = 1, .buf = ® }, | 661 | { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® }, |
662 | { .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id }, | 662 | { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id }, |
663 | }; | 663 | }; |
664 | 664 | ||
665 | /* detect tda8290 */ | 665 | /* detect tda8290 */ |
666 | if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) { | 666 | if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) { |
667 | printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n", | 667 | printk(KERN_WARNING "%s: couldn't read register 0x%02x\n", |
668 | __func__, reg); | 668 | __func__, reg); |
669 | return -ENODEV; | 669 | return -ENODEV; |
670 | } | 670 | } |
@@ -685,13 +685,13 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props) | |||
685 | #define TDA8295C2_ID 0x8b | 685 | #define TDA8295C2_ID 0x8b |
686 | u8 reg = 0x2f, id; | 686 | u8 reg = 0x2f, id; |
687 | struct i2c_msg msg_read[] = { | 687 | struct i2c_msg msg_read[] = { |
688 | { .addr = 0x4b, .flags = 0, .len = 1, .buf = ® }, | 688 | { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® }, |
689 | { .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id }, | 689 | { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id }, |
690 | }; | 690 | }; |
691 | 691 | ||
692 | /* detect tda8290 */ | 692 | /* detect tda8295 */ |
693 | if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) { | 693 | if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) { |
694 | printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n", | 694 | printk(KERN_WARNING "%s: couldn't read register 0x%02x\n", |
695 | __func__, reg); | 695 | __func__, reg); |
696 | return -ENODEV; | 696 | return -ENODEV; |
697 | } | 697 | } |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index defd83964ce2..193cdb77b76a 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
@@ -870,6 +870,23 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) | |||
870 | return 0; | 870 | return 0; |
871 | } | 871 | } |
872 | 872 | ||
873 | static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index, | ||
874 | u16 pid, int onoff) | ||
875 | { | ||
876 | struct dib0700_state *st = adapter->dev->priv; | ||
877 | if (st->is_dib7000pc) | ||
878 | return dib7000p_pid_filter(adapter->fe, index, pid, onoff); | ||
879 | return dib7000m_pid_filter(adapter->fe, index, pid, onoff); | ||
880 | } | ||
881 | |||
882 | static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff) | ||
883 | { | ||
884 | struct dib0700_state *st = adapter->dev->priv; | ||
885 | if (st->is_dib7000pc) | ||
886 | return dib7000p_pid_filter_ctrl(adapter->fe, onoff); | ||
887 | return dib7000m_pid_filter_ctrl(adapter->fe, onoff); | ||
888 | } | ||
889 | |||
873 | static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) | 890 | static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff) |
874 | { | 891 | { |
875 | return dib7000p_pid_filter(adapter->fe, index, pid, onoff); | 892 | return dib7000p_pid_filter(adapter->fe, index, pid, onoff); |
@@ -1875,8 +1892,8 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1875 | { | 1892 | { |
1876 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | 1893 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, |
1877 | .pid_filter_count = 32, | 1894 | .pid_filter_count = 32, |
1878 | .pid_filter = stk70x0p_pid_filter, | 1895 | .pid_filter = stk7700p_pid_filter, |
1879 | .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, | 1896 | .pid_filter_ctrl = stk7700p_pid_filter_ctrl, |
1880 | .frontend_attach = stk7700p_frontend_attach, | 1897 | .frontend_attach = stk7700p_frontend_attach, |
1881 | .tuner_attach = stk7700p_tuner_attach, | 1898 | .tuner_attach = stk7700p_tuner_attach, |
1882 | 1899 | ||
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c index 9eea4188303b..46ccd01a7696 100644 --- a/drivers/media/dvb/dvb-usb/lmedm04.c +++ b/drivers/media/dvb/dvb-usb/lmedm04.c | |||
@@ -659,7 +659,7 @@ static int lme2510_download_firmware(struct usb_device *dev, | |||
659 | } | 659 | } |
660 | 660 | ||
661 | /* Default firmware for LME2510C */ | 661 | /* Default firmware for LME2510C */ |
662 | const char lme_firmware[50] = "dvb-usb-lme2510c-s7395.fw"; | 662 | char lme_firmware[50] = "dvb-usb-lme2510c-s7395.fw"; |
663 | 663 | ||
664 | static void lme_coldreset(struct usb_device *dev) | 664 | static void lme_coldreset(struct usb_device *dev) |
665 | { | 665 | { |
@@ -1006,7 +1006,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { | |||
1006 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 1006 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
1007 | .usb_ctrl = DEVICE_SPECIFIC, | 1007 | .usb_ctrl = DEVICE_SPECIFIC, |
1008 | .download_firmware = lme2510_download_firmware, | 1008 | .download_firmware = lme2510_download_firmware, |
1009 | .firmware = lme_firmware, | 1009 | .firmware = (const char *)&lme_firmware, |
1010 | .size_of_priv = sizeof(struct lme2510_state), | 1010 | .size_of_priv = sizeof(struct lme2510_state), |
1011 | .num_adapters = 1, | 1011 | .num_adapters = 1, |
1012 | .adapter = { | 1012 | .adapter = { |
@@ -1109,5 +1109,5 @@ module_exit(lme2510_module_exit); | |||
1109 | 1109 | ||
1110 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); | 1110 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); |
1111 | MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); | 1111 | MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); |
1112 | MODULE_VERSION("1.74"); | 1112 | MODULE_VERSION("1.75"); |
1113 | MODULE_LICENSE("GPL"); | 1113 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c index c7f5ccf54aa5..289a79837f24 100644 --- a/drivers/media/dvb/frontends/dib7000m.c +++ b/drivers/media/dvb/frontends/dib7000m.c | |||
@@ -1285,6 +1285,25 @@ struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *demod, enum di | |||
1285 | } | 1285 | } |
1286 | EXPORT_SYMBOL(dib7000m_get_i2c_master); | 1286 | EXPORT_SYMBOL(dib7000m_get_i2c_master); |
1287 | 1287 | ||
1288 | int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff) | ||
1289 | { | ||
1290 | struct dib7000m_state *state = fe->demodulator_priv; | ||
1291 | u16 val = dib7000m_read_word(state, 294 + state->reg_offs) & 0xffef; | ||
1292 | val |= (onoff & 0x1) << 4; | ||
1293 | dprintk("PID filter enabled %d", onoff); | ||
1294 | return dib7000m_write_word(state, 294 + state->reg_offs, val); | ||
1295 | } | ||
1296 | EXPORT_SYMBOL(dib7000m_pid_filter_ctrl); | ||
1297 | |||
1298 | int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff) | ||
1299 | { | ||
1300 | struct dib7000m_state *state = fe->demodulator_priv; | ||
1301 | dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff); | ||
1302 | return dib7000m_write_word(state, 300 + state->reg_offs + id, | ||
1303 | onoff ? (1 << 13) | pid : 0); | ||
1304 | } | ||
1305 | EXPORT_SYMBOL(dib7000m_pid_filter); | ||
1306 | |||
1288 | #if 0 | 1307 | #if 0 |
1289 | /* used with some prototype boards */ | 1308 | /* used with some prototype boards */ |
1290 | int dib7000m_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, | 1309 | int dib7000m_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, |
diff --git a/drivers/media/dvb/frontends/dib7000m.h b/drivers/media/dvb/frontends/dib7000m.h index 113819ce9f0d..81fcf2241c64 100644 --- a/drivers/media/dvb/frontends/dib7000m.h +++ b/drivers/media/dvb/frontends/dib7000m.h | |||
@@ -46,6 +46,8 @@ extern struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, | |||
46 | extern struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *, | 46 | extern struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *, |
47 | enum dibx000_i2c_interface, | 47 | enum dibx000_i2c_interface, |
48 | int); | 48 | int); |
49 | extern int dib7000m_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff); | ||
50 | extern int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff); | ||
49 | #else | 51 | #else |
50 | static inline | 52 | static inline |
51 | struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, | 53 | struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, |
@@ -63,6 +65,19 @@ struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *demod, | |||
63 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 65 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
64 | return NULL; | 66 | return NULL; |
65 | } | 67 | } |
68 | static inline int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id, | ||
69 | u16 pid, u8 onoff) | ||
70 | { | ||
71 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
72 | return -ENODEV; | ||
73 | } | ||
74 | |||
75 | static inline int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, | ||
76 | uint8_t onoff) | ||
77 | { | ||
78 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
79 | return -ENODEV; | ||
80 | } | ||
66 | #endif | 81 | #endif |
67 | 82 | ||
68 | /* TODO | 83 | /* TODO |
diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c index 59feeb84aec7..10a432a79d00 100644 --- a/drivers/media/dvb/mantis/mantis_pci.c +++ b/drivers/media/dvb/mantis/mantis_pci.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/moduleparam.h> | 22 | #include <linux/moduleparam.h> |
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
25 | #include <asm/pgtable.h> | ||
26 | #include <asm/page.h> | 25 | #include <asm/page.h> |
27 | #include <linux/kmod.h> | 26 | #include <linux/kmod.h> |
28 | #include <linux/vmalloc.h> | 27 | #include <linux/vmalloc.h> |
diff --git a/drivers/media/rc/ir-raw.c b/drivers/media/rc/ir-raw.c index 73230ff93b8a..01f258a2a57a 100644 --- a/drivers/media/rc/ir-raw.c +++ b/drivers/media/rc/ir-raw.c | |||
@@ -112,7 +112,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) | |||
112 | { | 112 | { |
113 | ktime_t now; | 113 | ktime_t now; |
114 | s64 delta; /* ns */ | 114 | s64 delta; /* ns */ |
115 | struct ir_raw_event ev; | 115 | DEFINE_IR_RAW_EVENT(ev); |
116 | int rc = 0; | 116 | int rc = 0; |
117 | 117 | ||
118 | if (!dev->raw) | 118 | if (!dev->raw) |
@@ -125,7 +125,6 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) | |||
125 | * being called for the first time, note that delta can't | 125 | * being called for the first time, note that delta can't |
126 | * possibly be negative. | 126 | * possibly be negative. |
127 | */ | 127 | */ |
128 | ev.duration = 0; | ||
129 | if (delta > IR_MAX_DURATION || !dev->raw->last_type) | 128 | if (delta > IR_MAX_DURATION || !dev->raw->last_type) |
130 | type |= IR_START_EVENT; | 129 | type |= IR_START_EVENT; |
131 | else | 130 | else |
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 6df0a4980645..e4f8eac7f717 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c | |||
@@ -148,6 +148,7 @@ enum mceusb_model_type { | |||
148 | MCE_GEN2_TX_INV, | 148 | MCE_GEN2_TX_INV, |
149 | POLARIS_EVK, | 149 | POLARIS_EVK, |
150 | CX_HYBRID_TV, | 150 | CX_HYBRID_TV, |
151 | MULTIFUNCTION, | ||
151 | }; | 152 | }; |
152 | 153 | ||
153 | struct mceusb_model { | 154 | struct mceusb_model { |
@@ -155,9 +156,10 @@ struct mceusb_model { | |||
155 | u32 mce_gen2:1; | 156 | u32 mce_gen2:1; |
156 | u32 mce_gen3:1; | 157 | u32 mce_gen3:1; |
157 | u32 tx_mask_normal:1; | 158 | u32 tx_mask_normal:1; |
158 | u32 is_polaris:1; | ||
159 | u32 no_tx:1; | 159 | u32 no_tx:1; |
160 | 160 | ||
161 | int ir_intfnum; | ||
162 | |||
161 | const char *rc_map; /* Allow specify a per-board map */ | 163 | const char *rc_map; /* Allow specify a per-board map */ |
162 | const char *name; /* per-board name */ | 164 | const char *name; /* per-board name */ |
163 | }; | 165 | }; |
@@ -179,7 +181,6 @@ static const struct mceusb_model mceusb_model[] = { | |||
179 | .tx_mask_normal = 1, | 181 | .tx_mask_normal = 1, |
180 | }, | 182 | }, |
181 | [POLARIS_EVK] = { | 183 | [POLARIS_EVK] = { |
182 | .is_polaris = 1, | ||
183 | /* | 184 | /* |
184 | * In fact, the EVK is shipped without | 185 | * In fact, the EVK is shipped without |
185 | * remotes, but we should have something handy, | 186 | * remotes, but we should have something handy, |
@@ -189,10 +190,13 @@ static const struct mceusb_model mceusb_model[] = { | |||
189 | .name = "Conexant Hybrid TV (cx231xx) MCE IR", | 190 | .name = "Conexant Hybrid TV (cx231xx) MCE IR", |
190 | }, | 191 | }, |
191 | [CX_HYBRID_TV] = { | 192 | [CX_HYBRID_TV] = { |
192 | .is_polaris = 1, | ||
193 | .no_tx = 1, /* tx isn't wired up at all */ | 193 | .no_tx = 1, /* tx isn't wired up at all */ |
194 | .name = "Conexant Hybrid TV (cx231xx) MCE IR", | 194 | .name = "Conexant Hybrid TV (cx231xx) MCE IR", |
195 | }, | 195 | }, |
196 | [MULTIFUNCTION] = { | ||
197 | .mce_gen2 = 1, | ||
198 | .ir_intfnum = 2, | ||
199 | }, | ||
196 | }; | 200 | }; |
197 | 201 | ||
198 | static struct usb_device_id mceusb_dev_table[] = { | 202 | static struct usb_device_id mceusb_dev_table[] = { |
@@ -216,8 +220,9 @@ static struct usb_device_id mceusb_dev_table[] = { | |||
216 | { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, | 220 | { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, |
217 | /* Philips/Spinel plus IR transceiver for ASUS */ | 221 | /* Philips/Spinel plus IR transceiver for ASUS */ |
218 | { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, | 222 | { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, |
219 | /* Realtek MCE IR Receiver */ | 223 | /* Realtek MCE IR Receiver and card reader */ |
220 | { USB_DEVICE(VENDOR_REALTEK, 0x0161) }, | 224 | { USB_DEVICE(VENDOR_REALTEK, 0x0161), |
225 | .driver_info = MULTIFUNCTION }, | ||
221 | /* SMK/Toshiba G83C0004D410 */ | 226 | /* SMK/Toshiba G83C0004D410 */ |
222 | { USB_DEVICE(VENDOR_SMK, 0x031d), | 227 | { USB_DEVICE(VENDOR_SMK, 0x031d), |
223 | .driver_info = MCE_GEN2_TX_INV }, | 228 | .driver_info = MCE_GEN2_TX_INV }, |
@@ -1101,7 +1106,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1101 | bool is_gen3; | 1106 | bool is_gen3; |
1102 | bool is_microsoft_gen1; | 1107 | bool is_microsoft_gen1; |
1103 | bool tx_mask_normal; | 1108 | bool tx_mask_normal; |
1104 | bool is_polaris; | 1109 | int ir_intfnum; |
1105 | 1110 | ||
1106 | dev_dbg(&intf->dev, "%s called\n", __func__); | 1111 | dev_dbg(&intf->dev, "%s called\n", __func__); |
1107 | 1112 | ||
@@ -1110,13 +1115,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, | |||
1110 | is_gen3 = mceusb_model[model].mce_gen3; | 1115 | is_gen3 = mceusb_model[model].mce_gen3; |
1111 | is_microsoft_gen1 = mceusb_model[model].mce_gen1; | 1116 | is_microsoft_gen1 = mceusb_model[model].mce_gen1; |
1112 | tx_mask_normal = mceusb_model[model].tx_mask_normal; | 1117 | tx_mask_normal = mceusb_model[model].tx_mask_normal; |
1113 | is_polaris = mceusb_model[model].is_polaris; | 1118 | ir_intfnum = mceusb_model[model].ir_intfnum; |
1114 | 1119 | ||
1115 | if (is_polaris) { | 1120 | /* There are multi-function devices with non-IR interfaces */ |
1116 | /* Interface 0 is IR */ | 1121 | if (idesc->desc.bInterfaceNumber != ir_intfnum) |
1117 | if (idesc->desc.bInterfaceNumber) | 1122 | return -ENODEV; |
1118 | return -ENODEV; | ||
1119 | } | ||
1120 | 1123 | ||
1121 | /* step through the endpoints to find first bulk in and out endpoint */ | 1124 | /* step through the endpoints to find first bulk in and out endpoint */ |
1122 | for (i = 0; i < idesc->desc.bNumEndpoints; ++i) { | 1125 | for (i = 0; i < idesc->desc.bNumEndpoints; ++i) { |
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index 273d9d674792..d4d64492a057 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c | |||
@@ -385,8 +385,9 @@ static void nvt_cir_regs_init(struct nvt_dev *nvt) | |||
385 | 385 | ||
386 | static void nvt_cir_wake_regs_init(struct nvt_dev *nvt) | 386 | static void nvt_cir_wake_regs_init(struct nvt_dev *nvt) |
387 | { | 387 | { |
388 | /* set number of bytes needed for wake key comparison (default 67) */ | 388 | /* set number of bytes needed for wake from s3 (default 65) */ |
389 | nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_LEN, CIR_WAKE_FIFO_CMP_DEEP); | 389 | nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_CMP_BYTES, |
390 | CIR_WAKE_FIFO_CMP_DEEP); | ||
390 | 391 | ||
391 | /* set tolerance/variance allowed per byte during wake compare */ | 392 | /* set tolerance/variance allowed per byte during wake compare */ |
392 | nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE, | 393 | nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE, |
diff --git a/drivers/media/rc/nuvoton-cir.h b/drivers/media/rc/nuvoton-cir.h index 1df82351cb03..048135eea702 100644 --- a/drivers/media/rc/nuvoton-cir.h +++ b/drivers/media/rc/nuvoton-cir.h | |||
@@ -305,8 +305,11 @@ struct nvt_dev { | |||
305 | #define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20 | 305 | #define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20 |
306 | #define CIR_WAKE_IRFIFOSTS_RX_FULL 0x10 | 306 | #define CIR_WAKE_IRFIFOSTS_RX_FULL 0x10 |
307 | 307 | ||
308 | /* CIR Wake FIFO buffer is 67 bytes long */ | 308 | /* |
309 | #define CIR_WAKE_FIFO_LEN 67 | 309 | * The CIR Wake FIFO buffer is 67 bytes long, but the stock remote wakes |
310 | * the system comparing only 65 bytes (fails with this set to 67) | ||
311 | */ | ||
312 | #define CIR_WAKE_FIFO_CMP_BYTES 65 | ||
310 | /* CIR Wake byte comparison tolerance */ | 313 | /* CIR Wake byte comparison tolerance */ |
311 | #define CIR_WAKE_CMP_TOLERANCE 5 | 314 | #define CIR_WAKE_CMP_TOLERANCE 5 |
312 | 315 | ||
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index 512a2f4ada0e..5b4422ef4e6d 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c | |||
@@ -850,7 +850,7 @@ static ssize_t store_protocols(struct device *device, | |||
850 | count++; | 850 | count++; |
851 | } else { | 851 | } else { |
852 | for (i = 0; i < ARRAY_SIZE(proto_names); i++) { | 852 | for (i = 0; i < ARRAY_SIZE(proto_names); i++) { |
853 | if (!strncasecmp(tmp, proto_names[i].name, strlen(proto_names[i].name))) { | 853 | if (!strcasecmp(tmp, proto_names[i].name)) { |
854 | tmp += strlen(proto_names[i].name); | 854 | tmp += strlen(proto_names[i].name); |
855 | mask = proto_names[i].type; | 855 | mask = proto_names[i].type; |
856 | break; | 856 | break; |
diff --git a/drivers/media/video/au0828/au0828-video.c b/drivers/media/video/au0828/au0828-video.c index e41e4ad5cc40..9c475c600fc9 100644 --- a/drivers/media/video/au0828/au0828-video.c +++ b/drivers/media/video/au0828/au0828-video.c | |||
@@ -1758,7 +1758,12 @@ static int vidioc_reqbufs(struct file *file, void *priv, | |||
1758 | if (rc < 0) | 1758 | if (rc < 0) |
1759 | return rc; | 1759 | return rc; |
1760 | 1760 | ||
1761 | return videobuf_reqbufs(&fh->vb_vidq, rb); | 1761 | if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
1762 | rc = videobuf_reqbufs(&fh->vb_vidq, rb); | ||
1763 | else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) | ||
1764 | rc = videobuf_reqbufs(&fh->vb_vbiq, rb); | ||
1765 | |||
1766 | return rc; | ||
1762 | } | 1767 | } |
1763 | 1768 | ||
1764 | static int vidioc_querybuf(struct file *file, void *priv, | 1769 | static int vidioc_querybuf(struct file *file, void *priv, |
@@ -1772,7 +1777,12 @@ static int vidioc_querybuf(struct file *file, void *priv, | |||
1772 | if (rc < 0) | 1777 | if (rc < 0) |
1773 | return rc; | 1778 | return rc; |
1774 | 1779 | ||
1775 | return videobuf_querybuf(&fh->vb_vidq, b); | 1780 | if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
1781 | rc = videobuf_querybuf(&fh->vb_vidq, b); | ||
1782 | else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) | ||
1783 | rc = videobuf_querybuf(&fh->vb_vbiq, b); | ||
1784 | |||
1785 | return rc; | ||
1776 | } | 1786 | } |
1777 | 1787 | ||
1778 | static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 1788 | static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
@@ -1785,7 +1795,12 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) | |||
1785 | if (rc < 0) | 1795 | if (rc < 0) |
1786 | return rc; | 1796 | return rc; |
1787 | 1797 | ||
1788 | return videobuf_qbuf(&fh->vb_vidq, b); | 1798 | if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
1799 | rc = videobuf_qbuf(&fh->vb_vidq, b); | ||
1800 | else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) | ||
1801 | rc = videobuf_qbuf(&fh->vb_vbiq, b); | ||
1802 | |||
1803 | return rc; | ||
1789 | } | 1804 | } |
1790 | 1805 | ||
1791 | static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 1806 | static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
@@ -1806,7 +1821,12 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | |||
1806 | dev->greenscreen_detected = 0; | 1821 | dev->greenscreen_detected = 0; |
1807 | } | 1822 | } |
1808 | 1823 | ||
1809 | return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK); | 1824 | if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
1825 | rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK); | ||
1826 | else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) | ||
1827 | rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK); | ||
1828 | |||
1829 | return rc; | ||
1810 | } | 1830 | } |
1811 | 1831 | ||
1812 | static struct v4l2_file_operations au0828_v4l_fops = { | 1832 | static struct v4l2_file_operations au0828_v4l_fops = { |
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index 87177733cf92..68ad1963f421 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
@@ -95,6 +95,53 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { | |||
95 | .i2c = &cx18_i2c_std, | 95 | .i2c = &cx18_i2c_std, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | static const struct cx18_card cx18_card_hvr1600_s5h1411 = { | ||
99 | .type = CX18_CARD_HVR_1600_S5H1411, | ||
100 | .name = "Hauppauge HVR-1600", | ||
101 | .comment = "Simultaneous Digital and Analog TV capture supported\n", | ||
102 | .v4l2_capabilities = CX18_CAP_ENCODER, | ||
103 | .hw_audio_ctrl = CX18_HW_418_AV, | ||
104 | .hw_muxer = CX18_HW_CS5345, | ||
105 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | | ||
106 | CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL | | ||
107 | CX18_HW_Z8F0811_IR_HAUP, | ||
108 | .video_inputs = { | ||
109 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, | ||
110 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, | ||
111 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, | ||
112 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, | ||
113 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, | ||
114 | }, | ||
115 | .audio_inputs = { | ||
116 | { CX18_CARD_INPUT_AUD_TUNER, | ||
117 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, | ||
118 | { CX18_CARD_INPUT_LINE_IN1, | ||
119 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 }, | ||
120 | { CX18_CARD_INPUT_LINE_IN2, | ||
121 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 }, | ||
122 | }, | ||
123 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | ||
124 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 }, | ||
125 | .ddr = { | ||
126 | /* ESMT M13S128324A-5B memory */ | ||
127 | .chip_config = 0x003, | ||
128 | .refresh = 0x30c, | ||
129 | .timing1 = 0x44220e82, | ||
130 | .timing2 = 0x08, | ||
131 | .tune_lane = 0, | ||
132 | .initial_emrs = 0, | ||
133 | }, | ||
134 | .gpio_init.initial_value = 0x3001, | ||
135 | .gpio_init.direction = 0x3001, | ||
136 | .gpio_i2c_slave_reset = { | ||
137 | .active_lo_mask = 0x3001, | ||
138 | .msecs_asserted = 10, | ||
139 | .msecs_recovery = 40, | ||
140 | .ir_reset_mask = 0x0001, | ||
141 | }, | ||
142 | .i2c = &cx18_i2c_std, | ||
143 | }; | ||
144 | |||
98 | static const struct cx18_card cx18_card_hvr1600_samsung = { | 145 | static const struct cx18_card cx18_card_hvr1600_samsung = { |
99 | .type = CX18_CARD_HVR_1600_SAMSUNG, | 146 | .type = CX18_CARD_HVR_1600_SAMSUNG, |
100 | .name = "Hauppauge HVR-1600 (Preproduction)", | 147 | .name = "Hauppauge HVR-1600 (Preproduction)", |
@@ -523,7 +570,8 @@ static const struct cx18_card *cx18_card_list[] = { | |||
523 | &cx18_card_toshiba_qosmio_dvbt, | 570 | &cx18_card_toshiba_qosmio_dvbt, |
524 | &cx18_card_leadtek_pvr2100, | 571 | &cx18_card_leadtek_pvr2100, |
525 | &cx18_card_leadtek_dvr3100h, | 572 | &cx18_card_leadtek_dvr3100h, |
526 | &cx18_card_gotview_dvd3 | 573 | &cx18_card_gotview_dvd3, |
574 | &cx18_card_hvr1600_s5h1411 | ||
527 | }; | 575 | }; |
528 | 576 | ||
529 | const struct cx18_card *cx18_get_card(u16 index) | 577 | const struct cx18_card *cx18_get_card(u16 index) |
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 944af8adbe0c..b1c3cbd92743 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -157,6 +157,7 @@ MODULE_PARM_DESC(cardtype, | |||
157 | "\t\t\t 7 = Leadtek WinFast PVR2100\n" | 157 | "\t\t\t 7 = Leadtek WinFast PVR2100\n" |
158 | "\t\t\t 8 = Leadtek WinFast DVR3100 H\n" | 158 | "\t\t\t 8 = Leadtek WinFast DVR3100 H\n" |
159 | "\t\t\t 9 = GoTView PCI DVD3 Hybrid\n" | 159 | "\t\t\t 9 = GoTView PCI DVD3 Hybrid\n" |
160 | "\t\t\t 10 = Hauppauge HVR 1600 (S5H1411)\n" | ||
160 | "\t\t\t 0 = Autodetect (default)\n" | 161 | "\t\t\t 0 = Autodetect (default)\n" |
161 | "\t\t\t-1 = Ignore this card\n\t\t"); | 162 | "\t\t\t-1 = Ignore this card\n\t\t"); |
162 | MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60"); | 163 | MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60"); |
@@ -337,6 +338,7 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv) | |||
337 | switch (cx->card->type) { | 338 | switch (cx->card->type) { |
338 | case CX18_CARD_HVR_1600_ESMT: | 339 | case CX18_CARD_HVR_1600_ESMT: |
339 | case CX18_CARD_HVR_1600_SAMSUNG: | 340 | case CX18_CARD_HVR_1600_SAMSUNG: |
341 | case CX18_CARD_HVR_1600_S5H1411: | ||
340 | tveeprom_hauppauge_analog(&c, tv, eedata); | 342 | tveeprom_hauppauge_analog(&c, tv, eedata); |
341 | break; | 343 | break; |
342 | case CX18_CARD_YUAN_MPC718: | 344 | case CX18_CARD_YUAN_MPC718: |
@@ -365,7 +367,25 @@ static void cx18_process_eeprom(struct cx18 *cx) | |||
365 | from the model number. Use the cardtype module option if you | 367 | from the model number. Use the cardtype module option if you |
366 | have one of these preproduction models. */ | 368 | have one of these preproduction models. */ |
367 | switch (tv.model) { | 369 | switch (tv.model) { |
368 | case 74000 ... 74999: | 370 | case 74301: /* Retail models */ |
371 | case 74321: | ||
372 | case 74351: /* OEM models */ | ||
373 | case 74361: | ||
374 | /* Digital side is s5h1411/tda18271 */ | ||
375 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_S5H1411); | ||
376 | break; | ||
377 | case 74021: /* Retail models */ | ||
378 | case 74031: | ||
379 | case 74041: | ||
380 | case 74141: | ||
381 | case 74541: /* OEM models */ | ||
382 | case 74551: | ||
383 | case 74591: | ||
384 | case 74651: | ||
385 | case 74691: | ||
386 | case 74751: | ||
387 | case 74891: | ||
388 | /* Digital side is s5h1409/mxl5005s */ | ||
369 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); | 389 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); |
370 | break; | 390 | break; |
371 | case 0x718: | 391 | case 0x718: |
@@ -377,7 +397,8 @@ static void cx18_process_eeprom(struct cx18 *cx) | |||
377 | CX18_ERR("Invalid EEPROM\n"); | 397 | CX18_ERR("Invalid EEPROM\n"); |
378 | return; | 398 | return; |
379 | default: | 399 | default: |
380 | CX18_ERR("Unknown model %d, defaulting to HVR-1600\n", tv.model); | 400 | CX18_ERR("Unknown model %d, defaulting to original HVR-1600 " |
401 | "(cardtype=1)\n", tv.model); | ||
381 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); | 402 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); |
382 | break; | 403 | break; |
383 | } | 404 | } |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index 306caac6d3fc..f736679d2517 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
@@ -85,7 +85,8 @@ | |||
85 | #define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */ | 85 | #define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */ |
86 | #define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */ | 86 | #define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */ |
87 | #define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */ | 87 | #define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */ |
88 | #define CX18_CARD_LAST 8 | 88 | #define CX18_CARD_HVR_1600_S5H1411 9 /* Hauppauge HVR 1600 s5h1411/tda18271*/ |
89 | #define CX18_CARD_LAST 9 | ||
89 | 90 | ||
90 | #define CX18_ENC_STREAM_TYPE_MPG 0 | 91 | #define CX18_ENC_STREAM_TYPE_MPG 0 |
91 | #define CX18_ENC_STREAM_TYPE_TS 1 | 92 | #define CX18_ENC_STREAM_TYPE_TS 1 |
diff --git a/drivers/media/video/cx18/cx18-dvb.c b/drivers/media/video/cx18/cx18-dvb.c index f0381d62518d..f41922bd4020 100644 --- a/drivers/media/video/cx18/cx18-dvb.c +++ b/drivers/media/video/cx18/cx18-dvb.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include "cx18-gpio.h" | 29 | #include "cx18-gpio.h" |
30 | #include "s5h1409.h" | 30 | #include "s5h1409.h" |
31 | #include "mxl5005s.h" | 31 | #include "mxl5005s.h" |
32 | #include "s5h1411.h" | ||
33 | #include "tda18271.h" | ||
32 | #include "zl10353.h" | 34 | #include "zl10353.h" |
33 | 35 | ||
34 | #include <linux/firmware.h> | 36 | #include <linux/firmware.h> |
@@ -77,6 +79,32 @@ static struct s5h1409_config hauppauge_hvr1600_config = { | |||
77 | }; | 79 | }; |
78 | 80 | ||
79 | /* | 81 | /* |
82 | * CX18_CARD_HVR_1600_S5H1411 | ||
83 | */ | ||
84 | static struct s5h1411_config hcw_s5h1411_config = { | ||
85 | .output_mode = S5H1411_SERIAL_OUTPUT, | ||
86 | .gpio = S5H1411_GPIO_OFF, | ||
87 | .vsb_if = S5H1411_IF_44000, | ||
88 | .qam_if = S5H1411_IF_4000, | ||
89 | .inversion = S5H1411_INVERSION_ON, | ||
90 | .status_mode = S5H1411_DEMODLOCKING, | ||
91 | .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, | ||
92 | }; | ||
93 | |||
94 | static struct tda18271_std_map hauppauge_tda18271_std_map = { | ||
95 | .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, | ||
96 | .if_lvl = 6, .rfagc_top = 0x37 }, | ||
97 | .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, | ||
98 | .if_lvl = 6, .rfagc_top = 0x37 }, | ||
99 | }; | ||
100 | |||
101 | static struct tda18271_config hauppauge_tda18271_config = { | ||
102 | .std_map = &hauppauge_tda18271_std_map, | ||
103 | .gate = TDA18271_GATE_DIGITAL, | ||
104 | .output_opt = TDA18271_OUTPUT_LT_OFF, | ||
105 | }; | ||
106 | |||
107 | /* | ||
80 | * CX18_CARD_LEADTEK_DVR3100H | 108 | * CX18_CARD_LEADTEK_DVR3100H |
81 | */ | 109 | */ |
82 | /* Information/confirmation of proper config values provided by Terry Wu */ | 110 | /* Information/confirmation of proper config values provided by Terry Wu */ |
@@ -244,6 +272,7 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) | |||
244 | switch (cx->card->type) { | 272 | switch (cx->card->type) { |
245 | case CX18_CARD_HVR_1600_ESMT: | 273 | case CX18_CARD_HVR_1600_ESMT: |
246 | case CX18_CARD_HVR_1600_SAMSUNG: | 274 | case CX18_CARD_HVR_1600_SAMSUNG: |
275 | case CX18_CARD_HVR_1600_S5H1411: | ||
247 | v = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL); | 276 | v = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL); |
248 | v |= 0x00400000; /* Serial Mode */ | 277 | v |= 0x00400000; /* Serial Mode */ |
249 | v |= 0x00002000; /* Data Length - Byte */ | 278 | v |= 0x00002000; /* Data Length - Byte */ |
@@ -455,6 +484,15 @@ static int dvb_register(struct cx18_stream *stream) | |||
455 | ret = 0; | 484 | ret = 0; |
456 | } | 485 | } |
457 | break; | 486 | break; |
487 | case CX18_CARD_HVR_1600_S5H1411: | ||
488 | dvb->fe = dvb_attach(s5h1411_attach, | ||
489 | &hcw_s5h1411_config, | ||
490 | &cx->i2c_adap[0]); | ||
491 | if (dvb->fe != NULL) | ||
492 | dvb_attach(tda18271_attach, dvb->fe, | ||
493 | 0x60, &cx->i2c_adap[0], | ||
494 | &hauppauge_tda18271_config); | ||
495 | break; | ||
458 | case CX18_CARD_LEADTEK_DVR3100H: | 496 | case CX18_CARD_LEADTEK_DVR3100H: |
459 | dvb->fe = dvb_attach(zl10353_attach, | 497 | dvb->fe = dvb_attach(zl10353_attach, |
460 | &leadtek_dvr3100h_demod, | 498 | &leadtek_dvr3100h_demod, |
diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c index ed3d8f55029b..307ff543c254 100644 --- a/drivers/media/video/cx23885/cx23885-i2c.c +++ b/drivers/media/video/cx23885/cx23885-i2c.c | |||
@@ -122,10 +122,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, | |||
122 | 122 | ||
123 | if (!i2c_wait_done(i2c_adap)) | 123 | if (!i2c_wait_done(i2c_adap)) |
124 | goto eio; | 124 | goto eio; |
125 | if (!i2c_slave_did_ack(i2c_adap)) { | ||
126 | retval = -ENXIO; | ||
127 | goto err; | ||
128 | } | ||
129 | if (i2c_debug) { | 125 | if (i2c_debug) { |
130 | printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]); | 126 | printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]); |
131 | if (!(ctrl & I2C_NOSTOP)) | 127 | if (!(ctrl & I2C_NOSTOP)) |
@@ -158,7 +154,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, | |||
158 | 154 | ||
159 | eio: | 155 | eio: |
160 | retval = -EIO; | 156 | retval = -EIO; |
161 | err: | ||
162 | if (i2c_debug) | 157 | if (i2c_debug) |
163 | printk(KERN_ERR " ERR: %d\n", retval); | 158 | printk(KERN_ERR " ERR: %d\n", retval); |
164 | return retval; | 159 | return retval; |
@@ -209,10 +204,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, | |||
209 | 204 | ||
210 | if (!i2c_wait_done(i2c_adap)) | 205 | if (!i2c_wait_done(i2c_adap)) |
211 | goto eio; | 206 | goto eio; |
212 | if (cnt == 0 && !i2c_slave_did_ack(i2c_adap)) { | ||
213 | retval = -ENXIO; | ||
214 | goto err; | ||
215 | } | ||
216 | msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; | 207 | msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; |
217 | if (i2c_debug) { | 208 | if (i2c_debug) { |
218 | dprintk(1, " %02x", msg->buf[cnt]); | 209 | dprintk(1, " %02x", msg->buf[cnt]); |
@@ -224,7 +215,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, | |||
224 | 215 | ||
225 | eio: | 216 | eio: |
226 | retval = -EIO; | 217 | retval = -EIO; |
227 | err: | ||
228 | if (i2c_debug) | 218 | if (i2c_debug) |
229 | printk(KERN_ERR " ERR: %d\n", retval); | 219 | printk(KERN_ERR " ERR: %d\n", retval); |
230 | return retval; | 220 | return retval; |
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c index 6fc09dd41b9d..35796e035247 100644 --- a/drivers/media/video/cx25840/cx25840-core.c +++ b/drivers/media/video/cx25840/cx25840-core.c | |||
@@ -2015,7 +2015,8 @@ static int cx25840_probe(struct i2c_client *client, | |||
2015 | kfree(state); | 2015 | kfree(state); |
2016 | return err; | 2016 | return err; |
2017 | } | 2017 | } |
2018 | v4l2_ctrl_cluster(2, &state->volume); | 2018 | if (!is_cx2583x(state)) |
2019 | v4l2_ctrl_cluster(2, &state->volume); | ||
2019 | v4l2_ctrl_handler_setup(&state->hdl); | 2020 | v4l2_ctrl_handler_setup(&state->hdl); |
2020 | 2021 | ||
2021 | if (client->dev.platform_data) { | 2022 | if (client->dev.platform_data) { |
diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c index 9b4faf009196..9c29e964d400 100644 --- a/drivers/media/video/ivtv/ivtv-irq.c +++ b/drivers/media/video/ivtv/ivtv-irq.c | |||
@@ -628,22 +628,66 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv) | |||
628 | static void ivtv_irq_dma_err(struct ivtv *itv) | 628 | static void ivtv_irq_dma_err(struct ivtv *itv) |
629 | { | 629 | { |
630 | u32 data[CX2341X_MBOX_MAX_DATA]; | 630 | u32 data[CX2341X_MBOX_MAX_DATA]; |
631 | u32 status; | ||
631 | 632 | ||
632 | del_timer(&itv->dma_timer); | 633 | del_timer(&itv->dma_timer); |
634 | |||
633 | ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); | 635 | ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); |
636 | status = read_reg(IVTV_REG_DMASTATUS); | ||
634 | IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1], | 637 | IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1], |
635 | read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream); | 638 | status, itv->cur_dma_stream); |
636 | write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS); | 639 | /* |
640 | * We do *not* write back to the IVTV_REG_DMASTATUS register to | ||
641 | * clear the error status, if either the encoder write (0x02) or | ||
642 | * decoder read (0x01) bus master DMA operation do not indicate | ||
643 | * completed. We can race with the DMA engine, which may have | ||
644 | * transitioned to completed status *after* we read the register. | ||
645 | * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the | ||
646 | * DMA engine has completed, will cause the DMA engine to stop working. | ||
647 | */ | ||
648 | status &= 0x3; | ||
649 | if (status == 0x3) | ||
650 | write_reg(status, IVTV_REG_DMASTATUS); | ||
651 | |||
637 | if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && | 652 | if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && |
638 | itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) { | 653 | itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) { |
639 | struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream]; | 654 | struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream]; |
640 | 655 | ||
641 | /* retry */ | 656 | if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) { |
642 | if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) | 657 | /* retry */ |
658 | /* | ||
659 | * FIXME - handle cases of DMA error similar to | ||
660 | * encoder below, except conditioned on status & 0x1 | ||
661 | */ | ||
643 | ivtv_dma_dec_start(s); | 662 | ivtv_dma_dec_start(s); |
644 | else | 663 | return; |
645 | ivtv_dma_enc_start(s); | 664 | } else { |
646 | return; | 665 | if ((status & 0x2) == 0) { |
666 | /* | ||
667 | * CX2341x Bus Master DMA write is ongoing. | ||
668 | * Reset the timer and let it complete. | ||
669 | */ | ||
670 | itv->dma_timer.expires = | ||
671 | jiffies + msecs_to_jiffies(600); | ||
672 | add_timer(&itv->dma_timer); | ||
673 | return; | ||
674 | } | ||
675 | |||
676 | if (itv->dma_retries < 3) { | ||
677 | /* | ||
678 | * CX2341x Bus Master DMA write has ended. | ||
679 | * Retry the write, starting with the first | ||
680 | * xfer segment. Just retrying the current | ||
681 | * segment is not sufficient. | ||
682 | */ | ||
683 | s->sg_processed = 0; | ||
684 | itv->dma_retries++; | ||
685 | ivtv_dma_enc_start_xfer(s); | ||
686 | return; | ||
687 | } | ||
688 | /* Too many retries, give up on this one */ | ||
689 | } | ||
690 | |||
647 | } | 691 | } |
648 | if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) { | 692 | if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) { |
649 | ivtv_udma_start(itv); | 693 | ivtv_udma_start(itv); |
diff --git a/drivers/media/video/mem2mem_testdev.c b/drivers/media/video/mem2mem_testdev.c index c179041d91f8..e7e717800ee2 100644 --- a/drivers/media/video/mem2mem_testdev.c +++ b/drivers/media/video/mem2mem_testdev.c | |||
@@ -1011,7 +1011,6 @@ static int m2mtest_remove(struct platform_device *pdev) | |||
1011 | v4l2_m2m_release(dev->m2m_dev); | 1011 | v4l2_m2m_release(dev->m2m_dev); |
1012 | del_timer_sync(&dev->timer); | 1012 | del_timer_sync(&dev->timer); |
1013 | video_unregister_device(dev->vfd); | 1013 | video_unregister_device(dev->vfd); |
1014 | video_device_release(dev->vfd); | ||
1015 | v4l2_device_unregister(&dev->v4l2_dev); | 1014 | v4l2_device_unregister(&dev->v4l2_dev); |
1016 | kfree(dev); | 1015 | kfree(dev); |
1017 | 1016 | ||
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index b63f8cafa671..561909b65ce6 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c | |||
@@ -57,7 +57,7 @@ | |||
57 | #include <linux/usb.h> | 57 | #include <linux/usb.h> |
58 | 58 | ||
59 | #define S2255_MAJOR_VERSION 1 | 59 | #define S2255_MAJOR_VERSION 1 |
60 | #define S2255_MINOR_VERSION 20 | 60 | #define S2255_MINOR_VERSION 21 |
61 | #define S2255_RELEASE 0 | 61 | #define S2255_RELEASE 0 |
62 | #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \ | 62 | #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \ |
63 | S2255_MINOR_VERSION, \ | 63 | S2255_MINOR_VERSION, \ |
@@ -312,9 +312,9 @@ struct s2255_fh { | |||
312 | }; | 312 | }; |
313 | 313 | ||
314 | /* current cypress EEPROM firmware version */ | 314 | /* current cypress EEPROM firmware version */ |
315 | #define S2255_CUR_USB_FWVER ((3 << 8) | 6) | 315 | #define S2255_CUR_USB_FWVER ((3 << 8) | 11) |
316 | /* current DSP FW version */ | 316 | /* current DSP FW version */ |
317 | #define S2255_CUR_DSP_FWVER 8 | 317 | #define S2255_CUR_DSP_FWVER 10102 |
318 | /* Need DSP version 5+ for video status feature */ | 318 | /* Need DSP version 5+ for video status feature */ |
319 | #define S2255_MIN_DSP_STATUS 5 | 319 | #define S2255_MIN_DSP_STATUS 5 |
320 | #define S2255_MIN_DSP_COLORFILTER 8 | 320 | #define S2255_MIN_DSP_COLORFILTER 8 |
@@ -492,9 +492,11 @@ static void planar422p_to_yuv_packed(const unsigned char *in, | |||
492 | 492 | ||
493 | static void s2255_reset_dsppower(struct s2255_dev *dev) | 493 | static void s2255_reset_dsppower(struct s2255_dev *dev) |
494 | { | 494 | { |
495 | s2255_vendor_req(dev, 0x40, 0x0b0b, 0x0b0b, NULL, 0, 1); | 495 | s2255_vendor_req(dev, 0x40, 0x0b0b, 0x0b01, NULL, 0, 1); |
496 | msleep(10); | 496 | msleep(10); |
497 | s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1); | 497 | s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1); |
498 | msleep(600); | ||
499 | s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1); | ||
498 | return; | 500 | return; |
499 | } | 501 | } |
500 | 502 | ||
diff --git a/drivers/misc/bmp085.c b/drivers/misc/bmp085.c index 63ee4c1a5315..b6e1c9a6679e 100644 --- a/drivers/misc/bmp085.c +++ b/drivers/misc/bmp085.c | |||
@@ -449,6 +449,7 @@ static const struct i2c_device_id bmp085_id[] = { | |||
449 | { "bmp085", 0 }, | 449 | { "bmp085", 0 }, |
450 | { } | 450 | { } |
451 | }; | 451 | }; |
452 | MODULE_DEVICE_TABLE(i2c, bmp085_id); | ||
452 | 453 | ||
453 | static struct i2c_driver bmp085_driver = { | 454 | static struct i2c_driver bmp085_driver = { |
454 | .driver = { | 455 | .driver = { |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 6625c057be05..150b5f3cd401 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -1529,7 +1529,7 @@ void mmc_rescan(struct work_struct *work) | |||
1529 | * still present | 1529 | * still present |
1530 | */ | 1530 | */ |
1531 | if (host->bus_ops && host->bus_ops->detect && !host->bus_dead | 1531 | if (host->bus_ops && host->bus_ops->detect && !host->bus_dead |
1532 | && mmc_card_is_removable(host)) | 1532 | && !(host->caps & MMC_CAP_NONREMOVABLE)) |
1533 | host->bus_ops->detect(host); | 1533 | host->bus_ops->detect(host); |
1534 | 1534 | ||
1535 | /* | 1535 | /* |
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 5c4a54d9b6a4..ebc62ad4cc56 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
@@ -792,7 +792,6 @@ int mmc_attach_sdio(struct mmc_host *host) | |||
792 | */ | 792 | */ |
793 | mmc_release_host(host); | 793 | mmc_release_host(host); |
794 | err = mmc_add_card(host->card); | 794 | err = mmc_add_card(host->card); |
795 | mmc_claim_host(host); | ||
796 | if (err) | 795 | if (err) |
797 | goto remove_added; | 796 | goto remove_added; |
798 | 797 | ||
@@ -805,12 +804,12 @@ int mmc_attach_sdio(struct mmc_host *host) | |||
805 | goto remove_added; | 804 | goto remove_added; |
806 | } | 805 | } |
807 | 806 | ||
807 | mmc_claim_host(host); | ||
808 | return 0; | 808 | return 0; |
809 | 809 | ||
810 | 810 | ||
811 | remove_added: | 811 | remove_added: |
812 | /* Remove without lock if the device has been added. */ | 812 | /* Remove without lock if the device has been added. */ |
813 | mmc_release_host(host); | ||
814 | mmc_sdio_remove(host); | 813 | mmc_sdio_remove(host); |
815 | mmc_claim_host(host); | 814 | mmc_claim_host(host); |
816 | remove: | 815 | remove: |
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index 50d1e0793091..b7ff87b35fbb 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h | |||
@@ -1223,6 +1223,7 @@ struct bnx2x { | |||
1223 | /* DCBX Negotation results */ | 1223 | /* DCBX Negotation results */ |
1224 | struct dcbx_features dcbx_local_feat; | 1224 | struct dcbx_features dcbx_local_feat; |
1225 | u32 dcbx_error; | 1225 | u32 dcbx_error; |
1226 | u32 pending_max; | ||
1226 | }; | 1227 | }; |
1227 | 1228 | ||
1228 | /** | 1229 | /** |
@@ -1634,8 +1635,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, | |||
1634 | /* CMNG constants, as derived from system spec calculations */ | 1635 | /* CMNG constants, as derived from system spec calculations */ |
1635 | /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ | 1636 | /* default MIN rate in case VNIC min rate is configured to zero - 100Mbps */ |
1636 | #define DEF_MIN_RATE 100 | 1637 | #define DEF_MIN_RATE 100 |
1637 | /* resolution of the rate shaping timer - 100 usec */ | 1638 | /* resolution of the rate shaping timer - 400 usec */ |
1638 | #define RS_PERIODIC_TIMEOUT_USEC 100 | 1639 | #define RS_PERIODIC_TIMEOUT_USEC 400 |
1639 | /* number of bytes in single QM arbitration cycle - | 1640 | /* number of bytes in single QM arbitration cycle - |
1640 | * coefficient for calculating the fairness timer */ | 1641 | * coefficient for calculating the fairness timer */ |
1641 | #define QM_ARB_BYTES 160000 | 1642 | #define QM_ARB_BYTES 160000 |
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index b01b622f4e13..e83ac6dd6fc0 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
@@ -993,6 +993,23 @@ void bnx2x_free_skbs(struct bnx2x *bp) | |||
993 | bnx2x_free_rx_skbs(bp); | 993 | bnx2x_free_rx_skbs(bp); |
994 | } | 994 | } |
995 | 995 | ||
996 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value) | ||
997 | { | ||
998 | /* load old values */ | ||
999 | u32 mf_cfg = bp->mf_config[BP_VN(bp)]; | ||
1000 | |||
1001 | if (value != bnx2x_extract_max_cfg(bp, mf_cfg)) { | ||
1002 | /* leave all but MAX value */ | ||
1003 | mf_cfg &= ~FUNC_MF_CFG_MAX_BW_MASK; | ||
1004 | |||
1005 | /* set new MAX value */ | ||
1006 | mf_cfg |= (value << FUNC_MF_CFG_MAX_BW_SHIFT) | ||
1007 | & FUNC_MF_CFG_MAX_BW_MASK; | ||
1008 | |||
1009 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, mf_cfg); | ||
1010 | } | ||
1011 | } | ||
1012 | |||
996 | static void bnx2x_free_msix_irqs(struct bnx2x *bp) | 1013 | static void bnx2x_free_msix_irqs(struct bnx2x *bp) |
997 | { | 1014 | { |
998 | int i, offset = 1; | 1015 | int i, offset = 1; |
@@ -1498,6 +1515,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1498 | /* Clear UC lists configuration */ | 1515 | /* Clear UC lists configuration */ |
1499 | bnx2x_invalidate_uc_list(bp); | 1516 | bnx2x_invalidate_uc_list(bp); |
1500 | 1517 | ||
1518 | if (bp->pending_max) { | ||
1519 | bnx2x_update_max_mf_config(bp, bp->pending_max); | ||
1520 | bp->pending_max = 0; | ||
1521 | } | ||
1522 | |||
1501 | if (bp->port.pmf) | 1523 | if (bp->port.pmf) |
1502 | bnx2x_initial_phy_init(bp, load_mode); | 1524 | bnx2x_initial_phy_init(bp, load_mode); |
1503 | 1525 | ||
diff --git a/drivers/net/bnx2x/bnx2x_cmn.h b/drivers/net/bnx2x/bnx2x_cmn.h index 8c401c990bf2..ef37b98d6146 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.h +++ b/drivers/net/bnx2x/bnx2x_cmn.h | |||
@@ -341,6 +341,15 @@ void bnx2x_dcbx_init(struct bnx2x *bp); | |||
341 | */ | 341 | */ |
342 | int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state); | 342 | int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state); |
343 | 343 | ||
344 | /** | ||
345 | * Updates MAX part of MF configuration in HW | ||
346 | * (if required) | ||
347 | * | ||
348 | * @param bp | ||
349 | * @param value | ||
350 | */ | ||
351 | void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value); | ||
352 | |||
344 | /* dev_close main block */ | 353 | /* dev_close main block */ |
345 | int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); | 354 | int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); |
346 | 355 | ||
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index 85291d8b3329..f5050155c6b5 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c | |||
@@ -238,7 +238,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
238 | speed |= (cmd->speed_hi << 16); | 238 | speed |= (cmd->speed_hi << 16); |
239 | 239 | ||
240 | if (IS_MF_SI(bp)) { | 240 | if (IS_MF_SI(bp)) { |
241 | u32 param = 0, part; | 241 | u32 part; |
242 | u32 line_speed = bp->link_vars.line_speed; | 242 | u32 line_speed = bp->link_vars.line_speed; |
243 | 243 | ||
244 | /* use 10G if no link detected */ | 244 | /* use 10G if no link detected */ |
@@ -251,24 +251,22 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
251 | REQ_BC_VER_4_SET_MF_BW); | 251 | REQ_BC_VER_4_SET_MF_BW); |
252 | return -EINVAL; | 252 | return -EINVAL; |
253 | } | 253 | } |
254 | |||
254 | part = (speed * 100) / line_speed; | 255 | part = (speed * 100) / line_speed; |
256 | |||
255 | if (line_speed < speed || !part) { | 257 | if (line_speed < speed || !part) { |
256 | BNX2X_DEV_INFO("Speed setting should be in a range " | 258 | BNX2X_DEV_INFO("Speed setting should be in a range " |
257 | "from 1%% to 100%% " | 259 | "from 1%% to 100%% " |
258 | "of actual line speed\n"); | 260 | "of actual line speed\n"); |
259 | return -EINVAL; | 261 | return -EINVAL; |
260 | } | 262 | } |
261 | /* load old values */ | ||
262 | param = bp->mf_config[BP_VN(bp)]; | ||
263 | 263 | ||
264 | /* leave only MIN value */ | 264 | if (bp->state != BNX2X_STATE_OPEN) |
265 | param &= FUNC_MF_CFG_MIN_BW_MASK; | 265 | /* store value for following "load" */ |
266 | 266 | bp->pending_max = part; | |
267 | /* set new MAX value */ | 267 | else |
268 | param |= (part << FUNC_MF_CFG_MAX_BW_SHIFT) | 268 | bnx2x_update_max_mf_config(bp, part); |
269 | & FUNC_MF_CFG_MAX_BW_MASK; | ||
270 | 269 | ||
271 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); | ||
272 | return 0; | 270 | return 0; |
273 | } | 271 | } |
274 | 272 | ||
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 30b21d2f26f6..bba21d5f708b 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
@@ -2092,8 +2092,9 @@ static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type) | |||
2092 | bnx2x_calc_vn_weight_sum(bp); | 2092 | bnx2x_calc_vn_weight_sum(bp); |
2093 | 2093 | ||
2094 | /* calculate and set min-max rate for each vn */ | 2094 | /* calculate and set min-max rate for each vn */ |
2095 | for (vn = VN_0; vn < E1HVN_MAX; vn++) | 2095 | if (bp->port.pmf) |
2096 | bnx2x_init_vn_minmax(bp, vn); | 2096 | for (vn = VN_0; vn < E1HVN_MAX; vn++) |
2097 | bnx2x_init_vn_minmax(bp, vn); | ||
2097 | 2098 | ||
2098 | /* always enable rate shaping and fairness */ | 2099 | /* always enable rate shaping and fairness */ |
2099 | bp->cmng.flags.cmng_enables |= | 2100 | bp->cmng.flags.cmng_enables |= |
@@ -2162,13 +2163,6 @@ static void bnx2x_link_attn(struct bnx2x *bp) | |||
2162 | bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); | 2163 | bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); |
2163 | } | 2164 | } |
2164 | 2165 | ||
2165 | /* indicate link status only if link status actually changed */ | ||
2166 | if (prev_link_status != bp->link_vars.link_status) | ||
2167 | bnx2x_link_report(bp); | ||
2168 | |||
2169 | if (IS_MF(bp)) | ||
2170 | bnx2x_link_sync_notify(bp); | ||
2171 | |||
2172 | if (bp->link_vars.link_up && bp->link_vars.line_speed) { | 2166 | if (bp->link_vars.link_up && bp->link_vars.line_speed) { |
2173 | int cmng_fns = bnx2x_get_cmng_fns_mode(bp); | 2167 | int cmng_fns = bnx2x_get_cmng_fns_mode(bp); |
2174 | 2168 | ||
@@ -2180,6 +2174,13 @@ static void bnx2x_link_attn(struct bnx2x *bp) | |||
2180 | DP(NETIF_MSG_IFUP, | 2174 | DP(NETIF_MSG_IFUP, |
2181 | "single function mode without fairness\n"); | 2175 | "single function mode without fairness\n"); |
2182 | } | 2176 | } |
2177 | |||
2178 | if (IS_MF(bp)) | ||
2179 | bnx2x_link_sync_notify(bp); | ||
2180 | |||
2181 | /* indicate link status only if link status actually changed */ | ||
2182 | if (prev_link_status != bp->link_vars.link_status) | ||
2183 | bnx2x_link_report(bp); | ||
2183 | } | 2184 | } |
2184 | 2185 | ||
2185 | void bnx2x__link_status_update(struct bnx2x *bp) | 2186 | void bnx2x__link_status_update(struct bnx2x *bp) |
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 1024ae158227..a5d5d0b5b155 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
@@ -281,23 +281,23 @@ static inline int __check_agg_selection_timer(struct port *port) | |||
281 | } | 281 | } |
282 | 282 | ||
283 | /** | 283 | /** |
284 | * __get_rx_machine_lock - lock the port's RX machine | 284 | * __get_state_machine_lock - lock the port's state machines |
285 | * @port: the port we're looking at | 285 | * @port: the port we're looking at |
286 | * | 286 | * |
287 | */ | 287 | */ |
288 | static inline void __get_rx_machine_lock(struct port *port) | 288 | static inline void __get_state_machine_lock(struct port *port) |
289 | { | 289 | { |
290 | spin_lock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 290 | spin_lock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
291 | } | 291 | } |
292 | 292 | ||
293 | /** | 293 | /** |
294 | * __release_rx_machine_lock - unlock the port's RX machine | 294 | * __release_state_machine_lock - unlock the port's state machines |
295 | * @port: the port we're looking at | 295 | * @port: the port we're looking at |
296 | * | 296 | * |
297 | */ | 297 | */ |
298 | static inline void __release_rx_machine_lock(struct port *port) | 298 | static inline void __release_state_machine_lock(struct port *port) |
299 | { | 299 | { |
300 | spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 300 | spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
301 | } | 301 | } |
302 | 302 | ||
303 | /** | 303 | /** |
@@ -388,14 +388,14 @@ static u8 __get_duplex(struct port *port) | |||
388 | } | 388 | } |
389 | 389 | ||
390 | /** | 390 | /** |
391 | * __initialize_port_locks - initialize a port's RX machine spinlock | 391 | * __initialize_port_locks - initialize a port's STATE machine spinlock |
392 | * @port: the port we're looking at | 392 | * @port: the port we're looking at |
393 | * | 393 | * |
394 | */ | 394 | */ |
395 | static inline void __initialize_port_locks(struct port *port) | 395 | static inline void __initialize_port_locks(struct port *port) |
396 | { | 396 | { |
397 | // make sure it isn't called twice | 397 | // make sure it isn't called twice |
398 | spin_lock_init(&(SLAVE_AD_INFO(port->slave).rx_machine_lock)); | 398 | spin_lock_init(&(SLAVE_AD_INFO(port->slave).state_machine_lock)); |
399 | } | 399 | } |
400 | 400 | ||
401 | //conversions | 401 | //conversions |
@@ -1025,9 +1025,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
1025 | { | 1025 | { |
1026 | rx_states_t last_state; | 1026 | rx_states_t last_state; |
1027 | 1027 | ||
1028 | // Lock to prevent 2 instances of this function to run simultaneously(rx interrupt and periodic machine callback) | ||
1029 | __get_rx_machine_lock(port); | ||
1030 | |||
1031 | // keep current State Machine state to compare later if it was changed | 1028 | // keep current State Machine state to compare later if it was changed |
1032 | last_state = port->sm_rx_state; | 1029 | last_state = port->sm_rx_state; |
1033 | 1030 | ||
@@ -1133,7 +1130,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
1133 | pr_err("%s: An illegal loopback occurred on adapter (%s).\n" | 1130 | pr_err("%s: An illegal loopback occurred on adapter (%s).\n" |
1134 | "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", | 1131 | "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", |
1135 | port->slave->dev->master->name, port->slave->dev->name); | 1132 | port->slave->dev->master->name, port->slave->dev->name); |
1136 | __release_rx_machine_lock(port); | ||
1137 | return; | 1133 | return; |
1138 | } | 1134 | } |
1139 | __update_selected(lacpdu, port); | 1135 | __update_selected(lacpdu, port); |
@@ -1153,7 +1149,6 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port) | |||
1153 | break; | 1149 | break; |
1154 | } | 1150 | } |
1155 | } | 1151 | } |
1156 | __release_rx_machine_lock(port); | ||
1157 | } | 1152 | } |
1158 | 1153 | ||
1159 | /** | 1154 | /** |
@@ -2155,6 +2150,12 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
2155 | goto re_arm; | 2150 | goto re_arm; |
2156 | } | 2151 | } |
2157 | 2152 | ||
2153 | /* Lock around state machines to protect data accessed | ||
2154 | * by all (e.g., port->sm_vars). ad_rx_machine may run | ||
2155 | * concurrently due to incoming LACPDU. | ||
2156 | */ | ||
2157 | __get_state_machine_lock(port); | ||
2158 | |||
2158 | ad_rx_machine(NULL, port); | 2159 | ad_rx_machine(NULL, port); |
2159 | ad_periodic_machine(port); | 2160 | ad_periodic_machine(port); |
2160 | ad_port_selection_logic(port); | 2161 | ad_port_selection_logic(port); |
@@ -2164,6 +2165,8 @@ void bond_3ad_state_machine_handler(struct work_struct *work) | |||
2164 | // turn off the BEGIN bit, since we already handled it | 2165 | // turn off the BEGIN bit, since we already handled it |
2165 | if (port->sm_vars & AD_PORT_BEGIN) | 2166 | if (port->sm_vars & AD_PORT_BEGIN) |
2166 | port->sm_vars &= ~AD_PORT_BEGIN; | 2167 | port->sm_vars &= ~AD_PORT_BEGIN; |
2168 | |||
2169 | __release_state_machine_lock(port); | ||
2167 | } | 2170 | } |
2168 | 2171 | ||
2169 | re_arm: | 2172 | re_arm: |
@@ -2200,7 +2203,10 @@ static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u | |||
2200 | case AD_TYPE_LACPDU: | 2203 | case AD_TYPE_LACPDU: |
2201 | pr_debug("Received LACPDU on port %d\n", | 2204 | pr_debug("Received LACPDU on port %d\n", |
2202 | port->actor_port_number); | 2205 | port->actor_port_number); |
2206 | /* Protect against concurrent state machines */ | ||
2207 | __get_state_machine_lock(port); | ||
2203 | ad_rx_machine(lacpdu, port); | 2208 | ad_rx_machine(lacpdu, port); |
2209 | __release_state_machine_lock(port); | ||
2204 | break; | 2210 | break; |
2205 | 2211 | ||
2206 | case AD_TYPE_MARKER: | 2212 | case AD_TYPE_MARKER: |
diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 2c46a154f2c6..b28baff70864 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h | |||
@@ -264,7 +264,8 @@ struct ad_bond_info { | |||
264 | struct ad_slave_info { | 264 | struct ad_slave_info { |
265 | struct aggregator aggregator; // 802.3ad aggregator structure | 265 | struct aggregator aggregator; // 802.3ad aggregator structure |
266 | struct port port; // 802.3ad port structure | 266 | struct port port; // 802.3ad port structure |
267 | spinlock_t rx_machine_lock; // To avoid race condition between callback and receive interrupt | 267 | spinlock_t state_machine_lock; /* mutex state machines vs. |
268 | incoming LACPDU */ | ||
268 | u16 id; | 269 | u16 id; |
269 | }; | 270 | }; |
270 | 271 | ||
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 2300e4599520..6696e56e6320 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -530,8 +530,9 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, | |||
530 | vnet_hdr_len = q->vnet_hdr_sz; | 530 | vnet_hdr_len = q->vnet_hdr_sz; |
531 | 531 | ||
532 | err = -EINVAL; | 532 | err = -EINVAL; |
533 | if ((len -= vnet_hdr_len) < 0) | 533 | if (len < vnet_hdr_len) |
534 | goto err; | 534 | goto err; |
535 | len -= vnet_hdr_len; | ||
535 | 536 | ||
536 | err = memcpy_fromiovecend((void *)&vnet_hdr, iv, 0, | 537 | err = memcpy_fromiovecend((void *)&vnet_hdr, iv, 0, |
537 | sizeof(vnet_hdr)); | 538 | sizeof(vnet_hdr)); |
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 64bfdae5956f..d70bde95460b 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c | |||
@@ -1178,6 +1178,11 @@ static int smsc911x_open(struct net_device *dev) | |||
1178 | smsc911x_reg_write(pdata, HW_CFG, 0x00050000); | 1178 | smsc911x_reg_write(pdata, HW_CFG, 0x00050000); |
1179 | smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); | 1179 | smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); |
1180 | 1180 | ||
1181 | /* Increase the legal frame size of VLAN tagged frames to 1522 bytes */ | ||
1182 | spin_lock_irq(&pdata->mac_lock); | ||
1183 | smsc911x_mac_write(pdata, VLAN1, ETH_P_8021Q); | ||
1184 | spin_unlock_irq(&pdata->mac_lock); | ||
1185 | |||
1181 | /* Make sure EEPROM has finished loading before setting GPIO_CFG */ | 1186 | /* Make sure EEPROM has finished loading before setting GPIO_CFG */ |
1182 | timeout = 50; | 1187 | timeout = 50; |
1183 | while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && | 1188 | while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && |
diff --git a/drivers/pcmcia/pxa2xx_colibri.c b/drivers/pcmcia/pxa2xx_colibri.c index c3f72192af66..a52039564e74 100644 --- a/drivers/pcmcia/pxa2xx_colibri.c +++ b/drivers/pcmcia/pxa2xx_colibri.c | |||
@@ -181,6 +181,9 @@ static int __init colibri_pcmcia_init(void) | |||
181 | { | 181 | { |
182 | int ret; | 182 | int ret; |
183 | 183 | ||
184 | if (!machine_is_colibri() && !machine_is_colibri320()) | ||
185 | return -ENODEV; | ||
186 | |||
184 | colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | 187 | colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); |
185 | if (!colibri_pcmcia_device) | 188 | if (!colibri_pcmcia_device) |
186 | return -ENOMEM; | 189 | return -ENOMEM; |
diff --git a/drivers/pps/generators/Kconfig b/drivers/pps/generators/Kconfig index f3a73dd77660..e4c4f3dc0728 100644 --- a/drivers/pps/generators/Kconfig +++ b/drivers/pps/generators/Kconfig | |||
@@ -6,7 +6,7 @@ comment "PPS generators support" | |||
6 | 6 | ||
7 | config PPS_GENERATOR_PARPORT | 7 | config PPS_GENERATOR_PARPORT |
8 | tristate "Parallel port PPS signal generator" | 8 | tristate "Parallel port PPS signal generator" |
9 | depends on PARPORT | 9 | depends on PARPORT && BROKEN |
10 | help | 10 | help |
11 | If you say yes here you get support for a PPS signal generator which | 11 | If you say yes here you get support for a PPS signal generator which |
12 | utilizes STROBE pin of a parallel port to send PPS signals. It uses | 12 | utilizes STROBE pin of a parallel port to send PPS signals. It uses |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index cf953ecbfca9..b80fa2882408 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -77,18 +77,20 @@ static irqreturn_t s3c_rtc_tickirq(int irq, void *id) | |||
77 | } | 77 | } |
78 | 78 | ||
79 | /* Update control registers */ | 79 | /* Update control registers */ |
80 | static void s3c_rtc_setaie(int to) | 80 | static int s3c_rtc_setaie(struct device *dev, unsigned int enabled) |
81 | { | 81 | { |
82 | unsigned int tmp; | 82 | unsigned int tmp; |
83 | 83 | ||
84 | pr_debug("%s: aie=%d\n", __func__, to); | 84 | pr_debug("%s: aie=%d\n", __func__, enabled); |
85 | 85 | ||
86 | tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN; | 86 | tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN; |
87 | 87 | ||
88 | if (to) | 88 | if (enabled) |
89 | tmp |= S3C2410_RTCALM_ALMEN; | 89 | tmp |= S3C2410_RTCALM_ALMEN; |
90 | 90 | ||
91 | writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); | 91 | writeb(tmp, s3c_rtc_base + S3C2410_RTCALM); |
92 | |||
93 | return 0; | ||
92 | } | 94 | } |
93 | 95 | ||
94 | static int s3c_rtc_setpie(struct device *dev, int enabled) | 96 | static int s3c_rtc_setpie(struct device *dev, int enabled) |
@@ -308,7 +310,7 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
308 | 310 | ||
309 | writeb(alrm_en, base + S3C2410_RTCALM); | 311 | writeb(alrm_en, base + S3C2410_RTCALM); |
310 | 312 | ||
311 | s3c_rtc_setaie(alrm->enabled); | 313 | s3c_rtc_setaie(dev, alrm->enabled); |
312 | 314 | ||
313 | return 0; | 315 | return 0; |
314 | } | 316 | } |
@@ -440,7 +442,7 @@ static int __devexit s3c_rtc_remove(struct platform_device *dev) | |||
440 | rtc_device_unregister(rtc); | 442 | rtc_device_unregister(rtc); |
441 | 443 | ||
442 | s3c_rtc_setpie(&dev->dev, 0); | 444 | s3c_rtc_setpie(&dev->dev, 0); |
443 | s3c_rtc_setaie(0); | 445 | s3c_rtc_setaie(&dev->dev, 0); |
444 | 446 | ||
445 | clk_disable(rtc_clk); | 447 | clk_disable(rtc_clk); |
446 | clk_put(rtc_clk); | 448 | clk_put(rtc_clk); |
diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index c881a14fa5dd..1f6a4d894e73 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c | |||
@@ -62,8 +62,8 @@ static int xpram_devs; | |||
62 | /* | 62 | /* |
63 | * Parameter parsing functions. | 63 | * Parameter parsing functions. |
64 | */ | 64 | */ |
65 | static int __initdata devs = XPRAM_DEVS; | 65 | static int devs = XPRAM_DEVS; |
66 | static char __initdata *sizes[XPRAM_MAX_DEVS]; | 66 | static char *sizes[XPRAM_MAX_DEVS]; |
67 | 67 | ||
68 | module_param(devs, int, 0); | 68 | module_param(devs, int, 0); |
69 | module_param_array(sizes, charp, NULL, 0); | 69 | module_param_array(sizes, charp, NULL, 0); |
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 8cd58e412b5e..5ad44daef73b 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c | |||
@@ -460,7 +460,8 @@ kbd_ioctl(struct kbd_data *kbd, struct file *file, | |||
460 | unsigned int cmd, unsigned long arg) | 460 | unsigned int cmd, unsigned long arg) |
461 | { | 461 | { |
462 | void __user *argp; | 462 | void __user *argp; |
463 | int ct, perm; | 463 | unsigned int ct; |
464 | int perm; | ||
464 | 465 | ||
465 | argp = (void __user *)arg; | 466 | argp = (void __user *)arg; |
466 | 467 | ||
diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index 7a242f073632..267b54e8ff5a 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h | |||
@@ -280,6 +280,14 @@ tape_do_io_free(struct tape_device *device, struct tape_request *request) | |||
280 | return rc; | 280 | return rc; |
281 | } | 281 | } |
282 | 282 | ||
283 | static inline void | ||
284 | tape_do_io_async_free(struct tape_device *device, struct tape_request *request) | ||
285 | { | ||
286 | request->callback = (void *) tape_free_request; | ||
287 | request->callback_data = NULL; | ||
288 | tape_do_io_async(device, request); | ||
289 | } | ||
290 | |||
283 | extern int tape_oper_handler(int irq, int status); | 291 | extern int tape_oper_handler(int irq, int status); |
284 | extern void tape_noper_handler(int irq, int status); | 292 | extern void tape_noper_handler(int irq, int status); |
285 | extern int tape_open(struct tape_device *); | 293 | extern int tape_open(struct tape_device *); |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index c17f35b6136a..c26511171ffe 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
@@ -53,23 +53,11 @@ static void tape_34xx_delete_sbid_from(struct tape_device *, int); | |||
53 | * Medium sense for 34xx tapes. There is no 'real' medium sense call. | 53 | * Medium sense for 34xx tapes. There is no 'real' medium sense call. |
54 | * So we just do a normal sense. | 54 | * So we just do a normal sense. |
55 | */ | 55 | */ |
56 | static int | 56 | static void __tape_34xx_medium_sense(struct tape_request *request) |
57 | tape_34xx_medium_sense(struct tape_device *device) | ||
58 | { | 57 | { |
59 | struct tape_request *request; | 58 | struct tape_device *device = request->device; |
60 | unsigned char *sense; | 59 | unsigned char *sense; |
61 | int rc; | ||
62 | |||
63 | request = tape_alloc_request(1, 32); | ||
64 | if (IS_ERR(request)) { | ||
65 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
66 | return PTR_ERR(request); | ||
67 | } | ||
68 | |||
69 | request->op = TO_MSEN; | ||
70 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
71 | 60 | ||
72 | rc = tape_do_io_interruptible(device, request); | ||
73 | if (request->rc == 0) { | 61 | if (request->rc == 0) { |
74 | sense = request->cpdata; | 62 | sense = request->cpdata; |
75 | 63 | ||
@@ -88,15 +76,47 @@ tape_34xx_medium_sense(struct tape_device *device) | |||
88 | device->tape_generic_status |= GMT_WR_PROT(~0); | 76 | device->tape_generic_status |= GMT_WR_PROT(~0); |
89 | else | 77 | else |
90 | device->tape_generic_status &= ~GMT_WR_PROT(~0); | 78 | device->tape_generic_status &= ~GMT_WR_PROT(~0); |
91 | } else { | 79 | } else |
92 | DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n", | 80 | DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n", |
93 | request->rc); | 81 | request->rc); |
94 | } | ||
95 | tape_free_request(request); | 82 | tape_free_request(request); |
83 | } | ||
84 | |||
85 | static int tape_34xx_medium_sense(struct tape_device *device) | ||
86 | { | ||
87 | struct tape_request *request; | ||
88 | int rc; | ||
89 | |||
90 | request = tape_alloc_request(1, 32); | ||
91 | if (IS_ERR(request)) { | ||
92 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
93 | return PTR_ERR(request); | ||
94 | } | ||
96 | 95 | ||
96 | request->op = TO_MSEN; | ||
97 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
98 | rc = tape_do_io_interruptible(device, request); | ||
99 | __tape_34xx_medium_sense(request); | ||
97 | return rc; | 100 | return rc; |
98 | } | 101 | } |
99 | 102 | ||
103 | static void tape_34xx_medium_sense_async(struct tape_device *device) | ||
104 | { | ||
105 | struct tape_request *request; | ||
106 | |||
107 | request = tape_alloc_request(1, 32); | ||
108 | if (IS_ERR(request)) { | ||
109 | DBF_EXCEPTION(6, "MSEN fail\n"); | ||
110 | return; | ||
111 | } | ||
112 | |||
113 | request->op = TO_MSEN; | ||
114 | tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); | ||
115 | request->callback = (void *) __tape_34xx_medium_sense; | ||
116 | request->callback_data = NULL; | ||
117 | tape_do_io_async(device, request); | ||
118 | } | ||
119 | |||
100 | struct tape_34xx_work { | 120 | struct tape_34xx_work { |
101 | struct tape_device *device; | 121 | struct tape_device *device; |
102 | enum tape_op op; | 122 | enum tape_op op; |
@@ -109,6 +129,9 @@ struct tape_34xx_work { | |||
109 | * is inserted but cannot call tape_do_io* from an interrupt context. | 129 | * is inserted but cannot call tape_do_io* from an interrupt context. |
110 | * Maybe that's useful for other actions we want to start from the | 130 | * Maybe that's useful for other actions we want to start from the |
111 | * interrupt handler. | 131 | * interrupt handler. |
132 | * Note: the work handler is called by the system work queue. The tape | ||
133 | * commands started by the handler need to be asynchrounous, otherwise | ||
134 | * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq). | ||
112 | */ | 135 | */ |
113 | static void | 136 | static void |
114 | tape_34xx_work_handler(struct work_struct *work) | 137 | tape_34xx_work_handler(struct work_struct *work) |
@@ -119,7 +142,7 @@ tape_34xx_work_handler(struct work_struct *work) | |||
119 | 142 | ||
120 | switch(p->op) { | 143 | switch(p->op) { |
121 | case TO_MSEN: | 144 | case TO_MSEN: |
122 | tape_34xx_medium_sense(device); | 145 | tape_34xx_medium_sense_async(device); |
123 | break; | 146 | break; |
124 | default: | 147 | default: |
125 | DBF_EVENT(3, "T34XX: internal error: unknown work\n"); | 148 | DBF_EVENT(3, "T34XX: internal error: unknown work\n"); |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index fbe361fcd2c0..de2e99e0a71b 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
@@ -329,17 +329,17 @@ out: | |||
329 | /* | 329 | /* |
330 | * Enable encryption | 330 | * Enable encryption |
331 | */ | 331 | */ |
332 | static int tape_3592_enable_crypt(struct tape_device *device) | 332 | static struct tape_request *__tape_3592_enable_crypt(struct tape_device *device) |
333 | { | 333 | { |
334 | struct tape_request *request; | 334 | struct tape_request *request; |
335 | char *data; | 335 | char *data; |
336 | 336 | ||
337 | DBF_EVENT(6, "tape_3592_enable_crypt\n"); | 337 | DBF_EVENT(6, "tape_3592_enable_crypt\n"); |
338 | if (!crypt_supported(device)) | 338 | if (!crypt_supported(device)) |
339 | return -ENOSYS; | 339 | return ERR_PTR(-ENOSYS); |
340 | request = tape_alloc_request(2, 72); | 340 | request = tape_alloc_request(2, 72); |
341 | if (IS_ERR(request)) | 341 | if (IS_ERR(request)) |
342 | return PTR_ERR(request); | 342 | return request; |
343 | data = request->cpdata; | 343 | data = request->cpdata; |
344 | memset(data,0,72); | 344 | memset(data,0,72); |
345 | 345 | ||
@@ -354,23 +354,42 @@ static int tape_3592_enable_crypt(struct tape_device *device) | |||
354 | request->op = TO_CRYPT_ON; | 354 | request->op = TO_CRYPT_ON; |
355 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); | 355 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); |
356 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); | 356 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); |
357 | return request; | ||
358 | } | ||
359 | |||
360 | static int tape_3592_enable_crypt(struct tape_device *device) | ||
361 | { | ||
362 | struct tape_request *request; | ||
363 | |||
364 | request = __tape_3592_enable_crypt(device); | ||
365 | if (IS_ERR(request)) | ||
366 | return PTR_ERR(request); | ||
357 | return tape_do_io_free(device, request); | 367 | return tape_do_io_free(device, request); |
358 | } | 368 | } |
359 | 369 | ||
370 | static void tape_3592_enable_crypt_async(struct tape_device *device) | ||
371 | { | ||
372 | struct tape_request *request; | ||
373 | |||
374 | request = __tape_3592_enable_crypt(device); | ||
375 | if (!IS_ERR(request)) | ||
376 | tape_do_io_async_free(device, request); | ||
377 | } | ||
378 | |||
360 | /* | 379 | /* |
361 | * Disable encryption | 380 | * Disable encryption |
362 | */ | 381 | */ |
363 | static int tape_3592_disable_crypt(struct tape_device *device) | 382 | static struct tape_request *__tape_3592_disable_crypt(struct tape_device *device) |
364 | { | 383 | { |
365 | struct tape_request *request; | 384 | struct tape_request *request; |
366 | char *data; | 385 | char *data; |
367 | 386 | ||
368 | DBF_EVENT(6, "tape_3592_disable_crypt\n"); | 387 | DBF_EVENT(6, "tape_3592_disable_crypt\n"); |
369 | if (!crypt_supported(device)) | 388 | if (!crypt_supported(device)) |
370 | return -ENOSYS; | 389 | return ERR_PTR(-ENOSYS); |
371 | request = tape_alloc_request(2, 72); | 390 | request = tape_alloc_request(2, 72); |
372 | if (IS_ERR(request)) | 391 | if (IS_ERR(request)) |
373 | return PTR_ERR(request); | 392 | return request; |
374 | data = request->cpdata; | 393 | data = request->cpdata; |
375 | memset(data,0,72); | 394 | memset(data,0,72); |
376 | 395 | ||
@@ -383,9 +402,28 @@ static int tape_3592_disable_crypt(struct tape_device *device) | |||
383 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); | 402 | tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); |
384 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); | 403 | tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); |
385 | 404 | ||
405 | return request; | ||
406 | } | ||
407 | |||
408 | static int tape_3592_disable_crypt(struct tape_device *device) | ||
409 | { | ||
410 | struct tape_request *request; | ||
411 | |||
412 | request = __tape_3592_disable_crypt(device); | ||
413 | if (IS_ERR(request)) | ||
414 | return PTR_ERR(request); | ||
386 | return tape_do_io_free(device, request); | 415 | return tape_do_io_free(device, request); |
387 | } | 416 | } |
388 | 417 | ||
418 | static void tape_3592_disable_crypt_async(struct tape_device *device) | ||
419 | { | ||
420 | struct tape_request *request; | ||
421 | |||
422 | request = __tape_3592_disable_crypt(device); | ||
423 | if (!IS_ERR(request)) | ||
424 | tape_do_io_async_free(device, request); | ||
425 | } | ||
426 | |||
389 | /* | 427 | /* |
390 | * IOCTL: Set encryption status | 428 | * IOCTL: Set encryption status |
391 | */ | 429 | */ |
@@ -457,8 +495,7 @@ tape_3590_ioctl(struct tape_device *device, unsigned int cmd, unsigned long arg) | |||
457 | /* | 495 | /* |
458 | * SENSE Medium: Get Sense data about medium state | 496 | * SENSE Medium: Get Sense data about medium state |
459 | */ | 497 | */ |
460 | static int | 498 | static int tape_3590_sense_medium(struct tape_device *device) |
461 | tape_3590_sense_medium(struct tape_device *device) | ||
462 | { | 499 | { |
463 | struct tape_request *request; | 500 | struct tape_request *request; |
464 | 501 | ||
@@ -470,6 +507,18 @@ tape_3590_sense_medium(struct tape_device *device) | |||
470 | return tape_do_io_free(device, request); | 507 | return tape_do_io_free(device, request); |
471 | } | 508 | } |
472 | 509 | ||
510 | static void tape_3590_sense_medium_async(struct tape_device *device) | ||
511 | { | ||
512 | struct tape_request *request; | ||
513 | |||
514 | request = tape_alloc_request(1, 128); | ||
515 | if (IS_ERR(request)) | ||
516 | return; | ||
517 | request->op = TO_MSEN; | ||
518 | tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); | ||
519 | tape_do_io_async_free(device, request); | ||
520 | } | ||
521 | |||
473 | /* | 522 | /* |
474 | * MTTELL: Tell block. Return the number of block relative to current file. | 523 | * MTTELL: Tell block. Return the number of block relative to current file. |
475 | */ | 524 | */ |
@@ -546,15 +595,14 @@ tape_3590_read_opposite(struct tape_device *device, | |||
546 | * 2. The attention msg is written to the "read subsystem data" buffer. | 595 | * 2. The attention msg is written to the "read subsystem data" buffer. |
547 | * In this case we probably should print it to the console. | 596 | * In this case we probably should print it to the console. |
548 | */ | 597 | */ |
549 | static int | 598 | static void tape_3590_read_attmsg_async(struct tape_device *device) |
550 | tape_3590_read_attmsg(struct tape_device *device) | ||
551 | { | 599 | { |
552 | struct tape_request *request; | 600 | struct tape_request *request; |
553 | char *buf; | 601 | char *buf; |
554 | 602 | ||
555 | request = tape_alloc_request(3, 4096); | 603 | request = tape_alloc_request(3, 4096); |
556 | if (IS_ERR(request)) | 604 | if (IS_ERR(request)) |
557 | return PTR_ERR(request); | 605 | return; |
558 | request->op = TO_READ_ATTMSG; | 606 | request->op = TO_READ_ATTMSG; |
559 | buf = request->cpdata; | 607 | buf = request->cpdata; |
560 | buf[0] = PREP_RD_SS_DATA; | 608 | buf[0] = PREP_RD_SS_DATA; |
@@ -562,12 +610,15 @@ tape_3590_read_attmsg(struct tape_device *device) | |||
562 | tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); | 610 | tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); |
563 | tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); | 611 | tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); |
564 | tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); | 612 | tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); |
565 | return tape_do_io_free(device, request); | 613 | tape_do_io_async_free(device, request); |
566 | } | 614 | } |
567 | 615 | ||
568 | /* | 616 | /* |
569 | * These functions are used to schedule follow-up actions from within an | 617 | * These functions are used to schedule follow-up actions from within an |
570 | * interrupt context (like unsolicited interrupts). | 618 | * interrupt context (like unsolicited interrupts). |
619 | * Note: the work handler is called by the system work queue. The tape | ||
620 | * commands started by the handler need to be asynchrounous, otherwise | ||
621 | * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq). | ||
571 | */ | 622 | */ |
572 | struct work_handler_data { | 623 | struct work_handler_data { |
573 | struct tape_device *device; | 624 | struct tape_device *device; |
@@ -583,16 +634,16 @@ tape_3590_work_handler(struct work_struct *work) | |||
583 | 634 | ||
584 | switch (p->op) { | 635 | switch (p->op) { |
585 | case TO_MSEN: | 636 | case TO_MSEN: |
586 | tape_3590_sense_medium(p->device); | 637 | tape_3590_sense_medium_async(p->device); |
587 | break; | 638 | break; |
588 | case TO_READ_ATTMSG: | 639 | case TO_READ_ATTMSG: |
589 | tape_3590_read_attmsg(p->device); | 640 | tape_3590_read_attmsg_async(p->device); |
590 | break; | 641 | break; |
591 | case TO_CRYPT_ON: | 642 | case TO_CRYPT_ON: |
592 | tape_3592_enable_crypt(p->device); | 643 | tape_3592_enable_crypt_async(p->device); |
593 | break; | 644 | break; |
594 | case TO_CRYPT_OFF: | 645 | case TO_CRYPT_OFF: |
595 | tape_3592_disable_crypt(p->device); | 646 | tape_3592_disable_crypt_async(p->device); |
596 | break; | 647 | break; |
597 | default: | 648 | default: |
598 | DBF_EVENT(3, "T3590: work handler undefined for " | 649 | DBF_EVENT(3, "T3590: work handler undefined for " |
diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c index 8010aaeb5adb..dd0e84a9bd2f 100644 --- a/drivers/video/backlight/ltv350qv.c +++ b/drivers/video/backlight/ltv350qv.c | |||
@@ -239,11 +239,15 @@ static int __devinit ltv350qv_probe(struct spi_device *spi) | |||
239 | lcd->spi = spi; | 239 | lcd->spi = spi; |
240 | lcd->power = FB_BLANK_POWERDOWN; | 240 | lcd->power = FB_BLANK_POWERDOWN; |
241 | lcd->buffer = kzalloc(8, GFP_KERNEL); | 241 | lcd->buffer = kzalloc(8, GFP_KERNEL); |
242 | if (!lcd->buffer) { | ||
243 | ret = -ENOMEM; | ||
244 | goto out_free_lcd; | ||
245 | } | ||
242 | 246 | ||
243 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); | 247 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); |
244 | if (IS_ERR(ld)) { | 248 | if (IS_ERR(ld)) { |
245 | ret = PTR_ERR(ld); | 249 | ret = PTR_ERR(ld); |
246 | goto out_free_lcd; | 250 | goto out_free_buffer; |
247 | } | 251 | } |
248 | lcd->ld = ld; | 252 | lcd->ld = ld; |
249 | 253 | ||
@@ -257,6 +261,8 @@ static int __devinit ltv350qv_probe(struct spi_device *spi) | |||
257 | 261 | ||
258 | out_unregister: | 262 | out_unregister: |
259 | lcd_device_unregister(ld); | 263 | lcd_device_unregister(ld); |
264 | out_free_buffer: | ||
265 | kfree(lcd->buffer); | ||
260 | out_free_lcd: | 266 | out_free_lcd: |
261 | kfree(lcd); | 267 | kfree(lcd); |
262 | return ret; | 268 | return ret; |
@@ -268,6 +274,7 @@ static int __devexit ltv350qv_remove(struct spi_device *spi) | |||
268 | 274 | ||
269 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | 275 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); |
270 | lcd_device_unregister(lcd->ld); | 276 | lcd_device_unregister(lcd->ld); |
277 | kfree(lcd->buffer); | ||
271 | kfree(lcd); | 278 | kfree(lcd); |
272 | 279 | ||
273 | return 0; | 280 | return 0; |
diff --git a/drivers/watchdog/sbc_fitpc2_wdt.c b/drivers/watchdog/sbc_fitpc2_wdt.c index c7d67e9a7465..79906255eeb6 100644 --- a/drivers/watchdog/sbc_fitpc2_wdt.c +++ b/drivers/watchdog/sbc_fitpc2_wdt.c | |||
@@ -201,11 +201,14 @@ static struct miscdevice fitpc2_wdt_miscdev = { | |||
201 | static int __init fitpc2_wdt_init(void) | 201 | static int __init fitpc2_wdt_init(void) |
202 | { | 202 | { |
203 | int err; | 203 | int err; |
204 | const char *brd_name; | ||
204 | 205 | ||
205 | if (!strstr(dmi_get_system_info(DMI_BOARD_NAME), "SBC-FITPC2")) | 206 | brd_name = dmi_get_system_info(DMI_BOARD_NAME); |
207 | |||
208 | if (!brd_name || !strstr(brd_name, "SBC-FITPC2")) | ||
206 | return -ENODEV; | 209 | return -ENODEV; |
207 | 210 | ||
208 | pr_info("%s found\n", dmi_get_system_info(DMI_BOARD_NAME)); | 211 | pr_info("%s found\n", brd_name); |
209 | 212 | ||
210 | if (!request_region(COMMAND_PORT, 1, WATCHDOG_NAME)) { | 213 | if (!request_region(COMMAND_PORT, 1, WATCHDOG_NAME)) { |
211 | pr_err("I/O address 0x%04x already in use\n", COMMAND_PORT); | 214 | pr_err("I/O address 0x%04x already in use\n", COMMAND_PORT); |