Merge tag 'sh-for-linus' of git://github.com/pmundt/linux-sh
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 30 Mar 2012 07:09:17 +0000 (00:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 30 Mar 2012 07:09:17 +0000 (00:09 -0700)
Pull SuperH updates from Paul Mundt.

* tag 'sh-for-linus' of git://github.com/pmundt/linux-sh: (25 commits)
  sh: Support I/O space swapping where needed.
  sh: use set_current_blocked() and block_sigmask()
  sh: no need to reset handler if SA_ONESHOT
  sh: intc: Fix up section mismatch for intc_ack_data
  sh: select ARCH_DISCARD_MEMBLOCK.
  sh: Consolidate duplicate _32/_64 unistd definitions.
  sh: ecovec: switch SDHI controllers to card polling
  sh: Avoid exporting unimplemented syscalls.
  sh: add platform_device for RSPI in setup-sh7757
  SH: pci-sh7780: enable big-endian operation.
  serial: sh-sci: fix a race of DMA submit_tx on transfer
  sh: dma: Collect up CHCR of SH7763, SH7764, SH7780 and SH7785
  sh: dma: Collect up CHCR of SH7723 and SH7730
  sh/next: Fix build fail by asm/system.h in asm/bitops.h
  arch/sh/drivers/dma/{dma-g2,dmabrg}.c: ensure arguments to request_irq and free_irq are compatible
  sh: cpufreq: Wire up scaling_available_freqs support.
  sh: cpufreq: notify about rate rounding fallback.
  sh: cpufreq: Support CPU clock frequency table.
  sh: cpufreq: struct device lookup from CPU topology.
  sh: cpufreq: percpu struct clk accounting.
  ...

22 files changed:
arch/sh/Kconfig
arch/sh/boards/mach-ecovec24/setup.c
arch/sh/drivers/dma/dma-g2.c
arch/sh/drivers/dma/dmabrg.c
arch/sh/drivers/pci/pci-sh7780.c
arch/sh/include/asm/io.h
arch/sh/include/asm/unistd.h
arch/sh/include/asm/unistd_32.h
arch/sh/include/asm/unistd_64.h
arch/sh/include/cpu-sh4/cpu/dma-register.h
arch/sh/include/mach-common/mach/mangle-port.h [new file with mode: 0644]
arch/sh/kernel/cpu/sh4a/setup-sh7757.c
arch/sh/kernel/cpufreq.c
arch/sh/kernel/signal_32.c
arch/sh/kernel/signal_64.c
arch/sh/kernel/syscalls_32.S
arch/sh/kernel/syscalls_64.S
drivers/sh/intc/chip.c
drivers/sh/intc/core.c
drivers/sh/intc/handle.c
drivers/sh/intc/internals.h
drivers/tty/serial/sh-sci.c

index b190eb17a75beb088f90a2b5eccdcbaf13c506b7..ff9e033ce626774fe5b0ad7ddf1c199fe7789471 100644 (file)
@@ -5,6 +5,7 @@ config SUPERH
        select HAVE_IDE if HAS_IOPORT
        select HAVE_MEMBLOCK
        select HAVE_MEMBLOCK_NODE_MAP
+       select ARCH_DISCARD_MEMBLOCK
        select HAVE_OPROFILE
        select HAVE_GENERIC_DMA_COHERENT
        select HAVE_ARCH_TRACEHOOK
@@ -161,6 +162,9 @@ config NO_IOPORT
 config IO_TRAPPED
        bool
 
+config SWAP_IO_SPACE
+       bool
+
 config DMA_COHERENT
        bool
 
index e5ac12b2ce656f6b7037dd53ed07223b20d61dbb..d12fe9ddf3da1a914562b104669273e9b99c28c3 100644 (file)
@@ -522,11 +522,18 @@ static void sdhi0_set_pwr(struct platform_device *pdev, int state)
        gpio_set_value(GPIO_PTB6, state);
 }
 
+static int sdhi0_get_cd(struct platform_device *pdev)
+{
+       return !gpio_get_value(GPIO_PTY7);
+}
+
 static struct sh_mobile_sdhi_info sdhi0_info = {
        .dma_slave_tx   = SHDMA_SLAVE_SDHI0_TX,
        .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
        .set_pwr        = sdhi0_set_pwr,
-       .tmio_caps      = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD,
+       .tmio_caps      = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
+                         MMC_CAP_NEEDS_POLL,
+       .get_cd         = sdhi0_get_cd,
 };
 
 static struct resource sdhi0_resources[] = {
@@ -559,11 +566,18 @@ static void sdhi1_set_pwr(struct platform_device *pdev, int state)
        gpio_set_value(GPIO_PTB7, state);
 }
 
+static int sdhi1_get_cd(struct platform_device *pdev)
+{
+       return !gpio_get_value(GPIO_PTW7);
+}
+
 static struct sh_mobile_sdhi_info sdhi1_info = {
        .dma_slave_tx   = SHDMA_SLAVE_SDHI1_TX,
        .dma_slave_rx   = SHDMA_SLAVE_SDHI1_RX,
-       .tmio_caps      = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD,
+       .tmio_caps      = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
+                         MMC_CAP_NEEDS_POLL,
        .set_pwr        = sdhi1_set_pwr,
+       .get_cd         = sdhi1_get_cd,
 };
 
 static struct resource sdhi1_resources[] = {
@@ -1001,6 +1015,7 @@ extern char ecovec24_sdram_leave_end;
 static int __init arch_setup(void)
 {
        struct clk *clk;
+       bool cn12_enabled = false;
 
        /* register board specific self-refresh code */
        sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
@@ -1201,9 +1216,13 @@ static int __init arch_setup(void)
        gpio_direction_input(GPIO_PTR5);
        gpio_direction_input(GPIO_PTR6);
 
+       /* SD-card slot CN11 */
+       /* Card-detect, used on CN11, either with SDHI0 or with SPI */
+       gpio_request(GPIO_PTY7, NULL);
+       gpio_direction_input(GPIO_PTY7);
+
 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
        /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */
-       gpio_request(GPIO_FN_SDHI0CD,  NULL);
        gpio_request(GPIO_FN_SDHI0WP,  NULL);
        gpio_request(GPIO_FN_SDHI0CMD, NULL);
        gpio_request(GPIO_FN_SDHI0CLK, NULL);
@@ -1213,23 +1232,6 @@ static int __init arch_setup(void)
        gpio_request(GPIO_FN_SDHI0D0,  NULL);
        gpio_request(GPIO_PTB6, NULL);
        gpio_direction_output(GPIO_PTB6, 0);
-
-#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
-       /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */
-       gpio_request(GPIO_FN_SDHI1CD,  NULL);
-       gpio_request(GPIO_FN_SDHI1WP,  NULL);
-       gpio_request(GPIO_FN_SDHI1CMD, NULL);
-       gpio_request(GPIO_FN_SDHI1CLK, NULL);
-       gpio_request(GPIO_FN_SDHI1D3,  NULL);
-       gpio_request(GPIO_FN_SDHI1D2,  NULL);
-       gpio_request(GPIO_FN_SDHI1D1,  NULL);
-       gpio_request(GPIO_FN_SDHI1D0,  NULL);
-       gpio_request(GPIO_PTB7, NULL);
-       gpio_direction_output(GPIO_PTB7, 0);
-
-       /* I/O buffer drive ability is high for SDHI1 */
-       __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA);
-#endif /* CONFIG_MMC_SH_MMCIF */
 #else
        /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */
        gpio_request(GPIO_FN_MSIOF0_TXD, NULL);
@@ -1241,12 +1243,51 @@ static int __init arch_setup(void)
        gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
        gpio_request(GPIO_PTY6, NULL); /* write protect */
        gpio_direction_input(GPIO_PTY6);
-       gpio_request(GPIO_PTY7, NULL); /* card detect */
-       gpio_direction_input(GPIO_PTY7);
 
        spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
 #endif
 
+       /* MMC/SD-card slot CN12 */
+#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
+       /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */
+       gpio_request(GPIO_FN_MMC_D7, NULL);
+       gpio_request(GPIO_FN_MMC_D6, NULL);
+       gpio_request(GPIO_FN_MMC_D5, NULL);
+       gpio_request(GPIO_FN_MMC_D4, NULL);
+       gpio_request(GPIO_FN_MMC_D3, NULL);
+       gpio_request(GPIO_FN_MMC_D2, NULL);
+       gpio_request(GPIO_FN_MMC_D1, NULL);
+       gpio_request(GPIO_FN_MMC_D0, NULL);
+       gpio_request(GPIO_FN_MMC_CLK, NULL);
+       gpio_request(GPIO_FN_MMC_CMD, NULL);
+       gpio_request(GPIO_PTB7, NULL);
+       gpio_direction_output(GPIO_PTB7, 0);
+
+       cn12_enabled = true;
+#elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
+       /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */
+       gpio_request(GPIO_FN_SDHI1WP,  NULL);
+       gpio_request(GPIO_FN_SDHI1CMD, NULL);
+       gpio_request(GPIO_FN_SDHI1CLK, NULL);
+       gpio_request(GPIO_FN_SDHI1D3,  NULL);
+       gpio_request(GPIO_FN_SDHI1D2,  NULL);
+       gpio_request(GPIO_FN_SDHI1D1,  NULL);
+       gpio_request(GPIO_FN_SDHI1D0,  NULL);
+       gpio_request(GPIO_PTB7, NULL);
+       gpio_direction_output(GPIO_PTB7, 0);
+
+       /* Card-detect, used on CN12 with SDHI1 */
+       gpio_request(GPIO_PTW7, NULL);
+       gpio_direction_input(GPIO_PTW7);
+
+       cn12_enabled = true;
+#endif
+
+       if (cn12_enabled)
+               /* I/O buffer drive ability is high for CN12 */
+               __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000,
+                            IODRIVEA);
+
        /* enable Video */
        gpio_request(GPIO_PTU2, NULL);
        gpio_direction_output(GPIO_PTU2, 1);
