]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'sh/g3-prep'
authorPaul Mundt <lethal@linux-sh.org>
Thu, 2 Oct 2008 10:14:11 +0000 (19:14 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 2 Oct 2008 10:14:11 +0000 (19:14 +0900)
1  2 
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h

diff --combined drivers/serial/sh-sci.c
index 5bb57154855849a27e4cae6699ae916f10c37e3f,ac658a7a27becaaf253101a1d2176ce434237a80..3b9d2d83b59008df447dfcff84bb1fc33e5f4425
@@@ -3,7 -3,7 +3,7 @@@
   *
   * SuperH on-chip serial module support.  (SCI with no FIFO / with FIFO)
   *
-  *  Copyright (C) 2002 - 2006  Paul Mundt
+  *  Copyright (C) 2002 - 2008  Paul Mundt
   *  Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007).
   *
   * based off of the old drivers/char/sh-sci.c by:
@@@ -46,6 -46,7 +46,7 @@@
  #include <linux/cpufreq.h>
  #include <linux/clk.h>
  #include <linux/ctype.h>
+ #include <linux/err.h>
  
  #ifdef CONFIG_SUPERH
  #include <asm/clock.h>
@@@ -78,7 -79,7 +79,7 @@@ struct sci_port 
        struct timer_list       break_timer;
        int                     break_flag;
  
 -#ifdef CONFIG_SUPERH
 +#ifdef CONFIG_HAVE_CLK
        /* Port clock */
        struct clk              *clk;
  #endif
