diff options
Diffstat (limited to 'arch/arm/mach-msm')
| -rw-r--r-- | arch/arm/mach-msm/Kconfig | 7 | ||||
| -rw-r--r-- | arch/arm/mach-msm/board-halibut.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-msm/board-msm7x30.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-msm/board-qsd8x50.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-msm/board-trout.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-msm/devices-msm7x00.c | 31 | ||||
| -rw-r--r-- | arch/arm/mach-msm/devices-msm7x30.c | 31 | ||||
| -rw-r--r-- | arch/arm/mach-msm/devices-qsd8x50.c | 31 | ||||
| -rw-r--r-- | arch/arm/mach-msm/devices.h | 4 | ||||
| -rw-r--r-- | arch/arm/mach-msm/dma.c | 26 | ||||
| -rw-r--r-- | arch/arm/mach-msm/hotplug.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-msm/include/mach/cpu.h | 54 | ||||
| -rw-r--r-- | arch/arm/mach-msm/include/mach/dma.h | 26 | ||||
| -rw-r--r-- | arch/arm/mach-msm/include/mach/uncompress.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-msm/last_radio_log.c | 20 | ||||
| -rw-r--r-- | arch/arm/mach-msm/platsmp.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-msm/timer.c | 110 | 
17 files changed, 185 insertions, 173 deletions
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index b61908594b4..fceb093b949 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -44,10 +44,10 @@ endchoice  config ARCH_MSM8X60  	bool "MSM8X60" -	select ARCH_MSM_SCORPIONMP  	select ARM_GIC  	select CPU_V7  	select GPIO_MSM_V2 +	select HAVE_SMP  	select MSM_GPIOMUX  	select MSM_SCM if SMP  	select MSM_V2_TLMM @@ -55,9 +55,9 @@ config ARCH_MSM8X60  config ARCH_MSM8960  	bool "MSM8960" -	select ARCH_MSM_SCORPIONMP  	select ARM_GIC  	select CPU_V7 +	select HAVE_SMP  	select MSM_GPIOMUX  	select MSM_SCM if SMP  	select MSM_V2_TLMM @@ -68,9 +68,6 @@ config MSM_HAS_DEBUG_UART_HS  config MSM_SOC_REV_A  	bool -config  ARCH_MSM_SCORPIONMP -	bool -	select HAVE_SMP  config  ARCH_MSM_ARM11  	bool diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index 84d720af34a..82eaf88d202 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c @@ -59,6 +59,7 @@ static struct platform_device smc91x_device = {  };  static struct platform_device *devices[] __initdata = { +	&msm_device_gpio_7201,  	&msm_device_uart3,  	&msm_device_smd,  	&msm_device_nand, diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 7bc3f82e3ec..520c141acd0 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c @@ -89,6 +89,7 @@ struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {  };  static struct platform_device *devices[] __initdata = { +	&msm_device_gpio_7x30,  #if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER)          &msm_device_uart2,  #endif diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index 686e7949a73..38a532d6937 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c @@ -89,6 +89,7 @@ static struct msm_otg_platform_data msm_otg_pdata = {  };  static struct platform_device *devices[] __initdata = { +	&msm_device_gpio_8x50,  	&msm_device_uart3,  	&msm_device_smd,  	&msm_device_otg, diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c index 919bfa32871..80fe1c5ff5c 100644 --- a/arch/arm/mach-msm/board-trout.c +++ b/arch/arm/mach-msm/board-trout.c @@ -36,6 +36,7 @@  extern int trout_init_mmc(unsigned int);  static struct platform_device *devices[] __initdata = { +	&msm_device_gpio_7201,  	&msm_device_uart3,  	&msm_device_smd,  	&msm_device_nand, diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c index f66ee6ea872..1a0a2306b11 100644 --- a/arch/arm/mach-msm/devices-msm7x00.c +++ b/arch/arm/mach-msm/devices-msm7x00.c @@ -29,6 +29,37 @@  #include "clock-pcom.h"  #include <linux/platform_data/mmc-msm_sdcc.h> +static struct resource msm_gpio_resources[] = { +	{ +		.start	= 32 + 0, +		.end	= 32 + 0, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 32 + 1, +		.end	= 32 + 1, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 0xa9200800, +		.end	= 0xa9200800 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio1" +	}, +	{ +		.start	= 0xa9300C00, +		.end	= 0xa9300C00 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio2" +	}, +}; + +struct platform_device msm_device_gpio_7201 = { +	.name	= "gpio-msm-7201", +	.num_resources	= ARRAY_SIZE(msm_gpio_resources), +	.resource	= msm_gpio_resources, +}; +  static struct resource resources_uart1[] = {  	{  		.start	= INT_UART1, diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c index e90ab5938c5..12f482c0774 100644 --- a/arch/arm/mach-msm/devices-msm7x30.c +++ b/arch/arm/mach-msm/devices-msm7x30.c @@ -33,6 +33,37 @@  #include <linux/platform_data/mmc-msm_sdcc.h> +static struct resource msm_gpio_resources[] = { +	{ +		.start	= 32 + 18, +		.end	= 32 + 18, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 32 + 19, +		.end	= 32 + 19, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 0xac001000, +		.end	= 0xac001000 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio1" +	}, +	{ +		.start	= 0xac101400, +		.end	= 0xac101400 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio2" +	}, +}; + +struct platform_device msm_device_gpio_7x30 = { +	.name	= "gpio-msm-7x30", +	.num_resources	= ARRAY_SIZE(msm_gpio_resources), +	.resource	= msm_gpio_resources, +}; +  static struct resource resources_uart2[] = {  	{  		.start	= INT_UART2, diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c index 4db61d5fe31..2e1b3ec9dfc 100644 --- a/arch/arm/mach-msm/devices-qsd8x50.c +++ b/arch/arm/mach-msm/devices-qsd8x50.c @@ -30,6 +30,37 @@  #include <linux/platform_data/mmc-msm_sdcc.h>  #include "clock-pcom.h" +static struct resource msm_gpio_resources[] = { +	{ +		.start	= 64 + 165 + 9, +		.end	= 64 + 165 + 9, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 64 + 165 + 10, +		.end	= 64 + 165 + 10, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= 0xa9000800, +		.end	= 0xa9000800 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio1" +	}, +	{ +		.start	= 0xa9100C00, +		.end	= 0xa9100C00 + SZ_4K - 1, +		.flags	= IORESOURCE_MEM, +		.name  = "gpio2" +	}, +}; + +struct platform_device msm_device_gpio_8x50 = { +	.name	= "gpio-msm-8x50", +	.num_resources	= ARRAY_SIZE(msm_gpio_resources), +	.resource	= msm_gpio_resources, +}; +  static struct resource resources_uart3[] = {  	{  		.start	= INT_UART3, diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h index 9545c196c6e..da902cf5116 100644 --- a/arch/arm/mach-msm/devices.h +++ b/arch/arm/mach-msm/devices.h @@ -20,6 +20,10 @@  #include "clock.h" +extern struct platform_device msm_device_gpio_7201; +extern struct platform_device msm_device_gpio_7x30; +extern struct platform_device msm_device_gpio_8x50; +  extern struct platform_device msm_device_uart1;  extern struct platform_device msm_device_uart2;  extern struct platform_device msm_device_uart3; diff --git a/arch/arm/mach-msm/dma.c b/arch/arm/mach-msm/dma.c index 354b91d4c3a..b279fd8a31b 100644 --- a/arch/arm/mach-msm/dma.c +++ b/arch/arm/mach-msm/dma.c @@ -19,9 +19,35 @@  #include <linux/interrupt.h>  #include <linux/completion.h>  #include <mach/dma.h> +#include <mach/msm_iomap.h>  #define MSM_DMOV_CHANNEL_COUNT 16 +#define DMOV_SD0(off, ch) (MSM_DMOV_BASE + 0x0000 + (off) + ((ch) << 2)) +#define DMOV_SD1(off, ch) (MSM_DMOV_BASE + 0x0400 + (off) + ((ch) << 2)) +#define DMOV_SD2(off, ch) (MSM_DMOV_BASE + 0x0800 + (off) + ((ch) << 2)) +#define DMOV_SD3(off, ch) (MSM_DMOV_BASE + 0x0C00 + (off) + ((ch) << 2)) + +#if defined(CONFIG_ARCH_MSM7X30) +#define DMOV_SD_AARM DMOV_SD2 +#else +#define DMOV_SD_AARM DMOV_SD3 +#endif + +#define DMOV_CMD_PTR(ch)      DMOV_SD_AARM(0x000, ch) +#define DMOV_RSLT(ch)         DMOV_SD_AARM(0x040, ch) +#define DMOV_FLUSH0(ch)       DMOV_SD_AARM(0x080, ch) +#define DMOV_FLUSH1(ch)       DMOV_SD_AARM(0x0C0, ch) +#define DMOV_FLUSH2(ch)       DMOV_SD_AARM(0x100, ch) +#define DMOV_FLUSH3(ch)       DMOV_SD_AARM(0x140, ch) +#define DMOV_FLUSH4(ch)       DMOV_SD_AARM(0x180, ch) +#define DMOV_FLUSH5(ch)       DMOV_SD_AARM(0x1C0, ch) + +#define DMOV_STATUS(ch)       DMOV_SD_AARM(0x200, ch) +#define DMOV_ISR              DMOV_SD_AARM(0x380, 0) + +#define DMOV_CONFIG(ch)       DMOV_SD_AARM(0x300, ch) +  enum {  	MSM_DMOV_PRINT_ERRORS = 1,  	MSM_DMOV_PRINT_IO = 2, diff --git a/arch/arm/mach-msm/hotplug.c b/arch/arm/mach-msm/hotplug.c index 750446feb44..326a87261f9 100644 --- a/arch/arm/mach-msm/hotplug.c +++ b/arch/arm/mach-msm/hotplug.c @@ -10,16 +10,12 @@  #include <linux/errno.h>  #include <linux/smp.h> -#include <asm/cacheflush.h>  #include <asm/smp_plat.h>  #include "common.h"  static inline void cpu_enter_lowpower(void)  { -	/* Just flush the cache. Changing the coherency is not yet -	 * available on msm. */ -	flush_cache_all();  }  static inline void cpu_leave_lowpower(void) diff --git a/arch/arm/mach-msm/include/mach/cpu.h b/arch/arm/mach-msm/include/mach/cpu.h deleted file mode 100644 index a9481b08d5c..00000000000 --- a/arch/arm/mach-msm/include/mach/cpu.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2011, Code Aurora Forum. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#ifndef __ARCH_ARM_MACH_MSM_CPU_H__ -#define __ARCH_ARM_MACH_MSM_CPU_H__ - -/* TODO: For now, only one CPU can be compiled at a time. */ - -#define cpu_is_msm7x01()	0 -#define cpu_is_msm7x30()	0 -#define cpu_is_qsd8x50()	0 -#define cpu_is_msm8x60()	0 -#define cpu_is_msm8960()	0 - -#ifdef CONFIG_ARCH_MSM7X00A -# undef cpu_is_msm7x01 -# define cpu_is_msm7x01()	1 -#endif - -#ifdef CONFIG_ARCH_MSM7X30 -# undef cpu_is_msm7x30 -# define cpu_is_msm7x30()	1 -#endif - -#ifdef CONFIG_ARCH_QSD8X50 -# undef cpu_is_qsd8x50 -# define cpu_is_qsd8x50()	1 -#endif - -#ifdef CONFIG_ARCH_MSM8X60 -# undef cpu_is_msm8x60 -# define cpu_is_msm8x60()	1 -#endif - -#ifdef CONFIG_ARCH_MSM8960 -# undef cpu_is_msm8960 -# define cpu_is_msm8960()	1 -#endif - -#endif diff --git a/arch/arm/mach-msm/include/mach/dma.h b/arch/arm/mach-msm/include/mach/dma.h index 05583f56952..a72d48d4234 100644 --- a/arch/arm/mach-msm/include/mach/dma.h +++ b/arch/arm/mach-msm/include/mach/dma.h @@ -16,7 +16,6 @@  #ifndef __ASM_ARCH_MSM_DMA_H  #include <linux/list.h> -#include <mach/msm_iomap.h>  struct msm_dmov_errdata {  	uint32_t flush[6]; @@ -45,48 +44,23 @@ static inline  int msm_dmov_exec_cmd(unsigned id, unsigned int cmdptr) { return -EIO; }  #endif - -#define DMOV_SD0(off, ch) (MSM_DMOV_BASE + 0x0000 + (off) + ((ch) << 2)) -#define DMOV_SD1(off, ch) (MSM_DMOV_BASE + 0x0400 + (off) + ((ch) << 2)) -#define DMOV_SD2(off, ch) (MSM_DMOV_BASE + 0x0800 + (off) + ((ch) << 2)) -#define DMOV_SD3(off, ch) (MSM_DMOV_BASE + 0x0C00 + (off) + ((ch) << 2)) - -#if defined(CONFIG_ARCH_MSM7X30) -#define DMOV_SD_AARM DMOV_SD2 -#else -#define DMOV_SD_AARM DMOV_SD3 -#endif - -#define DMOV_CMD_PTR(ch)      DMOV_SD_AARM(0x000, ch)  #define DMOV_CMD_LIST         (0 << 29) /* does not work */  #define DMOV_CMD_PTR_LIST     (1 << 29) /* works */  #define DMOV_CMD_INPUT_CFG    (2 << 29) /* untested */  #define DMOV_CMD_OUTPUT_CFG   (3 << 29) /* untested */  #define DMOV_CMD_ADDR(addr)   ((addr) >> 3) -#define DMOV_RSLT(ch)         DMOV_SD_AARM(0x040, ch)  #define DMOV_RSLT_VALID       (1 << 31) /* 0 == host has empties result fifo */  #define DMOV_RSLT_ERROR       (1 << 3)  #define DMOV_RSLT_FLUSH       (1 << 2)  #define DMOV_RSLT_DONE        (1 << 1)  /* top pointer done */  #define DMOV_RSLT_USER        (1 << 0)  /* command with FR force result */ -#define DMOV_FLUSH0(ch)       DMOV_SD_AARM(0x080, ch) -#define DMOV_FLUSH1(ch)       DMOV_SD_AARM(0x0C0, ch) -#define DMOV_FLUSH2(ch)       DMOV_SD_AARM(0x100, ch) -#define DMOV_FLUSH3(ch)       DMOV_SD_AARM(0x140, ch) -#define DMOV_FLUSH4(ch)       DMOV_SD_AARM(0x180, ch) -#define DMOV_FLUSH5(ch)       DMOV_SD_AARM(0x1C0, ch) - -#define DMOV_STATUS(ch)       DMOV_SD_AARM(0x200, ch)  #define DMOV_STATUS_RSLT_COUNT(n)    (((n) >> 29))  #define DMOV_STATUS_CMD_COUNT(n)     (((n) >> 27) & 3)  #define DMOV_STATUS_RSLT_VALID       (1 << 1)  #define DMOV_STATUS_CMD_PTR_RDY      (1 << 0) -#define DMOV_ISR              DMOV_SD_AARM(0x380, 0) -   -#define DMOV_CONFIG(ch)       DMOV_SD_AARM(0x300, ch)  #define DMOV_CONFIG_FORCE_TOP_PTR_RSLT (1 << 2)  #define DMOV_CONFIG_FORCE_FLUSH_RSLT   (1 << 1)  #define DMOV_CONFIG_IRQ_EN             (1 << 0) diff --git a/arch/arm/mach-msm/include/mach/uncompress.h b/arch/arm/mach-msm/include/mach/uncompress.h index fa97a10d869..94324870fb0 100644 --- a/arch/arm/mach-msm/include/mach/uncompress.h +++ b/arch/arm/mach-msm/include/mach/uncompress.h @@ -37,7 +37,7 @@ static void putc(int c)  	 * Wait for TX_READY to be set; but skip it if we have a  	 * TX underrun.  	 */ -	if (UART_DM_SR & 0x08) +	if (!(UART_DM_SR & 0x08))  		while (!(UART_DM_ISR & 0x80))  			cpu_relax(); diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c index 1e243f46a96..7777767ee89 100644 --- a/arch/arm/mach-msm/last_radio_log.c +++ b/arch/arm/mach-msm/last_radio_log.c @@ -31,20 +31,8 @@ extern void *smem_item(unsigned id, unsigned *size);  static ssize_t last_radio_log_read(struct file *file, char __user *buf,  			size_t len, loff_t *offset)  { -	loff_t pos = *offset; -	ssize_t count; - -	if (pos >= radio_log_size) -		return 0; - -	count = min(len, (size_t)(radio_log_size - pos)); -	if (copy_to_user(buf, radio_log_base + pos, count)) { -		pr_err("%s: copy to user failed\n", __func__); -		return -EFAULT; -	} - -	*offset += count; -	return count; +	return simple_read_from_buffer(buf, len, offset, +				radio_log_base, radio_log_size);  }  static struct file_operations last_radio_log_fops = { @@ -67,7 +55,8 @@ void msm_init_last_radio_log(struct module *owner)  		return;  	} -	entry = create_proc_entry("last_radio_log", S_IFREG | S_IRUGO, NULL); +	entry = proc_create("last_radio_log", S_IRUGO, NULL, +				&last_radio_log_fops);  	if (!entry) {  		pr_err("%s: could not create proc entry for radio log\n",  				__func__); @@ -77,7 +66,6 @@ void msm_init_last_radio_log(struct module *owner)  	pr_err("%s: last radio log is %d bytes long\n", __func__,  		radio_log_size);  	last_radio_log_fops.owner = owner; -	entry->proc_fops = &last_radio_log_fops;  	entry->size = radio_log_size;  }  EXPORT_SYMBOL(msm_init_last_radio_log); diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index 42932865416..00cdb0a5dac 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c @@ -15,7 +15,6 @@  #include <linux/jiffies.h>  #include <linux/smp.h>  #include <linux/io.h> -#include <linux/irqchip/arm-gic.h>  #include <asm/cacheflush.h>  #include <asm/cputype.h> @@ -42,13 +41,6 @@ static inline int get_core_count(void)  static void __cpuinit msm_secondary_init(unsigned int cpu)  {  	/* -	 * if any interrupts are already enabled for the primary -	 * core (e.g. timer irq), then they will not have been enabled -	 * for us: do so -	 */ -	gic_secondary_init(0); - -	/*  	 * let the primary processor know we're out of the  	 * pen, then head off into the C entry point  	 */ diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c index f9fd77e8f1f..284313f3e02 100644 --- a/arch/arm/mach-msm/timer.c +++ b/arch/arm/mach-msm/timer.c @@ -30,19 +30,22 @@  #include "common.h" -#define TIMER_MATCH_VAL         0x0000 -#define TIMER_COUNT_VAL         0x0004 -#define TIMER_ENABLE            0x0008 -#define TIMER_ENABLE_CLR_ON_MATCH_EN    BIT(1) -#define TIMER_ENABLE_EN                 BIT(0) -#define TIMER_CLEAR             0x000C -#define DGT_CLK_CTL_DIV_4	0x3 +#define TIMER_MATCH_VAL			0x0000 +#define TIMER_COUNT_VAL			0x0004 +#define TIMER_ENABLE			0x0008 +#define TIMER_ENABLE_CLR_ON_MATCH_EN	BIT(1) +#define TIMER_ENABLE_EN			BIT(0) +#define TIMER_CLEAR			0x000C +#define DGT_CLK_CTL			0x10 +#define DGT_CLK_CTL_DIV_4		0x3 +#define TIMER_STS_GPT0_CLR_PEND		BIT(10)  #define GPT_HZ 32768  #define MSM_DGT_SHIFT 5  static void __iomem *event_base; +static void __iomem *sts_base;  static irqreturn_t msm_timer_interrupt(int irq, void *dev_id)  { @@ -67,6 +70,11 @@ static int msm_timer_set_next_event(unsigned long cycles,  	writel_relaxed(ctrl, event_base + TIMER_CLEAR);  	writel_relaxed(cycles, event_base + TIMER_MATCH_VAL); + +	if (sts_base) +		while (readl_relaxed(sts_base) & TIMER_STS_GPT0_CLR_PEND) +			cpu_relax(); +  	writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);  	return 0;  } @@ -137,9 +145,6 @@ static int __cpuinit msm_local_timer_setup(struct clock_event_device *evt)  	if (!smp_processor_id())  		return 0; -	writel_relaxed(0, event_base + TIMER_ENABLE); -	writel_relaxed(0, event_base + TIMER_CLEAR); -	writel_relaxed(~0, event_base + TIMER_MATCH_VAL);  	evt->irq = msm_clockevent.irq;  	evt->name = "local_timer";  	evt->features = msm_clockevent.features; @@ -177,9 +182,6 @@ static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq,  	struct clocksource *cs = &msm_clocksource;  	int res; -	writel_relaxed(0, event_base + TIMER_ENABLE); -	writel_relaxed(0, event_base + TIMER_CLEAR); -	writel_relaxed(~0, event_base + TIMER_MATCH_VAL);  	ce->cpumask = cpumask_of(0);  	ce->irq = irq; @@ -217,13 +219,9 @@ err:  }  #ifdef CONFIG_OF -static const struct of_device_id msm_dgt_match[] __initconst = { -	{ .compatible = "qcom,msm-dgt" }, -	{ }, -}; - -static const struct of_device_id msm_gpt_match[] __initconst = { -	{ .compatible = "qcom,msm-gpt" }, +static const struct of_device_id msm_timer_match[] __initconst = { +	{ .compatible = "qcom,kpss-timer" }, +	{ .compatible = "qcom,scss-timer" },  	{ },  }; @@ -234,33 +232,29 @@ void __init msm_dt_timer_init(void)  	int irq;  	struct resource res;  	u32 percpu_offset; -	void __iomem *dgt_clk_ctl; +	void __iomem *base; +	void __iomem *cpu0_base; -	np = of_find_matching_node(NULL, msm_gpt_match); +	np = of_find_matching_node(NULL, msm_timer_match);  	if (!np) { -		pr_err("Can't find GPT DT node\n"); +		pr_err("Can't find msm timer DT node\n");  		return;  	} -	event_base = of_iomap(np, 0); -	if (!event_base) { +	base = of_iomap(np, 0); +	if (!base) {  		pr_err("Failed to map event base\n");  		return;  	} -	irq = irq_of_parse_and_map(np, 0); +	/* We use GPT0 for the clockevent */ +	irq = irq_of_parse_and_map(np, 1);  	if (irq <= 0) {  		pr_err("Can't get irq\n");  		return;  	} -	of_node_put(np); - -	np = of_find_matching_node(NULL, msm_dgt_match); -	if (!np) { -		pr_err("Can't find DGT DT node\n"); -		return; -	} +	/* We use CPU0's DGT for the clocksource */  	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))  		percpu_offset = 0; @@ -269,45 +263,43 @@ void __init msm_dt_timer_init(void)  		return;  	} -	source_base = ioremap(res.start + percpu_offset, resource_size(&res)); -	if (!source_base) { +	cpu0_base = ioremap(res.start + percpu_offset, resource_size(&res)); +	if (!cpu0_base) {  		pr_err("Failed to map source base\n");  		return;  	} -	if (!of_address_to_resource(np, 1, &res)) { -		dgt_clk_ctl = ioremap(res.start + percpu_offset, -				      resource_size(&res)); -		if (!dgt_clk_ctl) { -			pr_err("Failed to map DGT control base\n"); -			return; -		} -		writel_relaxed(DGT_CLK_CTL_DIV_4, dgt_clk_ctl); -		iounmap(dgt_clk_ctl); -	} -  	if (of_property_read_u32(np, "clock-frequency", &freq)) {  		pr_err("Unknown frequency\n");  		return;  	}  	of_node_put(np); +	event_base = base + 0x4; +	sts_base = base + 0x88; +	source_base = cpu0_base + 0x24; +	freq /= 4; +	writel_relaxed(DGT_CLK_CTL_DIV_4, source_base + DGT_CLK_CTL); +  	msm_timer_init(freq, 32, irq, !!percpu_offset);  }  #endif -static int __init msm_timer_map(phys_addr_t event, phys_addr_t source) +static int __init msm_timer_map(phys_addr_t addr, u32 event, u32 source, +				u32 sts)  { -	event_base = ioremap(event, SZ_64); -	if (!event_base) { -		pr_err("Failed to map event base\n"); -		return 1; -	} -	source_base = ioremap(source, SZ_64); -	if (!source_base) { -		pr_err("Failed to map source base\n"); -		return 1; +	void __iomem *base; + +	base = ioremap(addr, SZ_256); +	if (!base) { +		pr_err("Failed to map timer base\n"); +		return -ENOMEM;  	} +	event_base = base + event; +	source_base = base + source; +	if (sts) +		sts_base = base + sts; +  	return 0;  } @@ -315,7 +307,7 @@ void __init msm7x01_timer_init(void)  {  	struct clocksource *cs = &msm_clocksource; -	if (msm_timer_map(0xc0100000, 0xc0100010)) +	if (msm_timer_map(0xc0100000, 0x0, 0x10, 0x0))  		return;  	cs->read = msm_read_timer_count_shift;  	cs->mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT)); @@ -326,14 +318,14 @@ void __init msm7x01_timer_init(void)  void __init msm7x30_timer_init(void)  { -	if (msm_timer_map(0xc0100004, 0xc0100024)) +	if (msm_timer_map(0xc0100000, 0x4, 0x24, 0x80))  		return;  	msm_timer_init(24576000 / 4, 32, 1, false);  }  void __init qsd8x50_timer_init(void)  { -	if (msm_timer_map(0xAC100000, 0xAC100010)) +	if (msm_timer_map(0xAC100000, 0x0, 0x10, 0x34))  		return;  	msm_timer_init(19200000 / 4, 32, 7, false);  }  |