diff options
| author | Olof Johansson <olof@lixom.net> | 2012-05-10 23:42:52 -0700 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2012-05-10 23:42:52 -0700 | 
| commit | e2e9bbeec90cb5a23cef153b54ec4307255f4e09 (patch) | |
| tree | f1366f708e5ceb02e5ee4afe20e1e0aee9a42eed | |
| parent | 5056c073d1a4cfcbbf3bb224f3bc04090fe54aec (diff) | |
| parent | 6c432f72b2bd75f7c427eec5558c72f62b35d4a0 (diff) | |
| download | olio-linux-3.10-e2e9bbeec90cb5a23cef153b54ec4307255f4e09.tar.xz olio-linux-3.10-e2e9bbeec90cb5a23cef153b54ec4307255f4e09.zip  | |
Merge tag 'omap-cleanup-devices-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/cleanup2
Changes to split plat-omap/devices.c into mach-omap1 and mach-omap2
except for the RNG driver that will be done later on.
As this depends on omap-devel-hwmod-data-for-v3.5 and causes merge
conflict with omap-fixes-non-critical-for-v3.5, this branch is based
on merge of the two.
By Tony Lindgren (7) and others
via Tony Lindgren (4) and Paul Walmsley (1)
* tag 'omap-cleanup-devices-for-v3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: (27 commits)
  ARM: OMAP1: Pass dma request lines in platform data to MMC driver
  ARM: OMAP: Move omap_mmc_add() to mach-omap1
  ARM: OMAP2: Use hwmod to initialize mmc for 2420
  ARM: OMAP2+: Move omap_dsp_reserve_sdram_memblock() to mach-omap2
  ARM: OMAP1: Move omap_init_uwire to mach-omap1
  ARM: OMAP1: Move omap_init_audio() to keep the devices in alphabetical order
  ARM: OMAP2+: WDTIMER integration: fix !PM boot crash, disarm timer after hwmod reset
  ARM: OMAP2/3: hwmod data: Add 32k-sync timer data to hwmod database
  ARM: OMAP4: hwmod_data: Name the common irq for McBSP ports
  ARM: OMAP4: hwmod data: I2C: add flag for context restore
  ARM: OMAP3: hwmod_data: Rename the common irq for McBSP ports
  ARM: OMAP2xxx: hwmod data: add HDQ/1-wire hwmod
  ARM: OMAP3: hwmod data: add HDQ/1-wire hwmod
  ARM: OMAP2+: hwmod data: add HDQ/1-wire hwmod shared data
  ARM: OMAP2+: HDQ1W: add custom reset function
  ARM: OMAP2420: hwmod data: Add MMC hwmod data for 2420
  arm: omap3: clockdomain data: Remove superfluous commas from gfx_sgx_3xxx_wkdeps[]
  ARM: OMAP2+: powerdomain: Get rid off duplicate pwrdm_clkdm_state_switch() API
  ARM: OMAP3: clock data: add clockdomain for HDQ functional clock
  ARM: OMAP3+: dpll: Configure autoidle mode only if it's supported
  ...