@@ -1305,25 +1346,6 @@ static int __init arch_setup(void)
        gpio_request(GPIO_PTU5, NULL);
        gpio_direction_output(GPIO_PTU5, 0);
 
-#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
-       /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */
-       gpio_request(GPIO_FN_MMC_D7, NULL);
-       gpio_request(GPIO_FN_MMC_D6, NULL);
-       gpio_request(GPIO_FN_MMC_D5, NULL);
-       gpio_request(GPIO_FN_MMC_D4, NULL);
-       gpio_request(GPIO_FN_MMC_D3, NULL);
-       gpio_request(GPIO_FN_MMC_D2, NULL);
-       gpio_request(GPIO_FN_MMC_D1, NULL);
-       gpio_request(GPIO_FN_MMC_D0, NULL);
-       gpio_request(GPIO_FN_MMC_CLK, NULL);
-       gpio_request(GPIO_FN_MMC_CMD, NULL);
-       gpio_request(GPIO_PTB7, NULL);
-       gpio_direction_output(GPIO_PTB7, 0);
-
-       /* I/O buffer drive ability is high for MMCIF */
-       __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000 , IODRIVEA);
-#endif
-
        /* enable I2C device */
        i2c_register_board_info(0, i2c0_devices,
                                ARRAY_SIZE(i2c0_devices));
index be9ca7ca0ce40a028793fa597903470e17e60fd3..e1ab6eb3c04bbabd114e310562c27d25a2ccc0d4 100644 (file)
@@ -181,14 +181,14 @@ static int __init g2_dma_init(void)
 
        ret = register_dmac(&g2_dma_info);
        if (unlikely(ret != 0))
-               free_irq(HW_EVENT_G2_DMA, 0);
+               free_irq(HW_EVENT_G2_DMA, &g2_dma_info);
 
        return ret;
 }
 
 static void __exit g2_dma_exit(void)
 {
-       free_irq(HW_EVENT_G2_DMA, 0);
+       free_irq(HW_EVENT_G2_DMA, &g2_dma_info);
        unregister_dmac(&g2_dma_info);
 }
 
index 3d66a32ce610dd60770081cee2dd149e9b665b9c..c0dd904483c76ffb4d1d53a4f53ac29974b393cf 100644 (file)
@@ -189,8 +189,8 @@ static int __init dmabrg_init(void)
        if (ret == 0)
                return ret;
 
-       free_irq(DMABRGI1, 0);
-out1:  free_irq(DMABRGI0, 0);
+       free_irq(DMABRGI1, NULL);
+out1:  free_irq(DMABRGI0, NULL);
 out0:  kfree(dmabrg_handlers);
        return ret;
 }
index fb8f149907433498d183dda7a7ae9170305f2b14..5a6dab6e27d96deb24353f1e4630594825dc545f 100644 (file)
 #include <asm/mmu.h>
 #include <asm/sizes.h>
 
+#if defined(CONFIG_CPU_BIG_ENDIAN)
+# define PCICR_ENDIANNESS SH4_PCICR_BSWP
+#else
+# define PCICR_ENDIANNESS 0
+#endif
+
+
 static struct resource sh7785_pci_resources[] = {
        {
                .name   = "PCI IO",
@@ -254,7 +261,7 @@ static int __init sh7780_pci_init(void)
        __raw_writel(PCIECR_ENBL, PCIECR);
 
        /* Reset */
-       __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_PRST,
+       __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_PRST | PCICR_ENDIANNESS,
                     chan->reg_base + SH4_PCICR);
 
        /*
@@ -290,7 +297,8 @@ static int __init sh7780_pci_init(void)
         * Now throw it in to register initialization mode and
         * start the real work.
         */
-       __raw_writel(SH4_PCICR_PREFIX, chan->reg_base + SH4_PCICR);
+       __raw_writel(SH4_PCICR_PREFIX | PCICR_ENDIANNESS,
+                    chan->reg_base + SH4_PCICR);
 
        memphys = __pa(memory_start);
        memsize = roundup_pow_of_two(memory_end - memory_start);
@@ -380,7 +388,8 @@ static int __init sh7780_pci_init(void)
         * Initialization mode complete, release the control register and
         * enable round robin mode to stop device overruns/starvation.
         */
-       __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO,
+       __raw_writel(SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO |
+                    PCICR_ENDIANNESS,
                     chan->reg_base + SH4_PCICR);
 
        ret = register_pci_controller(chan);
index 35fc8b077cb1c25048e7c697ea34b979f62e93f4..ec464a6b95fe2cbd790bd63c17302a533f239a6e 100644 (file)
@@ -23,6 +23,7 @@
 #define __IO_PREFIX     generic
 #include <asm/io_generic.h>
 #include <asm/io_trapped.h>
+#include <mach/mangle-port.h>
 
 #define __raw_writeb(v,a)      (__chk_io_ptr(a), *(volatile u8  __force *)(a) = (v))
 #define __raw_writew(v,a)      (__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v))
 #define __raw_readl(a)         (__chk_io_ptr(a), *(volatile u32 __force *)(a))
 #define __raw_readq(a)         (__chk_io_ptr(a), *(volatile u64 __force *)(a))
 
-#define readb_relaxed(c)       ({ u8  __v = __raw_readb(c); __v; })
-#define readw_relaxed(c)       ({ u16 __v = le16_to_cpu((__force __le16) \
-                                       __raw_readw(c)); __v; })
-#define readl_relaxed(c)       ({ u32 __v = le32_to_cpu((__force __le32) \
-                                       __raw_readl(c)); __v; })
-#define readq_relaxed(c)       ({ u64 __v = le64_to_cpu((__force __le64) \
-                                       __raw_readq(c)); __v; })
-
-#define writeb_relaxed(v,c)    ((void)__raw_writeb(v,c))
-#define writew_relaxed(v,c)    ((void)__raw_writew((__force u16) \
-                                       cpu_to_le16(v),c))
-#define writel_relaxed(v,c)    ((void)__raw_writel((__force u32) \
-                                       cpu_to_le32(v),c))
-#define writeq_relaxed(v,c)    ((void)__raw_writeq((__force u64) \
-                                       cpu_to_le64(v),c))
+#define readb_relaxed(c)       ({ u8  __v = ioswabb(__raw_readb(c)); __v; })
+#define readw_relaxed(c)       ({ u16 __v = ioswabw(__raw_readw(c)); __v; })
+#define readl_relaxed(c)       ({ u32 __v = ioswabl(__raw_readl(c)); __v; })
+#define readq_relaxed(c)       ({ u64 __v = ioswabq(__raw_readq(c)); __v; })
+
+#define writeb_relaxed(v,c)    ((void)__raw_writeb((__force  u8)ioswabb(v),c))
+#define writew_relaxed(v,c)    ((void)__raw_writew((__force u16)ioswabw(v),c))
+#define writel_relaxed(v,c)    ((void)__raw_writel((__force u32)ioswabl(v),c))
+#define writeq_relaxed(v,c)    ((void)__raw_writeq((__force u64)ioswabq(v),c))
 
 #define readb(a)               ({ u8  r_ = readb_relaxed(a); rmb(); r_; })
 #define readw(a)               ({ u16 r_ = readw_relaxed(a); rmb(); r_; })