@@@ -831,7 -832,7 +832,7 @@@ static irqreturn_t sci_mpxed_interrupt(
        return IRQ_HANDLED;
  }
  
 -#ifdef CONFIG_CPU_FREQ
 +#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK)
  /*
   * Here we define a transistion notifier so that we can update all of our
   * ports' baud rate when the peripheral clock changes.
@@@ -860,7 -861,7 +861,7 @@@ static int sci_notifier(struct notifier
                         * Clean this up later..
                         */
                        clk = clk_get(NULL, "module_clk");
 -                      port->uartclk = clk_get_rate(clk) * 16;
 +                      port->uartclk = clk_get_rate(clk);
                        clk_put(clk);
                }
  
  }
  
  static struct notifier_block sci_nb = { &sci_notifier, NULL, 0 };
 -#endif /* CONFIG_CPU_FREQ */
 +#endif /* CONFIG_CPU_FREQ && CONFIG_HAVE_CLK */
  
  static int sci_request_irq(struct sci_port *port)
  {
@@@ -1008,7 -1009,7 +1009,7 @@@ static int sci_startup(struct uart_por
        if (s->enable)
                s->enable(port);
  
 -#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
 +#ifdef CONFIG_HAVE_CLK
        s->clk = clk_get(NULL, "module_clk");
  #endif
  
@@@ -1030,7 -1031,7 +1031,7 @@@ static void sci_shutdown(struct uart_po
        if (s->disable)
                s->disable(port);
  
 -#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
 +#ifdef CONFIG_HAVE_CLK
        clk_put(s->clk);
        s->clk = NULL;
  #endif
@@@ -1041,11 -1042,24 +1042,11 @@@ static void sci_set_termios(struct uart
  {
        struct sci_port *s = &sci_ports[port->line];
        unsigned int status, baud, smr_val;
 -      int t;
 +      int t = -1;
  
        baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
 -
 -      switch (baud) {
 -              case 0:
 -                      t = -1;
 -                      break;
 -              default:
 -              {
 -#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
 -                      t = SCBRR_VALUE(baud, clk_get_rate(s->clk));
 -#else
 -                      t = SCBRR_VALUE(baud);
 -#endif
 -                      break;
 -              }
 -      }
 +      if (likely(baud))
 +              t = SCBRR_VALUE(baud, port->uartclk);
  
        do {
                status = sci_in(port, SCxSR);
@@@ -1132,12 -1146,16 +1133,16 @@@ static void sci_config_port(struct uart
                break;
        }
  
- #if defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
      if (port->mapbase == 0)
+       if (port->flags & UPF_IOREMAP && !port->membase) {
#if defined(CONFIG_SUPERH64)
                port->mapbase = onchip_remap(SCIF_ADDR_SH5, 1024, "SCIF");
-       port->membase = (void __iomem *)port->mapbase;
+               port->membase = (void __iomem *)port->mapbase;
+ #else
+               port->membase = ioremap_nocache(port->mapbase, 0x40);
  #endif
+               printk(KERN_ERR "sci: can't remap port#%d\n", port->line);
+       }
  }
  
  static int sci_verify_port(struct uart_port *port, struct serial_struct *ser)
@@@ -1194,17 -1212,17 +1199,17 @@@ static void __init sci_init_ports(void
                sci_ports[i].disable    = h8300_sci_disable;
  #endif
                sci_ports[i].port.uartclk = CONFIG_CPU_CLOCK;
 -#elif defined(CONFIG_SUPERH64)
 -              sci_ports[i].port.uartclk = current_cpu_data.module_clock * 16;
 -#else
 +#elif defined(CONFIG_HAVE_CLK)
                /*
                 * XXX: We should use a proper SCI/SCIF clock
                 */
                {
                        struct clk *clk = clk_get(NULL, "module_clk");
 -                      sci_ports[i].port.uartclk = clk_get_rate(clk) * 16;
 +                      sci_ports[i].port.uartclk = clk_get_rate(clk);
                        clk_put(clk);
                }
 +#else
 +#error "Need a valid uartclk"
  #endif
  
                sci_ports[i].break_timer.data = (unsigned long)&sci_ports[i];
@@@ -1272,7 -1290,7 +1277,7 @@@ static int __init serial_console_setup(
  
        port->type = serial_console_port->type;
  
 -#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
 +#ifdef CONFIG_HAVE_CLK
        if (!serial_console_port->clk)
                serial_console_port->clk = clk_get(NULL, "module_clk");
  #endif
@@@ -1423,7 -1441,7 +1428,7 @@@ static struct uart_driver sci_uart_driv
  static int __devinit sci_probe(struct platform_device *dev)
  {
        struct plat_sci_port *p = dev->dev.platform_data;
-       int i;
+       int i, ret = -EINVAL;
  
        for (i = 0; p && p->flags != 0; p++, i++) {
                struct sci_port *sciport = &sci_ports[i];
  
                sciport->port.mapbase   = p->mapbase;
  
-               /*
-                * For the simple (and majority of) cases where we don't need
-                * to do any remapping, just cast the cookie directly.
-                */
-               if (p->mapbase && !p->membase && !(p->flags & UPF_IOREMAP))
-                       p->membase = (void __iomem *)p->mapbase;
+               if (p->mapbase && !p->membase) {
+                       if (p->flags & UPF_IOREMAP) {
+                               p->membase = ioremap_nocache(p->mapbase, 0x40);
+                               if (IS_ERR(p->membase)) {
+                                       ret = PTR_ERR(p->membase);
+                                       goto err_unreg;
+                               }
+                       } else {
+                               /*
+                                * For the simple (and majority of) cases
+                                * where we don't need to do any remapping,
+                                * just cast the cookie directly.
+                                */
+                               p->membase = (void __iomem *)p->mapbase;
+                       }
+               }
  
                sciport->port.membase   = p->membase;
  
        kgdb_putchar    = kgdb_sci_putchar;
  #endif
  
 -#ifdef CONFIG_CPU_FREQ
 +#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK)
        cpufreq_register_notifier(&sci_nb, CPUFREQ_TRANSITION_NOTIFIER);
        dev_info(&dev->dev, "CPU frequency notifier registered\n");
  #endif
  #endif
  
        return 0;
+ err_unreg:
+       for (i = i - 1; i >= 0; i--)
+               uart_remove_one_port(&sci_uart_driver, &sci_ports[i].port);
+       return ret;
  }
  
  static int __devexit sci_remove(struct platform_device *dev)
diff --combined drivers/serial/sh-sci.h
index b3d906bfbd87b84b391c6423172cdf394e1451db,2b4c1dff1e85fdc47235afcb2cb997c222ab3c04..511c10d42187018de5e1f2de77a1b7a590a1b7ef
  #define SCI_EVENT_WRITE_WAKEUP        0
  
  #define SCI_IN(size, offset)                                  \
-   unsigned int addr = port->mapbase + (offset);                       \
    if ((size) == 8) {                                          \
-     return ctrl_inb(addr);                                    \
+     return ioread8(port->membase + (offset));                 \
    } else {                                                    \
-     return ctrl_inw(addr);                                    \
+     return ioread16(port->membase + (offset));                        \
    }
  #define SCI_OUT(size, offset, value)                          \
-   unsigned int addr = port->mapbase + (offset);                       \
    if ((size) == 8) {                                          \
-     ctrl_outb(value, addr);                                   \
+     iowrite8(value, port->membase + (offset));                        \
    } else if ((size) == 16) {                                  \
-     ctrl_outw(value, addr);                                   \
+     iowrite16(value, port->membase + (offset));                       \
    }
  
  #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
@@@ -793,7 -791,9 +791,7 @@@ static inline int sci_rxd_in(struct uar
  #elif defined(CONFIG_CPU_SUBTYPE_SH7723)
  #define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(16*bps)-1)
  #elif defined(__H8300H__) || defined(__H8300S__)
 -#define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1)
 -#elif defined(CONFIG_SUPERH64)
 -#define SCBRR_VALUE(bps) ((current_cpu_data.module_clock+16*bps)/(32*bps)-1)
 +#define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
  #else /* Generic SH */
  #define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
  #endif