Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / serial / cpm_uart / cpm_uart_cpm1.c
index 7c940b5..17406a0 100644 (file)
@@ -3,11 +3,13 @@
  *
  *  Driver for CPM (SCC/SMC) serial ports; CPM1 definitions
  *
- *  Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2)
+ *  Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
  *              Pantelis Antoniou (panto@intracom.gr) (CPM1)
- * 
+ *
  *  Copyright (C) 2004 Freescale Semiconductor, Inc.
  *            (C) 2004 Intracom, S.A.
+ *            (C) 2006 MontaVista Software, Inc.
+ *             Vitaly Bordug <vbordug@ru.mvista.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -81,18 +83,11 @@ void cpm_line_cr_cmd(int line, int cmd)
 
 void smc1_lineif(struct uart_cpm_port *pinfo)
 {
-       volatile cpm8xx_t *cp = cpmp;
-
-       cp->cp_pbpar |= 0x000000c0;
-       cp->cp_pbdir &= ~0x000000c0;
-       cp->cp_pbodr &= ~0x000000c0;
-
        pinfo->brg = 1;
 }
 
 void smc2_lineif(struct uart_cpm_port *pinfo)
 {
-       /* XXX SMC2: insert port configuration here */
        pinfo->brg = 2;
 }
 
@@ -121,7 +116,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo)
 }
 
 /*
- * Allocate DP-Ram and memory buffers. We need to allocate a transmit and 
+ * Allocate DP-Ram and memory buffers. We need to allocate a transmit and
  * receive buffer descriptors from dual port ram, and a character
  * buffer area from host mem. If we are allocating for the console we need
  * to do it from bootmem
@@ -130,40 +125,43 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
 {
        int dpmemsz, memsz;
        u8 *dp_mem;
-       uint dp_addr;
+       uint dp_offset;
        u8 *mem_addr;
-       dma_addr_t dma_addr;
+       dma_addr_t dma_addr = 0;
 
        pr_debug("CPM uart[%d]:allocbuf\n", pinfo->port.line);
 
        dpmemsz = sizeof(cbd_t) * (pinfo->rx_nrfifos + pinfo->tx_nrfifos);
-       dp_mem = m8xx_cpm_dpalloc(dpmemsz);
-       if (dp_mem == NULL) {
+       dp_offset = cpm_dpalloc(dpmemsz, 8);
+       if (IS_DPERR(dp_offset)) {
                printk(KERN_ERR
                       "cpm_uart_cpm1.c: could not allocate buffer descriptors\n");
                return -ENOMEM;
        }
-       dp_addr = m8xx_cpm_dpram_offset(dp_mem);
+       dp_mem = cpm_dpram_addr(dp_offset);
 
        memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) +
            L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
        if (is_con) {
-               mem_addr = (u8 *) m8xx_cpm_hostalloc(memsz);
-               dma_addr = 0;
+               /* was hostalloc but changed cause it blows away the */
+               /* large tlb mapping when pinning the kernel area    */
+               mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8));
+               dma_addr = (u32)mem_addr;
        } else
                mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr,
                                              GFP_KERNEL);
 
        if (mem_addr == NULL) {
-               m8xx_cpm_dpfree(dp_mem);
+               cpm_dpfree(dp_offset);
                printk(KERN_ERR
                       "cpm_uart_cpm1.c: could not allocate coherent memory\n");
                return -ENOMEM;
        }
 
-       pinfo->dp_addr = dp_addr;
-       pinfo->mem_addr = mem_addr;
-       pinfo->dma_addr = dma_addr;
+       pinfo->dp_addr = dp_offset;
+       pinfo->mem_addr = mem_addr;             /*  virtual address*/
+       pinfo->dma_addr = dma_addr;             /*  physical address*/
+       pinfo->mem_size = memsz;
 
        pinfo->rx_buf = mem_addr;
        pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
@@ -183,7 +181,7 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
                                         pinfo->tx_fifosize), pinfo->mem_addr,
                          pinfo->dma_addr);
 
-       m8xx_cpm_dpfree(m8xx_cpm_dpram_addr(pinfo->dp_addr));
+       cpm_dpfree(pinfo->dp_addr);
 }
 
 /* Setup any dynamic params in the uart desc */
@@ -194,8 +192,16 @@ int cpm_uart_init_portdesc(void)
        cpm_uart_nr = 0;
 #ifdef CONFIG_SERIAL_CPM_SMC1
        cpm_uart_ports[UART_SMC1].smcp = &cpmp->cp_smc[0];
+/*
+ *  Is SMC1 being relocated?
+ */
+# ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
+       cpm_uart_ports[UART_SMC1].smcup =
+           (smc_uart_t *) & cpmp->cp_dparam[0x3C0];
+# else
        cpm_uart_ports[UART_SMC1].smcup =
            (smc_uart_t *) & cpmp->cp_dparam[PROFF_SMC1];
+# endif
        cpm_uart_ports[UART_SMC1].port.mapbase =
            (unsigned long)&cpmp->cp_smc[0];
        cpm_uart_ports[UART_SMC1].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);