38 files changed, 810 insertions, 265 deletions
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index dcd8ddbec2b..fa1fa4deb6a 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -22,6 +22,7 @@  #include <plat/tc.h>  #include <plat/board.h>  #include <plat/mux.h> +#include <plat/dma.h>  #include <plat/mmc.h>  #include <plat/omap7xx.h> @@ -31,6 +32,22 @@  #include "common.h"  #include "clock.h" +#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE) + +static struct platform_device omap_pcm = { +	.name	= "omap-pcm-audio", +	.id	= -1, +}; + +static void omap_init_audio(void) +{ +	platform_device_register(&omap_pcm); +} + +#else +static inline void omap_init_audio(void) {} +#endif +  /*-------------------------------------------------------------------------*/  #if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE) @@ -128,6 +145,56 @@ static inline void omap1_mmc_mux(struct omap_mmc_platform_data *mmc_controller,  	}  } +#define OMAP_MMC_NR_RES		4 + +/* + * Register MMC devices. + */ +static int __init omap_mmc_add(const char *name, int id, unsigned long base, +				unsigned long size, unsigned int irq, +				unsigned rx_req, unsigned tx_req, +				struct omap_mmc_platform_data *data) +{ +	struct platform_device *pdev; +	struct resource res[OMAP_MMC_NR_RES]; +	int ret; + +	pdev = platform_device_alloc(name, id); +	if (!pdev) +		return -ENOMEM; + +	memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource)); +	res[0].start = base; +	res[0].end = base + size - 1; +	res[0].flags = IORESOURCE_MEM; +	res[1].start = res[1].end = irq; +	res[1].flags = IORESOURCE_IRQ; +	res[2].start = rx_req; +	res[2].name = "rx"; +	res[2].flags = IORESOURCE_DMA; +	res[3].start = tx_req; +	res[3].name = "tx"; +	res[3].flags = IORESOURCE_DMA; + +	ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); +	if (ret == 0) +		ret = platform_device_add_data(pdev, data, sizeof(*data)); +	if (ret) +		goto fail; + +	ret = platform_device_add(pdev); +	if (ret) +		goto fail; + +	/* return device handle to board setup code */ +	data->dev = &pdev->dev; +	return 0; + +fail: +	platform_device_put(pdev); +	return ret; +} +  void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  			int nr_controllers)  { @@ -135,6 +202,7 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  	for (i = 0; i < nr_controllers; i++) {  		unsigned long base, size; +		unsigned rx_req, tx_req;  		unsigned int irq = 0;  		if (!mmc_data[i]) @@ -146,19 +214,24 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  		case 0:  			base = OMAP1_MMC1_BASE;  			irq = INT_MMC; +			rx_req = OMAP_DMA_MMC_RX; +			tx_req = OMAP_DMA_MMC_TX;  			break;  		case 1:  			if (!cpu_is_omap16xx())  				return;  			base = OMAP1_MMC2_BASE;  			irq = INT_1610_MMC2; +			rx_req = OMAP_DMA_MMC2_RX; +			tx_req = OMAP_DMA_MMC2_TX;  			break;  		default:  			continue;  		}  		size = OMAP1_MMC_SIZE; -		omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]); +		omap_mmc_add("mmci-omap", i, base, size, irq, +				rx_req, tx_req, mmc_data[i]);  	};  } @@ -242,23 +315,48 @@ void __init omap1_camera_init(void *info)  static inline void omap_init_sti(void) {} -#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE) +/* Numbering for the SPI-capable controllers when used for SPI: + * spi		= 1 + * uwire	= 2 + * mmc1..2	= 3..4 + * mcbsp1..3	= 5..7 + */ -static struct platform_device omap_pcm = { -	.name	= "omap-pcm-audio", -	.id	= -1, +#if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) + +#define	OMAP_UWIRE_BASE		0xfffb3000 + +static struct resource uwire_resources[] = { +	{ +		.start		= OMAP_UWIRE_BASE, +		.end		= OMAP_UWIRE_BASE + 0x20, +		.flags		= IORESOURCE_MEM, +	},  }; -static void omap_init_audio(void) +static struct platform_device omap_uwire_device = { +	.name	   = "omap_uwire", +	.id	     = -1, +	.num_resources	= ARRAY_SIZE(uwire_resources), +	.resource	= uwire_resources, +}; + +static void omap_init_uwire(void)  { -	platform_device_register(&omap_pcm); -} +	/* FIXME define and use a boot tag; not all boards will be hooking +	 * up devices to the microwire controller, and multi-board configs +	 * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... +	 */ +	/* board-specific code must configure chipselects (only a few +	 * are normally used) and SCLK/SDI/SDO (each has two choices). +	 */ +	(void) platform_device_register(&omap_uwire_device); +}  #else -static inline void omap_init_audio(void) {} +static inline void omap_init_uwire(void) {}  #endif -/*-------------------------------------------------------------------------*/  /*   * This gets called after board-specific INIT_MACHINE, and initializes most @@ -292,11 +390,12 @@ static int __init omap1_init_devices(void)  	 * in alphabetical order so they're easier to sort through.  	 */ +	omap_init_audio();  	omap_init_mbox();  	omap_init_rtc();  	omap_init_spi100k();  	omap_init_sti(); -	omap_init_audio(); +	omap_init_uwire();  	return 0;  } diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 7cdb9401ffa..fa742f3c262 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -4,7 +4,7 @@  # Common support  obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \ -	 common.o gpio.o dma.o wd_timer.o display.o i2c.o +	 common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o  omap-2-3-common				= irq.o sdrc.o  hwmod-common				= omap_hwmod.o \ @@ -186,6 +186,9 @@ ifneq ($(CONFIG_TIDSPBRIDGE),)  obj-y					+= dsp.o  endif +# OMAP2420 MSDI controller integration support ("MMC") +obj-$(CONFIG_SOC_OMAP2420)		+= msdi.o +  # Specific board support  obj-$(CONFIG_MACH_OMAP_GENERIC)		+= board-generic.o  obj-$(CONFIG_MACH_OMAP_H4)		+= board-h4.o diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index d9f4931513f..5c4e6654216 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -439,7 +439,7 @@ void omap2_clk_disable_unused(struct clk *clk)  		clk->ops->disable(clk);  	}  	if (clk->clkdm != NULL) -		pwrdm_clkdm_state_switch(clk->clkdm); +		pwrdm_state_switch(clk->clkdm->pwrdm.ptr);  }  #endif diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index f4a626f7c79..4e1a3b0e8cc 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c @@ -1,7 +1,7 @@  /*   * OMAP3 clock data   * - * Copyright (C) 2007-2010 Texas Instruments, Inc. + * Copyright (C) 2007-2010, 2012 Texas Instruments, Inc.   * Copyright (C) 2007-2011 Nokia Corporation   *   * Written by Paul Walmsley @@ -1640,6 +1640,7 @@ static struct clk hdq_fck = {  	.name		= "hdq_fck",  	.ops		= &clkops_omap2_dflt_wait,  	.parent		= &core_12m_fck, +	.clkdm_name	= "core_l4_clkdm",  	.enable_reg	= OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),  	.enable_bit	= OMAP3430_EN_HDQ_SHIFT,  	.recalc		= &followparent_recalc, @@ -3294,8 +3295,8 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"gfx_l3_ick",	&gfx_l3_ick,	CK_3430ES1),  	CLK(NULL,	"gfx_cg1_ck",	&gfx_cg1_ck,	CK_3430ES1),  	CLK(NULL,	"gfx_cg2_ck",	&gfx_cg2_ck,	CK_3430ES1), -	CLK(NULL,	"sgx_fck",	&sgx_fck,	CK_3430ES2PLUS | CK_3517 | CK_36XX), -	CLK(NULL,	"sgx_ick",	&sgx_ick,	CK_3430ES2PLUS | CK_3517 | CK_36XX), +	CLK(NULL,	"sgx_fck",	&sgx_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX), +	CLK(NULL,	"sgx_ick",	&sgx_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),  	CLK(NULL,	"d2d_26m_fck",	&d2d_26m_fck,	CK_3430ES1),  	CLK(NULL,	"modem_fck",	&modem_fck,	CK_34XX | CK_36XX),  	CLK(NULL,	"sad2d_ick",	&sad2d_ick,	CK_34XX | CK_36XX), @@ -3419,7 +3420,7 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"per_48m_fck",	&per_48m_fck,	CK_3XXX),  	CLK(NULL,	"uart3_fck",	&uart3_fck,	CK_3XXX),  	CLK(NULL,	"uart4_fck",	&uart4_fck,	CK_36XX), -	CLK(NULL,	"uart4_fck",	&uart4_fck_am35xx, CK_3505 | CK_3517), +	CLK(NULL,	"uart4_fck",	&uart4_fck_am35xx, CK_AM35XX),  	CLK(NULL,	"gpt2_fck",	&gpt2_fck,	CK_3XXX),  	CLK(NULL,	"gpt3_fck",	&gpt3_fck,	CK_3XXX),  	CLK(NULL,	"gpt4_fck",	&gpt4_fck,	CK_3XXX), @@ -3513,21 +3514,9 @@ int __init omap3xxx_clk_init(void)  	struct omap_clk *c;  	u32 cpu_clkflg = 0; -	/* -	 * 3505 must be tested before 3517, since 3517 returns true -	 * for both AM3517 chips and AM3517 family chips, which -	 * includes 3505.  Unfortunately there's no obvious family -	 * test for 3517/3505 :-( -	 */ -	if (cpu_is_omap3505()) { -		cpu_mask = RATE_IN_34XX; -		cpu_clkflg = CK_3505; -	} else if (cpu_is_omap3517()) { -		cpu_mask = RATE_IN_34XX; -		cpu_clkflg = CK_3517; -	} else if (cpu_is_omap3505()) { +	if (cpu_is_omap3517()) {  		cpu_mask = RATE_IN_34XX; -		cpu_clkflg = CK_3505; +		cpu_clkflg = CK_AM35XX;  	} else if (cpu_is_omap3630()) {  		cpu_mask = (RATE_IN_34XX | RATE_IN_36XX);  		cpu_clkflg = CK_36XX; diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index fa6ea65ad44..2172f660384 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c @@ -3355,17 +3355,6 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"auxclk5_ck",			&auxclk5_ck,	CK_443X),  	CLK(NULL,	"auxclkreq5_ck",		&auxclkreq5_ck,	CK_443X),  	CLK(NULL,	"gpmc_ck",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt1_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt2_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt3_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt4_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt5_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt6_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt7_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt8_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt9_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt10_ick",			&dummy_ck,	CK_443X), -	CLK(NULL,	"gpt11_ick",			&dummy_ck,	CK_443X),  	CLK("omap_i2c.1",	"ick",				&dummy_ck,	CK_443X),  	CLK("omap_i2c.2",	"ick",				&dummy_ck,	CK_443X),  	CLK("omap_i2c.3",	"ick",				&dummy_ck,	CK_443X), diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index ad07689e156..8664f5a8bfb 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c @@ -840,7 +840,7 @@ void clkdm_allow_idle(struct clockdomain *clkdm)  	spin_lock_irqsave(&clkdm->lock, flags);  	clkdm->_flags |= _CLKDM_FLAG_HWSUP_ENABLED;  	arch_clkdm->clkdm_allow_idle(clkdm); -	pwrdm_clkdm_state_switch(clkdm); +	pwrdm_state_switch(clkdm->pwrdm.ptr);  	spin_unlock_irqrestore(&clkdm->lock, flags);  } @@ -924,8 +924,7 @@ static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm)  	spin_lock_irqsave(&clkdm->lock, flags);  	arch_clkdm->clkdm_clk_enable(clkdm); -	pwrdm_wait_transition(clkdm->pwrdm.ptr); -	pwrdm_clkdm_state_switch(clkdm); +	pwrdm_state_switch(clkdm->pwrdm.ptr);  	spin_unlock_irqrestore(&clkdm->lock, flags);  	pr_debug("clockdomain: clkdm %s: enabled\n", clkdm->name); @@ -950,7 +949,7 @@ static int _clkdm_clk_hwmod_disable(struct clockdomain *clkdm)  	spin_lock_irqsave(&clkdm->lock, flags);  	arch_clkdm->clkdm_clk_disable(clkdm); -	pwrdm_clkdm_state_switch(clkdm); +	pwrdm_state_switch(clkdm->pwrdm.ptr);  	spin_unlock_irqrestore(&clkdm->lock, flags);  	pr_debug("clockdomain: clkdm %s: disabled\n", clkdm->name); diff --git a/arch/arm/mach-omap2/clockdomains3xxx_data.c b/arch/arm/mach-omap2/clockdomains3xxx_data.c index b84e138d99c..6038adb9771 100644 --- a/arch/arm/mach-omap2/clockdomains3xxx_data.c +++ b/arch/arm/mach-omap2/clockdomains3xxx_data.c @@ -53,9 +53,9 @@   * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE   */  static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = { -	{ .clkdm_name = "iva2_clkdm", }, -	{ .clkdm_name = "mpu_clkdm", }, -	{ .clkdm_name = "wkup_clkdm", }, +	{ .clkdm_name = "iva2_clkdm" }, +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" },  	{ NULL },  }; diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index b91275908f3..8083a8cdc55 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h @@ -79,7 +79,7 @@  /* CM_CLKSEL1_PLL_IVA2 */  #define OMAP3430_IVA2_CLK_SRC_SHIFT			19 -#define OMAP3430_IVA2_CLK_SRC_MASK			(0x3 << 19) +#define OMAP3430_IVA2_CLK_SRC_MASK			(0x7 << 19)  #define OMAP3430_IVA2_DPLL_MULT_SHIFT			8  #define OMAP3430_IVA2_DPLL_MULT_MASK			(0x7ff << 8)  #define OMAP3430_IVA2_DPLL_DIV_SHIFT			0 @@ -124,7 +124,7 @@  /* CM_CLKSEL1_PLL_MPU */  #define OMAP3430_MPU_CLK_SRC_SHIFT			19 -#define OMAP3430_MPU_CLK_SRC_MASK			(0x3 << 19) +#define OMAP3430_MPU_CLK_SRC_MASK			(0x7 << 19)  #define OMAP3430_MPU_DPLL_MULT_SHIFT			8  #define OMAP3430_MPU_DPLL_MULT_MASK			(0x7ff << 8)  #define OMAP3430_MPU_DPLL_DIV_SHIFT			0 diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index bd8810c3753..8c86d294b1a 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c @@ -32,6 +32,7 @@  #include "prcm44xx.h"  #include "prm44xx.h"  #include "prcm_mpu44xx.h" +#include "prcm-common.h"  /*   * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield: @@ -49,14 +50,21 @@  #define CLKCTRL_IDLEST_INTERFACE_IDLE		0x2  #define CLKCTRL_IDLEST_DISABLED			0x3 -static u32 _cm_bases[OMAP4_MAX_PRCM_PARTITIONS] = { -	[OMAP4430_INVALID_PRCM_PARTITION]	= 0, -	[OMAP4430_PRM_PARTITION]		= OMAP4430_PRM_BASE, -	[OMAP4430_CM1_PARTITION]		= OMAP4430_CM1_BASE, -	[OMAP4430_CM2_PARTITION]		= OMAP4430_CM2_BASE, -	[OMAP4430_SCRM_PARTITION]		= 0, -	[OMAP4430_PRCM_MPU_PARTITION]		= OMAP4430_PRCM_MPU_BASE, -}; +static void __iomem *_cm_bases[OMAP4_MAX_PRCM_PARTITIONS]; + +/** + * omap_cm_base_init - Populates the cm partitions + * + * Populates the base addresses of the _cm_bases + * array used for read/write of cm module registers. + */ +void omap_cm_base_init(void) +{ +	_cm_bases[OMAP4430_PRM_PARTITION] = prm_base; +	_cm_bases[OMAP4430_CM1_PARTITION] = cm_base; +	_cm_bases[OMAP4430_CM2_PARTITION] = cm2_base; +	_cm_bases[OMAP4430_PRCM_MPU_PARTITION] = prcm_mpu_base; +}  /* Private functions */ @@ -106,7 +114,7 @@ u32 omap4_cminst_read_inst_reg(u8 part, s16 inst, u16 idx)  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION ||  	       !_cm_bases[part]); -	return __raw_readl(OMAP2_L4_IO_ADDRESS(_cm_bases[part] + inst + idx)); +	return __raw_readl(_cm_bases[part] + inst + idx);  }  /* Write into a register in a CM instance */ @@ -115,7 +123,7 @@ void omap4_cminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx)  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION ||  	       !_cm_bases[part]); -	__raw_writel(val, OMAP2_L4_IO_ADDRESS(_cm_bases[part] + inst + idx)); +	__raw_writel(val, _cm_bases[part] + inst + idx);  }  /* Read-modify-write a register in CM1. Caller must lock */ diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 1549c11000d..8a6953a34fe 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c @@ -166,6 +166,7 @@ static struct omap_globals omap4_globals = {  	.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) diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 9c255a3cb39..ec22c24f4e8 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -112,6 +112,7 @@ struct omap_globals {  	void __iomem	*prm;            /* Power and Reset Management */  	void __iomem	*cm;             /* Clock Management */  	void __iomem	*cm2; +	void __iomem	*prcm_mpu;  };  void omap2_set_globals_242x(void); diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index e4336035c0e..3318f67fef7 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -616,7 +616,11 @@ static inline void omap242x_mmc_mux(struct omap_mmc_platform_data  void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)  { -	char *name = "mmci-omap"; +	struct platform_device *pdev; +	struct omap_hwmod *oh; +	int id = 0; +	char *oh_name = "msdi1"; +	char *dev_name = "mmci-omap";  	if (!mmc_data[0]) {  		pr_err("%s fails: Incomplete platform data\n", __func__); @@ -624,8 +628,17 @@ void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)  	}  	omap242x_mmc_mux(mmc_data[0]); -	omap_mmc_add(name, 0, OMAP2_MMC1_BASE, OMAP2420_MMC_SIZE, -					INT_24XX_MMC_IRQ, mmc_data[0]); + +	oh = omap_hwmod_lookup(oh_name); +	if (!oh) { +		pr_err("Could not look up %s\n", oh_name); +		return; +	} +	pdev = omap_device_build(dev_name, id, oh, mmc_data[0], +				 sizeof(struct omap_mmc_platform_data), NULL, 0, 0); +	if (IS_ERR(pdev)) +		WARN(1, "Can'd build omap_device for %s:%s.\n", +					dev_name, oh->name);  }  #endif diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index fc56745676f..f0f10beeffe 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c @@ -142,7 +142,8 @@ static int _omap3_noncore_dpll_lock(struct clk *clk)  	ai = omap3_dpll_autoidle_read(clk); -	omap3_dpll_deny_idle(clk); +	if (ai) +		omap3_dpll_deny_idle(clk);  	_omap3_dpll_write_clken(clk, DPLL_LOCKED); @@ -186,8 +187,6 @@ static int _omap3_noncore_dpll_bypass(struct clk *clk)  	if (ai)  		omap3_dpll_allow_idle(clk); -	else -		omap3_dpll_deny_idle(clk);  	return r;  } @@ -216,8 +215,6 @@ static int _omap3_noncore_dpll_stop(struct clk *clk)  	if (ai)  		omap3_dpll_allow_idle(clk); -	else -		omap3_dpll_deny_idle(clk);  	return 0;  } @@ -519,6 +516,9 @@ u32 omap3_dpll_autoidle_read(struct clk *clk)  	dd = clk->dpll_data; +	if (!dd->autoidle_reg) +		return -EINVAL; +  	v = __raw_readl(dd->autoidle_reg);  	v &= dd->autoidle_mask;  	v >>= __ffs(dd->autoidle_mask); @@ -545,6 +545,12 @@ void omap3_dpll_allow_idle(struct clk *clk)  	dd = clk->dpll_data; +	if (!dd->autoidle_reg) { +		pr_debug("clock: DPLL %s: autoidle not supported\n", +			clk->name); +		return; +	} +  	/*  	 * REVISIT: CORE DPLL can optionally enter low-power bypass  	 * by writing 0x5 instead of 0x1.  Add some mechanism to @@ -554,6 +560,7 @@ void omap3_dpll_allow_idle(struct clk *clk)  	v &= ~dd->autoidle_mask;  	v |= DPLL_AUTOIDLE_LOW_POWER_STOP << __ffs(dd->autoidle_mask);  	__raw_writel(v, dd->autoidle_reg); +  }  /** @@ -572,6 +579,12 @@ void omap3_dpll_deny_idle(struct clk *clk)  	dd = clk->dpll_data; +	if (!dd->autoidle_reg) { +		pr_debug("clock: DPLL %s: autoidle not supported\n", +			clk->name); +		return; +	} +  	v = __raw_readl(dd->autoidle_reg);  	v &= ~dd->autoidle_mask;  	v |= DPLL_AUTOIDLE_DISABLE << __ffs(dd->autoidle_mask); diff --git a/arch/arm/mach-omap2/dsp.c b/arch/arm/mach-omap2/dsp.c index 3376388b317..845309f146f 100644 --- a/arch/arm/mach-omap2/dsp.c +++ b/arch/arm/mach-omap2/dsp.c @@ -28,8 +28,6 @@  #include <plat/dsp.h> -extern phys_addr_t omap_dsp_get_mempool_base(void); -  static struct platform_device *omap_dsp_pdev;  static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { @@ -47,6 +45,31 @@ static struct omap_dsp_platform_data omap_dsp_pdata __initdata = {  	.dsp_cm_rmw_bits = omap2_cm_rmw_mod_reg_bits,  }; +static phys_addr_t omap_dsp_phys_mempool_base; + +void __init omap_dsp_reserve_sdram_memblock(void) +{ +	phys_addr_t size = CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE; +	phys_addr_t paddr; + +	if (!size) +		return; + +	paddr = arm_memblock_steal(size, SZ_1M); +	if (!paddr) { +		pr_err("%s: failed to reserve %llx bytes\n", +				__func__, (unsigned long long)size); +		return; +	} + +	omap_dsp_phys_mempool_base = paddr; +} + +static phys_addr_t omap_dsp_get_mempool_base(void) +{ +	return omap_dsp_phys_mempool_base; +} +  static int __init omap_dsp_init(void)  {  	struct platform_device *pdev; diff --git a/arch/arm/mach-omap2/hdq1w.c b/arch/arm/mach-omap2/hdq1w.c new file mode 100644 index 00000000000..297ebe03f09 --- /dev/null +++ b/arch/arm/mach-omap2/hdq1w.c @@ -0,0 +1,72 @@ +/* + * IP block integration code for the HDQ1W/1-wire IP block + * + * Copyright (C) 2012 Texas Instruments, Inc. + * Paul Walmsley + * + * Based on the I2C reset code in arch/arm/mach-omap2/i2c.c by + *     Avinash.H.M <avinashhm@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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include <plat/omap_hwmod.h> +#include <plat/hdq1w.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 * + * + * OCP soft reset the HDQ1W IP block.  Section 20.6.1.4 "HDQ1W/1-Wire + * Software Reset" of the OMAP34xx Technical Reference Manual Revision + * ZR (SWPU223R) does not include the rather important fact that, for + * the reset to succeed, the HDQ1W module's internal clock gate must be + * programmed to allow the clock to propagate to the rest of the + * module.  In this sense, it's rather similar to the I2C custom reset + * function.  Returns 0. + */ +int omap_hdq1w_reset(struct omap_hwmod *oh) +{ +	u32 v; +	int c = 0; + +	/* Write to the SOFTRESET bit */ +	omap_hwmod_softreset(oh); + +	/* Enable the module's internal clocks */ +	v = omap_hwmod_read(oh, HDQ_CTRL_STATUS_OFFSET); +	v |= 1 << HDQ_CTRL_STATUS_CLOCKENABLE_SHIFT; +	omap_hwmod_write(v, oh, HDQ_CTRL_STATUS_OFFSET); + +	/* Poll on RESETDONE bit */ +	omap_test_timeout((omap_hwmod_read(oh, +					   oh->class->sysc->syss_offs) +			   & SYSS_RESETDONE_MASK), +			  MAX_MODULE_SOFTRESET_WAIT, c); + +	if (c == MAX_MODULE_SOFTRESET_WAIT) +		pr_warning("%s: %s: softreset failed (waited %d usec)\n", +			   __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); +	else +		pr_debug("%s: %s: softreset in %d usec\n", __func__, +			 oh->name, c); + +	return 0; +} diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index bafa5928efd..86a16d34662 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -333,24 +333,6 @@ static void __init omap_hwmod_init_postsetup(void)  #endif  	omap_hwmod_for_each(_set_hwmod_postsetup_state, &postsetup_state); -	/* -	 * Set the default postsetup state for unusual modules (like -	 * MPU WDT). -	 * -	 * The postsetup_state is not actually used until -	 * omap_hwmod_late_init(), so boards that desire full watchdog -	 * coverage of kernel initialization can reprogram the -	 * postsetup_state between the calls to -	 * omap2_init_common_infra() and omap_sdrc_init(). -	 * -	 * XXX ideally we could detect whether the MPU WDT was currently -	 * enabled here and make this conditional -	 */ -	postsetup_state = _HWMOD_STATE_DISABLED; -	omap_hwmod_for_each_by_class("wd_timer", -				     _set_hwmod_postsetup_state, -				     &postsetup_state); -  	omap_pm_if_early_init();  } diff --git a/arch/arm/mach-omap2/msdi.c b/arch/arm/mach-omap2/msdi.c new file mode 100644 index 00000000000..ef2a6924731 --- /dev/null +++ b/arch/arm/mach-omap2/msdi.c @@ -0,0 +1,88 @@ +/* + * MSDI IP block reset + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + * XXX What about pad muxing? + */ + +#include <linux/kernel.h> + +#include <plat/omap_hwmod.h> +#include <plat/mmc.h> + +#include "common.h" + +/* + * MSDI_CON_OFFSET: offset in bytes of the MSDI IP block's CON register + *     from the IP block's base address + */ +#define MSDI_CON_OFFSET				0x0c + +/* Register bitfields in the CON register */ +#define MSDI_CON_POW_MASK			BIT(11) +#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 + +/** + * omap_msdi_reset - reset the MSDI IP block + * @oh: struct omap_hwmod * + * + * The MSDI IP block on OMAP2420 has to have both the POW and CLKD + * fields set inside its CON register for a reset to complete + * successfully.  This is not documented in the TRM.  For CLKD, we use + * the value that results in the lowest possible clock rate, to attempt + * to avoid disturbing any cards. + */ +int omap_msdi_reset(struct omap_hwmod *oh) +{ +	u16 v = 0; +	int c = 0; + +	/* Write to the SOFTRESET bit */ +	omap_hwmod_softreset(oh); + +	/* Enable the MSDI core and internal clock */ +	v |= MSDI_CON_POW_MASK; +	v |= MSDI_TARGET_RESET_CLKD << MSDI_CON_CLKD_SHIFT; +	omap_hwmod_write(v, oh, MSDI_CON_OFFSET); + +	/* Poll on RESETDONE bit */ +	omap_test_timeout((omap_hwmod_read(oh, oh->class->sysc->syss_offs) +			   & SYSS_RESETDONE_MASK), +			  MAX_MODULE_SOFTRESET_WAIT, c); + +	if (c == MAX_MODULE_SOFTRESET_WAIT) +		pr_warning("%s: %s: softreset failed (waited %d usec)\n", +			   __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); +	else +		pr_debug("%s: %s: softreset in %d usec\n", __func__, +			 oh->name, c); + +	/* Disable the MSDI internal clock */ +	v &= ~MSDI_CON_CLKD_MASK; +	omap_hwmod_write(v, oh, MSDI_CON_OFFSET); + +	return 0; +} diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 2c087ffc6a9..a7640d1b215 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c @@ -23,6 +23,7 @@  #include <plat/dmtimer.h>  #include <plat/l3_2xxx.h>  #include <plat/l4_2xxx.h> +#include <plat/mmc.h>  #include "omap_hwmod_common_data.h" @@ -239,6 +240,67 @@ static struct omap_hwmod omap2420_mcbsp2_hwmod = {  	},  }; +static struct omap_hwmod_class_sysconfig omap2420_msdi_sysc = { +	.rev_offs	= 0x3c, +	.sysc_offs	= 0x64, +	.syss_offs	= 0x68, +	.sysc_flags	= (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap2420_msdi_hwmod_class = { +	.name	= "msdi", +	.sysc	= &omap2420_msdi_sysc, +	.reset	= &omap_msdi_reset, +}; + +/* msdi1 */ +static struct omap_hwmod_irq_info omap2420_msdi1_irqs[] = { +	{ .irq = 83 }, +	{ .irq = -1 } +}; + +static struct omap_hwmod_dma_info omap2420_msdi1_sdma_reqs[] = { +	{ .name = "tx", .dma_req = 61 }, /* OMAP24XX_DMA_MMC1_TX */ +	{ .name = "rx", .dma_req = 62 }, /* OMAP24XX_DMA_MMC1_RX */ +	{ .dma_req = -1 } +}; + +static struct omap_hwmod omap2420_msdi1_hwmod = { +	.name		= "msdi1", +	.class		= &omap2420_msdi_hwmod_class, +	.mpu_irqs	= omap2420_msdi1_irqs, +	.sdma_reqs	= omap2420_msdi1_sdma_reqs, +	.main_clk	= "mmc_fck", +	.prcm		= { +		.omap2 = { +			.prcm_reg_id = 1, +			.module_bit = OMAP2420_EN_MMC_SHIFT, +			.module_offs = CORE_MOD, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP2420_ST_MMC_SHIFT, +		}, +	}, +	.flags		= HWMOD_16BIT_REG, +}; + +/* HDQ1W/1-wire */ +static struct omap_hwmod omap2420_hdq1w_hwmod = { +	.name		= "hdq1w", +	.mpu_irqs	= omap2_hdq1w_mpu_irqs, +	.main_clk	= "hdq_fck", +	.prcm		= { +		.omap2 = { +			.module_offs = CORE_MOD, +			.prcm_reg_id = 1, +			.module_bit = OMAP24XX_EN_HDQ_SHIFT, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP24XX_ST_HDQ_SHIFT, +		}, +	}, +	.class		= &omap2_hdq1w_class, +}; +  /*   * interfaces   */ @@ -428,6 +490,53 @@ static struct omap_hwmod_ocp_if omap2420_l4_core__mcbsp2 = {  	.user		= OCP_USER_MPU | OCP_USER_SDMA,  }; +static struct omap_hwmod_addr_space omap2420_msdi1_addrs[] = { +	{ +		.pa_start	= 0x4809c000, +		.pa_end		= 0x4809c000 + SZ_128 - 1, +		.flags		= ADDR_TYPE_RT, +	}, +	{ } +}; + +/* l4_core -> msdi1 */ +static struct omap_hwmod_ocp_if omap2420_l4_core__msdi1 = { +	.master		= &omap2xxx_l4_core_hwmod, +	.slave		= &omap2420_msdi1_hwmod, +	.clk		= "mmc_ick", +	.addr		= omap2420_msdi1_addrs, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +}; + +/* l4_core -> hdq1w interface */ +static struct omap_hwmod_ocp_if omap2420_l4_core__hdq1w = { +	.master		= &omap2xxx_l4_core_hwmod, +	.slave		= &omap2420_hdq1w_hwmod, +	.clk		= "hdq_ick", +	.addr		= omap2_hdq1w_addr_space, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +	.flags		= OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, +}; + + +/* l4_wkup -> 32ksync_counter */ +static struct omap_hwmod_addr_space omap2420_counter_32k_addrs[] = { +	{ +		.pa_start	= 0x48004000, +		.pa_end		= 0x4800401f, +		.flags		= ADDR_TYPE_RT +	}, +	{ } +}; + +static struct omap_hwmod_ocp_if omap2420_l4_wkup__counter_32k = { +	.master		= &omap2xxx_l4_wkup_hwmod, +	.slave		= &omap2xxx_counter_32k_hwmod, +	.clk		= "sync_32k_ick", +	.addr		= omap2420_counter_32k_addrs, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +}; +  static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {  	&omap2xxx_l3_main__l4_core,  	&omap2xxx_mpu__l3_main, @@ -468,6 +577,9 @@ static struct omap_hwmod_ocp_if *omap2420_hwmod_ocp_ifs[] __initdata = {  	&omap2420_l4_core__mailbox,  	&omap2420_l4_core__mcbsp1,  	&omap2420_l4_core__mcbsp2, +	&omap2420_l4_core__msdi1, +	&omap2420_l4_core__hdq1w, +	&omap2420_l4_wkup__counter_32k,  	NULL,  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 71d9f8824f9..4d726498123 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c @@ -528,6 +528,23 @@ static struct omap_hwmod omap2430_mmc2_hwmod = {  	.class		= &omap2430_mmc_class,  }; +/* HDQ1W/1-wire */ +static struct omap_hwmod omap2430_hdq1w_hwmod = { +	.name		= "hdq1w", +	.mpu_irqs	= omap2_hdq1w_mpu_irqs, +	.main_clk	= "hdq_fck", +	.prcm		= { +		.omap2 = { +			.module_offs = CORE_MOD, +			.prcm_reg_id = 1, +			.module_bit = OMAP24XX_EN_HDQ_SHIFT, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP24XX_ST_HDQ_SHIFT, +		}, +	}, +	.class		= &omap2_hdq1w_class, +}; +  /*   * interfaces   */ @@ -838,6 +855,34 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp5 = {  	.user		= OCP_USER_MPU | OCP_USER_SDMA,  }; +/* l4_core -> hdq1w */ +static struct omap_hwmod_ocp_if omap2430_l4_core__hdq1w = { +	.master		= &omap2xxx_l4_core_hwmod, +	.slave		= &omap2430_hdq1w_hwmod, +	.clk		= "hdq_ick", +	.addr		= omap2_hdq1w_addr_space, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +	.flags		= OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, +}; + +/* l4_wkup -> 32ksync_counter */ +static struct omap_hwmod_addr_space omap2430_counter_32k_addrs[] = { +	{ +		.pa_start	= 0x49020000, +		.pa_end		= 0x4902001f, +		.flags		= ADDR_TYPE_RT +	}, +	{ } +}; + +static struct omap_hwmod_ocp_if omap2430_l4_wkup__counter_32k = { +	.master		= &omap2xxx_l4_wkup_hwmod, +	.slave		= &omap2xxx_counter_32k_hwmod, +	.clk		= "sync_32k_ick", +	.addr		= omap2430_counter_32k_addrs, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +}; +  static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {  	&omap2xxx_l3_main__l4_core,  	&omap2xxx_mpu__l3_main, @@ -886,6 +931,8 @@ static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {  	&omap2430_l4_core__mcbsp3,  	&omap2430_l4_core__mcbsp4,  	&omap2430_l4_core__mcbsp5, +	&omap2430_l4_core__hdq1w, +	&omap2430_l4_wkup__counter_32k,  	NULL,  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c index 04637fabadd..cbb4ef6544a 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c @@ -171,3 +171,12 @@ struct omap_hwmod_addr_space omap2_mcbsp1_addrs[] = {  	},  	{ }  }; + +struct omap_hwmod_addr_space omap2_hdq1w_addr_space[] = { +	{ +		.pa_start       = 0x480b2000, +		.pa_end         = 0x480b2fff, +		.flags          = ADDR_TYPE_RT, +	}, +	{ } +}; diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c index f08e442af39..102d76e9e9e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c @@ -2,6 +2,7 @@   * omap_hwmod_2xxx_3xxx_ipblock_data.c - common IP block data for OMAP2/3   *   * Copyright (C) 2011 Nokia Corporation + * Copyright (C) 2012 Texas Instruments, Inc.   * Paul Walmsley   *   * This program is free software; you can redistribute it and/or modify @@ -12,6 +13,7 @@  #include <plat/serial.h>  #include <plat/dma.h>  #include <plat/common.h> +#include <plat/hdq1w.h>  #include <mach/irqs.h> @@ -302,3 +304,23 @@ struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[] = {  	{ .irq = -1 }  }; +struct omap_hwmod_class_sysconfig omap2_hdq1w_sysc = { +	.rev_offs	= 0x0, +	.sysc_offs	= 0x14, +	.syss_offs	= 0x18, +	.sysc_flags	= (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | +			   SYSS_HAS_RESET_STATUS), +	.sysc_fields    = &omap_hwmod_sysc_type1, +}; + +struct omap_hwmod_class omap2_hdq1w_class = { +	.name	= "hdq1w", +	.sysc	= &omap2_hdq1w_sysc, +	.reset	= &omap_hdq1w_reset, +}; + +struct omap_hwmod_irq_info omap2_hdq1w_mpu_irqs[] = { +	{ .irq = 58, }, +	{ .irq = -1 } +}; + diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index 45aaa07e302..83eafd96eca 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c @@ -89,7 +89,8 @@ static struct omap_hwmod_class_sysconfig omap2xxx_wd_timer_sysc = {  struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class = {  	.name		= "wd_timer",  	.sysc		= &omap2xxx_wd_timer_sysc, -	.pre_shutdown	= &omap2_wd_timer_disable +	.pre_shutdown	= &omap2_wd_timer_disable, +	.reset		= &omap2_wd_timer_reset,  };  /* @@ -732,3 +733,23 @@ struct omap_hwmod omap2xxx_mcspi2_hwmod = {  	.class		= &omap2xxx_mcspi_class,  	.dev_attr	= &omap_mcspi2_dev_attr,  }; + + +static struct omap_hwmod_class omap2xxx_counter_hwmod_class = { +	.name	= "counter", +}; + +struct omap_hwmod omap2xxx_counter_32k_hwmod = { +	.name		= "counter_32k", +	.main_clk	= "func_32k_ck", +	.prcm		= { +		.omap2	= { +			.module_offs = WKUP_MOD, +			.prcm_reg_id = 1, +			.module_bit = OMAP24XX_ST_32KSYNC_SHIFT, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP24XX_ST_32KSYNC_SHIFT, +		}, +	}, +	.class		= &omap2xxx_counter_hwmod_class, +}; diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 43d288066d0..b26d3c9bca1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -418,7 +418,8 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {  static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = {  	.name		= "wd_timer",  	.sysc		= &omap3xxx_wd_timer_sysc, -	.pre_shutdown	= &omap2_wd_timer_disable +	.pre_shutdown	= &omap2_wd_timer_disable, +	.reset		= &omap2_wd_timer_reset,  };  static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { @@ -1075,7 +1076,7 @@ static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {  /* mcbsp1 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = { -	{ .name = "irq", .irq = 16 }, +	{ .name = "common", .irq = 16 },  	{ .name = "tx", .irq = 59 },  	{ .name = "rx", .irq = 60 },  	{ .irq = -1 } @@ -1100,7 +1101,7 @@ static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {  /* mcbsp2 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = { -	{ .name = "irq", .irq = 17 }, +	{ .name = "common", .irq = 17 },  	{ .name = "tx", .irq = 62 },  	{ .name = "rx", .irq = 63 },  	{ .irq = -1 } @@ -1130,7 +1131,7 @@ static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {  /* mcbsp3 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = { -	{ .name = "irq", .irq = 22 }, +	{ .name = "common", .irq = 22 },  	{ .name = "tx", .irq = 89 },  	{ .name = "rx", .irq = 90 },  	{ .irq = -1 } @@ -1160,7 +1161,7 @@ static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {  /* mcbsp4 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = { -	{ .name = "irq", .irq = 23 }, +	{ .name = "common", .irq = 23 },  	{ .name = "tx", .irq = 54 },  	{ .name = "rx", .irq = 55 },  	{ .irq = -1 } @@ -1191,7 +1192,7 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {  /* mcbsp5 */  static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = { -	{ .name = "irq", .irq = 27 }, +	{ .name = "common", .irq = 27 },  	{ .name = "tx", .irq = 81 },  	{ .name = "rx", .irq = 82 },  	{ .irq = -1 } @@ -1980,6 +1981,56 @@ static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {  	},  }; +static struct omap_hwmod omap3xxx_hdq1w_hwmod = { +	.name		= "hdq1w", +	.mpu_irqs	= omap2_hdq1w_mpu_irqs, +	.main_clk	= "hdq_fck", +	.prcm		= { +		.omap2 = { +			.module_offs = CORE_MOD, +			.prcm_reg_id = 1, +			.module_bit = OMAP3430_EN_HDQ_SHIFT, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP3430_ST_HDQ_SHIFT, +		}, +	}, +	.class		= &omap2_hdq1w_class, +}; + +/* + * '32K sync counter' class + * 32-bit ordinary counter, clocked by the falling edge of the 32 khz clock + */ +static struct omap_hwmod_class_sysconfig omap3xxx_counter_sysc = { +	.rev_offs	= 0x0000, +	.sysc_offs	= 0x0004, +	.sysc_flags	= SYSC_HAS_SIDLEMODE, +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO), +	.sysc_fields	= &omap_hwmod_sysc_type1, +}; + +static struct omap_hwmod_class omap3xxx_counter_hwmod_class = { +	.name	= "counter", +	.sysc	= &omap3xxx_counter_sysc, +}; + +static struct omap_hwmod omap3xxx_counter_32k_hwmod = { +	.name		= "counter_32k", +	.class		= &omap3xxx_counter_hwmod_class, +	.clkdm_name	= "wkup_clkdm", +	.flags		= HWMOD_SWSUP_SIDLE, +	.main_clk	= "wkup_32k_fck", +	.prcm		= { +		.omap2	= { +			.module_offs = WKUP_MOD, +			.prcm_reg_id = 1, +			.module_bit = OMAP3430_ST_32KSYNC_SHIFT, +			.idlest_reg_id = 1, +			.idlest_idle_bit = OMAP3430_ST_32KSYNC_SHIFT, +		}, +	}, +}; +  /*   * interfaces   */ @@ -3059,6 +3110,34 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = {  	.user		= OCP_USER_MPU | OCP_USER_SDMA,  }; +/* l4_core -> hdq1w interface */ +static struct omap_hwmod_ocp_if omap3xxx_l4_core__hdq1w = { +	.master		= &omap3xxx_l4_core_hwmod, +	.slave		= &omap3xxx_hdq1w_hwmod, +	.clk		= "hdq_ick", +	.addr		= omap2_hdq1w_addr_space, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +	.flags		= OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, +}; + +/* l4_wkup -> 32ksync_counter */ +static struct omap_hwmod_addr_space omap3xxx_counter_32k_addrs[] = { +	{ +		.pa_start	= 0x48320000, +		.pa_end		= 0x4832001f, +		.flags		= ADDR_TYPE_RT +	}, +	{ } +}; + +static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__counter_32k = { +	.master		= &omap3xxx_l4_wkup_hwmod, +	.slave		= &omap3xxx_counter_32k_hwmod, +	.clk		= "omap_32ksync_ick", +	.addr		= omap3xxx_counter_32k_addrs, +	.user		= OCP_USER_MPU | OCP_USER_SDMA, +}; +  static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l3_main__l4_core,  	&omap3xxx_l3_main__l4_per, @@ -3103,6 +3182,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {  	&omap34xx_l4_core__mcspi2,  	&omap34xx_l4_core__mcspi3,  	&omap34xx_l4_core__mcspi4, +	&omap3xxx_l4_wkup__counter_32k,  	NULL,  }; @@ -3151,6 +3231,7 @@ static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = {  	&omap34xx_l4_core__sr1,  	&omap34xx_l4_core__sr2,  	&omap3xxx_l4_core__mailbox, +	&omap3xxx_l4_core__hdq1w,  	NULL  }; @@ -3170,6 +3251,7 @@ static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l4_core__usb_tll_hs,  	&omap3xxx_l4_core__es3plus_mmc1,  	&omap3xxx_l4_core__es3plus_mmc2, +	&omap3xxx_l4_core__hdq1w,  	NULL  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 49061295475..950454a3fa3 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -1487,7 +1487,8 @@ static struct omap_hwmod_class omap44xx_i2c_hwmod_class = {  };  static struct omap_i2c_dev_attr i2c_dev_attr = { -	.flags	= OMAP_I2C_FLAG_BUS_SHIFT_NONE, +	.flags	= OMAP_I2C_FLAG_BUS_SHIFT_NONE | +			OMAP_I2C_FLAG_RESET_REGS_POSTIDLE,  };  /* i2c1 */ @@ -1911,7 +1912,7 @@ static struct omap_hwmod_class omap44xx_mcbsp_hwmod_class = {  /* mcbsp1 */  static struct omap_hwmod_irq_info omap44xx_mcbsp1_irqs[] = { -	{ .irq = 17 + OMAP44XX_IRQ_GIC_START }, +	{ .name = "common", .irq = 17 + OMAP44XX_IRQ_GIC_START },  	{ .irq = -1 }  }; @@ -1946,7 +1947,7 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = {  /* mcbsp2 */  static struct omap_hwmod_irq_info omap44xx_mcbsp2_irqs[] = { -	{ .irq = 22 + OMAP44XX_IRQ_GIC_START }, +	{ .name = "common", .irq = 22 + OMAP44XX_IRQ_GIC_START },  	{ .irq = -1 }  }; @@ -1981,7 +1982,7 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = {  /* mcbsp3 */  static struct omap_hwmod_irq_info omap44xx_mcbsp3_irqs[] = { -	{ .irq = 23 + OMAP44XX_IRQ_GIC_START }, +	{ .name = "common", .irq = 23 + OMAP44XX_IRQ_GIC_START },  	{ .irq = -1 }  }; @@ -2016,7 +2017,7 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = {  /* mcbsp4 */  static struct omap_hwmod_irq_info omap44xx_mcbsp4_irqs[] = { -	{ .irq = 16 + OMAP44XX_IRQ_GIC_START }, +	{ .name = "common", .irq = 16 + OMAP44XX_IRQ_GIC_START },  	{ .irq = -1 }  }; @@ -3534,6 +3535,7 @@ static struct omap_hwmod_class omap44xx_wd_timer_hwmod_class = {  	.name		= "wd_timer",  	.sysc		= &omap44xx_wd_timer_sysc,  	.pre_shutdown	= &omap2_wd_timer_disable, +	.reset		= &omap2_wd_timer_reset,  };  /* wd_timer2 */ diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.h b/arch/arm/mach-omap2/omap_hwmod_common_data.h index 7aa9156d50a..e7e8eeae95e 100644 --- a/arch/arm/mach-omap2/omap_hwmod_common_data.h +++ b/arch/arm/mach-omap2/omap_hwmod_common_data.h @@ -38,6 +38,7 @@ extern struct omap_hwmod_addr_space omap2430_mcspi3_addr_space[];  extern struct omap_hwmod_addr_space omap2_dma_system_addrs[];  extern struct omap_hwmod_addr_space omap2_mailbox_addrs[];  extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[]; +extern struct omap_hwmod_addr_space omap2_hdq1w_addr_space[];  /* Common IP block data across OMAP2xxx */  extern struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[]; @@ -74,6 +75,7 @@ extern struct omap_hwmod omap2xxx_gpio3_hwmod;  extern struct omap_hwmod omap2xxx_gpio4_hwmod;  extern struct omap_hwmod omap2xxx_mcspi1_hwmod;  extern struct omap_hwmod omap2xxx_mcspi2_hwmod; +extern struct omap_hwmod omap2xxx_counter_32k_hwmod;  /* Common interface data across OMAP2xxx */  extern struct omap_hwmod_ocp_if omap2xxx_l3_main__l4_core; @@ -141,6 +143,7 @@ extern struct omap_hwmod_irq_info omap2_dma_system_irqs[];  extern struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[];  extern struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[];  extern struct omap_hwmod_addr_space omap2xxx_timer12_addrs[]; +extern struct omap_hwmod_irq_info omap2_hdq1w_mpu_irqs[];  /* OMAP hwmod classes - forward declarations */  extern struct omap_hwmod_class l3_hwmod_class; @@ -152,6 +155,8 @@ extern struct omap_hwmod_class omap2_dss_hwmod_class;  extern struct omap_hwmod_class omap2_dispc_hwmod_class;  extern struct omap_hwmod_class omap2_rfbi_hwmod_class;  extern struct omap_hwmod_class omap2_venc_hwmod_class; +extern struct omap_hwmod_class_sysconfig omap2_hdq1w_sysc; +extern struct omap_hwmod_class omap2_hdq1w_class;  extern struct omap_hwmod_class omap2xxx_timer_hwmod_class;  extern struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class; diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 96ad3dbeac3..96114901b93 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -981,16 +981,6 @@ int pwrdm_state_switch(struct powerdomain *pwrdm)  	return ret;  } -int pwrdm_clkdm_state_switch(struct clockdomain *clkdm) -{ -	if (clkdm != NULL && clkdm->pwrdm.ptr != NULL) { -		pwrdm_wait_transition(clkdm->pwrdm.ptr); -		return pwrdm_state_switch(clkdm->pwrdm.ptr); -	} - -	return -EINVAL; -} -  int pwrdm_pre_transition(void)  {  	pwrdm_for_each(_pwrdm_pre_transition_cb, NULL); diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index 0d72a8a8ce4..8f88d65c46e 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h @@ -213,7 +213,6 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);  int pwrdm_wait_transition(struct powerdomain *pwrdm);  int pwrdm_state_switch(struct powerdomain *pwrdm); -int pwrdm_clkdm_state_switch(struct clockdomain *clkdm);  int pwrdm_pre_transition(void);  int pwrdm_post_transition(void);  int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 5aa5435e3ff..6da3ba483ad 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h @@ -177,6 +177,8 @@  /* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */  #define OMAP24XX_ST_GPIOS_SHIFT				2  #define OMAP24XX_ST_GPIOS_MASK				(1 << 2) +#define OMAP24XX_ST_32KSYNC_SHIFT			1 +#define OMAP24XX_ST_32KSYNC_MASK			(1 << 1)  #define OMAP24XX_ST_GPT1_SHIFT				0  #define OMAP24XX_ST_GPT1_MASK				(1 << 0) @@ -307,6 +309,8 @@  #define OMAP3430_ST_SR1_MASK				(1 << 6)  #define OMAP3430_ST_GPIO1_SHIFT				3  #define OMAP3430_ST_GPIO1_MASK				(1 << 3) +#define OMAP3430_ST_32KSYNC_SHIFT			2 +#define OMAP3430_ST_32KSYNC_MASK			(1 << 2)  #define OMAP3430_ST_GPT12_SHIFT				1  #define OMAP3430_ST_GPT12_MASK				(1 << 1)  #define OMAP3430_ST_GPT1_SHIFT				0 @@ -410,6 +414,19 @@  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_ARCH_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 index 626acfad719..480f40a5ee4 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -42,6 +42,7 @@  void __iomem *prm_base;  void __iomem *cm_base;  void __iomem *cm2_base; +void __iomem *prcm_mpu_base;  #define MAX_MODULE_ENABLE_WAIT		100000 @@ -155,4 +156,11 @@ void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals)  		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()) { +		omap_prm_base_init(); +		omap_cm_base_init(); +	}  } diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c index 9b3898a3ac9..c12320c0ae9 100644 --- a/arch/arm/mach-omap2/prminst44xx.c +++ b/arch/arm/mach-omap2/prminst44xx.c @@ -18,20 +18,26 @@  #include "iomap.h"  #include "common.h" +#include "prcm-common.h"  #include "prm44xx.h"  #include "prminst44xx.h"  #include "prm-regbits-44xx.h"  #include "prcm44xx.h"  #include "prcm_mpu44xx.h" -static u32 _prm_bases[OMAP4_MAX_PRCM_PARTITIONS] = { -	[OMAP4430_INVALID_PRCM_PARTITION]	= 0, -	[OMAP4430_PRM_PARTITION]		= OMAP4430_PRM_BASE, -	[OMAP4430_CM1_PARTITION]		= 0, -	[OMAP4430_CM2_PARTITION]		= 0, -	[OMAP4430_SCRM_PARTITION]		= 0, -	[OMAP4430_PRCM_MPU_PARTITION]		= OMAP4430_PRCM_MPU_BASE, -}; +static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS]; + +/** + * omap_prm_base_init - Populates the prm partitions + * + * Populates the base addresses of the _prm_bases + * array used for read/write of prm module registers. + */ +void omap_prm_base_init(void) +{ +	_prm_bases[OMAP4430_PRM_PARTITION] = prm_base; +	_prm_bases[OMAP4430_PRCM_MPU_PARTITION] = prcm_mpu_base; +}  /* Read a register in a PRM instance */  u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx) @@ -39,8 +45,7 @@ u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx)  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION ||  	       !_prm_bases[part]); -	return __raw_readl(OMAP2_L4_IO_ADDRESS(_prm_bases[part] + inst + -					       idx)); +	return __raw_readl(_prm_bases[part] + inst + idx);  }  /* Write into a register in a PRM instance */ @@ -49,7 +54,7 @@ void omap4_prminst_write_inst_reg(u32 val, u8 part, s16 inst, u16 idx)  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION ||  	       !_prm_bases[part]); -	__raw_writel(val, OMAP2_L4_IO_ADDRESS(_prm_bases[part] + inst + idx)); +	__raw_writel(val, _prm_bases[part] + inst + idx);  }  /* Read-modify-write a register in PRM. Caller must lock */ diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index ecec873e78c..1b7835865c8 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -178,13 +178,6 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,  	if (IS_ERR(timer->fclk))  		return -ENODEV; -	sprintf(name, "gpt%d_ick", gptimer_id); -	timer->iclk = clk_get(NULL, name); -	if (IS_ERR(timer->iclk)) { -		clk_put(timer->fclk); -		return -ENODEV; -	} -  	omap_hwmod_enable(oh);  	sys_timer_reserved |= (1 << (gptimer_id - 1)); diff --git a/arch/arm/mach-omap2/wd_timer.c b/arch/arm/mach-omap2/wd_timer.c index 4067669d96c..b2f1c67043a 100644 --- a/arch/arm/mach-omap2/wd_timer.c +++ b/arch/arm/mach-omap2/wd_timer.c @@ -14,6 +14,7 @@  #include <plat/omap_hwmod.h>  #include "wd_timer.h" +#include "common.h"  /*   * In order to avoid any assumptions from bootloader regarding WDT @@ -25,6 +26,8 @@  #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)  { @@ -54,3 +57,45 @@ int omap2_wd_timer_disable(struct omap_hwmod *oh)  	return 0;  } +/** + * omap2_wdtimer_reset - reset and disable the WDTIMER IP block + * @oh: struct omap_hwmod * + * + * After the WDTIMER IP blocks are reset on OMAP2/3, we must also take + * care to execute the special watchdog disable sequence.  This is + * because the watchdog is re-armed upon OCP softreset.  (On OMAP4, + * this behavior was apparently changed and the watchdog is no longer + * re-armed after an OCP soft-reset.)  Returns -ETIMEDOUT if the reset + * did not complete, or 0 upon success. + * + * XXX Most of this code should be moved to the omap_hwmod.c layer + * during a normal merge window.  omap_hwmod_softreset() should be + * renamed to omap_hwmod_set_ocp_softreset(), and omap_hwmod_softreset() + * should call the hwmod _ocp_softreset() code. + */ +int omap2_wd_timer_reset(struct omap_hwmod *oh) +{ +	int c = 0; + +	/* Write to the SOFTRESET bit */ +	omap_hwmod_softreset(oh); + +	/* Poll on RESETDONE bit */ +	omap_test_timeout((omap_hwmod_read(oh, +					   oh->class->sysc->syss_offs) +			   & SYSS_RESETDONE_MASK), +			  MAX_MODULE_SOFTRESET_WAIT, c); + +	if (oh->class->sysc->srst_udelay) +		udelay(oh->class->sysc->srst_udelay); + +	if (c == MAX_MODULE_SOFTRESET_WAIT) +		pr_warning("%s: %s: softreset failed (waited %d usec)\n", +			   __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT); +	else +		pr_debug("%s: %s: softreset in %d usec\n", __func__, +			 oh->name, c); + +	return (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : +		omap2_wd_timer_disable(oh); +} diff --git a/arch/arm/mach-omap2/wd_timer.h b/arch/arm/mach-omap2/wd_timer.h index e0054a2d550..f6bbba73b53 100644 --- a/arch/arm/mach-omap2/wd_timer.h +++ b/arch/arm/mach-omap2/wd_timer.h @@ -13,5 +13,6 @@  #include <plat/omap_hwmod.h>  extern int omap2_wd_timer_disable(struct omap_hwmod *oh); +extern int omap2_wd_timer_reset(struct omap_hwmod *oh);  #endif diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 09b07d25289..1cba9273d2c 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -28,54 +28,6 @@  #include <plat/menelaus.h>  #include <plat/omap44xx.h> -#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ -	defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) - -#define OMAP_MMC_NR_RES		2 - -/* - * Register MMC devices. Called from mach-omap1 and mach-omap2 device init. - */ -int __init omap_mmc_add(const char *name, int id, unsigned long base, -				unsigned long size, unsigned int irq, -				struct omap_mmc_platform_data *data) -{ -	struct platform_device *pdev; -	struct resource res[OMAP_MMC_NR_RES]; -	int ret; - -	pdev = platform_device_alloc(name, id); -	if (!pdev) -		return -ENOMEM; - -	memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource)); -	res[0].start = base; -	res[0].end = base + size - 1; -	res[0].flags = IORESOURCE_MEM; -	res[1].start = res[1].end = irq; -	res[1].flags = IORESOURCE_IRQ; - -	ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); -	if (ret == 0) -		ret = platform_device_add_data(pdev, data, sizeof(*data)); -	if (ret) -		goto fail; - -	ret = platform_device_add(pdev); -	if (ret) -		goto fail; - -	/* return device handle to board setup code */ -	data->dev = &pdev->dev; -	return 0; - -fail: -	platform_device_put(pdev); -	return ret; -} - -#endif -  /*-------------------------------------------------------------------------*/  #if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE) @@ -109,79 +61,6 @@ static void omap_init_rng(void)  static inline void omap_init_rng(void) {}  #endif -/*-------------------------------------------------------------------------*/ - -/* Numbering for the SPI-capable controllers when used for SPI: - * spi		= 1 - * uwire	= 2 - * mmc1..2	= 3..4 - * mcbsp1..3	= 5..7 - */ - -#if defined(CONFIG_SPI_OMAP_UWIRE) || defined(CONFIG_SPI_OMAP_UWIRE_MODULE) - -#define	OMAP_UWIRE_BASE		0xfffb3000 - -static struct resource uwire_resources[] = { -	{ -		.start		= OMAP_UWIRE_BASE, -		.end		= OMAP_UWIRE_BASE + 0x20, -		.flags		= IORESOURCE_MEM, -	}, -}; - -static struct platform_device omap_uwire_device = { -	.name	   = "omap_uwire", -	.id	     = -1, -	.num_resources	= ARRAY_SIZE(uwire_resources), -	.resource	= uwire_resources, -}; - -static void omap_init_uwire(void) -{ -	/* FIXME define and use a boot tag; not all boards will be hooking -	 * up devices to the microwire controller, and multi-board configs -	 * mean that CONFIG_SPI_OMAP_UWIRE may be configured anyway... -	 */ - -	/* board-specific code must configure chipselects (only a few -	 * are normally used) and SCLK/SDI/SDO (each has two choices). -	 */ -	(void) platform_device_register(&omap_uwire_device); -} -#else -static inline void omap_init_uwire(void) {} -#endif - -#if defined(CONFIG_TIDSPBRIDGE) || defined(CONFIG_TIDSPBRIDGE_MODULE) - -static phys_addr_t omap_dsp_phys_mempool_base; - -void __init omap_dsp_reserve_sdram_memblock(void) -{ -	phys_addr_t size = CONFIG_TIDSPBRIDGE_MEMPOOL_SIZE; -	phys_addr_t paddr; - -	if (!size) -		return; - -	paddr = arm_memblock_steal(size, SZ_1M); -	if (!paddr) { -		pr_err("%s: failed to reserve %llx bytes\n", -				__func__, (unsigned long long)size); -		return; -	} - -	omap_dsp_phys_mempool_base = paddr; -} - -phys_addr_t omap_dsp_get_mempool_base(void) -{ -	return omap_dsp_phys_mempool_base; -} -EXPORT_SYMBOL(omap_dsp_get_mempool_base); -#endif -  /*   * This gets called after board-specific INIT_MACHINE, and initializes most   * on-chip peripherals accessible on this board (except for few like USB): @@ -208,7 +87,6 @@ static int __init omap_init_devices(void)  	 * in alphabetical order so they're easier to sort through.  	 */  	omap_init_rng(); -	omap_init_uwire();  	return 0;  }  arch_initcall(omap_init_devices); diff --git a/arch/arm/plat-omap/include/plat/clkdev_omap.h b/arch/arm/plat-omap/include/plat/clkdev_omap.h index b299b8d201c..d0ed8c443a6 100644 --- a/arch/arm/plat-omap/include/plat/clkdev_omap.h +++ b/arch/arm/plat-omap/include/plat/clkdev_omap.h @@ -34,8 +34,7 @@ struct omap_clk {  #define CK_243X		(1 << 5)	/* 243x, 253x */  #define CK_3430ES1	(1 << 6)	/* 34xxES1 only */  #define CK_3430ES2PLUS	(1 << 7)	/* 34xxES2, ES3, non-Sitara 35xx only */ -#define CK_3505		(1 << 8) -#define CK_3517		(1 << 9) +#define CK_AM35XX	(1 << 9)	/* Sitara AM35xx */  #define CK_36XX		(1 << 10)	/* 36xx/37xx-specific clocks */  #define CK_443X		(1 << 11)  #define CK_TI816X	(1 << 12) @@ -44,7 +43,6 @@ struct omap_clk {  #define CK_34XX		(CK_3430ES1 | CK_3430ES2PLUS) -#define CK_AM35XX	(CK_3505 | CK_3517)	/* all Sitara AM35xx */  #define CK_3XXX		(CK_34XX | CK_AM35XX | CK_36XX) diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index a4c08d04e28..f0511a97502 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h @@ -258,7 +258,7 @@ struct omap_dm_timer {  	unsigned long phys_base;  	int id;  	int irq; -	struct clk *iclk, *fclk; +	struct clk *fclk;  	void __iomem	*io_base;  	void __iomem	*sys_stat;	/* TISTAT timer status */ diff --git a/arch/arm/plat-omap/include/plat/hdq1w.h b/arch/arm/plat-omap/include/plat/hdq1w.h new file mode 100644 index 00000000000..0c1efc846d8 --- /dev/null +++ b/arch/arm/plat-omap/include/plat/hdq1w.h @@ -0,0 +1,36 @@ +/* + * Shared macros and function prototypes for the HDQ1W/1-wire IP block + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#ifndef ARCH_ARM_MACH_OMAP2_HDQ1W_H +#define ARCH_ARM_MACH_OMAP2_HDQ1W_H + +#include <plat/omap_hwmod.h> + +/* + * XXX A future cleanup patch should modify + * drivers/w1/masters/omap_hdq.c to use these macros + */ +#define HDQ_CTRL_STATUS_OFFSET			0x0c +#define HDQ_CTRL_STATUS_CLOCKENABLE_SHIFT	5 + + +extern int omap_hdq1w_reset(struct omap_hwmod *oh); + +#endif diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index 7a38750c007..a7754a886d4 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h @@ -16,6 +16,7 @@  #include <linux/mmc/host.h>  #include <plat/board.h> +#include <plat/omap_hwmod.h>  #define OMAP15XX_NR_MMC		1  #define OMAP16XX_NR_MMC		2 @@ -176,9 +177,6 @@ extern void omap_mmc_notify_cover_event(struct device *dev, int slot,  void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  				int nr_controllers);  void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data); -int omap_mmc_add(const char *name, int id, unsigned long base, -				unsigned long size, unsigned int irq, -				struct omap_mmc_platform_data *data);  #else  static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  				int nr_controllers) @@ -187,12 +185,9 @@ static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)  {  } -static inline int omap_mmc_add(const char *name, int id, unsigned long base, -				unsigned long size, unsigned int irq, -				struct omap_mmc_platform_data *data) -{ -	return 0; -}  #endif + +extern int omap_msdi_reset(struct omap_hwmod *oh); +  #endif  |