index 65be656ead7d037a03476ce335b6aec7d90049bd..a42a5610a36aa9d4cef7bc386420a0c3089f7fa1 100644 (file)
@@ -1,9 +1,46 @@
 #ifdef __KERNEL__
 # ifdef CONFIG_SUPERH32
+
 #  include "unistd_32.h"
+#  define __ARCH_WANT_SYS_RT_SIGSUSPEND
+
 # else
 #  include "unistd_64.h"
 # endif
+
+# define __ARCH_WANT_IPC_PARSE_VERSION
+# define __ARCH_WANT_OLD_READDIR
+# define __ARCH_WANT_OLD_STAT
+# define __ARCH_WANT_STAT64
+# define __ARCH_WANT_SYS_ALARM
+# define __ARCH_WANT_SYS_GETHOSTNAME
+# define __ARCH_WANT_SYS_IPC
+# define __ARCH_WANT_SYS_PAUSE
+# define __ARCH_WANT_SYS_SGETMASK
+# define __ARCH_WANT_SYS_SIGNAL
+# define __ARCH_WANT_SYS_TIME
+# define __ARCH_WANT_SYS_UTIME
+# define __ARCH_WANT_SYS_WAITPID
+# define __ARCH_WANT_SYS_SOCKETCALL
+# define __ARCH_WANT_SYS_FADVISE64
+# define __ARCH_WANT_SYS_GETPGRP
+# define __ARCH_WANT_SYS_LLSEEK
+# define __ARCH_WANT_SYS_NICE
+# define __ARCH_WANT_SYS_OLD_GETRLIMIT
+# define __ARCH_WANT_SYS_OLD_UNAME
+# define __ARCH_WANT_SYS_OLDUMOUNT
+# define __ARCH_WANT_SYS_SIGPENDING
+# define __ARCH_WANT_SYS_SIGPROCMASK
+# define __ARCH_WANT_SYS_RT_SIGACTION
+
+/*
+ * "Conditional" syscalls
+ *
+ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
+ * but it doesn't work on all toolchains, so we just do it by hand
+ */
+# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
+
 #else
 # ifdef __SH5__
 #  include "unistd_64.h"
index 152b8627a18440b4c54954a8c652edb59ff9bb1c..72fd1e061006058e2e15855016fbf117f62a7fdd 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __ASM_SH_UNISTD_H
-#define __ASM_SH_UNISTD_H
+#ifndef __ASM_SH_UNISTD_32_H
+#define __ASM_SH_UNISTD_32_H
 
 /*
  * Copyright (C) 1999  Niibe Yutaka
@@ -26,7 +26,7 @@
 #define __NR_mknod              14
 #define __NR_chmod              15
 #define __NR_lchown             16
-#define __NR_break              17
+                                /* 17 was sys_break */
 #define __NR_oldstat            18
 #define __NR_lseek              19
 #define __NR_getpid             20
 #define __NR_oldfstat           28
 #define __NR_pause              29
 #define __NR_utime              30
-#define __NR_stty               31
-#define __NR_gtty               32
+                                /* 31 was sys_stty */
+                                /* 32 was sys_gtty */
 #define __NR_access             33
 #define __NR_nice               34
-#define __NR_ftime              35
+                                /* 35 was sys_ftime */
 #define __NR_sync               36
 #define __NR_kill               37
 #define __NR_rename             38
@@ -53,7 +53,7 @@
 #define __NR_dup                41
 #define __NR_pipe               42
 #define __NR_times              43
-#define __NR_prof               44
+                                /* 44 was sys_prof */
 #define __NR_brk                45
 #define __NR_setgid             46
 #define __NR_getgid             47
 #define __NR_getegid            50
 #define __NR_acct               51
 #define __NR_umount2            52
-#define __NR_lock               53
+                                /* 53 was sys_lock */
 #define __NR_ioctl              54
 #define __NR_fcntl              55
-#define __NR_mpx                56
+                                /* 56 was sys_mpx */
 #define __NR_setpgid            57
-#define __NR_ulimit             58
-#define __NR_oldolduname        59
+                                /* 58 was sys_ulimit */
+                                /* 59 was sys_olduname */
 #define __NR_umask              60
 #define __NR_chroot             61
 #define __NR_ustat              62
@@ -91,7 +91,7 @@
 #define __NR_settimeofday       79
 #define __NR_getgroups          80
 #define __NR_setgroups          81
-#define __NR_select             82
+                                /* 82 was sys_oldselect */
 #define __NR_symlink            83
 #define __NR_oldlstat           84
 #define __NR_readlink           85
 #define __NR_fchown             95
 #define __NR_getpriority        96
 #define __NR_setpriority        97
-#define __NR_profil             98
+                                /* 98 was sys_profil */
 #define __NR_statfs             99
 #define __NR_fstatfs           100
-#define __NR_ioperm            101
+                               /* 101 was sys_ioperm */
 #define __NR_socketcall                102
 #define __NR_syslog            103
 #define __NR_setitimer         104
 #define __NR_lstat             107
 #define __NR_fstat             108
 #define __NR_olduname          109
-#define __NR_iopl              110
+                               /* 110 was sys_iopl */
 #define __NR_vhangup           111
-#define __NR_idle              112
-#define __NR_vm86old           113
+                               /* 112 was sys_idle */
+                               /* 113 was sys_vm86old */
 #define __NR_wait4             114
 #define __NR_swapoff           115
 #define __NR_sysinfo           116
 #define __NR_adjtimex          124
 #define __NR_mprotect          125
 #define __NR_sigprocmask       126
-#define __NR_create_module     127
+                               /* 127 was sys_create_module */
 #define __NR_init_module       128
 #define __NR_delete_module     129
-#define __NR_get_kernel_syms   130
+                               /* 130 was sys_get_kernel_syms */
 #define __NR_quotactl          131
 #define __NR_getpgid           132
 #define __NR_fchdir            133
 #define __NR_bdflush           134
 #define __NR_sysfs             135
 #define __NR_personality       136
-#define __NR_afs_syscall       137 /* Syscall for Andrew File System */
+                               /* 137 was sys_afs_syscall */
 #define __NR_setfsuid          138
 #define __NR_setfsgid          139
 #define __NR__llseek           140
 #define __NR_mremap            163
 #define __NR_setresuid         164
 #define __NR_getresuid         165
-#define __NR_vm86              166
-#define __NR_query_module      167
+                               /* 166 was sys_vm86 */
+                               /* 167 was sys_query_module */
 #define __NR_poll              168
 #define __NR_nfsservctl                169
 #define __NR_setresgid         170
 #define __NR_capset            185
 #define __NR_sigaltstack       186
 #define __NR_sendfile          187
