1*dbae4258SChristophe Leroy /* SPDX-License-Identifier: GPL-2.0 */ 2*dbae4258SChristophe Leroy /* 3*dbae4258SChristophe Leroy * Driver for CPM (SCC/SMC) serial ports 4*dbae4258SChristophe Leroy * 5*dbae4258SChristophe Leroy * Copyright (C) 2004 Freescale Semiconductor, Inc. 6*dbae4258SChristophe Leroy * 7*dbae4258SChristophe Leroy * 2006 (c) MontaVista Software, Inc. 8*dbae4258SChristophe Leroy * Vitaly Bordug <vbordug@ru.mvista.com> 9*dbae4258SChristophe Leroy */ 10*dbae4258SChristophe Leroy #ifndef CPM_UART_H 11*dbae4258SChristophe Leroy #define CPM_UART_H 12*dbae4258SChristophe Leroy 13*dbae4258SChristophe Leroy #include <linux/platform_device.h> 14*dbae4258SChristophe Leroy 15*dbae4258SChristophe Leroy struct gpio_desc; 16*dbae4258SChristophe Leroy 17*dbae4258SChristophe Leroy #if defined(CONFIG_CPM2) 18*dbae4258SChristophe Leroy #include "asm/cpm2.h" 19*dbae4258SChristophe Leroy #elif defined(CONFIG_CPM1) 20*dbae4258SChristophe Leroy #include "asm/cpm1.h" 21*dbae4258SChristophe Leroy #endif 22*dbae4258SChristophe Leroy 23*dbae4258SChristophe Leroy #define DPRAM_BASE ((u8 __iomem *)cpm_muram_addr(0)) 24*dbae4258SChristophe Leroy 25*dbae4258SChristophe Leroy #define SERIAL_CPM_MAJOR 204 26*dbae4258SChristophe Leroy #define SERIAL_CPM_MINOR 46 27*dbae4258SChristophe Leroy 28*dbae4258SChristophe Leroy #define IS_SMC(pinfo) (pinfo->flags & FLAG_SMC) 29*dbae4258SChristophe Leroy #define FLAG_SMC 0x00000002 30*dbae4258SChristophe Leroy #define FLAG_CONSOLE 0x00000001 31*dbae4258SChristophe Leroy 32*dbae4258SChristophe Leroy #define UART_NR 6 33*dbae4258SChristophe Leroy 34*dbae4258SChristophe Leroy #define RX_NUM_FIFO 4 35*dbae4258SChristophe Leroy #define RX_BUF_SIZE 32 36*dbae4258SChristophe Leroy #define TX_NUM_FIFO 4 37*dbae4258SChristophe Leroy #define TX_BUF_SIZE 32 38*dbae4258SChristophe Leroy 39*dbae4258SChristophe Leroy #define GPIO_CTS 0 40*dbae4258SChristophe Leroy #define GPIO_RTS 1 41*dbae4258SChristophe Leroy #define GPIO_DCD 2 42*dbae4258SChristophe Leroy #define GPIO_DSR 3 43*dbae4258SChristophe Leroy #define GPIO_DTR 4 44*dbae4258SChristophe Leroy #define GPIO_RI 5 45*dbae4258SChristophe Leroy 46*dbae4258SChristophe Leroy #define NUM_GPIOS (GPIO_RI+1) 47*dbae4258SChristophe Leroy 48*dbae4258SChristophe Leroy struct uart_cpm_port { 49*dbae4258SChristophe Leroy struct uart_port port; 50*dbae4258SChristophe Leroy u16 rx_nrfifos; 51*dbae4258SChristophe Leroy u16 rx_fifosize; 52*dbae4258SChristophe Leroy u16 tx_nrfifos; 53*dbae4258SChristophe Leroy u16 tx_fifosize; 54*dbae4258SChristophe Leroy smc_t __iomem *smcp; 55*dbae4258SChristophe Leroy smc_uart_t __iomem *smcup; 56*dbae4258SChristophe Leroy scc_t __iomem *sccp; 57*dbae4258SChristophe Leroy scc_uart_t __iomem *sccup; 58*dbae4258SChristophe Leroy cbd_t __iomem *rx_bd_base; 59*dbae4258SChristophe Leroy cbd_t __iomem *rx_cur; 60*dbae4258SChristophe Leroy cbd_t __iomem *tx_bd_base; 61*dbae4258SChristophe Leroy cbd_t __iomem *tx_cur; 62*dbae4258SChristophe Leroy unsigned char *tx_buf; 63*dbae4258SChristophe Leroy unsigned char *rx_buf; 64*dbae4258SChristophe Leroy u32 flags; 65*dbae4258SChristophe Leroy struct clk *clk; 66*dbae4258SChristophe Leroy u8 brg; 67*dbae4258SChristophe Leroy uint dp_addr; 68*dbae4258SChristophe Leroy void *mem_addr; 69*dbae4258SChristophe Leroy dma_addr_t dma_addr; 70*dbae4258SChristophe Leroy u32 mem_size; 71*dbae4258SChristophe Leroy /* wait on close if needed */ 72*dbae4258SChristophe Leroy int wait_closing; 73*dbae4258SChristophe Leroy /* value to combine with opcode to form cpm command */ 74*dbae4258SChristophe Leroy u32 command; 75*dbae4258SChristophe Leroy struct gpio_desc *gpios[NUM_GPIOS]; 76*dbae4258SChristophe Leroy }; 77*dbae4258SChristophe Leroy 78*dbae4258SChristophe Leroy /* 79*dbae4258SChristophe Leroy virtual to phys transtalion 80*dbae4258SChristophe Leroy */ cpu2cpm_addr(void * addr,struct uart_cpm_port * pinfo)81*dbae4258SChristophe Leroystatic inline unsigned long cpu2cpm_addr(void *addr, 82*dbae4258SChristophe Leroy struct uart_cpm_port *pinfo) 83*dbae4258SChristophe Leroy { 84*dbae4258SChristophe Leroy int offset; 85*dbae4258SChristophe Leroy u32 val = (u32)addr; 86*dbae4258SChristophe Leroy u32 mem = (u32)pinfo->mem_addr; 87*dbae4258SChristophe Leroy /* sane check */ 88*dbae4258SChristophe Leroy if (likely(val >= mem && val < mem + pinfo->mem_size)) { 89*dbae4258SChristophe Leroy offset = val - mem; 90*dbae4258SChristophe Leroy return pinfo->dma_addr + offset; 91*dbae4258SChristophe Leroy } 92*dbae4258SChristophe Leroy /* something nasty happened */ 93*dbae4258SChristophe Leroy BUG(); 94*dbae4258SChristophe Leroy return 0; 95*dbae4258SChristophe Leroy } 96*dbae4258SChristophe Leroy cpm2cpu_addr(unsigned long addr,struct uart_cpm_port * pinfo)97*dbae4258SChristophe Leroystatic inline void *cpm2cpu_addr(unsigned long addr, 98*dbae4258SChristophe Leroy struct uart_cpm_port *pinfo) 99*dbae4258SChristophe Leroy { 100*dbae4258SChristophe Leroy int offset; 101*dbae4258SChristophe Leroy u32 val = addr; 102*dbae4258SChristophe Leroy u32 dma = (u32)pinfo->dma_addr; 103*dbae4258SChristophe Leroy /* sane check */ 104*dbae4258SChristophe Leroy if (likely(val >= dma && val < dma + pinfo->mem_size)) { 105*dbae4258SChristophe Leroy offset = val - dma; 106*dbae4258SChristophe Leroy return pinfo->mem_addr + offset; 107*dbae4258SChristophe Leroy } 108*dbae4258SChristophe Leroy /* something nasty happened */ 109*dbae4258SChristophe Leroy BUG(); 110*dbae4258SChristophe Leroy return NULL; 111*dbae4258SChristophe Leroy } 112*dbae4258SChristophe Leroy 113*dbae4258SChristophe Leroy 114*dbae4258SChristophe Leroy #endif /* CPM_UART_H */ 115