2009-08-18 16:23:37 +04:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 2008 Maxime Bizon < mbizon @ freebox . fr >
* Copyright ( C ) 2008 Florian Fainelli < florian @ openwrt . org >
*/
2015-10-14 14:27:38 +03:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2009-08-18 16:23:37 +04:00
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/string.h>
# include <linux/platform_device.h>
# include <linux/ssb/ssb.h>
# include <asm/addrspace.h>
# include <bcm63xx_board.h>
# include <bcm63xx_cpu.h>
2010-01-30 20:34:55 +03:00
# include <bcm63xx_dev_uart.h>
2009-08-18 16:23:37 +04:00
# include <bcm63xx_regs.h>
# include <bcm63xx_io.h>
2012-11-07 12:25:28 +04:00
# include <bcm63xx_nvram.h>
2009-08-18 16:23:37 +04:00
# include <bcm63xx_dev_pci.h>
# include <bcm63xx_dev_enet.h>
# include <bcm63xx_dev_dsp.h>
2012-07-24 18:33:11 +04:00
# include <bcm63xx_dev_flash.h>
2013-11-30 15:42:05 +04:00
# include <bcm63xx_dev_hsspi.h>
2009-09-28 16:49:43 +04:00
# include <bcm63xx_dev_pcmcia.h>
2012-07-04 18:58:37 +04:00
# include <bcm63xx_dev_spi.h>
2012-07-14 22:01:09 +04:00
# include <bcm63xx_dev_usb_usbd.h>
2009-08-18 16:23:37 +04:00
# include <board_bcm963xx.h>
2013-06-18 20:55:41 +04:00
# include <uapi/linux/bcm933xx_hcs.h>
2009-08-18 16:23:37 +04:00
2013-06-18 20:55:41 +04:00
# define HCS_OFFSET_128K 0x20000
2009-08-18 16:23:37 +04:00
static struct board_info board ;
2013-06-18 20:55:44 +04:00
/*
* known 3368 boards
*/
# ifdef CONFIG_BCM63XX_CPU_3368
static struct board_info __initdata board_cvg834g = {
. name = " CVG834G_E15R3921 " ,
. expected_cpu_id = 0x3368 ,
. has_uart0 = 1 ,
. has_uart1 = 1 ,
. has_enet0 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. leds = {
{
. name = " CVG834G:green:power " ,
. gpio = 37 ,
. default_trigger = " default-on " ,
} ,
} ,
. ephy_reset_gpio = 36 ,
. ephy_reset_gpio_flags = GPIOF_INIT_HIGH ,
} ;
# endif
2012-07-24 18:33:14 +04:00
/*
* known 6328 boards
*/
# ifdef CONFIG_BCM63XX_CPU_6328
static struct board_info __initdata board_96328avng = {
. name = " 96328avng " ,
. expected_cpu_id = 0x6328 ,
. has_uart0 = 1 ,
. has_pci = 1 ,
2012-07-14 22:01:09 +04:00
. has_usbd = 0 ,
. usbd = {
. use_fullspeed = 0 ,
. port_no = 0 ,
} ,
2012-07-24 18:33:14 +04:00
. leds = {
{
. name = " 96328avng::ppp-fail " ,
. gpio = 2 ,
. active_low = 1 ,
} ,
{
. name = " 96328avng::power " ,
. gpio = 4 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " 96328avng::power-fail " ,
. gpio = 8 ,
. active_low = 1 ,
} ,
{
. name = " 96328avng::wps " ,
. gpio = 9 ,
. active_low = 1 ,
} ,
{
. name = " 96328avng::ppp " ,
. gpio = 11 ,
. active_low = 1 ,
} ,
} ,
} ;
# endif
2009-08-18 16:23:37 +04:00
/*
* known 6338 boards
*/
# ifdef CONFIG_BCM63XX_CPU_6338
static struct board_info __initdata board_96338gw = {
. name = " 96338GW " ,
. expected_cpu_id = 0x6338 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. enet0 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. leds = {
{
. name = " adsl " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ses " ,
. gpio = 5 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
}
} ,
} ;
static struct board_info __initdata board_96338w = {
. name = " 96338W " ,
. expected_cpu_id = 0x6338 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. enet0 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. leds = {
{
. name = " adsl " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ses " ,
. gpio = 5 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
} ,
} ,
} ;
# endif
/*
* known 6345 boards
*/
# ifdef CONFIG_BCM63XX_CPU_6345
static struct board_info __initdata board_96345gw2 = {
. name = " 96345GW2 " ,
. expected_cpu_id = 0x6345 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
} ;
# endif
/*
* known 6348 boards
*/
# ifdef CONFIG_BCM63XX_CPU_6348
static struct board_info __initdata board_96348r = {
. name = " 96348R " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. leds = {
{
. name = " adsl-fail " ,
. gpio = 2 ,
. active_low = 1 ,
} ,
{
. name = " ppp " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
} ,
} ,
} ;
static struct board_info __initdata board_96348gw_10 = {
. name = " 96348GW-10 " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. has_pccard = 1 ,
. has_ehci0 = 1 ,
. has_dsp = 1 ,
. dsp = {
. gpio_rst = 6 ,
. gpio_int = 34 ,
. cs = 2 ,
. ext_irq = 2 ,
} ,
. leds = {
{
. name = " adsl-fail " ,
. gpio = 2 ,
. active_low = 1 ,
} ,
{
. name = " ppp " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
} ,
} ,
} ;
static struct board_info __initdata board_96348gw_11 = {
. name = " 96348GW-11 " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. has_pccard = 1 ,
. has_ehci0 = 1 ,
. leds = {
{
. name = " adsl-fail " ,
. gpio = 2 ,
. active_low = 1 ,
} ,
{
. name = " ppp " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
} ,
} ,
} ;
static struct board_info __initdata board_96348gw = {
. name = " 96348GW " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. has_dsp = 1 ,
. dsp = {
. gpio_rst = 6 ,
. gpio_int = 34 ,
. ext_irq = 2 ,
. cs = 2 ,
} ,
. leds = {
{
. name = " adsl-fail " ,
. gpio = 2 ,
. active_low = 1 ,
} ,
{
. name = " ppp " ,
. gpio = 3 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 0 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 1 ,
. active_low = 1 ,
} ,
} ,
} ;
static struct board_info __initdata board_FAST2404 = {
2009-12-12 19:57:39 +03:00
. name = " F@ST2404 " ,
. expected_cpu_id = 0x6348 ,
2009-08-18 16:23:37 +04:00
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2013-01-22 15:59:30 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
2009-08-18 16:23:37 +04:00
2009-12-12 19:57:39 +03:00
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
2009-08-18 16:23:37 +04:00
2009-12-12 19:57:39 +03:00
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
2009-08-18 16:23:37 +04:00
2009-12-12 19:57:39 +03:00
. has_ohci0 = 1 ,
. has_pccard = 1 ,
. has_ehci0 = 1 ,
2009-08-18 16:23:37 +04:00
} ;
2010-03-02 01:36:22 +03:00
static struct board_info __initdata board_rta1025w_16 = {
. name = " RTA1025W_16 " ,
. expected_cpu_id = 0x6348 ,
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
} ;
2009-08-18 16:23:37 +04:00
static struct board_info __initdata board_DV201AMR = {
. name = " DV201AMR " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_pci = 1 ,
. has_ohci0 = 1 ,
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
} ;
static struct board_info __initdata board_96348gw_a = {
. name = " 96348GW-A " ,
. expected_cpu_id = 0x6348 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
} ;
# endif
/*
* known 6358 boards
*/
# ifdef CONFIG_BCM63XX_CPU_6358
static struct board_info __initdata board_96358vw = {
. name = " 96358VW " ,
. expected_cpu_id = 0x6358 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. has_pccard = 1 ,
. has_ehci0 = 1 ,
. leds = {
{
. name = " adsl-fail " ,
. gpio = 15 ,
. active_low = 1 ,
} ,
{
. name = " ppp " ,
. gpio = 22 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 23 ,
. active_low = 1 ,
} ,
{
. name = " power " ,
. gpio = 4 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 5 ,
} ,
} ,
} ;
static struct board_info __initdata board_96358vw2 = {
. name = " 96358VW2 " ,
. expected_cpu_id = 0x6358 ,
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2009-08-18 16:23:37 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
. has_pccard = 1 ,
. has_ehci0 = 1 ,
. leds = {
{
. name = " adsl " ,
. gpio = 22 ,
. active_low = 1 ,
} ,
{
. name = " ppp-fail " ,
. gpio = 23 ,
} ,
{
. name = " power " ,
. gpio = 5 ,
. active_low = 1 ,
. default_trigger = " default-on " ,
} ,
{
. name = " stop " ,
. gpio = 4 ,
. active_low = 1 ,
} ,
} ,
} ;
static struct board_info __initdata board_AGPFS0 = {
2013-01-22 15:59:30 +04:00
. name = " AGPF-S0 " ,
. expected_cpu_id = 0x6358 ,
2009-08-18 16:23:37 +04:00
2010-01-30 20:34:55 +03:00
. has_uart0 = 1 ,
2013-01-22 15:59:30 +04:00
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
2009-08-18 16:23:37 +04:00
. enet0 = {
2013-01-22 15:59:30 +04:00
. has_phy = 1 ,
. use_internal_phy = 1 ,
2009-08-18 16:23:37 +04:00
} ,
. enet1 = {
2013-01-22 15:59:30 +04:00
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
2009-08-18 16:23:37 +04:00
} ,
. has_ohci0 = 1 ,
. has_ehci0 = 1 ,
} ;
2010-03-02 01:36:27 +03:00
static struct board_info __initdata board_DWVS0 = {
. name = " DWV-S0 " ,
. expected_cpu_id = 0x6358 ,
. has_enet0 = 1 ,
. has_enet1 = 1 ,
. has_pci = 1 ,
. enet0 = {
. has_phy = 1 ,
. use_internal_phy = 1 ,
} ,
. enet1 = {
. force_speed_100 = 1 ,
. force_duplex_full = 1 ,
} ,
. has_ohci0 = 1 ,
} ;
2009-08-18 16:23:37 +04:00
# endif
/*
* all boards
*/
2012-10-05 04:11:35 +04:00
static const struct board_info __initconst * bcm963xx_boards [ ] = {
2013-06-18 20:55:44 +04:00
# ifdef CONFIG_BCM63XX_CPU_3368
& board_cvg834g ,
# endif
2012-07-24 18:33:14 +04:00
# ifdef CONFIG_BCM63XX_CPU_6328
& board_96328avng ,
# endif
2009-08-18 16:23:37 +04:00
# ifdef CONFIG_BCM63XX_CPU_6338
& board_96338gw ,
& board_96338w ,
# endif
# ifdef CONFIG_BCM63XX_CPU_6345
& board_96345gw2 ,
# endif
# ifdef CONFIG_BCM63XX_CPU_6348
& board_96348r ,
& board_96348gw ,
& board_96348gw_10 ,
& board_96348gw_11 ,
& board_FAST2404 ,
& board_DV201AMR ,
& board_96348gw_a ,
2010-03-02 01:36:22 +03:00
& board_rta1025w_16 ,
2009-08-18 16:23:37 +04:00
# endif
# ifdef CONFIG_BCM63XX_CPU_6358
& board_96358vw ,
& board_96358vw2 ,
& board_AGPFS0 ,
2010-03-02 01:36:27 +03:00
& board_DWVS0 ,
2009-08-18 16:23:37 +04:00
# endif
} ;
2010-03-23 12:30:08 +03:00
/*
* Register a sane SPROMv2 to make the on - board
* bcm4318 WLAN work
*/
# ifdef CONFIG_SSB_PCIHOST
static struct ssb_sprom bcm63xx_sprom = {
. revision = 0x02 ,
. board_rev = 0x17 ,
. country_code = 0x0 ,
2013-01-22 15:59:30 +04:00
. ant_available_bg = 0x3 ,
2010-03-23 12:30:08 +03:00
. pa0b0 = 0x15ae ,
. pa0b1 = 0xfa85 ,
. pa0b2 = 0xfe8d ,
. pa1b0 = 0xffff ,
. pa1b1 = 0xffff ,
. pa1b2 = 0xffff ,
. gpio0 = 0xff ,
. gpio1 = 0xff ,
. gpio2 = 0xff ,
. gpio3 = 0xff ,
. maxpwr_bg = 0x004c ,
. itssi_bg = 0x00 ,
. boardflags_lo = 0x2848 ,
. boardflags_hi = 0x0000 ,
} ;
2011-05-11 01:31:30 +04:00
int bcm63xx_get_fallback_sprom ( struct ssb_bus * bus , struct ssb_sprom * out )
{
if ( bus - > bustype = = SSB_BUSTYPE_PCI ) {
memcpy ( out , & bcm63xx_sprom , sizeof ( struct ssb_sprom ) ) ;
return 0 ;
} else {
2015-10-14 14:27:38 +03:00
pr_err ( " unable to fill SPROM for given bustype \n " ) ;
2011-05-11 01:31:30 +04:00
return - EINVAL ;
}
}
2010-03-23 12:30:08 +03:00
# endif
/*
* return board name for / proc / cpuinfo
*/
const char * board_get_name ( void )
{
return board . name ;
}
2009-08-18 16:23:37 +04:00
/*
* early init callback , read nvram data from flash and checksum it
*/
void __init board_prom_init ( void )
{
2012-11-07 12:25:28 +04:00
unsigned int i ;
u8 * boot_addr , * cfe ;
2009-08-18 16:23:37 +04:00
char cfe_version [ 32 ] ;
2013-06-18 20:55:41 +04:00
char * board_name = NULL ;
2009-08-18 16:23:37 +04:00
u32 val ;
2013-06-18 20:55:41 +04:00
struct bcm_hcs * hcs ;
2009-08-18 16:23:37 +04:00
2012-07-24 18:33:12 +04:00
/* read base address of boot chip select (0)
2013-03-21 18:03:17 +04:00
* 6328 / 6362 do not have MPI but boot from a fixed address
2012-07-24 18:33:12 +04:00
*/
2013-03-21 18:03:17 +04:00
if ( BCMCPU_IS_6328 ( ) | | BCMCPU_IS_6362 ( ) ) {
2012-07-24 18:33:12 +04:00
val = 0x18000000 ;
2013-03-21 18:03:17 +04:00
} else {
2012-07-24 18:33:12 +04:00
val = bcm_mpi_readl ( MPI_CSBASE_REG ( 0 ) ) ;
val & = MPI_CSBASE_BASE_MASK ;
}
2009-08-18 16:23:37 +04:00
boot_addr = ( u8 * ) KSEG1ADDR ( val ) ;
/* dump cfe version */
cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET ;
if ( ! memcmp ( cfe , " cfe-v " , 5 ) )
snprintf ( cfe_version , sizeof ( cfe_version ) , " %u.%u.%u-%u.%u " ,
cfe [ 5 ] , cfe [ 6 ] , cfe [ 7 ] , cfe [ 8 ] , cfe [ 9 ] ) ;
else
strcpy ( cfe_version , " unknown " ) ;
2015-10-14 14:27:38 +03:00
pr_info ( " CFE version: %s \n " , cfe_version ) ;
2009-08-18 16:23:37 +04:00
2013-03-19 17:08:27 +04:00
bcm63xx_nvram_init ( boot_addr + BCM963XX_NVRAM_OFFSET ) ;
2009-08-18 16:23:37 +04:00
2013-06-18 20:55:41 +04:00
if ( BCMCPU_IS_3368 ( ) ) {
hcs = ( struct bcm_hcs * ) boot_addr ;
board_name = hcs - > filename ;
} else {
board_name = bcm63xx_nvram_get_name ( ) ;
}
2009-08-18 16:23:37 +04:00
/* find board by name */
for ( i = 0 ; i < ARRAY_SIZE ( bcm963xx_boards ) ; i + + ) {
2012-11-07 12:25:28 +04:00
if ( strncmp ( board_name , bcm963xx_boards [ i ] - > name , 16 ) )
2009-08-18 16:23:37 +04:00
continue ;
/* copy, board desc array is marked initdata */
memcpy ( & board , bcm963xx_boards [ i ] , sizeof ( board ) ) ;
break ;
}
/* bail out if board is not found, will complain later */
if ( ! board . name [ 0 ] ) {
char name [ 17 ] ;
2012-11-07 12:25:28 +04:00
memcpy ( name , board_name , 16 ) ;
2009-08-18 16:23:37 +04:00
name [ 16 ] = 0 ;
2015-10-14 14:27:38 +03:00
pr_err ( " unknown bcm963xx board: %s \n " , name ) ;
2009-08-18 16:23:37 +04:00
return ;
}
/* setup pin multiplexing depending on board enabled device,
* this has to be done this early since PCI init is done
* inside arch_initcall */
val = 0 ;
# ifdef CONFIG_PCI
if ( board . has_pci ) {
bcm63xx_pci_enabled = 1 ;
if ( BCMCPU_IS_6348 ( ) )
val | = GPIO_MODE_6348_G2_PCI ;
}
# endif
if ( board . has_pccard ) {
if ( BCMCPU_IS_6348 ( ) )
val | = GPIO_MODE_6348_G1_MII_PCCARD ;
}
if ( board . has_enet0 & & ! board . enet0 . use_internal_phy ) {
if ( BCMCPU_IS_6348 ( ) )
val | = GPIO_MODE_6348_G3_EXT_MII |
GPIO_MODE_6348_G0_EXT_MII ;
}
if ( board . has_enet1 & & ! board . enet1 . use_internal_phy ) {
if ( BCMCPU_IS_6348 ( ) )
val | = GPIO_MODE_6348_G3_EXT_MII |
GPIO_MODE_6348_G0_EXT_MII ;
}
bcm_gpio_writel ( val , GPIO_MODE_REG ) ;
}
/*
* second stage init callback , good time to panic if we couldn ' t
* identify on which board we ' re running since early printk is working
*/
void __init board_setup ( void )
{
if ( ! board . name [ 0 ] )
panic ( " unable to detect bcm963xx board " ) ;
2015-10-14 14:27:38 +03:00
pr_info ( " board name: %s \n " , board . name ) ;
2009-08-18 16:23:37 +04:00
/* make sure we're running on expected cpu */
if ( bcm63xx_get_cpu_id ( ) ! = board . expected_cpu_id )
panic ( " unexpected CPU for bcm963xx board " ) ;
}
static struct gpio_led_platform_data bcm63xx_led_data ;
static struct platform_device bcm63xx_gpio_leds = {
. name = " leds-gpio " ,
. id = 0 ,
. dev . platform_data = & bcm63xx_led_data ,
} ;
/*
* third stage init callback , register all board devices .
*/
int __init board_register_devices ( void )
{
2010-01-30 20:34:55 +03:00
if ( board . has_uart0 )
bcm63xx_uart_register ( 0 ) ;
if ( board . has_uart1 )
bcm63xx_uart_register ( 1 ) ;
2009-09-28 16:49:43 +04:00
if ( board . has_pccard )
bcm63xx_pcmcia_register ( ) ;
2009-08-18 16:23:37 +04:00
if ( board . has_enet0 & &
2012-11-07 12:25:28 +04:00
! bcm63xx_nvram_get_mac_address ( board . enet0 . mac_addr ) )
2009-08-18 16:23:37 +04:00
bcm63xx_enet_register ( 0 , & board . enet0 ) ;
if ( board . has_enet1 & &
2012-11-07 12:25:28 +04:00
! bcm63xx_nvram_get_mac_address ( board . enet1 . mac_addr ) )
2009-08-18 16:23:37 +04:00
bcm63xx_enet_register ( 1 , & board . enet1 ) ;
2013-06-05 01:53:35 +04:00
if ( board . has_enetsw & &
! bcm63xx_nvram_get_mac_address ( board . enetsw . mac_addr ) )
bcm63xx_enetsw_register ( & board . enetsw ) ;
2012-07-14 22:01:09 +04:00
if ( board . has_usbd )
bcm63xx_usbd_register ( & board . usbd ) ;
2009-08-18 16:23:37 +04:00
if ( board . has_dsp )
bcm63xx_dsp_register ( & board . dsp ) ;
2011-11-16 22:49:58 +04:00
/* Generate MAC address for WLAN and register our SPROM,
* do this after registering enet devices
*/
# ifdef CONFIG_SSB_PCIHOST
2012-11-07 12:25:28 +04:00
if ( ! bcm63xx_nvram_get_mac_address ( bcm63xx_sprom . il0mac ) ) {
2011-11-16 22:49:58 +04:00
memcpy ( bcm63xx_sprom . et0mac , bcm63xx_sprom . il0mac , ETH_ALEN ) ;
memcpy ( bcm63xx_sprom . et1mac , bcm63xx_sprom . il0mac , ETH_ALEN ) ;
if ( ssb_arch_register_fallback_sprom (
& bcm63xx_get_fallback_sprom ) < 0 )
2015-10-14 14:27:38 +03:00
pr_err ( " failed to register fallback SPROM \n " ) ;
2009-08-18 16:23:37 +04:00
}
2011-11-16 22:49:58 +04:00
# endif
2012-07-04 18:58:37 +04:00
bcm63xx_spi_register ( ) ;
2013-11-30 15:42:05 +04:00
bcm63xx_hsspi_register ( ) ;
2012-07-24 18:33:11 +04:00
bcm63xx_flash_register ( ) ;
2009-08-18 16:23:37 +04:00
bcm63xx_led_data . num_leds = ARRAY_SIZE ( board . leds ) ;
bcm63xx_led_data . leds = board . leds ;
platform_device_register ( & bcm63xx_gpio_leds ) ;
2013-06-18 20:55:43 +04:00
if ( board . ephy_reset_gpio & & board . ephy_reset_gpio_flags )
gpio_request_one ( board . ephy_reset_gpio ,
board . ephy_reset_gpio_flags , " ephy-reset " ) ;
2009-08-18 16:23:37 +04:00
return 0 ;
}