-#define __NR_streams1          188     /* some people actually want it */
-#define __NR_streams2          189     /* some people actually want it */
+                               /* 188 reserved for sys_getpmsg */
+                               /* 189 reserved for sys_putpmsg */
 #define __NR_vfork             190
 #define __NR_ugetrlimit                191     /* SuS compliant getrlimit */
 #define __NR_mmap2             192
 #define __NR_madvise           219
 #define __NR_getdents64                220
 #define __NR_fcntl64           221
-/* 223 is unused */
+                               /* 222 is reserved for tux */
+                               /* 223 is unused */
 #define __NR_gettid            224
 #define __NR_readahead         225
 #define __NR_setxattr          226
 #define __NR_futex             240
 #define __NR_sched_setaffinity 241
 #define __NR_sched_getaffinity 242
-#define __NR_set_thread_area   243
-#define __NR_get_thread_area   244
+                               /* 243 is reserved for set_thread_area */
+                               /* 244 is reserved for get_thread_area */
 #define __NR_io_setup          245
 #define __NR_io_destroy                246
 #define __NR_io_getevents      247
 #define __NR_io_submit         248
 #define __NR_io_cancel         249
 #define __NR_fadvise64         250
-
+                               /* 251 is unused */
 #define __NR_exit_group                252
 #define __NR_lookup_dcookie    253
 #define __NR_epoll_create      254
 #define __NR_tgkill            270
 #define __NR_utimes            271
 #define __NR_fadvise64_64      272
-#define __NR_vserver           273
+                               /* 273 is reserved for vserver */
 #define __NR_mbind              274
 #define __NR_get_mempolicy      275
 #define __NR_set_mempolicy      276
 #define __NR_inotify_init      290
 #define __NR_inotify_add_watch 291
 #define __NR_inotify_rm_watch  292
-/* 293 is unused */
+                               /* 293 is unused */
 #define __NR_migrate_pages     294
 #define __NR_openat            295
 #define __NR_mkdirat           296
 
 #define NR_syscalls 367
 
-#ifdef __KERNEL__
-
-#define __ARCH_WANT_IPC_PARSE_VERSION
-#define __ARCH_WANT_OLD_READDIR
-#define __ARCH_WANT_OLD_STAT
-#define __ARCH_WANT_STAT64
-#define __ARCH_WANT_SYS_ALARM
-#define __ARCH_WANT_SYS_GETHOSTNAME
-#define __ARCH_WANT_SYS_IPC
-#define __ARCH_WANT_SYS_PAUSE
-#define __ARCH_WANT_SYS_SGETMASK
-#define __ARCH_WANT_SYS_SIGNAL
-#define __ARCH_WANT_SYS_TIME
-#define __ARCH_WANT_SYS_UTIME
-#define __ARCH_WANT_SYS_WAITPID
-#define __ARCH_WANT_SYS_SOCKETCALL
-#define __ARCH_WANT_SYS_FADVISE64
-#define __ARCH_WANT_SYS_GETPGRP
-#define __ARCH_WANT_SYS_LLSEEK
-#define __ARCH_WANT_SYS_NICE
-#define __ARCH_WANT_SYS_OLD_GETRLIMIT
-#define __ARCH_WANT_SYS_OLD_UNAME
-#define __ARCH_WANT_SYS_OLDUMOUNT
-#define __ARCH_WANT_SYS_SIGPENDING
-#define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
-
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-#endif
-
-#endif /* __KERNEL__ */
-#endif /* __ASM_SH_UNISTD_H */
+#endif /* __ASM_SH_UNISTD_32_H */
index c330c23db5a0675283b6ed0df52ef4e381ef0343..a28edc3296920e03b322257c34c29b565d7871bf 100644 (file)
@@ -31,7 +31,7 @@
 #define __NR_mknod              14
 #define __NR_chmod              15
 #define __NR_lchown             16
-#define __NR_break              17
+                                /* 17 was sys_break */
 #define __NR_oldstat            18
 #define __NR_lseek              19
 #define __NR_getpid             20
 #define __NR_oldfstat           28
 #define __NR_pause              29
 #define __NR_utime              30
-#define __NR_stty               31
-#define __NR_gtty               32
+                                /* 31 was sys_stty */
+                                /* 32 was sys_gtty */
 #define __NR_access             33
 #define __NR_nice               34
-#define __NR_ftime              35
+                                /* 35 was sys_ftime */
 #define __NR_sync               36
 #define __NR_kill               37
 #define __NR_rename             38
@@ -58,7 +58,7 @@
 #define __NR_dup                41
 #define __NR_pipe               42
 #define __NR_times              43
-#define __NR_prof               44
+                                /* 44 was sys_prof */
 #define __NR_brk                45
 #define __NR_setgid             46
 #define __NR_getgid             47
 #define __NR_getegid            50
 #define __NR_acct               51
 #define __NR_umount2            52
-#define __NR_lock               53
+                                /* 53 was sys_lock */
 #define __NR_ioctl              54
 #define __NR_fcntl              55
-#define __NR_mpx                56
+                                /* 56 was sys_mpx */
 #define __NR_setpgid            57
-#define __NR_ulimit             58
-#define __NR_oldolduname        59
+                                /* 58 was sys_ulimit */
+                                /* 59 was sys_olduname */
 #define __NR_umask              60
 #define __NR_chroot             61
 #define __NR_ustat              62
@@ -96,7 +96,7 @@
 #define __NR_settimeofday       79
 #define __NR_getgroups          80
 #define __NR_setgroups          81
-#define __NR_select             82
+                                /* 82 was sys_select */
 #define __NR_symlink            83
 #define __NR_oldlstat           84
 #define __NR_readlink           85
 #define __NR_fchown             95
 #define __NR_getpriority        96
 #define __NR_setpriority        97
-#define __NR_profil             98
+                                /* 98 was sys_profil */
 #define __NR_statfs             99
 #define __NR_fstatfs           100
-#define __NR_ioperm            101
+                               /* 101 was sys_ioperm */
 #define __NR_socketcall                102     /* old implementation of socket systemcall */
 #define __NR_syslog            103
 #define __NR_setitimer         104
 #define __NR_lstat             107
 #define __NR_fstat             108
 #define __NR_olduname          109
-#define __NR_iopl              110
+                               /* 110 was sys_iopl */
 #define __NR_vhangup           111
-#define __NR_idle              112
-#define __NR_vm86old           113
+                               /* 112 was sys_idle */
+                               /* 113 was sys_vm86old */
 #define __NR_wait4             114
 #define __NR_swapoff           115
 #define __NR_sysinfo           116
 #define __NR_adjtimex          124
 #define __NR_mprotect          125
 #define __NR_sigprocmask       126
-#define __NR_create_module     127
+                               /* 127 was sys_create_module */
 #define __NR_init_module       128
 #define __NR_delete_module     129
-#define __NR_get_kernel_syms   130
+                               /* 130 was sys_get_kernel_syms */
 #define __NR_quotactl          131
 #define __NR_getpgid           132
 #define __NR_fchdir            133
 #define __NR_bdflush           134
 #define __NR_sysfs             135
 #define __NR_personality       136
-#define __NR_afs_syscall       137 /* Syscall for Andrew File System */
+                               /* 137 was sys_afs_syscall */
 #define __NR_setfsuid          138
 #define __NR_setfsgid          139
 #define __NR__llseek           140
 #define __NR_mremap            163
 #define __NR_setresuid         164
 #define __NR_getresuid         165
-#define __NR_vm86              166
-#define __NR_query_module      167
+                               /* 166 was sys_vm86 */
+                               /* 167 was sys_query_module */
 #define __NR_poll              168
 #define __NR_nfsservctl                169
 #define __NR_setresgid         170
 #define __NR_capset            185
 #define __NR_sigaltstack       186
 #define __NR_sendfile          187
