2011-05-15 13:32:41 +02:00
/*
* arch / arm / plat - orion / common . c
*
* Marvell Orion SoC common setup code used by multiple mach - / common . c
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
2011-05-15 13:32:44 +02:00
# include <linux/dma-mapping.h>
2011-05-15 13:32:41 +02:00
# include <linux/serial_8250.h>
2011-05-15 13:32:50 +02:00
# include <linux/ata_platform.h>
2011-12-15 08:15:07 +01:00
# include <linux/clk.h>
# include <linux/clkdev.h>
2011-05-15 13:32:44 +02:00
# include <linux/mv643xx_eth.h>
2011-05-15 13:32:45 +02:00
# include <linux/mv643xx_i2c.h>
2019-01-15 15:06:12 -08:00
# include <linux/platform_data/dsa.h>
2012-08-24 15:21:54 +02:00
# include <linux/platform_data/dma-mv_xor.h>
# include <linux/platform_data/usb-ehci-orion.h>
2013-10-23 16:12:50 +02:00
# include <plat/common.h>
2017-02-04 13:02:45 -08:00
# include <linux/phy.h>
2011-05-15 13:32:41 +02:00
2012-04-06 17:17:26 +02:00
/* Create a clkdev entry for a given device/clk */
void __init orion_clkdev_add ( const char * con_id , const char * dev_id ,
struct clk * clk )
{
2015-03-02 15:35:22 +00:00
clkdev_create ( clk , con_id , " %s " , dev_id ) ;
2012-04-06 17:17:26 +02:00
}
/* Create clkdev entries for all orion platforms except kirkwood.
Kirkwood has gated clocks for some of its peripherals , so creates
its own clkdev entries . For all the other orion devices , create
clkdev entries to the tclk . */
void __init orion_clkdev_init ( struct clk * tclk )
{
orion_clkdev_add ( NULL , " orion_spi.0 " , tclk ) ;
orion_clkdev_add ( NULL , " orion_spi.1 " , tclk ) ;
2011-12-24 01:24:24 +01:00
orion_clkdev_add ( NULL , MV643XX_ETH_NAME " .0 " , tclk ) ;
orion_clkdev_add ( NULL , MV643XX_ETH_NAME " .1 " , tclk ) ;
orion_clkdev_add ( NULL , MV643XX_ETH_NAME " .2 " , tclk ) ;
orion_clkdev_add ( NULL , MV643XX_ETH_NAME " .3 " , tclk ) ;
2012-03-04 16:57:31 +01:00
orion_clkdev_add ( NULL , " orion_wdt " , tclk ) ;
2012-07-20 13:51:55 +02:00
orion_clkdev_add ( NULL , MV64XXX_I2C_CTLR_NAME " .0 " , tclk ) ;
2012-04-06 17:17:26 +02:00
}
2011-05-15 13:32:41 +02:00
/* Fill in the resources structure and link it into the platform
device structure . There is always a memory region , and nearly
always an interrupt . */
static void fill_resources ( struct platform_device * device ,
struct resource * resources ,
resource_size_t mapbase ,
2016-09-06 16:06:21 +02:00
resource_size_t size )
2011-05-15 13:32:41 +02:00
{
device - > resource = resources ;
device - > num_resources = 1 ;
resources [ 0 ] . flags = IORESOURCE_MEM ;
resources [ 0 ] . start = mapbase ;
resources [ 0 ] . end = mapbase + size ;
2016-09-06 16:06:21 +02:00
}
2011-05-15 13:32:41 +02:00
2016-09-06 16:06:21 +02:00
static void fill_resources_irq ( struct platform_device * device ,
struct resource * resources ,
resource_size_t mapbase ,
resource_size_t size ,
unsigned int irq )
{
fill_resources ( device , resources , mapbase , size ) ;
device - > num_resources + + ;
resources [ 1 ] . flags = IORESOURCE_IRQ ;
resources [ 1 ] . start = irq ;
resources [ 1 ] . end = irq ;
2011-05-15 13:32:41 +02:00
}
/*****************************************************************************
* UART
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-12-24 03:06:34 +01:00
static unsigned long __init uart_get_clk_rate ( struct clk * clk )
{
clk_prepare_enable ( clk ) ;
return clk_get_rate ( clk ) ;
}
2011-05-15 13:32:41 +02:00
static void __init uart_complete (
struct platform_device * orion_uart ,
struct plat_serial8250_port * data ,
struct resource * resources ,
2012-09-11 14:27:23 +02:00
void __iomem * membase ,
2011-05-15 13:32:41 +02:00
resource_size_t mapbase ,
unsigned int irq ,
2011-12-24 03:06:34 +01:00
struct clk * clk )
2011-05-15 13:32:41 +02:00
{
data - > mapbase = mapbase ;
2012-09-11 14:27:23 +02:00
data - > membase = membase ;
2011-05-15 13:32:41 +02:00
data - > irq = irq ;
2011-12-24 03:06:34 +01:00
data - > uartclk = uart_get_clk_rate ( clk ) ;
2011-05-15 13:32:41 +02:00
orion_uart - > dev . platform_data = data ;
2016-09-06 16:06:21 +02:00
fill_resources_irq ( orion_uart , resources , mapbase , 0xff , irq ) ;
2011-05-15 13:32:41 +02:00
platform_device_register ( orion_uart ) ;
}
/*****************************************************************************
* UART0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct plat_serial8250_port orion_uart0_data [ ] = {
{
. flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} , {
} ,
} ;
static struct resource orion_uart0_resources [ 2 ] ;
static struct platform_device orion_uart0 = {
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM ,
} ;
2012-09-11 14:27:23 +02:00
void __init orion_uart0_init ( void __iomem * membase ,
2011-05-15 13:32:41 +02:00
resource_size_t mapbase ,
unsigned int irq ,
2011-12-24 03:06:34 +01:00
struct clk * clk )
2011-05-15 13:32:41 +02:00
{
uart_complete ( & orion_uart0 , orion_uart0_data , orion_uart0_resources ,
2011-12-24 03:06:34 +01:00
membase , mapbase , irq , clk ) ;
2011-05-15 13:32:41 +02:00
}
/*****************************************************************************
* UART1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct plat_serial8250_port orion_uart1_data [ ] = {
{
. flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} , {
} ,
} ;
static struct resource orion_uart1_resources [ 2 ] ;
static struct platform_device orion_uart1 = {
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM1 ,
} ;
2012-09-11 14:27:23 +02:00
void __init orion_uart1_init ( void __iomem * membase ,
2011-05-15 13:32:41 +02:00
resource_size_t mapbase ,
unsigned int irq ,
2011-12-24 03:06:34 +01:00
struct clk * clk )
2011-05-15 13:32:41 +02:00
{
uart_complete ( & orion_uart1 , orion_uart1_data , orion_uart1_resources ,
2011-12-24 03:06:34 +01:00
membase , mapbase , irq , clk ) ;
2011-05-15 13:32:41 +02:00
}
/*****************************************************************************
* UART2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct plat_serial8250_port orion_uart2_data [ ] = {
{
. flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} , {
} ,
} ;
static struct resource orion_uart2_resources [ 2 ] ;
static struct platform_device orion_uart2 = {
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM2 ,
} ;
2012-09-11 14:27:23 +02:00
void __init orion_uart2_init ( void __iomem * membase ,
2011-05-15 13:32:41 +02:00
resource_size_t mapbase ,
unsigned int irq ,
2011-12-24 03:06:34 +01:00
struct clk * clk )
2011-05-15 13:32:41 +02:00
{
uart_complete ( & orion_uart2 , orion_uart2_data , orion_uart2_resources ,
2011-12-24 03:06:34 +01:00
membase , mapbase , irq , clk ) ;
2011-05-15 13:32:41 +02:00
}
/*****************************************************************************
* UART3
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct plat_serial8250_port orion_uart3_data [ ] = {
{
. flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} , {
} ,
} ;
static struct resource orion_uart3_resources [ 2 ] ;
static struct platform_device orion_uart3 = {
. name = " serial8250 " ,
. id = 3 ,
} ;
2012-09-11 14:27:23 +02:00
void __init orion_uart3_init ( void __iomem * membase ,
2011-05-15 13:32:41 +02:00
resource_size_t mapbase ,
unsigned int irq ,
2011-12-24 03:06:34 +01:00
struct clk * clk )
2011-05-15 13:32:41 +02:00
{
uart_complete ( & orion_uart3 , orion_uart3_data , orion_uart3_resources ,
2011-12-24 03:06:34 +01:00
membase , mapbase , irq , clk ) ;
2011-05-15 13:32:41 +02:00
}
2011-05-15 13:32:42 +02:00
/*****************************************************************************
* SoC RTC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_rtc_resource [ 2 ] ;
void __init orion_rtc_init ( unsigned long mapbase ,
unsigned long irq )
{
orion_rtc_resource [ 0 ] . start = mapbase ;
orion_rtc_resource [ 0 ] . end = mapbase + SZ_32 - 1 ;
orion_rtc_resource [ 0 ] . flags = IORESOURCE_MEM ;
orion_rtc_resource [ 1 ] . start = irq ;
orion_rtc_resource [ 1 ] . end = irq ;
orion_rtc_resource [ 1 ] . flags = IORESOURCE_IRQ ;
platform_device_register_simple ( " rtc-mv " , - 1 , orion_rtc_resource , 2 ) ;
}
2011-05-15 13:32:44 +02:00
/*****************************************************************************
* GE
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static __init void ge_complete (
struct mv643xx_eth_shared_platform_data * orion_ge_shared_data ,
struct resource * orion_ge_resource , unsigned long irq ,
struct platform_device * orion_ge_shared ,
2013-03-22 03:39:28 +00:00
struct platform_device * orion_ge_mvmdio ,
2011-05-15 13:32:44 +02:00
struct mv643xx_eth_platform_data * eth_data ,
struct platform_device * orion_ge )
{
orion_ge_resource - > start = irq ;
orion_ge_resource - > end = irq ;
eth_data - > shared = orion_ge_shared ;
orion_ge - > dev . platform_data = eth_data ;
platform_device_register ( orion_ge_shared ) ;
2013-03-22 03:39:28 +00:00
if ( orion_ge_mvmdio )
platform_device_register ( orion_ge_mvmdio ) ;
2011-05-15 13:32:44 +02:00
platform_device_register ( orion_ge ) ;
}
/*****************************************************************************
* GE00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-10-23 16:12:50 +02:00
static struct mv643xx_eth_shared_platform_data orion_ge00_shared_data ;
2011-05-15 13:32:44 +02:00
static struct resource orion_ge00_shared_resources [ ] = {
{
. name = " ge00 base " ,
} ,
} ;
static struct platform_device orion_ge00_shared = {
. name = MV643XX_ETH_SHARED_NAME ,
. id = 0 ,
. dev = {
. platform_data = & orion_ge00_shared_data ,
} ,
} ;
2013-03-22 03:39:28 +00:00
static struct resource orion_ge_mvmdio_resources [ ] = {
{
. name = " ge00 mvmdio base " ,
} , {
. name = " ge00 mvmdio err irq " ,
} ,
} ;
static struct platform_device orion_ge_mvmdio = {
. name = " orion-mdio " ,
. id = - 1 ,
} ;
2011-05-15 13:32:44 +02:00
static struct resource orion_ge00_resources [ ] = {
{
. name = " ge00 irq " ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device orion_ge00 = {
. name = MV643XX_ETH_NAME ,
. id = 0 ,
. num_resources = 1 ,
. resource = orion_ge00_resources ,
. dev = {
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init orion_ge00_init ( struct mv643xx_eth_platform_data * eth_data ,
unsigned long mapbase ,
unsigned long irq ,
2012-07-26 12:15:46 +02:00
unsigned long irq_err ,
unsigned int tx_csum_limit )
2011-05-15 13:32:44 +02:00
{
fill_resources ( & orion_ge00_shared , orion_ge00_shared_resources ,
2016-09-06 16:06:21 +02:00
mapbase + 0x2000 , SZ_16K - 1 ) ;
fill_resources_irq ( & orion_ge_mvmdio , orion_ge_mvmdio_resources ,
2013-03-22 03:39:28 +00:00
mapbase + 0x2004 , 0x84 - 1 , irq_err ) ;
2012-07-26 12:15:46 +02:00
orion_ge00_shared_data . tx_csum_limit = tx_csum_limit ;
2011-12-24 01:24:24 +01:00
ge_complete ( & orion_ge00_shared_data ,
2011-05-15 13:32:44 +02:00
orion_ge00_resources , irq , & orion_ge00_shared ,
2013-03-22 03:39:28 +00:00
& orion_ge_mvmdio ,
2011-05-15 13:32:44 +02:00
eth_data , & orion_ge00 ) ;
}
/*****************************************************************************
* GE01
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-10-23 16:12:50 +02:00
static struct mv643xx_eth_shared_platform_data orion_ge01_shared_data ;
2011-05-15 13:32:44 +02:00
static struct resource orion_ge01_shared_resources [ ] = {
{
. name = " ge01 base " ,
2013-03-22 03:39:28 +00:00
}
2011-05-15 13:32:44 +02:00
} ;
static struct platform_device orion_ge01_shared = {
. name = MV643XX_ETH_SHARED_NAME ,
. id = 1 ,
. dev = {
. platform_data = & orion_ge01_shared_data ,
} ,
} ;
static struct resource orion_ge01_resources [ ] = {
{
. name = " ge01 irq " ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device orion_ge01 = {
. name = MV643XX_ETH_NAME ,
. id = 1 ,
. num_resources = 1 ,
. resource = orion_ge01_resources ,
. dev = {
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init orion_ge01_init ( struct mv643xx_eth_platform_data * eth_data ,
unsigned long mapbase ,
unsigned long irq ,
2012-07-26 12:15:46 +02:00
unsigned int tx_csum_limit )
2011-05-15 13:32:44 +02:00
{
fill_resources ( & orion_ge01_shared , orion_ge01_shared_resources ,
2016-09-06 16:06:21 +02:00
mapbase + 0x2000 , SZ_16K - 1 ) ;
2012-07-26 12:15:46 +02:00
orion_ge01_shared_data . tx_csum_limit = tx_csum_limit ;
2011-12-24 01:24:24 +01:00
ge_complete ( & orion_ge01_shared_data ,
2011-05-15 13:32:44 +02:00
orion_ge01_resources , irq , & orion_ge01_shared ,
2013-03-22 03:39:28 +00:00
NULL ,
2011-05-15 13:32:44 +02:00
eth_data , & orion_ge01 ) ;
}
/*****************************************************************************
* GE10
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-10-23 16:12:50 +02:00
static struct mv643xx_eth_shared_platform_data orion_ge10_shared_data ;
2011-05-15 13:32:44 +02:00
static struct resource orion_ge10_shared_resources [ ] = {
{
. name = " ge10 base " ,
2013-03-22 03:39:28 +00:00
}
2011-05-15 13:32:44 +02:00
} ;
static struct platform_device orion_ge10_shared = {
. name = MV643XX_ETH_SHARED_NAME ,
2013-05-19 22:12:43 +02:00
. id = 2 ,
2011-05-15 13:32:44 +02:00
. dev = {
. platform_data = & orion_ge10_shared_data ,
} ,
} ;
static struct resource orion_ge10_resources [ ] = {
{
. name = " ge10 irq " ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device orion_ge10 = {
. name = MV643XX_ETH_NAME ,
2013-05-19 22:12:43 +02:00
. id = 2 ,
. num_resources = 1 ,
2011-05-15 13:32:44 +02:00
. resource = orion_ge10_resources ,
. dev = {
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init orion_ge10_init ( struct mv643xx_eth_platform_data * eth_data ,
unsigned long mapbase ,
2016-09-06 16:06:20 +02:00
unsigned long irq )
2011-05-15 13:32:44 +02:00
{
fill_resources ( & orion_ge10_shared , orion_ge10_shared_resources ,
2016-09-06 16:06:21 +02:00
mapbase + 0x2000 , SZ_16K - 1 ) ;
2011-12-24 01:24:24 +01:00
ge_complete ( & orion_ge10_shared_data ,
2011-05-15 13:32:44 +02:00
orion_ge10_resources , irq , & orion_ge10_shared ,
2013-03-22 03:39:28 +00:00
NULL ,
2011-05-15 13:32:44 +02:00
eth_data , & orion_ge10 ) ;
}
/*****************************************************************************
* GE11
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-10-23 16:12:50 +02:00
static struct mv643xx_eth_shared_platform_data orion_ge11_shared_data ;
2011-05-15 13:32:44 +02:00
static struct resource orion_ge11_shared_resources [ ] = {
{
. name = " ge11 base " ,
} ,
} ;
static struct platform_device orion_ge11_shared = {
. name = MV643XX_ETH_SHARED_NAME ,
2013-05-19 22:12:43 +02:00
. id = 3 ,
2011-05-15 13:32:44 +02:00
. dev = {
. platform_data = & orion_ge11_shared_data ,
} ,
} ;
static struct resource orion_ge11_resources [ ] = {
{
. name = " ge11 irq " ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device orion_ge11 = {
. name = MV643XX_ETH_NAME ,
2013-05-19 22:12:43 +02:00
. id = 3 ,
. num_resources = 1 ,
2011-05-15 13:32:44 +02:00
. resource = orion_ge11_resources ,
. dev = {
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init orion_ge11_init ( struct mv643xx_eth_platform_data * eth_data ,
unsigned long mapbase ,
2016-09-06 16:06:20 +02:00
unsigned long irq )
2011-05-15 13:32:44 +02:00
{
fill_resources ( & orion_ge11_shared , orion_ge11_shared_resources ,
2016-09-06 16:06:21 +02:00
mapbase + 0x2000 , SZ_16K - 1 ) ;
2011-12-24 01:24:24 +01:00
ge_complete ( & orion_ge11_shared_data ,
2011-05-15 13:32:44 +02:00
orion_ge11_resources , irq , & orion_ge11_shared ,
2013-03-22 03:39:28 +00:00
NULL ,
2011-05-15 13:32:44 +02:00
eth_data , & orion_ge11 ) ;
}
2017-03-28 12:15:41 +02:00
# ifdef CONFIG_ARCH_ORION5X
2011-05-15 13:32:44 +02:00
/*****************************************************************************
* Ethernet switch
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2018-02-21 13:18:49 +01:00
static __initdata struct mdio_board_info orion_ge00_switch_board_info = {
. bus_id = " orion-mii " ,
. modalias = " mv88e6085 " ,
} ;
2017-02-04 13:02:45 -08:00
void __init orion_ge00_switch_init ( struct dsa_chip_data * d )
2011-05-15 13:32:44 +02:00
{
2017-02-04 13:02:45 -08:00
unsigned int i ;
2017-03-28 12:15:41 +02:00
if ( ! IS_BUILTIN ( CONFIG_PHYLIB ) )
return ;
2018-02-21 13:18:49 +01:00
for ( i = 0 ; i < ARRAY_SIZE ( d - > port_names ) ; i + + ) {
if ( ! strcmp ( d - > port_names [ i ] , " cpu " ) ) {
d - > netdev [ i ] = & orion_ge00 . dev ;
2017-02-04 13:02:45 -08:00
break ;
2018-02-21 13:18:49 +01:00
}
}
2011-05-15 13:32:44 +02:00
2018-02-21 13:18:49 +01:00
orion_ge00_switch_board_info . mdio_addr = d - > sw_addr ;
orion_ge00_switch_board_info . platform_data = d ;
2011-05-15 13:32:44 +02:00
2017-02-04 13:02:45 -08:00
mdiobus_register_board_info ( & orion_ge00_switch_board_info , 1 ) ;
2011-05-15 13:32:44 +02:00
}
2017-03-28 12:15:41 +02:00
# endif
2011-05-15 13:32:45 +02:00
/*****************************************************************************
* I2C
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct mv64xxx_i2c_pdata orion_i2c_pdata = {
. freq_n = 3 ,
. timeout = 1000 , /* Default timeout of 1 second */
} ;
static struct resource orion_i2c_resources [ 2 ] ;
static struct platform_device orion_i2c = {
. name = MV64XXX_I2C_CTLR_NAME ,
. id = 0 ,
. dev = {
. platform_data = & orion_i2c_pdata ,
} ,
} ;
static struct mv64xxx_i2c_pdata orion_i2c_1_pdata = {
. freq_n = 3 ,
. timeout = 1000 , /* Default timeout of 1 second */
} ;
static struct resource orion_i2c_1_resources [ 2 ] ;
static struct platform_device orion_i2c_1 = {
. name = MV64XXX_I2C_CTLR_NAME ,
. id = 1 ,
. dev = {
. platform_data = & orion_i2c_1_pdata ,
} ,
} ;
void __init orion_i2c_init ( unsigned long mapbase ,
unsigned long irq ,
unsigned long freq_m )
{
orion_i2c_pdata . freq_m = freq_m ;
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_i2c , orion_i2c_resources , mapbase ,
2011-05-15 13:32:45 +02:00
SZ_32 - 1 , irq ) ;
platform_device_register ( & orion_i2c ) ;
}
void __init orion_i2c_1_init ( unsigned long mapbase ,
unsigned long irq ,
unsigned long freq_m )
{
orion_i2c_1_pdata . freq_m = freq_m ;
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_i2c_1 , orion_i2c_1_resources , mapbase ,
2011-05-15 13:32:45 +02:00
SZ_32 - 1 , irq ) ;
platform_device_register ( & orion_i2c_1 ) ;
}
2011-05-15 13:32:46 +02:00
/*****************************************************************************
* SPI
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_spi_resources ;
static struct platform_device orion_spi = {
. name = " orion_spi " ,
. id = 0 ,
} ;
static struct resource orion_spi_1_resources ;
static struct platform_device orion_spi_1 = {
. name = " orion_spi " ,
. id = 1 ,
} ;
/* Note: The SPI silicon core does have interrupts. However the
* current Linux software driver does not use interrupts . */
2012-04-06 17:17:26 +02:00
void __init orion_spi_init ( unsigned long mapbase )
2011-05-15 13:32:46 +02:00
{
fill_resources ( & orion_spi , & orion_spi_resources ,
2016-09-06 16:06:21 +02:00
mapbase , SZ_512 - 1 ) ;
2011-05-15 13:32:46 +02:00
platform_device_register ( & orion_spi ) ;
}
2012-04-06 17:17:26 +02:00
void __init orion_spi_1_init ( unsigned long mapbase )
2011-05-15 13:32:46 +02:00
{
fill_resources ( & orion_spi_1 , & orion_spi_1_resources ,
2016-09-06 16:06:21 +02:00
mapbase , SZ_512 - 1 ) ;
2011-05-15 13:32:46 +02:00
platform_device_register ( & orion_spi_1 ) ;
}
2011-05-15 13:32:47 +02:00
2011-05-15 13:32:48 +02:00
/*****************************************************************************
* XOR
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static u64 orion_xor_dmamask = DMA_BIT_MASK ( 32 ) ;
/*****************************************************************************
* XOR0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_xor0_shared_resources [ ] = {
{
. name = " xor 0 low " ,
. flags = IORESOURCE_MEM ,
} , {
. name = " xor 0 high " ,
. flags = IORESOURCE_MEM ,
2012-10-29 17:45:21 +01:00
} , {
. name = " irq channel 0 " ,
. flags = IORESOURCE_IRQ ,
} , {
. name = " irq channel 1 " ,
. flags = IORESOURCE_IRQ ,
2011-05-15 13:32:48 +02:00
} ,
} ;
2012-11-15 15:55:30 +01:00
static struct mv_xor_channel_data orion_xor0_channels_data [ 2 ] ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:58:14 +01:00
static struct mv_xor_platform_data orion_xor0_pdata = {
2012-10-30 11:56:26 +01:00
. channels = orion_xor0_channels_data ,
2011-05-15 13:32:48 +02:00
} ;
2012-10-29 17:45:21 +01:00
static struct platform_device orion_xor0_shared = {
2012-10-30 11:59:42 +01:00
. name = MV_XOR_NAME ,
2012-10-29 17:45:21 +01:00
. id = 0 ,
. num_resources = ARRAY_SIZE ( orion_xor0_shared_resources ) ,
. resource = orion_xor0_shared_resources ,
. dev = {
. dma_mask = & orion_xor_dmamask ,
2019-03-25 16:50:42 +01:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
2012-10-29 17:45:21 +01:00
. platform_data = & orion_xor0_pdata ,
2011-05-15 13:32:48 +02:00
} ,
} ;
2011-12-07 21:48:08 +01:00
void __init orion_xor0_init ( unsigned long mapbase_low ,
2011-05-15 13:32:48 +02:00
unsigned long mapbase_high ,
unsigned long irq_0 ,
unsigned long irq_1 )
{
orion_xor0_shared_resources [ 0 ] . start = mapbase_low ;
orion_xor0_shared_resources [ 0 ] . end = mapbase_low + 0xff ;
orion_xor0_shared_resources [ 1 ] . start = mapbase_high ;
orion_xor0_shared_resources [ 1 ] . end = mapbase_high + 0xff ;
2012-10-29 17:45:21 +01:00
orion_xor0_shared_resources [ 2 ] . start = irq_0 ;
orion_xor0_shared_resources [ 2 ] . end = irq_0 ;
orion_xor0_shared_resources [ 3 ] . start = irq_1 ;
orion_xor0_shared_resources [ 3 ] . end = irq_1 ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:56:26 +01:00
dma_cap_set ( DMA_MEMCPY , orion_xor0_channels_data [ 0 ] . cap_mask ) ;
dma_cap_set ( DMA_XOR , orion_xor0_channels_data [ 0 ] . cap_mask ) ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:56:26 +01:00
dma_cap_set ( DMA_MEMCPY , orion_xor0_channels_data [ 1 ] . cap_mask ) ;
dma_cap_set ( DMA_XOR , orion_xor0_channels_data [ 1 ] . cap_mask ) ;
2012-10-29 17:45:21 +01:00
platform_device_register ( & orion_xor0_shared ) ;
2011-05-15 13:32:48 +02:00
}
/*****************************************************************************
* XOR1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_xor1_shared_resources [ ] = {
{
. name = " xor 1 low " ,
. flags = IORESOURCE_MEM ,
} , {
. name = " xor 1 high " ,
. flags = IORESOURCE_MEM ,
2012-10-30 11:11:36 +01:00
} , {
. name = " irq channel 0 " ,
. flags = IORESOURCE_IRQ ,
} , {
. name = " irq channel 1 " ,
. flags = IORESOURCE_IRQ ,
2011-05-15 13:32:48 +02:00
} ,
} ;
2012-11-15 15:55:30 +01:00
static struct mv_xor_channel_data orion_xor1_channels_data [ 2 ] ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:58:14 +01:00
static struct mv_xor_platform_data orion_xor1_pdata = {
2012-10-30 11:56:26 +01:00
. channels = orion_xor1_channels_data ,
2011-05-15 13:32:48 +02:00
} ;
2012-10-30 11:11:36 +01:00
static struct platform_device orion_xor1_shared = {
2012-10-30 11:59:42 +01:00
. name = MV_XOR_NAME ,
2012-10-30 11:11:36 +01:00
. id = 1 ,
. num_resources = ARRAY_SIZE ( orion_xor1_shared_resources ) ,
. resource = orion_xor1_shared_resources ,
. dev = {
. dma_mask = & orion_xor_dmamask ,
2019-03-25 16:50:42 +01:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
2012-10-30 11:11:36 +01:00
. platform_data = & orion_xor1_pdata ,
2011-05-15 13:32:48 +02:00
} ,
} ;
void __init orion_xor1_init ( unsigned long mapbase_low ,
unsigned long mapbase_high ,
unsigned long irq_0 ,
unsigned long irq_1 )
{
orion_xor1_shared_resources [ 0 ] . start = mapbase_low ;
orion_xor1_shared_resources [ 0 ] . end = mapbase_low + 0xff ;
orion_xor1_shared_resources [ 1 ] . start = mapbase_high ;
orion_xor1_shared_resources [ 1 ] . end = mapbase_high + 0xff ;
2012-10-30 11:11:36 +01:00
orion_xor1_shared_resources [ 2 ] . start = irq_0 ;
orion_xor1_shared_resources [ 2 ] . end = irq_0 ;
orion_xor1_shared_resources [ 3 ] . start = irq_1 ;
orion_xor1_shared_resources [ 3 ] . end = irq_1 ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:56:26 +01:00
dma_cap_set ( DMA_MEMCPY , orion_xor1_channels_data [ 0 ] . cap_mask ) ;
dma_cap_set ( DMA_XOR , orion_xor1_channels_data [ 0 ] . cap_mask ) ;
2011-05-15 13:32:48 +02:00
2012-10-30 11:56:26 +01:00
dma_cap_set ( DMA_MEMCPY , orion_xor1_channels_data [ 1 ] . cap_mask ) ;
dma_cap_set ( DMA_XOR , orion_xor1_channels_data [ 1 ] . cap_mask ) ;
2012-10-30 11:11:36 +01:00
platform_device_register ( & orion_xor1_shared ) ;
2011-05-15 13:32:48 +02:00
}
2011-05-15 13:32:49 +02:00
/*****************************************************************************
* EHCI
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2012-02-08 15:52:47 +01:00
static struct orion_ehci_data orion_ehci_data ;
2011-05-15 13:32:49 +02:00
static u64 ehci_dmamask = DMA_BIT_MASK ( 32 ) ;
/*****************************************************************************
* EHCI0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_ehci_resources [ 2 ] ;
static struct platform_device orion_ehci = {
. name = " orion-ehci " ,
. id = 0 ,
. dev = {
. dma_mask = & ehci_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & orion_ehci_data ,
} ,
} ;
2011-12-07 21:48:08 +01:00
void __init orion_ehci_init ( unsigned long mapbase ,
2012-02-08 15:52:47 +01:00
unsigned long irq ,
enum orion_ehci_phy_ver phy_version )
2011-05-15 13:32:49 +02:00
{
2012-02-08 15:52:47 +01:00
orion_ehci_data . phy_version = phy_version ;
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_ehci , orion_ehci_resources , mapbase , SZ_4K - 1 ,
2011-05-15 13:32:49 +02:00
irq ) ;
platform_device_register ( & orion_ehci ) ;
}
/*****************************************************************************
* EHCI1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_ehci_1_resources [ 2 ] ;
static struct platform_device orion_ehci_1 = {
. name = " orion-ehci " ,
. id = 1 ,
. dev = {
. dma_mask = & ehci_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & orion_ehci_data ,
} ,
} ;
2011-12-07 21:48:08 +01:00
void __init orion_ehci_1_init ( unsigned long mapbase ,
2011-05-15 13:32:49 +02:00
unsigned long irq )
{
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_ehci_1 , orion_ehci_1_resources ,
2011-05-15 13:32:49 +02:00
mapbase , SZ_4K - 1 , irq ) ;
platform_device_register ( & orion_ehci_1 ) ;
}
/*****************************************************************************
* EHCI2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_ehci_2_resources [ 2 ] ;
static struct platform_device orion_ehci_2 = {
. name = " orion-ehci " ,
. id = 2 ,
. dev = {
. dma_mask = & ehci_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & orion_ehci_data ,
} ,
} ;
2011-12-07 21:48:08 +01:00
void __init orion_ehci_2_init ( unsigned long mapbase ,
2011-05-15 13:32:49 +02:00
unsigned long irq )
{
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_ehci_2 , orion_ehci_2_resources ,
2011-05-15 13:32:49 +02:00
mapbase , SZ_4K - 1 , irq ) ;
platform_device_register ( & orion_ehci_2 ) ;
}
2011-05-15 13:32:50 +02:00
/*****************************************************************************
* SATA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_sata_resources [ 2 ] = {
{
. name = " sata base " ,
} , {
. name = " sata irq " ,
} ,
} ;
static struct platform_device orion_sata = {
. name = " sata_mv " ,
. id = 0 ,
. dev = {
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init orion_sata_init ( struct mv_sata_platform_data * sata_data ,
unsigned long mapbase ,
unsigned long irq )
{
orion_sata . dev . platform_data = sata_data ;
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_sata , orion_sata_resources ,
2011-05-15 13:32:50 +02:00
mapbase , 0x5000 - 1 , irq ) ;
platform_device_register ( & orion_sata ) ;
}
2011-05-15 13:32:51 +02:00
/*****************************************************************************
* Cryptographic Engines and Security Accelerator ( CESA )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct resource orion_crypto_resources [ ] = {
{
. name = " regs " ,
} , {
. name = " crypto interrupt " ,
} , {
. name = " sram " ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2011-05-15 13:32:50 +02:00
2011-05-15 13:32:51 +02:00
static struct platform_device orion_crypto = {
. name = " mv_crypto " ,
. id = - 1 ,
} ;
void __init orion_crypto_init ( unsigned long mapbase ,
unsigned long srambase ,
unsigned long sram_size ,
unsigned long irq )
{
2016-09-06 16:06:21 +02:00
fill_resources_irq ( & orion_crypto , orion_crypto_resources ,
2011-05-15 13:32:51 +02:00
mapbase , 0xffff , irq ) ;
orion_crypto . num_resources = 3 ;
orion_crypto_resources [ 2 ] . start = srambase ;
orion_crypto_resources [ 2 ] . end = srambase + sram_size - 1 ;
platform_device_register ( & orion_crypto ) ;
}