2014-05-20 14:05:50 -07:00
# ifndef __SAMSUNG_H
# define __SAMSUNG_H
2011-03-30 05:30:41 -04:00
/*
2008-07-03 12:32:51 +01:00
* Driver for Samsung SoC onboard UARTs .
*
2009-11-13 22:54:14 +00:00
* Ben Dooks , Copyright ( c ) 2003 - 2008 Simtec Electronics
2008-07-03 12:32:51 +01:00
* http : //armlinux.simtec.co.uk/
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2014-12-10 12:49:22 +01:00
# include <linux/dmaengine.h>
2008-07-03 12:32:51 +01:00
struct s3c24xx_uart_info {
char * name ;
unsigned int type ;
unsigned int fifosize ;
unsigned long rx_fifomask ;
unsigned long rx_fifoshift ;
unsigned long rx_fifofull ;
unsigned long tx_fifomask ;
unsigned long tx_fifoshift ;
unsigned long tx_fifofull ;
2011-10-24 11:47:46 +02:00
unsigned int def_clk_sel ;
unsigned long num_clks ;
unsigned long clksel_mask ;
unsigned long clksel_shift ;
2008-07-03 12:32:51 +01:00
2008-12-12 00:24:21 +00:00
/* uart port features */
unsigned int has_divslot : 1 ;
2008-07-03 12:32:51 +01:00
/* uart controls */
int ( * reset_port ) ( struct uart_port * , struct s3c2410_uartcfg * ) ;
} ;
2011-11-02 19:23:25 +09:00
struct s3c24xx_serial_drv_data {
struct s3c24xx_uart_info * info ;
struct s3c2410_uartcfg * def_cfg ;
unsigned int fifosize [ CONFIG_SERIAL_SAMSUNG_UARTS ] ;
} ;
2014-12-10 12:49:22 +01:00
struct s3c24xx_uart_dma {
dma_filter_fn fn ;
void * rx_param ;
void * tx_param ;
unsigned int rx_chan_id ;
unsigned int tx_chan_id ;
struct dma_slave_config rx_conf ;
struct dma_slave_config tx_conf ;
struct dma_chan * rx_chan ;
struct dma_chan * tx_chan ;
dma_addr_t rx_addr ;
dma_addr_t tx_addr ;
dma_cookie_t rx_cookie ;
dma_cookie_t tx_cookie ;
char * rx_buf ;
dma_addr_t tx_transfer_addr ;
size_t rx_size ;
size_t tx_size ;
struct dma_async_tx_descriptor * tx_desc ;
struct dma_async_tx_descriptor * rx_desc ;
int tx_bytes_requested ;
int rx_bytes_requested ;
} ;
2008-07-03 12:32:51 +01:00
struct s3c24xx_uart_port {
unsigned char rx_claimed ;
unsigned char tx_claimed ;
2008-10-21 14:06:36 +01:00
unsigned int pm_level ;
unsigned long baudclk_rate ;
2008-07-03 12:32:51 +01:00
2008-10-21 14:07:04 +01:00
unsigned int rx_irq ;
unsigned int tx_irq ;
2014-12-10 12:49:26 +01:00
unsigned int tx_in_progress ;
unsigned int tx_mode ;
2014-12-10 12:49:27 +01:00
unsigned int rx_mode ;
2014-12-10 12:49:26 +01:00
2008-07-03 12:32:51 +01:00
struct s3c24xx_uart_info * info ;
struct clk * clk ;
struct clk * baudclk ;
struct uart_port port ;
2011-11-02 19:23:25 +09:00
struct s3c24xx_serial_drv_data * drv_data ;
2008-10-21 14:06:36 +01:00
2011-10-24 11:47:25 +02:00
/* reference to platform data */
struct s3c2410_uartcfg * cfg ;
2014-12-10 12:49:22 +01:00
struct s3c24xx_uart_dma * dma ;
2008-10-21 14:06:36 +01:00
# ifdef CONFIG_CPU_FREQ
struct notifier_block freq_transition ;
# endif
2008-07-03 12:32:51 +01:00
} ;
/* conversion functions */
2013-09-09 14:10:30 +09:00
# define s3c24xx_dev_to_port(__dev) dev_get_drvdata(__dev)
2008-07-03 12:32:51 +01:00
/* register access controls */
# define portaddr(port, reg) ((port)->membase + (reg))
2013-08-08 17:29:48 +09:00
# define portaddrl(port, reg) \
( ( unsigned long * ) ( unsigned long ) ( ( port ) - > membase + ( reg ) ) )
2008-07-03 12:32:51 +01:00
# define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
# define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
# define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
# define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
# endif