-#define __NR_streams1          188     /* some people actually want it */
-#define __NR_streams2          189     /* some people actually want it */
+                               /* 188 reserved for getpmsg */
+                               /* 189 reserved for putpmsg */
 #define __NR_vfork             190
 #define __NR_ugetrlimit                191     /* SuS compliant getrlimit */
 #define __NR_mmap2             192
 #define __NR_msgrcv            241
 #define __NR_msgget            242
 #define __NR_msgctl            243
-#if 0
-#define __NR_shmatcall         244
-#endif
+#define __NR_shmat             244
 #define __NR_shmdt             245
 #define __NR_shmget            246
 #define __NR_shmctl            247
 
 #define __NR_getdents64                248
 #define __NR_fcntl64           249
-/* 223 is unused */
+                               /* 250 is reserved for tux */
+                               /* 251 is unused */
 #define __NR_gettid            252
 #define __NR_readahead         253
 #define __NR_setxattr          254
 #define __NR_futex             268
 #define __NR_sched_setaffinity 269
 #define __NR_sched_getaffinity 270
-#define __NR_set_thread_area   271
-#define __NR_get_thread_area   272
+                               /* 271 is reserved for set_thread_area */
+                               /* 272 is reserved for get_thread_area */
 #define __NR_io_setup          273
 #define __NR_io_destroy                274
 #define __NR_io_getevents      275
 #define __NR_io_submit         276
 #define __NR_io_cancel         277
 #define __NR_fadvise64         278
+                               /* 279 is unused */
 #define __NR_exit_group                280
 
 #define __NR_lookup_dcookie    281
 #define __NR_tgkill            298
 #define __NR_utimes            299
 #define __NR_fadvise64_64      300
-#define __NR_vserver           301
-#define __NR_mbind              302
-#define __NR_get_mempolicy      303
-#define __NR_set_mempolicy      304
+                               /* 301 is reserved for vserver */
+                               /* 302 is reserved for mbind */
+                               /* 303 is reserved for get_mempolicy */
+                               /* 304 is reserved for set_mempolicy */
 #define __NR_mq_open            305
 #define __NR_mq_unlink          (__NR_mq_open+1)
 #define __NR_mq_timedsend       (__NR_mq_open+2)
 #define __NR_mq_timedreceive    (__NR_mq_open+3)
 #define __NR_mq_notify          (__NR_mq_open+4)
 #define __NR_mq_getsetattr      (__NR_mq_open+5)
-#define __NR_kexec_load                311
+                               /* 311 is reserved for kexec */
 #define __NR_waitid            312
 #define __NR_add_key           313
 #define __NR_request_key       314
 #define __NR_inotify_init      318
 #define __NR_inotify_add_watch 319
 #define __NR_inotify_rm_watch  320
-/* 321 is unused */
+                               /* 321 is unused */
 #define __NR_migrate_pages     322
 #define __NR_openat            323
 #define __NR_mkdirat           324
 #define __NR_process_vm_readv  376
 #define __NR_process_vm_writev 377
 
-#ifdef __KERNEL__
-
 #define NR_syscalls 378
 
-#define __ARCH_WANT_IPC_PARSE_VERSION
-#define __ARCH_WANT_OLD_READDIR
-#define __ARCH_WANT_OLD_STAT
-#define __ARCH_WANT_STAT64
-#define __ARCH_WANT_SYS_ALARM
-#define __ARCH_WANT_SYS_GETHOSTNAME
-#define __ARCH_WANT_SYS_IPC
-#define __ARCH_WANT_SYS_PAUSE
-#define __ARCH_WANT_SYS_SGETMASK
-#define __ARCH_WANT_SYS_SIGNAL
-#define __ARCH_WANT_SYS_TIME
-#define __ARCH_WANT_SYS_UTIME
-#define __ARCH_WANT_SYS_WAITPID
-#define __ARCH_WANT_SYS_SOCKETCALL
-#define __ARCH_WANT_SYS_FADVISE64
-#define __ARCH_WANT_SYS_GETPGRP
-#define __ARCH_WANT_SYS_LLSEEK
-#define __ARCH_WANT_SYS_NICE
-#define __ARCH_WANT_SYS_OLD_GETRLIMIT
-#define __ARCH_WANT_SYS_OLD_UNAME
-#define __ARCH_WANT_SYS_OLDUMOUNT
-#define __ARCH_WANT_SYS_SIGPENDING
-#define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-#endif
-
-#endif /* __KERNEL__ */
 #endif /* __ASM_SH_UNISTD_64_H */
index 18fa80aba15e7dee79d9a0125c517a9db01d65d2..02788b6a03b7c9654711b9010ec6cedc1a5edc65 100644 (file)
 
 #define DMAOR_INIT     DMAOR_DME
 
-#if defined(CONFIG_CPU_SUBTYPE_SH7343) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7730)
+#if defined(CONFIG_CPU_SUBTYPE_SH7343)
 #define CHCR_TS_LOW_MASK       0x00000018
 #define CHCR_TS_LOW_SHIFT      3
 #define CHCR_TS_HIGH_MASK      0
 #define CHCR_TS_HIGH_SHIFT     0
 #elif defined(CONFIG_CPU_SUBTYPE_SH7722) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7723) || \
        defined(CONFIG_CPU_SUBTYPE_SH7724) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7730) || \
        defined(CONFIG_CPU_SUBTYPE_SH7786)
 #define CHCR_TS_LOW_MASK       0x00000018
 #define CHCR_TS_LOW_SHIFT      3
 #define CHCR_TS_HIGH_MASK      0x00300000
 #define CHCR_TS_HIGH_SHIFT     (20 - 2)        /* 2 bits for shifted low TS */
-#elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7764)
-#define CHCR_TS_LOW_MASK       0x00000018
-#define CHCR_TS_LOW_SHIFT      3
-#define CHCR_TS_HIGH_MASK      0
-#define CHCR_TS_HIGH_SHIFT     0
-#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
-#define CHCR_TS_LOW_MASK       0x00000018
-#define CHCR_TS_LOW_SHIFT      3
-#define CHCR_TS_HIGH_MASK      0
-#define CHCR_TS_HIGH_SHIFT     0
-#elif defined(CONFIG_CPU_SUBTYPE_SH7757)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7757) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7763) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7764) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7780) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7785)
 #define CHCR_TS_LOW_MASK       0x00000018
 #define CHCR_TS_LOW_SHIFT      3
 #define CHCR_TS_HIGH_MASK      0x00100000
 #define CHCR_TS_HIGH_SHIFT     (20 - 2)        /* 2 bits for shifted low TS */
-#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
-#define CHCR_TS_LOW_MASK       0x00000018
-#define CHCR_TS_LOW_SHIFT      3
-#define CHCR_TS_HIGH_MASK      0
-#define CHCR_TS_HIGH_SHIFT     0
-#else /* SH7785 */
-#define CHCR_TS_LOW_MASK       0x00000018
-#define CHCR_TS_LOW_SHIFT      3
-#define CHCR_TS_HIGH_MASK      0
-#define CHCR_TS_HIGH_SHIFT     0
 #endif
 
 /* Transmit sizes and respective CHCR register values */
