2011-01-04 23:28:14 +03:00
/*
* Atheros AR71XX / AR724X / AR913X common devices
*
* Copyright ( C ) 2008 - 2011 Gabor Juhos < juhosg @ openwrt . org >
* Copyright ( C ) 2008 Imre Kaloz < kaloz @ openwrt . org >
*
* Parts of this file are based on Atheros ' 2.6 .15 BSP
*
* 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/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/serial_8250.h>
# include <linux/clk.h>
# include <linux/err.h>
# include <asm/mach-ath79/ath79.h>
# include <asm/mach-ath79/ar71xx_regs.h>
2011-06-20 21:26:12 +04:00
# include <asm/mach-ath79/ar933x_uart_platform.h>
2011-01-04 23:28:14 +03:00
# include "common.h"
# include "dev-common.h"
static struct resource ath79_uart_resources [ ] = {
{
. start = AR71XX_UART_BASE ,
. end = AR71XX_UART_BASE + AR71XX_UART_SIZE - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
# define AR71XX_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
static struct plat_serial8250_port ath79_uart_data [ ] = {
{
. mapbase = AR71XX_UART_BASE ,
. irq = ATH79_MISC_IRQ_UART ,
. flags = AR71XX_UART_FLAGS ,
. iotype = UPIO_MEM32 ,
. regshift = 2 ,
} , {
/* terminating entry */
}
} ;
static struct platform_device ath79_uart_device = {
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM ,
. resource = ath79_uart_resources ,
. num_resources = ARRAY_SIZE ( ath79_uart_resources ) ,
. dev = {
. platform_data = ath79_uart_data
} ,
} ;
2011-06-20 21:26:12 +04:00
static struct resource ar933x_uart_resources [ ] = {
{
. start = AR933X_UART_BASE ,
. end = AR933X_UART_BASE + AR71XX_UART_SIZE - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = ATH79_MISC_IRQ_UART ,
. end = ATH79_MISC_IRQ_UART ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct ar933x_uart_platform_data ar933x_uart_data ;
static struct platform_device ar933x_uart_device = {
. name = " ar933x-uart " ,
. id = - 1 ,
. resource = ar933x_uart_resources ,
. num_resources = ARRAY_SIZE ( ar933x_uart_resources ) ,
. dev = {
. platform_data = & ar933x_uart_data ,
} ,
} ;
2011-01-04 23:28:14 +03:00
void __init ath79_register_uart ( void )
{
struct clk * clk ;
clk = clk_get ( NULL , " uart " ) ;
if ( IS_ERR ( clk ) )
panic ( " unable to get UART clock, err=%ld " , PTR_ERR ( clk ) ) ;
2011-06-20 21:26:12 +04:00
if ( soc_is_ar71xx ( ) | |
soc_is_ar724x ( ) | |
2012-03-14 13:45:27 +04:00
soc_is_ar913x ( ) | |
soc_is_ar934x ( ) ) {
2011-06-20 21:26:12 +04:00
ath79_uart_data [ 0 ] . uartclk = clk_get_rate ( clk ) ;
platform_device_register ( & ath79_uart_device ) ;
} else if ( soc_is_ar933x ( ) ) {
ar933x_uart_data . uartclk = clk_get_rate ( clk ) ;
platform_device_register ( & ar933x_uart_device ) ;
} else {
BUG ( ) ;
}
2011-01-04 23:28:14 +03:00
}
2011-01-04 23:28:20 +03:00
static struct platform_device ath79_wdt_device = {
. name = " ath79-wdt " ,
. id = - 1 ,
} ;
void __init ath79_register_wdt ( void )
{
platform_device_register ( & ath79_wdt_device ) ;
}