diff options
Diffstat (limited to 'arch/mips/bcm63xx')
| -rw-r--r-- | arch/mips/bcm63xx/Kconfig | 8 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/Makefile | 4 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/boards/board_bcm963xx.c | 3 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/clk.c | 42 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/cpu.c | 13 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/dev-hsspi.c | 47 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/early_printk.c | 3 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/prom.c | 14 | 
8 files changed, 116 insertions, 18 deletions
diff --git a/arch/mips/bcm63xx/Kconfig b/arch/mips/bcm63xx/Kconfig index b78306ce56c..a057fdf111c 100644 --- a/arch/mips/bcm63xx/Kconfig +++ b/arch/mips/bcm63xx/Kconfig @@ -3,33 +3,41 @@ menu "CPU support"  config BCM63XX_CPU_3368  	bool "support 3368 CPU" +	select SYS_HAS_CPU_BMIPS4350  	select HW_HAS_PCI  config BCM63XX_CPU_6328  	bool "support 6328 CPU" +	select SYS_HAS_CPU_BMIPS4350  	select HW_HAS_PCI  config BCM63XX_CPU_6338  	bool "support 6338 CPU" +	select SYS_HAS_CPU_BMIPS32_3300  	select HW_HAS_PCI  config BCM63XX_CPU_6345  	bool "support 6345 CPU" +	select SYS_HAS_CPU_BMIPS32_3300  config BCM63XX_CPU_6348  	bool "support 6348 CPU" +	select SYS_HAS_CPU_BMIPS32_3300  	select HW_HAS_PCI  config BCM63XX_CPU_6358  	bool "support 6358 CPU" +	select SYS_HAS_CPU_BMIPS4350  	select HW_HAS_PCI  config BCM63XX_CPU_6362  	bool "support 6362 CPU" +	select SYS_HAS_CPU_BMIPS4350  	select HW_HAS_PCI  config BCM63XX_CPU_6368  	bool "support 6368 CPU" +	select SYS_HAS_CPU_BMIPS4350  	select HW_HAS_PCI  endmenu diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile index ac2807397c1..9019f54aee6 100644 --- a/arch/mips/bcm63xx/Makefile +++ b/arch/mips/bcm63xx/Makefile @@ -1,7 +1,7 @@  obj-y		+= clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o reset.o \  		   setup.o timer.o dev-dsp.o dev-enet.o dev-flash.o \ -		   dev-pcmcia.o dev-rng.o dev-spi.o dev-uart.o dev-wdt.o \ -		   dev-usb-usbd.o +		   dev-pcmcia.o dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o \ +		   dev-wdt.o dev-usb-usbd.o  obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o  obj-y		+= boards/ diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c index 5b974eb125f..33727e7f0c7 100644 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c @@ -23,6 +23,7 @@  #include <bcm63xx_dev_enet.h>  #include <bcm63xx_dev_dsp.h>  #include <bcm63xx_dev_flash.h> +#include <bcm63xx_dev_hsspi.h>  #include <bcm63xx_dev_pcmcia.h>  #include <bcm63xx_dev_spi.h>  #include <bcm63xx_dev_usb_usbd.h> @@ -915,6 +916,8 @@ int __init board_register_devices(void)  	bcm63xx_spi_register(); +	bcm63xx_hsspi_register(); +  	bcm63xx_flash_register();  	bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds); diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c index 43da4ae04cc..63756528473 100644 --- a/arch/mips/bcm63xx/clk.c +++ b/arch/mips/bcm63xx/clk.c @@ -226,6 +226,28 @@ static struct clk clk_spi = {  };  /* + * HSSPI clock + */ +static void hsspi_set(struct clk *clk, int enable) +{ +	u32 mask; + +	if (BCMCPU_IS_6328()) +		mask = CKCTL_6328_HSSPI_EN; +	else if (BCMCPU_IS_6362()) +		mask = CKCTL_6362_HSSPI_EN; +	else +		return; + +	bcm_hwclock_set(mask, enable); +} + +static struct clk clk_hsspi = { +	.set	= hsspi_set, +}; + + +/*   * XTM clock   */  static void xtm_set(struct clk *clk, int enable) @@ -346,6 +368,8 @@ struct clk *clk_get(struct device *dev, const char *id)  		return &clk_usbd;  	if (!strcmp(id, "spi"))  		return &clk_spi; +	if (!strcmp(id, "hsspi")) +		return &clk_hsspi;  	if (!strcmp(id, "xtm"))  		return &clk_xtm;  	if (!strcmp(id, "periph")) @@ -366,3 +390,21 @@ void clk_put(struct clk *clk)  }  EXPORT_SYMBOL(clk_put); + +#define HSSPI_PLL_HZ_6328	133333333 +#define HSSPI_PLL_HZ_6362	400000000 + +static int __init bcm63xx_clk_init(void) +{ +	switch (bcm63xx_get_cpu_id()) { +	case BCM6328_CPU_ID: +		clk_hsspi.rate = HSSPI_PLL_HZ_6328; +		break; +	case BCM6362_CPU_ID: +		clk_hsspi.rate = HSSPI_PLL_HZ_6362; +		break; +	} + +	return 0; +} +arch_initcall(bcm63xx_clk_init); diff --git a/arch/mips/bcm63xx/cpu.c b/arch/mips/bcm63xx/cpu.c index 7e17374a9ae..fd4e76c00a4 100644 --- a/arch/mips/bcm63xx/cpu.c +++ b/arch/mips/bcm63xx/cpu.c @@ -123,7 +123,9 @@ unsigned int bcm63xx_get_memory_size(void)  static unsigned int detect_cpu_clock(void)  { -	switch (bcm63xx_get_cpu_id()) { +	u16 cpu_id = bcm63xx_get_cpu_id(); + +	switch (cpu_id) {  	case BCM3368_CPU_ID:  		return 300000000; @@ -249,7 +251,7 @@ static unsigned int detect_cpu_clock(void)  	}  	default: -		BUG(); +		panic("Failed to detect clock for CPU with id=%04X\n", cpu_id);  	}  } @@ -297,23 +299,22 @@ static unsigned int detect_memory_size(void)  void __init bcm63xx_cpu_init(void)  {  	unsigned int tmp; -	struct cpuinfo_mips *c = ¤t_cpu_data;  	unsigned int cpu = smp_processor_id();  	u32 chipid_reg;  	/* soc registers location depends on cpu type */  	chipid_reg = 0; -	switch (c->cputype) { +	switch (current_cpu_type()) {  	case CPU_BMIPS3300: -		if ((read_c0_prid() & 0xff00) != PRID_IMP_BMIPS3300_ALT) +		if ((read_c0_prid() & PRID_IMP_MASK) != PRID_IMP_BMIPS3300_ALT)  			__cpu_name[cpu] = "Broadcom BCM6338";  		/* fall-through */  	case CPU_BMIPS32:  		chipid_reg = BCM_6345_PERF_BASE;  		break;  	case CPU_BMIPS4350: -		switch ((read_c0_prid() & 0xff)) { +		switch ((read_c0_prid() & PRID_REV_MASK)) {  		case 0x04:  			chipid_reg = BCM_3368_PERF_BASE;  			break; diff --git a/arch/mips/bcm63xx/dev-hsspi.c b/arch/mips/bcm63xx/dev-hsspi.c new file mode 100644 index 00000000000..696abc48e3c --- /dev/null +++ b/arch/mips/bcm63xx/dev-hsspi.c @@ -0,0 +1,47 @@ +/* + * 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) 2012 Jonas Gorski <jonas.gorski@gmail.com> + */ + +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/platform_device.h> + +#include <bcm63xx_cpu.h> +#include <bcm63xx_dev_hsspi.h> +#include <bcm63xx_regs.h> + +static struct resource spi_resources[] = { +	{ +		.start		= -1, /* filled at runtime */ +		.end		= -1, /* filled at runtime */ +		.flags		= IORESOURCE_MEM, +	}, +	{ +		.start		= -1, /* filled at runtime */ +		.flags		= IORESOURCE_IRQ, +	}, +}; + +static struct platform_device bcm63xx_hsspi_device = { +	.name		= "bcm63xx-hsspi", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(spi_resources), +	.resource	= spi_resources, +}; + +int __init bcm63xx_hsspi_register(void) +{ +	if (!BCMCPU_IS_6328() && !BCMCPU_IS_6362()) +		return -ENODEV; + +	spi_resources[0].start = bcm63xx_regset_address(RSET_HSSPI); +	spi_resources[0].end = spi_resources[0].start; +	spi_resources[0].end += RSET_HSSPI_SIZE - 1; +	spi_resources[1].start = bcm63xx_get_irq_number(IRQ_HSSPI); + +	return platform_device_register(&bcm63xx_hsspi_device); +} diff --git a/arch/mips/bcm63xx/early_printk.c b/arch/mips/bcm63xx/early_printk.c index aa8f7f9cc7a..6092226a6d7 100644 --- a/arch/mips/bcm63xx/early_printk.c +++ b/arch/mips/bcm63xx/early_printk.c @@ -6,9 +6,8 @@   * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>   */ -#include <linux/init.h>  #include <bcm63xx_io.h> -#include <bcm63xx_regs.h> +#include <linux/serial_bcm63xx.h>  static void wait_xfered(void)  { diff --git a/arch/mips/bcm63xx/prom.c b/arch/mips/bcm63xx/prom.c index 8ac4e095e68..e1f27d653f6 100644 --- a/arch/mips/bcm63xx/prom.c +++ b/arch/mips/bcm63xx/prom.c @@ -59,14 +59,12 @@ void __init prom_init(void)  	/* do low level board init */  	board_prom_init(); -	if (IS_ENABLED(CONFIG_CPU_BMIPS4350) && IS_ENABLED(CONFIG_SMP)) { -		/* set up SMP */ -		register_smp_ops(&bmips_smp_ops); - +	/* set up SMP */ +	if (!register_bmips_smp_ops()) {  		/* -		 * BCM6328 might not have its second CPU enabled, while BCM6358 -		 * needs special handling for its shared TLB, so disable SMP -		 * for now. +		 * BCM6328 might not have its second CPU enabled, while BCM3368 +		 * and BCM6358 need special handling for their shared TLB, so +		 * disable SMP for now.  		 */  		if (BCMCPU_IS_6328()) {  			reg = bcm_readl(BCM_6328_OTP_BASE + @@ -74,7 +72,7 @@ void __init prom_init(void)  			if (reg & OTP_6328_REG3_TP1_DISABLED)  				bmips_smp_enabled = 0; -		} else if (BCMCPU_IS_6358()) { +		} else if (BCMCPU_IS_3368() || BCMCPU_IS_6358()) {  			bmips_smp_enabled = 0;  		}  | 