diff --git a/arch/sh/include/mach-common/mach/mangle-port.h b/arch/sh/include/mach-common/mach/mangle-port.h
new file mode 100644 (file)
index 0000000..4ca1769
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * SH version cribbed from the MIPS copy:
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003, 2004 Ralf Baechle
+ */
+#ifndef __MACH_COMMON_MANGLE_PORT_H
+#define __MACH_COMMON_MANGLE_PORT_H
+
+/*
+ * Sane hardware offers swapping of PCI/ISA I/O space accesses in hardware;
+ * less sane hardware forces software to fiddle with this...
+ *
+ * Regardless, if the host bus endianness mismatches that of PCI/ISA, then
+ * you can't have the numerical value of data and byte addresses within
+ * multibyte quantities both preserved at the same time.  Hence two
+ * variations of functions: non-prefixed ones that preserve the value
+ * and prefixed ones that preserve byte addresses.  The latters are
+ * typically used for moving raw data between a peripheral and memory (cf.
+ * string I/O functions), hence the "__mem_" prefix.
+ */
+#if defined(CONFIG_SWAP_IO_SPACE)
+
+# define ioswabb(x)            (x)
+# define __mem_ioswabb(x)      (x)
+# define ioswabw(x)            le16_to_cpu(x)
+# define __mem_ioswabw(x)      (x)
+# define ioswabl(x)            le32_to_cpu(x)
+# define __mem_ioswabl(x)      (x)
+# define ioswabq(x)            le64_to_cpu(x)
+# define __mem_ioswabq(x)      (x)
+
+#else
+
+# define ioswabb(x)            (x)
+# define __mem_ioswabb(x)      (x)
+# define ioswabw(x)            (x)
+# define __mem_ioswabw(x)      cpu_to_le16(x)
+# define ioswabl(x)            (x)
+# define __mem_ioswabl(x)      cpu_to_le32(x)
+# define ioswabq(x)            (x)
+# define __mem_ioswabq(x)      cpu_to_le32(x)
+
+#endif
+
+#endif /* __MACH_COMMON_MANGLE_PORT_H */
index 2875e8be4f7268242f4390d3a02a5dd3311c54a5..c8836cffa2167471ebd3f55eeee28bab1dc758aa 100644 (file)
@@ -680,6 +680,25 @@ static struct platform_device spi1_device = {
        .resource       = spi1_resources,
 };
 
+static struct resource rspi_resources[] = {
+       {
+               .start  = 0xfe480000,
+               .end    = 0xfe4800ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = 220,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device rspi_device = {
+       .name   = "rspi",
+       .id     = 2,
+       .num_resources  = ARRAY_SIZE(rspi_resources),
+       .resource       = rspi_resources,
+};
+
 static struct resource usb_ehci_resources[] = {
        [0] = {
                .start  = 0xfe4f1000,
@@ -740,6 +759,7 @@ static struct platform_device *sh7757_devices[] __initdata = {
        &dma3_device,
        &spi0_device,
        &spi1_device,
+       &rspi_device,
        &usb_ehci_device,
        &usb_ohci_device,
 };
index 0fffacea6ed96aebda4c692ace9b1185468d74b5..e68b45b6f3f902aded3f00a4dd3e2341ca518abf 100644 (file)
@@ -3,7 +3,7 @@
  *
  * cpufreq driver for the SuperH processors.
  *
- * Copyright (C) 2002 - 2007 Paul Mundt
+ * Copyright (C) 2002 - 2012 Paul Mundt
  * Copyright (C) 2002 M. R. Brown
  *
  * Clock framework bits from arch/avr32/mach-at32ap/cpufreq.c
@@ -14,6 +14,8 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
+#define pr_fmt(fmt) "cpufreq: " fmt
+
 #include <linux/types.h>
 #include <linux/cpufreq.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/cpumask.h>
+#include <linux/cpu.h>
 #include <linux/smp.h>
 #include <linux/sched.h>       /* set_cpus_allowed() */
 #include <linux/clk.h>
+#include <linux/percpu.h>
+#include <linux/sh_clk.h>
 
-static struct clk *cpuclk;
+static DEFINE_PER_CPU(struct clk, sh_cpuclk);
 
 static unsigned int sh_cpufreq_get(unsigned int cpu)
 {
-       return (clk_get_rate(cpuclk) + 500) / 1000;
+       return (clk_get_rate(&per_cpu(sh_cpuclk, cpu)) + 500) / 1000;
 }
 
 /*
@@ -40,8 +45,10 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy,
                             unsigned int relation)
 {
        unsigned int cpu = policy->cpu;
+       struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu);
        cpumask_t cpus_allowed;
        struct cpufreq_freqs freqs;
+       struct device *dev;
        long freq;
 
        if (!cpu_online(cpu))
@@ -52,13 +59,15 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy,
 
        BUG_ON(smp_processor_id() != cpu);
 
+       dev = get_cpu_device(cpu);
+
        /* Convert target_freq from kHz to Hz */
        freq = clk_round_rate(cpuclk, target_freq * 1000);
 
        if (freq < (policy->min * 1000) || freq > (policy->max * 1000))
                return -EINVAL;
 
-       pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000);
+       dev_dbg(dev, "requested frequency %u Hz\n", target_freq * 1000);
 
        freqs.cpu       = cpu;
        freqs.old       = sh_cpufreq_get(cpu);
@@ -70,78 +79,112 @@ static int sh_cpufreq_target(struct cpufreq_policy *policy,
        clk_set_rate(cpuclk, freq);
        cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 
-       pr_debug("cpufreq: set frequency %lu Hz\n", freq);
+       dev_dbg(dev, "set frequency %lu Hz\n", freq);
+
+       return 0;
+}
+
+static int sh_cpufreq_verify(struct cpufreq_policy *policy)
+{
+       struct clk *cpuclk = &per_cpu(sh_cpuclk, policy->cpu);
+       struct cpufreq_frequency_table *freq_table;
+
+       freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL;
+       if (freq_table)
+               return cpufreq_frequency_table_verify(policy, freq_table);
+
+       cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
+                                    policy->cpuinfo.max_freq);
+
+       policy->min = (clk_round_rate(cpuclk, 1) + 500) / 1000;
+       policy->max = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000;
+
+       cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
+                                    policy->cpuinfo.max_freq);
 
        return 0;
 }
 
 static int sh_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
-       if (!cpu_online(policy->cpu))
+       unsigned int cpu = policy->cpu;
+       struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu);
+       struct cpufreq_frequency_table *freq_table;
+       struct device *dev;
+
+       if (!cpu_online(cpu))
                return -ENODEV;
 
-       cpuclk = clk_get(NULL, "cpu_clk");
+       dev = get_cpu_device(cpu);
+
+       cpuclk = clk_get(dev, "cpu_clk");
        if (IS_ERR(cpuclk)) {
-               printk(KERN_ERR "cpufreq: couldn't get CPU#%d clk\n",
-                      policy->cpu);
+               dev_err(dev, "couldn't get CPU clk\n");
                return PTR_ERR(cpuclk);
        }
 
-       /* cpuinfo and default policy values */
-       policy->cpuinfo.min_freq = (clk_round_rate(cpuclk, 1) + 500) / 1000;
-       policy->cpuinfo.max_freq = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000;
-       policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+       policy->cur = policy->min = policy->max = sh_cpufreq_get(cpu);
 
-       policy->cur             = sh_cpufreq_get(policy->cpu);
-       policy->min             = policy->cpuinfo.min_freq;
-       policy->max             = policy->cpuinfo.max_freq;
+       freq_table = cpuclk->nr_freqs ? cpuclk->freq_table : NULL;
+       if (freq_table) {
+               int result;
 
-       /*
-        * Catch the cases where the clock framework hasn't been wired up
-        * properly to support scaling.
-        */
-       if (unlikely(policy->min == policy->max)) {
-               printk(KERN_ERR "cpufreq: clock framework rate rounding "
-                      "not supported on CPU#%d.\n", policy->cpu);
+               result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
+               if (!result)
+                       cpufreq_frequency_table_get_attr(freq_table, cpu);
+       } else {
+               dev_notice(dev, "no frequency table found, falling back "
+                          "to rate rounding.\n");
 
-               clk_put(cpuclk);
-               return -EINVAL;
+               policy->cpuinfo.min_freq =
+                       (clk_round_rate(cpuclk, 1) + 500) / 1000;
+               policy->cpuinfo.max_freq =
+                       (clk_round_rate(cpuclk, ~0UL) + 500) / 1000;
        }
 
-       printk(KERN_INFO "cpufreq: CPU#%d Frequencies - Minimum %u.%03u MHz, "
+       policy->min = policy->cpuinfo.min_freq;
+       policy->max = policy->cpuinfo.max_freq;
+
+       policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+
+       dev_info(dev, "CPU Frequencies - Minimum %u.%03u MHz, "
               "Maximum %u.%03u MHz.\n",
-              policy->cpu, policy->min / 1000, policy->min % 1000,
+              policy->min / 1000, policy->min % 1000,
               policy->max / 1000, policy->max % 1000);
 
        return 0;
 }
 
-static int sh_cpufreq_verify(struct cpufreq_policy *policy)
+static int sh_cpufreq_cpu_exit(struct cpufreq_policy *policy)
 {
-       cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
-                                    policy->cpuinfo.max_freq);
-       return 0;
-}
+       unsigned int cpu = policy->cpu;
+       struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu);
 
