2008-10-21 17:06:30 +04:00
/* linux/drivers/serial/s3c24a0.c
*
* Driver for Samsung S3C24A0 SoC onboard UARTs .
*
* Based on drivers / serial / s3c2410 . c
*
* Author : Sandeep Patil < sandeep . patil @ azingo . com >
*
2009-11-14 01:54:14 +03:00
* Ben Dooks , Copyright ( c ) 2003 - 2008 Simtec Electronics
2008-10-21 17:06:30 +04: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 .
*/
# include <linux/module.h>
# include <linux/ioport.h>
# include <linux/platform_device.h>
# include <linux/init.h>
# include <linux/serial_core.h>
# include <linux/serial.h>
# include <linux/io.h>
# include <linux/irq.h>
# include <mach/hardware.h>
# include <plat/regs-serial.h>
# include <mach/regs-gpio.h>
# include "samsung.h"
static int s3c24a0_serial_setsource ( struct uart_port * port ,
struct s3c24xx_uart_clksrc * clk )
{
unsigned long ucon = rd_regl ( port , S3C2410_UCON ) ;
if ( strcmp ( clk - > name , " uclk " ) = = 0 )
ucon | = S3C2410_UCON_UCLK ;
else
ucon & = ~ S3C2410_UCON_UCLK ;
wr_regl ( port , S3C2410_UCON , ucon ) ;
return 0 ;
}
static int s3c24a0_serial_getsource ( struct uart_port * port ,
struct s3c24xx_uart_clksrc * clk )
{
unsigned long ucon = rd_regl ( port , S3C2410_UCON ) ;
clk - > divisor = 1 ;
clk - > name = ( ucon & S3C2410_UCON_UCLK ) ? " uclk " : " pclk " ;
return 0 ;
}
static int s3c24a0_serial_resetport ( struct uart_port * port ,
struct s3c2410_uartcfg * cfg )
{
dbg ( " s3c24a0_serial_resetport: port=%p (%08lx), cfg=%p \n " ,
port , port - > mapbase , cfg ) ;
wr_regl ( port , S3C2410_UCON , cfg - > ucon ) ;
wr_regl ( port , S3C2410_ULCON , cfg - > ulcon ) ;
/* reset both fifos */
wr_regl ( port , S3C2410_UFCON , cfg - > ufcon | S3C2410_UFCON_RESETBOTH ) ;
wr_regl ( port , S3C2410_UFCON , cfg - > ufcon ) ;
return 0 ;
}
static struct s3c24xx_uart_info s3c24a0_uart_inf = {
. name = " Samsung S3C24A0 UART " ,
. type = PORT_S3C2410 ,
. fifosize = 16 ,
. rx_fifomask = S3C24A0_UFSTAT_RXMASK ,
. rx_fifoshift = S3C24A0_UFSTAT_RXSHIFT ,
. rx_fifofull = S3C24A0_UFSTAT_RXFULL ,
. tx_fifofull = S3C24A0_UFSTAT_TXFULL ,
. tx_fifomask = S3C24A0_UFSTAT_TXMASK ,
. tx_fifoshift = S3C24A0_UFSTAT_TXSHIFT ,
. get_clksrc = s3c24a0_serial_getsource ,
. set_clksrc = s3c24a0_serial_setsource ,
. reset_port = s3c24a0_serial_resetport ,
} ;
static int s3c24a0_serial_probe ( struct platform_device * dev )
{
return s3c24xx_serial_probe ( dev , & s3c24a0_uart_inf ) ;
}
2009-07-09 12:28:33 +04:00
static struct platform_driver s3c24a0_serial_driver = {
2008-10-21 17:06:30 +04:00
. probe = s3c24a0_serial_probe ,
2009-06-22 21:42:49 +04:00
. remove = __devexit_p ( s3c24xx_serial_remove ) ,
2008-10-21 17:06:30 +04:00
. driver = {
. name = " s3c24a0-uart " ,
. owner = THIS_MODULE ,
} ,
} ;
2009-07-09 12:28:33 +04:00
s3c24xx_console_init ( & s3c24a0_serial_driver , & s3c24a0_uart_inf ) ;
2008-10-21 17:06:30 +04:00
static int __init s3c24a0_serial_init ( void )
{
2009-07-09 12:28:33 +04:00
return s3c24xx_serial_init ( & s3c24a0_serial_driver , & s3c24a0_uart_inf ) ;
2008-10-21 17:06:30 +04:00
}
static void __exit s3c24a0_serial_exit ( void )
{
2009-07-09 12:28:33 +04:00
platform_driver_unregister ( & s3c24a0_serial_driver ) ;
2008-10-21 17:06:30 +04:00
}
module_init ( s3c24a0_serial_init ) ;
module_exit ( s3c24a0_serial_exit ) ;