diff options
90 files changed, 988 insertions, 848 deletions
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index d6ac18d04da..ecd0bb664da 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h @@ -94,6 +94,6 @@ extern int ocpi_enable(void);  static inline int ocpi_enable(void) { return 0; }  #endif -extern int omap1_get_reset_sources(void); +extern u32 omap1_get_reset_sources(void);  #endif /* __ARCH_ARM_MACH_OMAP1_COMMON_H */ diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 645668e2b1d..745031870ce 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -17,6 +17,8 @@  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/platform_data/omap-wd-timer.h> +  #include <asm/mach/map.h>  #include <mach/tc.h> @@ -448,18 +450,31 @@ static struct resource wdt_resources[] = {  };  static struct platform_device omap_wdt_device = { -	.name	   = "omap_wdt", -	.id	     = -1, +	.name		= "omap_wdt", +	.id		= -1,  	.num_resources	= ARRAY_SIZE(wdt_resources),  	.resource	= wdt_resources,  };  static int __init omap_init_wdt(void)  { +	struct omap_wd_timer_platform_data pdata; +	int ret; +  	if (!cpu_is_omap16xx())  		return -ENODEV; -	return platform_device_register(&omap_wdt_device); +	pdata.read_reset_sources = omap1_get_reset_sources; + +	ret = platform_device_register(&omap_wdt_device); +	if (!ret) { +		ret = platform_device_add_data(&omap_wdt_device, &pdata, +					       sizeof(pdata)); +		if (ret) +			platform_device_del(&omap_wdt_device); +	} + +	return ret;  }  subsys_initcall(omap_init_wdt);  #endif diff --git a/arch/arm/mach-omap1/reset.c b/arch/arm/mach-omap1/reset.c index a0a9f97772e..5eebd7e889d 100644 --- a/arch/arm/mach-omap1/reset.c +++ b/arch/arm/mach-omap1/reset.c @@ -4,10 +4,9 @@  #include <linux/kernel.h>  #include <linux/io.h> -#include <plat/prcm.h> -  #include <mach/hardware.h> +#include "iomap.h"  #include "common.h"  /* ARM_SYSST bit shifts related to SoC reset sources */ @@ -43,12 +42,12 @@ void omap1_restart(char mode, const char *cmd)   * Returns bits that represent the last reset source for the SoC.  The   * format is standardized across OMAPs for use by the OMAP watchdog.   */ -int omap1_get_reset_sources(void) +u32 omap1_get_reset_sources(void)  { -	int ret = 0; +	u32 ret = 0;  	u16 rs; -	rs = __raw_readw(ARM_SYSST); +	rs = __raw_readw(OMAP1_IO_ADDRESS(ARM_SYSST));  	if (rs & (1 << ARM_SYSST_POR_SHIFT))  		ret |= 1 << OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT; diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index ae87a3ea53a..96621a20413 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -50,6 +50,11 @@ AFLAGS_sram242x.o			:=-Wa,-march=armv6  AFLAGS_sram243x.o			:=-Wa,-march=armv6  AFLAGS_sram34xx.o			:=-Wa,-march=armv7-a +# Restart code (OMAP4/5 currently in omap4-common.c) +obj-$(CONFIG_SOC_OMAP2420)		+= omap2-restart.o +obj-$(CONFIG_SOC_OMAP2430)		+= omap2-restart.o +obj-$(CONFIG_ARCH_OMAP3)		+= omap3-restart.o +  # Pin multiplexing  obj-$(CONFIG_SOC_OMAP2420)		+= mux2420.o  obj-$(CONFIG_SOC_OMAP2430)		+= mux2430.o @@ -94,7 +99,7 @@ obj-$(CONFIG_ARCH_OMAP4)                += cpuidle44xx.o  endif  # PRCM -obj-y					+= prcm.o prm_common.o cm_common.o +obj-y					+= prm_common.o cm_common.o  obj-$(CONFIG_ARCH_OMAP2)		+= prm2xxx_3xxx.o prm2xxx.o cm2xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= prm2xxx_3xxx.o prm3xxx.o cm3xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= vc3xxx_data.o vp3xxx_data.o diff --git a/arch/arm/mach-omap2/am33xx.h b/arch/arm/mach-omap2/am33xx.h index 06c19bb7bca..43296c1af9e 100644 --- a/arch/arm/mach-omap2/am33xx.h +++ b/arch/arm/mach-omap2/am33xx.h @@ -21,5 +21,6 @@  #define AM33XX_SCM_BASE		0x44E10000  #define AM33XX_CTRL_BASE	AM33XX_SCM_BASE  #define AM33XX_PRCM_BASE	0x44E00000 +#define AM33XX_TAP_BASE		(AM33XX_CTRL_BASE + 0x3FC)  #endif /* __ASM_ARCH_AM33XX_H */ diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 3fc6d839fb3..acb0a524ff7 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -286,5 +286,5 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")  	.init_machine	= omap_2430sdp_init,  	.init_late	= omap2430_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 79fd9048fd7..6601754f951 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c @@ -597,5 +597,5 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")  	.init_machine	= omap_3430sdp_init,  	.init_late	= omap3430_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index 81871b1c735..050aaa77125 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c @@ -212,5 +212,5 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")  	.init_machine	= omap_sdp_init,  	.init_late	= omap3630_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index fd80d976872..85dfa71e0dc 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c @@ -881,5 +881,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")  	.init_machine	= omap_4430sdp_init,  	.init_late	= omap4430_init_late,  	.timer		= &omap4_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 603503c587b..51b96a1206d 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c @@ -93,5 +93,5 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")  	.init_machine	= am3517_crane_init,  	.init_late	= am35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 96d6c5ab5d4..4be58fd071f 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c @@ -393,5 +393,5 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")  	.init_machine	= am3517_evm_init,  	.init_late	= am35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 64cf1bde0f3..5d0a61f5416 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -338,5 +338,5 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")  	.init_machine	= omap_apollon_init,  	.init_late	= omap2420_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index cf9449bde18..488f86fd0e7 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c @@ -753,18 +753,18 @@ MACHINE_START(CM_T35, "Compulab CM-T35")  	.init_machine	= cm_t35_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  MACHINE_START(CM_T3730, "Compulab CM-T3730") -	.atag_offset    = 0x100, -	.reserve        = omap_reserve, -	.map_io         = omap3_map_io, -	.init_early     = omap3630_init_early, -	.init_irq       = omap3_init_irq, +	.atag_offset	= 0x100, +	.reserve	= omap_reserve, +	.map_io		= omap3_map_io, +	.init_early	= omap3630_init_early, +	.init_irq	= omap3_init_irq,  	.handle_irq	= omap3_intc_handle_irq, -	.init_machine   = cm_t3730_init, +	.init_machine	= cm_t3730_init,  	.init_late     = omap3630_init_late, -	.timer          = &omap3_timer, -	.restart	= omap_prcm_restart, +	.timer		= &omap3_timer, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 278664731d2..699caec8f9e 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c @@ -298,5 +298,5 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")  	.init_machine	= cm_t3517_init,  	.init_late	= am35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 933479e3673..7667eb74952 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c @@ -643,5 +643,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")  	.init_machine	= devkit8000_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_secure_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 601ecdfb1cf..475e14f0721 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -57,7 +57,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap242x_boards_compat, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END  #endif @@ -76,7 +76,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap2_timer,  	.dt_compat	= omap243x_boards_compat, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END  #endif @@ -95,7 +95,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap3_timer,  	.dt_compat	= omap3_boards_compat, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  #endif @@ -134,7 +134,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")  	.init_late	= omap4430_init_late,  	.timer		= &omap4_timer,  	.dt_compat	= omap4_boards_compat, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END  #endif @@ -154,6 +154,6 @@ DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")  	.init_machine	= omap_generic_init,  	.timer		= &omap5_timer,  	.dt_compat	= omap5_boards_compat, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END  #endif diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index bd11b0aa949..3c1e458f68a 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -386,5 +386,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board")  	.init_machine	= omap_h4_init,  	.init_late	= omap2420_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index dbc705ac433..cea5d529262 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c @@ -651,7 +651,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board")  	.init_machine	= igep_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  MACHINE_START(IGEP0030, "IGEP OMAP3 module") @@ -664,5 +664,5 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module")  	.init_machine	= igep_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 1164b106103..0869f4f3d3e 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c @@ -436,5 +436,5 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")  	.init_machine	= omap_ldp_init,  	.init_late	= omap3430_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index e3efcb88cb3..a4e167c55c1 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -690,7 +690,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800")  	.init_machine	= n8x0_init_machine,  	.init_late	= omap2420_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END  MACHINE_START(NOKIA_N810, "Nokia N810") @@ -703,7 +703,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810")  	.init_machine	= n8x0_init_machine,  	.init_late	= omap2420_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END  MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") @@ -716,5 +716,5 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")  	.init_machine	= n8x0_init_machine,  	.init_late	= omap2420_init_late,  	.timer		= &omap2_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap2xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 85c09a09c5e..8471c279ecd 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -541,5 +541,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")  	.init_machine	= omap3_beagle_init,  	.init_late	= omap3_init_late,  	.timer		= &omap3_secure_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 3c0b9a90f3b..54647d6286b 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -757,5 +757,5 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM")  	.init_machine	= omap3_evm_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index e84e2a87537..2a065ba6eb5 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c @@ -232,7 +232,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")  	.init_machine	= omap3logic_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") @@ -245,5 +245,5 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")  	.init_machine	= omap3logic_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index ce31bd329f3..a53a6683c1b 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c @@ -619,5 +619,5 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")  	.init_machine	= omap3pandora_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index ba1124538b9..d8638b3b4f9 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c @@ -427,5 +427,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER")  	.init_machine		= omap3_stalker_init,  	.init_late		= omap35xx_init_late,  	.timer			= &omap3_secure_timer, -	.restart		= omap_prcm_restart, +	.restart		= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index a225d819633..263cb9cfbf3 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c @@ -387,5 +387,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")  	.init_machine	= omap3_touchbook_init,  	.init_late	= omap3430_init_late,  	.timer		= &omap3_secure_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 8c00b99cd2a..12a3a24d5bb 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -524,5 +524,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")  	.init_machine	= omap4_panda_init,  	.init_late	= omap4430_init_late,  	.timer		= &omap4_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 1cfb0374f5e..140b73094af 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c @@ -553,5 +553,5 @@ MACHINE_START(OVERO, "Gumstix Overo")  	.init_machine	= overo_init,  	.init_late	= omap35xx_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 1997e0e722a..cbcb1b2dc31 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c @@ -148,7 +148,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")  	.init_machine	= rm680_init,  	.init_late	= omap3630_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  MACHINE_START(NOKIA_RM696, "Nokia RM-696 board") @@ -161,5 +161,5 @@ MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")  	.init_machine	= rm680_init,  	.init_late	= omap3630_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index c388aec1479..bf8f74b0ce3 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c @@ -127,5 +127,5 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")  	.init_machine	= rx51_init,  	.init_late	= omap3430_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index 5e672c2b6a4..1a3e056d63a 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c @@ -46,7 +46,7 @@ MACHINE_START(TI8168EVM, "ti8168evm")  	.timer		= &omap3_timer,  	.init_machine	= ti81xx_evm_init,  	.init_late	= ti81xx_init_late, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END  MACHINE_START(TI8148EVM, "ti8148evm") @@ -58,5 +58,5 @@ MACHINE_START(TI8148EVM, "ti8148evm")  	.timer		= &omap3_timer,  	.init_machine	= ti81xx_evm_init,  	.init_late	= ti81xx_init_late, -	.restart	= omap_prcm_restart, +	.restart	= omap44xx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 8feb4d99b96..d7fa31e6723 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c @@ -138,7 +138,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")  	.init_machine	= omap_zoom_init,  	.init_late	= omap3430_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END  MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") @@ -151,5 +151,5 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")  	.init_machine	= omap_zoom_init,  	.init_late	= omap3630_init_late,  	.timer		= &omap3_timer, -	.restart	= omap_prcm_restart, +	.restart	= omap3xxx_restart,  MACHINE_END diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c index e3f0c1e262a..8c5b13e7ee6 100644 --- a/arch/arm/mach-omap2/clkt2xxx_apll.c +++ b/arch/arm/mach-omap2/clkt2xxx_apll.c @@ -21,7 +21,6 @@  #include <linux/clk.h>  #include <linux/io.h> -#include <plat/prcm.h>  #include "clock.h"  #include "clock2xxx.h" @@ -37,44 +36,16 @@  #define APLLS_CLKIN_13MHZ		2  #define APLLS_CLKIN_12MHZ		3 -void __iomem *cm_idlest_pll; -  /* Private functions */ -/* Enable an APLL if off */ -static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) -{ -	u32 cval, apll_mask; - -	apll_mask = EN_APLL_LOCKED << clk->enable_bit; - -	cval = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); - -	if ((cval & apll_mask) == apll_mask) -		return 0;   /* apll already enabled */ - -	cval &= ~apll_mask; -	cval |= apll_mask; -	omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); - -	omap2_cm_wait_idlest(cm_idlest_pll, status_mask, -			     OMAP24XX_CM_IDLEST_VAL, __clk_get_name(clk)); - -	/* -	 * REVISIT: Should we return an error code if omap2_wait_clock_ready() -	 * fails? -	 */ -	return 0; -} - -static int omap2_clk_apll96_enable(struct clk *clk) +static int _apll96_enable(struct clk *clk)  { -	return omap2_clk_apll_enable(clk, OMAP24XX_ST_96M_APLL_MASK); +	return omap2xxx_cm_apll96_enable();  } -static int omap2_clk_apll54_enable(struct clk *clk) +static int _apll54_enable(struct clk *clk)  { -	return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL_MASK); +	return omap2xxx_cm_apll54_enable();  }  static void _apll96_allow_idle(struct clk *clk) @@ -97,28 +68,28 @@ static void _apll54_deny_idle(struct clk *clk)  	omap2xxx_cm_set_apll54_disable_autoidle();  } -/* Stop APLL */ -static void omap2_clk_apll_disable(struct clk *clk) +static void _apll96_disable(struct clk *clk)  { -	u32 cval; +	omap2xxx_cm_apll96_disable(); +} -	cval = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); -	cval &= ~(EN_APLL_LOCKED << clk->enable_bit); -	omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); +static void _apll54_disable(struct clk *clk) +{ +	omap2xxx_cm_apll54_disable();  }  /* Public data */  const struct clkops clkops_apll96 = { -	.enable		= omap2_clk_apll96_enable, -	.disable	= omap2_clk_apll_disable, +	.enable		= _apll96_enable, +	.disable	= _apll96_disable,  	.allow_idle	= _apll96_allow_idle,  	.deny_idle	= _apll96_deny_idle,  };  const struct clkops clkops_apll54 = { -	.enable		= omap2_clk_apll54_enable, -	.disable	= omap2_clk_apll_disable, +	.enable		= _apll54_enable, +	.disable	= _apll54_disable,  	.allow_idle	= _apll54_allow_idle,  	.deny_idle	= _apll54_deny_idle,  }; diff --git a/arch/arm/mach-omap2/clkt2xxx_dpllcore.c b/arch/arm/mach-omap2/clkt2xxx_dpllcore.c index 3432f913f74..e687163a68f 100644 --- a/arch/arm/mach-omap2/clkt2xxx_dpllcore.c +++ b/arch/arm/mach-omap2/clkt2xxx_dpllcore.c @@ -30,15 +30,21 @@  #include "clock.h"  #include "clock2xxx.h"  #include "opp2xxx.h" -#include "cm2xxx_3xxx.h" +#include "cm2xxx.h"  #include "cm-regbits-24xx.h"  #include "sdrc.h"  /* #define DOWN_VARIABLE_DPLL 1 */		/* Experimental */ +/* + * dpll_core_ck: pointer to the combined dpll_ck + core_ck on OMAP2xxx + * (currently defined as "dpll_ck" in the OMAP2xxx clock tree).  Set + * during dpll_ck init and used later by omap2xxx_clk_get_core_rate(). + */ +static struct clk *dpll_core_ck; +  /**   * omap2xxx_clk_get_core_rate - return the CORE_CLK rate - * @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck")   *   * Returns the CORE_CLK rate.  CORE_CLK can have one of three rate   * sources on OMAP2xxx: the DPLL CLKOUT rate, DPLL CLKOUTX2, or 32KHz @@ -46,12 +52,14 @@   * struct clk *dpll_ck, which is a composite clock of dpll_ck and   * core_ck.   */ -unsigned long omap2xxx_clk_get_core_rate(struct clk *clk) +unsigned long omap2xxx_clk_get_core_rate(void)  {  	long long core_clk;  	u32 v; -	core_clk = omap2_get_dpll_rate(clk); +	WARN_ON(!dpll_core_ck); + +	core_clk = omap2_get_dpll_rate(dpll_core_ck);  	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);  	v &= OMAP24XX_CORE_CLK_SRC_MASK; @@ -99,7 +107,7 @@ static long omap2_dpllcore_round_rate(unsigned long target_rate)  unsigned long omap2_dpllcore_recalc(struct clk *clk)  { -	return omap2xxx_clk_get_core_rate(clk); +	return omap2xxx_clk_get_core_rate();  }  int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate) @@ -109,7 +117,7 @@ int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)  	struct prcm_config tmpset;  	const struct dpll_data *dd; -	cur_rate = omap2xxx_clk_get_core_rate(dclk); +	cur_rate = omap2xxx_clk_get_core_rate();  	mult = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);  	mult &= OMAP24XX_CORE_CLK_SRC_MASK; @@ -170,3 +178,19 @@ int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)  	return 0;  } +/** + * omap2xxx_clkt_dpllcore_init - clk init function for dpll_ck + * @clk: struct clk *dpll_ck + * + * Store a local copy of @clk in dpll_core_ck so other code can query + * the core rate without having to clk_get(), which can sleep.  Must + * only be called once.  No return value.  XXX If the clock + * registration process is ever changed such that dpll_ck is no longer + * statically defined, this code may need to change to increment some + * kind of use count on dpll_ck. + */ +void omap2xxx_clkt_dpllcore_init(struct clk *clk) +{ +	WARN(dpll_core_ck, "dpll_core_ck already set - should never happen"); +	dpll_core_ck = clk; +} diff --git a/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c b/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c index c66276b2bf0..b9b981bac9d 100644 --- a/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c +++ b/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c @@ -1,7 +1,7 @@  /*   * OMAP2xxx DVFS virtual clock functions   * - * Copyright (C) 2005-2008 Texas Instruments, Inc. + * Copyright (C) 2005-2008, 2012 Texas Instruments, Inc.   * Copyright (C) 2004-2010 Nokia Corporation   *   * Contacts: @@ -39,13 +39,20 @@  #include "clock.h"  #include "clock2xxx.h"  #include "opp2xxx.h" -#include "cm2xxx_3xxx.h" +#include "cm2xxx.h"  #include "cm-regbits-24xx.h"  #include "sdrc.h"  const struct prcm_config *curr_prcm_set;  const struct prcm_config *rate_table; +/* + * sys_ck_rate: the rate of the external high-frequency clock + * oscillator on the board.  Set by the SoC-specific clock init code. + * Once set during a boot, will not change. + */ +static unsigned long sys_ck_rate; +  /**   * omap2_table_mpu_recalc - just return the MPU speed   * @clk: virt_prcm_set struct clk @@ -67,15 +74,14 @@ unsigned long omap2_table_mpu_recalc(struct clk *clk)  long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)  {  	const struct prcm_config *ptr; -	long highest_rate, sys_clk_rate; +	long highest_rate;  	highest_rate = -EINVAL; -	sys_clk_rate = __clk_get_rate(sclk);  	for (ptr = rate_table; ptr->mpu_speed; ptr++) {  		if (!(ptr->flags & cpu_mask))  			continue; -		if (ptr->xtal_speed != sys_clk_rate) +		if (ptr->xtal_speed != sys_ck_rate)  			continue;  		highest_rate = ptr->mpu_speed; @@ -94,15 +100,12 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)  	const struct prcm_config *prcm;  	unsigned long found_speed = 0;  	unsigned long flags; -	long sys_clk_rate; - -	sys_clk_rate = __clk_get_rate(sclk);  	for (prcm = rate_table; prcm->mpu_speed; prcm++) {  		if (!(prcm->flags & cpu_mask))  			continue; -		if (prcm->xtal_speed != sys_clk_rate) +		if (prcm->xtal_speed != sys_ck_rate)  			continue;  		if (prcm->mpu_speed <= rate) { @@ -118,7 +121,7 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)  	}  	curr_prcm_set = prcm; -	cur_rate = omap2xxx_clk_get_core_rate(dclk); +	cur_rate = omap2xxx_clk_get_core_rate();  	if (prcm->dpll_speed == cur_rate / 2) {  		omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1); @@ -168,3 +171,50 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)  	return 0;  } + +/** + * omap2xxx_clkt_vps_check_bootloader_rate - determine which of the rate + * table sets matches the current CORE DPLL hardware rate + * + * Check the MPU rate set by bootloader.  Sets the 'curr_prcm_set' + * global to point to the active rate set when found; otherwise, sets + * it to NULL.  No return value; + */ +void omap2xxx_clkt_vps_check_bootloader_rates(void) +{ +	const struct prcm_config *prcm = NULL; +	unsigned long rate; + +	rate = omap2xxx_clk_get_core_rate(); +	for (prcm = rate_table; prcm->mpu_speed; prcm++) { +		if (!(prcm->flags & cpu_mask)) +			continue; +		if (prcm->xtal_speed != sys_ck_rate) +			continue; +		if (prcm->dpll_speed <= rate) +			break; +	} +	curr_prcm_set = prcm; +} + +/** + * omap2xxx_clkt_vps_late_init - store a copy of the sys_ck rate + * + * Store a copy of the sys_ck rate for later use by the OMAP2xxx DVFS + * code.  (The sys_ck rate does not -- or rather, must not -- change + * during kernel runtime.)  Must be called after we have a valid + * sys_ck rate, but before the virt_prcm_set clock rate is + * recalculated.  No return value. + */ +void omap2xxx_clkt_vps_late_init(void) +{ +	struct clk *c; + +	c = clk_get(NULL, "sys_ck"); +	if (IS_ERR(c)) { +		WARN(1, "could not locate sys_ck\n"); +	} else { +		sys_ck_rate = clk_get_rate(c); +		clk_put(c); +	} +} diff --git a/arch/arm/mach-omap2/clkt_iclk.c b/arch/arm/mach-omap2/clkt_iclk.c index 7c8d41e4983..fe774a09dd0 100644 --- a/arch/arm/mach-omap2/clkt_iclk.c +++ b/arch/arm/mach-omap2/clkt_iclk.c @@ -14,7 +14,6 @@  #include <linux/clk.h>  #include <linux/io.h> -#include <plat/prcm.h>  #include "clock.h"  #include "clock2xxx.h" diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 9205ea7d8dd..e381d991092 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -26,17 +26,24 @@  #include <asm/cpu.h> -#include <plat/prcm.h>  #include <trace/events/power.h>  #include "soc.h"  #include "clockdomain.h"  #include "clock.h" +#include "cm.h"  #include "cm2xxx.h"  #include "cm3xxx.h"  #include "cm-regbits-24xx.h"  #include "cm-regbits-34xx.h" +#include "common.h" + +/* + * MAX_MODULE_ENABLE_WAIT: maximum of number of microseconds to wait + * for a module to indicate that it is no longer in idle + */ +#define MAX_MODULE_ENABLE_WAIT		100000  u16 cpu_mask; @@ -58,6 +65,40 @@ static DEFINE_SPINLOCK(clockfw_lock);  /* Private functions */ + +/** + * _wait_idlest_generic - wait for a module to leave the idle state + * @reg: virtual address of module IDLEST register + * @mask: value to mask against to determine if the module is active + * @idlest: idle state indicator (0 or 1) for the clock + * @name: name of the clock (for printk) + * + * Wait for a module to leave idle, where its idle-status register is + * not inside the CM module.  Returns 1 if the module left idle + * promptly, or 0 if the module did not leave idle before the timeout + * elapsed.  XXX Deprecated - should be moved into drivers for the + * individual IP block that the IDLEST register exists in. + */ +static int _wait_idlest_generic(void __iomem *reg, u32 mask, u8 idlest, +				const char *name) +{ +	int i = 0, ena = 0; + +	ena = (idlest) ? 0 : mask; + +	omap_test_timeout(((__raw_readl(reg) & mask) == ena), +			  MAX_MODULE_ENABLE_WAIT, i); + +	if (i < MAX_MODULE_ENABLE_WAIT) +		pr_debug("omap clock: module associated with clock %s ready after %d loops\n", +			 name, i); +	else +		pr_err("omap clock: module associated with clock %s didn't enable in %d tries\n", +		       name, MAX_MODULE_ENABLE_WAIT); + +	return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0; +}; +  /**   * _omap2_module_wait_ready - wait for an OMAP module to leave IDLE   * @clk: struct clk * belonging to the module @@ -71,7 +112,9 @@ static DEFINE_SPINLOCK(clockfw_lock);  static void _omap2_module_wait_ready(struct clk *clk)  {  	void __iomem *companion_reg, *idlest_reg; -	u8 other_bit, idlest_bit, idlest_val; +	u8 other_bit, idlest_bit, idlest_val, idlest_reg_id; +	s16 prcm_mod; +	int r;  	/* Not all modules have multiple clocks that their IDLEST depends on */  	if (clk->ops->find_companion) { @@ -82,8 +125,14 @@ static void _omap2_module_wait_ready(struct clk *clk)  	clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); -	omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, -			     __clk_get_name(clk)); +	r = cm_split_idlest_reg(idlest_reg, &prcm_mod, &idlest_reg_id); +	if (r) { +		/* IDLEST register not in the CM module */ +		_wait_idlest_generic(idlest_reg, (1 << idlest_bit), idlest_val, +				     clk->name); +	} else { +		cm_wait_module_ready(prcm_mod, idlest_reg_id, idlest_bit); +	};  }  /* Public functions */ diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index cfba1ffe5cc..ff9789bc0fd 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -409,33 +409,6 @@ extern void omap2_clkt_iclk_deny_idle(struct clk *clk);  u32 omap2_get_dpll_rate(struct clk *clk);  void omap2_init_dpll_parent(struct clk *clk); -int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name); - - -#ifdef CONFIG_ARCH_OMAP2 -void omap2xxx_clk_prepare_for_reboot(void); -#else -static inline void omap2xxx_clk_prepare_for_reboot(void) -{ -} -#endif - -#ifdef CONFIG_ARCH_OMAP3 -void omap3_clk_prepare_for_reboot(void); -#else -static inline void omap3_clk_prepare_for_reboot(void) -{ -} -#endif - -#ifdef CONFIG_ARCH_OMAP4 -void omap4_clk_prepare_for_reboot(void); -#else -static inline void omap4_clk_prepare_for_reboot(void) -{ -} -#endif -  int omap2_dflt_clk_enable(struct clk *clk);  void omap2_dflt_clk_disable(struct clk *clk);  void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, @@ -454,7 +427,6 @@ extern const struct clkops clkops_dummy;  extern const struct clkops clkops_omap2_dflt;  extern struct clk_functions omap2_clk_functions; -extern struct clk *vclk, *sclk;  extern const struct clksel_rate gpt_32k_rates[];  extern const struct clksel_rate gpt_sys_rates[]; diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index da1e388f22f..608874b651e 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c @@ -1,7 +1,7 @@  /*   * OMAP2420 clock data   * - * Copyright (C) 2005-2009 Texas Instruments, Inc. + * Copyright (C) 2005-2009, 2012 Texas Instruments, Inc.   * Copyright (C) 2004-2011 Nokia Corporation   *   * Contacts: @@ -124,6 +124,7 @@ static struct clk dpll_ck = {  	.name		= "dpll_ck",  	.ops		= &clkops_omap2xxx_dpll_ops,  	.parent		= &sys_ck,		/* Can be func_32k also */ +	.init		= &omap2xxx_clkt_dpllcore_init,  	.dpll_data	= &dpll_dd,  	.clkdm_name	= "wkup_clkdm",  	.recalc		= &omap2_dpllcore_recalc, @@ -1924,12 +1925,9 @@ static struct omap_clk omap2420_clks[] = {  int __init omap2420_clk_init(void)  { -	const struct prcm_config *prcm;  	struct omap_clk *c; -	u32 clkrate;  	prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL; -	cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);  	cpu_mask = RATE_IN_242X;  	rate_table = omap2420_rate_table; @@ -1949,20 +1947,13 @@ int __init omap2420_clk_init(void)  		omap2_init_clk_clkdm(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	/* Disable autoidle on all clocks; let the PM code enable it later */  	omap_clk_disable_autoidle_all(); -	/* Check the MPU rate set by bootloader */ -	clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); -	for (prcm = rate_table; prcm->mpu_speed; prcm++) { -		if (!(prcm->flags & cpu_mask)) -			continue; -		if (prcm->xtal_speed != sys_ck.rate) -			continue; -		if (prcm->dpll_speed <= clkrate) -			break; -	} -	curr_prcm_set = prcm; +	/* XXX Can this be done from the virt_prcm_set clk init function? */ +	omap2xxx_clkt_vps_check_bootloader_rates();  	recalculate_root_clocks(); @@ -1976,11 +1967,6 @@ int __init omap2420_clk_init(void)  	 */  	clk_enable_init_clocks(); -	/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */ -	vclk = clk_get(NULL, "virt_prcm_set"); -	sclk = clk_get(NULL, "sys_ck"); -	dclk = clk_get(NULL, "dpll_ck"); -  	return 0;  } diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index c97dafef894..b179b6ef432 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c @@ -1,7 +1,7 @@  /*   * OMAP2430 clock data   * - * Copyright (C) 2005-2009 Texas Instruments, Inc. + * Copyright (C) 2005-2009, 2012 Texas Instruments, Inc.   * Copyright (C) 2004-2011 Nokia Corporation   *   * Contacts: @@ -123,6 +123,7 @@ static struct clk dpll_ck = {  	.name		= "dpll_ck",  	.ops		= &clkops_omap2xxx_dpll_ops,  	.parent		= &sys_ck,		/* Can be func_32k also */ +	.init		= &omap2xxx_clkt_dpllcore_init,  	.dpll_data	= &dpll_dd,  	.clkdm_name	= "wkup_clkdm",  	.recalc		= &omap2_dpllcore_recalc, @@ -2023,12 +2024,9 @@ static struct omap_clk omap2430_clks[] = {  int __init omap2430_clk_init(void)  { -	const struct prcm_config *prcm;  	struct omap_clk *c; -	u32 clkrate;  	prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL; -	cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);  	cpu_mask = RATE_IN_243X;  	rate_table = omap2430_rate_table; @@ -2048,20 +2046,13 @@ int __init omap2430_clk_init(void)  		omap2_init_clk_clkdm(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	/* Disable autoidle on all clocks; let the PM code enable it later */  	omap_clk_disable_autoidle_all(); -	/* Check the MPU rate set by bootloader */ -	clkrate = omap2xxx_clk_get_core_rate(&dpll_ck); -	for (prcm = rate_table; prcm->mpu_speed; prcm++) { -		if (!(prcm->flags & cpu_mask)) -			continue; -		if (prcm->xtal_speed != sys_ck.rate) -			continue; -		if (prcm->dpll_speed <= clkrate) -			break; -	} -	curr_prcm_set = prcm; +	/* XXX Can this be done from the virt_prcm_set clk init function? */ +	omap2xxx_clkt_vps_check_bootloader_rates();  	recalculate_root_clocks(); @@ -2075,11 +2066,6 @@ int __init omap2430_clk_init(void)  	 */  	clk_enable_init_clocks(); -	/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */ -	vclk = clk_get(NULL, "virt_prcm_set"); -	sclk = clk_get(NULL, "sys_ck"); -	dclk = clk_get(NULL, "dpll_ck"); -  	return 0;  } diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index 5feee16fee0..5f7faeb4c19 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c @@ -28,27 +28,11 @@  #include "cm.h"  #include "cm-regbits-24xx.h" -struct clk *vclk, *sclk, *dclk; -  /*   * Omap24xx specific clock functions   */  /* - * Set clocks for bypass mode for reboot to work. - */ -void omap2xxx_clk_prepare_for_reboot(void) -{ -	u32 rate; - -	if (vclk == NULL || sclk == NULL) -		return; - -	rate = clk_get_rate(sclk); -	clk_set_rate(vclk, rate); -} - -/*   * Switch the MPU rate if specified on cmdline.  We cannot do this   * early until cmdline is parsed.  XXX This should be removed from the   * clock code and handled by the OPP layer code in the near future. diff --git a/arch/arm/mach-omap2/clock2xxx.h b/arch/arm/mach-omap2/clock2xxx.h index cb6df8ca9e4..ce809c913b6 100644 --- a/arch/arm/mach-omap2/clock2xxx.h +++ b/arch/arm/mach-omap2/clock2xxx.h @@ -15,10 +15,13 @@ unsigned long omap2xxx_sys_clk_recalc(struct clk *clk);  unsigned long omap2_osc_clk_recalc(struct clk *clk);  unsigned long omap2_dpllcore_recalc(struct clk *clk);  int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate); -unsigned long omap2xxx_clk_get_core_rate(struct clk *clk); +unsigned long omap2xxx_clk_get_core_rate(void);  u32 omap2xxx_get_apll_clkin(void);  u32 omap2xxx_get_sysclkdiv(void);  void omap2xxx_clk_prepare_for_reboot(void); +void omap2xxx_clkt_dpllcore_init(struct clk *clk); +void omap2xxx_clkt_vps_check_bootloader_rates(void); +void omap2xxx_clkt_vps_late_init(void);  #ifdef CONFIG_SOC_OMAP2420  int omap2420_clk_init(void); @@ -32,9 +35,7 @@ int omap2430_clk_init(void);  #define omap2430_clk_init()	do { } while(0)  #endif -extern void __iomem *prcm_clksrc_ctrl, *cm_idlest_pll; - -extern struct clk *dclk; +extern void __iomem *prcm_clksrc_ctrl;  extern const struct clkops clkops_omap2430_i2chs_wait;  extern const struct clkops clkops_oscck; diff --git a/arch/arm/mach-omap2/cm-regbits-24xx.h b/arch/arm/mach-omap2/cm-regbits-24xx.h index 68629043756..11eaf16880c 100644 --- a/arch/arm/mach-omap2/cm-regbits-24xx.h +++ b/arch/arm/mach-omap2/cm-regbits-24xx.h @@ -333,7 +333,9 @@  #define OMAP24XX_EN_DPLL_MASK				(0x3 << 0)  /* CM_IDLEST_CKGEN */ +#define OMAP24XX_ST_54M_APLL_SHIFT			9  #define OMAP24XX_ST_54M_APLL_MASK			(1 << 9) +#define OMAP24XX_ST_96M_APLL_SHIFT			8  #define OMAP24XX_ST_96M_APLL_MASK			(1 << 8)  #define OMAP24XX_ST_54M_CLK_MASK			(1 << 6)  #define OMAP24XX_ST_12M_CLK_MASK			(1 << 5) diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index b3cee913dd6..93473f9a551 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -1,7 +1,7 @@  /*   * OMAP2+ Clock Management prototypes   * - * Copyright (C) 2007-2009 Texas Instruments, Inc. + * Copyright (C) 2007-2009, 2012 Texas Instruments, Inc.   * Copyright (C) 2007-2009 Nokia Corporation   *   * Written by Paul Walmsley @@ -22,6 +22,12 @@   */  #define MAX_MODULE_READY_TIME		2000 +# ifndef __ASSEMBLER__ +extern void __iomem *cm_base; +extern void __iomem *cm2_base; +extern void omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2); +# endif +  /*   * MAX_MODULE_DISABLE_TIME: max duration in microseconds to wait for   * the PRCM to request that a module enter the inactive state in the @@ -37,8 +43,18 @@  /**   * struct cm_ll_data - fn ptrs to per-SoC CM function implementations + * @split_idlest_reg: ptr to the SoC CM-specific split_idlest_reg impl + * @wait_module_ready: ptr to the SoC CM-specific wait_module_ready impl   */ -struct cm_ll_data {}; +struct cm_ll_data { +	int (*split_idlest_reg)(void __iomem *idlest_reg, s16 *prcm_inst, +				u8 *idlest_reg_id); +	int (*wait_module_ready)(s16 prcm_mod, u8 idlest_id, u8 idlest_shift); +}; + +extern int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, +			       u8 *idlest_reg_id); +extern int cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift);  extern int cm_register(struct cm_ll_data *cld);  extern int cm_unregister(struct cm_ll_data *cld); diff --git a/arch/arm/mach-omap2/cm2xxx.c b/arch/arm/mach-omap2/cm2xxx.c index 64165013daf..db650690e9d 100644 --- a/arch/arm/mach-omap2/cm2xxx.c +++ b/arch/arm/mach-omap2/cm2xxx.c @@ -35,6 +35,9 @@  #define OMAP2XXX_APLL_AUTOIDLE_DISABLE			0x0  #define OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP		0x3 +/* CM_IDLEST_PLL bit value offset for APLLs (OMAP2xxx only) */ +#define EN_APLL_LOCKED					3 +  static const u8 omap2xxx_cm_idlest_offs[] = {  	CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3, OMAP24XX_CM_IDLEST4  }; @@ -99,7 +102,7 @@ void omap2xxx_cm_set_dpll_auto_low_power_stop(void)  }  /* - * APLL autoidle control + * APLL control   */  static void _omap2xxx_set_apll_autoidle(u8 m, u32 mask) @@ -136,6 +139,102 @@ void omap2xxx_cm_set_apll96_auto_low_power_stop(void)  				    OMAP24XX_AUTO_96M_MASK);  } +/* Enable an APLL if off */ +static int _omap2xxx_apll_enable(u8 enable_bit, u8 status_bit) +{ +	u32 v, m; + +	m = EN_APLL_LOCKED << enable_bit; + +	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); +	if (v & m) +		return 0;   /* apll already enabled */ + +	v |= m; +	omap2_cm_write_mod_reg(v, PLL_MOD, CM_CLKEN); + +	omap2xxx_cm_wait_module_ready(PLL_MOD, 1, status_bit); + +	/* +	 * REVISIT: Should we return an error code if +	 * omap2xxx_cm_wait_module_ready() fails? +	 */ +	return 0; +} + +/* Stop APLL */ +static void _omap2xxx_apll_disable(u8 enable_bit) +{ +	u32 v; + +	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); +	v &= ~(EN_APLL_LOCKED << enable_bit); +	omap2_cm_write_mod_reg(v, PLL_MOD, CM_CLKEN); +} + +/* Enable an APLL if off */ +int omap2xxx_cm_apll54_enable(void) +{ +	return _omap2xxx_apll_enable(OMAP24XX_EN_54M_PLL_SHIFT, +				     OMAP24XX_ST_54M_APLL_SHIFT); +} + +/* Enable an APLL if off */ +int omap2xxx_cm_apll96_enable(void) +{ +	return _omap2xxx_apll_enable(OMAP24XX_EN_96M_PLL_SHIFT, +				     OMAP24XX_ST_96M_APLL_SHIFT); +} + +/* Stop APLL */ +void omap2xxx_cm_apll54_disable(void) +{ +	_omap2xxx_apll_disable(OMAP24XX_EN_54M_PLL_SHIFT); +} + +/* Stop APLL */ +void omap2xxx_cm_apll96_disable(void) +{ +	_omap2xxx_apll_disable(OMAP24XX_EN_96M_PLL_SHIFT); +} + +/** + * omap2xxx_cm_split_idlest_reg - split CM_IDLEST reg addr into its components + * @idlest_reg: CM_IDLEST* virtual address + * @prcm_inst: pointer to an s16 to return the PRCM instance offset + * @idlest_reg_id: pointer to a u8 to return the CM_IDLESTx register ID + * + * XXX This function is only needed until absolute register addresses are + * removed from the OMAP struct clk records. + */ +int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, +				 u8 *idlest_reg_id) +{ +	unsigned long offs; +	u8 idlest_offs; +	int i; + +	if (idlest_reg < cm_base || idlest_reg > (cm_base + 0x0fff)) +		return -EINVAL; + +	idlest_offs = (unsigned long)idlest_reg & 0xff; +	for (i = 0; i < ARRAY_SIZE(omap2xxx_cm_idlest_offs); i++) { +		if (idlest_offs == omap2xxx_cm_idlest_offs[i]) { +			*idlest_reg_id = i + 1; +			break; +		} +	} + +	if (i == ARRAY_SIZE(omap2xxx_cm_idlest_offs)) +		return -EINVAL; + +	offs = idlest_reg - cm_base; +	offs &= 0xff00; +	*prcm_inst = offs; + +	return 0; +} +  /*   *   */ @@ -253,3 +352,30 @@ struct clkdm_ops omap2_clkdm_operations = {  	.clkdm_clk_disable	= omap2xxx_clkdm_clk_disable,  }; +/* + * + */ + +static struct cm_ll_data omap2xxx_cm_ll_data = { +	.split_idlest_reg	= &omap2xxx_cm_split_idlest_reg, +	.wait_module_ready	= &omap2xxx_cm_wait_module_ready, +}; + +int __init omap2xxx_cm_init(void) +{ +	if (!cpu_is_omap24xx()) +		return 0; + +	return cm_register(&omap2xxx_cm_ll_data); +} + +static void __exit omap2xxx_cm_exit(void) +{ +	if (!cpu_is_omap24xx()) +		return; + +	/* Should never happen */ +	WARN(cm_unregister(&omap2xxx_cm_ll_data), +	     "%s: cm_ll_data function pointer mismatch\n", __func__); +} +__exitcall(omap2xxx_cm_exit); diff --git a/arch/arm/mach-omap2/cm2xxx.h b/arch/arm/mach-omap2/cm2xxx.h index bce3c4be6d1..4cbb39b051d 100644 --- a/arch/arm/mach-omap2/cm2xxx.h +++ b/arch/arm/mach-omap2/cm2xxx.h @@ -60,6 +60,10 @@ extern void omap2xxx_cm_set_apll96_auto_low_power_stop(void);  extern bool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask);  extern int omap2xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id,  					 u8 idlest_shift); +extern int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, +					s16 *prcm_inst, u8 *idlest_reg_id); + +extern int __init omap2xxx_cm_init(void);  #endif diff --git a/arch/arm/mach-omap2/cm2xxx_3xxx.h b/arch/arm/mach-omap2/cm2xxx_3xxx.h index 0e26bb1bf7e..98e6b3c9cd9 100644 --- a/arch/arm/mach-omap2/cm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/cm2xxx_3xxx.h @@ -16,7 +16,7 @@  #ifndef __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H  #define __ARCH_ASM_MACH_OMAP2_CM2XXX_3XXX_H -#include "prcm-common.h" +#include "cm.h"  /*   * Module specific CM register offsets from CM_BASE + domain offset @@ -96,6 +96,11 @@ static inline u32 omap2_cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)  	return omap2_cm_rmw_mod_reg_bits(bits, 0x0, module, idx);  } +extern int omap2xxx_cm_apll54_enable(void); +extern void omap2xxx_cm_apll54_disable(void); +extern int omap2xxx_cm_apll96_enable(void); +extern void omap2xxx_cm_apll96_disable(void); +  #endif  /* CM register bits shared between 24XX and 3430 */ @@ -111,5 +116,4 @@ static inline u32 omap2_cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)  /* CM_IDLEST_GFX */  #define OMAP_ST_GFX_MASK				(1 << 0) -  #endif diff --git a/arch/arm/mach-omap2/cm3xxx.c b/arch/arm/mach-omap2/cm3xxx.c index 8b03ec2f439..c2086f2e86b 100644 --- a/arch/arm/mach-omap2/cm3xxx.c +++ b/arch/arm/mach-omap2/cm3xxx.c @@ -110,6 +110,44 @@ int omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift)  	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;  } +/** + * omap3xxx_cm_split_idlest_reg - split CM_IDLEST reg addr into its components + * @idlest_reg: CM_IDLEST* virtual address + * @prcm_inst: pointer to an s16 to return the PRCM instance offset + * @idlest_reg_id: pointer to a u8 to return the CM_IDLESTx register ID + * + * XXX This function is only needed until absolute register addresses are + * removed from the OMAP struct clk records. + */ +int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, +				 u8 *idlest_reg_id) +{ +	unsigned long offs; +	u8 idlest_offs; +	int i; + +	if (idlest_reg < (cm_base + OMAP3430_IVA2_MOD) || +	    idlest_reg > (cm_base + 0x1ffff)) +		return -EINVAL; + +	idlest_offs = (unsigned long)idlest_reg & 0xff; +	for (i = 0; i < ARRAY_SIZE(omap3xxx_cm_idlest_offs); i++) { +		if (idlest_offs == omap3xxx_cm_idlest_offs[i]) { +			*idlest_reg_id = i + 1; +			break; +		} +	} + +	if (i == ARRAY_SIZE(omap3xxx_cm_idlest_offs)) +		return -EINVAL; + +	offs = idlest_reg - cm_base; +	offs &= 0xff00; +	*prcm_inst = offs; + +	return 0; +} +  /* Clockdomain low-level operations */  static int omap3xxx_clkdm_add_sleepdep(struct clockdomain *clkdm1, @@ -597,3 +635,31 @@ void omap3_cm_restore_context(void)  	omap2_cm_write_mod_reg(cm_context.cm_clkout_ctrl, OMAP3430_CCR_MOD,  			       OMAP3_CM_CLKOUT_CTRL_OFFSET);  } + +/* + * + */ + +static struct cm_ll_data omap3xxx_cm_ll_data = { +	.split_idlest_reg	= &omap3xxx_cm_split_idlest_reg, +	.wait_module_ready	= &omap3xxx_cm_wait_module_ready, +}; + +int __init omap3xxx_cm_init(void) +{ +	if (!cpu_is_omap34xx()) +		return 0; + +	return cm_register(&omap3xxx_cm_ll_data); +} + +static void __exit omap3xxx_cm_exit(void) +{ +	if (!cpu_is_omap34xx()) +		return; + +	/* Should never happen */ +	WARN(cm_unregister(&omap3xxx_cm_ll_data), +	     "%s: cm_ll_data function pointer mismatch\n", __func__); +} +__exitcall(omap3xxx_cm_exit); diff --git a/arch/arm/mach-omap2/cm3xxx.h b/arch/arm/mach-omap2/cm3xxx.h index 4a6ac812edf..e8e146f4a43 100644 --- a/arch/arm/mach-omap2/cm3xxx.h +++ b/arch/arm/mach-omap2/cm3xxx.h @@ -78,9 +78,14 @@ extern bool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask);  extern int omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id,  					 u8 idlest_shift); +extern int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, +					s16 *prcm_inst, u8 *idlest_reg_id); +  extern void omap3_cm_save_context(void);  extern void omap3_cm_restore_context(void); +extern int __init omap3xxx_cm_init(void); +  #endif  #endif diff --git a/arch/arm/mach-omap2/cm_common.c b/arch/arm/mach-omap2/cm_common.c index 3246cef151d..0bab493ec13 100644 --- a/arch/arm/mach-omap2/cm_common.c +++ b/arch/arm/mach-omap2/cm_common.c @@ -2,7 +2,7 @@   * OMAP2+ common Clock Management (CM) IP block functions   *   * Copyright (C) 2012 Texas Instruments, Inc. - * Paul Walmsley <paul@pwsan.com> + * Paul Walmsley   *   * 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 @@ -17,6 +17,7 @@  #include "cm2xxx.h"  #include "cm3xxx.h"  #include "cm44xx.h" +#include "common.h"  /*   * cm_ll_data: function pointers to SoC-specific implementations of @@ -25,6 +26,73 @@  static struct cm_ll_data null_cm_ll_data;  static struct cm_ll_data *cm_ll_data = &null_cm_ll_data; +/* cm_base: base virtual address of the CM IP block */ +void __iomem *cm_base; + +/* cm2_base: base virtual address of the CM2 IP block (OMAP44xx only) */ +void __iomem *cm2_base; + +/** + * omap2_set_globals_cm - set the CM/CM2 base addresses (for early use) + * @cm: CM base virtual address + * @cm2: CM2 base virtual address (if present on the booted SoC) + * + * XXX Will be replaced when the PRM/CM drivers are completed. + */ +void __init omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2) +{ +	cm_base = cm; +	cm2_base = cm2; +} + +/** + * cm_split_idlest_reg - split CM_IDLEST reg addr into its components + * @idlest_reg: CM_IDLEST* virtual address + * @prcm_inst: pointer to an s16 to return the PRCM instance offset + * @idlest_reg_id: pointer to a u8 to return the CM_IDLESTx register ID + * + * Given an absolute CM_IDLEST register address @idlest_reg, passes + * the PRCM instance offset and IDLEST register ID back to the caller + * via the @prcm_inst and @idlest_reg_id.  Returns -EINVAL upon error, + * or 0 upon success.  XXX This function is only needed until absolute + * register addresses are removed from the OMAP struct clk records. + */ +int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, +			u8 *idlest_reg_id) +{ +	if (!cm_ll_data->split_idlest_reg) { +		WARN_ONCE(1, "cm: %s: no low-level function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return cm_ll_data->split_idlest_reg(idlest_reg, prcm_inst, +					   idlest_reg_id); +} + +/** + * cm_wait_module_ready - wait for a module to leave idle or standby + * @prcm_mod: PRCM module offset + * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3) + * @idlest_shift: shift of the bit in the CM_IDLEST* register to check + * + * Wait for the PRCM to indicate that the module identified by + * (@prcm_mod, @idlest_id, @idlest_shift) is clocked.  Return 0 upon + * success, -EBUSY if the module doesn't enable in time, or -EINVAL if + * no per-SoC wait_module_ready() function pointer has been registered + * or if the idlest register is unknown on the SoC. + */ +int cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) +{ +	if (!cm_ll_data->wait_module_ready) { +		WARN_ONCE(1, "cm: %s: no low-level function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return cm_ll_data->wait_module_ready(prcm_mod, idlest_id, idlest_shift); +} +  /**   * cm_register - register per-SoC low-level data with the CM   * @cld: low-level per-SoC OMAP CM data & function pointers to register diff --git a/arch/arm/mach-omap2/cminst44xx.h b/arch/arm/mach-omap2/cminst44xx.h index d69fdefef98..bd7bab88974 100644 --- a/arch/arm/mach-omap2/cminst44xx.h +++ b/arch/arm/mach-omap2/cminst44xx.h @@ -38,4 +38,6 @@ extern u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, s16 inst,  extern u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx,  					   u32 mask); +extern void omap_cm_base_init(void); +  #endif diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 34fb5b95859..5c2fd4863b2 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c @@ -14,196 +14,13 @@   */  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/clk.h> -#include <linux/io.h>  #include <linux/platform_data/dsp-omap.h>  #include <plat/vram.h> -#include "soc.h" -#include "iomap.h"  #include "common.h" -#include "clock.h" -#include "sdrc.h" -#include "control.h"  #include "omap-secure.h" -/* Global address base setup code */ - -static void __init __omap2_set_globals(struct omap_globals *omap2_globals) -{ -	omap2_set_globals_tap(omap2_globals); -	omap2_set_globals_sdrc(omap2_globals); -	omap2_set_globals_control(omap2_globals); -	omap2_set_globals_prcm(omap2_globals); -} - -#if defined(CONFIG_SOC_OMAP2420) - -static struct omap_globals omap242x_globals = { -	.class	= OMAP242X_CLASS, -	.tap	= OMAP2_L4_IO_ADDRESS(0x48014000), -	.sdrc	= OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE), -	.sms	= OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE), -	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE), -	.prm	= OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE), -	.cm	= OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), -}; - -void __init omap2_set_globals_242x(void) -{ -	__omap2_set_globals(&omap242x_globals); -} - -void __init omap242x_map_io(void) -{ -	omap242x_map_common_io(); -} -#endif - -#if defined(CONFIG_SOC_OMAP2430) - -static struct omap_globals omap243x_globals = { -	.class	= OMAP243X_CLASS, -	.tap	= OMAP2_L4_IO_ADDRESS(0x4900a000), -	.sdrc	= OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE), -	.sms	= OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE), -	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE), -	.prm	= OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE), -	.cm	= OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), -}; - -void __init omap2_set_globals_243x(void) -{ -	__omap2_set_globals(&omap243x_globals); -} - -void __init omap243x_map_io(void) -{ -	omap243x_map_common_io(); -} -#endif - -#if defined(CONFIG_ARCH_OMAP3) - -static struct omap_globals omap3_globals = { -	.class	= OMAP343X_CLASS, -	.tap	= OMAP2_L4_IO_ADDRESS(0x4830A000), -	.sdrc	= OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE), -	.sms	= OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE), -	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE), -	.prm	= OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE), -	.cm	= OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), -}; - -void __init omap2_set_globals_3xxx(void) -{ -	__omap2_set_globals(&omap3_globals); -} - -void __init omap3_map_io(void) -{ -	omap34xx_map_common_io(); -} - -/* - * Adjust TAP register base such that omap3_check_revision accesses the correct - * TI81XX register for checking device ID (it adds 0x204 to tap base while - * TI81XX DEVICE ID register is at offset 0x600 from control base). - */ -#define TI81XX_TAP_BASE		(TI81XX_CTRL_BASE + \ -				TI81XX_CONTROL_DEVICE_ID - 0x204) - -static struct omap_globals ti81xx_globals = { -	.class  = OMAP343X_CLASS, -	.tap    = OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE), -	.ctrl   = OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE), -	.prm    = OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), -	.cm     = OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), -}; - -void __init omap2_set_globals_ti81xx(void) -{ -	__omap2_set_globals(&ti81xx_globals); -} - -void __init ti81xx_map_io(void) -{ -	omapti81xx_map_common_io(); -} -#endif - -#if defined(CONFIG_SOC_AM33XX) -#define AM33XX_TAP_BASE		(AM33XX_CTRL_BASE + \ -				TI81XX_CONTROL_DEVICE_ID - 0x204) - -static struct omap_globals am33xx_globals = { -	.class  = AM335X_CLASS, -	.tap    = AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE), -	.ctrl   = AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE), -	.prm    = AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), -	.cm     = AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), -}; - -void __init omap2_set_globals_am33xx(void) -{ -	__omap2_set_globals(&am33xx_globals); -} - -void __init am33xx_map_io(void) -{ -	omapam33xx_map_common_io(); -} -#endif - -#if defined(CONFIG_ARCH_OMAP4) -static struct omap_globals omap4_globals = { -	.class	= OMAP443X_CLASS, -	.tap	= OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE), -	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE), -	.ctrl_pad	= OMAP2_L4_IO_ADDRESS(OMAP443X_CTRL_BASE), -	.prm	= OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE), -	.cm	= OMAP2_L4_IO_ADDRESS(OMAP4430_CM_BASE), -	.cm2	= OMAP2_L4_IO_ADDRESS(OMAP4430_CM2_BASE), -	.prcm_mpu	= OMAP2_L4_IO_ADDRESS(OMAP4430_PRCM_MPU_BASE), -}; - -void __init omap2_set_globals_443x(void) -{ -	__omap2_set_globals(&omap4_globals); -} - -void __init omap4_map_io(void) -{ -	omap44xx_map_common_io(); -} -#endif - -#if defined(CONFIG_SOC_OMAP5) -static struct omap_globals omap5_globals = { -	.class	= OMAP54XX_CLASS, -	.tap	= OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE), -	.ctrl	= OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE), -	.ctrl_pad	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CTRL_BASE), -	.prm	= OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE), -	.cm	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE), -	.cm2	= OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE), -	.prcm_mpu = OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE), -}; - -void __init omap2_set_globals_5xxx(void) -{ -	omap2_set_globals_tap(&omap5_globals); -	omap2_set_globals_control(&omap5_globals); -	omap2_set_globals_prcm(&omap5_globals); -} - -void __init omap5_map_io(void) -{ -	omap5_map_common_io(); -} -#endif -  /*   * Stub function for OMAP2 so that common files   * continue to build when custom builds are used diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index c925c805969..c57eeeac7d1 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -43,54 +43,6 @@  #define OMAP_INTC_START		NR_IRQS -#ifdef CONFIG_SOC_OMAP2420 -extern void omap242x_map_common_io(void); -#else -static inline void omap242x_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_SOC_OMAP2430 -extern void omap243x_map_common_io(void); -#else -static inline void omap243x_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_ARCH_OMAP3 -extern void omap34xx_map_common_io(void); -#else -static inline void omap34xx_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_SOC_TI81XX -extern void omapti81xx_map_common_io(void); -#else -static inline void omapti81xx_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_SOC_AM33XX -extern void omapam33xx_map_common_io(void); -#else -static inline void omapam33xx_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_ARCH_OMAP4 -extern void omap44xx_map_common_io(void); -#else -static inline void omap44xx_map_common_io(void) -{ -} -#endif -  #if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP2)  int omap2_pm_init(void);  #else @@ -127,14 +79,6 @@ static inline int omap_mux_late_init(void)  }  #endif -#ifdef CONFIG_SOC_OMAP5 -extern void omap5_map_common_io(void); -#else -static inline void omap5_map_common_io(void) -{ -} -#endif -  extern void omap2_init_common_infrastructure(void);  extern struct sys_timer omap2_timer; @@ -167,52 +111,43 @@ void am35xx_init_late(void);  void ti81xx_init_late(void);  void omap4430_init_late(void);  int omap2_common_pm_late_init(void); -void omap_prcm_restart(char, const char *); -/* - * IO bases for various OMAP processors - * Except the tap base, rest all the io bases - * listed are physical addresses. - */ -struct omap_globals { -	u32		class;		/* OMAP class to detect */ -	void __iomem	*tap;		/* Control module ID code */ -	void __iomem	*sdrc;           /* SDRAM Controller */ -	void __iomem	*sms;            /* SDRAM Memory Scheduler */ -	void __iomem	*ctrl;           /* System Control Module */ -	void __iomem	*ctrl_pad;	/* PAD Control Module */ -	void __iomem	*prm;            /* Power and Reset Management */ -	void __iomem	*cm;             /* Clock Management */ -	void __iomem	*cm2; -	void __iomem	*prcm_mpu; -}; +#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430) +void omap2xxx_restart(char mode, const char *cmd); +#else +static inline void omap2xxx_restart(char mode, const char *cmd) +{ +} +#endif -void omap2_set_globals_242x(void); -void omap2_set_globals_243x(void); -void omap2_set_globals_3xxx(void); -void omap2_set_globals_443x(void); -void omap2_set_globals_5xxx(void); -void omap2_set_globals_ti81xx(void); -void omap2_set_globals_am33xx(void); +#ifdef CONFIG_ARCH_OMAP3 +void omap3xxx_restart(char mode, const char *cmd); +#else +static inline void omap3xxx_restart(char mode, const char *cmd) +{ +} +#endif -/* These get called from omap2_set_globals_xxxx(), do not call these */ -void omap2_set_globals_tap(struct omap_globals *); -#if defined(CONFIG_SOC_HAS_OMAP2_SDRC) -void omap2_set_globals_sdrc(struct omap_globals *); +#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) +void omap44xx_restart(char mode, const char *cmd);  #else -static inline void omap2_set_globals_sdrc(struct omap_globals *omap2_globals) -{ } +static inline void omap44xx_restart(char mode, const char *cmd) +{ +}  #endif -void omap2_set_globals_control(struct omap_globals *); -void omap2_set_globals_prcm(struct omap_globals *); -void omap242x_map_io(void); -void omap243x_map_io(void); -void omap3_map_io(void); -void am33xx_map_io(void); -void omap4_map_io(void); -void omap5_map_io(void); -void ti81xx_map_io(void); +/* This gets called from mach-omap2/io.c, do not call this */ +void __init omap2_set_globals_tap(u32 class, void __iomem *tap); + +void __init omap242x_map_io(void); +void __init omap243x_map_io(void); +void __init omap3_map_io(void); +void __init am33xx_map_io(void); +void __init omap4_map_io(void); +void __init omap5_map_io(void); +void __init ti81xx_map_io(void); + +/* omap_barriers_init() is OMAP4 only */  void omap_barriers_init(void);  /** diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index 06375ad2091..2adb2683f07 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c @@ -147,13 +147,11 @@ static struct omap3_control_regs control_context;  #define OMAP_CTRL_REGADDR(reg)		(omap2_ctrl_base + (reg))  #define OMAP4_CTRL_PAD_REGADDR(reg)	(omap4_ctrl_pad_base + (reg)) -void __init omap2_set_globals_control(struct omap_globals *omap2_globals) +void __init omap2_set_globals_control(void __iomem *ctrl, +				      void __iomem *ctrl_pad)  { -	if (omap2_globals->ctrl) -		omap2_ctrl_base = omap2_globals->ctrl; - -	if (omap2_globals->ctrl_pad) -		omap4_ctrl_pad_base = omap2_globals->ctrl_pad; +	omap2_ctrl_base = ctrl; +	omap4_ctrl_pad_base = ctrl_pad;  }  void __iomem *omap_ctrl_base_get(void) diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index a89e8256fd0..4ca8747b3cc 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h @@ -414,6 +414,8 @@ extern void omap_ctrl_write_dsp_boot_addr(u32 bootaddr);  extern void omap_ctrl_write_dsp_boot_mode(u8 bootmode);  extern void omap3630_ctrl_disable_rta(void);  extern int omap3_ctrl_save_padconf(void); +extern void omap2_set_globals_control(void __iomem *ctrl, +				      void __iomem *ctrl_pad);  #else  #define omap_ctrl_base_get()		0  #define omap_ctrl_readb(x)		0 diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index bc2756959be..bca7a888570 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c @@ -27,7 +27,6 @@  #include <linux/export.h>  #include <linux/cpu_pm.h> -#include <plat/prcm.h>  #include "powerdomain.h"  #include "clockdomain.h" diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 2ad491d6910..cf365c387c0 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -646,29 +646,3 @@ static int __init omap2_init_devices(void)  	return 0;  }  arch_initcall(omap2_init_devices); - -#if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) -static int __init omap_init_wdt(void) -{ -	int id = -1; -	struct platform_device *pdev; -	struct omap_hwmod *oh; -	char *oh_name = "wd_timer2"; -	char *dev_name = "omap_wdt"; - -	if (!cpu_class_is_omap2() || of_have_populated_dt()) -		return 0; - -	oh = omap_hwmod_lookup(oh_name); -	if (!oh) { -		pr_err("Could not look up wd_timer%d hwmod\n", id); -		return -EINVAL; -	} - -	pdev = omap_device_build(dev_name, id, oh, NULL, 0, NULL, 0, 0); -	WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", -				dev_name, oh->name); -	return 0; -} -subsys_initcall(omap_init_wdt); -#endif diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 89c57129357..38ba58c9762 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -35,6 +35,7 @@  #include "mux.h"  #include "control.h"  #include "display.h" +#include "prm.h"  #define DISPC_CONTROL		0x0040  #define DISPC_CONTROL2		0x0238 @@ -512,7 +513,6 @@ static void dispc_disable_outputs(void)  	}  } -#define MAX_MODULE_SOFTRESET_WAIT	10000  int omap_dss_reset(struct omap_hwmod *oh)  {  	struct omap_hwmod_opt_clk *oc; diff --git a/arch/arm/mach-omap2/hdq1w.c b/arch/arm/mach-omap2/hdq1w.c index 3da8900598c..ab7bf181a10 100644 --- a/arch/arm/mach-omap2/hdq1w.c +++ b/arch/arm/mach-omap2/hdq1w.c @@ -31,11 +31,9 @@  #include "omap_device.h"  #include "hdq1w.h" +#include "prm.h"  #include "common.h" -/* Maximum microseconds to wait for OMAP module to softreset */ -#define MAX_MODULE_SOFTRESET_WAIT	10000 -  /**   * omap_hdq1w_reset - reset the OMAP HDQ1W module   * @oh: struct omap_hwmod * diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c index ad55b943108..be092e8e5d8 100644 --- a/arch/arm/mach-omap2/i2c.c +++ b/arch/arm/mach-omap2/i2c.c @@ -20,10 +20,11 @@   */  #include "soc.h" -#include "common.h"  #include "omap_hwmod.h"  #include "omap_device.h" +#include "prm.h" +#include "common.h"  #include "mux.h"  #include "i2c.h" @@ -32,9 +33,6 @@  #define OMAP2_I2C_CON_OFFSET			0x24  #define OMAP4_I2C_CON_OFFSET			0xA4 -/* Maximum microseconds to wait for OMAP module to softreset */ -#define MAX_MODULE_SOFTRESET_WAIT	10000 -  #define MAX_OMAP_I2C_HWMOD_NAME_LEN	16  static void __init omap2_i2c_mux_pins(int bus_id) diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index cf2362ccb23..f1e12150278 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -559,11 +559,12 @@ void __init omap5xxx_check_revision(void)   * detect the exact revision later on in omap2_detect_revision() once map_io   * is done.   */ -void __init omap2_set_globals_tap(struct omap_globals *omap2_globals) +void __init omap2_set_globals_tap(u32 class, void __iomem *tap)  { -	omap_revision = omap2_globals->class; -	tap_base = omap2_globals->tap; +	omap_revision = class; +	tap_base = tap; +	/* XXX What is this intended to do? */  	if (cpu_is_omap34xx())  		tap_prod_id = 0x0210;  	else diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 4fadc789557..c3472bd8e5a 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -42,8 +42,15 @@  #include "clock44xx.h"  #include "omap-pm.h"  #include "sdrc.h" +#include "control.h"  #include "serial.h" - +#include "cm2xxx.h" +#include "cm3xxx.h" +#include "prm.h" +#include "cm.h" +#include "prcm_mpu44xx.h" +#include "prminst44xx.h" +#include "cminst44xx.h"  /*   * The machine specific code may provide the extra mapping besides the   * default mapping provided here. @@ -265,7 +272,7 @@ static struct map_desc omap54xx_io_desc[] __initdata = {  #endif  #ifdef CONFIG_SOC_OMAP2420 -void __init omap242x_map_common_io(void) +void __init omap242x_map_io(void)  {  	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));  	iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc)); @@ -273,7 +280,7 @@ void __init omap242x_map_common_io(void)  #endif  #ifdef CONFIG_SOC_OMAP2430 -void __init omap243x_map_common_io(void) +void __init omap243x_map_io(void)  {  	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));  	iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc)); @@ -281,28 +288,28 @@ void __init omap243x_map_common_io(void)  #endif  #ifdef CONFIG_ARCH_OMAP3 -void __init omap34xx_map_common_io(void) +void __init omap3_map_io(void)  {  	iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));  }  #endif  #ifdef CONFIG_SOC_TI81XX -void __init omapti81xx_map_common_io(void) +void __init ti81xx_map_io(void)  {  	iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc));  }  #endif  #ifdef CONFIG_SOC_AM33XX -void __init omapam33xx_map_common_io(void) +void __init am33xx_map_io(void)  {  	iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc));  }  #endif  #ifdef CONFIG_ARCH_OMAP4 -void __init omap44xx_map_common_io(void) +void __init omap4_map_io(void)  {  	iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));  	omap_barriers_init(); @@ -310,7 +317,7 @@ void __init omap44xx_map_common_io(void)  #endif  #ifdef CONFIG_SOC_OMAP5 -void __init omap5_map_common_io(void) +void __init omap5_map_io(void)  {  	iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc));  } @@ -377,8 +384,15 @@ static void __init omap_hwmod_init_postsetup(void)  #ifdef CONFIG_SOC_OMAP2420  void __init omap2420_init_early(void)  { -	omap2_set_globals_242x(); +	omap2_set_globals_tap(OMAP242X_CLASS, OMAP2_L4_IO_ADDRESS(0x48014000)); +	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE), +			       OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE), +				  NULL); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), NULL);  	omap2xxx_check_revision(); +	omap2xxx_cm_init();  	omap_common_init_early();  	omap2xxx_voltagedomains_init();  	omap242x_powerdomains_init(); @@ -399,8 +413,15 @@ void __init omap2420_init_late(void)  #ifdef CONFIG_SOC_OMAP2430  void __init omap2430_init_early(void)  { -	omap2_set_globals_243x(); +	omap2_set_globals_tap(OMAP243X_CLASS, OMAP2_L4_IO_ADDRESS(0x4900a000)); +	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE), +			       OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE), +				  NULL); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), NULL);  	omap2xxx_check_revision(); +	omap2xxx_cm_init();  	omap_common_init_early();  	omap2xxx_voltagedomains_init();  	omap243x_powerdomains_init(); @@ -425,9 +446,16 @@ void __init omap2430_init_late(void)  #ifdef CONFIG_ARCH_OMAP3  void __init omap3_init_early(void)  { -	omap2_set_globals_3xxx(); +	omap2_set_globals_tap(OMAP343X_CLASS, OMAP2_L4_IO_ADDRESS(0x4830A000)); +	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE), +			       OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE), +				  NULL); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), NULL);  	omap3xxx_check_revision();  	omap3xxx_check_features(); +	omap3xxx_cm_init();  	omap_common_init_early();  	omap3xxx_voltagedomains_init();  	omap3xxx_powerdomains_init(); @@ -459,7 +487,12 @@ void __init am35xx_init_early(void)  void __init ti81xx_init_early(void)  { -	omap2_set_globals_ti81xx(); +	omap2_set_globals_tap(OMAP343X_CLASS, +			      OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE), +				  NULL); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), NULL);  	omap3xxx_check_revision();  	ti81xx_check_features();  	omap_common_init_early(); @@ -517,7 +550,12 @@ void __init ti81xx_init_late(void)  #ifdef CONFIG_SOC_AM33XX  void __init am33xx_init_early(void)  { -	omap2_set_globals_am33xx(); +	omap2_set_globals_tap(AM335X_CLASS, +			      AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE)); +	omap2_set_globals_control(AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE), +				  NULL); +	omap2_set_globals_prm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE)); +	omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), NULL);  	omap3xxx_check_revision();  	ti81xx_check_features();  	omap_common_init_early(); @@ -533,7 +571,16 @@ void __init am33xx_init_early(void)  #ifdef CONFIG_ARCH_OMAP4  void __init omap4430_init_early(void)  { -	omap2_set_globals_443x(); +	omap2_set_globals_tap(OMAP443X_CLASS, +			      OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE), +				  OMAP2_L4_IO_ADDRESS(OMAP443X_CTRL_BASE)); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP4430_CM_BASE), +			     OMAP2_L4_IO_ADDRESS(OMAP4430_CM2_BASE)); +	omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP4430_PRCM_MPU_BASE)); +	omap_prm_base_init(); +	omap_cm_base_init();  	omap4xxx_check_revision();  	omap4xxx_check_features();  	omap_common_init_early(); @@ -556,7 +603,16 @@ void __init omap4430_init_late(void)  #ifdef CONFIG_SOC_OMAP5  void __init omap5_init_early(void)  { -	omap2_set_globals_5xxx(); +	omap2_set_globals_tap(OMAP54XX_CLASS, +			      OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE)); +	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE), +				  OMAP2_L4_IO_ADDRESS(OMAP54XX_CTRL_BASE)); +	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE)); +	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE), +			     OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE)); +	omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE)); +	omap_prm_base_init(); +	omap_cm_base_init();  	omap5xxx_check_revision();  	omap_common_init_early();  } diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index a106c75c533..bf496510eb5 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c @@ -29,7 +29,7 @@   * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle.   * Sidetone needs non-gated ICLK and sidetone autoidle is broken.   */ -#include "cm2xxx_3xxx.h" +#include "cm3xxx.h"  #include "cm-regbits-34xx.h"  static int omap3_enable_st_clock(unsigned int id, bool enable) diff --git a/arch/arm/mach-omap2/msdi.c b/arch/arm/mach-omap2/msdi.c index 627e97e3074..aafdd4ca9f4 100644 --- a/arch/arm/mach-omap2/msdi.c +++ b/arch/arm/mach-omap2/msdi.c @@ -25,6 +25,7 @@  #include <linux/err.h>  #include <linux/platform_data/gpio-omap.h> +#include "prm.h"  #include "common.h"  #include "control.h"  #include "omap_hwmod.h" @@ -43,9 +44,6 @@  #define MSDI_CON_CLKD_MASK			(0x3f << 0)  #define MSDI_CON_CLKD_SHIFT			0 -/* Maximum microseconds to wait for OMAP module to softreset */ -#define MAX_MODULE_SOFTRESET_WAIT	10000 -  /* MSDI_TARGET_RESET_CLKD: clock divisor to use throughout the reset */  #define MSDI_TARGET_RESET_CLKD		0x3ff diff --git a/arch/arm/mach-omap2/omap2-restart.c b/arch/arm/mach-omap2/omap2-restart.c new file mode 100644 index 00000000000..be6bc89ab1e --- /dev/null +++ b/arch/arm/mach-omap2/omap2-restart.c @@ -0,0 +1,65 @@ +/* + * omap2-restart.c - code common to all OMAP2xxx machines. + * + * Copyright (C) 2012 Texas Instruments + * Paul Walmsley + * + * 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. + */ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/clk.h> +#include <linux/io.h> + +#include "common.h" +#include "prm2xxx.h" + +/* + * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set + * clock and the sys_ck.  Used during the reset process + */ +static struct clk *reset_virt_prcm_set_ck, *reset_sys_ck; + +/* Reboot handling */ + +/** + * omap2xxx_restart - Set DPLL to bypass mode for reboot to work + * + * Set the DPLL to bypass so that reboot completes successfully.  No + * return value. + */ +void omap2xxx_restart(char mode, const char *cmd) +{ +	u32 rate; + +	rate = clk_get_rate(reset_sys_ck); +	clk_set_rate(reset_virt_prcm_set_ck, rate); + +	/* XXX Should save the cmd argument for use after the reboot */ + +	omap2xxx_prm_dpll_reset(); /* never returns */ +	while (1); +} + +/** + * omap2xxx_common_look_up_clks_for_reset - look up clocks needed for restart + * + * Some clocks need to be looked up in advance for the SoC restart + * operation to work - see omap2xxx_restart().  Returns -EINVAL upon + * error or 0 upon success. + */ +static int __init omap2xxx_common_look_up_clks_for_reset(void) +{ +	reset_virt_prcm_set_ck = clk_get(NULL, "virt_prcm_set"); +	if (IS_ERR(reset_virt_prcm_set_ck)) +		return -EINVAL; + +	reset_sys_ck = clk_get(NULL, "sys_ck"); +	if (IS_ERR(reset_sys_ck)) +		return -EINVAL; + +	return 0; +} +core_initcall(omap2xxx_common_look_up_clks_for_reset); diff --git a/arch/arm/mach-omap2/omap3-restart.c b/arch/arm/mach-omap2/omap3-restart.c new file mode 100644 index 00000000000..923c582189e --- /dev/null +++ b/arch/arm/mach-omap2/omap3-restart.c @@ -0,0 +1,36 @@ +/* + * omap3-restart.c - Code common to all OMAP3xxx machines. + * + * Copyright (C) 2009, 2012 Texas Instruments + * Copyright (C) 2010 Nokia Corporation + * Tony Lindgren <tony@atomide.com> + * Santosh Shilimkar <santosh.shilimkar@ti.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. + */ +#include <linux/kernel.h> +#include <linux/init.h> + +#include "iomap.h" +#include "common.h" +#include "control.h" +#include "prm3xxx.h" + +/* Global address base setup code */ + +/** + * omap3xxx_restart - trigger a software restart of the SoC + * @mode: the "reboot mode", see arch/arm/kernel/{setup,process}.c + * @cmd: passed from the userspace program rebooting the system (if provided) + * + * Resets the SoC.  For @cmd, see the 'reboot' syscall in + * kernel/sys.c.  No return value. + */ +void omap3xxx_restart(char mode, const char *cmd) +{ +	omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0)); +	omap3xxx_prm_dpll3_reset(); /* never returns */ +	while (1); +} diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index d25845c471d..64fce07a3cc 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c @@ -29,9 +29,12 @@  #include "omap-wakeupgen.h"  #include "soc.h" +#include "iomap.h"  #include "common.h"  #include "mmc.h"  #include "hsmmc.h" +#include "prminst44xx.h" +#include "prcm_mpu44xx.h"  #include "omap4-sar-layout.h"  #include "omap-secure.h" @@ -280,3 +283,19 @@ int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)  	return 0;  }  #endif + +/** + * omap44xx_restart - trigger a software restart of the SoC + * @mode: the "reboot mode", see arch/arm/kernel/{setup,process}.c + * @cmd: passed from the userspace program rebooting the system (if provided) + * + * Resets the SoC.  For @cmd, see the 'reboot' syscall in + * kernel/sys.c.  No return value. + */ +void omap44xx_restart(char mode, const char *cmd) +{ +	/* XXX Should save 'cmd' into scratchpad for use after reboot */ +	omap4_prminst_global_warm_sw_reset(); /* never returns */ +	while (1); +} + diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 37eeb45612f..139adca3bda 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -141,7 +141,6 @@  #include "clock.h"  #include "omap_hwmod.h" -#include <plat/prcm.h>  #include "soc.h"  #include "common.h" @@ -151,6 +150,7 @@  #include "cm3xxx.h"  #include "cminst44xx.h"  #include "cm33xx.h" +#include "prm.h"  #include "prm3xxx.h"  #include "prm44xx.h"  #include "prm33xx.h" @@ -158,9 +158,6 @@  #include "mux.h"  #include "pm.h" -/* Maximum microseconds to wait for OMAP module to softreset */ -#define MAX_MODULE_SOFTRESET_WAIT	10000 -  /* Name of the OMAP hwmod for the MPU */  #define MPU_INITIATOR_NAME		"mpu" @@ -2064,7 +2061,8 @@ static int _enable(struct omap_hwmod *oh)  			_enable_sysc(oh);  		}  	} else { -		_omap4_disable_module(oh); +		if (soc_ops.disable_module) +			soc_ops.disable_module(oh);  		_disable_clocks(oh);  		pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",  			 oh->name, r); diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2f1ad87c1bb..aa701d76efd 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -37,7 +37,6 @@  #include "clockdomain.h"  #include "powerdomain.h" -#include <plat/prcm.h>  #include <plat-omap/dma-omap.h>  #include "../plat-omap/sram.h" diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 1678a328423..dea62a9aad0 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -29,8 +29,6 @@  #include <asm/cpu.h> -#include <plat/prcm.h> -  #include "powerdomain.h"  #include "clockdomain.h" diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 72df97482cc..c7d355fafd2 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h @@ -406,11 +406,6 @@  #define OMAP3430_EN_CORE_MASK				(1 << 0) -/* - * MAX_MODULE_HARDRESET_WAIT: Maximum microseconds to wait for an OMAP - * submodule to exit hardreset - */ -#define MAX_MODULE_HARDRESET_WAIT		10000  /*   * Maximum time(us) it takes to output the signal WUCLKOUT of the last @@ -419,24 +414,7 @@   * microseconds on OMAP4, so this timeout may be too high.   */  #define MAX_IOPAD_LATCH_TIME			100 -  # ifndef __ASSEMBLER__ -extern void __iomem *prm_base; -extern void __iomem *cm_base; -extern void __iomem *cm2_base; -extern void __iomem *prcm_mpu_base; - -#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) -extern void omap_prm_base_init(void); -extern void omap_cm_base_init(void); -#else -static inline void omap_prm_base_init(void) -{ -} -static inline void omap_cm_base_init(void) -{ -} -#endif  /**   * struct omap_prcm_irq - describes a PRCM interrupt bit diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c deleted file mode 100644 index cff270a178c..00000000000 --- a/arch/arm/mach-omap2/prcm.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * linux/arch/arm/mach-omap2/prcm.c - * - * OMAP 24xx Power Reset and Clock Management (PRCM) functions - * - * Copyright (C) 2005 Nokia Corporation - * - * Written by Tony Lindgren <tony.lindgren@nokia.com> - * - * Copyright (C) 2007 Texas Instruments, Inc. - * Rajendra Nayak <rnayak@ti.com> - * - * Some pieces of code Copyright (C) 2005 Texas Instruments, Inc. - * Upgraded with OMAP4 support by Abhijit Pagare <abhijitpagare@ti.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. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/delay.h> -#include <linux/export.h> - -#include "common.h" -#include <plat/prcm.h> - -#include "soc.h" -#include "clock.h" -#include "clock2xxx.h" -#include "cm2xxx_3xxx.h" -#include "prm2xxx_3xxx.h" -#include "prm44xx.h" -#include "prminst44xx.h" -#include "cminst44xx.h" -#include "prm-regbits-24xx.h" -#include "prm-regbits-44xx.h" -#include "control.h" - -void __iomem *prm_base; -void __iomem *cm_base; -void __iomem *cm2_base; -void __iomem *prcm_mpu_base; - -#define MAX_MODULE_ENABLE_WAIT		100000 - -u32 omap_prcm_get_reset_sources(void) -{ -	/* XXX This presumably needs modification for 34XX */ -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) -		return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; -	if (cpu_is_omap44xx()) -		return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; - -	return 0; -} -EXPORT_SYMBOL(omap_prcm_get_reset_sources); - -/* Resets clock rates and reboots the system. Only called from system.h */ -void omap_prcm_restart(char mode, const char *cmd) -{ -	s16 prcm_offs = 0; - -	if (cpu_is_omap24xx()) { -		omap2xxx_clk_prepare_for_reboot(); - -		prcm_offs = WKUP_MOD; -	} else if (cpu_is_omap34xx()) { -		prcm_offs = OMAP3430_GR_MOD; -		omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0)); -	} else if (cpu_is_omap44xx()) { -		omap4_prminst_global_warm_sw_reset(); /* never returns */ -	} else { -		WARN_ON(1); -	} - -	/* -	 * As per Errata i520, in some cases, user will not be able to -	 * access DDR memory after warm-reset. -	 * This situation occurs while the warm-reset happens during a read -	 * access to DDR memory. In that particular condition, DDR memory -	 * does not respond to a corrupted read command due to the warm -	 * reset occurrence but SDRC is waiting for read completion. -	 * SDRC is not sensitive to the warm reset, but the interconnect is -	 * reset on the fly, thus causing a misalignment between SDRC logic, -	 * interconnect logic and DDR memory state. -	 * WORKAROUND: -	 * Steps to perform before a Warm reset is trigged: -	 * 1. enable self-refresh on idle request -	 * 2. put SDRC in idle -	 * 3. wait until SDRC goes to idle -	 * 4. generate SW reset (Global SW reset) -	 * -	 * Steps to be performed after warm reset occurs (in bootloader): -	 * if HW warm reset is the source, apply below steps before any -	 * accesses to SDRAM: -	 * 1. Reset SMS and SDRC and wait till reset is complete -	 * 2. Re-initialize SMS, SDRC and memory -	 * -	 * NOTE: Above work around is required only if arch reset is implemented -	 * using Global SW reset(GLOBAL_SW_RST). DPLL3 reset does not need -	 * the WA since it resets SDRC as well as part of cold reset. -	 */ - -	/* XXX should be moved to some OMAP2/3 specific code */ -	omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, prcm_offs, -				   OMAP2_RM_RSTCTRL); -	omap2_prm_read_mod_reg(prcm_offs, OMAP2_RM_RSTCTRL); /* OCP barrier */ -} - -/** - * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness - * @reg: physical address of module IDLEST register - * @mask: value to mask against to determine if the module is active - * @idlest: idle state indicator (0 or 1) for the clock - * @name: name of the clock (for printk) - * - * Returns 1 if the module indicated readiness in time, or 0 if it - * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. - * - * XXX This function is deprecated.  It should be removed once the - * hwmod conversion is complete. - */ -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, -				const char *name) -{ -	int i = 0; -	int ena = 0; - -	if (idlest) -		ena = 0; -	else -		ena = mask; - -	/* Wait for lock */ -	omap_test_timeout(((__raw_readl(reg) & mask) == ena), -			  MAX_MODULE_ENABLE_WAIT, i); - -	if (i < MAX_MODULE_ENABLE_WAIT) -		pr_debug("cm: Module associated with clock %s ready after %d loops\n", -			 name, i); -	else -		pr_err("cm: Module associated with clock %s didn't enable in %d tries\n", -		       name, MAX_MODULE_ENABLE_WAIT); - -	return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0; -}; - -void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) -{ -	if (omap2_globals->prm) -		prm_base = omap2_globals->prm; -	if (omap2_globals->cm) -		cm_base = omap2_globals->cm; -	if (omap2_globals->cm2) -		cm2_base = omap2_globals->cm2; -	if (omap2_globals->prcm_mpu) -		prcm_mpu_base = omap2_globals->prcm_mpu; - -	if (cpu_is_omap44xx() || soc_is_omap54xx()) { -		omap_prm_base_init(); -		omap_cm_base_init(); -	} -} - -/* - * Stubbed functions so that common files continue to build when - * custom builds are used - * XXX These are temporary and should be removed at the earliest possible - * opportunity - */ -int __weak omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -	return 0; -} - -void __weak omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, -				s16 cdoffs, u16 clkctrl_offs) -{ -} - -void __weak omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs, -				 u16 clkctrl_offs) -{ -} diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.c b/arch/arm/mach-omap2/prcm_mpu44xx.c index 928dbd4f20e..c30e44a7fab 100644 --- a/arch/arm/mach-omap2/prcm_mpu44xx.c +++ b/arch/arm/mach-omap2/prcm_mpu44xx.c @@ -20,6 +20,12 @@  #include "prcm_mpu44xx.h"  #include "cm-regbits-44xx.h" +/* + * prcm_mpu_base: the virtual address of the start of the PRCM_MPU IP + *   block registers + */ +void __iomem *prcm_mpu_base; +  /* PRCM_MPU low-level functions */  u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 reg) @@ -43,3 +49,14 @@ u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)  	return v;  } + +/** + * omap2_set_globals_prcm_mpu - set the MPU PRCM base address (for early use) + * @prcm_mpu: PRCM_MPU base virtual address + * + * XXX Will be replaced when the PRM/CM drivers are completed. + */ +void __init omap2_set_globals_prcm_mpu(void __iomem *prcm_mpu) +{ +	prcm_mpu_base = prcm_mpu; +} diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.h b/arch/arm/mach-omap2/prcm_mpu44xx.h index 8a6e250f04b..884af7bb4af 100644 --- a/arch/arm/mach-omap2/prcm_mpu44xx.h +++ b/arch/arm/mach-omap2/prcm_mpu44xx.h @@ -1,7 +1,7 @@  /*   * OMAP44xx PRCM MPU instance offset macros   * - * Copyright (C) 2010 Texas Instruments, Inc. + * Copyright (C) 2010, 2012 Texas Instruments, Inc.   * Copyright (C) 2010 Nokia Corporation   *   * Paul Walmsley (paul@pwsan.com) @@ -25,6 +25,12 @@  #ifndef __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H  #define __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H +#include "common.h" + +# ifndef __ASSEMBLER__ +extern void __iomem *prcm_mpu_base; +# endif +  #define OMAP4430_PRCM_MPU_BASE			0x48243000  #define OMAP44XX_PRCM_MPU_REGADDR(inst, reg)				\ @@ -98,6 +104,7 @@ extern u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 idx);  extern void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 idx);  extern u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst,  					    s16 idx); +extern void __init omap2_set_globals_prcm_mpu(void __iomem *prcm_mpu);  # endif  #endif diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h index c30ab5de8d1..a1a266ce90d 100644 --- a/arch/arm/mach-omap2/prm.h +++ b/arch/arm/mach-omap2/prm.h @@ -1,7 +1,7 @@  /*   * OMAP2/3/4 Power/Reset Management (PRM) bitfield definitions   * - * Copyright (C) 2007-2009 Texas Instruments, Inc. + * Copyright (C) 2007-2009, 2012 Texas Instruments, Inc.   * Copyright (C) 2010 Nokia Corporation   *   * Paul Walmsley @@ -15,6 +15,28 @@  #include "prcm-common.h" +# ifndef __ASSEMBLER__ +extern void __iomem *prm_base; +extern void omap2_set_globals_prm(void __iomem *prm); +# endif + + +/* + * MAX_MODULE_SOFTRESET_WAIT: Maximum microseconds to wait for OMAP + * module to softreset + */ +#define MAX_MODULE_SOFTRESET_WAIT		10000 + +/* + * MAX_MODULE_HARDRESET_WAIT: Maximum microseconds to wait for an OMAP + * submodule to exit hardreset + */ +#define MAX_MODULE_HARDRESET_WAIT		10000 + +/* + * Register bitfields + */ +  /*   * 24XX: PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP   * diff --git a/arch/arm/mach-omap2/prm2xxx.c b/arch/arm/mach-omap2/prm2xxx.c index e2860f9c111..bf24fc47603 100644 --- a/arch/arm/mach-omap2/prm2xxx.c +++ b/arch/arm/mach-omap2/prm2xxx.c @@ -20,7 +20,6 @@  #include "common.h"  #include <plat/cpu.h> -#include <plat/prcm.h>  #include "vp.h"  #include "powerdomain.h" @@ -69,6 +68,20 @@ static u32 omap2xxx_prm_read_reset_sources(void)  	return r;  } +/** + * omap2xxx_prm_dpll_reset - use DPLL reset to reboot the OMAP SoC + * + * Set the DPLL reset bit, which should reboot the SoC.  This is the + * recommended way to restart the SoC.  No return value. + */ +void omap2xxx_prm_dpll_reset(void) +{ +	omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, WKUP_MOD, +				   OMAP2_RM_RSTCTRL); +	/* OCP barrier */ +	omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTCTRL); +} +  int omap2xxx_clkdm_sleep(struct clockdomain *clkdm)  {  	omap2_prm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, diff --git a/arch/arm/mach-omap2/prm2xxx.h b/arch/arm/mach-omap2/prm2xxx.h index 1d97112524f..fe8a14f190a 100644 --- a/arch/arm/mach-omap2/prm2xxx.h +++ b/arch/arm/mach-omap2/prm2xxx.h @@ -124,6 +124,8 @@  extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm);  extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm); +extern void omap2xxx_prm_dpll_reset(void); +  extern int __init prm2xxx_init(void);  extern int __exit prm2xxx_exit(void); diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.h b/arch/arm/mach-omap2/prm2xxx_3xxx.h index 3330b1bf789..78532d6fecd 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.h @@ -241,11 +241,4 @@ extern int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm);  #define OMAP_LOGICRETSTATE_MASK				(1 << 2) -/* - * MAX_MODULE_HARDRESET_WAIT: Maximum microseconds to wait for an OMAP - * submodule to exit hardreset - */ -#define MAX_MODULE_HARDRESET_WAIT		10000 - -  #endif diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index 1fea656b2ca..b86116cf0db 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c @@ -20,7 +20,6 @@  #include "common.h"  #include <plat/cpu.h> -#include <plat/prcm.h>  #include "vp.h"  #include "powerdomain.h" @@ -123,6 +122,21 @@ u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset)  }  /** + * omap3xxx_prm_dpll3_reset - use DPLL3 reset to reboot the OMAP SoC + * + * Set the DPLL3 reset bit, which should reboot the SoC.  This is the + * recommended way to restart the SoC, considering Errata i520.  No + * return value. + */ +void omap3xxx_prm_dpll3_reset(void) +{ +	omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, OMAP3430_GR_MOD, +				   OMAP2_RM_RSTCTRL); +	/* OCP barrier */ +	omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTCTRL); +} + +/**   * omap3xxx_prm_read_pending_irqs - read pending PRM MPU IRQs into @events   * @events: ptr to a u32, preallocated by caller   * diff --git a/arch/arm/mach-omap2/prm3xxx.h b/arch/arm/mach-omap2/prm3xxx.h index a3c28a87541..10cd41a8129 100644 --- a/arch/arm/mach-omap2/prm3xxx.h +++ b/arch/arm/mach-omap2/prm3xxx.h @@ -152,6 +152,8 @@ extern void omap3xxx_prm_ocp_barrier(void);  extern void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask);  extern void omap3xxx_prm_restore_irqen(u32 *saved_mask); +extern void omap3xxx_prm_dpll3_reset(void); +  extern u32 omap3xxx_prm_get_reset_sources(void);  #endif /* __ASSEMBLER */ diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index a799e9552fb..6d3467af205 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -18,7 +18,6 @@  #include <linux/err.h>  #include <linux/io.h> -#include <plat/prcm.h>  #include "soc.h"  #include "iomap.h" diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 6c595798c5c..d2e0798a4c8 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c @@ -25,12 +25,12 @@  #include <linux/slab.h>  #include "../plat-omap/common.h" -#include <plat/prcm.h>  #include "prm2xxx_3xxx.h"  #include "prm2xxx.h"  #include "prm3xxx.h"  #include "prm44xx.h" +#include "common.h"  /*   * OMAP_PRCM_MAX_NR_PENDING_REG: maximum number of PRM_IRQ*_MPU regs @@ -55,6 +55,9 @@ static struct irq_chip_generic **prcm_irq_chips;   */  static struct omap_prcm_irq_setup *prcm_irq_setup; +/* prm_base: base virtual address of the PRM IP block */ +void __iomem *prm_base; +  /*   * prm_ll_data: function pointers to SoC-specific implementations of   * common PRM functions @@ -329,6 +332,17 @@ err:  }  /** + * omap2_set_globals_prm - set the PRM base address (for early use) + * @prm: PRM base virtual address + * + * XXX Will be replaced when the PRM/CM drivers are completed. + */ +void __init omap2_set_globals_prm(void __iomem *prm) +{ +	prm_base = prm; +} + +/**   * prm_read_reset_sources - return the sources of the SoC's last reset   *   * Return a u32 bitmask representing the reset sources that caused the diff --git a/arch/arm/mach-omap2/prminst44xx.h b/arch/arm/mach-omap2/prminst44xx.h index 46f2efb3659..a2ede2d6548 100644 --- a/arch/arm/mach-omap2/prminst44xx.h +++ b/arch/arm/mach-omap2/prminst44xx.h @@ -30,4 +30,6 @@ extern int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst,  extern int omap4_prminst_deassert_hardreset(u8 shift, u8 part, s16 inst,  					    u16 rstctrl_offs); +extern void omap_prm_base_init(void); +  #endif diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c index 94d4082f87e..3ed0d62333c 100644 --- a/arch/arm/mach-omap2/sdrc.c +++ b/arch/arm/mach-omap2/sdrc.c @@ -114,12 +114,10 @@ int omap2_sdrc_get_params(unsigned long r,  } -void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals) +void __init omap2_set_globals_sdrc(void __iomem *sdrc, void __iomem *sms)  { -	if (omap2_globals->sdrc) -		omap2_sdrc_base = omap2_globals->sdrc; -	if (omap2_globals->sms) -		omap2_sms_base = omap2_globals->sms; +	omap2_sdrc_base = sdrc; +	omap2_sms_base = sms;  }  /** diff --git a/arch/arm/mach-omap2/sdrc.h b/arch/arm/mach-omap2/sdrc.h index 69c4b329452..446aa13511f 100644 --- a/arch/arm/mach-omap2/sdrc.h +++ b/arch/arm/mach-omap2/sdrc.h @@ -51,6 +51,8 @@ static inline u32 sms_read_reg(u16 reg)  	return __raw_readl(OMAP_SMS_REGADDR(reg));  } +extern void omap2_set_globals_sdrc(void __iomem *sdrc, void __iomem *sms); +  /**   * struct omap_sdrc_params - SDRC parameters for a given SDRC clock rate diff --git a/arch/arm/mach-omap2/ti81xx.h b/arch/arm/mach-omap2/ti81xx.h index 8f9843f7842..a1e6caf0dba 100644 --- a/arch/arm/mach-omap2/ti81xx.h +++ b/arch/arm/mach-omap2/ti81xx.h @@ -22,6 +22,15 @@  #define TI81XX_CTRL_BASE	TI81XX_SCM_BASE  #define TI81XX_PRCM_BASE	0x48180000 +/* + * Adjust TAP register base such that omap3_check_revision accesses the correct + * TI81XX register for checking device ID (it adds 0x204 to tap base while + * TI81XX DEVICE ID register is at offset 0x600 from control base). + */ +#define TI81XX_TAP_BASE		(TI81XX_CTRL_BASE + \ +				 TI81XX_CONTROL_DEVICE_ID - 0x204) + +  #define TI81XX_ARM_INTC_BASE	0x48200000  #endif /* __ASM_ARCH_TI81XX_H */ diff --git a/arch/arm/mach-omap2/wd_timer.c b/arch/arm/mach-omap2/wd_timer.c index f6b6c37ac3f..7c2b4ed38f0 100644 --- a/arch/arm/mach-omap2/wd_timer.c +++ b/arch/arm/mach-omap2/wd_timer.c @@ -1,6 +1,8 @@  /*   * OMAP2+ MPU WD_TIMER-specific code   * + * Copyright (C) 2012 Texas Instruments, Inc. + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -11,10 +13,14 @@  #include <linux/io.h>  #include <linux/err.h> -#include "omap_hwmod.h" +#include <linux/platform_data/omap-wd-timer.h> +#include "omap_hwmod.h" +#include "omap_device.h"  #include "wd_timer.h"  #include "common.h" +#include "prm.h" +#include "soc.h"  /*   * In order to avoid any assumptions from bootloader regarding WDT @@ -26,9 +32,6 @@  #define OMAP_WDT_WPS		0x34  #define OMAP_WDT_SPR		0x48 -/* Maximum microseconds to wait for OMAP module to softreset */ -#define MAX_MODULE_SOFTRESET_WAIT	10000 -  int omap2_wd_timer_disable(struct omap_hwmod *oh)  {  	void __iomem *base; @@ -99,3 +102,32 @@ int omap2_wd_timer_reset(struct omap_hwmod *oh)  	return (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT :  		omap2_wd_timer_disable(oh);  } + +static int __init omap_init_wdt(void) +{ +	int id = -1; +	struct platform_device *pdev; +	struct omap_hwmod *oh; +	char *oh_name = "wd_timer2"; +	char *dev_name = "omap_wdt"; +	struct omap_wd_timer_platform_data pdata; + +	if (!cpu_class_is_omap2() || of_have_populated_dt()) +		return 0; + +	oh = omap_hwmod_lookup(oh_name); +	if (!oh) { +		pr_err("Could not look up wd_timer%d hwmod\n", id); +		return -EINVAL; +	} + +	pdata.read_reset_sources = prm_read_reset_sources; + +	pdev = omap_device_build(dev_name, id, oh, &pdata, +				 sizeof(struct omap_wd_timer_platform_data), +				 NULL, 0, 0); +	WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", +	     dev_name, oh->name); +	return 0; +} +subsys_initcall(omap_init_wdt); diff --git a/arch/arm/plat-omap/include/plat/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h deleted file mode 100644 index 267f43bb2a4..00000000000 --- a/arch/arm/plat-omap/include/plat/prcm.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/prcm.h - * - * Access definations for use in OMAP24XX clock and power management - * - * Copyright (C) 2005 Texas Instruments, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * XXX This file is deprecated.  The PRCM is an OMAP2+-only subsystem, - * so this file doesn't belong in plat-omap/include/plat.  Please - * do not add anything new to this file. - */ - -#ifndef __ASM_ARM_ARCH_OMAP_PRCM_H -#define __ASM_ARM_ARCH_OMAP_PRCM_H - -u32 omap_prcm_get_reset_sources(void); -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, -			 const char *name); - -#endif - - - diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index f5db18dbc0f..477a1d47a64 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -46,8 +46,8 @@  #include <linux/slab.h>  #include <linux/pm_runtime.h>  #include <mach/hardware.h> -#include <plat/cpu.h> -#include <plat/prcm.h> + +#include <linux/platform_data/omap-wd-timer.h>  #include "omap_wdt.h" @@ -202,8 +202,10 @@ static ssize_t omap_wdt_write(struct file *file, const char __user *data,  static long omap_wdt_ioctl(struct file *file, unsigned int cmd,  						unsigned long arg)  { +	struct omap_wd_timer_platform_data *pdata;  	struct omap_wdt_dev *wdev; -	int new_margin; +	u32 rs; +	int new_margin, bs;  	static const struct watchdog_info ident = {  		.identity = "OMAP Watchdog",  		.options = WDIOF_SETTIMEOUT, @@ -211,6 +213,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd,  	};  	wdev = file->private_data; +	pdata = wdev->dev->platform_data;  	switch (cmd) {  	case WDIOC_GETSUPPORT: @@ -219,17 +222,12 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd,  	case WDIOC_GETSTATUS:  		return put_user(0, (int __user *)arg);  	case WDIOC_GETBOOTSTATUS: -#ifdef CONFIG_ARCH_OMAP1 -		if (cpu_is_omap16xx()) -			return put_user(__raw_readw(ARM_SYSST), -					(int __user *)arg); -#endif -#ifdef CONFIG_ARCH_OMAP2PLUS -		if (cpu_is_omap24xx()) -			return put_user(omap_prcm_get_reset_sources(), -					(int __user *)arg); -#endif -		return put_user(0, (int __user *)arg); +		if (!pdata || !pdata->read_reset_sources) +			return put_user(0, (int __user *)arg); +		rs = pdata->read_reset_sources(); +		bs = (rs & (1 << OMAP_MPU_WD_RST_SRC_ID_SHIFT)) ? +			WDIOF_CARDRESET : 0; +		return put_user(bs, (int __user *)arg);  	case WDIOC_KEEPALIVE:  		spin_lock(&wdt_lock);  		omap_wdt_ping(wdev); diff --git a/include/linux/platform_data/omap-wd-timer.h b/include/linux/platform_data/omap-wd-timer.h new file mode 100644 index 00000000000..d75f5f802d9 --- /dev/null +++ b/include/linux/platform_data/omap-wd-timer.h @@ -0,0 +1,38 @@ +/* + * OMAP2+ WDTIMER-specific function prototypes + * + * Copyright (C) 2012 Texas Instruments, Inc. + * Paul Walmsley + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef __LINUX_PLATFORM_DATA_OMAP_WD_TIMER_H +#define __LINUX_PLATFORM_DATA_OMAP_WD_TIMER_H + +#include <linux/types.h> + +/* + * Standardized OMAP reset source bits + * + * This is a subset of the ones listed in arch/arm/mach-omap2/prm.h + * and are the only ones needed in the watchdog driver. + */ +#define OMAP_MPU_WD_RST_SRC_ID_SHIFT				3 + +/** + * struct omap_wd_timer_platform_data - WDTIMER integration to the host SoC + * @read_reset_sources - fn ptr for the SoC to indicate the last reset cause + * + * The function pointed to by @read_reset_sources must return its data + * in a standard format - search for RST_SRC_ID_SHIFT in + * arch/arm/mach-omap2 + */ +struct omap_wd_timer_platform_data { +	u32 (*read_reset_sources)(void); +}; + +#endif  |