-static int sh_cpufreq_exit(struct cpufreq_policy *policy)
-{
+       cpufreq_frequency_table_put_attr(cpu);
        clk_put(cpuclk);
+
        return 0;
 }
 
+static struct freq_attr *sh_freq_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
 static struct cpufreq_driver sh_cpufreq_driver = {
        .owner          = THIS_MODULE,
        .name           = "sh",
-       .init           = sh_cpufreq_cpu_init,
-       .verify         = sh_cpufreq_verify,
-       .target         = sh_cpufreq_target,
        .get            = sh_cpufreq_get,
-       .exit           = sh_cpufreq_exit,
+       .target         = sh_cpufreq_target,
+       .verify         = sh_cpufreq_verify,
+       .init           = sh_cpufreq_cpu_init,
+       .exit           = sh_cpufreq_cpu_exit,
+       .attr           = sh_freq_attr,
 };
 
 static int __init sh_cpufreq_module_init(void)
 {
-       printk(KERN_INFO "cpufreq: SuperH CPU frequency driver.\n");
+       pr_notice("SuperH CPU frequency driver.\n");
        return cpufreq_register_driver(&sh_cpufreq_driver);
 }
 
index 0bc58866add1d932c69346cd6169db54bb08a6a5..5901fba3176e519e3c8ecdc947c532b55c7b884a 100644 (file)
@@ -57,12 +57,13 @@ sys_sigsuspend(old_sigset_t mask,
               unsigned long r5, unsigned long r6, unsigned long r7,
               struct pt_regs __regs)
 {
-       mask &= _BLOCKABLE;
-       spin_lock_irq(&current->sighand->siglock);
+       sigset_t blocked;
+
        current->saved_sigmask = current->blocked;
-       siginitset(&current->blocked, mask);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+
+       mask &= _BLOCKABLE;
+       siginitset(&blocked, mask);
+       set_current_blocked(&blocked);
 
        current->state = TASK_INTERRUPTIBLE;
        schedule();
@@ -239,11 +240,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       set_current_blocked(&set);
 
        if (restore_sigcontext(regs, &frame->sc, &r0))
                goto badframe;
@@ -273,10 +270,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       set_current_blocked(&set);
 
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
                goto badframe;
@@ -547,17 +541,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
        else
                ret = setup_frame(sig, ka, oldset, regs);
 
-       if (ka->sa.sa_flags & SA_ONESHOT)
-               ka->sa.sa_handler = SIG_DFL;
-
-       if (ret == 0) {
-               spin_lock_irq(&current->sighand->siglock);
-               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-               if (!(ka->sa.sa_flags & SA_NODEFER))
-                       sigaddset(&current->blocked,sig);
-               recalc_sigpending();
-               spin_unlock_irq(&current->sighand->siglock);
-       }
+       if (ret == 0)
+               block_sigmask(ka, sig);
 
        return ret;
 }
index 6b5603fe274bdbca92a94b15331553388dc2488a..3c9a6f7dcdce81662d31d59a2bcce6cc425b3bca 100644 (file)
@@ -159,14 +159,13 @@ sys_sigsuspend(old_sigset_t mask,
               unsigned long r6, unsigned long r7,
               struct pt_regs * regs)
 {
-       sigset_t saveset;
+       sigset_t saveset, blocked;
 
-       mask &= _BLOCKABLE;
-       spin_lock_irq(&current->sighand->siglock);
        saveset = current->blocked;
-       siginitset(&current->blocked, mask);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+
+       mask &= _BLOCKABLE;
+       siginitset(&blocked, mask);
+       set_current_blocked(&blocked);
 
        REF_REG_RET = -EINTR;
        while (1) {
@@ -198,11 +197,8 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize,
        if (copy_from_user(&newset, unewset, sizeof(newset)))
                return -EFAULT;
        sigdelsetmask(&newset, ~_BLOCKABLE);
-       spin_lock_irq(&current->sighand->siglock);
        saveset = current->blocked;
-       current->blocked = newset;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       set_current_blocked(&newset);
 
        REF_REG_RET = -EINTR;
        while (1) {
@@ -408,11 +404,7 @@ asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       set_current_blocked(&set);
 
        if (restore_sigcontext(regs, &frame->sc, &ret))
                goto badframe;
@@ -445,10 +437,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       set_current_blocked(&set);
 
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
                goto badframe;
@@ -734,17 +723,8 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
        else
                ret = setup_frame(sig, ka, oldset, regs);
 
-       if (ka->sa.sa_flags & SA_ONESHOT)
-               ka->sa.sa_handler = SIG_DFL;
-
-       if (ret == 0) {
-               spin_lock_irq(&current->sighand->siglock);
-               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-               if (!(ka->sa.sa_flags & SA_NODEFER))
-                       sigaddset(&current->blocked,sig);
-               recalc_sigpending();
-               spin_unlock_irq(&current->sighand->siglock);
-       }
+       if (ret == 0)
+               block_sigmask(ka, sig);
 
        return ret;
 }
index ee56a9b1a981679a6968d89f232729f4f8ed012f..4b68f0f79761e404c5830d617547feae2806a712 100644 (file)
@@ -204,8 +204,8 @@ ENTRY(sys_call_table)
        .long sys_capset           /* 185 */
        .long sys_sigaltstack
        .long sys_sendfile
-       .long sys_ni_syscall    /* streams1 */
-       .long sys_ni_syscall    /* streams2 */
+       .long sys_ni_syscall    /* getpmsg */
+       .long sys_ni_syscall    /* putpmsg */
        .long sys_vfork            /* 190 */
        .long sys_getrlimit
        .long sys_mmap2
@@ -259,8 +259,8 @@ ENTRY(sys_call_table)
        .long sys_futex         /* 240 */
        .long sys_sched_setaffinity
        .long sys_sched_getaffinity
-       .long sys_ni_syscall
-       .long sys_ni_syscall
+       .long sys_ni_syscall    /* reserved for set_thread_area */
+       .long sys_ni_syscall    /* reserved for get_thread_area */
        .long sys_io_setup      /* 245 */
        .long sys_io_destroy
        .long sys_io_getevents
index 9af7de26fb7153ac1dffca0aedc32a822e1cde5e..0956345b36efecd9e6729180701aecf423979a86 100644 (file)
@@ -208,8 +208,8 @@ sys_call_table:
        .long sys_capset                /* 185 */
        .long sys_sigaltstack
        .long sys_sendfile
-       .long sys_ni_syscall    /* streams1 */
-       .long sys_ni_syscall    /* streams2 */
+       .long sys_ni_syscall    /* getpmsg */
+       .long sys_ni_syscall    /* putpmsg */
        .long sys_vfork                 /* 190 */
        .long sys_getrlimit
        .long sys_mmap2
@@ -296,8 +296,8 @@ sys_call_table:
        .long sys_futex
        .long sys_sched_setaffinity
        .long sys_sched_getaffinity     /* 270 */
-       .long sys_ni_syscall
-       .long sys_ni_syscall
+       .long sys_ni_syscall            /* reserved for set_thread_area */
+       .long sys_ni_syscall            /* reserved for get_thread_area */
        .long sys_io_setup
        .long sys_io_destroy
        .long sys_io_getevents          /* 275 */
index 7b246efa94ea657de185facca3f622a47adfb9be..012df2676a267950b77c713eb23afc56b1a341c8 100644 (file)
@@ -2,13 +2,14 @@
  * IRQ chip definitions for INTC IRQs.
  *
  * Copyright (C) 2007, 2008 Magnus Damm
- * Copyright (C) 2009, 2010 Paul Mundt
+ * Copyright (C) 2009 - 2012 Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
 #include <linux/cpumask.h>
+#include <linux/bsearch.h>
 #include <linux/io.h>
 #include "internals.h"
 
@@ -58,11 +59,6 @@ static void intc_disable(struct irq_data *data)
        }
 }
 
