diff options
author | David S. Miller <davem@davemloft.net> | 2008-10-08 17:56:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-10-08 17:56:41 -0400 |
commit | 4dd565134ece7e5d528d4c5288879310c54419e9 (patch) | |
tree | e08910d2d0feae0c030f8f01acc9b03eb760ad9a /drivers | |
parent | 071d7ab6649eb34a873a53e71635186e9117101d (diff) | |
parent | 69849375d6b13e94d08cdc94b49b11fbab454a0e (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/e1000e/ich8lan.c
drivers/net/e1000e/netdev.c
Diffstat (limited to 'drivers')
59 files changed, 450 insertions, 445 deletions
diff --git a/drivers/accessibility/braille/braille_console.c b/drivers/accessibility/braille/braille_console.c index 0a5f6b2114c5..d672cfe7ca59 100644 --- a/drivers/accessibility/braille/braille_console.c +++ b/drivers/accessibility/braille/braille_console.c | |||
@@ -376,6 +376,8 @@ int braille_register_console(struct console *console, int index, | |||
376 | console->flags |= CON_ENABLED; | 376 | console->flags |= CON_ENABLED; |
377 | console->index = index; | 377 | console->index = index; |
378 | braille_co = console; | 378 | braille_co = console; |
379 | register_keyboard_notifier(&keyboard_notifier_block); | ||
380 | register_vt_notifier(&vt_notifier_block); | ||
379 | return 0; | 381 | return 0; |
380 | } | 382 | } |
381 | 383 | ||
@@ -383,15 +385,8 @@ int braille_unregister_console(struct console *console) | |||
383 | { | 385 | { |
384 | if (braille_co != console) | 386 | if (braille_co != console) |
385 | return -EINVAL; | 387 | return -EINVAL; |
388 | unregister_keyboard_notifier(&keyboard_notifier_block); | ||
389 | unregister_vt_notifier(&vt_notifier_block); | ||
386 | braille_co = NULL; | 390 | braille_co = NULL; |
387 | return 0; | 391 | return 0; |
388 | } | 392 | } |
389 | |||
390 | static int __init braille_init(void) | ||
391 | { | ||
392 | register_keyboard_notifier(&keyboard_notifier_block); | ||
393 | register_vt_notifier(&vt_notifier_block); | ||
394 | return 0; | ||
395 | } | ||
396 | |||
397 | console_initcall(braille_init); | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 084109507c9f..8dd3336efd7e 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -165,8 +165,11 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
165 | "firmware_node"); | 165 | "firmware_node"); |
166 | ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, | 166 | ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, |
167 | "physical_node"); | 167 | "physical_node"); |
168 | if (acpi_dev->wakeup.flags.valid) | 168 | if (acpi_dev->wakeup.flags.valid) { |
169 | device_set_wakeup_capable(dev, true); | 169 | device_set_wakeup_capable(dev, true); |
170 | device_set_wakeup_enable(dev, | ||
171 | acpi_dev->wakeup.state.enabled); | ||
172 | } | ||
170 | } | 173 | } |
171 | 174 | ||
172 | return 0; | 175 | return 0; |
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c index 4ebbba2b6b19..bf5b04de02d1 100644 --- a/drivers/acpi/sleep/proc.c +++ b/drivers/acpi/sleep/proc.c | |||
@@ -377,6 +377,14 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) | |||
377 | return 0; | 377 | return 0; |
378 | } | 378 | } |
379 | 379 | ||
380 | static void physical_device_enable_wakeup(struct acpi_device *adev) | ||
381 | { | ||
382 | struct device *dev = acpi_get_physical_device(adev->handle); | ||
383 | |||
384 | if (dev && device_can_wakeup(dev)) | ||
385 | device_set_wakeup_enable(dev, adev->wakeup.state.enabled); | ||
386 | } | ||
387 | |||
380 | static ssize_t | 388 | static ssize_t |
381 | acpi_system_write_wakeup_device(struct file *file, | 389 | acpi_system_write_wakeup_device(struct file *file, |
382 | const char __user * buffer, | 390 | const char __user * buffer, |
@@ -411,6 +419,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
411 | } | 419 | } |
412 | } | 420 | } |
413 | if (found_dev) { | 421 | if (found_dev) { |
422 | physical_device_enable_wakeup(found_dev); | ||
414 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { | 423 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { |
415 | struct acpi_device *dev = container_of(node, | 424 | struct acpi_device *dev = container_of(node, |
416 | struct | 425 | struct |
@@ -428,6 +437,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
428 | dev->pnp.bus_id, found_dev->pnp.bus_id); | 437 | dev->pnp.bus_id, found_dev->pnp.bus_id); |
429 | dev->wakeup.state.enabled = | 438 | dev->wakeup.state.enabled = |
430 | found_dev->wakeup.state.enabled; | 439 | found_dev->wakeup.state.enabled; |
440 | physical_device_enable_wakeup(dev); | ||
431 | } | 441 | } |
432 | } | 442 | } |
433 | } | 443 | } |
diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 1e55a658e6ce..32f3a8ed8d3d 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c | |||
@@ -256,7 +256,6 @@ static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev) | |||
256 | BT_ERR("%s urb %p submission failed (%d)", | 256 | BT_ERR("%s urb %p submission failed (%d)", |
257 | hdev->name, urb, -err); | 257 | hdev->name, urb, -err); |
258 | usb_unanchor_urb(urb); | 258 | usb_unanchor_urb(urb); |
259 | kfree(buf); | ||
260 | } | 259 | } |
261 | 260 | ||
262 | usb_free_urb(urb); | 261 | usb_free_urb(urb); |
@@ -298,7 +297,6 @@ static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev) | |||
298 | BT_ERR("%s urb %p submission failed (%d)", | 297 | BT_ERR("%s urb %p submission failed (%d)", |
299 | hdev->name, urb, -err); | 298 | hdev->name, urb, -err); |
300 | usb_unanchor_urb(urb); | 299 | usb_unanchor_urb(urb); |
301 | kfree(buf); | ||
302 | } | 300 | } |
303 | 301 | ||
304 | usb_free_urb(urb); | 302 | usb_free_urb(urb); |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 29ae99817c60..af472e052732 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -102,6 +102,7 @@ static struct usb_device_id blacklist_table[] = { | |||
102 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, | 102 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, |
103 | 103 | ||
104 | /* Broadcom BCM2046 */ | 104 | /* Broadcom BCM2046 */ |
105 | { USB_DEVICE(0x0a5c, 0x2146), .driver_info = BTUSB_RESET }, | ||
105 | { USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET }, | 106 | { USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET }, |
106 | 107 | ||
107 | /* Apple MacBook Pro with Broadcom chip */ | 108 | /* Apple MacBook Pro with Broadcom chip */ |
@@ -113,6 +114,7 @@ static struct usb_device_id blacklist_table[] = { | |||
113 | 114 | ||
114 | /* Targus ACB10US */ | 115 | /* Targus ACB10US */ |
115 | { USB_DEVICE(0x0a5c, 0x2100), .driver_info = BTUSB_RESET }, | 116 | { USB_DEVICE(0x0a5c, 0x2100), .driver_info = BTUSB_RESET }, |
117 | { USB_DEVICE(0x0a5c, 0x2154), .driver_info = BTUSB_RESET }, | ||
116 | 118 | ||
117 | /* ANYCOM Bluetooth USB-200 and USB-250 */ | 119 | /* ANYCOM Bluetooth USB-200 and USB-250 */ |
118 | { USB_DEVICE(0x0a5c, 0x2111), .driver_info = BTUSB_RESET }, | 120 | { USB_DEVICE(0x0a5c, 0x2111), .driver_info = BTUSB_RESET }, |
@@ -150,6 +152,9 @@ static struct usb_device_id blacklist_table[] = { | |||
150 | { USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, | 152 | { USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, |
151 | { USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, | 153 | { USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, |
152 | 154 | ||
155 | /* Belkin F8T016 device */ | ||
156 | { USB_DEVICE(0x050d, 0x016a), .driver_info = BTUSB_RESET }, | ||
157 | |||
153 | /* Digianswer devices */ | 158 | /* Digianswer devices */ |
154 | { USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER }, | 159 | { USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER }, |
155 | { USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE }, | 160 | { USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE }, |
@@ -271,7 +276,6 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev) | |||
271 | BT_ERR("%s urb %p submission failed (%d)", | 276 | BT_ERR("%s urb %p submission failed (%d)", |
272 | hdev->name, urb, -err); | 277 | hdev->name, urb, -err); |
273 | usb_unanchor_urb(urb); | 278 | usb_unanchor_urb(urb); |
274 | kfree(buf); | ||
275 | } | 279 | } |
276 | 280 | ||
277 | usb_free_urb(urb); | 281 | usb_free_urb(urb); |
@@ -354,7 +358,6 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev) | |||
354 | BT_ERR("%s urb %p submission failed (%d)", | 358 | BT_ERR("%s urb %p submission failed (%d)", |
355 | hdev->name, urb, -err); | 359 | hdev->name, urb, -err); |
356 | usb_unanchor_urb(urb); | 360 | usb_unanchor_urb(urb); |
357 | kfree(buf); | ||
358 | } | 361 | } |
359 | 362 | ||
360 | usb_free_urb(urb); | 363 | usb_free_urb(urb); |
@@ -475,7 +478,6 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev) | |||
475 | BT_ERR("%s urb %p submission failed (%d)", | 478 | BT_ERR("%s urb %p submission failed (%d)", |
476 | hdev->name, urb, -err); | 479 | hdev->name, urb, -err); |
477 | usb_unanchor_urb(urb); | 480 | usb_unanchor_urb(urb); |
478 | kfree(buf); | ||
479 | } | 481 | } |
480 | 482 | ||
481 | usb_free_urb(urb); | 483 | usb_free_urb(urb); |
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index 94df91771243..0778d99aea7c 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
@@ -364,7 +364,7 @@ static void dw_dma_tasklet(unsigned long data) | |||
364 | int i; | 364 | int i; |
365 | 365 | ||
366 | status_block = dma_readl(dw, RAW.BLOCK); | 366 | status_block = dma_readl(dw, RAW.BLOCK); |
367 | status_xfer = dma_readl(dw, RAW.BLOCK); | 367 | status_xfer = dma_readl(dw, RAW.XFER); |
368 | status_err = dma_readl(dw, RAW.ERROR); | 368 | status_err = dma_readl(dw, RAW.ERROR); |
369 | 369 | ||
370 | dev_vdbg(dw->dma.dev, "tasklet: status_block=%x status_err=%x\n", | 370 | dev_vdbg(dw->dma.dev, "tasklet: status_block=%x status_err=%x\n", |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 8e93a797c93d..052879a6f853 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -780,10 +780,6 @@ config BLK_DEV_IDEDMA_PMAC | |||
780 | to transfer data to and from memory. Saying Y is safe and improves | 780 | to transfer data to and from memory. Saying Y is safe and improves |
781 | performance. | 781 | performance. |
782 | 782 | ||
783 | config BLK_DEV_IDE_SWARM | ||
784 | tristate "IDE for Sibyte evaluation boards" | ||
785 | depends on SIBYTE_SB1xxx_SOC | ||
786 | |||
787 | config BLK_DEV_IDE_AU1XXX | 783 | config BLK_DEV_IDE_AU1XXX |
788 | bool "IDE for AMD Alchemy Au1200" | 784 | bool "IDE for AMD Alchemy Au1200" |
789 | depends on SOC_AU1200 | 785 | depends on SOC_AU1200 |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 49a8c589e346..f16bb4667238 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -1661,7 +1661,9 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive) | |||
1661 | cdi->mask &= ~CDC_PLAY_AUDIO; | 1661 | cdi->mask &= ~CDC_PLAY_AUDIO; |
1662 | 1662 | ||
1663 | mechtype = buf[8 + 6] >> 5; | 1663 | mechtype = buf[8 + 6] >> 5; |
1664 | if (mechtype == mechtype_caddy || mechtype == mechtype_popup) | 1664 | if (mechtype == mechtype_caddy || |
1665 | mechtype == mechtype_popup || | ||
1666 | (drive->atapi_flags & IDE_AFLAG_NO_AUTOCLOSE)) | ||
1665 | cdi->mask |= CDC_CLOSE_TRAY; | 1667 | cdi->mask |= CDC_CLOSE_TRAY; |
1666 | 1668 | ||
1667 | if (cdi->sanyo_slot > 0) { | 1669 | if (cdi->sanyo_slot > 0) { |
@@ -1859,6 +1861,8 @@ static const struct cd_list_entry ide_cd_quirks_list[] = { | |||
1859 | { "MATSHITADVD-ROM SR-8176", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, | 1861 | { "MATSHITADVD-ROM SR-8176", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, |
1860 | { "MATSHITADVD-ROM SR-8174", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, | 1862 | { "MATSHITADVD-ROM SR-8174", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, |
1861 | { "Optiarc DVD RW AD-5200A", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, | 1863 | { "Optiarc DVD RW AD-5200A", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, |
1864 | { "Optiarc DVD RW AD-7200A", NULL, IDE_AFLAG_PLAY_AUDIO_OK }, | ||
1865 | { "Optiarc DVD RW AD-7543A", NULL, IDE_AFLAG_NO_AUTOCLOSE }, | ||
1862 | { NULL, NULL, 0 } | 1866 | { NULL, NULL, 0 } |
1863 | }; | 1867 | }; |
1864 | 1868 | ||
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index adc682755857..3fa07c0aeaa4 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -211,7 +211,7 @@ int ide_build_dmatable (ide_drive_t *drive, struct request *rq) | |||
211 | xcount = bcount & 0xffff; | 211 | xcount = bcount & 0xffff; |
212 | if (is_trm290) | 212 | if (is_trm290) |
213 | xcount = ((xcount >> 2) - 1) << 16; | 213 | xcount = ((xcount >> 2) - 1) << 16; |
214 | if (xcount == 0x0000) { | 214 | else if (xcount == 0x0000) { |
215 | /* | 215 | /* |
216 | * Most chipsets correctly interpret a length of 0x0000 as 64KB, | 216 | * Most chipsets correctly interpret a length of 0x0000 as 64KB, |
217 | * but at least one (e.g. CS5530) misinterprets it as zero (!). | 217 | * but at least one (e.g. CS5530) misinterprets it as zero (!). |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 994e41099b42..a51a30e9eab3 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -1492,7 +1492,7 @@ static struct device_attribute *ide_port_attrs[] = { | |||
1492 | 1492 | ||
1493 | static int ide_sysfs_register_port(ide_hwif_t *hwif) | 1493 | static int ide_sysfs_register_port(ide_hwif_t *hwif) |
1494 | { | 1494 | { |
1495 | int i, rc; | 1495 | int i, uninitialized_var(rc); |
1496 | 1496 | ||
1497 | for (i = 0; ide_port_attrs[i]; i++) { | 1497 | for (i = 0; ide_port_attrs[i]; i++) { |
1498 | rc = device_create_file(hwif->portdev, ide_port_attrs[i]); | 1498 | rc = device_create_file(hwif->portdev, ide_port_attrs[i]); |
diff --git a/drivers/ide/mips/Makefile b/drivers/ide/mips/Makefile index 677c7b2bac92..5873fa0b8769 100644 --- a/drivers/ide/mips/Makefile +++ b/drivers/ide/mips/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | obj-$(CONFIG_BLK_DEV_IDE_SWARM) += swarm.o | ||
2 | obj-$(CONFIG_BLK_DEV_IDE_AU1XXX) += au1xxx-ide.o | 1 | obj-$(CONFIG_BLK_DEV_IDE_AU1XXX) += au1xxx-ide.o |
3 | 2 | ||
4 | EXTRA_CFLAGS := -Idrivers/ide | 3 | EXTRA_CFLAGS := -Idrivers/ide |
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c deleted file mode 100644 index 39c9ee995857..000000000000 --- a/drivers/ide/mips/swarm.c +++ /dev/null | |||
@@ -1,197 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001, 2002, 2003 Broadcom Corporation | ||
3 | * Copyright (C) 2004 MontaVista Software Inc. | ||
4 | * Author: Manish Lachwani, mlachwani@mvista.com | ||
5 | * Copyright (C) 2004 MIPS Technologies, Inc. All rights reserved. | ||
6 | * Author: Maciej W. Rozycki <macro@mips.com> | ||
7 | * Copyright (c) 2006, 2008 Maciej W. Rozycki | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version 2 | ||
12 | * of the License, or (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
22 | */ | ||
23 | |||
24 | /* | ||
25 | * Derived loosely from ide-pmac.c, so: | ||
26 | * Copyright (C) 1998 Paul Mackerras. | ||
27 | * Copyright (C) 1995-1998 Mark Lord | ||
28 | */ | ||
29 | |||
30 | /* | ||
31 | * Boards with SiByte processors so far have supported IDE devices via | ||
32 | * the Generic Bus, PCI bus, and built-in PCMCIA interface. In all | ||
33 | * cases, byte-swapping must be avoided for these devices (whereas | ||
34 | * other PCI devices, for example, will require swapping). Any | ||
35 | * SiByte-targetted kernel including IDE support will include this | ||
36 | * file. Probing of a Generic Bus for an IDE device is controlled by | ||
37 | * the definition of "SIBYTE_HAVE_IDE", which is provided by | ||
38 | * <asm/sibyte/board.h> for Broadcom boards. | ||
39 | */ | ||
40 | |||
41 | #include <linux/ide.h> | ||
42 | #include <linux/ioport.h> | ||
43 | #include <linux/kernel.h> | ||
44 | #include <linux/types.h> | ||
45 | #include <linux/platform_device.h> | ||
46 | |||
47 | #include <asm/io.h> | ||
48 | |||
49 | #include <asm/sibyte/board.h> | ||
50 | #include <asm/sibyte/sb1250_genbus.h> | ||
51 | #include <asm/sibyte/sb1250_regs.h> | ||
52 | |||
53 | #define DRV_NAME "ide-swarm" | ||
54 | |||
55 | static char swarm_ide_string[] = DRV_NAME; | ||
56 | |||
57 | static struct resource swarm_ide_resource = { | ||
58 | .name = "SWARM GenBus IDE", | ||
59 | .flags = IORESOURCE_MEM, | ||
60 | }; | ||
61 | |||
62 | static struct platform_device *swarm_ide_dev; | ||
63 | |||
64 | static const struct ide_port_info swarm_port_info = { | ||
65 | .name = DRV_NAME, | ||
66 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | ||
67 | }; | ||
68 | |||
69 | /* | ||
70 | * swarm_ide_probe - if the board header indicates the existence of | ||
71 | * Generic Bus IDE, allocate a HWIF for it. | ||
72 | */ | ||
73 | static int __devinit swarm_ide_probe(struct device *dev) | ||
74 | { | ||
75 | u8 __iomem *base; | ||
76 | struct ide_host *host; | ||
77 | phys_t offset, size; | ||
78 | int i, rc; | ||
79 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; | ||
80 | |||
81 | if (!SIBYTE_HAVE_IDE) | ||
82 | return -ENODEV; | ||
83 | |||
84 | base = ioremap(A_IO_EXT_BASE, 0x800); | ||
85 | offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS)); | ||
86 | size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS)); | ||
87 | iounmap(base); | ||
88 | |||
89 | offset = G_IO_START_ADDR(offset) << S_IO_ADDRBASE; | ||
90 | size = (G_IO_MULT_SIZE(size) + 1) << S_IO_REGSIZE; | ||
91 | if (offset < A_PHYS_GENBUS || offset >= A_PHYS_GENBUS_END) { | ||
92 | printk(KERN_INFO DRV_NAME | ||
93 | ": IDE interface at GenBus disabled\n"); | ||
94 | return -EBUSY; | ||
95 | } | ||
96 | |||
97 | printk(KERN_INFO DRV_NAME ": IDE interface at GenBus slot %i\n", | ||
98 | IDE_CS); | ||
99 | |||
100 | swarm_ide_resource.start = offset; | ||
101 | swarm_ide_resource.end = offset + size - 1; | ||
102 | if (request_resource(&iomem_resource, &swarm_ide_resource)) { | ||
103 | printk(KERN_ERR DRV_NAME | ||
104 | ": can't request I/O memory resource\n"); | ||
105 | return -EBUSY; | ||
106 | } | ||
107 | |||
108 | base = ioremap(offset, size); | ||
109 | |||
110 | memset(&hw, 0, sizeof(hw)); | ||
111 | for (i = 0; i <= 7; i++) | ||
112 | hw.io_ports_array[i] = | ||
113 | (unsigned long)(base + ((0x1f0 + i) << 5)); | ||
114 | hw.io_ports.ctl_addr = | ||
115 | (unsigned long)(base + (0x3f6 << 5)); | ||
116 | hw.irq = K_INT_GB_IDE; | ||
117 | hw.chipset = ide_generic; | ||
118 | |||
119 | rc = ide_host_add(&swarm_port_info, hws, &host); | ||
120 | if (rc) | ||
121 | goto err; | ||
122 | |||
123 | dev_set_drvdata(dev, host); | ||
124 | |||
125 | return 0; | ||
126 | err: | ||
127 | release_resource(&swarm_ide_resource); | ||
128 | iounmap(base); | ||
129 | return rc; | ||
130 | } | ||
131 | |||
132 | static struct device_driver swarm_ide_driver = { | ||
133 | .name = swarm_ide_string, | ||
134 | .bus = &platform_bus_type, | ||
135 | .probe = swarm_ide_probe, | ||
136 | }; | ||
137 | |||
138 | static void swarm_ide_platform_release(struct device *device) | ||
139 | { | ||
140 | struct platform_device *pldev; | ||
141 | |||
142 | /* free device */ | ||
143 | pldev = to_platform_device(device); | ||
144 | kfree(pldev); | ||
145 | } | ||
146 | |||
147 | static int __devinit swarm_ide_init_module(void) | ||
148 | { | ||
149 | struct platform_device *pldev; | ||
150 | int err; | ||
151 | |||
152 | printk(KERN_INFO "SWARM IDE driver\n"); | ||
153 | |||
154 | if (driver_register(&swarm_ide_driver)) { | ||
155 | printk(KERN_ERR "Driver registration failed\n"); | ||
156 | err = -ENODEV; | ||
157 | goto out; | ||
158 | } | ||
159 | |||
160 | if (!(pldev = kzalloc(sizeof (*pldev), GFP_KERNEL))) { | ||
161 | err = -ENOMEM; | ||
162 | goto out_unregister_driver; | ||
163 | } | ||
164 | |||
165 | pldev->name = swarm_ide_string; | ||
166 | pldev->id = 0; | ||
167 | pldev->dev.release = swarm_ide_platform_release; | ||
168 | |||
169 | if (platform_device_register(pldev)) { | ||
170 | err = -ENODEV; | ||
171 | goto out_free_pldev; | ||
172 | } | ||
173 | |||
174 | if (!pldev->dev.driver) { | ||
175 | /* | ||
176 | * The driver was not bound to this device, there was | ||
177 | * no hardware at this address. Unregister it, as the | ||
178 | * release fuction will take care of freeing the | ||
179 | * allocated structure | ||
180 | */ | ||
181 | platform_device_unregister (pldev); | ||
182 | } | ||
183 | |||
184 | swarm_ide_dev = pldev; | ||
185 | |||
186 | return 0; | ||
187 | |||
188 | out_free_pldev: | ||
189 | kfree(pldev); | ||
190 | |||
191 | out_unregister_driver: | ||
192 | driver_unregister(&swarm_ide_driver); | ||
193 | out: | ||
194 | return err; | ||
195 | } | ||
196 | |||
197 | module_init(swarm_ide_init_module); | ||
diff --git a/drivers/leds/leds-fsg.c b/drivers/leds/leds-fsg.c index be0e12144b8b..34935155c1c0 100644 --- a/drivers/leds/leds-fsg.c +++ b/drivers/leds/leds-fsg.c | |||
@@ -161,6 +161,16 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
161 | { | 161 | { |
162 | int ret; | 162 | int ret; |
163 | 163 | ||
164 | /* Map the LED chip select address space */ | ||
165 | latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); | ||
166 | if (!latch_address) { | ||
167 | ret = -ENOMEM; | ||
168 | goto failremap; | ||
169 | } | ||
170 | |||
171 | latch_value = 0xffff; | ||
172 | *latch_address = latch_value; | ||
173 | |||
164 | ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); | 174 | ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); |
165 | if (ret < 0) | 175 | if (ret < 0) |
166 | goto failwlan; | 176 | goto failwlan; |
@@ -185,20 +195,8 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
185 | if (ret < 0) | 195 | if (ret < 0) |
186 | goto failring; | 196 | goto failring; |
187 | 197 | ||
188 | /* Map the LED chip select address space */ | ||
189 | latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); | ||
190 | if (!latch_address) { | ||
191 | ret = -ENOMEM; | ||
192 | goto failremap; | ||
193 | } | ||
194 | |||
195 | latch_value = 0xffff; | ||
196 | *latch_address = latch_value; | ||
197 | |||
198 | return ret; | 198 | return ret; |
199 | 199 | ||
200 | failremap: | ||
201 | led_classdev_unregister(&fsg_ring_led); | ||
202 | failring: | 200 | failring: |
203 | led_classdev_unregister(&fsg_sync_led); | 201 | led_classdev_unregister(&fsg_sync_led); |
204 | failsync: | 202 | failsync: |
@@ -210,14 +208,14 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
210 | failwan: | 208 | failwan: |
211 | led_classdev_unregister(&fsg_wlan_led); | 209 | led_classdev_unregister(&fsg_wlan_led); |
212 | failwlan: | 210 | failwlan: |
211 | iounmap(latch_address); | ||
212 | failremap: | ||
213 | 213 | ||
214 | return ret; | 214 | return ret; |
215 | } | 215 | } |
216 | 216 | ||
217 | static int fsg_led_remove(struct platform_device *pdev) | 217 | static int fsg_led_remove(struct platform_device *pdev) |
218 | { | 218 | { |
219 | iounmap(latch_address); | ||
220 | |||
221 | led_classdev_unregister(&fsg_wlan_led); | 219 | led_classdev_unregister(&fsg_wlan_led); |
222 | led_classdev_unregister(&fsg_wan_led); | 220 | led_classdev_unregister(&fsg_wan_led); |
223 | led_classdev_unregister(&fsg_sata_led); | 221 | led_classdev_unregister(&fsg_sata_led); |
@@ -225,6 +223,8 @@ static int fsg_led_remove(struct platform_device *pdev) | |||
225 | led_classdev_unregister(&fsg_sync_led); | 223 | led_classdev_unregister(&fsg_sync_led); |
226 | led_classdev_unregister(&fsg_ring_led); | 224 | led_classdev_unregister(&fsg_ring_led); |
227 | 225 | ||
226 | iounmap(latch_address); | ||
227 | |||
228 | return 0; | 228 | return 0; |
229 | } | 229 | } |
230 | 230 | ||
diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index 146c06972863..f508729123b5 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c | |||
@@ -248,11 +248,10 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
248 | const struct i2c_device_id *id) | 248 | const struct i2c_device_id *id) |
249 | { | 249 | { |
250 | struct pca955x_led *pca955x; | 250 | struct pca955x_led *pca955x; |
251 | int i; | ||
252 | int err = -ENODEV; | ||
253 | struct pca955x_chipdef *chip; | 251 | struct pca955x_chipdef *chip; |
254 | struct i2c_adapter *adapter; | 252 | struct i2c_adapter *adapter; |
255 | struct led_platform_data *pdata; | 253 | struct led_platform_data *pdata; |
254 | int i, err; | ||
256 | 255 | ||
257 | chip = &pca955x_chipdefs[id->driver_data]; | 256 | chip = &pca955x_chipdefs[id->driver_data]; |
258 | adapter = to_i2c_adapter(client->dev.parent); | 257 | adapter = to_i2c_adapter(client->dev.parent); |
@@ -282,43 +281,41 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
282 | } | 281 | } |
283 | } | 282 | } |
284 | 283 | ||
284 | pca955x = kzalloc(sizeof(*pca955x) * chip->bits, GFP_KERNEL); | ||
285 | if (!pca955x) | ||
286 | return -ENOMEM; | ||
287 | |||
288 | i2c_set_clientdata(client, pca955x); | ||
289 | |||
285 | for (i = 0; i < chip->bits; i++) { | 290 | for (i = 0; i < chip->bits; i++) { |
286 | pca955x = kzalloc(sizeof(struct pca955x_led), GFP_KERNEL); | 291 | pca955x[i].chipdef = chip; |
287 | if (!pca955x) { | 292 | pca955x[i].client = client; |
288 | err = -ENOMEM; | 293 | pca955x[i].led_num = i; |
289 | goto exit; | ||
290 | } | ||
291 | 294 | ||
292 | pca955x->chipdef = chip; | ||
293 | pca955x->client = client; | ||
294 | pca955x->led_num = i; | ||
295 | /* Platform data can specify LED names and default triggers */ | 295 | /* Platform data can specify LED names and default triggers */ |
296 | if (pdata) { | 296 | if (pdata) { |
297 | if (pdata->leds[i].name) | 297 | if (pdata->leds[i].name) |
298 | snprintf(pca955x->name, 32, "pca955x:%s", | 298 | snprintf(pca955x[i].name, |
299 | pdata->leds[i].name); | 299 | sizeof(pca955x[i].name), "pca955x:%s", |
300 | pdata->leds[i].name); | ||
300 | if (pdata->leds[i].default_trigger) | 301 | if (pdata->leds[i].default_trigger) |
301 | pca955x->led_cdev.default_trigger = | 302 | pca955x[i].led_cdev.default_trigger = |
302 | pdata->leds[i].default_trigger; | 303 | pdata->leds[i].default_trigger; |
303 | } else { | 304 | } else { |
304 | snprintf(pca955x->name, 32, "pca955x:%d", i); | 305 | snprintf(pca955x[i].name, sizeof(pca955x[i].name), |
306 | "pca955x:%d", i); | ||
305 | } | 307 | } |
306 | spin_lock_init(&pca955x->lock); | ||
307 | 308 | ||
308 | pca955x->led_cdev.name = pca955x->name; | 309 | spin_lock_init(&pca955x[i].lock); |
309 | pca955x->led_cdev.brightness_set = | ||
310 | pca955x_led_set; | ||
311 | 310 | ||
312 | /* | 311 | pca955x[i].led_cdev.name = pca955x[i].name; |
313 | * Client data is a pointer to the _first_ pca955x_led | 312 | pca955x[i].led_cdev.brightness_set = pca955x_led_set; |
314 | * struct | ||
315 | */ | ||
316 | if (i == 0) | ||
317 | i2c_set_clientdata(client, pca955x); | ||
318 | 313 | ||
319 | INIT_WORK(&(pca955x->work), pca955x_led_work); | 314 | INIT_WORK(&pca955x[i].work, pca955x_led_work); |
320 | 315 | ||
321 | led_classdev_register(&client->dev, &(pca955x->led_cdev)); | 316 | err = led_classdev_register(&client->dev, &pca955x[i].led_cdev); |
317 | if (err < 0) | ||
318 | goto exit; | ||
322 | } | 319 | } |
323 | 320 | ||
324 | /* Turn off LEDs */ | 321 | /* Turn off LEDs */ |
@@ -336,23 +333,32 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
336 | pca955x_write_psc(client, 1, 0); | 333 | pca955x_write_psc(client, 1, 0); |
337 | 334 | ||
338 | return 0; | 335 | return 0; |
336 | |||
339 | exit: | 337 | exit: |
338 | while (i--) { | ||
339 | led_classdev_unregister(&pca955x[i].led_cdev); | ||
340 | cancel_work_sync(&pca955x[i].work); | ||
341 | } | ||
342 | |||
343 | kfree(pca955x); | ||
344 | i2c_set_clientdata(client, NULL); | ||
345 | |||
340 | return err; | 346 | return err; |
341 | } | 347 | } |
342 | 348 | ||
343 | static int __devexit pca955x_remove(struct i2c_client *client) | 349 | static int __devexit pca955x_remove(struct i2c_client *client) |
344 | { | 350 | { |
345 | struct pca955x_led *pca955x = i2c_get_clientdata(client); | 351 | struct pca955x_led *pca955x = i2c_get_clientdata(client); |
346 | int leds = pca955x->chipdef->bits; | ||
347 | int i; | 352 | int i; |
348 | 353 | ||
349 | for (i = 0; i < leds; i++) { | 354 | for (i = 0; i < pca955x->chipdef->bits; i++) { |
350 | led_classdev_unregister(&(pca955x->led_cdev)); | 355 | led_classdev_unregister(&pca955x[i].led_cdev); |
351 | cancel_work_sync(&(pca955x->work)); | 356 | cancel_work_sync(&pca955x[i].work); |
352 | kfree(pca955x); | ||
353 | pca955x = pca955x + 1; | ||
354 | } | 357 | } |
355 | 358 | ||
359 | kfree(pca955x); | ||
360 | i2c_set_clientdata(client, NULL); | ||
361 | |||
356 | return 0; | 362 | return 0; |
357 | } | 363 | } |
358 | 364 | ||
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 71dd65aa31b6..c2fcf28b4c70 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -63,6 +63,7 @@ struct multipath { | |||
63 | 63 | ||
64 | const char *hw_handler_name; | 64 | const char *hw_handler_name; |
65 | struct work_struct activate_path; | 65 | struct work_struct activate_path; |
66 | struct pgpath *pgpath_to_activate; | ||
66 | unsigned nr_priority_groups; | 67 | unsigned nr_priority_groups; |
67 | struct list_head priority_groups; | 68 | struct list_head priority_groups; |
68 | unsigned pg_init_required; /* pg_init needs calling? */ | 69 | unsigned pg_init_required; /* pg_init needs calling? */ |
@@ -146,6 +147,7 @@ static struct priority_group *alloc_priority_group(void) | |||
146 | 147 | ||
147 | static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) | 148 | static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) |
148 | { | 149 | { |
150 | unsigned long flags; | ||
149 | struct pgpath *pgpath, *tmp; | 151 | struct pgpath *pgpath, *tmp; |
150 | struct multipath *m = ti->private; | 152 | struct multipath *m = ti->private; |
151 | 153 | ||
@@ -154,6 +156,10 @@ static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) | |||
154 | if (m->hw_handler_name) | 156 | if (m->hw_handler_name) |
155 | scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev)); | 157 | scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev)); |
156 | dm_put_device(ti, pgpath->path.dev); | 158 | dm_put_device(ti, pgpath->path.dev); |
159 | spin_lock_irqsave(&m->lock, flags); | ||
160 | if (m->pgpath_to_activate == pgpath) | ||
161 | m->pgpath_to_activate = NULL; | ||
162 | spin_unlock_irqrestore(&m->lock, flags); | ||
157 | free_pgpath(pgpath); | 163 | free_pgpath(pgpath); |
158 | } | 164 | } |
159 | } | 165 | } |
@@ -421,6 +427,7 @@ static void process_queued_ios(struct work_struct *work) | |||
421 | __choose_pgpath(m); | 427 | __choose_pgpath(m); |
422 | 428 | ||
423 | pgpath = m->current_pgpath; | 429 | pgpath = m->current_pgpath; |
430 | m->pgpath_to_activate = m->current_pgpath; | ||
424 | 431 | ||
425 | if ((pgpath && !m->queue_io) || | 432 | if ((pgpath && !m->queue_io) || |
426 | (!pgpath && !m->queue_if_no_path)) | 433 | (!pgpath && !m->queue_if_no_path)) |
@@ -1093,8 +1100,15 @@ static void activate_path(struct work_struct *work) | |||
1093 | int ret; | 1100 | int ret; |
1094 | struct multipath *m = | 1101 | struct multipath *m = |
1095 | container_of(work, struct multipath, activate_path); | 1102 | container_of(work, struct multipath, activate_path); |
1096 | struct dm_path *path = &m->current_pgpath->path; | 1103 | struct dm_path *path; |
1104 | unsigned long flags; | ||
1097 | 1105 | ||
1106 | spin_lock_irqsave(&m->lock, flags); | ||
1107 | path = &m->pgpath_to_activate->path; | ||
1108 | m->pgpath_to_activate = NULL; | ||
1109 | spin_unlock_irqrestore(&m->lock, flags); | ||
1110 | if (!path) | ||
1111 | return; | ||
1098 | ret = scsi_dh_activate(bdev_get_queue(path->dev->bdev)); | 1112 | ret = scsi_dh_activate(bdev_get_queue(path->dev->bdev)); |
1099 | pg_init_done(path, ret); | 1113 | pg_init_done(path, ret); |
1100 | } | 1114 | } |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bca448e11878..ace998ce59f6 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -837,12 +837,14 @@ static int dm_merge_bvec(struct request_queue *q, | |||
837 | struct dm_table *map = dm_get_table(md); | 837 | struct dm_table *map = dm_get_table(md); |
838 | struct dm_target *ti; | 838 | struct dm_target *ti; |
839 | sector_t max_sectors; | 839 | sector_t max_sectors; |
840 | int max_size; | 840 | int max_size = 0; |
841 | 841 | ||
842 | if (unlikely(!map)) | 842 | if (unlikely(!map)) |
843 | return 0; | 843 | goto out; |
844 | 844 | ||
845 | ti = dm_table_find_target(map, bvm->bi_sector); | 845 | ti = dm_table_find_target(map, bvm->bi_sector); |
846 | if (!dm_target_is_valid(ti)) | ||
847 | goto out_table; | ||
846 | 848 | ||
847 | /* | 849 | /* |
848 | * Find maximum amount of I/O that won't need splitting | 850 | * Find maximum amount of I/O that won't need splitting |
@@ -861,14 +863,16 @@ static int dm_merge_bvec(struct request_queue *q, | |||
861 | if (max_size && ti->type->merge) | 863 | if (max_size && ti->type->merge) |
862 | max_size = ti->type->merge(ti, bvm, biovec, max_size); | 864 | max_size = ti->type->merge(ti, bvm, biovec, max_size); |
863 | 865 | ||
866 | out_table: | ||
867 | dm_table_put(map); | ||
868 | |||
869 | out: | ||
864 | /* | 870 | /* |
865 | * Always allow an entire first page | 871 | * Always allow an entire first page |
866 | */ | 872 | */ |
867 | if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT)) | 873 | if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT)) |
868 | max_size = biovec->bv_len; | 874 | max_size = biovec->bv_len; |
869 | 875 | ||
870 | dm_table_put(map); | ||
871 | |||
872 | return max_size; | 876 | return max_size; |
873 | } | 877 | } |
874 | 878 | ||
diff --git a/drivers/media/common/tuners/tuner-xc2028.h b/drivers/media/common/tuners/tuner-xc2028.h index 216025cf5d4b..2c5b6282b569 100644 --- a/drivers/media/common/tuners/tuner-xc2028.h +++ b/drivers/media/common/tuners/tuner-xc2028.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #include "dvb_frontend.h" | 10 | #include "dvb_frontend.h" |
11 | 11 | ||
12 | #define XC2028_DEFAULT_FIRMWARE "xc3028-v27.fw" | 12 | #define XC2028_DEFAULT_FIRMWARE "xc3028-v27.fw" |
13 | #define XC3028L_DEFAULT_FIRMWARE "xc3028L-v36.fw" | ||
13 | 14 | ||
14 | /* Dmoduler IF (kHz) */ | 15 | /* Dmoduler IF (kHz) */ |
15 | #define XC3028_FE_DEFAULT 0 /* Don't load SCODE */ | 16 | #define XC3028_FE_DEFAULT 0 /* Don't load SCODE */ |
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c index 4eed783f4bce..a127a4175c40 100644 --- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c +++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c | |||
@@ -491,6 +491,7 @@ static struct s5h1420_config skystar2_rev2_7_s5h1420_config = { | |||
491 | .demod_address = 0x53, | 491 | .demod_address = 0x53, |
492 | .invert = 1, | 492 | .invert = 1, |
493 | .repeated_start_workaround = 1, | 493 | .repeated_start_workaround = 1, |
494 | .serial_mpeg = 1, | ||
494 | }; | 495 | }; |
495 | 496 | ||
496 | static struct itd1000_config skystar2_rev2_7_itd1000_config = { | 497 | static struct itd1000_config skystar2_rev2_7_itd1000_config = { |
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index 069d847ba887..0c733c66a441 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c | |||
@@ -364,15 +364,16 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, | |||
364 | enum dmx_success success) | 364 | enum dmx_success success) |
365 | { | 365 | { |
366 | struct dmxdev_filter *dmxdevfilter = filter->priv; | 366 | struct dmxdev_filter *dmxdevfilter = filter->priv; |
367 | unsigned long flags; | ||
367 | int ret; | 368 | int ret; |
368 | 369 | ||
369 | if (dmxdevfilter->buffer.error) { | 370 | if (dmxdevfilter->buffer.error) { |
370 | wake_up(&dmxdevfilter->buffer.queue); | 371 | wake_up(&dmxdevfilter->buffer.queue); |
371 | return 0; | 372 | return 0; |
372 | } | 373 | } |
373 | spin_lock(&dmxdevfilter->dev->lock); | 374 | spin_lock_irqsave(&dmxdevfilter->dev->lock, flags); |
374 | if (dmxdevfilter->state != DMXDEV_STATE_GO) { | 375 | if (dmxdevfilter->state != DMXDEV_STATE_GO) { |
375 | spin_unlock(&dmxdevfilter->dev->lock); | 376 | spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags); |
376 | return 0; | 377 | return 0; |
377 | } | 378 | } |
378 | del_timer(&dmxdevfilter->timer); | 379 | del_timer(&dmxdevfilter->timer); |
@@ -391,7 +392,7 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, | |||
391 | } | 392 | } |
392 | if (dmxdevfilter->params.sec.flags & DMX_ONESHOT) | 393 | if (dmxdevfilter->params.sec.flags & DMX_ONESHOT) |
393 | dmxdevfilter->state = DMXDEV_STATE_DONE; | 394 | dmxdevfilter->state = DMXDEV_STATE_DONE; |
394 | spin_unlock(&dmxdevfilter->dev->lock); | 395 | spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags); |
395 | wake_up(&dmxdevfilter->buffer.queue); | 396 | wake_up(&dmxdevfilter->buffer.queue); |
396 | return 0; | 397 | return 0; |
397 | } | 398 | } |
@@ -403,11 +404,12 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | |||
403 | { | 404 | { |
404 | struct dmxdev_filter *dmxdevfilter = feed->priv; | 405 | struct dmxdev_filter *dmxdevfilter = feed->priv; |
405 | struct dvb_ringbuffer *buffer; | 406 | struct dvb_ringbuffer *buffer; |
407 | unsigned long flags; | ||
406 | int ret; | 408 | int ret; |
407 | 409 | ||
408 | spin_lock(&dmxdevfilter->dev->lock); | 410 | spin_lock_irqsave(&dmxdevfilter->dev->lock, flags); |
409 | if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) { | 411 | if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) { |
410 | spin_unlock(&dmxdevfilter->dev->lock); | 412 | spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags); |
411 | return 0; | 413 | return 0; |
412 | } | 414 | } |
413 | 415 | ||
@@ -417,7 +419,7 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | |||
417 | else | 419 | else |
418 | buffer = &dmxdevfilter->dev->dvr_buffer; | 420 | buffer = &dmxdevfilter->dev->dvr_buffer; |
419 | if (buffer->error) { | 421 | if (buffer->error) { |
420 | spin_unlock(&dmxdevfilter->dev->lock); | 422 | spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags); |
421 | wake_up(&buffer->queue); | 423 | wake_up(&buffer->queue); |
422 | return 0; | 424 | return 0; |
423 | } | 425 | } |
@@ -428,7 +430,7 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | |||
428 | dvb_ringbuffer_flush(buffer); | 430 | dvb_ringbuffer_flush(buffer); |
429 | buffer->error = ret; | 431 | buffer->error = ret; |
430 | } | 432 | } |
431 | spin_unlock(&dmxdevfilter->dev->lock); | 433 | spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags); |
432 | wake_up(&buffer->queue); | 434 | wake_up(&buffer->queue); |
433 | return 0; | 435 | return 0; |
434 | } | 436 | } |
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index e2eca0b1fe7c..a2c1fd5d2f67 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c | |||
@@ -399,7 +399,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
399 | void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, | 399 | void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, |
400 | size_t count) | 400 | size_t count) |
401 | { | 401 | { |
402 | spin_lock(&demux->lock); | 402 | unsigned long flags; |
403 | |||
404 | spin_lock_irqsave(&demux->lock, flags); | ||
403 | 405 | ||
404 | while (count--) { | 406 | while (count--) { |
405 | if (buf[0] == 0x47) | 407 | if (buf[0] == 0x47) |
@@ -407,16 +409,17 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, | |||
407 | buf += 188; | 409 | buf += 188; |
408 | } | 410 | } |
409 | 411 | ||
410 | spin_unlock(&demux->lock); | 412 | spin_unlock_irqrestore(&demux->lock, flags); |
411 | } | 413 | } |
412 | 414 | ||
413 | EXPORT_SYMBOL(dvb_dmx_swfilter_packets); | 415 | EXPORT_SYMBOL(dvb_dmx_swfilter_packets); |
414 | 416 | ||
415 | void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) | 417 | void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) |
416 | { | 418 | { |
419 | unsigned long flags; | ||
417 | int p = 0, i, j; | 420 | int p = 0, i, j; |
418 | 421 | ||
419 | spin_lock(&demux->lock); | 422 | spin_lock_irqsave(&demux->lock, flags); |
420 | 423 | ||
421 | if (demux->tsbufp) { | 424 | if (demux->tsbufp) { |
422 | i = demux->tsbufp; | 425 | i = demux->tsbufp; |
@@ -449,17 +452,18 @@ void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) | |||
449 | } | 452 | } |
450 | 453 | ||
451 | bailout: | 454 | bailout: |
452 | spin_unlock(&demux->lock); | 455 | spin_unlock_irqrestore(&demux->lock, flags); |
453 | } | 456 | } |
454 | 457 | ||
455 | EXPORT_SYMBOL(dvb_dmx_swfilter); | 458 | EXPORT_SYMBOL(dvb_dmx_swfilter); |
456 | 459 | ||
457 | void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) | 460 | void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) |
458 | { | 461 | { |
462 | unsigned long flags; | ||
459 | int p = 0, i, j; | 463 | int p = 0, i, j; |
460 | u8 tmppack[188]; | 464 | u8 tmppack[188]; |
461 | 465 | ||
462 | spin_lock(&demux->lock); | 466 | spin_lock_irqsave(&demux->lock, flags); |
463 | 467 | ||
464 | if (demux->tsbufp) { | 468 | if (demux->tsbufp) { |
465 | i = demux->tsbufp; | 469 | i = demux->tsbufp; |
@@ -500,7 +504,7 @@ void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) | |||
500 | } | 504 | } |
501 | 505 | ||
502 | bailout: | 506 | bailout: |
503 | spin_unlock(&demux->lock); | 507 | spin_unlock_irqrestore(&demux->lock, flags); |
504 | } | 508 | } |
505 | 509 | ||
506 | EXPORT_SYMBOL(dvb_dmx_swfilter_204); | 510 | EXPORT_SYMBOL(dvb_dmx_swfilter_204); |
diff --git a/drivers/media/dvb/frontends/s5h1420.c b/drivers/media/dvb/frontends/s5h1420.c index 747d3fa2e5e5..2e9fd2893ede 100644 --- a/drivers/media/dvb/frontends/s5h1420.c +++ b/drivers/media/dvb/frontends/s5h1420.c | |||
@@ -59,7 +59,7 @@ struct s5h1420_state { | |||
59 | * it does not support repeated-start, workaround: write addr-1 | 59 | * it does not support repeated-start, workaround: write addr-1 |
60 | * and then read | 60 | * and then read |
61 | */ | 61 | */ |
62 | u8 shadow[255]; | 62 | u8 shadow[256]; |
63 | }; | 63 | }; |
64 | 64 | ||
65 | static u32 s5h1420_getsymbolrate(struct s5h1420_state* state); | 65 | static u32 s5h1420_getsymbolrate(struct s5h1420_state* state); |
@@ -94,8 +94,11 @@ static u8 s5h1420_readreg(struct s5h1420_state *state, u8 reg) | |||
94 | if (ret != 3) | 94 | if (ret != 3) |
95 | return ret; | 95 | return ret; |
96 | } else { | 96 | } else { |
97 | ret = i2c_transfer(state->i2c, &msg[1], 2); | 97 | ret = i2c_transfer(state->i2c, &msg[1], 1); |
98 | if (ret != 2) | 98 | if (ret != 1) |
99 | return ret; | ||
100 | ret = i2c_transfer(state->i2c, &msg[2], 1); | ||
101 | if (ret != 1) | ||
99 | return ret; | 102 | return ret; |
100 | } | 103 | } |
101 | 104 | ||
@@ -823,7 +826,7 @@ static int s5h1420_init (struct dvb_frontend* fe) | |||
823 | struct s5h1420_state* state = fe->demodulator_priv; | 826 | struct s5h1420_state* state = fe->demodulator_priv; |
824 | 827 | ||
825 | /* disable power down and do reset */ | 828 | /* disable power down and do reset */ |
826 | state->CON_1_val = 0x10; | 829 | state->CON_1_val = state->config->serial_mpeg << 4; |
827 | s5h1420_writereg(state, 0x02, state->CON_1_val); | 830 | s5h1420_writereg(state, 0x02, state->CON_1_val); |
828 | msleep(10); | 831 | msleep(10); |
829 | s5h1420_reset(state); | 832 | s5h1420_reset(state); |
diff --git a/drivers/media/dvb/frontends/s5h1420.h b/drivers/media/dvb/frontends/s5h1420.h index 4c913f142bc4..ff308136d865 100644 --- a/drivers/media/dvb/frontends/s5h1420.h +++ b/drivers/media/dvb/frontends/s5h1420.h | |||
@@ -32,10 +32,12 @@ struct s5h1420_config | |||
32 | u8 demod_address; | 32 | u8 demod_address; |
33 | 33 | ||
34 | /* does the inversion require inversion? */ | 34 | /* does the inversion require inversion? */ |
35 | u8 invert : 1; | 35 | u8 invert:1; |
36 | 36 | ||
37 | u8 repeated_start_workaround : 1; | 37 | u8 repeated_start_workaround:1; |
38 | u8 cdclk_polarity : 1; /* 1 == falling edge, 0 == raising edge */ | 38 | u8 cdclk_polarity:1; /* 1 == falling edge, 0 == raising edge */ |
39 | |||
40 | u8 serial_mpeg:1; | ||
39 | }; | 41 | }; |
40 | 42 | ||
41 | #if defined(CONFIG_DVB_S5H1420) || (defined(CONFIG_DVB_S5H1420_MODULE) && defined(MODULE)) | 43 | #if defined(CONFIG_DVB_S5H1420) || (defined(CONFIG_DVB_S5H1420_MODULE) && defined(MODULE)) |
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c index cc5efb643f33..9da260fe3fd1 100644 --- a/drivers/media/dvb/siano/sms-cards.c +++ b/drivers/media/dvb/siano/sms-cards.c | |||
@@ -40,6 +40,8 @@ struct usb_device_id smsusb_id_table[] = { | |||
40 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B }, | 40 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B }, |
41 | { USB_DEVICE(0x2040, 0x5500), | 41 | { USB_DEVICE(0x2040, 0x5500), |
42 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | 42 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, |
43 | { USB_DEVICE(0x2040, 0x5510), | ||
44 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | ||
43 | { USB_DEVICE(0x2040, 0x5580), | 45 | { USB_DEVICE(0x2040, 0x5580), |
44 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | 46 | .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, |
45 | { USB_DEVICE(0x2040, 0x5590), | 47 | { USB_DEVICE(0x2040, 0x5590), |
@@ -87,7 +89,7 @@ static struct sms_board sms_boards[] = { | |||
87 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw", | 89 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw", |
88 | }, | 90 | }, |
89 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { | 91 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { |
90 | .name = "Hauppauge WinTV-Nova-T-MiniStick", | 92 | .name = "Hauppauge WinTV MiniStick", |
91 | .type = SMS_NOVA_B0, | 93 | .type = SMS_NOVA_B0, |
92 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw", | 94 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw", |
93 | }, | 95 | }, |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 6ae4cc860efe..933eaef41ead 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
@@ -3431,7 +3431,7 @@ static int radio_open(struct inode *inode, struct file *file) | |||
3431 | dprintk("bttv: open minor=%d\n",minor); | 3431 | dprintk("bttv: open minor=%d\n",minor); |
3432 | 3432 | ||
3433 | for (i = 0; i < bttv_num; i++) { | 3433 | for (i = 0; i < bttv_num; i++) { |
3434 | if (bttvs[i].radio_dev->minor == minor) { | 3434 | if (bttvs[i].radio_dev && bttvs[i].radio_dev->minor == minor) { |
3435 | btv = &bttvs[i]; | 3435 | btv = &bttvs[i]; |
3436 | break; | 3436 | break; |
3437 | } | 3437 | } |
diff --git a/drivers/media/video/cafe_ccic.c b/drivers/media/video/cafe_ccic.c index c149b7d712e5..5405c30dbb04 100644 --- a/drivers/media/video/cafe_ccic.c +++ b/drivers/media/video/cafe_ccic.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
22 | #include <linux/mm.h> | ||
22 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
23 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
diff --git a/drivers/media/video/cpia2/cpia2_usb.c b/drivers/media/video/cpia2/cpia2_usb.c index a4574740350d..a8a199047cbd 100644 --- a/drivers/media/video/cpia2/cpia2_usb.c +++ b/drivers/media/video/cpia2/cpia2_usb.c | |||
@@ -632,7 +632,7 @@ int cpia2_usb_transfer_cmd(struct camera_data *cam, | |||
632 | static int submit_urbs(struct camera_data *cam) | 632 | static int submit_urbs(struct camera_data *cam) |
633 | { | 633 | { |
634 | struct urb *urb; | 634 | struct urb *urb; |
635 | int fx, err, i; | 635 | int fx, err, i, j; |
636 | 636 | ||
637 | for(i=0; i<NUM_SBUF; ++i) { | 637 | for(i=0; i<NUM_SBUF; ++i) { |
638 | if (cam->sbuf[i].data) | 638 | if (cam->sbuf[i].data) |
@@ -657,6 +657,9 @@ static int submit_urbs(struct camera_data *cam) | |||
657 | } | 657 | } |
658 | urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL); | 658 | urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL); |
659 | if (!urb) { | 659 | if (!urb) { |
660 | ERR("%s: usb_alloc_urb error!\n", __func__); | ||
661 | for (j = 0; j < i; j++) | ||
662 | usb_free_urb(cam->sbuf[j].urb); | ||
660 | return -ENOMEM; | 663 | return -ENOMEM; |
661 | } | 664 | } |
662 | 665 | ||
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index 8fe5f38c4d7c..3cb9734ec07b 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
@@ -163,7 +163,7 @@ static const struct cx18_card cx18_card_h900 = { | |||
163 | }, | 163 | }, |
164 | .audio_inputs = { | 164 | .audio_inputs = { |
165 | { CX18_CARD_INPUT_AUD_TUNER, | 165 | { CX18_CARD_INPUT_AUD_TUNER, |
166 | CX18_AV_AUDIO8, 0 }, | 166 | CX18_AV_AUDIO5, 0 }, |
167 | { CX18_CARD_INPUT_LINE_IN1, | 167 | { CX18_CARD_INPUT_LINE_IN1, |
168 | CX18_AV_AUDIO_SERIAL1, 0 }, | 168 | CX18_AV_AUDIO_SERIAL1, 0 }, |
169 | }, | 169 | }, |
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 3c006103c1eb..ac3292d7646c 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
@@ -117,10 +117,10 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
117 | 117 | ||
118 | if (oldptr + length >= runtime->buffer_size) { | 118 | if (oldptr + length >= runtime->buffer_size) { |
119 | unsigned int cnt = | 119 | unsigned int cnt = |
120 | runtime->buffer_size - oldptr - 1; | 120 | runtime->buffer_size - oldptr; |
121 | memcpy(runtime->dma_area + oldptr * stride, cp, | 121 | memcpy(runtime->dma_area + oldptr * stride, cp, |
122 | cnt * stride); | 122 | cnt * stride); |
123 | memcpy(runtime->dma_area, cp + cnt, | 123 | memcpy(runtime->dma_area, cp + cnt * stride, |
124 | length * stride - cnt * stride); | 124 | length * stride - cnt * stride); |
125 | } else { | 125 | } else { |
126 | memcpy(runtime->dma_area + oldptr * stride, cp, | 126 | memcpy(runtime->dma_area + oldptr * stride, cp, |
@@ -161,8 +161,14 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) | |||
161 | 161 | ||
162 | memset(dev->adev->transfer_buffer[i], 0x80, sb_size); | 162 | memset(dev->adev->transfer_buffer[i], 0x80, sb_size); |
163 | urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC); | 163 | urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC); |
164 | if (!urb) | 164 | if (!urb) { |
165 | em28xx_errdev("usb_alloc_urb failed!\n"); | ||
166 | for (j = 0; j < i; j++) { | ||
167 | usb_free_urb(dev->adev->urb[j]); | ||
168 | kfree(dev->adev->transfer_buffer[j]); | ||
169 | } | ||
165 | return -ENOMEM; | 170 | return -ENOMEM; |
171 | } | ||
166 | 172 | ||
167 | urb->dev = dev->udev; | 173 | urb->dev = dev->udev; |
168 | urb->context = dev; | 174 | urb->context = dev; |
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 452da70e719f..de943cf6c169 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -93,28 +93,6 @@ struct em28xx_board em28xx_boards[] = { | |||
93 | .amux = 0, | 93 | .amux = 0, |
94 | } }, | 94 | } }, |
95 | }, | 95 | }, |
96 | [EM2800_BOARD_KWORLD_USB2800] = { | ||
97 | .name = "Kworld USB2800", | ||
98 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
99 | .is_em2800 = 1, | ||
100 | .vchannels = 3, | ||
101 | .tuner_type = TUNER_PHILIPS_FCV1236D, | ||
102 | .tda9887_conf = TDA9887_PRESENT, | ||
103 | .decoder = EM28XX_SAA7113, | ||
104 | .input = { { | ||
105 | .type = EM28XX_VMUX_TELEVISION, | ||
106 | .vmux = SAA7115_COMPOSITE2, | ||
107 | .amux = 0, | ||
108 | }, { | ||
109 | .type = EM28XX_VMUX_COMPOSITE1, | ||
110 | .vmux = SAA7115_COMPOSITE0, | ||
111 | .amux = 1, | ||
112 | }, { | ||
113 | .type = EM28XX_VMUX_SVIDEO, | ||
114 | .vmux = SAA7115_SVIDEO3, | ||
115 | .amux = 1, | ||
116 | } }, | ||
117 | }, | ||
118 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { | 96 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { |
119 | .name = "Kworld PVR TV 2800 RF", | 97 | .name = "Kworld PVR TV 2800 RF", |
120 | .is_em2800 = 0, | 98 | .is_em2800 = 0, |
@@ -599,7 +577,7 @@ struct em28xx_board em28xx_boards[] = { | |||
599 | }, { | 577 | }, { |
600 | .type = EM28XX_VMUX_COMPOSITE1, | 578 | .type = EM28XX_VMUX_COMPOSITE1, |
601 | .vmux = TVP5150_COMPOSITE1, | 579 | .vmux = TVP5150_COMPOSITE1, |
602 | .amux = 1, | 580 | .amux = 3, |
603 | }, { | 581 | }, { |
604 | .type = EM28XX_VMUX_SVIDEO, | 582 | .type = EM28XX_VMUX_SVIDEO, |
605 | .vmux = TVP5150_SVIDEO, | 583 | .vmux = TVP5150_SVIDEO, |
@@ -952,22 +930,23 @@ struct em28xx_board em28xx_boards[] = { | |||
952 | }, | 930 | }, |
953 | [EM2880_BOARD_KWORLD_DVB_310U] = { | 931 | [EM2880_BOARD_KWORLD_DVB_310U] = { |
954 | .name = "KWorld DVB-T 310U", | 932 | .name = "KWorld DVB-T 310U", |
955 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
956 | .vchannels = 3, | 933 | .vchannels = 3, |
957 | .tuner_type = TUNER_XC2028, | 934 | .tuner_type = TUNER_XC2028, |
935 | .has_dvb = 1, | ||
936 | .mts_firmware = 1, | ||
958 | .decoder = EM28XX_TVP5150, | 937 | .decoder = EM28XX_TVP5150, |
959 | .input = { { | 938 | .input = { { |
960 | .type = EM28XX_VMUX_TELEVISION, | 939 | .type = EM28XX_VMUX_TELEVISION, |
961 | .vmux = TVP5150_COMPOSITE0, | 940 | .vmux = TVP5150_COMPOSITE0, |
962 | .amux = 0, | 941 | .amux = EM28XX_AMUX_VIDEO, |
963 | }, { | 942 | }, { |
964 | .type = EM28XX_VMUX_COMPOSITE1, | 943 | .type = EM28XX_VMUX_COMPOSITE1, |
965 | .vmux = TVP5150_COMPOSITE1, | 944 | .vmux = TVP5150_COMPOSITE1, |
966 | .amux = 1, | 945 | .amux = EM28XX_AMUX_AC97_LINE_IN, |
967 | }, { | 946 | }, { /* S-video has not been tested yet */ |
968 | .type = EM28XX_VMUX_SVIDEO, | 947 | .type = EM28XX_VMUX_SVIDEO, |
969 | .vmux = TVP5150_SVIDEO, | 948 | .vmux = TVP5150_SVIDEO, |
970 | .amux = 1, | 949 | .amux = EM28XX_AMUX_AC97_LINE_IN, |
971 | } }, | 950 | } }, |
972 | }, | 951 | }, |
973 | [EM2881_BOARD_DNT_DA2_HYBRID] = { | 952 | [EM2881_BOARD_DNT_DA2_HYBRID] = { |
@@ -1282,6 +1261,7 @@ static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = { | |||
1282 | static struct em28xx_hash_table em28xx_eeprom_hash [] = { | 1261 | static struct em28xx_hash_table em28xx_eeprom_hash [] = { |
1283 | /* P/N: SA 60002070465 Tuner: TVF7533-MF */ | 1262 | /* P/N: SA 60002070465 Tuner: TVF7533-MF */ |
1284 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, | 1263 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, |
1264 | {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, | ||
1285 | }; | 1265 | }; |
1286 | 1266 | ||
1287 | /* I2C devicelist hash table for devices with generic USB IDs */ | 1267 | /* I2C devicelist hash table for devices with generic USB IDs */ |
@@ -1552,9 +1532,12 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) | |||
1552 | /* djh - Not sure which demod we need here */ | 1532 | /* djh - Not sure which demod we need here */ |
1553 | ctl->demod = XC3028_FE_DEFAULT; | 1533 | ctl->demod = XC3028_FE_DEFAULT; |
1554 | break; | 1534 | break; |
1535 | case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: | ||
1536 | ctl->demod = XC3028_FE_DEFAULT; | ||
1537 | ctl->fname = XC3028L_DEFAULT_FIRMWARE; | ||
1538 | break; | ||
1555 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: | 1539 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: |
1556 | case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: | 1540 | case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: |
1557 | case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: | ||
1558 | /* FIXME: Better to specify the needed IF */ | 1541 | /* FIXME: Better to specify the needed IF */ |
1559 | ctl->demod = XC3028_FE_DEFAULT; | 1542 | ctl->demod = XC3028_FE_DEFAULT; |
1560 | break; | 1543 | break; |
@@ -1764,6 +1747,20 @@ void em28xx_card_setup(struct em28xx *dev) | |||
1764 | break; | 1747 | break; |
1765 | case EM2820_BOARD_UNKNOWN: | 1748 | case EM2820_BOARD_UNKNOWN: |
1766 | case EM2800_BOARD_UNKNOWN: | 1749 | case EM2800_BOARD_UNKNOWN: |
1750 | /* | ||
1751 | * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. | ||
1752 | * | ||
1753 | * This occurs because they share identical USB vendor and | ||
1754 | * product IDs. | ||
1755 | * | ||
1756 | * What we do here is look up the EEPROM hash of the K-WORLD | ||
1757 | * and if it is found then we decide that we do not have | ||
1758 | * a DIGIVOX and reset the device to the K-WORLD instead. | ||
1759 | * | ||
1760 | * This solution is only valid if they do not share eeprom | ||
1761 | * hash identities which has not been determined as yet. | ||
1762 | */ | ||
1763 | case EM2880_BOARD_MSI_DIGIVOX_AD: | ||
1767 | if (!em28xx_hint_board(dev)) | 1764 | if (!em28xx_hint_board(dev)) |
1768 | em28xx_set_model(dev); | 1765 | em28xx_set_model(dev); |
1769 | break; | 1766 | break; |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index 4b992bc0083c..d2b1a1a52689 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -452,6 +452,15 @@ static int dvb_init(struct em28xx *dev) | |||
452 | goto out_free; | 452 | goto out_free; |
453 | } | 453 | } |
454 | break; | 454 | break; |
455 | case EM2880_BOARD_KWORLD_DVB_310U: | ||
456 | dvb->frontend = dvb_attach(zl10353_attach, | ||
457 | &em28xx_zl10353_with_xc3028, | ||
458 | &dev->i2c_adap); | ||
459 | if (attach_xc3028(0x61, dev) < 0) { | ||
460 | result = -EINVAL; | ||
461 | goto out_free; | ||
462 | } | ||
463 | break; | ||
455 | default: | 464 | default: |
456 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card" | 465 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card" |
457 | " isn't supported yet\n", | 466 | " isn't supported yet\n", |
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 7be69284da03..ac95c55887df 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -459,6 +459,7 @@ static int create_urbs(struct gspca_dev *gspca_dev, | |||
459 | urb = usb_alloc_urb(npkt, GFP_KERNEL); | 459 | urb = usb_alloc_urb(npkt, GFP_KERNEL); |
460 | if (!urb) { | 460 | if (!urb) { |
461 | err("usb_alloc_urb failed"); | 461 | err("usb_alloc_urb failed"); |
462 | destroy_urbs(gspca_dev); | ||
462 | return -ENOMEM; | 463 | return -ENOMEM; |
463 | } | 464 | } |
464 | urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev, | 465 | urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev, |
@@ -468,8 +469,8 @@ static int create_urbs(struct gspca_dev *gspca_dev, | |||
468 | 469 | ||
469 | if (urb->transfer_buffer == NULL) { | 470 | if (urb->transfer_buffer == NULL) { |
470 | usb_free_urb(urb); | 471 | usb_free_urb(urb); |
471 | destroy_urbs(gspca_dev); | ||
472 | err("usb_buffer_urb failed"); | 472 | err("usb_buffer_urb failed"); |
473 | destroy_urbs(gspca_dev); | ||
473 | return -ENOMEM; | 474 | return -ENOMEM; |
474 | } | 475 | } |
475 | gspca_dev->urb[n] = urb; | 476 | gspca_dev->urb[n] = urb; |
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c index d4be51843286..ba865b7f1ed8 100644 --- a/drivers/media/video/gspca/pac7311.c +++ b/drivers/media/video/gspca/pac7311.c | |||
@@ -1063,6 +1063,7 @@ static __devinitdata struct usb_device_id device_table[] = { | |||
1063 | {USB_DEVICE(0x093a, 0x2621), .driver_info = SENSOR_PAC7302}, | 1063 | {USB_DEVICE(0x093a, 0x2621), .driver_info = SENSOR_PAC7302}, |
1064 | {USB_DEVICE(0x093a, 0x2624), .driver_info = SENSOR_PAC7302}, | 1064 | {USB_DEVICE(0x093a, 0x2624), .driver_info = SENSOR_PAC7302}, |
1065 | {USB_DEVICE(0x093a, 0x2626), .driver_info = SENSOR_PAC7302}, | 1065 | {USB_DEVICE(0x093a, 0x2626), .driver_info = SENSOR_PAC7302}, |
1066 | {USB_DEVICE(0x093a, 0x262a), .driver_info = SENSOR_PAC7302}, | ||
1066 | {} | 1067 | {} |
1067 | }; | 1068 | }; |
1068 | MODULE_DEVICE_TABLE(usb, device_table); | 1069 | MODULE_DEVICE_TABLE(usb, device_table); |
diff --git a/drivers/media/video/gspca/sonixb.c b/drivers/media/video/gspca/sonixb.c index 5dd78c6766ea..12b81ae526b7 100644 --- a/drivers/media/video/gspca/sonixb.c +++ b/drivers/media/video/gspca/sonixb.c | |||
@@ -232,7 +232,7 @@ static struct ctrl sd_ctrls[] = { | |||
232 | static struct v4l2_pix_format vga_mode[] = { | 232 | static struct v4l2_pix_format vga_mode[] = { |
233 | {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, | 233 | {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, |
234 | .bytesperline = 160, | 234 | .bytesperline = 160, |
235 | .sizeimage = 160 * 120 * 5 / 4, | 235 | .sizeimage = 160 * 120, |
236 | .colorspace = V4L2_COLORSPACE_SRGB, | 236 | .colorspace = V4L2_COLORSPACE_SRGB, |
237 | .priv = 2 | MODE_RAW}, | 237 | .priv = 2 | MODE_RAW}, |
238 | {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE, | 238 | {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE, |
@@ -264,7 +264,7 @@ static struct v4l2_pix_format sif_mode[] = { | |||
264 | .priv = 1 | MODE_REDUCED_SIF}, | 264 | .priv = 1 | MODE_REDUCED_SIF}, |
265 | {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, | 265 | {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, |
266 | .bytesperline = 176, | 266 | .bytesperline = 176, |
267 | .sizeimage = 176 * 144 * 5 / 4, | 267 | .sizeimage = 176 * 144, |
268 | .colorspace = V4L2_COLORSPACE_SRGB, | 268 | .colorspace = V4L2_COLORSPACE_SRGB, |
269 | .priv = 1 | MODE_RAW}, | 269 | .priv = 1 | MODE_RAW}, |
270 | {176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE, | 270 | {176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE, |
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index d75b1d20b318..572b0f363b64 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
@@ -707,6 +707,7 @@ static void i2c_w8(struct gspca_dev *gspca_dev, | |||
707 | 0x08, 0, /* value, index */ | 707 | 0x08, 0, /* value, index */ |
708 | gspca_dev->usb_buf, 8, | 708 | gspca_dev->usb_buf, 8, |
709 | 500); | 709 | 500); |
710 | msleep(2); | ||
710 | } | 711 | } |
711 | 712 | ||
712 | /* read 5 bytes in gspca_dev->usb_buf */ | 713 | /* read 5 bytes in gspca_dev->usb_buf */ |
@@ -976,13 +977,13 @@ static int sd_init(struct gspca_dev *gspca_dev) | |||
976 | case BRIDGE_SN9C105: | 977 | case BRIDGE_SN9C105: |
977 | if (regF1 != 0x11) | 978 | if (regF1 != 0x11) |
978 | return -ENODEV; | 979 | return -ENODEV; |
979 | reg_w(gspca_dev, 0x02, regGpio, 2); | 980 | reg_w(gspca_dev, 0x01, regGpio, 2); |
980 | break; | 981 | break; |
981 | case BRIDGE_SN9C120: | 982 | case BRIDGE_SN9C120: |
982 | if (regF1 != 0x12) | 983 | if (regF1 != 0x12) |
983 | return -ENODEV; | 984 | return -ENODEV; |
984 | regGpio[1] = 0x70; | 985 | regGpio[1] = 0x70; |
985 | reg_w(gspca_dev, 0x02, regGpio, 2); | 986 | reg_w(gspca_dev, 0x01, regGpio, 2); |
986 | break; | 987 | break; |
987 | default: | 988 | default: |
988 | /* case BRIDGE_SN9C110: */ | 989 | /* case BRIDGE_SN9C110: */ |
@@ -1183,7 +1184,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1183 | static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; | 1184 | static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; |
1184 | static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */ | 1185 | static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */ |
1185 | static const __u8 CE_ov76xx[] = | 1186 | static const __u8 CE_ov76xx[] = |
1186 | { 0x32, 0xdd, 0x32, 0xdd }; /* OV7630/48 */ | 1187 | { 0x32, 0xdd, 0x32, 0xdd }; |
1187 | 1188 | ||
1188 | sn9c1xx = sn_tb[(int) sd->sensor]; | 1189 | sn9c1xx = sn_tb[(int) sd->sensor]; |
1189 | configure_gpio(gspca_dev, sn9c1xx); | 1190 | configure_gpio(gspca_dev, sn9c1xx); |
@@ -1223,8 +1224,15 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1223 | reg_w(gspca_dev, 0x20, gamma_def, sizeof gamma_def); | 1224 | reg_w(gspca_dev, 0x20, gamma_def, sizeof gamma_def); |
1224 | for (i = 0; i < 8; i++) | 1225 | for (i = 0; i < 8; i++) |
1225 | reg_w(gspca_dev, 0x84, reg84, sizeof reg84); | 1226 | reg_w(gspca_dev, 0x84, reg84, sizeof reg84); |
1227 | switch (sd->sensor) { | ||
1228 | case SENSOR_OV7660: | ||
1229 | reg_w1(gspca_dev, 0x9a, 0x05); | ||
1230 | break; | ||
1231 | default: | ||
1226 | reg_w1(gspca_dev, 0x9a, 0x08); | 1232 | reg_w1(gspca_dev, 0x9a, 0x08); |
1227 | reg_w1(gspca_dev, 0x99, 0x59); | 1233 | reg_w1(gspca_dev, 0x99, 0x59); |
1234 | break; | ||
1235 | } | ||
1228 | 1236 | ||
1229 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; | 1237 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; |
1230 | if (mode) | 1238 | if (mode) |
@@ -1275,8 +1283,8 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1275 | /* reg1 = 0x44; */ | 1283 | /* reg1 = 0x44; */ |
1276 | /* reg1 = 0x46; (done) */ | 1284 | /* reg1 = 0x46; (done) */ |
1277 | } else { | 1285 | } else { |
1278 | reg17 = 0x22; /* 640 MCKSIZE */ | 1286 | reg17 = 0xa2; /* 640 */ |
1279 | reg1 = 0x06; | 1287 | reg1 = 0x44; |
1280 | } | 1288 | } |
1281 | break; | 1289 | break; |
1282 | } | 1290 | } |
@@ -1285,6 +1293,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
1285 | switch (sd->sensor) { | 1293 | switch (sd->sensor) { |
1286 | case SENSOR_OV7630: | 1294 | case SENSOR_OV7630: |
1287 | case SENSOR_OV7648: | 1295 | case SENSOR_OV7648: |
1296 | case SENSOR_OV7660: | ||
1288 | reg_w(gspca_dev, 0xce, CE_ov76xx, 4); | 1297 | reg_w(gspca_dev, 0xce, CE_ov76xx, 4); |
1289 | break; | 1298 | break; |
1290 | default: | 1299 | default: |
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index cfbc9ebc5c5d..95fcfcb9e31b 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c | |||
@@ -225,7 +225,7 @@ static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode) | |||
225 | reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01)); | 225 | reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01)); |
226 | do { | 226 | do { |
227 | reg_r(gspca_dev, 0x8803, 1); | 227 | reg_r(gspca_dev, 0x8803, 1); |
228 | if (!gspca_dev->usb_buf) | 228 | if (!gspca_dev->usb_buf[0]) |
229 | break; | 229 | break; |
230 | } while (--retry); | 230 | } while (--retry); |
231 | if (retry == 0) | 231 | if (retry == 0) |
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index 8d7c27e6ac77..d61ef727e0c2 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
@@ -6576,8 +6576,8 @@ static int setlightfreq(struct gspca_dev *gspca_dev) | |||
6576 | cs2102_60HZ, cs2102_60HZScale}, | 6576 | cs2102_60HZ, cs2102_60HZScale}, |
6577 | /* SENSOR_CS2102K 1 */ | 6577 | /* SENSOR_CS2102K 1 */ |
6578 | {cs2102_NoFliker, cs2102_NoFlikerScale, | 6578 | {cs2102_NoFliker, cs2102_NoFlikerScale, |
6579 | cs2102_50HZ, cs2102_50HZScale, | 6579 | NULL, NULL, /* currently disabled */ |
6580 | cs2102_60HZ, cs2102_60HZScale}, | 6580 | NULL, NULL}, |
6581 | /* SENSOR_GC0305 2 */ | 6581 | /* SENSOR_GC0305 2 */ |
6582 | {gc0305_NoFliker, gc0305_NoFliker, | 6582 | {gc0305_NoFliker, gc0305_NoFliker, |
6583 | gc0305_50HZ, gc0305_50HZ, | 6583 | gc0305_50HZ, gc0305_50HZ, |
diff --git a/drivers/media/video/ov511.c b/drivers/media/video/ov511.c index 3d3c48db45d9..c6852402c5e9 100644 --- a/drivers/media/video/ov511.c +++ b/drivers/media/video/ov511.c | |||
@@ -3591,7 +3591,7 @@ static int | |||
3591 | ov51x_init_isoc(struct usb_ov511 *ov) | 3591 | ov51x_init_isoc(struct usb_ov511 *ov) |
3592 | { | 3592 | { |
3593 | struct urb *urb; | 3593 | struct urb *urb; |
3594 | int fx, err, n, size; | 3594 | int fx, err, n, i, size; |
3595 | 3595 | ||
3596 | PDEBUG(3, "*** Initializing capture ***"); | 3596 | PDEBUG(3, "*** Initializing capture ***"); |
3597 | 3597 | ||
@@ -3662,6 +3662,8 @@ ov51x_init_isoc(struct usb_ov511 *ov) | |||
3662 | urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL); | 3662 | urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL); |
3663 | if (!urb) { | 3663 | if (!urb) { |
3664 | err("init isoc: usb_alloc_urb ret. NULL"); | 3664 | err("init isoc: usb_alloc_urb ret. NULL"); |
3665 | for (i = 0; i < n; i++) | ||
3666 | usb_free_urb(ov->sbuf[i].urb); | ||
3665 | return -ENOMEM; | 3667 | return -ENOMEM; |
3666 | } | 3668 | } |
3667 | ov->sbuf[n].urb = urb; | 3669 | ov->sbuf[n].urb = urb; |
@@ -5651,7 +5653,7 @@ static ssize_t show_exposure(struct device *cd, | |||
5651 | if (!ov->dev) | 5653 | if (!ov->dev) |
5652 | return -ENODEV; | 5654 | return -ENODEV; |
5653 | sensor_get_exposure(ov, &exp); | 5655 | sensor_get_exposure(ov, &exp); |
5654 | return sprintf(buf, "%d\n", exp >> 8); | 5656 | return sprintf(buf, "%d\n", exp); |
5655 | } | 5657 | } |
5656 | static DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL); | 5658 | static DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL); |
5657 | 5659 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/drivers/media/video/pvrusb2/pvrusb2-devattr.c index 88e175168438..cbe2a3417851 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-devattr.c +++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.c | |||
@@ -489,6 +489,8 @@ static const struct pvr2_device_desc pvr2_device_751xx = { | |||
489 | struct usb_device_id pvr2_device_table[] = { | 489 | struct usb_device_id pvr2_device_table[] = { |
490 | { USB_DEVICE(0x2040, 0x2900), | 490 | { USB_DEVICE(0x2040, 0x2900), |
491 | .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, | 491 | .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, |
492 | { USB_DEVICE(0x2040, 0x2950), /* Logically identical to 2900 */ | ||
493 | .driver_info = (kernel_ulong_t)&pvr2_device_29xxx}, | ||
492 | { USB_DEVICE(0x2040, 0x2400), | 494 | { USB_DEVICE(0x2040, 0x2400), |
493 | .driver_info = (kernel_ulong_t)&pvr2_device_24xxx}, | 495 | .driver_info = (kernel_ulong_t)&pvr2_device_24xxx}, |
494 | { USB_DEVICE(0x1164, 0x0622), | 496 | { USB_DEVICE(0x1164, 0x0622), |
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index b1d09d8e2b85..92b83feae366 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c | |||
@@ -669,7 +669,7 @@ static void s2255_fillbuff(struct s2255_dev *dev, struct s2255_buffer *buf, | |||
669 | (unsigned long)vbuf, pos); | 669 | (unsigned long)vbuf, pos); |
670 | /* tell v4l buffer was filled */ | 670 | /* tell v4l buffer was filled */ |
671 | 671 | ||
672 | buf->vb.field_count++; | 672 | buf->vb.field_count = dev->frame_count[chn] * 2; |
673 | do_gettimeofday(&ts); | 673 | do_gettimeofday(&ts); |
674 | buf->vb.ts = ts; | 674 | buf->vb.ts = ts; |
675 | buf->vb.state = VIDEOBUF_DONE; | 675 | buf->vb.state = VIDEOBUF_DONE; |
@@ -1268,6 +1268,7 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i) | |||
1268 | dev->last_frame[chn] = -1; | 1268 | dev->last_frame[chn] = -1; |
1269 | dev->bad_payload[chn] = 0; | 1269 | dev->bad_payload[chn] = 0; |
1270 | dev->cur_frame[chn] = 0; | 1270 | dev->cur_frame[chn] = 0; |
1271 | dev->frame_count[chn] = 0; | ||
1271 | for (j = 0; j < SYS_FRAMES; j++) { | 1272 | for (j = 0; j < SYS_FRAMES; j++) { |
1272 | dev->buffer[chn].frame[j].ulState = 0; | 1273 | dev->buffer[chn].frame[j].ulState = 0; |
1273 | dev->buffer[chn].frame[j].cur_size = 0; | 1274 | dev->buffer[chn].frame[j].cur_size = 0; |
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c index 6ef3e5297de8..feab12aa2c7b 100644 --- a/drivers/media/video/uvc/uvc_ctrl.c +++ b/drivers/media/video/uvc/uvc_ctrl.c | |||
@@ -592,7 +592,7 @@ int uvc_query_v4l2_ctrl(struct uvc_video_device *video, | |||
592 | if (ctrl == NULL) | 592 | if (ctrl == NULL) |
593 | return -EINVAL; | 593 | return -EINVAL; |
594 | 594 | ||
595 | data = kmalloc(8, GFP_KERNEL); | 595 | data = kmalloc(ctrl->info->size, GFP_KERNEL); |
596 | if (data == NULL) | 596 | if (data == NULL) |
597 | return -ENOMEM; | 597 | return -ENOMEM; |
598 | 598 | ||
diff --git a/drivers/media/video/w9968cf.c b/drivers/media/video/w9968cf.c index 168baabe4659..11edf79f57be 100644 --- a/drivers/media/video/w9968cf.c +++ b/drivers/media/video/w9968cf.c | |||
@@ -911,7 +911,6 @@ static int w9968cf_start_transfer(struct w9968cf_device* cam) | |||
911 | 911 | ||
912 | for (i = 0; i < W9968CF_URBS; i++) { | 912 | for (i = 0; i < W9968CF_URBS; i++) { |
913 | urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL); | 913 | urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL); |
914 | cam->urb[i] = urb; | ||
915 | if (!urb) { | 914 | if (!urb) { |
916 | for (j = 0; j < i; j++) | 915 | for (j = 0; j < i; j++) |
917 | usb_free_urb(cam->urb[j]); | 916 | usb_free_urb(cam->urb[j]); |
@@ -919,6 +918,7 @@ static int w9968cf_start_transfer(struct w9968cf_device* cam) | |||
919 | return -ENOMEM; | 918 | return -ENOMEM; |
920 | } | 919 | } |
921 | 920 | ||
921 | cam->urb[i] = urb; | ||
922 | urb->dev = udev; | 922 | urb->dev = udev; |
923 | urb->context = (void*)cam; | 923 | urb->context = (void*)cam; |
924 | urb->pipe = usb_rcvisocpipe(udev, 1); | 924 | urb->pipe = usb_rcvisocpipe(udev, 1); |
diff --git a/drivers/media/video/wm8739.c b/drivers/media/video/wm8739.c index 95c79ad80487..54ac3fe26ec2 100644 --- a/drivers/media/video/wm8739.c +++ b/drivers/media/video/wm8739.c | |||
@@ -274,10 +274,8 @@ static int wm8739_probe(struct i2c_client *client, | |||
274 | client->addr << 1, client->adapter->name); | 274 | client->addr << 1, client->adapter->name); |
275 | 275 | ||
276 | state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL); | 276 | state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL); |
277 | if (state == NULL) { | 277 | if (state == NULL) |
278 | kfree(client); | ||
279 | return -ENOMEM; | 278 | return -ENOMEM; |
280 | } | ||
281 | state->vol_l = 0x17; /* 0dB */ | 279 | state->vol_l = 0x17; /* 0dB */ |
282 | state->vol_r = 0x17; /* 0dB */ | 280 | state->vol_r = 0x17; /* 0dB */ |
283 | state->muted = 0; | 281 | state->muted = 0; |
diff --git a/drivers/media/video/zoran_card.c b/drivers/media/video/zoran_card.c index d842a7cb99d2..3282be730298 100644 --- a/drivers/media/video/zoran_card.c +++ b/drivers/media/video/zoran_card.c | |||
@@ -988,7 +988,7 @@ zoran_open_init_params (struct zoran *zr) | |||
988 | zr->v4l_grab_seq = 0; | 988 | zr->v4l_grab_seq = 0; |
989 | zr->v4l_settings.width = 192; | 989 | zr->v4l_settings.width = 192; |
990 | zr->v4l_settings.height = 144; | 990 | zr->v4l_settings.height = 144; |
991 | zr->v4l_settings.format = &zoran_formats[4]; /* YUY2 - YUV-4:2:2 packed */ | 991 | zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */ |
992 | zr->v4l_settings.bytesperline = | 992 | zr->v4l_settings.bytesperline = |
993 | zr->v4l_settings.width * | 993 | zr->v4l_settings.width * |
994 | ((zr->v4l_settings.format->depth + 7) / 8); | 994 | ((zr->v4l_settings.format->depth + 7) / 8); |
diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c index ec6f59674b10..2dab9eea4def 100644 --- a/drivers/media/video/zoran_driver.c +++ b/drivers/media/video/zoran_driver.c | |||
@@ -134,7 +134,7 @@ const struct zoran_format zoran_formats[] = { | |||
134 | }, { | 134 | }, { |
135 | .name = "16-bit RGB BE", | 135 | .name = "16-bit RGB BE", |
136 | ZFMT(-1, | 136 | ZFMT(-1, |
137 | V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB), | 137 | V4L2_PIX_FMT_RGB565X, V4L2_COLORSPACE_SRGB), |
138 | .depth = 16, | 138 | .depth = 16, |
139 | .flags = ZORAN_FORMAT_CAPTURE | | 139 | .flags = ZORAN_FORMAT_CAPTURE | |
140 | ZORAN_FORMAT_OVERLAY, | 140 | ZORAN_FORMAT_OVERLAY, |
@@ -2737,7 +2737,8 @@ zoran_do_ioctl (struct inode *inode, | |||
2737 | fh->v4l_settings.format->fourcc; | 2737 | fh->v4l_settings.format->fourcc; |
2738 | fmt->fmt.pix.colorspace = | 2738 | fmt->fmt.pix.colorspace = |
2739 | fh->v4l_settings.format->colorspace; | 2739 | fh->v4l_settings.format->colorspace; |
2740 | fmt->fmt.pix.bytesperline = 0; | 2740 | fmt->fmt.pix.bytesperline = |
2741 | fh->v4l_settings.bytesperline; | ||
2741 | if (BUZ_MAX_HEIGHT < | 2742 | if (BUZ_MAX_HEIGHT < |
2742 | (fh->v4l_settings.height * 2)) | 2743 | (fh->v4l_settings.height * 2)) |
2743 | fmt->fmt.pix.field = | 2744 | fmt->fmt.pix.field = |
@@ -2833,13 +2834,6 @@ zoran_do_ioctl (struct inode *inode, | |||
2833 | fmt->fmt.pix.pixelformat, | 2834 | fmt->fmt.pix.pixelformat, |
2834 | (char *) &printformat); | 2835 | (char *) &printformat); |
2835 | 2836 | ||
2836 | if (fmt->fmt.pix.bytesperline > 0) { | ||
2837 | dprintk(5, | ||
2838 | KERN_ERR "%s: bpl not supported\n", | ||
2839 | ZR_DEVNAME(zr)); | ||
2840 | return -EINVAL; | ||
2841 | } | ||
2842 | |||
2843 | /* we can be requested to do JPEG/raw playback/capture */ | 2837 | /* we can be requested to do JPEG/raw playback/capture */ |
2844 | if (! | 2838 | if (! |
2845 | (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE || | 2839 | (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE || |
@@ -2923,6 +2917,7 @@ zoran_do_ioctl (struct inode *inode, | |||
2923 | fh->jpg_buffers.buffer_size = | 2917 | fh->jpg_buffers.buffer_size = |
2924 | zoran_v4l2_calc_bufsize(&fh-> | 2918 | zoran_v4l2_calc_bufsize(&fh-> |
2925 | jpg_settings); | 2919 | jpg_settings); |
2920 | fmt->fmt.pix.bytesperline = 0; | ||
2926 | fmt->fmt.pix.sizeimage = | 2921 | fmt->fmt.pix.sizeimage = |
2927 | fh->jpg_buffers.buffer_size; | 2922 | fh->jpg_buffers.buffer_size; |
2928 | 2923 | ||
@@ -2979,6 +2974,8 @@ zoran_do_ioctl (struct inode *inode, | |||
2979 | 2974 | ||
2980 | /* tell the user the | 2975 | /* tell the user the |
2981 | * results/missing stuff */ | 2976 | * results/missing stuff */ |
2977 | fmt->fmt.pix.bytesperline = | ||
2978 | fh->v4l_settings.bytesperline; | ||
2982 | fmt->fmt.pix.sizeimage = | 2979 | fmt->fmt.pix.sizeimage = |
2983 | fh->v4l_settings.height * | 2980 | fh->v4l_settings.height * |
2984 | fh->v4l_settings.bytesperline; | 2981 | fh->v4l_settings.bytesperline; |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 10c44d3fe01a..68dc8d9eb24e 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
@@ -21,7 +21,7 @@ config MFD_SM501 | |||
21 | 21 | ||
22 | config MFD_SM501_GPIO | 22 | config MFD_SM501_GPIO |
23 | bool "Export GPIO via GPIO layer" | 23 | bool "Export GPIO via GPIO layer" |
24 | depends on MFD_SM501 && HAVE_GPIO_LIB | 24 | depends on MFD_SM501 && GPIOLIB |
25 | ---help--- | 25 | ---help--- |
26 | This option uses the gpio library layer to export the 64 GPIO | 26 | This option uses the gpio library layer to export the 64 GPIO |
27 | lines on the SM501. The platform data is used to supply the | 27 | lines on the SM501. The platform data is used to supply the |
@@ -29,7 +29,7 @@ config MFD_SM501_GPIO | |||
29 | 29 | ||
30 | config MFD_ASIC3 | 30 | config MFD_ASIC3 |
31 | bool "Support for Compaq ASIC3" | 31 | bool "Support for Compaq ASIC3" |
32 | depends on GENERIC_HARDIRQS && HAVE_GPIO_LIB && ARM | 32 | depends on GENERIC_HARDIRQS && GPIOLIB && ARM |
33 | ---help--- | 33 | ---help--- |
34 | This driver supports the ASIC3 multifunction chip found on many | 34 | This driver supports the ASIC3 multifunction chip found on many |
35 | PDAs (mainly iPAQ and HTC based ones) | 35 | PDAs (mainly iPAQ and HTC based ones) |
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index bc2a807f210d..ba5aa2008273 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
@@ -312,7 +312,6 @@ static int __init asic3_irq_probe(struct platform_device *pdev) | |||
312 | struct asic3 *asic = platform_get_drvdata(pdev); | 312 | struct asic3 *asic = platform_get_drvdata(pdev); |
313 | unsigned long clksel = 0; | 313 | unsigned long clksel = 0; |
314 | unsigned int irq, irq_base; | 314 | unsigned int irq, irq_base; |
315 | int map_size; | ||
316 | int ret; | 315 | int ret; |
317 | 316 | ||
318 | ret = platform_get_irq(pdev, 0); | 317 | ret = platform_get_irq(pdev, 0); |
@@ -534,6 +533,7 @@ static int __init asic3_probe(struct platform_device *pdev) | |||
534 | struct asic3 *asic; | 533 | struct asic3 *asic; |
535 | struct resource *mem; | 534 | struct resource *mem; |
536 | unsigned long clksel; | 535 | unsigned long clksel; |
536 | int map_size; | ||
537 | int ret = 0; | 537 | int ret = 0; |
538 | 538 | ||
539 | asic = kzalloc(sizeof(struct asic3), GFP_KERNEL); | 539 | asic = kzalloc(sizeof(struct asic3), GFP_KERNEL); |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 917035e16da4..00008967ef7a 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -426,8 +426,6 @@ static u32 atmci_submit_data(struct mmc_host *mmc, struct mmc_data *data) | |||
426 | host->sg = NULL; | 426 | host->sg = NULL; |
427 | host->data = data; | 427 | host->data = data; |
428 | 428 | ||
429 | mci_writel(host, BLKR, MCI_BCNT(data->blocks) | ||
430 | | MCI_BLKLEN(data->blksz)); | ||
431 | dev_vdbg(&mmc->class_dev, "BLKR=0x%08x\n", | 429 | dev_vdbg(&mmc->class_dev, "BLKR=0x%08x\n", |
432 | MCI_BCNT(data->blocks) | MCI_BLKLEN(data->blksz)); | 430 | MCI_BCNT(data->blocks) | MCI_BLKLEN(data->blksz)); |
433 | 431 | ||
@@ -483,6 +481,10 @@ static void atmci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
483 | if (data->blocks > 1 && data->blksz & 3) | 481 | if (data->blocks > 1 && data->blksz & 3) |
484 | goto fail; | 482 | goto fail; |
485 | atmci_set_timeout(host, data); | 483 | atmci_set_timeout(host, data); |
484 | |||
485 | /* Must set block count/size before sending command */ | ||
486 | mci_writel(host, BLKR, MCI_BCNT(data->blocks) | ||
487 | | MCI_BLKLEN(data->blksz)); | ||
486 | } | 488 | } |
487 | 489 | ||
488 | iflags = MCI_CMDRDY; | 490 | iflags = MCI_CMDRDY; |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 0a1916b0419d..c55de1c027af 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -270,7 +270,6 @@ struct e1000_adapter { | |||
270 | struct net_device *netdev; | 270 | struct net_device *netdev; |
271 | struct pci_dev *pdev; | 271 | struct pci_dev *pdev; |
272 | struct net_device_stats net_stats; | 272 | struct net_device_stats net_stats; |
273 | spinlock_t stats_lock; /* prevent concurrent stats updates */ | ||
274 | 273 | ||
275 | /* structs defined in e1000_hw.h */ | 274 | /* structs defined in e1000_hw.h */ |
276 | struct e1000_hw hw; | 275 | struct e1000_hw hw; |
@@ -300,6 +299,8 @@ struct e1000_adapter { | |||
300 | unsigned long led_status; | 299 | unsigned long led_status; |
301 | 300 | ||
302 | unsigned int flags; | 301 | unsigned int flags; |
302 | struct work_struct downshift_task; | ||
303 | struct work_struct update_phy_task; | ||
303 | }; | 304 | }; |
304 | 305 | ||
305 | struct e1000_info { | 306 | struct e1000_info { |
@@ -321,6 +322,7 @@ struct e1000_info { | |||
321 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) | 322 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) |
322 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) | 323 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) |
323 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) | 324 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) |
325 | #define FLAG_READ_ONLY_NVM (1 << 8) | ||
324 | #define FLAG_IS_ICH (1 << 9) | 326 | #define FLAG_IS_ICH (1 << 9) |
325 | #define FLAG_HAS_MSIX (1 << 10) | 327 | #define FLAG_HAS_MSIX (1 << 10) |
326 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) | 328 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) |
@@ -406,6 +408,7 @@ extern bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); | |||
406 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); | 408 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); |
407 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); | 409 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); |
408 | 410 | ||
411 | extern void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw); | ||
409 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | 412 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, |
410 | bool state); | 413 | bool state); |
411 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 414 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index 52b762eb1745..70c11c811a08 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -432,6 +432,10 @@ static void e1000_get_regs(struct net_device *netdev, | |||
432 | regs_buff[11] = er32(TIDV); | 432 | regs_buff[11] = er32(TIDV); |
433 | 433 | ||
434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ | 434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ |
435 | |||
436 | /* ethtool doesn't use anything past this point, so all this | ||
437 | * code is likely legacy junk for apps that may or may not | ||
438 | * exist */ | ||
435 | if (hw->phy.type == e1000_phy_m88) { | 439 | if (hw->phy.type == e1000_phy_m88) { |
436 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); | 440 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); |
437 | regs_buff[13] = (u32)phy_data; /* cable length */ | 441 | regs_buff[13] = (u32)phy_data; /* cable length */ |
@@ -447,7 +451,7 @@ static void e1000_get_regs(struct net_device *netdev, | |||
447 | regs_buff[22] = adapter->phy_stats.receive_errors; | 451 | regs_buff[22] = adapter->phy_stats.receive_errors; |
448 | regs_buff[23] = regs_buff[13]; /* mdix mode */ | 452 | regs_buff[23] = regs_buff[13]; /* mdix mode */ |
449 | } | 453 | } |
450 | regs_buff[21] = adapter->phy_stats.idle_errors; /* phy idle errors */ | 454 | regs_buff[21] = 0; /* was idle_errors */ |
451 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); | 455 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); |
452 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ | 456 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ |
453 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 457 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ |
@@ -529,6 +533,9 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
529 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) | 533 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) |
530 | return -EFAULT; | 534 | return -EFAULT; |
531 | 535 | ||
536 | if (adapter->flags & FLAG_READ_ONLY_NVM) | ||
537 | return -EINVAL; | ||
538 | |||
532 | max_len = hw->nvm.word_size * 2; | 539 | max_len = hw->nvm.word_size * 2; |
533 | 540 | ||
534 | first_word = eeprom->offset >> 1; | 541 | first_word = eeprom->offset >> 1; |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 692251b60915..523b9716a543 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -60,6 +60,7 @@ | |||
60 | #define ICH_FLASH_HSFCTL 0x0006 | 60 | #define ICH_FLASH_HSFCTL 0x0006 |
61 | #define ICH_FLASH_FADDR 0x0008 | 61 | #define ICH_FLASH_FADDR 0x0008 |
62 | #define ICH_FLASH_FDATA0 0x0010 | 62 | #define ICH_FLASH_FDATA0 0x0010 |
63 | #define ICH_FLASH_PR0 0x0074 | ||
63 | 64 | ||
64 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 | 65 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 |
65 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 | 66 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 |
@@ -152,6 +153,19 @@ union ich8_hws_flash_regacc { | |||
152 | u16 regval; | 153 | u16 regval; |
153 | }; | 154 | }; |
154 | 155 | ||
156 | /* ICH Flash Protected Region */ | ||
157 | union ich8_flash_protected_range { | ||
158 | struct ich8_pr { | ||
159 | u32 base:13; /* 0:12 Protected Range Base */ | ||
160 | u32 reserved1:2; /* 13:14 Reserved */ | ||
161 | u32 rpe:1; /* 15 Read Protection Enable */ | ||
162 | u32 limit:13; /* 16:28 Protected Range Limit */ | ||
163 | u32 reserved2:2; /* 29:30 Reserved */ | ||
164 | u32 wpe:1; /* 31 Write Protection Enable */ | ||
165 | } range; | ||
166 | u32 regval; | ||
167 | }; | ||
168 | |||
155 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); | 169 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); |
156 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); | 170 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); |
157 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); | 171 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); |
@@ -371,6 +385,9 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) | |||
371 | return 0; | 385 | return 0; |
372 | } | 386 | } |
373 | 387 | ||
388 | static DEFINE_MUTEX(nvm_mutex); | ||
389 | static pid_t nvm_owner = -1; | ||
390 | |||
374 | /** | 391 | /** |
375 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 392 | * e1000_acquire_swflag_ich8lan - Acquire software control flag |
376 | * @hw: pointer to the HW structure | 393 | * @hw: pointer to the HW structure |
@@ -384,6 +401,15 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
384 | u32 extcnf_ctrl; | 401 | u32 extcnf_ctrl; |
385 | u32 timeout = PHY_CFG_TIMEOUT; | 402 | u32 timeout = PHY_CFG_TIMEOUT; |
386 | 403 | ||
404 | might_sleep(); | ||
405 | |||
406 | if (!mutex_trylock(&nvm_mutex)) { | ||
407 | WARN(1, KERN_ERR "e1000e mutex contention. Owned by pid %d\n", | ||
408 | nvm_owner); | ||
409 | mutex_lock(&nvm_mutex); | ||
410 | } | ||
411 | nvm_owner = current->pid; | ||
412 | |||
387 | while (timeout) { | 413 | while (timeout) { |
388 | extcnf_ctrl = er32(EXTCNF_CTRL); | 414 | extcnf_ctrl = er32(EXTCNF_CTRL); |
389 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 415 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; |
@@ -400,6 +426,8 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
400 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 426 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); |
401 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 427 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
402 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 428 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
429 | nvm_owner = -1; | ||
430 | mutex_unlock(&nvm_mutex); | ||
403 | return -E1000_ERR_CONFIG; | 431 | return -E1000_ERR_CONFIG; |
404 | } | 432 | } |
405 | 433 | ||
@@ -421,6 +449,9 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | |||
421 | extcnf_ctrl = er32(EXTCNF_CTRL); | 449 | extcnf_ctrl = er32(EXTCNF_CTRL); |
422 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 450 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
423 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 451 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
452 | |||
453 | nvm_owner = -1; | ||
454 | mutex_unlock(&nvm_mutex); | ||
424 | } | 455 | } |
425 | 456 | ||
426 | /** | 457 | /** |
@@ -1386,6 +1417,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1386 | * programming failed. | 1417 | * programming failed. |
1387 | */ | 1418 | */ |
1388 | if (ret_val) { | 1419 | if (ret_val) { |
1420 | /* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */ | ||
1389 | hw_dbg(hw, "Flash commit failed.\n"); | 1421 | hw_dbg(hw, "Flash commit failed.\n"); |
1390 | e1000_release_swflag_ich8lan(hw); | 1422 | e1000_release_swflag_ich8lan(hw); |
1391 | return ret_val; | 1423 | return ret_val; |
@@ -1476,6 +1508,49 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1476 | } | 1508 | } |
1477 | 1509 | ||
1478 | /** | 1510 | /** |
1511 | * e1000e_write_protect_nvm_ich8lan - Make the NVM read-only | ||
1512 | * @hw: pointer to the HW structure | ||
1513 | * | ||
1514 | * To prevent malicious write/erase of the NVM, set it to be read-only | ||
1515 | * so that the hardware ignores all write/erase cycles of the NVM via | ||
1516 | * the flash control registers. The shadow-ram copy of the NVM will | ||
1517 | * still be updated, however any updates to this copy will not stick | ||
1518 | * across driver reloads. | ||
1519 | **/ | ||
1520 | void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) | ||
1521 | { | ||
1522 | union ich8_flash_protected_range pr0; | ||
1523 | union ich8_hws_flash_status hsfsts; | ||
1524 | u32 gfpreg; | ||
1525 | s32 ret_val; | ||
1526 | |||
1527 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
1528 | if (ret_val) | ||
1529 | return; | ||
1530 | |||
1531 | gfpreg = er32flash(ICH_FLASH_GFPREG); | ||
1532 | |||
1533 | /* Write-protect GbE Sector of NVM */ | ||
1534 | pr0.regval = er32flash(ICH_FLASH_PR0); | ||
1535 | pr0.range.base = gfpreg & FLASH_GFPREG_BASE_MASK; | ||
1536 | pr0.range.limit = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK); | ||
1537 | pr0.range.wpe = true; | ||
1538 | ew32flash(ICH_FLASH_PR0, pr0.regval); | ||
1539 | |||
1540 | /* | ||
1541 | * Lock down a subset of GbE Flash Control Registers, e.g. | ||
1542 | * PR0 to prevent the write-protection from being lifted. | ||
1543 | * Once FLOCKDN is set, the registers protected by it cannot | ||
1544 | * be written until FLOCKDN is cleared by a hardware reset. | ||
1545 | */ | ||
1546 | hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); | ||
1547 | hsfsts.hsf_status.flockdn = true; | ||
1548 | ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval); | ||
1549 | |||
1550 | e1000_release_swflag_ich8lan(hw); | ||
1551 | } | ||
1552 | |||
1553 | /** | ||
1479 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM | 1554 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM |
1480 | * @hw: pointer to the HW structure | 1555 | * @hw: pointer to the HW structure |
1481 | * @offset: The offset (in bytes) of the byte/word to read. | 1556 | * @offset: The offset (in bytes) of the byte/word to read. |
@@ -1822,6 +1897,9 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
1822 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 1897 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); |
1823 | msleep(20); | 1898 | msleep(20); |
1824 | 1899 | ||
1900 | /* release the swflag because it is not reset by hardware reset */ | ||
1901 | e1000_release_swflag_ich8lan(hw); | ||
1902 | |||
1825 | ret_val = e1000e_get_auto_rd_done(hw); | 1903 | ret_val = e1000e_get_auto_rd_done(hw); |
1826 | if (ret_val) { | 1904 | if (ret_val) { |
1827 | /* | 1905 | /* |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 24d05cb70055..1b72749979c4 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | #include "e1000.h" | 48 | #include "e1000.h" |
49 | 49 | ||
50 | #define DRV_VERSION "0.3.3.3-k2" | 50 | #define DRV_VERSION "0.3.3.3-k6" |
51 | char e1000e_driver_name[] = "e1000e"; | 51 | char e1000e_driver_name[] = "e1000e"; |
52 | const char e1000e_driver_version[] = DRV_VERSION; | 52 | const char e1000e_driver_version[] = DRV_VERSION; |
53 | 53 | ||
@@ -1117,6 +1117,14 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter) | |||
1117 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | 1117 | writel(0, adapter->hw.hw_addr + rx_ring->tail); |
1118 | } | 1118 | } |
1119 | 1119 | ||
1120 | static void e1000e_downshift_workaround(struct work_struct *work) | ||
1121 | { | ||
1122 | struct e1000_adapter *adapter = container_of(work, | ||
1123 | struct e1000_adapter, downshift_task); | ||
1124 | |||
1125 | e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); | ||
1126 | } | ||
1127 | |||
1120 | /** | 1128 | /** |
1121 | * e1000_intr_msi - Interrupt Handler | 1129 | * e1000_intr_msi - Interrupt Handler |
1122 | * @irq: interrupt number | 1130 | * @irq: interrupt number |
@@ -1141,7 +1149,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
1141 | */ | 1149 | */ |
1142 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1150 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && |
1143 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1151 | (!(er32(STATUS) & E1000_STATUS_LU))) |
1144 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1152 | schedule_work(&adapter->downshift_task); |
1145 | 1153 | ||
1146 | /* | 1154 | /* |
1147 | * 80003ES2LAN workaround-- For packet buffer work-around on | 1155 | * 80003ES2LAN workaround-- For packet buffer work-around on |
@@ -1207,7 +1215,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1207 | */ | 1215 | */ |
1208 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1216 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && |
1209 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1217 | (!(er32(STATUS) & E1000_STATUS_LU))) |
1210 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1218 | schedule_work(&adapter->downshift_task); |
1211 | 1219 | ||
1212 | /* | 1220 | /* |
1213 | * 80003ES2LAN workaround-- | 1221 | * 80003ES2LAN workaround-- |
@@ -2905,8 +2913,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
2905 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 2913 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
2906 | e1000_irq_disable(adapter); | 2914 | e1000_irq_disable(adapter); |
2907 | 2915 | ||
2908 | spin_lock_init(&adapter->stats_lock); | ||
2909 | |||
2910 | set_bit(__E1000_DOWN, &adapter->state); | 2916 | set_bit(__E1000_DOWN, &adapter->state); |
2911 | return 0; | 2917 | return 0; |
2912 | } | 2918 | } |
@@ -3221,6 +3227,21 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
3221 | return 0; | 3227 | return 0; |
3222 | } | 3228 | } |
3223 | 3229 | ||
3230 | /** | ||
3231 | * e1000e_update_phy_task - work thread to update phy | ||
3232 | * @work: pointer to our work struct | ||
3233 | * | ||
3234 | * this worker thread exists because we must acquire a | ||
3235 | * semaphore to read the phy, which we could msleep while | ||
3236 | * waiting for it, and we can't msleep in a timer. | ||
3237 | **/ | ||
3238 | static void e1000e_update_phy_task(struct work_struct *work) | ||
3239 | { | ||
3240 | struct e1000_adapter *adapter = container_of(work, | ||
3241 | struct e1000_adapter, update_phy_task); | ||
3242 | e1000_get_phy_info(&adapter->hw); | ||
3243 | } | ||
3244 | |||
3224 | /* | 3245 | /* |
3225 | * Need to wait a few seconds after link up to get diagnostic information from | 3246 | * Need to wait a few seconds after link up to get diagnostic information from |
3226 | * the phy | 3247 | * the phy |
@@ -3228,7 +3249,7 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
3228 | static void e1000_update_phy_info(unsigned long data) | 3249 | static void e1000_update_phy_info(unsigned long data) |
3229 | { | 3250 | { |
3230 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | 3251 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; |
3231 | e1000_get_phy_info(&adapter->hw); | 3252 | schedule_work(&adapter->update_phy_task); |
3232 | } | 3253 | } |
3233 | 3254 | ||
3234 | /** | 3255 | /** |
@@ -3239,10 +3260,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
3239 | { | 3260 | { |
3240 | struct e1000_hw *hw = &adapter->hw; | 3261 | struct e1000_hw *hw = &adapter->hw; |
3241 | struct pci_dev *pdev = adapter->pdev; | 3262 | struct pci_dev *pdev = adapter->pdev; |
3242 | unsigned long irq_flags; | ||
3243 | u16 phy_tmp; | ||
3244 | |||
3245 | #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF | ||
3246 | 3263 | ||
3247 | /* | 3264 | /* |
3248 | * Prevent stats update while adapter is being reset, or if the pci | 3265 | * Prevent stats update while adapter is being reset, or if the pci |
@@ -3253,14 +3270,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
3253 | if (pci_channel_offline(pdev)) | 3270 | if (pci_channel_offline(pdev)) |
3254 | return; | 3271 | return; |
3255 | 3272 | ||
3256 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
3257 | |||
3258 | /* | ||
3259 | * these counters are modified from e1000_adjust_tbi_stats, | ||
3260 | * called from the interrupt context, so they must only | ||
3261 | * be written while holding adapter->stats_lock | ||
3262 | */ | ||
3263 | |||
3264 | adapter->stats.crcerrs += er32(CRCERRS); | 3273 | adapter->stats.crcerrs += er32(CRCERRS); |
3265 | adapter->stats.gprc += er32(GPRC); | 3274 | adapter->stats.gprc += er32(GPRC); |
3266 | adapter->stats.gorc += er32(GORCL); | 3275 | adapter->stats.gorc += er32(GORCL); |
@@ -3332,21 +3341,10 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
3332 | 3341 | ||
3333 | /* Tx Dropped needs to be maintained elsewhere */ | 3342 | /* Tx Dropped needs to be maintained elsewhere */ |
3334 | 3343 | ||
3335 | /* Phy Stats */ | ||
3336 | if (hw->phy.media_type == e1000_media_type_copper) { | ||
3337 | if ((adapter->link_speed == SPEED_1000) && | ||
3338 | (!e1e_rphy(hw, PHY_1000T_STATUS, &phy_tmp))) { | ||
3339 | phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK; | ||
3340 | adapter->phy_stats.idle_errors += phy_tmp; | ||
3341 | } | ||
3342 | } | ||
3343 | |||
3344 | /* Management Stats */ | 3344 | /* Management Stats */ |
3345 | adapter->stats.mgptc += er32(MGTPTC); | 3345 | adapter->stats.mgptc += er32(MGTPTC); |
3346 | adapter->stats.mgprc += er32(MGTPRC); | 3346 | adapter->stats.mgprc += er32(MGTPRC); |
3347 | adapter->stats.mgpdc += er32(MGTPDC); | 3347 | adapter->stats.mgpdc += er32(MGTPDC); |
3348 | |||
3349 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
3350 | } | 3348 | } |
3351 | 3349 | ||
3352 | /** | 3350 | /** |
@@ -3358,10 +3356,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
3358 | struct e1000_hw *hw = &adapter->hw; | 3356 | struct e1000_hw *hw = &adapter->hw; |
3359 | struct e1000_phy_regs *phy = &adapter->phy_regs; | 3357 | struct e1000_phy_regs *phy = &adapter->phy_regs; |
3360 | int ret_val; | 3358 | int ret_val; |
3361 | unsigned long irq_flags; | ||
3362 | |||
3363 | |||
3364 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
3365 | 3359 | ||
3366 | if ((er32(STATUS) & E1000_STATUS_LU) && | 3360 | if ((er32(STATUS) & E1000_STATUS_LU) && |
3367 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { | 3361 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { |
@@ -3392,8 +3386,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
3392 | phy->stat1000 = 0; | 3386 | phy->stat1000 = 0; |
3393 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); | 3387 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); |
3394 | } | 3388 | } |
3395 | |||
3396 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
3397 | } | 3389 | } |
3398 | 3390 | ||
3399 | static void e1000_print_link_info(struct e1000_adapter *adapter) | 3391 | static void e1000_print_link_info(struct e1000_adapter *adapter) |
@@ -4822,6 +4814,10 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4822 | if (err) | 4814 | if (err) |
4823 | goto err_hw_init; | 4815 | goto err_hw_init; |
4824 | 4816 | ||
4817 | if ((adapter->flags & FLAG_IS_ICH) && | ||
4818 | (adapter->flags & FLAG_READ_ONLY_NVM)) | ||
4819 | e1000e_write_protect_nvm_ich8lan(&adapter->hw); | ||
4820 | |||
4825 | hw->mac.ops.get_bus_info(&adapter->hw); | 4821 | hw->mac.ops.get_bus_info(&adapter->hw); |
4826 | 4822 | ||
4827 | adapter->hw.phy.autoneg_wait_to_complete = 0; | 4823 | adapter->hw.phy.autoneg_wait_to_complete = 0; |
@@ -4912,6 +4908,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4912 | 4908 | ||
4913 | INIT_WORK(&adapter->reset_task, e1000_reset_task); | 4909 | INIT_WORK(&adapter->reset_task, e1000_reset_task); |
4914 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); | 4910 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); |
4911 | INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); | ||
4912 | INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); | ||
4915 | 4913 | ||
4916 | /* Initialize link parameters. User can change them with ethtool */ | 4914 | /* Initialize link parameters. User can change them with ethtool */ |
4917 | adapter->hw.mac.autoneg = 1; | 4915 | adapter->hw.mac.autoneg = 1; |
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index f46db6cda487..77a3d7207a5f 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
@@ -142,6 +142,15 @@ E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); | |||
142 | */ | 142 | */ |
143 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); | 143 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); |
144 | 144 | ||
145 | /* | ||
146 | * Write Protect NVM | ||
147 | * | ||
148 | * Valid Range: 0, 1 | ||
149 | * | ||
150 | * Default Value: 1 (enabled) | ||
151 | */ | ||
152 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); | ||
153 | |||
145 | struct e1000_option { | 154 | struct e1000_option { |
146 | enum { enable_option, range_option, list_option } type; | 155 | enum { enable_option, range_option, list_option } type; |
147 | const char *name; | 156 | const char *name; |
@@ -415,4 +424,25 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
415 | opt.def); | 424 | opt.def); |
416 | } | 425 | } |
417 | } | 426 | } |
427 | { /* Write-protect NVM */ | ||
428 | const struct e1000_option opt = { | ||
429 | .type = enable_option, | ||
430 | .name = "Write-protect NVM", | ||
431 | .err = "defaulting to Enabled", | ||
432 | .def = OPTION_ENABLED | ||
433 | }; | ||
434 | |||
435 | if (adapter->flags & FLAG_IS_ICH) { | ||
436 | if (num_WriteProtectNVM > bd) { | ||
437 | unsigned int write_protect_nvm = WriteProtectNVM[bd]; | ||
438 | e1000_validate_option(&write_protect_nvm, &opt, | ||
439 | adapter); | ||
440 | if (write_protect_nvm) | ||
441 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
442 | } else { | ||
443 | if (opt.def) | ||
444 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
445 | } | ||
446 | } | ||
447 | } | ||
418 | } | 448 | } |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 9c718583a237..77baff022f71 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | 17 | ||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/sched.h> | ||
19 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
20 | #include <linux/stat.h> | 21 | #include <linux/stat.h> |
21 | #include <linux/topology.h> | 22 | #include <linux/topology.h> |
@@ -484,6 +485,21 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, | |||
484 | #endif /* HAVE_PCI_LEGACY */ | 485 | #endif /* HAVE_PCI_LEGACY */ |
485 | 486 | ||
486 | #ifdef HAVE_PCI_MMAP | 487 | #ifdef HAVE_PCI_MMAP |
488 | |||
489 | static int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma) | ||
490 | { | ||
491 | unsigned long nr, start, size; | ||
492 | |||
493 | nr = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | ||
494 | start = vma->vm_pgoff; | ||
495 | size = pci_resource_len(pdev, resno) >> PAGE_SHIFT; | ||
496 | if (start < size && size - start >= nr) | ||
497 | return 1; | ||
498 | WARN(1, "process \"%s\" tried to map 0x%08lx-0x%08lx on %s BAR %d (size 0x%08lx)\n", | ||
499 | current->comm, start, start+nr, pci_name(pdev), resno, size); | ||
500 | return 0; | ||
501 | } | ||
502 | |||
487 | /** | 503 | /** |
488 | * pci_mmap_resource - map a PCI resource into user memory space | 504 | * pci_mmap_resource - map a PCI resource into user memory space |
489 | * @kobj: kobject for mapping | 505 | * @kobj: kobject for mapping |
@@ -510,6 +526,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | |||
510 | if (i >= PCI_ROM_RESOURCE) | 526 | if (i >= PCI_ROM_RESOURCE) |
511 | return -ENODEV; | 527 | return -ENODEV; |
512 | 528 | ||
529 | if (!pci_mmap_fits(pdev, i, vma)) | ||
530 | return -EINVAL; | ||
531 | |||
513 | /* pci_mmap_page_range() expects the same kind of entry as coming | 532 | /* pci_mmap_page_range() expects the same kind of entry as coming |
514 | * from /proc/bus/pci/ which is a "user visible" value. If this is | 533 | * from /proc/bus/pci/ which is a "user visible" value. If this is |
515 | * different from the resource itself, arch will do necessary fixup. | 534 | * different from the resource itself, arch will do necessary fixup. |
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index f118252f3a9f..52e2743b04ec 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
@@ -422,6 +422,12 @@ done: | |||
422 | return err; | 422 | return err; |
423 | } | 423 | } |
424 | 424 | ||
425 | static int rtc_dev_fasync(int fd, struct file *file, int on) | ||
426 | { | ||
427 | struct rtc_device *rtc = file->private_data; | ||
428 | return fasync_helper(fd, file, on, &rtc->async_queue); | ||
429 | } | ||
430 | |||
425 | static int rtc_dev_release(struct inode *inode, struct file *file) | 431 | static int rtc_dev_release(struct inode *inode, struct file *file) |
426 | { | 432 | { |
427 | struct rtc_device *rtc = file->private_data; | 433 | struct rtc_device *rtc = file->private_data; |
@@ -434,16 +440,13 @@ static int rtc_dev_release(struct inode *inode, struct file *file) | |||
434 | if (rtc->ops->release) | 440 | if (rtc->ops->release) |
435 | rtc->ops->release(rtc->dev.parent); | 441 | rtc->ops->release(rtc->dev.parent); |
436 | 442 | ||
443 | if (file->f_flags & FASYNC) | ||
444 | rtc_dev_fasync(-1, file, 0); | ||
445 | |||
437 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); | 446 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); |
438 | return 0; | 447 | return 0; |
439 | } | 448 | } |
440 | 449 | ||
441 | static int rtc_dev_fasync(int fd, struct file *file, int on) | ||
442 | { | ||
443 | struct rtc_device *rtc = file->private_data; | ||
444 | return fasync_helper(fd, file, on, &rtc->async_queue); | ||
445 | } | ||
446 | |||
447 | static const struct file_operations rtc_dev_fops = { | 450 | static const struct file_operations rtc_dev_fops = { |
448 | .owner = THIS_MODULE, | 451 | .owner = THIS_MODULE, |
449 | .llseek = no_llseek, | 452 | .llseek = no_llseek, |
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index 1679e2f91c94..a0b6b46e7466 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
@@ -447,51 +447,36 @@ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, | |||
447 | { | 447 | { |
448 | char s[80]; | 448 | char s[80]; |
449 | 449 | ||
450 | sprintf(s, "%s sc:%x ", cdev->dev.bus_id, irq_ptr->schid.sch_no); | 450 | sprintf(s, "qdio: %s ", dev_name(&cdev->dev)); |
451 | |||
452 | switch (irq_ptr->qib.qfmt) { | 451 | switch (irq_ptr->qib.qfmt) { |
453 | case QDIO_QETH_QFMT: | 452 | case QDIO_QETH_QFMT: |
454 | sprintf(s + strlen(s), "OSADE "); | 453 | sprintf(s + strlen(s), "OSA "); |
455 | break; | 454 | break; |
456 | case QDIO_ZFCP_QFMT: | 455 | case QDIO_ZFCP_QFMT: |
457 | sprintf(s + strlen(s), "ZFCP "); | 456 | sprintf(s + strlen(s), "ZFCP "); |
458 | break; | 457 | break; |
459 | case QDIO_IQDIO_QFMT: | 458 | case QDIO_IQDIO_QFMT: |
460 | sprintf(s + strlen(s), "HiperSockets "); | 459 | sprintf(s + strlen(s), "HS "); |
461 | break; | 460 | break; |
462 | } | 461 | } |
463 | sprintf(s + strlen(s), "using: "); | 462 | sprintf(s + strlen(s), "on SC %x using ", irq_ptr->schid.sch_no); |
464 | 463 | sprintf(s + strlen(s), "AI:%d ", is_thinint_irq(irq_ptr)); | |
465 | if (!is_thinint_irq(irq_ptr)) | 464 | sprintf(s + strlen(s), "QEBSM:%d ", (irq_ptr->sch_token) ? 1 : 0); |
466 | sprintf(s + strlen(s), "no"); | 465 | sprintf(s + strlen(s), "PCI:%d ", |
467 | sprintf(s + strlen(s), "AdapterInterrupts "); | 466 | (irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED) ? 1 : 0); |
468 | if (!(irq_ptr->sch_token != 0)) | 467 | sprintf(s + strlen(s), "TDD:%d ", css_general_characteristics.aif_tdd); |
469 | sprintf(s + strlen(s), "no"); | 468 | sprintf(s + strlen(s), "SIGA:"); |
470 | sprintf(s + strlen(s), "QEBSM "); | 469 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.input) ? "R" : " "); |
471 | if (!(irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)) | 470 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.output) ? "W" : " "); |
472 | sprintf(s + strlen(s), "no"); | 471 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.sync) ? "S" : " "); |
473 | sprintf(s + strlen(s), "OutboundPCI "); | 472 | sprintf(s + strlen(s), "%s", |
474 | if (!css_general_characteristics.aif_tdd) | 473 | (!irq_ptr->siga_flag.no_sync_ti) ? "A" : " "); |
475 | sprintf(s + strlen(s), "no"); | 474 | sprintf(s + strlen(s), "%s", |
476 | sprintf(s + strlen(s), "TDD\n"); | 475 | (!irq_ptr->siga_flag.no_sync_out_ti) ? "O" : " "); |
477 | printk(KERN_INFO "qdio: %s", s); | 476 | sprintf(s + strlen(s), "%s", |
478 | 477 | (!irq_ptr->siga_flag.no_sync_out_pci) ? "P" : " "); | |
479 | memset(s, 0, sizeof(s)); | ||
480 | sprintf(s, "%s SIGA required: ", cdev->dev.bus_id); | ||
481 | if (irq_ptr->siga_flag.input) | ||
482 | sprintf(s + strlen(s), "Read "); | ||
483 | if (irq_ptr->siga_flag.output) | ||
484 | sprintf(s + strlen(s), "Write "); | ||
485 | if (irq_ptr->siga_flag.sync) | ||
486 | sprintf(s + strlen(s), "Sync "); | ||
487 | if (!irq_ptr->siga_flag.no_sync_ti) | ||
488 | sprintf(s + strlen(s), "SyncAI "); | ||
489 | if (!irq_ptr->siga_flag.no_sync_out_ti) | ||
490 | sprintf(s + strlen(s), "SyncOutAI "); | ||
491 | if (!irq_ptr->siga_flag.no_sync_out_pci) | ||
492 | sprintf(s + strlen(s), "SyncOutPCI"); | ||
493 | sprintf(s + strlen(s), "\n"); | 478 | sprintf(s + strlen(s), "\n"); |
494 | printk(KERN_INFO "qdio: %s", s); | 479 | printk(KERN_INFO "%s", s); |
495 | } | 480 | } |
496 | 481 | ||
497 | int __init qdio_setup_init(void) | 482 | int __init qdio_setup_init(void) |
diff --git a/drivers/spi/orion_spi.c b/drivers/spi/orion_spi.c index c4eaacd6e553..b872bfaf4bd2 100644 --- a/drivers/spi/orion_spi.c +++ b/drivers/spi/orion_spi.c | |||
@@ -427,7 +427,7 @@ static int orion_spi_transfer(struct spi_device *spi, struct spi_message *m) | |||
427 | goto msg_rejected; | 427 | goto msg_rejected; |
428 | } | 428 | } |
429 | 429 | ||
430 | if (t->speed_hz < orion_spi->min_speed) { | 430 | if (t->speed_hz && t->speed_hz < orion_spi->min_speed) { |
431 | dev_err(&spi->dev, | 431 | dev_err(&spi->dev, |
432 | "message rejected : " | 432 | "message rejected : " |
433 | "device min speed (%d Hz) exceeds " | 433 | "device min speed (%d Hz) exceeds " |
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index 0e53354c1cfe..d47d3636227f 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
@@ -49,7 +49,7 @@ MODULE_ALIAS("platform:pxa2xx-spi"); | |||
49 | 49 | ||
50 | #define DMA_INT_MASK (DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERR) | 50 | #define DMA_INT_MASK (DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERR) |
51 | #define RESET_DMA_CHANNEL (DCSR_NODESC | DMA_INT_MASK) | 51 | #define RESET_DMA_CHANNEL (DCSR_NODESC | DMA_INT_MASK) |
52 | #define IS_DMA_ALIGNED(x) (((x) & 0x07) == 0) | 52 | #define IS_DMA_ALIGNED(x) ((((u32)(x)) & 0x07) == 0) |
53 | #define MAX_DMA_LEN 8191 | 53 | #define MAX_DMA_LEN 8191 |
54 | 54 | ||
55 | /* | 55 | /* |
@@ -896,7 +896,7 @@ static void pump_transfers(unsigned long data) | |||
896 | || transfer->rx_dma || transfer->tx_dma) { | 896 | || transfer->rx_dma || transfer->tx_dma) { |
897 | dev_err(&drv_data->pdev->dev, | 897 | dev_err(&drv_data->pdev->dev, |
898 | "pump_transfers: mapped transfer length " | 898 | "pump_transfers: mapped transfer length " |
899 | "of %lu is greater than %d\n", | 899 | "of %u is greater than %d\n", |
900 | transfer->len, MAX_DMA_LEN); | 900 | transfer->len, MAX_DMA_LEN); |
901 | message->status = -EINVAL; | 901 | message->status = -EINVAL; |
902 | giveback(drv_data); | 902 | giveback(drv_data); |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index c6299e8a041d..9cbff84b787d 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -2400,11 +2400,15 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) | |||
2400 | 2400 | ||
2401 | if (!fbcon_is_inactive(vc, info)) { | 2401 | if (!fbcon_is_inactive(vc, info)) { |
2402 | if (ops->blank_state != blank) { | 2402 | if (ops->blank_state != blank) { |
2403 | int ret = 1; | ||
2404 | |||
2403 | ops->blank_state = blank; | 2405 | ops->blank_state = blank; |
2404 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); | 2406 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); |
2405 | ops->cursor_flash = (!blank); | 2407 | ops->cursor_flash = (!blank); |
2406 | 2408 | ||
2407 | if (fb_blank(info, blank)) | 2409 | if (info->fbops->fb_blank) |
2410 | ret = info->fbops->fb_blank(blank, info); | ||
2411 | if (ret) | ||
2408 | fbcon_generic_blank(vc, info, blank); | 2412 | fbcon_generic_blank(vc, info, blank); |
2409 | } | 2413 | } |
2410 | 2414 | ||
diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index a6e38e9ea73f..89a346880ec0 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h | |||
@@ -110,7 +110,7 @@ static inline int mono_col(const struct fb_info *info) | |||
110 | __u32 max_len; | 110 | __u32 max_len; |
111 | max_len = max(info->var.green.length, info->var.red.length); | 111 | max_len = max(info->var.green.length, info->var.red.length); |
112 | max_len = max(info->var.blue.length, max_len); | 112 | max_len = max(info->var.blue.length, max_len); |
113 | return ~(0xfff << (max_len & 0xff)); | 113 | return (~(0xfff << max_len)) & 0xff; |
114 | } | 114 | } |
115 | 115 | ||
116 | static inline int attr_col_ec(int shift, struct vc_data *vc, | 116 | static inline int attr_col_ec(int shift, struct vc_data *vc, |