| /* | 
 |  * arch/arm/mach-spear3xx/spear3xx.c | 
 |  * | 
 |  * SPEAr3XX machines common source file | 
 |  * | 
 |  * Copyright (C) 2009-2012 ST Microelectronics | 
 |  * Viresh Kumar <[email protected]> | 
 |  * | 
 |  * 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. | 
 |  */ | 
 |  | 
 | #define pr_fmt(fmt) "SPEAr3xx: " fmt | 
 |  | 
 | #include <linux/amba/pl022.h> | 
 | #include <linux/amba/pl080.h> | 
 | #include <linux/clk.h> | 
 | #include <linux/io.h> | 
 | #include <asm/mach/map.h> | 
 | #include "pl080.h" | 
 | #include "generic.h" | 
 | #include <mach/spear.h> | 
 | #include <mach/misc_regs.h> | 
 |  | 
 | /* ssp device registration */ | 
 | struct pl022_ssp_controller pl022_plat_data = { | 
 | 	.bus_id = 0, | 
 | 	.enable_dma = 1, | 
 | 	.dma_filter = pl08x_filter_id, | 
 | 	.dma_tx_param = "ssp0_tx", | 
 | 	.dma_rx_param = "ssp0_rx", | 
 | 	/* | 
 | 	 * This is number of spi devices that can be connected to spi. There are | 
 | 	 * two type of chipselects on which slave devices can work. One is chip | 
 | 	 * select provided by spi masters other is controlled through external | 
 | 	 * gpio's. We can't use chipselect provided from spi master (because as | 
 | 	 * soon as FIFO becomes empty, CS is disabled and transfer ends). So | 
 | 	 * this number now depends on number of gpios available for spi. each | 
 | 	 * slave on each master requires a separate gpio pin. | 
 | 	 */ | 
 | 	.num_chipselect = 2, | 
 | }; | 
 |  | 
 | /* dmac device registration */ | 
 | struct pl08x_platform_data pl080_plat_data = { | 
 | 	.memcpy_channel = { | 
 | 		.bus_id = "memcpy", | 
 | 		.cctl_memcpy = | 
 | 			(PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \ | 
 | 			PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \ | 
 | 			PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \ | 
 | 			PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \ | 
 | 			PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \ | 
 | 			PL080_CONTROL_PROT_SYS), | 
 | 	}, | 
 | 	.lli_buses = PL08X_AHB1, | 
 | 	.mem_buses = PL08X_AHB1, | 
 | 	.get_xfer_signal = pl080_get_signal, | 
 | 	.put_xfer_signal = pl080_put_signal, | 
 | }; | 
 |  | 
 | /* | 
 |  * Following will create 16MB static virtual/physical mappings | 
 |  * PHYSICAL		VIRTUAL | 
 |  * 0xD0000000		0xFD000000 | 
 |  * 0xFC000000		0xFC000000 | 
 |  */ | 
 | struct map_desc spear3xx_io_desc[] __initdata = { | 
 | 	{ | 
 | 		.virtual	= (unsigned long)VA_SPEAR_ICM1_2_BASE, | 
 | 		.pfn		= __phys_to_pfn(SPEAR_ICM1_2_BASE), | 
 | 		.length		= SZ_16M, | 
 | 		.type		= MT_DEVICE | 
 | 	}, { | 
 | 		.virtual	= (unsigned long)VA_SPEAR_ICM3_SMI_CTRL_BASE, | 
 | 		.pfn		= __phys_to_pfn(SPEAR_ICM3_SMI_CTRL_BASE), | 
 | 		.length		= SZ_16M, | 
 | 		.type		= MT_DEVICE | 
 | 	}, | 
 | }; | 
 |  | 
 | /* This will create static memory mapping for selected devices */ | 
 | void __init spear3xx_map_io(void) | 
 | { | 
 | 	iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc)); | 
 | } | 
 |  | 
 | void __init spear3xx_timer_init(void) | 
 | { | 
 | 	char pclk_name[] = "pll3_clk"; | 
 | 	struct clk *gpt_clk, *pclk; | 
 |  | 
 | 	spear3xx_clk_init(MISC_BASE, VA_SPEAR320_SOC_CONFIG_BASE); | 
 |  | 
 | 	/* get the system timer clock */ | 
 | 	gpt_clk = clk_get_sys("gpt0", NULL); | 
 | 	if (IS_ERR(gpt_clk)) { | 
 | 		pr_err("%s:couldn't get clk for gpt\n", __func__); | 
 | 		BUG(); | 
 | 	} | 
 |  | 
 | 	/* get the suitable parent clock for timer*/ | 
 | 	pclk = clk_get(NULL, pclk_name); | 
 | 	if (IS_ERR(pclk)) { | 
 | 		pr_err("%s:couldn't get %s as parent for gpt\n", | 
 | 				__func__, pclk_name); | 
 | 		BUG(); | 
 | 	} | 
 |  | 
 | 	clk_set_parent(gpt_clk, pclk); | 
 | 	clk_put(gpt_clk); | 
 | 	clk_put(pclk); | 
 |  | 
 | 	spear_setup_of_timer(); | 
 | } |