-static int intc_set_wake(struct irq_data *data, unsigned int on)
-{
-       return 0; /* allow wakeup, but setup hardware in intc_suspend() */
-}
-
 #ifdef CONFIG_SMP
 /*
  * This is held with the irq desc lock held, so we don't require any
@@ -78,7 +74,7 @@ static int intc_set_affinity(struct irq_data *data,
 
        cpumask_copy(data->affinity, cpumask);
 
-       return 0;
+       return IRQ_SET_MASK_OK_NOCOPY;
 }
 #endif
 
@@ -122,28 +118,12 @@ static struct intc_handle_int *intc_find_irq(struct intc_handle_int *hp,
                                             unsigned int nr_hp,
                                             unsigned int irq)
 {
-       int i;
-
-       /*
-        * this doesn't scale well, but...
-        *
-        * this function should only be used for cerain uncommon
-        * operations such as intc_set_priority() and intc_set_type()
-        * and in those rare cases performance doesn't matter that much.
-        * keeping the memory footprint low is more important.
-        *
-        * one rather simple way to speed this up and still keep the
-        * memory footprint down is to make sure the array is sorted
-        * and then perform a bisect to lookup the irq.
-        */
-       for (i = 0; i < nr_hp; i++) {
-               if ((hp + i)->irq != irq)
-                       continue;
+       struct intc_handle_int key;
 
-               return hp + i;
-       }
+       key.irq = irq;
+       key.handle = 0;
 
-       return NULL;
+       return bsearch(&key, hp, nr_hp, sizeof(*hp), intc_handle_int_cmp);
 }
 
 int intc_set_priority(unsigned int irq, unsigned int prio)
@@ -223,10 +203,9 @@ struct irq_chip intc_irq_chip      = {
        .irq_mask_ack           = intc_mask_ack,
        .irq_enable             = intc_enable,
        .irq_disable            = intc_disable,
-       .irq_shutdown           = intc_disable,
        .irq_set_type           = intc_set_type,
-       .irq_set_wake           = intc_set_wake,
 #ifdef CONFIG_SMP
        .irq_set_affinity       = intc_set_affinity,
 #endif
+       .flags                  = IRQCHIP_SKIP_SET_WAKE,
 };
index 2fde8970dfd0716dda4fcf69395da9be7bf80214..7e562ccb699734b3b6ce77579309cbdb87437817 100644 (file)
@@ -2,7 +2,7 @@
  * Shared interrupt handling code for IPR and INTC2 types of IRQs.
  *
  * Copyright (C) 2007, 2008 Magnus Damm
- * Copyright (C) 2009, 2010 Paul Mundt
+ * Copyright (C) 2009 - 2012 Paul Mundt
  *
  * Based on intc2.c and ipr.c
  *
 #include <linux/spinlock.h>
 #include <linux/radix-tree.h>
 #include <linux/export.h>
+#include <linux/sort.h>
 #include "internals.h"
 
 LIST_HEAD(intc_list);
 DEFINE_RAW_SPINLOCK(intc_big_lock);
-unsigned int nr_intc_controllers;
+static unsigned int nr_intc_controllers;
 
 /*
  * Default priority level
@@ -267,6 +268,9 @@ int __init register_intc_controller(struct intc_desc *desc)
                        k += save_reg(d, k, hw->prio_regs[i].set_reg, smp);
                        k += save_reg(d, k, hw->prio_regs[i].clr_reg, smp);
                }
+
+               sort(d->prio, hw->nr_prio_regs, sizeof(*d->prio),
+                    intc_handle_int_cmp, NULL);
        }
 
        if (hw->sense_regs) {
@@ -277,6 +281,9 @@ int __init register_intc_controller(struct intc_desc *desc)
 
                for (i = 0; i < hw->nr_sense_regs; i++)
                        k += save_reg(d, k, hw->sense_regs[i].reg, 0);
+
+               sort(d->sense, hw->nr_sense_regs, sizeof(*d->sense),
+                    intc_handle_int_cmp, NULL);
        }
 
        if (hw->subgroups)
index f461d5300b81d77fcc06915669c3eb9b56ea8e91..7863a44918a293e9a4c5d557349775bd072d0cc2 100644 (file)
@@ -172,9 +172,8 @@ intc_get_prio_handle(struct intc_desc *desc, struct intc_desc_int *d,
        return 0;
 }
 
-static unsigned int __init intc_ack_data(struct intc_desc *desc,
-                                         struct intc_desc_int *d,
-                                         intc_enum enum_id)
+static unsigned int intc_ack_data(struct intc_desc *desc,
+                                 struct intc_desc_int *d, intc_enum enum_id)
 {
        struct intc_mask_reg *mr = desc->hw.ack_regs;
        unsigned int i, j, fn, mode;
index b0e9155ff73965bc0da482fb6f86983828ae98c8..f034a979a16f5c15bcd43c9cd9b9c1a069435880 100644 (file)
@@ -108,6 +108,14 @@ static inline void activate_irq(int irq)
 #endif
 }
 
+static inline int intc_handle_int_cmp(const void *a, const void *b)
+{
+       const struct intc_handle_int *_a = a;
+       const struct intc_handle_int *_b = b;
+
+       return _a->irq - _b->irq;
+}
+
 /* access.c */
 extern unsigned long
 (*intc_reg_fns[])(unsigned long addr, unsigned long h, unsigned long data);
@@ -157,7 +165,6 @@ void _intc_enable(struct irq_data *data, unsigned long handle);
 /* core.c */
 extern struct list_head intc_list;
 extern raw_spinlock_t intc_big_lock;
-extern unsigned int nr_intc_controllers;
 extern struct bus_type intc_subsys;
 
 unsigned int intc_get_dfl_prio_level(void);
index f8db8a70c14eaaa78f6c9571b346de456c619bc8..bf461cf99616c04aa9e2655eaee8e62d21c782db 100644 (file)
@@ -1229,17 +1229,20 @@ static void sci_dma_tx_complete(void *arg)
        port->icount.tx += sg_dma_len(&s->sg_tx);
 
        async_tx_ack(s->desc_tx);
-       s->cookie_tx = -EINVAL;
        s->desc_tx = NULL;
 
        if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
                uart_write_wakeup(port);
 
        if (!uart_circ_empty(xmit)) {
+               s->cookie_tx = 0;
                schedule_work(&s->work_tx);
-       } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
-               u16 ctrl = sci_in(port, SCSCR);
-               sci_out(port, SCSCR, ctrl & ~SCSCR_TIE);
+       } else {
+               s->cookie_tx = -EINVAL;
+               if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+                       u16 ctrl = sci_in(port, SCSCR);
+                       sci_out(port, SCSCR, ctrl & ~SCSCR_TIE);
+               }
        }
 
        spin_unlock_irqrestore(&port->lock, flags);
@@ -1501,8 +1504,10 @@ static void sci_start_tx(struct uart_port *port)
        }
 
        if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) &&
-           s->cookie_tx < 0)
+           s->cookie_tx < 0) {
+               s->cookie_tx = 0;
                schedule_work(&s->work_tx);
+       }
 #endif
 
        if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) {