diff options
Diffstat (limited to 'drivers')
32 files changed, 1313 insertions, 530 deletions
| diff --git a/drivers/clk/spear/spear1310_clock.c b/drivers/clk/spear/spear1310_clock.c index ed9af427861..aedbbe12f32 100644 --- a/drivers/clk/spear/spear1310_clock.c +++ b/drivers/clk/spear/spear1310_clock.c @@ -17,12 +17,10 @@  #include <linux/io.h>  #include <linux/of_platform.h>  #include <linux/spinlock_types.h> -#include <mach/spear.h>  #include "clk.h" -#define VA_SPEAR1310_RAS_BASE			IOMEM(UL(0xFA400000))  /* PLL related registers and bit values */ -#define SPEAR1310_PLL_CFG			(VA_MISC_BASE + 0x210) +#define SPEAR1310_PLL_CFG			(misc_base + 0x210)  	/* PLL_CFG bit values */  	#define SPEAR1310_CLCD_SYNT_CLK_MASK		1  	#define SPEAR1310_CLCD_SYNT_CLK_SHIFT		31 @@ -35,15 +33,15 @@  	#define SPEAR1310_PLL2_CLK_SHIFT		22  	#define SPEAR1310_PLL1_CLK_SHIFT		20 -#define SPEAR1310_PLL1_CTR			(VA_MISC_BASE + 0x214) -#define SPEAR1310_PLL1_FRQ			(VA_MISC_BASE + 0x218) -#define SPEAR1310_PLL2_CTR			(VA_MISC_BASE + 0x220) -#define SPEAR1310_PLL2_FRQ			(VA_MISC_BASE + 0x224) -#define SPEAR1310_PLL3_CTR			(VA_MISC_BASE + 0x22C) -#define SPEAR1310_PLL3_FRQ			(VA_MISC_BASE + 0x230) -#define SPEAR1310_PLL4_CTR			(VA_MISC_BASE + 0x238) -#define SPEAR1310_PLL4_FRQ			(VA_MISC_BASE + 0x23C) -#define SPEAR1310_PERIP_CLK_CFG			(VA_MISC_BASE + 0x244) +#define SPEAR1310_PLL1_CTR			(misc_base + 0x214) +#define SPEAR1310_PLL1_FRQ			(misc_base + 0x218) +#define SPEAR1310_PLL2_CTR			(misc_base + 0x220) +#define SPEAR1310_PLL2_FRQ			(misc_base + 0x224) +#define SPEAR1310_PLL3_CTR			(misc_base + 0x22C) +#define SPEAR1310_PLL3_FRQ			(misc_base + 0x230) +#define SPEAR1310_PLL4_CTR			(misc_base + 0x238) +#define SPEAR1310_PLL4_FRQ			(misc_base + 0x23C) +#define SPEAR1310_PERIP_CLK_CFG			(misc_base + 0x244)  	/* PERIP_CLK_CFG bit values */  	#define SPEAR1310_GPT_OSC24_VAL			0  	#define SPEAR1310_GPT_APB_VAL			1 @@ -65,7 +63,7 @@  	#define SPEAR1310_C3_CLK_MASK			1  	#define SPEAR1310_C3_CLK_SHIFT			1 -#define SPEAR1310_GMAC_CLK_CFG			(VA_MISC_BASE + 0x248) +#define SPEAR1310_GMAC_CLK_CFG			(misc_base + 0x248)  	#define SPEAR1310_GMAC_PHY_IF_SEL_MASK		3  	#define SPEAR1310_GMAC_PHY_IF_SEL_SHIFT		4  	#define SPEAR1310_GMAC_PHY_CLK_MASK		1 @@ -73,7 +71,7 @@  	#define SPEAR1310_GMAC_PHY_INPUT_CLK_MASK	2  	#define SPEAR1310_GMAC_PHY_INPUT_CLK_SHIFT	1 -#define SPEAR1310_I2S_CLK_CFG			(VA_MISC_BASE + 0x24C) +#define SPEAR1310_I2S_CLK_CFG			(misc_base + 0x24C)  	/* I2S_CLK_CFG register mask */  	#define SPEAR1310_I2S_SCLK_X_MASK		0x1F  	#define SPEAR1310_I2S_SCLK_X_SHIFT		27 @@ -91,21 +89,21 @@  	#define SPEAR1310_I2S_SRC_CLK_MASK		2  	#define SPEAR1310_I2S_SRC_CLK_SHIFT		0 -#define SPEAR1310_C3_CLK_SYNT			(VA_MISC_BASE + 0x250) -#define SPEAR1310_UART_CLK_SYNT			(VA_MISC_BASE + 0x254) -#define SPEAR1310_GMAC_CLK_SYNT			(VA_MISC_BASE + 0x258) -#define SPEAR1310_SDHCI_CLK_SYNT		(VA_MISC_BASE + 0x25C) -#define SPEAR1310_CFXD_CLK_SYNT			(VA_MISC_BASE + 0x260) -#define SPEAR1310_ADC_CLK_SYNT			(VA_MISC_BASE + 0x264) -#define SPEAR1310_AMBA_CLK_SYNT			(VA_MISC_BASE + 0x268) -#define SPEAR1310_CLCD_CLK_SYNT			(VA_MISC_BASE + 0x270) -#define SPEAR1310_RAS_CLK_SYNT0			(VA_MISC_BASE + 0x280) -#define SPEAR1310_RAS_CLK_SYNT1			(VA_MISC_BASE + 0x288) -#define SPEAR1310_RAS_CLK_SYNT2			(VA_MISC_BASE + 0x290) -#define SPEAR1310_RAS_CLK_SYNT3			(VA_MISC_BASE + 0x298) +#define SPEAR1310_C3_CLK_SYNT			(misc_base + 0x250) +#define SPEAR1310_UART_CLK_SYNT			(misc_base + 0x254) +#define SPEAR1310_GMAC_CLK_SYNT			(misc_base + 0x258) +#define SPEAR1310_SDHCI_CLK_SYNT		(misc_base + 0x25C) +#define SPEAR1310_CFXD_CLK_SYNT			(misc_base + 0x260) +#define SPEAR1310_ADC_CLK_SYNT			(misc_base + 0x264) +#define SPEAR1310_AMBA_CLK_SYNT			(misc_base + 0x268) +#define SPEAR1310_CLCD_CLK_SYNT			(misc_base + 0x270) +#define SPEAR1310_RAS_CLK_SYNT0			(misc_base + 0x280) +#define SPEAR1310_RAS_CLK_SYNT1			(misc_base + 0x288) +#define SPEAR1310_RAS_CLK_SYNT2			(misc_base + 0x290) +#define SPEAR1310_RAS_CLK_SYNT3			(misc_base + 0x298)  	/* Check Fractional synthesizer reg masks */ -#define SPEAR1310_PERIP1_CLK_ENB		(VA_MISC_BASE + 0x300) +#define SPEAR1310_PERIP1_CLK_ENB		(misc_base + 0x300)  	/* PERIP1_CLK_ENB register masks */  	#define SPEAR1310_RTC_CLK_ENB			31  	#define SPEAR1310_ADC_CLK_ENB			30 @@ -138,7 +136,7 @@  	#define SPEAR1310_SYSROM_CLK_ENB		1  	#define SPEAR1310_BUS_CLK_ENB			0 -#define SPEAR1310_PERIP2_CLK_ENB		(VA_MISC_BASE + 0x304) +#define SPEAR1310_PERIP2_CLK_ENB		(misc_base + 0x304)  	/* PERIP2_CLK_ENB register masks */  	#define SPEAR1310_THSENS_CLK_ENB		8  	#define SPEAR1310_I2S_REF_PAD_CLK_ENB		7 @@ -150,7 +148,7 @@  	#define SPEAR1310_DDR_CORE_CLK_ENB		1  	#define SPEAR1310_DDR_CTRL_CLK_ENB		0 -#define SPEAR1310_RAS_CLK_ENB			(VA_MISC_BASE + 0x310) +#define SPEAR1310_RAS_CLK_ENB			(misc_base + 0x310)  	/* RAS_CLK_ENB register masks */  	#define SPEAR1310_SYNT3_CLK_ENB			17  	#define SPEAR1310_SYNT2_CLK_ENB			16 @@ -172,7 +170,7 @@  	#define SPEAR1310_ACLK_CLK_ENB			0  /* RAS Area Control Register */ -#define SPEAR1310_RAS_CTRL_REG0			(VA_SPEAR1310_RAS_BASE + 0x000) +#define SPEAR1310_RAS_CTRL_REG0			(ras_base + 0x000)  	#define SPEAR1310_SSP1_CLK_MASK			3  	#define SPEAR1310_SSP1_CLK_SHIFT		26  	#define SPEAR1310_TDM_CLK_MASK			1 @@ -197,12 +195,12 @@  	#define SPEAR1310_PCI_CLK_MASK			1  	#define SPEAR1310_PCI_CLK_SHIFT			0 -#define SPEAR1310_RAS_CTRL_REG1			(VA_SPEAR1310_RAS_BASE + 0x004) +#define SPEAR1310_RAS_CTRL_REG1			(ras_base + 0x004)  	#define SPEAR1310_PHY_CLK_MASK			0x3  	#define SPEAR1310_RMII_PHY_CLK_SHIFT		0  	#define SPEAR1310_SMII_RGMII_PHY_CLK_SHIFT	2 -#define SPEAR1310_RAS_SW_CLK_CTRL		(VA_SPEAR1310_RAS_BASE + 0x0148) +#define SPEAR1310_RAS_SW_CLK_CTRL		(ras_base + 0x0148)  	#define SPEAR1310_CAN1_CLK_ENB			25  	#define SPEAR1310_CAN0_CLK_ENB			24  	#define SPEAR1310_GPT64_CLK_ENB			23 @@ -385,7 +383,7 @@ static const char *ssp1_parents[] = { "ras_apb_clk", "gen_syn1_clk",  static const char *pci_parents[] = { "ras_pll3_clk", "gen_syn2_clk", };  static const char *tdm_parents[] = { "ras_pll3_clk", "gen_syn1_clk", }; -void __init spear1310_clk_init(void) +void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base)  {  	struct clk *clk, *clk1; diff --git a/drivers/clk/spear/spear1340_clock.c b/drivers/clk/spear/spear1340_clock.c index 35e7e2698e1..9d0b3949db3 100644 --- a/drivers/clk/spear/spear1340_clock.c +++ b/drivers/clk/spear/spear1340_clock.c @@ -17,18 +17,17 @@  #include <linux/io.h>  #include <linux/of_platform.h>  #include <linux/spinlock_types.h> -#include <mach/spear.h>  #include "clk.h"  /* Clock Configuration Registers */ -#define SPEAR1340_SYS_CLK_CTRL			(VA_MISC_BASE + 0x200) +#define SPEAR1340_SYS_CLK_CTRL			(misc_base + 0x200)  	#define SPEAR1340_HCLK_SRC_SEL_SHIFT	27  	#define SPEAR1340_HCLK_SRC_SEL_MASK	1  	#define SPEAR1340_SCLK_SRC_SEL_SHIFT	23  	#define SPEAR1340_SCLK_SRC_SEL_MASK	3  /* PLL related registers and bit values */ -#define SPEAR1340_PLL_CFG			(VA_MISC_BASE + 0x210) +#define SPEAR1340_PLL_CFG			(misc_base + 0x210)  	/* PLL_CFG bit values */  	#define SPEAR1340_CLCD_SYNT_CLK_MASK		1  	#define SPEAR1340_CLCD_SYNT_CLK_SHIFT		31 @@ -40,15 +39,15 @@  	#define SPEAR1340_PLL2_CLK_SHIFT		22  	#define SPEAR1340_PLL1_CLK_SHIFT		20 -#define SPEAR1340_PLL1_CTR			(VA_MISC_BASE + 0x214) -#define SPEAR1340_PLL1_FRQ			(VA_MISC_BASE + 0x218) -#define SPEAR1340_PLL2_CTR			(VA_MISC_BASE + 0x220) -#define SPEAR1340_PLL2_FRQ			(VA_MISC_BASE + 0x224) -#define SPEAR1340_PLL3_CTR			(VA_MISC_BASE + 0x22C) -#define SPEAR1340_PLL3_FRQ			(VA_MISC_BASE + 0x230) -#define SPEAR1340_PLL4_CTR			(VA_MISC_BASE + 0x238) -#define SPEAR1340_PLL4_FRQ			(VA_MISC_BASE + 0x23C) -#define SPEAR1340_PERIP_CLK_CFG			(VA_MISC_BASE + 0x244) +#define SPEAR1340_PLL1_CTR			(misc_base + 0x214) +#define SPEAR1340_PLL1_FRQ			(misc_base + 0x218) +#define SPEAR1340_PLL2_CTR			(misc_base + 0x220) +#define SPEAR1340_PLL2_FRQ			(misc_base + 0x224) +#define SPEAR1340_PLL3_CTR			(misc_base + 0x22C) +#define SPEAR1340_PLL3_FRQ			(misc_base + 0x230) +#define SPEAR1340_PLL4_CTR			(misc_base + 0x238) +#define SPEAR1340_PLL4_FRQ			(misc_base + 0x23C) +#define SPEAR1340_PERIP_CLK_CFG			(misc_base + 0x244)  	/* PERIP_CLK_CFG bit values */  	#define SPEAR1340_SPDIF_CLK_MASK		1  	#define SPEAR1340_SPDIF_OUT_CLK_SHIFT		15 @@ -66,13 +65,13 @@  	#define SPEAR1340_C3_CLK_MASK			1  	#define SPEAR1340_C3_CLK_SHIFT			1 -#define SPEAR1340_GMAC_CLK_CFG			(VA_MISC_BASE + 0x248) +#define SPEAR1340_GMAC_CLK_CFG			(misc_base + 0x248)  	#define SPEAR1340_GMAC_PHY_CLK_MASK		1  	#define SPEAR1340_GMAC_PHY_CLK_SHIFT		2  	#define SPEAR1340_GMAC_PHY_INPUT_CLK_MASK	2  	#define SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT	0 -#define SPEAR1340_I2S_CLK_CFG			(VA_MISC_BASE + 0x24C) +#define SPEAR1340_I2S_CLK_CFG			(misc_base + 0x24C)  	/* I2S_CLK_CFG register mask */  	#define SPEAR1340_I2S_SCLK_X_MASK		0x1F  	#define SPEAR1340_I2S_SCLK_X_SHIFT		27 @@ -90,21 +89,21 @@  	#define SPEAR1340_I2S_SRC_CLK_MASK		2  	#define SPEAR1340_I2S_SRC_CLK_SHIFT		0 -#define SPEAR1340_C3_CLK_SYNT			(VA_MISC_BASE + 0x250) -#define SPEAR1340_UART0_CLK_SYNT		(VA_MISC_BASE + 0x254) -#define SPEAR1340_UART1_CLK_SYNT		(VA_MISC_BASE + 0x258) -#define SPEAR1340_GMAC_CLK_SYNT			(VA_MISC_BASE + 0x25C) -#define SPEAR1340_SDHCI_CLK_SYNT		(VA_MISC_BASE + 0x260) -#define SPEAR1340_CFXD_CLK_SYNT			(VA_MISC_BASE + 0x264) -#define SPEAR1340_ADC_CLK_SYNT			(VA_MISC_BASE + 0x270) -#define SPEAR1340_AMBA_CLK_SYNT			(VA_MISC_BASE + 0x274) -#define SPEAR1340_CLCD_CLK_SYNT			(VA_MISC_BASE + 0x27C) -#define SPEAR1340_SYS_CLK_SYNT			(VA_MISC_BASE + 0x284) -#define SPEAR1340_GEN_CLK_SYNT0			(VA_MISC_BASE + 0x28C) -#define SPEAR1340_GEN_CLK_SYNT1			(VA_MISC_BASE + 0x294) -#define SPEAR1340_GEN_CLK_SYNT2			(VA_MISC_BASE + 0x29C) -#define SPEAR1340_GEN_CLK_SYNT3			(VA_MISC_BASE + 0x304) -#define SPEAR1340_PERIP1_CLK_ENB		(VA_MISC_BASE + 0x30C) +#define SPEAR1340_C3_CLK_SYNT			(misc_base + 0x250) +#define SPEAR1340_UART0_CLK_SYNT		(misc_base + 0x254) +#define SPEAR1340_UART1_CLK_SYNT		(misc_base + 0x258) +#define SPEAR1340_GMAC_CLK_SYNT			(misc_base + 0x25C) +#define SPEAR1340_SDHCI_CLK_SYNT		(misc_base + 0x260) +#define SPEAR1340_CFXD_CLK_SYNT			(misc_base + 0x264) +#define SPEAR1340_ADC_CLK_SYNT			(misc_base + 0x270) +#define SPEAR1340_AMBA_CLK_SYNT			(misc_base + 0x274) +#define SPEAR1340_CLCD_CLK_SYNT			(misc_base + 0x27C) +#define SPEAR1340_SYS_CLK_SYNT			(misc_base + 0x284) +#define SPEAR1340_GEN_CLK_SYNT0			(misc_base + 0x28C) +#define SPEAR1340_GEN_CLK_SYNT1			(misc_base + 0x294) +#define SPEAR1340_GEN_CLK_SYNT2			(misc_base + 0x29C) +#define SPEAR1340_GEN_CLK_SYNT3			(misc_base + 0x304) +#define SPEAR1340_PERIP1_CLK_ENB		(misc_base + 0x30C)  	#define SPEAR1340_RTC_CLK_ENB			31  	#define SPEAR1340_ADC_CLK_ENB			30  	#define SPEAR1340_C3_CLK_ENB			29 @@ -133,7 +132,7 @@  	#define SPEAR1340_SYSROM_CLK_ENB		1  	#define SPEAR1340_BUS_CLK_ENB			0 -#define SPEAR1340_PERIP2_CLK_ENB		(VA_MISC_BASE + 0x310) +#define SPEAR1340_PERIP2_CLK_ENB		(misc_base + 0x310)  	#define SPEAR1340_THSENS_CLK_ENB		8  	#define SPEAR1340_I2S_REF_PAD_CLK_ENB		7  	#define SPEAR1340_ACP_CLK_ENB			6 @@ -144,7 +143,7 @@  	#define SPEAR1340_DDR_CORE_CLK_ENB		1  	#define SPEAR1340_DDR_CTRL_CLK_ENB		0 -#define SPEAR1340_PERIP3_CLK_ENB		(VA_MISC_BASE + 0x314) +#define SPEAR1340_PERIP3_CLK_ENB		(misc_base + 0x314)  	#define SPEAR1340_PLGPIO_CLK_ENB		18  	#define SPEAR1340_VIDEO_DEC_CLK_ENB		16  	#define SPEAR1340_VIDEO_ENC_CLK_ENB		15 @@ -441,7 +440,7 @@ static const char *gen_synth0_1_parents[] = { "vco1div4_clk", "vco3div2_clk",  static const char *gen_synth2_3_parents[] = { "vco1div4_clk", "vco2div2_clk",  	"pll2_clk", }; -void __init spear1340_clk_init(void) +void __init spear1340_clk_init(void __iomem *misc_base)  {  	struct clk *clk, *clk1; diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index 33d3ac588da..f9ec43fd132 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c @@ -15,21 +15,20 @@  #include <linux/io.h>  #include <linux/of_platform.h>  #include <linux/spinlock_types.h> -#include <mach/misc_regs.h>  #include "clk.h"  static DEFINE_SPINLOCK(_lock); -#define PLL1_CTR			(MISC_BASE + 0x008) -#define PLL1_FRQ			(MISC_BASE + 0x00C) -#define PLL2_CTR			(MISC_BASE + 0x014) -#define PLL2_FRQ			(MISC_BASE + 0x018) -#define PLL_CLK_CFG			(MISC_BASE + 0x020) +#define PLL1_CTR			(misc_base + 0x008) +#define PLL1_FRQ			(misc_base + 0x00C) +#define PLL2_CTR			(misc_base + 0x014) +#define PLL2_FRQ			(misc_base + 0x018) +#define PLL_CLK_CFG			(misc_base + 0x020)  	/* PLL_CLK_CFG register masks */  	#define MCTR_CLK_SHIFT		28  	#define MCTR_CLK_MASK		3 -#define CORE_CLK_CFG			(MISC_BASE + 0x024) +#define CORE_CLK_CFG			(misc_base + 0x024)  	/* CORE CLK CFG register masks */  	#define GEN_SYNTH2_3_CLK_SHIFT	18  	#define GEN_SYNTH2_3_CLK_MASK	1 @@ -39,7 +38,7 @@ static DEFINE_SPINLOCK(_lock);  	#define PCLK_RATIO_SHIFT	8  	#define PCLK_RATIO_MASK		2 -#define PERIP_CLK_CFG			(MISC_BASE + 0x028) +#define PERIP_CLK_CFG			(misc_base + 0x028)  	/* PERIP_CLK_CFG register masks */  	#define UART_CLK_SHIFT		4  	#define UART_CLK_MASK		1 @@ -50,7 +49,7 @@ static DEFINE_SPINLOCK(_lock);  	#define GPT2_CLK_SHIFT		12  	#define GPT_CLK_MASK		1 -#define PERIP1_CLK_ENB			(MISC_BASE + 0x02C) +#define PERIP1_CLK_ENB			(misc_base + 0x02C)  	/* PERIP1_CLK_ENB register masks */  	#define UART_CLK_ENB		3  	#define SSP_CLK_ENB		5 @@ -69,7 +68,7 @@ static DEFINE_SPINLOCK(_lock);  	#define USBH_CLK_ENB		25  	#define C3_CLK_ENB		31 -#define RAS_CLK_ENB			(MISC_BASE + 0x034) +#define RAS_CLK_ENB			(misc_base + 0x034)  	#define RAS_AHB_CLK_ENB		0  	#define RAS_PLL1_CLK_ENB	1  	#define RAS_APB_CLK_ENB		2 @@ -82,20 +81,20 @@ static DEFINE_SPINLOCK(_lock);  	#define RAS_SYNT2_CLK_ENB	10  	#define RAS_SYNT3_CLK_ENB	11 -#define PRSC0_CLK_CFG			(MISC_BASE + 0x044) -#define PRSC1_CLK_CFG			(MISC_BASE + 0x048) -#define PRSC2_CLK_CFG			(MISC_BASE + 0x04C) -#define AMEM_CLK_CFG			(MISC_BASE + 0x050) +#define PRSC0_CLK_CFG			(misc_base + 0x044) +#define PRSC1_CLK_CFG			(misc_base + 0x048) +#define PRSC2_CLK_CFG			(misc_base + 0x04C) +#define AMEM_CLK_CFG			(misc_base + 0x050)  	#define AMEM_CLK_ENB		0 -#define CLCD_CLK_SYNT			(MISC_BASE + 0x05C) -#define FIRDA_CLK_SYNT			(MISC_BASE + 0x060) -#define UART_CLK_SYNT			(MISC_BASE + 0x064) -#define GMAC_CLK_SYNT			(MISC_BASE + 0x068) -#define GEN0_CLK_SYNT			(MISC_BASE + 0x06C) -#define GEN1_CLK_SYNT			(MISC_BASE + 0x070) -#define GEN2_CLK_SYNT			(MISC_BASE + 0x074) -#define GEN3_CLK_SYNT			(MISC_BASE + 0x078) +#define CLCD_CLK_SYNT			(misc_base + 0x05C) +#define FIRDA_CLK_SYNT			(misc_base + 0x060) +#define UART_CLK_SYNT			(misc_base + 0x064) +#define GMAC_CLK_SYNT			(misc_base + 0x068) +#define GEN0_CLK_SYNT			(misc_base + 0x06C) +#define GEN1_CLK_SYNT			(misc_base + 0x070) +#define GEN2_CLK_SYNT			(misc_base + 0x074) +#define GEN3_CLK_SYNT			(misc_base + 0x078)  /* pll rate configuration table, in ascending order of rates */  static struct pll_rate_tbl pll_rtbl[] = { @@ -211,6 +210,17 @@ static inline void spear310_clk_init(void) { }  /* array of all spear 320 clock lookups */  #ifdef CONFIG_MACH_SPEAR320 + +#define SPEAR320_CONTROL_REG		(soc_config_base + 0x0000) +#define SPEAR320_EXT_CTRL_REG		(soc_config_base + 0x0018) + +	#define SPEAR320_UARTX_PCLK_MASK		0x1 +	#define SPEAR320_UART2_PCLK_SHIFT		8 +	#define SPEAR320_UART3_PCLK_SHIFT		9 +	#define SPEAR320_UART4_PCLK_SHIFT		10 +	#define SPEAR320_UART5_PCLK_SHIFT		11 +	#define SPEAR320_UART6_PCLK_SHIFT		12 +	#define SPEAR320_RS485_PCLK_SHIFT		13  	#define SMII_PCLK_SHIFT				18  	#define SMII_PCLK_MASK				2  	#define SMII_PCLK_VAL_PAD			0x0 @@ -235,7 +245,7 @@ static const char *smii0_parents[] = { "smii_125m_pad", "ras_pll2_clk",  	"ras_syn0_gclk", };  static const char *uartx_parents[] = { "ras_syn1_gclk", "ras_apb_clk", }; -static void __init spear320_clk_init(void) +static void __init spear320_clk_init(void __iomem *soc_config_base)  {  	struct clk *clk; @@ -362,7 +372,7 @@ static void __init spear320_clk_init(void)  static inline void spear320_clk_init(void) { }  #endif -void __init spear3xx_clk_init(void) +void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_base)  {  	struct clk *clk, *clk1; @@ -634,5 +644,5 @@ void __init spear3xx_clk_init(void)  	else if (of_machine_is_compatible("st,spear310"))  		spear310_clk_init();  	else if (of_machine_is_compatible("st,spear320")) -		spear320_clk_init(); +		spear320_clk_init(soc_config_base);  } diff --git a/drivers/clk/spear/spear6xx_clock.c b/drivers/clk/spear/spear6xx_clock.c index e862a333ad3..9406f2426d6 100644 --- a/drivers/clk/spear/spear6xx_clock.c +++ b/drivers/clk/spear/spear6xx_clock.c @@ -13,28 +13,27 @@  #include <linux/clkdev.h>  #include <linux/io.h>  #include <linux/spinlock_types.h> -#include <mach/misc_regs.h>  #include "clk.h"  static DEFINE_SPINLOCK(_lock); -#define PLL1_CTR			(MISC_BASE + 0x008) -#define PLL1_FRQ			(MISC_BASE + 0x00C) -#define PLL2_CTR			(MISC_BASE + 0x014) -#define PLL2_FRQ			(MISC_BASE + 0x018) -#define PLL_CLK_CFG			(MISC_BASE + 0x020) +#define PLL1_CTR			(misc_base + 0x008) +#define PLL1_FRQ			(misc_base + 0x00C) +#define PLL2_CTR			(misc_base + 0x014) +#define PLL2_FRQ			(misc_base + 0x018) +#define PLL_CLK_CFG			(misc_base + 0x020)  	/* PLL_CLK_CFG register masks */  	#define MCTR_CLK_SHIFT		28  	#define MCTR_CLK_MASK		3 -#define CORE_CLK_CFG			(MISC_BASE + 0x024) +#define CORE_CLK_CFG			(misc_base + 0x024)  	/* CORE CLK CFG register masks */  	#define HCLK_RATIO_SHIFT	10  	#define HCLK_RATIO_MASK		2  	#define PCLK_RATIO_SHIFT	8  	#define PCLK_RATIO_MASK		2 -#define PERIP_CLK_CFG			(MISC_BASE + 0x028) +#define PERIP_CLK_CFG			(misc_base + 0x028)  	/* PERIP_CLK_CFG register masks */  	#define CLCD_CLK_SHIFT		2  	#define CLCD_CLK_MASK		2 @@ -48,7 +47,7 @@ static DEFINE_SPINLOCK(_lock);  	#define GPT3_CLK_SHIFT		12  	#define GPT_CLK_MASK		1 -#define PERIP1_CLK_ENB			(MISC_BASE + 0x02C) +#define PERIP1_CLK_ENB			(misc_base + 0x02C)  	/* PERIP1_CLK_ENB register masks */  	#define UART0_CLK_ENB		3  	#define UART1_CLK_ENB		4 @@ -74,13 +73,13 @@ static DEFINE_SPINLOCK(_lock);  	#define USBH0_CLK_ENB		25  	#define USBH1_CLK_ENB		26 -#define PRSC0_CLK_CFG			(MISC_BASE + 0x044) -#define PRSC1_CLK_CFG			(MISC_BASE + 0x048) -#define PRSC2_CLK_CFG			(MISC_BASE + 0x04C) +#define PRSC0_CLK_CFG			(misc_base + 0x044) +#define PRSC1_CLK_CFG			(misc_base + 0x048) +#define PRSC2_CLK_CFG			(misc_base + 0x04C) -#define CLCD_CLK_SYNT			(MISC_BASE + 0x05C) -#define FIRDA_CLK_SYNT			(MISC_BASE + 0x060) -#define UART_CLK_SYNT			(MISC_BASE + 0x064) +#define CLCD_CLK_SYNT			(misc_base + 0x05C) +#define FIRDA_CLK_SYNT			(misc_base + 0x060) +#define UART_CLK_SYNT			(misc_base + 0x064)  /* vco rate configuration table, in ascending order of rates */  static struct pll_rate_tbl pll_rtbl[] = { @@ -115,7 +114,7 @@ static struct gpt_rate_tbl gpt_rtbl[] = {  	{.mscale = 1, .nscale = 0}, /* 83 MHz */  }; -void __init spear6xx_clk_init(void) +void __init spear6xx_clk_init(void __iomem *misc_base)  {  	struct clk *clk, *clk1; diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index ba6f51bc9f3..f15f147d473 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c @@ -22,8 +22,7 @@  #include <linux/of.h>  #include <linux/of_address.h>  #include <linux/clk/tegra.h> - -#include <mach/powergate.h> +#include <linux/tegra-powergate.h>  #include "clk.h" diff --git a/drivers/clk/ux500/clk-prcc.c b/drivers/clk/ux500/clk-prcc.c index 7eee7f76835..bd4769a8448 100644 --- a/drivers/clk/ux500/clk-prcc.c +++ b/drivers/clk/ux500/clk-prcc.c @@ -13,7 +13,6 @@  #include <linux/io.h>  #include <linux/err.h>  #include <linux/types.h> -#include <mach/hardware.h>  #include "clk.h" diff --git a/drivers/clk/ux500/u8500_clk.c b/drivers/clk/ux500/u8500_clk.c index 9d9add1e816..0b4f35a5ffc 100644 --- a/drivers/clk/ux500/u8500_clk.c +++ b/drivers/clk/ux500/u8500_clk.c @@ -12,10 +12,10 @@  #include <linux/clk-provider.h>  #include <linux/mfd/dbx500-prcmu.h>  #include <linux/platform_data/clk-ux500.h> -#include <mach/db8500-regs.h>  #include "clk.h" -void u8500_clk_init(void) +void u8500_clk_init(u32 clkrst1_base, u32 clkrst2_base, u32 clkrst3_base, +		    u32 clkrst5_base, u32 clkrst6_base)  {  	struct prcmu_fw_version *fw_version;  	const char *sgaclk_parent = NULL; @@ -215,148 +215,148 @@ void u8500_clk_init(void)  	 */  	/* PRCC P-clocks */ -	clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", clkrst1_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "apb_pclk", "uart0"); -	clk = clk_reg_prcc_pclk("p1_pclk1", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk1", "per1clk", clkrst1_base,  				BIT(1), 0);  	clk_register_clkdev(clk, "apb_pclk", "uart1"); -	clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", clkrst1_base,  				BIT(2), 0);  	clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.1"); -	clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", clkrst1_base,  				BIT(3), 0);  	clk_register_clkdev(clk, "apb_pclk", "msp0");  	clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.0"); -	clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", clkrst1_base,  				BIT(4), 0);  	clk_register_clkdev(clk, "apb_pclk", "msp1");  	clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.1"); -	clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", clkrst1_base,  				BIT(5), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi0"); -	clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", clkrst1_base,  				BIT(6), 0);  	clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.2"); -	clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", clkrst1_base,  				BIT(7), 0);  	clk_register_clkdev(clk, NULL, "spi3"); -	clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", clkrst1_base,  				BIT(8), 0);  	clk_register_clkdev(clk, "apb_pclk", "slimbus0"); -	clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", clkrst1_base,  				BIT(9), 0);  	clk_register_clkdev(clk, NULL, "gpio.0");  	clk_register_clkdev(clk, NULL, "gpio.1");  	clk_register_clkdev(clk, NULL, "gpioblock0"); -	clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", clkrst1_base,  				BIT(10), 0);  	clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.4"); -	clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", U8500_CLKRST1_BASE, +	clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", clkrst1_base,  				BIT(11), 0);  	clk_register_clkdev(clk, "apb_pclk", "msp3");  	clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.3"); -	clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", clkrst2_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.3"); -	clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", clkrst2_base,  				BIT(1), 0);  	clk_register_clkdev(clk, NULL, "spi2"); -	clk = clk_reg_prcc_pclk("p2_pclk2", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk2", "per2clk", clkrst2_base,  				BIT(2), 0);  	clk_register_clkdev(clk, NULL, "spi1"); -	clk = clk_reg_prcc_pclk("p2_pclk3", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk3", "per2clk", clkrst2_base,  				BIT(3), 0);  	clk_register_clkdev(clk, NULL, "pwl"); -	clk = clk_reg_prcc_pclk("p2_pclk4", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk4", "per2clk", clkrst2_base,  				BIT(4), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi4"); -	clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", clkrst2_base,  				BIT(5), 0);  	clk_register_clkdev(clk, "apb_pclk", "msp2");  	clk_register_clkdev(clk, "apb_pclk", "ux500-msp-i2s.2"); -	clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", clkrst2_base,  				BIT(6), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi1"); -	clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", clkrst2_base,  				BIT(7), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi3"); -	clk = clk_reg_prcc_pclk("p2_pclk8", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk8", "per2clk", clkrst2_base,  				BIT(8), 0);  	clk_register_clkdev(clk, NULL, "spi0"); -	clk = clk_reg_prcc_pclk("p2_pclk9", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk9", "per2clk", clkrst2_base,  				BIT(9), 0);  	clk_register_clkdev(clk, "hsir_hclk", "ste_hsi.0"); -	clk = clk_reg_prcc_pclk("p2_pclk10", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk10", "per2clk", clkrst2_base,  				BIT(10), 0);  	clk_register_clkdev(clk, "hsit_hclk", "ste_hsi.0"); -	clk = clk_reg_prcc_pclk("p2_pclk11", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk11", "per2clk", clkrst2_base,  				BIT(11), 0);  	clk_register_clkdev(clk, NULL, "gpio.6");  	clk_register_clkdev(clk, NULL, "gpio.7");  	clk_register_clkdev(clk, NULL, "gpioblock1"); -	clk = clk_reg_prcc_pclk("p2_pclk12", "per2clk", U8500_CLKRST2_BASE, +	clk = clk_reg_prcc_pclk("p2_pclk12", "per2clk", clkrst2_base,  				BIT(12), 0); -	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", clkrst3_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "fsmc", NULL);  	clk_register_clkdev(clk, NULL, "smsc911x"); -	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", clkrst3_base,  				BIT(1), 0);  	clk_register_clkdev(clk, "apb_pclk", "ssp0"); -	clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", clkrst3_base,  				BIT(2), 0);  	clk_register_clkdev(clk, "apb_pclk", "ssp1"); -	clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", clkrst3_base,  				BIT(3), 0);  	clk_register_clkdev(clk, "apb_pclk", "nmk-i2c.0"); -	clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", clkrst3_base,  				BIT(4), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi2"); -	clk = clk_reg_prcc_pclk("p3_pclk5", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk5", "per3clk", clkrst3_base,  				BIT(5), 0);  	clk_register_clkdev(clk, "apb_pclk", "ske");  	clk_register_clkdev(clk, "apb_pclk", "nmk-ske-keypad"); -	clk = clk_reg_prcc_pclk("p3_pclk6", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk6", "per3clk", clkrst3_base,  				BIT(6), 0);  	clk_register_clkdev(clk, "apb_pclk", "uart2"); -	clk = clk_reg_prcc_pclk("p3_pclk7", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk7", "per3clk", clkrst3_base,  				BIT(7), 0);  	clk_register_clkdev(clk, "apb_pclk", "sdi5"); -	clk = clk_reg_prcc_pclk("p3_pclk8", "per3clk", U8500_CLKRST3_BASE, +	clk = clk_reg_prcc_pclk("p3_pclk8", "per3clk", clkrst3_base,  				BIT(8), 0);  	clk_register_clkdev(clk, NULL, "gpio.2");  	clk_register_clkdev(clk, NULL, "gpio.3"); @@ -364,45 +364,45 @@ void u8500_clk_init(void)  	clk_register_clkdev(clk, NULL, "gpio.5");  	clk_register_clkdev(clk, NULL, "gpioblock2"); -	clk = clk_reg_prcc_pclk("p5_pclk0", "per5clk", U8500_CLKRST5_BASE, +	clk = clk_reg_prcc_pclk("p5_pclk0", "per5clk", clkrst5_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "usb", "musb-ux500.0"); -	clk = clk_reg_prcc_pclk("p5_pclk1", "per5clk", U8500_CLKRST5_BASE, +	clk = clk_reg_prcc_pclk("p5_pclk1", "per5clk", clkrst5_base,  				BIT(1), 0);  	clk_register_clkdev(clk, NULL, "gpio.8");  	clk_register_clkdev(clk, NULL, "gpioblock3"); -	clk = clk_reg_prcc_pclk("p6_pclk0", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk0", "per6clk", clkrst6_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "apb_pclk", "rng"); -	clk = clk_reg_prcc_pclk("p6_pclk1", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk1", "per6clk", clkrst6_base,  				BIT(1), 0);  	clk_register_clkdev(clk, NULL, "cryp0");  	clk_register_clkdev(clk, NULL, "cryp1"); -	clk = clk_reg_prcc_pclk("p6_pclk2", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk2", "per6clk", clkrst6_base,  				BIT(2), 0);  	clk_register_clkdev(clk, NULL, "hash0"); -	clk = clk_reg_prcc_pclk("p6_pclk3", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk3", "per6clk", clkrst6_base,  				BIT(3), 0);  	clk_register_clkdev(clk, NULL, "pka"); -	clk = clk_reg_prcc_pclk("p6_pclk4", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk4", "per6clk", clkrst6_base,  				BIT(4), 0);  	clk_register_clkdev(clk, NULL, "hash1"); -	clk = clk_reg_prcc_pclk("p6_pclk5", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk5", "per6clk", clkrst6_base,  				BIT(5), 0);  	clk_register_clkdev(clk, NULL, "cfgreg"); -	clk = clk_reg_prcc_pclk("p6_pclk6", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk6", "per6clk", clkrst6_base,  				BIT(6), 0);  	clk_register_clkdev(clk, "apb_pclk", "mtu0"); -	clk = clk_reg_prcc_pclk("p6_pclk7", "per6clk", U8500_CLKRST6_BASE, +	clk = clk_reg_prcc_pclk("p6_pclk7", "per6clk", clkrst6_base,  				BIT(7), 0);  	clk_register_clkdev(clk, "apb_pclk", "mtu1"); @@ -416,110 +416,110 @@ void u8500_clk_init(void)  	/* Periph1 */  	clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk", -			U8500_CLKRST1_BASE, BIT(0), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(0), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "uart0");  	clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk", -			U8500_CLKRST1_BASE, BIT(1), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(1), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "uart1");  	clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk", -			U8500_CLKRST1_BASE, BIT(2), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(2), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "nmk-i2c.1");  	clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk", -			U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(3), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "msp0");  	clk_register_clkdev(clk, NULL, "ux500-msp-i2s.0");  	clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk", -			U8500_CLKRST1_BASE, BIT(4), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(4), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "msp1");  	clk_register_clkdev(clk, NULL, "ux500-msp-i2s.1");  	clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk", -			U8500_CLKRST1_BASE, BIT(5), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(5), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi0");  	clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk", -			U8500_CLKRST1_BASE, BIT(6), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(6), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "nmk-i2c.2");  	clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk", -			U8500_CLKRST1_BASE, BIT(8), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(8), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "slimbus0");  	clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk", -			U8500_CLKRST1_BASE, BIT(9), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(9), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "nmk-i2c.4");  	clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk", -			U8500_CLKRST1_BASE, BIT(10), CLK_SET_RATE_GATE); +			clkrst1_base, BIT(10), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "msp3");  	clk_register_clkdev(clk, NULL, "ux500-msp-i2s.3");  	/* Periph2 */  	clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk", -			U8500_CLKRST2_BASE, BIT(0), CLK_SET_RATE_GATE); +			clkrst2_base, BIT(0), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "nmk-i2c.3");  	clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk", -			U8500_CLKRST2_BASE, BIT(2), CLK_SET_RATE_GATE); +			clkrst2_base, BIT(2), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi4");  	clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk", -			U8500_CLKRST2_BASE, BIT(3), CLK_SET_RATE_GATE); +			clkrst2_base, BIT(3), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "msp2");  	clk_register_clkdev(clk, NULL, "ux500-msp-i2s.2");  	clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk", -			U8500_CLKRST2_BASE, BIT(4), CLK_SET_RATE_GATE); +			clkrst2_base, BIT(4), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi1");  	clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk", -			U8500_CLKRST2_BASE, BIT(5), CLK_SET_RATE_GATE); +			clkrst2_base, BIT(5), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi3");  	/* Note that rate is received from parent. */  	clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk", -			U8500_CLKRST2_BASE, BIT(6), +			clkrst2_base, BIT(6),  			CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT);  	clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk", -			U8500_CLKRST2_BASE, BIT(7), +			clkrst2_base, BIT(7),  			CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT);  	/* Periph3 */  	clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk", -			U8500_CLKRST3_BASE, BIT(1), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(1), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "ssp0");  	clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk", -			U8500_CLKRST3_BASE, BIT(2), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(2), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "ssp1");  	clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk", -			U8500_CLKRST3_BASE, BIT(3), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(3), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "nmk-i2c.0");  	clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk", -			U8500_CLKRST3_BASE, BIT(4), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(4), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi2");  	clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k", -			U8500_CLKRST3_BASE, BIT(5), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(5), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "ske");  	clk_register_clkdev(clk, NULL, "nmk-ske-keypad");  	clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk", -			U8500_CLKRST3_BASE, BIT(6), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(6), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "uart2");  	clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk", -			U8500_CLKRST3_BASE, BIT(7), CLK_SET_RATE_GATE); +			clkrst3_base, BIT(7), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "sdi5");  	/* Periph6 */  	clk = clk_reg_prcc_kclk("p3_rng_kclk", "rngclk", -			U8500_CLKRST6_BASE, BIT(0), CLK_SET_RATE_GATE); +			clkrst6_base, BIT(0), CLK_SET_RATE_GATE);  	clk_register_clkdev(clk, NULL, "rng");  } diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index 4897f243a00..682d48d0816 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -16,7 +16,9 @@ obj-$(CONFIG_CLKSRC_NOMADIK_MTU)	+= nomadik-mtu.o  obj-$(CONFIG_CLKSRC_DBX500_PRCMU)	+= clksrc-dbx500-prcmu.o  obj-$(CONFIG_ARMADA_370_XP_TIMER)	+= time-armada-370-xp.o  obj-$(CONFIG_ARCH_BCM2835)	+= bcm2835_timer.o +obj-$(CONFIG_ARCH_MARCO)	+= timer-marco.o  obj-$(CONFIG_ARCH_MXS)		+= mxs_timer.o +obj-$(CONFIG_ARCH_PRIMA2)	+= timer-prima2.o  obj-$(CONFIG_SUN4I_TIMER)	+= sun4i_timer.o  obj-$(CONFIG_ARCH_TEGRA)	+= tegra20_timer.o  obj-$(CONFIG_VT8500_TIMER)	+= vt8500_timer.o diff --git a/drivers/clocksource/clksrc-dbx500-prcmu.c b/drivers/clocksource/clksrc-dbx500-prcmu.c index c26c369eb9e..54f3d119d99 100644 --- a/drivers/clocksource/clksrc-dbx500-prcmu.c +++ b/drivers/clocksource/clksrc-dbx500-prcmu.c @@ -17,9 +17,6 @@  #include <asm/sched_clock.h> -#include <mach/setup.h> -#include <mach/hardware.h> -  #define RATE_32K		32768  #define TIMER_MODE_CONTINOUS	0x1 diff --git a/drivers/clocksource/nomadik-mtu.c b/drivers/clocksource/nomadik-mtu.c index 071f6eadfea..e405531e1cc 100644 --- a/drivers/clocksource/nomadik-mtu.c +++ b/drivers/clocksource/nomadik-mtu.c @@ -67,7 +67,7 @@ static u32 clk_prescale;  static u32 nmdk_cycle;		/* write-once */  static struct delay_timer mtu_delay_timer; -#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK +#ifdef CONFIG_CLKSRC_NOMADIK_MTU_SCHED_CLOCK  /*   * Override the global weak sched_clock symbol with this   * local implementation which uses the clocksource to get some @@ -233,7 +233,7 @@ void __init nmdk_timer_init(void __iomem *base, int irq)  		pr_err("timer: failed to initialize clock source %s\n",  		       "mtu_0"); -#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK +#ifdef CONFIG_CLKSRC_NOMADIK_MTU_SCHED_CLOCK  	setup_sched_clock(nomadik_read_sched_clock, 32, rate);  #endif diff --git a/drivers/clocksource/timer-marco.c b/drivers/clocksource/timer-marco.c new file mode 100644 index 00000000000..97738dbf3e3 --- /dev/null +++ b/drivers/clocksource/timer-marco.c @@ -0,0 +1,299 @@ +/* + * System timer for CSR SiRFprimaII + * + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/clockchips.h> +#include <linux/clocksource.h> +#include <linux/bitops.h> +#include <linux/irq.h> +#include <linux/clk.h> +#include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_address.h> +#include <asm/sched_clock.h> +#include <asm/localtimer.h> +#include <asm/mach/time.h> + +#define SIRFSOC_TIMER_32COUNTER_0_CTRL			0x0000 +#define SIRFSOC_TIMER_32COUNTER_1_CTRL			0x0004 +#define SIRFSOC_TIMER_MATCH_0				0x0018 +#define SIRFSOC_TIMER_MATCH_1				0x001c +#define SIRFSOC_TIMER_COUNTER_0				0x0048 +#define SIRFSOC_TIMER_COUNTER_1				0x004c +#define SIRFSOC_TIMER_INTR_STATUS			0x0060 +#define SIRFSOC_TIMER_WATCHDOG_EN			0x0064 +#define SIRFSOC_TIMER_64COUNTER_CTRL			0x0068 +#define SIRFSOC_TIMER_64COUNTER_LO			0x006c +#define SIRFSOC_TIMER_64COUNTER_HI			0x0070 +#define SIRFSOC_TIMER_64COUNTER_LOAD_LO			0x0074 +#define SIRFSOC_TIMER_64COUNTER_LOAD_HI			0x0078 +#define SIRFSOC_TIMER_64COUNTER_RLATCHED_LO		0x007c +#define SIRFSOC_TIMER_64COUNTER_RLATCHED_HI		0x0080 + +#define SIRFSOC_TIMER_REG_CNT 6 + +static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = { +	SIRFSOC_TIMER_WATCHDOG_EN, +	SIRFSOC_TIMER_32COUNTER_0_CTRL, +	SIRFSOC_TIMER_32COUNTER_1_CTRL, +	SIRFSOC_TIMER_64COUNTER_CTRL, +	SIRFSOC_TIMER_64COUNTER_RLATCHED_LO, +	SIRFSOC_TIMER_64COUNTER_RLATCHED_HI, +}; + +static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; + +static void __iomem *sirfsoc_timer_base; + +/* disable count and interrupt */ +static inline void sirfsoc_timer_count_disable(int idx) +{ +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) & ~0x7, +		sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); +} + +/* enable count and interrupt */ +static inline void sirfsoc_timer_count_enable(int idx) +{ +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) | 0x7, +		sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); +} + +/* timer interrupt handler */ +static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id) +{ +	struct clock_event_device *ce = dev_id; +	int cpu = smp_processor_id(); + +	/* clear timer interrupt */ +	writel_relaxed(BIT(cpu), sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); + +	if (ce->mode == CLOCK_EVT_MODE_ONESHOT) +		sirfsoc_timer_count_disable(cpu); + +	ce->event_handler(ce); + +	return IRQ_HANDLED; +} + +/* read 64-bit timer counter */ +static cycle_t sirfsoc_timer_read(struct clocksource *cs) +{ +	u64 cycles; + +	writel_relaxed((readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +			BIT(0)) & ~BIT(1), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); + +	cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_HI); +	cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_LO); + +	return cycles; +} + +static int sirfsoc_timer_set_next_event(unsigned long delta, +	struct clock_event_device *ce) +{ +	int cpu = smp_processor_id(); + +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0 + +		4 * cpu); +	writel_relaxed(delta, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0 + +		4 * cpu); + +	/* enable the tick */ +	sirfsoc_timer_count_enable(cpu); + +	return 0; +} + +static void sirfsoc_timer_set_mode(enum clock_event_mode mode, +	struct clock_event_device *ce) +{ +	switch (mode) { +	case CLOCK_EVT_MODE_ONESHOT: +		/* enable in set_next_event */ +		break; +	default: +		break; +	} + +	sirfsoc_timer_count_disable(smp_processor_id()); +} + +static void sirfsoc_clocksource_suspend(struct clocksource *cs) +{ +	int i; + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++) +		sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); +} + +static void sirfsoc_clocksource_resume(struct clocksource *cs) +{ +	int i; + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++) +		writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); + +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], +		sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], +		sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); + +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +		BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +} + +static struct clock_event_device sirfsoc_clockevent = { +	.name = "sirfsoc_clockevent", +	.rating = 200, +	.features = CLOCK_EVT_FEAT_ONESHOT, +	.set_mode = sirfsoc_timer_set_mode, +	.set_next_event = sirfsoc_timer_set_next_event, +}; + +static struct clocksource sirfsoc_clocksource = { +	.name = "sirfsoc_clocksource", +	.rating = 200, +	.mask = CLOCKSOURCE_MASK(64), +	.flags = CLOCK_SOURCE_IS_CONTINUOUS, +	.read = sirfsoc_timer_read, +	.suspend = sirfsoc_clocksource_suspend, +	.resume = sirfsoc_clocksource_resume, +}; + +static struct irqaction sirfsoc_timer_irq = { +	.name = "sirfsoc_timer0", +	.flags = IRQF_TIMER | IRQF_NOBALANCING, +	.handler = sirfsoc_timer_interrupt, +	.dev_id = &sirfsoc_clockevent, +}; + +#ifdef CONFIG_LOCAL_TIMERS + +static struct irqaction sirfsoc_timer1_irq = { +	.name = "sirfsoc_timer1", +	.flags = IRQF_TIMER | IRQF_NOBALANCING, +	.handler = sirfsoc_timer_interrupt, +}; + +static int __cpuinit sirfsoc_local_timer_setup(struct clock_event_device *ce) +{ +	/* Use existing clock_event for cpu 0 */ +	if (!smp_processor_id()) +		return 0; + +	ce->irq = sirfsoc_timer1_irq.irq; +	ce->name = "local_timer"; +	ce->features = sirfsoc_clockevent.features; +	ce->rating = sirfsoc_clockevent.rating; +	ce->set_mode = sirfsoc_timer_set_mode; +	ce->set_next_event = sirfsoc_timer_set_next_event; +	ce->shift = sirfsoc_clockevent.shift; +	ce->mult = sirfsoc_clockevent.mult; +	ce->max_delta_ns = sirfsoc_clockevent.max_delta_ns; +	ce->min_delta_ns = sirfsoc_clockevent.min_delta_ns; + +	sirfsoc_timer1_irq.dev_id = ce; +	BUG_ON(setup_irq(ce->irq, &sirfsoc_timer1_irq)); +	irq_set_affinity(sirfsoc_timer1_irq.irq, cpumask_of(1)); + +	clockevents_register_device(ce); +	return 0; +} + +static void sirfsoc_local_timer_stop(struct clock_event_device *ce) +{ +	sirfsoc_timer_count_disable(1); + +	remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq); +} + +static struct local_timer_ops sirfsoc_local_timer_ops __cpuinitdata = { +	.setup	= sirfsoc_local_timer_setup, +	.stop	= sirfsoc_local_timer_stop, +}; +#endif /* CONFIG_LOCAL_TIMERS */ + +static void __init sirfsoc_clockevent_init(void) +{ +	clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60); + +	sirfsoc_clockevent.max_delta_ns = +		clockevent_delta2ns(-2, &sirfsoc_clockevent); +	sirfsoc_clockevent.min_delta_ns = +		clockevent_delta2ns(2, &sirfsoc_clockevent); + +	sirfsoc_clockevent.cpumask = cpumask_of(0); +	clockevents_register_device(&sirfsoc_clockevent); +#ifdef CONFIG_LOCAL_TIMERS +	local_timer_register(&sirfsoc_local_timer_ops); +#endif +} + +/* initialize the kernel jiffy timer source */ +static void __init sirfsoc_marco_timer_init(void) +{ +	unsigned long rate; +	u32 timer_div; +	struct clk *clk; + +	/* timer's input clock is io clock */ +	clk = clk_get_sys("io", NULL); + +	BUG_ON(IS_ERR(clk)); +	rate = clk_get_rate(clk); + +	BUG_ON(rate < CLOCK_TICK_RATE); +	BUG_ON(rate % CLOCK_TICK_RATE); + +	/* Initialize the timer dividers */ +	timer_div = rate / CLOCK_TICK_RATE - 1; +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL); +	writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_1_CTRL); + +	/* Initialize timer counters to 0 */ +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); +	writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | +		BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_1); + +	/* Clear all interrupts */ +	writel_relaxed(0xFFFF, sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); + +	BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE)); + +	BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); + +	sirfsoc_clockevent_init(); +} + +static void __init sirfsoc_of_timer_init(struct device_node *np) +{ +	sirfsoc_timer_base = of_iomap(np, 0); +	if (!sirfsoc_timer_base) +		panic("unable to map timer cpu registers\n"); + +	sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); +	if (!sirfsoc_timer_irq.irq) +		panic("No irq passed for timer0 via DT\n"); + +#ifdef CONFIG_LOCAL_TIMERS +	sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1); +	if (!sirfsoc_timer1_irq.irq) +		panic("No irq passed for timer1 via DT\n"); +#endif + +	sirfsoc_marco_timer_init(); +} +CLOCKSOURCE_OF_DECLARE(sirfsoc_marco_timer, "sirf,marco-tick", sirfsoc_of_timer_init ); diff --git a/drivers/clocksource/timer-prima2.c b/drivers/clocksource/timer-prima2.c new file mode 100644 index 00000000000..760882665d7 --- /dev/null +++ b/drivers/clocksource/timer-prima2.c @@ -0,0 +1,215 @@ +/* + * System timer for CSR SiRFprimaII + * + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/clockchips.h> +#include <linux/clocksource.h> +#include <linux/bitops.h> +#include <linux/irq.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_address.h> +#include <asm/sched_clock.h> +#include <asm/mach/time.h> + +#define SIRFSOC_TIMER_COUNTER_LO	0x0000 +#define SIRFSOC_TIMER_COUNTER_HI	0x0004 +#define SIRFSOC_TIMER_MATCH_0		0x0008 +#define SIRFSOC_TIMER_MATCH_1		0x000C +#define SIRFSOC_TIMER_MATCH_2		0x0010 +#define SIRFSOC_TIMER_MATCH_3		0x0014 +#define SIRFSOC_TIMER_MATCH_4		0x0018 +#define SIRFSOC_TIMER_MATCH_5		0x001C +#define SIRFSOC_TIMER_STATUS		0x0020 +#define SIRFSOC_TIMER_INT_EN		0x0024 +#define SIRFSOC_TIMER_WATCHDOG_EN	0x0028 +#define SIRFSOC_TIMER_DIV		0x002C +#define SIRFSOC_TIMER_LATCH		0x0030 +#define SIRFSOC_TIMER_LATCHED_LO	0x0034 +#define SIRFSOC_TIMER_LATCHED_HI	0x0038 + +#define SIRFSOC_TIMER_WDT_INDEX		5 + +#define SIRFSOC_TIMER_LATCH_BIT	 BIT(0) + +#define SIRFSOC_TIMER_REG_CNT 11 + +static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = { +	SIRFSOC_TIMER_MATCH_0, SIRFSOC_TIMER_MATCH_1, SIRFSOC_TIMER_MATCH_2, +	SIRFSOC_TIMER_MATCH_3, SIRFSOC_TIMER_MATCH_4, SIRFSOC_TIMER_MATCH_5, +	SIRFSOC_TIMER_INT_EN, SIRFSOC_TIMER_WATCHDOG_EN, SIRFSOC_TIMER_DIV, +	SIRFSOC_TIMER_LATCHED_LO, SIRFSOC_TIMER_LATCHED_HI, +}; + +static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; + +static void __iomem *sirfsoc_timer_base; + +/* timer0 interrupt handler */ +static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id) +{ +	struct clock_event_device *ce = dev_id; + +	WARN_ON(!(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_STATUS) & BIT(0))); + +	/* clear timer0 interrupt */ +	writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS); + +	ce->event_handler(ce); + +	return IRQ_HANDLED; +} + +/* read 64-bit timer counter */ +static cycle_t sirfsoc_timer_read(struct clocksource *cs) +{ +	u64 cycles; + +	/* latch the 64-bit timer counter */ +	writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH); +	cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_HI); +	cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO); + +	return cycles; +} + +static int sirfsoc_timer_set_next_event(unsigned long delta, +	struct clock_event_device *ce) +{ +	unsigned long now, next; + +	writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH); +	now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO); +	next = now + delta; +	writel_relaxed(next, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0); +	writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH); +	now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO); + +	return next - now > delta ? -ETIME : 0; +} + +static void sirfsoc_timer_set_mode(enum clock_event_mode mode, +	struct clock_event_device *ce) +{ +	u32 val = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN); +	switch (mode) { +	case CLOCK_EVT_MODE_PERIODIC: +		WARN_ON(1); +		break; +	case CLOCK_EVT_MODE_ONESHOT: +		writel_relaxed(val | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN); +		break; +	case CLOCK_EVT_MODE_SHUTDOWN: +		writel_relaxed(val & ~BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN); +		break; +	case CLOCK_EVT_MODE_UNUSED: +	case CLOCK_EVT_MODE_RESUME: +		break; +	} +} + +static void sirfsoc_clocksource_suspend(struct clocksource *cs) +{ +	int i; + +	writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH); + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++) +		sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); +} + +static void sirfsoc_clocksource_resume(struct clocksource *cs) +{ +	int i; + +	for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++) +		writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); + +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); +	writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); +} + +static struct clock_event_device sirfsoc_clockevent = { +	.name = "sirfsoc_clockevent", +	.rating = 200, +	.features = CLOCK_EVT_FEAT_ONESHOT, +	.set_mode = sirfsoc_timer_set_mode, +	.set_next_event = sirfsoc_timer_set_next_event, +}; + +static struct clocksource sirfsoc_clocksource = { +	.name = "sirfsoc_clocksource", +	.rating = 200, +	.mask = CLOCKSOURCE_MASK(64), +	.flags = CLOCK_SOURCE_IS_CONTINUOUS, +	.read = sirfsoc_timer_read, +	.suspend = sirfsoc_clocksource_suspend, +	.resume = sirfsoc_clocksource_resume, +}; + +static struct irqaction sirfsoc_timer_irq = { +	.name = "sirfsoc_timer0", +	.flags = IRQF_TIMER, +	.irq = 0, +	.handler = sirfsoc_timer_interrupt, +	.dev_id = &sirfsoc_clockevent, +}; + +/* Overwrite weak default sched_clock with more precise one */ +static u32 notrace sirfsoc_read_sched_clock(void) +{ +	return (u32)(sirfsoc_timer_read(NULL) & 0xffffffff); +} + +static void __init sirfsoc_clockevent_init(void) +{ +	sirfsoc_clockevent.cpumask = cpumask_of(0); +	clockevents_config_and_register(&sirfsoc_clockevent, CLOCK_TICK_RATE, +					2, -2); +} + +/* initialize the kernel jiffy timer source */ +static void __init sirfsoc_prima2_timer_init(struct device_node *np) +{ +	unsigned long rate; +	struct clk *clk; + +	/* timer's input clock is io clock */ +	clk = clk_get_sys("io", NULL); + +	BUG_ON(IS_ERR(clk)); + +	rate = clk_get_rate(clk); + +	BUG_ON(rate < CLOCK_TICK_RATE); +	BUG_ON(rate % CLOCK_TICK_RATE); + +	sirfsoc_timer_base = of_iomap(np, 0); +	if (!sirfsoc_timer_base) +		panic("unable to map timer cpu registers\n"); + +	sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); + +	writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO); +	writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI); +	writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS); + +	BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE)); + +	setup_sched_clock(sirfsoc_read_sched_clock, 32, CLOCK_TICK_RATE); + +	BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq)); + +	sirfsoc_clockevent_init(); +} +CLOCKSOURCE_OF_DECLARE(sirfsoc_prima2_timer, "sirf,prima2-tick", sirfsoc_prima2_timer_init); diff --git a/drivers/crypto/ux500/cryp/cryp.c b/drivers/crypto/ux500/cryp/cryp.c index e208ceaf81c..3eafa903ebc 100644 --- a/drivers/crypto/ux500/cryp/cryp.c +++ b/drivers/crypto/ux500/cryp/cryp.c @@ -12,8 +12,6 @@  #include <linux/kernel.h>  #include <linux/types.h> -#include <mach/hardware.h> -  #include "cryp_p.h"  #include "cryp.h" diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c index 22c9063e012..32f480622b9 100644 --- a/drivers/crypto/ux500/cryp/cryp_core.c +++ b/drivers/crypto/ux500/cryp/cryp_core.c @@ -32,7 +32,6 @@  #include <crypto/scatterwalk.h>  #include <linux/platform_data/crypto-ux500.h> -#include <mach/hardware.h>  #include "cryp_p.h"  #include "cryp.h" diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c index 632c3339895..1827e9f1f87 100644 --- a/drivers/crypto/ux500/hash/hash_core.c +++ b/drivers/crypto/ux500/hash/hash_core.c @@ -32,7 +32,6 @@  #include <crypto/algapi.h>  #include <linux/platform_data/crypto-ux500.h> -#include <mach/hardware.h>  #include "hash_alg.h" diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index d5e119ca942..10ef57f35a6 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -9,4 +9,5 @@ obj-$(CONFIG_ARCH_SUNXI)		+= irq-sun4i.o  obj-$(CONFIG_ARCH_SPEAR3XX)		+= spear-shirq.o  obj-$(CONFIG_ARM_GIC)			+= irq-gic.o  obj-$(CONFIG_ARM_VIC)			+= irq-vic.o +obj-$(CONFIG_SIRF_IRQ)			+= irq-sirfsoc.o  obj-$(CONFIG_VERSATILE_FPGA_IRQ)	+= irq-versatile-fpga.o diff --git a/drivers/irqchip/irq-sirfsoc.c b/drivers/irqchip/irq-sirfsoc.c new file mode 100644 index 00000000000..69ea44ebcf6 --- /dev/null +++ b/drivers/irqchip/irq-sirfsoc.c @@ -0,0 +1,126 @@ +/* + * interrupt controller support for CSR SiRFprimaII + * + * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * + * Licensed under GPLv2 or later. + */ + +#include <linux/init.h> +#include <linux/io.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/irqdomain.h> +#include <linux/syscore_ops.h> +#include <asm/mach/irq.h> +#include <asm/exception.h> +#include "irqchip.h" + +#define SIRFSOC_INT_RISC_MASK0          0x0018 +#define SIRFSOC_INT_RISC_MASK1          0x001C +#define SIRFSOC_INT_RISC_LEVEL0         0x0020 +#define SIRFSOC_INT_RISC_LEVEL1         0x0024 +#define SIRFSOC_INIT_IRQ_ID		0x0038 + +#define SIRFSOC_NUM_IRQS		128 + +static struct irq_domain *sirfsoc_irqdomain; + +static __init void +sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) +{ +	struct irq_chip_generic *gc; +	struct irq_chip_type *ct; + +	gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq); +	ct = gc->chip_types; + +	ct->chip.irq_mask = irq_gc_mask_clr_bit; +	ct->chip.irq_unmask = irq_gc_mask_set_bit; +	ct->regs.mask = SIRFSOC_INT_RISC_MASK0; + +	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0); +} + +static asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs) +{ +	void __iomem *base = sirfsoc_irqdomain->host_data; +	u32 irqstat, irqnr; + +	irqstat = readl_relaxed(base + SIRFSOC_INIT_IRQ_ID); +	irqnr = irq_find_mapping(sirfsoc_irqdomain, irqstat & 0xff); + +	handle_IRQ(irqnr, regs); +} + +static int __init sirfsoc_irq_init(struct device_node *np, struct device_node *parent) +{ +	void __iomem *base = of_iomap(np, 0); +	if (!base) +		panic("unable to map intc cpu registers\n"); + +	/* using legacy because irqchip_generic does not work with linear */ +	sirfsoc_irqdomain = irq_domain_add_legacy(np, SIRFSOC_NUM_IRQS, 0, 0, +				 &irq_domain_simple_ops, base); + +	sirfsoc_alloc_gc(base, 0, 32); +	sirfsoc_alloc_gc(base + 4, 32, SIRFSOC_NUM_IRQS - 32); + +	writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL0); +	writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL1); + +	writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK0); +	writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK1); + +	set_handle_irq(sirfsoc_handle_irq); + +	return 0; +} +IRQCHIP_DECLARE(sirfsoc_intc, "sirf,prima2-intc", sirfsoc_irq_init); + +struct sirfsoc_irq_status { +	u32 mask0; +	u32 mask1; +	u32 level0; +	u32 level1; +}; + +static struct sirfsoc_irq_status sirfsoc_irq_st; + +static int sirfsoc_irq_suspend(void) +{ +	void __iomem *base = sirfsoc_irqdomain->host_data; + +	sirfsoc_irq_st.mask0 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK0); +	sirfsoc_irq_st.mask1 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK1); +	sirfsoc_irq_st.level0 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL0); +	sirfsoc_irq_st.level1 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL1); + +	return 0; +} + +static void sirfsoc_irq_resume(void) +{ +	void __iomem *base = sirfsoc_irqdomain->host_data; + +	writel_relaxed(sirfsoc_irq_st.mask0, base + SIRFSOC_INT_RISC_MASK0); +	writel_relaxed(sirfsoc_irq_st.mask1, base + SIRFSOC_INT_RISC_MASK1); +	writel_relaxed(sirfsoc_irq_st.level0, base + SIRFSOC_INT_RISC_LEVEL0); +	writel_relaxed(sirfsoc_irq_st.level1, base + SIRFSOC_INT_RISC_LEVEL1); +} + +static struct syscore_ops sirfsoc_irq_syscore_ops = { +	.suspend	= sirfsoc_irq_suspend, +	.resume		= sirfsoc_irq_resume, +}; + +static int __init sirfsoc_irq_pm_init(void) +{ +	if (!sirfsoc_irqdomain) +		return 0; + +	register_syscore_ops(&sirfsoc_irq_syscore_ops); +	return 0; +} +device_initcall(sirfsoc_irq_pm_init); diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 21f261bf9e9..21434beb420 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -26,7 +26,6 @@  #include <linux/fs.h>  #include <linux/platform_device.h>  #include <linux/uaccess.h> -#include <linux/irqchip/arm-gic.h>  #include <linux/mfd/core.h>  #include <linux/mfd/dbx500-prcmu.h>  #include <linux/mfd/abx500/ab8500.h> @@ -34,9 +33,7 @@  #include <linux/regulator/machine.h>  #include <linux/cpufreq.h>  #include <linux/platform_data/ux500_wdt.h> -#include <mach/hardware.h> -#include <mach/irqs.h> -#include <mach/db8500-regs.h> +#include <linux/platform_data/db8500_thermal.h>  #include "dbx500-prcmu-regs.h"  /* Index of different voltages to be used when accessing AVSData */ @@ -276,8 +273,34 @@ static struct irq_domain *db8500_irq_domain;   * the bits in the bit field are not. (The bits also have a tendency to move   * around, to further complicate matters.)   */ -#define IRQ_INDEX(_name) ((IRQ_PRCMU_##_name) - IRQ_PRCMU_BASE) +#define IRQ_INDEX(_name) ((IRQ_PRCMU_##_name))  #define IRQ_ENTRY(_name)[IRQ_INDEX(_name)] = (WAKEUP_BIT_##_name) + +#define IRQ_PRCMU_RTC 0 +#define IRQ_PRCMU_RTT0 1 +#define IRQ_PRCMU_RTT1 2 +#define IRQ_PRCMU_HSI0 3 +#define IRQ_PRCMU_HSI1 4 +#define IRQ_PRCMU_CA_WAKE 5 +#define IRQ_PRCMU_USB 6 +#define IRQ_PRCMU_ABB 7 +#define IRQ_PRCMU_ABB_FIFO 8 +#define IRQ_PRCMU_ARM 9 +#define IRQ_PRCMU_MODEM_SW_RESET_REQ 10 +#define IRQ_PRCMU_GPIO0 11 +#define IRQ_PRCMU_GPIO1 12 +#define IRQ_PRCMU_GPIO2 13 +#define IRQ_PRCMU_GPIO3 14 +#define IRQ_PRCMU_GPIO4 15 +#define IRQ_PRCMU_GPIO5 16 +#define IRQ_PRCMU_GPIO6 17 +#define IRQ_PRCMU_GPIO7 18 +#define IRQ_PRCMU_GPIO8 19 +#define IRQ_PRCMU_CA_SLEEP 20 +#define IRQ_PRCMU_HOTMON_LOW 21 +#define IRQ_PRCMU_HOTMON_HIGH 22 +#define NUM_PRCMU_WAKEUPS 23 +  static u32 prcmu_irq_bit[NUM_PRCMU_WAKEUPS] = {  	IRQ_ENTRY(RTC),  	IRQ_ENTRY(RTT0), @@ -422,9 +445,10 @@ static DEFINE_SPINLOCK(clkout_lock);  /* Global var to runtime determine TCDM base for v2 or v1 */  static __iomem void *tcdm_base; +static __iomem void *prcmu_base;  struct clk_mgt { -	void __iomem *reg; +	u32 offset;  	u32 pllsw;  	int branch;  	bool clk38div; @@ -599,9 +623,9 @@ int db8500_prcmu_set_display_clocks(void)  	while ((readl(PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0)  		cpu_relax(); -	writel(PRCMU_DSI_CLOCK_SETTING, PRCM_HDMICLK_MGT); -	writel(PRCMU_DSI_LP_CLOCK_SETTING, PRCM_TVCLK_MGT); -	writel(PRCMU_DPI_CLOCK_SETTING, PRCM_LCDCLK_MGT); +	writel(PRCMU_DSI_CLOCK_SETTING, prcmu_base + PRCM_HDMICLK_MGT); +	writel(PRCMU_DSI_LP_CLOCK_SETTING, prcmu_base + PRCM_TVCLK_MGT); +	writel(PRCMU_DPI_CLOCK_SETTING, prcmu_base + PRCM_LCDCLK_MGT);  	/* Release the HW semaphore. */  	writel(0, PRCM_SEM); @@ -613,7 +637,7 @@ int db8500_prcmu_set_display_clocks(void)  u32 db8500_prcmu_read(unsigned int reg)  { -	return readl(_PRCMU_BASE + reg); +	return readl(prcmu_base + reg);  }  void db8500_prcmu_write(unsigned int reg, u32 value) @@ -621,7 +645,7 @@ void db8500_prcmu_write(unsigned int reg, u32 value)  	unsigned long flags;  	spin_lock_irqsave(&prcmu_lock, flags); -	writel(value, (_PRCMU_BASE + reg)); +	writel(value, (prcmu_base + reg));  	spin_unlock_irqrestore(&prcmu_lock, flags);  } @@ -631,9 +655,9 @@ void db8500_prcmu_write_masked(unsigned int reg, u32 mask, u32 value)  	unsigned long flags;  	spin_lock_irqsave(&prcmu_lock, flags); -	val = readl(_PRCMU_BASE + reg); +	val = readl(prcmu_base + reg);  	val = ((val & ~mask) | (value & mask)); -	writel(val, (_PRCMU_BASE + reg)); +	writel(val, (prcmu_base + reg));  	spin_unlock_irqrestore(&prcmu_lock, flags);  } @@ -793,119 +817,6 @@ u8 db8500_prcmu_get_power_state_result(void)  	return readb(tcdm_base + PRCM_ACK_MB0_AP_PWRSTTR_STATUS);  } -/* This function decouple the gic from the prcmu */ -int db8500_prcmu_gic_decouple(void) -{ -	u32 val = readl(PRCM_A9_MASK_REQ); - -	/* Set bit 0 register value to 1 */ -	writel(val | PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ, -	       PRCM_A9_MASK_REQ); - -	/* Make sure the register is updated */ -	readl(PRCM_A9_MASK_REQ); - -	/* Wait a few cycles for the gic mask completion */ -	udelay(1); - -	return 0; -} - -/* This function recouple the gic with the prcmu */ -int db8500_prcmu_gic_recouple(void) -{ -	u32 val = readl(PRCM_A9_MASK_REQ); - -	/* Set bit 0 register value to 0 */ -	writel(val & ~PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ, PRCM_A9_MASK_REQ); - -	return 0; -} - -#define PRCMU_GIC_NUMBER_REGS 5 - -/* - * This function checks if there are pending irq on the gic. It only - * makes sense if the gic has been decoupled before with the - * db8500_prcmu_gic_decouple function. Disabling an interrupt only - * disables the forwarding of the interrupt to any CPU interface. It - * does not prevent the interrupt from changing state, for example - * becoming pending, or active and pending if it is already - * active. Hence, we have to check the interrupt is pending *and* is - * active. - */ -bool db8500_prcmu_gic_pending_irq(void) -{ -	u32 pr; /* Pending register */ -	u32 er; /* Enable register */ -	void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); -	int i; - -        /* 5 registers. STI & PPI not skipped */ -	for (i = 0; i < PRCMU_GIC_NUMBER_REGS; i++) { - -		pr = readl_relaxed(dist_base + GIC_DIST_PENDING_SET + i * 4); -		er = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); - -		if (pr & er) -			return true; /* There is a pending interrupt */ -	} - -	return false; -} - -/* - * This function checks if there are pending interrupt on the - * prcmu which has been delegated to monitor the irqs with the - * db8500_prcmu_copy_gic_settings function. - */ -bool db8500_prcmu_pending_irq(void) -{ -	u32 it, im; -	int i; - -	for (i = 0; i < PRCMU_GIC_NUMBER_REGS - 1; i++) { -		it = readl(PRCM_ARMITVAL31TO0 + i * 4); -		im = readl(PRCM_ARMITMSK31TO0 + i * 4); -		if (it & im) -			return true; /* There is a pending interrupt */ -	} - -	return false; -} - -/* - * This function checks if the specified cpu is in in WFI. It's usage - * makes sense only if the gic is decoupled with the db8500_prcmu_gic_decouple - * function. Of course passing smp_processor_id() to this function will - * always return false... - */ -bool db8500_prcmu_is_cpu_in_wfi(int cpu) -{ -	return readl(PRCM_ARM_WFI_STANDBY) & cpu ? PRCM_ARM_WFI_STANDBY_WFI1 : -		     PRCM_ARM_WFI_STANDBY_WFI0; -} - -/* - * This function copies the gic SPI settings to the prcmu in order to - * monitor them and abort/finish the retention/off sequence or state. - */ -int db8500_prcmu_copy_gic_settings(void) -{ -	u32 er; /* Enable register */ -	void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); -	int i; - -        /* We skip the STI and PPI */ -	for (i = 0; i < PRCMU_GIC_NUMBER_REGS - 1; i++) { -		er = readl_relaxed(dist_base + -				   GIC_DIST_ENABLE_SET + (i + 1) * 4); -		writel(er, PRCM_ARMITMSK31TO0 + i * 4); -	} - -	return 0; -} -  /* This function should only be called while mb0_transfer.lock is held. */  static void config_wakeups(void)  { @@ -1059,7 +970,7 @@ int db8500_prcmu_set_ddr_opp(u8 opp)  /* Divide the frequency of certain clocks by 2 for APE_50_PARTLY_25_OPP. */  static void request_even_slower_clocks(bool enable)  { -	void __iomem *clock_reg[] = { +	u32 clock_reg[] = {  		PRCM_ACLK_MGT,  		PRCM_DMACLK_MGT  	}; @@ -1076,7 +987,7 @@ static void request_even_slower_clocks(bool enable)  		u32 val;  		u32 div; -		val = readl(clock_reg[i]); +		val = readl(prcmu_base + clock_reg[i]);  		div = (val & PRCM_CLK_MGT_CLKPLLDIV_MASK);  		if (enable) {  			if ((div <= 1) || (div > 15)) { @@ -1092,7 +1003,7 @@ static void request_even_slower_clocks(bool enable)  		}  		val = ((val & ~PRCM_CLK_MGT_CLKPLLDIV_MASK) |  			(div & PRCM_CLK_MGT_CLKPLLDIV_MASK)); -		writel(val, clock_reg[i]); +		writel(val, prcmu_base + clock_reg[i]);  	}  unlock_and_return: @@ -1446,14 +1357,14 @@ static int request_clock(u8 clock, bool enable)  	while ((readl(PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0)  		cpu_relax(); -	val = readl(clk_mgt[clock].reg); +	val = readl(prcmu_base + clk_mgt[clock].offset);  	if (enable) {  		val |= (PRCM_CLK_MGT_CLKEN | clk_mgt[clock].pllsw);  	} else {  		clk_mgt[clock].pllsw = (val & PRCM_CLK_MGT_CLKPLLSW_MASK);  		val &= ~(PRCM_CLK_MGT_CLKEN | PRCM_CLK_MGT_CLKPLLSW_MASK);  	} -	writel(val, clk_mgt[clock].reg); +	writel(val, prcmu_base + clk_mgt[clock].offset);  	/* Release the HW semaphore. */  	writel(0, PRCM_SEM); @@ -1629,7 +1540,7 @@ static unsigned long clock_rate(u8 clock)  	u32 pllsw;  	unsigned long rate = ROOT_CLOCK_RATE; -	val = readl(clk_mgt[clock].reg); +	val = readl(prcmu_base + clk_mgt[clock].offset);  	if (val & PRCM_CLK_MGT_CLK38) {  		if (clk_mgt[clock].clk38div && (val & PRCM_CLK_MGT_CLK38DIV)) @@ -1785,7 +1696,7 @@ static long round_clock_rate(u8 clock, unsigned long rate)  	unsigned long src_rate;  	long rounded_rate; -	val = readl(clk_mgt[clock].reg); +	val = readl(prcmu_base + clk_mgt[clock].offset);  	src_rate = clock_source_rate((val | clk_mgt[clock].pllsw),  		clk_mgt[clock].branch);  	div = clock_divider(src_rate, rate); @@ -1933,7 +1844,7 @@ static void set_clock_rate(u8 clock, unsigned long rate)  	while ((readl(PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0)  		cpu_relax(); -	val = readl(clk_mgt[clock].reg); +	val = readl(prcmu_base + clk_mgt[clock].offset);  	src_rate = clock_source_rate((val | clk_mgt[clock].pllsw),  		clk_mgt[clock].branch);  	div = clock_divider(src_rate, rate); @@ -1961,7 +1872,7 @@ static void set_clock_rate(u8 clock, unsigned long rate)  		val &= ~PRCM_CLK_MGT_CLKPLLDIV_MASK;  		val |= min(div, (u32)31);  	} -	writel(val, clk_mgt[clock].reg); +	writel(val, prcmu_base + clk_mgt[clock].offset);  	/* Release the HW semaphore. */  	writel(0, PRCM_SEM); @@ -2764,14 +2675,13 @@ static struct irq_domain_ops db8500_irq_ops = {  	.xlate  = irq_domain_xlate_twocell,  }; -static int db8500_irq_init(struct device_node *np) +static int db8500_irq_init(struct device_node *np, int irq_base)  { -	int irq_base = 0;  	int i;  	/* In the device tree case, just take some IRQs */ -	if (!np) -		irq_base = IRQ_PRCMU_BASE; +	if (np) +		irq_base = 0;  	db8500_irq_domain = irq_domain_add_simple(  		np, NUM_PRCMU_WAKEUPS, irq_base, @@ -2825,8 +2735,19 @@ static void dbx500_fw_version_init(struct platform_device *pdev,  	}  } -void __init db8500_prcmu_early_init(void) +void __init db8500_prcmu_early_init(u32 phy_base, u32 size)  { +	/* +	 * This is a temporary remap to bring up the clocks. It is +	 * subsequently replaces with a real remap. After the merge of +	 * the mailbox subsystem all of this early code goes away, and the +	 * clock driver can probe independently. An early initcall will +	 * still be needed, but it can be diverted into drivers/clk/ux500. +	 */ +	prcmu_base = ioremap(phy_base, size); +	if (!prcmu_base) +		pr_err("%s: ioremap() of prcmu registers failed!\n", __func__); +  	spin_lock_init(&mb0_transfer.lock);  	spin_lock_init(&mb0_transfer.dbb_irqs_lock);  	mutex_init(&mb0_transfer.ac_wake_lock); @@ -3092,18 +3013,57 @@ static struct regulator_init_data db8500_regulators[DB8500_NUM_REGULATORS] = {  	},  }; -static struct resource ab8500_resources[] = { -	[0] = { -		.start	= IRQ_DB8500_AB8500, -		.end	= IRQ_DB8500_AB8500, -		.flags	= IORESOURCE_IRQ -	} -}; -  static struct ux500_wdt_data db8500_wdt_pdata = {  	.timeout = 600, /* 10 minutes */  	.has_28_bits_resolution = true,  }; +/* + * Thermal Sensor + */ + +static struct resource db8500_thsens_resources[] = { +	{ +		.name = "IRQ_HOTMON_LOW", +		.start  = IRQ_PRCMU_HOTMON_LOW, +		.end    = IRQ_PRCMU_HOTMON_LOW, +		.flags  = IORESOURCE_IRQ, +	}, +	{ +		.name = "IRQ_HOTMON_HIGH", +		.start  = IRQ_PRCMU_HOTMON_HIGH, +		.end    = IRQ_PRCMU_HOTMON_HIGH, +		.flags  = IORESOURCE_IRQ, +	}, +}; + +static struct db8500_thsens_platform_data db8500_thsens_data = { +	.trip_points[0] = { +		.temp = 70000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[1] = { +		.temp = 75000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[2] = { +		.temp = 80000, +		.type = THERMAL_TRIP_ACTIVE, +		.cdev_name = { +			[0] = "thermal-cpufreq-0", +		}, +	}, +	.trip_points[3] = { +		.temp = 85000, +		.type = THERMAL_TRIP_CRITICAL, +	}, +	.num_trips = 4, +};  static struct mfd_cell db8500_prcmu_devs[] = {  	{ @@ -3125,11 +3085,10 @@ static struct mfd_cell db8500_prcmu_devs[] = {  		.id = -1,  	},  	{ -		.name = "ab8500-core", -		.of_compatible = "stericsson,ab8500", -		.num_resources = ARRAY_SIZE(ab8500_resources), -		.resources = ab8500_resources, -		.id = AB8500_VERSION_AB8500, +		.name = "db8500-thermal", +		.num_resources = ARRAY_SIZE(db8500_thsens_resources), +		.resources = db8500_thsens_resources, +		.platform_data = &db8500_thsens_data,  	},  }; @@ -3141,6 +3100,24 @@ static void db8500_prcmu_update_cpufreq(void)  	}  } +static int db8500_prcmu_register_ab8500(struct device *parent, +					struct ab8500_platform_data *pdata, +					int irq) +{ +	struct resource ab8500_resource = DEFINE_RES_IRQ(irq); +	struct mfd_cell ab8500_cell = { +		.name = "ab8500-core", +		.of_compatible = "stericsson,ab8500", +		.id = AB8500_VERSION_AB8500, +		.platform_data = pdata, +		.pdata_size = sizeof(struct ab8500_platform_data), +		.resources = &ab8500_resource, +		.num_resources = 1, +	}; + +	return mfd_add_devices(parent, 0, &ab8500_cell, 1, NULL, 0, NULL); +} +  /**   * prcmu_fw_init - arch init call for the Linux PRCMU fw init logic   * @@ -3149,11 +3126,21 @@ static int db8500_prcmu_probe(struct platform_device *pdev)  {  	struct device_node *np = pdev->dev.of_node;  	struct prcmu_pdata *pdata = dev_get_platdata(&pdev->dev); -	int irq = 0, err = 0, i; +	int irq = 0, err = 0;  	struct resource *res; +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "prcmu"); +	if (!res) { +		dev_err(&pdev->dev, "no prcmu memory region provided\n"); +		return -ENOENT; +	} +	prcmu_base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); +	if (!prcmu_base) { +		dev_err(&pdev->dev, +			"failed to ioremap prcmu register memory\n"); +		return -ENOENT; +	}  	init_prcm_registers(); -  	dbx500_fw_version_init(pdev, pdata->version_offset);  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "prcmu-tcdm");  	if (!res) { @@ -3180,26 +3167,27 @@ static int db8500_prcmu_probe(struct platform_device *pdev)  		goto no_irq_return;  	} -	db8500_irq_init(np); - -	for (i = 0; i < ARRAY_SIZE(db8500_prcmu_devs); i++) { -		if (!strcmp(db8500_prcmu_devs[i].name, "ab8500-core")) { -			db8500_prcmu_devs[i].platform_data = pdata->ab_platdata; -			db8500_prcmu_devs[i].pdata_size = sizeof(struct ab8500_platform_data); -		} -	} +	db8500_irq_init(np, pdata->irq_base);  	prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);  	db8500_prcmu_update_cpufreq();  	err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, -			      ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, NULL); +			      ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, db8500_irq_domain);  	if (err) {  		pr_err("prcmu: Failed to add subdevices\n");  		return err;  	} +	err = db8500_prcmu_register_ab8500(&pdev->dev, pdata->ab_platdata, +					   pdata->ab_irq); +	if (err) { +		mfd_remove_devices(&pdev->dev); +		pr_err("prcmu: Failed to add ab8500 subdevice\n"); +		goto no_irq_return; +	} +  	pr_info("DB8500 PRCMU initialized\n");  no_irq_return: diff --git a/drivers/mfd/dbx500-prcmu-regs.h b/drivers/mfd/dbx500-prcmu-regs.h index 79c76ebdba5..d14836ed211 100644 --- a/drivers/mfd/dbx500-prcmu-regs.h +++ b/drivers/mfd/dbx500-prcmu-regs.h @@ -13,136 +13,110 @@  #ifndef __DB8500_PRCMU_REGS_H  #define __DB8500_PRCMU_REGS_H -#include <mach/hardware.h> -  #define BITS(_start, _end) ((BIT(_end) - BIT(_start)) + BIT(_end)) -#define PRCM_CLK_MGT(_offset) (void __iomem *)(IO_ADDRESS(U8500_PRCMU_BASE) \ -	+ _offset) -#define PRCM_ACLK_MGT		PRCM_CLK_MGT(0x004) -#define PRCM_SVACLK_MGT		PRCM_CLK_MGT(0x008) -#define PRCM_SIACLK_MGT		PRCM_CLK_MGT(0x00C) -#define PRCM_SGACLK_MGT		PRCM_CLK_MGT(0x014) -#define PRCM_UARTCLK_MGT	PRCM_CLK_MGT(0x018) -#define PRCM_MSP02CLK_MGT	PRCM_CLK_MGT(0x01C) -#define PRCM_I2CCLK_MGT		PRCM_CLK_MGT(0x020) -#define PRCM_SDMMCCLK_MGT	PRCM_CLK_MGT(0x024) -#define PRCM_SLIMCLK_MGT	PRCM_CLK_MGT(0x028) -#define PRCM_PER1CLK_MGT	PRCM_CLK_MGT(0x02C) -#define PRCM_PER2CLK_MGT	PRCM_CLK_MGT(0x030) -#define PRCM_PER3CLK_MGT	PRCM_CLK_MGT(0x034) -#define PRCM_PER5CLK_MGT	PRCM_CLK_MGT(0x038) -#define PRCM_PER6CLK_MGT	PRCM_CLK_MGT(0x03C) -#define PRCM_PER7CLK_MGT	PRCM_CLK_MGT(0x040) -#define PRCM_LCDCLK_MGT		PRCM_CLK_MGT(0x044) -#define PRCM_BMLCLK_MGT		PRCM_CLK_MGT(0x04C) -#define PRCM_HSITXCLK_MGT	PRCM_CLK_MGT(0x050) -#define PRCM_HSIRXCLK_MGT	PRCM_CLK_MGT(0x054) -#define PRCM_HDMICLK_MGT	PRCM_CLK_MGT(0x058) -#define PRCM_APEATCLK_MGT	PRCM_CLK_MGT(0x05C) -#define PRCM_APETRACECLK_MGT	PRCM_CLK_MGT(0x060) -#define PRCM_MCDECLK_MGT	PRCM_CLK_MGT(0x064) -#define PRCM_IPI2CCLK_MGT	PRCM_CLK_MGT(0x068) -#define PRCM_DSIALTCLK_MGT	PRCM_CLK_MGT(0x06C) -#define PRCM_DMACLK_MGT		PRCM_CLK_MGT(0x074) -#define PRCM_B2R2CLK_MGT	PRCM_CLK_MGT(0x078) -#define PRCM_TVCLK_MGT		PRCM_CLK_MGT(0x07C) -#define PRCM_UNIPROCLK_MGT	PRCM_CLK_MGT(0x278) -#define PRCM_SSPCLK_MGT		PRCM_CLK_MGT(0x280) -#define PRCM_RNGCLK_MGT		PRCM_CLK_MGT(0x284) -#define PRCM_UICCCLK_MGT	PRCM_CLK_MGT(0x27C) -#define PRCM_MSP1CLK_MGT	PRCM_CLK_MGT(0x288) +#define PRCM_ACLK_MGT		(0x004) +#define PRCM_SVACLK_MGT		(0x008) +#define PRCM_SIACLK_MGT		(0x00C) +#define PRCM_SGACLK_MGT		(0x014) +#define PRCM_UARTCLK_MGT	(0x018) +#define PRCM_MSP02CLK_MGT	(0x01C) +#define PRCM_I2CCLK_MGT		(0x020) +#define PRCM_SDMMCCLK_MGT	(0x024) +#define PRCM_SLIMCLK_MGT	(0x028) +#define PRCM_PER1CLK_MGT	(0x02C) +#define PRCM_PER2CLK_MGT	(0x030) +#define PRCM_PER3CLK_MGT	(0x034) +#define PRCM_PER5CLK_MGT	(0x038) +#define PRCM_PER6CLK_MGT	(0x03C) +#define PRCM_PER7CLK_MGT	(0x040) +#define PRCM_LCDCLK_MGT		(0x044) +#define PRCM_BMLCLK_MGT		(0x04C) +#define PRCM_HSITXCLK_MGT	(0x050) +#define PRCM_HSIRXCLK_MGT	(0x054) +#define PRCM_HDMICLK_MGT	(0x058) +#define PRCM_APEATCLK_MGT	(0x05C) +#define PRCM_APETRACECLK_MGT	(0x060) +#define PRCM_MCDECLK_MGT	(0x064) +#define PRCM_IPI2CCLK_MGT	(0x068) +#define PRCM_DSIALTCLK_MGT	(0x06C) +#define PRCM_DMACLK_MGT		(0x074) +#define PRCM_B2R2CLK_MGT	(0x078) +#define PRCM_TVCLK_MGT		(0x07C) +#define PRCM_UNIPROCLK_MGT	(0x278) +#define PRCM_SSPCLK_MGT		(0x280) +#define PRCM_RNGCLK_MGT		(0x284) +#define PRCM_UICCCLK_MGT	(0x27C) +#define PRCM_MSP1CLK_MGT	(0x288) -#define PRCM_ARM_PLLDIVPS	(_PRCMU_BASE + 0x118) +#define PRCM_ARM_PLLDIVPS	(prcmu_base + 0x118)  #define PRCM_ARM_PLLDIVPS_ARM_BRM_RATE		0x3f  #define PRCM_ARM_PLLDIVPS_MAX_MASK		0xf -#define PRCM_PLLARM_LOCKP       (_PRCMU_BASE + 0x0a8) +#define PRCM_PLLARM_LOCKP       (prcmu_base + 0x0a8)  #define PRCM_PLLARM_LOCKP_PRCM_PLLARM_LOCKP3	0x2 -#define PRCM_ARM_CHGCLKREQ	(_PRCMU_BASE + 0x114) +#define PRCM_ARM_CHGCLKREQ	(prcmu_base + 0x114)  #define PRCM_ARM_CHGCLKREQ_PRCM_ARM_CHGCLKREQ	BIT(0)  #define PRCM_ARM_CHGCLKREQ_PRCM_ARM_DIVSEL	BIT(16) -#define PRCM_PLLARM_ENABLE	(_PRCMU_BASE + 0x98) +#define PRCM_PLLARM_ENABLE	(prcmu_base + 0x98)  #define PRCM_PLLARM_ENABLE_PRCM_PLLARM_ENABLE	0x1  #define PRCM_PLLARM_ENABLE_PRCM_PLLARM_COUNTON	0x100 -#define PRCM_ARMCLKFIX_MGT	(_PRCMU_BASE + 0x0) -#define PRCM_A9PL_FORCE_CLKEN	(_PRCMU_BASE + 0x19C) -#define PRCM_A9_RESETN_CLR	(_PRCMU_BASE + 0x1f4) -#define PRCM_A9_RESETN_SET	(_PRCMU_BASE + 0x1f0) -#define PRCM_ARM_LS_CLAMP	(_PRCMU_BASE + 0x30c) -#define PRCM_SRAM_A9		(_PRCMU_BASE + 0x308) +#define PRCM_ARMCLKFIX_MGT	(prcmu_base + 0x0) +#define PRCM_A9PL_FORCE_CLKEN	(prcmu_base + 0x19C) +#define PRCM_A9_RESETN_CLR	(prcmu_base + 0x1f4) +#define PRCM_A9_RESETN_SET	(prcmu_base + 0x1f0) +#define PRCM_ARM_LS_CLAMP	(prcmu_base + 0x30c) +#define PRCM_SRAM_A9		(prcmu_base + 0x308)  #define PRCM_A9PL_FORCE_CLKEN_PRCM_A9PL_FORCE_CLKEN BIT(0)  #define PRCM_A9PL_FORCE_CLKEN_PRCM_A9AXI_FORCE_CLKEN BIT(1) -/* ARM WFI Standby signal register */ -#define PRCM_ARM_WFI_STANDBY    (_PRCMU_BASE + 0x130) -#define PRCM_ARM_WFI_STANDBY_WFI0               0x08 -#define PRCM_ARM_WFI_STANDBY_WFI1               0x10 -#define PRCM_IOCR		(_PRCMU_BASE + 0x310) -#define PRCM_IOCR_IOFORCE			0x1 -  /* CPU mailbox registers */ -#define PRCM_MBOX_CPU_VAL	(_PRCMU_BASE + 0x0fc) -#define PRCM_MBOX_CPU_SET	(_PRCMU_BASE + 0x100) -#define PRCM_MBOX_CPU_CLR	(_PRCMU_BASE + 0x104) - -/* Dual A9 core interrupt management unit registers */ -#define PRCM_A9_MASK_REQ	(_PRCMU_BASE + 0x328) -#define PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ	0x1 - -#define PRCM_A9_MASK_ACK	(_PRCMU_BASE + 0x32c) -#define PRCM_ARMITMSK31TO0	(_PRCMU_BASE + 0x11c) -#define PRCM_ARMITMSK63TO32	(_PRCMU_BASE + 0x120) -#define PRCM_ARMITMSK95TO64	(_PRCMU_BASE + 0x124) -#define PRCM_ARMITMSK127TO96	(_PRCMU_BASE + 0x128) -#define PRCM_POWER_STATE_VAL	(_PRCMU_BASE + 0x25C) -#define PRCM_ARMITVAL31TO0	(_PRCMU_BASE + 0x260) -#define PRCM_ARMITVAL63TO32	(_PRCMU_BASE + 0x264) -#define PRCM_ARMITVAL95TO64	(_PRCMU_BASE + 0x268) -#define PRCM_ARMITVAL127TO96	(_PRCMU_BASE + 0x26C) +#define PRCM_MBOX_CPU_VAL	(prcmu_base + 0x0fc) +#define PRCM_MBOX_CPU_SET	(prcmu_base + 0x100) +#define PRCM_MBOX_CPU_CLR	(prcmu_base + 0x104) -#define PRCM_HOSTACCESS_REQ	(_PRCMU_BASE + 0x334) +#define PRCM_HOSTACCESS_REQ	(prcmu_base + 0x334)  #define PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ 0x1  #define PRCM_HOSTACCESS_REQ_WAKE_REQ	BIT(16)  #define ARM_WAKEUP_MODEM	0x1 -#define PRCM_ARM_IT1_CLR	(_PRCMU_BASE + 0x48C) -#define PRCM_ARM_IT1_VAL	(_PRCMU_BASE + 0x494) -#define PRCM_HOLD_EVT		(_PRCMU_BASE + 0x174) +#define PRCM_ARM_IT1_CLR	(prcmu_base + 0x48C) +#define PRCM_ARM_IT1_VAL	(prcmu_base + 0x494) +#define PRCM_HOLD_EVT		(prcmu_base + 0x174) -#define PRCM_MOD_AWAKE_STATUS	(_PRCMU_BASE + 0x4A0) +#define PRCM_MOD_AWAKE_STATUS	(prcmu_base + 0x4A0)  #define PRCM_MOD_AWAKE_STATUS_PRCM_MOD_COREPD_AWAKE	BIT(0)  #define PRCM_MOD_AWAKE_STATUS_PRCM_MOD_AAPD_AWAKE	BIT(1)  #define PRCM_MOD_AWAKE_STATUS_PRCM_MOD_VMODEM_OFF_ISO	BIT(2) -#define PRCM_ITSTATUS0		(_PRCMU_BASE + 0x148) -#define PRCM_ITSTATUS1		(_PRCMU_BASE + 0x150) -#define PRCM_ITSTATUS2		(_PRCMU_BASE + 0x158) -#define PRCM_ITSTATUS3		(_PRCMU_BASE + 0x160) -#define PRCM_ITSTATUS4		(_PRCMU_BASE + 0x168) -#define PRCM_ITSTATUS5		(_PRCMU_BASE + 0x484) -#define PRCM_ITCLEAR5		(_PRCMU_BASE + 0x488) -#define PRCM_ARMIT_MASKXP70_IT	(_PRCMU_BASE + 0x1018) +#define PRCM_ITSTATUS0		(prcmu_base + 0x148) +#define PRCM_ITSTATUS1		(prcmu_base + 0x150) +#define PRCM_ITSTATUS2		(prcmu_base + 0x158) +#define PRCM_ITSTATUS3		(prcmu_base + 0x160) +#define PRCM_ITSTATUS4		(prcmu_base + 0x168) +#define PRCM_ITSTATUS5		(prcmu_base + 0x484) +#define PRCM_ITCLEAR5		(prcmu_base + 0x488) +#define PRCM_ARMIT_MASKXP70_IT	(prcmu_base + 0x1018)  /* System reset register */ -#define PRCM_APE_SOFTRST	(_PRCMU_BASE + 0x228) +#define PRCM_APE_SOFTRST	(prcmu_base + 0x228)  /* Level shifter and clamp control registers */ -#define PRCM_MMIP_LS_CLAMP_SET     (_PRCMU_BASE + 0x420) -#define PRCM_MMIP_LS_CLAMP_CLR     (_PRCMU_BASE + 0x424) +#define PRCM_MMIP_LS_CLAMP_SET     (prcmu_base + 0x420) +#define PRCM_MMIP_LS_CLAMP_CLR     (prcmu_base + 0x424)  #define PRCM_MMIP_LS_CLAMP_DSIPLL_CLAMP		BIT(11)  #define PRCM_MMIP_LS_CLAMP_DSIPLL_CLAMPI	BIT(22)  /* PRCMU clock/PLL/reset registers */ -#define PRCM_PLLSOC0_FREQ	   (_PRCMU_BASE + 0x080) -#define PRCM_PLLSOC1_FREQ	   (_PRCMU_BASE + 0x084) -#define PRCM_PLLARM_FREQ	   (_PRCMU_BASE + 0x088) -#define PRCM_PLLDDR_FREQ	   (_PRCMU_BASE + 0x08C) +#define PRCM_PLLSOC0_FREQ	   (prcmu_base + 0x080) +#define PRCM_PLLSOC1_FREQ	   (prcmu_base + 0x084) +#define PRCM_PLLARM_FREQ	   (prcmu_base + 0x088) +#define PRCM_PLLDDR_FREQ	   (prcmu_base + 0x08C)  #define PRCM_PLL_FREQ_D_SHIFT	0  #define PRCM_PLL_FREQ_D_MASK	BITS(0, 7)  #define PRCM_PLL_FREQ_N_SHIFT	8 @@ -152,14 +126,14 @@  #define PRCM_PLL_FREQ_SELDIV2	BIT(24)  #define PRCM_PLL_FREQ_DIV2EN	BIT(25) -#define PRCM_PLLDSI_FREQ           (_PRCMU_BASE + 0x500) -#define PRCM_PLLDSI_ENABLE         (_PRCMU_BASE + 0x504) -#define PRCM_PLLDSI_LOCKP          (_PRCMU_BASE + 0x508) -#define PRCM_DSI_PLLOUT_SEL        (_PRCMU_BASE + 0x530) -#define PRCM_DSITVCLK_DIV          (_PRCMU_BASE + 0x52C) -#define PRCM_PLLDSI_LOCKP          (_PRCMU_BASE + 0x508) -#define PRCM_APE_RESETN_SET        (_PRCMU_BASE + 0x1E4) -#define PRCM_APE_RESETN_CLR        (_PRCMU_BASE + 0x1E8) +#define PRCM_PLLDSI_FREQ           (prcmu_base + 0x500) +#define PRCM_PLLDSI_ENABLE         (prcmu_base + 0x504) +#define PRCM_PLLDSI_LOCKP          (prcmu_base + 0x508) +#define PRCM_DSI_PLLOUT_SEL        (prcmu_base + 0x530) +#define PRCM_DSITVCLK_DIV          (prcmu_base + 0x52C) +#define PRCM_PLLDSI_LOCKP          (prcmu_base + 0x508) +#define PRCM_APE_RESETN_SET        (prcmu_base + 0x1E4) +#define PRCM_APE_RESETN_CLR        (prcmu_base + 0x1E8)  #define PRCM_PLLDSI_ENABLE_PRCM_PLLDSI_ENABLE BIT(0) @@ -188,30 +162,30 @@  #define PRCM_APE_RESETN_DSIPLL_RESETN BIT(14) -#define PRCM_CLKOCR		   (_PRCMU_BASE + 0x1CC) +#define PRCM_CLKOCR		   (prcmu_base + 0x1CC)  #define PRCM_CLKOCR_CLKOUT0_REF_CLK	(1 << 0)  #define PRCM_CLKOCR_CLKOUT0_MASK	BITS(0, 13)  #define PRCM_CLKOCR_CLKOUT1_REF_CLK	(1 << 16)  #define PRCM_CLKOCR_CLKOUT1_MASK	BITS(16, 29)  /* ePOD and memory power signal control registers */ -#define PRCM_EPOD_C_SET            (_PRCMU_BASE + 0x410) -#define PRCM_SRAM_LS_SLEEP         (_PRCMU_BASE + 0x304) +#define PRCM_EPOD_C_SET            (prcmu_base + 0x410) +#define PRCM_SRAM_LS_SLEEP         (prcmu_base + 0x304)  /* Debug power control unit registers */ -#define PRCM_POWER_STATE_SET       (_PRCMU_BASE + 0x254) +#define PRCM_POWER_STATE_SET       (prcmu_base + 0x254)  /* Miscellaneous unit registers */ -#define PRCM_DSI_SW_RESET          (_PRCMU_BASE + 0x324) -#define PRCM_GPIOCR                (_PRCMU_BASE + 0x138) +#define PRCM_DSI_SW_RESET          (prcmu_base + 0x324) +#define PRCM_GPIOCR                (prcmu_base + 0x138)  #define PRCM_GPIOCR_DBG_STM_MOD_CMD1            0x800  #define PRCM_GPIOCR_DBG_UARTMOD_CMD0            0x1  /* PRCMU HW semaphore */ -#define PRCM_SEM                   (_PRCMU_BASE + 0x400) +#define PRCM_SEM                   (prcmu_base + 0x400)  #define PRCM_SEM_PRCM_SEM BIT(0) -#define PRCM_TCR                   (_PRCMU_BASE + 0x1C8) +#define PRCM_TCR                   (prcmu_base + 0x1C8)  #define PRCM_TCR_TENSEL_MASK       BITS(0, 7)  #define PRCM_TCR_STOP_TIMERS       BIT(16)  #define PRCM_TCR_DOZE_MODE         BIT(17) @@ -239,15 +213,15 @@  /* GPIOCR register */  #define PRCM_GPIOCR_SPI2_SELECT BIT(23) -#define PRCM_DDR_SUBSYS_APE_MINBW	(_PRCMU_BASE + 0x438) -#define PRCM_CGATING_BYPASS		(_PRCMU_BASE + 0x134) +#define PRCM_DDR_SUBSYS_APE_MINBW	(prcmu_base + 0x438) +#define PRCM_CGATING_BYPASS		(prcmu_base + 0x134)  #define PRCM_CGATING_BYPASS_ICN2	BIT(6)  /* Miscellaneous unit registers */ -#define PRCM_RESOUTN_SET		(_PRCMU_BASE + 0x214) -#define PRCM_RESOUTN_CLR		(_PRCMU_BASE + 0x218) +#define PRCM_RESOUTN_SET		(prcmu_base + 0x214) +#define PRCM_RESOUTN_CLR		(prcmu_base + 0x218)  /* System reset register */ -#define PRCM_APE_SOFTRST		(_PRCMU_BASE + 0x228) +#define PRCM_APE_SOFTRST		(prcmu_base + 0x228)  #endif /* __DB8500_PRCMU_REGS_H */ diff --git a/drivers/mmc/host/sdhci-cns3xxx.c b/drivers/mmc/host/sdhci-cns3xxx.c index 30bfdc4ae52..6ba8502c1ee 100644 --- a/drivers/mmc/host/sdhci-cns3xxx.c +++ b/drivers/mmc/host/sdhci-cns3xxx.c @@ -16,7 +16,6 @@  #include <linux/device.h>  #include <linux/mmc/host.h>  #include <linux/module.h> -#include <mach/cns3xxx.h>  #include "sdhci-pltfm.h"  static unsigned int sdhci_cns3xxx_get_max_clk(struct sdhci_host *host) diff --git a/drivers/mmc/host/sdhci-s3c-regs.h b/drivers/mmc/host/sdhci-s3c-regs.h new file mode 100644 index 00000000000..e34049ad44c --- /dev/null +++ b/drivers/mmc/host/sdhci-s3c-regs.h @@ -0,0 +1,87 @@ +/* linux/arch/arm/plat-s3c/include/plat/regs-sdhci.h + * + * Copyright 2008 Openmoko, Inc. + * Copyright 2008 Simtec Electronics + *	http://armlinux.simtec.co.uk/ + *	Ben Dooks <ben@simtec.co.uk> + * + * S3C Platform - SDHCI (HSMMC) register definitions + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +#ifndef __PLAT_S3C_SDHCI_REGS_H +#define __PLAT_S3C_SDHCI_REGS_H __FILE__ + +#define S3C_SDHCI_CONTROL2			(0x80) +#define S3C_SDHCI_CONTROL3			(0x84) +#define S3C64XX_SDHCI_CONTROL4			(0x8C) + +#define S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR	(1 << 31) +#define S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK		(1 << 30) +#define S3C_SDHCI_CTRL2_CDINVRXD3		(1 << 29) +#define S3C_SDHCI_CTRL2_SLCARDOUT		(1 << 28) + +#define S3C_SDHCI_CTRL2_FLTCLKSEL_MASK		(0xf << 24) +#define S3C_SDHCI_CTRL2_FLTCLKSEL_SHIFT		(24) +#define S3C_SDHCI_CTRL2_FLTCLKSEL(_x)		((_x) << 24) + +#define S3C_SDHCI_CTRL2_LVLDAT_MASK		(0xff << 16) +#define S3C_SDHCI_CTRL2_LVLDAT_SHIFT		(16) +#define S3C_SDHCI_CTRL2_LVLDAT(_x)		((_x) << 16) + +#define S3C_SDHCI_CTRL2_ENFBCLKTX		(1 << 15) +#define S3C_SDHCI_CTRL2_ENFBCLKRX		(1 << 14) +#define S3C_SDHCI_CTRL2_SDCDSEL			(1 << 13) +#define S3C_SDHCI_CTRL2_SDSIGPC			(1 << 12) +#define S3C_SDHCI_CTRL2_ENBUSYCHKTXSTART	(1 << 11) + +#define S3C_SDHCI_CTRL2_DFCNT_MASK		(0x3 << 9) +#define S3C_SDHCI_CTRL2_DFCNT_SHIFT		(9) +#define S3C_SDHCI_CTRL2_DFCNT_NONE		(0x0 << 9) +#define S3C_SDHCI_CTRL2_DFCNT_4SDCLK		(0x1 << 9) +#define S3C_SDHCI_CTRL2_DFCNT_16SDCLK		(0x2 << 9) +#define S3C_SDHCI_CTRL2_DFCNT_64SDCLK		(0x3 << 9) + +#define S3C_SDHCI_CTRL2_ENCLKOUTHOLD		(1 << 8) +#define S3C_SDHCI_CTRL2_RWAITMODE		(1 << 7) +#define S3C_SDHCI_CTRL2_DISBUFRD		(1 << 6) +#define S3C_SDHCI_CTRL2_SELBASECLK_MASK		(0x3 << 4) +#define S3C_SDHCI_CTRL2_SELBASECLK_SHIFT	(4) +#define S3C_SDHCI_CTRL2_PWRSYNC			(1 << 3) +#define S3C_SDHCI_CTRL2_ENCLKOUTMSKCON		(1 << 1) +#define S3C_SDHCI_CTRL2_HWINITFIN		(1 << 0) + +#define S3C_SDHCI_CTRL3_FCSEL3			(1 << 31) +#define S3C_SDHCI_CTRL3_FCSEL2			(1 << 23) +#define S3C_SDHCI_CTRL3_FCSEL1			(1 << 15) +#define S3C_SDHCI_CTRL3_FCSEL0			(1 << 7) + +#define S3C_SDHCI_CTRL3_FIA3_MASK		(0x7f << 24) +#define S3C_SDHCI_CTRL3_FIA3_SHIFT		(24) +#define S3C_SDHCI_CTRL3_FIA3(_x)		((_x) << 24) + +#define S3C_SDHCI_CTRL3_FIA2_MASK		(0x7f << 16) +#define S3C_SDHCI_CTRL3_FIA2_SHIFT		(16) +#define S3C_SDHCI_CTRL3_FIA2(_x)		((_x) << 16) + +#define S3C_SDHCI_CTRL3_FIA1_MASK		(0x7f << 8) +#define S3C_SDHCI_CTRL3_FIA1_SHIFT		(8) +#define S3C_SDHCI_CTRL3_FIA1(_x)		((_x) << 8) + +#define S3C_SDHCI_CTRL3_FIA0_MASK		(0x7f << 0) +#define S3C_SDHCI_CTRL3_FIA0_SHIFT		(0) +#define S3C_SDHCI_CTRL3_FIA0(_x)		((_x) << 0) + +#define S3C64XX_SDHCI_CONTROL4_DRIVE_MASK	(0x3 << 16) +#define S3C64XX_SDHCI_CONTROL4_DRIVE_SHIFT	(16) +#define S3C64XX_SDHCI_CONTROL4_DRIVE_2mA	(0x0 << 16) +#define S3C64XX_SDHCI_CONTROL4_DRIVE_4mA	(0x1 << 16) +#define S3C64XX_SDHCI_CONTROL4_DRIVE_7mA	(0x2 << 16) +#define S3C64XX_SDHCI_CONTROL4_DRIVE_9mA	(0x3 << 16) + +#define S3C64XX_SDHCI_CONTROL4_BUSY		(1) + +#endif /* __PLAT_S3C_SDHCI_REGS_H */ diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 7363efe7228..e4f52b5c259 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c @@ -15,6 +15,7 @@  #include <linux/delay.h>  #include <linux/dma-mapping.h>  #include <linux/platform_device.h> +#include <linux/platform_data/mmc-sdhci-s3c.h>  #include <linux/slab.h>  #include <linux/clk.h>  #include <linux/io.h> @@ -28,9 +29,7 @@  #include <linux/mmc/host.h> -#include <plat/sdhci.h> -#include <plat/regs-sdhci.h> - +#include "sdhci-s3c-regs.h"  #include "sdhci.h"  #define MAX_BUS_CLK	(4) diff --git a/drivers/mtd/onenand/samsung.c b/drivers/mtd/onenand/samsung.c index 33f2a8fb8df..2cf74085f93 100644 --- a/drivers/mtd/onenand/samsung.c +++ b/drivers/mtd/onenand/samsung.c @@ -23,11 +23,11 @@  #include <linux/mtd/partitions.h>  #include <linux/dma-mapping.h>  #include <linux/interrupt.h> +#include <linux/io.h>  #include <asm/mach/flash.h> -#include <plat/regs-onenand.h> -#include <linux/io.h> +#include "samsung.h"  enum soc_type {  	TYPE_S3C6400, diff --git a/drivers/mtd/onenand/samsung.h b/drivers/mtd/onenand/samsung.h new file mode 100644 index 00000000000..c4a80e67e43 --- /dev/null +++ b/drivers/mtd/onenand/samsung.h @@ -0,0 +1,61 @@ +/* + * linux/arch/arm/plat-s3c/include/plat/regs-onenand.h + * + *  Copyright (C) 2008-2010 Samsung Electronics + *  Kyungmin Park <kyungmin.park@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __SAMSUNG_ONENAND_H__ +#define __SAMSUNG_ONENAND_H__ + +/* + * OneNAND Controller + */ +#define MEM_CFG_OFFSET		0x0000 +#define BURST_LEN_OFFSET	0x0010 +#define MEM_RESET_OFFSET	0x0020 +#define INT_ERR_STAT_OFFSET	0x0030 +#define INT_ERR_MASK_OFFSET	0x0040 +#define INT_ERR_ACK_OFFSET	0x0050 +#define ECC_ERR_STAT_OFFSET	0x0060 +#define MANUFACT_ID_OFFSET	0x0070 +#define DEVICE_ID_OFFSET	0x0080 +#define DATA_BUF_SIZE_OFFSET	0x0090 +#define BOOT_BUF_SIZE_OFFSET	0x00A0 +#define BUF_AMOUNT_OFFSET	0x00B0 +#define TECH_OFFSET		0x00C0 +#define FBA_WIDTH_OFFSET	0x00D0 +#define FPA_WIDTH_OFFSET	0x00E0 +#define FSA_WIDTH_OFFSET	0x00F0 +#define TRANS_SPARE_OFFSET	0x0140 +#define DBS_DFS_WIDTH_OFFSET	0x0160 +#define INT_PIN_ENABLE_OFFSET	0x01A0 +#define ACC_CLOCK_OFFSET	0x01C0 +#define FLASH_VER_ID_OFFSET	0x01F0 +#define FLASH_AUX_CNTRL_OFFSET	0x0300		/* s3c64xx only */ + +#define ONENAND_MEM_RESET_HOT	0x3 +#define ONENAND_MEM_RESET_COLD	0x2 +#define ONENAND_MEM_RESET_WARM	0x1 + +#define CACHE_OP_ERR		(1 << 13) +#define RST_CMP			(1 << 12) +#define RDY_ACT			(1 << 11) +#define INT_ACT			(1 << 10) +#define UNSUP_CMD		(1 << 9) +#define LOCKED_BLK		(1 << 8) +#define BLK_RW_CMP		(1 << 7) +#define ERS_CMP			(1 << 6) +#define PGM_CMP			(1 << 5) +#define LOAD_CMP		(1 << 4) +#define ERS_FAIL		(1 << 3) +#define PGM_FAIL		(1 << 2) +#define INT_TO			(1 << 1) +#define LD_FAIL_ECC_ERR		(1 << 0) + +#define TSRF			(1 << 0) + +#endif diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c index 1ed23d02011..bc9d1be27fb 100644 --- a/drivers/pinctrl/pinctrl-sirf.c +++ b/drivers/pinctrl/pinctrl-sirf.c @@ -1347,7 +1347,7 @@ static inline int sirfsoc_gpio_to_irq(struct gpio_chip *chip, unsigned offset)  	struct sirfsoc_gpio_bank *bank = container_of(to_of_mm_gpio_chip(chip),  		struct sirfsoc_gpio_bank, chip); -	return irq_find_mapping(bank->domain, offset); +	return irq_create_mapping(bank->domain, offset);  }  static inline int sirfsoc_gpio_to_offset(unsigned int gpio) @@ -1485,7 +1485,6 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  	struct sirfsoc_gpio_bank *bank = irq_get_handler_data(irq);  	u32 status, ctrl;  	int idx = 0; -	unsigned int first_irq;  	struct irq_chip *chip = irq_get_chip(irq);  	chained_irq_enter(chip, desc); @@ -1499,8 +1498,6 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  		return;  	} -	first_irq = bank->domain->revmap_data.legacy.first_irq; -  	while (status) {  		ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx)); @@ -1511,7 +1508,7 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  		if ((status & 0x1) && (ctrl & SIRFSOC_GPIO_CTL_INTR_EN_MASK)) {  			pr_debug("%s: gpio id %d idx %d happens\n",  				__func__, bank->id, idx); -			generic_handle_irq(first_irq + idx); +			generic_handle_irq(irq_find_mapping(bank->domain, idx));  		}  		idx++; @@ -1764,9 +1761,8 @@ static int sirfsoc_gpio_probe(struct device_node *np)  			goto out;  		} -		bank->domain = irq_domain_add_legacy(np, SIRFSOC_GPIO_BANK_SIZE, -			SIRFSOC_GPIO_IRQ_START + i * SIRFSOC_GPIO_BANK_SIZE, 0, -			&sirfsoc_gpio_irq_simple_ops, bank); +		bank->domain = irq_domain_add_linear(np, SIRFSOC_GPIO_BANK_SIZE, +						&sirfsoc_gpio_irq_simple_ops, bank);  		if (!bank->domain) {  			pr_err("%s: Failed to create irqdomain\n", np->full_name); diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 8e96c00936b..14040b22888 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -29,9 +29,8 @@  #include <linux/uaccess.h>  #include <linux/io.h> -#include <mach/hardware.h>  #include <asm/irq.h> -#include <plat/regs-rtc.h> +#include "rtc-s3c.h"  enum s3c_cpu_type {  	TYPE_S3C2410, diff --git a/drivers/rtc/rtc-s3c.h b/drivers/rtc/rtc-s3c.h new file mode 100644 index 00000000000..004b61a8343 --- /dev/null +++ b/drivers/rtc/rtc-s3c.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> + *		      http://www.simtec.co.uk/products/SWLINUX/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * S3C2410 Internal RTC register definition +*/ + +#ifndef __ASM_ARCH_REGS_RTC_H +#define __ASM_ARCH_REGS_RTC_H __FILE__ + +#define S3C2410_RTCREG(x) (x) +#define S3C2410_INTP		S3C2410_RTCREG(0x30) +#define S3C2410_INTP_ALM	(1 << 1) +#define S3C2410_INTP_TIC	(1 << 0) + +#define S3C2410_RTCCON		S3C2410_RTCREG(0x40) +#define S3C2410_RTCCON_RTCEN	(1 << 0) +#define S3C2410_RTCCON_CNTSEL	(1 << 2) +#define S3C2410_RTCCON_CLKRST	(1 << 3) +#define S3C2443_RTCCON_TICSEL	(1 << 4) +#define S3C64XX_RTCCON_TICEN	(1 << 8) + +#define S3C2410_TICNT		S3C2410_RTCREG(0x44) +#define S3C2410_TICNT_ENABLE	(1 << 7) + +/* S3C2443: tick count is 15 bit wide + * TICNT[6:0] contains upper 7 bits + * TICNT1[7:0] contains lower 8 bits + */ +#define S3C2443_TICNT_PART(x)	((x & 0x7f00) >> 8) +#define S3C2443_TICNT1		S3C2410_RTCREG(0x4C) +#define S3C2443_TICNT1_PART(x)	(x & 0xff) + +/* S3C2416: tick count is 32 bit wide + * TICNT[6:0] contains bits [14:8] + * TICNT1[7:0] contains lower 8 bits + * TICNT2[16:0] contains upper 17 bits + */ +#define S3C2416_TICNT2		S3C2410_RTCREG(0x48) +#define S3C2416_TICNT2_PART(x)	((x & 0xffff8000) >> 15) + +#define S3C2410_RTCALM		S3C2410_RTCREG(0x50) +#define S3C2410_RTCALM_ALMEN	(1 << 6) +#define S3C2410_RTCALM_YEAREN	(1 << 5) +#define S3C2410_RTCALM_MONEN	(1 << 4) +#define S3C2410_RTCALM_DAYEN	(1 << 3) +#define S3C2410_RTCALM_HOUREN	(1 << 2) +#define S3C2410_RTCALM_MINEN	(1 << 1) +#define S3C2410_RTCALM_SECEN	(1 << 0) + +#define S3C2410_ALMSEC		S3C2410_RTCREG(0x54) +#define S3C2410_ALMMIN		S3C2410_RTCREG(0x58) +#define S3C2410_ALMHOUR		S3C2410_RTCREG(0x5c) + +#define S3C2410_ALMDATE		S3C2410_RTCREG(0x60) +#define S3C2410_ALMMON		S3C2410_RTCREG(0x64) +#define S3C2410_ALMYEAR		S3C2410_RTCREG(0x68) + +#define S3C2410_RTCSEC		S3C2410_RTCREG(0x70) +#define S3C2410_RTCMIN		S3C2410_RTCREG(0x74) +#define S3C2410_RTCHOUR		S3C2410_RTCREG(0x78) +#define S3C2410_RTCDATE		S3C2410_RTCREG(0x7c) +#define S3C2410_RTCMON		S3C2410_RTCREG(0x84) +#define S3C2410_RTCYEAR		S3C2410_RTCREG(0x88) + +#endif /* __ASM_ARCH_REGS_RTC_H */ diff --git a/drivers/staging/ste_rmi4/Makefile b/drivers/staging/ste_rmi4/Makefile index e4c03351420..6cce2ed187e 100644 --- a/drivers/staging/ste_rmi4/Makefile +++ b/drivers/staging/ste_rmi4/Makefile @@ -2,4 +2,3 @@  # Makefile for the RMI4 touchscreen driver.  #  obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o -obj-$(CONFIG_MACH_MOP500) += board-mop500-u8500uib-rmi4.o diff --git a/drivers/staging/ste_rmi4/board-mop500-u8500uib-rmi4.c b/drivers/staging/ste_rmi4/board-mop500-u8500uib-rmi4.c deleted file mode 100644 index 47439c3f725..00000000000 --- a/drivers/staging/ste_rmi4/board-mop500-u8500uib-rmi4.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Some platform data for the RMI4 touchscreen that will override the __weak - * platform data in the Ux500 machine if this driver is activated. - */ -#include <linux/i2c.h> -#include <linux/gpio.h> -#include <linux/interrupt.h> -#include <mach/irqs.h> -#include "synaptics_i2c_rmi4.h" - -/* - * Synaptics RMI4 touchscreen interface on the U8500 UIB - */ - -/* - * Descriptor structure. - * Describes the number of i2c devices on the bus that speak RMI. - */ -static struct synaptics_rmi4_platform_data rmi4_i2c_dev_platformdata = { -	.irq_number     = NOMADIK_GPIO_TO_IRQ(84), -	.irq_type       = (IRQF_TRIGGER_FALLING | IRQF_SHARED), -	.x_flip		= false, -	.y_flip		= true, -}; - -struct i2c_board_info __initdata mop500_i2c3_devices_u8500[] = { -	{ -		I2C_BOARD_INFO("synaptics_rmi4_i2c", 0x4B), -		.platform_data = &rmi4_i2c_dev_platformdata, -	}, -}; diff --git a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c index a126b25c82d..fe667dde43c 100644 --- a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c +++ b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c @@ -864,6 +864,16 @@ static int synaptics_rmi4_i2c_query_device(struct synaptics_rmi4_data *pdata)  	return 0;  } +/* + * Descriptor structure. + * Describes the number of i2c devices on the bus that speak RMI. + */ +static struct synaptics_rmi4_platform_data synaptics_rmi4_platformdata = { +	.irq_type       = (IRQF_TRIGGER_FALLING | IRQF_SHARED), +	.x_flip		= false, +	.y_flip		= true, +}; +  /**   * synaptics_rmi4_probe() - Initialze the i2c-client touchscreen driver   * @i2c: i2c client structure pointer @@ -890,10 +900,8 @@ static int synaptics_rmi4_probe  		return -EIO;  	} -	if (!platformdata) { -		dev_err(&client->dev, "%s: no platform data\n", __func__); -		return -EINVAL; -	} +	if (!platformdata) +		platformdata = &synaptics_rmi4_platformdata;  	/* Allocate and initialize the instance data for this client */  	rmi4_data = kcalloc(2, sizeof(struct synaptics_rmi4_data), @@ -977,13 +985,13 @@ static int synaptics_rmi4_probe  	synaptics_rmi4_i2c_block_read(rmi4_data,  			rmi4_data->fn01_data_base_addr + 1, intr_status,  				rmi4_data->number_of_interrupt_register); -	retval = request_threaded_irq(platformdata->irq_number, NULL, +	retval = request_threaded_irq(client->irq, NULL,  					synaptics_rmi4_irq,  					platformdata->irq_type,  					DRIVER_NAME, rmi4_data);  	if (retval) {  		dev_err(&client->dev, "%s:Unable to get attn irq %d\n", -				__func__, platformdata->irq_number); +				__func__, client->irq);  		goto err_query_dev;  	} @@ -996,7 +1004,7 @@ static int synaptics_rmi4_probe  	return retval;  err_free_irq: -	free_irq(platformdata->irq_number, rmi4_data); +	free_irq(client->irq, rmi4_data);  err_query_dev:  	regulator_disable(rmi4_data->regulator);  err_regulator_enable: @@ -1019,11 +1027,10 @@ err_input:  static int synaptics_rmi4_remove(struct i2c_client *client)  {  	struct synaptics_rmi4_data *rmi4_data = i2c_get_clientdata(client); -	const struct synaptics_rmi4_platform_data *pdata = rmi4_data->board;  	rmi4_data->touch_stopped = true;  	wake_up(&rmi4_data->wait); -	free_irq(pdata->irq_number, rmi4_data); +	free_irq(client->irq, rmi4_data);  	input_unregister_device(rmi4_data->input_dev);  	regulator_disable(rmi4_data->regulator);  	regulator_put(rmi4_data->regulator); @@ -1046,10 +1053,9 @@ static int synaptics_rmi4_suspend(struct device *dev)  	int retval;  	unsigned char intr_status;  	struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev); -	const struct synaptics_rmi4_platform_data *pdata = rmi4_data->board;  	rmi4_data->touch_stopped = true; -	disable_irq(pdata->irq_number); +	disable_irq(rmi4_data->i2c_client->irq);  	retval = synaptics_rmi4_i2c_block_read(rmi4_data,  				rmi4_data->fn01_data_base_addr + 1, @@ -1080,11 +1086,10 @@ static int synaptics_rmi4_resume(struct device *dev)  	int retval;  	unsigned char intr_status;  	struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev); -	const struct synaptics_rmi4_platform_data *pdata = rmi4_data->board;  	regulator_enable(rmi4_data->regulator); -	enable_irq(pdata->irq_number); +	enable_irq(rmi4_data->i2c_client->irq);  	rmi4_data->touch_stopped = false;  	retval = synaptics_rmi4_i2c_block_read(rmi4_data, diff --git a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.h b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.h index 384436ef806..8c9166ba71c 100644 --- a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.h +++ b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.h @@ -38,7 +38,6 @@   * This structure gives platform data for rmi4.   */  struct synaptics_rmi4_platform_data { -	int irq_number;  	int irq_type;  	bool x_flip;  	bool y_flip; diff --git a/drivers/thermal/exynos_thermal.c b/drivers/thermal/exynos_thermal.c index 46568c078de..b777ae6f0a8 100644 --- a/drivers/thermal/exynos_thermal.c +++ b/drivers/thermal/exynos_thermal.c @@ -39,8 +39,6 @@  #include <linux/cpu_cooling.h>  #include <linux/of.h> -#include <plat/cpu.h> -  /* Exynos generic registers */  #define EXYNOS_TMU_REG_TRIMINFO		0x0  #define EXYNOS_TMU_REG_CONTROL		0x20 |