diff options
Diffstat (limited to 'arch/arm/mach-dove/common.c')
| -rw-r--r-- | arch/arm/mach-dove/common.c | 169 | 
1 files changed, 144 insertions, 25 deletions
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 6321567d8ea..b37bef1d5ff 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c @@ -16,6 +16,8 @@  #include <linux/clk-provider.h>  #include <linux/ata_platform.h>  #include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_platform.h>  #include <asm/page.h>  #include <asm/setup.h>  #include <asm/timex.h> @@ -24,41 +26,30 @@  #include <asm/mach/time.h>  #include <asm/mach/pci.h>  #include <mach/dove.h> +#include <mach/pm.h>  #include <mach/bridge-regs.h>  #include <asm/mach/arch.h>  #include <linux/irq.h>  #include <plat/time.h> -#include <plat/ehci-orion.h> +#include <linux/platform_data/usb-ehci-orion.h>  #include <plat/common.h>  #include <plat/addr-map.h>  #include "common.h" -static int get_tclk(void); -  /*****************************************************************************   * I/O Address Mapping   ****************************************************************************/  static struct map_desc dove_io_desc[] __initdata = {  	{ -		.virtual	= DOVE_SB_REGS_VIRT_BASE, +		.virtual	= (unsigned long) DOVE_SB_REGS_VIRT_BASE,  		.pfn		= __phys_to_pfn(DOVE_SB_REGS_PHYS_BASE),  		.length		= DOVE_SB_REGS_SIZE,  		.type		= MT_DEVICE,  	}, { -		.virtual	= DOVE_NB_REGS_VIRT_BASE, +		.virtual	= (unsigned long) DOVE_NB_REGS_VIRT_BASE,  		.pfn		= __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE),  		.length		= DOVE_NB_REGS_SIZE,  		.type		= MT_DEVICE, -	}, { -		.virtual	= DOVE_PCIE0_IO_VIRT_BASE, -		.pfn		= __phys_to_pfn(DOVE_PCIE0_IO_PHYS_BASE), -		.length		= DOVE_PCIE0_IO_SIZE, -		.type		= MT_DEVICE, -	}, { -		.virtual	= DOVE_PCIE1_IO_VIRT_BASE, -		.pfn		= __phys_to_pfn(DOVE_PCIE1_IO_PHYS_BASE), -		.length		= DOVE_PCIE1_IO_SIZE, -		.type		= MT_DEVICE,  	},  }; @@ -70,14 +61,69 @@ void __init dove_map_io(void)  /*****************************************************************************   * CLK tree   ****************************************************************************/ +static int dove_tclk; + +static DEFINE_SPINLOCK(gating_lock);  static struct clk *tclk; -static void __init clk_init(void) +static struct clk __init *dove_register_gate(const char *name, +					     const char *parent, u8 bit_idx)  { +	return clk_register_gate(NULL, name, parent, 0, +				 (void __iomem *)CLOCK_GATING_CONTROL, +				 bit_idx, 0, &gating_lock); +} + +static void __init dove_clk_init(void) +{ +	struct clk *usb0, *usb1, *sata, *pex0, *pex1, *sdio0, *sdio1; +	struct clk *nand, *camera, *i2s0, *i2s1, *crypto, *ac97, *pdma; +	struct clk *xor0, *xor1, *ge, *gephy; +  	tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, -				       get_tclk()); +				       dove_tclk); + +	usb0 = dove_register_gate("usb0", "tclk", CLOCK_GATING_BIT_USB0); +	usb1 = dove_register_gate("usb1", "tclk", CLOCK_GATING_BIT_USB1); +	sata = dove_register_gate("sata", "tclk", CLOCK_GATING_BIT_SATA); +	pex0 = dove_register_gate("pex0", "tclk", CLOCK_GATING_BIT_PCIE0); +	pex1 = dove_register_gate("pex1", "tclk", CLOCK_GATING_BIT_PCIE1); +	sdio0 = dove_register_gate("sdio0", "tclk", CLOCK_GATING_BIT_SDIO0); +	sdio1 = dove_register_gate("sdio1", "tclk", CLOCK_GATING_BIT_SDIO1); +	nand = dove_register_gate("nand", "tclk", CLOCK_GATING_BIT_NAND); +	camera = dove_register_gate("camera", "tclk", CLOCK_GATING_BIT_CAMERA); +	i2s0 = dove_register_gate("i2s0", "tclk", CLOCK_GATING_BIT_I2S0); +	i2s1 = dove_register_gate("i2s1", "tclk", CLOCK_GATING_BIT_I2S1); +	crypto = dove_register_gate("crypto", "tclk", CLOCK_GATING_BIT_CRYPTO); +	ac97 = dove_register_gate("ac97", "tclk", CLOCK_GATING_BIT_AC97); +	pdma = dove_register_gate("pdma", "tclk", CLOCK_GATING_BIT_PDMA); +	xor0 = dove_register_gate("xor0", "tclk", CLOCK_GATING_BIT_XOR0); +	xor1 = dove_register_gate("xor1", "tclk", CLOCK_GATING_BIT_XOR1); +	gephy = dove_register_gate("gephy", "tclk", CLOCK_GATING_BIT_GIGA_PHY); +	ge = dove_register_gate("ge", "gephy", CLOCK_GATING_BIT_GBE); -	orion_clkdev_init(tclk); +	orion_clkdev_add(NULL, "orion_spi.0", tclk); +	orion_clkdev_add(NULL, "orion_spi.1", tclk); +	orion_clkdev_add(NULL, "orion_wdt", tclk); +	orion_clkdev_add(NULL, "mv64xxx_i2c.0", tclk); + +	orion_clkdev_add(NULL, "orion-ehci.0", usb0); +	orion_clkdev_add(NULL, "orion-ehci.1", usb1); +	orion_clkdev_add(NULL, "mv643xx_eth.0", ge); +	orion_clkdev_add("0", "sata_mv.0", sata); +	orion_clkdev_add("0", "pcie", pex0); +	orion_clkdev_add("1", "pcie", pex1); +	orion_clkdev_add(NULL, "sdhci-dove.0", sdio0); +	orion_clkdev_add(NULL, "sdhci-dove.1", sdio1); +	orion_clkdev_add(NULL, "orion_nand", nand); +	orion_clkdev_add(NULL, "cafe1000-ccic.0", camera); +	orion_clkdev_add(NULL, "kirkwood-i2s.0", i2s0); +	orion_clkdev_add(NULL, "kirkwood-i2s.1", i2s1); +	orion_clkdev_add(NULL, "mv_crypto", crypto); +	orion_clkdev_add(NULL, "dove-ac97", ac97); +	orion_clkdev_add(NULL, "dove-pdma", pdma); +	orion_clkdev_add(NULL, "mv_xor_shared.0", xor0); +	orion_clkdev_add(NULL, "mv_xor_shared.1", xor1);  }  /***************************************************************************** @@ -188,16 +234,16 @@ void __init dove_init_early(void)  	orion_time_set_base(TIMER_VIRT_BASE);  } -static int get_tclk(void) +static int __init dove_find_tclk(void)  { -	/* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */  	return 166666667;  }  static void __init dove_timer_init(void)  { +	dove_tclk = dove_find_tclk();  	orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR, -			IRQ_DOVE_BRIDGE, get_tclk()); +			IRQ_DOVE_BRIDGE, dove_tclk);  }  struct sys_timer dove_timer = { @@ -205,6 +251,15 @@ struct sys_timer dove_timer = {  };  /***************************************************************************** + * Cryptographic Engines and Security Accelerator (CESA) + ****************************************************************************/ +void __init dove_crypto_init(void) +{ +	orion_crypto_init(DOVE_CRYPT_PHYS_BASE, DOVE_CESA_PHYS_BASE, +			  DOVE_CESA_SIZE, IRQ_DOVE_CRYPTO); +} + +/*****************************************************************************   * XOR 0   ****************************************************************************/  void __init dove_xor0_init(void) @@ -285,16 +340,16 @@ void __init dove_sdio1_init(void)  void __init dove_init(void)  { -	printk(KERN_INFO "Dove 88AP510 SoC, "); -	printk(KERN_INFO "TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000); +	pr_info("Dove 88AP510 SoC, TCLK = %d MHz.\n", +		(dove_tclk + 499999) / 1000000);  #ifdef CONFIG_CACHE_TAUROS2 -	tauros2_init(); +	tauros2_init(0);  #endif  	dove_setup_cpu_mbus();  	/* Setup root of clk tree */ -	clk_init(); +	dove_clk_init();  	/* internal devices that every board has */  	dove_rtc_init(); @@ -317,3 +372,67 @@ void dove_restart(char mode, const char *cmd)  	while (1)  		;  } + +#if defined(CONFIG_MACH_DOVE_DT) +/* + * Auxdata required until real OF clock provider + */ +struct of_dev_auxdata dove_auxdata_lookup[] __initdata = { +	OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), +	OF_DEV_AUXDATA("marvell,orion-spi", 0xf1014600, "orion_spi.1", NULL), +	OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), +	OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", +		       NULL), +	OF_DEV_AUXDATA("marvell,orion-sata", 0xf10a0000, "sata_mv.0", NULL), +	OF_DEV_AUXDATA("marvell,dove-sdhci", 0xf1092000, "sdhci-dove.0", NULL), +	OF_DEV_AUXDATA("marvell,dove-sdhci", 0xf1090000, "sdhci-dove.1", NULL), +	{}, +}; + +static struct mv643xx_eth_platform_data dove_dt_ge00_data = { +	.phy_addr = MV643XX_ETH_PHY_ADDR_DEFAULT, +}; + +static void __init dove_dt_init(void) +{ +	pr_info("Dove 88AP510 SoC, TCLK = %d MHz.\n", +		(dove_tclk + 499999) / 1000000); + +#ifdef CONFIG_CACHE_TAUROS2 +	tauros2_init(); +#endif +	dove_setup_cpu_mbus(); + +	/* Setup root of clk tree */ +	dove_clk_init(); + +	/* Internal devices not ported to DT yet */ +	dove_rtc_init(); +	dove_xor0_init(); +	dove_xor1_init(); + +	dove_ge00_init(&dove_dt_ge00_data); +	dove_ehci0_init(); +	dove_ehci1_init(); +	dove_pcie_init(1, 1); +	dove_crypto_init(); + +	of_platform_populate(NULL, of_default_bus_match_table, +			     dove_auxdata_lookup, NULL); +} + +static const char * const dove_dt_board_compat[] = { +	"marvell,dove", +	NULL +}; + +DT_MACHINE_START(DOVE_DT, "Marvell Dove (Flattened Device Tree)") +	.map_io		= dove_map_io, +	.init_early	= dove_init_early, +	.init_irq	= orion_dt_init_irq, +	.timer		= &dove_timer, +	.init_machine	= dove_dt_init, +	.restart	= dove_restart, +	.dt_compat	= dove_dt_board_compat, +MACHINE_END +#endif  |