diff options
83 files changed, 576 insertions, 169 deletions
diff --git a/Documentation/flexible-arrays.txt b/Documentation/flexible-arrays.txt index cb8a3a00cc92..df904aec9904 100644 --- a/Documentation/flexible-arrays.txt +++ b/Documentation/flexible-arrays.txt | |||
| @@ -66,10 +66,10 @@ trick is to ensure that any needed memory allocations are done before | |||
| 66 | entering atomic context, using: | 66 | entering atomic context, using: |
| 67 | 67 | ||
| 68 | int flex_array_prealloc(struct flex_array *array, unsigned int start, | 68 | int flex_array_prealloc(struct flex_array *array, unsigned int start, |
| 69 | unsigned int end, gfp_t flags); | 69 | unsigned int nr_elements, gfp_t flags); |
| 70 | 70 | ||
| 71 | This function will ensure that memory for the elements indexed in the range | 71 | This function will ensure that memory for the elements indexed in the range |
| 72 | defined by start and end has been allocated. Thereafter, a | 72 | defined by start and nr_elements has been allocated. Thereafter, a |
| 73 | flex_array_put() call on an element in that range is guaranteed not to | 73 | flex_array_put() call on an element in that range is guaranteed not to |
| 74 | block. | 74 | block. |
| 75 | 75 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 39 | 3 | SUBLEVEL = 39 |
| 4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc6 |
| 5 | NAME = Flesh-Eating Bats with Fangs | 5 | NAME = Flesh-Eating Bats with Fangs |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/configs/at91x40_defconfig b/arch/arm/configs/at91x40_defconfig new file mode 100644 index 000000000000..c55e9212fcbb --- /dev/null +++ b/arch/arm/configs/at91x40_defconfig | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | CONFIG_EXPERIMENTAL=y | ||
| 2 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 3 | CONFIG_EMBEDDED=y | ||
| 4 | # CONFIG_HOTPLUG is not set | ||
| 5 | # CONFIG_ELF_CORE is not set | ||
| 6 | # CONFIG_FUTEX is not set | ||
| 7 | # CONFIG_TIMERFD is not set | ||
| 8 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
| 9 | # CONFIG_COMPAT_BRK is not set | ||
| 10 | CONFIG_SLAB=y | ||
| 11 | # CONFIG_LBDAF is not set | ||
| 12 | # CONFIG_BLK_DEV_BSG is not set | ||
| 13 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 14 | # CONFIG_IOSCHED_CFQ is not set | ||
| 15 | # CONFIG_MMU is not set | ||
| 16 | CONFIG_ARCH_AT91=y | ||
| 17 | CONFIG_ARCH_AT91X40=y | ||
| 18 | CONFIG_MACH_AT91EB01=y | ||
| 19 | CONFIG_AT91_EARLY_USART0=y | ||
| 20 | CONFIG_CPU_ARM7TDMI=y | ||
| 21 | CONFIG_SET_MEM_PARAM=y | ||
| 22 | CONFIG_DRAM_BASE=0x01000000 | ||
| 23 | CONFIG_DRAM_SIZE=0x00400000 | ||
| 24 | CONFIG_FLASH_MEM_BASE=0x01400000 | ||
| 25 | CONFIG_PROCESSOR_ID=0x14000040 | ||
| 26 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 27 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 28 | CONFIG_BINFMT_FLAT=y | ||
| 29 | # CONFIG_SUSPEND is not set | ||
| 30 | # CONFIG_FW_LOADER is not set | ||
| 31 | CONFIG_MTD=y | ||
| 32 | CONFIG_MTD_PARTITIONS=y | ||
| 33 | CONFIG_MTD_CHAR=y | ||
| 34 | CONFIG_MTD_BLOCK=y | ||
| 35 | CONFIG_MTD_RAM=y | ||
| 36 | CONFIG_MTD_ROM=y | ||
| 37 | CONFIG_BLK_DEV_RAM=y | ||
| 38 | # CONFIG_INPUT is not set | ||
| 39 | # CONFIG_SERIO is not set | ||
| 40 | # CONFIG_VT is not set | ||
| 41 | # CONFIG_DEVKMEM is not set | ||
| 42 | # CONFIG_HW_RANDOM is not set | ||
| 43 | # CONFIG_HWMON is not set | ||
| 44 | # CONFIG_USB_SUPPORT is not set | ||
| 45 | CONFIG_EXT2_FS=y | ||
| 46 | # CONFIG_DNOTIFY is not set | ||
| 47 | CONFIG_ROMFS_FS=y | ||
| 48 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig index 19390231a0e9..2d299bf5d72f 100644 --- a/arch/arm/mach-at91/Kconfig +++ b/arch/arm/mach-at91/Kconfig | |||
| @@ -83,6 +83,7 @@ config ARCH_AT91CAP9 | |||
| 83 | select CPU_ARM926T | 83 | select CPU_ARM926T |
| 84 | select GENERIC_CLOCKEVENTS | 84 | select GENERIC_CLOCKEVENTS |
| 85 | select HAVE_FB_ATMEL | 85 | select HAVE_FB_ATMEL |
| 86 | select HAVE_NET_MACB | ||
| 86 | 87 | ||
| 87 | config ARCH_AT572D940HF | 88 | config ARCH_AT572D940HF |
| 88 | bool "AT572D940HF" | 89 | bool "AT572D940HF" |
diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c index 1f9d3cb64c50..d8df59a3426d 100644 --- a/arch/arm/mach-at91/board-eb01.c +++ b/arch/arm/mach-at91/board-eb01.c | |||
| @@ -30,6 +30,11 @@ | |||
| 30 | #include <mach/board.h> | 30 | #include <mach/board.h> |
| 31 | #include "generic.h" | 31 | #include "generic.h" |
| 32 | 32 | ||
| 33 | static void __init at91eb01_init_irq(void) | ||
| 34 | { | ||
| 35 | at91x40_init_interrupts(NULL); | ||
| 36 | } | ||
| 37 | |||
| 33 | static void __init at91eb01_map_io(void) | 38 | static void __init at91eb01_map_io(void) |
| 34 | { | 39 | { |
| 35 | at91x40_initialize(40000000); | 40 | at91x40_initialize(40000000); |
| @@ -38,7 +43,7 @@ static void __init at91eb01_map_io(void) | |||
| 38 | MACHINE_START(AT91EB01, "Atmel AT91 EB01") | 43 | MACHINE_START(AT91EB01, "Atmel AT91 EB01") |
| 39 | /* Maintainer: Greg Ungerer <gerg@snapgear.com> */ | 44 | /* Maintainer: Greg Ungerer <gerg@snapgear.com> */ |
| 40 | .timer = &at91x40_timer, | 45 | .timer = &at91x40_timer, |
| 41 | .init_irq = at91x40_init_interrupts, | 46 | .init_irq = at91eb01_init_irq, |
| 42 | .map_io = at91eb01_map_io, | 47 | .map_io = at91eb01_map_io, |
| 43 | MACHINE_END | 48 | MACHINE_END |
| 44 | 49 | ||
diff --git a/arch/arm/mach-at91/include/mach/cpu.h b/arch/arm/mach-at91/include/mach/cpu.h index 3bef931d0b1c..0700f2125305 100644 --- a/arch/arm/mach-at91/include/mach/cpu.h +++ b/arch/arm/mach-at91/include/mach/cpu.h | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #define ARCH_ID_AT91SAM9G45 0x819b05a0 | 27 | #define ARCH_ID_AT91SAM9G45 0x819b05a0 |
| 28 | #define ARCH_ID_AT91SAM9G45MRL 0x819b05a2 /* aka 9G45-ES2 & non ES lots */ | 28 | #define ARCH_ID_AT91SAM9G45MRL 0x819b05a2 /* aka 9G45-ES2 & non ES lots */ |
| 29 | #define ARCH_ID_AT91SAM9G45ES 0x819b05a1 /* 9G45-ES (Engineering Sample) */ | 29 | #define ARCH_ID_AT91SAM9G45ES 0x819b05a1 /* 9G45-ES (Engineering Sample) */ |
| 30 | #define ARCH_ID_AT91SAM9X5 0x819a05a0 | ||
| 30 | #define ARCH_ID_AT91CAP9 0x039A03A0 | 31 | #define ARCH_ID_AT91CAP9 0x039A03A0 |
| 31 | 32 | ||
| 32 | #define ARCH_ID_AT91SAM9XE128 0x329973a0 | 33 | #define ARCH_ID_AT91SAM9XE128 0x329973a0 |
| @@ -55,6 +56,12 @@ static inline unsigned long at91_cpu_fully_identify(void) | |||
| 55 | #define ARCH_EXID_AT91SAM9G46 0x00000003 | 56 | #define ARCH_EXID_AT91SAM9G46 0x00000003 |
| 56 | #define ARCH_EXID_AT91SAM9G45 0x00000004 | 57 | #define ARCH_EXID_AT91SAM9G45 0x00000004 |
| 57 | 58 | ||
| 59 | #define ARCH_EXID_AT91SAM9G15 0x00000000 | ||
| 60 | #define ARCH_EXID_AT91SAM9G35 0x00000001 | ||
| 61 | #define ARCH_EXID_AT91SAM9X35 0x00000002 | ||
| 62 | #define ARCH_EXID_AT91SAM9G25 0x00000003 | ||
| 63 | #define ARCH_EXID_AT91SAM9X25 0x00000004 | ||
| 64 | |||
| 58 | static inline unsigned long at91_exid_identify(void) | 65 | static inline unsigned long at91_exid_identify(void) |
| 59 | { | 66 | { |
| 60 | return at91_sys_read(AT91_DBGU_EXID); | 67 | return at91_sys_read(AT91_DBGU_EXID); |
| @@ -143,6 +150,27 @@ static inline unsigned long at91cap9_rev_identify(void) | |||
| 143 | #define cpu_is_at91sam9m11() (0) | 150 | #define cpu_is_at91sam9m11() (0) |
| 144 | #endif | 151 | #endif |
| 145 | 152 | ||
| 153 | #ifdef CONFIG_ARCH_AT91SAM9X5 | ||
| 154 | #define cpu_is_at91sam9x5() (at91_cpu_identify() == ARCH_ID_AT91SAM9X5) | ||
| 155 | #define cpu_is_at91sam9g15() (cpu_is_at91sam9x5() && \ | ||
| 156 | (at91_exid_identify() == ARCH_EXID_AT91SAM9G15)) | ||
| 157 | #define cpu_is_at91sam9g35() (cpu_is_at91sam9x5() && \ | ||
| 158 | (at91_exid_identify() == ARCH_EXID_AT91SAM9G35)) | ||
| 159 | #define cpu_is_at91sam9x35() (cpu_is_at91sam9x5() && \ | ||
| 160 | (at91_exid_identify() == ARCH_EXID_AT91SAM9X35)) | ||
| 161 | #define cpu_is_at91sam9g25() (cpu_is_at91sam9x5() && \ | ||
| 162 | (at91_exid_identify() == ARCH_EXID_AT91SAM9G25)) | ||
| 163 | #define cpu_is_at91sam9x25() (cpu_is_at91sam9x5() && \ | ||
| 164 | (at91_exid_identify() == ARCH_EXID_AT91SAM9X25)) | ||
| 165 | #else | ||
| 166 | #define cpu_is_at91sam9x5() (0) | ||
| 167 | #define cpu_is_at91sam9g15() (0) | ||
| 168 | #define cpu_is_at91sam9g35() (0) | ||
| 169 | #define cpu_is_at91sam9x35() (0) | ||
| 170 | #define cpu_is_at91sam9g25() (0) | ||
| 171 | #define cpu_is_at91sam9x25() (0) | ||
| 172 | #endif | ||
| 173 | |||
| 146 | #ifdef CONFIG_ARCH_AT91CAP9 | 174 | #ifdef CONFIG_ARCH_AT91CAP9 |
| 147 | #define cpu_is_at91cap9() (at91_cpu_identify() == ARCH_ID_AT91CAP9) | 175 | #define cpu_is_at91cap9() (at91_cpu_identify() == ARCH_ID_AT91CAP9) |
| 148 | #define cpu_is_at91cap9_revB() (at91cap9_rev_identify() == ARCH_REVISION_CAP9_B) | 176 | #define cpu_is_at91cap9_revB() (at91cap9_rev_identify() == ARCH_REVISION_CAP9_B) |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 3532d3bf8105..bb9eb29a52dd 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -698,7 +698,7 @@ cpu_dev_register(amd_cpu_dev); | |||
| 698 | */ | 698 | */ |
| 699 | 699 | ||
| 700 | const int amd_erratum_400[] = | 700 | const int amd_erratum_400[] = |
| 701 | AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0xf, 0x41, 0x2, 0xff, 0xf), | 701 | AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0x0f, 0x4, 0x2, 0xff, 0xf), |
| 702 | AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf)); | 702 | AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf)); |
| 703 | EXPORT_SYMBOL_GPL(amd_erratum_400); | 703 | EXPORT_SYMBOL_GPL(amd_erratum_400); |
| 704 | 704 | ||
diff --git a/arch/x86/kernel/reboot_32.S b/arch/x86/kernel/reboot_32.S index 29092b38d816..1d5c46df0d78 100644 --- a/arch/x86/kernel/reboot_32.S +++ b/arch/x86/kernel/reboot_32.S | |||
| @@ -21,26 +21,26 @@ r_base = . | |||
| 21 | /* Get our own relocated address */ | 21 | /* Get our own relocated address */ |
| 22 | call 1f | 22 | call 1f |
| 23 | 1: popl %ebx | 23 | 1: popl %ebx |
| 24 | subl $1b, %ebx | 24 | subl $(1b - r_base), %ebx |
| 25 | 25 | ||
| 26 | /* Compute the equivalent real-mode segment */ | 26 | /* Compute the equivalent real-mode segment */ |
| 27 | movl %ebx, %ecx | 27 | movl %ebx, %ecx |
| 28 | shrl $4, %ecx | 28 | shrl $4, %ecx |
| 29 | 29 | ||
| 30 | /* Patch post-real-mode segment jump */ | 30 | /* Patch post-real-mode segment jump */ |
| 31 | movw dispatch_table(%ebx,%eax,2),%ax | 31 | movw (dispatch_table - r_base)(%ebx,%eax,2),%ax |
| 32 | movw %ax, 101f(%ebx) | 32 | movw %ax, (101f - r_base)(%ebx) |
| 33 | movw %cx, 102f(%ebx) | 33 | movw %cx, (102f - r_base)(%ebx) |
| 34 | 34 | ||
| 35 | /* Set up the IDT for real mode. */ | 35 | /* Set up the IDT for real mode. */ |
| 36 | lidtl machine_real_restart_idt(%ebx) | 36 | lidtl (machine_real_restart_idt - r_base)(%ebx) |
| 37 | 37 | ||
| 38 | /* | 38 | /* |
| 39 | * Set up a GDT from which we can load segment descriptors for real | 39 | * Set up a GDT from which we can load segment descriptors for real |
| 40 | * mode. The GDT is not used in real mode; it is just needed here to | 40 | * mode. The GDT is not used in real mode; it is just needed here to |
| 41 | * prepare the descriptors. | 41 | * prepare the descriptors. |
| 42 | */ | 42 | */ |
| 43 | lgdtl machine_real_restart_gdt(%ebx) | 43 | lgdtl (machine_real_restart_gdt - r_base)(%ebx) |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * Load the data segment registers with 16-bit compatible values | 46 | * Load the data segment registers with 16-bit compatible values |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index e8c00cc72033..85b52fc03084 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
| @@ -306,7 +306,7 @@ int __init numa_cleanup_meminfo(struct numa_meminfo *mi) | |||
| 306 | bi->end = min(bi->end, high); | 306 | bi->end = min(bi->end, high); |
| 307 | 307 | ||
| 308 | /* and there's no empty block */ | 308 | /* and there's no empty block */ |
| 309 | if (bi->start == bi->end) { | 309 | if (bi->start >= bi->end) { |
| 310 | numa_remove_memblk_from(i--, mi); | 310 | numa_remove_memblk_from(i--, mi); |
| 311 | continue; | 311 | continue; |
| 312 | } | 312 | } |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index aef7af92b28b..55c965b38c27 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1463,6 +1463,119 @@ static int xen_pgd_alloc(struct mm_struct *mm) | |||
| 1463 | return ret; | 1463 | return ret; |
| 1464 | } | 1464 | } |
| 1465 | 1465 | ||
| 1466 | #ifdef CONFIG_X86_64 | ||
| 1467 | static __initdata u64 __last_pgt_set_rw = 0; | ||
| 1468 | static __initdata u64 __pgt_buf_start = 0; | ||
| 1469 | static __initdata u64 __pgt_buf_end = 0; | ||
| 1470 | static __initdata u64 __pgt_buf_top = 0; | ||
| 1471 | /* | ||
| 1472 | * As a consequence of the commit: | ||
| 1473 | * | ||
| 1474 | * commit 4b239f458c229de044d6905c2b0f9fe16ed9e01e | ||
| 1475 | * Author: Yinghai Lu <yinghai@kernel.org> | ||
| 1476 | * Date: Fri Dec 17 16:58:28 2010 -0800 | ||
| 1477 | * | ||
| 1478 | * x86-64, mm: Put early page table high | ||
| 1479 | * | ||
| 1480 | * at some point init_memory_mapping is going to reach the pagetable pages | ||
| 1481 | * area and map those pages too (mapping them as normal memory that falls | ||
| 1482 | * in the range of addresses passed to init_memory_mapping as argument). | ||
| 1483 | * Some of those pages are already pagetable pages (they are in the range | ||
| 1484 | * pgt_buf_start-pgt_buf_end) therefore they are going to be mapped RO and | ||
| 1485 | * everything is fine. | ||
| 1486 | * Some of these pages are not pagetable pages yet (they fall in the range | ||
| 1487 | * pgt_buf_end-pgt_buf_top; for example the page at pgt_buf_end) so they | ||
| 1488 | * are going to be mapped RW. When these pages become pagetable pages and | ||
| 1489 | * are hooked into the pagetable, xen will find that the guest has already | ||
| 1490 | * a RW mapping of them somewhere and fail the operation. | ||
| 1491 | * The reason Xen requires pagetables to be RO is that the hypervisor needs | ||
| 1492 | * to verify that the pagetables are valid before using them. The validation | ||
| 1493 | * operations are called "pinning". | ||
| 1494 | * | ||
| 1495 | * In order to fix the issue we mark all the pages in the entire range | ||
| 1496 | * pgt_buf_start-pgt_buf_top as RO, however when the pagetable allocation | ||
| 1497 | * is completed only the range pgt_buf_start-pgt_buf_end is reserved by | ||
| 1498 | * init_memory_mapping. Hence the kernel is going to crash as soon as one | ||
| 1499 | * of the pages in the range pgt_buf_end-pgt_buf_top is reused (b/c those | ||
| 1500 | * ranges are RO). | ||
| 1501 | * | ||
| 1502 | * For this reason, 'mark_rw_past_pgt' is introduced which is called _after_ | ||
| 1503 | * the init_memory_mapping has completed (in a perfect world we would | ||
| 1504 | * call this function from init_memory_mapping, but lets ignore that). | ||
| 1505 | * | ||
| 1506 | * Because we are called _after_ init_memory_mapping the pgt_buf_[start, | ||
| 1507 | * end,top] have all changed to new values (b/c init_memory_mapping | ||
| 1508 | * is called and setting up another new page-table). Hence, the first time | ||
| 1509 | * we enter this function, we save away the pgt_buf_start value and update | ||
| 1510 | * the pgt_buf_[end,top]. | ||
| 1511 | * | ||
| 1512 | * When we detect that the "old" pgt_buf_start through pgt_buf_end | ||
| 1513 | * PFNs have been reserved (so memblock_x86_reserve_range has been called), | ||
| 1514 | * we immediately set out to RW the "old" pgt_buf_end through pgt_buf_top. | ||
| 1515 | * | ||
| 1516 | * And then we update those "old" pgt_buf_[end|top] with the new ones | ||
| 1517 | * so that we can redo this on the next pagetable. | ||
| 1518 | */ | ||
| 1519 | static __init void mark_rw_past_pgt(void) { | ||
| 1520 | |||
| 1521 | if (pgt_buf_end > pgt_buf_start) { | ||
| 1522 | u64 addr, size; | ||
| 1523 | |||
| 1524 | /* Save it away. */ | ||
| 1525 | if (!__pgt_buf_start) { | ||
| 1526 | __pgt_buf_start = pgt_buf_start; | ||
| 1527 | __pgt_buf_end = pgt_buf_end; | ||
| 1528 | __pgt_buf_top = pgt_buf_top; | ||
| 1529 | return; | ||
| 1530 | } | ||
| 1531 | /* If we get the range that starts at __pgt_buf_end that means | ||
| 1532 | * the range is reserved, and that in 'init_memory_mapping' | ||
| 1533 | * the 'memblock_x86_reserve_range' has been called with the | ||
| 1534 | * outdated __pgt_buf_start, __pgt_buf_end (the "new" | ||
| 1535 | * pgt_buf_[start|end|top] refer now to a new pagetable. | ||
| 1536 | * Note: we are called _after_ the pgt_buf_[..] have been | ||
| 1537 | * updated.*/ | ||
| 1538 | |||
| 1539 | addr = memblock_x86_find_in_range_size(PFN_PHYS(__pgt_buf_start), | ||
| 1540 | &size, PAGE_SIZE); | ||
| 1541 | |||
| 1542 | /* Still not reserved, meaning 'memblock_x86_reserve_range' | ||
| 1543 | * hasn't been called yet. Update the _end and _top.*/ | ||
| 1544 | if (addr == PFN_PHYS(__pgt_buf_start)) { | ||
| 1545 | __pgt_buf_end = pgt_buf_end; | ||
| 1546 | __pgt_buf_top = pgt_buf_top; | ||
| 1547 | return; | ||
| 1548 | } | ||
| 1549 | |||
| 1550 | /* OK, the area is reserved, meaning it is time for us to | ||
| 1551 | * set RW for the old end->top PFNs. */ | ||
| 1552 | |||
| 1553 | /* ..unless we had already done this. */ | ||
| 1554 | if (__pgt_buf_end == __last_pgt_set_rw) | ||
| 1555 | return; | ||
| 1556 | |||
| 1557 | addr = PFN_PHYS(__pgt_buf_end); | ||
| 1558 | |||
| 1559 | /* set as RW the rest */ | ||
| 1560 | printk(KERN_DEBUG "xen: setting RW the range %llx - %llx\n", | ||
| 1561 | PFN_PHYS(__pgt_buf_end), PFN_PHYS(__pgt_buf_top)); | ||
| 1562 | |||
| 1563 | while (addr < PFN_PHYS(__pgt_buf_top)) { | ||
| 1564 | make_lowmem_page_readwrite(__va(addr)); | ||
| 1565 | addr += PAGE_SIZE; | ||
| 1566 | } | ||
| 1567 | /* And update everything so that we are ready for the next | ||
| 1568 | * pagetable (the one created for regions past 4GB) */ | ||
| 1569 | __last_pgt_set_rw = __pgt_buf_end; | ||
| 1570 | __pgt_buf_start = pgt_buf_start; | ||
| 1571 | __pgt_buf_end = pgt_buf_end; | ||
| 1572 | __pgt_buf_top = pgt_buf_top; | ||
| 1573 | } | ||
| 1574 | return; | ||
| 1575 | } | ||
| 1576 | #else | ||
| 1577 | static __init void mark_rw_past_pgt(void) { } | ||
| 1578 | #endif | ||
| 1466 | static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) | 1579 | static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) |
| 1467 | { | 1580 | { |
| 1468 | #ifdef CONFIG_X86_64 | 1581 | #ifdef CONFIG_X86_64 |
| @@ -1489,13 +1602,21 @@ static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte) | |||
| 1489 | unsigned long pfn = pte_pfn(pte); | 1602 | unsigned long pfn = pte_pfn(pte); |
| 1490 | 1603 | ||
| 1491 | /* | 1604 | /* |
| 1605 | * A bit of optimization. We do not need to call the workaround | ||
| 1606 | * when xen_set_pte_init is called with a PTE with 0 as PFN. | ||
| 1607 | * That is b/c the pagetable at that point are just being populated | ||
| 1608 | * with empty values and we can save some cycles by not calling | ||
| 1609 | * the 'memblock' code.*/ | ||
| 1610 | if (pfn) | ||
| 1611 | mark_rw_past_pgt(); | ||
| 1612 | /* | ||
| 1492 | * If the new pfn is within the range of the newly allocated | 1613 | * If the new pfn is within the range of the newly allocated |
| 1493 | * kernel pagetable, and it isn't being mapped into an | 1614 | * kernel pagetable, and it isn't being mapped into an |
| 1494 | * early_ioremap fixmap slot as a freshly allocated page, make sure | 1615 | * early_ioremap fixmap slot as a freshly allocated page, make sure |
| 1495 | * it is RO. | 1616 | * it is RO. |
| 1496 | */ | 1617 | */ |
| 1497 | if (((!is_early_ioremap_ptep(ptep) && | 1618 | if (((!is_early_ioremap_ptep(ptep) && |
| 1498 | pfn >= pgt_buf_start && pfn < pgt_buf_end)) || | 1619 | pfn >= pgt_buf_start && pfn < pgt_buf_top)) || |
| 1499 | (is_early_ioremap_ptep(ptep) && pfn != (pgt_buf_end - 1))) | 1620 | (is_early_ioremap_ptep(ptep) && pfn != (pgt_buf_end - 1))) |
| 1500 | pte = pte_wrprotect(pte); | 1621 | pte = pte_wrprotect(pte); |
| 1501 | 1622 | ||
| @@ -1997,6 +2118,8 @@ __init void xen_ident_map_ISA(void) | |||
| 1997 | 2118 | ||
| 1998 | static __init void xen_post_allocator_init(void) | 2119 | static __init void xen_post_allocator_init(void) |
| 1999 | { | 2120 | { |
| 2121 | mark_rw_past_pgt(); | ||
| 2122 | |||
| 2000 | #ifdef CONFIG_XEN_DEBUG | 2123 | #ifdef CONFIG_XEN_DEBUG |
| 2001 | pv_mmu_ops.make_pte = PV_CALLEE_SAVE(xen_make_pte_debug); | 2124 | pv_mmu_ops.make_pte = PV_CALLEE_SAVE(xen_make_pte_debug); |
| 2002 | #endif | 2125 | #endif |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 16dc3645291c..3e904717c1c0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -777,9 +777,9 @@ static int rbd_do_request(struct request *rq, | |||
| 777 | ops, | 777 | ops, |
| 778 | false, | 778 | false, |
| 779 | GFP_NOIO, pages, bio); | 779 | GFP_NOIO, pages, bio); |
| 780 | if (IS_ERR(req)) { | 780 | if (!req) { |
| 781 | up_read(&header->snap_rwsem); | 781 | up_read(&header->snap_rwsem); |
| 782 | ret = PTR_ERR(req); | 782 | ret = -ENOMEM; |
| 783 | goto done_pages; | 783 | goto done_pages; |
| 784 | } | 784 | } |
| 785 | 785 | ||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index f903d7b6f34a..23d1468ad253 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
| @@ -2199,7 +2199,6 @@ static int ohci_set_config_rom(struct fw_card *card, | |||
| 2199 | { | 2199 | { |
| 2200 | struct fw_ohci *ohci; | 2200 | struct fw_ohci *ohci; |
| 2201 | unsigned long flags; | 2201 | unsigned long flags; |
| 2202 | int ret = -EBUSY; | ||
| 2203 | __be32 *next_config_rom; | 2202 | __be32 *next_config_rom; |
| 2204 | dma_addr_t uninitialized_var(next_config_rom_bus); | 2203 | dma_addr_t uninitialized_var(next_config_rom_bus); |
| 2205 | 2204 | ||
| @@ -2240,22 +2239,37 @@ static int ohci_set_config_rom(struct fw_card *card, | |||
| 2240 | 2239 | ||
| 2241 | spin_lock_irqsave(&ohci->lock, flags); | 2240 | spin_lock_irqsave(&ohci->lock, flags); |
| 2242 | 2241 | ||
| 2242 | /* | ||
| 2243 | * If there is not an already pending config_rom update, | ||
| 2244 | * push our new allocation into the ohci->next_config_rom | ||
| 2245 | * and then mark the local variable as null so that we | ||
| 2246 | * won't deallocate the new buffer. | ||
| 2247 | * | ||
| 2248 | * OTOH, if there is a pending config_rom update, just | ||
| 2249 | * use that buffer with the new config_rom data, and | ||
| 2250 | * let this routine free the unused DMA allocation. | ||
| 2251 | */ | ||
| 2252 | |||
| 2243 | if (ohci->next_config_rom == NULL) { | 2253 | if (ohci->next_config_rom == NULL) { |
| 2244 | ohci->next_config_rom = next_config_rom; | 2254 | ohci->next_config_rom = next_config_rom; |
| 2245 | ohci->next_config_rom_bus = next_config_rom_bus; | 2255 | ohci->next_config_rom_bus = next_config_rom_bus; |
| 2256 | next_config_rom = NULL; | ||
| 2257 | } | ||
| 2246 | 2258 | ||
| 2247 | copy_config_rom(ohci->next_config_rom, config_rom, length); | 2259 | copy_config_rom(ohci->next_config_rom, config_rom, length); |
| 2248 | 2260 | ||
| 2249 | ohci->next_header = config_rom[0]; | 2261 | ohci->next_header = config_rom[0]; |
| 2250 | ohci->next_config_rom[0] = 0; | 2262 | ohci->next_config_rom[0] = 0; |
| 2251 | 2263 | ||
| 2252 | reg_write(ohci, OHCI1394_ConfigROMmap, | 2264 | reg_write(ohci, OHCI1394_ConfigROMmap, ohci->next_config_rom_bus); |
| 2253 | ohci->next_config_rom_bus); | ||
| 2254 | ret = 0; | ||
| 2255 | } | ||
| 2256 | 2265 | ||
| 2257 | spin_unlock_irqrestore(&ohci->lock, flags); | 2266 | spin_unlock_irqrestore(&ohci->lock, flags); |
| 2258 | 2267 | ||
| 2268 | /* If we didn't use the DMA allocation, delete it. */ | ||
| 2269 | if (next_config_rom != NULL) | ||
| 2270 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, | ||
| 2271 | next_config_rom, next_config_rom_bus); | ||
| 2272 | |||
| 2259 | /* | 2273 | /* |
| 2260 | * Now initiate a bus reset to have the changes take | 2274 | * Now initiate a bus reset to have the changes take |
| 2261 | * effect. We clean up the old config rom memory and DMA | 2275 | * effect. We clean up the old config rom memory and DMA |
| @@ -2263,13 +2277,10 @@ static int ohci_set_config_rom(struct fw_card *card, | |||
| 2263 | * controller could need to access it before the bus reset | 2277 | * controller could need to access it before the bus reset |
| 2264 | * takes effect. | 2278 | * takes effect. |
| 2265 | */ | 2279 | */ |
| 2266 | if (ret == 0) | ||
| 2267 | fw_schedule_bus_reset(&ohci->card, true, true); | ||
| 2268 | else | ||
| 2269 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, | ||
| 2270 | next_config_rom, next_config_rom_bus); | ||
| 2271 | 2280 | ||
| 2272 | return ret; | 2281 | fw_schedule_bus_reset(&ohci->card, true, true); |
| 2282 | |||
| 2283 | return 0; | ||
| 2273 | } | 2284 | } |
| 2274 | 2285 | ||
| 2275 | static void ohci_send_request(struct fw_card *card, struct fw_packet *packet) | 2286 | static void ohci_send_request(struct fw_card *card, struct fw_packet *packet) |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 741457bd1c46..a1f12cb043de 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -932,11 +932,34 @@ EXPORT_SYMBOL(drm_vblank_put); | |||
| 932 | 932 | ||
| 933 | void drm_vblank_off(struct drm_device *dev, int crtc) | 933 | void drm_vblank_off(struct drm_device *dev, int crtc) |
| 934 | { | 934 | { |
| 935 | struct drm_pending_vblank_event *e, *t; | ||
| 936 | struct timeval now; | ||
| 935 | unsigned long irqflags; | 937 | unsigned long irqflags; |
| 938 | unsigned int seq; | ||
| 936 | 939 | ||
| 937 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 940 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
| 938 | vblank_disable_and_save(dev, crtc); | 941 | vblank_disable_and_save(dev, crtc); |
| 939 | DRM_WAKEUP(&dev->vbl_queue[crtc]); | 942 | DRM_WAKEUP(&dev->vbl_queue[crtc]); |
| 943 | |||
| 944 | /* Send any queued vblank events, lest the natives grow disquiet */ | ||
| 945 | seq = drm_vblank_count_and_time(dev, crtc, &now); | ||
| 946 | list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { | ||
| 947 | if (e->pipe != crtc) | ||
| 948 | continue; | ||
| 949 | DRM_DEBUG("Sending premature vblank event on disable: \ | ||
| 950 | wanted %d, current %d\n", | ||
| 951 | e->event.sequence, seq); | ||
| 952 | |||
| 953 | e->event.sequence = seq; | ||
| 954 | e->event.tv_sec = now.tv_sec; | ||
| 955 | e->event.tv_usec = now.tv_usec; | ||
| 956 | drm_vblank_put(dev, e->pipe); | ||
| 957 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | ||
| 958 | wake_up_interruptible(&e->base.file_priv->event_wait); | ||
| 959 | trace_drm_vblank_event_delivered(e->base.pid, e->pipe, | ||
| 960 | e->event.sequence); | ||
| 961 | } | ||
| 962 | |||
| 940 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | 963 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); |
| 941 | } | 964 | } |
| 942 | EXPORT_SYMBOL(drm_vblank_off); | 965 | EXPORT_SYMBOL(drm_vblank_off); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index e9bc135d9189..c20eac3379e6 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -862,9 +862,15 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev) | |||
| 862 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | 862 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | |
| 863 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | | 863 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | |
| 864 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); | 864 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); |
| 865 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | 865 | if (rdev->flags & RADEON_IS_IGP) { |
| 866 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | 866 | WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp); |
| 867 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | 867 | WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp); |
| 868 | WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
| 869 | } else { | ||
| 870 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | ||
| 871 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | ||
| 872 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
| 873 | } | ||
| 868 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | 874 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); |
| 869 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | 875 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); |
| 870 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 876 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
| @@ -2923,11 +2929,6 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
| 2923 | rdev->asic->copy = NULL; | 2929 | rdev->asic->copy = NULL; |
| 2924 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | 2930 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); |
| 2925 | } | 2931 | } |
| 2926 | /* XXX: ontario has problems blitting to gart at the moment */ | ||
| 2927 | if (rdev->family == CHIP_PALM) { | ||
| 2928 | rdev->asic->copy = NULL; | ||
| 2929 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); | ||
| 2930 | } | ||
| 2931 | 2932 | ||
| 2932 | /* allocate wb buffer */ | 2933 | /* allocate wb buffer */ |
| 2933 | r = radeon_wb_init(rdev); | 2934 | r = radeon_wb_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 9aaa3f0c9372..94533849927e 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -221,6 +221,11 @@ | |||
| 221 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 | 221 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 |
| 222 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 | 222 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 |
| 223 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C | 223 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C |
| 224 | |||
| 225 | #define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C | ||
| 226 | #define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660 | ||
| 227 | #define FUS_MC_VM_MD_L1_TLB2_CNTL 0x2664 | ||
| 228 | |||
| 224 | #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C | 229 | #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C |
| 225 | #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 | 230 | #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 |
| 226 | #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 | 231 | #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index f5d12fb103fa..f116516bfef7 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -1599,9 +1599,10 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct | |||
| 1599 | memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0], | 1599 | memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0], |
| 1600 | fake_edid_record->ucFakeEDIDLength); | 1600 | fake_edid_record->ucFakeEDIDLength); |
| 1601 | 1601 | ||
| 1602 | if (drm_edid_is_valid(edid)) | 1602 | if (drm_edid_is_valid(edid)) { |
| 1603 | rdev->mode_info.bios_hardcoded_edid = edid; | 1603 | rdev->mode_info.bios_hardcoded_edid = edid; |
| 1604 | else | 1604 | rdev->mode_info.bios_hardcoded_edid_size = edid_size; |
| 1605 | } else | ||
| 1605 | kfree(edid); | 1606 | kfree(edid); |
| 1606 | } | 1607 | } |
| 1607 | } | 1608 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 871df0376b1c..bd58af658581 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -234,6 +234,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 234 | return -EINVAL; | 234 | return -EINVAL; |
| 235 | } | 235 | } |
| 236 | break; | 236 | break; |
| 237 | case RADEON_INFO_FUSION_GART_WORKING: | ||
| 238 | value = 1; | ||
| 239 | break; | ||
| 237 | default: | 240 | default: |
| 238 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); | 241 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); |
| 239 | return -EINVAL; | 242 | return -EINVAL; |
diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c index 6ae054f8e0aa..9175d49d2546 100644 --- a/drivers/input/touchscreen/wm831x-ts.c +++ b/drivers/input/touchscreen/wm831x-ts.c | |||
| @@ -68,8 +68,23 @@ struct wm831x_ts { | |||
| 68 | unsigned int pd_irq; | 68 | unsigned int pd_irq; |
| 69 | bool pressure; | 69 | bool pressure; |
| 70 | bool pen_down; | 70 | bool pen_down; |
| 71 | struct work_struct pd_data_work; | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 74 | static void wm831x_pd_data_work(struct work_struct *work) | ||
| 75 | { | ||
| 76 | struct wm831x_ts *wm831x_ts = | ||
| 77 | container_of(work, struct wm831x_ts, pd_data_work); | ||
| 78 | |||
| 79 | if (wm831x_ts->pen_down) { | ||
| 80 | enable_irq(wm831x_ts->data_irq); | ||
| 81 | dev_dbg(wm831x_ts->wm831x->dev, "IRQ PD->DATA done\n"); | ||
| 82 | } else { | ||
| 83 | enable_irq(wm831x_ts->pd_irq); | ||
| 84 | dev_dbg(wm831x_ts->wm831x->dev, "IRQ DATA->PD done\n"); | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 73 | static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) | 88 | static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) |
| 74 | { | 89 | { |
| 75 | struct wm831x_ts *wm831x_ts = irq_data; | 90 | struct wm831x_ts *wm831x_ts = irq_data; |
| @@ -110,6 +125,9 @@ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) | |||
| 110 | } | 125 | } |
| 111 | 126 | ||
| 112 | if (!wm831x_ts->pen_down) { | 127 | if (!wm831x_ts->pen_down) { |
| 128 | /* Switch from data to pen down */ | ||
| 129 | dev_dbg(wm831x->dev, "IRQ DATA->PD\n"); | ||
| 130 | |||
| 113 | disable_irq_nosync(wm831x_ts->data_irq); | 131 | disable_irq_nosync(wm831x_ts->data_irq); |
| 114 | 132 | ||
| 115 | /* Don't need data any more */ | 133 | /* Don't need data any more */ |
| @@ -128,6 +146,10 @@ static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) | |||
| 128 | ABS_PRESSURE, 0); | 146 | ABS_PRESSURE, 0); |
| 129 | 147 | ||
| 130 | input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0); | 148 | input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0); |
| 149 | |||
| 150 | schedule_work(&wm831x_ts->pd_data_work); | ||
| 151 | } else { | ||
| 152 | input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1); | ||
| 131 | } | 153 | } |
| 132 | 154 | ||
| 133 | input_sync(wm831x_ts->input_dev); | 155 | input_sync(wm831x_ts->input_dev); |
| @@ -141,6 +163,11 @@ static irqreturn_t wm831x_ts_pen_down_irq(int irq, void *irq_data) | |||
| 141 | struct wm831x *wm831x = wm831x_ts->wm831x; | 163 | struct wm831x *wm831x = wm831x_ts->wm831x; |
| 142 | int ena = 0; | 164 | int ena = 0; |
| 143 | 165 | ||
| 166 | if (wm831x_ts->pen_down) | ||
| 167 | return IRQ_HANDLED; | ||
| 168 | |||
| 169 | disable_irq_nosync(wm831x_ts->pd_irq); | ||
| 170 | |||
| 144 | /* Start collecting data */ | 171 | /* Start collecting data */ |
| 145 | if (wm831x_ts->pressure) | 172 | if (wm831x_ts->pressure) |
| 146 | ena |= WM831X_TCH_Z_ENA; | 173 | ena |= WM831X_TCH_Z_ENA; |
| @@ -149,14 +176,14 @@ static irqreturn_t wm831x_ts_pen_down_irq(int irq, void *irq_data) | |||
| 149 | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, | 176 | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, |
| 150 | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena); | 177 | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena); |
| 151 | 178 | ||
| 152 | input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1); | ||
| 153 | input_sync(wm831x_ts->input_dev); | ||
| 154 | |||
| 155 | wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, | 179 | wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, |
| 156 | WM831X_TCHPD_EINT, WM831X_TCHPD_EINT); | 180 | WM831X_TCHPD_EINT, WM831X_TCHPD_EINT); |
| 157 | 181 | ||
| 158 | wm831x_ts->pen_down = true; | 182 | wm831x_ts->pen_down = true; |
| 159 | enable_irq(wm831x_ts->data_irq); | 183 | |
| 184 | /* Switch from pen down to data */ | ||
| 185 | dev_dbg(wm831x->dev, "IRQ PD->DATA\n"); | ||
| 186 | schedule_work(&wm831x_ts->pd_data_work); | ||
| 160 | 187 | ||
| 161 | return IRQ_HANDLED; | 188 | return IRQ_HANDLED; |
| 162 | } | 189 | } |
| @@ -182,13 +209,28 @@ static void wm831x_ts_input_close(struct input_dev *idev) | |||
| 182 | struct wm831x_ts *wm831x_ts = input_get_drvdata(idev); | 209 | struct wm831x_ts *wm831x_ts = input_get_drvdata(idev); |
| 183 | struct wm831x *wm831x = wm831x_ts->wm831x; | 210 | struct wm831x *wm831x = wm831x_ts->wm831x; |
| 184 | 211 | ||
| 212 | /* Shut the controller down, disabling all other functionality too */ | ||
| 185 | wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, | 213 | wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, |
| 186 | WM831X_TCH_ENA | WM831X_TCH_CVT_ENA | | 214 | WM831X_TCH_ENA | WM831X_TCH_X_ENA | |
| 187 | WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | | 215 | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, 0); |
| 188 | WM831X_TCH_Z_ENA, 0); | ||
| 189 | 216 | ||
| 190 | if (wm831x_ts->pen_down) | 217 | /* Make sure any pending IRQs are done, the above will prevent |
| 218 | * new ones firing. | ||
| 219 | */ | ||
| 220 | synchronize_irq(wm831x_ts->data_irq); | ||
| 221 | synchronize_irq(wm831x_ts->pd_irq); | ||
| 222 | |||
| 223 | /* Make sure the IRQ completion work is quiesced */ | ||
| 224 | flush_work_sync(&wm831x_ts->pd_data_work); | ||
| 225 | |||
| 226 | /* If we ended up with the pen down then make sure we revert back | ||
| 227 | * to pen detection state for the next time we start up. | ||
| 228 | */ | ||
| 229 | if (wm831x_ts->pen_down) { | ||
| 191 | disable_irq(wm831x_ts->data_irq); | 230 | disable_irq(wm831x_ts->data_irq); |
| 231 | enable_irq(wm831x_ts->pd_irq); | ||
| 232 | wm831x_ts->pen_down = false; | ||
| 233 | } | ||
| 192 | } | 234 | } |
| 193 | 235 | ||
| 194 | static __devinit int wm831x_ts_probe(struct platform_device *pdev) | 236 | static __devinit int wm831x_ts_probe(struct platform_device *pdev) |
| @@ -198,7 +240,7 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev) | |||
| 198 | struct wm831x_pdata *core_pdata = dev_get_platdata(pdev->dev.parent); | 240 | struct wm831x_pdata *core_pdata = dev_get_platdata(pdev->dev.parent); |
| 199 | struct wm831x_touch_pdata *pdata = NULL; | 241 | struct wm831x_touch_pdata *pdata = NULL; |
| 200 | struct input_dev *input_dev; | 242 | struct input_dev *input_dev; |
| 201 | int error; | 243 | int error, irqf; |
| 202 | 244 | ||
| 203 | if (core_pdata) | 245 | if (core_pdata) |
| 204 | pdata = core_pdata->touch; | 246 | pdata = core_pdata->touch; |
| @@ -212,6 +254,7 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev) | |||
| 212 | 254 | ||
| 213 | wm831x_ts->wm831x = wm831x; | 255 | wm831x_ts->wm831x = wm831x; |
| 214 | wm831x_ts->input_dev = input_dev; | 256 | wm831x_ts->input_dev = input_dev; |
| 257 | INIT_WORK(&wm831x_ts->pd_data_work, wm831x_pd_data_work); | ||
| 215 | 258 | ||
| 216 | /* | 259 | /* |
| 217 | * If we have a direct IRQ use it, otherwise use the interrupt | 260 | * If we have a direct IRQ use it, otherwise use the interrupt |
| @@ -270,9 +313,14 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev) | |||
| 270 | wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, | 313 | wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, |
| 271 | WM831X_TCH_RATE_MASK, 6); | 314 | WM831X_TCH_RATE_MASK, 6); |
| 272 | 315 | ||
| 316 | if (pdata && pdata->data_irqf) | ||
| 317 | irqf = pdata->data_irqf; | ||
| 318 | else | ||
| 319 | irqf = IRQF_TRIGGER_HIGH; | ||
| 320 | |||
| 273 | error = request_threaded_irq(wm831x_ts->data_irq, | 321 | error = request_threaded_irq(wm831x_ts->data_irq, |
| 274 | NULL, wm831x_ts_data_irq, | 322 | NULL, wm831x_ts_data_irq, |
| 275 | IRQF_ONESHOT, | 323 | irqf | IRQF_ONESHOT, |
| 276 | "Touchscreen data", wm831x_ts); | 324 | "Touchscreen data", wm831x_ts); |
| 277 | if (error) { | 325 | if (error) { |
| 278 | dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n", | 326 | dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n", |
| @@ -281,9 +329,14 @@ static __devinit int wm831x_ts_probe(struct platform_device *pdev) | |||
| 281 | } | 329 | } |
| 282 | disable_irq(wm831x_ts->data_irq); | 330 | disable_irq(wm831x_ts->data_irq); |
| 283 | 331 | ||
| 332 | if (pdata && pdata->pd_irqf) | ||
| 333 | irqf = pdata->pd_irqf; | ||
| 334 | else | ||
| 335 | irqf = IRQF_TRIGGER_HIGH; | ||
| 336 | |||
| 284 | error = request_threaded_irq(wm831x_ts->pd_irq, | 337 | error = request_threaded_irq(wm831x_ts->pd_irq, |
| 285 | NULL, wm831x_ts_pen_down_irq, | 338 | NULL, wm831x_ts_pen_down_irq, |
| 286 | IRQF_ONESHOT, | 339 | irqf | IRQF_ONESHOT, |
| 287 | "Touchscreen pen down", wm831x_ts); | 340 | "Touchscreen pen down", wm831x_ts); |
| 288 | if (error) { | 341 | if (error) { |
| 289 | dev_err(&pdev->dev, "Failed to request pen down IRQ %d: %d\n", | 342 | dev_err(&pdev->dev, "Failed to request pen down IRQ %d: %d\n", |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index ccbd39a38c46..c545039287ad 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
| @@ -356,6 +356,8 @@ config DVB_USB_LME2510 | |||
| 356 | select DVB_TDA826X if !DVB_FE_CUSTOMISE | 356 | select DVB_TDA826X if !DVB_FE_CUSTOMISE |
| 357 | select DVB_STV0288 if !DVB_FE_CUSTOMISE | 357 | select DVB_STV0288 if !DVB_FE_CUSTOMISE |
| 358 | select DVB_IX2505V if !DVB_FE_CUSTOMISE | 358 | select DVB_IX2505V if !DVB_FE_CUSTOMISE |
| 359 | select DVB_STV0299 if !DVB_FE_CUSTOMISE | ||
| 360 | select DVB_PLL if !DVB_FE_CUSTOMISE | ||
| 359 | help | 361 | help |
| 360 | Say Y here to support the LME DM04/QQBOX DVB-S USB2.0 . | 362 | Say Y here to support the LME DM04/QQBOX DVB-S USB2.0 . |
| 361 | 363 | ||
diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c index ccc2d1af49d4..6927c726ce35 100644 --- a/drivers/media/dvb/ngene/ngene-core.c +++ b/drivers/media/dvb/ngene/ngene-core.c | |||
| @@ -1520,6 +1520,7 @@ static int init_channel(struct ngene_channel *chan) | |||
| 1520 | if (dev->ci.en && (io & NGENE_IO_TSOUT)) { | 1520 | if (dev->ci.en && (io & NGENE_IO_TSOUT)) { |
| 1521 | dvb_ca_en50221_init(adapter, dev->ci.en, 0, 1); | 1521 | dvb_ca_en50221_init(adapter, dev->ci.en, 0, 1); |
| 1522 | set_transfer(chan, 1); | 1522 | set_transfer(chan, 1); |
| 1523 | chan->dev->channel[2].DataFormatFlags = DF_SWAP32; | ||
| 1523 | set_transfer(&chan->dev->channel[2], 1); | 1524 | set_transfer(&chan->dev->channel[2], 1); |
| 1524 | dvb_register_device(adapter, &chan->ci_dev, | 1525 | dvb_register_device(adapter, &chan->ci_dev, |
| 1525 | &ngene_dvbdev_ci, (void *) chan, | 1526 | &ngene_dvbdev_ci, (void *) chan, |
diff --git a/drivers/media/radio/saa7706h.c b/drivers/media/radio/saa7706h.c index 585680ffbfb6..b1193dfc5087 100644 --- a/drivers/media/radio/saa7706h.c +++ b/drivers/media/radio/saa7706h.c | |||
| @@ -376,7 +376,7 @@ static int __devinit saa7706h_probe(struct i2c_client *client, | |||
| 376 | v4l_info(client, "chip found @ 0x%02x (%s)\n", | 376 | v4l_info(client, "chip found @ 0x%02x (%s)\n", |
| 377 | client->addr << 1, client->adapter->name); | 377 | client->addr << 1, client->adapter->name); |
| 378 | 378 | ||
| 379 | state = kmalloc(sizeof(struct saa7706h_state), GFP_KERNEL); | 379 | state = kzalloc(sizeof(struct saa7706h_state), GFP_KERNEL); |
| 380 | if (state == NULL) | 380 | if (state == NULL) |
| 381 | return -ENOMEM; | 381 | return -ENOMEM; |
| 382 | sd = &state->sd; | 382 | sd = &state->sd; |
diff --git a/drivers/media/radio/tef6862.c b/drivers/media/radio/tef6862.c index 7c0d77751f6e..0991e1973678 100644 --- a/drivers/media/radio/tef6862.c +++ b/drivers/media/radio/tef6862.c | |||
| @@ -176,7 +176,7 @@ static int __devinit tef6862_probe(struct i2c_client *client, | |||
| 176 | v4l_info(client, "chip found @ 0x%02x (%s)\n", | 176 | v4l_info(client, "chip found @ 0x%02x (%s)\n", |
| 177 | client->addr << 1, client->adapter->name); | 177 | client->addr << 1, client->adapter->name); |
| 178 | 178 | ||
| 179 | state = kmalloc(sizeof(struct tef6862_state), GFP_KERNEL); | 179 | state = kzalloc(sizeof(struct tef6862_state), GFP_KERNEL); |
| 180 | if (state == NULL) | 180 | if (state == NULL) |
| 181 | return -ENOMEM; | 181 | return -ENOMEM; |
| 182 | state->freq = TEF6862_LO_FREQ; | 182 | state->freq = TEF6862_LO_FREQ; |
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index ebd68edf5b24..8fc0f081b470 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" | 46 | #define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" |
| 47 | #define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display" | 47 | #define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display" |
| 48 | #define MOD_NAME "imon" | 48 | #define MOD_NAME "imon" |
| 49 | #define MOD_VERSION "0.9.2" | 49 | #define MOD_VERSION "0.9.3" |
| 50 | 50 | ||
| 51 | #define DISPLAY_MINOR_BASE 144 | 51 | #define DISPLAY_MINOR_BASE 144 |
| 52 | #define DEVICE_NAME "lcd%d" | 52 | #define DEVICE_NAME "lcd%d" |
| @@ -460,8 +460,9 @@ static int display_close(struct inode *inode, struct file *file) | |||
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | /** | 462 | /** |
| 463 | * Sends a packet to the device -- this function must be called | 463 | * Sends a packet to the device -- this function must be called with |
| 464 | * with ictx->lock held. | 464 | * ictx->lock held, or its unlock/lock sequence while waiting for tx |
| 465 | * to complete can/will lead to a deadlock. | ||
| 465 | */ | 466 | */ |
| 466 | static int send_packet(struct imon_context *ictx) | 467 | static int send_packet(struct imon_context *ictx) |
| 467 | { | 468 | { |
| @@ -991,12 +992,21 @@ static void imon_touch_display_timeout(unsigned long data) | |||
| 991 | * the iMON remotes, and those used by the Windows MCE remotes (which is | 992 | * the iMON remotes, and those used by the Windows MCE remotes (which is |
| 992 | * really just RC-6), but only one or the other at a time, as the signals | 993 | * really just RC-6), but only one or the other at a time, as the signals |
| 993 | * are decoded onboard the receiver. | 994 | * are decoded onboard the receiver. |
| 995 | * | ||
| 996 | * This function gets called two different ways, one way is from | ||
| 997 | * rc_register_device, for initial protocol selection/setup, and the other is | ||
| 998 | * via a userspace-initiated protocol change request, either by direct sysfs | ||
| 999 | * prodding or by something like ir-keytable. In the rc_register_device case, | ||
| 1000 | * the imon context lock is already held, but when initiated from userspace, | ||
| 1001 | * it is not, so we must acquire it prior to calling send_packet, which | ||
| 1002 | * requires that the lock is held. | ||
| 994 | */ | 1003 | */ |
| 995 | static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type) | 1004 | static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type) |
| 996 | { | 1005 | { |
| 997 | int retval; | 1006 | int retval; |
| 998 | struct imon_context *ictx = rc->priv; | 1007 | struct imon_context *ictx = rc->priv; |
| 999 | struct device *dev = ictx->dev; | 1008 | struct device *dev = ictx->dev; |
| 1009 | bool unlock = false; | ||
| 1000 | unsigned char ir_proto_packet[] = { | 1010 | unsigned char ir_proto_packet[] = { |
| 1001 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 }; | 1011 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 }; |
| 1002 | 1012 | ||
| @@ -1029,6 +1039,11 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type) | |||
| 1029 | 1039 | ||
| 1030 | memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet)); | 1040 | memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet)); |
| 1031 | 1041 | ||
| 1042 | if (!mutex_is_locked(&ictx->lock)) { | ||
| 1043 | unlock = true; | ||
| 1044 | mutex_lock(&ictx->lock); | ||
| 1045 | } | ||
| 1046 | |||
| 1032 | retval = send_packet(ictx); | 1047 | retval = send_packet(ictx); |
| 1033 | if (retval) | 1048 | if (retval) |
| 1034 | goto out; | 1049 | goto out; |
| @@ -1037,6 +1052,9 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type) | |||
| 1037 | ictx->pad_mouse = false; | 1052 | ictx->pad_mouse = false; |
| 1038 | 1053 | ||
| 1039 | out: | 1054 | out: |
| 1055 | if (unlock) | ||
| 1056 | mutex_unlock(&ictx->lock); | ||
| 1057 | |||
| 1040 | return retval; | 1058 | return retval; |
| 1041 | } | 1059 | } |
| 1042 | 1060 | ||
| @@ -2134,6 +2152,7 @@ static struct imon_context *imon_init_intf0(struct usb_interface *intf) | |||
| 2134 | goto rdev_setup_failed; | 2152 | goto rdev_setup_failed; |
| 2135 | } | 2153 | } |
| 2136 | 2154 | ||
| 2155 | mutex_unlock(&ictx->lock); | ||
| 2137 | return ictx; | 2156 | return ictx; |
| 2138 | 2157 | ||
| 2139 | rdev_setup_failed: | 2158 | rdev_setup_failed: |
| @@ -2205,6 +2224,7 @@ static struct imon_context *imon_init_intf1(struct usb_interface *intf, | |||
| 2205 | goto urb_submit_failed; | 2224 | goto urb_submit_failed; |
| 2206 | } | 2225 | } |
| 2207 | 2226 | ||
| 2227 | mutex_unlock(&ictx->lock); | ||
| 2208 | return ictx; | 2228 | return ictx; |
| 2209 | 2229 | ||
| 2210 | urb_submit_failed: | 2230 | urb_submit_failed: |
| @@ -2299,6 +2319,8 @@ static int __devinit imon_probe(struct usb_interface *interface, | |||
| 2299 | usb_set_intfdata(interface, ictx); | 2319 | usb_set_intfdata(interface, ictx); |
| 2300 | 2320 | ||
| 2301 | if (ifnum == 0) { | 2321 | if (ifnum == 0) { |
| 2322 | mutex_lock(&ictx->lock); | ||
| 2323 | |||
| 2302 | if (product == 0xffdc && ictx->rf_device) { | 2324 | if (product == 0xffdc && ictx->rf_device) { |
| 2303 | sysfs_err = sysfs_create_group(&interface->dev.kobj, | 2325 | sysfs_err = sysfs_create_group(&interface->dev.kobj, |
| 2304 | &imon_rf_attr_group); | 2326 | &imon_rf_attr_group); |
| @@ -2309,13 +2331,14 @@ static int __devinit imon_probe(struct usb_interface *interface, | |||
| 2309 | 2331 | ||
| 2310 | if (ictx->display_supported) | 2332 | if (ictx->display_supported) |
| 2311 | imon_init_display(ictx, interface); | 2333 | imon_init_display(ictx, interface); |
| 2334 | |||
| 2335 | mutex_unlock(&ictx->lock); | ||
| 2312 | } | 2336 | } |
| 2313 | 2337 | ||
| 2314 | dev_info(dev, "iMON device (%04x:%04x, intf%d) on " | 2338 | dev_info(dev, "iMON device (%04x:%04x, intf%d) on " |
| 2315 | "usb<%d:%d> initialized\n", vendor, product, ifnum, | 2339 | "usb<%d:%d> initialized\n", vendor, product, ifnum, |
| 2316 | usbdev->bus->busnum, usbdev->devnum); | 2340 | usbdev->bus->busnum, usbdev->devnum); |
| 2317 | 2341 | ||
| 2318 | mutex_unlock(&ictx->lock); | ||
| 2319 | mutex_unlock(&driver_lock); | 2342 | mutex_unlock(&driver_lock); |
| 2320 | 2343 | ||
| 2321 | return 0; | 2344 | return 0; |
diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c index accaf6c9789a..43908a70bd8b 100644 --- a/drivers/media/rc/ite-cir.c +++ b/drivers/media/rc/ite-cir.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/io.h> | 36 | #include <linux/io.h> |
| 37 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
| 38 | #include <linux/sched.h> | 38 | #include <linux/sched.h> |
| 39 | #include <linux/delay.h> | ||
| 39 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
| 40 | #include <linux/input.h> | 41 | #include <linux/input.h> |
| 41 | #include <linux/bitops.h> | 42 | #include <linux/bitops.h> |
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 044fb7a382d6..0c273ec465c9 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c | |||
| @@ -220,6 +220,8 @@ static struct usb_device_id mceusb_dev_table[] = { | |||
| 220 | { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, | 220 | { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, |
| 221 | /* Philips/Spinel plus IR transceiver for ASUS */ | 221 | /* Philips/Spinel plus IR transceiver for ASUS */ |
| 222 | { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, | 222 | { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, |
| 223 | /* Philips IR transceiver (Dell branded) */ | ||
| 224 | { USB_DEVICE(VENDOR_PHILIPS, 0x2093) }, | ||
| 223 | /* Realtek MCE IR Receiver and card reader */ | 225 | /* Realtek MCE IR Receiver and card reader */ |
| 224 | { USB_DEVICE(VENDOR_REALTEK, 0x0161), | 226 | { USB_DEVICE(VENDOR_REALTEK, 0x0161), |
| 225 | .driver_info = MULTIFUNCTION }, | 227 | .driver_info = MULTIFUNCTION }, |
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index f53f9c68d38d..a2706648e365 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c | |||
| @@ -707,7 +707,8 @@ static void ir_close(struct input_dev *idev) | |||
| 707 | { | 707 | { |
| 708 | struct rc_dev *rdev = input_get_drvdata(idev); | 708 | struct rc_dev *rdev = input_get_drvdata(idev); |
| 709 | 709 | ||
| 710 | rdev->close(rdev); | 710 | if (rdev) |
| 711 | rdev->close(rdev); | ||
| 711 | } | 712 | } |
| 712 | 713 | ||
| 713 | /* class for /sys/class/rc */ | 714 | /* class for /sys/class/rc */ |
| @@ -733,6 +734,7 @@ static struct { | |||
| 733 | { RC_TYPE_SONY, "sony" }, | 734 | { RC_TYPE_SONY, "sony" }, |
| 734 | { RC_TYPE_RC5_SZ, "rc-5-sz" }, | 735 | { RC_TYPE_RC5_SZ, "rc-5-sz" }, |
| 735 | { RC_TYPE_LIRC, "lirc" }, | 736 | { RC_TYPE_LIRC, "lirc" }, |
| 737 | { RC_TYPE_OTHER, "other" }, | ||
| 736 | }; | 738 | }; |
| 737 | 739 | ||
| 738 | #define PROTO_NONE "none" | 740 | #define PROTO_NONE "none" |
diff --git a/drivers/media/video/m52790.c b/drivers/media/video/m52790.c index 5e1c9a81984c..303ffa7df4ac 100644 --- a/drivers/media/video/m52790.c +++ b/drivers/media/video/m52790.c | |||
| @@ -174,7 +174,7 @@ static int m52790_probe(struct i2c_client *client, | |||
| 174 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 174 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 175 | client->addr << 1, client->adapter->name); | 175 | client->addr << 1, client->adapter->name); |
| 176 | 176 | ||
| 177 | state = kmalloc(sizeof(struct m52790_state), GFP_KERNEL); | 177 | state = kzalloc(sizeof(struct m52790_state), GFP_KERNEL); |
| 178 | if (state == NULL) | 178 | if (state == NULL) |
| 179 | return -ENOMEM; | 179 | return -ENOMEM; |
| 180 | 180 | ||
diff --git a/drivers/media/video/tda9840.c b/drivers/media/video/tda9840.c index 5d4cf3b3d435..22fa8202d5ca 100644 --- a/drivers/media/video/tda9840.c +++ b/drivers/media/video/tda9840.c | |||
| @@ -171,7 +171,7 @@ static int tda9840_probe(struct i2c_client *client, | |||
| 171 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 171 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 172 | client->addr << 1, client->adapter->name); | 172 | client->addr << 1, client->adapter->name); |
| 173 | 173 | ||
| 174 | sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); | 174 | sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); |
| 175 | if (sd == NULL) | 175 | if (sd == NULL) |
| 176 | return -ENOMEM; | 176 | return -ENOMEM; |
| 177 | v4l2_i2c_subdev_init(sd, client, &tda9840_ops); | 177 | v4l2_i2c_subdev_init(sd, client, &tda9840_ops); |
diff --git a/drivers/media/video/tea6415c.c b/drivers/media/video/tea6415c.c index 19621ed523ec..827425c5b866 100644 --- a/drivers/media/video/tea6415c.c +++ b/drivers/media/video/tea6415c.c | |||
| @@ -152,7 +152,7 @@ static int tea6415c_probe(struct i2c_client *client, | |||
| 152 | 152 | ||
| 153 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 153 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 154 | client->addr << 1, client->adapter->name); | 154 | client->addr << 1, client->adapter->name); |
| 155 | sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); | 155 | sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); |
| 156 | if (sd == NULL) | 156 | if (sd == NULL) |
| 157 | return -ENOMEM; | 157 | return -ENOMEM; |
| 158 | v4l2_i2c_subdev_init(sd, client, &tea6415c_ops); | 158 | v4l2_i2c_subdev_init(sd, client, &tea6415c_ops); |
diff --git a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c index 5ea840401f21..f350b6c24500 100644 --- a/drivers/media/video/tea6420.c +++ b/drivers/media/video/tea6420.c | |||
| @@ -125,7 +125,7 @@ static int tea6420_probe(struct i2c_client *client, | |||
| 125 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 125 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 126 | client->addr << 1, client->adapter->name); | 126 | client->addr << 1, client->adapter->name); |
| 127 | 127 | ||
| 128 | sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); | 128 | sd = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); |
| 129 | if (sd == NULL) | 129 | if (sd == NULL) |
| 130 | return -ENOMEM; | 130 | return -ENOMEM; |
| 131 | v4l2_i2c_subdev_init(sd, client, &tea6420_ops); | 131 | v4l2_i2c_subdev_init(sd, client, &tea6420_ops); |
diff --git a/drivers/media/video/upd64031a.c b/drivers/media/video/upd64031a.c index f8138c75be8b..1aab96a88203 100644 --- a/drivers/media/video/upd64031a.c +++ b/drivers/media/video/upd64031a.c | |||
| @@ -230,7 +230,7 @@ static int upd64031a_probe(struct i2c_client *client, | |||
| 230 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 230 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 231 | client->addr << 1, client->adapter->name); | 231 | client->addr << 1, client->adapter->name); |
| 232 | 232 | ||
| 233 | state = kmalloc(sizeof(struct upd64031a_state), GFP_KERNEL); | 233 | state = kzalloc(sizeof(struct upd64031a_state), GFP_KERNEL); |
| 234 | if (state == NULL) | 234 | if (state == NULL) |
| 235 | return -ENOMEM; | 235 | return -ENOMEM; |
| 236 | sd = &state->sd; | 236 | sd = &state->sd; |
diff --git a/drivers/media/video/upd64083.c b/drivers/media/video/upd64083.c index 28e0e6b6ca84..9bbe61700fd5 100644 --- a/drivers/media/video/upd64083.c +++ b/drivers/media/video/upd64083.c | |||
| @@ -202,7 +202,7 @@ static int upd64083_probe(struct i2c_client *client, | |||
| 202 | v4l_info(client, "chip found @ 0x%x (%s)\n", | 202 | v4l_info(client, "chip found @ 0x%x (%s)\n", |
| 203 | client->addr << 1, client->adapter->name); | 203 | client->addr << 1, client->adapter->name); |
| 204 | 204 | ||
| 205 | state = kmalloc(sizeof(struct upd64083_state), GFP_KERNEL); | 205 | state = kzalloc(sizeof(struct upd64083_state), GFP_KERNEL); |
| 206 | if (state == NULL) | 206 | if (state == NULL) |
| 207 | return -ENOMEM; | 207 | return -ENOMEM; |
| 208 | sd = &state->sd; | 208 | sd = &state->sd; |
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c index 53450f433f10..2e165117457b 100644 --- a/drivers/mfd/omap-usb-host.c +++ b/drivers/mfd/omap-usb-host.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/dma-mapping.h> | 25 | #include <linux/dma-mapping.h> |
| 26 | #include <linux/spinlock.h> | 26 | #include <linux/spinlock.h> |
| 27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
| 28 | #include <linux/regulator/consumer.h> | ||
| 29 | #include <plat/usb.h> | 28 | #include <plat/usb.h> |
| 30 | 29 | ||
| 31 | #define USBHS_DRIVER_NAME "usbhs-omap" | 30 | #define USBHS_DRIVER_NAME "usbhs-omap" |
| @@ -700,8 +699,7 @@ static int usbhs_enable(struct device *dev) | |||
| 700 | dev_dbg(dev, "starting TI HSUSB Controller\n"); | 699 | dev_dbg(dev, "starting TI HSUSB Controller\n"); |
| 701 | if (!pdata) { | 700 | if (!pdata) { |
| 702 | dev_dbg(dev, "missing platform_data\n"); | 701 | dev_dbg(dev, "missing platform_data\n"); |
| 703 | ret = -ENODEV; | 702 | return -ENODEV; |
| 704 | goto end_enable; | ||
| 705 | } | 703 | } |
| 706 | 704 | ||
| 707 | spin_lock_irqsave(&omap->lock, flags); | 705 | spin_lock_irqsave(&omap->lock, flags); |
| @@ -915,7 +913,8 @@ static int usbhs_enable(struct device *dev) | |||
| 915 | 913 | ||
| 916 | end_count: | 914 | end_count: |
| 917 | omap->count++; | 915 | omap->count++; |
| 918 | goto end_enable; | 916 | spin_unlock_irqrestore(&omap->lock, flags); |
| 917 | return 0; | ||
| 919 | 918 | ||
| 920 | err_tll: | 919 | err_tll: |
| 921 | if (pdata->ehci_data->phy_reset) { | 920 | if (pdata->ehci_data->phy_reset) { |
| @@ -931,8 +930,6 @@ err_tll: | |||
| 931 | clk_disable(omap->usbhost_fs_fck); | 930 | clk_disable(omap->usbhost_fs_fck); |
| 932 | clk_disable(omap->usbhost_hs_fck); | 931 | clk_disable(omap->usbhost_hs_fck); |
| 933 | clk_disable(omap->usbhost_ick); | 932 | clk_disable(omap->usbhost_ick); |
| 934 | |||
| 935 | end_enable: | ||
| 936 | spin_unlock_irqrestore(&omap->lock, flags); | 933 | spin_unlock_irqrestore(&omap->lock, flags); |
| 937 | return ret; | 934 | return ret; |
| 938 | } | 935 | } |
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 63667a8f140c..d6d62fd07ee9 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c | |||
| @@ -284,6 +284,7 @@ int mmc_add_card(struct mmc_card *card) | |||
| 284 | type = "SD-combo"; | 284 | type = "SD-combo"; |
| 285 | if (mmc_card_blockaddr(card)) | 285 | if (mmc_card_blockaddr(card)) |
| 286 | type = "SDHC-combo"; | 286 | type = "SDHC-combo"; |
| 287 | break; | ||
| 287 | default: | 288 | default: |
| 288 | type = "?"; | 289 | type = "?"; |
| 289 | break; | 290 | break; |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 461e6a17fb90..2b200c1cfbba 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
| @@ -94,7 +94,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) | |||
| 94 | spin_unlock_irqrestore(&host->clk_lock, flags); | 94 | spin_unlock_irqrestore(&host->clk_lock, flags); |
| 95 | return; | 95 | return; |
| 96 | } | 96 | } |
| 97 | mutex_lock(&host->clk_gate_mutex); | 97 | mmc_claim_host(host); |
| 98 | spin_lock_irqsave(&host->clk_lock, flags); | 98 | spin_lock_irqsave(&host->clk_lock, flags); |
| 99 | if (!host->clk_requests) { | 99 | if (!host->clk_requests) { |
| 100 | spin_unlock_irqrestore(&host->clk_lock, flags); | 100 | spin_unlock_irqrestore(&host->clk_lock, flags); |
| @@ -104,7 +104,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) | |||
| 104 | pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); | 104 | pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); |
| 105 | } | 105 | } |
| 106 | spin_unlock_irqrestore(&host->clk_lock, flags); | 106 | spin_unlock_irqrestore(&host->clk_lock, flags); |
| 107 | mutex_unlock(&host->clk_gate_mutex); | 107 | mmc_release_host(host); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | /* | 110 | /* |
| @@ -130,7 +130,7 @@ void mmc_host_clk_ungate(struct mmc_host *host) | |||
| 130 | { | 130 | { |
| 131 | unsigned long flags; | 131 | unsigned long flags; |
| 132 | 132 | ||
| 133 | mutex_lock(&host->clk_gate_mutex); | 133 | mmc_claim_host(host); |
| 134 | spin_lock_irqsave(&host->clk_lock, flags); | 134 | spin_lock_irqsave(&host->clk_lock, flags); |
| 135 | if (host->clk_gated) { | 135 | if (host->clk_gated) { |
| 136 | spin_unlock_irqrestore(&host->clk_lock, flags); | 136 | spin_unlock_irqrestore(&host->clk_lock, flags); |
| @@ -140,7 +140,7 @@ void mmc_host_clk_ungate(struct mmc_host *host) | |||
| 140 | } | 140 | } |
| 141 | host->clk_requests++; | 141 | host->clk_requests++; |
| 142 | spin_unlock_irqrestore(&host->clk_lock, flags); | 142 | spin_unlock_irqrestore(&host->clk_lock, flags); |
| 143 | mutex_unlock(&host->clk_gate_mutex); | 143 | mmc_release_host(host); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | /** | 146 | /** |
| @@ -215,7 +215,6 @@ static inline void mmc_host_clk_init(struct mmc_host *host) | |||
| 215 | host->clk_gated = false; | 215 | host->clk_gated = false; |
| 216 | INIT_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); | 216 | INIT_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); |
| 217 | spin_lock_init(&host->clk_lock); | 217 | spin_lock_init(&host->clk_lock); |
| 218 | mutex_init(&host->clk_gate_mutex); | ||
| 219 | } | 218 | } |
| 220 | 219 | ||
| 221 | /** | 220 | /** |
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 2e032f0e8cf4..a6c329040140 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c | |||
| @@ -832,7 +832,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 832 | return IRQ_HANDLED; | 832 | return IRQ_HANDLED; |
| 833 | } | 833 | } |
| 834 | 834 | ||
| 835 | if (end_command) | 835 | if (end_command && host->cmd) |
| 836 | mmc_omap_cmd_done(host, host->cmd); | 836 | mmc_omap_cmd_done(host, host->cmd); |
| 837 | if (host->data != NULL) { | 837 | if (host->data != NULL) { |
| 838 | if (transfer_error) | 838 | if (transfer_error) |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index a136be706347..f8b5f37007b2 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -957,6 +957,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
| 957 | host->ioaddr = pci_ioremap_bar(pdev, bar); | 957 | host->ioaddr = pci_ioremap_bar(pdev, bar); |
| 958 | if (!host->ioaddr) { | 958 | if (!host->ioaddr) { |
| 959 | dev_err(&pdev->dev, "failed to remap registers\n"); | 959 | dev_err(&pdev->dev, "failed to remap registers\n"); |
| 960 | ret = -ENOMEM; | ||
| 960 | goto release; | 961 | goto release; |
| 961 | } | 962 | } |
| 962 | 963 | ||
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 9e15f41f87be..5d20661bc357 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -1334,6 +1334,13 @@ static void sdhci_tasklet_finish(unsigned long param) | |||
| 1334 | 1334 | ||
| 1335 | host = (struct sdhci_host*)param; | 1335 | host = (struct sdhci_host*)param; |
| 1336 | 1336 | ||
| 1337 | /* | ||
| 1338 | * If this tasklet gets rescheduled while running, it will | ||
| 1339 | * be run again afterwards but without any active request. | ||
| 1340 | */ | ||
| 1341 | if (!host->mrq) | ||
| 1342 | return; | ||
| 1343 | |||
| 1337 | spin_lock_irqsave(&host->lock, flags); | 1344 | spin_lock_irqsave(&host->lock, flags); |
| 1338 | 1345 | ||
| 1339 | del_timer(&host->timer); | 1346 | del_timer(&host->timer); |
| @@ -1345,7 +1352,7 @@ static void sdhci_tasklet_finish(unsigned long param) | |||
| 1345 | * upon error conditions. | 1352 | * upon error conditions. |
| 1346 | */ | 1353 | */ |
| 1347 | if (!(host->flags & SDHCI_DEVICE_DEAD) && | 1354 | if (!(host->flags & SDHCI_DEVICE_DEAD) && |
| 1348 | (mrq->cmd->error || | 1355 | ((mrq->cmd && mrq->cmd->error) || |
| 1349 | (mrq->data && (mrq->data->error || | 1356 | (mrq->data && (mrq->data->error || |
| 1350 | (mrq->data->stop && mrq->data->stop->error))) || | 1357 | (mrq->data->stop && mrq->data->stop->error))) || |
| 1351 | (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) { | 1358 | (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) { |
diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c index 62d37de6de76..710339a85c84 100644 --- a/drivers/mmc/host/tmio_mmc_pio.c +++ b/drivers/mmc/host/tmio_mmc_pio.c | |||
| @@ -728,15 +728,15 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 728 | tmio_mmc_set_clock(host, ios->clock); | 728 | tmio_mmc_set_clock(host, ios->clock); |
| 729 | 729 | ||
| 730 | /* Power sequence - OFF -> UP -> ON */ | 730 | /* Power sequence - OFF -> UP -> ON */ |
| 731 | if (ios->power_mode == MMC_POWER_OFF || !ios->clock) { | 731 | if (ios->power_mode == MMC_POWER_UP) { |
| 732 | /* power up SD bus */ | ||
| 733 | if (host->set_pwr) | ||
| 734 | host->set_pwr(host->pdev, 1); | ||
| 735 | } else if (ios->power_mode == MMC_POWER_OFF || !ios->clock) { | ||
| 732 | /* power down SD bus */ | 736 | /* power down SD bus */ |
| 733 | if (ios->power_mode == MMC_POWER_OFF && host->set_pwr) | 737 | if (ios->power_mode == MMC_POWER_OFF && host->set_pwr) |
| 734 | host->set_pwr(host->pdev, 0); | 738 | host->set_pwr(host->pdev, 0); |
| 735 | tmio_mmc_clk_stop(host); | 739 | tmio_mmc_clk_stop(host); |
| 736 | } else if (ios->power_mode == MMC_POWER_UP) { | ||
| 737 | /* power up SD bus */ | ||
| 738 | if (host->set_pwr) | ||
| 739 | host->set_pwr(host->pdev, 1); | ||
| 740 | } else { | 740 | } else { |
| 741 | /* start bus clock */ | 741 | /* start bus clock */ |
| 742 | tmio_mmc_clk_start(host); | 742 | tmio_mmc_clk_start(host); |
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c index eeb7dd43f9a8..830822f86e41 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c | |||
| @@ -2288,7 +2288,3 @@ err_dev: | |||
| 2288 | free_netdev(dev); | 2288 | free_netdev(dev); |
| 2289 | return NULL; | 2289 | return NULL; |
| 2290 | } | 2290 | } |
| 2291 | |||
| 2292 | EXPORT_SYMBOL(init_ft1000_card); | ||
| 2293 | EXPORT_SYMBOL(stop_ft1000_card); | ||
| 2294 | EXPORT_SYMBOL(flarion_ft1000_cnt); | ||
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c index 935608e72007..bdfb1aec58df 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c | |||
| @@ -214,6 +214,3 @@ void ft1000CleanupProc(struct net_device *dev) | |||
| 214 | remove_proc_entry(FT1000_PROC, init_net.proc_net); | 214 | remove_proc_entry(FT1000_PROC, init_net.proc_net); |
| 215 | unregister_netdevice_notifier(&ft1000_netdev_notifier); | 215 | unregister_netdevice_notifier(&ft1000_netdev_notifier); |
| 216 | } | 216 | } |
| 217 | |||
| 218 | EXPORT_SYMBOL(ft1000InitProc); | ||
| 219 | EXPORT_SYMBOL(ft1000CleanupProc); | ||
diff --git a/drivers/staging/gma500/Kconfig b/drivers/staging/gma500/Kconfig index 5501eb9b3355..ce8bedaeaac2 100644 --- a/drivers/staging/gma500/Kconfig +++ b/drivers/staging/gma500/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config DRM_PSB | 1 | config DRM_PSB |
| 2 | tristate "Intel GMA500 KMS Framebuffer" | 2 | tristate "Intel GMA500 KMS Framebuffer" |
| 3 | depends on DRM && PCI | 3 | depends on DRM && PCI && X86 |
| 4 | select FB_CFB_COPYAREA | 4 | select FB_CFB_COPYAREA |
| 5 | select FB_CFB_FILLRECT | 5 | select FB_CFB_FILLRECT |
| 6 | select FB_CFB_IMAGEBLIT | 6 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/staging/intel_sst/intelmid_v1_control.c b/drivers/staging/intel_sst/intelmid_v1_control.c index 9cc15c1c18d4..1ea814218059 100644 --- a/drivers/staging/intel_sst/intelmid_v1_control.c +++ b/drivers/staging/intel_sst/intelmid_v1_control.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 28 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 29 | 29 | ||
| 30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
| 31 | #include <linux/delay.h> | ||
| 31 | #include <linux/file.h> | 32 | #include <linux/file.h> |
| 32 | #include <asm/mrst.h> | 33 | #include <asm/mrst.h> |
| 33 | #include <sound/pcm.h> | 34 | #include <sound/pcm.h> |
diff --git a/drivers/staging/intel_sst/intelmid_v2_control.c b/drivers/staging/intel_sst/intelmid_v2_control.c index 26d815a67eb8..3c6b3abff3c3 100644 --- a/drivers/staging/intel_sst/intelmid_v2_control.c +++ b/drivers/staging/intel_sst/intelmid_v2_control.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 29 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 30 | 30 | ||
| 31 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
| 32 | #include <linux/delay.h> | ||
| 32 | #include <linux/file.h> | 33 | #include <linux/file.h> |
| 33 | #include "intel_sst.h" | 34 | #include "intel_sst.h" |
| 34 | #include "intelmid_snd_control.h" | 35 | #include "intelmid_snd_control.h" |
diff --git a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c index b5d21f6497f9..22c04eabed41 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c +++ b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | */ | 12 | */ |
| 13 | #include <linux/cs5535.h> | 13 | #include <linux/cs5535.h> |
| 14 | #include <linux/gpio.h> | 14 | #include <linux/gpio.h> |
| 15 | #include <linux/delay.h> | ||
| 15 | #include <asm/olpc.h> | 16 | #include <asm/olpc.h> |
| 16 | 17 | ||
| 17 | #include "olpc_dcon.h" | 18 | #include "olpc_dcon.h" |
diff --git a/drivers/staging/rts_pstor/debug.h b/drivers/staging/rts_pstor/debug.h index e1408b0e7ae4..ab305be96fb5 100644 --- a/drivers/staging/rts_pstor/debug.h +++ b/drivers/staging/rts_pstor/debug.h | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | #define RTSX_STOR "rts_pstor: " | 29 | #define RTSX_STOR "rts_pstor: " |
| 30 | 30 | ||
| 31 | #if CONFIG_RTS_PSTOR_DEBUG | 31 | #ifdef CONFIG_RTS_PSTOR_DEBUG |
| 32 | #define RTSX_DEBUGP(x...) printk(KERN_DEBUG RTSX_STOR x) | 32 | #define RTSX_DEBUGP(x...) printk(KERN_DEBUG RTSX_STOR x) |
| 33 | #define RTSX_DEBUGPN(x...) printk(KERN_DEBUG x) | 33 | #define RTSX_DEBUGPN(x...) printk(KERN_DEBUG x) |
| 34 | #define RTSX_DEBUGPX(x...) printk(x) | 34 | #define RTSX_DEBUGPX(x...) printk(x) |
diff --git a/drivers/staging/rts_pstor/ms.c b/drivers/staging/rts_pstor/ms.c index 810e170894f5..d89795c6a3ac 100644 --- a/drivers/staging/rts_pstor/ms.c +++ b/drivers/staging/rts_pstor/ms.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/blkdev.h> | 23 | #include <linux/blkdev.h> |
| 24 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
| 25 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
| 26 | #include <linux/vmalloc.h> | ||
| 26 | 27 | ||
| 27 | #include "rtsx.h" | 28 | #include "rtsx.h" |
| 28 | #include "rtsx_transport.h" | 29 | #include "rtsx_transport.h" |
diff --git a/drivers/staging/rts_pstor/rtsx_chip.c b/drivers/staging/rts_pstor/rtsx_chip.c index d2f1c715a684..4e60780ea804 100644 --- a/drivers/staging/rts_pstor/rtsx_chip.c +++ b/drivers/staging/rts_pstor/rtsx_chip.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
| 25 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
| 26 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
| 27 | #include <linux/vmalloc.h> | ||
| 27 | 28 | ||
| 28 | #include "rtsx.h" | 29 | #include "rtsx.h" |
| 29 | #include "rtsx_transport.h" | 30 | #include "rtsx_transport.h" |
| @@ -1311,11 +1312,11 @@ void rtsx_polling_func(struct rtsx_chip *chip) | |||
| 1311 | 1312 | ||
| 1312 | #ifdef SUPPORT_OCP | 1313 | #ifdef SUPPORT_OCP |
| 1313 | if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) { | 1314 | if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) { |
| 1314 | #if CONFIG_RTS_PSTOR_DEBUG | 1315 | #ifdef CONFIG_RTS_PSTOR_DEBUG |
| 1315 | if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER | MS_OC_NOW | MS_OC_EVER)) { | 1316 | if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER | MS_OC_NOW | MS_OC_EVER)) { |
| 1316 | RTSX_DEBUGP("Over current, OCPSTAT is 0x%x\n", chip->ocp_stat); | 1317 | RTSX_DEBUGP("Over current, OCPSTAT is 0x%x\n", chip->ocp_stat); |
| 1317 | } | 1318 | } |
| 1318 | #endif | 1319 | #endif |
| 1319 | 1320 | ||
| 1320 | if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) { | 1321 | if (chip->ocp_stat & (SD_OC_NOW | SD_OC_EVER)) { |
| 1321 | if (chip->card_exist & SD_CARD) { | 1322 | if (chip->card_exist & SD_CARD) { |
diff --git a/drivers/staging/rts_pstor/rtsx_scsi.c b/drivers/staging/rts_pstor/rtsx_scsi.c index 20c2464a20f9..7de1fae443fc 100644 --- a/drivers/staging/rts_pstor/rtsx_scsi.c +++ b/drivers/staging/rts_pstor/rtsx_scsi.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/blkdev.h> | 23 | #include <linux/blkdev.h> |
| 24 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
| 25 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
| 26 | #include <linux/vmalloc.h> | ||
| 26 | 27 | ||
| 27 | #include "rtsx.h" | 28 | #include "rtsx.h" |
| 28 | #include "rtsx_transport.h" | 29 | #include "rtsx_transport.h" |
diff --git a/drivers/staging/rts_pstor/sd.c b/drivers/staging/rts_pstor/sd.c index 8d066bd428c4..b1277a6c7a8b 100644 --- a/drivers/staging/rts_pstor/sd.c +++ b/drivers/staging/rts_pstor/sd.c | |||
| @@ -909,7 +909,7 @@ static int sd_change_phase(struct rtsx_chip *chip, u8 sample_point, u8 tune_dir) | |||
| 909 | RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET); | 909 | RTSX_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET); |
| 910 | RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0); | 910 | RTSX_WRITE_REG(chip, CLK_CTL, CHANGE_CLK, 0); |
| 911 | } else { | 911 | } else { |
| 912 | #if CONFIG_RTS_PSTOR_DEBUG | 912 | #ifdef CONFIG_RTS_PSTOR_DEBUG |
| 913 | rtsx_read_register(chip, SD_VP_CTL, &val); | 913 | rtsx_read_register(chip, SD_VP_CTL, &val); |
| 914 | RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); | 914 | RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); |
| 915 | rtsx_read_register(chip, SD_DCMPS_CTL, &val); | 915 | rtsx_read_register(chip, SD_DCMPS_CTL, &val); |
| @@ -958,7 +958,7 @@ static int sd_change_phase(struct rtsx_chip *chip, u8 sample_point, u8 tune_dir) | |||
| 958 | return STATUS_SUCCESS; | 958 | return STATUS_SUCCESS; |
| 959 | 959 | ||
| 960 | Fail: | 960 | Fail: |
| 961 | #if CONFIG_RTS_PSTOR_DEBUG | 961 | #ifdef CONFIG_RTS_PSTOR_DEBUG |
| 962 | rtsx_read_register(chip, SD_VP_CTL, &val); | 962 | rtsx_read_register(chip, SD_VP_CTL, &val); |
| 963 | RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); | 963 | RTSX_DEBUGP("SD_VP_CTL: 0x%x\n", val); |
| 964 | rtsx_read_register(chip, SD_DCMPS_CTL, &val); | 964 | rtsx_read_register(chip, SD_DCMPS_CTL, &val); |
diff --git a/drivers/staging/rts_pstor/trace.h b/drivers/staging/rts_pstor/trace.h index 2c668bae6ff4..bc83b49a4eb4 100644 --- a/drivers/staging/rts_pstor/trace.h +++ b/drivers/staging/rts_pstor/trace.h | |||
| @@ -82,7 +82,7 @@ do { \ | |||
| 82 | #define TRACE_GOTO(chip, label) goto label | 82 | #define TRACE_GOTO(chip, label) goto label |
| 83 | #endif | 83 | #endif |
| 84 | 84 | ||
| 85 | #if CONFIG_RTS_PSTOR_DEBUG | 85 | #ifdef CONFIG_RTS_PSTOR_DEBUG |
| 86 | static inline void rtsx_dump(u8 *buf, int buf_len) | 86 | static inline void rtsx_dump(u8 *buf, int buf_len) |
| 87 | { | 87 | { |
| 88 | int i; | 88 | int i; |
diff --git a/drivers/staging/rts_pstor/xd.c b/drivers/staging/rts_pstor/xd.c index 7bcd468b8f2c..9f3add1e8f59 100644 --- a/drivers/staging/rts_pstor/xd.c +++ b/drivers/staging/rts_pstor/xd.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/blkdev.h> | 23 | #include <linux/blkdev.h> |
| 24 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
| 25 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
| 26 | #include <linux/vmalloc.h> | ||
| 26 | 27 | ||
| 27 | #include "rtsx.h" | 28 | #include "rtsx.h" |
| 28 | #include "rtsx_transport.h" | 29 | #include "rtsx_transport.h" |
diff --git a/drivers/staging/solo6x10/Kconfig b/drivers/staging/solo6x10/Kconfig index 2cf77c940860..03dcac4ea4d0 100644 --- a/drivers/staging/solo6x10/Kconfig +++ b/drivers/staging/solo6x10/Kconfig | |||
| @@ -2,6 +2,7 @@ config SOLO6X10 | |||
| 2 | tristate "Softlogic 6x10 MPEG codec cards" | 2 | tristate "Softlogic 6x10 MPEG codec cards" |
| 3 | depends on PCI && VIDEO_DEV && SND && I2C | 3 | depends on PCI && VIDEO_DEV && SND && I2C |
| 4 | select VIDEOBUF_DMA_SG | 4 | select VIDEOBUF_DMA_SG |
| 5 | select SND_PCM | ||
| 5 | ---help--- | 6 | ---help--- |
| 6 | This driver supports the Softlogic based MPEG-4 and h.264 codec | 7 | This driver supports the Softlogic based MPEG-4 and h.264 codec |
| 7 | codec cards. | 8 | codec cards. |
diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c index 0f02a4b12ae4..4f4f13321f40 100644 --- a/drivers/staging/usbip/vhci_hcd.c +++ b/drivers/staging/usbip/vhci_hcd.c | |||
| @@ -876,8 +876,10 @@ static void vhci_shutdown_connection(struct usbip_device *ud) | |||
| 876 | } | 876 | } |
| 877 | 877 | ||
| 878 | /* kill threads related to this sdev, if v.c. exists */ | 878 | /* kill threads related to this sdev, if v.c. exists */ |
| 879 | kthread_stop(vdev->ud.tcp_rx); | 879 | if (vdev->ud.tcp_rx) |
| 880 | kthread_stop(vdev->ud.tcp_tx); | 880 | kthread_stop(vdev->ud.tcp_rx); |
| 881 | if (vdev->ud.tcp_tx) | ||
| 882 | kthread_stop(vdev->ud.tcp_tx); | ||
| 881 | 883 | ||
| 882 | usbip_uinfo("stop threads\n"); | 884 | usbip_uinfo("stop threads\n"); |
| 883 | 885 | ||
| @@ -949,9 +951,6 @@ static void vhci_device_init(struct vhci_device *vdev) | |||
| 949 | { | 951 | { |
| 950 | memset(vdev, 0, sizeof(*vdev)); | 952 | memset(vdev, 0, sizeof(*vdev)); |
| 951 | 953 | ||
| 952 | vdev->ud.tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx"); | ||
| 953 | vdev->ud.tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx"); | ||
| 954 | |||
| 955 | vdev->ud.side = USBIP_VHCI; | 954 | vdev->ud.side = USBIP_VHCI; |
| 956 | vdev->ud.status = VDEV_ST_NULL; | 955 | vdev->ud.status = VDEV_ST_NULL; |
| 957 | /* vdev->ud.lock = SPIN_LOCK_UNLOCKED; */ | 956 | /* vdev->ud.lock = SPIN_LOCK_UNLOCKED; */ |
| @@ -1139,7 +1138,7 @@ static int vhci_hcd_probe(struct platform_device *pdev) | |||
| 1139 | usbip_uerr("create hcd failed\n"); | 1138 | usbip_uerr("create hcd failed\n"); |
| 1140 | return -ENOMEM; | 1139 | return -ENOMEM; |
| 1141 | } | 1140 | } |
| 1142 | 1141 | hcd->has_tt = 1; | |
| 1143 | 1142 | ||
| 1144 | /* this is private data for vhci_hcd */ | 1143 | /* this is private data for vhci_hcd */ |
| 1145 | the_controller = hcd_to_vhci(hcd); | 1144 | the_controller = hcd_to_vhci(hcd); |
diff --git a/drivers/staging/usbip/vhci_sysfs.c b/drivers/staging/usbip/vhci_sysfs.c index 3f2459f30415..e2dadbd5ef1e 100644 --- a/drivers/staging/usbip/vhci_sysfs.c +++ b/drivers/staging/usbip/vhci_sysfs.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include "vhci.h" | 21 | #include "vhci.h" |
| 22 | 22 | ||
| 23 | #include <linux/in.h> | 23 | #include <linux/in.h> |
| 24 | #include <linux/kthread.h> | ||
| 24 | 25 | ||
| 25 | /* TODO: refine locking ?*/ | 26 | /* TODO: refine locking ?*/ |
| 26 | 27 | ||
| @@ -220,13 +221,13 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | |||
| 220 | vdev->ud.tcp_socket = socket; | 221 | vdev->ud.tcp_socket = socket; |
| 221 | vdev->ud.status = VDEV_ST_NOTASSIGNED; | 222 | vdev->ud.status = VDEV_ST_NOTASSIGNED; |
| 222 | 223 | ||
| 223 | wake_up_process(vdev->ud.tcp_rx); | ||
| 224 | wake_up_process(vdev->ud.tcp_tx); | ||
| 225 | |||
| 226 | spin_unlock(&vdev->ud.lock); | 224 | spin_unlock(&vdev->ud.lock); |
| 227 | spin_unlock(&the_controller->lock); | 225 | spin_unlock(&the_controller->lock); |
| 228 | /* end the lock */ | 226 | /* end the lock */ |
| 229 | 227 | ||
| 228 | vdev->ud.tcp_rx = kthread_run(vhci_rx_loop, &vdev->ud, "vhci_rx"); | ||
| 229 | vdev->ud.tcp_tx = kthread_run(vhci_tx_loop, &vdev->ud, "vhci_tx"); | ||
| 230 | |||
| 230 | rh_port_connect(rhport, speed); | 231 | rh_port_connect(rhport, speed); |
| 231 | 232 | ||
| 232 | return count; | 233 | return count; |
diff --git a/drivers/staging/wlan-ng/cfg80211.c b/drivers/staging/wlan-ng/cfg80211.c index 6a71f52c59b1..76378397b763 100644 --- a/drivers/staging/wlan-ng/cfg80211.c +++ b/drivers/staging/wlan-ng/cfg80211.c | |||
| @@ -273,7 +273,7 @@ exit: | |||
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | int prism2_set_default_key(struct wiphy *wiphy, struct net_device *dev, | 275 | int prism2_set_default_key(struct wiphy *wiphy, struct net_device *dev, |
| 276 | u8 key_index) | 276 | u8 key_index, bool unicast, bool multicast) |
| 277 | { | 277 | { |
| 278 | wlandevice_t *wlandev = dev->ml_priv; | 278 | wlandevice_t *wlandev = dev->ml_priv; |
| 279 | 279 | ||
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 7e41a95c5ceb..627f3a678759 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
| 41 | #include <linux/usb/ulpi.h> | 41 | #include <linux/usb/ulpi.h> |
| 42 | #include <plat/usb.h> | 42 | #include <plat/usb.h> |
| 43 | #include <linux/regulator/consumer.h> | ||
| 43 | 44 | ||
| 44 | /* EHCI Register Set */ | 45 | /* EHCI Register Set */ |
| 45 | #define EHCI_INSNREG04 (0xA0) | 46 | #define EHCI_INSNREG04 (0xA0) |
| @@ -118,6 +119,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 118 | struct ehci_hcd *omap_ehci; | 119 | struct ehci_hcd *omap_ehci; |
| 119 | int ret = -ENODEV; | 120 | int ret = -ENODEV; |
| 120 | int irq; | 121 | int irq; |
| 122 | int i; | ||
| 123 | char supply[7]; | ||
| 121 | 124 | ||
| 122 | if (usb_disabled()) | 125 | if (usb_disabled()) |
| 123 | return -ENODEV; | 126 | return -ENODEV; |
| @@ -158,6 +161,23 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 158 | hcd->rsrc_len = resource_size(res); | 161 | hcd->rsrc_len = resource_size(res); |
| 159 | hcd->regs = regs; | 162 | hcd->regs = regs; |
| 160 | 163 | ||
| 164 | /* get ehci regulator and enable */ | ||
| 165 | for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) { | ||
| 166 | if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) { | ||
| 167 | pdata->regulator[i] = NULL; | ||
| 168 | continue; | ||
| 169 | } | ||
| 170 | snprintf(supply, sizeof(supply), "hsusb%d", i); | ||
| 171 | pdata->regulator[i] = regulator_get(dev, supply); | ||
| 172 | if (IS_ERR(pdata->regulator[i])) { | ||
| 173 | pdata->regulator[i] = NULL; | ||
| 174 | dev_dbg(dev, | ||
| 175 | "failed to get ehci port%d regulator\n", i); | ||
| 176 | } else { | ||
| 177 | regulator_enable(pdata->regulator[i]); | ||
| 178 | } | ||
| 179 | } | ||
| 180 | |||
| 161 | ret = omap_usbhs_enable(dev); | 181 | ret = omap_usbhs_enable(dev); |
| 162 | if (ret) { | 182 | if (ret) { |
| 163 | dev_err(dev, "failed to start usbhs with err %d\n", ret); | 183 | dev_err(dev, "failed to start usbhs with err %d\n", ret); |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 795345ad45e6..7b2e69aa2e98 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
| @@ -1633,6 +1633,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 1633 | ints[i].qh = NULL; | 1633 | ints[i].qh = NULL; |
| 1634 | ints[i].qtd = NULL; | 1634 | ints[i].qtd = NULL; |
| 1635 | 1635 | ||
| 1636 | urb->status = status; | ||
| 1636 | isp1760_urb_done(hcd, urb); | 1637 | isp1760_urb_done(hcd, urb); |
| 1637 | if (qtd) | 1638 | if (qtd) |
| 1638 | pe(hcd, qh, qtd); | 1639 | pe(hcd, qh, qtd); |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index a78f2ebd11b7..73f75d26436c 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -777,7 +777,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
| 777 | if (t1 != t2) | 777 | if (t1 != t2) |
| 778 | xhci_writel(xhci, t2, port_array[port_index]); | 778 | xhci_writel(xhci, t2, port_array[port_index]); |
| 779 | 779 | ||
| 780 | if (DEV_HIGHSPEED(t1)) { | 780 | if (hcd->speed != HCD_USB3) { |
| 781 | /* enable remote wake up for USB 2.0 */ | 781 | /* enable remote wake up for USB 2.0 */ |
| 782 | u32 __iomem *addr; | 782 | u32 __iomem *addr; |
| 783 | u32 tmp; | 783 | u32 tmp; |
| @@ -866,6 +866,21 @@ int xhci_bus_resume(struct usb_hcd *hcd) | |||
| 866 | temp |= PORT_LINK_STROBE | XDEV_U0; | 866 | temp |= PORT_LINK_STROBE | XDEV_U0; |
| 867 | xhci_writel(xhci, temp, port_array[port_index]); | 867 | xhci_writel(xhci, temp, port_array[port_index]); |
| 868 | } | 868 | } |
| 869 | /* wait for the port to enter U0 and report port link | ||
| 870 | * state change. | ||
| 871 | */ | ||
| 872 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 873 | msleep(20); | ||
| 874 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 875 | |||
| 876 | /* Clear PLC */ | ||
| 877 | temp = xhci_readl(xhci, port_array[port_index]); | ||
| 878 | if (temp & PORT_PLC) { | ||
| 879 | temp = xhci_port_state_to_neutral(temp); | ||
| 880 | temp |= PORT_PLC; | ||
| 881 | xhci_writel(xhci, temp, port_array[port_index]); | ||
| 882 | } | ||
| 883 | |||
| 869 | slot_id = xhci_find_slot_id_by_port(hcd, | 884 | slot_id = xhci_find_slot_id_by_port(hcd, |
| 870 | xhci, port_index + 1); | 885 | xhci, port_index + 1); |
| 871 | if (slot_id) | 886 | if (slot_id) |
| @@ -873,7 +888,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) | |||
| 873 | } else | 888 | } else |
| 874 | xhci_writel(xhci, temp, port_array[port_index]); | 889 | xhci_writel(xhci, temp, port_array[port_index]); |
| 875 | 890 | ||
| 876 | if (DEV_HIGHSPEED(temp)) { | 891 | if (hcd->speed != HCD_USB3) { |
| 877 | /* disable remote wake up for USB 2.0 */ | 892 | /* disable remote wake up for USB 2.0 */ |
| 878 | u32 __iomem *addr; | 893 | u32 __iomem *addr; |
| 879 | u32 tmp; | 894 | u32 tmp; |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 6dfbf9ffd7a6..f47c20197c61 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -1887,11 +1887,9 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1887 | otg_set_vbus(musb->xceiv, 1); | 1887 | otg_set_vbus(musb->xceiv, 1); |
| 1888 | 1888 | ||
| 1889 | hcd->self.uses_pio_for_control = 1; | 1889 | hcd->self.uses_pio_for_control = 1; |
| 1890 | |||
| 1891 | if (musb->xceiv->last_event == USB_EVENT_NONE) | ||
| 1892 | pm_runtime_put(musb->controller); | ||
| 1893 | |||
| 1894 | } | 1890 | } |
| 1891 | if (musb->xceiv->last_event == USB_EVENT_NONE) | ||
| 1892 | pm_runtime_put(musb->controller); | ||
| 1895 | 1893 | ||
| 1896 | return 0; | 1894 | return 0; |
| 1897 | 1895 | ||
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 57a27fa954b4..e9e60b6e0583 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -270,7 +270,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
| 270 | DBG(4, "VBUS Disconnect\n"); | 270 | DBG(4, "VBUS Disconnect\n"); |
| 271 | 271 | ||
| 272 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | 272 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| 273 | if (is_otg_enabled(musb)) | 273 | if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) |
| 274 | if (musb->gadget_driver) | 274 | if (musb->gadget_driver) |
| 275 | #endif | 275 | #endif |
| 276 | { | 276 | { |
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index e159c529fd2b..38b8ab554924 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
| @@ -775,6 +775,13 @@ get_more_pages: | |||
| 775 | ci->i_truncate_seq, | 775 | ci->i_truncate_seq, |
| 776 | ci->i_truncate_size, | 776 | ci->i_truncate_size, |
| 777 | &inode->i_mtime, true, 1, 0); | 777 | &inode->i_mtime, true, 1, 0); |
| 778 | |||
| 779 | if (!req) { | ||
| 780 | rc = -ENOMEM; | ||
| 781 | unlock_page(page); | ||
| 782 | break; | ||
| 783 | } | ||
| 784 | |||
| 778 | max_pages = req->r_num_pages; | 785 | max_pages = req->r_num_pages; |
| 779 | 786 | ||
| 780 | alloc_page_vec(fsc, req); | 787 | alloc_page_vec(fsc, req); |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 5323c330bbf3..9fa08662a88d 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -1331,10 +1331,11 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci) | |||
| 1331 | } | 1331 | } |
| 1332 | 1332 | ||
| 1333 | /* | 1333 | /* |
| 1334 | * Mark caps dirty. If inode is newly dirty, add to the global dirty | 1334 | * Mark caps dirty. If inode is newly dirty, return the dirty flags. |
| 1335 | * list. | 1335 | * Caller is then responsible for calling __mark_inode_dirty with the |
| 1336 | * returned flags value. | ||
| 1336 | */ | 1337 | */ |
| 1337 | void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | 1338 | int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) |
| 1338 | { | 1339 | { |
| 1339 | struct ceph_mds_client *mdsc = | 1340 | struct ceph_mds_client *mdsc = |
| 1340 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; | 1341 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; |
| @@ -1357,7 +1358,7 @@ void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
| 1357 | list_add(&ci->i_dirty_item, &mdsc->cap_dirty); | 1358 | list_add(&ci->i_dirty_item, &mdsc->cap_dirty); |
| 1358 | spin_unlock(&mdsc->cap_dirty_lock); | 1359 | spin_unlock(&mdsc->cap_dirty_lock); |
| 1359 | if (ci->i_flushing_caps == 0) { | 1360 | if (ci->i_flushing_caps == 0) { |
| 1360 | igrab(inode); | 1361 | ihold(inode); |
| 1361 | dirty |= I_DIRTY_SYNC; | 1362 | dirty |= I_DIRTY_SYNC; |
| 1362 | } | 1363 | } |
| 1363 | } | 1364 | } |
| @@ -1365,9 +1366,8 @@ void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
| 1365 | if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) && | 1366 | if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) && |
| 1366 | (mask & CEPH_CAP_FILE_BUFFER)) | 1367 | (mask & CEPH_CAP_FILE_BUFFER)) |
| 1367 | dirty |= I_DIRTY_DATASYNC; | 1368 | dirty |= I_DIRTY_DATASYNC; |
| 1368 | if (dirty) | ||
| 1369 | __mark_inode_dirty(inode, dirty); | ||
| 1370 | __cap_delay_requeue(mdsc, ci); | 1369 | __cap_delay_requeue(mdsc, ci); |
| 1370 | return dirty; | ||
| 1371 | } | 1371 | } |
| 1372 | 1372 | ||
| 1373 | /* | 1373 | /* |
| @@ -1991,7 +1991,7 @@ static void __take_cap_refs(struct ceph_inode_info *ci, int got) | |||
| 1991 | ci->i_wr_ref++; | 1991 | ci->i_wr_ref++; |
| 1992 | if (got & CEPH_CAP_FILE_BUFFER) { | 1992 | if (got & CEPH_CAP_FILE_BUFFER) { |
| 1993 | if (ci->i_wrbuffer_ref == 0) | 1993 | if (ci->i_wrbuffer_ref == 0) |
| 1994 | igrab(&ci->vfs_inode); | 1994 | ihold(&ci->vfs_inode); |
| 1995 | ci->i_wrbuffer_ref++; | 1995 | ci->i_wrbuffer_ref++; |
| 1996 | dout("__take_cap_refs %p wrbuffer %d -> %d (?)\n", | 1996 | dout("__take_cap_refs %p wrbuffer %d -> %d (?)\n", |
| 1997 | &ci->vfs_inode, ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref); | 1997 | &ci->vfs_inode, ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref); |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 159b512d5a27..203252d88d9f 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -734,9 +734,12 @@ retry_snap: | |||
| 734 | } | 734 | } |
| 735 | } | 735 | } |
| 736 | if (ret >= 0) { | 736 | if (ret >= 0) { |
| 737 | int dirty; | ||
| 737 | spin_lock(&inode->i_lock); | 738 | spin_lock(&inode->i_lock); |
| 738 | __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); | 739 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); |
| 739 | spin_unlock(&inode->i_lock); | 740 | spin_unlock(&inode->i_lock); |
| 741 | if (dirty) | ||
| 742 | __mark_inode_dirty(inode, dirty); | ||
| 740 | } | 743 | } |
| 741 | 744 | ||
| 742 | out: | 745 | out: |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index b54c97da1c43..03d6dafda61f 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -1567,6 +1567,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1567 | int release = 0, dirtied = 0; | 1567 | int release = 0, dirtied = 0; |
| 1568 | int mask = 0; | 1568 | int mask = 0; |
| 1569 | int err = 0; | 1569 | int err = 0; |
| 1570 | int inode_dirty_flags = 0; | ||
| 1570 | 1571 | ||
| 1571 | if (ceph_snap(inode) != CEPH_NOSNAP) | 1572 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 1572 | return -EROFS; | 1573 | return -EROFS; |
| @@ -1725,13 +1726,16 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1725 | dout("setattr %p ATTR_FILE ... hrm!\n", inode); | 1726 | dout("setattr %p ATTR_FILE ... hrm!\n", inode); |
| 1726 | 1727 | ||
| 1727 | if (dirtied) { | 1728 | if (dirtied) { |
| 1728 | __ceph_mark_dirty_caps(ci, dirtied); | 1729 | inode_dirty_flags = __ceph_mark_dirty_caps(ci, dirtied); |
| 1729 | inode->i_ctime = CURRENT_TIME; | 1730 | inode->i_ctime = CURRENT_TIME; |
| 1730 | } | 1731 | } |
| 1731 | 1732 | ||
| 1732 | release &= issued; | 1733 | release &= issued; |
| 1733 | spin_unlock(&inode->i_lock); | 1734 | spin_unlock(&inode->i_lock); |
| 1734 | 1735 | ||
| 1736 | if (inode_dirty_flags) | ||
| 1737 | __mark_inode_dirty(inode, inode_dirty_flags); | ||
| 1738 | |||
| 1735 | if (mask) { | 1739 | if (mask) { |
| 1736 | req->r_inode = igrab(inode); | 1740 | req->r_inode = igrab(inode); |
| 1737 | req->r_inode_drop = release; | 1741 | req->r_inode_drop = release; |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 619fe719968f..b1f1b8bb1271 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -506,7 +506,7 @@ static inline int __ceph_caps_dirty(struct ceph_inode_info *ci) | |||
| 506 | { | 506 | { |
| 507 | return ci->i_dirty_caps | ci->i_flushing_caps; | 507 | return ci->i_dirty_caps | ci->i_flushing_caps; |
| 508 | } | 508 | } |
| 509 | extern void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); | 509 | extern int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); |
| 510 | 510 | ||
| 511 | extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); | 511 | extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); |
| 512 | extern int __ceph_caps_used(struct ceph_inode_info *ci); | 512 | extern int __ceph_caps_used(struct ceph_inode_info *ci); |
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 8c9eba6ef9df..f2b628696180 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
| @@ -703,6 +703,7 @@ int ceph_setxattr(struct dentry *dentry, const char *name, | |||
| 703 | struct ceph_inode_xattr *xattr = NULL; | 703 | struct ceph_inode_xattr *xattr = NULL; |
| 704 | int issued; | 704 | int issued; |
| 705 | int required_blob_size; | 705 | int required_blob_size; |
| 706 | int dirty; | ||
| 706 | 707 | ||
| 707 | if (ceph_snap(inode) != CEPH_NOSNAP) | 708 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 708 | return -EROFS; | 709 | return -EROFS; |
| @@ -763,11 +764,12 @@ retry: | |||
| 763 | dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); | 764 | dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); |
| 764 | err = __set_xattr(ci, newname, name_len, newval, | 765 | err = __set_xattr(ci, newname, name_len, newval, |
| 765 | val_len, 1, 1, 1, &xattr); | 766 | val_len, 1, 1, 1, &xattr); |
| 766 | __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); | 767 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); |
| 767 | ci->i_xattrs.dirty = true; | 768 | ci->i_xattrs.dirty = true; |
| 768 | inode->i_ctime = CURRENT_TIME; | 769 | inode->i_ctime = CURRENT_TIME; |
| 769 | spin_unlock(&inode->i_lock); | 770 | spin_unlock(&inode->i_lock); |
| 770 | 771 | if (dirty) | |
| 772 | __mark_inode_dirty(inode, dirty); | ||
| 771 | return err; | 773 | return err; |
| 772 | 774 | ||
| 773 | do_sync: | 775 | do_sync: |
| @@ -810,6 +812,7 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 810 | struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode); | 812 | struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode); |
| 811 | int issued; | 813 | int issued; |
| 812 | int err; | 814 | int err; |
| 815 | int dirty; | ||
| 813 | 816 | ||
| 814 | if (ceph_snap(inode) != CEPH_NOSNAP) | 817 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 815 | return -EROFS; | 818 | return -EROFS; |
| @@ -833,12 +836,13 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 833 | goto do_sync; | 836 | goto do_sync; |
| 834 | 837 | ||
| 835 | err = __remove_xattr_by_name(ceph_inode(inode), name); | 838 | err = __remove_xattr_by_name(ceph_inode(inode), name); |
| 836 | __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); | 839 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); |
| 837 | ci->i_xattrs.dirty = true; | 840 | ci->i_xattrs.dirty = true; |
| 838 | inode->i_ctime = CURRENT_TIME; | 841 | inode->i_ctime = CURRENT_TIME; |
| 839 | 842 | ||
| 840 | spin_unlock(&inode->i_lock); | 843 | spin_unlock(&inode->i_lock); |
| 841 | 844 | if (dirty) | |
| 845 | __mark_inode_dirty(inode, dirty); | ||
| 842 | return err; | 846 | return err; |
| 843 | do_sync: | 847 | do_sync: |
| 844 | spin_unlock(&inode->i_lock); | 848 | spin_unlock(&inode->i_lock); |
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index 33435e4b14d2..ce03a182c771 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
| @@ -480,10 +480,6 @@ static int logfs_read_sb(struct super_block *sb, int read_only) | |||
| 480 | !read_only) | 480 | !read_only) |
| 481 | return -EIO; | 481 | return -EIO; |
| 482 | 482 | ||
| 483 | mutex_init(&super->s_dirop_mutex); | ||
| 484 | mutex_init(&super->s_object_alias_mutex); | ||
| 485 | INIT_LIST_HEAD(&super->s_freeing_list); | ||
| 486 | |||
| 487 | ret = logfs_init_rw(sb); | 483 | ret = logfs_init_rw(sb); |
| 488 | if (ret) | 484 | if (ret) |
| 489 | return ret; | 485 | return ret; |
| @@ -601,6 +597,10 @@ static struct dentry *logfs_mount(struct file_system_type *type, int flags, | |||
| 601 | if (!super) | 597 | if (!super) |
| 602 | return ERR_PTR(-ENOMEM); | 598 | return ERR_PTR(-ENOMEM); |
| 603 | 599 | ||
| 600 | mutex_init(&super->s_dirop_mutex); | ||
| 601 | mutex_init(&super->s_object_alias_mutex); | ||
| 602 | INIT_LIST_HEAD(&super->s_freeing_list); | ||
| 603 | |||
| 604 | if (!devname) | 604 | if (!devname) |
| 605 | err = logfs_get_sb_bdev(super, type, devname); | 605 | err = logfs_get_sb_bdev(super, type, devname); |
| 606 | else if (strncmp(devname, "mtd", 3)) | 606 | else if (strncmp(devname, "mtd", 3)) |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 816e30cbd968..f04b2a3b0f49 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -155,6 +155,7 @@ | |||
| 155 | {0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | 155 | {0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ |
| 156 | {0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | 156 | {0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ |
| 157 | {0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | 157 | {0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ |
| 158 | {0x1002, 0x671f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
| 158 | {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 159 | {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 159 | {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 160 | {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 160 | {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | 161 | {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ |
| @@ -167,6 +168,7 @@ | |||
| 167 | {0x1002, 0x6729, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | 168 | {0x1002, 0x6729, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ |
| 168 | {0x1002, 0x6738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | 169 | {0x1002, 0x6738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ |
| 169 | {0x1002, 0x6739, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | 170 | {0x1002, 0x6739, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ |
| 171 | {0x1002, 0x673e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | ||
| 170 | {0x1002, 0x6740, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 172 | {0x1002, 0x6740, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 171 | {0x1002, 0x6741, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 173 | {0x1002, 0x6741, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 172 | {0x1002, 0x6742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 174 | {0x1002, 0x6742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| @@ -199,6 +201,7 @@ | |||
| 199 | {0x1002, 0x688D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ | 201 | {0x1002, 0x688D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ |
| 200 | {0x1002, 0x6898, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ | 202 | {0x1002, 0x6898, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ |
| 201 | {0x1002, 0x6899, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ | 203 | {0x1002, 0x6899, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ |
| 204 | {0x1002, 0x689b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ | ||
| 202 | {0x1002, 0x689c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ | 205 | {0x1002, 0x689c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ |
| 203 | {0x1002, 0x689d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ | 206 | {0x1002, 0x689d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HEMLOCK|RADEON_NEW_MEMMAP}, \ |
| 204 | {0x1002, 0x689e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ | 207 | {0x1002, 0x689e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ |
| @@ -209,7 +212,9 @@ | |||
| 209 | {0x1002, 0x68b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 212 | {0x1002, 0x68b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 210 | {0x1002, 0x68b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ | 213 | {0x1002, 0x68b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ |
| 211 | {0x1002, 0x68b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ | 214 | {0x1002, 0x68b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ |
| 215 | {0x1002, 0x68ba, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ | ||
| 212 | {0x1002, 0x68be, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ | 216 | {0x1002, 0x68be, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ |
| 217 | {0x1002, 0x68bf, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_JUNIPER|RADEON_NEW_MEMMAP}, \ | ||
| 213 | {0x1002, 0x68c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 218 | {0x1002, 0x68c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 214 | {0x1002, 0x68c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 219 | {0x1002, 0x68c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 215 | {0x1002, 0x68c7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 220 | {0x1002, 0x68c7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_REDWOOD|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h index 7aa5dddb2098..787f7b6fd622 100644 --- a/include/drm/radeon_drm.h +++ b/include/drm/radeon_drm.h | |||
| @@ -910,6 +910,7 @@ struct drm_radeon_cs { | |||
| 910 | #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ | 910 | #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ |
| 911 | #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */ | 911 | #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */ |
| 912 | #define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */ | 912 | #define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */ |
| 913 | #define RADEON_INFO_FUSION_GART_WORKING 0x0c /* fusion writes to GTT were broken before this */ | ||
| 913 | 914 | ||
| 914 | struct drm_radeon_info { | 915 | struct drm_radeon_info { |
| 915 | uint32_t request; | 916 | uint32_t request; |
diff --git a/include/linux/flex_array.h b/include/linux/flex_array.h index 70e4efabe0fb..ebeb2f3ad068 100644 --- a/include/linux/flex_array.h +++ b/include/linux/flex_array.h | |||
| @@ -61,7 +61,7 @@ struct flex_array { | |||
| 61 | struct flex_array *flex_array_alloc(int element_size, unsigned int total, | 61 | struct flex_array *flex_array_alloc(int element_size, unsigned int total, |
| 62 | gfp_t flags); | 62 | gfp_t flags); |
| 63 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, | 63 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, |
| 64 | unsigned int end, gfp_t flags); | 64 | unsigned int nr_elements, gfp_t flags); |
| 65 | void flex_array_free(struct flex_array *fa); | 65 | void flex_array_free(struct flex_array *fa); |
| 66 | void flex_array_free_parts(struct flex_array *fa); | 66 | void flex_array_free_parts(struct flex_array *fa); |
| 67 | int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, | 67 | int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, |
diff --git a/include/linux/mfd/wm831x/pdata.h b/include/linux/mfd/wm831x/pdata.h index afe4db49402d..632d1567a1b6 100644 --- a/include/linux/mfd/wm831x/pdata.h +++ b/include/linux/mfd/wm831x/pdata.h | |||
| @@ -81,7 +81,9 @@ struct wm831x_touch_pdata { | |||
| 81 | int rpu; /** Pen down sensitivity resistor divider */ | 81 | int rpu; /** Pen down sensitivity resistor divider */ |
| 82 | int pressure; /** Report pressure (boolean) */ | 82 | int pressure; /** Report pressure (boolean) */ |
| 83 | unsigned int data_irq; /** Touch data ready IRQ */ | 83 | unsigned int data_irq; /** Touch data ready IRQ */ |
| 84 | int data_irqf; /** IRQ flags for data ready IRQ */ | ||
| 84 | unsigned int pd_irq; /** Touch pendown detect IRQ */ | 85 | unsigned int pd_irq; /** Touch pendown detect IRQ */ |
| 86 | int pd_irqf; /** IRQ flags for pen down IRQ */ | ||
| 85 | }; | 87 | }; |
| 86 | 88 | ||
| 87 | enum wm831x_watchdog_action { | 89 | enum wm831x_watchdog_action { |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index bcb793ec7374..eb792cb6d745 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -183,7 +183,6 @@ struct mmc_host { | |||
| 183 | struct work_struct clk_gate_work; /* delayed clock gate */ | 183 | struct work_struct clk_gate_work; /* delayed clock gate */ |
| 184 | unsigned int clk_old; /* old clock value cache */ | 184 | unsigned int clk_old; /* old clock value cache */ |
| 185 | spinlock_t clk_lock; /* lock for clk fields */ | 185 | spinlock_t clk_lock; /* lock for clk fields */ |
| 186 | struct mutex clk_gate_mutex; /* mutex for clock gating */ | ||
| 187 | #endif | 186 | #endif |
| 188 | 187 | ||
| 189 | /* host specific block data */ | 188 | /* host specific block data */ |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 3a5c4449fd36..8b97308e65df 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
| @@ -948,7 +948,7 @@ do { \ | |||
| 948 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | 948 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) |
| 949 | # endif | 949 | # endif |
| 950 | # define irqsafe_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | 950 | # define irqsafe_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ |
| 951 | __pcpu_double_call_return_int(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) | 951 | __pcpu_double_call_return_bool(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) |
| 952 | #endif | 952 | #endif |
| 953 | 953 | ||
| 954 | #endif /* __LINUX_PERCPU_H */ | 954 | #endif /* __LINUX_PERCPU_H */ |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index dd201bd35103..834899f2500f 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
| @@ -419,7 +419,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
| 419 | } else { | 419 | } else { |
| 420 | seq_printf(p, " %8s", "None"); | 420 | seq_printf(p, " %8s", "None"); |
| 421 | } | 421 | } |
| 422 | #ifdef CONFIG_GENIRC_IRQ_SHOW_LEVEL | 422 | #ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL |
| 423 | seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"); | 423 | seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"); |
| 424 | #endif | 424 | #endif |
| 425 | if (desc->name) | 425 | if (desc->name) |
diff --git a/lib/flex_array.c b/lib/flex_array.c index c0ea40ba2082..854b57bd7d9d 100644 --- a/lib/flex_array.c +++ b/lib/flex_array.c | |||
| @@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear); | |||
| 232 | 232 | ||
| 233 | /** | 233 | /** |
| 234 | * flex_array_prealloc - guarantee that array space exists | 234 | * flex_array_prealloc - guarantee that array space exists |
| 235 | * @fa: the flex array for which to preallocate parts | 235 | * @fa: the flex array for which to preallocate parts |
| 236 | * @start: index of first array element for which space is allocated | 236 | * @start: index of first array element for which space is allocated |
| 237 | * @end: index of last (inclusive) element for which space is allocated | 237 | * @nr_elements: number of elements for which space is allocated |
| 238 | * @flags: page allocation flags | 238 | * @flags: page allocation flags |
| 239 | * | 239 | * |
| 240 | * This will guarantee that no future calls to flex_array_put() | 240 | * This will guarantee that no future calls to flex_array_put() |
| 241 | * will allocate memory. It can be used if you are expecting to | 241 | * will allocate memory. It can be used if you are expecting to |
| @@ -245,14 +245,24 @@ EXPORT_SYMBOL(flex_array_clear); | |||
| 245 | * Locking must be provided by the caller. | 245 | * Locking must be provided by the caller. |
| 246 | */ | 246 | */ |
| 247 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, | 247 | int flex_array_prealloc(struct flex_array *fa, unsigned int start, |
| 248 | unsigned int end, gfp_t flags) | 248 | unsigned int nr_elements, gfp_t flags) |
| 249 | { | 249 | { |
| 250 | int start_part; | 250 | int start_part; |
| 251 | int end_part; | 251 | int end_part; |
| 252 | int part_nr; | 252 | int part_nr; |
| 253 | unsigned int end; | ||
| 253 | struct flex_array_part *part; | 254 | struct flex_array_part *part; |
| 254 | 255 | ||
| 255 | if (start >= fa->total_nr_elements || end >= fa->total_nr_elements) | 256 | if (!start && !nr_elements) |
| 257 | return 0; | ||
| 258 | if (start >= fa->total_nr_elements) | ||
| 259 | return -ENOSPC; | ||
| 260 | if (!nr_elements) | ||
| 261 | return 0; | ||
| 262 | |||
| 263 | end = start + nr_elements - 1; | ||
| 264 | |||
| 265 | if (end >= fa->total_nr_elements) | ||
| 256 | return -ENOSPC; | 266 | return -ENOSPC; |
| 257 | if (elements_fit_in_base(fa)) | 267 | if (elements_fit_in_base(fa)) |
| 258 | return 0; | 268 | return 0; |
| @@ -343,6 +353,8 @@ int flex_array_shrink(struct flex_array *fa) | |||
| 343 | int part_nr; | 353 | int part_nr; |
| 344 | int ret = 0; | 354 | int ret = 0; |
| 345 | 355 | ||
| 356 | if (!fa->total_nr_elements) | ||
| 357 | return 0; | ||
| 346 | if (elements_fit_in_base(fa)) | 358 | if (elements_fit_in_base(fa)) |
| 347 | return ret; | 359 | return ret; |
| 348 | for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) { | 360 | for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) { |
diff --git a/mm/memory.c b/mm/memory.c index 607098d47e74..27f425378112 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -1359,7 +1359,7 @@ split_fallthrough: | |||
| 1359 | */ | 1359 | */ |
| 1360 | mark_page_accessed(page); | 1360 | mark_page_accessed(page); |
| 1361 | } | 1361 | } |
| 1362 | if (flags & FOLL_MLOCK) { | 1362 | if ((flags & FOLL_MLOCK) && (vma->vm_flags & VM_LOCKED)) { |
| 1363 | /* | 1363 | /* |
| 1364 | * The preliminary mapping check is mainly to avoid the | 1364 | * The preliminary mapping check is mainly to avoid the |
| 1365 | * pointless overhead of lock_page on the ZERO_PAGE | 1365 | * pointless overhead of lock_page on the ZERO_PAGE |
| @@ -1552,10 +1552,9 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | |||
| 1552 | } | 1552 | } |
| 1553 | 1553 | ||
| 1554 | /* | 1554 | /* |
| 1555 | * If we don't actually want the page itself, | 1555 | * For mlock, just skip the stack guard page. |
| 1556 | * and it's the stack guard page, just skip it. | ||
| 1557 | */ | 1556 | */ |
| 1558 | if (!pages && stack_guard_page(vma, start)) | 1557 | if ((gup_flags & FOLL_MLOCK) && stack_guard_page(vma, start)) |
| 1559 | goto next_page; | 1558 | goto next_page; |
| 1560 | 1559 | ||
| 1561 | do { | 1560 | do { |
diff --git a/mm/mlock.c b/mm/mlock.c index 6b55e3efe0df..516b2c2ddd5a 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
| @@ -162,7 +162,7 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, | |||
| 162 | VM_BUG_ON(end > vma->vm_end); | 162 | VM_BUG_ON(end > vma->vm_end); |
| 163 | VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem)); | 163 | VM_BUG_ON(!rwsem_is_locked(&mm->mmap_sem)); |
| 164 | 164 | ||
| 165 | gup_flags = FOLL_TOUCH; | 165 | gup_flags = FOLL_TOUCH | FOLL_MLOCK; |
| 166 | /* | 166 | /* |
| 167 | * We want to touch writable mappings with a write fault in order | 167 | * We want to touch writable mappings with a write fault in order |
| 168 | * to break COW, except for shared mappings because these don't COW | 168 | * to break COW, except for shared mappings because these don't COW |
| @@ -178,9 +178,6 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma, | |||
| 178 | if (vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) | 178 | if (vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) |
| 179 | gup_flags |= FOLL_FORCE; | 179 | gup_flags |= FOLL_FORCE; |
| 180 | 180 | ||
| 181 | if (vma->vm_flags & VM_LOCKED) | ||
| 182 | gup_flags |= FOLL_MLOCK; | ||
| 183 | |||
| 184 | return __get_user_pages(current, mm, addr, nr_pages, gup_flags, | 181 | return __get_user_pages(current, mm, addr, nr_pages, gup_flags, |
| 185 | NULL, NULL, nonblocking); | 182 | NULL, NULL, nonblocking); |
| 186 | } | 183 | } |
| @@ -1940,7 +1940,7 @@ redo: | |||
| 1940 | * Since this is without lock semantics the protection is only against | 1940 | * Since this is without lock semantics the protection is only against |
| 1941 | * code executing on this cpu *not* from access by other cpus. | 1941 | * code executing on this cpu *not* from access by other cpus. |
| 1942 | */ | 1942 | */ |
| 1943 | if (unlikely(!this_cpu_cmpxchg_double( | 1943 | if (unlikely(!irqsafe_cpu_cmpxchg_double( |
| 1944 | s->cpu_slab->freelist, s->cpu_slab->tid, | 1944 | s->cpu_slab->freelist, s->cpu_slab->tid, |
| 1945 | object, tid, | 1945 | object, tid, |
| 1946 | get_freepointer(s, object), next_tid(tid)))) { | 1946 | get_freepointer(s, object), next_tid(tid)))) { |
| @@ -2145,7 +2145,7 @@ redo: | |||
| 2145 | set_freepointer(s, object, c->freelist); | 2145 | set_freepointer(s, object, c->freelist); |
| 2146 | 2146 | ||
| 2147 | #ifdef CONFIG_CMPXCHG_LOCAL | 2147 | #ifdef CONFIG_CMPXCHG_LOCAL |
| 2148 | if (unlikely(!this_cpu_cmpxchg_double( | 2148 | if (unlikely(!irqsafe_cpu_cmpxchg_double( |
| 2149 | s->cpu_slab->freelist, s->cpu_slab->tid, | 2149 | s->cpu_slab->freelist, s->cpu_slab->tid, |
| 2150 | c->freelist, tid, | 2150 | c->freelist, tid, |
| 2151 | object, next_tid(tid)))) { | 2151 | object, next_tid(tid)))) { |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 05f357828a2f..e15a82ccc05f 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
| @@ -2267,6 +2267,19 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags) | |||
| 2267 | m->more_to_follow = false; | 2267 | m->more_to_follow = false; |
| 2268 | m->pool = NULL; | 2268 | m->pool = NULL; |
| 2269 | 2269 | ||
| 2270 | /* middle */ | ||
| 2271 | m->middle = NULL; | ||
| 2272 | |||
| 2273 | /* data */ | ||
| 2274 | m->nr_pages = 0; | ||
| 2275 | m->page_alignment = 0; | ||
| 2276 | m->pages = NULL; | ||
| 2277 | m->pagelist = NULL; | ||
| 2278 | m->bio = NULL; | ||
| 2279 | m->bio_iter = NULL; | ||
| 2280 | m->bio_seg = 0; | ||
| 2281 | m->trail = NULL; | ||
| 2282 | |||
| 2270 | /* front */ | 2283 | /* front */ |
| 2271 | if (front_len) { | 2284 | if (front_len) { |
| 2272 | if (front_len > PAGE_CACHE_SIZE) { | 2285 | if (front_len > PAGE_CACHE_SIZE) { |
| @@ -2286,19 +2299,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags) | |||
| 2286 | } | 2299 | } |
| 2287 | m->front.iov_len = front_len; | 2300 | m->front.iov_len = front_len; |
| 2288 | 2301 | ||
| 2289 | /* middle */ | ||
| 2290 | m->middle = NULL; | ||
| 2291 | |||
| 2292 | /* data */ | ||
| 2293 | m->nr_pages = 0; | ||
| 2294 | m->page_alignment = 0; | ||
| 2295 | m->pages = NULL; | ||
| 2296 | m->pagelist = NULL; | ||
| 2297 | m->bio = NULL; | ||
| 2298 | m->bio_iter = NULL; | ||
| 2299 | m->bio_seg = 0; | ||
| 2300 | m->trail = NULL; | ||
| 2301 | |||
| 2302 | dout("ceph_msg_new %p front %d\n", m, front_len); | 2302 | dout("ceph_msg_new %p front %d\n", m, front_len); |
| 2303 | return m; | 2303 | return m; |
| 2304 | 2304 | ||
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 5a80f41c0cba..6b5dda1cb5df 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
| @@ -470,8 +470,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, | |||
| 470 | snapc, ops, | 470 | snapc, ops, |
| 471 | use_mempool, | 471 | use_mempool, |
| 472 | GFP_NOFS, NULL, NULL); | 472 | GFP_NOFS, NULL, NULL); |
| 473 | if (IS_ERR(req)) | 473 | if (!req) |
| 474 | return req; | 474 | return NULL; |
| 475 | 475 | ||
| 476 | /* calculate max write size */ | 476 | /* calculate max write size */ |
| 477 | calc_layout(osdc, vino, layout, off, plen, req, ops); | 477 | calc_layout(osdc, vino, layout, off, plen, req, ops); |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index f7cf0ea6faea..8fb248843009 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir, | |||
| 1578 | return rc; | 1578 | return rc; |
| 1579 | 1579 | ||
| 1580 | if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { | 1580 | if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { |
| 1581 | rc = security_transition_sid(sid, dsec->sid, tclass, NULL, &newsid); | 1581 | rc = security_transition_sid(sid, dsec->sid, tclass, |
| 1582 | &dentry->d_name, &newsid); | ||
| 1582 | if (rc) | 1583 | if (rc) |
| 1583 | return rc; | 1584 | return rc; |
| 1584 | } | 1585 | } |
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index e7b850ad57ee..e6e7ce0d3d55 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
| @@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p) | |||
| 502 | goto out; | 502 | goto out; |
| 503 | 503 | ||
| 504 | rc = flex_array_prealloc(p->type_val_to_struct_array, 0, | 504 | rc = flex_array_prealloc(p->type_val_to_struct_array, 0, |
| 505 | p->p_types.nprim - 1, GFP_KERNEL | __GFP_ZERO); | 505 | p->p_types.nprim, GFP_KERNEL | __GFP_ZERO); |
| 506 | if (rc) | 506 | if (rc) |
| 507 | goto out; | 507 | goto out; |
| 508 | 508 | ||
| @@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p) | |||
| 519 | goto out; | 519 | goto out; |
| 520 | 520 | ||
| 521 | rc = flex_array_prealloc(p->sym_val_to_name[i], | 521 | rc = flex_array_prealloc(p->sym_val_to_name[i], |
| 522 | 0, p->symtab[i].nprim - 1, | 522 | 0, p->symtab[i].nprim, |
| 523 | GFP_KERNEL | __GFP_ZERO); | 523 | GFP_KERNEL | __GFP_ZERO); |
| 524 | if (rc) | 524 | if (rc) |
| 525 | goto out; | 525 | goto out; |
| @@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp) | |||
| 2375 | goto bad; | 2375 | goto bad; |
| 2376 | 2376 | ||
| 2377 | /* preallocate so we don't have to worry about the put ever failing */ | 2377 | /* preallocate so we don't have to worry about the put ever failing */ |
| 2378 | rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1, | 2378 | rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim, |
| 2379 | GFP_KERNEL | __GFP_ZERO); | 2379 | GFP_KERNEL | __GFP_ZERO); |
| 2380 | if (rc) | 2380 | if (rc) |
| 2381 | goto bad; | 2381 | goto bad; |
