]> err.no Git - linux-2.6/blobdiff - drivers/serial/cpm_uart/cpm_uart_cpm2.c
cciss: fix regression that no device nodes are created if no logical drives are confi...
[linux-2.6] / drivers / serial / cpm_uart / cpm_uart_cpm2.c
index 882dbc17d590bc700e5c6d8af6fa086314197924..bb862e2f54cfdbdd98d0243dbaebc33df4bcb4e1 100644 (file)
@@ -41,6 +41,9 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/fs_pd.h>
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+#include <asm/prom.h>
+#endif
 
 #include <linux/serial_core.h>
 #include <linux/kernel.h>
 #ifdef CONFIG_PPC_CPM_NEW_BINDING
 void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
 {
-       cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm);
+       cpm_command(port->command, cmd);
+}
 
-       out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG);
-       while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG)
-               ;
+void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
+                               struct device_node *np)
+{
+       void __iomem *pram;
+       unsigned long offset;
+       struct resource res;
+       unsigned long len;
 
-       cpm2_unmap(cp);
+       /* Don't remap parameter RAM if it has already been initialized
+        * during console setup.
+        */
+       if (IS_SMC(port) && port->smcup)
+               return port->smcup;
+       else if (!IS_SMC(port) && port->sccup)
+               return port->sccup;
+
+       if (of_address_to_resource(np, 1, &res))
+               return NULL;
+
+       len = 1 + res.end - res.start;
+       pram = ioremap(res.start, len);
+       if (!pram)
+               return NULL;
+
+       if (!IS_SMC(port))
+               return pram;
+
+       if (len != 2) {
+               printk(KERN_WARNING "cpm_uart[%d]: device tree references "
+                       "SMC pram, using boot loader/wrapper pram mapping. "
+                       "Please fix your device tree to reference the pram "
+                       "base register instead.\n",
+                       port->port.line);
+               return pram;
+       }
+
+       offset = cpm_dpalloc(PROFF_SMC_SIZE, 64);
+       out_be16(pram, offset);
+       iounmap(pram);
+       return cpm_muram_addr(offset);
+}
+
+void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
+{
+       if (!IS_SMC(port))
+               iounmap(pram);
 }
+
 #else
 void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
 {
@@ -171,9 +217,9 @@ void scc2_lineif(struct uart_cpm_port *pinfo)
         * really has to get out of the driver so boards can
         * be supported in a sane fashion.
         */
+       volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
 #ifndef CONFIG_STX_GP3
        volatile iop_cpm2_t *io = cpm2_map(im_ioport);
-       volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
 
        io->iop_pparb |= 0x008b0000;
        io->iop_pdirb |= 0x00880000;