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.
  ...

1  2 
arch/sh/Kconfig
arch/sh/include/asm/io.h
arch/sh/kernel/signal_32.c
drivers/sh/intc/core.c
drivers/sh/intc/handle.c
drivers/tty/serial/sh-sci.c

diff --combined arch/sh/Kconfig
index b190eb17a75beb088f90a2b5eccdcbaf13c506b7,2d9cd1327a0672d4807bec3f2ed1dc8638315189..ff9e033ce626774fe5b0ad7ddf1c199fe7789471
@@@ -5,6 -5,7 +5,7 @@@ config SUPER
        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
@@@ -22,7 -23,7 +23,7 @@@
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_GENERIC_HARDIRQS
 -      select HAVE_SPARSE_IRQ
 +      select MAY_HAVE_SPARSE_IRQ
        select IRQ_FORCED_THREADING
        select RTC_LIB
        select GENERIC_ATOMIC64
@@@ -161,6 -162,9 +162,9 @@@ config NO_IOPOR
  config IO_TRAPPED
        bool
  
+ config SWAP_IO_SPACE
+       bool
  config DMA_COHERENT
        bool
  
diff --combined arch/sh/include/asm/io.h
index 35fc8b077cb1c25048e7c697ea34b979f62e93f4,eb76cb32f49fdf94e4cfe94c5aa3900efea972ec..ec464a6b95fe2cbd790bd63c17302a533f239a6e
@@@ -14,6 -14,7 +14,6 @@@
   */
  #include <linux/errno.h>
  #include <asm/cache.h>
 -#include <asm/system.h>
  #include <asm/addrspace.h>
  #include <asm/machvec.h>
  #include <asm/pgtable.h>
@@@ -23,6 -24,7 +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 0bc58866add1d932c69346cd6169db54bb08a6a5,883d711bb4bbcd9000809304170cd1ae02cc163a..5901fba3176e519e3c8ecdc947c532b55c7b884a
@@@ -25,6 -25,7 +25,6 @@@
  #include <linux/freezer.h>
  #include <linux/io.h>
  #include <linux/tracehook.h>
 -#include <asm/system.h>
  #include <asm/ucontext.h>
  #include <asm/uaccess.h>
  #include <asm/pgtable.h>
@@@ -57,12 -58,13 +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 -241,7 +240,7 @@@ asmlinkage int sys_sigreturn(unsigned l
                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 -271,7 +270,7 @@@ asmlinkage int sys_rt_sigreturn(unsigne
                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 -542,8 +541,8 @@@ handle_signal(unsigned long sig, struc
        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;
  }
diff --combined drivers/sh/intc/core.c
index 2fde8970dfd0716dda4fcf69395da9be7bf80214,8e1fcd5e5f0d55df5ff04e4e4a112ba98754c155..7e562ccb699734b3b6ce77579309cbdb87437817
@@@ -2,7 -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
   * - this needs to be at least 2 for 5-bit priorities on 7780
   */
  static unsigned int default_prio_level = 2;   /* 2 - 16 */
 -static unsigned int intc_prio_level[NR_IRQS]; /* for now */
 +static unsigned int intc_prio_level[INTC_NR_IRQS];    /* for now */
  
  unsigned int intc_get_dfl_prio_level(void)
  {
@@@ -267,6 -268,9 +268,9 @@@ int __init register_intc_controller(str
                        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) {
  
                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)
diff --combined drivers/sh/intc/handle.c
index f461d5300b81d77fcc06915669c3eb9b56ea8e91,d80799f111dfaf3cd37ef10cf78829e6046cc1ab..7863a44918a293e9a4c5d557349775bd072d0cc2
@@@ -13,7 -13,7 +13,7 @@@
  #include <linux/spinlock.h>
  #include "internals.h"
  
 -static unsigned long ack_handle[NR_IRQS];
 +static unsigned long ack_handle[INTC_NR_IRQS];
  
  static intc_enum __init intc_grp_id(struct intc_desc *desc,
                                    intc_enum enum_id)
@@@ -172,9 -172,8 +172,8 @@@ intc_get_prio_handle(struct intc_desc *
        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 f8db8a70c14eaaa78f6c9571b346de456c619bc8,9ec6d4e7d9e50edd8eeef289c4d6db02f896ec6b..bf461cf99616c04aa9e2655eaee8e62d21c782db
@@@ -1229,17 -1229,20 +1229,20 @@@ static void sci_dma_tx_complete(void *a
        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);
@@@ -1338,7 -1341,7 +1341,7 @@@ static void sci_submit_rx(struct sci_po
                struct scatterlist *sg = &s->sg_rx[i];
                struct dma_async_tx_descriptor *desc;
  
 -              desc = chan->device->device_prep_slave_sg(chan,
 +              desc = dmaengine_prep_slave_sg(chan,
                        sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
  
                if (desc) {
@@@ -1453,7 -1456,7 +1456,7 @@@ static void work_fn_tx(struct work_stru
  
        BUG_ON(!sg_dma_len(sg));
  
 -      desc = chan->device->device_prep_slave_sg(chan,
 +      desc = dmaengine_prep_slave_sg(chan,
                        sg, s->sg_len_tx, DMA_MEM_TO_DEV,
                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc) {
@@@ -1501,8 -1504,10 +1504,10 @@@ static void sci_start_tx(struct uart_po
        }
  
        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) {