Contents of /trunk/kernel-magellan/patches-3.1/0101-3.1.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1606 -
(show annotations)
(download)
Tue Jan 10 13:37:55 2012 UTC (12 years, 8 months ago) by niro
File size: 31175 byte(s)
Tue Jan 10 13:37:55 2012 UTC (12 years, 8 months ago) by niro
File size: 31175 byte(s)
-consolidated patches dir and added patches up to linux-3.1.8
1 | diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt |
2 | index d70c93b..f896140 100644 |
3 | --- a/Documentation/sound/alsa/HD-Audio-Models.txt |
4 | +++ b/Documentation/sound/alsa/HD-Audio-Models.txt |
5 | @@ -408,6 +408,7 @@ STAC92HD83* |
6 | ref Reference board |
7 | mic-ref Reference board with power management for ports |
8 | dell-s14 Dell laptop |
9 | + dell-vostro-3500 Dell Vostro 3500 laptop |
10 | hp HP laptops with (inverted) mute-LED |
11 | hp-dv7-4000 HP dv-7 4000 |
12 | auto BIOS setup (default) |
13 | diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c |
14 | index dba0d8d..0512baf 100644 |
15 | --- a/arch/arm/mach-at91/at91cap9_devices.c |
16 | +++ b/arch/arm/mach-at91/at91cap9_devices.c |
17 | @@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} |
18 | * USB HS Device (Gadget) |
19 | * -------------------------------------------------------------------- */ |
20 | |
21 | -#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE) |
22 | +#if defined(CONFIG_USB_ATMEL_USBA) || defined(CONFIG_USB_ATMEL_USBA_MODULE) |
23 | |
24 | static struct resource usba_udc_resources[] = { |
25 | [0] = { |
26 | diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c |
27 | index 600bffb..371bb0e 100644 |
28 | --- a/arch/arm/mach-at91/at91sam9g45_devices.c |
29 | +++ b/arch/arm/mach-at91/at91sam9g45_devices.c |
30 | @@ -191,7 +191,7 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) {} |
31 | * USB HS Device (Gadget) |
32 | * -------------------------------------------------------------------- */ |
33 | |
34 | -#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE) |
35 | +#if defined(CONFIG_USB_ATMEL_USBA) || defined(CONFIG_USB_ATMEL_USBA_MODULE) |
36 | static struct resource usba_udc_resources[] = { |
37 | [0] = { |
38 | .start = AT91SAM9G45_UDPHS_FIFO, |
39 | diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c |
40 | index aacb19d..c884d59 100644 |
41 | --- a/arch/arm/mach-at91/at91sam9rl_devices.c |
42 | +++ b/arch/arm/mach-at91/at91sam9rl_devices.c |
43 | @@ -75,7 +75,7 @@ void __init at91_add_device_hdmac(void) {} |
44 | * USB HS Device (Gadget) |
45 | * -------------------------------------------------------------------- */ |
46 | |
47 | -#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE) |
48 | +#if defined(CONFIG_USB_ATMEL_USBA) || defined(CONFIG_USB_ATMEL_USBA_MODULE) |
49 | |
50 | static struct resource usba_udc_resources[] = { |
51 | [0] = { |
52 | diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h |
53 | index 6fbce72..a0f358d 100644 |
54 | --- a/arch/powerpc/include/asm/sections.h |
55 | +++ b/arch/powerpc/include/asm/sections.h |
56 | @@ -8,7 +8,7 @@ |
57 | |
58 | #ifdef __powerpc64__ |
59 | |
60 | -extern char _end[]; |
61 | +extern char __end_interrupts[]; |
62 | |
63 | static inline int in_kernel_text(unsigned long addr) |
64 | { |
65 | diff --git a/arch/powerpc/include/asm/synch.h b/arch/powerpc/include/asm/synch.h |
66 | index d7cab44..87878c6 100644 |
67 | --- a/arch/powerpc/include/asm/synch.h |
68 | +++ b/arch/powerpc/include/asm/synch.h |
69 | @@ -13,6 +13,7 @@ |
70 | extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup; |
71 | extern void do_lwsync_fixups(unsigned long value, void *fixup_start, |
72 | void *fixup_end); |
73 | +extern void do_final_fixups(void); |
74 | |
75 | static inline void eieio(void) |
76 | { |
77 | diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c |
78 | index b06bdae..ad892f7 100644 |
79 | --- a/arch/powerpc/kernel/kvm.c |
80 | +++ b/arch/powerpc/kernel/kvm.c |
81 | @@ -131,7 +131,6 @@ static void kvm_patch_ins_b(u32 *inst, int addr) |
82 | /* On relocatable kernels interrupts handlers and our code |
83 | can be in different regions, so we don't patch them */ |
84 | |
85 | - extern u32 __end_interrupts; |
86 | if ((ulong)inst < (ulong)&__end_interrupts) |
87 | return; |
88 | #endif |
89 | diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c |
90 | index 209135a..912c36a 100644 |
91 | --- a/arch/powerpc/kernel/setup_32.c |
92 | +++ b/arch/powerpc/kernel/setup_32.c |
93 | @@ -107,6 +107,8 @@ notrace unsigned long __init early_init(unsigned long dt_ptr) |
94 | PTRRELOC(&__start___lwsync_fixup), |
95 | PTRRELOC(&__stop___lwsync_fixup)); |
96 | |
97 | + do_final_fixups(); |
98 | + |
99 | return KERNELBASE + offset; |
100 | } |
101 | |
102 | diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c |
103 | index aebef13..e0f2031 100644 |
104 | --- a/arch/powerpc/kernel/setup_64.c |
105 | +++ b/arch/powerpc/kernel/setup_64.c |
106 | @@ -353,6 +353,7 @@ void __init setup_system(void) |
107 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); |
108 | do_lwsync_fixups(cur_cpu_spec->cpu_features, |
109 | &__start___lwsync_fixup, &__stop___lwsync_fixup); |
110 | + do_final_fixups(); |
111 | |
112 | /* |
113 | * Unflatten the device-tree passed by prom_init or kexec |
114 | diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c |
115 | index cc0d7f1..0e85639 100644 |
116 | --- a/arch/powerpc/kvm/book3s_hv.c |
117 | +++ b/arch/powerpc/kvm/book3s_hv.c |
118 | @@ -43,6 +43,7 @@ |
119 | #include <asm/processor.h> |
120 | #include <asm/cputhreads.h> |
121 | #include <asm/page.h> |
122 | +#include <asm/hvcall.h> |
123 | #include <linux/gfp.h> |
124 | #include <linux/sched.h> |
125 | #include <linux/vmalloc.h> |
126 | diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c |
127 | index 0d08d01..7a8a748 100644 |
128 | --- a/arch/powerpc/lib/feature-fixups.c |
129 | +++ b/arch/powerpc/lib/feature-fixups.c |
130 | @@ -18,6 +18,8 @@ |
131 | #include <linux/init.h> |
132 | #include <asm/cputable.h> |
133 | #include <asm/code-patching.h> |
134 | +#include <asm/page.h> |
135 | +#include <asm/sections.h> |
136 | |
137 | |
138 | struct fixup_entry { |
139 | @@ -128,6 +130,27 @@ void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) |
140 | } |
141 | } |
142 | |
143 | +void do_final_fixups(void) |
144 | +{ |
145 | +#if defined(CONFIG_PPC64) && defined(CONFIG_RELOCATABLE) |
146 | + int *src, *dest; |
147 | + unsigned long length; |
148 | + |
149 | + if (PHYSICAL_START == 0) |
150 | + return; |
151 | + |
152 | + src = (int *)(KERNELBASE + PHYSICAL_START); |
153 | + dest = (int *)KERNELBASE; |
154 | + length = (__end_interrupts - _stext) / sizeof(int); |
155 | + |
156 | + while (length--) { |
157 | + patch_instruction(dest, *src); |
158 | + src++; |
159 | + dest++; |
160 | + } |
161 | +#endif |
162 | +} |
163 | + |
164 | #ifdef CONFIG_FTR_FIXUP_SELFTEST |
165 | |
166 | #define check(x) \ |
167 | diff --git a/arch/powerpc/platforms/ps3/interrupt.c b/arch/powerpc/platforms/ps3/interrupt.c |
168 | index 600ed2c..1aa478b 100644 |
169 | --- a/arch/powerpc/platforms/ps3/interrupt.c |
170 | +++ b/arch/powerpc/platforms/ps3/interrupt.c |
171 | @@ -88,6 +88,7 @@ struct ps3_private { |
172 | struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN))); |
173 | u64 ppe_id; |
174 | u64 thread_id; |
175 | + unsigned long ipi_mask; |
176 | }; |
177 | |
178 | static DEFINE_PER_CPU(struct ps3_private, ps3_private); |
179 | @@ -144,7 +145,11 @@ static void ps3_chip_unmask(struct irq_data *d) |
180 | static void ps3_chip_eoi(struct irq_data *d) |
181 | { |
182 | const struct ps3_private *pd = irq_data_get_irq_chip_data(d); |
183 | - lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq); |
184 | + |
185 | + /* non-IPIs are EOIed here. */ |
186 | + |
187 | + if (!test_bit(63 - d->irq, &pd->ipi_mask)) |
188 | + lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq); |
189 | } |
190 | |
191 | /** |
192 | @@ -691,6 +696,16 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq) |
193 | cpu, virq, pd->bmp.ipi_debug_brk_mask); |
194 | } |
195 | |
196 | +void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq) |
197 | +{ |
198 | + struct ps3_private *pd = &per_cpu(ps3_private, cpu); |
199 | + |
200 | + set_bit(63 - virq, &pd->ipi_mask); |
201 | + |
202 | + DBG("%s:%d: cpu %u, virq %u, ipi_mask %lxh\n", __func__, __LINE__, |
203 | + cpu, virq, pd->ipi_mask); |
204 | +} |
205 | + |
206 | static unsigned int ps3_get_irq(void) |
207 | { |
208 | struct ps3_private *pd = &__get_cpu_var(ps3_private); |
209 | @@ -720,6 +735,12 @@ static unsigned int ps3_get_irq(void) |
210 | BUG(); |
211 | } |
212 | #endif |
213 | + |
214 | + /* IPIs are EOIed here. */ |
215 | + |
216 | + if (test_bit(63 - plug, &pd->ipi_mask)) |
217 | + lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, plug); |
218 | + |
219 | return plug; |
220 | } |
221 | |
222 | diff --git a/arch/powerpc/platforms/ps3/platform.h b/arch/powerpc/platforms/ps3/platform.h |
223 | index 9a196a8..1a633ed 100644 |
224 | --- a/arch/powerpc/platforms/ps3/platform.h |
225 | +++ b/arch/powerpc/platforms/ps3/platform.h |
226 | @@ -43,6 +43,7 @@ void ps3_mm_shutdown(void); |
227 | void ps3_init_IRQ(void); |
228 | void ps3_shutdown_IRQ(int cpu); |
229 | void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq); |
230 | +void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq); |
231 | |
232 | /* smp */ |
233 | |
234 | diff --git a/arch/powerpc/platforms/ps3/smp.c b/arch/powerpc/platforms/ps3/smp.c |
235 | index 4c44794..f609345 100644 |
236 | --- a/arch/powerpc/platforms/ps3/smp.c |
237 | +++ b/arch/powerpc/platforms/ps3/smp.c |
238 | @@ -94,6 +94,8 @@ static void __init ps3_smp_setup_cpu(int cpu) |
239 | |
240 | if (result) |
241 | virqs[i] = NO_IRQ; |
242 | + else |
243 | + ps3_register_ipi_irq(cpu, virqs[i]); |
244 | } |
245 | |
246 | ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]); |
247 | diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h |
248 | index 822d608..abcc4dc 100644 |
249 | --- a/arch/sh/include/asm/page.h |
250 | +++ b/arch/sh/include/asm/page.h |
251 | @@ -141,8 +141,13 @@ typedef struct page *pgtable_t; |
252 | #endif /* !__ASSEMBLY__ */ |
253 | |
254 | #ifdef CONFIG_UNCACHED_MAPPING |
255 | +#if defined(CONFIG_29BIT) |
256 | +#define UNCAC_ADDR(addr) P2SEGADDR(addr) |
257 | +#define CAC_ADDR(addr) P1SEGADDR(addr) |
258 | +#else |
259 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start) |
260 | #define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET) |
261 | +#endif |
262 | #else |
263 | #define UNCAC_ADDR(addr) ((addr)) |
264 | #define CAC_ADDR(addr) ((addr)) |
265 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
266 | index 2d69617..46c8069 100644 |
267 | --- a/arch/x86/xen/enlighten.c |
268 | +++ b/arch/x86/xen/enlighten.c |
269 | @@ -1355,7 +1355,7 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, |
270 | int cpu = (long)hcpu; |
271 | switch (action) { |
272 | case CPU_UP_PREPARE: |
273 | - per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; |
274 | + xen_vcpu_setup(cpu); |
275 | if (xen_have_vector_callback) |
276 | xen_init_lock_cpu(cpu); |
277 | break; |
278 | @@ -1385,7 +1385,6 @@ static void __init xen_hvm_guest_init(void) |
279 | xen_hvm_smp_init(); |
280 | register_cpu_notifier(&xen_hvm_cpu_notifier); |
281 | xen_unplug_emulated_devices(); |
282 | - have_vcpu_info_placement = 0; |
283 | x86_init.irqs.intr_init = xen_init_IRQ; |
284 | xen_hvm_init_time_ops(); |
285 | xen_hvm_init_mmu_ops(); |
286 | diff --git a/block/blk-map.c b/block/blk-map.c |
287 | index e663ac2..164cd00 100644 |
288 | --- a/block/blk-map.c |
289 | +++ b/block/blk-map.c |
290 | @@ -204,10 +204,11 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, |
291 | if (!iov[i].iov_len) |
292 | return -EINVAL; |
293 | |
294 | - if (uaddr & queue_dma_alignment(q)) { |
295 | + /* |
296 | + * Keep going so we check length of all segments |
297 | + */ |
298 | + if (uaddr & queue_dma_alignment(q)) |
299 | unaligned = 1; |
300 | - break; |
301 | - } |
302 | } |
303 | |
304 | if (unaligned || (q->dma_pad_mask & len) || map_data) |
305 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
306 | index a546a71..346d557 100644 |
307 | --- a/drivers/gpu/drm/i915/i915_gem.c |
308 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
309 | @@ -1475,7 +1475,7 @@ i915_gem_mmap_gtt(struct drm_file *file, |
310 | |
311 | if (obj->base.size > dev_priv->mm.gtt_mappable_end) { |
312 | ret = -E2BIG; |
313 | - goto unlock; |
314 | + goto out; |
315 | } |
316 | |
317 | if (obj->madv != I915_MADV_WILLNEED) { |
318 | diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c |
319 | index b0d753f..0e3241c 100644 |
320 | --- a/drivers/gpu/drm/nouveau/nouveau_channel.c |
321 | +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c |
322 | @@ -158,6 +158,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret, |
323 | INIT_LIST_HEAD(&chan->nvsw.vbl_wait); |
324 | INIT_LIST_HEAD(&chan->nvsw.flip); |
325 | INIT_LIST_HEAD(&chan->fence.pending); |
326 | + spin_lock_init(&chan->fence.lock); |
327 | |
328 | /* setup channel's memory and vm */ |
329 | ret = nouveau_gpuobj_channel_init(chan, vram_handle, gart_handle); |
330 | diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c |
331 | index c919cfc..ae22dfa 100644 |
332 | --- a/drivers/gpu/drm/nouveau/nouveau_fence.c |
333 | +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c |
334 | @@ -539,8 +539,6 @@ nouveau_fence_channel_init(struct nouveau_channel *chan) |
335 | return ret; |
336 | } |
337 | |
338 | - INIT_LIST_HEAD(&chan->fence.pending); |
339 | - spin_lock_init(&chan->fence.lock); |
340 | atomic_set(&chan->fence.last_sequence_irq, 0); |
341 | return 0; |
342 | } |
343 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
344 | index b5628ce..3b77ad6 100644 |
345 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
346 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
347 | @@ -283,7 +283,7 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, |
348 | } |
349 | } |
350 | |
351 | - DRM_ERROR("aux i2c too many retries, giving up\n"); |
352 | + DRM_DEBUG_KMS("aux i2c too many retries, giving up\n"); |
353 | return -EREMOTEIO; |
354 | } |
355 | |
356 | diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c |
357 | index 661b692..6d5628b 100644 |
358 | --- a/drivers/leds/led-class.c |
359 | +++ b/drivers/leds/led-class.c |
360 | @@ -270,11 +270,8 @@ void led_blink_set(struct led_classdev *led_cdev, |
361 | del_timer_sync(&led_cdev->blink_timer); |
362 | |
363 | if (led_cdev->blink_set && |
364 | - !led_cdev->blink_set(led_cdev, delay_on, delay_off)) { |
365 | - led_cdev->blink_delay_on = *delay_on; |
366 | - led_cdev->blink_delay_off = *delay_off; |
367 | + !led_cdev->blink_set(led_cdev, delay_on, delay_off)) |
368 | return; |
369 | - } |
370 | |
371 | /* blink with 1 Hz as default if nothing specified */ |
372 | if (!*delay_on && !*delay_off) |
373 | diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c |
374 | index 01ecfee..b8eef46 100644 |
375 | --- a/drivers/mfd/twl-core.c |
376 | +++ b/drivers/mfd/twl-core.c |
377 | @@ -109,7 +109,7 @@ |
378 | #define twl_has_watchdog() false |
379 | #endif |
380 | |
381 | -#if defined(CONFIG_TWL4030_CODEC) || defined(CONFIG_TWL4030_CODEC_MODULE) ||\ |
382 | +#if defined(CONFIG_MFD_TWL4030_AUDIO) || defined(CONFIG_MFD_TWL4030_AUDIO_MODULE) ||\ |
383 | defined(CONFIG_TWL6040_CORE) || defined(CONFIG_TWL6040_CORE_MODULE) |
384 | #define twl_has_codec() true |
385 | #else |
386 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
387 | index e293a79..fdb4df2 100644 |
388 | --- a/drivers/net/wireless/b43/main.c |
389 | +++ b/drivers/net/wireless/b43/main.c |
390 | @@ -2508,6 +2508,13 @@ static int b43_upload_microcode(struct b43_wldev *dev) |
391 | b43_print_fw_helptext(dev->wl, 1); |
392 | err = -EOPNOTSUPP; |
393 | goto error; |
394 | + } else if (fwrev >= 598) { |
395 | + b43err(dev->wl, "YOUR FIRMWARE IS TOO NEW. Support for " |
396 | + "firmware 598 and up requires kernel 3.2 or newer. You " |
397 | + "have to install older firmware or upgrade kernel.\n"); |
398 | + b43_print_fw_helptext(dev->wl, 1); |
399 | + err = -EOPNOTSUPP; |
400 | + goto error; |
401 | } |
402 | dev->fw.rev = fwrev; |
403 | dev->fw.patch = fwpatch; |
404 | diff --git a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c |
405 | index d6de44e..3cb92fc 100644 |
406 | --- a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c |
407 | +++ b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c |
408 | @@ -975,6 +975,10 @@ static struct ieee80211_channel brcms_5ghz_nphy_chantable[] = { |
409 | .hw_value = (rate100m / 5), \ |
410 | } |
411 | |
412 | +/* |
413 | + * The rate table is used for both 2.4G and 5G rates. The |
414 | + * latter being a subset as it does not support CCK rates. |
415 | + */ |
416 | static struct ieee80211_rate legacy_ratetable[] = { |
417 | RATE(10, 0), |
418 | RATE(20, IEEE80211_RATE_SHORT_PREAMBLE), |
419 | @@ -1016,8 +1020,9 @@ static struct ieee80211_supported_band brcms_band_5GHz_nphy = { |
420 | .band = IEEE80211_BAND_5GHZ, |
421 | .channels = brcms_5ghz_nphy_chantable, |
422 | .n_channels = ARRAY_SIZE(brcms_5ghz_nphy_chantable), |
423 | - .bitrates = legacy_ratetable + 4, |
424 | - .n_bitrates = ARRAY_SIZE(legacy_ratetable) - 4, |
425 | + .bitrates = legacy_ratetable + BRCMS_LEGACY_5G_RATE_OFFSET, |
426 | + .n_bitrates = ARRAY_SIZE(legacy_ratetable) - |
427 | + BRCMS_LEGACY_5G_RATE_OFFSET, |
428 | .ht_cap = { |
429 | /* use IEEE80211_HT_CAP_* from include/linux/ieee80211.h */ |
430 | .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_40MHZ_INTOLERANT, /* No 40 mhz yet */ |
431 | diff --git a/drivers/staging/brcm80211/brcmsmac/mac80211_if.h b/drivers/staging/brcm80211/brcmsmac/mac80211_if.h |
432 | index 40e3d37..3be8655 100644 |
433 | --- a/drivers/staging/brcm80211/brcmsmac/mac80211_if.h |
434 | +++ b/drivers/staging/brcm80211/brcmsmac/mac80211_if.h |
435 | @@ -20,6 +20,12 @@ |
436 | #include <linux/timer.h> |
437 | #include <linux/interrupt.h> |
438 | |
439 | +/* |
440 | + * Starting index for 5G rates in the |
441 | + * legacy rate table. |
442 | + */ |
443 | +#define BRCMS_LEGACY_5G_RATE_OFFSET 4 |
444 | + |
445 | /* softmac ioctl definitions */ |
446 | #define BRCMS_SET_SHORTSLOT_OVERRIDE 146 |
447 | |
448 | diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c |
449 | index 1763c45..9654163 100644 |
450 | --- a/drivers/staging/brcm80211/brcmsmac/main.c |
451 | +++ b/drivers/staging/brcm80211/brcmsmac/main.c |
452 | @@ -4608,6 +4608,14 @@ prep_mac80211_status(struct brcms_c_info *wlc, struct d11rxhdr *rxh, |
453 | wiphy_err(wlc->wiphy, "%s: Unknown rate\n", __func__); |
454 | } |
455 | |
456 | + /* |
457 | + * For 5GHz, we should decrease the index as it is |
458 | + * a subset of the 2.4G rates. See bitrates field |
459 | + * of brcms_band_5GHz_nphy (in mac80211_if.c). |
460 | + */ |
461 | + if (rx_status->band == IEEE80211_BAND_5GHZ) |
462 | + rx_status->rate_idx -= BRCMS_LEGACY_5G_RATE_OFFSET; |
463 | + |
464 | /* Determine short preamble and rate_idx */ |
465 | preamble = 0; |
466 | if (IS_CCK(rspec)) { |
467 | diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c |
468 | index 4bcc8b8..ecb9254 100644 |
469 | --- a/drivers/virtio/virtio_pci.c |
470 | +++ b/drivers/virtio/virtio_pci.c |
471 | @@ -590,11 +590,11 @@ static struct virtio_config_ops virtio_pci_config_ops = { |
472 | |
473 | static void virtio_pci_release_dev(struct device *_d) |
474 | { |
475 | - struct virtio_device *dev = container_of(_d, struct virtio_device, |
476 | - dev); |
477 | - struct virtio_pci_device *vp_dev = to_vp_device(dev); |
478 | - |
479 | - kfree(vp_dev); |
480 | + /* |
481 | + * No need for a release method as we allocate/free |
482 | + * all devices together with the pci devices. |
483 | + * Provide an empty one to avoid getting a warning from core. |
484 | + */ |
485 | } |
486 | |
487 | /* the PCI probing function */ |
488 | @@ -682,6 +682,7 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev) |
489 | pci_iounmap(pci_dev, vp_dev->ioaddr); |
490 | pci_release_regions(pci_dev); |
491 | pci_disable_device(pci_dev); |
492 | + kfree(vp_dev); |
493 | } |
494 | |
495 | #ifdef CONFIG_PM |
496 | diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c |
497 | index f6832f4..e1c4c6e 100644 |
498 | --- a/drivers/xen/gntalloc.c |
499 | +++ b/drivers/xen/gntalloc.c |
500 | @@ -135,7 +135,7 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op, |
501 | /* Grant foreign access to the page. */ |
502 | gref->gref_id = gnttab_grant_foreign_access(op->domid, |
503 | pfn_to_mfn(page_to_pfn(gref->page)), readonly); |
504 | - if (gref->gref_id < 0) { |
505 | + if ((int)gref->gref_id < 0) { |
506 | rc = gref->gref_id; |
507 | goto undo; |
508 | } |
509 | @@ -280,7 +280,7 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv, |
510 | goto out; |
511 | } |
512 | |
513 | - gref_ids = kzalloc(sizeof(gref_ids[0]) * op.count, GFP_TEMPORARY); |
514 | + gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_TEMPORARY); |
515 | if (!gref_ids) { |
516 | rc = -ENOMEM; |
517 | goto out; |
518 | diff --git a/fs/hfs/trans.c b/fs/hfs/trans.c |
519 | index e673a88..b1ce4c7 100644 |
520 | --- a/fs/hfs/trans.c |
521 | +++ b/fs/hfs/trans.c |
522 | @@ -40,6 +40,8 @@ int hfs_mac2asc(struct super_block *sb, char *out, const struct hfs_name *in) |
523 | |
524 | src = in->name; |
525 | srclen = in->len; |
526 | + if (srclen > HFS_NAMELEN) |
527 | + srclen = HFS_NAMELEN; |
528 | dst = out; |
529 | dstlen = HFS_MAX_NAMELEN; |
530 | if (nls_io) { |
531 | diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h |
532 | index 3d53efd..f81676f 100644 |
533 | --- a/include/drm/drm_pciids.h |
534 | +++ b/include/drm/drm_pciids.h |
535 | @@ -4,6 +4,7 @@ |
536 | */ |
537 | #define radeon_PCI_IDS \ |
538 | {0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
539 | + {0x1002, 0x3151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
540 | {0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
541 | {0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
542 | {0x1002, 0x3155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
543 | @@ -55,6 +56,7 @@ |
544 | {0x1002, 0x4C64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \ |
545 | {0x1002, 0x4C66, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \ |
546 | {0x1002, 0x4C67, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \ |
547 | + {0x1002, 0x4C6E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280|RADEON_IS_MOBILITY}, \ |
548 | {0x1002, 0x4E44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ |
549 | {0x1002, 0x4E45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ |
550 | {0x1002, 0x4E46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ |
551 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c |
552 | index a87da52..253b071 100644 |
553 | --- a/mm/backing-dev.c |
554 | +++ b/mm/backing-dev.c |
555 | @@ -720,6 +720,14 @@ void bdi_destroy(struct backing_dev_info *bdi) |
556 | |
557 | bdi_unregister(bdi); |
558 | |
559 | + /* |
560 | + * If bdi_unregister() had already been called earlier, the |
561 | + * wakeup_timer could still be armed because bdi_prune_sb() |
562 | + * can race with the bdi_wakeup_thread_delayed() calls from |
563 | + * __mark_inode_dirty(). |
564 | + */ |
565 | + del_timer_sync(&bdi->wb.wakeup_timer); |
566 | + |
567 | for (i = 0; i < NR_BDI_STAT_ITEMS; i++) |
568 | percpu_counter_destroy(&bdi->bdi_stat[i]); |
569 | |
570 | diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c |
571 | index 5b366d7..69ff52c 100644 |
572 | --- a/security/keys/user_defined.c |
573 | +++ b/security/keys/user_defined.c |
574 | @@ -102,7 +102,8 @@ int user_update(struct key *key, const void *data, size_t datalen) |
575 | key->expiry = 0; |
576 | } |
577 | |
578 | - kfree_rcu(zap, rcu); |
579 | + if (zap) |
580 | + kfree_rcu(zap, rcu); |
581 | |
582 | error: |
583 | return ret; |
584 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
585 | index f3aefef..3a1b47a 100644 |
586 | --- a/sound/pci/hda/hda_codec.c |
587 | +++ b/sound/pci/hda/hda_codec.c |
588 | @@ -2296,6 +2296,39 @@ int snd_hda_codec_reset(struct hda_codec *codec) |
589 | return 0; |
590 | } |
591 | |
592 | +typedef int (*map_slave_func_t)(void *, struct snd_kcontrol *); |
593 | + |
594 | +/* apply the function to all matching slave ctls in the mixer list */ |
595 | +static int map_slaves(struct hda_codec *codec, const char * const *slaves, |
596 | + map_slave_func_t func, void *data) |
597 | +{ |
598 | + struct hda_nid_item *items; |
599 | + const char * const *s; |
600 | + int i, err; |
601 | + |
602 | + items = codec->mixers.list; |
603 | + for (i = 0; i < codec->mixers.used; i++) { |
604 | + struct snd_kcontrol *sctl = items[i].kctl; |
605 | + if (!sctl || !sctl->id.name || |
606 | + sctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER) |
607 | + continue; |
608 | + for (s = slaves; *s; s++) { |
609 | + if (!strcmp(sctl->id.name, *s)) { |
610 | + err = func(data, sctl); |
611 | + if (err) |
612 | + return err; |
613 | + break; |
614 | + } |
615 | + } |
616 | + } |
617 | + return 0; |
618 | +} |
619 | + |
620 | +static int check_slave_present(void *data, struct snd_kcontrol *sctl) |
621 | +{ |
622 | + return 1; |
623 | +} |
624 | + |
625 | /** |
626 | * snd_hda_add_vmaster - create a virtual master control and add slaves |
627 | * @codec: HD-audio codec |
628 | @@ -2316,12 +2349,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
629 | unsigned int *tlv, const char * const *slaves) |
630 | { |
631 | struct snd_kcontrol *kctl; |
632 | - const char * const *s; |
633 | int err; |
634 | |
635 | - for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++) |
636 | - ; |
637 | - if (!*s) { |
638 | + err = map_slaves(codec, slaves, check_slave_present, NULL); |
639 | + if (err != 1) { |
640 | snd_printdd("No slave found for %s\n", name); |
641 | return 0; |
642 | } |
643 | @@ -2332,23 +2363,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
644 | if (err < 0) |
645 | return err; |
646 | |
647 | - for (s = slaves; *s; s++) { |
648 | - struct snd_kcontrol *sctl; |
649 | - int i = 0; |
650 | - for (;;) { |
651 | - sctl = _snd_hda_find_mixer_ctl(codec, *s, i); |
652 | - if (!sctl) { |
653 | - if (!i) |
654 | - snd_printdd("Cannot find slave %s, " |
655 | - "skipped\n", *s); |
656 | - break; |
657 | - } |
658 | - err = snd_ctl_add_slave(kctl, sctl); |
659 | - if (err < 0) |
660 | - return err; |
661 | - i++; |
662 | - } |
663 | - } |
664 | + err = map_slaves(codec, slaves, (map_slave_func_t)snd_ctl_add_slave, |
665 | + kctl); |
666 | + if (err < 0) |
667 | + return err; |
668 | return 0; |
669 | } |
670 | EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); |
671 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
672 | index d0671a8..7ed9011 100644 |
673 | --- a/sound/pci/hda/patch_sigmatel.c |
674 | +++ b/sound/pci/hda/patch_sigmatel.c |
675 | @@ -94,6 +94,7 @@ enum { |
676 | STAC_92HD83XXX_REF, |
677 | STAC_92HD83XXX_PWR_REF, |
678 | STAC_DELL_S14, |
679 | + STAC_DELL_VOSTRO_3500, |
680 | STAC_92HD83XXX_HP, |
681 | STAC_92HD83XXX_HP_cNB11_INTQUAD, |
682 | STAC_HP_DV7_4000, |
683 | @@ -1658,6 +1659,12 @@ static const unsigned int dell_s14_pin_configs[10] = { |
684 | 0x40f000f0, 0x40f000f0, |
685 | }; |
686 | |
687 | +static const unsigned int dell_vostro_3500_pin_configs[10] = { |
688 | + 0x02a11020, 0x0221101f, 0x400000f0, 0x90170110, |
689 | + 0x400000f1, 0x400000f2, 0x400000f3, 0x90a60160, |
690 | + 0x400000f4, 0x400000f5, |
691 | +}; |
692 | + |
693 | static const unsigned int hp_dv7_4000_pin_configs[10] = { |
694 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, |
695 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, |
696 | @@ -1674,6 +1681,7 @@ static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { |
697 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
698 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, |
699 | [STAC_DELL_S14] = dell_s14_pin_configs, |
700 | + [STAC_DELL_VOSTRO_3500] = dell_vostro_3500_pin_configs, |
701 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs, |
702 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, |
703 | }; |
704 | @@ -1683,6 +1691,7 @@ static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { |
705 | [STAC_92HD83XXX_REF] = "ref", |
706 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
707 | [STAC_DELL_S14] = "dell-s14", |
708 | + [STAC_DELL_VOSTRO_3500] = "dell-vostro-3500", |
709 | [STAC_92HD83XXX_HP] = "hp", |
710 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad", |
711 | [STAC_HP_DV7_4000] = "hp-dv7-4000", |
712 | @@ -1696,6 +1705,8 @@ static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { |
713 | "DFI LanParty", STAC_92HD83XXX_REF), |
714 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, |
715 | "unknown Dell", STAC_DELL_S14), |
716 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028, |
717 | + "Dell Vostro 3500", STAC_DELL_VOSTRO_3500), |
718 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, |
719 | "HP", STAC_92HD83XXX_HP), |
720 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656, |
721 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
722 | index 8468363..fa0a480 100644 |
723 | --- a/sound/soc/codecs/wm8994.c |
724 | +++ b/sound/soc/codecs/wm8994.c |
725 | @@ -56,7 +56,7 @@ static int wm8994_retune_mobile_base[] = { |
726 | static int wm8994_readable(struct snd_soc_codec *codec, unsigned int reg) |
727 | { |
728 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
729 | - struct wm8994 *control = wm8994->control_data; |
730 | + struct wm8994 *control = codec->control_data; |
731 | |
732 | switch (reg) { |
733 | case WM8994_GPIO_1: |
734 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c |
735 | index cdd19d7..0de7cbd 100644 |
736 | --- a/sound/usb/mixer.c |
737 | +++ b/sound/usb/mixer.c |
738 | @@ -765,10 +765,60 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl) |
739 | * interface to ALSA control for feature/mixer units |
740 | */ |
741 | |
742 | +/* volume control quirks */ |
743 | +static void volume_control_quirks(struct usb_mixer_elem_info *cval, |
744 | + struct snd_kcontrol *kctl) |
745 | +{ |
746 | + switch (cval->mixer->chip->usb_id) { |
747 | + case USB_ID(0x0471, 0x0101): |
748 | + case USB_ID(0x0471, 0x0104): |
749 | + case USB_ID(0x0471, 0x0105): |
750 | + case USB_ID(0x0672, 0x1041): |
751 | + /* quirk for UDA1321/N101. |
752 | + * note that detection between firmware 2.1.1.7 (N101) |
753 | + * and later 2.1.1.21 is not very clear from datasheets. |
754 | + * I hope that the min value is -15360 for newer firmware --jk |
755 | + */ |
756 | + if (!strcmp(kctl->id.name, "PCM Playback Volume") && |
757 | + cval->min == -15616) { |
758 | + snd_printk(KERN_INFO |
759 | + "set volume quirk for UDA1321/N101 chip\n"); |
760 | + cval->max = -256; |
761 | + } |
762 | + break; |
763 | + |
764 | + case USB_ID(0x046d, 0x09a4): |
765 | + if (!strcmp(kctl->id.name, "Mic Capture Volume")) { |
766 | + snd_printk(KERN_INFO |
767 | + "set volume quirk for QuickCam E3500\n"); |
768 | + cval->min = 6080; |
769 | + cval->max = 8768; |
770 | + cval->res = 192; |
771 | + } |
772 | + break; |
773 | + |
774 | + case USB_ID(0x046d, 0x0808): |
775 | + case USB_ID(0x046d, 0x0809): |
776 | + case USB_ID(0x046d, 0x0991): |
777 | + /* Most audio usb devices lie about volume resolution. |
778 | + * Most Logitech webcams have res = 384. |
779 | + * Proboly there is some logitech magic behind this number --fishor |
780 | + */ |
781 | + if (!strcmp(kctl->id.name, "Mic Capture Volume")) { |
782 | + snd_printk(KERN_INFO |
783 | + "set resolution quirk: cval->res = 384\n"); |
784 | + cval->res = 384; |
785 | + } |
786 | + break; |
787 | + |
788 | + } |
789 | +} |
790 | + |
791 | /* |
792 | * retrieve the minimum and maximum values for the specified control |
793 | */ |
794 | -static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) |
795 | +static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, |
796 | + int default_min, struct snd_kcontrol *kctl) |
797 | { |
798 | /* for failsafe */ |
799 | cval->min = default_min; |
800 | @@ -844,6 +894,9 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) |
801 | cval->initialized = 1; |
802 | } |
803 | |
804 | + if (kctl) |
805 | + volume_control_quirks(cval, kctl); |
806 | + |
807 | /* USB descriptions contain the dB scale in 1/256 dB unit |
808 | * while ALSA TLV contains in 1/100 dB unit |
809 | */ |
810 | @@ -864,6 +917,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) |
811 | return 0; |
812 | } |
813 | |
814 | +#define get_min_max(cval, def) get_min_max_with_quirks(cval, def, NULL) |
815 | |
816 | /* get a feature/mixer unit info */ |
817 | static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
818 | @@ -881,8 +935,17 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ |
819 | uinfo->value.integer.min = 0; |
820 | uinfo->value.integer.max = 1; |
821 | } else { |
822 | - if (! cval->initialized) |
823 | - get_min_max(cval, 0); |
824 | + if (!cval->initialized) { |
825 | + get_min_max_with_quirks(cval, 0, kcontrol); |
826 | + if (cval->initialized && cval->dBmin >= cval->dBmax) { |
827 | + kcontrol->vd[0].access &= |
828 | + ~(SNDRV_CTL_ELEM_ACCESS_TLV_READ | |
829 | + SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK); |
830 | + snd_ctl_notify(cval->mixer->chip->card, |
831 | + SNDRV_CTL_EVENT_MASK_INFO, |
832 | + &kcontrol->id); |
833 | + } |
834 | + } |
835 | uinfo->value.integer.min = 0; |
836 | uinfo->value.integer.max = |
837 | (cval->max - cval->min + cval->res - 1) / cval->res; |
838 | @@ -1036,9 +1099,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, |
839 | cval->ch_readonly = readonly_mask; |
840 | } |
841 | |
842 | - /* get min/max values */ |
843 | - get_min_max(cval, 0); |
844 | - |
845 | /* if all channels in the mask are marked read-only, make the control |
846 | * read-only. set_cur_mix_value() will check the mask again and won't |
847 | * issue write commands to read-only channels. */ |
848 | @@ -1060,6 +1120,9 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, |
849 | len = snd_usb_copy_string_desc(state, nameid, |
850 | kctl->id.name, sizeof(kctl->id.name)); |
851 | |
852 | + /* get min/max values */ |
853 | + get_min_max_with_quirks(cval, 0, kctl); |
854 | + |
855 | switch (control) { |
856 | case UAC_FU_MUTE: |
857 | case UAC_FU_VOLUME: |
858 | @@ -1109,51 +1172,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, |
859 | break; |
860 | } |
861 | |
862 | - /* volume control quirks */ |
863 | - switch (state->chip->usb_id) { |
864 | - case USB_ID(0x0471, 0x0101): |
865 | - case USB_ID(0x0471, 0x0104): |
866 | - case USB_ID(0x0471, 0x0105): |
867 | - case USB_ID(0x0672, 0x1041): |
868 | - /* quirk for UDA1321/N101. |
869 | - * note that detection between firmware 2.1.1.7 (N101) |
870 | - * and later 2.1.1.21 is not very clear from datasheets. |
871 | - * I hope that the min value is -15360 for newer firmware --jk |
872 | - */ |
873 | - if (!strcmp(kctl->id.name, "PCM Playback Volume") && |
874 | - cval->min == -15616) { |
875 | - snd_printk(KERN_INFO |
876 | - "set volume quirk for UDA1321/N101 chip\n"); |
877 | - cval->max = -256; |
878 | - } |
879 | - break; |
880 | - |
881 | - case USB_ID(0x046d, 0x09a4): |
882 | - if (!strcmp(kctl->id.name, "Mic Capture Volume")) { |
883 | - snd_printk(KERN_INFO |
884 | - "set volume quirk for QuickCam E3500\n"); |
885 | - cval->min = 6080; |
886 | - cval->max = 8768; |
887 | - cval->res = 192; |
888 | - } |
889 | - break; |
890 | - |
891 | - case USB_ID(0x046d, 0x0808): |
892 | - case USB_ID(0x046d, 0x0809): |
893 | - case USB_ID(0x046d, 0x0991): |
894 | - /* Most audio usb devices lie about volume resolution. |
895 | - * Most Logitech webcams have res = 384. |
896 | - * Proboly there is some logitech magic behind this number --fishor |
897 | - */ |
898 | - if (!strcmp(kctl->id.name, "Mic Capture Volume")) { |
899 | - snd_printk(KERN_INFO |
900 | - "set resolution quirk: cval->res = 384\n"); |
901 | - cval->res = 384; |
902 | - } |
903 | - break; |
904 | - |
905 | - } |
906 | - |
907 | range = (cval->max - cval->min) / cval->res; |
908 | /* Are there devices with volume range more than 255? I use a bit more |
909 | * to be sure. 384 is a resolution magic number found on Logitech |