diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2012-04-12 06:52:34 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2012-04-12 06:52:34 -0400 |
| commit | 33cd5cffd50a789f4e2f0f8bcd7ed9cf8a07da16 (patch) | |
| tree | f142384aa88b5d25391084b1ef2d192d4e7556ce | |
| parent | a4e02f6d83d4fcdb13bcaba76878fc5ea0da9911 (diff) | |
| parent | 104fa61a7dd83197160d5cafedc0e94ad9cd7fcc (diff) | |
Merge branch 'common/clkfwk' into sh-latest
| -rw-r--r-- | arch/sparc/kernel/leon_pci.c | 13 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_32.c | 37 | ||||
| -rw-r--r-- | arch/sparc/mm/fault_64.c | 37 | ||||
| -rw-r--r-- | arch/um/drivers/cow.h | 35 | ||||
| -rw-r--r-- | arch/um/drivers/cow_user.c | 43 | ||||
| -rw-r--r-- | arch/um/drivers/mconsole_kern.c | 1 | ||||
| -rw-r--r-- | arch/um/include/asm/Kbuild | 3 | ||||
| -rw-r--r-- | arch/um/kernel/Makefile | 7 | ||||
| -rw-r--r-- | arch/um/kernel/process.c | 6 | ||||
| -rw-r--r-- | arch/um/kernel/skas/mmu.c | 1 | ||||
| -rw-r--r-- | arch/x86/Makefile.um | 3 | ||||
| -rw-r--r-- | arch/x86/um/asm/barrier.h | 75 | ||||
| -rw-r--r-- | arch/x86/um/asm/system.h | 135 | ||||
| -rw-r--r-- | crypto/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-pcidrv.c | 1 | ||||
| -rw-r--r-- | drivers/regulator/anatop-regulator.c | 6 | ||||
| -rw-r--r-- | drivers/sh/clk/cpg.c | 77 | ||||
| -rw-r--r-- | drivers/staging/android/lowmemorykiller.c | 48 | ||||
| -rw-r--r-- | include/linux/sh_clk.h | 34 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 7 | ||||
| -rw-r--r-- | scripts/mod/modpost.h | 1 |
21 files changed, 265 insertions, 311 deletions
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index aba6b958b2a5..19f56058742b 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c | |||
| @@ -45,7 +45,6 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) | |||
| 45 | 45 | ||
| 46 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) | 46 | void __devinit pcibios_fixup_bus(struct pci_bus *pbus) |
| 47 | { | 47 | { |
| 48 | struct leon_pci_info *info = pbus->sysdata; | ||
| 49 | struct pci_dev *dev; | 48 | struct pci_dev *dev; |
| 50 | int i, has_io, has_mem; | 49 | int i, has_io, has_mem; |
| 51 | u16 cmd; | 50 | u16 cmd; |
| @@ -111,18 +110,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
| 111 | return pci_enable_resources(dev, mask); | 110 | return pci_enable_resources(dev, mask); |
| 112 | } | 111 | } |
| 113 | 112 | ||
| 114 | struct device_node *pci_device_to_OF_node(struct pci_dev *pdev) | ||
| 115 | { | ||
| 116 | /* | ||
| 117 | * Currently the OpenBoot nodes are not connected with the PCI device, | ||
| 118 | * this is because the LEON PROM does not create PCI nodes. Eventually | ||
| 119 | * this will change and the same approach as pcic.c can be used to | ||
| 120 | * match PROM nodes with pci devices. | ||
| 121 | */ | ||
| 122 | return NULL; | ||
| 123 | } | ||
| 124 | EXPORT_SYMBOL(pci_device_to_OF_node); | ||
| 125 | |||
| 126 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | 113 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) |
| 127 | { | 114 | { |
| 128 | #ifdef CONFIG_PCI_DEBUG | 115 | #ifdef CONFIG_PCI_DEBUG |
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c index 7705c6731e28..df3155a17991 100644 --- a/arch/sparc/mm/fault_32.c +++ b/arch/sparc/mm/fault_32.c | |||
| @@ -225,6 +225,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write, | |||
| 225 | unsigned long g2; | 225 | unsigned long g2; |
| 226 | int from_user = !(regs->psr & PSR_PS); | 226 | int from_user = !(regs->psr & PSR_PS); |
| 227 | int fault, code; | 227 | int fault, code; |
| 228 | unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
| 229 | (write ? FAULT_FLAG_WRITE : 0)); | ||
| 228 | 230 | ||
| 229 | if(text_fault) | 231 | if(text_fault) |
| 230 | address = regs->pc; | 232 | address = regs->pc; |
| @@ -251,6 +253,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write, | |||
| 251 | 253 | ||
| 252 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); | 254 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); |
| 253 | 255 | ||
| 256 | retry: | ||
| 254 | down_read(&mm->mmap_sem); | 257 | down_read(&mm->mmap_sem); |
| 255 | 258 | ||
| 256 | /* | 259 | /* |
| @@ -289,7 +292,11 @@ good_area: | |||
| 289 | * make sure we exit gracefully rather than endlessly redo | 292 | * make sure we exit gracefully rather than endlessly redo |
| 290 | * the fault. | 293 | * the fault. |
| 291 | */ | 294 | */ |
| 292 | fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); | 295 | fault = handle_mm_fault(mm, vma, address, flags); |
| 296 | |||
| 297 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
| 298 | return; | ||
| 299 | |||
| 293 | if (unlikely(fault & VM_FAULT_ERROR)) { | 300 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 294 | if (fault & VM_FAULT_OOM) | 301 | if (fault & VM_FAULT_OOM) |
| 295 | goto out_of_memory; | 302 | goto out_of_memory; |
| @@ -297,13 +304,29 @@ good_area: | |||
| 297 | goto do_sigbus; | 304 | goto do_sigbus; |
| 298 | BUG(); | 305 | BUG(); |
| 299 | } | 306 | } |
| 300 | if (fault & VM_FAULT_MAJOR) { | 307 | |
| 301 | current->maj_flt++; | 308 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
| 302 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address); | 309 | if (fault & VM_FAULT_MAJOR) { |
| 303 | } else { | 310 | current->maj_flt++; |
| 304 | current->min_flt++; | 311 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, |
| 305 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); | 312 | 1, regs, address); |
| 313 | } else { | ||
| 314 | current->min_flt++; | ||
| 315 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, | ||
| 316 | 1, regs, address); | ||
| 317 | } | ||
| 318 | if (fault & VM_FAULT_RETRY) { | ||
| 319 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
| 320 | |||
| 321 | /* No need to up_read(&mm->mmap_sem) as we would | ||
| 322 | * have already released it in __lock_page_or_retry | ||
| 323 | * in mm/filemap.c. | ||
| 324 | */ | ||
| 325 | |||
| 326 | goto retry; | ||
| 327 | } | ||
| 306 | } | 328 | } |
| 329 | |||
| 307 | up_read(&mm->mmap_sem); | 330 | up_read(&mm->mmap_sem); |
| 308 | return; | 331 | return; |
| 309 | 332 | ||
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 504c0622f729..1fe0429b6314 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
| @@ -279,6 +279,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
| 279 | unsigned int insn = 0; | 279 | unsigned int insn = 0; |
| 280 | int si_code, fault_code, fault; | 280 | int si_code, fault_code, fault; |
| 281 | unsigned long address, mm_rss; | 281 | unsigned long address, mm_rss; |
| 282 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | ||
| 282 | 283 | ||
| 283 | fault_code = get_thread_fault_code(); | 284 | fault_code = get_thread_fault_code(); |
| 284 | 285 | ||
| @@ -333,6 +334,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
| 333 | insn = get_fault_insn(regs, insn); | 334 | insn = get_fault_insn(regs, insn); |
| 334 | goto handle_kernel_fault; | 335 | goto handle_kernel_fault; |
| 335 | } | 336 | } |
| 337 | |||
| 338 | retry: | ||
| 336 | down_read(&mm->mmap_sem); | 339 | down_read(&mm->mmap_sem); |
| 337 | } | 340 | } |
| 338 | 341 | ||
| @@ -423,7 +426,12 @@ good_area: | |||
| 423 | goto bad_area; | 426 | goto bad_area; |
| 424 | } | 427 | } |
| 425 | 428 | ||
| 426 | fault = handle_mm_fault(mm, vma, address, (fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0); | 429 | flags |= ((fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0); |
| 430 | fault = handle_mm_fault(mm, vma, address, flags); | ||
| 431 | |||
| 432 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
| 433 | return; | ||
| 434 | |||
| 427 | if (unlikely(fault & VM_FAULT_ERROR)) { | 435 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 428 | if (fault & VM_FAULT_OOM) | 436 | if (fault & VM_FAULT_OOM) |
| 429 | goto out_of_memory; | 437 | goto out_of_memory; |
| @@ -431,12 +439,27 @@ good_area: | |||
| 431 | goto do_sigbus; | 439 | goto do_sigbus; |
| 432 | BUG(); | 440 | BUG(); |
| 433 | } | 441 | } |
| 434 | if (fault & VM_FAULT_MAJOR) { | 442 | |
| 435 | current->maj_flt++; | 443 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
| 436 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address); | 444 | if (fault & VM_FAULT_MAJOR) { |
| 437 | } else { | 445 | current->maj_flt++; |
| 438 | current->min_flt++; | 446 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, |
| 439 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address); | 447 | 1, regs, address); |
| 448 | } else { | ||
| 449 | current->min_flt++; | ||
| 450 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, | ||
| 451 | 1, regs, address); | ||
| 452 | } | ||
| 453 | if (fault & VM_FAULT_RETRY) { | ||
| 454 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
| 455 | |||
| 456 | /* No need to up_read(&mm->mmap_sem) as we would | ||
| 457 | * have already released it in __lock_page_or_retry | ||
| 458 | * in mm/filemap.c. | ||
| 459 | */ | ||
| 460 | |||
| 461 | goto retry; | ||
| 462 | } | ||
| 440 | } | 463 | } |
| 441 | up_read(&mm->mmap_sem); | 464 | up_read(&mm->mmap_sem); |
| 442 | 465 | ||
diff --git a/arch/um/drivers/cow.h b/arch/um/drivers/cow.h index dc36b222100b..6673508f3426 100644 --- a/arch/um/drivers/cow.h +++ b/arch/um/drivers/cow.h | |||
| @@ -3,41 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> |
| 5 | 5 | ||
| 6 | #if defined(__KERNEL__) | ||
| 7 | |||
| 8 | # include <asm/byteorder.h> | ||
| 9 | |||
| 10 | # if defined(__BIG_ENDIAN) | ||
| 11 | # define ntohll(x) (x) | ||
| 12 | # define htonll(x) (x) | ||
| 13 | # elif defined(__LITTLE_ENDIAN) | ||
| 14 | # define ntohll(x) be64_to_cpu(x) | ||
| 15 | # define htonll(x) cpu_to_be64(x) | ||
| 16 | # else | ||
| 17 | # error "Could not determine byte order" | ||
| 18 | # endif | ||
| 19 | |||
| 20 | #else | ||
| 21 | /* For the definition of ntohl, htonl and __BYTE_ORDER */ | ||
| 22 | #include <endian.h> | ||
| 23 | #include <netinet/in.h> | ||
| 24 | #if defined(__BYTE_ORDER) | ||
| 25 | |||
| 26 | # if __BYTE_ORDER == __BIG_ENDIAN | ||
| 27 | # define ntohll(x) (x) | ||
| 28 | # define htonll(x) (x) | ||
| 29 | # elif __BYTE_ORDER == __LITTLE_ENDIAN | ||
| 30 | # define ntohll(x) bswap_64(x) | ||
| 31 | # define htonll(x) bswap_64(x) | ||
| 32 | # else | ||
| 33 | # error "Could not determine byte order: __BYTE_ORDER uncorrectly defined" | ||
| 34 | # endif | ||
| 35 | |||
| 36 | #else /* ! defined(__BYTE_ORDER) */ | ||
| 37 | # error "Could not determine byte order: __BYTE_ORDER not defined" | ||
| 38 | #endif | ||
| 39 | #endif /* ! defined(__KERNEL__) */ | ||
| 40 | |||
| 41 | extern int init_cow_file(int fd, char *cow_file, char *backing_file, | 6 | extern int init_cow_file(int fd, char *cow_file, char *backing_file, |
| 42 | int sectorsize, int alignment, int *bitmap_offset_out, | 7 | int sectorsize, int alignment, int *bitmap_offset_out, |
| 43 | unsigned long *bitmap_len_out, int *data_offset_out); | 8 | unsigned long *bitmap_len_out, int *data_offset_out); |
diff --git a/arch/um/drivers/cow_user.c b/arch/um/drivers/cow_user.c index 9cbb426c0b91..0ee9cc6cc4c7 100644 --- a/arch/um/drivers/cow_user.c +++ b/arch/um/drivers/cow_user.c | |||
| @@ -8,11 +8,10 @@ | |||
| 8 | * that. | 8 | * that. |
| 9 | */ | 9 | */ |
| 10 | #include <unistd.h> | 10 | #include <unistd.h> |
| 11 | #include <byteswap.h> | ||
| 12 | #include <errno.h> | 11 | #include <errno.h> |
| 13 | #include <string.h> | 12 | #include <string.h> |
| 14 | #include <arpa/inet.h> | 13 | #include <arpa/inet.h> |
| 15 | #include <asm/types.h> | 14 | #include <endian.h> |
| 16 | #include "cow.h" | 15 | #include "cow.h" |
| 17 | #include "cow_sys.h" | 16 | #include "cow_sys.h" |
| 18 | 17 | ||
| @@ -214,8 +213,8 @@ int write_cow_header(char *cow_file, int fd, char *backing_file, | |||
| 214 | "header\n"); | 213 | "header\n"); |
| 215 | goto out; | 214 | goto out; |
| 216 | } | 215 | } |
| 217 | header->magic = htonl(COW_MAGIC); | 216 | header->magic = htobe32(COW_MAGIC); |
| 218 | header->version = htonl(COW_VERSION); | 217 | header->version = htobe32(COW_VERSION); |
| 219 | 218 | ||
| 220 | err = -EINVAL; | 219 | err = -EINVAL; |
| 221 | if (strlen(backing_file) > sizeof(header->backing_file) - 1) { | 220 | if (strlen(backing_file) > sizeof(header->backing_file) - 1) { |
| @@ -246,10 +245,10 @@ int write_cow_header(char *cow_file, int fd, char *backing_file, | |||
| 246 | goto out_free; | 245 | goto out_free; |
| 247 | } | 246 | } |
| 248 | 247 | ||
| 249 | header->mtime = htonl(modtime); | 248 | header->mtime = htobe32(modtime); |
| 250 | header->size = htonll(*size); | 249 | header->size = htobe64(*size); |
| 251 | header->sectorsize = htonl(sectorsize); | 250 | header->sectorsize = htobe32(sectorsize); |
| 252 | header->alignment = htonl(alignment); | 251 | header->alignment = htobe32(alignment); |
| 253 | header->cow_format = COW_BITMAP; | 252 | header->cow_format = COW_BITMAP; |
| 254 | 253 | ||
| 255 | err = cow_write_file(fd, header, sizeof(*header)); | 254 | err = cow_write_file(fd, header, sizeof(*header)); |
| @@ -301,8 +300,8 @@ int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg, | |||
| 301 | magic = header->v1.magic; | 300 | magic = header->v1.magic; |
| 302 | if (magic == COW_MAGIC) | 301 | if (magic == COW_MAGIC) |
| 303 | version = header->v1.version; | 302 | version = header->v1.version; |
| 304 | else if (magic == ntohl(COW_MAGIC)) | 303 | else if (magic == be32toh(COW_MAGIC)) |
| 305 | version = ntohl(header->v1.version); | 304 | version = be32toh(header->v1.version); |
| 306 | /* No error printed because the non-COW case comes through here */ | 305 | /* No error printed because the non-COW case comes through here */ |
| 307 | else goto out; | 306 | else goto out; |
| 308 | 307 | ||
| @@ -327,9 +326,9 @@ int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg, | |||
| 327 | "header\n"); | 326 | "header\n"); |
| 328 | goto out; | 327 | goto out; |
| 329 | } | 328 | } |
| 330 | *mtime_out = ntohl(header->v2.mtime); | 329 | *mtime_out = be32toh(header->v2.mtime); |
| 331 | *size_out = ntohll(header->v2.size); | 330 | *size_out = be64toh(header->v2.size); |
| 332 | *sectorsize_out = ntohl(header->v2.sectorsize); | 331 | *sectorsize_out = be32toh(header->v2.sectorsize); |
| 333 | *bitmap_offset_out = sizeof(header->v2); | 332 | *bitmap_offset_out = sizeof(header->v2); |
| 334 | *align_out = *sectorsize_out; | 333 | *align_out = *sectorsize_out; |
| 335 | file = header->v2.backing_file; | 334 | file = header->v2.backing_file; |
| @@ -341,10 +340,10 @@ int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg, | |||
| 341 | "header\n"); | 340 | "header\n"); |
| 342 | goto out; | 341 | goto out; |
| 343 | } | 342 | } |
| 344 | *mtime_out = ntohl(header->v3.mtime); | 343 | *mtime_out = be32toh(header->v3.mtime); |
| 345 | *size_out = ntohll(header->v3.size); | 344 | *size_out = be64toh(header->v3.size); |
| 346 | *sectorsize_out = ntohl(header->v3.sectorsize); | 345 | *sectorsize_out = be32toh(header->v3.sectorsize); |
| 347 | *align_out = ntohl(header->v3.alignment); | 346 | *align_out = be32toh(header->v3.alignment); |
| 348 | if (*align_out == 0) { | 347 | if (*align_out == 0) { |
| 349 | cow_printf("read_cow_header - invalid COW header, " | 348 | cow_printf("read_cow_header - invalid COW header, " |
| 350 | "align == 0\n"); | 349 | "align == 0\n"); |
| @@ -366,16 +365,16 @@ int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg, | |||
| 366 | * this was used until Dec2005 - 64bits are needed to represent | 365 | * this was used until Dec2005 - 64bits are needed to represent |
| 367 | * 2038+. I.e. we can safely do this truncating cast. | 366 | * 2038+. I.e. we can safely do this truncating cast. |
| 368 | * | 367 | * |
| 369 | * Additionally, we must use ntohl() instead of ntohll(), since | 368 | * Additionally, we must use be32toh() instead of be64toh(), since |
| 370 | * the program used to use the former (tested - I got mtime | 369 | * the program used to use the former (tested - I got mtime |
| 371 | * mismatch "0 vs whatever"). | 370 | * mismatch "0 vs whatever"). |
| 372 | * | 371 | * |
| 373 | * Ever heard about bug-to-bug-compatibility ? ;-) */ | 372 | * Ever heard about bug-to-bug-compatibility ? ;-) */ |
| 374 | *mtime_out = (time32_t) ntohl(header->v3_b.mtime); | 373 | *mtime_out = (time32_t) be32toh(header->v3_b.mtime); |
| 375 | 374 | ||
| 376 | *size_out = ntohll(header->v3_b.size); | 375 | *size_out = be64toh(header->v3_b.size); |
| 377 | *sectorsize_out = ntohl(header->v3_b.sectorsize); | 376 | *sectorsize_out = be32toh(header->v3_b.sectorsize); |
| 378 | *align_out = ntohl(header->v3_b.alignment); | 377 | *align_out = be32toh(header->v3_b.alignment); |
| 379 | if (*align_out == 0) { | 378 | if (*align_out == 0) { |
| 380 | cow_printf("read_cow_header - invalid COW header, " | 379 | cow_printf("read_cow_header - invalid COW header, " |
| 381 | "align == 0\n"); | 380 | "align == 0\n"); |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index e672bd6d43e3..43b39d61b538 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/workqueue.h> | 22 | #include <linux/workqueue.h> |
| 23 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
| 24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
| 25 | #include <asm/switch_to.h> | ||
| 25 | 26 | ||
| 26 | #include "init.h" | 27 | #include "init.h" |
| 27 | #include "irq_kern.h" | 28 | #include "irq_kern.h" |
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild index 8419f5cf2ac7..fff24352255d 100644 --- a/arch/um/include/asm/Kbuild +++ b/arch/um/include/asm/Kbuild | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h | 1 | generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h |
| 2 | generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h | 2 | generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h |
| 3 | generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h | 3 | generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h |
| 4 | generic-y += switch_to.h | ||
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 492bc4c1b62b..65a1c3d690ea 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile | |||
| @@ -3,9 +3,10 @@ | |||
| 3 | # Licensed under the GPL | 3 | # Licensed under the GPL |
| 4 | # | 4 | # |
| 5 | 5 | ||
| 6 | CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \ | 6 | CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \ |
| 7 | -DELF_ARCH=$(LDS_ELF_ARCH) \ | 7 | -DELF_ARCH=$(LDS_ELF_ARCH) \ |
| 8 | -DELF_FORMAT=$(LDS_ELF_FORMAT) | 8 | -DELF_FORMAT=$(LDS_ELF_FORMAT) \ |
| 9 | $(LDS_EXTRA) | ||
| 9 | extra-y := vmlinux.lds | 10 | extra-y := vmlinux.lds |
| 10 | clean-files := | 11 | clean-files := |
| 11 | 12 | ||
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index f386d04a84a5..2b73dedb44ca 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
| @@ -88,11 +88,8 @@ static inline void set_current(struct task_struct *task) | |||
| 88 | 88 | ||
| 89 | extern void arch_switch_to(struct task_struct *to); | 89 | extern void arch_switch_to(struct task_struct *to); |
| 90 | 90 | ||
| 91 | void *_switch_to(void *prev, void *next, void *last) | 91 | void *__switch_to(struct task_struct *from, struct task_struct *to) |
| 92 | { | 92 | { |
| 93 | struct task_struct *from = prev; | ||
| 94 | struct task_struct *to = next; | ||
| 95 | |||
| 96 | to->thread.prev_sched = from; | 93 | to->thread.prev_sched = from; |
| 97 | set_current(to); | 94 | set_current(to); |
| 98 | 95 | ||
| @@ -111,7 +108,6 @@ void *_switch_to(void *prev, void *next, void *last) | |||
| 111 | } while (current->thread.saved_task); | 108 | } while (current->thread.saved_task); |
| 112 | 109 | ||
| 113 | return current->thread.prev_sched; | 110 | return current->thread.prev_sched; |
| 114 | |||
| 115 | } | 111 | } |
| 116 | 112 | ||
| 117 | void interrupt_end(void) | 113 | void interrupt_end(void) |
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 4947b319f53a..0a49ef0c2bf4 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c | |||
| @@ -103,7 +103,6 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm) | |||
| 103 | 103 | ||
| 104 | void uml_setup_stubs(struct mm_struct *mm) | 104 | void uml_setup_stubs(struct mm_struct *mm) |
| 105 | { | 105 | { |
| 106 | struct page **pages; | ||
| 107 | int err, ret; | 106 | int err, ret; |
| 108 | 107 | ||
| 109 | if (!skas_needs_stub) | 108 | if (!skas_needs_stub) |
diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um index 4be406abeefd..36b62bc52638 100644 --- a/arch/x86/Makefile.um +++ b/arch/x86/Makefile.um | |||
| @@ -14,6 +14,9 @@ LINK-y += $(call cc-option,-m32) | |||
| 14 | 14 | ||
| 15 | export LDFLAGS | 15 | export LDFLAGS |
| 16 | 16 | ||
| 17 | LDS_EXTRA := -Ui386 | ||
| 18 | export LDS_EXTRA | ||
| 19 | |||
| 17 | # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. | 20 | # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. |
| 18 | include $(srctree)/arch/x86/Makefile_32.cpu | 21 | include $(srctree)/arch/x86/Makefile_32.cpu |
| 19 | 22 | ||
diff --git a/arch/x86/um/asm/barrier.h b/arch/x86/um/asm/barrier.h new file mode 100644 index 000000000000..7d01b8c56c00 --- /dev/null +++ b/arch/x86/um/asm/barrier.h | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | #ifndef _ASM_UM_BARRIER_H_ | ||
| 2 | #define _ASM_UM_BARRIER_H_ | ||
| 3 | |||
| 4 | #include <asm/asm.h> | ||
| 5 | #include <asm/segment.h> | ||
| 6 | #include <asm/cpufeature.h> | ||
| 7 | #include <asm/cmpxchg.h> | ||
| 8 | #include <asm/nops.h> | ||
| 9 | |||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/irqflags.h> | ||
| 12 | |||
| 13 | /* | ||
| 14 | * Force strict CPU ordering. | ||
| 15 | * And yes, this is required on UP too when we're talking | ||
| 16 | * to devices. | ||
| 17 | */ | ||
| 18 | #ifdef CONFIG_X86_32 | ||
| 19 | |||
| 20 | #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2) | ||
| 21 | #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2) | ||
| 22 | #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM) | ||
| 23 | |||
| 24 | #else /* CONFIG_X86_32 */ | ||
| 25 | |||
| 26 | #define mb() asm volatile("mfence" : : : "memory") | ||
| 27 | #define rmb() asm volatile("lfence" : : : "memory") | ||
| 28 | #define wmb() asm volatile("sfence" : : : "memory") | ||
| 29 | |||
| 30 | #endif /* CONFIG_X86_32 */ | ||
| 31 | |||
| 32 | #define read_barrier_depends() do { } while (0) | ||
| 33 | |||
| 34 | #ifdef CONFIG_SMP | ||
| 35 | |||
| 36 | #define smp_mb() mb() | ||
| 37 | #ifdef CONFIG_X86_PPRO_FENCE | ||
| 38 | #define smp_rmb() rmb() | ||
| 39 | #else /* CONFIG_X86_PPRO_FENCE */ | ||
| 40 | #define smp_rmb() barrier() | ||
| 41 | #endif /* CONFIG_X86_PPRO_FENCE */ | ||
| 42 | |||
| 43 | #ifdef CONFIG_X86_OOSTORE | ||
| 44 | #define smp_wmb() wmb() | ||
| 45 | #else /* CONFIG_X86_OOSTORE */ | ||
| 46 | #define smp_wmb() barrier() | ||
| 47 | #endif /* CONFIG_X86_OOSTORE */ | ||
| 48 | |||
| 49 | #define smp_read_barrier_depends() read_barrier_depends() | ||
| 50 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) | ||
| 51 | |||
| 52 | #else /* CONFIG_SMP */ | ||
| 53 | |||
| 54 | #define smp_mb() barrier() | ||
| 55 | #define smp_rmb() barrier() | ||
| 56 | #define smp_wmb() barrier() | ||
| 57 | #define smp_read_barrier_depends() do { } while (0) | ||
| 58 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | ||
| 59 | |||
| 60 | #endif /* CONFIG_SMP */ | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Stop RDTSC speculation. This is needed when you need to use RDTSC | ||
| 64 | * (or get_cycles or vread that possibly accesses the TSC) in a defined | ||
| 65 | * code region. | ||
| 66 | * | ||
| 67 | * (Could use an alternative three way for this if there was one.) | ||
| 68 | */ | ||
| 69 | static inline void rdtsc_barrier(void) | ||
| 70 | { | ||
| 71 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | ||
| 72 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | ||
| 73 | } | ||
| 74 | |||
| 75 | #endif | ||
diff --git a/arch/x86/um/asm/system.h b/arch/x86/um/asm/system.h deleted file mode 100644 index a459fd9b7598..000000000000 --- a/arch/x86/um/asm/system.h +++ /dev/null | |||
| @@ -1,135 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_SYSTEM_H_ | ||
| 2 | #define _ASM_X86_SYSTEM_H_ | ||
| 3 | |||
| 4 | #include <asm/asm.h> | ||
| 5 | #include <asm/segment.h> | ||
| 6 | #include <asm/cpufeature.h> | ||
| 7 | #include <asm/cmpxchg.h> | ||
| 8 | #include <asm/nops.h> | ||
| 9 | |||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/irqflags.h> | ||
| 12 | |||
| 13 | /* entries in ARCH_DLINFO: */ | ||
| 14 | #ifdef CONFIG_IA32_EMULATION | ||
| 15 | # define AT_VECTOR_SIZE_ARCH 2 | ||
| 16 | #else | ||
| 17 | # define AT_VECTOR_SIZE_ARCH 1 | ||
| 18 | #endif | ||
| 19 | |||
| 20 | extern unsigned long arch_align_stack(unsigned long sp); | ||
| 21 | |||
| 22 | void default_idle(void); | ||
| 23 | |||
| 24 | /* | ||
| 25 | * Force strict CPU ordering. | ||
| 26 | * And yes, this is required on UP too when we're talking | ||
| 27 | * to devices. | ||
| 28 | */ | ||
| 29 | #ifdef CONFIG_X86_32 | ||
| 30 | /* | ||
| 31 | * Some non-Intel clones support out of order store. wmb() ceases to be a | ||
| 32 | * nop for these. | ||
| 33 | */ | ||
| 34 | #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2) | ||
| 35 | #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2) | ||
| 36 | #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM) | ||
| 37 | #else | ||
| 38 | #define mb() asm volatile("mfence":::"memory") | ||
| 39 | #define rmb() asm volatile("lfence":::"memory") | ||
| 40 | #define wmb() asm volatile("sfence" ::: "memory") | ||
| 41 | #endif | ||
| 42 | |||
| 43 | /** | ||
| 44 | * read_barrier_depends - Flush all pending reads that subsequents reads | ||
| 45 | * depend on. | ||
| 46 | * | ||
| 47 | * No data-dependent reads from memory-like regions are ever reordered | ||
| 48 | * over this barrier. All reads preceding this primitive are guaranteed | ||
| 49 | * to access memory (but not necessarily other CPUs' caches) before any | ||
| 50 | * reads following this primitive that depend on the data return by | ||
| 51 | * any of the preceding reads. This primitive is much lighter weight than | ||
| 52 | * rmb() on most CPUs, and is never heavier weight than is | ||
| 53 | * rmb(). | ||
| 54 | * | ||
| 55 | * These ordering constraints are respected by both the local CPU | ||
| 56 | * and the compiler. | ||
| 57 | * | ||
| 58 | * Ordering is not guaranteed by anything other than these primitives, | ||
| 59 | * not even by data dependencies. See the documentation for | ||
| 60 | * memory_barrier() for examples and URLs to more information. | ||
| 61 | * | ||
| 62 | * For example, the following code would force ordering (the initial | ||
| 63 | * value of "a" is zero, "b" is one, and "p" is "&a"): | ||
| 64 | * | ||
| 65 | * <programlisting> | ||
| 66 | * CPU 0 CPU 1 | ||
| 67 | * | ||
| 68 | * b = 2; | ||
| 69 | * memory_barrier(); | ||
| 70 | * p = &b; q = p; | ||
| 71 | * read_barrier_depends(); | ||
| 72 | * d = *q; | ||
| 73 | * </programlisting> | ||
| 74 | * | ||
| 75 | * because the read of "*q" depends on the read of "p" and these | ||
| 76 | * two reads are separated by a read_barrier_depends(). However, | ||
| 77 | * the following code, with the same initial values for "a" and "b": | ||
| 78 | * | ||
| 79 | * <programlisting> | ||
| 80 | * CPU 0 CPU 1 | ||
| 81 | * | ||
| 82 | * a = 2; | ||
| 83 | * memory_barrier(); | ||
| 84 | * b = 3; y = b; | ||
| 85 | * read_barrier_depends(); | ||
| 86 | * x = a; | ||
| 87 | * </programlisting> | ||
| 88 | * | ||
| 89 | * does not enforce ordering, since there is no data dependency between | ||
| 90 | * the read of "a" and the read of "b". Therefore, on some CPUs, such | ||
| 91 | * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb() | ||
| 92 | * in cases like this where there are no data dependencies. | ||
| 93 | **/ | ||
| 94 | |||
| 95 | #define read_barrier_depends() do { } while (0) | ||
| 96 | |||
| 97 | #ifdef CONFIG_SMP | ||
| 98 | #define smp_mb() mb() | ||
| 99 | #ifdef CONFIG_X86_PPRO_FENCE | ||
| 100 | # define smp_rmb() rmb() | ||
| 101 | #else | ||
| 102 | # define smp_rmb() barrier() | ||
| 103 | #endif | ||
| 104 | #ifdef CONFIG_X86_OOSTORE | ||
| 105 | # define smp_wmb() wmb() | ||
| 106 | #else | ||
| 107 | # define smp_wmb() barrier() | ||
| 108 | #endif | ||
| 109 | #define smp_read_barrier_depends() read_barrier_depends() | ||
| 110 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) | ||
| 111 | #else | ||
| 112 | #define smp_mb() barrier() | ||
| 113 | #define smp_rmb() barrier() | ||
| 114 | #define smp_wmb() barrier() | ||
| 115 | #define smp_read_barrier_depends() do { } while (0) | ||
| 116 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | ||
| 117 | #endif | ||
| 118 | |||
| 119 | /* | ||
| 120 | * Stop RDTSC speculation. This is needed when you need to use RDTSC | ||
| 121 | * (or get_cycles or vread that possibly accesses the TSC) in a defined | ||
| 122 | * code region. | ||
| 123 | * | ||
| 124 | * (Could use an alternative three way for this if there was one.) | ||
| 125 | */ | ||
| 126 | static inline void rdtsc_barrier(void) | ||
| 127 | { | ||
| 128 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | ||
| 129 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | ||
| 130 | } | ||
| 131 | |||
| 132 | extern void *_switch_to(void *prev, void *next, void *last); | ||
| 133 | #define switch_to(prev, next, last) prev = _switch_to(prev, next, last) | ||
| 134 | |||
| 135 | #endif | ||
diff --git a/crypto/Kconfig b/crypto/Kconfig index 21ff9d015432..8e84225c096b 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -627,7 +627,7 @@ config CRYPTO_BLOWFISH_COMMON | |||
| 627 | 627 | ||
| 628 | config CRYPTO_BLOWFISH_X86_64 | 628 | config CRYPTO_BLOWFISH_X86_64 |
| 629 | tristate "Blowfish cipher algorithm (x86_64)" | 629 | tristate "Blowfish cipher algorithm (x86_64)" |
| 630 | depends on (X86 || UML_X86) && 64BIT | 630 | depends on X86 && 64BIT |
| 631 | select CRYPTO_ALGAPI | 631 | select CRYPTO_ALGAPI |
| 632 | select CRYPTO_BLOWFISH_COMMON | 632 | select CRYPTO_BLOWFISH_COMMON |
| 633 | help | 633 | help |
| @@ -657,7 +657,7 @@ config CRYPTO_CAMELLIA | |||
| 657 | 657 | ||
| 658 | config CRYPTO_CAMELLIA_X86_64 | 658 | config CRYPTO_CAMELLIA_X86_64 |
| 659 | tristate "Camellia cipher algorithm (x86_64)" | 659 | tristate "Camellia cipher algorithm (x86_64)" |
| 660 | depends on (X86 || UML_X86) && 64BIT | 660 | depends on X86 && 64BIT |
| 661 | depends on CRYPTO | 661 | depends on CRYPTO |
| 662 | select CRYPTO_ALGAPI | 662 | select CRYPTO_ALGAPI |
| 663 | select CRYPTO_LRW | 663 | select CRYPTO_LRW |
| @@ -893,7 +893,7 @@ config CRYPTO_TWOFISH_X86_64 | |||
| 893 | 893 | ||
| 894 | config CRYPTO_TWOFISH_X86_64_3WAY | 894 | config CRYPTO_TWOFISH_X86_64_3WAY |
| 895 | tristate "Twofish cipher algorithm (x86_64, 3-way parallel)" | 895 | tristate "Twofish cipher algorithm (x86_64, 3-way parallel)" |
| 896 | depends on (X86 || UML_X86) && 64BIT | 896 | depends on X86 && 64BIT |
| 897 | select CRYPTO_ALGAPI | 897 | select CRYPTO_ALGAPI |
| 898 | select CRYPTO_TWOFISH_COMMON | 898 | select CRYPTO_TWOFISH_COMMON |
| 899 | select CRYPTO_TWOFISH_X86_64 | 899 | select CRYPTO_TWOFISH_X86_64 |
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index 37f42113af31..00e8f213f56e 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c | |||
| @@ -182,7 +182,6 @@ static int i2c_dw_pci_resume(struct device *dev) | |||
| 182 | pci_restore_state(pdev); | 182 | pci_restore_state(pdev); |
| 183 | 183 | ||
| 184 | i2c_dw_init(i2c); | 184 | i2c_dw_init(i2c); |
| 185 | i2c_dw_enable(i2c); | ||
| 186 | return 0; | 185 | return 0; |
| 187 | } | 186 | } |
| 188 | 187 | ||
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c index 53969af17558..81fd606e47bc 100644 --- a/drivers/regulator/anatop-regulator.c +++ b/drivers/regulator/anatop-regulator.c | |||
| @@ -214,7 +214,7 @@ static struct of_device_id __devinitdata of_anatop_regulator_match_tbl[] = { | |||
| 214 | { /* end */ } | 214 | { /* end */ } |
| 215 | }; | 215 | }; |
| 216 | 216 | ||
| 217 | static struct platform_driver anatop_regulator = { | 217 | static struct platform_driver anatop_regulator_driver = { |
| 218 | .driver = { | 218 | .driver = { |
| 219 | .name = "anatop_regulator", | 219 | .name = "anatop_regulator", |
| 220 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
| @@ -226,13 +226,13 @@ static struct platform_driver anatop_regulator = { | |||
| 226 | 226 | ||
| 227 | static int __init anatop_regulator_init(void) | 227 | static int __init anatop_regulator_init(void) |
| 228 | { | 228 | { |
| 229 | return platform_driver_register(&anatop_regulator); | 229 | return platform_driver_register(&anatop_regulator_driver); |
| 230 | } | 230 | } |
| 231 | postcore_initcall(anatop_regulator_init); | 231 | postcore_initcall(anatop_regulator_init); |
| 232 | 232 | ||
| 233 | static void __exit anatop_regulator_exit(void) | 233 | static void __exit anatop_regulator_exit(void) |
| 234 | { | 234 | { |
| 235 | platform_driver_unregister(&anatop_regulator); | 235 | platform_driver_unregister(&anatop_regulator_driver); |
| 236 | } | 236 | } |
| 237 | module_exit(anatop_regulator_exit); | 237 | module_exit(anatop_regulator_exit); |
| 238 | 238 | ||
diff --git a/drivers/sh/clk/cpg.c b/drivers/sh/clk/cpg.c index 91b6d52f74eb..f0d015dd0fef 100644 --- a/drivers/sh/clk/cpg.c +++ b/drivers/sh/clk/cpg.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * Helper routines for SuperH Clock Pulse Generator blocks (CPG). | 2 | * Helper routines for SuperH Clock Pulse Generator blocks (CPG). |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2010 Magnus Damm | 4 | * Copyright (C) 2010 Magnus Damm |
| 5 | * Copyright (C) 2010 - 2012 Paul Mundt | ||
| 5 | * | 6 | * |
| 6 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
| 7 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
| @@ -13,26 +14,44 @@ | |||
| 13 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 14 | #include <linux/sh_clk.h> | 15 | #include <linux/sh_clk.h> |
| 15 | 16 | ||
| 16 | static int sh_clk_mstp32_enable(struct clk *clk) | 17 | static unsigned int sh_clk_read(struct clk *clk) |
| 17 | { | 18 | { |
| 18 | iowrite32(ioread32(clk->mapped_reg) & ~(1 << clk->enable_bit), | 19 | if (clk->flags & CLK_ENABLE_REG_8BIT) |
| 19 | clk->mapped_reg); | 20 | return ioread8(clk->mapped_reg); |
| 21 | else if (clk->flags & CLK_ENABLE_REG_16BIT) | ||
| 22 | return ioread16(clk->mapped_reg); | ||
| 23 | |||
| 24 | return ioread32(clk->mapped_reg); | ||
| 25 | } | ||
| 26 | |||
| 27 | static void sh_clk_write(int value, struct clk *clk) | ||
| 28 | { | ||
| 29 | if (clk->flags & CLK_ENABLE_REG_8BIT) | ||
| 30 | iowrite8(value, clk->mapped_reg); | ||
| 31 | else if (clk->flags & CLK_ENABLE_REG_16BIT) | ||
| 32 | iowrite16(value, clk->mapped_reg); | ||
| 33 | else | ||
| 34 | iowrite32(value, clk->mapped_reg); | ||
| 35 | } | ||
| 36 | |||
| 37 | static int sh_clk_mstp_enable(struct clk *clk) | ||
| 38 | { | ||
| 39 | sh_clk_write(sh_clk_read(clk) & ~(1 << clk->enable_bit), clk); | ||
| 20 | return 0; | 40 | return 0; |
| 21 | } | 41 | } |
| 22 | 42 | ||
| 23 | static void sh_clk_mstp32_disable(struct clk *clk) | 43 | static void sh_clk_mstp_disable(struct clk *clk) |
| 24 | { | 44 | { |
| 25 | iowrite32(ioread32(clk->mapped_reg) | (1 << clk->enable_bit), | 45 | sh_clk_write(sh_clk_read(clk) | (1 << clk->enable_bit), clk); |
| 26 | clk->mapped_reg); | ||
| 27 | } | 46 | } |
| 28 | 47 | ||
| 29 | static struct sh_clk_ops sh_clk_mstp32_clk_ops = { | 48 | static struct sh_clk_ops sh_clk_mstp_clk_ops = { |
| 30 | .enable = sh_clk_mstp32_enable, | 49 | .enable = sh_clk_mstp_enable, |
| 31 | .disable = sh_clk_mstp32_disable, | 50 | .disable = sh_clk_mstp_disable, |
| 32 | .recalc = followparent_recalc, | 51 | .recalc = followparent_recalc, |
| 33 | }; | 52 | }; |
| 34 | 53 | ||
| 35 | int __init sh_clk_mstp32_register(struct clk *clks, int nr) | 54 | int __init sh_clk_mstp_register(struct clk *clks, int nr) |
| 36 | { | 55 | { |
| 37 | struct clk *clkp; | 56 | struct clk *clkp; |
| 38 | int ret = 0; | 57 | int ret = 0; |
| @@ -40,7 +59,7 @@ int __init sh_clk_mstp32_register(struct clk *clks, int nr) | |||
| 40 | 59 | ||
| 41 | for (k = 0; !ret && (k < nr); k++) { | 60 | for (k = 0; !ret && (k < nr); k++) { |
| 42 | clkp = clks + k; | 61 | clkp = clks + k; |
| 43 | clkp->ops = &sh_clk_mstp32_clk_ops; | 62 | clkp->ops = &sh_clk_mstp_clk_ops; |
| 44 | ret |= clk_register(clkp); | 63 | ret |= clk_register(clkp); |
| 45 | } | 64 | } |
| 46 | 65 | ||
| @@ -72,7 +91,7 @@ static unsigned long sh_clk_div6_recalc(struct clk *clk) | |||
| 72 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | 91 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, |
| 73 | table, NULL); | 92 | table, NULL); |
| 74 | 93 | ||
| 75 | idx = ioread32(clk->mapped_reg) & 0x003f; | 94 | idx = sh_clk_read(clk) & 0x003f; |
| 76 | 95 | ||
| 77 | return clk->freq_table[idx].frequency; | 96 | return clk->freq_table[idx].frequency; |
| 78 | } | 97 | } |
| @@ -98,10 +117,10 @@ static int sh_clk_div6_set_parent(struct clk *clk, struct clk *parent) | |||
| 98 | if (ret < 0) | 117 | if (ret < 0) |
| 99 | return ret; | 118 | return ret; |
| 100 | 119 | ||
| 101 | value = ioread32(clk->mapped_reg) & | 120 | value = sh_clk_read(clk) & |
| 102 | ~(((1 << clk->src_width) - 1) << clk->src_shift); | 121 | ~(((1 << clk->src_width) - 1) << clk->src_shift); |
| 103 | 122 | ||
| 104 | iowrite32(value | (i << clk->src_shift), clk->mapped_reg); | 123 | sh_clk_write(value | (i << clk->src_shift), clk); |
| 105 | 124 | ||
| 106 | /* Rebuild the frequency table */ | 125 | /* Rebuild the frequency table */ |
| 107 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | 126 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, |
| @@ -119,10 +138,10 @@ static int sh_clk_div6_set_rate(struct clk *clk, unsigned long rate) | |||
| 119 | if (idx < 0) | 138 | if (idx < 0) |
| 120 | return idx; | 139 | return idx; |
| 121 | 140 | ||
| 122 | value = ioread32(clk->mapped_reg); | 141 | value = sh_clk_read(clk); |
| 123 | value &= ~0x3f; | 142 | value &= ~0x3f; |
| 124 | value |= idx; | 143 | value |= idx; |
| 125 | iowrite32(value, clk->mapped_reg); | 144 | sh_clk_write(value, clk); |
| 126 | return 0; | 145 | return 0; |
| 127 | } | 146 | } |
| 128 | 147 | ||
| @@ -133,9 +152,9 @@ static int sh_clk_div6_enable(struct clk *clk) | |||
| 133 | 152 | ||
| 134 | ret = sh_clk_div6_set_rate(clk, clk->rate); | 153 | ret = sh_clk_div6_set_rate(clk, clk->rate); |
| 135 | if (ret == 0) { | 154 | if (ret == 0) { |
| 136 | value = ioread32(clk->mapped_reg); | 155 | value = sh_clk_read(clk); |
| 137 | value &= ~0x100; /* clear stop bit to enable clock */ | 156 | value &= ~0x100; /* clear stop bit to enable clock */ |
| 138 | iowrite32(value, clk->mapped_reg); | 157 | sh_clk_write(value, clk); |
| 139 | } | 158 | } |
| 140 | return ret; | 159 | return ret; |
| 141 | } | 160 | } |
| @@ -144,10 +163,10 @@ static void sh_clk_div6_disable(struct clk *clk) | |||
| 144 | { | 163 | { |
| 145 | unsigned long value; | 164 | unsigned long value; |
| 146 | 165 | ||
| 147 | value = ioread32(clk->mapped_reg); | 166 | value = sh_clk_read(clk); |
| 148 | value |= 0x100; /* stop clock */ | 167 | value |= 0x100; /* stop clock */ |
| 149 | value |= 0x3f; /* VDIV bits must be non-zero, overwrite divider */ | 168 | value |= 0x3f; /* VDIV bits must be non-zero, overwrite divider */ |
| 150 | iowrite32(value, clk->mapped_reg); | 169 | sh_clk_write(value, clk); |
| 151 | } | 170 | } |
| 152 | 171 | ||
| 153 | static struct sh_clk_ops sh_clk_div6_clk_ops = { | 172 | static struct sh_clk_ops sh_clk_div6_clk_ops = { |
| @@ -182,7 +201,7 @@ static int __init sh_clk_init_parent(struct clk *clk) | |||
| 182 | return -EINVAL; | 201 | return -EINVAL; |
| 183 | } | 202 | } |
| 184 | 203 | ||
| 185 | val = (ioread32(clk->mapped_reg) >> clk->src_shift); | 204 | val = (sh_clk_read(clk) >> clk->src_shift); |
| 186 | val &= (1 << clk->src_width) - 1; | 205 | val &= (1 << clk->src_width) - 1; |
| 187 | 206 | ||
| 188 | if (val >= clk->parent_num) { | 207 | if (val >= clk->parent_num) { |
| @@ -252,7 +271,7 @@ static unsigned long sh_clk_div4_recalc(struct clk *clk) | |||
| 252 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | 271 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, |
| 253 | table, &clk->arch_flags); | 272 | table, &clk->arch_flags); |
| 254 | 273 | ||
| 255 | idx = (ioread32(clk->mapped_reg) >> clk->enable_bit) & 0x000f; | 274 | idx = (sh_clk_read(clk) >> clk->enable_bit) & 0x000f; |
| 256 | 275 | ||
| 257 | return clk->freq_table[idx].frequency; | 276 | return clk->freq_table[idx].frequency; |
| 258 | } | 277 | } |
| @@ -270,15 +289,15 @@ static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent) | |||
| 270 | */ | 289 | */ |
| 271 | 290 | ||
| 272 | if (parent->flags & CLK_ENABLE_ON_INIT) | 291 | if (parent->flags & CLK_ENABLE_ON_INIT) |
| 273 | value = ioread32(clk->mapped_reg) & ~(1 << 7); | 292 | value = sh_clk_read(clk) & ~(1 << 7); |
| 274 | else | 293 | else |
| 275 | value = ioread32(clk->mapped_reg) | (1 << 7); | 294 | value = sh_clk_read(clk) | (1 << 7); |
| 276 | 295 | ||
| 277 | ret = clk_reparent(clk, parent); | 296 | ret = clk_reparent(clk, parent); |
| 278 | if (ret < 0) | 297 | if (ret < 0) |
| 279 | return ret; | 298 | return ret; |
| 280 | 299 | ||
| 281 | iowrite32(value, clk->mapped_reg); | 300 | sh_clk_write(value, clk); |
| 282 | 301 | ||
| 283 | /* Rebiuld the frequency table */ | 302 | /* Rebiuld the frequency table */ |
| 284 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, | 303 | clk_rate_table_build(clk, clk->freq_table, table->nr_divisors, |
| @@ -295,10 +314,10 @@ static int sh_clk_div4_set_rate(struct clk *clk, unsigned long rate) | |||
| 295 | if (idx < 0) | 314 | if (idx < 0) |
| 296 | return idx; | 315 | return idx; |
| 297 | 316 | ||
| 298 | value = ioread32(clk->mapped_reg); | 317 | value = sh_clk_read(clk); |
| 299 | value &= ~(0xf << clk->enable_bit); | 318 | value &= ~(0xf << clk->enable_bit); |
| 300 | value |= (idx << clk->enable_bit); | 319 | value |= (idx << clk->enable_bit); |
| 301 | iowrite32(value, clk->mapped_reg); | 320 | sh_clk_write(value, clk); |
| 302 | 321 | ||
| 303 | if (d4t->kick) | 322 | if (d4t->kick) |
| 304 | d4t->kick(clk); | 323 | d4t->kick(clk); |
| @@ -308,13 +327,13 @@ static int sh_clk_div4_set_rate(struct clk *clk, unsigned long rate) | |||
| 308 | 327 | ||
| 309 | static int sh_clk_div4_enable(struct clk *clk) | 328 | static int sh_clk_div4_enable(struct clk *clk) |
| 310 | { | 329 | { |
| 311 | iowrite32(ioread32(clk->mapped_reg) & ~(1 << 8), clk->mapped_reg); | 330 | sh_clk_write(sh_clk_read(clk) & ~(1 << 8), clk); |
| 312 | return 0; | 331 | return 0; |
| 313 | } | 332 | } |
| 314 | 333 | ||
| 315 | static void sh_clk_div4_disable(struct clk *clk) | 334 | static void sh_clk_div4_disable(struct clk *clk) |
| 316 | { | 335 | { |
| 317 | iowrite32(ioread32(clk->mapped_reg) | (1 << 8), clk->mapped_reg); | 336 | sh_clk_write(sh_clk_read(clk) | (1 << 8), clk); |
| 318 | } | 337 | } |
| 319 | 338 | ||
| 320 | static struct sh_clk_ops sh_clk_div4_clk_ops = { | 339 | static struct sh_clk_ops sh_clk_div4_clk_ops = { |
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 052b43e4e505..b91e4bc332a7 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c | |||
| @@ -55,7 +55,6 @@ static int lowmem_minfree[6] = { | |||
| 55 | }; | 55 | }; |
| 56 | static int lowmem_minfree_size = 4; | 56 | static int lowmem_minfree_size = 4; |
| 57 | 57 | ||
| 58 | static struct task_struct *lowmem_deathpending; | ||
| 59 | static unsigned long lowmem_deathpending_timeout; | 58 | static unsigned long lowmem_deathpending_timeout; |
| 60 | 59 | ||
| 61 | #define lowmem_print(level, x...) \ | 60 | #define lowmem_print(level, x...) \ |
| @@ -64,24 +63,6 @@ static unsigned long lowmem_deathpending_timeout; | |||
| 64 | printk(x); \ | 63 | printk(x); \ |
| 65 | } while (0) | 64 | } while (0) |
| 66 | 65 | ||
| 67 | static int | ||
| 68 | task_notify_func(struct notifier_block *self, unsigned long val, void *data); | ||
| 69 | |||
| 70 | static struct notifier_block task_nb = { | ||
| 71 | .notifier_call = task_notify_func, | ||
| 72 | }; | ||
| 73 | |||
| 74 | static int | ||
| 75 | task_notify_func(struct notifier_block *self, unsigned long val, void *data) | ||
| 76 | { | ||
| 77 | struct task_struct *task = data; | ||
| 78 | |||
| 79 | if (task == lowmem_deathpending) | ||
| 80 | lowmem_deathpending = NULL; | ||
| 81 | |||
| 82 | return NOTIFY_OK; | ||
| 83 | } | ||
| 84 | |||
| 85 | static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | 66 | static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) |
| 86 | { | 67 | { |
| 87 | struct task_struct *tsk; | 68 | struct task_struct *tsk; |
| @@ -97,19 +78,6 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | |||
| 97 | int other_file = global_page_state(NR_FILE_PAGES) - | 78 | int other_file = global_page_state(NR_FILE_PAGES) - |
| 98 | global_page_state(NR_SHMEM); | 79 | global_page_state(NR_SHMEM); |
| 99 | 80 | ||
| 100 | /* | ||
| 101 | * If we already have a death outstanding, then | ||
| 102 | * bail out right away; indicating to vmscan | ||
| 103 | * that we have nothing further to offer on | ||
| 104 | * this pass. | ||
| 105 | * | ||
| 106 | * Note: Currently you need CONFIG_PROFILING | ||
| 107 | * for this to work correctly. | ||
| 108 | */ | ||
| 109 | if (lowmem_deathpending && | ||
| 110 | time_before_eq(jiffies, lowmem_deathpending_timeout)) | ||
| 111 | return 0; | ||
| 112 | |||
| 113 | if (lowmem_adj_size < array_size) | 81 | if (lowmem_adj_size < array_size) |
| 114 | array_size = lowmem_adj_size; | 82 | array_size = lowmem_adj_size; |
| 115 | if (lowmem_minfree_size < array_size) | 83 | if (lowmem_minfree_size < array_size) |
| @@ -148,6 +116,12 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | |||
| 148 | if (!p) | 116 | if (!p) |
| 149 | continue; | 117 | continue; |
| 150 | 118 | ||
| 119 | if (test_tsk_thread_flag(p, TIF_MEMDIE) && | ||
| 120 | time_before_eq(jiffies, lowmem_deathpending_timeout)) { | ||
| 121 | task_unlock(p); | ||
| 122 | rcu_read_unlock(); | ||
| 123 | return 0; | ||
| 124 | } | ||
| 151 | oom_score_adj = p->signal->oom_score_adj; | 125 | oom_score_adj = p->signal->oom_score_adj; |
| 152 | if (oom_score_adj < min_score_adj) { | 126 | if (oom_score_adj < min_score_adj) { |
| 153 | task_unlock(p); | 127 | task_unlock(p); |
| @@ -174,15 +148,9 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) | |||
| 174 | lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n", | 148 | lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n", |
| 175 | selected->pid, selected->comm, | 149 | selected->pid, selected->comm, |
| 176 | selected_oom_score_adj, selected_tasksize); | 150 | selected_oom_score_adj, selected_tasksize); |
| 177 | /* | ||
| 178 | * If CONFIG_PROFILING is off, then we don't want to stall | ||
| 179 | * the killer by setting lowmem_deathpending. | ||
| 180 | */ | ||
| 181 | #ifdef CONFIG_PROFILING | ||
| 182 | lowmem_deathpending = selected; | ||
| 183 | lowmem_deathpending_timeout = jiffies + HZ; | 151 | lowmem_deathpending_timeout = jiffies + HZ; |
| 184 | #endif | ||
| 185 | send_sig(SIGKILL, selected, 0); | 152 | send_sig(SIGKILL, selected, 0); |
| 153 | set_tsk_thread_flag(selected, TIF_MEMDIE); | ||
| 186 | rem -= selected_tasksize; | 154 | rem -= selected_tasksize; |
| 187 | } | 155 | } |
| 188 | lowmem_print(4, "lowmem_shrink %lu, %x, return %d\n", | 156 | lowmem_print(4, "lowmem_shrink %lu, %x, return %d\n", |
| @@ -198,7 +166,6 @@ static struct shrinker lowmem_shrinker = { | |||
| 198 | 166 | ||
| 199 | static int __init lowmem_init(void) | 167 | static int __init lowmem_init(void) |
| 200 | { | 168 | { |
| 201 | task_handoff_register(&task_nb); | ||
| 202 | register_shrinker(&lowmem_shrinker); | 169 | register_shrinker(&lowmem_shrinker); |
| 203 | return 0; | 170 | return 0; |
| 204 | } | 171 | } |
| @@ -206,7 +173,6 @@ static int __init lowmem_init(void) | |||
| 206 | static void __exit lowmem_exit(void) | 173 | static void __exit lowmem_exit(void) |
| 207 | { | 174 | { |
| 208 | unregister_shrinker(&lowmem_shrinker); | 175 | unregister_shrinker(&lowmem_shrinker); |
| 209 | task_handoff_unregister(&task_nb); | ||
| 210 | } | 176 | } |
| 211 | 177 | ||
| 212 | module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); | 178 | module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); |
diff --git a/include/linux/sh_clk.h b/include/linux/sh_clk.h index 0a9d8f2ac519..c513b73cd7cb 100644 --- a/include/linux/sh_clk.h +++ b/include/linux/sh_clk.h | |||
| @@ -59,7 +59,15 @@ struct clk { | |||
| 59 | unsigned int nr_freqs; | 59 | unsigned int nr_freqs; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | #define CLK_ENABLE_ON_INIT (1 << 0) | 62 | #define CLK_ENABLE_ON_INIT BIT(0) |
| 63 | |||
| 64 | #define CLK_ENABLE_REG_32BIT BIT(1) /* default access size */ | ||
| 65 | #define CLK_ENABLE_REG_16BIT BIT(2) | ||
| 66 | #define CLK_ENABLE_REG_8BIT BIT(3) | ||
| 67 | |||
| 68 | #define CLK_ENABLE_REG_MASK (CLK_ENABLE_REG_32BIT | \ | ||
| 69 | CLK_ENABLE_REG_16BIT | \ | ||
| 70 | CLK_ENABLE_REG_8BIT) | ||
| 63 | 71 | ||
| 64 | /* drivers/sh/clk.c */ | 72 | /* drivers/sh/clk.c */ |
| 65 | unsigned long followparent_recalc(struct clk *); | 73 | unsigned long followparent_recalc(struct clk *); |
| @@ -102,7 +110,7 @@ long clk_round_parent(struct clk *clk, unsigned long target, | |||
| 102 | unsigned long *best_freq, unsigned long *parent_freq, | 110 | unsigned long *best_freq, unsigned long *parent_freq, |
| 103 | unsigned int div_min, unsigned int div_max); | 111 | unsigned int div_min, unsigned int div_max); |
| 104 | 112 | ||
| 105 | #define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags) \ | 113 | #define SH_CLK_MSTP(_parent, _enable_reg, _enable_bit, _flags) \ |
| 106 | { \ | 114 | { \ |
| 107 | .parent = _parent, \ | 115 | .parent = _parent, \ |
| 108 | .enable_reg = (void __iomem *)_enable_reg, \ | 116 | .enable_reg = (void __iomem *)_enable_reg, \ |
| @@ -110,7 +118,27 @@ long clk_round_parent(struct clk *clk, unsigned long target, | |||
| 110 | .flags = _flags, \ | 118 | .flags = _flags, \ |
| 111 | } | 119 | } |
| 112 | 120 | ||
| 113 | int sh_clk_mstp32_register(struct clk *clks, int nr); | 121 | #define SH_CLK_MSTP32(_p, _r, _b, _f) \ |
| 122 | SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_32BIT) | ||
| 123 | |||
| 124 | #define SH_CLK_MSTP16(_p, _r, _b, _f) \ | ||
| 125 | SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_16BIT) | ||
| 126 | |||
| 127 | #define SH_CLK_MSTP8(_p, _r, _b, _f) \ | ||
| 128 | SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_8BIT) | ||
| 129 | |||
| 130 | int sh_clk_mstp_register(struct clk *clks, int nr); | ||
| 131 | |||
| 132 | /* | ||
| 133 | * MSTP registration never really cared about access size, despite the | ||
| 134 | * original enable/disable pairs assuming a 32-bit access. Clocks are | ||
| 135 | * responsible for defining their access sizes either directly or via the | ||
| 136 | * clock definition wrappers. | ||
| 137 | */ | ||
| 138 | static inline int __deprecated sh_clk_mstp32_register(struct clk *clks, int nr) | ||
| 139 | { | ||
| 140 | return sh_clk_mstp_register(clks, nr); | ||
| 141 | } | ||
| 114 | 142 | ||
| 115 | #define SH_CLK_DIV4(_parent, _reg, _shift, _div_bitmap, _flags) \ | 143 | #define SH_CLK_DIV4(_parent, _reg, _shift, _div_bitmap, _flags) \ |
| 116 | { \ | 144 | { \ |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 3f01fd908730..c4e7d1510f9d 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -132,8 +132,10 @@ static struct module *new_module(char *modname) | |||
| 132 | /* strip trailing .o */ | 132 | /* strip trailing .o */ |
| 133 | s = strrchr(p, '.'); | 133 | s = strrchr(p, '.'); |
| 134 | if (s != NULL) | 134 | if (s != NULL) |
| 135 | if (strcmp(s, ".o") == 0) | 135 | if (strcmp(s, ".o") == 0) { |
| 136 | *s = '\0'; | 136 | *s = '\0'; |
| 137 | mod->is_dot_o = 1; | ||
| 138 | } | ||
| 137 | 139 | ||
| 138 | /* add to list */ | 140 | /* add to list */ |
| 139 | mod->name = p; | 141 | mod->name = p; |
| @@ -587,7 +589,8 @@ static void handle_modversions(struct module *mod, struct elf_info *info, | |||
| 587 | unsigned int crc; | 589 | unsigned int crc; |
| 588 | enum export export; | 590 | enum export export; |
| 589 | 591 | ||
| 590 | if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0) | 592 | if ((!is_vmlinux(mod->name) || mod->is_dot_o) && |
| 593 | strncmp(symname, "__ksymtab", 9) == 0) | ||
| 591 | export = export_from_secname(info, get_secindex(info, sym)); | 594 | export = export_from_secname(info, get_secindex(info, sym)); |
| 592 | else | 595 | else |
| 593 | export = export_from_sec(info, get_secindex(info, sym)); | 596 | export = export_from_sec(info, get_secindex(info, sym)); |
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 2031119080dc..51207e4d5f8b 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h | |||
| @@ -113,6 +113,7 @@ struct module { | |||
| 113 | int has_cleanup; | 113 | int has_cleanup; |
| 114 | struct buffer dev_table_buf; | 114 | struct buffer dev_table_buf; |
| 115 | char srcversion[25]; | 115 | char srcversion[25]; |
| 116 | int is_dot_o; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | struct elf_info { | 119 | struct elf_info { |
