diff options
Diffstat (limited to 'arch/arm/plat-omap')
105 files changed, 1717 insertions, 22552 deletions
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index 92c5bb7909f..02fc10d2d63 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig @@ -5,24 +5,6 @@ menu "TI OMAP Common Features"  config ARCH_OMAP_OTG  	bool -choice -	prompt "OMAP System Type" -	default ARCH_OMAP2PLUS - -config ARCH_OMAP1 -	bool "TI OMAP1" -	select COMMON_CLKDEV -	help -	  "Systems based on omap7xx, omap15xx or omap16xx" - -config ARCH_OMAP2PLUS -	bool "TI OMAP2/3/4" -	select COMMON_CLKDEV -	help -	  "Systems based on OMAP2, OMAP3 or OMAP4" - -endchoice -  comment "OMAP Feature Selections"  config OMAP_DEBUG_DEVICES @@ -31,9 +13,40 @@ config OMAP_DEBUG_DEVICES  	  For debug cards on TI reference boards.  config OMAP_DEBUG_LEDS -	bool +	def_bool y if NEW_LEDS  	depends on OMAP_DEBUG_DEVICES -	default y if LEDS_CLASS +	select LEDS_CLASS + +config POWER_AVS_OMAP +	bool "AVS(Adaptive Voltage Scaling) support for OMAP IP versions 1&2" +	depends on POWER_AVS && (ARCH_OMAP3 || ARCH_OMAP4) && PM +	select POWER_SUPPLY +	help +	  Say Y to enable AVS(Adaptive Voltage Scaling) +	  support on OMAP containing the version 1 or +	  version 2 of the SmartReflex IP. +	  V1 is the 65nm version used in OMAP3430. +	  V2 is the update for the 45nm version of the IP used in OMAP3630 +	  and OMAP4430 + +	  Please note, that by default SmartReflex is only +	  initialized and not enabled. To enable the automatic voltage +	  compensation for vdd mpu and vdd core from user space, +	  user must write 1 to +		/debug/smartreflex/sr_<X>/autocomp, +	  where X is mpu_iva or core for OMAP3. +	  Optionally autocompensation can be enabled in the kernel +	  by default during system init via the enable_on_init flag +	  which an be passed as platform data to the smartreflex driver. + +config POWER_AVS_OMAP_CLASS3 +	bool "Class 3 mode of Smartreflex Implementation" +	depends on POWER_AVS_OMAP && TWL4030_CORE +	help +	  Say Y to enable Class 3 implementation of Smartreflex + +	  Class 3 implementation of Smartreflex employs continuous hardware +	  voltage calibration.  config OMAP_RESET_CLOCKS  	bool "Reset unused clocks during boot" @@ -73,48 +86,9 @@ config OMAP_MUX_WARNINGS  	  to change the pin multiplexing setup.	 When there are no warnings  	  printed, it's safe to deselect OMAP_MUX for your product. -config OMAP_MCBSP -	bool "McBSP support" -	depends on ARCH_OMAP -	default y -	help -	  Say Y here if you want support for the OMAP Multichannel -	  Buffered Serial Port. - -config OMAP_MBOX_FWK -	tristate "Mailbox framework support" -	depends on ARCH_OMAP -	help -	  Say Y here if you want to use OMAP Mailbox framework support for -	  DSP, IVA1.0 and IVA2 in OMAP1/2/3. - -config OMAP_MBOX_KFIFO_SIZE -	int "Mailbox kfifo default buffer size (bytes)" -	depends on OMAP_MBOX_FWK -	default 256 -	help -	  Specify the default size of mailbox's kfifo buffers (bytes). -	  This can also be changed at runtime (via the mbox_kfifo_size -	  module parameter). - -config OMAP_IOMMU -	tristate - -config OMAP_IOMMU_DEBUG -       tristate "Export OMAP IOMMU internals in DebugFS" -       depends on OMAP_IOMMU && DEBUG_FS -       help -         Select this to see extensive information about -         the internal state of OMAP IOMMU in debugfs. - -         Say N unless you know you need this. - -choice -	prompt "System timer" -	default OMAP_32K_TIMER if !ARCH_OMAP15XX -  config OMAP_MPU_TIMER  	bool "Use mpu timer" +	depends on ARCH_OMAP1  	help  	  Select this option if you want to use the OMAP mpu timer. This  	  timer provides more intra-tick resolution than the 32KHz timer, @@ -123,14 +97,19 @@ config OMAP_MPU_TIMER  config OMAP_32K_TIMER  	bool "Use 32KHz timer"  	depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS +	default y if (ARCH_OMAP16XX || ARCH_OMAP2PLUS)  	help  	  Select this option if you want to enable the OMAP 32KHz timer.  	  This timer saves power compared to the OMAP_MPU_TIMER, and has  	  support for no tick during idle. The 32KHz timer provides less  	  intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is -	  currently only available for OMAP16XX, 24XX, 34XX and OMAP4. +	  currently only available for OMAP16XX, 24XX, 34XX, OMAP4/5 and DRA7XX. + +	  On OMAP2PLUS this value is only used for CONFIG_HZ and +	  CLOCK_TICK_RATE compile time calculation. +	  The actual timer selection is done in the board file +	  through the (DT_)MACHINE_START structure. -endchoice  config OMAP3_L2_AUX_SECURE_SAVE_RESTORE  	bool "OMAP3 HS/EMU save and restore for L2 AUX control register" @@ -149,15 +128,6 @@ config OMAP3_L2_AUX_SECURE_SERVICE_SET_ID  	help  	  PPA routine service ID for setting L2 auxiliary control register. -config OMAP_32K_TIMER_HZ -	int "Kernel internal timer frequency for 32KHz timer" -	range 32 1024 -	depends on OMAP_32K_TIMER -	default "128" -	help -	  Kernel internal timer frequency should be a divisor of 32768, -	  such as 64 or 128. -  config OMAP_DM_TIMER  	bool "Use dual-mode timer"  	depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS @@ -178,9 +148,6 @@ choice  	depends on ARCH_OMAP  	default OMAP_PM_NOOP -config OMAP_PM_NONE -	bool "No PM layer" -  config OMAP_PM_NOOP  	bool "No-op/debug PM layer" diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index a4a12859fdd..0b01b68fd03 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile @@ -2,33 +2,18 @@  # Makefile for the linux kernel.  # +ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/plat-omap/include +  # Common support -obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \ -	 usb.o fb.o io.o counter_32k.o +obj-y := sram.o dma.o counter_32k.o  obj-m :=  obj-n :=  obj-  := -# OCPI interconnect support for 1710, 1610 and 5912 -obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o -  # omap_device support (OMAP2+ only at the moment) -obj-$(CONFIG_ARCH_OMAP2) += omap_device.o -obj-$(CONFIG_ARCH_OMAP3) += omap_device.o -obj-$(CONFIG_ARCH_OMAP4) += omap_device.o -obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o -obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o -obj-$(CONFIG_OMAP_IOMMU_DEBUG) += iommu-debug.o - -obj-$(CONFIG_CPU_FREQ) += cpu-omap.o  obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o -obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o  obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o  i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o  obj-y += $(i2c-omap-m) $(i2c-omap-y) -# OMAP mailbox framework -obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o - -obj-$(CONFIG_OMAP_PM_NOOP) += omap-pm-noop.o diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c deleted file mode 100644 index fc62fb5fc20..00000000000 --- a/arch/arm/plat-omap/clock.c +++ /dev/null @@ -1,518 +0,0 @@ -/* - *  linux/arch/arm/plat-omap/clock.c - * - *  Copyright (C) 2004 - 2008 Nokia corporation - *  Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> - * - *  Modified for omap shared clock framework by Tony Lindgren <tony@atomide.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/list.h> -#include <linux/errno.h> -#include <linux/err.h> -#include <linux/string.h> -#include <linux/clk.h> -#include <linux/mutex.h> -#include <linux/cpufreq.h> -#include <linux/debugfs.h> -#include <linux/io.h> - -#include <plat/clock.h> - -static LIST_HEAD(clocks); -static DEFINE_MUTEX(clocks_mutex); -static DEFINE_SPINLOCK(clockfw_lock); - -static struct clk_functions *arch_clock; - -/* - * Standard clock functions defined in include/linux/clk.h - */ - -int clk_enable(struct clk *clk) -{ -	unsigned long flags; -	int ret = 0; - -	if (clk == NULL || IS_ERR(clk)) -		return -EINVAL; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (arch_clock->clk_enable) -		ret = arch_clock->clk_enable(clk); -	spin_unlock_irqrestore(&clockfw_lock, flags); - -	return ret; -} -EXPORT_SYMBOL(clk_enable); - -void clk_disable(struct clk *clk) -{ -	unsigned long flags; - -	if (clk == NULL || IS_ERR(clk)) -		return; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (clk->usecount == 0) { -		pr_err("Trying disable clock %s with 0 usecount\n", -		       clk->name); -		WARN_ON(1); -		goto out; -	} - -	if (arch_clock->clk_disable) -		arch_clock->clk_disable(clk); - -out: -	spin_unlock_irqrestore(&clockfw_lock, flags); -} -EXPORT_SYMBOL(clk_disable); - -unsigned long clk_get_rate(struct clk *clk) -{ -	unsigned long flags; -	unsigned long ret = 0; - -	if (clk == NULL || IS_ERR(clk)) -		return 0; - -	spin_lock_irqsave(&clockfw_lock, flags); -	ret = clk->rate; -	spin_unlock_irqrestore(&clockfw_lock, flags); - -	return ret; -} -EXPORT_SYMBOL(clk_get_rate); - -/* - * Optional clock functions defined in include/linux/clk.h - */ - -long clk_round_rate(struct clk *clk, unsigned long rate) -{ -	unsigned long flags; -	long ret = 0; - -	if (clk == NULL || IS_ERR(clk)) -		return ret; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (arch_clock->clk_round_rate) -		ret = arch_clock->clk_round_rate(clk, rate); -	spin_unlock_irqrestore(&clockfw_lock, flags); - -	return ret; -} -EXPORT_SYMBOL(clk_round_rate); - -int clk_set_rate(struct clk *clk, unsigned long rate) -{ -	unsigned long flags; -	int ret = -EINVAL; - -	if (clk == NULL || IS_ERR(clk)) -		return ret; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (arch_clock->clk_set_rate) -		ret = arch_clock->clk_set_rate(clk, rate); -	if (ret == 0) { -		if (clk->recalc) -			clk->rate = clk->recalc(clk); -		propagate_rate(clk); -	} -	spin_unlock_irqrestore(&clockfw_lock, flags); - -	return ret; -} -EXPORT_SYMBOL(clk_set_rate); - -int clk_set_parent(struct clk *clk, struct clk *parent) -{ -	unsigned long flags; -	int ret = -EINVAL; - -	if (clk == NULL || IS_ERR(clk) || parent == NULL || IS_ERR(parent)) -		return ret; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (clk->usecount == 0) { -		if (arch_clock->clk_set_parent) -			ret = arch_clock->clk_set_parent(clk, parent); -		if (ret == 0) { -			if (clk->recalc) -				clk->rate = clk->recalc(clk); -			propagate_rate(clk); -		} -	} else -		ret = -EBUSY; -	spin_unlock_irqrestore(&clockfw_lock, flags); - -	return ret; -} -EXPORT_SYMBOL(clk_set_parent); - -struct clk *clk_get_parent(struct clk *clk) -{ -	return clk->parent; -} -EXPORT_SYMBOL(clk_get_parent); - -/* - * OMAP specific clock functions shared between omap1 and omap2 - */ - -int __initdata mpurate; - -/* - * By default we use the rate set by the bootloader. - * You can override this with mpurate= cmdline option. - */ -static int __init omap_clk_setup(char *str) -{ -	get_option(&str, &mpurate); - -	if (!mpurate) -		return 1; - -	if (mpurate < 1000) -		mpurate *= 1000000; - -	return 1; -} -__setup("mpurate=", omap_clk_setup); - -/* Used for clocks that always have same value as the parent clock */ -unsigned long followparent_recalc(struct clk *clk) -{ -	return clk->parent->rate; -} - -/* - * Used for clocks that have the same value as the parent clock, - * divided by some factor - */ -unsigned long omap_fixed_divisor_recalc(struct clk *clk) -{ -	WARN_ON(!clk->fixed_div); - -	return clk->parent->rate / clk->fixed_div; -} - -void clk_reparent(struct clk *child, struct clk *parent) -{ -	list_del_init(&child->sibling); -	if (parent) -		list_add(&child->sibling, &parent->children); -	child->parent = parent; - -	/* now do the debugfs renaming to reattach the child -	   to the proper parent */ -} - -/* Propagate rate to children */ -void propagate_rate(struct clk *tclk) -{ -	struct clk *clkp; - -	list_for_each_entry(clkp, &tclk->children, sibling) { -		if (clkp->recalc) -			clkp->rate = clkp->recalc(clkp); -		propagate_rate(clkp); -	} -} - -static LIST_HEAD(root_clks); - -/** - * recalculate_root_clocks - recalculate and propagate all root clocks - * - * Recalculates all root clocks (clocks with no parent), which if the - * clock's .recalc is set correctly, should also propagate their rates. - * Called at init. - */ -void recalculate_root_clocks(void) -{ -	struct clk *clkp; - -	list_for_each_entry(clkp, &root_clks, sibling) { -		if (clkp->recalc) -			clkp->rate = clkp->recalc(clkp); -		propagate_rate(clkp); -	} -} - -/** - * clk_preinit - initialize any fields in the struct clk before clk init - * @clk: struct clk * to initialize - * - * Initialize any struct clk fields needed before normal clk initialization - * can run.  No return value. - */ -void clk_preinit(struct clk *clk) -{ -	INIT_LIST_HEAD(&clk->children); -} - -int clk_register(struct clk *clk) -{ -	if (clk == NULL || IS_ERR(clk)) -		return -EINVAL; - -	/* -	 * trap out already registered clocks -	 */ -	if (clk->node.next || clk->node.prev) -		return 0; - -	mutex_lock(&clocks_mutex); -	if (clk->parent) -		list_add(&clk->sibling, &clk->parent->children); -	else -		list_add(&clk->sibling, &root_clks); - -	list_add(&clk->node, &clocks); -	if (clk->init) -		clk->init(clk); -	mutex_unlock(&clocks_mutex); - -	return 0; -} -EXPORT_SYMBOL(clk_register); - -void clk_unregister(struct clk *clk) -{ -	if (clk == NULL || IS_ERR(clk)) -		return; - -	mutex_lock(&clocks_mutex); -	list_del(&clk->sibling); -	list_del(&clk->node); -	mutex_unlock(&clocks_mutex); -} -EXPORT_SYMBOL(clk_unregister); - -void clk_enable_init_clocks(void) -{ -	struct clk *clkp; - -	list_for_each_entry(clkp, &clocks, node) { -		if (clkp->flags & ENABLE_ON_INIT) -			clk_enable(clkp); -	} -} - -/** - * omap_clk_get_by_name - locate OMAP struct clk by its name - * @name: name of the struct clk to locate - * - * Locate an OMAP struct clk by its name.  Assumes that struct clk - * names are unique.  Returns NULL if not found or a pointer to the - * struct clk if found. - */ -struct clk *omap_clk_get_by_name(const char *name) -{ -	struct clk *c; -	struct clk *ret = NULL; - -	mutex_lock(&clocks_mutex); - -	list_for_each_entry(c, &clocks, node) { -		if (!strcmp(c->name, name)) { -			ret = c; -			break; -		} -	} - -	mutex_unlock(&clocks_mutex); - -	return ret; -} - -/* - * Low level helpers - */ -static int clkll_enable_null(struct clk *clk) -{ -	return 0; -} - -static void clkll_disable_null(struct clk *clk) -{ -} - -const struct clkops clkops_null = { -	.enable		= clkll_enable_null, -	.disable	= clkll_disable_null, -}; - -/* - * Dummy clock - * - * Used for clock aliases that are needed on some OMAPs, but not others - */ -struct clk dummy_ck = { -	.name	= "dummy", -	.ops	= &clkops_null, -}; - -#ifdef CONFIG_CPU_FREQ -void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) -{ -	unsigned long flags; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (arch_clock->clk_init_cpufreq_table) -		arch_clock->clk_init_cpufreq_table(table); -	spin_unlock_irqrestore(&clockfw_lock, flags); -} - -void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) -{ -	unsigned long flags; - -	spin_lock_irqsave(&clockfw_lock, flags); -	if (arch_clock->clk_exit_cpufreq_table) -		arch_clock->clk_exit_cpufreq_table(table); -	spin_unlock_irqrestore(&clockfw_lock, flags); -} -#endif - -/* - * - */ - -#ifdef CONFIG_OMAP_RESET_CLOCKS -/* - * Disable any unused clocks left on by the bootloader - */ -static int __init clk_disable_unused(void) -{ -	struct clk *ck; -	unsigned long flags; - -	pr_info("clock: disabling unused clocks to save power\n"); -	list_for_each_entry(ck, &clocks, node) { -		if (ck->ops == &clkops_null) -			continue; - -		if (ck->usecount > 0 || !ck->enable_reg) -			continue; - -		spin_lock_irqsave(&clockfw_lock, flags); -		if (arch_clock->clk_disable_unused) -			arch_clock->clk_disable_unused(ck); -		spin_unlock_irqrestore(&clockfw_lock, flags); -	} - -	return 0; -} -late_initcall(clk_disable_unused); -#endif - -int __init clk_init(struct clk_functions * custom_clocks) -{ -	if (!custom_clocks) { -		pr_err("No custom clock functions registered\n"); -		BUG(); -	} - -	arch_clock = custom_clocks; - -	return 0; -} - -#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) -/* - *	debugfs support to trace clock tree hierarchy and attributes - */ -static struct dentry *clk_debugfs_root; - -static int clk_debugfs_register_one(struct clk *c) -{ -	int err; -	struct dentry *d, *child, *child_tmp; -	struct clk *pa = c->parent; -	char s[255]; -	char *p = s; - -	p += sprintf(p, "%s", c->name); -	d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root); -	if (!d) -		return -ENOMEM; -	c->dent = d; - -	d = debugfs_create_u8("usecount", S_IRUGO, c->dent, (u8 *)&c->usecount); -	if (!d) { -		err = -ENOMEM; -		goto err_out; -	} -	d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate); -	if (!d) { -		err = -ENOMEM; -		goto err_out; -	} -	d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags); -	if (!d) { -		err = -ENOMEM; -		goto err_out; -	} -	return 0; - -err_out: -	d = c->dent; -	list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child) -		debugfs_remove(child); -	debugfs_remove(c->dent); -	return err; -} - -static int clk_debugfs_register(struct clk *c) -{ -	int err; -	struct clk *pa = c->parent; - -	if (pa && !pa->dent) { -		err = clk_debugfs_register(pa); -		if (err) -			return err; -	} - -	if (!c->dent) { -		err = clk_debugfs_register_one(c); -		if (err) -			return err; -	} -	return 0; -} - -static int __init clk_debugfs_init(void) -{ -	struct clk *c; -	struct dentry *d; -	int err; - -	d = debugfs_create_dir("clock", NULL); -	if (!d) -		return -ENOMEM; -	clk_debugfs_root = d; - -	list_for_each_entry(c, &clocks, node) { -		err = clk_debugfs_register(c); -		if (err) -			goto err_out; -	} -	return 0; -err_out: -	debugfs_remove_recursive(clk_debugfs_root); -	return err; -} -late_initcall(clk_debugfs_init); - -#endif /* defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) */ diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c deleted file mode 100644 index f0473182030..00000000000 --- a/arch/arm/plat-omap/common.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * linux/arch/arm/plat-omap/common.c - * - * Code common to all OMAP machines. - * The file is created by Tony Lindgren <tony@atomide.com> - * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - 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 <linux/io.h> -#include <linux/omapfb.h> - -#include <plat/common.h> -#include <plat/board.h> -#include <plat/vram.h> -#include <plat/dsp.h> - - -#define NO_LENGTH_CHECK 0xffffffff - -struct omap_board_config_kernel *omap_board_config; -int omap_board_config_size; - -static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out) -{ -	struct omap_board_config_kernel *kinfo = NULL; -	int i; - -	/* Try to find the config from the board-specific structures -	 * in the kernel. */ -	for (i = 0; i < omap_board_config_size; i++) { -		if (omap_board_config[i].tag == tag) { -			if (skip == 0) { -				kinfo = &omap_board_config[i]; -				break; -			} else { -				skip--; -			} -		} -	} -	if (kinfo == NULL) -		return NULL; -	return kinfo->data; -} - -const void *__omap_get_config(u16 tag, size_t len, int nr) -{ -        return get_config(tag, len, nr, NULL); -} -EXPORT_SYMBOL(__omap_get_config); - -const void *omap_get_var_config(u16 tag, size_t *len) -{ -        return get_config(tag, NO_LENGTH_CHECK, 0, len); -} -EXPORT_SYMBOL(omap_get_var_config); - -void __init omap_reserve(void) -{ -	omapfb_reserve_sdram_memblock(); -	omap_vram_reserve_sdram_memblock(); -	omap_dsp_reserve_sdram_memblock(); -} diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 155fe43a672..61b4d705c26 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c @@ -15,13 +15,20 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/clk.h> +#include <linux/err.h>  #include <linux/io.h> +#include <linux/clocksource.h> +#include <linux/sched_clock.h> -#include <plat/common.h> -#include <plat/board.h> +#include <asm/mach/time.h> -#include <plat/clock.h> +#include <plat/counter-32k.h> +/* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */ +#define OMAP2_32KSYNCNT_REV_OFF		0x0 +#define OMAP2_32KSYNCNT_REV_SCHEME	(0x3 << 30) +#define OMAP2_32KSYNCNT_CR_OFF_LOW	0x10 +#define OMAP2_32KSYNCNT_CR_OFF_HIGH	0x30  /*   * 32KHz clocksource ... always available, on pretty most chips except @@ -29,155 +36,88 @@   * higher resolution in free-running counter modes (e.g. 12 MHz xtal),   * but systems won't necessarily want to spend resources that way.   */ +static void __iomem *sync32k_cnt_reg; -#define OMAP16XX_TIMER_32K_SYNCHRONIZED		0xfffbc410 - -#if !(defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP15XX)) - -#include <linux/clocksource.h> - -/* - * offset_32k holds the init time counter value. It is then subtracted - * from every counter read to achieve a counter that counts time from the - * kernel boot (needed for sched_clock()). - */ -static u32 offset_32k __read_mostly; - -#ifdef CONFIG_ARCH_OMAP16XX -static cycle_t omap16xx_32k_read(struct clocksource *cs) -{ -	return omap_readl(OMAP16XX_TIMER_32K_SYNCHRONIZED) - offset_32k; -} -#else -#define omap16xx_32k_read	NULL -#endif - -#ifdef CONFIG_ARCH_OMAP2420 -static cycle_t omap2420_32k_read(struct clocksource *cs) -{ -	return omap_readl(OMAP2420_32KSYNCT_BASE + 0x10) - offset_32k; -} -#else -#define omap2420_32k_read	NULL -#endif - -#ifdef CONFIG_ARCH_OMAP2430 -static cycle_t omap2430_32k_read(struct clocksource *cs) -{ -	return omap_readl(OMAP2430_32KSYNCT_BASE + 0x10) - offset_32k; -} -#else -#define omap2430_32k_read	NULL -#endif - -#ifdef CONFIG_ARCH_OMAP3 -static cycle_t omap34xx_32k_read(struct clocksource *cs) -{ -	return omap_readl(OMAP3430_32KSYNCT_BASE + 0x10) - offset_32k; -} -#else -#define omap34xx_32k_read	NULL -#endif - -#ifdef CONFIG_ARCH_OMAP4 -static cycle_t omap44xx_32k_read(struct clocksource *cs) -{ -	return omap_readl(OMAP4430_32KSYNCT_BASE + 0x10) - offset_32k; -} -#else -#define omap44xx_32k_read	NULL -#endif - -/* - * Kernel assumes that sched_clock can be called early but may not have - * things ready yet. - */ -static cycle_t omap_32k_read_dummy(struct clocksource *cs) -{ -	return 0; -} - -static struct clocksource clocksource_32k = { -	.name		= "32k_counter", -	.rating		= 250, -	.read		= omap_32k_read_dummy, -	.mask		= CLOCKSOURCE_MASK(32), -	.shift		= 10, -	.flags		= CLOCK_SOURCE_IS_CONTINUOUS, -}; - -/* - * Returns current time from boot in nsecs. It's OK for this to wrap - * around for now, as it's just a relative time stamp. - */ -unsigned long long sched_clock(void) +static u64 notrace omap_32k_read_sched_clock(void)  { -	return clocksource_cyc2ns(clocksource_32k.read(&clocksource_32k), -				  clocksource_32k.mult, clocksource_32k.shift); +	return sync32k_cnt_reg ? readl_relaxed(sync32k_cnt_reg) : 0;  }  /** - * read_persistent_clock -  Return time from a persistent clock. + * omap_read_persistent_clock -  Return time from a persistent clock.   *   * Reads the time from a source which isn't disabled during PM, the   * 32k sync timer.  Convert the cycles elapsed since last read into   * nsecs and adds to a monotonically increasing timespec.   */  static struct timespec persistent_ts; -static cycles_t cycles, last_cycles; -void read_persistent_clock(struct timespec *ts) +static cycles_t cycles; +static unsigned int persistent_mult, persistent_shift; +static DEFINE_SPINLOCK(read_persistent_clock_lock); + +static void omap_read_persistent_clock(struct timespec *ts)  {  	unsigned long long nsecs; -	cycles_t delta; -	struct timespec *tsp = &persistent_ts; +	cycles_t last_cycles; +	unsigned long flags; + +	spin_lock_irqsave(&read_persistent_clock_lock, flags);  	last_cycles = cycles; -	cycles = clocksource_32k.read(&clocksource_32k); -	delta = cycles - last_cycles; +	cycles = sync32k_cnt_reg ? readl_relaxed(sync32k_cnt_reg) : 0; + +	nsecs = clocksource_cyc2ns(cycles - last_cycles, +					persistent_mult, persistent_shift); + +	timespec_add_ns(&persistent_ts, nsecs); -	nsecs = clocksource_cyc2ns(delta, -				   clocksource_32k.mult, clocksource_32k.shift); +	*ts = persistent_ts; -	timespec_add_ns(tsp, nsecs); -	*ts = *tsp; +	spin_unlock_irqrestore(&read_persistent_clock_lock, flags);  } -static int __init omap_init_clocksource_32k(void) +/** + * omap_init_clocksource_32k - setup and register counter 32k as a + * kernel clocksource + * @pbase: base addr of counter_32k module + * @size: size of counter_32k to map + * + * Returns 0 upon success or negative error code upon failure. + * + */ +int __init omap_init_clocksource_32k(void __iomem *vbase)  { -	static char err[] __initdata = KERN_ERR -			"%s: can't register clocksource!\n"; - -	if (cpu_is_omap16xx() || cpu_class_is_omap2()) { -		struct clk *sync_32k_ick; - -		if (cpu_is_omap16xx()) -			clocksource_32k.read = omap16xx_32k_read; -		else if (cpu_is_omap2420()) -			clocksource_32k.read = omap2420_32k_read; -		else if (cpu_is_omap2430()) -			clocksource_32k.read = omap2430_32k_read; -		else if (cpu_is_omap34xx()) -			clocksource_32k.read = omap34xx_32k_read; -		else if (cpu_is_omap44xx()) -			clocksource_32k.read = omap44xx_32k_read; -		else -			return -ENODEV; - -		sync_32k_ick = clk_get(NULL, "omap_32ksync_ick"); -		if (sync_32k_ick) -			clk_enable(sync_32k_ick); - -		clocksource_32k.mult = clocksource_hz2mult(32768, -					    clocksource_32k.shift); - -		offset_32k = clocksource_32k.read(&clocksource_32k); - -		if (clocksource_register(&clocksource_32k)) -			printk(err, clocksource_32k.name); +	int ret; + +	/* +	 * 32k sync Counter IP register offsets vary between the +	 * highlander version and the legacy ones. +	 * The 'SCHEME' bits(30-31) of the revision register is used +	 * to identify the version. +	 */ +	if (readl_relaxed(vbase + OMAP2_32KSYNCNT_REV_OFF) & +						OMAP2_32KSYNCNT_REV_SCHEME) +		sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF_HIGH; +	else +		sync32k_cnt_reg = vbase + OMAP2_32KSYNCNT_CR_OFF_LOW; + +	/* +	 * 120000 rough estimate from the calculations in +	 * __clocksource_updatefreq_scale. +	 */ +	clocks_calc_mult_shift(&persistent_mult, &persistent_shift, +			32768, NSEC_PER_SEC, 120000); + +	ret = clocksource_mmio_init(sync32k_cnt_reg, "32k_counter", 32768, +				250, 32, clocksource_mmio_readl_up); +	if (ret) { +		pr_err("32k_counter: can't register clocksource\n"); +		return ret;  	} -	return 0; -} -arch_initcall(omap_init_clocksource_32k); -#endif	/* !(defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP15XX)) */ +	sched_clock_register(omap_32k_read_sched_clock, 32, 32768); +	register_persistent_clock(NULL, omap_read_persistent_clock); +	pr_info("OMAP clocksource: 32k_counter at 32768 Hz\n"); +	return 0; +} diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c deleted file mode 100644 index 11c54ec8d47..00000000000 --- a/arch/arm/plat-omap/cpu-omap.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - *  linux/arch/arm/plat-omap/cpu-omap.c - * - *  CPU frequency scaling for OMAP - * - *  Copyright (C) 2005 Nokia Corporation - *  Written by Tony Lindgren <tony@atomide.com> - * - *  Based on cpu-sa1110.c, Copyright (C) 2001 Russell King - * - * 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/types.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/cpufreq.h> -#include <linux/delay.h> -#include <linux/init.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> - -#include <mach/hardware.h> -#include <plat/clock.h> -#include <asm/system.h> - -#define VERY_HI_RATE	900000000 - -static struct cpufreq_frequency_table *freq_table; - -#ifdef CONFIG_ARCH_OMAP1 -#define MPU_CLK		"mpu" -#else -#define MPU_CLK		"virt_prcm_set" -#endif - -static struct clk *mpu_clk; - -/* TODO: Add support for SDRAM timing changes */ - -static int omap_verify_speed(struct cpufreq_policy *policy) -{ -	if (freq_table) -		return cpufreq_frequency_table_verify(policy, freq_table); - -	if (policy->cpu) -		return -EINVAL; - -	cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, -				     policy->cpuinfo.max_freq); - -	policy->min = clk_round_rate(mpu_clk, policy->min * 1000) / 1000; -	policy->max = clk_round_rate(mpu_clk, policy->max * 1000) / 1000; -	cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, -				     policy->cpuinfo.max_freq); -	return 0; -} - -static unsigned int omap_getspeed(unsigned int cpu) -{ -	unsigned long rate; - -	if (cpu) -		return 0; - -	rate = clk_get_rate(mpu_clk) / 1000; -	return rate; -} - -static int omap_target(struct cpufreq_policy *policy, -		       unsigned int target_freq, -		       unsigned int relation) -{ -	struct cpufreq_freqs freqs; -	int ret = 0; - -	/* Ensure desired rate is within allowed range.  Some govenors -	 * (ondemand) will just pass target_freq=0 to get the minimum. */ -	if (target_freq < policy->min) -		target_freq = policy->min; -	if (target_freq > policy->max) -		target_freq = policy->max; - -	freqs.old = omap_getspeed(0); -	freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; -	freqs.cpu = 0; - -	if (freqs.old == freqs.new) -		return ret; - -	cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); -#ifdef CONFIG_CPU_FREQ_DEBUG -	printk(KERN_DEBUG "cpufreq-omap: transition: %u --> %u\n", -	       freqs.old, freqs.new); -#endif -	ret = clk_set_rate(mpu_clk, freqs.new * 1000); -	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - -	return ret; -} - -static int __init omap_cpu_init(struct cpufreq_policy *policy) -{ -	int result = 0; - -	mpu_clk = clk_get(NULL, MPU_CLK); -	if (IS_ERR(mpu_clk)) -		return PTR_ERR(mpu_clk); - -	if (policy->cpu != 0) -		return -EINVAL; - -	policy->cur = policy->min = policy->max = omap_getspeed(0); - -	clk_init_cpufreq_table(&freq_table); -	if (freq_table) { -		result = cpufreq_frequency_table_cpuinfo(policy, freq_table); -		if (!result) -			cpufreq_frequency_table_get_attr(freq_table, -							policy->cpu); -	} else { -		policy->cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000; -		policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, -							VERY_HI_RATE) / 1000; -	} - -	/* FIXME: what's the actual transition time? */ -	policy->cpuinfo.transition_latency = 300 * 1000; - -	return 0; -} - -static int omap_cpu_exit(struct cpufreq_policy *policy) -{ -	clk_exit_cpufreq_table(&freq_table); -	clk_put(mpu_clk); -	return 0; -} - -static struct freq_attr *omap_cpufreq_attr[] = { -	&cpufreq_freq_attr_scaling_available_freqs, -	NULL, -}; - -static struct cpufreq_driver omap_driver = { -	.flags		= CPUFREQ_STICKY, -	.verify		= omap_verify_speed, -	.target		= omap_target, -	.get		= omap_getspeed, -	.init		= omap_cpu_init, -	.exit		= omap_cpu_exit, -	.name		= "omap", -	.attr		= omap_cpufreq_attr, -}; - -static int __init omap_cpufreq_init(void) -{ -	return cpufreq_register_driver(&omap_driver); -} - -arch_initcall(omap_cpufreq_init); - -/* - * if ever we want to remove this, upon cleanup call: - * - * cpufreq_unregister_driver() - * cpufreq_frequency_table_put_attr() - */ - diff --git a/arch/arm/plat-omap/debug-devices.c b/arch/arm/plat-omap/debug-devices.c deleted file mode 100644 index 923c9621096..00000000000 --- a/arch/arm/plat-omap/debug-devices.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * linux/arch/arm/plat-omap/debug-devices.c - * - * Copyright (C) 2005 Nokia Corporation - * Modified from mach-omap2/board-h4.c - * - * 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/platform_device.h> -#include <linux/io.h> -#include <linux/smc91x.h> - -#include <mach/hardware.h> - -#include <plat/board.h> -#include <mach/gpio.h> - - -/* Many OMAP development platforms reuse the same "debug board"; these - * platforms include H2, H3, H4, and Perseus2. - */ - -static struct smc91x_platdata smc91x_info = { -	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT, -	.leda	= RPC_LED_100_10, -	.ledb	= RPC_LED_TX_RX, -}; - -static struct resource smc91x_resources[] = { -	[0] = { -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE, -	}, -}; - -static struct platform_device smc91x_device = { -	.name		= "smc91x", -	.id		= -1, -	.dev		= { -		.platform_data = &smc91x_info, -	}, -	.num_resources	= ARRAY_SIZE(smc91x_resources), -	.resource	= smc91x_resources, -}; - -static struct resource led_resources[] = { -	[0] = { -		.flags	= IORESOURCE_MEM, -	}, -}; - -static struct platform_device led_device = { -	.name		= "omap_dbg_led", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(led_resources), -	.resource	= led_resources, -}; - -static struct platform_device *debug_devices[] __initdata = { -	&smc91x_device, -	&led_device, -	/* ps2 kbd + mouse ports */ -	/* 4 extra uarts */ -	/* 6 input dip switches */ -	/* 8 output pins */ -}; - -int __init debug_card_init(u32 addr, unsigned gpio) -{ -	int	status; - -	smc91x_resources[0].start = addr + 0x300; -	smc91x_resources[0].end   = addr + 0x30f; - -	smc91x_resources[1].start = gpio_to_irq(gpio); -	smc91x_resources[1].end   = gpio_to_irq(gpio); - -	status = gpio_request(gpio, "SMC91x irq"); -	if (status < 0) { -		printk(KERN_ERR "GPIO%d unavailable for smc91x IRQ\n", gpio); -		return status; -	} -	gpio_direction_input(gpio); - -	led_resources[0].start = addr; -	led_resources[0].end   = addr + SZ_4K - 1; - -	return platform_add_devices(debug_devices, ARRAY_SIZE(debug_devices)); -} diff --git a/arch/arm/plat-omap/debug-leds.c b/arch/arm/plat-omap/debug-leds.c index fc05b102260..48b69de89a5 100644 --- a/arch/arm/plat-omap/debug-leds.c +++ b/arch/arm/plat-omap/debug-leds.c @@ -1,6 +1,7 @@  /*   * linux/arch/arm/plat-omap/debug-leds.c   * + * Copyright 2011 by Bryan Wu <bryan.wu@canonical.com>   * Copyright 2003 by Texas Instruments Incorporated   *   * This program is free software; you can redistribute it and/or modify @@ -8,274 +9,128 @@   * published by the Free Software Foundation.   */ +#include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/leds.h>  #include <linux/io.h> +#include <linux/platform_data/gpio-omap.h> +#include <linux/slab.h> -#include <mach/hardware.h> -#include <asm/leds.h> -#include <asm/system.h>  #include <asm/mach-types.h> -#include <plat/fpga.h> -#include <mach/gpio.h> - -  /* Many OMAP development platforms reuse the same "debug board"; these   * platforms include H2, H3, H4, and Perseus2.  There are 16 LEDs on the   * debug board (all green), accessed through FPGA registers. - * - * The "surfer" expansion board and H2 sample board also have two-color - * green+red LEDs (in parallel), used here for timer and idle indicators - * in preference to the ones on the debug board, for a "Disco LED" effect. - * - * This driver exports either the original ARM LED API, the new generic - * one, or both. - */ - -static spinlock_t			lock; -static struct h2p2_dbg_fpga __iomem	*fpga; -static u16				led_state, hw_led_state; - - -#ifdef	CONFIG_OMAP_DEBUG_LEDS -#define new_led_api()	1 -#else -#define new_led_api()	0 -#endif - - -/*-------------------------------------------------------------------------*/ - -/* original ARM debug LED API: - *  - timer and idle leds (some boards use non-FPGA leds here); - *  - up to 4 generic leds, easily accessed in-kernel (any context)   */ -#define GPIO_LED_RED		3 -#define GPIO_LED_GREEN		OMAP_MPUIO(4) - -#define LED_STATE_ENABLED	0x01 -#define LED_STATE_CLAIMED	0x02 -#define LED_TIMER_ON		0x04 - -#define GPIO_IDLE		GPIO_LED_GREEN -#define GPIO_TIMER		GPIO_LED_RED - -static void h2p2_dbg_leds_event(led_event_t evt) -{ -	unsigned long flags; - -	spin_lock_irqsave(&lock, flags); - -	if (!(led_state & LED_STATE_ENABLED) && evt != led_start) -		goto done; - -	switch (evt) { -	case led_start: -		if (fpga) -			led_state |= LED_STATE_ENABLED; -		break; - -	case led_stop: -	case led_halted: -		/* all leds off during suspend or shutdown */ - -		if (!(machine_is_omap_perseus2() || machine_is_omap_h4())) { -			gpio_set_value(GPIO_TIMER, 0); -			gpio_set_value(GPIO_IDLE, 0); -		} - -		__raw_writew(~0, &fpga->leds); -		led_state &= ~LED_STATE_ENABLED; -		goto done; - -	case led_claim: -		led_state |= LED_STATE_CLAIMED; -		hw_led_state = 0; -		break; - -	case led_release: -		led_state &= ~LED_STATE_CLAIMED; -		break; - -#ifdef CONFIG_LEDS_TIMER -	case led_timer: -		led_state ^= LED_TIMER_ON; - -		if (machine_is_omap_perseus2() || machine_is_omap_h4()) -			hw_led_state ^= H2P2_DBG_FPGA_P2_LED_TIMER; -		else { -			gpio_set_value(GPIO_TIMER, -					led_state & LED_TIMER_ON); -			goto done; -		} - -		break; -#endif - -#ifdef CONFIG_LEDS_CPU -	/* LED lit iff busy */ -	case led_idle_start: -		if (machine_is_omap_perseus2() || machine_is_omap_h4()) -			hw_led_state &= ~H2P2_DBG_FPGA_P2_LED_IDLE; -		else { -			gpio_set_value(GPIO_IDLE, 1); -			goto done; -		} - -		break; - -	case led_idle_end: -		if (machine_is_omap_perseus2() || machine_is_omap_h4()) -			hw_led_state |= H2P2_DBG_FPGA_P2_LED_IDLE; -		else { -			gpio_set_value(GPIO_IDLE, 0); -			goto done; -		} - -		break; -#endif - -	case led_green_on: -		hw_led_state |= H2P2_DBG_FPGA_LED_GREEN; -		break; -	case led_green_off: -		hw_led_state &= ~H2P2_DBG_FPGA_LED_GREEN; -		break; - -	case led_amber_on: -		hw_led_state |= H2P2_DBG_FPGA_LED_AMBER; -		break; -	case led_amber_off: -		hw_led_state &= ~H2P2_DBG_FPGA_LED_AMBER; -		break; - -	case led_red_on: -		hw_led_state |= H2P2_DBG_FPGA_LED_RED; -		break; -	case led_red_off: -		hw_led_state &= ~H2P2_DBG_FPGA_LED_RED; -		break; - -	case led_blue_on: -		hw_led_state |= H2P2_DBG_FPGA_LED_BLUE; -		break; -	case led_blue_off: -		hw_led_state &= ~H2P2_DBG_FPGA_LED_BLUE; -		break; - -	default: -		break; -	} - - -	/* -	 *  Actually burn the LEDs -	 */ -	if (led_state & LED_STATE_ENABLED) -		__raw_writew(~hw_led_state, &fpga->leds); - -done: -	spin_unlock_irqrestore(&lock, flags); -} +/* NOTE:  most boards don't have a static mapping for the FPGA ... */ +struct h2p2_dbg_fpga { +	/* offset 0x00 */ +	u16		smc91x[8]; +	/* offset 0x10 */ +	u16		fpga_rev; +	u16		board_rev; +	u16		gpio_outputs; +	u16		leds; +	/* offset 0x18 */ +	u16		misc_inputs; +	u16		lan_status; +	u16		lan_reset; +	u16		reserved0; +	/* offset 0x20 */ +	u16		ps2_data; +	u16		ps2_ctrl; +	/* plus also 4 rs232 ports ... */ +}; -/*-------------------------------------------------------------------------*/ +static struct h2p2_dbg_fpga __iomem *fpga; -/* "new" LED API - *  - with syfs access and generic triggering - *  - not readily accessible to in-kernel drivers - */ +static u16 fpga_led_state;  struct dbg_led {  	struct led_classdev	cdev;  	u16			mask;  }; -static struct dbg_led dbg_leds[] = { -	/* REVISIT at least H2 uses different timer & cpu leds... */ -#ifndef CONFIG_LEDS_TIMER -	{ .mask = 1 << 0,  .cdev.name =  "d4:green", -		.cdev.default_trigger = "heartbeat", }, -#endif -#ifndef CONFIG_LEDS_CPU -	{ .mask = 1 << 1,  .cdev.name =  "d5:green", },		/* !idle */ -#endif -	{ .mask = 1 << 2,  .cdev.name =  "d6:green", }, -	{ .mask = 1 << 3,  .cdev.name =  "d7:green", }, - -	{ .mask = 1 << 4,  .cdev.name =  "d8:green", }, -	{ .mask = 1 << 5,  .cdev.name =  "d9:green", }, -	{ .mask = 1 << 6,  .cdev.name = "d10:green", }, -	{ .mask = 1 << 7,  .cdev.name = "d11:green", }, - -	{ .mask = 1 << 8,  .cdev.name = "d12:green", }, -	{ .mask = 1 << 9,  .cdev.name = "d13:green", }, -	{ .mask = 1 << 10, .cdev.name = "d14:green", }, -	{ .mask = 1 << 11, .cdev.name = "d15:green", }, - -#ifndef	CONFIG_LEDS -	{ .mask = 1 << 12, .cdev.name = "d16:green", }, -	{ .mask = 1 << 13, .cdev.name = "d17:green", }, -	{ .mask = 1 << 14, .cdev.name = "d18:green", }, -	{ .mask = 1 << 15, .cdev.name = "d19:green", }, -#endif +static const struct { +	const char *name; +	const char *trigger; +} dbg_leds[] = { +	{ "dbg:d4", "heartbeat", }, +	{ "dbg:d5", "cpu0", }, +	{ "dbg:d6", "default-on", }, +	{ "dbg:d7", }, +	{ "dbg:d8", }, +	{ "dbg:d9", }, +	{ "dbg:d10", }, +	{ "dbg:d11", }, +	{ "dbg:d12", }, +	{ "dbg:d13", }, +	{ "dbg:d14", }, +	{ "dbg:d15", }, +	{ "dbg:d16", }, +	{ "dbg:d17", }, +	{ "dbg:d18", }, +	{ "dbg:d19", },  }; -static void -fpga_led_set(struct led_classdev *cdev, enum led_brightness value) +/* + * The triggers lines up below will only be used if the + * LED triggers are compiled in. + */ +static void dbg_led_set(struct led_classdev *cdev, +			      enum led_brightness b)  { -	struct dbg_led	*led = container_of(cdev, struct dbg_led, cdev); -	unsigned long	flags; +	struct dbg_led *led = container_of(cdev, struct dbg_led, cdev); +	u16 reg; -	spin_lock_irqsave(&lock, flags); -	if (value == LED_OFF) -		hw_led_state &= ~led->mask; +	reg = readw_relaxed(&fpga->leds); +	if (b != LED_OFF) +		reg |= led->mask;  	else -		hw_led_state |= led->mask; -	__raw_writew(~hw_led_state, &fpga->leds); -	spin_unlock_irqrestore(&lock, flags); +		reg &= ~led->mask; +	writew_relaxed(reg, &fpga->leds);  } -static void __init newled_init(struct device *dev) +static enum led_brightness dbg_led_get(struct led_classdev *cdev)  { -	unsigned	i; -	struct dbg_led	*led; -	int		status; +	struct dbg_led *led = container_of(cdev, struct dbg_led, cdev); +	u16 reg; -	for (i = 0, led = dbg_leds; i < ARRAY_SIZE(dbg_leds); i++, led++) { -		led->cdev.brightness_set = fpga_led_set; -		status = led_classdev_register(dev, &led->cdev); -		if (status < 0) -			break; -	} -	return; +	reg = readw_relaxed(&fpga->leds); +	return (reg & led->mask) ? LED_FULL : LED_OFF;  } - -/*-------------------------------------------------------------------------*/ - -static int /* __init */ fpga_probe(struct platform_device *pdev) +static int fpga_probe(struct platform_device *pdev)  {  	struct resource	*iomem; - -	spin_lock_init(&lock); +	int i;  	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (!iomem)  		return -ENODEV; -	fpga = ioremap(iomem->start, H2P2_DBG_FPGA_SIZE); -	__raw_writew(~0, &fpga->leds); +	fpga = ioremap(iomem->start, resource_size(iomem)); +	writew_relaxed(0xff, &fpga->leds); + +	for (i = 0; i < ARRAY_SIZE(dbg_leds); i++) { +		struct dbg_led *led; + +		led = kzalloc(sizeof(*led), GFP_KERNEL); +		if (!led) +			break; -#ifdef	CONFIG_LEDS -	leds_event = h2p2_dbg_leds_event; -	leds_event(led_start); -#endif +		led->cdev.name = dbg_leds[i].name; +		led->cdev.brightness_set = dbg_led_set; +		led->cdev.brightness_get = dbg_led_get; +		led->cdev.default_trigger = dbg_leds[i].trigger; +		led->mask = BIT(i); -	if (new_led_api()) { -		newled_init(&pdev->dev); +		if (led_classdev_register(NULL, &led->cdev) < 0) { +			kfree(led); +			break; +		}  	}  	return 0; @@ -283,13 +138,15 @@ static int /* __init */ fpga_probe(struct platform_device *pdev)  static int fpga_suspend_noirq(struct device *dev)  { -	__raw_writew(~0, &fpga->leds); +	fpga_led_state = readw_relaxed(&fpga->leds); +	writew_relaxed(0xff, &fpga->leds); +  	return 0;  }  static int fpga_resume_noirq(struct device *dev)  { -	__raw_writew(~hw_led_state, &fpga->leds); +	writew_relaxed(~fpga_led_state, &fpga->leds);  	return 0;  } diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c deleted file mode 100644 index fc819120978..00000000000 --- a/arch/arm/plat-omap/devices.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * linux/arch/arm/plat-omap/devices.c - * - * Common platform device setup/initialization for OMAP1 and OMAP2 - * - * 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. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/io.h> -#include <linux/slab.h> -#include <linux/memblock.h> - -#include <mach/hardware.h> -#include <asm/mach-types.h> -#include <asm/mach/map.h> - -#include <plat/tc.h> -#include <plat/board.h> -#include <plat/mmc.h> -#include <mach/gpio.h> -#include <plat/menelaus.h> -#include <plat/mcbsp.h> -#include <plat/omap44xx.h> - -/*-------------------------------------------------------------------------*/ - -#if defined(CONFIG_OMAP_MCBSP) || defined(CONFIG_OMAP_MCBSP_MODULE) - -static struct platform_device **omap_mcbsp_devices; - -void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, -					int size) -{ -	int i; - -	omap_mcbsp_devices = kzalloc(size * sizeof(struct platform_device *), -				     GFP_KERNEL); -	if (!omap_mcbsp_devices) { -		printk(KERN_ERR "Could not register McBSP devices\n"); -		return; -	} - -	for (i = 0; i < size; i++) { -		struct platform_device *new_mcbsp; -		int ret; - -		new_mcbsp = platform_device_alloc("omap-mcbsp", i + 1); -		if (!new_mcbsp) -			continue; -		new_mcbsp->dev.platform_data = &config[i]; -		ret = platform_device_add(new_mcbsp); -		if (ret) { -			platform_device_put(new_mcbsp); -			continue; -		} -		omap_mcbsp_devices[i] = new_mcbsp; -	} -} - -#else -void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, -					int size) -{  } -#endif - -/*-------------------------------------------------------------------------*/ - -#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \ -		defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE) - -static struct resource mcpdm_resources[] = { -	{ -		.name		= "mcpdm_mem", -		.start		= OMAP44XX_MCPDM_BASE, -		.end		= OMAP44XX_MCPDM_BASE + SZ_4K, -		.flags		= IORESOURCE_MEM, -	}, -	{ -		.name		= "mcpdm_irq", -		.start		= OMAP44XX_IRQ_MCPDM, -		.end		= OMAP44XX_IRQ_MCPDM, -		.flags		= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device omap_mcpdm_device = { -	.name		= "omap-mcpdm", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(mcpdm_resources), -	.resource	= mcpdm_resources, -}; - -static void omap_init_mcpdm(void) -{ -	(void) platform_device_register(&omap_mcpdm_device); -} -#else -static inline void omap_init_mcpdm(void) {} -#endif - -/*-------------------------------------------------------------------------*/ - -#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) - -#ifdef CONFIG_ARCH_OMAP2 -#define	OMAP_RNG_BASE		0x480A0000 -#else -#define	OMAP_RNG_BASE		0xfffe5000 -#endif - -static struct resource rng_resources[] = { -	{ -		.start		= OMAP_RNG_BASE, -		.end		= OMAP_RNG_BASE + 0x4f, -		.flags		= IORESOURCE_MEM, -	}, -}; - -static struct platform_device omap_rng_device = { -	.name		= "omap_rng", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(rng_resources), -	.resource	= rng_resources, -}; - -static void omap_init_rng(void) -{ -	(void) platform_device_register(&omap_rng_device); -} -#else -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_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) - -static struct resource wdt_resources[] = { -	{ -		.flags		= IORESOURCE_MEM, -	}, -}; - -static struct platform_device omap_wdt_device = { -	.name	   = "omap_wdt", -	.id	     = -1, -	.num_resources	= ARRAY_SIZE(wdt_resources), -	.resource	= wdt_resources, -}; - -static void omap_init_wdt(void) -{ -	if (cpu_is_omap16xx()) -		wdt_resources[0].start = 0xfffeb000; -	else if (cpu_is_omap2420()) -		wdt_resources[0].start = 0x48022000; /* WDT2 */ -	else if (cpu_is_omap2430()) -		wdt_resources[0].start = 0x49016000; /* WDT2 */ -	else if (cpu_is_omap343x()) -		wdt_resources[0].start = 0x48314000; /* WDT2 */ -	else if (cpu_is_omap44xx()) -		wdt_resources[0].start = 0x4a314000; -	else -		return; - -	wdt_resources[0].end = wdt_resources[0].start + 0x4f; - -	(void) platform_device_register(&omap_wdt_device); -} -#else -static inline void omap_init_wdt(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 = memblock_alloc(size, SZ_1M); -	if (!paddr) { -		pr_err("%s: failed to reserve %x bytes\n", -				__func__, size); -		return; -	} -	memblock_free(paddr, size); -	memblock_remove(paddr, size); - -	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): - * - *  (a) Does any "standard config" pin muxing needed.  Board-specific - *	code will have muxed GPIO pins and done "nonstandard" setup; - *	that code could live in the boot loader. - *  (b) Populating board-specific platform_data with the data drivers - *	rely on to handle wiring variations. - *  (c) Creating platform devices as meaningful on this board and - *	with this kernel configuration. - * - * Claiming GPIOs, and setting their direction and initial values, is the - * responsibility of the device drivers.  So is responding to probe(). - * - * Board-specific knowlege like creating devices or pin setup is to be - * kept out of drivers as much as possible.  In particular, pin setup - * may be handled by the boot loader, and drivers should expect it will - * normally have been done by the time they're probed. - */ -static int __init omap_init_devices(void) -{ -	/* please keep these calls, and their implementations above, -	 * in alphabetical order so they're easier to sort through. -	 */ -	omap_init_rng(); -	omap_init_mcpdm(); -	omap_init_uwire(); -	return 0; -} -arch_initcall(omap_init_devices); diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index f5c5b8da9a8..b5608b1f9fb 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c @@ -15,6 +15,10 @@   *   * Support functions for the OMAP internal DMA channels.   * + * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ + * Converted DMA library into DMA platform driver. + *	- G, Manjunath Kondaiah <manjugk@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. @@ -32,11 +36,16 @@  #include <linux/slab.h>  #include <linux/delay.h> -#include <asm/system.h> -#include <mach/hardware.h> -#include <plat/dma.h> +#include <linux/omap-dma.h> -#include <plat/tc.h> +/* + * MAX_LOGICAL_DMA_CH_COUNT: the maximum number of logical DMA + * channels that an instance of the SDMA IP block can support.  Used + * to size arrays.  (The actual maximum on a particular SoC may be less + * than this -- for example, OMAP1 SDMA instances only support 17 logical + * DMA channels.) + */ +#define MAX_LOGICAL_DMA_CH_COUNT		32  #undef DEBUG @@ -49,39 +58,23 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };  #endif  #define OMAP_DMA_ACTIVE			0x01 -#define OMAP2_DMA_CSR_CLEAR_MASK	0xffe +#define OMAP2_DMA_CSR_CLEAR_MASK	0xffffffff  #define OMAP_FUNC_MUX_ARM_BASE		(0xfffe1000 + 0xec) +static struct omap_system_dma_plat_info *p; +static struct omap_dma_dev_attr *d; +  static int enable_1510_mode; +static u32 errata;  static struct omap_dma_global_context_registers {  	u32 dma_irqenable_l0; +	u32 dma_irqenable_l1;  	u32 dma_ocp_sysconfig;  	u32 dma_gcr;  } omap_dma_global_context; -struct omap_dma_lch { -	int next_lch; -	int dev_id; -	u16 saved_csr; -	u16 enabled_irqs; -	const char *dev_name; -	void (*callback)(int lch, u16 ch_status, void *data); -	void *data; - -#ifndef CONFIG_ARCH_OMAP1 -	/* required for Dynamic chaining */ -	int prev_linked_ch; -	int next_linked_ch; -	int state; -	int chain_id; - -	int status; -#endif -	long flags; -}; -  struct dma_link_info {  	int *linked_dmach_q;  	int no_of_lchs_linked; @@ -137,15 +130,6 @@ static int omap_dma_reserve_channels;  static spinlock_t dma_chan_lock;  static struct omap_dma_lch *dma_chan; -static void __iomem *omap_dma_base; - -static const u8 omap1_dma_irq[OMAP1_LOGICAL_DMA_CH_COUNT] = { -	INT_DMA_CH0_6, INT_DMA_CH1_7, INT_DMA_CH2_8, INT_DMA_CH3, -	INT_DMA_CH4, INT_DMA_CH5, INT_1610_DMA_CH6, INT_1610_DMA_CH7, -	INT_1610_DMA_CH8, INT_1610_DMA_CH9, INT_1610_DMA_CH10, -	INT_1610_DMA_CH11, INT_1610_DMA_CH12, INT_1610_DMA_CH13, -	INT_1610_DMA_CH14, INT_1610_DMA_CH15, INT_DMA_LCD -};  static inline void disable_lnk(int lch);  static void omap_disable_channel_irq(int lch); @@ -154,27 +138,9 @@ static inline void omap_enable_channel_irq(int lch);  #define REVISIT_24XX()		printk(KERN_ERR "FIXME: no %s on 24xx\n", \  						__func__); -#define dma_read(reg)							\ -({									\ -	u32 __val;							\ -	if (cpu_class_is_omap1())					\ -		__val = __raw_readw(omap_dma_base + OMAP1_DMA_##reg);	\ -	else								\ -		__val = __raw_readl(omap_dma_base + OMAP_DMA4_##reg);	\ -	__val;								\ -}) - -#define dma_write(val, reg)						\ -({									\ -	if (cpu_class_is_omap1())					\ -		__raw_writew((u16)(val), omap_dma_base + OMAP1_DMA_##reg); \ -	else								\ -		__raw_writel((val), omap_dma_base + OMAP_DMA4_##reg);	\ -}) -  #ifdef CONFIG_ARCH_OMAP15XX  /* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */ -int omap_dma_in_1510_mode(void) +static int omap_dma_in_1510_mode(void)  {  	return enable_1510_mode;  } @@ -204,24 +170,17 @@ static inline void set_gdma_dev(int req, int dev)  }  #else  #define set_gdma_dev(req, dev)	do {} while (0) +#define omap_readl(reg)		0 +#define omap_writel(val, reg)	do {} while (0)  #endif -/* Omap1 only */ -static void clear_lch_regs(int lch) -{ -	int i; -	void __iomem *lch_base = omap_dma_base + OMAP1_DMA_CH_BASE(lch); - -	for (i = 0; i < 0x2c; i += 2) -		__raw_writew(0, lch_base + i); -} - +#ifdef CONFIG_ARCH_OMAP1  void omap_set_dma_priority(int lch, int dst_port, int priority)  {  	unsigned long reg;  	u32 l; -	if (cpu_class_is_omap1()) { +	if (dma_omap1()) {  		switch (dst_port) {  		case OMAP_DMA_PORT_OCP_T1:	/* FFFECC00 */  			reg = OMAP_TC_OCPT1_PRIOR; @@ -244,18 +203,22 @@ void omap_set_dma_priority(int lch, int dst_port, int priority)  		l |= (priority & 0xf) << 8;  		omap_writel(l, reg);  	} +} +#endif -	if (cpu_class_is_omap2()) { -		u32 ccr; +#ifdef CONFIG_ARCH_OMAP2PLUS +void omap_set_dma_priority(int lch, int dst_port, int priority) +{ +	u32 ccr; -		ccr = dma_read(CCR(lch)); -		if (priority) -			ccr |= (1 << 6); -		else -			ccr &= ~(1 << 6); -		dma_write(ccr, CCR(lch)); -	} +	ccr = p->dma_read(CCR, lch); +	if (priority) +		ccr |= (1 << 6); +	else +		ccr &= ~(1 << 6); +	p->dma_write(ccr, CCR, lch);  } +#endif  EXPORT_SYMBOL(omap_set_dma_priority);  void omap_set_dma_transfer_params(int lch, int data_type, int elem_count, @@ -264,31 +227,31 @@ void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,  {  	u32 l; -	l = dma_read(CSDP(lch)); +	l = p->dma_read(CSDP, lch);  	l &= ~0x03;  	l |= data_type; -	dma_write(l, CSDP(lch)); +	p->dma_write(l, CSDP, lch); -	if (cpu_class_is_omap1()) { +	if (dma_omap1()) {  		u16 ccr; -		ccr = dma_read(CCR(lch)); +		ccr = p->dma_read(CCR, lch);  		ccr &= ~(1 << 5);  		if (sync_mode == OMAP_DMA_SYNC_FRAME)  			ccr |= 1 << 5; -		dma_write(ccr, CCR(lch)); +		p->dma_write(ccr, CCR, lch); -		ccr = dma_read(CCR2(lch)); +		ccr = p->dma_read(CCR2, lch);  		ccr &= ~(1 << 2);  		if (sync_mode == OMAP_DMA_SYNC_BLOCK)  			ccr |= 1 << 2; -		dma_write(ccr, CCR2(lch)); +		p->dma_write(ccr, CCR2, lch);  	} -	if (cpu_class_is_omap2() && dma_trigger) { +	if (dma_omap2plus() && dma_trigger) {  		u32 val; -		val = dma_read(CCR(lch)); +		val = p->dma_read(CCR, lch);  		/* DMA_SYNCHRO_CONTROL_UPPER depends on the channel number */  		val &= ~((1 << 23) | (3 << 19) | 0x1f); @@ -313,11 +276,11 @@ void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,  		} else {  			val &= ~(1 << 24);	/* dest synch */  		} -		dma_write(val, CCR(lch)); +		p->dma_write(val, CCR, lch);  	} -	dma_write(elem_count, CEN(lch)); -	dma_write(frame_count, CFN(lch)); +	p->dma_write(elem_count, CEN, lch); +	p->dma_write(frame_count, CFN, lch);  }  EXPORT_SYMBOL(omap_set_dma_transfer_params); @@ -325,10 +288,10 @@ void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)  {  	BUG_ON(omap_dma_in_1510_mode()); -	if (cpu_class_is_omap1()) { +	if (dma_omap1()) {  		u16 w; -		w = dma_read(CCR2(lch)); +		w = p->dma_read(CCR2, lch);  		w &= ~0x03;  		switch (mode) { @@ -343,23 +306,22 @@ void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)  		default:  			BUG();  		} -		dma_write(w, CCR2(lch)); +		p->dma_write(w, CCR2, lch); -		w = dma_read(LCH_CTRL(lch)); +		w = p->dma_read(LCH_CTRL, lch);  		w &= ~0x0f;  		/* Default is channel type 2D */  		if (mode) { -			dma_write((u16)color, COLOR_L(lch)); -			dma_write((u16)(color >> 16), COLOR_U(lch)); +			p->dma_write(color, COLOR, lch);  			w |= 1;		/* Channel type G */  		} -		dma_write(w, LCH_CTRL(lch)); +		p->dma_write(w, LCH_CTRL, lch);  	} -	if (cpu_class_is_omap2()) { +	if (dma_omap2plus()) {  		u32 val; -		val = dma_read(CCR(lch)); +		val = p->dma_read(CCR, lch);  		val &= ~((1 << 17) | (1 << 16));  		switch (mode) { @@ -374,36 +336,36 @@ void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)  		default:  			BUG();  		} -		dma_write(val, CCR(lch)); +		p->dma_write(val, CCR, lch);  		color &= 0xffffff; -		dma_write(color, COLOR(lch)); +		p->dma_write(color, COLOR, lch);  	}  }  EXPORT_SYMBOL(omap_set_dma_color_mode);  void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode)  { -	if (cpu_class_is_omap2()) { +	if (dma_omap2plus()) {  		u32 csdp; -		csdp = dma_read(CSDP(lch)); +		csdp = p->dma_read(CSDP, lch);  		csdp &= ~(0x3 << 16);  		csdp |= (mode << 16); -		dma_write(csdp, CSDP(lch)); +		p->dma_write(csdp, CSDP, lch);  	}  }  EXPORT_SYMBOL(omap_set_dma_write_mode);  void omap_set_dma_channel_mode(int lch, enum omap_dma_channel_mode mode)  { -	if (cpu_class_is_omap1() && !cpu_is_omap15xx()) { +	if (dma_omap1() && !dma_omap15xx()) {  		u32 l; -		l = dma_read(LCH_CTRL(lch)); +		l = p->dma_read(LCH_CTRL, lch);  		l &= ~0x7;  		l |= mode; -		dma_write(l, LCH_CTRL(lch)); +		p->dma_write(l, LCH_CTRL, lch);  	}  }  EXPORT_SYMBOL(omap_set_dma_channel_mode); @@ -415,30 +377,24 @@ void omap_set_dma_src_params(int lch, int src_port, int src_amode,  {  	u32 l; -	if (cpu_class_is_omap1()) { +	if (dma_omap1()) {  		u16 w; -		w = dma_read(CSDP(lch)); +		w = p->dma_read(CSDP, lch);  		w &= ~(0x1f << 2);  		w |= src_port << 2; -		dma_write(w, CSDP(lch)); +		p->dma_write(w, CSDP, lch);  	} -	l = dma_read(CCR(lch)); +	l = p->dma_read(CCR, lch);  	l &= ~(0x03 << 12);  	l |= src_amode << 12; -	dma_write(l, CCR(lch)); - -	if (cpu_class_is_omap1()) { -		dma_write(src_start >> 16, CSSA_U(lch)); -		dma_write((u16)src_start, CSSA_L(lch)); -	} +	p->dma_write(l, CCR, lch); -	if (cpu_class_is_omap2()) -		dma_write(src_start, CSSA(lch)); +	p->dma_write(src_start, CSSA, lch); -	dma_write(src_ei, CSEI(lch)); -	dma_write(src_fi, CSFI(lch)); +	p->dma_write(src_ei, CSEI, lch); +	p->dma_write(src_fi, CSFI, lch);  }  EXPORT_SYMBOL(omap_set_dma_src_params); @@ -463,11 +419,11 @@ EXPORT_SYMBOL(omap_set_dma_params);  void omap_set_dma_src_index(int lch, int eidx, int fidx)  { -	if (cpu_class_is_omap2()) +	if (dma_omap2plus())  		return; -	dma_write(eidx, CSEI(lch)); -	dma_write(fidx, CSFI(lch)); +	p->dma_write(eidx, CSEI, lch); +	p->dma_write(fidx, CSFI, lch);  }  EXPORT_SYMBOL(omap_set_dma_src_index); @@ -475,11 +431,11 @@ void omap_set_dma_src_data_pack(int lch, int enable)  {  	u32 l; -	l = dma_read(CSDP(lch)); +	l = p->dma_read(CSDP, lch);  	l &= ~(1 << 6);  	if (enable)  		l |= (1 << 6); -	dma_write(l, CSDP(lch)); +	p->dma_write(l, CSDP, lch);  }  EXPORT_SYMBOL(omap_set_dma_src_data_pack); @@ -488,20 +444,20 @@ void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)  	unsigned int burst = 0;  	u32 l; -	l = dma_read(CSDP(lch)); +	l = p->dma_read(CSDP, lch);  	l &= ~(0x03 << 7);  	switch (burst_mode) {  	case OMAP_DMA_DATA_BURST_DIS:  		break;  	case OMAP_DMA_DATA_BURST_4: -		if (cpu_class_is_omap2()) +		if (dma_omap2plus())  			burst = 0x1;  		else  			burst = 0x2;  		break;  	case OMAP_DMA_DATA_BURST_8: -		if (cpu_class_is_omap2()) { +		if (dma_omap2plus()) {  			burst = 0x2;  			break;  		} @@ -511,7 +467,7 @@ void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)  		 * fall through  		 */  	case OMAP_DMA_DATA_BURST_16: -		if (cpu_class_is_omap2()) { +		if (dma_omap2plus()) {  			burst = 0x3;  			break;  		} @@ -524,7 +480,7 @@ void omap_set_dma_src_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)  	}  	l |= (burst << 7); -	dma_write(l, CSDP(lch)); +	p->dma_write(l, CSDP, lch);  }  EXPORT_SYMBOL(omap_set_dma_src_burst_mode); @@ -535,38 +491,32 @@ void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,  {  	u32 l; -	if (cpu_class_is_omap1()) { -		l = dma_read(CSDP(lch)); +	if (dma_omap1()) { +		l = p->dma_read(CSDP, lch);  		l &= ~(0x1f << 9);  		l |= dest_port << 9; -		dma_write(l, CSDP(lch)); +		p->dma_write(l, CSDP, lch);  	} -	l = dma_read(CCR(lch)); +	l = p->dma_read(CCR, lch);  	l &= ~(0x03 << 14);  	l |= dest_amode << 14; -	dma_write(l, CCR(lch)); - -	if (cpu_class_is_omap1()) { -		dma_write(dest_start >> 16, CDSA_U(lch)); -		dma_write(dest_start, CDSA_L(lch)); -	} +	p->dma_write(l, CCR, lch); -	if (cpu_class_is_omap2()) -		dma_write(dest_start, CDSA(lch)); +	p->dma_write(dest_start, CDSA, lch); -	dma_write(dst_ei, CDEI(lch)); -	dma_write(dst_fi, CDFI(lch)); +	p->dma_write(dst_ei, CDEI, lch); +	p->dma_write(dst_fi, CDFI, lch);  }  EXPORT_SYMBOL(omap_set_dma_dest_params);  void omap_set_dma_dest_index(int lch, int eidx, int fidx)  { -	if (cpu_class_is_omap2()) +	if (dma_omap2plus())  		return; -	dma_write(eidx, CDEI(lch)); -	dma_write(fidx, CDFI(lch)); +	p->dma_write(eidx, CDEI, lch); +	p->dma_write(fidx, CDFI, lch);  }  EXPORT_SYMBOL(omap_set_dma_dest_index); @@ -574,11 +524,11 @@ void omap_set_dma_dest_data_pack(int lch, int enable)  {  	u32 l; -	l = dma_read(CSDP(lch)); +	l = p->dma_read(CSDP, lch);  	l &= ~(1 << 13);  	if (enable)  		l |= 1 << 13; -	dma_write(l, CSDP(lch)); +	p->dma_write(l, CSDP, lch);  }  EXPORT_SYMBOL(omap_set_dma_dest_data_pack); @@ -587,26 +537,26 @@ void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)  	unsigned int burst = 0;  	u32 l; -	l = dma_read(CSDP(lch)); +	l = p->dma_read(CSDP, lch);  	l &= ~(0x03 << 14);  	switch (burst_mode) {  	case OMAP_DMA_DATA_BURST_DIS:  		break;  	case OMAP_DMA_DATA_BURST_4: -		if (cpu_class_is_omap2()) +		if (dma_omap2plus())  			burst = 0x1;  		else  			burst = 0x2;  		break;  	case OMAP_DMA_DATA_BURST_8: -		if (cpu_class_is_omap2()) +		if (dma_omap2plus())  			burst = 0x2;  		else  			burst = 0x3;  		break;  	case OMAP_DMA_DATA_BURST_16: -		if (cpu_class_is_omap2()) { +		if (dma_omap2plus()) {  			burst = 0x3;  			break;  		} @@ -620,28 +570,31 @@ void omap_set_dma_dest_burst_mode(int lch, enum omap_dma_burst_mode burst_mode)  		return;  	}  	l |= (burst << 14); -	dma_write(l, CSDP(lch)); +	p->dma_write(l, CSDP, lch);  }  EXPORT_SYMBOL(omap_set_dma_dest_burst_mode);  static inline void omap_enable_channel_irq(int lch)  { -	u32 status; -  	/* Clear CSR */ -	if (cpu_class_is_omap1()) -		status = dma_read(CSR(lch)); -	else if (cpu_class_is_omap2()) -		dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(lch)); +	if (dma_omap1()) +		p->dma_read(CSR, lch); +	else +		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);  	/* Enable some nice interrupts. */ -	dma_write(dma_chan[lch].enabled_irqs, CICR(lch)); +	p->dma_write(dma_chan[lch].enabled_irqs, CICR, lch);  } -static void omap_disable_channel_irq(int lch) +static inline void omap_disable_channel_irq(int lch)  { -	if (cpu_class_is_omap2()) -		dma_write(0, CICR(lch)); +	/* disable channel interrupts */ +	p->dma_write(0, CICR, lch); +	/* Clear CSR */ +	if (dma_omap1()) +		p->dma_read(CSR, lch); +	else +		p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, lch);  }  void omap_enable_dma_irq(int lch, u16 bits) @@ -660,9 +613,9 @@ static inline void enable_lnk(int lch)  {  	u32 l; -	l = dma_read(CLNK_CTRL(lch)); +	l = p->dma_read(CLNK_CTRL, lch); -	if (cpu_class_is_omap1()) +	if (dma_omap1())  		l &= ~(1 << 14);  	/* Set the ENABLE_LNK bits */ @@ -670,34 +623,34 @@ static inline void enable_lnk(int lch)  		l = dma_chan[lch].next_lch | (1 << 15);  #ifndef CONFIG_ARCH_OMAP1 -	if (cpu_class_is_omap2()) +	if (dma_omap2plus())  		if (dma_chan[lch].next_linked_ch != -1)  			l = dma_chan[lch].next_linked_ch | (1 << 15);  #endif -	dma_write(l, CLNK_CTRL(lch)); +	p->dma_write(l, CLNK_CTRL, lch);  }  static inline void disable_lnk(int lch)  {  	u32 l; -	l = dma_read(CLNK_CTRL(lch)); +	l = p->dma_read(CLNK_CTRL, lch);  	/* Disable interrupts */ -	if (cpu_class_is_omap1()) { -		dma_write(0, CICR(lch)); +	omap_disable_channel_irq(lch); + +	if (dma_omap1()) {  		/* Set the STOP_LNK bit */  		l |= 1 << 14;  	} -	if (cpu_class_is_omap2()) { -		omap_disable_channel_irq(lch); +	if (dma_omap2plus()) {  		/* Clear the ENABLE_LNK bit */  		l &= ~(1 << 15);  	} -	dma_write(l, CLNK_CTRL(lch)); +	p->dma_write(l, CLNK_CTRL, lch);  	dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE;  } @@ -706,13 +659,16 @@ static inline void omap2_enable_irq_lch(int lch)  	u32 val;  	unsigned long flags; -	if (!cpu_class_is_omap2()) +	if (dma_omap1())  		return;  	spin_lock_irqsave(&dma_chan_lock, flags); -	val = dma_read(IRQENABLE_L0); +	/* clear IRQ STATUS */ +	p->dma_write(1 << lch, IRQSTATUS_L0, lch); +	/* Enable interrupt */ +	val = p->dma_read(IRQENABLE_L0, lch);  	val |= 1 << lch; -	dma_write(val, IRQENABLE_L0); +	p->dma_write(val, IRQENABLE_L0, lch);  	spin_unlock_irqrestore(&dma_chan_lock, flags);  } @@ -721,13 +677,16 @@ static inline void omap2_disable_irq_lch(int lch)  	u32 val;  	unsigned long flags; -	if (!cpu_class_is_omap2()) +	if (dma_omap1())  		return;  	spin_lock_irqsave(&dma_chan_lock, flags); -	val = dma_read(IRQENABLE_L0); +	/* Disable interrupt */ +	val = p->dma_read(IRQENABLE_L0, lch);  	val &= ~(1 << lch); -	dma_write(val, IRQENABLE_L0); +	p->dma_write(val, IRQENABLE_L0, lch); +	/* clear IRQ STATUS */ +	p->dma_write(1 << lch, IRQSTATUS_L0, lch);  	spin_unlock_irqrestore(&dma_chan_lock, flags);  } @@ -743,8 +702,8 @@ int omap_request_dma(int dev_id, const char *dev_name,  	for (ch = 0; ch < dma_chan_count; ch++) {  		if (free_ch == -1 && dma_chan[ch].dev_id == -1) {  			free_ch = ch; -			if (dev_id == 0) -				break; +			/* Exit after first free channel found */ +			break;  		}  	}  	if (free_ch == -1) { @@ -754,10 +713,10 @@ int omap_request_dma(int dev_id, const char *dev_name,  	chan = dma_chan + free_ch;  	chan->dev_id = dev_id; -	if (cpu_class_is_omap1()) -		clear_lch_regs(free_ch); +	if (p->clear_lch_regs) +		p->clear_lch_regs(free_ch); -	if (cpu_class_is_omap2()) +	if (dma_omap2plus())  		omap_clear_dma(free_ch);  	spin_unlock_irqrestore(&dma_chan_lock, flags); @@ -768,7 +727,7 @@ int omap_request_dma(int dev_id, const char *dev_name,  	chan->flags = 0;  #ifndef CONFIG_ARCH_OMAP1 -	if (cpu_class_is_omap2()) { +	if (dma_omap2plus()) {  		chan->chain_id = -1;  		chan->next_linked_ch = -1;  	} @@ -776,13 +735,13 @@ int omap_request_dma(int dev_id, const char *dev_name,  	chan->enabled_irqs = OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ; -	if (cpu_class_is_omap1()) +	if (dma_omap1())  		chan->enabled_irqs |= OMAP1_DMA_TOUT_IRQ; -	else if (cpu_class_is_omap2()) +	else if (dma_omap2plus())  		chan->enabled_irqs |= OMAP2_DMA_MISALIGNED_ERR_IRQ |  			OMAP2_DMA_TRANS_ERR_IRQ; -	if (cpu_is_omap16xx()) { +	if (dma_omap16xx()) {  		/* If the sync device is set, configure it dynamically. */  		if (dev_id != 0) {  			set_gdma_dev(free_ch + 1, dev_id); @@ -792,17 +751,14 @@ int omap_request_dma(int dev_id, const char *dev_name,  		 * Disable the 1510 compatibility mode and set the sync device  		 * id.  		 */ -		dma_write(dev_id | (1 << 10), CCR(free_ch)); -	} else if (cpu_is_omap7xx() || cpu_is_omap15xx()) { -		dma_write(dev_id, CCR(free_ch)); +		p->dma_write(dev_id | (1 << 10), CCR, free_ch); +	} else if (dma_omap1()) { +		p->dma_write(dev_id, CCR, free_ch);  	} -	if (cpu_class_is_omap2()) { -		omap2_enable_irq_lch(free_ch); +	if (dma_omap2plus()) {  		omap_enable_channel_irq(free_ch); -		/* Clear the CSR register and IRQ status register */ -		dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(free_ch)); -		dma_write(1 << free_ch, IRQSTATUS_L0); +		omap2_enable_irq_lch(free_ch);  	}  	*dma_ch_out = free_ch; @@ -821,27 +777,19 @@ void omap_free_dma(int lch)  		return;  	} -	if (cpu_class_is_omap1()) { -		/* Disable all DMA interrupts for the channel. */ -		dma_write(0, CICR(lch)); -		/* Make sure the DMA transfer is stopped. */ -		dma_write(0, CCR(lch)); -	} - -	if (cpu_class_is_omap2()) { +	/* Disable interrupt for logical channel */ +	if (dma_omap2plus())  		omap2_disable_irq_lch(lch); -		/* Clear the CSR register and IRQ status register */ -		dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(lch)); -		dma_write(1 << lch, IRQSTATUS_L0); +	/* Disable all DMA interrupts for the channel. */ +	omap_disable_channel_irq(lch); -		/* Disable all DMA interrupts for the channel. */ -		dma_write(0, CICR(lch)); +	/* Make sure the DMA transfer is stopped. */ +	p->dma_write(0, CCR, lch); -		/* Make sure the DMA transfer is stopped. */ -		dma_write(0, CCR(lch)); +	/* Clear registers */ +	if (dma_omap2plus())  		omap_clear_dma(lch); -	}  	spin_lock_irqsave(&dma_chan_lock, flags);  	dma_chan[lch].dev_id = -1; @@ -866,7 +814,7 @@ omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams)  {  	u32 reg; -	if (!cpu_class_is_omap2()) { +	if (dma_omap1()) {  		printk(KERN_ERR "FIXME: no %s on 15xx/16xx\n", __func__);  		return;  	} @@ -880,7 +828,7 @@ omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams)  	reg |= (0x3 & tparams) << 12;  	reg |= (arb_rate & 0xff) << 16; -	dma_write(reg, GCR); +	p->dma_write(reg, GCR, 0);  }  EXPORT_SYMBOL(omap_dma_set_global_params); @@ -903,14 +851,14 @@ omap_dma_set_prio_lch(int lch, unsigned char read_prio,  		printk(KERN_ERR "Invalid channel id\n");  		return -EINVAL;  	} -	l = dma_read(CCR(lch)); +	l = p->dma_read(CCR, lch);  	l &= ~((1 << 6) | (1 << 26)); -	if (cpu_is_omap2430() || cpu_is_omap34xx() ||  cpu_is_omap44xx()) +	if (d->dev_caps & IS_RW_PRIORITY)  		l |= ((read_prio & 0x1) << 6) | ((write_prio & 0x1) << 26);  	else  		l |= ((read_prio & 0x1) << 6); -	dma_write(l, CCR(lch)); +	p->dma_write(l, CCR, lch);  	return 0;  } @@ -925,25 +873,7 @@ void omap_clear_dma(int lch)  	unsigned long flags;  	local_irq_save(flags); - -	if (cpu_class_is_omap1()) { -		u32 l; - -		l = dma_read(CCR(lch)); -		l &= ~OMAP_DMA_CCR_EN; -		dma_write(l, CCR(lch)); - -		/* Clear pending interrupts */ -		l = dma_read(CSR(lch)); -	} - -	if (cpu_class_is_omap2()) { -		int i; -		void __iomem *lch_base = omap_dma_base + OMAP_DMA4_CH_BASE(lch); -		for (i = 0; i < 0x44; i += 4) -			__raw_writel(0, lch_base + i); -	} - +	p->clear_dma(lch);  	local_irq_restore(flags);  }  EXPORT_SYMBOL(omap_clear_dma); @@ -956,20 +886,21 @@ void omap_start_dma(int lch)  	 * The CPC/CDAC register needs to be initialized to zero  	 * before starting dma transfer.  	 */ -	if (cpu_is_omap15xx()) -		dma_write(0, CPC(lch)); +	if (dma_omap15xx()) +		p->dma_write(0, CPC, lch);  	else -		dma_write(0, CDAC(lch)); +		p->dma_write(0, CDAC, lch);  	if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) {  		int next_lch, cur_lch; -		char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT]; +		char dma_chan_link_map[MAX_LOGICAL_DMA_CH_COUNT]; -		dma_chan_link_map[lch] = 1;  		/* Set the link register of the first channel */  		enable_lnk(lch);  		memset(dma_chan_link_map, 0, sizeof(dma_chan_link_map)); +		dma_chan_link_map[lch] = 1; +  		cur_lch = dma_chan[lch].next_lch;  		do {  			next_lch = dma_chan[cur_lch].next_lch; @@ -985,32 +916,25 @@ void omap_start_dma(int lch)  			cur_lch = next_lch;  		} while (next_lch != -1); -	} else if (cpu_is_omap242x() || -		(cpu_is_omap243x() &&  omap_type() <= OMAP2430_REV_ES1_0)) { - -		/* Errata: Need to write lch even if not using chaining */ -		dma_write(lch, CLNK_CTRL(lch)); -	} +	} else if (IS_DMA_ERRATA(DMA_ERRATA_PARALLEL_CHANNELS)) +		p->dma_write(lch, CLNK_CTRL, lch);  	omap_enable_channel_irq(lch); -	l = dma_read(CCR(lch)); +	l = p->dma_read(CCR, lch); + +	if (IS_DMA_ERRATA(DMA_ERRATA_IFRAME_BUFFERING)) +			l |= OMAP_DMA_CCR_BUFFERING_DISABLE; +	l |= OMAP_DMA_CCR_EN;  	/* -	 * Errata: Inter Frame DMA buffering issue (All OMAP2420 and -	 * OMAP2430ES1.0): DMA will wrongly buffer elements if packing and -	 * bursting is enabled. This might result in data gets stalled in -	 * FIFO at the end of the block. -	 * Workaround: DMA channels must have BUFFERING_DISABLED bit set to -	 * guarantee no data will stay in the DMA FIFO in case inter frame -	 * buffering occurs. +	 * As dma_write() uses IO accessors which are weakly ordered, there +	 * is no guarantee that data in coherent DMA memory will be visible +	 * to the DMA device.  Add a memory barrier here to ensure that any +	 * such data is visible prior to enabling DMA.  	 */ -	if (cpu_is_omap2420() || -	    (cpu_is_omap2430() && (omap_type() == OMAP2430_REV_ES1_0))) -		l |= OMAP_DMA_CCR_BUFFERING_DISABLE; - -	l |= OMAP_DMA_CCR_EN; -	dma_write(l, CCR(lch)); +	mb(); +	p->dma_write(l, CCR, lch);  	dma_chan[lch].flags |= OMAP_DMA_ACTIVE;  } @@ -1021,47 +945,52 @@ void omap_stop_dma(int lch)  	u32 l;  	/* Disable all interrupts on the channel */ -	if (cpu_class_is_omap1()) -		dma_write(0, CICR(lch)); +	omap_disable_channel_irq(lch); -	l = dma_read(CCR(lch)); -	/* OMAP3 Errata i541: sDMA FIFO draining does not finish */ -	if (cpu_is_omap34xx() && (l & OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) { +	l = p->dma_read(CCR, lch); +	if (IS_DMA_ERRATA(DMA_ERRATA_i541) && +			(l & OMAP_DMA_CCR_SEL_SRC_DST_SYNC)) {  		int i = 0;  		u32 sys_cf;  		/* Configure No-Standby */ -		l = dma_read(OCP_SYSCONFIG); +		l = p->dma_read(OCP_SYSCONFIG, lch);  		sys_cf = l;  		l &= ~DMA_SYSCONFIG_MIDLEMODE_MASK;  		l |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE); -		dma_write(l , OCP_SYSCONFIG); +		p->dma_write(l , OCP_SYSCONFIG, 0); -		l = dma_read(CCR(lch)); +		l = p->dma_read(CCR, lch);  		l &= ~OMAP_DMA_CCR_EN; -		dma_write(l, CCR(lch)); +		p->dma_write(l, CCR, lch);  		/* Wait for sDMA FIFO drain */ -		l = dma_read(CCR(lch)); +		l = p->dma_read(CCR, lch);  		while (i < 100 && (l & (OMAP_DMA_CCR_RD_ACTIVE |  					OMAP_DMA_CCR_WR_ACTIVE))) {  			udelay(5);  			i++; -			l = dma_read(CCR(lch)); +			l = p->dma_read(CCR, lch);  		}  		if (i >= 100) -			printk(KERN_ERR "DMA drain did not complete on " -					"lch %d\n", lch); +			pr_err("DMA drain did not complete on lch %d\n", lch);  		/* Restore OCP_SYSCONFIG */ -		dma_write(sys_cf, OCP_SYSCONFIG); +		p->dma_write(sys_cf, OCP_SYSCONFIG, lch);  	} else {  		l &= ~OMAP_DMA_CCR_EN; -		dma_write(l, CCR(lch)); +		p->dma_write(l, CCR, lch);  	} +	/* +	 * Ensure that data transferred by DMA is visible to any access +	 * after DMA has been disabled.  This is important for coherent +	 * DMA regions. +	 */ +	mb(); +  	if (!omap_dma_in_1510_mode() && dma_chan[lch].next_lch != -1) {  		int next_lch, cur_lch = lch; -		char dma_chan_link_map[OMAP_DMA4_LOGICAL_DMA_CH_COUNT]; +		char dma_chan_link_map[MAX_LOGICAL_DMA_CH_COUNT];  		memset(dma_chan_link_map, 0, sizeof(dma_chan_link_map));  		do { @@ -1114,27 +1043,35 @@ EXPORT_SYMBOL(omap_set_dma_callback);   * If the channel is running the caller must disable interrupts prior calling   * this function and process the returned value before re-enabling interrupt to   * prevent races with the interrupt handler. Note that in continuous mode there - * is a chance for CSSA_L register overflow inbetween the two reads resulting + * is a chance for CSSA_L register overflow between the two reads resulting   * in incorrect return value.   */  dma_addr_t omap_get_dma_src_pos(int lch)  {  	dma_addr_t offset = 0; -	if (cpu_is_omap15xx()) -		offset = dma_read(CPC(lch)); +	if (dma_omap15xx()) +		offset = p->dma_read(CPC, lch);  	else -		offset = dma_read(CSAC(lch)); +		offset = p->dma_read(CSAC, lch); -	/* -	 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is -	 * read before the DMA controller finished disabling the channel. -	 */ -	if (!cpu_is_omap15xx() && offset == 0) -		offset = dma_read(CSAC(lch)); +	if (IS_DMA_ERRATA(DMA_ERRATA_3_3) && offset == 0) +		offset = p->dma_read(CSAC, lch); + +	if (!dma_omap15xx()) { +		/* +		 * CDAC == 0 indicates that the DMA transfer on the channel has +		 * not been started (no data has been transferred so far). +		 * Return the programmed source start address in this case. +		 */ +		if (likely(p->dma_read(CDAC, lch))) +			offset = p->dma_read(CSAC, lch); +		else +			offset = p->dma_read(CSSA, lch); +	} -	if (cpu_class_is_omap1()) -		offset |= (dma_read(CSSA_U(lch)) << 16); +	if (dma_omap1()) +		offset |= (p->dma_read(CSSA, lch) & 0xFFFF0000);  	return offset;  } @@ -1145,27 +1082,35 @@ EXPORT_SYMBOL(omap_get_dma_src_pos);   * If the channel is running the caller must disable interrupts prior calling   * this function and process the returned value before re-enabling interrupt to   * prevent races with the interrupt handler. Note that in continuous mode there - * is a chance for CDSA_L register overflow inbetween the two reads resulting + * is a chance for CDSA_L register overflow between the two reads resulting   * in incorrect return value.   */  dma_addr_t omap_get_dma_dst_pos(int lch)  {  	dma_addr_t offset = 0; -	if (cpu_is_omap15xx()) -		offset = dma_read(CPC(lch)); +	if (dma_omap15xx()) +		offset = p->dma_read(CPC, lch);  	else -		offset = dma_read(CDAC(lch)); +		offset = p->dma_read(CDAC, lch);  	/*  	 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is  	 * read before the DMA controller finished disabling the channel.  	 */ -	if (!cpu_is_omap15xx() && offset == 0) -		offset = dma_read(CDAC(lch)); +	if (!dma_omap15xx() && offset == 0) { +		offset = p->dma_read(CDAC, lch); +		/* +		 * CDAC == 0 indicates that the DMA transfer on the channel has +		 * not been started (no data has been transferred so far). +		 * Return the programmed destination start address in this case. +		 */ +		if (unlikely(!offset)) +			offset = p->dma_read(CDSA, lch); +	} -	if (cpu_class_is_omap1()) -		offset |= (dma_read(CDSA_U(lch)) << 16); +	if (dma_omap1()) +		offset |= (p->dma_read(CDSA, lch) & 0xFFFF0000);  	return offset;  } @@ -1173,7 +1118,7 @@ EXPORT_SYMBOL(omap_get_dma_dst_pos);  int omap_get_dma_active_status(int lch)  { -	return (dma_read(CCR(lch)) & OMAP_DMA_CCR_EN) != 0; +	return (p->dma_read(CCR, lch) & OMAP_DMA_CCR_EN) != 0;  }  EXPORT_SYMBOL(omap_get_dma_active_status); @@ -1181,12 +1126,12 @@ int omap_dma_running(void)  {  	int lch; -	if (cpu_class_is_omap1()) +	if (dma_omap1())  		if (omap_lcd_dma_running())  			return 1;  	for (lch = 0; lch < dma_chan_count; lch++) -		if (dma_read(CCR(lch)) & OMAP_DMA_CCR_EN) +		if (p->dma_read(CCR, lch) & OMAP_DMA_CCR_EN)  			return 1;  	return 0; @@ -1201,8 +1146,8 @@ void omap_dma_link_lch(int lch_head, int lch_queue)  {  	if (omap_dma_in_1510_mode()) {  		if (lch_head == lch_queue) { -			dma_write(dma_read(CCR(lch_head)) | (3 << 8), -								CCR(lch_head)); +			p->dma_write(p->dma_read(CCR, lch_head) | (3 << 8), +								CCR, lch_head);  			return;  		}  		printk(KERN_ERR "DMA linking is not supported in 1510 mode\n"); @@ -1212,8 +1157,7 @@ void omap_dma_link_lch(int lch_head, int lch_queue)  	if ((dma_chan[lch_head].dev_id == -1) ||  	    (dma_chan[lch_queue].dev_id == -1)) { -		printk(KERN_ERR "omap_dma: trying to link " -		       "non requested channels\n"); +		pr_err("omap_dma: trying to link non requested channels\n");  		dump_stack();  	} @@ -1228,8 +1172,8 @@ void omap_dma_unlink_lch(int lch_head, int lch_queue)  {  	if (omap_dma_in_1510_mode()) {  		if (lch_head == lch_queue) { -			dma_write(dma_read(CCR(lch_head)) & ~(3 << 8), -								CCR(lch_head)); +			p->dma_write(p->dma_read(CCR, lch_head) & ~(3 << 8), +								CCR, lch_head);  			return;  		}  		printk(KERN_ERR "DMA linking is not supported in 1510 mode\n"); @@ -1239,15 +1183,13 @@ void omap_dma_unlink_lch(int lch_head, int lch_queue)  	if (dma_chan[lch_head].next_lch != lch_queue ||  	    dma_chan[lch_head].next_lch == -1) { -		printk(KERN_ERR "omap_dma: trying to unlink " -		       "non linked channels\n"); +		pr_err("omap_dma: trying to unlink non linked channels\n");  		dump_stack();  	}  	if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) ||  	    (dma_chan[lch_queue].flags & OMAP_DMA_ACTIVE)) { -		printk(KERN_ERR "omap_dma: You need to stop the DMA channels " -		       "before unlinking\n"); +		pr_err("omap_dma: You need to stop the DMA channels before unlinking\n");  		dump_stack();  	} @@ -1255,8 +1197,6 @@ void omap_dma_unlink_lch(int lch_head, int lch_queue)  }  EXPORT_SYMBOL(omap_dma_unlink_lch); -/*----------------------------------------------------------------------------*/ -  #ifndef CONFIG_ARCH_OMAP1  /* Create chain of DMA channesls */  static void create_dma_lch_chain(int lch_head, int lch_queue) @@ -1281,15 +1221,15 @@ static void create_dma_lch_chain(int lch_head, int lch_queue)  					lch_queue;  	} -	l = dma_read(CLNK_CTRL(lch_head)); +	l = p->dma_read(CLNK_CTRL, lch_head);  	l &= ~(0x1f);  	l |= lch_queue; -	dma_write(l, CLNK_CTRL(lch_head)); +	p->dma_write(l, CLNK_CTRL, lch_head); -	l = dma_read(CLNK_CTRL(lch_queue)); +	l = p->dma_read(CLNK_CTRL, lch_queue);  	l &= ~(0x1f);  	l |= (dma_chan[lch_queue].next_linked_ch); -	dma_write(l, CLNK_CTRL(lch_queue)); +	p->dma_write(l, CLNK_CTRL, lch_queue);  }  /** @@ -1565,13 +1505,13 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,  	/* Set the params to the free channel */  	if (src_start != 0) -		dma_write(src_start, CSSA(lch)); +		p->dma_write(src_start, CSSA, lch);  	if (dest_start != 0) -		dma_write(dest_start, CDSA(lch)); +		p->dma_write(dest_start, CDSA, lch);  	/* Write the buffer size */ -	dma_write(elem_count, CEN(lch)); -	dma_write(frame_count, CFN(lch)); +	p->dma_write(elem_count, CEN, lch); +	p->dma_write(frame_count, CFN, lch);  	/*  	 * If the chain is dynamically linked, @@ -1604,8 +1544,8 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,  				enable_lnk(dma_chan[lch].prev_linked_ch);  				dma_chan[lch].state = DMA_CH_QUEUED;  				start_dma = 0; -				if (0 == ((1 << 7) & dma_read( -					CCR(dma_chan[lch].prev_linked_ch)))) { +				if (0 == ((1 << 7) & p->dma_read( +					CCR, dma_chan[lch].prev_linked_ch))) {  					disable_lnk(dma_chan[lch].  						    prev_linked_ch);  					pr_debug("\n prev ch is stopped\n"); @@ -1621,7 +1561,7 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,  			}  			omap_enable_channel_irq(lch); -			l = dma_read(CCR(lch)); +			l = p->dma_read(CCR, lch);  			if ((0 == (l & (1 << 24))))  				l &= ~(1 << 25); @@ -1632,12 +1572,12 @@ int omap_dma_chain_a_transfer(int chain_id, int src_start, int dest_start,  					l |= (1 << 7);  					dma_chan[lch].state = DMA_CH_STARTED;  					pr_debug("starting %d\n", lch); -					dma_write(l, CCR(lch)); +					p->dma_write(l, CCR, lch);  				} else  					start_dma = 0;  			} else {  				if (0 == (l & (1 << 7))) -					dma_write(l, CCR(lch)); +					p->dma_write(l, CCR, lch);  			}  			dma_chan[lch].flags |= OMAP_DMA_ACTIVE;  		} @@ -1682,7 +1622,7 @@ int omap_start_dma_chain_transfers(int chain_id)  		omap_enable_channel_irq(channels[0]);  	} -	l = dma_read(CCR(channels[0])); +	l = p->dma_read(CCR, channels[0]);  	l |= (1 << 7);  	dma_linked_lch[chain_id].chain_state = DMA_CHAIN_STARTED;  	dma_chan[channels[0]].state = DMA_CH_STARTED; @@ -1691,7 +1631,7 @@ int omap_start_dma_chain_transfers(int chain_id)  		l &= ~(1 << 25);  	else  		l |= (1 << 25); -	dma_write(l, CCR(channels[0])); +	p->dma_write(l, CCR, channels[0]);  	dma_chan[channels[0]].flags |= OMAP_DMA_ACTIVE; @@ -1711,7 +1651,7 @@ int omap_stop_dma_chain_transfers(int chain_id)  {  	int *channels;  	u32 l, i; -	u32 sys_cf; +	u32 sys_cf = 0;  	/* Check for input params */  	if (unlikely((chain_id < 0 || chain_id >= dma_lch_count))) { @@ -1726,22 +1666,20 @@ int omap_stop_dma_chain_transfers(int chain_id)  	}  	channels = dma_linked_lch[chain_id].linked_dmach_q; -	/* -	 * DMA Errata: -	 * Special programming model needed to disable DMA before end of block -	 */ -	sys_cf = dma_read(OCP_SYSCONFIG); -	l = sys_cf; -	/* Middle mode reg set no Standby */ -	l &= ~((1 << 12)|(1 << 13)); -	dma_write(l, OCP_SYSCONFIG); +	if (IS_DMA_ERRATA(DMA_ERRATA_i88)) { +		sys_cf = p->dma_read(OCP_SYSCONFIG, 0); +		l = sys_cf; +		/* Middle mode reg set no Standby */ +		l &= ~((1 << 12)|(1 << 13)); +		p->dma_write(l, OCP_SYSCONFIG, 0); +	}  	for (i = 0; i < dma_linked_lch[chain_id].no_of_lchs_linked; i++) {  		/* Stop the Channel transmission */ -		l = dma_read(CCR(channels[i])); +		l = p->dma_read(CCR, channels[i]);  		l &= ~(1 << 7); -		dma_write(l, CCR(channels[i])); +		p->dma_write(l, CCR, channels[i]);  		/* Disable the link in all the channels */  		disable_lnk(channels[i]); @@ -1753,8 +1691,8 @@ int omap_stop_dma_chain_transfers(int chain_id)  	/* Reset the Queue pointers */  	OMAP_DMA_CHAIN_QINIT(chain_id); -	/* Errata - put in the old value */ -	dma_write(sys_cf, OCP_SYSCONFIG); +	if (IS_DMA_ERRATA(DMA_ERRATA_i88)) +		p->dma_write(sys_cf, OCP_SYSCONFIG, 0);  	return 0;  } @@ -1796,8 +1734,8 @@ int omap_get_dma_chain_index(int chain_id, int *ei, int *fi)  	/* Get the current channel */  	lch = channels[dma_linked_lch[chain_id].q_head]; -	*ei = dma_read(CCEN(lch)); -	*fi = dma_read(CCFN(lch)); +	*ei = p->dma_read(CCEN, lch); +	*fi = p->dma_read(CCFN, lch);  	return 0;  } @@ -1834,7 +1772,7 @@ int omap_get_dma_chain_dst_pos(int chain_id)  	/* Get the current channel */  	lch = channels[dma_linked_lch[chain_id].q_head]; -	return dma_read(CDAC(lch)); +	return p->dma_read(CDAC, lch);  }  EXPORT_SYMBOL(omap_get_dma_chain_dst_pos); @@ -1868,7 +1806,7 @@ int omap_get_dma_chain_src_pos(int chain_id)  	/* Get the current channel */  	lch = channels[dma_linked_lch[chain_id].q_head]; -	return dma_read(CSAC(lch)); +	return p->dma_read(CSAC, lch);  }  EXPORT_SYMBOL(omap_get_dma_chain_src_pos);  #endif	/* ifndef CONFIG_ARCH_OMAP1 */ @@ -1885,7 +1823,7 @@ static int omap1_dma_handle_ch(int ch)  		csr = dma_chan[ch].saved_csr;  		dma_chan[ch].saved_csr = 0;  	} else -		csr = dma_read(CSR(ch)); +		csr = p->dma_read(CSR, ch);  	if (enable_1510_mode && ch <= 2 && (csr >> 7) != 0) {  		dma_chan[ch + 6].saved_csr = csr >> 7;  		csr &= 0x7f; @@ -1893,16 +1831,15 @@ static int omap1_dma_handle_ch(int ch)  	if ((csr & 0x3f) == 0)  		return 0;  	if (unlikely(dma_chan[ch].dev_id == -1)) { -		printk(KERN_WARNING "Spurious interrupt from DMA channel " -		       "%d (CSR %04x)\n", ch, csr); +		pr_warn("Spurious interrupt from DMA channel %d (CSR %04x)\n", +			ch, csr);  		return 0;  	}  	if (unlikely(csr & OMAP1_DMA_TOUT_IRQ)) -		printk(KERN_WARNING "DMA timeout with device %d\n", -		       dma_chan[ch].dev_id); +		pr_warn("DMA timeout with device %d\n", dma_chan[ch].dev_id);  	if (unlikely(csr & OMAP_DMA_DROP_IRQ)) -		printk(KERN_WARNING "DMA synchronization event drop occurred " -		       "with device %d\n", dma_chan[ch].dev_id); +		pr_warn("DMA synchronization event drop occurred with device %d\n", +			dma_chan[ch].dev_id);  	if (likely(csr & OMAP_DMA_BLOCK_IRQ))  		dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;  	if (likely(dma_chan[ch].callback != NULL)) @@ -1938,39 +1875,32 @@ static irqreturn_t omap1_dma_irq_handler(int irq, void *dev_id)  static int omap2_dma_handle_ch(int ch)  { -	u32 status = dma_read(CSR(ch)); +	u32 status = p->dma_read(CSR, ch);  	if (!status) {  		if (printk_ratelimit()) -			printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n", -				ch); -		dma_write(1 << ch, IRQSTATUS_L0); +			pr_warn("Spurious DMA IRQ for lch %d\n", ch); +		p->dma_write(1 << ch, IRQSTATUS_L0, ch);  		return 0;  	}  	if (unlikely(dma_chan[ch].dev_id == -1)) {  		if (printk_ratelimit()) -			printk(KERN_WARNING "IRQ %04x for non-allocated DMA" -					"channel %d\n", status, ch); +			pr_warn("IRQ %04x for non-allocated DMA channel %d\n", +				status, ch);  		return 0;  	}  	if (unlikely(status & OMAP_DMA_DROP_IRQ)) -		printk(KERN_INFO -		       "DMA synchronization event drop occurred with device " -		       "%d\n", dma_chan[ch].dev_id); +		pr_info("DMA synchronization event drop occurred with device %d\n", +			dma_chan[ch].dev_id);  	if (unlikely(status & OMAP2_DMA_TRANS_ERR_IRQ)) {  		printk(KERN_INFO "DMA transaction error with device %d\n",  		       dma_chan[ch].dev_id); -		if (cpu_class_is_omap2()) { -			/* -			 * Errata: sDMA Channel is not disabled -			 * after a transaction error. So we explicitely -			 * disable the channel -			 */ +		if (IS_DMA_ERRATA(DMA_ERRATA_i378)) {  			u32 ccr; -			ccr = dma_read(CCR(ch)); +			ccr = p->dma_read(CCR, ch);  			ccr &= ~OMAP_DMA_CCR_EN; -			dma_write(ccr, CCR(ch)); +			p->dma_write(ccr, CCR, ch);  			dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;  		}  	} @@ -1981,14 +1911,16 @@ static int omap2_dma_handle_ch(int ch)  		printk(KERN_INFO "DMA misaligned error with device %d\n",  		       dma_chan[ch].dev_id); -	dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(ch)); -	dma_write(1 << ch, IRQSTATUS_L0); +	p->dma_write(status, CSR, ch); +	p->dma_write(1 << ch, IRQSTATUS_L0, ch); +	/* read back the register to flush the write */ +	p->dma_read(IRQSTATUS_L0, ch);  	/* If the ch is not chained then chain_id will be -1 */  	if (dma_chan[ch].chain_id != -1) {  		int chain_id = dma_chan[ch].chain_id;  		dma_chan[ch].state = DMA_CH_NOTSTARTED; -		if (dma_read(CLNK_CTRL(ch)) & (1 << 15)) +		if (p->dma_read(CLNK_CTRL, ch) & (1 << 15))  			dma_chan[dma_chan[ch].next_linked_ch].state =  							DMA_CH_STARTED;  		if (dma_linked_lch[chain_id].chain_mode == @@ -1998,11 +1930,10 @@ static int omap2_dma_handle_ch(int ch)  		if (!OMAP_DMA_CHAIN_QEMPTY(chain_id))  			OMAP_DMA_CHAIN_INCQHEAD(chain_id); -		status = dma_read(CSR(ch)); +		status = p->dma_read(CSR, ch); +		p->dma_write(status, CSR, ch);  	} -	dma_write(status, CSR(ch)); -  	if (likely(dma_chan[ch].callback != NULL))  		dma_chan[ch].callback(ch, status, dma_chan[ch].data); @@ -2015,13 +1946,13 @@ static irqreturn_t omap2_dma_irq_handler(int irq, void *dev_id)  	u32 val, enable_reg;  	int i; -	val = dma_read(IRQSTATUS_L0); +	val = p->dma_read(IRQSTATUS_L0, 0);  	if (val == 0) {  		if (printk_ratelimit())  			printk(KERN_WARNING "Spurious DMA IRQ\n");  		return IRQ_HANDLED;  	} -	enable_reg = dma_read(IRQENABLE_L0); +	enable_reg = p->dma_read(IRQENABLE_L0, 0);  	val &= enable_reg; /* Dispatch only relevant interrupts */  	for (i = 0; i < dma_lch_count && val != 0; i++) {  		if (val & 1) @@ -2035,7 +1966,6 @@ static irqreturn_t omap2_dma_irq_handler(int irq, void *dev_id)  static struct irqaction omap24xx_dma_irq = {  	.name = "DMA",  	.handler = omap2_dma_irq_handler, -	.flags = IRQF_DISABLED  };  #else @@ -2044,125 +1974,95 @@ static struct irqaction omap24xx_dma_irq;  /*----------------------------------------------------------------------------*/ +/* + * Note that we are currently using only IRQENABLE_L0 and L1. + * As the DSP may be using IRQENABLE_L2 and L3, let's not + * touch those for now. + */  void omap_dma_global_context_save(void)  {  	omap_dma_global_context.dma_irqenable_l0 = -		dma_read(IRQENABLE_L0); +		p->dma_read(IRQENABLE_L0, 0); +	omap_dma_global_context.dma_irqenable_l1 = +		p->dma_read(IRQENABLE_L1, 0);  	omap_dma_global_context.dma_ocp_sysconfig = -		dma_read(OCP_SYSCONFIG); -	omap_dma_global_context.dma_gcr = dma_read(GCR); +		p->dma_read(OCP_SYSCONFIG, 0); +	omap_dma_global_context.dma_gcr = p->dma_read(GCR, 0);  }  void omap_dma_global_context_restore(void)  {  	int ch; -	dma_write(omap_dma_global_context.dma_gcr, GCR); -	dma_write(omap_dma_global_context.dma_ocp_sysconfig, -		OCP_SYSCONFIG); -	dma_write(omap_dma_global_context.dma_irqenable_l0, -		IRQENABLE_L0); +	p->dma_write(omap_dma_global_context.dma_gcr, GCR, 0); +	p->dma_write(omap_dma_global_context.dma_ocp_sysconfig, +		OCP_SYSCONFIG, 0); +	p->dma_write(omap_dma_global_context.dma_irqenable_l0, +		IRQENABLE_L0, 0); +	p->dma_write(omap_dma_global_context.dma_irqenable_l1, +		IRQENABLE_L1, 0); -	/* -	 * A bug in ROM code leaves IRQ status for channels 0 and 1 uncleared -	 * after secure sram context save and restore. Hence we need to -	 * manually clear those IRQs to avoid spurious interrupts. This -	 * affects only secure devices. -	 */ -	if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP)) -		dma_write(0x3 , IRQSTATUS_L0); +	if (IS_DMA_ERRATA(DMA_ROMCODE_BUG)) +		p->dma_write(0x3 , IRQSTATUS_L0, 0);  	for (ch = 0; ch < dma_chan_count; ch++)  		if (dma_chan[ch].dev_id != -1)  			omap_clear_dma(ch);  } -/*----------------------------------------------------------------------------*/ +struct omap_system_dma_plat_info *omap_get_plat_info(void) +{ +	return p; +} +EXPORT_SYMBOL_GPL(omap_get_plat_info); -static int __init omap_init_dma(void) +static int omap_system_dma_probe(struct platform_device *pdev)  { -	unsigned long base; -	int ch, r; - -	if (cpu_class_is_omap1()) { -		base = OMAP1_DMA_BASE; -		dma_lch_count = OMAP1_LOGICAL_DMA_CH_COUNT; -	} else if (cpu_is_omap24xx()) { -		base = OMAP24XX_DMA4_BASE; -		dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; -	} else if (cpu_is_omap34xx()) { -		base = OMAP34XX_DMA4_BASE; -		dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; -	} else if (cpu_is_omap44xx()) { -		base = OMAP44XX_DMA4_BASE; -		dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT; -	} else { -		pr_err("DMA init failed for unsupported omap\n"); -		return -ENODEV; +	int ch, ret = 0; +	int dma_irq; +	char irq_name[4]; +	int irq_rel; + +	p = pdev->dev.platform_data; +	if (!p) { +		dev_err(&pdev->dev, +			"%s: System DMA initialized without platform data\n", +			__func__); +		return -EINVAL;  	} -	omap_dma_base = ioremap(base, SZ_4K); -	BUG_ON(!omap_dma_base); +	d			= p->dma_attr; +	errata			= p->errata; + +	if ((d->dev_caps & RESERVE_CHANNEL) && omap_dma_reserve_channels +			&& (omap_dma_reserve_channels < d->lch_count)) +		d->lch_count	= omap_dma_reserve_channels; -	if (cpu_class_is_omap2() && omap_dma_reserve_channels -			&& (omap_dma_reserve_channels <= dma_lch_count)) -		dma_lch_count = omap_dma_reserve_channels; +	dma_lch_count		= d->lch_count; +	dma_chan_count		= dma_lch_count; +	enable_1510_mode	= d->dev_caps & ENABLE_1510_MODE; -	dma_chan = kzalloc(sizeof(struct omap_dma_lch) * dma_lch_count, -				GFP_KERNEL); +	dma_chan = devm_kcalloc(&pdev->dev, dma_lch_count, +				sizeof(struct omap_dma_lch), GFP_KERNEL);  	if (!dma_chan) { -		r = -ENOMEM; -		goto out_unmap; +		dev_err(&pdev->dev, "%s: kzalloc fail\n", __func__); +		return -ENOMEM;  	} -	if (cpu_class_is_omap2()) { + +	if (dma_omap2plus()) {  		dma_linked_lch = kzalloc(sizeof(struct dma_link_info) *  						dma_lch_count, GFP_KERNEL);  		if (!dma_linked_lch) { -			r = -ENOMEM; -			goto out_free; +			ret = -ENOMEM; +			goto exit_dma_lch_fail;  		}  	} -	if (cpu_is_omap15xx()) { -		printk(KERN_INFO "DMA support for OMAP15xx initialized\n"); -		dma_chan_count = 9; -		enable_1510_mode = 1; -	} else if (cpu_is_omap16xx() || cpu_is_omap7xx()) { -		printk(KERN_INFO "OMAP DMA hardware version %d\n", -		       dma_read(HW_ID)); -		printk(KERN_INFO "DMA capabilities: %08x:%08x:%04x:%04x:%04x\n", -		       (dma_read(CAPS_0_U) << 16) | -		       dma_read(CAPS_0_L), -		       (dma_read(CAPS_1_U) << 16) | -		       dma_read(CAPS_1_L), -		       dma_read(CAPS_2), dma_read(CAPS_3), -		       dma_read(CAPS_4)); -		if (!enable_1510_mode) { -			u16 w; - -			/* Disable OMAP 3.0/3.1 compatibility mode. */ -			w = dma_read(GSCR); -			w |= 1 << 3; -			dma_write(w, GSCR); -			dma_chan_count = 16; -		} else -			dma_chan_count = 9; -	} else if (cpu_class_is_omap2()) { -		u8 revision = dma_read(REVISION) & 0xff; -		printk(KERN_INFO "OMAP DMA hardware revision %d.%d\n", -		       revision >> 4, revision & 0xf); -		dma_chan_count = dma_lch_count; -	} else { -		dma_chan_count = 0; -		return 0; -	} -  	spin_lock_init(&dma_chan_lock); -  	for (ch = 0; ch < dma_chan_count; ch++) {  		omap_clear_dma(ch); -		if (cpu_class_is_omap2()) +		if (dma_omap2plus())  			omap2_disable_irq_lch(ch);  		dma_chan[ch].dev_id = -1; @@ -2171,73 +2071,114 @@ static int __init omap_init_dma(void)  		if (ch >= 6 && enable_1510_mode)  			continue; -		if (cpu_class_is_omap1()) { +		if (dma_omap1()) {  			/*  			 * request_irq() doesn't like dev_id (ie. ch) being  			 * zero, so we have to kludge around this.  			 */ -			r = request_irq(omap1_dma_irq[ch], +			sprintf(&irq_name[0], "%d", ch); +			dma_irq = platform_get_irq_byname(pdev, irq_name); + +			if (dma_irq < 0) { +				ret = dma_irq; +				goto exit_dma_irq_fail; +			} + +			/* INT_DMA_LCD is handled in lcd_dma.c */ +			if (dma_irq == INT_DMA_LCD) +				continue; + +			ret = request_irq(dma_irq,  					omap1_dma_irq_handler, 0, "DMA",  					(void *) (ch + 1)); -			if (r != 0) { -				int i; - -				printk(KERN_ERR "unable to request IRQ %d " -				       "for DMA (error %d)\n", -				       omap1_dma_irq[ch], r); -				for (i = 0; i < ch; i++) -					free_irq(omap1_dma_irq[i], -						 (void *) (i + 1)); -				goto out_free; -			} +			if (ret != 0) +				goto exit_dma_irq_fail;  		}  	} -	if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) +	if (d->dev_caps & IS_RW_PRIORITY)  		omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE,  				DMA_DEFAULT_FIFO_DEPTH, 0); -	if (cpu_class_is_omap2()) { -		int irq; -		if (cpu_is_omap44xx()) -			irq = OMAP44XX_IRQ_SDMA_0; -		else -			irq = INT_24XX_SDMA_IRQ0; -		setup_irq(irq, &omap24xx_dma_irq); -	} - -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		/* Enable smartidle idlemodes and autoidle */ -		u32 v = dma_read(OCP_SYSCONFIG); -		v &= ~(DMA_SYSCONFIG_MIDLEMODE_MASK | -				DMA_SYSCONFIG_SIDLEMODE_MASK | -				DMA_SYSCONFIG_AUTOIDLE); -		v |= (DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_SMARTIDLE) | -			DMA_SYSCONFIG_SIDLEMODE(DMA_IDLEMODE_SMARTIDLE) | -			DMA_SYSCONFIG_AUTOIDLE); -		dma_write(v , OCP_SYSCONFIG); -		/* reserve dma channels 0 and 1 in high security devices */ -		if (cpu_is_omap34xx() && -			(omap_type() != OMAP2_DEVICE_TYPE_GP)) { -			printk(KERN_INFO "Reserving DMA channels 0 and 1 for " -					"HS ROM code\n"); -			dma_chan[0].dev_id = 0; -			dma_chan[1].dev_id = 1; +	if (dma_omap2plus()) { +		strcpy(irq_name, "0"); +		dma_irq = platform_get_irq_byname(pdev, irq_name); +		if (dma_irq < 0) { +			dev_err(&pdev->dev, "failed: request IRQ %d", dma_irq); +			ret = dma_irq; +			goto exit_dma_lch_fail; +		} +		ret = setup_irq(dma_irq, &omap24xx_dma_irq); +		if (ret) { +			dev_err(&pdev->dev, "set_up failed for IRQ %d for DMA (error %d)\n", +				dma_irq, ret); +			goto exit_dma_lch_fail;  		}  	} +	/* reserve dma channels 0 and 1 in high security devices on 34xx */ +	if (d->dev_caps & HS_CHANNELS_RESERVED) { +		pr_info("Reserving DMA channels 0 and 1 for HS ROM code\n"); +		dma_chan[0].dev_id = 0; +		dma_chan[1].dev_id = 1; +	} +	p->show_dma_caps();  	return 0; -out_free: -	kfree(dma_chan); +exit_dma_irq_fail: +	dev_err(&pdev->dev, "unable to request IRQ %d for DMA (error %d)\n", +		dma_irq, ret); +	for (irq_rel = 0; irq_rel < ch;	irq_rel++) { +		dma_irq = platform_get_irq(pdev, irq_rel); +		free_irq(dma_irq, (void *)(irq_rel + 1)); +	} -out_unmap: -	iounmap(omap_dma_base); +exit_dma_lch_fail: +	return ret; +} + +static int omap_system_dma_remove(struct platform_device *pdev) +{ +	int dma_irq; -	return r; +	if (dma_omap2plus()) { +		char irq_name[4]; +		strcpy(irq_name, "0"); +		dma_irq = platform_get_irq_byname(pdev, irq_name); +		remove_irq(dma_irq, &omap24xx_dma_irq); +	} else { +		int irq_rel = 0; +		for ( ; irq_rel < dma_chan_count; irq_rel++) { +			dma_irq = platform_get_irq(pdev, irq_rel); +			free_irq(dma_irq, (void *)(irq_rel + 1)); +		} +	} +	return 0; +} + +static struct platform_driver omap_system_dma_driver = { +	.probe		= omap_system_dma_probe, +	.remove		= omap_system_dma_remove, +	.driver		= { +		.name	= "omap_dma_system" +	}, +}; + +static int __init omap_system_dma_init(void) +{ +	return platform_driver_register(&omap_system_dma_driver); +} +arch_initcall(omap_system_dma_init); + +static void __exit omap_system_dma_exit(void) +{ +	platform_driver_unregister(&omap_system_dma_driver);  } -arch_initcall(omap_init_dma); +MODULE_DESCRIPTION("OMAP SYSTEM DMA DRIVER"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRIVER_NAME); +MODULE_AUTHOR("Texas Instruments Inc");  /*   * Reserve the omap SDMA channels using cmdline bootarg diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 1d706cf63ca..db10169a08d 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -3,6 +3,12 @@   *   * OMAP Dual-Mode Timers   * + * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ + * Tarun Kanti DebBarma <tarun.kanti@ti.com> + * Thara Gopinath <thara@ti.com> + * + * dmtimer adaptation to platform_driver. + *   * Copyright (C) 2005 Nokia Corporation   * OMAP2 support by Juha Yrjola   * API improvements and OMAP2 clock framework support by Timo Teras @@ -29,461 +35,367 @@   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ -#include <linux/init.h> -#include <linux/spinlock.h> -#include <linux/errno.h> -#include <linux/list.h>  #include <linux/clk.h> -#include <linux/delay.h> -#include <linux/io.h>  #include <linux/module.h> -#include <mach/hardware.h> -#include <plat/dmtimer.h> -#include <mach/irqs.h> - -/* register offsets */ -#define _OMAP_TIMER_ID_OFFSET		0x00 -#define _OMAP_TIMER_OCP_CFG_OFFSET	0x10 -#define _OMAP_TIMER_SYS_STAT_OFFSET	0x14 -#define _OMAP_TIMER_STAT_OFFSET		0x18 -#define _OMAP_TIMER_INT_EN_OFFSET	0x1c -#define _OMAP_TIMER_WAKEUP_EN_OFFSET	0x20 -#define _OMAP_TIMER_CTRL_OFFSET		0x24 -#define		OMAP_TIMER_CTRL_GPOCFG		(1 << 14) -#define		OMAP_TIMER_CTRL_CAPTMODE	(1 << 13) -#define		OMAP_TIMER_CTRL_PT		(1 << 12) -#define		OMAP_TIMER_CTRL_TCM_LOWTOHIGH	(0x1 << 8) -#define		OMAP_TIMER_CTRL_TCM_HIGHTOLOW	(0x2 << 8) -#define		OMAP_TIMER_CTRL_TCM_BOTHEDGES	(0x3 << 8) -#define		OMAP_TIMER_CTRL_SCPWM		(1 << 7) -#define		OMAP_TIMER_CTRL_CE		(1 << 6) /* compare enable */ -#define		OMAP_TIMER_CTRL_PRE		(1 << 5) /* prescaler enable */ -#define		OMAP_TIMER_CTRL_PTV_SHIFT	2 /* prescaler value shift */ -#define		OMAP_TIMER_CTRL_POSTED		(1 << 2) -#define		OMAP_TIMER_CTRL_AR		(1 << 1) /* auto-reload enable */ -#define		OMAP_TIMER_CTRL_ST		(1 << 0) /* start timer */ -#define _OMAP_TIMER_COUNTER_OFFSET	0x28 -#define _OMAP_TIMER_LOAD_OFFSET		0x2c -#define _OMAP_TIMER_TRIGGER_OFFSET	0x30 -#define _OMAP_TIMER_WRITE_PEND_OFFSET	0x34 -#define		WP_NONE			0	/* no write pending bit */ -#define		WP_TCLR			(1 << 0) -#define		WP_TCRR			(1 << 1) -#define		WP_TLDR			(1 << 2) -#define		WP_TTGR			(1 << 3) -#define		WP_TMAR			(1 << 4) -#define		WP_TPIR			(1 << 5) -#define		WP_TNIR			(1 << 6) -#define		WP_TCVR			(1 << 7) -#define		WP_TOCR			(1 << 8) -#define		WP_TOWR			(1 << 9) -#define _OMAP_TIMER_MATCH_OFFSET	0x38 -#define _OMAP_TIMER_CAPTURE_OFFSET	0x3c -#define _OMAP_TIMER_IF_CTRL_OFFSET	0x40 -#define _OMAP_TIMER_CAPTURE2_OFFSET		0x44	/* TCAR2, 34xx only */ -#define _OMAP_TIMER_TICK_POS_OFFSET		0x48	/* TPIR, 34xx only */ -#define _OMAP_TIMER_TICK_NEG_OFFSET		0x4c	/* TNIR, 34xx only */ -#define _OMAP_TIMER_TICK_COUNT_OFFSET		0x50	/* TCVR, 34xx only */ -#define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET	0x54	/* TOCR, 34xx only */ -#define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET	0x58	/* TOWR, 34xx only */ - -/* register offsets with the write pending bit encoded */ -#define	WPSHIFT					16 - -#define OMAP_TIMER_ID_REG			(_OMAP_TIMER_ID_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_OCP_CFG_REG			(_OMAP_TIMER_OCP_CFG_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_SYS_STAT_REG			(_OMAP_TIMER_SYS_STAT_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_STAT_REG			(_OMAP_TIMER_STAT_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_INT_EN_REG			(_OMAP_TIMER_INT_EN_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_WAKEUP_EN_REG		(_OMAP_TIMER_WAKEUP_EN_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_CTRL_REG			(_OMAP_TIMER_CTRL_OFFSET \ -							| (WP_TCLR << WPSHIFT)) - -#define OMAP_TIMER_COUNTER_REG			(_OMAP_TIMER_COUNTER_OFFSET \ -							| (WP_TCRR << WPSHIFT)) - -#define OMAP_TIMER_LOAD_REG			(_OMAP_TIMER_LOAD_OFFSET \ -							| (WP_TLDR << WPSHIFT)) - -#define OMAP_TIMER_TRIGGER_REG			(_OMAP_TIMER_TRIGGER_OFFSET \ -							| (WP_TTGR << WPSHIFT)) - -#define OMAP_TIMER_WRITE_PEND_REG		(_OMAP_TIMER_WRITE_PEND_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_MATCH_REG			(_OMAP_TIMER_MATCH_OFFSET \ -							| (WP_TMAR << WPSHIFT)) - -#define OMAP_TIMER_CAPTURE_REG			(_OMAP_TIMER_CAPTURE_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_IF_CTRL_REG			(_OMAP_TIMER_IF_CTRL_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_CAPTURE2_REG			(_OMAP_TIMER_CAPTURE2_OFFSET \ -							| (WP_NONE << WPSHIFT)) - -#define OMAP_TIMER_TICK_POS_REG			(_OMAP_TIMER_TICK_POS_OFFSET \ -							| (WP_TPIR << WPSHIFT)) - -#define OMAP_TIMER_TICK_NEG_REG			(_OMAP_TIMER_TICK_NEG_OFFSET \ -							| (WP_TNIR << WPSHIFT)) - -#define OMAP_TIMER_TICK_COUNT_REG		(_OMAP_TIMER_TICK_COUNT_OFFSET \ -							| (WP_TCVR << WPSHIFT)) - -#define OMAP_TIMER_TICK_INT_MASK_SET_REG				\ -		(_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT)) - -#define OMAP_TIMER_TICK_INT_MASK_COUNT_REG				\ -		(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT)) - -struct omap_dm_timer { -	unsigned long phys_base; -	int irq; -#ifdef CONFIG_ARCH_OMAP2PLUS -	struct clk *iclk, *fclk; -#endif -	void __iomem *io_base; -	unsigned reserved:1; -	unsigned enabled:1; -	unsigned posted:1; -}; - -static int dm_timer_count; - -#ifdef CONFIG_ARCH_OMAP1 -static struct omap_dm_timer omap1_dm_timers[] = { -	{ .phys_base = 0xfffb1400, .irq = INT_1610_GPTIMER1 }, -	{ .phys_base = 0xfffb1c00, .irq = INT_1610_GPTIMER2 }, -	{ .phys_base = 0xfffb2400, .irq = INT_1610_GPTIMER3 }, -	{ .phys_base = 0xfffb2c00, .irq = INT_1610_GPTIMER4 }, -	{ .phys_base = 0xfffb3400, .irq = INT_1610_GPTIMER5 }, -	{ .phys_base = 0xfffb3c00, .irq = INT_1610_GPTIMER6 }, -	{ .phys_base = 0xfffb7400, .irq = INT_1610_GPTIMER7 }, -	{ .phys_base = 0xfffbd400, .irq = INT_1610_GPTIMER8 }, -}; - -static const int omap1_dm_timer_count = ARRAY_SIZE(omap1_dm_timers); - -#else -#define omap1_dm_timers			NULL -#define omap1_dm_timer_count		0 -#endif	/* CONFIG_ARCH_OMAP1 */ - -#ifdef CONFIG_ARCH_OMAP2 -static struct omap_dm_timer omap2_dm_timers[] = { -	{ .phys_base = 0x48028000, .irq = INT_24XX_GPTIMER1 }, -	{ .phys_base = 0x4802a000, .irq = INT_24XX_GPTIMER2 }, -	{ .phys_base = 0x48078000, .irq = INT_24XX_GPTIMER3 }, -	{ .phys_base = 0x4807a000, .irq = INT_24XX_GPTIMER4 }, -	{ .phys_base = 0x4807c000, .irq = INT_24XX_GPTIMER5 }, -	{ .phys_base = 0x4807e000, .irq = INT_24XX_GPTIMER6 }, -	{ .phys_base = 0x48080000, .irq = INT_24XX_GPTIMER7 }, -	{ .phys_base = 0x48082000, .irq = INT_24XX_GPTIMER8 }, -	{ .phys_base = 0x48084000, .irq = INT_24XX_GPTIMER9 }, -	{ .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, -	{ .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, -	{ .phys_base = 0x4808a000, .irq = INT_24XX_GPTIMER12 }, -}; - -static const char *omap2_dm_source_names[] __initdata = { -	"sys_ck", -	"func_32k_ck", -	"alt_ck", -	NULL -}; - -static struct clk *omap2_dm_source_clocks[3]; -static const int omap2_dm_timer_count = ARRAY_SIZE(omap2_dm_timers); - -#else -#define omap2_dm_timers			NULL -#define omap2_dm_timer_count		0 -#define omap2_dm_source_names		NULL -#define omap2_dm_source_clocks		NULL -#endif	/* CONFIG_ARCH_OMAP2 */ - -#ifdef CONFIG_ARCH_OMAP3 -static struct omap_dm_timer omap3_dm_timers[] = { -	{ .phys_base = 0x48318000, .irq = INT_24XX_GPTIMER1 }, -	{ .phys_base = 0x49032000, .irq = INT_24XX_GPTIMER2 }, -	{ .phys_base = 0x49034000, .irq = INT_24XX_GPTIMER3 }, -	{ .phys_base = 0x49036000, .irq = INT_24XX_GPTIMER4 }, -	{ .phys_base = 0x49038000, .irq = INT_24XX_GPTIMER5 }, -	{ .phys_base = 0x4903A000, .irq = INT_24XX_GPTIMER6 }, -	{ .phys_base = 0x4903C000, .irq = INT_24XX_GPTIMER7 }, -	{ .phys_base = 0x4903E000, .irq = INT_24XX_GPTIMER8 }, -	{ .phys_base = 0x49040000, .irq = INT_24XX_GPTIMER9 }, -	{ .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, -	{ .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, -	{ .phys_base = 0x48304000, .irq = INT_34XX_GPT12_IRQ }, -}; +#include <linux/io.h> +#include <linux/device.h> +#include <linux/err.h> +#include <linux/pm_runtime.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/platform_data/dmtimer-omap.h> -static const char *omap3_dm_source_names[] __initdata = { -	"sys_ck", -	"omap_32k_fck", -	NULL -}; +#include <plat/dmtimer.h> -static struct clk *omap3_dm_source_clocks[2]; -static const int omap3_dm_timer_count = ARRAY_SIZE(omap3_dm_timers); +static u32 omap_reserved_systimers; +static LIST_HEAD(omap_timer_list); +static DEFINE_SPINLOCK(dm_timer_lock); -#else -#define omap3_dm_timers			NULL -#define omap3_dm_timer_count		0 -#define omap3_dm_source_names		NULL -#define omap3_dm_source_clocks		NULL -#endif	/* CONFIG_ARCH_OMAP3 */ - -#ifdef CONFIG_ARCH_OMAP4 -static struct omap_dm_timer omap4_dm_timers[] = { -	{ .phys_base = 0x4a318000, .irq = OMAP44XX_IRQ_GPT1 }, -	{ .phys_base = 0x48032000, .irq = OMAP44XX_IRQ_GPT2 }, -	{ .phys_base = 0x48034000, .irq = OMAP44XX_IRQ_GPT3 }, -	{ .phys_base = 0x48036000, .irq = OMAP44XX_IRQ_GPT4 }, -	{ .phys_base = 0x40138000, .irq = OMAP44XX_IRQ_GPT5 }, -	{ .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT6 }, -	{ .phys_base = 0x4013a000, .irq = OMAP44XX_IRQ_GPT7 }, -	{ .phys_base = 0x4013e000, .irq = OMAP44XX_IRQ_GPT8 }, -	{ .phys_base = 0x4803e000, .irq = OMAP44XX_IRQ_GPT9 }, -	{ .phys_base = 0x48086000, .irq = OMAP44XX_IRQ_GPT10 }, -	{ .phys_base = 0x48088000, .irq = OMAP44XX_IRQ_GPT11 }, -	{ .phys_base = 0x4a320000, .irq = OMAP44XX_IRQ_GPT12 }, +enum { +	REQUEST_ANY = 0, +	REQUEST_BY_ID, +	REQUEST_BY_CAP, +	REQUEST_BY_NODE,  }; -static const char *omap4_dm_source_names[] __initdata = { -	"sys_clkin_ck", -	"sys_32k_ck", -	NULL -}; -static struct clk *omap4_dm_source_clocks[2]; -static const int omap4_dm_timer_count = ARRAY_SIZE(omap4_dm_timers); - -#else -#define omap4_dm_timers			NULL -#define omap4_dm_timer_count		0 -#define omap4_dm_source_names		NULL -#define omap4_dm_source_clocks		NULL -#endif	/* CONFIG_ARCH_OMAP4 */ - -static struct omap_dm_timer *dm_timers; -static const char **dm_source_names; -static struct clk **dm_source_clocks; -static spinlock_t dm_timer_lock; - -/* - * Reads timer registers in posted and non-posted mode. The posted mode bit - * is encoded in reg. Note that in posted mode write pending bit must be - * checked. Otherwise a read of a non completed write will produce an error. +/** + * omap_dm_timer_read_reg - read timer registers in posted and non-posted mode + * @timer:      timer pointer over which read operation to perform + * @reg:        lowest byte holds the register offset + * + * The posted mode bit is encoded in reg. Note that in posted mode write + * pending bit must be checked. Otherwise a read of a non completed write + * will produce an error.   */  static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)  { -	if (timer->posted) -		while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) -				& (reg >> WPSHIFT)) -			cpu_relax(); -	return readl(timer->io_base + (reg & 0xff)); +	WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET); +	return __omap_dm_timer_read(timer, reg, timer->posted);  } -/* - * Writes timer registers in posted and non-posted mode. The posted mode bit - * is encoded in reg. Note that in posted mode the write pending bit must be - * checked. Otherwise a write on a register which has a pending write will be - * lost. +/** + * omap_dm_timer_write_reg - write timer registers in posted and non-posted mode + * @timer:      timer pointer over which write operation is to perform + * @reg:        lowest byte holds the register offset + * @value:      data to write into the register + * + * The posted mode bit is encoded in reg. Note that in posted mode the write + * pending bit must be checked. Otherwise a write on a register which has a + * pending write will be lost.   */  static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,  						u32 value)  { -	if (timer->posted) -		while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff)) -				& (reg >> WPSHIFT)) -			cpu_relax(); -	writel(value, timer->io_base + (reg & 0xff)); +	WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET); +	__omap_dm_timer_write(timer, reg, value, timer->posted);  } -static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer) +static void omap_timer_restore_context(struct omap_dm_timer *timer)  { -	int c; - -	c = 0; -	while (!(omap_dm_timer_read_reg(timer, OMAP_TIMER_SYS_STAT_REG) & 1)) { -		c++; -		if (c > 100000) { -			printk(KERN_ERR "Timer failed to reset\n"); -			return; -		} -	} +	omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, +				timer->context.twer); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, +				timer->context.tcrr); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, +				timer->context.tldr); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, +				timer->context.tmar); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, +				timer->context.tsicr); +	writel_relaxed(timer->context.tier, timer->irq_ena); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, +				timer->context.tclr);  } -static void omap_dm_timer_reset(struct omap_dm_timer *timer) +static int omap_dm_timer_reset(struct omap_dm_timer *timer)  { -	u32 l; +	u32 l, timeout = 100000; -	if (!cpu_class_is_omap2() || timer != &dm_timers[0]) { -		omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); -		omap_dm_timer_wait_for_reset(timer); +	if (timer->revision != 1) +		return -EINVAL; + +	omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); + +	do { +		l = __omap_dm_timer_read(timer, +					 OMAP_TIMER_V1_SYS_STAT_OFFSET, 0); +	} while (!l && timeout--); + +	if (!timeout) { +		dev_err(&timer->pdev->dev, "Timer failed to reset\n"); +		return -ETIMEDOUT;  	} -	omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); -	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_OCP_CFG_REG); -	l |= 0x02 << 3;  /* Set to smart-idle mode */ -	l |= 0x2 << 8;   /* Set clock activity to perserve f-clock on idle */ +	/* Configure timer for smart-idle mode */ +	l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); +	l |= 0x2 << 0x3; +	__omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); + +	timer->posted = 0; + +	return 0; +} + +static int omap_dm_timer_prepare(struct omap_dm_timer *timer) +{ +	int rc;  	/* -	 * Enable wake-up on OMAP2 CPUs. +	 * FIXME: OMAP1 devices do not use the clock framework for dmtimers so +	 * do not call clk_get() for these devices.  	 */ -	if (cpu_class_is_omap2()) -		l |= 1 << 2; -	omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l); +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { +		timer->fclk = clk_get(&timer->pdev->dev, "fck"); +		if (WARN_ON_ONCE(IS_ERR(timer->fclk))) { +			dev_err(&timer->pdev->dev, ": No fclk handle.\n"); +			return -EINVAL; +		} +	} -	/* Match hardware reset default of posted mode */ -	omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, -			OMAP_TIMER_CTRL_POSTED); -	timer->posted = 1; +	omap_dm_timer_enable(timer); + +	if (timer->capability & OMAP_TIMER_NEEDS_RESET) { +		rc = omap_dm_timer_reset(timer); +		if (rc) { +			omap_dm_timer_disable(timer); +			return rc; +		} +	} + +	__omap_dm_timer_enable_posted(timer); +	omap_dm_timer_disable(timer); + +	return omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ);  } -static void omap_dm_timer_prepare(struct omap_dm_timer *timer) +static inline u32 omap_dm_timer_reserved_systimer(int id)  { -	omap_dm_timer_enable(timer); -	omap_dm_timer_reset(timer); +	return (omap_reserved_systimers & (1 << (id - 1))) ? 1 : 0;  } -struct omap_dm_timer *omap_dm_timer_request(void) +int omap_dm_timer_reserve_systimer(int id)  { -	struct omap_dm_timer *timer = NULL; +	if (omap_dm_timer_reserved_systimer(id)) +		return -ENODEV; + +	omap_reserved_systimers |= (1 << (id - 1)); + +	return 0; +} + +static struct omap_dm_timer *_omap_dm_timer_request(int req_type, void *data) +{ +	struct omap_dm_timer *timer = NULL, *t; +	struct device_node *np = NULL;  	unsigned long flags; -	int i; +	u32 cap = 0; +	int id = 0; + +	switch (req_type) { +	case REQUEST_BY_ID: +		id = *(int *)data; +		break; +	case REQUEST_BY_CAP: +		cap = *(u32 *)data; +		break; +	case REQUEST_BY_NODE: +		np = (struct device_node *)data; +		break; +	default: +		/* REQUEST_ANY */ +		break; +	}  	spin_lock_irqsave(&dm_timer_lock, flags); -	for (i = 0; i < dm_timer_count; i++) { -		if (dm_timers[i].reserved) +	list_for_each_entry(t, &omap_timer_list, node) { +		if (t->reserved)  			continue; -		timer = &dm_timers[i]; -		timer->reserved = 1; -		break; +		switch (req_type) { +		case REQUEST_BY_ID: +			if (id == t->pdev->id) { +				timer = t; +				timer->reserved = 1; +				goto found; +			} +			break; +		case REQUEST_BY_CAP: +			if (cap == (t->capability & cap)) { +				/* +				 * If timer is not NULL, we have already found +				 * one timer but it was not an exact match +				 * because it had more capabilites that what +				 * was required. Therefore, unreserve the last +				 * timer found and see if this one is a better +				 * match. +				 */ +				if (timer) +					timer->reserved = 0; +				timer = t; +				timer->reserved = 1; + +				/* Exit loop early if we find an exact match */ +				if (t->capability == cap) +					goto found; +			} +			break; +		case REQUEST_BY_NODE: +			if (np == t->pdev->dev.of_node) { +				timer = t; +				timer->reserved = 1; +				goto found; +			} +			break; +		default: +			/* REQUEST_ANY */ +			timer = t; +			timer->reserved = 1; +			goto found; +		}  	} +found:  	spin_unlock_irqrestore(&dm_timer_lock, flags); -	if (timer != NULL) -		omap_dm_timer_prepare(timer); +	if (timer && omap_dm_timer_prepare(timer)) { +		timer->reserved = 0; +		timer = NULL; +	} + +	if (!timer) +		pr_debug("%s: timer request failed!\n", __func__);  	return timer;  } + +struct omap_dm_timer *omap_dm_timer_request(void) +{ +	return _omap_dm_timer_request(REQUEST_ANY, NULL); +}  EXPORT_SYMBOL_GPL(omap_dm_timer_request);  struct omap_dm_timer *omap_dm_timer_request_specific(int id)  { -	struct omap_dm_timer *timer; -	unsigned long flags; - -	spin_lock_irqsave(&dm_timer_lock, flags); -	if (id <= 0 || id > dm_timer_count || dm_timers[id-1].reserved) { -		spin_unlock_irqrestore(&dm_timer_lock, flags); -		printk("BUG: warning at %s:%d/%s(): unable to get timer %d\n", -		       __FILE__, __LINE__, __func__, id); -		dump_stack(); +	/* Requesting timer by ID is not supported when device tree is used */ +	if (of_have_populated_dt()) { +		pr_warn("%s: Please use omap_dm_timer_request_by_cap/node()\n", +			__func__);  		return NULL;  	} -	timer = &dm_timers[id-1]; -	timer->reserved = 1; -	spin_unlock_irqrestore(&dm_timer_lock, flags); +	return _omap_dm_timer_request(REQUEST_BY_ID, &id); +} +EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); -	omap_dm_timer_prepare(timer); +/** + * omap_dm_timer_request_by_cap - Request a timer by capability + * @cap:	Bit mask of capabilities to match + * + * Find a timer based upon capabilities bit mask. Callers of this function + * should use the definitions found in the plat/dmtimer.h file under the + * comment "timer capabilities used in hwmod database". Returns pointer to + * timer handle on success and a NULL pointer on failure. + */ +struct omap_dm_timer *omap_dm_timer_request_by_cap(u32 cap) +{ +	return _omap_dm_timer_request(REQUEST_BY_CAP, &cap); +} +EXPORT_SYMBOL_GPL(omap_dm_timer_request_by_cap); -	return timer; +/** + * omap_dm_timer_request_by_node - Request a timer by device-tree node + * @np:		Pointer to device-tree timer node + * + * Request a timer based upon a device node pointer. Returns pointer to + * timer handle on success and a NULL pointer on failure. + */ +struct omap_dm_timer *omap_dm_timer_request_by_node(struct device_node *np) +{ +	if (!np) +		return NULL; + +	return _omap_dm_timer_request(REQUEST_BY_NODE, np);  } -EXPORT_SYMBOL_GPL(omap_dm_timer_request_specific); +EXPORT_SYMBOL_GPL(omap_dm_timer_request_by_node); -void omap_dm_timer_free(struct omap_dm_timer *timer) +int omap_dm_timer_free(struct omap_dm_timer *timer)  { -	omap_dm_timer_enable(timer); -	omap_dm_timer_reset(timer); -	omap_dm_timer_disable(timer); +	if (unlikely(!timer)) +		return -EINVAL; + +	clk_put(timer->fclk);  	WARN_ON(!timer->reserved);  	timer->reserved = 0; +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_free);  void omap_dm_timer_enable(struct omap_dm_timer *timer)  { -	if (timer->enabled) -		return; +	int c; -#ifdef CONFIG_ARCH_OMAP2PLUS -	if (cpu_class_is_omap2()) { -		clk_enable(timer->fclk); -		clk_enable(timer->iclk); +	pm_runtime_get_sync(&timer->pdev->dev); + +	if (!(timer->capability & OMAP_TIMER_ALWON)) { +		if (timer->get_context_loss_count) { +			c = timer->get_context_loss_count(&timer->pdev->dev); +			if (c != timer->ctx_loss_count) { +				omap_timer_restore_context(timer); +				timer->ctx_loss_count = c; +			} +		} else { +			omap_timer_restore_context(timer); +		}  	} -#endif - -	timer->enabled = 1;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_enable);  void omap_dm_timer_disable(struct omap_dm_timer *timer)  { -	if (!timer->enabled) -		return; - -#ifdef CONFIG_ARCH_OMAP2PLUS -	if (cpu_class_is_omap2()) { -		clk_disable(timer->iclk); -		clk_disable(timer->fclk); -	} -#endif - -	timer->enabled = 0; +	pm_runtime_put_sync(&timer->pdev->dev);  }  EXPORT_SYMBOL_GPL(omap_dm_timer_disable);  int omap_dm_timer_get_irq(struct omap_dm_timer *timer)  { -	return timer->irq; +	if (timer) +		return timer->irq; +	return -EINVAL;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_get_irq);  #if defined(CONFIG_ARCH_OMAP1) - +#include <mach/hardware.h>  /**   * omap_dm_timer_modify_idlect_mask - Check if any running timers use ARMXOR   * @inputmask: current value of idlect mask   */  __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)  { -	int i; +	int i = 0; +	struct omap_dm_timer *timer = NULL; +	unsigned long flags;  	/* If ARMXOR cannot be idled this function call is unnecessary */  	if (!(inputmask & (1 << 1)))  		return inputmask;  	/* If any active timer is using ARMXOR return modified mask */ -	for (i = 0; i < dm_timer_count; i++) { +	spin_lock_irqsave(&dm_timer_lock, flags); +	list_for_each_entry(timer, &omap_timer_list, node) {  		u32 l; -		l = omap_dm_timer_read_reg(&dm_timers[i], OMAP_TIMER_CTRL_REG); +		l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  		if (l & OMAP_TIMER_CTRL_ST) {  			if (((omap_readl(MOD_CONF_CTRL_1) >> (i * 2)) & 0x03) == 0)  				inputmask &= ~(1 << 1);  			else  				inputmask &= ~(1 << 2);  		} +		i++;  	} +	spin_unlock_irqrestore(&dm_timer_lock, flags);  	return inputmask;  } @@ -493,7 +405,9 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask);  struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer)  { -	return timer->fclk; +	if (timer && !IS_ERR(timer->fclk)) +		return timer->fclk; +	return NULL;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_get_fclk); @@ -507,93 +421,129 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_modify_idlect_mask);  #endif -void omap_dm_timer_trigger(struct omap_dm_timer *timer) +int omap_dm_timer_trigger(struct omap_dm_timer *timer)  { +	if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { +		pr_err("%s: timer not available or enabled.\n", __func__); +		return -EINVAL; +	} +  	omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_trigger); -void omap_dm_timer_start(struct omap_dm_timer *timer) +int omap_dm_timer_start(struct omap_dm_timer *timer)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer); +  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	if (!(l & OMAP_TIMER_CTRL_ST)) {  		l |= OMAP_TIMER_CTRL_ST;  		omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);  	} + +	/* Save the context */ +	timer->context.tclr = l; +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_start); -void omap_dm_timer_stop(struct omap_dm_timer *timer) +int omap_dm_timer_stop(struct omap_dm_timer *timer)  { -	u32 l; - -	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); -	if (l & OMAP_TIMER_CTRL_ST) { -		l &= ~0x1; -		omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); -#ifdef CONFIG_ARCH_OMAP2PLUS -		/* Readback to make sure write has completed */ -		omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); -		 /* -		  * Wait for functional clock period x 3.5 to make sure that -		  * timer is stopped -		  */ -		udelay(3500000 / clk_get_rate(timer->fclk) + 1); -#endif -	} -	/* Ack possibly pending interrupt */ -	omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, -			OMAP_TIMER_INT_OVERFLOW); -} -EXPORT_SYMBOL_GPL(omap_dm_timer_stop); +	unsigned long rate = 0; -#ifdef CONFIG_ARCH_OMAP1 +	if (unlikely(!timer)) +		return -EINVAL; -int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) -{ -	int n = (timer - dm_timers) << 1; -	u32 l; +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) +		rate = clk_get_rate(timer->fclk); -	l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); -	l |= source << n; -	omap_writel(l, MOD_CONF_CTRL_1); +	__omap_dm_timer_stop(timer, timer->posted, rate); +	/* +	 * Since the register values are computed and written within +	 * __omap_dm_timer_stop, we need to use read to retrieve the +	 * context. +	 */ +	timer->context.tclr = +			omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); +	omap_dm_timer_disable(timer);  	return 0;  } -EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); - -#else +EXPORT_SYMBOL_GPL(omap_dm_timer_stop);  int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)  { -	int ret = -EINVAL; +	int ret; +	char *parent_name = NULL; +	struct clk *parent; +	struct dmtimer_platform_data *pdata; -	if (source < 0 || source >= 3) +	if (unlikely(!timer))  		return -EINVAL; -	clk_disable(timer->fclk); -	ret = clk_set_parent(timer->fclk, dm_source_clocks[source]); -	clk_enable(timer->fclk); +	pdata = timer->pdev->dev.platform_data; + +	if (source < 0 || source >= 3) +		return -EINVAL;  	/* -	 * When the functional clock disappears, too quick writes seem -	 * to cause an abort. XXX Is this still necessary? +	 * FIXME: Used for OMAP1 devices only because they do not currently +	 * use the clock framework to set the parent clock. To be removed +	 * once OMAP1 migrated to using clock framework for dmtimers  	 */ -	__delay(300000); +	if (pdata && pdata->set_timer_src) +		return pdata->set_timer_src(timer->pdev, source); + +	if (IS_ERR(timer->fclk)) +		return -EINVAL; + +	switch (source) { +	case OMAP_TIMER_SRC_SYS_CLK: +		parent_name = "timer_sys_ck"; +		break; + +	case OMAP_TIMER_SRC_32_KHZ: +		parent_name = "timer_32k_ck"; +		break; + +	case OMAP_TIMER_SRC_EXT_CLK: +		parent_name = "timer_ext_ck"; +		break; +	} + +	parent = clk_get(&timer->pdev->dev, parent_name); +	if (IS_ERR(parent)) { +		pr_err("%s: %s not found\n", __func__, parent_name); +		return -EINVAL; +	} + +	ret = clk_set_parent(timer->fclk, parent); +	if (ret < 0) +		pr_err("%s: failed to set %s as parent\n", __func__, +			parent_name); + +	clk_put(parent);  	return ret;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); -#endif - -void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, +int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,  			    unsigned int load)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer);  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	if (autoreload)  		l |= OMAP_TIMER_CTRL_AR; @@ -603,15 +553,25 @@ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,  	omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);  	omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); +	/* Save the context */ +	timer->context.tclr = l; +	timer->context.tldr = load; +	omap_dm_timer_disable(timer); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_load);  /* Optimized set_load which removes costly spin wait in timer_start */ -void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, +int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,                              unsigned int load)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer); +  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	if (autoreload) {  		l |= OMAP_TIMER_CTRL_AR; @@ -621,31 +581,50 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,  	}  	l |= OMAP_TIMER_CTRL_ST; -	omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, load); -	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); +	__omap_dm_timer_load_start(timer, l, load, timer->posted); + +	/* Save the context */ +	timer->context.tclr = l; +	timer->context.tldr = load; +	timer->context.tcrr = load; +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start); -void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, +int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,  			     unsigned int match)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer);  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	if (enable)  		l |= OMAP_TIMER_CTRL_CE;  	else  		l &= ~OMAP_TIMER_CTRL_CE; -	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);  	omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); +	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); + +	/* Save the context */ +	timer->context.tclr = l; +	timer->context.tmar = match; +	omap_dm_timer_disable(timer); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_match); -void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, +int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,  			   int toggle, int trigger)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer);  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |  	       OMAP_TIMER_CTRL_PT | (0x03 << 10)); @@ -655,13 +634,22 @@ void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,  		l |= OMAP_TIMER_CTRL_PT;  	l |= trigger << 10;  	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); + +	/* Save the context */ +	timer->context.tclr = l; +	omap_dm_timer_disable(timer); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_pwm); -void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) +int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler)  {  	u32 l; +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer);  	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);  	l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2));  	if (prescaler >= 0x00 && prescaler <= 0x07) { @@ -669,59 +657,120 @@ void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler)  		l |= prescaler << 2;  	}  	omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); + +	/* Save the context */ +	timer->context.tclr = l; +	omap_dm_timer_disable(timer); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler); -void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, +int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,  				  unsigned int value)  { -	omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value); -	omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, value); +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer); +	__omap_dm_timer_int_enable(timer, value); + +	/* Save the context */ +	timer->context.tier = value; +	timer->context.twer = value; +	omap_dm_timer_disable(timer); +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); +/** + * omap_dm_timer_set_int_disable - disable timer interrupts + * @timer:	pointer to timer handle + * @mask:	bit mask of interrupts to be disabled + * + * Disables the specified timer interrupts for a timer. + */ +int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) +{ +	u32 l = mask; + +	if (unlikely(!timer)) +		return -EINVAL; + +	omap_dm_timer_enable(timer); + +	if (timer->revision == 1) +		l = readl_relaxed(timer->irq_ena) & ~mask; + +	writel_relaxed(l, timer->irq_dis); +	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; +	omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); + +	/* Save the context */ +	timer->context.tier &= ~mask; +	timer->context.twer &= ~mask; +	omap_dm_timer_disable(timer); +	return 0; +} +EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_disable); +  unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)  {  	unsigned int l; -	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_STAT_REG); +	if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { +		pr_err("%s: timer not available or enabled.\n", __func__); +		return 0; +	} + +	l = readl_relaxed(timer->irq_stat);  	return l;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_read_status); -void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) +int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value)  { -	omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, value); +	if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) +		return -EINVAL; + +	__omap_dm_timer_write_status(timer, value); + +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_write_status);  unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)  { -	unsigned int l; - -	l = omap_dm_timer_read_reg(timer, OMAP_TIMER_COUNTER_REG); +	if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { +		pr_err("%s: timer not iavailable or enabled.\n", __func__); +		return 0; +	} -	return l; +	return __omap_dm_timer_read_counter(timer, timer->posted);  }  EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter); -void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) +int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value)  { +	if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { +		pr_err("%s: timer not available or enabled.\n", __func__); +		return -EINVAL; +	} +  	omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); + +	/* Save the context */ +	timer->context.tcrr = value; +	return 0;  }  EXPORT_SYMBOL_GPL(omap_dm_timer_write_counter);  int omap_dm_timers_active(void)  { -	int i; - -	for (i = 0; i < dm_timer_count; i++) { -		struct omap_dm_timer *timer; - -		timer = &dm_timers[i]; +	struct omap_dm_timer *timer; -		if (!timer->enabled) +	list_for_each_entry(timer, &omap_timer_list, node) { +		if (!timer->reserved)  			continue;  		if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & @@ -733,61 +782,171 @@ int omap_dm_timers_active(void)  }  EXPORT_SYMBOL_GPL(omap_dm_timers_active); -int __init omap_dm_timer_init(void) +static const struct of_device_id omap_timer_match[]; + +/** + * omap_dm_timer_probe - probe function called for every registered device + * @pdev:	pointer to current timer platform device + * + * Called by driver framework at the end of device registration for all + * timer devices. + */ +static int omap_dm_timer_probe(struct platform_device *pdev)  { +	unsigned long flags;  	struct omap_dm_timer *timer; -	int i, map_size = SZ_8K;	/* Module 4KB + L4 4KB except on omap1 */ +	struct resource *mem, *irq; +	struct device *dev = &pdev->dev; +	const struct of_device_id *match; +	const struct dmtimer_platform_data *pdata; + +	match = of_match_device(of_match_ptr(omap_timer_match), dev); +	pdata = match ? match->data : dev->platform_data; + +	if (!pdata && !dev->of_node) { +		dev_err(dev, "%s: no platform data.\n", __func__); +		return -ENODEV; +	} -	if (!(cpu_is_omap16xx() || cpu_class_is_omap2())) +	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); +	if (unlikely(!irq)) { +		dev_err(dev, "%s: no IRQ resource.\n", __func__);  		return -ENODEV; +	} -	spin_lock_init(&dm_timer_lock); - -	if (cpu_class_is_omap1()) { -		dm_timers = omap1_dm_timers; -		dm_timer_count = omap1_dm_timer_count; -		map_size = SZ_2K; -	} else if (cpu_is_omap24xx()) { -		dm_timers = omap2_dm_timers; -		dm_timer_count = omap2_dm_timer_count; -		dm_source_names = omap2_dm_source_names; -		dm_source_clocks = omap2_dm_source_clocks; -	} else if (cpu_is_omap34xx()) { -		dm_timers = omap3_dm_timers; -		dm_timer_count = omap3_dm_timer_count; -		dm_source_names = omap3_dm_source_names; -		dm_source_clocks = omap3_dm_source_clocks; -	} else if (cpu_is_omap44xx()) { -		dm_timers = omap4_dm_timers; -		dm_timer_count = omap4_dm_timer_count; -		dm_source_names = omap4_dm_source_names; -		dm_source_clocks = omap4_dm_source_clocks; +	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (unlikely(!mem)) { +		dev_err(dev, "%s: no memory resource.\n", __func__); +		return -ENODEV;  	} -	if (cpu_class_is_omap2()) -		for (i = 0; dm_source_names[i] != NULL; i++) -			dm_source_clocks[i] = clk_get(NULL, dm_source_names[i]); +	timer = devm_kzalloc(dev, sizeof(struct omap_dm_timer), GFP_KERNEL); +	if (!timer) { +		dev_err(dev, "%s: memory alloc failed!\n", __func__); +		return  -ENOMEM; +	} -	if (cpu_is_omap243x()) -		dm_timers[0].phys_base = 0x49018000; +	timer->fclk = ERR_PTR(-ENODEV); +	timer->io_base = devm_ioremap_resource(dev, mem); +	if (IS_ERR(timer->io_base)) +		return PTR_ERR(timer->io_base); + +	if (dev->of_node) { +		if (of_find_property(dev->of_node, "ti,timer-alwon", NULL)) +			timer->capability |= OMAP_TIMER_ALWON; +		if (of_find_property(dev->of_node, "ti,timer-dsp", NULL)) +			timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; +		if (of_find_property(dev->of_node, "ti,timer-pwm", NULL)) +			timer->capability |= OMAP_TIMER_HAS_PWM; +		if (of_find_property(dev->of_node, "ti,timer-secure", NULL)) +			timer->capability |= OMAP_TIMER_SECURE; +	} else { +		timer->id = pdev->id; +		timer->capability = pdata->timer_capability; +		timer->reserved = omap_dm_timer_reserved_systimer(timer->id); +		timer->get_context_loss_count = pdata->get_context_loss_count; +	} -	for (i = 0; i < dm_timer_count; i++) { -		timer = &dm_timers[i]; +	if (pdata) +		timer->errata = pdata->timer_errata; -		/* Static mapping, never released */ -		timer->io_base = ioremap(timer->phys_base, map_size); -		BUG_ON(!timer->io_base); +	timer->irq = irq->start; +	timer->pdev = pdev; -#ifdef CONFIG_ARCH_OMAP2PLUS -		if (cpu_class_is_omap2()) { -			char clk_name[16]; -			sprintf(clk_name, "gpt%d_ick", i + 1); -			timer->iclk = clk_get(NULL, clk_name); -			sprintf(clk_name, "gpt%d_fck", i + 1); -			timer->fclk = clk_get(NULL, clk_name); -		} -#endif +	/* Skip pm_runtime_enable for OMAP1 */ +	if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { +		pm_runtime_enable(dev); +		pm_runtime_irq_safe(dev); +	} + +	if (!timer->reserved) { +		pm_runtime_get_sync(dev); +		__omap_dm_timer_init_regs(timer); +		pm_runtime_put(dev);  	} +	/* add the timer element to the list */ +	spin_lock_irqsave(&dm_timer_lock, flags); +	list_add_tail(&timer->node, &omap_timer_list); +	spin_unlock_irqrestore(&dm_timer_lock, flags); + +	dev_dbg(dev, "Device Probed.\n"); +  	return 0;  } + +/** + * omap_dm_timer_remove - cleanup a registered timer device + * @pdev:	pointer to current timer platform device + * + * Called by driver framework whenever a timer device is unregistered. + * In addition to freeing platform resources it also deletes the timer + * entry from the local list. + */ +static int omap_dm_timer_remove(struct platform_device *pdev) +{ +	struct omap_dm_timer *timer; +	unsigned long flags; +	int ret = -EINVAL; + +	spin_lock_irqsave(&dm_timer_lock, flags); +	list_for_each_entry(timer, &omap_timer_list, node) +		if (!strcmp(dev_name(&timer->pdev->dev), +			    dev_name(&pdev->dev))) { +			list_del(&timer->node); +			ret = 0; +			break; +		} +	spin_unlock_irqrestore(&dm_timer_lock, flags); + +	return ret; +} + +static const struct dmtimer_platform_data omap3plus_pdata = { +	.timer_errata = OMAP_TIMER_ERRATA_I103_I767, +}; + +static const struct of_device_id omap_timer_match[] = { +	{ +		.compatible = "ti,omap2420-timer", +	}, +	{ +		.compatible = "ti,omap3430-timer", +		.data = &omap3plus_pdata, +	}, +	{ +		.compatible = "ti,omap4430-timer", +		.data = &omap3plus_pdata, +	}, +	{ +		.compatible = "ti,omap5430-timer", +		.data = &omap3plus_pdata, +	}, +	{ +		.compatible = "ti,am335x-timer", +		.data = &omap3plus_pdata, +	}, +	{ +		.compatible = "ti,am335x-timer-1ms", +		.data = &omap3plus_pdata, +	}, +	{}, +}; +MODULE_DEVICE_TABLE(of, omap_timer_match); + +static struct platform_driver omap_dm_timer_driver = { +	.probe  = omap_dm_timer_probe, +	.remove = omap_dm_timer_remove, +	.driver = { +		.name   = "omap_timer", +		.of_match_table = of_match_ptr(omap_timer_match), +	}, +}; + +early_platform_init("earlytimer", &omap_dm_timer_driver); +module_platform_driver(omap_dm_timer_driver); + +MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRIVER_NAME); +MODULE_AUTHOR("Texas Instruments Inc"); diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c deleted file mode 100644 index c9e5d7298c4..00000000000 --- a/arch/arm/plat-omap/fb.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * File: arch/arm/plat-omap/fb.c - * - * Framebuffer device registration for TI OMAP platforms - * - * Copyright (C) 2006 Nokia Corporation - * Author: Imre Deak <imre.deak@nokia.com> - * - * 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. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/memblock.h> -#include <linux/io.h> -#include <linux/omapfb.h> - -#include <mach/hardware.h> -#include <asm/mach/map.h> - -#include <plat/board.h> -#include <plat/sram.h> - -#include "fb.h" - -#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) - -static struct omapfb_platform_data omapfb_config; -static int config_invalid; -static int configured_regions; - -static u64 omap_fb_dma_mask = ~(u32)0; - -static struct platform_device omap_fb_device = { -	.name		= "omapfb", -	.id		= -1, -	.dev = { -		.dma_mask		= &omap_fb_dma_mask, -		.coherent_dma_mask	= ~(u32)0, -		.platform_data		= &omapfb_config, -	}, -	.num_resources = 0, -}; - -void omapfb_set_platform_data(struct omapfb_platform_data *data) -{ -} - -static inline int ranges_overlap(unsigned long start1, unsigned long size1, -				 unsigned long start2, unsigned long size2) -{ -	return (start1 >= start2 && start1 < start2 + size2) || -	       (start2 >= start1 && start2 < start1 + size1); -} - -static inline int range_included(unsigned long start1, unsigned long size1, -				 unsigned long start2, unsigned long size2) -{ -	return start1 >= start2 && start1 + size1 <= start2 + size2; -} - - -/* Check if there is an overlapping region. */ -static int fbmem_region_reserved(unsigned long start, size_t size) -{ -	struct omapfb_mem_region *rg; -	int i; - -	rg = &omapfb_config.mem_desc.region[0]; -	for (i = 0; i < OMAPFB_PLANE_NUM; i++, rg++) { -		if (!rg->paddr) -			/* Empty slot. */ -			continue; -		if (ranges_overlap(start, size, rg->paddr, rg->size)) -			return 1; -	} -	return 0; -} - -/* - * Get the region_idx`th region from board config/ATAG and convert it to - * our internal format. - */ -static int __init get_fbmem_region(int region_idx, struct omapfb_mem_region *rg) -{ -	const struct omap_fbmem_config	*conf; -	u32				paddr; - -	conf = omap_get_nr_config(OMAP_TAG_FBMEM, -				  struct omap_fbmem_config, region_idx); -	if (conf == NULL) -		return -ENOENT; - -	paddr = conf->start; -	/* -	 * Low bits encode the page allocation mode, if high bits -	 * are zero. Otherwise we need a page aligned fixed -	 * address. -	 */ -	memset(rg, 0, sizeof(*rg)); -	rg->type = paddr & ~PAGE_MASK; -	rg->paddr = paddr & PAGE_MASK; -	rg->size = PAGE_ALIGN(conf->size); -	return 0; -} - -static int set_fbmem_region_type(struct omapfb_mem_region *rg, int mem_type, -				  unsigned long mem_start, -				  unsigned long mem_size) -{ -	/* -	 * Check if the configuration specifies the type explicitly. -	 * type = 0 && paddr = 0, a default don't care case maps to -	 * the SDRAM type. -	 */ -	if (rg->type || !rg->paddr) -		return 0; -	if (ranges_overlap(rg->paddr, rg->size, mem_start, mem_size)) { -		rg->type = mem_type; -		return 0; -	} -	/* Can't determine it. */ -	return -1; -} - -static int check_fbmem_region(int region_idx, struct omapfb_mem_region *rg, -			      unsigned long start_avail, unsigned size_avail) -{ -	unsigned long	paddr = rg->paddr; -	size_t		size = rg->size; - -	if (rg->type > OMAPFB_MEMTYPE_MAX) { -		printk(KERN_ERR -			"Invalid start address for FB region %d\n", region_idx); -		return -EINVAL; -	} - -	if (!rg->size) { -		printk(KERN_ERR "Zero size for FB region %d\n", region_idx); -		return -EINVAL; -	} - -	if (!paddr) -		/* Allocate this dynamically, leave paddr 0 for now. */ -		return 0; - -	/* -	 * Fixed region for the given RAM range. Check if it's already -	 * reserved by the FB code or someone else. -	 */ -	if (fbmem_region_reserved(paddr, size) || -	    !range_included(paddr, size, start_avail, size_avail)) { -		printk(KERN_ERR "Trying to use reserved memory " -			"for FB region %d\n", region_idx); -		return -EINVAL; -	} - -	return 0; -} - -static int valid_sdram(unsigned long addr, unsigned long size) -{ -	return memblock_is_region_memory(addr, size); -} - -static int reserve_sdram(unsigned long addr, unsigned long size) -{ -	if (memblock_is_region_reserved(addr, size)) -		return -EBUSY; -	if (memblock_reserve(addr, size)) -		return -ENOMEM; -	return 0; -} - -/* - * Called from map_io. We need to call to this early enough so that we - * can reserve the fixed SDRAM regions before VM could get hold of them. - */ -void __init omapfb_reserve_sdram_memblock(void) -{ -	unsigned long reserved = 0; -	int i; - -	if (config_invalid) -		return; - -	for (i = 0; ; i++) { -		struct omapfb_mem_region rg; - -		if (get_fbmem_region(i, &rg) < 0) -			break; - -		if (i == OMAPFB_PLANE_NUM) { -			pr_err("Extraneous FB mem configuration entries\n"); -			config_invalid = 1; -			return; -		} - -		/* Check if it's our memory type. */ -		if (rg.type != OMAPFB_MEMTYPE_SDRAM) -			continue; - -		/* Check if the region falls within SDRAM */ -		if (rg.paddr && !valid_sdram(rg.paddr, rg.size)) -			continue; - -		if (rg.size == 0) { -			pr_err("Zero size for FB region %d\n", i); -			config_invalid = 1; -			return; -		} - -		if (rg.paddr) { -			if (reserve_sdram(rg.paddr, rg.size)) { -				pr_err("Trying to use reserved memory for FB region %d\n", -					i); -				config_invalid = 1; -				return; -			} -			reserved += rg.size; -		} - -		if (omapfb_config.mem_desc.region[i].size) { -			pr_err("FB region %d already set\n", i); -			config_invalid = 1; -			return; -		} - -		omapfb_config.mem_desc.region[i] = rg; -		configured_regions++; -	} -	omapfb_config.mem_desc.region_cnt = i; -	if (reserved) -		pr_info("Reserving %lu bytes SDRAM for frame buffer\n", -			 reserved); -} - -/* - * Called at sram init time, before anything is pushed to the SRAM stack. - * Because of the stack scheme, we will allocate everything from the - * start of the lowest address region to the end of SRAM. This will also - * include padding for page alignment and possible holes between regions. - * - * As opposed to the SDRAM case, we'll also do any dynamic allocations at - * this point, since the driver built as a module would have problem with - * freeing / reallocating the regions. - */ -unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, -				  unsigned long sram_vstart, -				  unsigned long sram_size, -				  unsigned long pstart_avail, -				  unsigned long size_avail) -{ -	struct omapfb_mem_region	rg; -	unsigned long			pend_avail; -	unsigned long			reserved; -	int				i; - -	if (config_invalid) -		return 0; - -	reserved = 0; -	pend_avail = pstart_avail + size_avail; -	for (i = 0; ; i++) { -		if (get_fbmem_region(i, &rg) < 0) -			break; -		if (i == OMAPFB_PLANE_NUM) { -			printk(KERN_ERR -				"Extraneous FB mem configuration entries\n"); -			config_invalid = 1; -			return 0; -		} - -		/* Check if it's our memory type. */ -		if (set_fbmem_region_type(&rg, OMAPFB_MEMTYPE_SRAM, -				          sram_pstart, sram_size) < 0 || -		    (rg.type != OMAPFB_MEMTYPE_SRAM)) -			continue; -		BUG_ON(omapfb_config.mem_desc.region[i].size); - -		if (check_fbmem_region(i, &rg, pstart_avail, size_avail) < 0) { -			config_invalid = 1; -			return 0; -		} - -		if (!rg.paddr) { -			/* Dynamic allocation */ -			if ((size_avail & PAGE_MASK) < rg.size) { -				printk("Not enough SRAM for FB region %d\n", -					i); -				config_invalid = 1; -				return 0; -			} -			size_avail = (size_avail - rg.size) & PAGE_MASK; -			rg.paddr = pstart_avail + size_avail; -		} -		/* Reserve everything above the start of the region. */ -		if (pend_avail - rg.paddr > reserved) -			reserved = pend_avail - rg.paddr; -		size_avail = pend_avail - reserved - pstart_avail; - -		/* -		 * We have a kernel mapping for this already, so the -		 * driver won't have to make one. -		 */ -		rg.vaddr = (void *)(sram_vstart + rg.paddr - sram_pstart); -		omapfb_config.mem_desc.region[i] = rg; -		configured_regions++; -	} -	omapfb_config.mem_desc.region_cnt = i; -	if (reserved) -		pr_info("Reserving %lu bytes SRAM for frame buffer\n", -			 reserved); -	return reserved; -} - -void omapfb_set_ctrl_platform_data(void *data) -{ -	omapfb_config.ctrl_platform_data = data; -} - -static int __init omap_init_fb(void) -{ -	const struct omap_lcd_config *conf; - -	if (config_invalid) -		return 0; -	if (configured_regions != omapfb_config.mem_desc.region_cnt) { -		printk(KERN_ERR "Invalid FB mem configuration entries\n"); -		return 0; -	} -	conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); -	if (conf == NULL) { -		if (configured_regions) -			/* FB mem config, but no LCD config? */ -			printk(KERN_ERR "Missing LCD configuration\n"); -		return 0; -	} -	omapfb_config.lcd = *conf; - -	return platform_device_register(&omap_fb_device); -} - -arch_initcall(omap_init_fb); - -#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) - -static u64 omap_fb_dma_mask = ~(u32)0; -static struct omapfb_platform_data omapfb_config; - -static struct platform_device omap_fb_device = { -	.name		= "omapfb", -	.id		= -1, -	.dev = { -		.dma_mask		= &omap_fb_dma_mask, -		.coherent_dma_mask	= ~(u32)0, -		.platform_data		= &omapfb_config, -	}, -	.num_resources = 0, -}; - -void omapfb_set_platform_data(struct omapfb_platform_data *data) -{ -	omapfb_config = *data; -} - -static int __init omap_init_fb(void) -{ -	return platform_device_register(&omap_fb_device); -} - -arch_initcall(omap_init_fb); - -void omapfb_reserve_sdram_memblock(void) -{ -} - -unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, -				  unsigned long sram_vstart, -				  unsigned long sram_size, -				  unsigned long start_avail, -				  unsigned long size_avail) -{ -	return 0; -} - -#else - -void omapfb_set_platform_data(struct omapfb_platform_data *data) -{ -} - -void omapfb_reserve_sdram_memblock(void) -{ -} - -unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, -				  unsigned long sram_vstart, -				  unsigned long sram_size, -				  unsigned long start_avail, -				  unsigned long size_avail) -{ -	return 0; -} - -#endif diff --git a/arch/arm/plat-omap/fb.h b/arch/arm/plat-omap/fb.h deleted file mode 100644 index d765d0bd852..00000000000 --- a/arch/arm/plat-omap/fb.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef __PLAT_OMAP_FB_H__ -#define __PLAT_OMAP_FB_H__ - -extern unsigned long omapfb_reserve_sram(unsigned long sram_pstart, -					 unsigned long sram_vstart, -					 unsigned long sram_size, -					 unsigned long pstart_avail, -					 unsigned long size_avail); - -#endif /* __PLAT_OMAP_FB_H__ */ diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c deleted file mode 100644 index c05c653d167..00000000000 --- a/arch/arm/plat-omap/gpio.c +++ /dev/null @@ -1,2346 +0,0 @@ -/* - *  linux/arch/arm/plat-omap/gpio.c - * - * Support functions for OMAP GPIO - * - * Copyright (C) 2003-2005 Nokia Corporation - * Written by Juha Yrjölä <juha.yrjola@nokia.com> - * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - 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/init.h> -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/sysdev.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> - -#include <mach/hardware.h> -#include <asm/irq.h> -#include <mach/irqs.h> -#include <mach/gpio.h> -#include <asm/mach/irq.h> -#include <plat/powerdomain.h> - -/* - * OMAP1510 GPIO registers - */ -#define OMAP1510_GPIO_BASE		0xfffce000 -#define OMAP1510_GPIO_DATA_INPUT	0x00 -#define OMAP1510_GPIO_DATA_OUTPUT	0x04 -#define OMAP1510_GPIO_DIR_CONTROL	0x08 -#define OMAP1510_GPIO_INT_CONTROL	0x0c -#define OMAP1510_GPIO_INT_MASK		0x10 -#define OMAP1510_GPIO_INT_STATUS	0x14 -#define OMAP1510_GPIO_PIN_CONTROL	0x18 - -#define OMAP1510_IH_GPIO_BASE		64 - -/* - * OMAP1610 specific GPIO registers - */ -#define OMAP1610_GPIO1_BASE		0xfffbe400 -#define OMAP1610_GPIO2_BASE		0xfffbec00 -#define OMAP1610_GPIO3_BASE		0xfffbb400 -#define OMAP1610_GPIO4_BASE		0xfffbbc00 -#define OMAP1610_GPIO_REVISION		0x0000 -#define OMAP1610_GPIO_SYSCONFIG		0x0010 -#define OMAP1610_GPIO_SYSSTATUS		0x0014 -#define OMAP1610_GPIO_IRQSTATUS1	0x0018 -#define OMAP1610_GPIO_IRQENABLE1	0x001c -#define OMAP1610_GPIO_WAKEUPENABLE	0x0028 -#define OMAP1610_GPIO_DATAIN		0x002c -#define OMAP1610_GPIO_DATAOUT		0x0030 -#define OMAP1610_GPIO_DIRECTION		0x0034 -#define OMAP1610_GPIO_EDGE_CTRL1	0x0038 -#define OMAP1610_GPIO_EDGE_CTRL2	0x003c -#define OMAP1610_GPIO_CLEAR_IRQENABLE1	0x009c -#define OMAP1610_GPIO_CLEAR_WAKEUPENA	0x00a8 -#define OMAP1610_GPIO_CLEAR_DATAOUT	0x00b0 -#define OMAP1610_GPIO_SET_IRQENABLE1	0x00dc -#define OMAP1610_GPIO_SET_WAKEUPENA	0x00e8 -#define OMAP1610_GPIO_SET_DATAOUT	0x00f0 - -/* - * OMAP7XX specific GPIO registers - */ -#define OMAP7XX_GPIO1_BASE		0xfffbc000 -#define OMAP7XX_GPIO2_BASE		0xfffbc800 -#define OMAP7XX_GPIO3_BASE		0xfffbd000 -#define OMAP7XX_GPIO4_BASE		0xfffbd800 -#define OMAP7XX_GPIO5_BASE		0xfffbe000 -#define OMAP7XX_GPIO6_BASE		0xfffbe800 -#define OMAP7XX_GPIO_DATA_INPUT		0x00 -#define OMAP7XX_GPIO_DATA_OUTPUT	0x04 -#define OMAP7XX_GPIO_DIR_CONTROL	0x08 -#define OMAP7XX_GPIO_INT_CONTROL	0x0c -#define OMAP7XX_GPIO_INT_MASK		0x10 -#define OMAP7XX_GPIO_INT_STATUS		0x14 - -#define OMAP1_MPUIO_VBASE		OMAP1_MPUIO_BASE - -/* - * omap24xx specific GPIO registers - */ -#define OMAP242X_GPIO1_BASE		0x48018000 -#define OMAP242X_GPIO2_BASE		0x4801a000 -#define OMAP242X_GPIO3_BASE		0x4801c000 -#define OMAP242X_GPIO4_BASE		0x4801e000 - -#define OMAP243X_GPIO1_BASE		0x4900C000 -#define OMAP243X_GPIO2_BASE		0x4900E000 -#define OMAP243X_GPIO3_BASE		0x49010000 -#define OMAP243X_GPIO4_BASE		0x49012000 -#define OMAP243X_GPIO5_BASE		0x480B6000 - -#define OMAP24XX_GPIO_REVISION		0x0000 -#define OMAP24XX_GPIO_SYSCONFIG		0x0010 -#define OMAP24XX_GPIO_SYSSTATUS		0x0014 -#define OMAP24XX_GPIO_IRQSTATUS1	0x0018 -#define OMAP24XX_GPIO_IRQSTATUS2	0x0028 -#define OMAP24XX_GPIO_IRQENABLE2	0x002c -#define OMAP24XX_GPIO_IRQENABLE1	0x001c -#define OMAP24XX_GPIO_WAKE_EN		0x0020 -#define OMAP24XX_GPIO_CTRL		0x0030 -#define OMAP24XX_GPIO_OE		0x0034 -#define OMAP24XX_GPIO_DATAIN		0x0038 -#define OMAP24XX_GPIO_DATAOUT		0x003c -#define OMAP24XX_GPIO_LEVELDETECT0	0x0040 -#define OMAP24XX_GPIO_LEVELDETECT1	0x0044 -#define OMAP24XX_GPIO_RISINGDETECT	0x0048 -#define OMAP24XX_GPIO_FALLINGDETECT	0x004c -#define OMAP24XX_GPIO_DEBOUNCE_EN	0x0050 -#define OMAP24XX_GPIO_DEBOUNCE_VAL	0x0054 -#define OMAP24XX_GPIO_CLEARIRQENABLE1	0x0060 -#define OMAP24XX_GPIO_SETIRQENABLE1	0x0064 -#define OMAP24XX_GPIO_CLEARWKUENA	0x0080 -#define OMAP24XX_GPIO_SETWKUENA		0x0084 -#define OMAP24XX_GPIO_CLEARDATAOUT	0x0090 -#define OMAP24XX_GPIO_SETDATAOUT	0x0094 - -#define OMAP4_GPIO_REVISION		0x0000 -#define OMAP4_GPIO_SYSCONFIG		0x0010 -#define OMAP4_GPIO_EOI			0x0020 -#define OMAP4_GPIO_IRQSTATUSRAW0	0x0024 -#define OMAP4_GPIO_IRQSTATUSRAW1	0x0028 -#define OMAP4_GPIO_IRQSTATUS0		0x002c -#define OMAP4_GPIO_IRQSTATUS1		0x0030 -#define OMAP4_GPIO_IRQSTATUSSET0	0x0034 -#define OMAP4_GPIO_IRQSTATUSSET1	0x0038 -#define OMAP4_GPIO_IRQSTATUSCLR0	0x003c -#define OMAP4_GPIO_IRQSTATUSCLR1	0x0040 -#define OMAP4_GPIO_IRQWAKEN0		0x0044 -#define OMAP4_GPIO_IRQWAKEN1		0x0048 -#define OMAP4_GPIO_SYSSTATUS		0x0114 -#define OMAP4_GPIO_IRQENABLE1		0x011c -#define OMAP4_GPIO_WAKE_EN		0x0120 -#define OMAP4_GPIO_IRQSTATUS2		0x0128 -#define OMAP4_GPIO_IRQENABLE2		0x012c -#define OMAP4_GPIO_CTRL			0x0130 -#define OMAP4_GPIO_OE			0x0134 -#define OMAP4_GPIO_DATAIN		0x0138 -#define OMAP4_GPIO_DATAOUT		0x013c -#define OMAP4_GPIO_LEVELDETECT0		0x0140 -#define OMAP4_GPIO_LEVELDETECT1		0x0144 -#define OMAP4_GPIO_RISINGDETECT		0x0148 -#define OMAP4_GPIO_FALLINGDETECT	0x014c -#define OMAP4_GPIO_DEBOUNCENABLE	0x0150 -#define OMAP4_GPIO_DEBOUNCINGTIME	0x0154 -#define OMAP4_GPIO_CLEARIRQENABLE1	0x0160 -#define OMAP4_GPIO_SETIRQENABLE1	0x0164 -#define OMAP4_GPIO_CLEARWKUENA		0x0180 -#define OMAP4_GPIO_SETWKUENA		0x0184 -#define OMAP4_GPIO_CLEARDATAOUT		0x0190 -#define OMAP4_GPIO_SETDATAOUT		0x0194 -/* - * omap34xx specific GPIO registers - */ - -#define OMAP34XX_GPIO1_BASE		0x48310000 -#define OMAP34XX_GPIO2_BASE		0x49050000 -#define OMAP34XX_GPIO3_BASE		0x49052000 -#define OMAP34XX_GPIO4_BASE		0x49054000 -#define OMAP34XX_GPIO5_BASE		0x49056000 -#define OMAP34XX_GPIO6_BASE		0x49058000 - -/* - * OMAP44XX  specific GPIO registers - */ -#define OMAP44XX_GPIO1_BASE             0x4a310000 -#define OMAP44XX_GPIO2_BASE             0x48055000 -#define OMAP44XX_GPIO3_BASE             0x48057000 -#define OMAP44XX_GPIO4_BASE             0x48059000 -#define OMAP44XX_GPIO5_BASE             0x4805B000 -#define OMAP44XX_GPIO6_BASE             0x4805D000 - -struct gpio_bank { -	unsigned long pbase; -	void __iomem *base; -	u16 irq; -	u16 virtual_irq_start; -	int method; -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) -	u32 suspend_wakeup; -	u32 saved_wakeup; -#endif -#ifdef CONFIG_ARCH_OMAP2PLUS -	u32 non_wakeup_gpios; -	u32 enabled_non_wakeup_gpios; - -	u32 saved_datain; -	u32 saved_fallingdetect; -	u32 saved_risingdetect; -#endif -	u32 level_mask; -	u32 toggle_mask; -	spinlock_t lock; -	struct gpio_chip chip; -	struct clk *dbck; -	u32 mod_usage; -	u32 dbck_enable_mask; -}; - -#define METHOD_MPUIO		0 -#define METHOD_GPIO_1510	1 -#define METHOD_GPIO_1610	2 -#define METHOD_GPIO_7XX		3 -#define METHOD_GPIO_24XX	5 -#define METHOD_GPIO_44XX	6 - -#ifdef CONFIG_ARCH_OMAP16XX -static struct gpio_bank gpio_bank_1610[5] = { -	{ OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE, -		METHOD_MPUIO }, -	{ OMAP1610_GPIO1_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_1610 }, -	{ OMAP1610_GPIO2_BASE, NULL, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, -		METHOD_GPIO_1610 }, -	{ OMAP1610_GPIO3_BASE, NULL, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, -		METHOD_GPIO_1610 }, -	{ OMAP1610_GPIO4_BASE, NULL, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, -		METHOD_GPIO_1610 }, -}; -#endif - -#ifdef CONFIG_ARCH_OMAP15XX -static struct gpio_bank gpio_bank_1510[2] = { -	{ OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE, -		METHOD_MPUIO }, -	{ OMAP1510_GPIO_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_1510 } -}; -#endif - -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -static struct gpio_bank gpio_bank_7xx[7] = { -	{ OMAP1_MPUIO_VBASE, NULL, INT_7XX_MPUIO, IH_MPUIO_BASE, -		METHOD_MPUIO }, -	{ OMAP7XX_GPIO1_BASE, NULL, INT_7XX_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_7XX }, -	{ OMAP7XX_GPIO2_BASE, NULL, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32, -		METHOD_GPIO_7XX }, -	{ OMAP7XX_GPIO3_BASE, NULL, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64, -		METHOD_GPIO_7XX }, -	{ OMAP7XX_GPIO4_BASE, NULL, INT_7XX_GPIO_BANK4,  IH_GPIO_BASE + 96, -		METHOD_GPIO_7XX }, -	{ OMAP7XX_GPIO5_BASE, NULL, INT_7XX_GPIO_BANK5,  IH_GPIO_BASE + 128, -		METHOD_GPIO_7XX }, -	{ OMAP7XX_GPIO6_BASE, NULL, INT_7XX_GPIO_BANK6,  IH_GPIO_BASE + 160, -		METHOD_GPIO_7XX }, -}; -#endif - -#ifdef CONFIG_ARCH_OMAP2 - -static struct gpio_bank gpio_bank_242x[4] = { -	{ OMAP242X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_24XX }, -	{ OMAP242X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, -		METHOD_GPIO_24XX }, -	{ OMAP242X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, -		METHOD_GPIO_24XX }, -	{ OMAP242X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, -		METHOD_GPIO_24XX }, -}; - -static struct gpio_bank gpio_bank_243x[5] = { -	{ OMAP243X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_24XX }, -	{ OMAP243X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, -		METHOD_GPIO_24XX }, -	{ OMAP243X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, -		METHOD_GPIO_24XX }, -	{ OMAP243X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, -		METHOD_GPIO_24XX }, -	{ OMAP243X_GPIO5_BASE, NULL, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128, -		METHOD_GPIO_24XX }, -}; - -#endif - -#ifdef CONFIG_ARCH_OMAP3 -static struct gpio_bank gpio_bank_34xx[6] = { -	{ OMAP34XX_GPIO1_BASE, NULL, INT_34XX_GPIO_BANK1, IH_GPIO_BASE, -		METHOD_GPIO_24XX }, -	{ OMAP34XX_GPIO2_BASE, NULL, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32, -		METHOD_GPIO_24XX }, -	{ OMAP34XX_GPIO3_BASE, NULL, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64, -		METHOD_GPIO_24XX }, -	{ OMAP34XX_GPIO4_BASE, NULL, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96, -		METHOD_GPIO_24XX }, -	{ OMAP34XX_GPIO5_BASE, NULL, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128, -		METHOD_GPIO_24XX }, -	{ OMAP34XX_GPIO6_BASE, NULL, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160, -		METHOD_GPIO_24XX }, -}; - -struct omap3_gpio_regs { -	u32 sysconfig; -	u32 irqenable1; -	u32 irqenable2; -	u32 wake_en; -	u32 ctrl; -	u32 oe; -	u32 leveldetect0; -	u32 leveldetect1; -	u32 risingdetect; -	u32 fallingdetect; -	u32 dataout; -}; - -static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS]; -#endif - -#ifdef CONFIG_ARCH_OMAP4 -static struct gpio_bank gpio_bank_44xx[6] = { -	{ OMAP44XX_GPIO1_BASE, NULL, OMAP44XX_IRQ_GPIO1, IH_GPIO_BASE, -		METHOD_GPIO_44XX }, -	{ OMAP44XX_GPIO2_BASE, NULL, OMAP44XX_IRQ_GPIO2, IH_GPIO_BASE + 32, -		METHOD_GPIO_44XX }, -	{ OMAP44XX_GPIO3_BASE, NULL, OMAP44XX_IRQ_GPIO3, IH_GPIO_BASE + 64, -		METHOD_GPIO_44XX }, -	{ OMAP44XX_GPIO4_BASE, NULL, OMAP44XX_IRQ_GPIO4, IH_GPIO_BASE + 96, -		METHOD_GPIO_44XX }, -	{ OMAP44XX_GPIO5_BASE, NULL, OMAP44XX_IRQ_GPIO5, IH_GPIO_BASE + 128, -		METHOD_GPIO_44XX }, -	{ OMAP44XX_GPIO6_BASE, NULL, OMAP44XX_IRQ_GPIO6, IH_GPIO_BASE + 160, -		METHOD_GPIO_44XX }, -}; - -#endif - -static struct gpio_bank *gpio_bank; -static int gpio_bank_count; - -static inline struct gpio_bank *get_gpio_bank(int gpio) -{ -	if (cpu_is_omap15xx()) { -		if (OMAP_GPIO_IS_MPUIO(gpio)) -			return &gpio_bank[0]; -		return &gpio_bank[1]; -	} -	if (cpu_is_omap16xx()) { -		if (OMAP_GPIO_IS_MPUIO(gpio)) -			return &gpio_bank[0]; -		return &gpio_bank[1 + (gpio >> 4)]; -	} -	if (cpu_is_omap7xx()) { -		if (OMAP_GPIO_IS_MPUIO(gpio)) -			return &gpio_bank[0]; -		return &gpio_bank[1 + (gpio >> 5)]; -	} -	if (cpu_is_omap24xx()) -		return &gpio_bank[gpio >> 5]; -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) -		return &gpio_bank[gpio >> 5]; -	BUG(); -	return NULL; -} - -static inline int get_gpio_index(int gpio) -{ -	if (cpu_is_omap7xx()) -		return gpio & 0x1f; -	if (cpu_is_omap24xx()) -		return gpio & 0x1f; -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) -		return gpio & 0x1f; -	return gpio & 0x0f; -} - -static inline int gpio_valid(int gpio) -{ -	if (gpio < 0) -		return -1; -	if (cpu_class_is_omap1() && OMAP_GPIO_IS_MPUIO(gpio)) { -		if (gpio >= OMAP_MAX_GPIO_LINES + 16) -			return -1; -		return 0; -	} -	if (cpu_is_omap15xx() && gpio < 16) -		return 0; -	if ((cpu_is_omap16xx()) && gpio < 64) -		return 0; -	if (cpu_is_omap7xx() && gpio < 192) -		return 0; -	if (cpu_is_omap2420() && gpio < 128) -		return 0; -	if (cpu_is_omap2430() && gpio < 160) -		return 0; -	if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192) -		return 0; -	return -1; -} - -static int check_gpio(int gpio) -{ -	if (unlikely(gpio_valid(gpio) < 0)) { -		printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio); -		dump_stack(); -		return -1; -	} -	return 0; -} - -static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) -{ -	void __iomem *reg = bank->base; -	u32 l; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_IO_CNTL; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_DIR_CONTROL; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_DIRECTION; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_DIR_CONTROL; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_OE; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP4) -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_OE; -		break; -#endif -	default: -		WARN_ON(1); -		return; -	} -	l = __raw_readl(reg); -	if (is_input) -		l |= 1 << gpio; -	else -		l &= ~(1 << gpio); -	__raw_writel(l, reg); -} - -static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) -{ -	void __iomem *reg = bank->base; -	u32 l = 0; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_OUTPUT; -		l = __raw_readl(reg); -		if (enable) -			l |= 1 << gpio; -		else -			l &= ~(1 << gpio); -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_DATA_OUTPUT; -		l = __raw_readl(reg); -		if (enable) -			l |= 1 << gpio; -		else -			l &= ~(1 << gpio); -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		if (enable) -			reg += OMAP1610_GPIO_SET_DATAOUT; -		else -			reg += OMAP1610_GPIO_CLEAR_DATAOUT; -		l = 1 << gpio; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_DATA_OUTPUT; -		l = __raw_readl(reg); -		if (enable) -			l |= 1 << gpio; -		else -			l &= ~(1 << gpio); -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		if (enable) -			reg += OMAP24XX_GPIO_SETDATAOUT; -		else -			reg += OMAP24XX_GPIO_CLEARDATAOUT; -		l = 1 << gpio; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -	case METHOD_GPIO_44XX: -		if (enable) -			reg += OMAP4_GPIO_SETDATAOUT; -		else -			reg += OMAP4_GPIO_CLEARDATAOUT; -		l = 1 << gpio; -		break; -#endif -	default: -		WARN_ON(1); -		return; -	} -	__raw_writel(l, reg); -} - -static int _get_gpio_datain(struct gpio_bank *bank, int gpio) -{ -	void __iomem *reg; - -	if (check_gpio(gpio) < 0) -		return -EINVAL; -	reg = bank->base; -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_INPUT_LATCH; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_DATA_INPUT; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_DATAIN; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_DATA_INPUT; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_DATAIN; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_DATAIN; -		break; -#endif -	default: -		return -EINVAL; -	} -	return (__raw_readl(reg) -			& (1 << get_gpio_index(gpio))) != 0; -} - -static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) -{ -	void __iomem *reg; - -	if (check_gpio(gpio) < 0) -		return -EINVAL; -	reg = bank->base; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_OUTPUT; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_DATA_OUTPUT; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_DATAOUT; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_DATA_OUTPUT; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_DATAOUT; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_DATAOUT; -		break; -#endif -	default: -		return -EINVAL; -	} - -	return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0; -} - -#define MOD_REG_BIT(reg, bit_mask, set)	\ -do {	\ -	int l = __raw_readl(base + reg); \ -	if (set) l |= bit_mask; \ -	else l &= ~bit_mask; \ -	__raw_writel(l, base + reg); \ -} while(0) - -/** - * _set_gpio_debounce - low level gpio debounce time - * @bank: the gpio bank we're acting upon - * @gpio: the gpio number on this @gpio - * @debounce: debounce time to use - * - * OMAP's debounce time is in 31us steps so we need - * to convert and round up to the closest unit. - */ -static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, -		unsigned debounce) -{ -	void __iomem		*reg = bank->base; -	u32			val; -	u32			l; - -	if (debounce < 32) -		debounce = 0x01; -	else if (debounce > 7936) -		debounce = 0xff; -	else -		debounce = (debounce / 0x1f) - 1; - -	l = 1 << get_gpio_index(gpio); - -	if (cpu_is_omap44xx()) -		reg += OMAP4_GPIO_DEBOUNCINGTIME; -	else -		reg += OMAP24XX_GPIO_DEBOUNCE_VAL; - -	__raw_writel(debounce, reg); - -	reg = bank->base; -	if (cpu_is_omap44xx()) -		reg += OMAP4_GPIO_DEBOUNCENABLE; -	else -		reg += OMAP24XX_GPIO_DEBOUNCE_EN; - -	val = __raw_readl(reg); - -	if (debounce) { -		val |= l; -		if (cpu_is_omap34xx() || cpu_is_omap44xx()) -			clk_enable(bank->dbck); -	} else { -		val &= ~l; -		if (cpu_is_omap34xx() || cpu_is_omap44xx()) -			clk_disable(bank->dbck); -	} -	bank->dbck_enable_mask = val; - -	__raw_writel(val, reg); -} - -#ifdef CONFIG_ARCH_OMAP2PLUS -static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, -						int trigger) -{ -	void __iomem *base = bank->base; -	u32 gpio_bit = 1 << gpio; -	u32 val; - -	if (cpu_is_omap44xx()) { -		MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, -			trigger & IRQ_TYPE_LEVEL_LOW); -		MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT1, gpio_bit, -			trigger & IRQ_TYPE_LEVEL_HIGH); -		MOD_REG_BIT(OMAP4_GPIO_RISINGDETECT, gpio_bit, -			trigger & IRQ_TYPE_EDGE_RISING); -		MOD_REG_BIT(OMAP4_GPIO_FALLINGDETECT, gpio_bit, -			trigger & IRQ_TYPE_EDGE_FALLING); -	} else { -		MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, -			trigger & IRQ_TYPE_LEVEL_LOW); -		MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, -			trigger & IRQ_TYPE_LEVEL_HIGH); -		MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, -			trigger & IRQ_TYPE_EDGE_RISING); -		MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, -			trigger & IRQ_TYPE_EDGE_FALLING); -	} -	if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { -		if (cpu_is_omap44xx()) { -			if (trigger != 0) -				__raw_writel(1 << gpio, bank->base+ -						OMAP4_GPIO_IRQWAKEN0); -			else { -				val = __raw_readl(bank->base + -							OMAP4_GPIO_IRQWAKEN0); -				__raw_writel(val & (~(1 << gpio)), bank->base + -							 OMAP4_GPIO_IRQWAKEN0); -			} -		} else { -			/* -			 * GPIO wakeup request can only be generated on edge -			 * transitions -			 */ -			if (trigger & IRQ_TYPE_EDGE_BOTH) -				__raw_writel(1 << gpio, bank->base -					+ OMAP24XX_GPIO_SETWKUENA); -			else -				__raw_writel(1 << gpio, bank->base -					+ OMAP24XX_GPIO_CLEARWKUENA); -		} -	} -	/* This part needs to be executed always for OMAP34xx */ -	if (cpu_is_omap34xx() || (bank->non_wakeup_gpios & gpio_bit)) { -		/* -		 * Log the edge gpio and manually trigger the IRQ -		 * after resume if the input level changes -		 * to avoid irq lost during PER RET/OFF mode -		 * Applies for omap2 non-wakeup gpio and all omap3 gpios -		 */ -		if (trigger & IRQ_TYPE_EDGE_BOTH) -			bank->enabled_non_wakeup_gpios |= gpio_bit; -		else -			bank->enabled_non_wakeup_gpios &= ~gpio_bit; -	} - -	if (cpu_is_omap44xx()) { -		bank->level_mask = -			__raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) | -			__raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1); -	} else { -		bank->level_mask = -			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) | -			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); -	} -} -#endif - -#ifdef CONFIG_ARCH_OMAP1 -/* - * This only applies to chips that can't do both rising and falling edge - * detection at once.  For all other chips, this function is a noop. - */ -static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) -{ -	void __iomem *reg = bank->base; -	u32 l = 0; - -	switch (bank->method) { -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_INT_EDGE; -		break; -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_INT_CONTROL; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_INT_CONTROL; -		break; -#endif -	default: -		return; -	} - -	l = __raw_readl(reg); -	if ((l >> gpio) & 1) -		l &= ~(1 << gpio); -	else -		l |= 1 << gpio; - -	__raw_writel(l, reg); -} -#endif - -static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) -{ -	void __iomem *reg = bank->base; -	u32 l = 0; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_INT_EDGE; -		l = __raw_readl(reg); -		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) -			bank->toggle_mask |= 1 << gpio; -		if (trigger & IRQ_TYPE_EDGE_RISING) -			l |= 1 << gpio; -		else if (trigger & IRQ_TYPE_EDGE_FALLING) -			l &= ~(1 << gpio); -		else -			goto bad; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_INT_CONTROL; -		l = __raw_readl(reg); -		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) -			bank->toggle_mask |= 1 << gpio; -		if (trigger & IRQ_TYPE_EDGE_RISING) -			l |= 1 << gpio; -		else if (trigger & IRQ_TYPE_EDGE_FALLING) -			l &= ~(1 << gpio); -		else -			goto bad; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		if (gpio & 0x08) -			reg += OMAP1610_GPIO_EDGE_CTRL2; -		else -			reg += OMAP1610_GPIO_EDGE_CTRL1; -		gpio &= 0x07; -		l = __raw_readl(reg); -		l &= ~(3 << (gpio << 1)); -		if (trigger & IRQ_TYPE_EDGE_RISING) -			l |= 2 << (gpio << 1); -		if (trigger & IRQ_TYPE_EDGE_FALLING) -			l |= 1 << (gpio << 1); -		if (trigger) -			/* Enable wake-up during idle for dynamic tick */ -			__raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_SET_WAKEUPENA); -		else -			__raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA); -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_INT_CONTROL; -		l = __raw_readl(reg); -		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) -			bank->toggle_mask |= 1 << gpio; -		if (trigger & IRQ_TYPE_EDGE_RISING) -			l |= 1 << gpio; -		else if (trigger & IRQ_TYPE_EDGE_FALLING) -			l &= ~(1 << gpio); -		else -			goto bad; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP2PLUS -	case METHOD_GPIO_24XX: -	case METHOD_GPIO_44XX: -		set_24xx_gpio_triggering(bank, gpio, trigger); -		break; -#endif -	default: -		goto bad; -	} -	__raw_writel(l, reg); -	return 0; -bad: -	return -EINVAL; -} - -static int gpio_irq_type(unsigned irq, unsigned type) -{ -	struct gpio_bank *bank; -	unsigned gpio; -	int retval; -	unsigned long flags; - -	if (!cpu_class_is_omap2() && irq > IH_MPUIO_BASE) -		gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE); -	else -		gpio = irq - IH_GPIO_BASE; - -	if (check_gpio(gpio) < 0) -		return -EINVAL; - -	if (type & ~IRQ_TYPE_SENSE_MASK) -		return -EINVAL; - -	/* OMAP1 allows only only edge triggering */ -	if (!cpu_class_is_omap2() -			&& (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH))) -		return -EINVAL; - -	bank = get_irq_chip_data(irq); -	spin_lock_irqsave(&bank->lock, flags); -	retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type); -	if (retval == 0) { -		irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK; -		irq_desc[irq].status |= type; -	} -	spin_unlock_irqrestore(&bank->lock, flags); - -	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) -		__set_irq_handler_unlocked(irq, handle_level_irq); -	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) -		__set_irq_handler_unlocked(irq, handle_edge_irq); - -	return retval; -} - -static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) -{ -	void __iomem *reg = bank->base; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		/* MPUIO irqstatus is reset by reading the status register, -		 * so do nothing here */ -		return; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_INT_STATUS; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_IRQSTATUS1; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_INT_STATUS; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_IRQSTATUS1; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP4) -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_IRQSTATUS0; -		break; -#endif -	default: -		WARN_ON(1); -		return; -	} -	__raw_writel(gpio_mask, reg); - -	/* Workaround for clearing DSP GPIO interrupts to allow retention */ -	if (cpu_is_omap24xx() || cpu_is_omap34xx()) -		reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2; -	else if (cpu_is_omap44xx()) -		reg = bank->base + OMAP4_GPIO_IRQSTATUS1; - -	if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { -		__raw_writel(gpio_mask, reg); - -	/* Flush posted write for the irq status to avoid spurious interrupts */ -	__raw_readl(reg); -	} -} - -static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) -{ -	_clear_gpio_irqbank(bank, 1 << get_gpio_index(gpio)); -} - -static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) -{ -	void __iomem *reg = bank->base; -	int inv = 0; -	u32 l; -	u32 mask; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_MASKIT; -		mask = 0xffff; -		inv = 1; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_INT_MASK; -		mask = 0xffff; -		inv = 1; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_IRQENABLE1; -		mask = 0xffff; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_INT_MASK; -		mask = 0xffffffff; -		inv = 1; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_IRQENABLE1; -		mask = 0xffffffff; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP4) -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_IRQSTATUSSET0; -		mask = 0xffffffff; -		break; -#endif -	default: -		WARN_ON(1); -		return 0; -	} - -	l = __raw_readl(reg); -	if (inv) -		l = ~l; -	l &= mask; -	return l; -} - -static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enable) -{ -	void __iomem *reg = bank->base; -	u32 l; - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP1 -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_MASKIT; -		l = __raw_readl(reg); -		if (enable) -			l &= ~(gpio_mask); -		else -			l |= gpio_mask; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_INT_MASK; -		l = __raw_readl(reg); -		if (enable) -			l &= ~(gpio_mask); -		else -			l |= gpio_mask; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_GPIO_1610: -		if (enable) -			reg += OMAP1610_GPIO_SET_IRQENABLE1; -		else -			reg += OMAP1610_GPIO_CLEAR_IRQENABLE1; -		l = gpio_mask; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_INT_MASK; -		l = __raw_readl(reg); -		if (enable) -			l &= ~(gpio_mask); -		else -			l |= gpio_mask; -		break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	case METHOD_GPIO_24XX: -		if (enable) -			reg += OMAP24XX_GPIO_SETIRQENABLE1; -		else -			reg += OMAP24XX_GPIO_CLEARIRQENABLE1; -		l = gpio_mask; -		break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -	case METHOD_GPIO_44XX: -		if (enable) -			reg += OMAP4_GPIO_IRQSTATUSSET0; -		else -			reg += OMAP4_GPIO_IRQSTATUSCLR0; -		l = gpio_mask; -		break; -#endif -	default: -		WARN_ON(1); -		return; -	} -	__raw_writel(l, reg); -} - -static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) -{ -	_enable_gpio_irqbank(bank, 1 << get_gpio_index(gpio), enable); -} - -/* - * Note that ENAWAKEUP needs to be enabled in GPIO_SYSCONFIG register. - * 1510 does not seem to have a wake-up register. If JTAG is connected - * to the target, system will wake up always on GPIO events. While - * system is running all registered GPIO interrupts need to have wake-up - * enabled. When system is suspended, only selected GPIO interrupts need - * to have wake-up enabled. - */ -static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) -{ -	unsigned long uninitialized_var(flags); - -	switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP16XX -	case METHOD_MPUIO: -	case METHOD_GPIO_1610: -		spin_lock_irqsave(&bank->lock, flags); -		if (enable) -			bank->suspend_wakeup |= (1 << gpio); -		else -			bank->suspend_wakeup &= ~(1 << gpio); -		spin_unlock_irqrestore(&bank->lock, flags); -		return 0; -#endif -#ifdef CONFIG_ARCH_OMAP2PLUS -	case METHOD_GPIO_24XX: -	case METHOD_GPIO_44XX: -		if (bank->non_wakeup_gpios & (1 << gpio)) { -			printk(KERN_ERR "Unable to modify wakeup on " -					"non-wakeup GPIO%d\n", -					(bank - gpio_bank) * 32 + gpio); -			return -EINVAL; -		} -		spin_lock_irqsave(&bank->lock, flags); -		if (enable) -			bank->suspend_wakeup |= (1 << gpio); -		else -			bank->suspend_wakeup &= ~(1 << gpio); -		spin_unlock_irqrestore(&bank->lock, flags); -		return 0; -#endif -	default: -		printk(KERN_ERR "Can't enable GPIO wakeup for method %i\n", -		       bank->method); -		return -EINVAL; -	} -} - -static void _reset_gpio(struct gpio_bank *bank, int gpio) -{ -	_set_gpio_direction(bank, get_gpio_index(gpio), 1); -	_set_gpio_irqenable(bank, gpio, 0); -	_clear_gpio_irqstatus(bank, gpio); -	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); -} - -/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */ -static int gpio_wake_enable(unsigned int irq, unsigned int enable) -{ -	unsigned int gpio = irq - IH_GPIO_BASE; -	struct gpio_bank *bank; -	int retval; - -	if (check_gpio(gpio) < 0) -		return -ENODEV; -	bank = get_irq_chip_data(irq); -	retval = _set_gpio_wakeup(bank, get_gpio_index(gpio), enable); - -	return retval; -} - -static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) -{ -	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); -	unsigned long flags; - -	spin_lock_irqsave(&bank->lock, flags); - -	/* Set trigger to none. You need to enable the desired trigger with -	 * request_irq() or set_irq_type(). -	 */ -	_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); - -#ifdef CONFIG_ARCH_OMAP15XX -	if (bank->method == METHOD_GPIO_1510) { -		void __iomem *reg; - -		/* Claim the pin for MPU */ -		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL; -		__raw_writel(__raw_readl(reg) | (1 << offset), reg); -	} -#endif -	if (!cpu_class_is_omap1()) { -		if (!bank->mod_usage) { -			void __iomem *reg = bank->base; -			u32 ctrl; - -			if (cpu_is_omap24xx() || cpu_is_omap34xx()) -				reg += OMAP24XX_GPIO_CTRL; -			else if (cpu_is_omap44xx()) -				reg += OMAP4_GPIO_CTRL; -			ctrl = __raw_readl(reg); -			/* Module is enabled, clocks are not gated */ -			ctrl &= 0xFFFFFFFE; -			__raw_writel(ctrl, reg); -		} -		bank->mod_usage |= 1 << offset; -	} -	spin_unlock_irqrestore(&bank->lock, flags); - -	return 0; -} - -static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) -{ -	struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); -	unsigned long flags; - -	spin_lock_irqsave(&bank->lock, flags); -#ifdef CONFIG_ARCH_OMAP16XX -	if (bank->method == METHOD_GPIO_1610) { -		/* Disable wake-up during idle for dynamic tick */ -		void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; -		__raw_writel(1 << offset, reg); -	} -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	if (bank->method == METHOD_GPIO_24XX) { -		/* Disable wake-up during idle for dynamic tick */ -		void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; -		__raw_writel(1 << offset, reg); -	} -#endif -#ifdef CONFIG_ARCH_OMAP4 -	if (bank->method == METHOD_GPIO_44XX) { -		/* Disable wake-up during idle for dynamic tick */ -		void __iomem *reg = bank->base + OMAP4_GPIO_IRQWAKEN0; -		__raw_writel(1 << offset, reg); -	} -#endif -	if (!cpu_class_is_omap1()) { -		bank->mod_usage &= ~(1 << offset); -		if (!bank->mod_usage) { -			void __iomem *reg = bank->base; -			u32 ctrl; - -			if (cpu_is_omap24xx() || cpu_is_omap34xx()) -				reg += OMAP24XX_GPIO_CTRL; -			else if (cpu_is_omap44xx()) -				reg += OMAP4_GPIO_CTRL; -			ctrl = __raw_readl(reg); -			/* Module is disabled, clocks are gated */ -			ctrl |= 1; -			__raw_writel(ctrl, reg); -		} -	} -	_reset_gpio(bank, bank->chip.base + offset); -	spin_unlock_irqrestore(&bank->lock, flags); -} - -/* - * We need to unmask the GPIO bank interrupt as soon as possible to - * avoid missing GPIO interrupts for other lines in the bank. - * Then we need to mask-read-clear-unmask the triggered GPIO lines - * in the bank to avoid missing nested interrupts for a GPIO line. - * If we wait to unmask individual GPIO lines in the bank after the - * line's interrupt handler has been run, we may miss some nested - * interrupts. - */ -static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) -{ -	void __iomem *isr_reg = NULL; -	u32 isr; -	unsigned int gpio_irq, gpio_index; -	struct gpio_bank *bank; -	u32 retrigger = 0; -	int unmasked = 0; - -	desc->chip->ack(irq); - -	bank = get_irq_data(irq); -#ifdef CONFIG_ARCH_OMAP1 -	if (bank->method == METHOD_MPUIO) -		isr_reg = bank->base + OMAP_MPUIO_GPIO_INT; -#endif -#ifdef CONFIG_ARCH_OMAP15XX -	if (bank->method == METHOD_GPIO_1510) -		isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS; -#endif -#if defined(CONFIG_ARCH_OMAP16XX) -	if (bank->method == METHOD_GPIO_1610) -		isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1; -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	if (bank->method == METHOD_GPIO_7XX) -		isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	if (bank->method == METHOD_GPIO_24XX) -		isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; -#endif -#if defined(CONFIG_ARCH_OMAP4) -	if (bank->method == METHOD_GPIO_44XX) -		isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0; -#endif -	while(1) { -		u32 isr_saved, level_mask = 0; -		u32 enabled; - -		enabled = _get_gpio_irqbank_mask(bank); -		isr_saved = isr = __raw_readl(isr_reg) & enabled; - -		if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) -			isr &= 0x0000ffff; - -		if (cpu_class_is_omap2()) { -			level_mask = bank->level_mask & enabled; -		} - -		/* clear edge sensitive interrupts before handler(s) are -		called so that we don't miss any interrupt occurred while -		executing them */ -		_enable_gpio_irqbank(bank, isr_saved & ~level_mask, 0); -		_clear_gpio_irqbank(bank, isr_saved & ~level_mask); -		_enable_gpio_irqbank(bank, isr_saved & ~level_mask, 1); - -		/* if there is only edge sensitive GPIO pin interrupts -		configured, we could unmask GPIO bank interrupt immediately */ -		if (!level_mask && !unmasked) { -			unmasked = 1; -			desc->chip->unmask(irq); -		} - -		isr |= retrigger; -		retrigger = 0; -		if (!isr) -			break; - -		gpio_irq = bank->virtual_irq_start; -		for (; isr != 0; isr >>= 1, gpio_irq++) { -			gpio_index = get_gpio_index(irq_to_gpio(gpio_irq)); - -			if (!(isr & 1)) -				continue; - -#ifdef CONFIG_ARCH_OMAP1 -			/* -			 * Some chips can't respond to both rising and falling -			 * at the same time.  If this irq was requested with -			 * both flags, we need to flip the ICR data for the IRQ -			 * to respond to the IRQ for the opposite direction. -			 * This will be indicated in the bank toggle_mask. -			 */ -			if (bank->toggle_mask & (1 << gpio_index)) -				_toggle_gpio_edge_triggering(bank, gpio_index); -#endif - -			generic_handle_irq(gpio_irq); -		} -	} -	/* if bank has any level sensitive GPIO pin interrupt -	configured, we must unmask the bank interrupt only after -	handler(s) are executed in order to avoid spurious bank -	interrupt */ -	if (!unmasked) -		desc->chip->unmask(irq); - -} - -static void gpio_irq_shutdown(unsigned int irq) -{ -	unsigned int gpio = irq - IH_GPIO_BASE; -	struct gpio_bank *bank = get_irq_chip_data(irq); - -	_reset_gpio(bank, gpio); -} - -static void gpio_ack_irq(unsigned int irq) -{ -	unsigned int gpio = irq - IH_GPIO_BASE; -	struct gpio_bank *bank = get_irq_chip_data(irq); - -	_clear_gpio_irqstatus(bank, gpio); -} - -static void gpio_mask_irq(unsigned int irq) -{ -	unsigned int gpio = irq - IH_GPIO_BASE; -	struct gpio_bank *bank = get_irq_chip_data(irq); - -	_set_gpio_irqenable(bank, gpio, 0); -	_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); -} - -static void gpio_unmask_irq(unsigned int irq) -{ -	unsigned int gpio = irq - IH_GPIO_BASE; -	struct gpio_bank *bank = get_irq_chip_data(irq); -	unsigned int irq_mask = 1 << get_gpio_index(gpio); -	struct irq_desc *desc = irq_to_desc(irq); -	u32 trigger = desc->status & IRQ_TYPE_SENSE_MASK; - -	if (trigger) -		_set_gpio_triggering(bank, get_gpio_index(gpio), trigger); - -	/* For level-triggered GPIOs, the clearing must be done after -	 * the HW source is cleared, thus after the handler has run */ -	if (bank->level_mask & irq_mask) { -		_set_gpio_irqenable(bank, gpio, 0); -		_clear_gpio_irqstatus(bank, gpio); -	} - -	_set_gpio_irqenable(bank, gpio, 1); -} - -static struct irq_chip gpio_irq_chip = { -	.name		= "GPIO", -	.shutdown	= gpio_irq_shutdown, -	.ack		= gpio_ack_irq, -	.mask		= gpio_mask_irq, -	.unmask		= gpio_unmask_irq, -	.set_type	= gpio_irq_type, -	.set_wake	= gpio_wake_enable, -}; - -/*---------------------------------------------------------------------*/ - -#ifdef CONFIG_ARCH_OMAP1 - -/* MPUIO uses the always-on 32k clock */ - -static void mpuio_ack_irq(unsigned int irq) -{ -	/* The ISR is reset automatically, so do nothing here. */ -} - -static void mpuio_mask_irq(unsigned int irq) -{ -	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE); -	struct gpio_bank *bank = get_irq_chip_data(irq); - -	_set_gpio_irqenable(bank, gpio, 0); -} - -static void mpuio_unmask_irq(unsigned int irq) -{ -	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE); -	struct gpio_bank *bank = get_irq_chip_data(irq); - -	_set_gpio_irqenable(bank, gpio, 1); -} - -static struct irq_chip mpuio_irq_chip = { -	.name		= "MPUIO", -	.ack		= mpuio_ack_irq, -	.mask		= mpuio_mask_irq, -	.unmask		= mpuio_unmask_irq, -	.set_type	= gpio_irq_type, -#ifdef CONFIG_ARCH_OMAP16XX -	/* REVISIT: assuming only 16xx supports MPUIO wake events */ -	.set_wake	= gpio_wake_enable, -#endif -}; - - -#define bank_is_mpuio(bank)	((bank)->method == METHOD_MPUIO) - - -#ifdef CONFIG_ARCH_OMAP16XX - -#include <linux/platform_device.h> - -static int omap_mpuio_suspend_noirq(struct device *dev) -{ -	struct platform_device *pdev = to_platform_device(dev); -	struct gpio_bank	*bank = platform_get_drvdata(pdev); -	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; -	unsigned long		flags; - -	spin_lock_irqsave(&bank->lock, flags); -	bank->saved_wakeup = __raw_readl(mask_reg); -	__raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg); -	spin_unlock_irqrestore(&bank->lock, flags); - -	return 0; -} - -static int omap_mpuio_resume_noirq(struct device *dev) -{ -	struct platform_device *pdev = to_platform_device(dev); -	struct gpio_bank	*bank = platform_get_drvdata(pdev); -	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; -	unsigned long		flags; - -	spin_lock_irqsave(&bank->lock, flags); -	__raw_writel(bank->saved_wakeup, mask_reg); -	spin_unlock_irqrestore(&bank->lock, flags); - -	return 0; -} - -static const struct dev_pm_ops omap_mpuio_dev_pm_ops = { -	.suspend_noirq = omap_mpuio_suspend_noirq, -	.resume_noirq = omap_mpuio_resume_noirq, -}; - -/* use platform_driver for this, now that there's no longer any - * point to sys_device (other than not disturbing old code). - */ -static struct platform_driver omap_mpuio_driver = { -	.driver		= { -		.name	= "mpuio", -		.pm	= &omap_mpuio_dev_pm_ops, -	}, -}; - -static struct platform_device omap_mpuio_device = { -	.name		= "mpuio", -	.id		= -1, -	.dev = { -		.driver = &omap_mpuio_driver.driver, -	} -	/* could list the /proc/iomem resources */ -}; - -static inline void mpuio_init(void) -{ -	platform_set_drvdata(&omap_mpuio_device, &gpio_bank_1610[0]); - -	if (platform_driver_register(&omap_mpuio_driver) == 0) -		(void) platform_device_register(&omap_mpuio_device); -} - -#else -static inline void mpuio_init(void) {} -#endif	/* 16xx */ - -#else - -extern struct irq_chip mpuio_irq_chip; - -#define bank_is_mpuio(bank)	0 -static inline void mpuio_init(void) {} - -#endif - -/*---------------------------------------------------------------------*/ - -/* REVISIT these are stupid implementations!  replace by ones that - * don't switch on METHOD_* and which mostly avoid spinlocks - */ - -static int gpio_input(struct gpio_chip *chip, unsigned offset) -{ -	struct gpio_bank *bank; -	unsigned long flags; - -	bank = container_of(chip, struct gpio_bank, chip); -	spin_lock_irqsave(&bank->lock, flags); -	_set_gpio_direction(bank, offset, 1); -	spin_unlock_irqrestore(&bank->lock, flags); -	return 0; -} - -static int gpio_is_input(struct gpio_bank *bank, int mask) -{ -	void __iomem *reg = bank->base; - -	switch (bank->method) { -	case METHOD_MPUIO: -		reg += OMAP_MPUIO_IO_CNTL; -		break; -	case METHOD_GPIO_1510: -		reg += OMAP1510_GPIO_DIR_CONTROL; -		break; -	case METHOD_GPIO_1610: -		reg += OMAP1610_GPIO_DIRECTION; -		break; -	case METHOD_GPIO_7XX: -		reg += OMAP7XX_GPIO_DIR_CONTROL; -		break; -	case METHOD_GPIO_24XX: -		reg += OMAP24XX_GPIO_OE; -		break; -	case METHOD_GPIO_44XX: -		reg += OMAP4_GPIO_OE; -		break; -	default: -		WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method"); -		return -EINVAL; -	} -	return __raw_readl(reg) & mask; -} - -static int gpio_get(struct gpio_chip *chip, unsigned offset) -{ -	struct gpio_bank *bank; -	void __iomem *reg; -	int gpio; -	u32 mask; - -	gpio = chip->base + offset; -	bank = get_gpio_bank(gpio); -	reg = bank->base; -	mask = 1 << get_gpio_index(gpio); - -	if (gpio_is_input(bank, mask)) -		return _get_gpio_datain(bank, gpio); -	else -		return _get_gpio_dataout(bank, gpio); -} - -static int gpio_output(struct gpio_chip *chip, unsigned offset, int value) -{ -	struct gpio_bank *bank; -	unsigned long flags; - -	bank = container_of(chip, struct gpio_bank, chip); -	spin_lock_irqsave(&bank->lock, flags); -	_set_gpio_dataout(bank, offset, value); -	_set_gpio_direction(bank, offset, 0); -	spin_unlock_irqrestore(&bank->lock, flags); -	return 0; -} - -static int gpio_debounce(struct gpio_chip *chip, unsigned offset, -		unsigned debounce) -{ -	struct gpio_bank *bank; -	unsigned long flags; - -	bank = container_of(chip, struct gpio_bank, chip); -	spin_lock_irqsave(&bank->lock, flags); -	_set_gpio_debounce(bank, offset, debounce); -	spin_unlock_irqrestore(&bank->lock, flags); - -	return 0; -} - -static void gpio_set(struct gpio_chip *chip, unsigned offset, int value) -{ -	struct gpio_bank *bank; -	unsigned long flags; - -	bank = container_of(chip, struct gpio_bank, chip); -	spin_lock_irqsave(&bank->lock, flags); -	_set_gpio_dataout(bank, offset, value); -	spin_unlock_irqrestore(&bank->lock, flags); -} - -static int gpio_2irq(struct gpio_chip *chip, unsigned offset) -{ -	struct gpio_bank *bank; - -	bank = container_of(chip, struct gpio_bank, chip); -	return bank->virtual_irq_start + offset; -} - -/*---------------------------------------------------------------------*/ - -static int initialized; -#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2) -static struct clk * gpio_ick; -#endif - -#if defined(CONFIG_ARCH_OMAP2) -static struct clk * gpio_fck; -#endif - -#if defined(CONFIG_ARCH_OMAP2430) -static struct clk * gpio5_ick; -static struct clk * gpio5_fck; -#endif - -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; -#endif - -static void __init omap_gpio_show_rev(void) -{ -	u32 rev; - -	if (cpu_is_omap16xx()) -		rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION); -	else if (cpu_is_omap24xx() || cpu_is_omap34xx()) -		rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); -	else if (cpu_is_omap44xx()) -		rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION); -	else -		return; - -	printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n", -		(rev >> 4) & 0x0f, rev & 0x0f); -} - -/* This lock class tells lockdep that GPIO irqs are in a different - * category than their parents, so it won't report false recursion. - */ -static struct lock_class_key gpio_lock_class; - -static int __init _omap_gpio_init(void) -{ -	int i; -	int gpio = 0; -	struct gpio_bank *bank; -	int bank_size = SZ_8K;	/* Module 4KB + L4 4KB except on omap1 */ -	char clk_name[11]; - -	initialized = 1; - -#if defined(CONFIG_ARCH_OMAP1) -	if (cpu_is_omap15xx()) { -		gpio_ick = clk_get(NULL, "arm_gpio_ck"); -		if (IS_ERR(gpio_ick)) -			printk("Could not get arm_gpio_ck\n"); -		else -			clk_enable(gpio_ick); -	} -#endif -#if defined(CONFIG_ARCH_OMAP2) -	if (cpu_class_is_omap2()) { -		gpio_ick = clk_get(NULL, "gpios_ick"); -		if (IS_ERR(gpio_ick)) -			printk("Could not get gpios_ick\n"); -		else -			clk_enable(gpio_ick); -		gpio_fck = clk_get(NULL, "gpios_fck"); -		if (IS_ERR(gpio_fck)) -			printk("Could not get gpios_fck\n"); -		else -			clk_enable(gpio_fck); - -		/* -		 * On 2430 & 3430 GPIO 5 uses CORE L4 ICLK -		 */ -#if defined(CONFIG_ARCH_OMAP2430) -		if (cpu_is_omap2430()) { -			gpio5_ick = clk_get(NULL, "gpio5_ick"); -			if (IS_ERR(gpio5_ick)) -				printk("Could not get gpio5_ick\n"); -			else -				clk_enable(gpio5_ick); -			gpio5_fck = clk_get(NULL, "gpio5_fck"); -			if (IS_ERR(gpio5_fck)) -				printk("Could not get gpio5_fck\n"); -			else -				clk_enable(gpio5_fck); -		} -#endif -	} -#endif - -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		for (i = 0; i < OMAP34XX_NR_GPIOS; i++) { -			sprintf(clk_name, "gpio%d_ick", i + 1); -			gpio_iclks[i] = clk_get(NULL, clk_name); -			if (IS_ERR(gpio_iclks[i])) -				printk(KERN_ERR "Could not get %s\n", clk_name); -			else -				clk_enable(gpio_iclks[i]); -		} -	} -#endif - - -#ifdef CONFIG_ARCH_OMAP15XX -	if (cpu_is_omap15xx()) { -		gpio_bank_count = 2; -		gpio_bank = gpio_bank_1510; -		bank_size = SZ_2K; -	} -#endif -#if defined(CONFIG_ARCH_OMAP16XX) -	if (cpu_is_omap16xx()) { -		gpio_bank_count = 5; -		gpio_bank = gpio_bank_1610; -		bank_size = SZ_2K; -	} -#endif -#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) -	if (cpu_is_omap7xx()) { -		gpio_bank_count = 7; -		gpio_bank = gpio_bank_7xx; -		bank_size = SZ_2K; -	} -#endif -#ifdef CONFIG_ARCH_OMAP2 -	if (cpu_is_omap242x()) { -		gpio_bank_count = 4; -		gpio_bank = gpio_bank_242x; -	} -	if (cpu_is_omap243x()) { -		gpio_bank_count = 5; -		gpio_bank = gpio_bank_243x; -	} -#endif -#ifdef CONFIG_ARCH_OMAP3 -	if (cpu_is_omap34xx()) { -		gpio_bank_count = OMAP34XX_NR_GPIOS; -		gpio_bank = gpio_bank_34xx; -	} -#endif -#ifdef CONFIG_ARCH_OMAP4 -	if (cpu_is_omap44xx()) { -		gpio_bank_count = OMAP34XX_NR_GPIOS; -		gpio_bank = gpio_bank_44xx; -	} -#endif -	for (i = 0; i < gpio_bank_count; i++) { -		int j, gpio_count = 16; - -		bank = &gpio_bank[i]; -		spin_lock_init(&bank->lock); - -		/* Static mapping, never released */ -		bank->base = ioremap(bank->pbase, bank_size); -		if (!bank->base) { -			printk(KERN_ERR "Could not ioremap gpio bank%i\n", i); -			continue; -		} - -		if (bank_is_mpuio(bank)) -			__raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT); -		if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { -			__raw_writew(0xffff, bank->base + OMAP1510_GPIO_INT_MASK); -			__raw_writew(0x0000, bank->base + OMAP1510_GPIO_INT_STATUS); -		} -		if (cpu_is_omap16xx() && bank->method == METHOD_GPIO_1610) { -			__raw_writew(0x0000, bank->base + OMAP1610_GPIO_IRQENABLE1); -			__raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1); -			__raw_writew(0x0014, bank->base + OMAP1610_GPIO_SYSCONFIG); -		} -		if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) { -			__raw_writel(0xffffffff, bank->base + OMAP7XX_GPIO_INT_MASK); -			__raw_writel(0x00000000, bank->base + OMAP7XX_GPIO_INT_STATUS); - -			gpio_count = 32; /* 7xx has 32-bit GPIOs */ -		} - -#ifdef CONFIG_ARCH_OMAP2PLUS -		if ((bank->method == METHOD_GPIO_24XX) || -				(bank->method == METHOD_GPIO_44XX)) { -			static const u32 non_wakeup_gpios[] = { -				0xe203ffc0, 0x08700040 -			}; - -			if (cpu_is_omap44xx()) { -				__raw_writel(0xffffffff, bank->base + -						OMAP4_GPIO_IRQSTATUSCLR0); -				__raw_writew(0x0015, bank->base + -						OMAP4_GPIO_SYSCONFIG); -				__raw_writel(0x00000000, bank->base + -						 OMAP4_GPIO_DEBOUNCENABLE); -				/* -				 * Initialize interface clock ungated, -				 * module enabled -				 */ -				__raw_writel(0, bank->base + OMAP4_GPIO_CTRL); -			} else { -				__raw_writel(0x00000000, bank->base + -						OMAP24XX_GPIO_IRQENABLE1); -				__raw_writel(0xffffffff, bank->base + -						OMAP24XX_GPIO_IRQSTATUS1); -				__raw_writew(0x0015, bank->base + -						OMAP24XX_GPIO_SYSCONFIG); -				__raw_writel(0x00000000, bank->base + -						OMAP24XX_GPIO_DEBOUNCE_EN); - -				/* -				 * Initialize interface clock ungated, -				 * module enabled -				 */ -				__raw_writel(0, bank->base + -						OMAP24XX_GPIO_CTRL); -			} -			if (cpu_is_omap24xx() && -			    i < ARRAY_SIZE(non_wakeup_gpios)) -				bank->non_wakeup_gpios = non_wakeup_gpios[i]; -			gpio_count = 32; -		} -#endif - -		bank->mod_usage = 0; -		/* REVISIT eventually switch from OMAP-specific gpio structs -		 * over to the generic ones -		 */ -		bank->chip.request = omap_gpio_request; -		bank->chip.free = omap_gpio_free; -		bank->chip.direction_input = gpio_input; -		bank->chip.get = gpio_get; -		bank->chip.direction_output = gpio_output; -		bank->chip.set_debounce = gpio_debounce; -		bank->chip.set = gpio_set; -		bank->chip.to_irq = gpio_2irq; -		if (bank_is_mpuio(bank)) { -			bank->chip.label = "mpuio"; -#ifdef CONFIG_ARCH_OMAP16XX -			bank->chip.dev = &omap_mpuio_device.dev; -#endif -			bank->chip.base = OMAP_MPUIO(0); -		} else { -			bank->chip.label = "gpio"; -			bank->chip.base = gpio; -			gpio += gpio_count; -		} -		bank->chip.ngpio = gpio_count; - -		gpiochip_add(&bank->chip); - -		for (j = bank->virtual_irq_start; -		     j < bank->virtual_irq_start + gpio_count; j++) { -			lockdep_set_class(&irq_desc[j].lock, &gpio_lock_class); -			set_irq_chip_data(j, bank); -			if (bank_is_mpuio(bank)) -				set_irq_chip(j, &mpuio_irq_chip); -			else -				set_irq_chip(j, &gpio_irq_chip); -			set_irq_handler(j, handle_simple_irq); -			set_irq_flags(j, IRQF_VALID); -		} -		set_irq_chained_handler(bank->irq, gpio_irq_handler); -		set_irq_data(bank->irq, bank); - -		if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -			sprintf(clk_name, "gpio%d_dbck", i + 1); -			bank->dbck = clk_get(NULL, clk_name); -			if (IS_ERR(bank->dbck)) -				printk(KERN_ERR "Could not get %s\n", clk_name); -		} -	} - -	/* Enable system clock for GPIO module. -	 * The CAM_CLK_CTRL *is* really the right place. */ -	if (cpu_is_omap16xx()) -		omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04, ULPD_CAM_CLK_CTRL); - -	/* Enable autoidle for the OCP interface */ -	if (cpu_is_omap24xx()) -		omap_writel(1 << 0, 0x48019010); -	if (cpu_is_omap34xx()) -		omap_writel(1 << 0, 0x48306814); - -	omap_gpio_show_rev(); - -	return 0; -} - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) -static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) -{ -	int i; - -	if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) -		return 0; - -	for (i = 0; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		void __iomem *wake_status; -		void __iomem *wake_clear; -		void __iomem *wake_set; -		unsigned long flags; - -		switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP16XX -		case METHOD_GPIO_1610: -			wake_status = bank->base + OMAP1610_GPIO_WAKEUPENABLE; -			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; -			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; -			break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -		case METHOD_GPIO_24XX: -			wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; -			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; -			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; -			break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -		case METHOD_GPIO_44XX: -			wake_status = bank->base + OMAP4_GPIO_IRQWAKEN0; -			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; -			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; -			break; -#endif -		default: -			continue; -		} - -		spin_lock_irqsave(&bank->lock, flags); -		bank->saved_wakeup = __raw_readl(wake_status); -		__raw_writel(0xffffffff, wake_clear); -		__raw_writel(bank->suspend_wakeup, wake_set); -		spin_unlock_irqrestore(&bank->lock, flags); -	} - -	return 0; -} - -static int omap_gpio_resume(struct sys_device *dev) -{ -	int i; - -	if (!cpu_class_is_omap2() && !cpu_is_omap16xx()) -		return 0; - -	for (i = 0; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		void __iomem *wake_clear; -		void __iomem *wake_set; -		unsigned long flags; - -		switch (bank->method) { -#ifdef CONFIG_ARCH_OMAP16XX -		case METHOD_GPIO_1610: -			wake_clear = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA; -			wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; -			break; -#endif -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -		case METHOD_GPIO_24XX: -			wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; -			wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; -			break; -#endif -#ifdef CONFIG_ARCH_OMAP4 -		case METHOD_GPIO_44XX: -			wake_clear = bank->base + OMAP4_GPIO_IRQWAKEN0; -			wake_set = bank->base + OMAP4_GPIO_IRQWAKEN0; -			break; -#endif -		default: -			continue; -		} - -		spin_lock_irqsave(&bank->lock, flags); -		__raw_writel(0xffffffff, wake_clear); -		__raw_writel(bank->saved_wakeup, wake_set); -		spin_unlock_irqrestore(&bank->lock, flags); -	} - -	return 0; -} - -static struct sysdev_class omap_gpio_sysclass = { -	.name		= "gpio", -	.suspend	= omap_gpio_suspend, -	.resume		= omap_gpio_resume, -}; - -static struct sys_device omap_gpio_device = { -	.id		= 0, -	.cls		= &omap_gpio_sysclass, -}; - -#endif - -#ifdef CONFIG_ARCH_OMAP2PLUS - -static int workaround_enabled; - -void omap2_gpio_prepare_for_idle(int power_state) -{ -	int i, c = 0; -	int min = 0; - -	if (cpu_is_omap34xx()) -		min = 1; - -	for (i = min; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		u32 l1 = 0, l2 = 0; -		int j; - -		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) -			clk_disable(bank->dbck); - -		if (power_state > PWRDM_POWER_OFF) -			continue; - -		/* If going to OFF, remove triggering for all -		 * non-wakeup GPIOs.  Otherwise spurious IRQs will be -		 * generated.  See OMAP2420 Errata item 1.101. */ -		if (!(bank->enabled_non_wakeup_gpios)) -			continue; - -		if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -			bank->saved_datain = __raw_readl(bank->base + -					OMAP24XX_GPIO_DATAIN); -			l1 = __raw_readl(bank->base + -					OMAP24XX_GPIO_FALLINGDETECT); -			l2 = __raw_readl(bank->base + -					OMAP24XX_GPIO_RISINGDETECT); -		} - -		if (cpu_is_omap44xx()) { -			bank->saved_datain = __raw_readl(bank->base + -						OMAP4_GPIO_DATAIN); -			l1 = __raw_readl(bank->base + -						OMAP4_GPIO_FALLINGDETECT); -			l2 = __raw_readl(bank->base + -						OMAP4_GPIO_RISINGDETECT); -		} - -		bank->saved_fallingdetect = l1; -		bank->saved_risingdetect = l2; -		l1 &= ~bank->enabled_non_wakeup_gpios; -		l2 &= ~bank->enabled_non_wakeup_gpios; - -		if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -			__raw_writel(l1, bank->base + -					OMAP24XX_GPIO_FALLINGDETECT); -			__raw_writel(l2, bank->base + -					OMAP24XX_GPIO_RISINGDETECT); -		} - -		if (cpu_is_omap44xx()) { -			__raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT); -			__raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT); -		} - -		c++; -	} -	if (!c) { -		workaround_enabled = 0; -		return; -	} -	workaround_enabled = 1; -} - -void omap2_gpio_resume_after_idle(void) -{ -	int i; -	int min = 0; - -	if (cpu_is_omap34xx()) -		min = 1; -	for (i = min; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		u32 l = 0, gen, gen0, gen1; -		int j; - -		for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) -			clk_enable(bank->dbck); - -		if (!workaround_enabled) -			continue; - -		if (!(bank->enabled_non_wakeup_gpios)) -			continue; - -		if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -			__raw_writel(bank->saved_fallingdetect, -				 bank->base + OMAP24XX_GPIO_FALLINGDETECT); -			__raw_writel(bank->saved_risingdetect, -				 bank->base + OMAP24XX_GPIO_RISINGDETECT); -			l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); -		} - -		if (cpu_is_omap44xx()) { -			__raw_writel(bank->saved_fallingdetect, -				 bank->base + OMAP4_GPIO_FALLINGDETECT); -			__raw_writel(bank->saved_risingdetect, -				 bank->base + OMAP4_GPIO_RISINGDETECT); -			l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN); -		} - -		/* Check if any of the non-wakeup interrupt GPIOs have changed -		 * state.  If so, generate an IRQ by software.  This is -		 * horribly racy, but it's the best we can do to work around -		 * this silicon bug. */ -		l ^= bank->saved_datain; -		l &= bank->enabled_non_wakeup_gpios; - -		/* -		 * No need to generate IRQs for the rising edge for gpio IRQs -		 * configured with falling edge only; and vice versa. -		 */ -		gen0 = l & bank->saved_fallingdetect; -		gen0 &= bank->saved_datain; - -		gen1 = l & bank->saved_risingdetect; -		gen1 &= ~(bank->saved_datain); - -		/* FIXME: Consider GPIO IRQs with level detections properly! */ -		gen = l & (~(bank->saved_fallingdetect) & -				~(bank->saved_risingdetect)); -		/* Consider all GPIO IRQs needed to be updated */ -		gen |= gen0 | gen1; - -		if (gen) { -			u32 old0, old1; - -			if (cpu_is_omap24xx() || cpu_is_omap34xx()) { -				old0 = __raw_readl(bank->base + -					OMAP24XX_GPIO_LEVELDETECT0); -				old1 = __raw_readl(bank->base + -					OMAP24XX_GPIO_LEVELDETECT1); -				__raw_writel(old0 | gen, bank->base + -					OMAP24XX_GPIO_LEVELDETECT0); -				__raw_writel(old1 | gen, bank->base + -					OMAP24XX_GPIO_LEVELDETECT1); -				__raw_writel(old0, bank->base + -					OMAP24XX_GPIO_LEVELDETECT0); -				__raw_writel(old1, bank->base + -					OMAP24XX_GPIO_LEVELDETECT1); -			} - -			if (cpu_is_omap44xx()) { -				old0 = __raw_readl(bank->base + -						OMAP4_GPIO_LEVELDETECT0); -				old1 = __raw_readl(bank->base + -						OMAP4_GPIO_LEVELDETECT1); -				__raw_writel(old0 | l, bank->base + -						OMAP4_GPIO_LEVELDETECT0); -				__raw_writel(old1 | l, bank->base + -						OMAP4_GPIO_LEVELDETECT1); -				__raw_writel(old0, bank->base + -						OMAP4_GPIO_LEVELDETECT0); -				__raw_writel(old1, bank->base + -						OMAP4_GPIO_LEVELDETECT1); -			} -		} -	} - -} - -#endif - -#ifdef CONFIG_ARCH_OMAP3 -/* save the registers of bank 2-6 */ -void omap_gpio_save_context(void) -{ -	int i; - -	/* saving banks from 2-6 only since GPIO1 is in WKUP */ -	for (i = 1; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		gpio_context[i].sysconfig = -			__raw_readl(bank->base + OMAP24XX_GPIO_SYSCONFIG); -		gpio_context[i].irqenable1 = -			__raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1); -		gpio_context[i].irqenable2 = -			__raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE2); -		gpio_context[i].wake_en = -			__raw_readl(bank->base + OMAP24XX_GPIO_WAKE_EN); -		gpio_context[i].ctrl = -			__raw_readl(bank->base + OMAP24XX_GPIO_CTRL); -		gpio_context[i].oe = -			__raw_readl(bank->base + OMAP24XX_GPIO_OE); -		gpio_context[i].leveldetect0 = -			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); -		gpio_context[i].leveldetect1 = -			__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); -		gpio_context[i].risingdetect = -			__raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); -		gpio_context[i].fallingdetect = -			__raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); -		gpio_context[i].dataout = -			__raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT); -	} -} - -/* restore the required registers of bank 2-6 */ -void omap_gpio_restore_context(void) -{ -	int i; - -	for (i = 1; i < gpio_bank_count; i++) { -		struct gpio_bank *bank = &gpio_bank[i]; -		__raw_writel(gpio_context[i].sysconfig, -				bank->base + OMAP24XX_GPIO_SYSCONFIG); -		__raw_writel(gpio_context[i].irqenable1, -				bank->base + OMAP24XX_GPIO_IRQENABLE1); -		__raw_writel(gpio_context[i].irqenable2, -				bank->base + OMAP24XX_GPIO_IRQENABLE2); -		__raw_writel(gpio_context[i].wake_en, -				bank->base + OMAP24XX_GPIO_WAKE_EN); -		__raw_writel(gpio_context[i].ctrl, -				bank->base + OMAP24XX_GPIO_CTRL); -		__raw_writel(gpio_context[i].oe, -				bank->base + OMAP24XX_GPIO_OE); -		__raw_writel(gpio_context[i].leveldetect0, -				bank->base + OMAP24XX_GPIO_LEVELDETECT0); -		__raw_writel(gpio_context[i].leveldetect1, -				bank->base + OMAP24XX_GPIO_LEVELDETECT1); -		__raw_writel(gpio_context[i].risingdetect, -				bank->base + OMAP24XX_GPIO_RISINGDETECT); -		__raw_writel(gpio_context[i].fallingdetect, -				bank->base + OMAP24XX_GPIO_FALLINGDETECT); -		__raw_writel(gpio_context[i].dataout, -				bank->base + OMAP24XX_GPIO_DATAOUT); -	} -} -#endif - -/* - * This may get called early from board specific init - * for boards that have interrupts routed via FPGA. - */ -int __init omap_gpio_init(void) -{ -	if (!initialized) -		return _omap_gpio_init(); -	else -		return 0; -} - -static int __init omap_gpio_sysinit(void) -{ -	int ret = 0; - -	if (!initialized) -		ret = _omap_gpio_init(); - -	mpuio_init(); - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS) -	if (cpu_is_omap16xx() || cpu_class_is_omap2()) { -		if (ret == 0) { -			ret = sysdev_class_register(&omap_gpio_sysclass); -			if (ret == 0) -				ret = sysdev_register(&omap_gpio_device); -		} -	} -#endif - -	return ret; -} - -arch_initcall(omap_gpio_sysinit); diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index a5ce4f0aad3..58213d9714c 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c @@ -27,175 +27,17 @@  #include <linux/platform_device.h>  #include <linux/i2c.h>  #include <linux/i2c-omap.h> +#include <linux/slab.h> +#include <linux/err.h> +#include <linux/clk.h> -#include <mach/irqs.h> -#include <plat/mux.h>  #include <plat/i2c.h> -#include <plat/omap-pm.h> -#define OMAP_I2C_SIZE		0x3f -#define OMAP1_I2C_BASE		0xfffb3800 -#define OMAP2_I2C_BASE1		0x48070000 -#define OMAP2_I2C_BASE2		0x48072000 -#define OMAP2_I2C_BASE3		0x48060000 -#define OMAP4_I2C_BASE4		0x48350000 - -static const char name[] = "i2c_omap"; - -#define I2C_RESOURCE_BUILDER(base, irq)			\ -	{						\ -		.start	= (base),			\ -		.end	= (base) + OMAP_I2C_SIZE,	\ -		.flags	= IORESOURCE_MEM,		\ -	},						\ -	{						\ -		.start	= (irq),			\ -		.flags	= IORESOURCE_IRQ,		\ -	}, - -static struct resource i2c_resources[][2] = { -	{ I2C_RESOURCE_BUILDER(0, 0) }, -#if	defined(CONFIG_ARCH_OMAP2PLUS) -	{ I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE2, 0) }, -#endif -#if	defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -	{ I2C_RESOURCE_BUILDER(OMAP2_I2C_BASE3, 0) }, -#endif -#if	defined(CONFIG_ARCH_OMAP4) -	{ I2C_RESOURCE_BUILDER(OMAP4_I2C_BASE4, 0) }, -#endif -}; - -#define I2C_DEV_BUILDER(bus_id, res, data)		\ -	{						\ -		.id	= (bus_id),			\ -		.name	= name,				\ -		.num_resources	= ARRAY_SIZE(res),	\ -		.resource	= (res),		\ -		.dev		= {			\ -			.platform_data	= (data),	\ -		},					\ -	} - -static struct omap_i2c_bus_platform_data i2c_pdata[ARRAY_SIZE(i2c_resources)]; -static struct platform_device omap_i2c_devices[] = { -	I2C_DEV_BUILDER(1, i2c_resources[0], &i2c_pdata[0]), -#if	defined(CONFIG_ARCH_OMAP2PLUS) -	I2C_DEV_BUILDER(2, i2c_resources[1], &i2c_pdata[1]), -#endif -#if	defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -	I2C_DEV_BUILDER(3, i2c_resources[2], &i2c_pdata[2]), -#endif -#if	defined(CONFIG_ARCH_OMAP4) -	I2C_DEV_BUILDER(4, i2c_resources[3], &i2c_pdata[3]), -#endif -}; +#define OMAP_I2C_MAX_CONTROLLERS 4 +static struct omap_i2c_bus_platform_data i2c_pdata[OMAP_I2C_MAX_CONTROLLERS];  #define OMAP_I2C_CMDLINE_SETUP	(BIT(31)) -static int __init omap_i2c_nr_ports(void) -{ -	int ports = 0; - -	if (cpu_class_is_omap1()) -		ports = 1; -	else if (cpu_is_omap24xx()) -		ports = 2; -	else if (cpu_is_omap34xx()) -		ports = 3; -	else if (cpu_is_omap44xx()) -		ports = 4; - -	return ports; -} - -/* Shared between omap2 and 3 */ -static resource_size_t omap2_i2c_irq[3] __initdata = { -	INT_24XX_I2C1_IRQ, -	INT_24XX_I2C2_IRQ, -	INT_34XX_I2C3_IRQ, -}; - -static resource_size_t omap4_i2c_irq[4] __initdata = { -	OMAP44XX_IRQ_I2C1, -	OMAP44XX_IRQ_I2C2, -	OMAP44XX_IRQ_I2C3, -	OMAP44XX_IRQ_I2C4, -}; - -static inline int omap1_i2c_add_bus(struct platform_device *pdev, int bus_id) -{ -	struct omap_i2c_bus_platform_data *pd; -	struct resource *res; - -	pd = pdev->dev.platform_data; -	res = pdev->resource; -	res[0].start = OMAP1_I2C_BASE; -	res[0].end = res[0].start + OMAP_I2C_SIZE; -	res[1].start = INT_I2C; -	omap1_i2c_mux_pins(bus_id); - -	return platform_device_register(pdev); -} - -/* - * XXX This function is a temporary compatibility wrapper - only - * needed until the I2C driver can be converted to call - * omap_pm_set_max_dev_wakeup_lat() and handle a return code. - */ -static void omap_pm_set_max_mpu_wakeup_lat_compat(struct device *dev, long t) -{ -	omap_pm_set_max_mpu_wakeup_lat(dev, t); -} - -static inline int omap2_i2c_add_bus(struct platform_device *pdev, int bus_id) -{ -	struct resource *res; -	resource_size_t *irq; - -	res = pdev->resource; - -	if (!cpu_is_omap44xx()) -		irq = omap2_i2c_irq; -	else -		irq = omap4_i2c_irq; - -	if (bus_id == 1) { -		res[0].start = OMAP2_I2C_BASE1; -		res[0].end = res[0].start + OMAP_I2C_SIZE; -	} - -	res[1].start = irq[bus_id - 1]; -	omap2_i2c_mux_pins(bus_id); - -	/* -	 * When waiting for completion of a i2c transfer, we need to -	 * set a wake up latency constraint for the MPU. This is to -	 * ensure quick enough wakeup from idle, when transfer -	 * completes. -	 */ -	if (cpu_is_omap34xx()) { -		struct omap_i2c_bus_platform_data *pd; - -		pd = pdev->dev.platform_data; -		pd->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; -	} - -	return platform_device_register(pdev); -} - -static int __init omap_i2c_add_bus(int bus_id) -{ -	struct platform_device *pdev; - -	pdev = &omap_i2c_devices[bus_id - 1]; - -	if (cpu_class_is_omap1()) -		return omap1_i2c_add_bus(pdev, bus_id); -	else -		return omap2_i2c_add_bus(pdev, bus_id); -} -  /**   * omap_i2c_bus_setup - Process command line options for the I2C bus speed   * @str: String of options @@ -209,12 +51,11 @@ static int __init omap_i2c_add_bus(int bus_id)   */  static int __init omap_i2c_bus_setup(char *str)  { -	int ports;  	int ints[3]; -	ports = omap_i2c_nr_ports();  	get_options(str, 3, ints); -	if (ints[0] < 2 || ints[1] < 1 || ints[1] > ports) +	if (ints[0] < 2 || ints[1] < 1 || +			ints[1] > OMAP_I2C_MAX_CONTROLLERS)  		return 0;  	i2c_pdata[ints[1] - 1].clkrate = ints[2];  	i2c_pdata[ints[1] - 1].clkrate |= OMAP_I2C_CMDLINE_SETUP; @@ -227,14 +68,14 @@ __setup("i2c_bus=", omap_i2c_bus_setup);   * Register busses defined in command line but that are not registered with   * omap_register_i2c_bus from board initialization code.   */ -static int __init omap_register_i2c_bus_cmdline(void) +int __init omap_register_i2c_bus_cmdline(void)  {  	int i, err = 0;  	for (i = 0; i < ARRAY_SIZE(i2c_pdata); i++)  		if (i2c_pdata[i].clkrate & OMAP_I2C_CMDLINE_SETUP) {  			i2c_pdata[i].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; -			err = omap_i2c_add_bus(i + 1); +			err = omap_i2c_add_bus(&i2c_pdata[i], i + 1);  			if (err)  				goto out;  		} @@ -242,7 +83,6 @@ static int __init omap_register_i2c_bus_cmdline(void)  out:  	return err;  } -subsys_initcall(omap_register_i2c_bus_cmdline);  /**   * omap_register_i2c_bus - register I2C bus with device descriptors @@ -259,7 +99,7 @@ int __init omap_register_i2c_bus(int bus_id, u32 clkrate,  {  	int err; -	BUG_ON(bus_id < 1 || bus_id > omap_i2c_nr_ports()); +	BUG_ON(bus_id < 1 || bus_id > OMAP_I2C_MAX_CONTROLLERS);  	if (info) {  		err = i2c_register_board_info(bus_id, info, len); @@ -272,5 +112,5 @@ int __init omap_register_i2c_bus(int bus_id, u32 clkrate,  	i2c_pdata[bus_id - 1].clkrate &= ~OMAP_I2C_CMDLINE_SETUP; -	return omap_i2c_add_bus(bus_id); +	return omap_i2c_add_bus(&i2c_pdata[bus_id - 1], bus_id);  } diff --git a/arch/arm/plat-omap/include/plat/blizzard.h b/arch/arm/plat-omap/include/plat/blizzard.h deleted file mode 100644 index 56e7f2e7d12..00000000000 --- a/arch/arm/plat-omap/include/plat/blizzard.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _BLIZZARD_H -#define _BLIZZARD_H - -struct blizzard_platform_data { -	void		(*power_up)(struct device *dev); -	void		(*power_down)(struct device *dev); -	unsigned long	(*get_clock_rate)(struct device *dev); - -	unsigned	te_connected:1; -}; - -#endif diff --git a/arch/arm/plat-omap/include/plat/board-ams-delta.h b/arch/arm/plat-omap/include/plat/board-ams-delta.h deleted file mode 100644 index 51b102dc906..00000000000 --- a/arch/arm/plat-omap/include/plat/board-ams-delta.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/board-ams-delta.h - * - * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#ifndef __ASM_ARCH_OMAP_AMS_DELTA_H -#define __ASM_ARCH_OMAP_AMS_DELTA_H - -#if defined (CONFIG_MACH_AMS_DELTA) - -#define AMS_DELTA_LATCH1_PHYS		0x01000000 -#define AMS_DELTA_LATCH1_VIRT		0xEA000000 -#define AMS_DELTA_MODEM_PHYS		0x04000000 -#define AMS_DELTA_MODEM_VIRT		0xEB000000 -#define AMS_DELTA_LATCH2_PHYS		0x08000000 -#define AMS_DELTA_LATCH2_VIRT		0xEC000000 - -#define AMS_DELTA_LATCH1_LED_CAMERA	0x01 -#define AMS_DELTA_LATCH1_LED_ADVERT	0x02 -#define AMS_DELTA_LATCH1_LED_EMAIL	0x04 -#define AMS_DELTA_LATCH1_LED_HANDSFREE	0x08 -#define AMS_DELTA_LATCH1_LED_VOICEMAIL	0x10 -#define AMS_DELTA_LATCH1_LED_VOICE	0x20 - -#define AMS_DELTA_LATCH2_LCD_VBLEN	0x0001 -#define AMS_DELTA_LATCH2_LCD_NDISP	0x0002 -#define AMS_DELTA_LATCH2_NAND_NCE	0x0004 -#define AMS_DELTA_LATCH2_NAND_NRE	0x0008 -#define AMS_DELTA_LATCH2_NAND_NWP	0x0010 -#define AMS_DELTA_LATCH2_NAND_NWE	0x0020 -#define AMS_DELTA_LATCH2_NAND_ALE	0x0040 -#define AMS_DELTA_LATCH2_NAND_CLE	0x0080 -#define AMD_DELTA_LATCH2_KEYBRD_PWR	0x0100 -#define AMD_DELTA_LATCH2_KEYBRD_DATA	0x0200 -#define AMD_DELTA_LATCH2_SCARD_RSTIN	0x0400 -#define AMD_DELTA_LATCH2_SCARD_CMDVCC	0x0800 -#define AMS_DELTA_LATCH2_MODEM_NRESET	0x1000 -#define AMS_DELTA_LATCH2_MODEM_CODEC	0x2000 - -#define AMS_DELTA_GPIO_PIN_KEYBRD_DATA	0 -#define AMS_DELTA_GPIO_PIN_KEYBRD_CLK	1 -#define AMS_DELTA_GPIO_PIN_MODEM_IRQ	2 -#define AMS_DELTA_GPIO_PIN_HOOK_SWITCH	4 -#define AMS_DELTA_GPIO_PIN_SCARD_NOFF	6 -#define AMS_DELTA_GPIO_PIN_SCARD_IO	7 -#define AMS_DELTA_GPIO_PIN_CONFIG	11 -#define AMS_DELTA_GPIO_PIN_NAND_RB	12 - -#ifndef __ASSEMBLY__ -void ams_delta_latch1_write(u8 mask, u8 value); -void ams_delta_latch2_write(u16 mask, u16 value); -#endif - -#endif /* CONFIG_MACH_AMS_DELTA */ - -#endif /* __ASM_ARCH_OMAP_AMS_DELTA_H */ diff --git a/arch/arm/plat-omap/include/plat/board-sx1.h b/arch/arm/plat-omap/include/plat/board-sx1.h deleted file mode 100644 index 355adbdaae3..00000000000 --- a/arch/arm/plat-omap/include/plat/board-sx1.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Siemens SX1 board definitions - * - * Copyright: Vovan888 at gmail com - * - * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef __ASM_ARCH_SX1_I2C_CHIPS_H -#define __ASM_ARCH_SX1_I2C_CHIPS_H - -#define SOFIA_MAX_LIGHT_VAL	0x2B - -#define SOFIA_I2C_ADDR		0x32 -/* Sofia reg 3 bits masks */ -#define SOFIA_POWER1_REG	0x03 - -#define	SOFIA_USB_POWER		0x01 -#define	SOFIA_MMC_POWER		0x04 -#define	SOFIA_BLUETOOTH_POWER	0x08 -#define	SOFIA_MMILIGHT_POWER	0x20 - -#define SOFIA_POWER2_REG	0x04 -#define SOFIA_BACKLIGHT_REG	0x06 -#define SOFIA_KEYLIGHT_REG	0x07 -#define SOFIA_DIMMING_REG	0x09 - - -/* Function Prototypes for SX1 devices control on I2C bus */ - -int sx1_setbacklight(u8 backlight); -int sx1_getbacklight(u8 *backlight); -int sx1_setkeylight(u8 keylight); -int sx1_getkeylight(u8 *keylight); - -int sx1_setmmipower(u8 onoff); -int sx1_setusbpower(u8 onoff); -int sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value); -int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value); - -/* MMC prototypes */ - -extern void sx1_mmc_init(void); -extern void sx1_mmc_slot_cover_handler(void *arg, int state); - -#endif /* __ASM_ARCH_SX1_I2C_CHIPS_H */ diff --git a/arch/arm/plat-omap/include/plat/board-voiceblue.h b/arch/arm/plat-omap/include/plat/board-voiceblue.h deleted file mode 100644 index 27916b210f5..00000000000 --- a/arch/arm/plat-omap/include/plat/board-voiceblue.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2004 2N Telekomunikace, Ladislav Michl <michl@2n.cz> - * - * Hardware definitions for OMAP5910 based VoiceBlue board. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARCH_VOICEBLUE_H -#define __ASM_ARCH_VOICEBLUE_H - -extern void voiceblue_wdt_enable(void); -extern void voiceblue_wdt_disable(void); -extern void voiceblue_wdt_ping(void); - -#endif /*  __ASM_ARCH_VOICEBLUE_H */ - diff --git a/arch/arm/plat-omap/include/plat/board.h b/arch/arm/plat-omap/include/plat/board.h deleted file mode 100644 index 3cf4fa25ab3..00000000000 --- a/arch/arm/plat-omap/include/plat/board.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/board.h - * - *  Information structures for board-specific data - * - *  Copyright (C) 2004	Nokia Corporation - *  Written by Juha Yrjölä <juha.yrjola@nokia.com> - */ - -#ifndef _OMAP_BOARD_H -#define _OMAP_BOARD_H - -#include <linux/types.h> - -#include <plat/gpio-switch.h> - -/* - * OMAP35x EVM revision - * Run time detection of EVM revision is done by reading Ethernet - * PHY ID - - *	GEN_1	= 0x01150000 - *	GEN_2	= 0x92200000 - */ -enum { -	OMAP3EVM_BOARD_GEN_1 = 0,	/* EVM Rev between  A - D */ -	OMAP3EVM_BOARD_GEN_2,		/* EVM Rev >= Rev E */ -}; - -/* Different peripheral ids */ -#define OMAP_TAG_CLOCK		0x4f01 -#define OMAP_TAG_LCD		0x4f05 -#define OMAP_TAG_GPIO_SWITCH	0x4f06 -#define OMAP_TAG_FBMEM		0x4f08 -#define OMAP_TAG_STI_CONSOLE	0x4f09 -#define OMAP_TAG_CAMERA_SENSOR	0x4f0a - -#define OMAP_TAG_BOOT_REASON    0x4f80 -#define OMAP_TAG_FLASH_PART	0x4f81 -#define OMAP_TAG_VERSION_STR	0x4f82 - -struct omap_clock_config { -	/* 0 for 12 MHz, 1 for 13 MHz and 2 for 19.2 MHz */ -	u8 system_clock_type; -}; - -struct omap_serial_console_config { -	u8 console_uart; -	u32 console_speed; -}; - -struct omap_sti_console_config { -	unsigned enable:1; -	u8 channel; -}; - -struct omap_camera_sensor_config { -	u16 reset_gpio; -	int (*power_on)(void * data); -	int (*power_off)(void * data); -}; - -struct omap_usb_config { -	/* Configure drivers according to the connectors on your board: -	 *  - "A" connector (rectagular) -	 *	... for host/OHCI use, set "register_host". -	 *  - "B" connector (squarish) or "Mini-B" -	 *	... for device/gadget use, set "register_dev". -	 *  - "Mini-AB" connector (very similar to Mini-B) -	 *	... for OTG use as device OR host, initialize "otg" -	 */ -	unsigned	register_host:1; -	unsigned	register_dev:1; -	u8		otg;	/* port number, 1-based:  usb1 == 2 */ - -	u8		hmc_mode; - -	/* implicitly true if otg:  host supports remote wakeup? */ -	u8		rwc; - -	/* signaling pins used to talk to transceiver on usbN: -	 *  0 == usbN unused -	 *  2 == usb0-only, using internal transceiver -	 *  3 == 3 wire bidirectional -	 *  4 == 4 wire bidirectional -	 *  6 == 6 wire unidirectional (or TLL) -	 */ -	u8		pins[3]; - -	struct platform_device *udc_device; -	struct platform_device *ohci_device; -	struct platform_device *otg_device; - -	u32 (*usb0_init)(unsigned nwires, unsigned is_device); -	u32 (*usb1_init)(unsigned nwires); -	u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); -}; - -struct omap_lcd_config { -	char panel_name[16]; -	char ctrl_name[16]; -	s16  nreset_gpio; -	u8   data_lines; -}; - -struct device; -struct fb_info; -struct omap_backlight_config { -	int default_intensity; -	int (*set_power)(struct device *dev, int state); -}; - -struct omap_fbmem_config { -	u32 start; -	u32 size; -}; - -struct omap_pwm_led_platform_data { -	const char *name; -	int intensity_timer; -	int blink_timer; -	void (*set_power)(struct omap_pwm_led_platform_data *self, int on_off); -}; - -struct omap_uart_config { -	/* Bit field of UARTs present; bit 0 --> UART1 */ -	unsigned int enabled_uarts; -}; - - -struct omap_flash_part_config { -	char part_table[0]; -}; - -struct omap_boot_reason_config { -	char reason_str[12]; -}; - -struct omap_version_config { -	char component[12]; -	char version[12]; -}; - -struct omap_board_config_entry { -	u16 tag; -	u16 len; -	u8  data[0]; -}; - -struct omap_board_config_kernel { -	u16 tag; -	const void *data; -}; - -extern const void *__omap_get_config(u16 tag, size_t len, int nr); - -#define omap_get_config(tag, type) \ -	((const type *) __omap_get_config((tag), sizeof(type), 0)) -#define omap_get_nr_config(tag, type, nr) \ -	((const type *) __omap_get_config((tag), sizeof(type), (nr))) - -extern const void *omap_get_var_config(u16 tag, size_t *len); - -extern struct omap_board_config_kernel *omap_board_config; -extern int omap_board_config_size; - - -/* for TI reference platforms sharing the same debug card */ -extern int debug_card_init(u32 addr, unsigned gpio); - -/* OMAP3EVM revision */ -#if defined(CONFIG_MACH_OMAP3EVM) -u8 get_omap3_evm_rev(void); -#else -#define get_omap3_evm_rev() (-EINVAL) -#endif -#endif diff --git a/arch/arm/plat-omap/include/plat/clkdev.h b/arch/arm/plat-omap/include/plat/clkdev.h deleted file mode 100644 index 730c49d1ebd..00000000000 --- a/arch/arm/plat-omap/include/plat/clkdev.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __MACH_CLKDEV_H -#define __MACH_CLKDEV_H - -static inline int __clk_get(struct clk *clk) -{ -	return 1; -} - -static inline void __clk_put(struct clk *clk) -{ -} - -#endif diff --git a/arch/arm/plat-omap/include/plat/clkdev_omap.h b/arch/arm/plat-omap/include/plat/clkdev_omap.h deleted file mode 100644 index bb937f3fabe..00000000000 --- a/arch/arm/plat-omap/include/plat/clkdev_omap.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * clkdev <-> OMAP integration - * - * Russell King <linux@arm.linux.org.uk> - * - */ - -#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H -#define __ARCH_ARM_PLAT_OMAP_INCLUDE_PLAT_CLKDEV_OMAP_H - -#include <asm/clkdev.h> - -struct omap_clk { -	u16				cpu; -	struct clk_lookup		lk; -}; - -#define CLK(dev, con, ck, cp) 		\ -	{				\ -		 .cpu = cp,		\ -		.lk = {			\ -			.dev_id = dev,	\ -			.con_id = con,	\ -			.clk = ck,	\ -		},			\ -	} - -/* Platform flags for the clkdev-OMAP integration code */ -#define CK_310		(1 << 0) -#define CK_7XX		(1 << 1)	/* 7xx, 850 */ -#define CK_1510		(1 << 2) -#define CK_16XX		(1 << 3)	/* 16xx, 17xx, 5912 */ -#define CK_242X		(1 << 4) -#define CK_243X		(1 << 5) -#define CK_3XXX		(1 << 6)	/* OMAP3 + AM3 common clocks*/ -#define CK_343X		(1 << 7)	/* OMAP34xx common clocks */ -#define CK_3430ES1	(1 << 8)	/* 34xxES1 only */ -#define CK_3430ES2	(1 << 9)	/* 34xxES2, ES3, non-Sitara 35xx only */ -#define CK_3505		(1 << 10) -#define CK_3517		(1 << 11) -#define CK_36XX		(1 << 12)	/* OMAP36xx/37xx-specific clocks */ -#define CK_443X		(1 << 13) - -#define CK_AM35XX	(CK_3505 | CK_3517)	/* all Sitara AM35xx */ - - - -#endif - diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h deleted file mode 100644 index fef4696dcf6..00000000000 --- a/arch/arm/plat-omap/include/plat/clock.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - * OMAP clock: data structure definitions, function prototypes, shared macros - * - * Copyright (C) 2004-2005, 2008-2010 Nokia Corporation - * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> - * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ARCH_ARM_OMAP_CLOCK_H -#define __ARCH_ARM_OMAP_CLOCK_H - -#include <linux/list.h> - -struct module; -struct clk; -struct clockdomain; - -/** - * struct clkops - some clock function pointers - * @enable: fn ptr that enables the current clock in hardware - * @disable: fn ptr that enables the current clock in hardware - * @find_idlest: function returning the IDLEST register for the clock's IP blk - * @find_companion: function returning the "companion" clk reg for the clock - * - * A "companion" clk is an accompanying clock to the one being queried - * that must be enabled for the IP module connected to the clock to - * become accessible by the hardware.  Neither @find_idlest nor - * @find_companion should be needed; that information is IP - * block-specific; the hwmod code has been created to handle this, but - * until hwmod data is ready and drivers have been converted to use PM - * runtime calls in place of clk_enable()/clk_disable(), @find_idlest and - * @find_companion must, unfortunately, remain. - */ -struct clkops { -	int			(*enable)(struct clk *); -	void			(*disable)(struct clk *); -	void			(*find_idlest)(struct clk *, void __iomem **, -					       u8 *, u8 *); -	void			(*find_companion)(struct clk *, void __iomem **, -						  u8 *); -}; - -#ifdef CONFIG_ARCH_OMAP2PLUS - -/* struct clksel_rate.flags possibilities */ -#define RATE_IN_242X		(1 << 0) -#define RATE_IN_243X		(1 << 1) -#define RATE_IN_3XXX		(1 << 2)	/* rates common to all OMAP3 */ -#define RATE_IN_3430ES2		(1 << 3)	/* 3430ES2 rates only */ -#define RATE_IN_36XX		(1 << 4) -#define RATE_IN_4430		(1 << 5) - -#define RATE_IN_24XX		(RATE_IN_242X | RATE_IN_243X) -#define RATE_IN_3430ES2PLUS	(RATE_IN_3430ES2 | RATE_IN_36XX) - -/** - * struct clksel_rate - register bitfield values corresponding to clk divisors - * @val: register bitfield value (shifted to bit 0) - * @div: clock divisor corresponding to @val - * @flags: (see "struct clksel_rate.flags possibilities" above) - * - * @val should match the value of a read from struct clk.clksel_reg - * AND'ed with struct clk.clksel_mask, shifted right to bit 0. - * - * @div is the divisor that should be applied to the parent clock's rate - * to produce the current clock's rate. - * - * XXX @flags probably should be replaced with an struct omap_chip. - */ -struct clksel_rate { -	u32			val; -	u8			div; -	u8			flags; -}; - -/** - * struct clksel - available parent clocks, and a pointer to their divisors - * @parent: struct clk * to a possible parent clock - * @rates: available divisors for this parent clock - * - * A struct clksel is always associated with one or more struct clks - * and one or more struct clksel_rates. - */ -struct clksel { -	struct clk		 *parent; -	const struct clksel_rate *rates; -}; - -/** - * struct dpll_data - DPLL registers and integration data - * @mult_div1_reg: register containing the DPLL M and N bitfields - * @mult_mask: mask of the DPLL M bitfield in @mult_div1_reg - * @div1_mask: mask of the DPLL N bitfield in @mult_div1_reg - * @clk_bypass: struct clk pointer to the clock's bypass clock input - * @clk_ref: struct clk pointer to the clock's reference clock input - * @control_reg: register containing the DPLL mode bitfield - * @enable_mask: mask of the DPLL mode bitfield in @control_reg - * @rate_tolerance: maximum variance allowed from target rate (in Hz) - * @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate() - * @last_rounded_m: cache of the last M result of omap2_dpll_round_rate() - * @max_multiplier: maximum valid non-bypass multiplier value (actual) - * @last_rounded_n: cache of the last N result of omap2_dpll_round_rate() - * @min_divider: minimum valid non-bypass divider value (actual) - * @max_divider: maximum valid non-bypass divider value (actual) - * @modes: possible values of @enable_mask - * @autoidle_reg: register containing the DPLL autoidle mode bitfield - * @idlest_reg: register containing the DPLL idle status bitfield - * @autoidle_mask: mask of the DPLL autoidle mode bitfield in @autoidle_reg - * @freqsel_mask: mask of the DPLL jitter correction bitfield in @control_reg - * @idlest_mask: mask of the DPLL idle status bitfield in @idlest_reg - * @auto_recal_bit: bitshift of the driftguard enable bit in @control_reg - * @recal_en_bit: bitshift of the PRM_IRQENABLE_* bit for recalibration IRQs - * @recal_st_bit: bitshift of the PRM_IRQSTATUS_* bit for recalibration IRQs - * @flags: DPLL type/features (see below) - * - * Possible values for @flags: - * DPLL_J_TYPE: "J-type DPLL" (only some 36xx, 4xxx DPLLs) - * NO_DCO_SEL: don't program DCO (only for some J-type DPLLs) - - * @freqsel_mask is only used on the OMAP34xx family and AM35xx. - * - * XXX Some DPLLs have multiple bypass inputs, so it's not technically - * correct to only have one @clk_bypass pointer. - * - * XXX @rate_tolerance should probably be deprecated - currently there - * don't seem to be any usecases for DPLL rounding that is not exact. - * - * XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m, - * @last_rounded_n) should be separated from the runtime-fixed fields - * and placed into a differenct structure, so that the runtime-fixed data - * can be placed into read-only space. - */ -struct dpll_data { -	void __iomem		*mult_div1_reg; -	u32			mult_mask; -	u32			div1_mask; -	struct clk		*clk_bypass; -	struct clk		*clk_ref; -	void __iomem		*control_reg; -	u32			enable_mask; -	unsigned int		rate_tolerance; -	unsigned long		last_rounded_rate; -	u16			last_rounded_m; -	u16			max_multiplier; -	u8			last_rounded_n; -	u8			min_divider; -	u8			max_divider; -	u8			modes; -#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) -	void __iomem		*autoidle_reg; -	void __iomem		*idlest_reg; -	u32			autoidle_mask; -	u32			freqsel_mask; -	u32			idlest_mask; -	u8			auto_recal_bit; -	u8			recal_en_bit; -	u8			recal_st_bit; -	u8			flags; -#  endif -}; - -#endif - -/* struct clk.flags possibilities */ -#define ENABLE_REG_32BIT	(1 << 0)	/* Use 32-bit access */ -#define CLOCK_IDLE_CONTROL	(1 << 1) -#define CLOCK_NO_IDLE_PARENT	(1 << 2) -#define ENABLE_ON_INIT		(1 << 3)	/* Enable upon framework init */ -#define INVERT_ENABLE		(1 << 4)	/* 0 enables, 1 disables */ - -/** - * struct clk - OMAP struct clk - * @node: list_head connecting this clock into the full clock list - * @ops: struct clkops * for this clock - * @name: the name of the clock in the hardware (used in hwmod data and debug) - * @parent: pointer to this clock's parent struct clk - * @children: list_head connecting to the child clks' @sibling list_heads - * @sibling: list_head connecting this clk to its parent clk's @children - * @rate: current clock rate - * @enable_reg: register to write to enable the clock (see @enable_bit) - * @recalc: fn ptr that returns the clock's current rate - * @set_rate: fn ptr that can change the clock's current rate - * @round_rate: fn ptr that can round the clock's current rate - * @init: fn ptr to do clock-specific initialization - * @enable_bit: bitshift to write to enable/disable the clock (see @enable_reg) - * @usecount: number of users that have requested this clock to be enabled - * @fixed_div: when > 0, this clock's rate is its parent's rate / @fixed_div - * @flags: see "struct clk.flags possibilities" above - * @clksel_reg: for clksel clks, register va containing src/divisor select - * @clksel_mask: bitmask in @clksel_reg for the src/divisor selector - * @clksel: for clksel clks, pointer to struct clksel for this clock - * @dpll_data: for DPLLs, pointer to struct dpll_data for this clock - * @clkdm_name: clockdomain name that this clock is contained in - * @clkdm: pointer to struct clockdomain, resolved from @clkdm_name at runtime - * @rate_offset: bitshift for rate selection bitfield (OMAP1 only) - * @src_offset: bitshift for source selection bitfield (OMAP1 only) - * - * XXX @rate_offset, @src_offset should probably be removed and OMAP1 - * clock code converted to use clksel. - * - * XXX @usecount is poorly named.  It should be "enable_count" or - * something similar.  "users" in the description refers to kernel - * code (core code or drivers) that have called clk_enable() and not - * yet called clk_disable(); the usecount of parent clocks is also - * incremented by the clock code when clk_enable() is called on child - * clocks and decremented by the clock code when clk_disable() is - * called on child clocks. - * - * XXX @clkdm, @usecount, @children, @sibling should be marked for - * internal use only. - * - * @children and @sibling are used to optimize parent-to-child clock - * tree traversals.  (child-to-parent traversals use @parent.) - * - * XXX The notion of the clock's current rate probably needs to be - * separated from the clock's target rate. - */ -struct clk { -	struct list_head	node; -	const struct clkops	*ops; -	const char		*name; -	struct clk		*parent; -	struct list_head	children; -	struct list_head	sibling;	/* node for children */ -	unsigned long		rate; -	void __iomem		*enable_reg; -	unsigned long		(*recalc)(struct clk *); -	int			(*set_rate)(struct clk *, unsigned long); -	long			(*round_rate)(struct clk *, unsigned long); -	void			(*init)(struct clk *); -	u8			enable_bit; -	s8			usecount; -	u8			fixed_div; -	u8			flags; -#ifdef CONFIG_ARCH_OMAP2PLUS -	void __iomem		*clksel_reg; -	u32			clksel_mask; -	const struct clksel	*clksel; -	struct dpll_data	*dpll_data; -	const char		*clkdm_name; -	struct clockdomain	*clkdm; -#else -	u8			rate_offset; -	u8			src_offset; -#endif -#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) -	struct dentry		*dent;	/* For visible tree hierarchy */ -#endif -}; - -struct cpufreq_frequency_table; - -struct clk_functions { -	int		(*clk_enable)(struct clk *clk); -	void		(*clk_disable)(struct clk *clk); -	long		(*clk_round_rate)(struct clk *clk, unsigned long rate); -	int		(*clk_set_rate)(struct clk *clk, unsigned long rate); -	int		(*clk_set_parent)(struct clk *clk, struct clk *parent); -	void		(*clk_allow_idle)(struct clk *clk); -	void		(*clk_deny_idle)(struct clk *clk); -	void		(*clk_disable_unused)(struct clk *clk); -#ifdef CONFIG_CPU_FREQ -	void		(*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); -	void		(*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **); -#endif -}; - -extern int mpurate; - -extern int clk_init(struct clk_functions *custom_clocks); -extern void clk_preinit(struct clk *clk); -extern int clk_register(struct clk *clk); -extern void clk_reparent(struct clk *child, struct clk *parent); -extern void clk_unregister(struct clk *clk); -extern void propagate_rate(struct clk *clk); -extern void recalculate_root_clocks(void); -extern unsigned long followparent_recalc(struct clk *clk); -extern void clk_enable_init_clocks(void); -unsigned long omap_fixed_divisor_recalc(struct clk *clk); -#ifdef CONFIG_CPU_FREQ -extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); -extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); -#endif -extern struct clk *omap_clk_get_by_name(const char *name); - -extern const struct clkops clkops_null; - -extern struct clk dummy_ck; - -#endif diff --git a/arch/arm/plat-omap/include/plat/clockdomain.h b/arch/arm/plat-omap/include/plat/clockdomain.h deleted file mode 100644 index ba0a6c07c0f..00000000000 --- a/arch/arm/plat-omap/include/plat/clockdomain.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/clockdomain.h - * - * OMAP2/3 clockdomain framework functions - * - * Copyright (C) 2008 Texas Instruments, Inc. - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by 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. - */ - -#ifndef __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H -#define __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H - -#include <plat/powerdomain.h> -#include <plat/clock.h> -#include <plat/cpu.h> - -/* Clockdomain capability flags */ -#define CLKDM_CAN_FORCE_SLEEP			(1 << 0) -#define CLKDM_CAN_FORCE_WAKEUP			(1 << 1) -#define CLKDM_CAN_ENABLE_AUTO			(1 << 2) -#define CLKDM_CAN_DISABLE_AUTO			(1 << 3) - -#define CLKDM_CAN_HWSUP		(CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) -#define CLKDM_CAN_SWSUP		(CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) -#define CLKDM_CAN_HWSUP_SWSUP	(CLKDM_CAN_SWSUP | CLKDM_CAN_HWSUP) - -/* OMAP24XX CM_CLKSTCTRL_*.AUTOSTATE_* register bit values */ -#define OMAP24XX_CLKSTCTRL_DISABLE_AUTO		0x0 -#define OMAP24XX_CLKSTCTRL_ENABLE_AUTO		0x1 - -/* OMAP3XXX CM_CLKSTCTRL_*.CLKTRCTRL_* register bit values */ -#define OMAP34XX_CLKSTCTRL_DISABLE_AUTO		0x0 -#define OMAP34XX_CLKSTCTRL_FORCE_SLEEP		0x1 -#define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP		0x2 -#define OMAP34XX_CLKSTCTRL_ENABLE_AUTO		0x3 - -/** - * struct clkdm_autodep - clkdm deps to add when entering/exiting hwsup mode - * @clkdm: clockdomain to add wkdep+sleepdep on - set name member only - * @omap_chip: OMAP chip types that this autodep is valid on - * - * A clockdomain that should have wkdeps and sleepdeps added when a - * clockdomain should stay active in hwsup mode; and conversely, - * removed when the clockdomain should be allowed to go inactive in - * hwsup mode. - * - * Autodeps are deprecated and should be removed after - * omap_hwmod-based fine-grained module idle control is added. - */ -struct clkdm_autodep { -	union { -		const char *name; -		struct clockdomain *ptr; -	} clkdm; -	const struct omap_chip_id omap_chip; -}; - -/** - * struct clkdm_dep - encode dependencies between clockdomains - * @clkdm_name: clockdomain name - * @clkdm: pointer to the struct clockdomain of @clkdm_name - * @omap_chip: OMAP chip types that this dependency is valid on - * @wkdep_usecount: Number of wakeup dependencies causing this clkdm to wake - * @sleepdep_usecount: Number of sleep deps that could prevent clkdm from idle - * - * Statically defined.  @clkdm is resolved from @clkdm_name at runtime and - * should not be pre-initialized. - * - * XXX Should also include hardware (fixed) dependencies. - */ -struct clkdm_dep { -	const char *clkdm_name; -	struct clockdomain *clkdm; -	atomic_t wkdep_usecount; -	atomic_t sleepdep_usecount; -	const struct omap_chip_id omap_chip; -}; - -/** - * struct clockdomain - OMAP clockdomain - * @name: clockdomain name - * @pwrdm: powerdomain containing this clockdomain - * @clktrctrl_reg: CLKSTCTRL reg for the given clock domain - * @clktrctrl_mask: CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg - * @flags: Clockdomain capability flags - * @dep_bit: Bit shift of this clockdomain's PM_WKDEP/CM_SLEEPDEP bit - * @wkdep_srcs: Clockdomains that can be told to wake this powerdomain up - * @sleepdep_srcs: Clockdomains that can be told to keep this clkdm from inact - * @omap_chip: OMAP chip types that this clockdomain is valid on - * @usecount: Usecount tracking - * @node: list_head to link all clockdomains together - */ -struct clockdomain { -	const char *name; -	union { -		const char *name; -		struct powerdomain *ptr; -	} pwrdm; -	void __iomem *clkstctrl_reg; -	const u16 clktrctrl_mask; -	const u8 flags; -	const u8 dep_bit; -	struct clkdm_dep *wkdep_srcs; -	struct clkdm_dep *sleepdep_srcs; -	const struct omap_chip_id omap_chip; -	atomic_t usecount; -	struct list_head node; -}; - -void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps); -struct clockdomain *clkdm_lookup(const char *name); - -int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), -			void *user); -struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm); - -int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_clear_all_wkdeps(struct clockdomain *clkdm); -int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); -int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); - -void omap2_clkdm_allow_idle(struct clockdomain *clkdm); -void omap2_clkdm_deny_idle(struct clockdomain *clkdm); - -int omap2_clkdm_wakeup(struct clockdomain *clkdm); -int omap2_clkdm_sleep(struct clockdomain *clkdm); - -int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); -int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); - -#endif diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h deleted file mode 100644 index a9d69a09920..00000000000 --- a/arch/arm/plat-omap/include/plat/common.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/common.h - * - * Header for code common to all OMAP machines. - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ARCH_ARM_MACH_OMAP_COMMON_H -#define __ARCH_ARM_MACH_OMAP_COMMON_H - -#include <plat/i2c.h> - -struct sys_timer; - -extern void omap_map_common_io(void); -extern struct sys_timer omap_timer; - -extern void omap_reserve(void); - -/* - * 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 */ -	unsigned long   sdrc;           /* SDRAM Controller */ -	unsigned long   sms;            /* SDRAM Memory Scheduler */ -	unsigned long   ctrl;           /* System Control Module */ -	unsigned long   ctrl_pad;	/* PAD Control Module */ -	unsigned long   prm;            /* Power and Reset Management */ -	unsigned long   cm;             /* Clock Management */ -	unsigned long   cm2; -	unsigned long	uart1_phys; -	unsigned long	uart2_phys; -	unsigned long	uart3_phys; -	unsigned long	uart4_phys; -}; - -void omap2_set_globals_242x(void); -void omap2_set_globals_243x(void); -void omap2_set_globals_3xxx(void); -void omap2_set_globals_443x(void); - -/* These get called from omap2_set_globals_xxxx(), do not call these */ -void omap2_set_globals_tap(struct omap_globals *); -void omap2_set_globals_sdrc(struct omap_globals *); -void omap2_set_globals_control(struct omap_globals *); -void omap2_set_globals_prcm(struct omap_globals *); - -void omap3_map_io(void); - -/** - * omap_test_timeout - busy-loop, testing a condition - * @cond: condition to test until it evaluates to true - * @timeout: maximum number of microseconds in the timeout - * @index: loop index (integer) - * - * Loop waiting for @cond to become true or until at least @timeout - * microseconds have passed.  To use, define some integer @index in the - * calling code.  After running, if @index == @timeout, then the loop has - * timed out. - */ -#define omap_test_timeout(cond, timeout, index)			\ -({								\ -	for (index = 0; index < timeout; index++) {		\ -		if (cond)					\ -			break;					\ -		udelay(1);					\ -	}							\ -}) - -extern struct device *omap2_get_mpuss_device(void); -extern struct device *omap2_get_iva_device(void); -extern struct device *omap2_get_l3_device(void); -extern struct device *omap4_get_dsp_device(void); - -#endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ diff --git a/arch/arm/plat-omap/include/plat/counter-32k.h b/arch/arm/plat-omap/include/plat/counter-32k.h new file mode 100644 index 00000000000..da000d482ff --- /dev/null +++ b/arch/arm/plat-omap/include/plat/counter-32k.h @@ -0,0 +1 @@ +int omap_init_clocksource_32k(void __iomem *vbase); diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index 3fd8b405572..c9a66bf36c9 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h @@ -1,15 +1,13 @@  /* - * arch/arm/plat-omap/include/mach/cpu.h - *   * OMAP cpu type detection   *   * Copyright (C) 2004, 2008 Nokia Corporation   * - * Copyright (C) 2009 Texas Instruments. + * Copyright (C) 2009-11 Texas Instruments.   *   * Written by Tony Lindgren <tony.lindgren@nokia.com>   * - * Added OMAP4 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com> + * Added OMAP4/5 specific defines - 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 as published by @@ -30,444 +28,8 @@  #ifndef __ASM_ARCH_OMAP_CPU_H  #define __ASM_ARCH_OMAP_CPU_H -#include <linux/bitops.h> -#include <plat/multi.h> - -/* - * Omap device type i.e. EMU/HS/TST/GP/BAD - */ -#define OMAP2_DEVICE_TYPE_TEST		0 -#define OMAP2_DEVICE_TYPE_EMU		1 -#define OMAP2_DEVICE_TYPE_SEC		2 -#define OMAP2_DEVICE_TYPE_GP		3 -#define OMAP2_DEVICE_TYPE_BAD		4 - -int omap_type(void); - -struct omap_chip_id { -	u16 oc; -	u8 type; -}; - -#define OMAP_CHIP_INIT(x)	{ .oc = x } - -/* - * omap_rev bits: - * CPU id bits	(0730, 1510, 1710, 2422...)	[31:16] - * CPU revision	(See _REV_ defined in cpu.h)	[15:08] - * CPU class bits (15xx, 16xx, 24xx, 34xx...)	[07:00] - */ -unsigned int omap_rev(void); - -/* - * Define CPU revision bits - * - * Verbose meaning of the revision bits may be different for a silicon - * family. This difference can be handled separately. - */ -#define OMAP_REVBITS_00		0x00 -#define OMAP_REVBITS_01		0x01 -#define OMAP_REVBITS_02		0x02 -#define OMAP_REVBITS_03		0x03 -#define OMAP_REVBITS_04		0x04 -#define OMAP_REVBITS_05		0x05 - -/* - * Get the CPU revision for OMAP devices - */ -#define GET_OMAP_REVISION()	((omap_rev() >> 8) & 0xff) - -/* - * Macros to group OMAP into cpu classes. - * These can be used in most places. - * cpu_is_omap7xx():	True for OMAP730, OMAP850 - * cpu_is_omap15xx():	True for OMAP1510, OMAP5910 and OMAP310 - * cpu_is_omap16xx():	True for OMAP1610, OMAP5912 and OMAP1710 - * cpu_is_omap24xx():	True for OMAP2420, OMAP2422, OMAP2423, OMAP2430 - * cpu_is_omap242x():	True for OMAP2420, OMAP2422, OMAP2423 - * cpu_is_omap243x():	True for OMAP2430 - * cpu_is_omap343x():	True for OMAP3430 - * cpu_is_omap443x():	True for OMAP4430 - */ -#define GET_OMAP_CLASS	(omap_rev() & 0xff) - -#define IS_OMAP_CLASS(class, id)			\ -static inline int is_omap ##class (void)		\ -{							\ -	return (GET_OMAP_CLASS == (id)) ? 1 : 0;	\ -} - -#define GET_OMAP_SUBCLASS	((omap_rev() >> 20) & 0x0fff) - -#define IS_OMAP_SUBCLASS(subclass, id)			\ -static inline int is_omap ##subclass (void)		\ -{							\ -	return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;	\ -} - -IS_OMAP_CLASS(7xx, 0x07) -IS_OMAP_CLASS(15xx, 0x15) -IS_OMAP_CLASS(16xx, 0x16) -IS_OMAP_CLASS(24xx, 0x24) -IS_OMAP_CLASS(34xx, 0x34) -IS_OMAP_CLASS(44xx, 0x44) - -IS_OMAP_SUBCLASS(242x, 0x242) -IS_OMAP_SUBCLASS(243x, 0x243) -IS_OMAP_SUBCLASS(343x, 0x343) -IS_OMAP_SUBCLASS(363x, 0x363) -IS_OMAP_SUBCLASS(443x, 0x443) - -#define cpu_is_omap7xx()		0 -#define cpu_is_omap15xx()		0 -#define cpu_is_omap16xx()		0 -#define cpu_is_omap24xx()		0 -#define cpu_is_omap242x()		0 -#define cpu_is_omap243x()		0 -#define cpu_is_omap34xx()		0 -#define cpu_is_omap343x()		0 -#define cpu_is_omap44xx()		0 -#define cpu_is_omap443x()		0 - -#if defined(MULTI_OMAP1) -# if defined(CONFIG_ARCH_OMAP730) -#  undef  cpu_is_omap7xx -#  define cpu_is_omap7xx()		is_omap7xx() -# endif -# if defined(CONFIG_ARCH_OMAP850) -#  undef  cpu_is_omap7xx -#  define cpu_is_omap7xx()		is_omap7xx() -# endif -# if defined(CONFIG_ARCH_OMAP15XX) -#  undef  cpu_is_omap15xx -#  define cpu_is_omap15xx()		is_omap15xx() -# endif -# if defined(CONFIG_ARCH_OMAP16XX) -#  undef  cpu_is_omap16xx -#  define cpu_is_omap16xx()		is_omap16xx() -# endif -#else -# if defined(CONFIG_ARCH_OMAP730) -#  undef  cpu_is_omap7xx -#  define cpu_is_omap7xx()		1 -# endif -# if defined(CONFIG_ARCH_OMAP850) -#  undef  cpu_is_omap7xx -#  define cpu_is_omap7xx()		1 -# endif -# if defined(CONFIG_ARCH_OMAP15XX) -#  undef  cpu_is_omap15xx -#  define cpu_is_omap15xx()		1 -# endif -# if defined(CONFIG_ARCH_OMAP16XX) -#  undef  cpu_is_omap16xx -#  define cpu_is_omap16xx()		1 -# endif +#ifdef CONFIG_ARCH_OMAP1 +#include <mach/soc.h>  #endif -#if defined(MULTI_OMAP2) -# if defined(CONFIG_ARCH_OMAP2) -#  undef  cpu_is_omap24xx -#  define cpu_is_omap24xx()		is_omap24xx() -# endif -# if defined (CONFIG_ARCH_OMAP2420) -#  undef  cpu_is_omap242x -#  define cpu_is_omap242x()		is_omap242x() -# endif -# if defined (CONFIG_ARCH_OMAP2430) -#  undef  cpu_is_omap243x -#  define cpu_is_omap243x()		is_omap243x() -# endif -# if defined(CONFIG_ARCH_OMAP3) -#  undef  cpu_is_omap34xx -#  undef  cpu_is_omap343x -#  define cpu_is_omap34xx()		is_omap34xx() -#  define cpu_is_omap343x()		is_omap343x() -# endif -#else -# if defined(CONFIG_ARCH_OMAP2) -#  undef  cpu_is_omap24xx -#  define cpu_is_omap24xx()		1 -# endif -# if defined(CONFIG_ARCH_OMAP2420) -#  undef  cpu_is_omap242x -#  define cpu_is_omap242x()		1 -# endif -# if defined(CONFIG_ARCH_OMAP2430) -#  undef  cpu_is_omap243x -#  define cpu_is_omap243x()		1 -# endif -# if defined(CONFIG_ARCH_OMAP3) -#  undef  cpu_is_omap34xx -#  define cpu_is_omap34xx()		1 -# endif -# if defined(CONFIG_ARCH_OMAP3430) -#  undef  cpu_is_omap343x -#  define cpu_is_omap343x()		1 -# endif -#endif - -/* - * Macros to detect individual cpu types. - * These are only rarely needed. - * cpu_is_omap330():	True for OMAP330 - * cpu_is_omap730():	True for OMAP730 - * cpu_is_omap850():	True for OMAP850 - * cpu_is_omap1510():	True for OMAP1510 - * cpu_is_omap1610():	True for OMAP1610 - * cpu_is_omap1611():	True for OMAP1611 - * cpu_is_omap5912():	True for OMAP5912 - * cpu_is_omap1621():	True for OMAP1621 - * cpu_is_omap1710():	True for OMAP1710 - * cpu_is_omap2420():	True for OMAP2420 - * cpu_is_omap2422():	True for OMAP2422 - * cpu_is_omap2423():	True for OMAP2423 - * cpu_is_omap2430():	True for OMAP2430 - * cpu_is_omap3430():	True for OMAP3430 - * cpu_is_omap4430():	True for OMAP4430 - * cpu_is_omap3505():	True for OMAP3505 - * cpu_is_omap3517():	True for OMAP3517 - */ -#define GET_OMAP_TYPE	((omap_rev() >> 16) & 0xffff) - -#define IS_OMAP_TYPE(type, id)				\ -static inline int is_omap ##type (void)			\ -{							\ -	return (GET_OMAP_TYPE == (id)) ? 1 : 0;		\ -} - -IS_OMAP_TYPE(310, 0x0310) -IS_OMAP_TYPE(730, 0x0730) -IS_OMAP_TYPE(850, 0x0850) -IS_OMAP_TYPE(1510, 0x1510) -IS_OMAP_TYPE(1610, 0x1610) -IS_OMAP_TYPE(1611, 0x1611) -IS_OMAP_TYPE(5912, 0x1611) -IS_OMAP_TYPE(1621, 0x1621) -IS_OMAP_TYPE(1710, 0x1710) -IS_OMAP_TYPE(2420, 0x2420) -IS_OMAP_TYPE(2422, 0x2422) -IS_OMAP_TYPE(2423, 0x2423) -IS_OMAP_TYPE(2430, 0x2430) -IS_OMAP_TYPE(3430, 0x3430) -IS_OMAP_TYPE(3505, 0x3505) -IS_OMAP_TYPE(3517, 0x3517) - -#define cpu_is_omap310()		0 -#define cpu_is_omap730()		0 -#define cpu_is_omap850()		0 -#define cpu_is_omap1510()		0 -#define cpu_is_omap1610()		0 -#define cpu_is_omap5912()		0 -#define cpu_is_omap1611()		0 -#define cpu_is_omap1621()		0 -#define cpu_is_omap1710()		0 -#define cpu_is_omap2420()		0 -#define cpu_is_omap2422()		0 -#define cpu_is_omap2423()		0 -#define cpu_is_omap2430()		0 -#define cpu_is_omap3503()		0 -#define cpu_is_omap3515()		0 -#define cpu_is_omap3525()		0 -#define cpu_is_omap3530()		0 -#define cpu_is_omap3505()		0 -#define cpu_is_omap3517()		0 -#define cpu_is_omap3430()		0 -#define cpu_is_omap4430()		0 -#define cpu_is_omap3630()		0 - -/* - * Whether we have MULTI_OMAP1 or not, we still need to distinguish - * between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710. - */ - -#if defined(CONFIG_ARCH_OMAP730) -# undef  cpu_is_omap730 -# define cpu_is_omap730()		is_omap730() -#endif - -#if defined(CONFIG_ARCH_OMAP850) -# undef  cpu_is_omap850 -# define cpu_is_omap850()		is_omap850() -#endif - -#if defined(CONFIG_ARCH_OMAP15XX) -# undef  cpu_is_omap310 -# undef  cpu_is_omap1510 -# define cpu_is_omap310()		is_omap310() -# define cpu_is_omap1510()		is_omap1510() -#endif - -#if defined(CONFIG_ARCH_OMAP16XX) -# undef  cpu_is_omap1610 -# undef  cpu_is_omap1611 -# undef  cpu_is_omap5912 -# undef  cpu_is_omap1621 -# undef  cpu_is_omap1710 -# define cpu_is_omap1610()		is_omap1610() -# define cpu_is_omap1611()		is_omap1611() -# define cpu_is_omap5912()		is_omap5912() -# define cpu_is_omap1621()		is_omap1621() -# define cpu_is_omap1710()		is_omap1710() -#endif - -#if defined(CONFIG_ARCH_OMAP2) -# undef  cpu_is_omap2420 -# undef  cpu_is_omap2422 -# undef  cpu_is_omap2423 -# undef  cpu_is_omap2430 -# define cpu_is_omap2420()		is_omap2420() -# define cpu_is_omap2422()		is_omap2422() -# define cpu_is_omap2423()		is_omap2423() -# define cpu_is_omap2430()		is_omap2430() -#endif - -#if defined(CONFIG_ARCH_OMAP3) -# undef cpu_is_omap3430 -# undef cpu_is_omap3503 -# undef cpu_is_omap3515 -# undef cpu_is_omap3525 -# undef cpu_is_omap3530 -# undef cpu_is_omap3505 -# undef cpu_is_omap3517 -# define cpu_is_omap3430()		is_omap3430() -# define cpu_is_omap3503()		(cpu_is_omap3430() &&		\ -						(!omap3_has_iva()) &&	\ -						(!omap3_has_sgx())) -# define cpu_is_omap3515()		(cpu_is_omap3430() &&		\ -						(!omap3_has_iva()) &&	\ -						(omap3_has_sgx())) -# define cpu_is_omap3525()		(cpu_is_omap3430() &&		\ -						(!omap3_has_sgx()) &&	\ -						(omap3_has_iva())) -# define cpu_is_omap3530()		(cpu_is_omap3430()) -# define cpu_is_omap3505()		is_omap3505() -# define cpu_is_omap3517()		is_omap3517() -# undef cpu_is_omap3630 -# define cpu_is_omap3630()		is_omap363x() -#endif - -# if defined(CONFIG_ARCH_OMAP4) -# undef cpu_is_omap44xx -# undef cpu_is_omap443x -# define cpu_is_omap44xx()		is_omap44xx() -# define cpu_is_omap443x()		is_omap443x() -# endif - -/* Macros to detect if we have OMAP1 or OMAP2 */ -#define cpu_class_is_omap1()	(cpu_is_omap7xx() || cpu_is_omap15xx() || \ -				cpu_is_omap16xx()) -#define cpu_class_is_omap2()	(cpu_is_omap24xx() || cpu_is_omap34xx() || \ -				cpu_is_omap44xx()) - -/* Various silicon revisions for omap2 */ -#define OMAP242X_CLASS		0x24200024 -#define OMAP2420_REV_ES1_0	OMAP242X_CLASS -#define OMAP2420_REV_ES2_0	(OMAP242X_CLASS | (OMAP_REVBITS_01 << 8)) - -#define OMAP243X_CLASS		0x24300024 -#define OMAP2430_REV_ES1_0	OMAP243X_CLASS - -#define OMAP343X_CLASS		0x34300034 -#define OMAP3430_REV_ES1_0	OMAP343X_CLASS -#define OMAP3430_REV_ES2_0	(OMAP343X_CLASS | (OMAP_REVBITS_01 << 8)) -#define OMAP3430_REV_ES2_1	(OMAP343X_CLASS | (OMAP_REVBITS_02 << 8)) -#define OMAP3430_REV_ES3_0	(OMAP343X_CLASS | (OMAP_REVBITS_03 << 8)) -#define OMAP3430_REV_ES3_1	(OMAP343X_CLASS | (OMAP_REVBITS_04 << 8)) -#define OMAP3430_REV_ES3_1_2	(OMAP343X_CLASS | (OMAP_REVBITS_05 << 8)) - -#define OMAP363X_CLASS		0x36300034 -#define OMAP3630_REV_ES1_0	OMAP363X_CLASS -#define OMAP3630_REV_ES1_1	(OMAP363X_CLASS | (OMAP_REVBITS_01 << 8)) -#define OMAP3630_REV_ES1_2	(OMAP363X_CLASS | (OMAP_REVBITS_02 << 8)) - -#define OMAP35XX_CLASS		0x35000034 -#define OMAP3503_REV(v)		(OMAP35XX_CLASS | (0x3503 << 16) | (v << 8)) -#define OMAP3515_REV(v)		(OMAP35XX_CLASS | (0x3515 << 16) | (v << 8)) -#define OMAP3525_REV(v)		(OMAP35XX_CLASS | (0x3525 << 16) | (v << 8)) -#define OMAP3530_REV(v)		(OMAP35XX_CLASS | (0x3530 << 16) | (v << 8)) -#define OMAP3505_REV(v)		(OMAP35XX_CLASS | (0x3505 << 16) | (v << 8)) -#define OMAP3517_REV(v)		(OMAP35XX_CLASS | (0x3517 << 16) | (v << 8)) - -#define OMAP443X_CLASS		0x44300044 -#define OMAP4430_REV_ES1_0	OMAP443X_CLASS -#define OMAP4430_REV_ES2_0	0x44301044 - -/* - * omap_chip bits - * - * CHIP_IS_OMAP{2420,2430,3430} indicate that a particular structure is - * valid on all chips of that type.  CHIP_IS_OMAP3430ES{1,2} indicates - * something that is only valid on that particular ES revision. - * - * These bits may be ORed together to indicate structures that are - * available on multiple chip types. - * - * To test whether a particular structure matches the current OMAP chip type, - * use omap_chip_is(). - * - */ -#define CHIP_IS_OMAP2420		(1 << 0) -#define CHIP_IS_OMAP2430		(1 << 1) -#define CHIP_IS_OMAP3430		(1 << 2) -#define CHIP_IS_OMAP3430ES1		(1 << 3) -#define CHIP_IS_OMAP3430ES2		(1 << 4) -#define CHIP_IS_OMAP3430ES3_0		(1 << 5) -#define CHIP_IS_OMAP3430ES3_1		(1 << 6) -#define CHIP_IS_OMAP3630ES1		(1 << 7) -#define CHIP_IS_OMAP4430ES1		(1 << 8) -#define CHIP_IS_OMAP3630ES1_1           (1 << 9) -#define CHIP_IS_OMAP3630ES1_2           (1 << 10) -#define CHIP_IS_OMAP4430ES2		(1 << 11) - -#define CHIP_IS_OMAP24XX		(CHIP_IS_OMAP2420 | CHIP_IS_OMAP2430) - -#define CHIP_IS_OMAP4430		(CHIP_IS_OMAP4430ES1 | \ -						 CHIP_IS_OMAP4430ES2) - -/* - * "GE" here represents "greater than or equal to" in terms of ES - * levels.  So CHIP_GE_OMAP3430ES2 is intended to match all OMAP3430 - * chips at ES2 and beyond, but not, for example, any OMAP lines after - * OMAP3. - */ -#define CHIP_GE_OMAP3430ES2		(CHIP_IS_OMAP3430ES2 | \ -					 CHIP_IS_OMAP3430ES3_0 | \ -					 CHIP_GE_OMAP3430ES3_1) -#define CHIP_GE_OMAP3430ES3_1		(CHIP_IS_OMAP3430ES3_1 | \ -					 CHIP_IS_OMAP3630ES1 | \ -					 CHIP_GE_OMAP3630ES1_1) -#define CHIP_GE_OMAP3630ES1_1		(CHIP_IS_OMAP3630ES1_1 | \ -					 CHIP_IS_OMAP3630ES1_2) - -int omap_chip_is(struct omap_chip_id oci); -void omap2_check_revision(void); - -/* - * Runtime detection of OMAP3 features - */ -extern u32 omap3_features; - -#define OMAP3_HAS_L2CACHE		BIT(0) -#define OMAP3_HAS_IVA			BIT(1) -#define OMAP3_HAS_SGX			BIT(2) -#define OMAP3_HAS_NEON			BIT(3) -#define OMAP3_HAS_ISP			BIT(4) -#define OMAP3_HAS_192MHZ_CLK		BIT(5) -#define OMAP3_HAS_IO_WAKEUP		BIT(6) - -#define OMAP3_HAS_FEATURE(feat,flag)			\ -static inline unsigned int omap3_has_ ##feat(void)	\ -{							\ -	return (omap3_features & OMAP3_HAS_ ##flag);	\ -}							\ - -OMAP3_HAS_FEATURE(l2cache, L2CACHE) -OMAP3_HAS_FEATURE(sgx, SGX) -OMAP3_HAS_FEATURE(iva, IVA) -OMAP3_HAS_FEATURE(neon, NEON) -OMAP3_HAS_FEATURE(isp, ISP) -OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK) -OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP) -  #endif diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h deleted file mode 100644 index c915a661f1f..00000000000 --- a/arch/arm/plat-omap/include/plat/display.h +++ /dev/null @@ -1,560 +0,0 @@ -/* - * linux/include/asm-arm/arch-omap/display.h - * - * Copyright (C) 2008 Nokia Corporation - * Author: Tomi Valkeinen <tomi.valkeinen@nokia.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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __ASM_ARCH_OMAP_DISPLAY_H -#define __ASM_ARCH_OMAP_DISPLAY_H - -#include <linux/list.h> -#include <linux/kobject.h> -#include <linux/device.h> -#include <asm/atomic.h> - -#define DISPC_IRQ_FRAMEDONE		(1 << 0) -#define DISPC_IRQ_VSYNC			(1 << 1) -#define DISPC_IRQ_EVSYNC_EVEN		(1 << 2) -#define DISPC_IRQ_EVSYNC_ODD		(1 << 3) -#define DISPC_IRQ_ACBIAS_COUNT_STAT	(1 << 4) -#define DISPC_IRQ_PROG_LINE_NUM		(1 << 5) -#define DISPC_IRQ_GFX_FIFO_UNDERFLOW	(1 << 6) -#define DISPC_IRQ_GFX_END_WIN		(1 << 7) -#define DISPC_IRQ_PAL_GAMMA_MASK	(1 << 8) -#define DISPC_IRQ_OCP_ERR		(1 << 9) -#define DISPC_IRQ_VID1_FIFO_UNDERFLOW	(1 << 10) -#define DISPC_IRQ_VID1_END_WIN		(1 << 11) -#define DISPC_IRQ_VID2_FIFO_UNDERFLOW	(1 << 12) -#define DISPC_IRQ_VID2_END_WIN		(1 << 13) -#define DISPC_IRQ_SYNC_LOST		(1 << 14) -#define DISPC_IRQ_SYNC_LOST_DIGIT	(1 << 15) -#define DISPC_IRQ_WAKEUP		(1 << 16) - -struct omap_dss_device; -struct omap_overlay_manager; - -enum omap_display_type { -	OMAP_DISPLAY_TYPE_NONE		= 0, -	OMAP_DISPLAY_TYPE_DPI		= 1 << 0, -	OMAP_DISPLAY_TYPE_DBI		= 1 << 1, -	OMAP_DISPLAY_TYPE_SDI		= 1 << 2, -	OMAP_DISPLAY_TYPE_DSI		= 1 << 3, -	OMAP_DISPLAY_TYPE_VENC		= 1 << 4, -}; - -enum omap_plane { -	OMAP_DSS_GFX	= 0, -	OMAP_DSS_VIDEO1	= 1, -	OMAP_DSS_VIDEO2	= 2 -}; - -enum omap_channel { -	OMAP_DSS_CHANNEL_LCD	= 0, -	OMAP_DSS_CHANNEL_DIGIT	= 1, -}; - -enum omap_color_mode { -	OMAP_DSS_COLOR_CLUT1	= 1 << 0,  /* BITMAP 1 */ -	OMAP_DSS_COLOR_CLUT2	= 1 << 1,  /* BITMAP 2 */ -	OMAP_DSS_COLOR_CLUT4	= 1 << 2,  /* BITMAP 4 */ -	OMAP_DSS_COLOR_CLUT8	= 1 << 3,  /* BITMAP 8 */ -	OMAP_DSS_COLOR_RGB12U	= 1 << 4,  /* RGB12, 16-bit container */ -	OMAP_DSS_COLOR_ARGB16	= 1 << 5,  /* ARGB16 */ -	OMAP_DSS_COLOR_RGB16	= 1 << 6,  /* RGB16 */ -	OMAP_DSS_COLOR_RGB24U	= 1 << 7,  /* RGB24, 32-bit container */ -	OMAP_DSS_COLOR_RGB24P	= 1 << 8,  /* RGB24, 24-bit container */ -	OMAP_DSS_COLOR_YUV2	= 1 << 9,  /* YUV2 4:2:2 co-sited */ -	OMAP_DSS_COLOR_UYVY	= 1 << 10, /* UYVY 4:2:2 co-sited */ -	OMAP_DSS_COLOR_ARGB32	= 1 << 11, /* ARGB32 */ -	OMAP_DSS_COLOR_RGBA32	= 1 << 12, /* RGBA32 */ -	OMAP_DSS_COLOR_RGBX32	= 1 << 13, /* RGBx32 */ -}; - -enum omap_lcd_display_type { -	OMAP_DSS_LCD_DISPLAY_STN, -	OMAP_DSS_LCD_DISPLAY_TFT, -}; - -enum omap_dss_load_mode { -	OMAP_DSS_LOAD_CLUT_AND_FRAME	= 0, -	OMAP_DSS_LOAD_CLUT_ONLY		= 1, -	OMAP_DSS_LOAD_FRAME_ONLY	= 2, -	OMAP_DSS_LOAD_CLUT_ONCE_FRAME	= 3, -}; - -enum omap_dss_trans_key_type { -	OMAP_DSS_COLOR_KEY_GFX_DST = 0, -	OMAP_DSS_COLOR_KEY_VID_SRC = 1, -}; - -enum omap_rfbi_te_mode { -	OMAP_DSS_RFBI_TE_MODE_1 = 1, -	OMAP_DSS_RFBI_TE_MODE_2 = 2, -}; - -enum omap_panel_config { -	OMAP_DSS_LCD_IVS		= 1<<0, -	OMAP_DSS_LCD_IHS		= 1<<1, -	OMAP_DSS_LCD_IPC		= 1<<2, -	OMAP_DSS_LCD_IEO		= 1<<3, -	OMAP_DSS_LCD_RF			= 1<<4, -	OMAP_DSS_LCD_ONOFF		= 1<<5, - -	OMAP_DSS_LCD_TFT		= 1<<20, -}; - -enum omap_dss_venc_type { -	OMAP_DSS_VENC_TYPE_COMPOSITE, -	OMAP_DSS_VENC_TYPE_SVIDEO, -}; - -enum omap_display_caps { -	OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE	= 1 << 0, -	OMAP_DSS_DISPLAY_CAP_TEAR_ELIM		= 1 << 1, -}; - -enum omap_dss_update_mode { -	OMAP_DSS_UPDATE_DISABLED = 0, -	OMAP_DSS_UPDATE_AUTO, -	OMAP_DSS_UPDATE_MANUAL, -}; - -enum omap_dss_display_state { -	OMAP_DSS_DISPLAY_DISABLED = 0, -	OMAP_DSS_DISPLAY_ACTIVE, -	OMAP_DSS_DISPLAY_SUSPENDED, -}; - -/* XXX perhaps this should be removed */ -enum omap_dss_overlay_managers { -	OMAP_DSS_OVL_MGR_LCD, -	OMAP_DSS_OVL_MGR_TV, -}; - -enum omap_dss_rotation_type { -	OMAP_DSS_ROT_DMA = 0, -	OMAP_DSS_ROT_VRFB = 1, -}; - -/* clockwise rotation angle */ -enum omap_dss_rotation_angle { -	OMAP_DSS_ROT_0   = 0, -	OMAP_DSS_ROT_90  = 1, -	OMAP_DSS_ROT_180 = 2, -	OMAP_DSS_ROT_270 = 3, -}; - -enum omap_overlay_caps { -	OMAP_DSS_OVL_CAP_SCALE = 1 << 0, -	OMAP_DSS_OVL_CAP_DISPC = 1 << 1, -}; - -enum omap_overlay_manager_caps { -	OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0, -}; - -/* RFBI */ - -struct rfbi_timings { -	int cs_on_time; -	int cs_off_time; -	int we_on_time; -	int we_off_time; -	int re_on_time; -	int re_off_time; -	int we_cycle_time; -	int re_cycle_time; -	int cs_pulse_width; -	int access_time; - -	int clk_div; - -	u32 tim[5];             /* set by rfbi_convert_timings() */ - -	int converted; -}; - -void omap_rfbi_write_command(const void *buf, u32 len); -void omap_rfbi_read_data(void *buf, u32 len); -void omap_rfbi_write_data(const void *buf, u32 len); -void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, -		u16 x, u16 y, -		u16 w, u16 h); -int omap_rfbi_enable_te(bool enable, unsigned line); -int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, -			     unsigned hs_pulse_time, unsigned vs_pulse_time, -			     int hs_pol_inv, int vs_pol_inv, int extif_div); - -/* DSI */ -void dsi_bus_lock(void); -void dsi_bus_unlock(void); -int dsi_vc_dcs_write(int channel, u8 *data, int len); -int dsi_vc_dcs_write_0(int channel, u8 dcs_cmd); -int dsi_vc_dcs_write_1(int channel, u8 dcs_cmd, u8 param); -int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len); -int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen); -int dsi_vc_dcs_read_1(int channel, u8 dcs_cmd, u8 *data); -int dsi_vc_dcs_read_2(int channel, u8 dcs_cmd, u8 *data1, u8 *data2); -int dsi_vc_set_max_rx_packet_size(int channel, u16 len); -int dsi_vc_send_null(int channel); -int dsi_vc_send_bta_sync(int channel); - -/* Board specific data */ -struct omap_dss_board_info { -	int (*get_last_off_on_transaction_id)(struct device *dev); -	int num_devices; -	struct omap_dss_device **devices; -	struct omap_dss_device *default_device; -}; - -struct omap_video_timings { -	/* Unit: pixels */ -	u16 x_res; -	/* Unit: pixels */ -	u16 y_res; -	/* Unit: KHz */ -	u32 pixel_clock; -	/* Unit: pixel clocks */ -	u16 hsw;	/* Horizontal synchronization pulse width */ -	/* Unit: pixel clocks */ -	u16 hfp;	/* Horizontal front porch */ -	/* Unit: pixel clocks */ -	u16 hbp;	/* Horizontal back porch */ -	/* Unit: line clocks */ -	u16 vsw;	/* Vertical synchronization pulse width */ -	/* Unit: line clocks */ -	u16 vfp;	/* Vertical front porch */ -	/* Unit: line clocks */ -	u16 vbp;	/* Vertical back porch */ -}; - -#ifdef CONFIG_OMAP2_DSS_VENC -/* Hardcoded timings for tv modes. Venc only uses these to - * identify the mode, and does not actually use the configs - * itself. However, the configs should be something that - * a normal monitor can also show */ -extern const struct omap_video_timings omap_dss_pal_timings; -extern const struct omap_video_timings omap_dss_ntsc_timings; -#endif - -struct omap_overlay_info { -	bool enabled; - -	u32 paddr; -	void __iomem *vaddr; -	u16 screen_width; -	u16 width; -	u16 height; -	enum omap_color_mode color_mode; -	u8 rotation; -	enum omap_dss_rotation_type rotation_type; -	bool mirror; - -	u16 pos_x; -	u16 pos_y; -	u16 out_width;	/* if 0, out_width == width */ -	u16 out_height;	/* if 0, out_height == height */ -	u8 global_alpha; -}; - -struct omap_overlay { -	struct kobject kobj; -	struct list_head list; - -	/* static fields */ -	const char *name; -	int id; -	enum omap_color_mode supported_modes; -	enum omap_overlay_caps caps; - -	/* dynamic fields */ -	struct omap_overlay_manager *manager; -	struct omap_overlay_info info; - -	/* if true, info has been changed, but not applied() yet */ -	bool info_dirty; - -	int (*set_manager)(struct omap_overlay *ovl, -		struct omap_overlay_manager *mgr); -	int (*unset_manager)(struct omap_overlay *ovl); - -	int (*set_overlay_info)(struct omap_overlay *ovl, -			struct omap_overlay_info *info); -	void (*get_overlay_info)(struct omap_overlay *ovl, -			struct omap_overlay_info *info); - -	int (*wait_for_go)(struct omap_overlay *ovl); -}; - -struct omap_overlay_manager_info { -	u32 default_color; - -	enum omap_dss_trans_key_type trans_key_type; -	u32 trans_key; -	bool trans_enabled; - -	bool alpha_enabled; -}; - -struct omap_overlay_manager { -	struct kobject kobj; -	struct list_head list; - -	/* static fields */ -	const char *name; -	int id; -	enum omap_overlay_manager_caps caps; -	int num_overlays; -	struct omap_overlay **overlays; -	enum omap_display_type supported_displays; - -	/* dynamic fields */ -	struct omap_dss_device *device; -	struct omap_overlay_manager_info info; - -	bool device_changed; -	/* if true, info has been changed but not applied() yet */ -	bool info_dirty; - -	int (*set_device)(struct omap_overlay_manager *mgr, -		struct omap_dss_device *dssdev); -	int (*unset_device)(struct omap_overlay_manager *mgr); - -	int (*set_manager_info)(struct omap_overlay_manager *mgr, -			struct omap_overlay_manager_info *info); -	void (*get_manager_info)(struct omap_overlay_manager *mgr, -			struct omap_overlay_manager_info *info); - -	int (*apply)(struct omap_overlay_manager *mgr); -	int (*wait_for_go)(struct omap_overlay_manager *mgr); -	int (*wait_for_vsync)(struct omap_overlay_manager *mgr); - -	int (*enable)(struct omap_overlay_manager *mgr); -	int (*disable)(struct omap_overlay_manager *mgr); -}; - -struct omap_dss_device { -	struct device dev; - -	enum omap_display_type type; - -	union { -		struct { -			u8 data_lines; -		} dpi; - -		struct { -			u8 channel; -			u8 data_lines; -		} rfbi; - -		struct { -			u8 datapairs; -		} sdi; - -		struct { -			u8 clk_lane; -			u8 clk_pol; -			u8 data1_lane; -			u8 data1_pol; -			u8 data2_lane; -			u8 data2_pol; - -			struct { -				u16 regn; -				u16 regm; -				u16 regm3; -				u16 regm4; - -				u16 lp_clk_div; - -				u16 lck_div; -				u16 pck_div; -			} div; - -			bool ext_te; -			u8 ext_te_gpio; -		} dsi; - -		struct { -			enum omap_dss_venc_type type; -			bool invert_polarity; -		} venc; -	} phy; - -	struct { -		struct omap_video_timings timings; - -		int acbi;	/* ac-bias pin transitions per interrupt */ -		/* Unit: line clocks */ -		int acb;	/* ac-bias pin frequency */ - -		enum omap_panel_config config; -	} panel; - -	struct { -		u8 pixel_size; -		struct rfbi_timings rfbi_timings; -	} ctrl; - -	int reset_gpio; - -	int max_backlight_level; - -	const char *name; - -	/* used to match device to driver */ -	const char *driver_name; - -	void *data; - -	struct omap_dss_driver *driver; - -	/* helper variable for driver suspend/resume */ -	bool activate_after_resume; - -	enum omap_display_caps caps; - -	struct omap_overlay_manager *manager; - -	enum omap_dss_display_state state; - -	/* platform specific  */ -	int (*platform_enable)(struct omap_dss_device *dssdev); -	void (*platform_disable)(struct omap_dss_device *dssdev); -	int (*set_backlight)(struct omap_dss_device *dssdev, int level); -	int (*get_backlight)(struct omap_dss_device *dssdev); -}; - -struct omap_dss_driver { -	struct device_driver driver; - -	int (*probe)(struct omap_dss_device *); -	void (*remove)(struct omap_dss_device *); - -	int (*enable)(struct omap_dss_device *display); -	void (*disable)(struct omap_dss_device *display); -	int (*suspend)(struct omap_dss_device *display); -	int (*resume)(struct omap_dss_device *display); -	int (*run_test)(struct omap_dss_device *display, int test); - -	int (*set_update_mode)(struct omap_dss_device *dssdev, -			enum omap_dss_update_mode); -	enum omap_dss_update_mode (*get_update_mode)( -			struct omap_dss_device *dssdev); - -	int (*update)(struct omap_dss_device *dssdev, -			       u16 x, u16 y, u16 w, u16 h); -	int (*sync)(struct omap_dss_device *dssdev); - -	int (*enable_te)(struct omap_dss_device *dssdev, bool enable); -	int (*get_te)(struct omap_dss_device *dssdev); - -	u8 (*get_rotate)(struct omap_dss_device *dssdev); -	int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate); - -	bool (*get_mirror)(struct omap_dss_device *dssdev); -	int (*set_mirror)(struct omap_dss_device *dssdev, bool enable); - -	int (*memory_read)(struct omap_dss_device *dssdev, -			void *buf, size_t size, -			u16 x, u16 y, u16 w, u16 h); - -	void (*get_resolution)(struct omap_dss_device *dssdev, -			u16 *xres, u16 *yres); -	int (*get_recommended_bpp)(struct omap_dss_device *dssdev); - -	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); -	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); -	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); - -	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss); -	u32 (*get_wss)(struct omap_dss_device *dssdev); -}; - -int omap_dss_register_driver(struct omap_dss_driver *); -void omap_dss_unregister_driver(struct omap_dss_driver *); - -int omap_dss_register_device(struct omap_dss_device *); -void omap_dss_unregister_device(struct omap_dss_device *); - -void omap_dss_get_device(struct omap_dss_device *dssdev); -void omap_dss_put_device(struct omap_dss_device *dssdev); -#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL) -struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from); -struct omap_dss_device *omap_dss_find_device(void *data, -		int (*match)(struct omap_dss_device *dssdev, void *data)); - -int omap_dss_start_device(struct omap_dss_device *dssdev); -void omap_dss_stop_device(struct omap_dss_device *dssdev); - -int omap_dss_get_num_overlay_managers(void); -struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); - -int omap_dss_get_num_overlays(void); -struct omap_overlay *omap_dss_get_overlay(int num); - -void omapdss_default_get_resolution(struct omap_dss_device *dssdev, -		u16 *xres, u16 *yres); -int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev); - -typedef void (*omap_dispc_isr_t) (void *arg, u32 mask); -int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); -int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); - -int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout); -int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, -		unsigned long timeout); - -#define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver) -#define to_dss_device(x) container_of((x), struct omap_dss_device, dev) - -void omapdss_dsi_vc_enable_hs(int channel, bool enable); -int omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable); - -int omap_dsi_prepare_update(struct omap_dss_device *dssdev, -				    u16 *x, u16 *y, u16 *w, u16 *h, -				    bool enlarge_update_area); -int omap_dsi_update(struct omap_dss_device *dssdev, -		int channel, -		u16 x, u16 y, u16 w, u16 h, -		void (*callback)(int, void *), void *data); - -int omapdss_dsi_display_enable(struct omap_dss_device *dssdev); -void omapdss_dsi_display_disable(struct omap_dss_device *dssdev); - -int omapdss_dpi_display_enable(struct omap_dss_device *dssdev); -void omapdss_dpi_display_disable(struct omap_dss_device *dssdev); -void dpi_set_timings(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); -int dpi_check_timings(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); - -int omapdss_sdi_display_enable(struct omap_dss_device *dssdev); -void omapdss_sdi_display_disable(struct omap_dss_device *dssdev); - -int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev); -void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev); -int omap_rfbi_prepare_update(struct omap_dss_device *dssdev, -		u16 *x, u16 *y, u16 *w, u16 *h); -int omap_rfbi_update(struct omap_dss_device *dssdev, -		u16 x, u16 y, u16 w, u16 h, -		void (*callback)(void *), void *data); - -#endif diff --git a/arch/arm/plat-omap/include/plat/dma-44xx.h b/arch/arm/plat-omap/include/plat/dma-44xx.h deleted file mode 100644 index 1f767cb2f38..00000000000 --- a/arch/arm/plat-omap/include/plat/dma-44xx.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * OMAP4 SDMA channel definitions - * - * Copyright (C) 2009-2010 Texas Instruments, Inc. - * Copyright (C) 2009-2010 Nokia Corporation - * - * Santosh Shilimkar (santosh.shilimkar@ti.com) - * Benoit Cousson (b-cousson@ti.com) - * Paul Walmsley (paul@pwsan.com) - * - * This file is automatically generated from the OMAP hardware databases. - * We respectfully ask that any modifications to this file be coordinated - * with the public linux-omap@vger.kernel.org mailing list and the - * authors above to ensure that the autogeneration scripts are kept - * up-to-date with the file contents. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ARCH_ARM_MACH_OMAP2_OMAP44XX_DMA_H -#define __ARCH_ARM_MACH_OMAP2_OMAP44XX_DMA_H - -#define OMAP44XX_DMA_SYS_REQ0			2 -#define OMAP44XX_DMA_SYS_REQ1			3 -#define OMAP44XX_DMA_GPMC			4 -#define OMAP44XX_DMA_DSS_DISPC_REQ		6 -#define OMAP44XX_DMA_SYS_REQ2			7 -#define OMAP44XX_DMA_MCASP1_AXEVT		8 -#define OMAP44XX_DMA_ISS_REQ1			9 -#define OMAP44XX_DMA_ISS_REQ2			10 -#define OMAP44XX_DMA_MCASP1_AREVT		11 -#define OMAP44XX_DMA_ISS_REQ3			12 -#define OMAP44XX_DMA_ISS_REQ4			13 -#define OMAP44XX_DMA_DSS_RFBI_REQ		14 -#define OMAP44XX_DMA_SPI3_TX0			15 -#define OMAP44XX_DMA_SPI3_RX0			16 -#define OMAP44XX_DMA_MCBSP2_TX			17 -#define OMAP44XX_DMA_MCBSP2_RX			18 -#define OMAP44XX_DMA_MCBSP3_TX			19 -#define OMAP44XX_DMA_MCBSP3_RX			20 -#define OMAP44XX_DMA_C2C_SSCM_GPO0		21 -#define OMAP44XX_DMA_C2C_SSCM_GPO1		22 -#define OMAP44XX_DMA_SPI3_TX1			23 -#define OMAP44XX_DMA_SPI3_RX1			24 -#define OMAP44XX_DMA_I2C3_TX			25 -#define OMAP44XX_DMA_I2C3_RX			26 -#define OMAP44XX_DMA_I2C1_TX			27 -#define OMAP44XX_DMA_I2C1_RX			28 -#define OMAP44XX_DMA_I2C2_TX			29 -#define OMAP44XX_DMA_I2C2_RX			30 -#define OMAP44XX_DMA_MCBSP4_TX			31 -#define OMAP44XX_DMA_MCBSP4_RX			32 -#define OMAP44XX_DMA_MCBSP1_TX			33 -#define OMAP44XX_DMA_MCBSP1_RX			34 -#define OMAP44XX_DMA_SPI1_TX0			35 -#define OMAP44XX_DMA_SPI1_RX0			36 -#define OMAP44XX_DMA_SPI1_TX1			37 -#define OMAP44XX_DMA_SPI1_RX1			38 -#define OMAP44XX_DMA_SPI1_TX2			39 -#define OMAP44XX_DMA_SPI1_RX2			40 -#define OMAP44XX_DMA_SPI1_TX3			41 -#define OMAP44XX_DMA_SPI1_RX3			42 -#define OMAP44XX_DMA_SPI2_TX0			43 -#define OMAP44XX_DMA_SPI2_RX0			44 -#define OMAP44XX_DMA_SPI2_TX1			45 -#define OMAP44XX_DMA_SPI2_RX1			46 -#define OMAP44XX_DMA_MMC2_TX			47 -#define OMAP44XX_DMA_MMC2_RX			48 -#define OMAP44XX_DMA_UART1_TX			49 -#define OMAP44XX_DMA_UART1_RX			50 -#define OMAP44XX_DMA_UART2_TX			51 -#define OMAP44XX_DMA_UART2_RX			52 -#define OMAP44XX_DMA_UART3_TX			53 -#define OMAP44XX_DMA_UART3_RX			54 -#define OMAP44XX_DMA_UART4_TX			55 -#define OMAP44XX_DMA_UART4_RX			56 -#define OMAP44XX_DMA_MMC4_TX			57 -#define OMAP44XX_DMA_MMC4_RX			58 -#define OMAP44XX_DMA_MMC5_TX			59 -#define OMAP44XX_DMA_MMC5_RX			60 -#define OMAP44XX_DMA_MMC1_TX			61 -#define OMAP44XX_DMA_MMC1_RX			62 -#define OMAP44XX_DMA_SYS_REQ3			64 -#define OMAP44XX_DMA_MCPDM_UP			65 -#define OMAP44XX_DMA_MCPDM_DL			66 -#define OMAP44XX_DMA_DMIC_REQ			67 -#define OMAP44XX_DMA_C2C_SSCM_GPO2		68 -#define OMAP44XX_DMA_C2C_SSCM_GPO3		69 -#define OMAP44XX_DMA_SPI4_TX0			70 -#define OMAP44XX_DMA_SPI4_RX0			71 -#define OMAP44XX_DMA_DSS_DSI1_REQ0		72 -#define OMAP44XX_DMA_DSS_DSI1_REQ1		73 -#define OMAP44XX_DMA_DSS_DSI1_REQ2		74 -#define OMAP44XX_DMA_DSS_DSI1_REQ3		75 -#define OMAP44XX_DMA_DSS_HDMI_REQ		76 -#define OMAP44XX_DMA_MMC3_TX			77 -#define OMAP44XX_DMA_MMC3_RX			78 -#define OMAP44XX_DMA_USIM_TX			79 -#define OMAP44XX_DMA_USIM_RX			80 -#define OMAP44XX_DMA_DSS_DSI2_REQ0		81 -#define OMAP44XX_DMA_DSS_DSI2_REQ1		82 -#define OMAP44XX_DMA_DSS_DSI2_REQ2		83 -#define OMAP44XX_DMA_DSS_DSI2_REQ3		84 -#define OMAP44XX_DMA_SLIMBUS1_TX0		85 -#define OMAP44XX_DMA_SLIMBUS1_TX1		86 -#define OMAP44XX_DMA_SLIMBUS1_TX2		87 -#define OMAP44XX_DMA_SLIMBUS1_TX3		88 -#define OMAP44XX_DMA_SLIMBUS1_RX0		89 -#define OMAP44XX_DMA_SLIMBUS1_RX1		90 -#define OMAP44XX_DMA_SLIMBUS1_RX2		91 -#define OMAP44XX_DMA_SLIMBUS1_RX3		92 -#define OMAP44XX_DMA_SLIMBUS2_TX0		93 -#define OMAP44XX_DMA_SLIMBUS2_TX1		94 -#define OMAP44XX_DMA_SLIMBUS2_TX2		95 -#define OMAP44XX_DMA_SLIMBUS2_TX3		96 -#define OMAP44XX_DMA_SLIMBUS2_RX0		97 -#define OMAP44XX_DMA_SLIMBUS2_RX1		98 -#define OMAP44XX_DMA_SLIMBUS2_RX2		99 -#define OMAP44XX_DMA_SLIMBUS2_RX3		100 -#define OMAP44XX_DMA_ABE_REQ_0			101 -#define OMAP44XX_DMA_ABE_REQ_1			102 -#define OMAP44XX_DMA_ABE_REQ_2			103 -#define OMAP44XX_DMA_ABE_REQ_3			104 -#define OMAP44XX_DMA_ABE_REQ_4			105 -#define OMAP44XX_DMA_ABE_REQ_5			106 -#define OMAP44XX_DMA_ABE_REQ_6			107 -#define OMAP44XX_DMA_ABE_REQ_7			108 -#define OMAP44XX_DMA_AES1_P_CTX_IN_REQ		109 -#define OMAP44XX_DMA_AES1_P_DATA_IN_REQ		110 -#define OMAP44XX_DMA_AES1_P_DATA_OUT_REQ	111 -#define OMAP44XX_DMA_AES2_P_CTX_IN_REQ		112 -#define OMAP44XX_DMA_AES2_P_DATA_IN_REQ		113 -#define OMAP44XX_DMA_AES2_P_DATA_OUT_REQ	114 -#define OMAP44XX_DMA_DES_P_CTX_IN_REQ		115 -#define OMAP44XX_DMA_DES_P_DATA_IN_REQ		116 -#define OMAP44XX_DMA_DES_P_DATA_OUT_REQ		117 -#define OMAP44XX_DMA_SHA2_CTXIN_P		118 -#define OMAP44XX_DMA_SHA2_DIN_P			119 -#define OMAP44XX_DMA_SHA2_CTXOUT_P		120 -#define OMAP44XX_DMA_AES1_P_CONTEXT_OUT_REQ	121 -#define OMAP44XX_DMA_AES2_P_CONTEXT_OUT_REQ	122 -#define OMAP44XX_DMA_I2C4_TX			124 -#define OMAP44XX_DMA_I2C4_RX			125 - -#endif diff --git a/arch/arm/plat-omap/include/plat/dma.h b/arch/arm/plat-omap/include/plat/dma.h deleted file mode 100644 index 0cce4ca83aa..00000000000 --- a/arch/arm/plat-omap/include/plat/dma.h +++ /dev/null @@ -1,567 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/dma.h - * - *  Copyright (C) 2003 Nokia Corporation - *  Author: Juha Yrjölä <juha.yrjola@nokia.com> - * - * 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 - */ -#ifndef __ASM_ARCH_DMA_H -#define __ASM_ARCH_DMA_H - -/* Move omap4 specific defines to dma-44xx.h */ -#include "dma-44xx.h" - -/* Hardware registers for omap1 */ -#define OMAP1_DMA_BASE			(0xfffed800) - -#define OMAP1_DMA_GCR			0x400 -#define OMAP1_DMA_GSCR			0x404 -#define OMAP1_DMA_GRST			0x408 -#define OMAP1_DMA_HW_ID			0x442 -#define OMAP1_DMA_PCH2_ID		0x444 -#define OMAP1_DMA_PCH0_ID		0x446 -#define OMAP1_DMA_PCH1_ID		0x448 -#define OMAP1_DMA_PCHG_ID		0x44a -#define OMAP1_DMA_PCHD_ID		0x44c -#define OMAP1_DMA_CAPS_0_U		0x44e -#define OMAP1_DMA_CAPS_0_L		0x450 -#define OMAP1_DMA_CAPS_1_U		0x452 -#define OMAP1_DMA_CAPS_1_L		0x454 -#define OMAP1_DMA_CAPS_2		0x456 -#define OMAP1_DMA_CAPS_3		0x458 -#define OMAP1_DMA_CAPS_4		0x45a -#define OMAP1_DMA_PCH2_SR		0x460 -#define OMAP1_DMA_PCH0_SR		0x480 -#define OMAP1_DMA_PCH1_SR		0x482 -#define OMAP1_DMA_PCHD_SR		0x4c0 - -/* Hardware registers for omap2 and omap3 */ -#define OMAP24XX_DMA4_BASE		(L4_24XX_BASE + 0x56000) -#define OMAP34XX_DMA4_BASE		(L4_34XX_BASE + 0x56000) -#define OMAP44XX_DMA4_BASE		(L4_44XX_BASE + 0x56000) - -#define OMAP_DMA4_REVISION		0x00 -#define OMAP_DMA4_GCR			0x78 -#define OMAP_DMA4_IRQSTATUS_L0		0x08 -#define OMAP_DMA4_IRQSTATUS_L1		0x0c -#define OMAP_DMA4_IRQSTATUS_L2		0x10 -#define OMAP_DMA4_IRQSTATUS_L3		0x14 -#define OMAP_DMA4_IRQENABLE_L0		0x18 -#define OMAP_DMA4_IRQENABLE_L1		0x1c -#define OMAP_DMA4_IRQENABLE_L2		0x20 -#define OMAP_DMA4_IRQENABLE_L3		0x24 -#define OMAP_DMA4_SYSSTATUS		0x28 -#define OMAP_DMA4_OCP_SYSCONFIG		0x2c -#define OMAP_DMA4_CAPS_0		0x64 -#define OMAP_DMA4_CAPS_2		0x6c -#define OMAP_DMA4_CAPS_3		0x70 -#define OMAP_DMA4_CAPS_4		0x74 - -#define OMAP1_LOGICAL_DMA_CH_COUNT	17 -#define OMAP_DMA4_LOGICAL_DMA_CH_COUNT	32	/* REVISIT: Is this 32 + 2? */ - -/* Common channel specific registers for omap1 */ -#define OMAP1_DMA_CH_BASE(n)		(0x40 * (n) + 0x00) -#define OMAP1_DMA_CSDP(n)		(0x40 * (n) + 0x00) -#define OMAP1_DMA_CCR(n)		(0x40 * (n) + 0x02) -#define OMAP1_DMA_CICR(n)		(0x40 * (n) + 0x04) -#define OMAP1_DMA_CSR(n)		(0x40 * (n) + 0x06) -#define OMAP1_DMA_CEN(n)		(0x40 * (n) + 0x10) -#define OMAP1_DMA_CFN(n)		(0x40 * (n) + 0x12) -#define OMAP1_DMA_CSFI(n)		(0x40 * (n) + 0x14) -#define OMAP1_DMA_CSEI(n)		(0x40 * (n) + 0x16) -#define OMAP1_DMA_CPC(n)		(0x40 * (n) + 0x18)	/* 15xx only */ -#define OMAP1_DMA_CSAC(n)		(0x40 * (n) + 0x18) -#define OMAP1_DMA_CDAC(n)		(0x40 * (n) + 0x1a) -#define OMAP1_DMA_CDEI(n)		(0x40 * (n) + 0x1c) -#define OMAP1_DMA_CDFI(n)		(0x40 * (n) + 0x1e) -#define OMAP1_DMA_CLNK_CTRL(n)		(0x40 * (n) + 0x28) - -/* Common channel specific registers for omap2 */ -#define OMAP_DMA4_CH_BASE(n)		(0x60 * (n) + 0x80) -#define OMAP_DMA4_CCR(n)		(0x60 * (n) + 0x80) -#define OMAP_DMA4_CLNK_CTRL(n)		(0x60 * (n) + 0x84) -#define OMAP_DMA4_CICR(n)		(0x60 * (n) + 0x88) -#define OMAP_DMA4_CSR(n)		(0x60 * (n) + 0x8c) -#define OMAP_DMA4_CSDP(n)		(0x60 * (n) + 0x90) -#define OMAP_DMA4_CEN(n)		(0x60 * (n) + 0x94) -#define OMAP_DMA4_CFN(n)		(0x60 * (n) + 0x98) -#define OMAP_DMA4_CSEI(n)		(0x60 * (n) + 0xa4) -#define OMAP_DMA4_CSFI(n)		(0x60 * (n) + 0xa8) -#define OMAP_DMA4_CDEI(n)		(0x60 * (n) + 0xac) -#define OMAP_DMA4_CDFI(n)		(0x60 * (n) + 0xb0) -#define OMAP_DMA4_CSAC(n)		(0x60 * (n) + 0xb4) -#define OMAP_DMA4_CDAC(n)		(0x60 * (n) + 0xb8) - -/* Channel specific registers only on omap1 */ -#define OMAP1_DMA_CSSA_L(n)		(0x40 * (n) + 0x08) -#define OMAP1_DMA_CSSA_U(n)		(0x40 * (n) + 0x0a) -#define OMAP1_DMA_CDSA_L(n)		(0x40 * (n) + 0x0c) -#define OMAP1_DMA_CDSA_U(n)		(0x40 * (n) + 0x0e) -#define OMAP1_DMA_COLOR_L(n)		(0x40 * (n) + 0x20) -#define OMAP1_DMA_COLOR_U(n)		(0x40 * (n) + 0x22) -#define OMAP1_DMA_CCR2(n)		(0x40 * (n) + 0x24) -#define OMAP1_DMA_LCH_CTRL(n)		(0x40 * (n) + 0x2a)	/* not on 15xx */ -#define OMAP1_DMA_CCEN(n)		0 -#define OMAP1_DMA_CCFN(n)		0 - -/* Channel specific registers only on omap2 */ -#define OMAP_DMA4_CSSA(n)		(0x60 * (n) + 0x9c) -#define OMAP_DMA4_CDSA(n)		(0x60 * (n) + 0xa0) -#define OMAP_DMA4_CCEN(n)		(0x60 * (n) + 0xbc) -#define OMAP_DMA4_CCFN(n)		(0x60 * (n) + 0xc0) -#define OMAP_DMA4_COLOR(n)		(0x60 * (n) + 0xc4) - -/* Additional registers available on OMAP4 */ -#define OMAP_DMA4_CDP(n)		(0x60 * (n) + 0xd0) -#define OMAP_DMA4_CNDP(n)		(0x60 * (n) + 0xd4) -#define OMAP_DMA4_CCDN(n)		(0x60 * (n) + 0xd8) - -/* Dummy defines to keep multi-omap compiles happy */ -#define OMAP1_DMA_REVISION		0 -#define OMAP1_DMA_IRQSTATUS_L0		0 -#define OMAP1_DMA_IRQENABLE_L0		0 -#define OMAP1_DMA_OCP_SYSCONFIG		0 -#define OMAP_DMA4_HW_ID			0 -#define OMAP_DMA4_CAPS_0_L		0 -#define OMAP_DMA4_CAPS_0_U		0 -#define OMAP_DMA4_CAPS_1_L		0 -#define OMAP_DMA4_CAPS_1_U		0 -#define OMAP_DMA4_GSCR			0 -#define OMAP_DMA4_CPC(n)		0 - -#define OMAP_DMA4_LCH_CTRL(n)		0 -#define OMAP_DMA4_COLOR_L(n)		0 -#define OMAP_DMA4_COLOR_U(n)		0 -#define OMAP_DMA4_CCR2(n)		0 -#define OMAP1_DMA_CSSA(n)		0 -#define OMAP1_DMA_CDSA(n)		0 -#define OMAP_DMA4_CSSA_L(n)		0 -#define OMAP_DMA4_CSSA_U(n)		0 -#define OMAP_DMA4_CDSA_L(n)		0 -#define OMAP_DMA4_CDSA_U(n)		0 -#define OMAP1_DMA_COLOR(n)		0 - -/*----------------------------------------------------------------------------*/ - -/* DMA channels for omap1 */ -#define OMAP_DMA_NO_DEVICE		0 -#define OMAP_DMA_MCSI1_TX		1 -#define OMAP_DMA_MCSI1_RX		2 -#define OMAP_DMA_I2C_RX			3 -#define OMAP_DMA_I2C_TX			4 -#define OMAP_DMA_EXT_NDMA_REQ		5 -#define OMAP_DMA_EXT_NDMA_REQ2		6 -#define OMAP_DMA_UWIRE_TX		7 -#define OMAP_DMA_MCBSP1_TX		8 -#define OMAP_DMA_MCBSP1_RX		9 -#define OMAP_DMA_MCBSP3_TX		10 -#define OMAP_DMA_MCBSP3_RX		11 -#define OMAP_DMA_UART1_TX		12 -#define OMAP_DMA_UART1_RX		13 -#define OMAP_DMA_UART2_TX		14 -#define OMAP_DMA_UART2_RX		15 -#define OMAP_DMA_MCBSP2_TX		16 -#define OMAP_DMA_MCBSP2_RX		17 -#define OMAP_DMA_UART3_TX		18 -#define OMAP_DMA_UART3_RX		19 -#define OMAP_DMA_CAMERA_IF_RX		20 -#define OMAP_DMA_MMC_TX			21 -#define OMAP_DMA_MMC_RX			22 -#define OMAP_DMA_NAND			23 -#define OMAP_DMA_IRQ_LCD_LINE		24 -#define OMAP_DMA_MEMORY_STICK		25 -#define OMAP_DMA_USB_W2FC_RX0		26 -#define OMAP_DMA_USB_W2FC_RX1		27 -#define OMAP_DMA_USB_W2FC_RX2		28 -#define OMAP_DMA_USB_W2FC_TX0		29 -#define OMAP_DMA_USB_W2FC_TX1		30 -#define OMAP_DMA_USB_W2FC_TX2		31 - -/* These are only for 1610 */ -#define OMAP_DMA_CRYPTO_DES_IN		32 -#define OMAP_DMA_SPI_TX			33 -#define OMAP_DMA_SPI_RX			34 -#define OMAP_DMA_CRYPTO_HASH		35 -#define OMAP_DMA_CCP_ATTN		36 -#define OMAP_DMA_CCP_FIFO_NOT_EMPTY	37 -#define OMAP_DMA_CMT_APE_TX_CHAN_0	38 -#define OMAP_DMA_CMT_APE_RV_CHAN_0	39 -#define OMAP_DMA_CMT_APE_TX_CHAN_1	40 -#define OMAP_DMA_CMT_APE_RV_CHAN_1	41 -#define OMAP_DMA_CMT_APE_TX_CHAN_2	42 -#define OMAP_DMA_CMT_APE_RV_CHAN_2	43 -#define OMAP_DMA_CMT_APE_TX_CHAN_3	44 -#define OMAP_DMA_CMT_APE_RV_CHAN_3	45 -#define OMAP_DMA_CMT_APE_TX_CHAN_4	46 -#define OMAP_DMA_CMT_APE_RV_CHAN_4	47 -#define OMAP_DMA_CMT_APE_TX_CHAN_5	48 -#define OMAP_DMA_CMT_APE_RV_CHAN_5	49 -#define OMAP_DMA_CMT_APE_TX_CHAN_6	50 -#define OMAP_DMA_CMT_APE_RV_CHAN_6	51 -#define OMAP_DMA_CMT_APE_TX_CHAN_7	52 -#define OMAP_DMA_CMT_APE_RV_CHAN_7	53 -#define OMAP_DMA_MMC2_TX		54 -#define OMAP_DMA_MMC2_RX		55 -#define OMAP_DMA_CRYPTO_DES_OUT		56 - -/* DMA channels for 24xx */ -#define OMAP24XX_DMA_NO_DEVICE		0 -#define OMAP24XX_DMA_XTI_DMA		1	/* S_DMA_0 */ -#define OMAP24XX_DMA_EXT_DMAREQ0	2	/* S_DMA_1 */ -#define OMAP24XX_DMA_EXT_DMAREQ1	3	/* S_DMA_2 */ -#define OMAP24XX_DMA_GPMC		4	/* S_DMA_3 */ -#define OMAP24XX_DMA_GFX		5	/* S_DMA_4 */ -#define OMAP24XX_DMA_DSS		6	/* S_DMA_5 */ -#define OMAP242X_DMA_VLYNQ_TX		7	/* S_DMA_6 */ -#define OMAP24XX_DMA_EXT_DMAREQ2	7	/* S_DMA_6 */ -#define OMAP24XX_DMA_CWT		8	/* S_DMA_7 */ -#define OMAP24XX_DMA_AES_TX		9	/* S_DMA_8 */ -#define OMAP24XX_DMA_AES_RX		10	/* S_DMA_9 */ -#define OMAP24XX_DMA_DES_TX		11	/* S_DMA_10 */ -#define OMAP24XX_DMA_DES_RX		12	/* S_DMA_11 */ -#define OMAP24XX_DMA_SHA1MD5_RX		13	/* S_DMA_12 */ -#define OMAP34XX_DMA_SHA2MD5_RX		13	/* S_DMA_12 */ -#define OMAP242X_DMA_EXT_DMAREQ2	14	/* S_DMA_13 */ -#define OMAP242X_DMA_EXT_DMAREQ3	15	/* S_DMA_14 */ -#define OMAP242X_DMA_EXT_DMAREQ4	16	/* S_DMA_15 */ -#define OMAP242X_DMA_EAC_AC_RD		17	/* S_DMA_16 */ -#define OMAP242X_DMA_EAC_AC_WR		18	/* S_DMA_17 */ -#define OMAP242X_DMA_EAC_MD_UL_RD	19	/* S_DMA_18 */ -#define OMAP242X_DMA_EAC_MD_UL_WR	20	/* S_DMA_19 */ -#define OMAP242X_DMA_EAC_MD_DL_RD	21	/* S_DMA_20 */ -#define OMAP242X_DMA_EAC_MD_DL_WR	22	/* S_DMA_21 */ -#define OMAP242X_DMA_EAC_BT_UL_RD	23	/* S_DMA_22 */ -#define OMAP242X_DMA_EAC_BT_UL_WR	24	/* S_DMA_23 */ -#define OMAP242X_DMA_EAC_BT_DL_RD	25	/* S_DMA_24 */ -#define OMAP242X_DMA_EAC_BT_DL_WR	26	/* S_DMA_25 */ -#define OMAP243X_DMA_EXT_DMAREQ3	14	/* S_DMA_13 */ -#define OMAP24XX_DMA_SPI3_TX0		15	/* S_DMA_14 */ -#define OMAP24XX_DMA_SPI3_RX0		16	/* S_DMA_15 */ -#define OMAP24XX_DMA_MCBSP3_TX		17	/* S_DMA_16 */ -#define OMAP24XX_DMA_MCBSP3_RX		18	/* S_DMA_17 */ -#define OMAP24XX_DMA_MCBSP4_TX		19	/* S_DMA_18 */ -#define OMAP24XX_DMA_MCBSP4_RX		20	/* S_DMA_19 */ -#define OMAP24XX_DMA_MCBSP5_TX		21	/* S_DMA_20 */ -#define OMAP24XX_DMA_MCBSP5_RX		22	/* S_DMA_21 */ -#define OMAP24XX_DMA_SPI3_TX1		23	/* S_DMA_22 */ -#define OMAP24XX_DMA_SPI3_RX1		24	/* S_DMA_23 */ -#define OMAP243X_DMA_EXT_DMAREQ4	25	/* S_DMA_24 */ -#define OMAP243X_DMA_EXT_DMAREQ5	26	/* S_DMA_25 */ -#define OMAP34XX_DMA_I2C3_TX		25	/* S_DMA_24 */ -#define OMAP34XX_DMA_I2C3_RX		26	/* S_DMA_25 */ -#define OMAP24XX_DMA_I2C1_TX		27	/* S_DMA_26 */ -#define OMAP24XX_DMA_I2C1_RX		28	/* S_DMA_27 */ -#define OMAP24XX_DMA_I2C2_TX		29	/* S_DMA_28 */ -#define OMAP24XX_DMA_I2C2_RX		30	/* S_DMA_29 */ -#define OMAP24XX_DMA_MCBSP1_TX		31	/* S_DMA_30 */ -#define OMAP24XX_DMA_MCBSP1_RX		32	/* S_DMA_31 */ -#define OMAP24XX_DMA_MCBSP2_TX		33	/* S_DMA_32 */ -#define OMAP24XX_DMA_MCBSP2_RX		34	/* S_DMA_33 */ -#define OMAP24XX_DMA_SPI1_TX0		35	/* S_DMA_34 */ -#define OMAP24XX_DMA_SPI1_RX0		36	/* S_DMA_35 */ -#define OMAP24XX_DMA_SPI1_TX1		37	/* S_DMA_36 */ -#define OMAP24XX_DMA_SPI1_RX1		38	/* S_DMA_37 */ -#define OMAP24XX_DMA_SPI1_TX2		39	/* S_DMA_38 */ -#define OMAP24XX_DMA_SPI1_RX2		40	/* S_DMA_39 */ -#define OMAP24XX_DMA_SPI1_TX3		41	/* S_DMA_40 */ -#define OMAP24XX_DMA_SPI1_RX3		42	/* S_DMA_41 */ -#define OMAP24XX_DMA_SPI2_TX0		43	/* S_DMA_42 */ -#define OMAP24XX_DMA_SPI2_RX0		44	/* S_DMA_43 */ -#define OMAP24XX_DMA_SPI2_TX1		45	/* S_DMA_44 */ -#define OMAP24XX_DMA_SPI2_RX1		46	/* S_DMA_45 */ -#define OMAP24XX_DMA_MMC2_TX		47	/* S_DMA_46 */ -#define OMAP24XX_DMA_MMC2_RX		48	/* S_DMA_47 */ -#define OMAP24XX_DMA_UART1_TX		49	/* S_DMA_48 */ -#define OMAP24XX_DMA_UART1_RX		50	/* S_DMA_49 */ -#define OMAP24XX_DMA_UART2_TX		51	/* S_DMA_50 */ -#define OMAP24XX_DMA_UART2_RX		52	/* S_DMA_51 */ -#define OMAP24XX_DMA_UART3_TX		53	/* S_DMA_52 */ -#define OMAP24XX_DMA_UART3_RX		54	/* S_DMA_53 */ -#define OMAP24XX_DMA_USB_W2FC_TX0	55	/* S_DMA_54 */ -#define OMAP24XX_DMA_USB_W2FC_RX0	56	/* S_DMA_55 */ -#define OMAP24XX_DMA_USB_W2FC_TX1	57	/* S_DMA_56 */ -#define OMAP24XX_DMA_USB_W2FC_RX1	58	/* S_DMA_57 */ -#define OMAP24XX_DMA_USB_W2FC_TX2	59	/* S_DMA_58 */ -#define OMAP24XX_DMA_USB_W2FC_RX2	60	/* S_DMA_59 */ -#define OMAP24XX_DMA_MMC1_TX		61	/* S_DMA_60 */ -#define OMAP24XX_DMA_MMC1_RX		62	/* S_DMA_61 */ -#define OMAP24XX_DMA_MS			63	/* S_DMA_62 */ -#define OMAP242X_DMA_EXT_DMAREQ5	64	/* S_DMA_63 */ -#define OMAP243X_DMA_EXT_DMAREQ6	64	/* S_DMA_63 */ -#define OMAP34XX_DMA_EXT_DMAREQ3	64	/* S_DMA_63 */ -#define OMAP34XX_DMA_AES2_TX		65	/* S_DMA_64 */ -#define OMAP34XX_DMA_AES2_RX		66	/* S_DMA_65 */ -#define OMAP34XX_DMA_DES2_TX		67	/* S_DMA_66 */ -#define OMAP34XX_DMA_DES2_RX		68	/* S_DMA_67 */ -#define OMAP34XX_DMA_SHA1MD5_RX		69	/* S_DMA_68 */ -#define OMAP34XX_DMA_SPI4_TX0		70	/* S_DMA_69 */ -#define OMAP34XX_DMA_SPI4_RX0		71	/* S_DMA_70 */ -#define OMAP34XX_DSS_DMA0		72	/* S_DMA_71 */ -#define OMAP34XX_DSS_DMA1		73	/* S_DMA_72 */ -#define OMAP34XX_DSS_DMA2		74	/* S_DMA_73 */ -#define OMAP34XX_DSS_DMA3		75	/* S_DMA_74 */ -#define OMAP34XX_DMA_MMC3_TX		77	/* S_DMA_76 */ -#define OMAP34XX_DMA_MMC3_RX		78	/* S_DMA_77 */ -#define OMAP34XX_DMA_USIM_TX		79	/* S_DMA_78 */ -#define OMAP34XX_DMA_USIM_RX		80	/* S_DMA_79 */ - -#define OMAP36XX_DMA_UART4_TX		81	/* S_DMA_80 */ -#define OMAP36XX_DMA_UART4_RX		82	/* S_DMA_81 */ -/*----------------------------------------------------------------------------*/ - -#define OMAP1_DMA_TOUT_IRQ		(1 << 0) -#define OMAP_DMA_DROP_IRQ		(1 << 1) -#define OMAP_DMA_HALF_IRQ		(1 << 2) -#define OMAP_DMA_FRAME_IRQ		(1 << 3) -#define OMAP_DMA_LAST_IRQ		(1 << 4) -#define OMAP_DMA_BLOCK_IRQ		(1 << 5) -#define OMAP1_DMA_SYNC_IRQ		(1 << 6) -#define OMAP2_DMA_PKT_IRQ		(1 << 7) -#define OMAP2_DMA_TRANS_ERR_IRQ		(1 << 8) -#define OMAP2_DMA_SECURE_ERR_IRQ	(1 << 9) -#define OMAP2_DMA_SUPERVISOR_ERR_IRQ	(1 << 10) -#define OMAP2_DMA_MISALIGNED_ERR_IRQ	(1 << 11) - -#define OMAP_DMA_CCR_EN			(1 << 7) -#define OMAP_DMA_CCR_RD_ACTIVE		(1 << 9) -#define OMAP_DMA_CCR_WR_ACTIVE		(1 << 10) -#define OMAP_DMA_CCR_SEL_SRC_DST_SYNC	(1 << 24) -#define OMAP_DMA_CCR_BUFFERING_DISABLE	(1 << 25) - -#define OMAP_DMA_DATA_TYPE_S8		0x00 -#define OMAP_DMA_DATA_TYPE_S16		0x01 -#define OMAP_DMA_DATA_TYPE_S32		0x02 - -#define OMAP_DMA_SYNC_ELEMENT		0x00 -#define OMAP_DMA_SYNC_FRAME		0x01 -#define OMAP_DMA_SYNC_BLOCK		0x02 -#define OMAP_DMA_SYNC_PACKET		0x03 - -#define OMAP_DMA_DST_SYNC_PREFETCH	0x02 -#define OMAP_DMA_SRC_SYNC		0x01 -#define OMAP_DMA_DST_SYNC		0x00 - -#define OMAP_DMA_PORT_EMIFF		0x00 -#define OMAP_DMA_PORT_EMIFS		0x01 -#define OMAP_DMA_PORT_OCP_T1		0x02 -#define OMAP_DMA_PORT_TIPB		0x03 -#define OMAP_DMA_PORT_OCP_T2		0x04 -#define OMAP_DMA_PORT_MPUI		0x05 - -#define OMAP_DMA_AMODE_CONSTANT		0x00 -#define OMAP_DMA_AMODE_POST_INC		0x01 -#define OMAP_DMA_AMODE_SINGLE_IDX	0x02 -#define OMAP_DMA_AMODE_DOUBLE_IDX	0x03 - -#define DMA_DEFAULT_FIFO_DEPTH		0x10 -#define DMA_DEFAULT_ARB_RATE		0x01 -/* Pass THREAD_RESERVE ORed with THREAD_FIFO for tparams */ -#define DMA_THREAD_RESERVE_NORM		(0x00 << 12) /* Def */ -#define DMA_THREAD_RESERVE_ONET		(0x01 << 12) -#define DMA_THREAD_RESERVE_TWOT		(0x02 << 12) -#define DMA_THREAD_RESERVE_THREET	(0x03 << 12) -#define DMA_THREAD_FIFO_NONE		(0x00 << 14) /* Def */ -#define DMA_THREAD_FIFO_75		(0x01 << 14) -#define DMA_THREAD_FIFO_25		(0x02 << 14) -#define DMA_THREAD_FIFO_50		(0x03 << 14) - -/* DMA4_OCP_SYSCONFIG bits */ -#define DMA_SYSCONFIG_MIDLEMODE_MASK		(3 << 12) -#define DMA_SYSCONFIG_CLOCKACTIVITY_MASK	(3 << 8) -#define DMA_SYSCONFIG_EMUFREE			(1 << 5) -#define DMA_SYSCONFIG_SIDLEMODE_MASK		(3 << 3) -#define DMA_SYSCONFIG_SOFTRESET			(1 << 2) -#define DMA_SYSCONFIG_AUTOIDLE			(1 << 0) - -#define DMA_SYSCONFIG_MIDLEMODE(n)		((n) << 12) -#define DMA_SYSCONFIG_SIDLEMODE(n)		((n) << 3) - -#define DMA_IDLEMODE_SMARTIDLE			0x2 -#define DMA_IDLEMODE_NO_IDLE			0x1 -#define DMA_IDLEMODE_FORCE_IDLE			0x0 - -/* Chaining modes*/ -#ifndef CONFIG_ARCH_OMAP1 -#define OMAP_DMA_STATIC_CHAIN		0x1 -#define OMAP_DMA_DYNAMIC_CHAIN		0x2 -#define OMAP_DMA_CHAIN_ACTIVE		0x1 -#define OMAP_DMA_CHAIN_INACTIVE		0x0 -#endif - -#define DMA_CH_PRIO_HIGH		0x1 -#define DMA_CH_PRIO_LOW			0x0 /* Def */ - -enum omap_dma_burst_mode { -	OMAP_DMA_DATA_BURST_DIS = 0, -	OMAP_DMA_DATA_BURST_4, -	OMAP_DMA_DATA_BURST_8, -	OMAP_DMA_DATA_BURST_16, -}; - -enum end_type { -	OMAP_DMA_LITTLE_ENDIAN = 0, -	OMAP_DMA_BIG_ENDIAN -}; - -enum omap_dma_color_mode { -	OMAP_DMA_COLOR_DIS = 0, -	OMAP_DMA_CONSTANT_FILL, -	OMAP_DMA_TRANSPARENT_COPY -}; - -enum omap_dma_write_mode { -	OMAP_DMA_WRITE_NON_POSTED = 0, -	OMAP_DMA_WRITE_POSTED, -	OMAP_DMA_WRITE_LAST_NON_POSTED -}; - -enum omap_dma_channel_mode { -	OMAP_DMA_LCH_2D = 0, -	OMAP_DMA_LCH_G, -	OMAP_DMA_LCH_P, -	OMAP_DMA_LCH_PD -}; - -struct omap_dma_channel_params { -	int data_type;		/* data type 8,16,32 */ -	int elem_count;		/* number of elements in a frame */ -	int frame_count;	/* number of frames in a element */ - -	int src_port;		/* Only on OMAP1 REVISIT: Is this needed? */ -	int src_amode;		/* constant, post increment, indexed, -					double indexed */ -	unsigned long src_start;	/* source address : physical */ -	int src_ei;		/* source element index */ -	int src_fi;		/* source frame index */ - -	int dst_port;		/* Only on OMAP1 REVISIT: Is this needed? */ -	int dst_amode;		/* constant, post increment, indexed, -					double indexed */ -	unsigned long dst_start;	/* source address : physical */ -	int dst_ei;		/* source element index */ -	int dst_fi;		/* source frame index */ - -	int trigger;		/* trigger attached if the channel is -					synchronized */ -	int sync_mode;		/* sycn on element, frame , block or packet */ -	int src_or_dst_synch;	/* source synch(1) or destination synch(0) */ - -	int ie;			/* interrupt enabled */ - -	unsigned char read_prio;/* read priority */ -	unsigned char write_prio;/* write priority */ - -#ifndef CONFIG_ARCH_OMAP1 -	enum omap_dma_burst_mode burst_mode; /* Burst mode 4/8/16 words */ -#endif -}; - - -extern void omap_set_dma_priority(int lch, int dst_port, int priority); -extern int omap_request_dma(int dev_id, const char *dev_name, -			void (*callback)(int lch, u16 ch_status, void *data), -			void *data, int *dma_ch); -extern void omap_enable_dma_irq(int ch, u16 irq_bits); -extern void omap_disable_dma_irq(int ch, u16 irq_bits); -extern void omap_free_dma(int ch); -extern void omap_start_dma(int lch); -extern void omap_stop_dma(int lch); -extern void omap_set_dma_transfer_params(int lch, int data_type, -					 int elem_count, int frame_count, -					 int sync_mode, -					 int dma_trigger, int src_or_dst_synch); -extern void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, -				    u32 color); -extern void omap_set_dma_write_mode(int lch, enum omap_dma_write_mode mode); -extern void omap_set_dma_channel_mode(int lch, enum omap_dma_channel_mode mode); - -extern void omap_set_dma_src_params(int lch, int src_port, int src_amode, -				    unsigned long src_start, -				    int src_ei, int src_fi); -extern void omap_set_dma_src_index(int lch, int eidx, int fidx); -extern void omap_set_dma_src_data_pack(int lch, int enable); -extern void omap_set_dma_src_burst_mode(int lch, -					enum omap_dma_burst_mode burst_mode); - -extern void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode, -				     unsigned long dest_start, -				     int dst_ei, int dst_fi); -extern void omap_set_dma_dest_index(int lch, int eidx, int fidx); -extern void omap_set_dma_dest_data_pack(int lch, int enable); -extern void omap_set_dma_dest_burst_mode(int lch, -					 enum omap_dma_burst_mode burst_mode); - -extern void omap_set_dma_params(int lch, -				struct omap_dma_channel_params *params); - -extern void omap_dma_link_lch(int lch_head, int lch_queue); -extern void omap_dma_unlink_lch(int lch_head, int lch_queue); - -extern int omap_set_dma_callback(int lch, -			void (*callback)(int lch, u16 ch_status, void *data), -			void *data); -extern dma_addr_t omap_get_dma_src_pos(int lch); -extern dma_addr_t omap_get_dma_dst_pos(int lch); -extern void omap_clear_dma(int lch); -extern int omap_get_dma_active_status(int lch); -extern int omap_dma_running(void); -extern void omap_dma_set_global_params(int arb_rate, int max_fifo_depth, -				       int tparams); -extern int omap_dma_set_prio_lch(int lch, unsigned char read_prio, -				 unsigned char write_prio); -extern void omap_set_dma_dst_endian_type(int lch, enum end_type etype); -extern void omap_set_dma_src_endian_type(int lch, enum end_type etype); -extern int omap_get_dma_index(int lch, int *ei, int *fi); - -void omap_dma_global_context_save(void); -void omap_dma_global_context_restore(void); - -extern void omap_dma_disable_irq(int lch); - -/* Chaining APIs */ -#ifndef CONFIG_ARCH_OMAP1 -extern int omap_request_dma_chain(int dev_id, const char *dev_name, -				  void (*callback) (int lch, u16 ch_status, -						    void *data), -				  int *chain_id, int no_of_chans, -				  int chain_mode, -				  struct omap_dma_channel_params params); -extern int omap_free_dma_chain(int chain_id); -extern int omap_dma_chain_a_transfer(int chain_id, int src_start, -				     int dest_start, int elem_count, -				     int frame_count, void *callbk_data); -extern int omap_start_dma_chain_transfers(int chain_id); -extern int omap_stop_dma_chain_transfers(int chain_id); -extern int omap_get_dma_chain_index(int chain_id, int *ei, int *fi); -extern int omap_get_dma_chain_dst_pos(int chain_id); -extern int omap_get_dma_chain_src_pos(int chain_id); - -extern int omap_modify_dma_chain_params(int chain_id, -					struct omap_dma_channel_params params); -extern int omap_dma_chain_status(int chain_id); -#endif - -#if defined(CONFIG_ARCH_OMAP1) && defined(CONFIG_FB_OMAP) -#include <mach/lcd_dma.h> -#else -static inline int omap_lcd_dma_running(void) -{ -	return 0; -} -#endif - -#endif /* __ASM_ARCH_DMA_H */ diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index dfa3aff9761..dd79f3005cd 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h @@ -1,8 +1,14 @@  /* - * arch/arm/plat-omap/include/mach/dmtimer.h + * arch/arm/plat-omap/include/plat/dmtimer.h   *   * OMAP Dual-Mode Timers   * + * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ + * Tarun Kanti DebBarma <tarun.kanti@ti.com> + * Thara Gopinath <thara@ti.com> + * + * Platform device conversion and hwmod support. + *   * Copyright (C) 2005 Nokia Corporation   * Author: Lauri Leukkunen <lauri.leukkunen@nokia.com>   * PWM and clock framwork support by Timo Teras. @@ -26,6 +32,10 @@   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/platform_device.h> +  #ifndef __ASM_ARCH_DMTIMER_H  #define __ASM_ARCH_DMTIMER_H @@ -44,16 +54,82 @@  #define OMAP_TIMER_TRIGGER_OVERFLOW		0x01  #define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE	0x02 -struct omap_dm_timer; -extern struct omap_dm_timer *gptimer_wakeup; -extern struct sys_timer omap_timer; -struct clk; +/* posted mode types */ +#define OMAP_TIMER_NONPOSTED			0x00 +#define OMAP_TIMER_POSTED			0x01 + +/* timer capabilities used in hwmod database */ +#define OMAP_TIMER_SECURE				0x80000000 +#define OMAP_TIMER_ALWON				0x40000000 +#define OMAP_TIMER_HAS_PWM				0x20000000 +#define OMAP_TIMER_NEEDS_RESET				0x10000000 +#define OMAP_TIMER_HAS_DSP_IRQ				0x08000000 + +/* + * timer errata flags + * + * Errata i103/i767 impacts all OMAP3/4/5 devices including AM33xx. This + * errata prevents us from using posted mode on these devices, unless the + * timer counter register is never read. For more details please refer to + * the OMAP3/4/5 errata documents. + */ +#define OMAP_TIMER_ERRATA_I103_I767			0x80000000 + +struct omap_timer_capability_dev_attr { +	u32 timer_capability; +}; + +struct timer_regs { +	u32 tidr; +	u32 tier; +	u32 twer; +	u32 tclr; +	u32 tcrr; +	u32 tldr; +	u32 ttrg; +	u32 twps; +	u32 tmar; +	u32 tcar1; +	u32 tsicr; +	u32 tcar2; +	u32 tpir; +	u32 tnir; +	u32 tcvr; +	u32 tocr; +	u32 towr; +}; + +struct omap_dm_timer { +	int id; +	int irq; +	struct clk *fclk; + +	void __iomem	*io_base; +	void __iomem	*irq_stat;	/* TISR/IRQSTATUS interrupt status */ +	void __iomem	*irq_ena;	/* irq enable */ +	void __iomem	*irq_dis;	/* irq disable, only on v2 ip */ +	void __iomem	*pend;		/* write pending */ +	void __iomem	*func_base;	/* function register base */ -int omap_dm_timer_init(void); +	unsigned long rate; +	unsigned reserved:1; +	unsigned posted:1; +	struct timer_regs context; +	int (*get_context_loss_count)(struct device *); +	int ctx_loss_count; +	int revision; +	u32 capability; +	u32 errata; +	struct platform_device *pdev; +	struct list_head node; +}; +int omap_dm_timer_reserve_systimer(int id);  struct omap_dm_timer *omap_dm_timer_request(void);  struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); -void omap_dm_timer_free(struct omap_dm_timer *timer); +struct omap_dm_timer *omap_dm_timer_request_by_cap(u32 cap); +struct omap_dm_timer *omap_dm_timer_request_by_node(struct device_node *np); +int omap_dm_timer_free(struct omap_dm_timer *timer);  void omap_dm_timer_enable(struct omap_dm_timer *timer);  void omap_dm_timer_disable(struct omap_dm_timer *timer); @@ -62,25 +138,281 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer);  u32 omap_dm_timer_modify_idlect_mask(u32 inputmask);  struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); -void omap_dm_timer_trigger(struct omap_dm_timer *timer); -void omap_dm_timer_start(struct omap_dm_timer *timer); -void omap_dm_timer_stop(struct omap_dm_timer *timer); +int omap_dm_timer_trigger(struct omap_dm_timer *timer); +int omap_dm_timer_start(struct omap_dm_timer *timer); +int omap_dm_timer_stop(struct omap_dm_timer *timer);  int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); -void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); -void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); -void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); -void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); -void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); +int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); +int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); +int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); +int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); +int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); -void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); +int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); +int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask);  unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); -void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); +int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value);  unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer); -void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value); +int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value);  int omap_dm_timers_active(void); +/* + * Do not use the defines below, they are not needed. They should be only + * used by dmtimer.c and sys_timer related code. + */ + +/* + * The interrupt registers are different between v1 and v2 ip. + * These registers are offsets from timer->iobase. + */ +#define OMAP_TIMER_ID_OFFSET		0x00 +#define OMAP_TIMER_OCP_CFG_OFFSET	0x10 + +#define OMAP_TIMER_V1_SYS_STAT_OFFSET	0x14 +#define OMAP_TIMER_V1_STAT_OFFSET	0x18 +#define OMAP_TIMER_V1_INT_EN_OFFSET	0x1c + +#define OMAP_TIMER_V2_IRQSTATUS_RAW	0x24 +#define OMAP_TIMER_V2_IRQSTATUS		0x28 +#define OMAP_TIMER_V2_IRQENABLE_SET	0x2c +#define OMAP_TIMER_V2_IRQENABLE_CLR	0x30 + +/* + * The functional registers have a different base on v1 and v2 ip. + * These registers are offsets from timer->func_base. The func_base + * is samae as io_base for v1 and io_base + 0x14 for v2 ip. + * + */ +#define OMAP_TIMER_V2_FUNC_OFFSET		0x14 + +#define _OMAP_TIMER_WAKEUP_EN_OFFSET	0x20 +#define _OMAP_TIMER_CTRL_OFFSET		0x24 +#define		OMAP_TIMER_CTRL_GPOCFG		(1 << 14) +#define		OMAP_TIMER_CTRL_CAPTMODE	(1 << 13) +#define		OMAP_TIMER_CTRL_PT		(1 << 12) +#define		OMAP_TIMER_CTRL_TCM_LOWTOHIGH	(0x1 << 8) +#define		OMAP_TIMER_CTRL_TCM_HIGHTOLOW	(0x2 << 8) +#define		OMAP_TIMER_CTRL_TCM_BOTHEDGES	(0x3 << 8) +#define		OMAP_TIMER_CTRL_SCPWM		(1 << 7) +#define		OMAP_TIMER_CTRL_CE		(1 << 6) /* compare enable */ +#define		OMAP_TIMER_CTRL_PRE		(1 << 5) /* prescaler enable */ +#define		OMAP_TIMER_CTRL_PTV_SHIFT	2 /* prescaler value shift */ +#define		OMAP_TIMER_CTRL_POSTED		(1 << 2) +#define		OMAP_TIMER_CTRL_AR		(1 << 1) /* auto-reload enable */ +#define		OMAP_TIMER_CTRL_ST		(1 << 0) /* start timer */ +#define _OMAP_TIMER_COUNTER_OFFSET	0x28 +#define _OMAP_TIMER_LOAD_OFFSET		0x2c +#define _OMAP_TIMER_TRIGGER_OFFSET	0x30 +#define _OMAP_TIMER_WRITE_PEND_OFFSET	0x34 +#define		WP_NONE			0	/* no write pending bit */ +#define		WP_TCLR			(1 << 0) +#define		WP_TCRR			(1 << 1) +#define		WP_TLDR			(1 << 2) +#define		WP_TTGR			(1 << 3) +#define		WP_TMAR			(1 << 4) +#define		WP_TPIR			(1 << 5) +#define		WP_TNIR			(1 << 6) +#define		WP_TCVR			(1 << 7) +#define		WP_TOCR			(1 << 8) +#define		WP_TOWR			(1 << 9) +#define _OMAP_TIMER_MATCH_OFFSET	0x38 +#define _OMAP_TIMER_CAPTURE_OFFSET	0x3c +#define _OMAP_TIMER_IF_CTRL_OFFSET	0x40 +#define _OMAP_TIMER_CAPTURE2_OFFSET		0x44	/* TCAR2, 34xx only */ +#define _OMAP_TIMER_TICK_POS_OFFSET		0x48	/* TPIR, 34xx only */ +#define _OMAP_TIMER_TICK_NEG_OFFSET		0x4c	/* TNIR, 34xx only */ +#define _OMAP_TIMER_TICK_COUNT_OFFSET		0x50	/* TCVR, 34xx only */ +#define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET	0x54	/* TOCR, 34xx only */ +#define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET	0x58	/* TOWR, 34xx only */ + +/* register offsets with the write pending bit encoded */ +#define	WPSHIFT					16 + +#define OMAP_TIMER_WAKEUP_EN_REG		(_OMAP_TIMER_WAKEUP_EN_OFFSET \ +							| (WP_NONE << WPSHIFT)) + +#define OMAP_TIMER_CTRL_REG			(_OMAP_TIMER_CTRL_OFFSET \ +							| (WP_TCLR << WPSHIFT)) + +#define OMAP_TIMER_COUNTER_REG			(_OMAP_TIMER_COUNTER_OFFSET \ +							| (WP_TCRR << WPSHIFT)) + +#define OMAP_TIMER_LOAD_REG			(_OMAP_TIMER_LOAD_OFFSET \ +							| (WP_TLDR << WPSHIFT)) + +#define OMAP_TIMER_TRIGGER_REG			(_OMAP_TIMER_TRIGGER_OFFSET \ +							| (WP_TTGR << WPSHIFT)) + +#define OMAP_TIMER_WRITE_PEND_REG		(_OMAP_TIMER_WRITE_PEND_OFFSET \ +							| (WP_NONE << WPSHIFT)) + +#define OMAP_TIMER_MATCH_REG			(_OMAP_TIMER_MATCH_OFFSET \ +							| (WP_TMAR << WPSHIFT)) + +#define OMAP_TIMER_CAPTURE_REG			(_OMAP_TIMER_CAPTURE_OFFSET \ +							| (WP_NONE << WPSHIFT)) + +#define OMAP_TIMER_IF_CTRL_REG			(_OMAP_TIMER_IF_CTRL_OFFSET \ +							| (WP_NONE << WPSHIFT)) + +#define OMAP_TIMER_CAPTURE2_REG			(_OMAP_TIMER_CAPTURE2_OFFSET \ +							| (WP_NONE << WPSHIFT)) + +#define OMAP_TIMER_TICK_POS_REG			(_OMAP_TIMER_TICK_POS_OFFSET \ +							| (WP_TPIR << WPSHIFT)) + +#define OMAP_TIMER_TICK_NEG_REG			(_OMAP_TIMER_TICK_NEG_OFFSET \ +							| (WP_TNIR << WPSHIFT)) + +#define OMAP_TIMER_TICK_COUNT_REG		(_OMAP_TIMER_TICK_COUNT_OFFSET \ +							| (WP_TCVR << WPSHIFT)) + +#define OMAP_TIMER_TICK_INT_MASK_SET_REG				\ +		(_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT)) + +#define OMAP_TIMER_TICK_INT_MASK_COUNT_REG				\ +		(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT)) + +static inline u32 __omap_dm_timer_read(struct omap_dm_timer *timer, u32 reg, +						int posted) +{ +	if (posted) +		while (readl_relaxed(timer->pend) & (reg >> WPSHIFT)) +			cpu_relax(); + +	return readl_relaxed(timer->func_base + (reg & 0xff)); +} + +static inline void __omap_dm_timer_write(struct omap_dm_timer *timer, +					u32 reg, u32 val, int posted) +{ +	if (posted) +		while (readl_relaxed(timer->pend) & (reg >> WPSHIFT)) +			cpu_relax(); + +	writel_relaxed(val, timer->func_base + (reg & 0xff)); +} + +static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer) +{ +	u32 tidr; + +	/* Assume v1 ip if bits [31:16] are zero */ +	tidr = readl_relaxed(timer->io_base); +	if (!(tidr >> 16)) { +		timer->revision = 1; +		timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET; +		timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET; +		timer->irq_dis = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET; +		timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET; +		timer->func_base = timer->io_base; +	} else { +		timer->revision = 2; +		timer->irq_stat = timer->io_base + OMAP_TIMER_V2_IRQSTATUS; +		timer->irq_ena = timer->io_base + OMAP_TIMER_V2_IRQENABLE_SET; +		timer->irq_dis = timer->io_base + OMAP_TIMER_V2_IRQENABLE_CLR; +		timer->pend = timer->io_base + +			_OMAP_TIMER_WRITE_PEND_OFFSET + +				OMAP_TIMER_V2_FUNC_OFFSET; +		timer->func_base = timer->io_base + OMAP_TIMER_V2_FUNC_OFFSET; +	} +} + +/* + * __omap_dm_timer_enable_posted - enables write posted mode + * @timer:      pointer to timer instance handle + * + * Enables the write posted mode for the timer. When posted mode is enabled + * writes to certain timer registers are immediately acknowledged by the + * internal bus and hence prevents stalling the CPU waiting for the write to + * complete. Enabling this feature can improve performance for writing to the + * timer registers. + */ +static inline void __omap_dm_timer_enable_posted(struct omap_dm_timer *timer) +{ +	if (timer->posted) +		return; + +	if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) { +		timer->posted = OMAP_TIMER_NONPOSTED; +		__omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0, 0); +		return; +	} + +	__omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, +			      OMAP_TIMER_CTRL_POSTED, 0); +	timer->context.tsicr = OMAP_TIMER_CTRL_POSTED; +	timer->posted = OMAP_TIMER_POSTED; +} + +/** + * __omap_dm_timer_override_errata - override errata flags for a timer + * @timer:      pointer to timer handle + * @errata:	errata flags to be ignored + * + * For a given timer, override a timer errata by clearing the flags + * specified by the errata argument. A specific erratum should only be + * overridden for a timer if the timer is used in such a way the erratum + * has no impact. + */ +static inline void __omap_dm_timer_override_errata(struct omap_dm_timer *timer, +						   u32 errata) +{ +	timer->errata &= ~errata; +} + +static inline void __omap_dm_timer_stop(struct omap_dm_timer *timer, +					int posted, unsigned long rate) +{ +	u32 l; + +	l = __omap_dm_timer_read(timer, OMAP_TIMER_CTRL_REG, posted); +	if (l & OMAP_TIMER_CTRL_ST) { +		l &= ~0x1; +		__omap_dm_timer_write(timer, OMAP_TIMER_CTRL_REG, l, posted); +#ifdef CONFIG_ARCH_OMAP2PLUS +		/* Readback to make sure write has completed */ +		__omap_dm_timer_read(timer, OMAP_TIMER_CTRL_REG, posted); +		/* +		 * Wait for functional clock period x 3.5 to make sure that +		 * timer is stopped +		 */ +		udelay(3500000 / rate + 1); +#endif +	} + +	/* Ack possibly pending interrupt */ +	writel_relaxed(OMAP_TIMER_INT_OVERFLOW, timer->irq_stat); +} + +static inline void __omap_dm_timer_load_start(struct omap_dm_timer *timer, +						u32 ctrl, unsigned int load, +						int posted) +{ +	__omap_dm_timer_write(timer, OMAP_TIMER_COUNTER_REG, load, posted); +	__omap_dm_timer_write(timer, OMAP_TIMER_CTRL_REG, ctrl, posted); +} + +static inline void __omap_dm_timer_int_enable(struct omap_dm_timer *timer, +						unsigned int value) +{ +	writel_relaxed(value, timer->irq_ena); +	__omap_dm_timer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, value, 0); +} + +static inline unsigned int +__omap_dm_timer_read_counter(struct omap_dm_timer *timer, int posted) +{ +	return __omap_dm_timer_read(timer, OMAP_TIMER_COUNTER_REG, posted); +} + +static inline void __omap_dm_timer_write_status(struct omap_dm_timer *timer, +						unsigned int value) +{ +	writel_relaxed(value, timer->irq_stat); +}  #endif /* __ASM_ARCH_DMTIMER_H */ diff --git a/arch/arm/plat-omap/include/plat/dsp.h b/arch/arm/plat-omap/include/plat/dsp.h deleted file mode 100644 index 9c604b390f9..00000000000 --- a/arch/arm/plat-omap/include/plat/dsp.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __OMAP_DSP_H__ -#define __OMAP_DSP_H__ - -#include <linux/types.h> - -struct omap_dsp_platform_data { -	void (*dsp_set_min_opp) (u8 opp_id); -	u8 (*dsp_get_opp) (void); -	void (*cpu_set_freq) (unsigned long f); -	unsigned long (*cpu_get_freq) (void); -	unsigned long mpu_speed[6]; - -	/* functions to write and read PRCM registers */ -	void (*dsp_prm_write)(u32, s16 , u16); -	u32 (*dsp_prm_read)(s16 , u16); -	u32 (*dsp_prm_rmw_bits)(u32, u32, s16, s16); -	void (*dsp_cm_write)(u32, s16 , u16); -	u32 (*dsp_cm_read)(s16 , u16); -	u32 (*dsp_cm_rmw_bits)(u32, u32, s16, s16); - -	phys_addr_t phys_mempool_base; -	phys_addr_t phys_mempool_size; -}; - -#if defined(CONFIG_TIDSPBRIDGE) || defined(CONFIG_TIDSPBRIDGE_MODULE) -extern void omap_dsp_reserve_sdram_memblock(void); -#else -static inline void omap_dsp_reserve_sdram_memblock(void) { } -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/flash.h b/arch/arm/plat-omap/include/plat/flash.h deleted file mode 100644 index 3e6327016b4..00000000000 --- a/arch/arm/plat-omap/include/plat/flash.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Flash support for OMAP1 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __OMAP_FLASH_H -#define __OMAP_FLASH_H - -#include <linux/mtd/map.h> - -extern void omap1_set_vpp(struct map_info *map, int enable); - -#endif diff --git a/arch/arm/plat-omap/include/plat/fpga.h b/arch/arm/plat-omap/include/plat/fpga.h deleted file mode 100644 index f1864a652f7..00000000000 --- a/arch/arm/plat-omap/include/plat/fpga.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/fpga.h - * - * Interrupt handler for OMAP-1510 FPGA - * - * Copyright (C) 2001 RidgeRun, Inc. - * Author: Greg Lonnon <glonnon@ridgerun.com> - * - * Copyright (C) 2002 MontaVista Software, Inc. - * - * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6 - * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARCH_OMAP_FPGA_H -#define __ASM_ARCH_OMAP_FPGA_H - -#if defined(CONFIG_MACH_OMAP_INNOVATOR) && defined(CONFIG_ARCH_OMAP15XX) -extern void omap1510_fpga_init_irq(void); -#else -#define omap1510_fpga_init_irq()	(0) -#endif - -#define fpga_read(reg)			__raw_readb(reg) -#define fpga_write(val, reg)		__raw_writeb(val, reg) - -/* - * --------------------------------------------------------------------------- - *  H2/P2 Debug board FPGA - * --------------------------------------------------------------------------- - */ -/* maps in the FPGA registers and the ETHR registers */ -#define H2P2_DBG_FPGA_BASE		IOMEM(0xE8000000)	/* VA */ -#define H2P2_DBG_FPGA_SIZE		SZ_4K			/* SIZE */ -#define H2P2_DBG_FPGA_START		0x04000000		/* PA */ - -#define H2P2_DBG_FPGA_ETHR_START	(H2P2_DBG_FPGA_START + 0x300) -#define H2P2_DBG_FPGA_FPGA_REV		(H2P2_DBG_FPGA_BASE + 0x10)	/* FPGA Revision */ -#define H2P2_DBG_FPGA_BOARD_REV		(H2P2_DBG_FPGA_BASE + 0x12)	/* Board Revision */ -#define H2P2_DBG_FPGA_GPIO		(H2P2_DBG_FPGA_BASE + 0x14)	/* GPIO outputs */ -#define H2P2_DBG_FPGA_LEDS		(H2P2_DBG_FPGA_BASE + 0x16)	/* LEDs outputs */ -#define H2P2_DBG_FPGA_MISC_INPUTS	(H2P2_DBG_FPGA_BASE + 0x18)	/* Misc inputs */ -#define H2P2_DBG_FPGA_LAN_STATUS	(H2P2_DBG_FPGA_BASE + 0x1A)	/* LAN Status line */ -#define H2P2_DBG_FPGA_LAN_RESET		(H2P2_DBG_FPGA_BASE + 0x1C)	/* LAN Reset line */ - -/* NOTE:  most boards don't have a static mapping for the FPGA ... */ -struct h2p2_dbg_fpga { -	/* offset 0x00 */ -	u16		smc91x[8]; -	/* offset 0x10 */ -	u16		fpga_rev; -	u16		board_rev; -	u16		gpio_outputs; -	u16		leds; -	/* offset 0x18 */ -	u16		misc_inputs; -	u16		lan_status; -	u16		lan_reset; -	u16		reserved0; -	/* offset 0x20 */ -	u16		ps2_data; -	u16		ps2_ctrl; -	/* plus also 4 rs232 ports ... */ -}; - -/* LEDs definition on debug board (16 LEDs, all physically green) */ -#define H2P2_DBG_FPGA_LED_GREEN		(1 << 15) -#define H2P2_DBG_FPGA_LED_AMBER		(1 << 14) -#define H2P2_DBG_FPGA_LED_RED		(1 << 13) -#define H2P2_DBG_FPGA_LED_BLUE		(1 << 12) -/*  cpu0 load-meter LEDs */ -#define H2P2_DBG_FPGA_LOAD_METER	(1 << 0)	// A bit of fun on our board ... -#define H2P2_DBG_FPGA_LOAD_METER_SIZE	11 -#define H2P2_DBG_FPGA_LOAD_METER_MASK	((1 << H2P2_DBG_FPGA_LOAD_METER_SIZE) - 1) - -#define H2P2_DBG_FPGA_P2_LED_TIMER		(1 << 0) -#define H2P2_DBG_FPGA_P2_LED_IDLE		(1 << 1) - -/* - * --------------------------------------------------------------------------- - *  OMAP-1510 FPGA - * --------------------------------------------------------------------------- - */ -#define OMAP1510_FPGA_BASE		IOMEM(0xE8000000)	/* VA */ -#define OMAP1510_FPGA_SIZE		SZ_4K -#define OMAP1510_FPGA_START		0x08000000		/* PA */ - -/* Revision */ -#define OMAP1510_FPGA_REV_LOW			(OMAP1510_FPGA_BASE + 0x0) -#define OMAP1510_FPGA_REV_HIGH			(OMAP1510_FPGA_BASE + 0x1) - -#define OMAP1510_FPGA_LCD_PANEL_CONTROL		(OMAP1510_FPGA_BASE + 0x2) -#define OMAP1510_FPGA_LED_DIGIT			(OMAP1510_FPGA_BASE + 0x3) -#define INNOVATOR_FPGA_HID_SPI			(OMAP1510_FPGA_BASE + 0x4) -#define OMAP1510_FPGA_POWER			(OMAP1510_FPGA_BASE + 0x5) - -/* Interrupt status */ -#define OMAP1510_FPGA_ISR_LO			(OMAP1510_FPGA_BASE + 0x6) -#define OMAP1510_FPGA_ISR_HI			(OMAP1510_FPGA_BASE + 0x7) - -/* Interrupt mask */ -#define OMAP1510_FPGA_IMR_LO			(OMAP1510_FPGA_BASE + 0x8) -#define OMAP1510_FPGA_IMR_HI			(OMAP1510_FPGA_BASE + 0x9) - -/* Reset registers */ -#define OMAP1510_FPGA_HOST_RESET		(OMAP1510_FPGA_BASE + 0xa) -#define OMAP1510_FPGA_RST			(OMAP1510_FPGA_BASE + 0xb) - -#define OMAP1510_FPGA_AUDIO			(OMAP1510_FPGA_BASE + 0xc) -#define OMAP1510_FPGA_DIP			(OMAP1510_FPGA_BASE + 0xe) -#define OMAP1510_FPGA_FPGA_IO			(OMAP1510_FPGA_BASE + 0xf) -#define OMAP1510_FPGA_UART1			(OMAP1510_FPGA_BASE + 0x14) -#define OMAP1510_FPGA_UART2			(OMAP1510_FPGA_BASE + 0x15) -#define OMAP1510_FPGA_OMAP1510_STATUS		(OMAP1510_FPGA_BASE + 0x16) -#define OMAP1510_FPGA_BOARD_REV			(OMAP1510_FPGA_BASE + 0x18) -#define OMAP1510P1_PPT_DATA			(OMAP1510_FPGA_BASE + 0x100) -#define OMAP1510P1_PPT_STATUS			(OMAP1510_FPGA_BASE + 0x101) -#define OMAP1510P1_PPT_CONTROL			(OMAP1510_FPGA_BASE + 0x102) - -#define OMAP1510_FPGA_TOUCHSCREEN		(OMAP1510_FPGA_BASE + 0x204) - -#define INNOVATOR_FPGA_INFO			(OMAP1510_FPGA_BASE + 0x205) -#define INNOVATOR_FPGA_LCD_BRIGHT_LO		(OMAP1510_FPGA_BASE + 0x206) -#define INNOVATOR_FPGA_LCD_BRIGHT_HI		(OMAP1510_FPGA_BASE + 0x207) -#define INNOVATOR_FPGA_LED_GRN_LO		(OMAP1510_FPGA_BASE + 0x208) -#define INNOVATOR_FPGA_LED_GRN_HI		(OMAP1510_FPGA_BASE + 0x209) -#define INNOVATOR_FPGA_LED_RED_LO		(OMAP1510_FPGA_BASE + 0x20a) -#define INNOVATOR_FPGA_LED_RED_HI		(OMAP1510_FPGA_BASE + 0x20b) -#define INNOVATOR_FPGA_CAM_USB_CONTROL		(OMAP1510_FPGA_BASE + 0x20c) -#define INNOVATOR_FPGA_EXP_CONTROL		(OMAP1510_FPGA_BASE + 0x20d) -#define INNOVATOR_FPGA_ISR2			(OMAP1510_FPGA_BASE + 0x20e) -#define INNOVATOR_FPGA_IMR2			(OMAP1510_FPGA_BASE + 0x210) - -#define OMAP1510_FPGA_ETHR_START		(OMAP1510_FPGA_START + 0x300) - -/* - * Power up Giga UART driver, turn on HID clock. - * Turn off BT power, since we're not using it and it - * draws power. - */ -#define OMAP1510_FPGA_RESET_VALUE		0x42 - -#define OMAP1510_FPGA_PCR_IF_PD0		(1 << 7) -#define OMAP1510_FPGA_PCR_COM2_EN		(1 << 6) -#define OMAP1510_FPGA_PCR_COM1_EN		(1 << 5) -#define OMAP1510_FPGA_PCR_EXP_PD0		(1 << 4) -#define OMAP1510_FPGA_PCR_EXP_PD1		(1 << 3) -#define OMAP1510_FPGA_PCR_48MHZ_CLK		(1 << 2) -#define OMAP1510_FPGA_PCR_4MHZ_CLK		(1 << 1) -#define OMAP1510_FPGA_PCR_RSRVD_BIT0		(1 << 0) - -/* - * Innovator/OMAP1510 FPGA HID register bit definitions - */ -#define OMAP1510_FPGA_HID_SCLK	(1<<0)	/* output */ -#define OMAP1510_FPGA_HID_MOSI	(1<<1)	/* output */ -#define OMAP1510_FPGA_HID_nSS	(1<<2)	/* output 0/1 chip idle/select */ -#define OMAP1510_FPGA_HID_nHSUS	(1<<3)	/* output 0/1 host active/suspended */ -#define OMAP1510_FPGA_HID_MISO	(1<<4)	/* input */ -#define OMAP1510_FPGA_HID_ATN	(1<<5)	/* input  0/1 chip idle/ATN */ -#define OMAP1510_FPGA_HID_rsrvd	(1<<6) -#define OMAP1510_FPGA_HID_RESETn (1<<7)	/* output - 0/1 USAR reset/run */ - -/* The FPGA IRQ is cascaded through GPIO_13 */ -#define OMAP1510_INT_FPGA		(IH_GPIO_BASE + 13) - -/* IRQ Numbers for interrupts muxed through the FPGA */ -#define OMAP1510_INT_FPGA_ATN		(OMAP_FPGA_IRQ_BASE + 0) -#define OMAP1510_INT_FPGA_ACK		(OMAP_FPGA_IRQ_BASE + 1) -#define OMAP1510_INT_FPGA2		(OMAP_FPGA_IRQ_BASE + 2) -#define OMAP1510_INT_FPGA3		(OMAP_FPGA_IRQ_BASE + 3) -#define OMAP1510_INT_FPGA4		(OMAP_FPGA_IRQ_BASE + 4) -#define OMAP1510_INT_FPGA5		(OMAP_FPGA_IRQ_BASE + 5) -#define OMAP1510_INT_FPGA6		(OMAP_FPGA_IRQ_BASE + 6) -#define OMAP1510_INT_FPGA7		(OMAP_FPGA_IRQ_BASE + 7) -#define OMAP1510_INT_FPGA8		(OMAP_FPGA_IRQ_BASE + 8) -#define OMAP1510_INT_FPGA9		(OMAP_FPGA_IRQ_BASE + 9) -#define OMAP1510_INT_FPGA10		(OMAP_FPGA_IRQ_BASE + 10) -#define OMAP1510_INT_FPGA11		(OMAP_FPGA_IRQ_BASE + 11) -#define OMAP1510_INT_FPGA12		(OMAP_FPGA_IRQ_BASE + 12) -#define OMAP1510_INT_ETHER		(OMAP_FPGA_IRQ_BASE + 13) -#define OMAP1510_INT_FPGAUART1		(OMAP_FPGA_IRQ_BASE + 14) -#define OMAP1510_INT_FPGAUART2		(OMAP_FPGA_IRQ_BASE + 15) -#define OMAP1510_INT_FPGA_TS		(OMAP_FPGA_IRQ_BASE + 16) -#define OMAP1510_INT_FPGA17		(OMAP_FPGA_IRQ_BASE + 17) -#define OMAP1510_INT_FPGA_CAM		(OMAP_FPGA_IRQ_BASE + 18) -#define OMAP1510_INT_FPGA_RTC_A		(OMAP_FPGA_IRQ_BASE + 19) -#define OMAP1510_INT_FPGA_RTC_B		(OMAP_FPGA_IRQ_BASE + 20) -#define OMAP1510_INT_FPGA_CD		(OMAP_FPGA_IRQ_BASE + 21) -#define OMAP1510_INT_FPGA22		(OMAP_FPGA_IRQ_BASE + 22) -#define OMAP1510_INT_FPGA23		(OMAP_FPGA_IRQ_BASE + 23) - -#endif diff --git a/arch/arm/plat-omap/include/plat/gpio-switch.h b/arch/arm/plat-omap/include/plat/gpio-switch.h deleted file mode 100644 index 10da0e07c0c..00000000000 --- a/arch/arm/plat-omap/include/plat/gpio-switch.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * GPIO switch definitions - * - * Copyright (C) 2006 Nokia Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARCH_OMAP_GPIO_SWITCH_H -#define __ASM_ARCH_OMAP_GPIO_SWITCH_H - -#include <linux/types.h> - -/* Cover: - *	high -> closed - *	low  -> open - * Connection: - *	high -> connected - *	low  -> disconnected - * Activity: - *	high -> active - *	low  -> inactive - * - */ -#define OMAP_GPIO_SWITCH_TYPE_COVER		0x0000 -#define OMAP_GPIO_SWITCH_TYPE_CONNECTION	0x0001 -#define OMAP_GPIO_SWITCH_TYPE_ACTIVITY		0x0002 -#define OMAP_GPIO_SWITCH_FLAG_INVERTED		0x0001 -#define OMAP_GPIO_SWITCH_FLAG_OUTPUT		0x0002 - -struct omap_gpio_switch { -	const char *name; -	s16 gpio; -	unsigned flags:4; -	unsigned type:4; - -	/* Time in ms to debounce when transitioning from -	 * inactive state to active state. */ -	u16 debounce_rising; -	/* Same for transition from active to inactive state. */ -	u16 debounce_falling; - -	/* notify board-specific code about state changes */ -	void (* notify)(void *data, int state); -	void *notify_data; -}; - -/* Call at init time only */ -extern void omap_register_gpio_switches(const struct omap_gpio_switch *tbl, -					int count); - -#endif diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h deleted file mode 100644 index de1c604962e..00000000000 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/gpio.h - * - * OMAP GPIO handling defines and functions - * - * Copyright (C) 2003-2005 Nokia Corporation - * - * Written by Juha Yrjölä <juha.yrjola@nokia.com> - * - * 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 - * - */ - -#ifndef __ASM_ARCH_OMAP_GPIO_H -#define __ASM_ARCH_OMAP_GPIO_H - -#include <linux/io.h> -#include <mach/irqs.h> - -#define OMAP1_MPUIO_BASE			0xfffb5000 - -#if (defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)) - -#define OMAP_MPUIO_INPUT_LATCH		0x00 -#define OMAP_MPUIO_OUTPUT		0x02 -#define OMAP_MPUIO_IO_CNTL		0x04 -#define OMAP_MPUIO_KBR_LATCH		0x08 -#define OMAP_MPUIO_KBC			0x0a -#define OMAP_MPUIO_GPIO_EVENT_MODE	0x0c -#define OMAP_MPUIO_GPIO_INT_EDGE	0x0e -#define OMAP_MPUIO_KBD_INT		0x10 -#define OMAP_MPUIO_GPIO_INT		0x12 -#define OMAP_MPUIO_KBD_MASKIT		0x14 -#define OMAP_MPUIO_GPIO_MASKIT		0x16 -#define OMAP_MPUIO_GPIO_DEBOUNCING	0x18 -#define OMAP_MPUIO_LATCH		0x1a -#else -#define OMAP_MPUIO_INPUT_LATCH		0x00 -#define OMAP_MPUIO_OUTPUT		0x04 -#define OMAP_MPUIO_IO_CNTL		0x08 -#define OMAP_MPUIO_KBR_LATCH		0x10 -#define OMAP_MPUIO_KBC			0x14 -#define OMAP_MPUIO_GPIO_EVENT_MODE	0x18 -#define OMAP_MPUIO_GPIO_INT_EDGE	0x1c -#define OMAP_MPUIO_KBD_INT		0x20 -#define OMAP_MPUIO_GPIO_INT		0x24 -#define OMAP_MPUIO_KBD_MASKIT		0x28 -#define OMAP_MPUIO_GPIO_MASKIT		0x2c -#define OMAP_MPUIO_GPIO_DEBOUNCING	0x30 -#define OMAP_MPUIO_LATCH		0x34 -#endif - -#define OMAP34XX_NR_GPIOS		6 - -#define OMAP_MPUIO(nr)		(OMAP_MAX_GPIO_LINES + (nr)) -#define OMAP_GPIO_IS_MPUIO(nr)	((nr) >= OMAP_MAX_GPIO_LINES) - -#define OMAP_GPIO_IRQ(nr)	(OMAP_GPIO_IS_MPUIO(nr) ? \ -				 IH_MPUIO_BASE + ((nr) & 0x0f) : \ -				 IH_GPIO_BASE + (nr)) - -extern int omap_gpio_init(void);	/* Call from board init only */ -extern void omap2_gpio_prepare_for_idle(int power_state); -extern void omap2_gpio_resume_after_idle(void); -extern void omap_set_gpio_debounce(int gpio, int enable); -extern void omap_set_gpio_debounce_time(int gpio, int enable); -extern void omap_gpio_save_context(void); -extern void omap_gpio_restore_context(void); -/*-------------------------------------------------------------------------*/ - -/* Wrappers for "new style" GPIO calls, using the new infrastructure - * which lets us plug in FPGA, I2C, and other implementations. - * * - * The original OMAP-specfic calls should eventually be removed. - */ - -#include <linux/errno.h> -#include <asm-generic/gpio.h> - -static inline int gpio_get_value(unsigned gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned gpio) -{ -	return __gpio_to_irq(gpio); -} - -static inline int irq_to_gpio(unsigned irq) -{ -	int tmp; - -	/* omap1 SOC mpuio */ -	if (cpu_class_is_omap1() && (irq < (IH_MPUIO_BASE + 16))) -		return (irq - IH_MPUIO_BASE) + OMAP_MAX_GPIO_LINES; - -	/* SOC gpio */ -	tmp = irq - IH_GPIO_BASE; -	if (tmp < OMAP_MAX_GPIO_LINES) -		return tmp; - -	/* we don't supply reverse mappings for non-SOC gpios */ -	return -EIO; -} - -#endif diff --git a/arch/arm/plat-omap/include/plat/gpmc-smc91x.h b/arch/arm/plat-omap/include/plat/gpmc-smc91x.h deleted file mode 100644 index b64fbee4d56..00000000000 --- a/arch/arm/plat-omap/include/plat/gpmc-smc91x.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/gpmc-smc91x.h - * - * Copyright (C) 2009 Nokia Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARCH_OMAP_GPMC_SMC91X_H__ - -#define GPMC_TIMINGS_SMC91C96	(1 << 4) -#define GPMC_MUX_ADD_DATA	(1 << 5) /* GPMC_CONFIG1_MUXADDDATA */ -#define GPMC_READ_MON		(1 << 6) /* GPMC_CONFIG1_WAIT_READ_MON */ -#define GPMC_WRITE_MON		(1 << 7) /* GPMC_CONFIG1_WAIT_WRITE_MON */ - -struct omap_smc91x_platform_data { -	int	cs; -	int	gpio_irq; -	int	gpio_pwrdwn; -	int	gpio_reset; -	int	wait_pin;	/* Optional GPMC_CONFIG1_WAITPINSELECT */ -	u32	flags; -	int	(*retime)(void); -}; - -#if defined(CONFIG_SMC91X) || \ -	defined(CONFIG_SMC91X_MODULE) - -extern void gpmc_smc91x_init(struct omap_smc91x_platform_data *d); - -#else - -#define board_smc91x_data	NULL - -static inline void gpmc_smc91x_init(struct omap_smc91x_platform_data *d) -{ -} - -#endif -#endif diff --git a/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h b/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h deleted file mode 100644 index 872de0bf1e6..00000000000 --- a/arch/arm/plat-omap/include/plat/gpmc-smsc911x.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * arch/arm/plat-omap/include/plat/gpmc-smsc911x.h - * - * Copyright (C) 2009 Li-Pro.Net - * Stephan Linz <linz@li-pro.net> - * - * Modified from arch/arm/plat-omap/include/plat/gpmc-smc91x.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__ - -struct omap_smsc911x_platform_data { -	int	cs; -	int	gpio_irq; -	int	gpio_reset; -	u32	flags; -}; - -#if defined(CONFIG_SMSC911X) || \ -	defined(CONFIG_SMSC911X_MODULE) - -extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d); - -#else - -static inline void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d) -{ -} - -#endif -#endif diff --git a/arch/arm/plat-omap/include/plat/gpmc.h b/arch/arm/plat-omap/include/plat/gpmc.h deleted file mode 100644 index 9fd99b9e40a..00000000000 --- a/arch/arm/plat-omap/include/plat/gpmc.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * General-Purpose Memory Controller for OMAP2 - * - * Copyright (C) 2005-2006 Nokia Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __OMAP2_GPMC_H -#define __OMAP2_GPMC_H - -/* Maximum Number of Chip Selects */ -#define GPMC_CS_NUM		8 - -#define GPMC_CS_CONFIG1		0x00 -#define GPMC_CS_CONFIG2		0x04 -#define GPMC_CS_CONFIG3		0x08 -#define GPMC_CS_CONFIG4		0x0c -#define GPMC_CS_CONFIG5		0x10 -#define GPMC_CS_CONFIG6		0x14 -#define GPMC_CS_CONFIG7		0x18 -#define GPMC_CS_NAND_COMMAND	0x1c -#define GPMC_CS_NAND_ADDRESS	0x20 -#define GPMC_CS_NAND_DATA	0x24 - -/* Control Commands */ -#define GPMC_CONFIG_RDY_BSY	0x00000001 -#define GPMC_CONFIG_DEV_SIZE	0x00000002 -#define GPMC_CONFIG_DEV_TYPE	0x00000003 -#define GPMC_SET_IRQ_STATUS	0x00000004 -#define GPMC_CONFIG_WP		0x00000005 - -#define GPMC_GET_IRQ_STATUS	0x00000006 -#define GPMC_PREFETCH_FIFO_CNT	0x00000007 /* bytes available in FIFO for r/w */ -#define GPMC_PREFETCH_COUNT	0x00000008 /* remaining bytes to be read/write*/ -#define GPMC_STATUS_BUFFER	0x00000009 /* 1: buffer is available to write */ - -#define GPMC_NAND_COMMAND	0x0000000a -#define GPMC_NAND_ADDRESS	0x0000000b -#define GPMC_NAND_DATA		0x0000000c - -/* ECC commands */ -#define GPMC_ECC_READ		0 /* Reset Hardware ECC for read */ -#define GPMC_ECC_WRITE		1 /* Reset Hardware ECC for write */ -#define GPMC_ECC_READSYN	2 /* Reset before syndrom is read back */ - -#define GPMC_CONFIG1_WRAPBURST_SUPP     (1 << 31) -#define GPMC_CONFIG1_READMULTIPLE_SUPP  (1 << 30) -#define GPMC_CONFIG1_READTYPE_ASYNC     (0 << 29) -#define GPMC_CONFIG1_READTYPE_SYNC      (1 << 29) -#define GPMC_CONFIG1_WRITEMULTIPLE_SUPP (1 << 28) -#define GPMC_CONFIG1_WRITETYPE_ASYNC    (0 << 27) -#define GPMC_CONFIG1_WRITETYPE_SYNC     (1 << 27) -#define GPMC_CONFIG1_CLKACTIVATIONTIME(val) ((val & 3) << 25) -#define GPMC_CONFIG1_PAGE_LEN(val)      ((val & 3) << 23) -#define GPMC_CONFIG1_WAIT_READ_MON      (1 << 22) -#define GPMC_CONFIG1_WAIT_WRITE_MON     (1 << 21) -#define GPMC_CONFIG1_WAIT_MON_IIME(val) ((val & 3) << 18) -#define GPMC_CONFIG1_WAIT_PIN_SEL(val)  ((val & 3) << 16) -#define GPMC_CONFIG1_DEVICESIZE(val)    ((val & 3) << 12) -#define GPMC_CONFIG1_DEVICESIZE_16      GPMC_CONFIG1_DEVICESIZE(1) -#define GPMC_CONFIG1_DEVICETYPE(val)    ((val & 3) << 10) -#define GPMC_CONFIG1_DEVICETYPE_NOR     GPMC_CONFIG1_DEVICETYPE(0) -#define GPMC_CONFIG1_MUXADDDATA         (1 << 9) -#define GPMC_CONFIG1_TIME_PARA_GRAN     (1 << 4) -#define GPMC_CONFIG1_FCLK_DIV(val)      (val & 3) -#define GPMC_CONFIG1_FCLK_DIV2          (GPMC_CONFIG1_FCLK_DIV(1)) -#define GPMC_CONFIG1_FCLK_DIV3          (GPMC_CONFIG1_FCLK_DIV(2)) -#define GPMC_CONFIG1_FCLK_DIV4          (GPMC_CONFIG1_FCLK_DIV(3)) -#define GPMC_CONFIG7_CSVALID		(1 << 6) - -#define GPMC_DEVICETYPE_NOR		0 -#define GPMC_DEVICETYPE_NAND		2 -#define GPMC_CONFIG_WRITEPROTECT	0x00000010 -#define GPMC_STATUS_BUFF_EMPTY		0x00000001 -#define WR_RD_PIN_MONITORING		0x00600000 -#define GPMC_PREFETCH_STATUS_FIFO_CNT(val)	((val >> 24) & 0x7F) -#define GPMC_PREFETCH_STATUS_COUNT(val)	(val & 0x00003fff) - -/* - * Note that all values in this struct are in nanoseconds, while - * the register values are in gpmc_fck cycles. - */ -struct gpmc_timings { -	/* Minimum clock period for synchronous mode */ -	u16 sync_clk; - -	/* Chip-select signal timings corresponding to GPMC_CS_CONFIG2 */ -	u16 cs_on;		/* Assertion time */ -	u16 cs_rd_off;		/* Read deassertion time */ -	u16 cs_wr_off;		/* Write deassertion time */ - -	/* ADV signal timings corresponding to GPMC_CONFIG3 */ -	u16 adv_on;		/* Assertion time */ -	u16 adv_rd_off;		/* Read deassertion time */ -	u16 adv_wr_off;		/* Write deassertion time */ - -	/* WE signals timings corresponding to GPMC_CONFIG4 */ -	u16 we_on;		/* WE assertion time */ -	u16 we_off;		/* WE deassertion time */ - -	/* OE signals timings corresponding to GPMC_CONFIG4 */ -	u16 oe_on;		/* OE assertion time */ -	u16 oe_off;		/* OE deassertion time */ - -	/* Access time and cycle time timings corresponding to GPMC_CONFIG5 */ -	u16 page_burst_access;	/* Multiple access word delay */ -	u16 access;		/* Start-cycle to first data valid delay */ -	u16 rd_cycle;		/* Total read cycle time */ -	u16 wr_cycle;		/* Total write cycle time */ - -	/* The following are only on OMAP3430 */ -	u16 wr_access;		/* WRACCESSTIME */ -	u16 wr_data_mux_bus;	/* WRDATAONADMUXBUS */ -}; - -extern unsigned int gpmc_ns_to_ticks(unsigned int time_ns); -extern unsigned int gpmc_ticks_to_ns(unsigned int ticks); -extern unsigned int gpmc_round_ns_to_ticks(unsigned int time_ns); -extern unsigned long gpmc_get_fclk_period(void); - -extern void gpmc_cs_write_reg(int cs, int idx, u32 val); -extern u32 gpmc_cs_read_reg(int cs, int idx); -extern int gpmc_cs_calc_divider(int cs, unsigned int sync_clk); -extern int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t); -extern int gpmc_cs_request(int cs, unsigned long size, unsigned long *base); -extern void gpmc_cs_free(int cs); -extern int gpmc_cs_set_reserved(int cs, int reserved); -extern int gpmc_cs_reserved(int cs); -extern int gpmc_prefetch_enable(int cs, int dma_mode, -					unsigned int u32_count, int is_write); -extern int gpmc_prefetch_reset(int cs); -extern void omap3_gpmc_save_context(void); -extern void omap3_gpmc_restore_context(void); -extern void gpmc_init(void); -extern int gpmc_read_status(int cmd); -extern int gpmc_cs_configure(int cs, int cmd, int wval); -extern int gpmc_nand_read(int cs, int cmd); -extern int gpmc_nand_write(int cs, int cmd, int wval); - -int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size); -int gpmc_calculate_ecc(int cs, const u_char *dat, u_char *ecc_code); -#endif diff --git a/arch/arm/plat-omap/include/plat/hardware.h b/arch/arm/plat-omap/include/plat/hardware.h deleted file mode 100644 index d5b26adfb89..00000000000 --- a/arch/arm/plat-omap/include/plat/hardware.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/hardware.h - * - * Hardware definitions for TI OMAP processors and boards - * - * NOTE: Please put device driver specific defines into a separate header - *	 file for each driver. - * - * Copyright (C) 2001 RidgeRun, Inc. - * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com> - * - * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com> - *                          and Dirk Behme <dirk.behme@de.bosch.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP_HARDWARE_H -#define __ASM_ARCH_OMAP_HARDWARE_H - -#include <asm/sizes.h> -#ifndef __ASSEMBLER__ -#include <asm/types.h> -#include <plat/cpu.h> -#endif -#include <plat/serial.h> - -/* - * --------------------------------------------------------------------------- - * Common definitions for all OMAP processors - * NOTE: Put all processor or board specific parts to the special header - *	 files. - * --------------------------------------------------------------------------- - */ - -/* - * ---------------------------------------------------------------------------- - * Timers - * ---------------------------------------------------------------------------- - */ -#define OMAP_MPU_TIMER1_BASE	(0xfffec500) -#define OMAP_MPU_TIMER2_BASE	(0xfffec600) -#define OMAP_MPU_TIMER3_BASE	(0xfffec700) -#define MPU_TIMER_FREE		(1 << 6) -#define MPU_TIMER_CLOCK_ENABLE	(1 << 5) -#define MPU_TIMER_AR		(1 << 1) -#define MPU_TIMER_ST		(1 << 0) - -/* - * ---------------------------------------------------------------------------- - * Clocks - * ---------------------------------------------------------------------------- - */ -#define CLKGEN_REG_BASE		(0xfffece00) -#define ARM_CKCTL		(CLKGEN_REG_BASE + 0x0) -#define ARM_IDLECT1		(CLKGEN_REG_BASE + 0x4) -#define ARM_IDLECT2		(CLKGEN_REG_BASE + 0x8) -#define ARM_EWUPCT		(CLKGEN_REG_BASE + 0xC) -#define ARM_RSTCT1		(CLKGEN_REG_BASE + 0x10) -#define ARM_RSTCT2		(CLKGEN_REG_BASE + 0x14) -#define ARM_SYSST		(CLKGEN_REG_BASE + 0x18) -#define ARM_IDLECT3		(CLKGEN_REG_BASE + 0x24) - -#define CK_RATEF		1 -#define CK_IDLEF		2 -#define CK_ENABLEF		4 -#define CK_SELECTF		8 -#define SETARM_IDLE_SHIFT - -/* DPLL control registers */ -#define DPLL_CTL		(0xfffecf00) - -/* DSP clock control. Must use __raw_readw() and __raw_writew() with these */ -#define DSP_CONFIG_REG_BASE     IOMEM(0xe1008000) -#define DSP_CKCTL		(DSP_CONFIG_REG_BASE + 0x0) -#define DSP_IDLECT1		(DSP_CONFIG_REG_BASE + 0x4) -#define DSP_IDLECT2		(DSP_CONFIG_REG_BASE + 0x8) -#define DSP_RSTCT2		(DSP_CONFIG_REG_BASE + 0x14) - -/* - * --------------------------------------------------------------------------- - * UPLD - * --------------------------------------------------------------------------- - */ -#define ULPD_REG_BASE		(0xfffe0800) -#define ULPD_IT_STATUS		(ULPD_REG_BASE + 0x14) -#define ULPD_SETUP_ANALOG_CELL_3	(ULPD_REG_BASE + 0x24) -#define ULPD_CLOCK_CTRL		(ULPD_REG_BASE + 0x30) -#	define DIS_USB_PVCI_CLK		(1 << 5)	/* no USB/FAC synch */ -#	define USB_MCLK_EN		(1 << 4)	/* enable W4_USB_CLKO */ -#define ULPD_SOFT_REQ		(ULPD_REG_BASE + 0x34) -#	define SOFT_UDC_REQ		(1 << 4) -#	define SOFT_USB_CLK_REQ		(1 << 3) -#	define SOFT_DPLL_REQ		(1 << 0) -#define ULPD_DPLL_CTRL		(ULPD_REG_BASE + 0x3c) -#define ULPD_STATUS_REQ		(ULPD_REG_BASE + 0x40) -#define ULPD_APLL_CTRL		(ULPD_REG_BASE + 0x4c) -#define ULPD_POWER_CTRL		(ULPD_REG_BASE + 0x50) -#define ULPD_SOFT_DISABLE_REQ_REG	(ULPD_REG_BASE + 0x68) -#	define DIS_MMC2_DPLL_REQ	(1 << 11) -#	define DIS_MMC1_DPLL_REQ	(1 << 10) -#	define DIS_UART3_DPLL_REQ	(1 << 9) -#	define DIS_UART2_DPLL_REQ	(1 << 8) -#	define DIS_UART1_DPLL_REQ	(1 << 7) -#	define DIS_USB_HOST_DPLL_REQ	(1 << 6) -#define ULPD_SDW_CLK_DIV_CTRL_SEL	(ULPD_REG_BASE + 0x74) -#define ULPD_CAM_CLK_CTRL	(ULPD_REG_BASE + 0x7c) - -/* - * --------------------------------------------------------------------------- - * Watchdog timer - * --------------------------------------------------------------------------- - */ - -/* Watchdog timer within the OMAP3.2 gigacell */ -#define OMAP_MPU_WATCHDOG_BASE	(0xfffec800) -#define OMAP_WDT_TIMER		(OMAP_MPU_WATCHDOG_BASE + 0x0) -#define OMAP_WDT_LOAD_TIM	(OMAP_MPU_WATCHDOG_BASE + 0x4) -#define OMAP_WDT_READ_TIM	(OMAP_MPU_WATCHDOG_BASE + 0x4) -#define OMAP_WDT_TIMER_MODE	(OMAP_MPU_WATCHDOG_BASE + 0x8) - -/* - * --------------------------------------------------------------------------- - * Interrupts - * --------------------------------------------------------------------------- - */ -#ifdef CONFIG_ARCH_OMAP1 - -/* - * XXX: These probably want to be moved to arch/arm/mach-omap/omap1/irq.c - * or something similar.. -- PFM. - */ - -#define OMAP_IH1_BASE		0xfffecb00 -#define OMAP_IH2_BASE		0xfffe0000 - -#define OMAP_IH1_ITR		(OMAP_IH1_BASE + 0x00) -#define OMAP_IH1_MIR		(OMAP_IH1_BASE + 0x04) -#define OMAP_IH1_SIR_IRQ	(OMAP_IH1_BASE + 0x10) -#define OMAP_IH1_SIR_FIQ	(OMAP_IH1_BASE + 0x14) -#define OMAP_IH1_CONTROL	(OMAP_IH1_BASE + 0x18) -#define OMAP_IH1_ILR0		(OMAP_IH1_BASE + 0x1c) -#define OMAP_IH1_ISR		(OMAP_IH1_BASE + 0x9c) - -#define OMAP_IH2_ITR		(OMAP_IH2_BASE + 0x00) -#define OMAP_IH2_MIR		(OMAP_IH2_BASE + 0x04) -#define OMAP_IH2_SIR_IRQ	(OMAP_IH2_BASE + 0x10) -#define OMAP_IH2_SIR_FIQ	(OMAP_IH2_BASE + 0x14) -#define OMAP_IH2_CONTROL	(OMAP_IH2_BASE + 0x18) -#define OMAP_IH2_ILR0		(OMAP_IH2_BASE + 0x1c) -#define OMAP_IH2_ISR		(OMAP_IH2_BASE + 0x9c) - -#define IRQ_ITR_REG_OFFSET	0x00 -#define IRQ_MIR_REG_OFFSET	0x04 -#define IRQ_SIR_IRQ_REG_OFFSET	0x10 -#define IRQ_SIR_FIQ_REG_OFFSET	0x14 -#define IRQ_CONTROL_REG_OFFSET	0x18 -#define IRQ_ISR_REG_OFFSET	0x9c -#define IRQ_ILR0_REG_OFFSET	0x1c -#define IRQ_GMR_REG_OFFSET	0xa0 - -#endif - -/* - * ---------------------------------------------------------------------------- - * System control registers - * ---------------------------------------------------------------------------- - */ -#define MOD_CONF_CTRL_0		0xfffe1080 -#define MOD_CONF_CTRL_1		0xfffe1110 - -/* - * ---------------------------------------------------------------------------- - * Pin multiplexing registers - * ---------------------------------------------------------------------------- - */ -#define FUNC_MUX_CTRL_0		0xfffe1000 -#define FUNC_MUX_CTRL_1		0xfffe1004 -#define FUNC_MUX_CTRL_2		0xfffe1008 -#define COMP_MODE_CTRL_0	0xfffe100c -#define FUNC_MUX_CTRL_3		0xfffe1010 -#define FUNC_MUX_CTRL_4		0xfffe1014 -#define FUNC_MUX_CTRL_5		0xfffe1018 -#define FUNC_MUX_CTRL_6		0xfffe101C -#define FUNC_MUX_CTRL_7		0xfffe1020 -#define FUNC_MUX_CTRL_8		0xfffe1024 -#define FUNC_MUX_CTRL_9		0xfffe1028 -#define FUNC_MUX_CTRL_A		0xfffe102C -#define FUNC_MUX_CTRL_B		0xfffe1030 -#define FUNC_MUX_CTRL_C		0xfffe1034 -#define FUNC_MUX_CTRL_D		0xfffe1038 -#define PULL_DWN_CTRL_0		0xfffe1040 -#define PULL_DWN_CTRL_1		0xfffe1044 -#define PULL_DWN_CTRL_2		0xfffe1048 -#define PULL_DWN_CTRL_3		0xfffe104c -#define PULL_DWN_CTRL_4		0xfffe10ac - -/* OMAP-1610 specific multiplexing registers */ -#define FUNC_MUX_CTRL_E		0xfffe1090 -#define FUNC_MUX_CTRL_F		0xfffe1094 -#define FUNC_MUX_CTRL_10	0xfffe1098 -#define FUNC_MUX_CTRL_11	0xfffe109c -#define FUNC_MUX_CTRL_12	0xfffe10a0 -#define PU_PD_SEL_0		0xfffe10b4 -#define PU_PD_SEL_1		0xfffe10b8 -#define PU_PD_SEL_2		0xfffe10bc -#define PU_PD_SEL_3		0xfffe10c0 -#define PU_PD_SEL_4		0xfffe10c4 - -/* Timer32K for 1610 and 1710*/ -#define OMAP_TIMER32K_BASE	0xFFFBC400 - -/* - * --------------------------------------------------------------------------- - * TIPB bus interface - * --------------------------------------------------------------------------- - */ -#define TIPB_PUBLIC_CNTL_BASE		0xfffed300 -#define MPU_PUBLIC_TIPB_CNTL		(TIPB_PUBLIC_CNTL_BASE + 0x8) -#define TIPB_PRIVATE_CNTL_BASE		0xfffeca00 -#define MPU_PRIVATE_TIPB_CNTL		(TIPB_PRIVATE_CNTL_BASE + 0x8) - -/* - * ---------------------------------------------------------------------------- - * MPUI interface - * ---------------------------------------------------------------------------- - */ -#define MPUI_BASE			(0xfffec900) -#define MPUI_CTRL			(MPUI_BASE + 0x0) -#define MPUI_DEBUG_ADDR			(MPUI_BASE + 0x4) -#define MPUI_DEBUG_DATA			(MPUI_BASE + 0x8) -#define MPUI_DEBUG_FLAG			(MPUI_BASE + 0xc) -#define MPUI_STATUS_REG			(MPUI_BASE + 0x10) -#define MPUI_DSP_STATUS			(MPUI_BASE + 0x14) -#define MPUI_DSP_BOOT_CONFIG		(MPUI_BASE + 0x18) -#define MPUI_DSP_API_CONFIG		(MPUI_BASE + 0x1c) - -/* - * ---------------------------------------------------------------------------- - * LED Pulse Generator - * ---------------------------------------------------------------------------- - */ -#define OMAP_LPG1_BASE			0xfffbd000 -#define OMAP_LPG2_BASE			0xfffbd800 -#define OMAP_LPG1_LCR			(OMAP_LPG1_BASE + 0x00) -#define OMAP_LPG1_PMR			(OMAP_LPG1_BASE + 0x04) -#define OMAP_LPG2_LCR			(OMAP_LPG2_BASE + 0x00) -#define OMAP_LPG2_PMR			(OMAP_LPG2_BASE + 0x04) - -/* - * ---------------------------------------------------------------------------- - * Pulse-Width Light - * ---------------------------------------------------------------------------- - */ -#define OMAP_PWL_BASE			0xfffb5800 -#define OMAP_PWL_ENABLE			(OMAP_PWL_BASE + 0x00) -#define OMAP_PWL_CLK_ENABLE		(OMAP_PWL_BASE + 0x04) - -/* - * --------------------------------------------------------------------------- - * Processor specific defines - * --------------------------------------------------------------------------- - */ - -#include <plat/omap7xx.h> -#include <plat/omap1510.h> -#include <plat/omap16xx.h> -#include <plat/omap24xx.h> -#include <plat/omap34xx.h> -#include <plat/omap44xx.h> - -#endif	/* __ASM_ARCH_OMAP_HARDWARE_H */ diff --git a/arch/arm/plat-omap/include/plat/hwa742.h b/arch/arm/plat-omap/include/plat/hwa742.h deleted file mode 100644 index 886248d32b4..00000000000 --- a/arch/arm/plat-omap/include/plat/hwa742.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _HWA742_H -#define _HWA742_H - -struct hwa742_platform_data { -	unsigned	te_connected:1; -}; - -#endif diff --git a/arch/arm/plat-omap/include/plat/i2c.h b/arch/arm/plat-omap/include/plat/i2c.h index 36a0befd616..810629d7966 100644 --- a/arch/arm/plat-omap/include/plat/i2c.h +++ b/arch/arm/plat-omap/include/plat/i2c.h @@ -18,15 +18,21 @@   * 02110-1301 USA   *   */ -#ifndef __ASM__ARCH_OMAP_I2C_H -#define __ASM__ARCH_OMAP_I2C_H -#include <linux/i2c.h> +#ifndef __PLAT_OMAP_I2C_H +#define __PLAT_OMAP_I2C_H + +struct i2c_board_info; +struct omap_i2c_bus_platform_data; + +int omap_i2c_add_bus(struct omap_i2c_bus_platform_data *i2c_pdata, +			int bus_id);  #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)  extern int omap_register_i2c_bus(int bus_id, u32 clkrate,  				 struct i2c_board_info const *info,  				 unsigned len); +extern int omap_register_i2c_bus_cmdline(void);  #else  static inline int omap_register_i2c_bus(int bus_id, u32 clkrate,  				 struct i2c_board_info const *info, @@ -34,9 +40,14 @@ static inline int omap_register_i2c_bus(int bus_id, u32 clkrate,  {  	return 0;  } + +static inline int omap_register_i2c_bus_cmdline(void) +{ +	return 0; +}  #endif -void __init omap1_i2c_mux_pins(int bus_id); -void __init omap2_i2c_mux_pins(int bus_id); +struct omap_hwmod; +int omap_i2c_reset(struct omap_hwmod *oh); -#endif /* __ASM__ARCH_OMAP_I2C_H */ +#endif /* __PLAT_OMAP_I2C_H */ diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h deleted file mode 100644 index 128b549c279..00000000000 --- a/arch/arm/plat-omap/include/plat/io.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/io.h - * - * IO definitions for TI OMAP processors and boards - * - * Copied from arch/arm/mach-sa1100/include/mach/io.h - * Copyright (C) 1997-1999 Russell King - * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - 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 as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Modifications: - *  06-12-1997	RMK	Created. - *  07-04-1999	RMK	Major cleanup - */ - -#ifndef __ASM_ARM_ARCH_IO_H -#define __ASM_ARM_ARCH_IO_H - -#include <mach/hardware.h> - -#define IO_SPACE_LIMIT 0xffffffff - -/* - * We don't actually have real ISA nor PCI buses, but there is so many - * drivers out there that might just work if we fake them... - */ -#define __io(a)		__typesafe_io(a) -#define __mem_pci(a)	(a) - -/* - * ---------------------------------------------------------------------------- - * I/O mapping - * ---------------------------------------------------------------------------- - */ - -#ifdef __ASSEMBLER__ -#define IOMEM(x)		(x) -#else -#define IOMEM(x)		((void __force __iomem *)(x)) -#endif - -#define OMAP1_IO_OFFSET		0x01000000	/* Virtual IO = 0xfefb0000 */ -#define OMAP1_IO_ADDRESS(pa)	IOMEM((pa) - OMAP1_IO_OFFSET) - -#define OMAP2_L3_IO_OFFSET	0x90000000 -#define OMAP2_L3_IO_ADDRESS(pa)	IOMEM((pa) + OMAP2_L3_IO_OFFSET) /* L3 */ - - -#define OMAP2_L4_IO_OFFSET	0xb2000000 -#define OMAP2_L4_IO_ADDRESS(pa)	IOMEM((pa) + OMAP2_L4_IO_OFFSET) /* L4 */ - -#define OMAP4_L3_IO_OFFSET	0xb4000000 -#define OMAP4_L3_IO_ADDRESS(pa)	IOMEM((pa) + OMAP4_L3_IO_OFFSET) /* L3 */ - -#define OMAP4_L3_PER_IO_OFFSET	0xb1100000 -#define OMAP4_L3_PER_IO_ADDRESS(pa)	IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET) - -#define OMAP4_GPMC_IO_OFFSET		0xa9000000 -#define OMAP4_GPMC_IO_ADDRESS(pa)	IOMEM((pa) + OMAP4_GPMC_IO_OFFSET) - -#define OMAP2_EMU_IO_OFFSET		0xaa800000	/* Emulation */ -#define OMAP2_EMU_IO_ADDRESS(pa)	IOMEM((pa) + OMAP2_EMU_IO_OFFSET) - -/* - * ---------------------------------------------------------------------------- - * Omap1 specific IO mapping - * ---------------------------------------------------------------------------- - */ - -#define OMAP1_IO_PHYS		0xFFFB0000 -#define OMAP1_IO_SIZE		0x40000 -#define OMAP1_IO_VIRT		(OMAP1_IO_PHYS - OMAP1_IO_OFFSET) - -/* - * ---------------------------------------------------------------------------- - * Omap2 specific IO mapping - * ---------------------------------------------------------------------------- - */ - -/* We map both L3 and L4 on OMAP2 */ -#define L3_24XX_PHYS	L3_24XX_BASE	/* 0x68000000 --> 0xf8000000*/ -#define L3_24XX_VIRT	(L3_24XX_PHYS + OMAP2_L3_IO_OFFSET) -#define L3_24XX_SIZE	SZ_1M		/* 44kB of 128MB used, want 1MB sect */ -#define L4_24XX_PHYS	L4_24XX_BASE	/* 0x48000000 --> 0xfa000000 */ -#define L4_24XX_VIRT	(L4_24XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_24XX_SIZE	SZ_1M		/* 1MB of 128MB used, want 1MB sect */ - -#define L4_WK_243X_PHYS		L4_WK_243X_BASE	/* 0x49000000 --> 0xfb000000 */ -#define L4_WK_243X_VIRT		(L4_WK_243X_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_WK_243X_SIZE		SZ_1M -#define OMAP243X_GPMC_PHYS	OMAP243X_GPMC_BASE -#define OMAP243X_GPMC_VIRT	(OMAP243X_GPMC_PHYS + OMAP2_L3_IO_OFFSET) -						/* 0x6e000000 --> 0xfe000000 */ -#define OMAP243X_GPMC_SIZE	SZ_1M -#define OMAP243X_SDRC_PHYS	OMAP243X_SDRC_BASE -						/* 0x6D000000 --> 0xfd000000 */ -#define OMAP243X_SDRC_VIRT	(OMAP243X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) -#define OMAP243X_SDRC_SIZE	SZ_1M -#define OMAP243X_SMS_PHYS	OMAP243X_SMS_BASE -						/* 0x6c000000 --> 0xfc000000 */ -#define OMAP243X_SMS_VIRT	(OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) -#define OMAP243X_SMS_SIZE	SZ_1M - -/* 2420 IVA */ -#define DSP_MEM_2420_PHYS	OMAP2420_DSP_MEM_BASE -						/* 0x58000000 --> 0xfc100000 */ -#define DSP_MEM_2420_VIRT	0xfc100000 -#define DSP_MEM_2420_SIZE	0x28000 -#define DSP_IPI_2420_PHYS	OMAP2420_DSP_IPI_BASE -						/* 0x59000000 --> 0xfc128000 */ -#define DSP_IPI_2420_VIRT	0xfc128000 -#define DSP_IPI_2420_SIZE	SZ_4K -#define DSP_MMU_2420_PHYS	OMAP2420_DSP_MMU_BASE -						/* 0x5a000000 --> 0xfc129000 */ -#define DSP_MMU_2420_VIRT	0xfc129000 -#define DSP_MMU_2420_SIZE	SZ_4K - -/* 2430 IVA2.1 - currently unmapped */ - -/* - * ---------------------------------------------------------------------------- - * Omap3 specific IO mapping - * ---------------------------------------------------------------------------- - */ - -/* We map both L3 and L4 on OMAP3 */ -#define L3_34XX_PHYS		L3_34XX_BASE	/* 0x68000000 --> 0xf8000000 */ -#define L3_34XX_VIRT		(L3_34XX_PHYS + OMAP2_L3_IO_OFFSET) -#define L3_34XX_SIZE		SZ_1M   /* 44kB of 128MB used, want 1MB sect */ - -#define L4_34XX_PHYS		L4_34XX_BASE	/* 0x48000000 --> 0xfa000000 */ -#define L4_34XX_VIRT		(L4_34XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_34XX_SIZE		SZ_4M   /* 1MB of 128MB used, want 1MB sect */ - -/* - * Need to look at the Size 4M for L4. - * VPOM3430 was not working for Int controller - */ - -#define L4_PER_34XX_PHYS	L4_PER_34XX_BASE -						/* 0x49000000 --> 0xfb000000 */ -#define L4_PER_34XX_VIRT	(L4_PER_34XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_PER_34XX_SIZE	SZ_1M - -#define L4_EMU_34XX_PHYS	L4_EMU_34XX_BASE -						/* 0x54000000 --> 0xfe800000 */ -#define L4_EMU_34XX_VIRT	(L4_EMU_34XX_PHYS + OMAP2_EMU_IO_OFFSET) -#define L4_EMU_34XX_SIZE	SZ_8M - -#define OMAP34XX_GPMC_PHYS	OMAP34XX_GPMC_BASE -						/* 0x6e000000 --> 0xfe000000 */ -#define OMAP34XX_GPMC_VIRT	(OMAP34XX_GPMC_PHYS + OMAP2_L3_IO_OFFSET) -#define OMAP34XX_GPMC_SIZE	SZ_1M - -#define OMAP343X_SMS_PHYS	OMAP343X_SMS_BASE -						/* 0x6c000000 --> 0xfc000000 */ -#define OMAP343X_SMS_VIRT	(OMAP343X_SMS_PHYS + OMAP2_L3_IO_OFFSET) -#define OMAP343X_SMS_SIZE	SZ_1M - -#define OMAP343X_SDRC_PHYS	OMAP343X_SDRC_BASE -						/* 0x6D000000 --> 0xfd000000 */ -#define OMAP343X_SDRC_VIRT	(OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) -#define OMAP343X_SDRC_SIZE	SZ_1M - -/* 3430 IVA - currently unmapped */ - -/* - * ---------------------------------------------------------------------------- - * Omap4 specific IO mapping - * ---------------------------------------------------------------------------- - */ - -/* We map both L3 and L4 on OMAP4 */ -#define L3_44XX_PHYS		L3_44XX_BASE	/* 0x44000000 --> 0xf8000000 */ -#define L3_44XX_VIRT		(L3_44XX_PHYS + OMAP4_L3_IO_OFFSET) -#define L3_44XX_SIZE		SZ_1M - -#define L4_44XX_PHYS		L4_44XX_BASE	/* 0x4a000000 --> 0xfc000000 */ -#define L4_44XX_VIRT		(L4_44XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_44XX_SIZE		SZ_4M - -#define L4_PER_44XX_PHYS	L4_PER_44XX_BASE -						/* 0x48000000 --> 0xfa000000 */ -#define L4_PER_44XX_VIRT	(L4_PER_44XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_PER_44XX_SIZE	SZ_4M - -#define L4_ABE_44XX_PHYS	L4_ABE_44XX_BASE -						/* 0x49000000 --> 0xfb000000 */ -#define L4_ABE_44XX_VIRT	(L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET) -#define L4_ABE_44XX_SIZE	SZ_1M - -#define L4_EMU_44XX_PHYS	L4_EMU_44XX_BASE -						/* 0x54000000 --> 0xfe800000 */ -#define L4_EMU_44XX_VIRT	(L4_EMU_44XX_PHYS + OMAP2_EMU_IO_OFFSET) -#define L4_EMU_44XX_SIZE	SZ_8M - -#define OMAP44XX_GPMC_PHYS	OMAP44XX_GPMC_BASE -						/* 0x50000000 --> 0xf9000000 */ -#define OMAP44XX_GPMC_VIRT	(OMAP44XX_GPMC_PHYS + OMAP4_GPMC_IO_OFFSET) -#define OMAP44XX_GPMC_SIZE	SZ_1M - - -#define OMAP44XX_EMIF1_PHYS	OMAP44XX_EMIF1_BASE -						/* 0x4c000000 --> 0xfd100000 */ -#define OMAP44XX_EMIF1_VIRT	(OMAP44XX_EMIF1_PHYS + OMAP4_L3_PER_IO_OFFSET) -#define OMAP44XX_EMIF1_SIZE	SZ_1M - -#define OMAP44XX_EMIF2_PHYS	OMAP44XX_EMIF2_BASE -						/* 0x4d000000 --> 0xfd200000 */ -#define OMAP44XX_EMIF2_VIRT	(OMAP44XX_EMIF2_PHYS + OMAP4_L3_PER_IO_OFFSET) -#define OMAP44XX_EMIF2_SIZE	SZ_1M - -#define OMAP44XX_DMM_PHYS	OMAP44XX_DMM_BASE -						/* 0x4e000000 --> 0xfd300000 */ -#define OMAP44XX_DMM_VIRT	(OMAP44XX_DMM_PHYS + OMAP4_L3_PER_IO_OFFSET) -#define OMAP44XX_DMM_SIZE	SZ_1M -/* - * ---------------------------------------------------------------------------- - * Omap specific register access - * ---------------------------------------------------------------------------- - */ - -#ifndef __ASSEMBLER__ - -/* - * NOTE: Please use ioremap + __raw_read/write where possible instead of these - */ - -extern u8 omap_readb(u32 pa); -extern u16 omap_readw(u32 pa); -extern u32 omap_readl(u32 pa); -extern void omap_writeb(u8 v, u32 pa); -extern void omap_writew(u16 v, u32 pa); -extern void omap_writel(u32 v, u32 pa); - -struct omap_sdrc_params; - -extern void omap1_map_common_io(void); -extern void omap1_init_common_hw(void); - -#ifdef CONFIG_ARCH_OMAP2420 -extern void omap242x_map_common_io(void); -#else -static inline void omap242x_map_common_io(void) -{ -} -#endif - -#ifdef CONFIG_ARCH_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_ARCH_OMAP4 -extern void omap44xx_map_common_io(void); -#else -static inline void omap44xx_map_common_io(void) -{ -} -#endif - -extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, -				 struct omap_sdrc_params *sdrc_cs1); - -#define __arch_ioremap(p,s,t)	omap_ioremap(p,s,t) -#define __arch_iounmap(v)	omap_iounmap(v) - -void __iomem *omap_ioremap(unsigned long phys, size_t size, unsigned int type); -void omap_iounmap(volatile void __iomem *addr); - -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h deleted file mode 100644 index 33c7d41cb6a..00000000000 --- a/arch/arm/plat-omap/include/plat/iommu.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * omap iommu: main structures - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __MACH_IOMMU_H -#define __MACH_IOMMU_H - -struct iotlb_entry { -	u32 da; -	u32 pa; -	u32 pgsz, prsvd, valid; -	union { -		u16 ap; -		struct { -			u32 endian, elsz, mixed; -		}; -	}; -}; - -struct iommu { -	const char	*name; -	struct module	*owner; -	struct clk	*clk; -	void __iomem	*regbase; -	struct device	*dev; - -	unsigned int	refcount; -	struct mutex	iommu_lock;	/* global for this whole object */ - -	/* -	 * We don't change iopgd for a situation like pgd for a task, -	 * but share it globally for each iommu. -	 */ -	u32		*iopgd; -	spinlock_t	page_table_lock; /* protect iopgd */ - -	int		nr_tlb_entries; - -	struct list_head	mmap; -	struct mutex		mmap_lock; /* protect mmap */ - -	int (*isr)(struct iommu *obj); - -	void *ctx; /* iommu context: registres saved area */ -}; - -struct cr_regs { -	union { -		struct { -			u16 cam_l; -			u16 cam_h; -		}; -		u32 cam; -	}; -	union { -		struct { -			u16 ram_l; -			u16 ram_h; -		}; -		u32 ram; -	}; -}; - -struct iotlb_lock { -	short base; -	short vict; -}; - -/* architecture specific functions */ -struct iommu_functions { -	unsigned long	version; - -	int (*enable)(struct iommu *obj); -	void (*disable)(struct iommu *obj); -	void (*set_twl)(struct iommu *obj, bool on); -	u32 (*fault_isr)(struct iommu *obj, u32 *ra); - -	void (*tlb_read_cr)(struct iommu *obj, struct cr_regs *cr); -	void (*tlb_load_cr)(struct iommu *obj, struct cr_regs *cr); - -	struct cr_regs *(*alloc_cr)(struct iommu *obj, struct iotlb_entry *e); -	int (*cr_valid)(struct cr_regs *cr); -	u32 (*cr_to_virt)(struct cr_regs *cr); -	void (*cr_to_e)(struct cr_regs *cr, struct iotlb_entry *e); -	ssize_t (*dump_cr)(struct iommu *obj, struct cr_regs *cr, char *buf); - -	u32 (*get_pte_attr)(struct iotlb_entry *e); - -	void (*save_ctx)(struct iommu *obj); -	void (*restore_ctx)(struct iommu *obj); -	ssize_t (*dump_ctx)(struct iommu *obj, char *buf, ssize_t len); -}; - -struct iommu_platform_data { -	const char *name; -	const char *clk_name; -	const int nr_tlb_entries; -}; - -#if defined(CONFIG_ARCH_OMAP1) -#error "iommu for this processor not implemented yet" -#else -#include <plat/iommu2.h> -#endif - -/* - * utilities for super page(16MB, 1MB, 64KB and 4KB) - */ - -#define iopgsz_max(bytes)			\ -	(((bytes) >= SZ_16M) ? SZ_16M :		\ -	 ((bytes) >= SZ_1M)  ? SZ_1M  :		\ -	 ((bytes) >= SZ_64K) ? SZ_64K :		\ -	 ((bytes) >= SZ_4K)  ? SZ_4K  :	0) - -#define bytes_to_iopgsz(bytes)				\ -	(((bytes) == SZ_16M) ? MMU_CAM_PGSZ_16M :	\ -	 ((bytes) == SZ_1M)  ? MMU_CAM_PGSZ_1M  :	\ -	 ((bytes) == SZ_64K) ? MMU_CAM_PGSZ_64K :	\ -	 ((bytes) == SZ_4K)  ? MMU_CAM_PGSZ_4K  : -1) - -#define iopgsz_to_bytes(iopgsz)				\ -	(((iopgsz) == MMU_CAM_PGSZ_16M)	? SZ_16M :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_1M)	? SZ_1M  :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_64K)	? SZ_64K :	\ -	 ((iopgsz) == MMU_CAM_PGSZ_4K)	? SZ_4K  : 0) - -#define iopgsz_ok(bytes) (bytes_to_iopgsz(bytes) >= 0) - -/* - * global functions - */ -extern u32 iommu_arch_version(void); - -extern void iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e); -extern u32 iotlb_cr_to_virt(struct cr_regs *cr); - -extern int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e); -extern void iommu_set_twl(struct iommu *obj, bool on); -extern void flush_iotlb_page(struct iommu *obj, u32 da); -extern void flush_iotlb_range(struct iommu *obj, u32 start, u32 end); -extern void flush_iotlb_all(struct iommu *obj); - -extern int iopgtable_store_entry(struct iommu *obj, struct iotlb_entry *e); -extern size_t iopgtable_clear_entry(struct iommu *obj, u32 iova); - -extern struct iommu *iommu_get(const char *name); -extern void iommu_put(struct iommu *obj); - -extern void iommu_save_ctx(struct iommu *obj); -extern void iommu_restore_ctx(struct iommu *obj); - -extern int install_iommu_arch(const struct iommu_functions *ops); -extern void uninstall_iommu_arch(const struct iommu_functions *ops); - -extern int foreach_iommu_device(void *data, -				int (*fn)(struct device *, void *)); - -extern ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t len); -extern size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t len); - -#endif /* __MACH_IOMMU_H */ diff --git a/arch/arm/plat-omap/include/plat/iommu2.h b/arch/arm/plat-omap/include/plat/iommu2.h deleted file mode 100644 index 10ad05f410e..00000000000 --- a/arch/arm/plat-omap/include/plat/iommu2.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * omap iommu: omap2 architecture specific definitions - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __MACH_IOMMU2_H -#define __MACH_IOMMU2_H - -#include <linux/io.h> - -/* - * MMU Register offsets - */ -#define MMU_REVISION		0x00 -#define MMU_SYSCONFIG		0x10 -#define MMU_SYSSTATUS		0x14 -#define MMU_IRQSTATUS		0x18 -#define MMU_IRQENABLE		0x1c -#define MMU_WALKING_ST		0x40 -#define MMU_CNTL		0x44 -#define MMU_FAULT_AD		0x48 -#define MMU_TTB			0x4c -#define MMU_LOCK		0x50 -#define MMU_LD_TLB		0x54 -#define MMU_CAM			0x58 -#define MMU_RAM			0x5c -#define MMU_GFLUSH		0x60 -#define MMU_FLUSH_ENTRY		0x64 -#define MMU_READ_CAM		0x68 -#define MMU_READ_RAM		0x6c -#define MMU_EMU_FAULT_AD	0x70 - -#define MMU_REG_SIZE		256 - -/* - * MMU Register bit definitions - */ -#define MMU_LOCK_BASE_SHIFT	10 -#define MMU_LOCK_BASE_MASK	(0x1f << MMU_LOCK_BASE_SHIFT) -#define MMU_LOCK_BASE(x)	\ -	((x & MMU_LOCK_BASE_MASK) >> MMU_LOCK_BASE_SHIFT) - -#define MMU_LOCK_VICT_SHIFT	4 -#define MMU_LOCK_VICT_MASK	(0x1f << MMU_LOCK_VICT_SHIFT) -#define MMU_LOCK_VICT(x)	\ -	((x & MMU_LOCK_VICT_MASK) >> MMU_LOCK_VICT_SHIFT) - -#define MMU_CAM_VATAG_SHIFT	12 -#define MMU_CAM_VATAG_MASK \ -	((~0UL >> MMU_CAM_VATAG_SHIFT) << MMU_CAM_VATAG_SHIFT) -#define MMU_CAM_P		(1 << 3) -#define MMU_CAM_V		(1 << 2) -#define MMU_CAM_PGSZ_MASK	3 -#define MMU_CAM_PGSZ_1M		(0 << 0) -#define MMU_CAM_PGSZ_64K	(1 << 0) -#define MMU_CAM_PGSZ_4K		(2 << 0) -#define MMU_CAM_PGSZ_16M	(3 << 0) - -#define MMU_RAM_PADDR_SHIFT	12 -#define MMU_RAM_PADDR_MASK \ -	((~0UL >> MMU_RAM_PADDR_SHIFT) << MMU_RAM_PADDR_SHIFT) -#define MMU_RAM_ENDIAN_SHIFT	9 -#define MMU_RAM_ENDIAN_MASK	(1 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ENDIAN_BIG	(1 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ENDIAN_LITTLE	(0 << MMU_RAM_ENDIAN_SHIFT) -#define MMU_RAM_ELSZ_SHIFT	7 -#define MMU_RAM_ELSZ_MASK	(3 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_8		(0 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_16		(1 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_32		(2 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_ELSZ_NONE	(3 << MMU_RAM_ELSZ_SHIFT) -#define MMU_RAM_MIXED_SHIFT	6 -#define MMU_RAM_MIXED_MASK	(1 << MMU_RAM_MIXED_SHIFT) -#define MMU_RAM_MIXED		MMU_RAM_MIXED_MASK - -/* - * register accessors - */ -static inline u32 iommu_read_reg(struct iommu *obj, size_t offs) -{ -	return __raw_readl(obj->regbase + offs); -} - -static inline void iommu_write_reg(struct iommu *obj, u32 val, size_t offs) -{ -	__raw_writel(val, obj->regbase + offs); -} - -#endif /* __MACH_IOMMU2_H */ diff --git a/arch/arm/plat-omap/include/plat/iovmm.h b/arch/arm/plat-omap/include/plat/iovmm.h deleted file mode 100644 index bdc7ce5d7a4..00000000000 --- a/arch/arm/plat-omap/include/plat/iovmm.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * omap iommu: simple virtual address space management - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __IOMMU_MMAP_H -#define __IOMMU_MMAP_H - -struct iovm_struct { -	struct iommu		*iommu;	/* iommu object which this belongs to */ -	u32			da_start; /* area definition */ -	u32			da_end; -	u32			flags; /* IOVMF_: see below */ -	struct list_head	list; /* linked in ascending order */ -	const struct sg_table	*sgt; /* keep 'page' <-> 'da' mapping */ -	void			*va; /* mpu side mapped address */ -}; - -/* - * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) - * - * lower 16 bit is used for h/w and upper 16 bit is for s/w. - */ -#define IOVMF_SW_SHIFT		16 -#define IOVMF_HW_SIZE		(1 << IOVMF_SW_SHIFT) -#define IOVMF_HW_MASK		(IOVMF_HW_SIZE - 1) -#define IOVMF_SW_MASK		(~IOVMF_HW_MASK)UL - -/* - * iovma: h/w flags derived from cam and ram attribute - */ -#define IOVMF_CAM_MASK		(~((1 << 10) - 1)) -#define IOVMF_RAM_MASK		(~IOVMF_CAM_MASK) - -#define IOVMF_PGSZ_MASK		(3 << 0) -#define IOVMF_PGSZ_1M		MMU_CAM_PGSZ_1M -#define IOVMF_PGSZ_64K		MMU_CAM_PGSZ_64K -#define IOVMF_PGSZ_4K		MMU_CAM_PGSZ_4K -#define IOVMF_PGSZ_16M		MMU_CAM_PGSZ_16M - -#define IOVMF_ENDIAN_MASK	(1 << 9) -#define IOVMF_ENDIAN_BIG	MMU_RAM_ENDIAN_BIG -#define IOVMF_ENDIAN_LITTLE	MMU_RAM_ENDIAN_LITTLE - -#define IOVMF_ELSZ_MASK		(3 << 7) -#define IOVMF_ELSZ_8		MMU_RAM_ELSZ_8 -#define IOVMF_ELSZ_16		MMU_RAM_ELSZ_16 -#define IOVMF_ELSZ_32		MMU_RAM_ELSZ_32 -#define IOVMF_ELSZ_NONE		MMU_RAM_ELSZ_NONE - -#define IOVMF_MIXED_MASK	(1 << 6) -#define IOVMF_MIXED		MMU_RAM_MIXED - -/* - * iovma: s/w flags, used for mapping and umapping internally. - */ -#define IOVMF_MMIO		(1 << IOVMF_SW_SHIFT) -#define IOVMF_ALLOC		(2 << IOVMF_SW_SHIFT) -#define IOVMF_ALLOC_MASK	(3 << IOVMF_SW_SHIFT) - -/* "superpages" is supported just with physically linear pages */ -#define IOVMF_DISCONT		(1 << (2 + IOVMF_SW_SHIFT)) -#define IOVMF_LINEAR		(2 << (2 + IOVMF_SW_SHIFT)) -#define IOVMF_LINEAR_MASK	(3 << (2 + IOVMF_SW_SHIFT)) - -#define IOVMF_DA_FIXED		(1 << (4 + IOVMF_SW_SHIFT)) -#define IOVMF_DA_ANON		(2 << (4 + IOVMF_SW_SHIFT)) -#define IOVMF_DA_MASK		(3 << (4 + IOVMF_SW_SHIFT)) - - -extern struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da); -extern u32 iommu_vmap(struct iommu *obj, u32 da, -			const struct sg_table *sgt, u32 flags); -extern struct sg_table *iommu_vunmap(struct iommu *obj, u32 da); -extern u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, -			   u32 flags); -extern void iommu_vfree(struct iommu *obj, const u32 da); -extern u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, -			u32 flags); -extern void iommu_kunmap(struct iommu *obj, u32 da); -extern u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, -			   u32 flags); -extern void iommu_kfree(struct iommu *obj, u32 da); - -extern void *da_to_va(struct iommu *obj, u32 da); - -#endif /* __IOMMU_MMAP_H */ diff --git a/arch/arm/plat-omap/include/plat/irda.h b/arch/arm/plat-omap/include/plat/irda.h deleted file mode 100644 index 40f60339d1c..00000000000 --- a/arch/arm/plat-omap/include/plat/irda.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/irda.h - * - *  Copyright (C) 2005-2006 Komal Shah <komal_shah802003@yahoo.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef ASMARM_ARCH_IRDA_H -#define ASMARM_ARCH_IRDA_H - -/* board specific transceiver capabilities */ - -#define IR_SEL		1	/* Selects IrDA */ -#define IR_SIRMODE	2 -#define IR_FIRMODE	4 -#define IR_MIRMODE	8 - -struct omap_irda_config { -	int transceiver_cap; -	int (*transceiver_mode)(struct device *dev, int mode); -	int (*select_irda)(struct device *dev, int state); -	int rx_channel; -	int tx_channel; -	unsigned long dest_start; -	unsigned long src_start; -	int tx_trigger; -	int rx_trigger; -	int mode; -}; - -#endif diff --git a/arch/arm/plat-omap/include/plat/irqs-44xx.h b/arch/arm/plat-omap/include/plat/irqs-44xx.h deleted file mode 100644 index 518322c8011..00000000000 --- a/arch/arm/plat-omap/include/plat/irqs-44xx.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * OMAP4 Interrupt lines definitions - * - * Copyright (C) 2009-2010 Texas Instruments, Inc. - * - * Santosh Shilimkar (santosh.shilimkar@ti.com) - * Benoit Cousson (b-cousson@ti.com) - * - * This file is automatically generated from the OMAP hardware databases. - * We respectfully ask that any modifications to this file be coordinated - * with the public linux-omap@vger.kernel.org mailing list and the - * authors above to ensure that the autogeneration scripts are kept - * up-to-date with the file contents. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ARCH_ARM_MACH_OMAP2_OMAP44XX_IRQS_H -#define __ARCH_ARM_MACH_OMAP2_OMAP44XX_IRQS_H - -/* OMAP44XX IRQs numbers definitions */ -#define OMAP44XX_IRQ_LOCALTIMER			29 -#define OMAP44XX_IRQ_LOCALWDT			30 - -#define OMAP44XX_IRQ_GIC_START			32 - -#define OMAP44XX_IRQ_PL310			(0 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CTI0			(1 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CTI1			(2 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_ELM			(4 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SYS_1N			(7 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SECURITY_EVENTS		(8 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_L3_DBG			(9 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_L3_APP			(10 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_PRCM			(11 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SDMA_0			(12 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SDMA_1			(13 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SDMA_2			(14 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SDMA_3			(15 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCBSP4			(16 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCBSP1			(17 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SR_MCU			(18 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SR_CORE			(19 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPMC			(20 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GFX			(21 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCBSP2			(22 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCBSP3			(23 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_ISS_5			(24 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DSS_DISPC			(25 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MAIL_U0			(26 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_C2C_SSCM_0			(27 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_TESLA_MMU			(28 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO1			(29 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO2			(30 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO3			(31 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO4			(32 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO5			(33 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPIO6			(34 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_USIM			(35 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_WDT3			(36 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT1			(37 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT2			(38 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT3			(39 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT4			(40 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT5			(41 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT6			(42 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT7			(43 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT8			(44 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT9			(45 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT10			(46 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT11			(47 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SPI4			(48 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SHA1_S			(49 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_FPKA_SINTREQUEST_S		(50 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SHA1_P			(51 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_RNG			(52 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DSS_DSI1			(53 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_I2C1			(56 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_I2C2			(57 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HDQ			(58 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MMC5			(59 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_I2C3			(61 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_I2C4			(62 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_AES2_S			(63 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_AES2_P			(64 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SPI1			(65 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SPI2			(66 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HSI_P1			(67 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HSI_P2			(68 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_FDIF_3			(69 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_UART4			(70 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HSI_DMA			(71 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_UART1			(72 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_UART2			(73 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_UART3			(74 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_PBIAS			(75 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_OHCI			(76 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_EHCI			(77 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_TLL			(78 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_AES1_S			(79 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_WDT2			(80 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DES_S			(81 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DES_P			(82 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MMC1			(83 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DSS_DSI2			(84 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_AES1_P			(85 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MMC2			(86 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MPU_ICR			(87 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_C2C_SSCM_1			(88 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_FSUSB			(89 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_FSUSB_SMI			(90 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SPI3			(91 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HS_USB_MC_N		(92 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_HS_USB_DMA_N		(93 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MMC3			(94 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_GPT12			(95 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MMC4			(96 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SLIMBUS1			(97 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SLIMBUS2			(98 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_ABE			(99 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DUCATI_MMU			(100 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DSS_HDMI			(101 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SR_IVA			(102 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_1	(103 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_0	(104 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_IVA_HD_POMBINTRPEND_0	(107 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCASP1_AR			(108 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCASP1_AX			(109 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_EMIF4_1			(110 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_EMIF4_2			(111 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_MCPDM			(112 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DMM			(113 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_DMIC			(114 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CDMA_0			(115 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CDMA_1			(116 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CDMA_2			(117 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_CDMA_3			(118 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_SYS_2N			(119 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_KBD_CTL			(120 + OMAP44XX_IRQ_GIC_START) -#define OMAP44XX_IRQ_UNIPRO1			(124 + OMAP44XX_IRQ_GIC_START) - -#endif diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h deleted file mode 100644 index 65e20a68671..00000000000 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ /dev/null @@ -1,437 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/irqs.h - * - *  Copyright (C) Greg Lonnon 2001 - *  Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com> - * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - 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 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 - * - * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610 - *	 are different. - */ - -#ifndef __ASM_ARCH_OMAP15XX_IRQS_H -#define __ASM_ARCH_OMAP15XX_IRQS_H - -/* All OMAP4 specific defines are moved to irqs-44xx.h */ -#include "irqs-44xx.h" - -/* - * IRQ numbers for interrupt handler 1 - * - * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below - * - */ -#define INT_CAMERA		1 -#define INT_FIQ			3 -#define INT_RTDX		6 -#define INT_DSP_MMU_ABORT	7 -#define INT_HOST		8 -#define INT_ABORT		9 -#define INT_BRIDGE_PRIV		13 -#define INT_GPIO_BANK1		14 -#define INT_UART3		15 -#define INT_TIMER3		16 -#define INT_DMA_CH0_6		19 -#define INT_DMA_CH1_7		20 -#define INT_DMA_CH2_8		21 -#define INT_DMA_CH3		22 -#define INT_DMA_CH4		23 -#define INT_DMA_CH5		24 -#define INT_DMA_LCD		25 -#define INT_TIMER1		26 -#define INT_WD_TIMER		27 -#define INT_BRIDGE_PUB		28 -#define INT_TIMER2		30 -#define INT_LCD_CTRL		31 - -/* - * OMAP-1510 specific IRQ numbers for interrupt handler 1 - */ -#define INT_1510_IH2_IRQ	0 -#define INT_1510_RES2		2 -#define INT_1510_SPI_TX		4 -#define INT_1510_SPI_RX		5 -#define INT_1510_DSP_MAILBOX1	10 -#define INT_1510_DSP_MAILBOX2	11 -#define INT_1510_RES12		12 -#define INT_1510_LB_MMU		17 -#define INT_1510_RES18		18 -#define INT_1510_LOCAL_BUS	29 - -/* - * OMAP-1610 specific IRQ numbers for interrupt handler 1 - */ -#define INT_1610_IH2_IRQ	0 -#define INT_1610_IH2_FIQ	2 -#define INT_1610_McBSP2_TX	4 -#define INT_1610_McBSP2_RX	5 -#define INT_1610_DSP_MAILBOX1	10 -#define INT_1610_DSP_MAILBOX2	11 -#define INT_1610_LCD_LINE	12 -#define INT_1610_GPTIMER1	17 -#define INT_1610_GPTIMER2	18 -#define INT_1610_SSR_FIFO_0	29 - -/* - * OMAP-7xx specific IRQ numbers for interrupt handler 1 - */ -#define INT_7XX_IH2_FIQ		0 -#define INT_7XX_IH2_IRQ		1 -#define INT_7XX_USB_NON_ISO	2 -#define INT_7XX_USB_ISO		3 -#define INT_7XX_ICR		4 -#define INT_7XX_EAC		5 -#define INT_7XX_GPIO_BANK1	6 -#define INT_7XX_GPIO_BANK2	7 -#define INT_7XX_GPIO_BANK3	8 -#define INT_7XX_McBSP2TX	10 -#define INT_7XX_McBSP2RX	11 -#define INT_7XX_McBSP2RX_OVF	12 -#define INT_7XX_LCD_LINE	14 -#define INT_7XX_GSM_PROTECT	15 -#define INT_7XX_TIMER3		16 -#define INT_7XX_GPIO_BANK5	17 -#define INT_7XX_GPIO_BANK6	18 -#define INT_7XX_SPGIO_WR	29 - -/* - * IRQ numbers for interrupt handler 2 - * - * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below - */ -#define IH2_BASE		32 - -#define INT_KEYBOARD		(1 + IH2_BASE) -#define INT_uWireTX		(2 + IH2_BASE) -#define INT_uWireRX		(3 + IH2_BASE) -#define INT_I2C			(4 + IH2_BASE) -#define INT_MPUIO		(5 + IH2_BASE) -#define INT_USB_HHC_1		(6 + IH2_BASE) -#define INT_McBSP3TX		(10 + IH2_BASE) -#define INT_McBSP3RX		(11 + IH2_BASE) -#define INT_McBSP1TX		(12 + IH2_BASE) -#define INT_McBSP1RX		(13 + IH2_BASE) -#define INT_UART1		(14 + IH2_BASE) -#define INT_UART2		(15 + IH2_BASE) -#define INT_BT_MCSI1TX		(16 + IH2_BASE) -#define INT_BT_MCSI1RX		(17 + IH2_BASE) -#define INT_SOSSI_MATCH		(19 + IH2_BASE) -#define INT_USB_W2FC		(20 + IH2_BASE) -#define INT_1WIRE		(21 + IH2_BASE) -#define INT_OS_TIMER		(22 + IH2_BASE) -#define INT_MMC			(23 + IH2_BASE) -#define INT_GAUGE_32K		(24 + IH2_BASE) -#define INT_RTC_TIMER		(25 + IH2_BASE) -#define INT_RTC_ALARM		(26 + IH2_BASE) -#define INT_MEM_STICK		(27 + IH2_BASE) - -/* - * OMAP-1510 specific IRQ numbers for interrupt handler 2 - */ -#define INT_1510_DSP_MMU	(28 + IH2_BASE) -#define INT_1510_COM_SPI_RO	(31 + IH2_BASE) - -/* - * OMAP-1610 specific IRQ numbers for interrupt handler 2 - */ -#define INT_1610_FAC		(0 + IH2_BASE) -#define INT_1610_USB_HHC_2	(7 + IH2_BASE) -#define INT_1610_USB_OTG	(8 + IH2_BASE) -#define INT_1610_SoSSI		(9 + IH2_BASE) -#define INT_1610_SoSSI_MATCH	(19 + IH2_BASE) -#define INT_1610_DSP_MMU	(28 + IH2_BASE) -#define INT_1610_McBSP2RX_OF	(31 + IH2_BASE) -#define INT_1610_STI		(32 + IH2_BASE) -#define INT_1610_STI_WAKEUP	(33 + IH2_BASE) -#define INT_1610_GPTIMER3	(34 + IH2_BASE) -#define INT_1610_GPTIMER4	(35 + IH2_BASE) -#define INT_1610_GPTIMER5	(36 + IH2_BASE) -#define INT_1610_GPTIMER6	(37 + IH2_BASE) -#define INT_1610_GPTIMER7	(38 + IH2_BASE) -#define INT_1610_GPTIMER8	(39 + IH2_BASE) -#define INT_1610_GPIO_BANK2	(40 + IH2_BASE) -#define INT_1610_GPIO_BANK3	(41 + IH2_BASE) -#define INT_1610_MMC2		(42 + IH2_BASE) -#define INT_1610_CF		(43 + IH2_BASE) -#define INT_1610_WAKE_UP_REQ	(46 + IH2_BASE) -#define INT_1610_GPIO_BANK4	(48 + IH2_BASE) -#define INT_1610_SPI		(49 + IH2_BASE) -#define INT_1610_DMA_CH6	(53 + IH2_BASE) -#define INT_1610_DMA_CH7	(54 + IH2_BASE) -#define INT_1610_DMA_CH8	(55 + IH2_BASE) -#define INT_1610_DMA_CH9	(56 + IH2_BASE) -#define INT_1610_DMA_CH10	(57 + IH2_BASE) -#define INT_1610_DMA_CH11	(58 + IH2_BASE) -#define INT_1610_DMA_CH12	(59 + IH2_BASE) -#define INT_1610_DMA_CH13	(60 + IH2_BASE) -#define INT_1610_DMA_CH14	(61 + IH2_BASE) -#define INT_1610_DMA_CH15	(62 + IH2_BASE) -#define INT_1610_NAND		(63 + IH2_BASE) -#define INT_1610_SHA1MD5	(91 + IH2_BASE) - -/* - * OMAP-7xx specific IRQ numbers for interrupt handler 2 - */ -#define INT_7XX_HW_ERRORS	(0 + IH2_BASE) -#define INT_7XX_NFIQ_PWR_FAIL	(1 + IH2_BASE) -#define INT_7XX_CFCD		(2 + IH2_BASE) -#define INT_7XX_CFIREQ		(3 + IH2_BASE) -#define INT_7XX_I2C		(4 + IH2_BASE) -#define INT_7XX_PCC		(5 + IH2_BASE) -#define INT_7XX_MPU_EXT_NIRQ	(6 + IH2_BASE) -#define INT_7XX_SPI_100K_1	(7 + IH2_BASE) -#define INT_7XX_SYREN_SPI	(8 + IH2_BASE) -#define INT_7XX_VLYNQ		(9 + IH2_BASE) -#define INT_7XX_GPIO_BANK4	(10 + IH2_BASE) -#define INT_7XX_McBSP1TX	(11 + IH2_BASE) -#define INT_7XX_McBSP1RX	(12 + IH2_BASE) -#define INT_7XX_McBSP1RX_OF	(13 + IH2_BASE) -#define INT_7XX_UART_MODEM_IRDA_2 (14 + IH2_BASE) -#define INT_7XX_UART_MODEM_1	(15 + IH2_BASE) -#define INT_7XX_MCSI		(16 + IH2_BASE) -#define INT_7XX_uWireTX		(17 + IH2_BASE) -#define INT_7XX_uWireRX		(18 + IH2_BASE) -#define INT_7XX_SMC_CD		(19 + IH2_BASE) -#define INT_7XX_SMC_IREQ	(20 + IH2_BASE) -#define INT_7XX_HDQ_1WIRE	(21 + IH2_BASE) -#define INT_7XX_TIMER32K	(22 + IH2_BASE) -#define INT_7XX_MMC_SDIO	(23 + IH2_BASE) -#define INT_7XX_UPLD		(24 + IH2_BASE) -#define INT_7XX_USB_HHC_1	(27 + IH2_BASE) -#define INT_7XX_USB_HHC_2	(28 + IH2_BASE) -#define INT_7XX_USB_GENI	(29 + IH2_BASE) -#define INT_7XX_USB_OTG		(30 + IH2_BASE) -#define INT_7XX_CAMERA_IF	(31 + IH2_BASE) -#define INT_7XX_RNG		(32 + IH2_BASE) -#define INT_7XX_DUAL_MODE_TIMER (33 + IH2_BASE) -#define INT_7XX_DBB_RF_EN	(34 + IH2_BASE) -#define INT_7XX_MPUIO_KEYPAD	(35 + IH2_BASE) -#define INT_7XX_SHA1_MD5	(36 + IH2_BASE) -#define INT_7XX_SPI_100K_2	(37 + IH2_BASE) -#define INT_7XX_RNG_IDLE	(38 + IH2_BASE) -#define INT_7XX_MPUIO		(39 + IH2_BASE) -#define INT_7XX_LLPC_LCD_CTRL_CAN_BE_OFF	(40 + IH2_BASE) -#define INT_7XX_LLPC_OE_FALLING (41 + IH2_BASE) -#define INT_7XX_LLPC_OE_RISING	(42 + IH2_BASE) -#define INT_7XX_LLPC_VSYNC	(43 + IH2_BASE) -#define INT_7XX_WAKE_UP_REQ	(46 + IH2_BASE) -#define INT_7XX_DMA_CH6		(53 + IH2_BASE) -#define INT_7XX_DMA_CH7		(54 + IH2_BASE) -#define INT_7XX_DMA_CH8		(55 + IH2_BASE) -#define INT_7XX_DMA_CH9		(56 + IH2_BASE) -#define INT_7XX_DMA_CH10	(57 + IH2_BASE) -#define INT_7XX_DMA_CH11	(58 + IH2_BASE) -#define INT_7XX_DMA_CH12	(59 + IH2_BASE) -#define INT_7XX_DMA_CH13	(60 + IH2_BASE) -#define INT_7XX_DMA_CH14	(61 + IH2_BASE) -#define INT_7XX_DMA_CH15	(62 + IH2_BASE) -#define INT_7XX_NAND		(63 + IH2_BASE) - -#define INT_24XX_SYS_NIRQ	7 -#define INT_24XX_SDMA_IRQ0	12 -#define INT_24XX_SDMA_IRQ1	13 -#define INT_24XX_SDMA_IRQ2	14 -#define INT_24XX_SDMA_IRQ3	15 -#define INT_24XX_CAM_IRQ	24 -#define INT_24XX_DSS_IRQ	25 -#define INT_24XX_MAIL_U0_MPU	26 -#define INT_24XX_DSP_UMA	27 -#define INT_24XX_DSP_MMU	28 -#define INT_24XX_GPIO_BANK1	29 -#define INT_24XX_GPIO_BANK2	30 -#define INT_24XX_GPIO_BANK3	31 -#define INT_24XX_GPIO_BANK4	32 -#define INT_24XX_GPIO_BANK5	33 -#define INT_24XX_MAIL_U3_MPU	34 -#define INT_24XX_GPTIMER1	37 -#define INT_24XX_GPTIMER2	38 -#define INT_24XX_GPTIMER3	39 -#define INT_24XX_GPTIMER4	40 -#define INT_24XX_GPTIMER5	41 -#define INT_24XX_GPTIMER6	42 -#define INT_24XX_GPTIMER7	43 -#define INT_24XX_GPTIMER8	44 -#define INT_24XX_GPTIMER9	45 -#define INT_24XX_GPTIMER10	46 -#define INT_24XX_GPTIMER11	47 -#define INT_24XX_GPTIMER12	48 -#define INT_24XX_SHA1MD5	51 -#define INT_24XX_MCBSP4_IRQ_TX	54 -#define INT_24XX_MCBSP4_IRQ_RX	55 -#define INT_24XX_I2C1_IRQ	56 -#define INT_24XX_I2C2_IRQ	57 -#define INT_24XX_HDQ_IRQ	58 -#define INT_24XX_MCBSP1_IRQ_TX	59 -#define INT_24XX_MCBSP1_IRQ_RX	60 -#define INT_24XX_MCBSP2_IRQ_TX	62 -#define INT_24XX_MCBSP2_IRQ_RX	63 -#define INT_24XX_SPI1_IRQ	65 -#define INT_24XX_SPI2_IRQ	66 -#define INT_24XX_UART1_IRQ	72 -#define INT_24XX_UART2_IRQ	73 -#define INT_24XX_UART3_IRQ	74 -#define INT_24XX_USB_IRQ_GEN	75 -#define INT_24XX_USB_IRQ_NISO	76 -#define INT_24XX_USB_IRQ_ISO	77 -#define INT_24XX_USB_IRQ_HGEN	78 -#define INT_24XX_USB_IRQ_HSOF	79 -#define INT_24XX_USB_IRQ_OTG	80 -#define INT_24XX_MCBSP5_IRQ_TX	81 -#define INT_24XX_MCBSP5_IRQ_RX	82 -#define INT_24XX_MMC_IRQ	83 -#define INT_24XX_MMC2_IRQ	86 -#define INT_24XX_MCBSP3_IRQ_TX	89 -#define INT_24XX_MCBSP3_IRQ_RX	90 -#define INT_24XX_SPI3_IRQ	91 - -#define INT_243X_MCBSP2_IRQ	16 -#define INT_243X_MCBSP3_IRQ	17 -#define INT_243X_MCBSP4_IRQ	18 -#define INT_243X_MCBSP5_IRQ	19 -#define INT_243X_MCBSP1_IRQ	64 -#define INT_243X_HS_USB_MC	92 -#define INT_243X_HS_USB_DMA	93 -#define INT_243X_CARKIT_IRQ	94 - -#define INT_34XX_BENCH_MPU_EMUL	3 -#define INT_34XX_ST_MCBSP2_IRQ	4 -#define INT_34XX_ST_MCBSP3_IRQ	5 -#define INT_34XX_SSM_ABORT_IRQ	6 -#define INT_34XX_SYS_NIRQ	7 -#define INT_34XX_D2D_FW_IRQ	8 -#define INT_34XX_PRCM_MPU_IRQ	11 -#define INT_34XX_MCBSP1_IRQ	16 -#define INT_34XX_MCBSP2_IRQ	17 -#define INT_34XX_MCBSP3_IRQ	22 -#define INT_34XX_MCBSP4_IRQ	23 -#define INT_34XX_CAM_IRQ	24 -#define INT_34XX_MCBSP5_IRQ	27 -#define INT_34XX_GPIO_BANK1	29 -#define INT_34XX_GPIO_BANK2	30 -#define INT_34XX_GPIO_BANK3	31 -#define INT_34XX_GPIO_BANK4	32 -#define INT_34XX_GPIO_BANK5	33 -#define INT_34XX_GPIO_BANK6	34 -#define INT_34XX_USIM_IRQ	35 -#define INT_34XX_WDT3_IRQ	36 -#define INT_34XX_SPI4_IRQ	48 -#define INT_34XX_SHA1MD52_IRQ	49 -#define INT_34XX_FPKA_READY_IRQ	50 -#define INT_34XX_SHA1MD51_IRQ	51 -#define INT_34XX_RNG_IRQ	52 -#define INT_34XX_I2C3_IRQ	61 -#define INT_34XX_FPKA_ERROR_IRQ	64 -#define INT_34XX_PBIAS_IRQ	75 -#define INT_34XX_OHCI_IRQ	76 -#define INT_34XX_EHCI_IRQ	77 -#define INT_34XX_TLL_IRQ	78 -#define INT_34XX_PARTHASH_IRQ	79 -#define INT_34XX_MMC3_IRQ	94 -#define INT_34XX_GPT12_IRQ	95 - -#define INT_36XX_UART4_IRQ	80 - -#define INT_35XX_HECC0_IRQ		24 -#define INT_35XX_HECC1_IRQ		28 -#define INT_35XX_EMAC_C0_RXTHRESH_IRQ	67 -#define INT_35XX_EMAC_C0_RX_PULSE_IRQ	68 -#define INT_35XX_EMAC_C0_TX_PULSE_IRQ	69 -#define INT_35XX_EMAC_C0_MISC_PULSE_IRQ	70 -#define INT_35XX_USBOTG_IRQ		71 -#define INT_35XX_CCDC_VD0_IRQ		88 -#define INT_35XX_CCDC_VD1_IRQ		92 -#define INT_35XX_CCDC_VD2_IRQ		93 - -/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730/850) and - * 16 MPUIO lines */ -#define OMAP_MAX_GPIO_LINES	192 -#define IH_GPIO_BASE		(128 + IH2_BASE) -#define IH_MPUIO_BASE		(OMAP_MAX_GPIO_LINES + IH_GPIO_BASE) -#define OMAP_IRQ_END		(IH_MPUIO_BASE + 16) - -/* External FPGA handles interrupts on Innovator boards */ -#define	OMAP_FPGA_IRQ_BASE	(OMAP_IRQ_END) -#ifdef	CONFIG_MACH_OMAP_INNOVATOR -#define OMAP_FPGA_NR_IRQS	24 -#else -#define OMAP_FPGA_NR_IRQS	0 -#endif -#define OMAP_FPGA_IRQ_END	(OMAP_FPGA_IRQ_BASE + OMAP_FPGA_NR_IRQS) - -/* External TWL4030 can handle interrupts on 2430 and 34xx boards */ -#define	TWL4030_IRQ_BASE	(OMAP_FPGA_IRQ_END) -#ifdef	CONFIG_TWL4030_CORE -#define	TWL4030_BASE_NR_IRQS	8 -#define	TWL4030_PWR_NR_IRQS	8 -#else -#define	TWL4030_BASE_NR_IRQS	0 -#define	TWL4030_PWR_NR_IRQS	0 -#endif -#define TWL4030_IRQ_END		(TWL4030_IRQ_BASE + TWL4030_BASE_NR_IRQS) -#define TWL4030_PWR_IRQ_BASE	TWL4030_IRQ_END -#define	TWL4030_PWR_IRQ_END	(TWL4030_PWR_IRQ_BASE + TWL4030_PWR_NR_IRQS) - -/* External TWL4030 gpio interrupts are optional */ -#define TWL4030_GPIO_IRQ_BASE	TWL4030_PWR_IRQ_END -#ifdef	CONFIG_GPIO_TWL4030 -#define TWL4030_GPIO_NR_IRQS	18 -#else -#define	TWL4030_GPIO_NR_IRQS	0 -#endif -#define TWL4030_GPIO_IRQ_END	(TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS) - -#define	TWL6030_IRQ_BASE	(OMAP_FPGA_IRQ_END) -#ifdef CONFIG_TWL4030_CORE -#define	TWL6030_BASE_NR_IRQS	20 -#else -#define	TWL6030_BASE_NR_IRQS	0 -#endif -#define TWL6030_IRQ_END		(TWL6030_IRQ_BASE + TWL6030_BASE_NR_IRQS) - -/* Total number of interrupts depends on the enabled blocks above */ -#if (TWL4030_GPIO_IRQ_END > TWL6030_IRQ_END) -#define TWL_IRQ_END 		TWL4030_GPIO_IRQ_END -#else -#define TWL_IRQ_END		TWL6030_IRQ_END -#endif - -#define NR_IRQS			TWL_IRQ_END - -#define OMAP_IRQ_BIT(irq)	(1 << ((irq) % 32)) - -#define INTCPS_NR_MIR_REGS	3 -#define INTCPS_NR_IRQS		96 - -#ifndef __ASSEMBLY__ -extern void omap_init_irq(void); -extern int omap_irq_pending(void); -void omap_intc_save_context(void); -void omap_intc_restore_context(void); -void omap3_intc_suspend(void); -void omap3_intc_prepare_idle(void); -void omap3_intc_resume_idle(void); -#endif - -#include <mach/hardware.h> - -#ifdef CONFIG_FIQ -#define FIQ_START		1024 -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/keypad.h b/arch/arm/plat-omap/include/plat/keypad.h deleted file mode 100644 index 3ae52ccc793..00000000000 --- a/arch/arm/plat-omap/include/plat/keypad.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/keypad.h - * - *  Copyright (C) 2006 Komal Shah <komal_shah802003@yahoo.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef ASMARM_ARCH_KEYPAD_H -#define ASMARM_ARCH_KEYPAD_H - -#warning: Please update the board to use matrix_keypad.h instead - -struct omap_kp_platform_data { -	int rows; -	int cols; -	int *keymap; -	unsigned int keymapsize; -	unsigned int rep:1; -	unsigned long delay; -	unsigned int dbounce:1; -	/* specific to OMAP242x*/ -	unsigned int *row_gpios; -	unsigned int *col_gpios; -}; - -/* Group (0..3) -- when multiple keys are pressed, only the - * keys pressed in the same group are considered as pressed. This is - * in order to workaround certain crappy HW designs that produce ghost - * keypresses. */ -#define GROUP_0		(0 << 16) -#define GROUP_1		(1 << 16) -#define GROUP_2		(2 << 16) -#define GROUP_3		(3 << 16) -#define GROUP_MASK	GROUP_3 - -#define KEY_PERSISTENT		0x00800000 -#define KEYNUM_MASK		0x00EFFFFF -#define KEY(col, row, val) (((col) << 28) | ((row) << 24) | (val)) -#define PERSISTENT_KEY(col, row) (((col) << 28) | ((row) << 24) | \ -						KEY_PERSISTENT) - -#endif - diff --git a/arch/arm/plat-omap/include/plat/lcd_mipid.h b/arch/arm/plat-omap/include/plat/lcd_mipid.h deleted file mode 100644 index 8e52c657228..00000000000 --- a/arch/arm/plat-omap/include/plat/lcd_mipid.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __LCD_MIPID_H -#define __LCD_MIPID_H - -enum mipid_test_num { -	MIPID_TEST_RGB_LINES, -}; - -enum mipid_test_result { -	MIPID_TEST_SUCCESS, -	MIPID_TEST_INVALID, -	MIPID_TEST_FAILED, -}; - -#ifdef __KERNEL__ - -struct mipid_platform_data { -	int	nreset_gpio; -	int	data_lines; - -	void	(*shutdown)(struct mipid_platform_data *pdata); -	void	(*set_bklight_level)(struct mipid_platform_data *pdata, -				     int level); -	int	(*get_bklight_level)(struct mipid_platform_data *pdata); -	int	(*get_bklight_max)(struct mipid_platform_data *pdata); -}; - -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/led.h b/arch/arm/plat-omap/include/plat/led.h deleted file mode 100644 index 25e451e7e2f..00000000000 --- a/arch/arm/plat-omap/include/plat/led.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/led.h - * - *  Copyright (C) 2006 Samsung Electronics - *  Kyungmin Park <kyungmin.park@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef ASMARM_ARCH_LED_H -#define ASMARM_ARCH_LED_H - -struct omap_led_config { -	struct led_classdev	cdev; -	s16			gpio; -}; - -struct omap_led_platform_data { -	s16			nr_leds; -	struct omap_led_config	*leds; -}; - -#endif diff --git a/arch/arm/plat-omap/include/plat/mailbox.h b/arch/arm/plat-omap/include/plat/mailbox.h deleted file mode 100644 index 99765655210..00000000000 --- a/arch/arm/plat-omap/include/plat/mailbox.h +++ /dev/null @@ -1,103 +0,0 @@ -/* mailbox.h */ - -#ifndef MAILBOX_H -#define MAILBOX_H - -#include <linux/spinlock.h> -#include <linux/workqueue.h> -#include <linux/interrupt.h> -#include <linux/device.h> -#include <linux/kfifo.h> - -typedef u32 mbox_msg_t; -struct omap_mbox; - -typedef int __bitwise omap_mbox_irq_t; -#define IRQ_TX ((__force omap_mbox_irq_t) 1) -#define IRQ_RX ((__force omap_mbox_irq_t) 2) - -typedef int __bitwise omap_mbox_type_t; -#define OMAP_MBOX_TYPE1 ((__force omap_mbox_type_t) 1) -#define OMAP_MBOX_TYPE2 ((__force omap_mbox_type_t) 2) - -struct omap_mbox_ops { -	omap_mbox_type_t	type; -	int		(*startup)(struct omap_mbox *mbox); -	void		(*shutdown)(struct omap_mbox *mbox); -	/* fifo */ -	mbox_msg_t	(*fifo_read)(struct omap_mbox *mbox); -	void		(*fifo_write)(struct omap_mbox *mbox, mbox_msg_t msg); -	int		(*fifo_empty)(struct omap_mbox *mbox); -	int		(*fifo_full)(struct omap_mbox *mbox); -	/* irq */ -	void		(*enable_irq)(struct omap_mbox *mbox, -						omap_mbox_irq_t irq); -	void		(*disable_irq)(struct omap_mbox *mbox, -						omap_mbox_irq_t irq); -	void		(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); -	int		(*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); -	/* ctx */ -	void		(*save_ctx)(struct omap_mbox *mbox); -	void		(*restore_ctx)(struct omap_mbox *mbox); -}; - -struct omap_mbox_queue { -	spinlock_t		lock; -	struct kfifo		fifo; -	struct work_struct	work; -	struct tasklet_struct	tasklet; -	int	(*callback)(void *); -	struct omap_mbox	*mbox; -}; - -struct omap_mbox { -	char			*name; -	unsigned int		irq; -	struct omap_mbox_queue	*txq, *rxq; -	struct omap_mbox_ops	*ops; -	struct device		*dev; -	void			*priv; -}; - -int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg); -void omap_mbox_init_seq(struct omap_mbox *); - -struct omap_mbox *omap_mbox_get(const char *); -void omap_mbox_put(struct omap_mbox *); - -int omap_mbox_register(struct device *parent, struct omap_mbox **); -int omap_mbox_unregister(void); - -static inline void omap_mbox_save_ctx(struct omap_mbox *mbox) -{ -	if (!mbox->ops->save_ctx) { -		dev_err(mbox->dev, "%s:\tno save\n", __func__); -		return; -	} - -	mbox->ops->save_ctx(mbox); -} - -static inline void omap_mbox_restore_ctx(struct omap_mbox *mbox) -{ -	if (!mbox->ops->restore_ctx) { -		dev_err(mbox->dev, "%s:\tno restore\n", __func__); -		return; -	} - -	mbox->ops->restore_ctx(mbox); -} - -static inline void omap_mbox_enable_irq(struct omap_mbox *mbox, -					omap_mbox_irq_t irq) -{ -	mbox->ops->enable_irq(mbox, irq); -} - -static inline void omap_mbox_disable_irq(struct omap_mbox *mbox, -					 omap_mbox_irq_t irq) -{ -	mbox->ops->disable_irq(mbox, irq); -} - -#endif /* MAILBOX_H */ diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h deleted file mode 100644 index b87d83ccd54..00000000000 --- a/arch/arm/plat-omap/include/plat/mcbsp.h +++ /dev/null @@ -1,559 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/mcbsp.h - * - * Defines for Multi-Channel Buffered Serial Port - * - * Copyright (C) 2002 RidgeRun, Inc. - * Author: Steve Johnson - * - * 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 - * - */ -#ifndef __ASM_ARCH_OMAP_MCBSP_H -#define __ASM_ARCH_OMAP_MCBSP_H - -#include <linux/completion.h> -#include <linux/spinlock.h> - -#include <mach/hardware.h> -#include <plat/clock.h> - -/* macro for building platform_device for McBSP ports */ -#define OMAP_MCBSP_PLATFORM_DEVICE(port_nr)		\ -static struct platform_device omap_mcbsp##port_nr = {	\ -	.name	= "omap-mcbsp-dai",			\ -	.id	= OMAP_MCBSP##port_nr,			\ -} - -#define OMAP7XX_MCBSP1_BASE	0xfffb1000 -#define OMAP7XX_MCBSP2_BASE	0xfffb1800 - -#define OMAP1510_MCBSP1_BASE	0xe1011800 -#define OMAP1510_MCBSP2_BASE	0xfffb1000 -#define OMAP1510_MCBSP3_BASE	0xe1017000 - -#define OMAP1610_MCBSP1_BASE	0xe1011800 -#define OMAP1610_MCBSP2_BASE	0xfffb1000 -#define OMAP1610_MCBSP3_BASE	0xe1017000 - -#define OMAP24XX_MCBSP1_BASE	0x48074000 -#define OMAP24XX_MCBSP2_BASE	0x48076000 -#define OMAP2430_MCBSP3_BASE	0x4808c000 -#define OMAP2430_MCBSP4_BASE	0x4808e000 -#define OMAP2430_MCBSP5_BASE	0x48096000 - -#define OMAP34XX_MCBSP1_BASE	0x48074000 -#define OMAP34XX_MCBSP2_BASE	0x49022000 -#define OMAP34XX_MCBSP2_ST_BASE	0x49028000 -#define OMAP34XX_MCBSP3_BASE	0x49024000 -#define OMAP34XX_MCBSP3_ST_BASE	0x4902A000 -#define OMAP34XX_MCBSP3_BASE	0x49024000 -#define OMAP34XX_MCBSP4_BASE	0x49026000 -#define OMAP34XX_MCBSP5_BASE	0x48096000 - -#define OMAP44XX_MCBSP1_BASE	0x49022000 -#define OMAP44XX_MCBSP2_BASE	0x49024000 -#define OMAP44XX_MCBSP3_BASE	0x49026000 -#define OMAP44XX_MCBSP4_BASE	0x48096000 - -#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) - -#define OMAP_MCBSP_REG_DRR2	0x00 -#define OMAP_MCBSP_REG_DRR1	0x02 -#define OMAP_MCBSP_REG_DXR2	0x04 -#define OMAP_MCBSP_REG_DXR1	0x06 -#define OMAP_MCBSP_REG_SPCR2	0x08 -#define OMAP_MCBSP_REG_SPCR1	0x0a -#define OMAP_MCBSP_REG_RCR2	0x0c -#define OMAP_MCBSP_REG_RCR1	0x0e -#define OMAP_MCBSP_REG_XCR2	0x10 -#define OMAP_MCBSP_REG_XCR1	0x12 -#define OMAP_MCBSP_REG_SRGR2	0x14 -#define OMAP_MCBSP_REG_SRGR1	0x16 -#define OMAP_MCBSP_REG_MCR2	0x18 -#define OMAP_MCBSP_REG_MCR1	0x1a -#define OMAP_MCBSP_REG_RCERA	0x1c -#define OMAP_MCBSP_REG_RCERB	0x1e -#define OMAP_MCBSP_REG_XCERA	0x20 -#define OMAP_MCBSP_REG_XCERB	0x22 -#define OMAP_MCBSP_REG_PCR0	0x24 -#define OMAP_MCBSP_REG_RCERC	0x26 -#define OMAP_MCBSP_REG_RCERD	0x28 -#define OMAP_MCBSP_REG_XCERC	0x2A -#define OMAP_MCBSP_REG_XCERD	0x2C -#define OMAP_MCBSP_REG_RCERE	0x2E -#define OMAP_MCBSP_REG_RCERF	0x30 -#define OMAP_MCBSP_REG_XCERE	0x32 -#define OMAP_MCBSP_REG_XCERF	0x34 -#define OMAP_MCBSP_REG_RCERG	0x36 -#define OMAP_MCBSP_REG_RCERH	0x38 -#define OMAP_MCBSP_REG_XCERG	0x3A -#define OMAP_MCBSP_REG_XCERH	0x3C - -/* Dummy defines, these are not available on omap1 */ -#define OMAP_MCBSP_REG_XCCR	0x00 -#define OMAP_MCBSP_REG_RCCR	0x00 - -#define AUDIO_MCBSP_DATAWRITE	(OMAP1510_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1) -#define AUDIO_MCBSP_DATAREAD	(OMAP1510_MCBSP1_BASE + OMAP_MCBSP_REG_DRR1) - -#define AUDIO_MCBSP		OMAP_MCBSP1 -#define AUDIO_DMA_TX		OMAP_DMA_MCBSP1_TX -#define AUDIO_DMA_RX		OMAP_DMA_MCBSP1_RX - -#else - -#define OMAP_MCBSP_REG_DRR2	0x00 -#define OMAP_MCBSP_REG_DRR1	0x04 -#define OMAP_MCBSP_REG_DXR2	0x08 -#define OMAP_MCBSP_REG_DXR1	0x0C -#define OMAP_MCBSP_REG_DRR	0x00 -#define OMAP_MCBSP_REG_DXR	0x08 -#define OMAP_MCBSP_REG_SPCR2	0x10 -#define OMAP_MCBSP_REG_SPCR1	0x14 -#define OMAP_MCBSP_REG_RCR2	0x18 -#define OMAP_MCBSP_REG_RCR1	0x1C -#define OMAP_MCBSP_REG_XCR2	0x20 -#define OMAP_MCBSP_REG_XCR1	0x24 -#define OMAP_MCBSP_REG_SRGR2	0x28 -#define OMAP_MCBSP_REG_SRGR1	0x2C -#define OMAP_MCBSP_REG_MCR2	0x30 -#define OMAP_MCBSP_REG_MCR1	0x34 -#define OMAP_MCBSP_REG_RCERA	0x38 -#define OMAP_MCBSP_REG_RCERB	0x3C -#define OMAP_MCBSP_REG_XCERA	0x40 -#define OMAP_MCBSP_REG_XCERB	0x44 -#define OMAP_MCBSP_REG_PCR0	0x48 -#define OMAP_MCBSP_REG_RCERC	0x4C -#define OMAP_MCBSP_REG_RCERD	0x50 -#define OMAP_MCBSP_REG_XCERC	0x54 -#define OMAP_MCBSP_REG_XCERD	0x58 -#define OMAP_MCBSP_REG_RCERE	0x5C -#define OMAP_MCBSP_REG_RCERF	0x60 -#define OMAP_MCBSP_REG_XCERE	0x64 -#define OMAP_MCBSP_REG_XCERF	0x68 -#define OMAP_MCBSP_REG_RCERG	0x6C -#define OMAP_MCBSP_REG_RCERH	0x70 -#define OMAP_MCBSP_REG_XCERG	0x74 -#define OMAP_MCBSP_REG_XCERH	0x78 -#define OMAP_MCBSP_REG_SYSCON	0x8C -#define OMAP_MCBSP_REG_THRSH2	0x90 -#define OMAP_MCBSP_REG_THRSH1	0x94 -#define OMAP_MCBSP_REG_IRQST	0xA0 -#define OMAP_MCBSP_REG_IRQEN	0xA4 -#define OMAP_MCBSP_REG_WAKEUPEN	0xA8 -#define OMAP_MCBSP_REG_XCCR	0xAC -#define OMAP_MCBSP_REG_RCCR	0xB0 -#define OMAP_MCBSP_REG_XBUFFSTAT	0xB4 -#define OMAP_MCBSP_REG_RBUFFSTAT	0xB8 -#define OMAP_MCBSP_REG_SSELCR	0xBC - -#define OMAP_ST_REG_REV		0x00 -#define OMAP_ST_REG_SYSCONFIG	0x10 -#define OMAP_ST_REG_IRQSTATUS	0x18 -#define OMAP_ST_REG_IRQENABLE	0x1C -#define OMAP_ST_REG_SGAINCR	0x24 -#define OMAP_ST_REG_SFIRCR	0x28 -#define OMAP_ST_REG_SSELCR	0x2C - -#define AUDIO_MCBSP_DATAWRITE	(OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR1) -#define AUDIO_MCBSP_DATAREAD	(OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1) - -#define AUDIO_MCBSP		OMAP_MCBSP2 -#define AUDIO_DMA_TX		OMAP24XX_DMA_MCBSP2_TX -#define AUDIO_DMA_RX		OMAP24XX_DMA_MCBSP2_RX - -#endif - -/************************** McBSP SPCR1 bit definitions ***********************/ -#define RRST			0x0001 -#define RRDY			0x0002 -#define RFULL			0x0004 -#define RSYNC_ERR		0x0008 -#define RINTM(value)		((value)<<4)	/* bits 4:5 */ -#define ABIS			0x0040 -#define DXENA			0x0080 -#define CLKSTP(value)		((value)<<11)	/* bits 11:12 */ -#define RJUST(value)		((value)<<13)	/* bits 13:14 */ -#define ALB			0x8000 -#define DLB			0x8000 - -/************************** McBSP SPCR2 bit definitions ***********************/ -#define XRST		0x0001 -#define XRDY		0x0002 -#define XEMPTY		0x0004 -#define XSYNC_ERR	0x0008 -#define XINTM(value)	((value)<<4)		/* bits 4:5 */ -#define GRST		0x0040 -#define FRST		0x0080 -#define SOFT		0x0100 -#define FREE		0x0200 - -/************************** McBSP PCR bit definitions *************************/ -#define CLKRP		0x0001 -#define CLKXP		0x0002 -#define FSRP		0x0004 -#define FSXP		0x0008 -#define DR_STAT		0x0010 -#define DX_STAT		0x0020 -#define CLKS_STAT	0x0040 -#define SCLKME		0x0080 -#define CLKRM		0x0100 -#define CLKXM		0x0200 -#define FSRM		0x0400 -#define FSXM		0x0800 -#define RIOEN		0x1000 -#define XIOEN		0x2000 -#define IDLE_EN		0x4000 - -/************************** McBSP RCR1 bit definitions ************************/ -#define RWDLEN1(value)		((value)<<5)	/* Bits 5:7 */ -#define RFRLEN1(value)		((value)<<8)	/* Bits 8:14 */ - -/************************** McBSP XCR1 bit definitions ************************/ -#define XWDLEN1(value)		((value)<<5)	/* Bits 5:7 */ -#define XFRLEN1(value)		((value)<<8)	/* Bits 8:14 */ - -/*************************** McBSP RCR2 bit definitions ***********************/ -#define RDATDLY(value)		(value)		/* Bits 0:1 */ -#define RFIG			0x0004 -#define RCOMPAND(value)		((value)<<3)	/* Bits 3:4 */ -#define RWDLEN2(value)		((value)<<5)	/* Bits 5:7 */ -#define RFRLEN2(value)		((value)<<8)	/* Bits 8:14 */ -#define RPHASE			0x8000 - -/*************************** McBSP XCR2 bit definitions ***********************/ -#define XDATDLY(value)		(value)		/* Bits 0:1 */ -#define XFIG			0x0004 -#define XCOMPAND(value)		((value)<<3)	/* Bits 3:4 */ -#define XWDLEN2(value)		((value)<<5)	/* Bits 5:7 */ -#define XFRLEN2(value)		((value)<<8)	/* Bits 8:14 */ -#define XPHASE			0x8000 - -/************************* McBSP SRGR1 bit definitions ************************/ -#define CLKGDV(value)		(value)		/* Bits 0:7 */ -#define FWID(value)		((value)<<8)	/* Bits 8:15 */ - -/************************* McBSP SRGR2 bit definitions ************************/ -#define FPER(value)		(value)		/* Bits 0:11 */ -#define FSGM			0x1000 -#define CLKSM			0x2000 -#define CLKSP			0x4000 -#define GSYNC			0x8000 - -/************************* McBSP MCR1 bit definitions *************************/ -#define RMCM			0x0001 -#define RCBLK(value)		((value)<<2)	/* Bits 2:4 */ -#define RPABLK(value)		((value)<<5)	/* Bits 5:6 */ -#define RPBBLK(value)		((value)<<7)	/* Bits 7:8 */ - -/************************* McBSP MCR2 bit definitions *************************/ -#define XMCM(value)		(value)		/* Bits 0:1 */ -#define XCBLK(value)		((value)<<2)	/* Bits 2:4 */ -#define XPABLK(value)		((value)<<5)	/* Bits 5:6 */ -#define XPBBLK(value)		((value)<<7)	/* Bits 7:8 */ - -/*********************** McBSP XCCR bit definitions *************************/ -#define EXTCLKGATE		0x8000 -#define PPCONNECT		0x4000 -#define DXENDLY(value)		((value)<<12)	/* Bits 12:13 */ -#define XFULL_CYCLE		0x0800 -#define DILB			0x0020 -#define XDMAEN			0x0008 -#define XDISABLE		0x0001 - -/********************** McBSP RCCR bit definitions *************************/ -#define RFULL_CYCLE		0x0800 -#define RDMAEN			0x0008 -#define RDISABLE		0x0001 - -/********************** McBSP SYSCONFIG bit definitions ********************/ -#define CLOCKACTIVITY(value)	((value)<<8) -#define SIDLEMODE(value)	((value)<<3) -#define ENAWAKEUP		0x0004 -#define SOFTRST			0x0002 - -/********************** McBSP SSELCR bit definitions ***********************/ -#define SIDETONEEN		0x0400 - -/********************** McBSP Sidetone SYSCONFIG bit definitions ***********/ -#define ST_AUTOIDLE		0x0001 - -/********************** McBSP Sidetone SGAINCR bit definitions *************/ -#define ST_CH1GAIN(value)	((value<<16))	/* Bits 16:31 */ -#define ST_CH0GAIN(value)	(value)		/* Bits 0:15 */ - -/********************** McBSP Sidetone SFIRCR bit definitions **************/ -#define ST_FIRCOEFF(value)	(value)		/* Bits 0:15 */ - -/********************** McBSP Sidetone SSELCR bit definitions **************/ -#define ST_COEFFWRDONE		0x0004 -#define ST_COEFFWREN		0x0002 -#define ST_SIDETONEEN		0x0001 - -/********************** McBSP DMA operating modes **************************/ -#define MCBSP_DMA_MODE_ELEMENT		0 -#define MCBSP_DMA_MODE_THRESHOLD	1 -#define MCBSP_DMA_MODE_FRAME		2 - -/********************** McBSP WAKEUPEN bit definitions *********************/ -#define XEMPTYEOFEN		0x4000 -#define XRDYEN			0x0400 -#define XEOFEN			0x0200 -#define XFSXEN			0x0100 -#define XSYNCERREN		0x0080 -#define RRDYEN			0x0008 -#define REOFEN			0x0004 -#define RFSREN			0x0002 -#define RSYNCERREN		0x0001 - -/* CLKR signal muxing options */ -#define CLKR_SRC_CLKR		0 -#define CLKR_SRC_CLKX		1 - -/* FSR signal muxing options */ -#define FSR_SRC_FSR		0 -#define FSR_SRC_FSX		1 - -/* McBSP functional clock sources */ -#define MCBSP_CLKS_PRCM_SRC	0 -#define MCBSP_CLKS_PAD_SRC	1 - -/* we don't do multichannel for now */ -struct omap_mcbsp_reg_cfg { -	u16 spcr2; -	u16 spcr1; -	u16 rcr2; -	u16 rcr1; -	u16 xcr2; -	u16 xcr1; -	u16 srgr2; -	u16 srgr1; -	u16 mcr2; -	u16 mcr1; -	u16 pcr0; -	u16 rcerc; -	u16 rcerd; -	u16 xcerc; -	u16 xcerd; -	u16 rcere; -	u16 rcerf; -	u16 xcere; -	u16 xcerf; -	u16 rcerg; -	u16 rcerh; -	u16 xcerg; -	u16 xcerh; -	u16 xccr; -	u16 rccr; -}; - -typedef enum { -	OMAP_MCBSP1 = 0, -	OMAP_MCBSP2, -	OMAP_MCBSP3, -	OMAP_MCBSP4, -	OMAP_MCBSP5 -} omap_mcbsp_id; - -typedef int __bitwise omap_mcbsp_io_type_t; -#define OMAP_MCBSP_IRQ_IO ((__force omap_mcbsp_io_type_t) 1) -#define OMAP_MCBSP_POLL_IO ((__force omap_mcbsp_io_type_t) 2) - -typedef enum { -	OMAP_MCBSP_WORD_8 = 0, -	OMAP_MCBSP_WORD_12, -	OMAP_MCBSP_WORD_16, -	OMAP_MCBSP_WORD_20, -	OMAP_MCBSP_WORD_24, -	OMAP_MCBSP_WORD_32, -} omap_mcbsp_word_length; - -typedef enum { -	OMAP_MCBSP_CLK_RISING = 0, -	OMAP_MCBSP_CLK_FALLING, -} omap_mcbsp_clk_polarity; - -typedef enum { -	OMAP_MCBSP_FS_ACTIVE_HIGH = 0, -	OMAP_MCBSP_FS_ACTIVE_LOW, -} omap_mcbsp_fs_polarity; - -typedef enum { -	OMAP_MCBSP_CLK_STP_MODE_NO_DELAY = 0, -	OMAP_MCBSP_CLK_STP_MODE_DELAY, -} omap_mcbsp_clk_stp_mode; - - -/******* SPI specific mode **********/ -typedef enum { -	OMAP_MCBSP_SPI_MASTER = 0, -	OMAP_MCBSP_SPI_SLAVE, -} omap_mcbsp_spi_mode; - -struct omap_mcbsp_spi_cfg { -	omap_mcbsp_spi_mode		spi_mode; -	omap_mcbsp_clk_polarity		rx_clock_polarity; -	omap_mcbsp_clk_polarity		tx_clock_polarity; -	omap_mcbsp_fs_polarity		fsx_polarity; -	u8				clk_div; -	omap_mcbsp_clk_stp_mode		clk_stp_mode; -	omap_mcbsp_word_length		word_length; -}; - -/* Platform specific configuration */ -struct omap_mcbsp_ops { -	void (*request)(unsigned int); -	void (*free)(unsigned int); -	int (*set_clks_src)(u8, u8); -}; - -struct omap_mcbsp_platform_data { -	unsigned long phys_base; -	u8 dma_rx_sync, dma_tx_sync; -	u16 rx_irq, tx_irq; -	struct omap_mcbsp_ops *ops; -#ifdef CONFIG_ARCH_OMAP3 -	/* Sidetone block for McBSP 2 and 3 */ -	unsigned long phys_base_st; -	u16 buffer_size; -#endif -}; - -struct omap_mcbsp_st_data { -	void __iomem *io_base_st; -	bool running; -	bool enabled; -	s16 taps[128];	/* Sidetone filter coefficients */ -	int nr_taps;	/* Number of filter coefficients in use */ -	s16 ch0gain; -	s16 ch1gain; -}; - -struct omap_mcbsp { -	struct device *dev; -	unsigned long phys_base; -	void __iomem *io_base; -	u8 id; -	u8 free; -	omap_mcbsp_word_length rx_word_length; -	omap_mcbsp_word_length tx_word_length; - -	omap_mcbsp_io_type_t io_type; /* IRQ or poll */ -	/* IRQ based TX/RX */ -	int rx_irq; -	int tx_irq; - -	/* DMA stuff */ -	u8 dma_rx_sync; -	short dma_rx_lch; -	u8 dma_tx_sync; -	short dma_tx_lch; - -	/* Completion queues */ -	struct completion tx_irq_completion; -	struct completion rx_irq_completion; -	struct completion tx_dma_completion; -	struct completion rx_dma_completion; - -	/* Protect the field .free, while checking if the mcbsp is in use */ -	spinlock_t lock; -	struct omap_mcbsp_platform_data *pdata; -	struct clk *iclk; -	struct clk *fclk; -#ifdef CONFIG_ARCH_OMAP3 -	struct omap_mcbsp_st_data *st_data; -	int dma_op_mode; -	u16 max_tx_thres; -	u16 max_rx_thres; -#endif -	void *reg_cache; -}; -extern struct omap_mcbsp **mcbsp_ptr; -extern int omap_mcbsp_count, omap_mcbsp_cache_size; - -#define omap_mcbsp_check_valid_id(id)	(id < omap_mcbsp_count) -#define id_to_mcbsp_ptr(id)		mcbsp_ptr[id]; - -int omap_mcbsp_init(void); -void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, -					int size); -void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); -#ifdef CONFIG_ARCH_OMAP3 -void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold); -void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold); -u16 omap_mcbsp_get_max_tx_threshold(unsigned int id); -u16 omap_mcbsp_get_max_rx_threshold(unsigned int id); -u16 omap_mcbsp_get_fifo_size(unsigned int id); -u16 omap_mcbsp_get_tx_delay(unsigned int id); -u16 omap_mcbsp_get_rx_delay(unsigned int id); -int omap_mcbsp_get_dma_op_mode(unsigned int id); -#else -static inline void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) -{ } -static inline void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) -{ } -static inline u16 omap_mcbsp_get_max_tx_threshold(unsigned int id) { return 0; } -static inline u16 omap_mcbsp_get_max_rx_threshold(unsigned int id) { return 0; } -static inline u16 omap_mcbsp_get_fifo_size(unsigned int id) { return 0; } -static inline u16 omap_mcbsp_get_tx_delay(unsigned int id) { return 0; } -static inline u16 omap_mcbsp_get_rx_delay(unsigned int id) { return 0; } -static inline int omap_mcbsp_get_dma_op_mode(unsigned int id) { return 0; } -#endif -int omap_mcbsp_request(unsigned int id); -void omap_mcbsp_free(unsigned int id); -void omap_mcbsp_start(unsigned int id, int tx, int rx); -void omap_mcbsp_stop(unsigned int id, int tx, int rx); -void omap_mcbsp_xmit_word(unsigned int id, u32 word); -u32 omap_mcbsp_recv_word(unsigned int id); - -int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int length); -int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int length); -int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word); -int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word); - - -/* McBSP functional clock source changing function */ -extern int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id); -/* SPI specific API */ -void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * spi_cfg); - -/* Polled read/write functions */ -int omap_mcbsp_pollread(unsigned int id, u16 * buf); -int omap_mcbsp_pollwrite(unsigned int id, u16 buf); -int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type); - -/* McBSP signal muxing API */ -void omap2_mcbsp1_mux_clkr_src(u8 mux); -void omap2_mcbsp1_mux_fsr_src(u8 mux); - -#ifdef CONFIG_ARCH_OMAP3 -/* Sidetone specific API */ -int omap_st_set_chgain(unsigned int id, int channel, s16 chgain); -int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain); -int omap_st_enable(unsigned int id); -int omap_st_disable(unsigned int id); -int omap_st_is_enabled(unsigned int id); -#else -static inline int omap_st_set_chgain(unsigned int id, int channel, -				     s16 chgain) { return 0; } -static inline int omap_st_get_chgain(unsigned int id, int channel, -				     s16 *chgain) { return 0; } -static inline int omap_st_enable(unsigned int id) { return 0; } -static inline int omap_st_disable(unsigned int id) { return 0; } -static inline int omap_st_is_enabled(unsigned int id) {  return 0; } -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/mcspi.h b/arch/arm/plat-omap/include/plat/mcspi.h deleted file mode 100644 index 1254e4945b6..00000000000 --- a/arch/arm/plat-omap/include/plat/mcspi.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _OMAP2_MCSPI_H -#define _OMAP2_MCSPI_H - -struct omap2_mcspi_platform_config { -	unsigned short	num_cs; -}; - -struct omap2_mcspi_device_config { -	unsigned turbo_mode:1; - -	/* Do we want one channel enabled at the same time? */ -	unsigned single_channel:1; -}; - -#endif diff --git a/arch/arm/plat-omap/include/plat/memory.h b/arch/arm/plat-omap/include/plat/memory.h deleted file mode 100644 index d5306bee44b..00000000000 --- a/arch/arm/plat-omap/include/plat/memory.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/memory.h - * - * Memory map for OMAP-1510 and 1610 - * - * Copyright (C) 2000 RidgeRun, Inc. - * Author: Greg Lonnon <glonnon@ridgerun.com> - * - * This file was derived from arch/arm/mach-intergrator/include/mach/memory.h - * Copyright (C) 1999 ARM Limited - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_MEMORY_H -#define __ASM_ARCH_MEMORY_H - -/* - * Physical DRAM offset. - */ -#if defined(CONFIG_ARCH_OMAP1) -#define PHYS_OFFSET		UL(0x10000000) -#else -#define PHYS_OFFSET		UL(0x80000000) -#endif - -/* - * Bus address is physical address, except for OMAP-1510 Local Bus. - * OMAP-1510 bus address is translated into a Local Bus address if the - * OMAP bus type is lbus. We do the address translation based on the - * device overriding the defaults used in the dma-mapping API. - * Note that the is_lbus_device() test is not very efficient on 1510 - * because of the strncmp(). - */ -#ifdef CONFIG_ARCH_OMAP15XX - -/* - * OMAP-1510 Local Bus address offset - */ -#define OMAP1510_LB_OFFSET	UL(0x30000000) - -#define virt_to_lbus(x)		((x) - PAGE_OFFSET + OMAP1510_LB_OFFSET) -#define lbus_to_virt(x)		((x) - OMAP1510_LB_OFFSET + PAGE_OFFSET) -#define is_lbus_device(dev)	(cpu_is_omap15xx() && dev && (strncmp(dev_name(dev), "ohci", 4) == 0)) - -#define __arch_page_to_dma(dev, page)	\ -	({ dma_addr_t __dma = page_to_phys(page); \ -	   if (is_lbus_device(dev)) \ -		__dma = __dma - PHYS_OFFSET + OMAP1510_LB_OFFSET; \ -	   __dma; }) - -#define __arch_dma_to_page(dev, addr)	\ -	({ dma_addr_t __dma = addr;				\ -	   if (is_lbus_device(dev))				\ -		__dma += PHYS_OFFSET - OMAP1510_LB_OFFSET;	\ -	   phys_to_page(__dma);					\ -	}) - -#define __arch_dma_to_virt(dev, addr)	({ (void *) (is_lbus_device(dev) ? \ -						lbus_to_virt(addr) : \ -						__phys_to_virt(addr)); }) - -#define __arch_virt_to_dma(dev, addr)	({ unsigned long __addr = (unsigned long)(addr); \ -					   (dma_addr_t) (is_lbus_device(dev) ? \ -						virt_to_lbus(__addr) : \ -						__virt_to_phys(__addr)); }) - -#endif	/* CONFIG_ARCH_OMAP15XX */ - -/* Override the ARM default */ -#ifdef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE - -#if (CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE == 0) -#undef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE -#define CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE 2 -#endif - -#define CONSISTENT_DMA_SIZE \ -	(((CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE + 1) & ~1) * 1024 * 1024) - -#endif - -#endif - diff --git a/arch/arm/plat-omap/include/plat/menelaus.h b/arch/arm/plat-omap/include/plat/menelaus.h deleted file mode 100644 index 4a970ec62dd..00000000000 --- a/arch/arm/plat-omap/include/plat/menelaus.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/menelaus.h - * - * Functions to access Menelaus power management chip - */ - -#ifndef __ASM_ARCH_MENELAUS_H -#define __ASM_ARCH_MENELAUS_H - -struct device; - -struct menelaus_platform_data { -	int (* late_init)(struct device *dev); -}; - -extern int menelaus_register_mmc_callback(void (*callback)(void *data, u8 card_mask), -					  void *data); -extern void menelaus_unregister_mmc_callback(void); -extern int menelaus_set_mmc_opendrain(int slot, int enable); -extern int menelaus_set_mmc_slot(int slot, int enable, int power, int cd_on); - -extern int menelaus_set_vmem(unsigned int mV); -extern int menelaus_set_vio(unsigned int mV); -extern int menelaus_set_vmmc(unsigned int mV); -extern int menelaus_set_vaux(unsigned int mV); -extern int menelaus_set_vdcdc(int dcdc, unsigned int mV); -extern int menelaus_set_slot_sel(int enable); -extern int menelaus_get_slot_pin_states(void); -extern int menelaus_set_vcore_sw(unsigned int mV); -extern int menelaus_set_vcore_hw(unsigned int roof_mV, unsigned int floor_mV); - -#define EN_VPLL_SLEEP	(1 << 7) -#define EN_VMMC_SLEEP	(1 << 6) -#define EN_VAUX_SLEEP	(1 << 5) -#define EN_VIO_SLEEP	(1 << 4) -#define EN_VMEM_SLEEP	(1 << 3) -#define EN_DC3_SLEEP	(1 << 2) -#define EN_DC2_SLEEP	(1 << 1) -#define EN_VC_SLEEP	(1 << 0) - -extern int menelaus_set_regulator_sleep(int enable, u32 val); - -#if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_MENELAUS) -#define omap_has_menelaus()	1 -#else -#define omap_has_menelaus()	0 -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h deleted file mode 100644 index f57f36abb07..00000000000 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * MMC definitions for OMAP2 - * - * Copyright (C) 2006 Nokia Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __OMAP2_MMC_H -#define __OMAP2_MMC_H - -#include <linux/types.h> -#include <linux/device.h> -#include <linux/mmc/host.h> - -#include <plat/board.h> - -#define OMAP15XX_NR_MMC		1 -#define OMAP16XX_NR_MMC		2 -#define OMAP1_MMC_SIZE		0x080 -#define OMAP1_MMC1_BASE		0xfffb7800 -#define OMAP1_MMC2_BASE		0xfffb7c00	/* omap16xx only */ - -#define OMAP24XX_NR_MMC		2 -#define OMAP34XX_NR_MMC		3 -#define OMAP44XX_NR_MMC		5 -#define OMAP2420_MMC_SIZE	OMAP1_MMC_SIZE -#define OMAP3_HSMMC_SIZE	0x200 -#define OMAP4_HSMMC_SIZE	0x1000 -#define OMAP2_MMC1_BASE		0x4809c000 -#define OMAP2_MMC2_BASE		0x480b4000 -#define OMAP3_MMC3_BASE		0x480ad000 -#define OMAP4_MMC4_BASE		0x480d1000 -#define OMAP4_MMC5_BASE		0x480d5000 -#define OMAP4_MMC_REG_OFFSET	0x100 -#define HSMMC5			(1 << 4) -#define HSMMC4			(1 << 3) -#define HSMMC3			(1 << 2) -#define HSMMC2			(1 << 1) -#define HSMMC1			(1 << 0) - -#define OMAP_MMC_MAX_SLOTS	2 - -struct omap_mmc_platform_data { -	/* back-link to device */ -	struct device *dev; - -	/* number of slots per controller */ -	unsigned nr_slots:2; - -	/* set if your board has components or wiring that limits the -	 * maximum frequency on the MMC bus */ -	unsigned int max_freq; - -	/* switch the bus to a new slot */ -	int (*switch_slot)(struct device *dev, int slot); -	/* initialize board-specific MMC functionality, can be NULL if -	 * not supported */ -	int (*init)(struct device *dev); -	void (*cleanup)(struct device *dev); -	void (*shutdown)(struct device *dev); - -	/* To handle board related suspend/resume functionality for MMC */ -	int (*suspend)(struct device *dev, int slot); -	int (*resume)(struct device *dev, int slot); - -	/* Return context loss count due to PM states changing */ -	int (*get_context_loss_count)(struct device *dev); - -	u64 dma_mask; - -	/* Register offset deviation */ -	u16 reg_offset; - -	struct omap_mmc_slot_data { - -		/* -		 * 4/8 wires and any additional host capabilities -		 * need to OR'd all capabilities (ref. linux/mmc/host.h) -		 */ -		u8  wires;	/* Used for the MMC driver on omap1 and 2420 */ -		u32 caps;	/* Used for the MMC driver on 2430 and later */ - -		/* -		 * nomux means "standard" muxing is wrong on this board, and -		 * that board-specific code handled it before common init logic. -		 */ -		unsigned nomux:1; - -		/* switch pin can be for card detect (default) or card cover */ -		unsigned cover:1; - -		/* use the internal clock */ -		unsigned internal_clock:1; - -		/* nonremovable e.g. eMMC */ -		unsigned nonremovable:1; - -		/* Try to sleep or power off when possible */ -		unsigned power_saving:1; - -		/* If using power_saving and the MMC power is not to go off */ -		unsigned no_off:1; - -		/* Regulator off remapped to sleep */ -		unsigned vcc_aux_disable_is_sleep:1; - -		/* we can put the features above into this variable */ -#define HSMMC_HAS_PBIAS		(1 << 0) -#define HSMMC_HAS_UPDATED_RESET	(1 << 1) -		unsigned features; - -		int switch_pin;			/* gpio (card detect) */ -		int gpio_wp;			/* gpio (write protect) */ - -		int (*set_bus_mode)(struct device *dev, int slot, int bus_mode); -		int (*set_power)(struct device *dev, int slot, -				 int power_on, int vdd); -		int (*get_ro)(struct device *dev, int slot); -		int (*set_sleep)(struct device *dev, int slot, int sleep, -				 int vdd, int cardsleep); -		void (*remux)(struct device *dev, int slot, int power_on); -		/* Call back before enabling / disabling regulators */ -		void (*before_set_reg)(struct device *dev, int slot, -				       int power_on, int vdd); -		/* Call back after enabling / disabling regulators */ -		void (*after_set_reg)(struct device *dev, int slot, -				      int power_on, int vdd); -		/* if we have special card, init it using this callback */ -		void (*init_card)(struct mmc_card *card); - -		/* return MMC cover switch state, can be NULL if not supported. -		 * -		 * possible return values: -		 *   0 - closed -		 *   1 - open -		 */ -		int (*get_cover_state)(struct device *dev, int slot); - -		const char *name; -		u32 ocr_mask; - -		/* Card detection IRQs */ -		int card_detect_irq; -		int (*card_detect)(struct device *dev, int slot); - -		unsigned int ban_openended:1; - -	} slots[OMAP_MMC_MAX_SLOTS]; -}; - -/* called from board-specific card detection service routine */ -extern void omap_mmc_notify_cover_event(struct device *dev, int slot, -					int is_closed); - -#if	defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ -	defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) -void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, -				int nr_controllers); -void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data, -				int nr_controllers); -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) -{ -} -static inline void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data, -				int nr_controllers) -{ -} -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 -#endif diff --git a/arch/arm/plat-omap/include/plat/multi.h b/arch/arm/plat-omap/include/plat/multi.h deleted file mode 100644 index ffd909fa528..00000000000 --- a/arch/arm/plat-omap/include/plat/multi.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Support for compiling in multiple OMAP processors - * - * Copyright (C) 2010 Nokia Corporation - * - * 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 - * - */ - -#ifndef __PLAT_OMAP_MULTI_H -#define __PLAT_OMAP_MULTI_H - -/* - * Test if multicore OMAP support is needed - */ -#undef MULTI_OMAP1 -#undef MULTI_OMAP2 -#undef OMAP_NAME - -#ifdef CONFIG_ARCH_OMAP730 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP1 -#  define MULTI_OMAP1 -# else -#  define OMAP_NAME omap730 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP850 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP1 -#  define MULTI_OMAP1 -# else -#  define OMAP_NAME omap850 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP15XX -# ifdef OMAP_NAME -#  undef  MULTI_OMAP1 -#  define MULTI_OMAP1 -# else -#  define OMAP_NAME omap1510 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP16XX -# ifdef OMAP_NAME -#  undef  MULTI_OMAP1 -#  define MULTI_OMAP1 -# else -#  define OMAP_NAME omap16xx -# endif -#endif -#ifdef CONFIG_ARCH_OMAP2PLUS -# if (defined(OMAP_NAME) || defined(MULTI_OMAP1)) -#  error "OMAP1 and OMAP2PLUS can't be selected at the same time" -# endif -#endif -#ifdef CONFIG_ARCH_OMAP2420 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP2 -#  define MULTI_OMAP2 -# else -#  define OMAP_NAME omap2420 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP2430 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP2 -#  define MULTI_OMAP2 -# else -#  define OMAP_NAME omap2430 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP3 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP2 -#  define MULTI_OMAP2 -# else -#  define OMAP_NAME omap3 -# endif -#endif -#ifdef CONFIG_ARCH_OMAP4 -# ifdef OMAP_NAME -#  undef  MULTI_OMAP2 -#  define MULTI_OMAP2 -# else -#  define OMAP_NAME omap4 -# endif -#endif - -#endif	/* __PLAT_OMAP_MULTI_H */ diff --git a/arch/arm/plat-omap/include/plat/mux.h b/arch/arm/plat-omap/include/plat/mux.h deleted file mode 100644 index aeba71796ad..00000000000 --- a/arch/arm/plat-omap/include/plat/mux.h +++ /dev/null @@ -1,454 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/mux.h - * - * Table of the Omap register configurations for the FUNC_MUX and - * PULL_DWN combinations. - * - * Copyright (C) 2004 - 2008 Texas Instruments Inc. - * Copyright (C) 2003 - 2008 Nokia Corporation - * - * Written by Tony Lindgren - * - * 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 - * - * NOTE: Please use the following naming style for new pin entries. - *	 For example, W8_1610_MMC2_DAT0, where: - *	 - W8	     = ball - *	 - 1610	     = 1510 or 1610, none if common for both 1510 and 1610 - *	 - MMC2_DAT0 = function - */ - -#ifndef __ASM_ARCH_MUX_H -#define __ASM_ARCH_MUX_H - -#define PU_PD_SEL_NA		0	/* No pu_pd reg available */ -#define PULL_DWN_CTRL_NA	0	/* No pull-down control needed */ - -#ifdef	CONFIG_OMAP_MUX_DEBUG -#define MUX_REG(reg, mode_offset, mode) .mux_reg_name = "FUNC_MUX_CTRL_"#reg, \ -					.mux_reg = FUNC_MUX_CTRL_##reg, \ -					.mask_offset = mode_offset, \ -					.mask = mode, - -#define PULL_REG(reg, bit, status)	.pull_name = "PULL_DWN_CTRL_"#reg, \ -					.pull_reg = PULL_DWN_CTRL_##reg, \ -					.pull_bit = bit, \ -					.pull_val = status, - -#define PU_PD_REG(reg, status)		.pu_pd_name = "PU_PD_SEL_"#reg, \ -					.pu_pd_reg = PU_PD_SEL_##reg, \ -					.pu_pd_val = status, - -#define MUX_REG_7XX(reg, mode_offset, mode) .mux_reg_name = "OMAP7XX_IO_CONF_"#reg, \ -					.mux_reg = OMAP7XX_IO_CONF_##reg, \ -					.mask_offset = mode_offset, \ -					.mask = mode, - -#define PULL_REG_7XX(reg, bit, status)	.pull_name = "OMAP7XX_IO_CONF_"#reg, \ -					.pull_reg = OMAP7XX_IO_CONF_##reg, \ -					.pull_bit = bit, \ -					.pull_val = status, - -#else - -#define MUX_REG(reg, mode_offset, mode) .mux_reg = FUNC_MUX_CTRL_##reg, \ -					.mask_offset = mode_offset, \ -					.mask = mode, - -#define PULL_REG(reg, bit, status)	.pull_reg = PULL_DWN_CTRL_##reg, \ -					.pull_bit = bit, \ -					.pull_val = status, - -#define PU_PD_REG(reg, status)		.pu_pd_reg = PU_PD_SEL_##reg, \ -					.pu_pd_val = status, - -#define MUX_REG_7XX(reg, mode_offset, mode) \ -					.mux_reg = OMAP7XX_IO_CONF_##reg, \ -					.mask_offset = mode_offset, \ -					.mask = mode, - -#define PULL_REG_7XX(reg, bit, status)	.pull_reg = OMAP7XX_IO_CONF_##reg, \ -					.pull_bit = bit, \ -					.pull_val = status, - -#endif /* CONFIG_OMAP_MUX_DEBUG */ - -#define MUX_CFG(desc, mux_reg, mode_offset, mode,	\ -		pull_reg, pull_bit, pull_status,	\ -		pu_pd_reg, pu_pd_status, debug_status)	\ -{							\ -	.name =	 desc,					\ -	.debug = debug_status,				\ -	MUX_REG(mux_reg, mode_offset, mode)		\ -	PULL_REG(pull_reg, pull_bit, pull_status)	\ -	PU_PD_REG(pu_pd_reg, pu_pd_status)		\ -}, - - -/* - * OMAP730/850 has a slightly different config for the pin mux. - * - config regs are the OMAP7XX_IO_CONF_x regs (see omap730.h) regs and - *   not the FUNC_MUX_CTRL_x regs from hardware.h - * - for pull-up/down, only has one enable bit which is is in the same register - *   as mux config - */ -#define MUX_CFG_7XX(desc, mux_reg, mode_offset, mode,	\ -		   pull_bit, pull_status, debug_status)\ -{							\ -	.name =	 desc,					\ -	.debug = debug_status,				\ -	MUX_REG_7XX(mux_reg, mode_offset, mode)		\ -	PULL_REG_7XX(mux_reg, pull_bit, pull_status)	\ -	PU_PD_REG(NA, 0)		\ -}, - -struct pin_config { -	char 			*name; -	const unsigned int 	mux_reg; -	unsigned char		debug; - -	const unsigned char mask_offset; -	const unsigned char mask; - -	const char *pull_name; -	const unsigned int pull_reg; -	const unsigned char pull_val; -	const unsigned char pull_bit; - -	const char *pu_pd_name; -	const unsigned int pu_pd_reg; -	const unsigned char pu_pd_val; - -#if	defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS) -	const char *mux_reg_name; -#endif - -}; - -enum omap7xx_index { -	/* OMAP 730 keyboard */ -	E2_7XX_KBR0, -	J7_7XX_KBR1, -	E1_7XX_KBR2, -	F3_7XX_KBR3, -	D2_7XX_KBR4, -	C2_7XX_KBC0, -	D3_7XX_KBC1, -	E4_7XX_KBC2, -	F4_7XX_KBC3, -	E3_7XX_KBC4, - -	/* USB */ -	AA17_7XX_USB_DM, -	W16_7XX_USB_PU_EN, -	W17_7XX_USB_VBUSI, -	W18_7XX_USB_DMCK_OUT, -	W19_7XX_USB_DCRST, - -	/* MMC */ -	MMC_7XX_CMD, -	MMC_7XX_CLK, -	MMC_7XX_DAT0, - -	/* I2C */ -	I2C_7XX_SCL, -	I2C_7XX_SDA, - -	/* SPI */ -	SPI_7XX_1, -	SPI_7XX_2, -	SPI_7XX_3, -	SPI_7XX_4, -	SPI_7XX_5, -	SPI_7XX_6, - -	/* UART */ -	UART_7XX_1, -	UART_7XX_2, -}; - -enum omap1xxx_index { -	/* UART1 (BT_UART_GATING)*/ -	UART1_TX = 0, -	UART1_RTS, - -	/* UART2 (COM_UART_GATING)*/ -	UART2_TX, -	UART2_RX, -	UART2_CTS, -	UART2_RTS, - -	/* UART3 (GIGA_UART_GATING) */ -	UART3_TX, -	UART3_RX, -	UART3_CTS, -	UART3_RTS, -	UART3_CLKREQ, -	UART3_BCLK,	/* 12MHz clock out */ -	Y15_1610_UART3_RTS, - -	/* PWT & PWL */ -	PWT, -	PWL, - -	/* USB master generic */ -	R18_USB_VBUS, -	R18_1510_USB_GPIO0, -	W4_USB_PUEN, -	W4_USB_CLKO, -	W4_USB_HIGHZ, -	W4_GPIO58, - -	/* USB1 master */ -	USB1_SUSP, -	USB1_SEO, -	W13_1610_USB1_SE0, -	USB1_TXEN, -	USB1_TXD, -	USB1_VP, -	USB1_VM, -	USB1_RCV, -	USB1_SPEED, -	R13_1610_USB1_SPEED, -	R13_1710_USB1_SE0, - -	/* USB2 master */ -	USB2_SUSP, -	USB2_VP, -	USB2_TXEN, -	USB2_VM, -	USB2_RCV, -	USB2_SEO, -	USB2_TXD, - -	/* OMAP-1510 GPIO */ -	R18_1510_GPIO0, -	R19_1510_GPIO1, -	M14_1510_GPIO2, - -	/* OMAP1610 GPIO */ -	P18_1610_GPIO3, -	Y15_1610_GPIO17, - -	/* OMAP-1710 GPIO */ -	R18_1710_GPIO0, -	V2_1710_GPIO10, -	N21_1710_GPIO14, -	W15_1710_GPIO40, - -	/* MPUIO */ -	MPUIO2, -	N15_1610_MPUIO2, -	MPUIO4, -	MPUIO5, -	T20_1610_MPUIO5, -	W11_1610_MPUIO6, -	V10_1610_MPUIO7, -	W11_1610_MPUIO9, -	V10_1610_MPUIO10, -	W10_1610_MPUIO11, -	E20_1610_MPUIO13, -	U20_1610_MPUIO14, -	E19_1610_MPUIO15, - -	/* MCBSP2 */ -	MCBSP2_CLKR, -	MCBSP2_CLKX, -	MCBSP2_DR, -	MCBSP2_DX, -	MCBSP2_FSR, -	MCBSP2_FSX, - -	/* MCBSP3 */ -	MCBSP3_CLKX, - -	/* Misc ballouts */ -	BALLOUT_V8_ARMIO3, -	N20_HDQ, - -	/* OMAP-1610 MMC2 */ -	W8_1610_MMC2_DAT0, -	V8_1610_MMC2_DAT1, -	W15_1610_MMC2_DAT2, -	R10_1610_MMC2_DAT3, -	Y10_1610_MMC2_CLK, -	Y8_1610_MMC2_CMD, -	V9_1610_MMC2_CMDDIR, -	V5_1610_MMC2_DATDIR0, -	W19_1610_MMC2_DATDIR1, -	R18_1610_MMC2_CLKIN, - -	/* OMAP-1610 External Trace Interface */ -	M19_1610_ETM_PSTAT0, -	L15_1610_ETM_PSTAT1, -	L18_1610_ETM_PSTAT2, -	L19_1610_ETM_D0, -	J19_1610_ETM_D6, -	J18_1610_ETM_D7, - -	/* OMAP16XX GPIO */ -	P20_1610_GPIO4, -	V9_1610_GPIO7, -	W8_1610_GPIO9, -	N20_1610_GPIO11, -	N19_1610_GPIO13, -	P10_1610_GPIO22, -	V5_1610_GPIO24, -	AA20_1610_GPIO_41, -	W19_1610_GPIO48, -	M7_1610_GPIO62, -	V14_16XX_GPIO37, -	R9_16XX_GPIO18, -	L14_16XX_GPIO49, - -	/* OMAP-1610 uWire */ -	V19_1610_UWIRE_SCLK, -	U18_1610_UWIRE_SDI, -	W21_1610_UWIRE_SDO, -	N14_1610_UWIRE_CS0, -	P15_1610_UWIRE_CS3, -	N15_1610_UWIRE_CS1, - -	/* OMAP-1610 SPI */ -	U19_1610_SPIF_SCK, -	U18_1610_SPIF_DIN, -	P20_1610_SPIF_DIN, -	W21_1610_SPIF_DOUT, -	R18_1610_SPIF_DOUT, -	N14_1610_SPIF_CS0, -	N15_1610_SPIF_CS1, -	T19_1610_SPIF_CS2, -	P15_1610_SPIF_CS3, - -	/* OMAP-1610 Flash */ -	L3_1610_FLASH_CS2B_OE, -	M8_1610_FLASH_CS2B_WE, - -	/* First MMC */ -	MMC_CMD, -	MMC_DAT1, -	MMC_DAT2, -	MMC_DAT0, -	MMC_CLK, -	MMC_DAT3, - -	/* OMAP-1710 MMC CMDDIR and DATDIR0 */ -	M15_1710_MMC_CLKI, -	P19_1710_MMC_CMDDIR, -	P20_1710_MMC_DATDIR0, - -	/* OMAP-1610 USB0 alternate pin configuration */ -	W9_USB0_TXEN, -	AA9_USB0_VP, -	Y5_USB0_RCV, -	R9_USB0_VM, -	V6_USB0_TXD, -	W5_USB0_SE0, -	V9_USB0_SPEED, -	V9_USB0_SUSP, - -	/* USB2 */ -	W9_USB2_TXEN, -	AA9_USB2_VP, -	Y5_USB2_RCV, -	R9_USB2_VM, -	V6_USB2_TXD, -	W5_USB2_SE0, - -	/* 16XX UART */ -	R13_1610_UART1_TX, -	V14_16XX_UART1_RX, -	R14_1610_UART1_CTS, -	AA15_1610_UART1_RTS, -	R9_16XX_UART2_RX, -	L14_16XX_UART3_RX, - -	/* I2C OMAP-1610 */ -	I2C_SCL, -	I2C_SDA, - -	/* Keypad */ -	F18_1610_KBC0, -	D20_1610_KBC1, -	D19_1610_KBC2, -	E18_1610_KBC3, -	C21_1610_KBC4, -	G18_1610_KBR0, -	F19_1610_KBR1, -	H14_1610_KBR2, -	E20_1610_KBR3, -	E19_1610_KBR4, -	N19_1610_KBR5, - -	/* Power management */ -	T20_1610_LOW_PWR, - -	/* MCLK Settings */ -	V5_1710_MCLK_ON, -	V5_1710_MCLK_OFF, -	R10_1610_MCLK_ON, -	R10_1610_MCLK_OFF, - -	/* CompactFlash controller */ -	P11_1610_CF_CD2, -	R11_1610_CF_IOIS16, -	V10_1610_CF_IREQ, -	W10_1610_CF_RESET, -	W11_1610_CF_CD1, - -	/* parallel camera */ -	J15_1610_CAM_LCLK, -	J18_1610_CAM_D7, -	J19_1610_CAM_D6, -	J14_1610_CAM_D5, -	K18_1610_CAM_D4, -	K19_1610_CAM_D3, -	K15_1610_CAM_D2, -	K14_1610_CAM_D1, -	L19_1610_CAM_D0, -	L18_1610_CAM_VS, -	L15_1610_CAM_HS, -	M19_1610_CAM_RSTZ, -	Y15_1610_CAM_OUTCLK, - -	/* serial camera */ -	H19_1610_CAM_EXCLK, -	Y12_1610_CCP_CLKP, -	W13_1610_CCP_CLKM, -	W14_1610_CCP_DATAP, -	Y14_1610_CCP_DATAM, - -}; - -struct omap_mux_cfg { -	struct pin_config	*pins; -	unsigned long		size; -	int			(*cfg_reg)(const struct pin_config *cfg); -}; - -#ifdef	CONFIG_OMAP_MUX -/* setup pin muxing in Linux */ -extern int omap1_mux_init(void); -extern int omap_mux_register(struct omap_mux_cfg *); -extern int omap_cfg_reg(unsigned long reg_cfg); -#else -/* boot loader does it all (no warnings from CONFIG_OMAP_MUX_WARNINGS) */ -static inline int omap1_mux_init(void) { return 0; } -static inline int omap_cfg_reg(unsigned long reg_cfg) { return 0; } -#endif - -extern int omap2_mux_init(void); - -#endif diff --git a/arch/arm/plat-omap/include/plat/nand.h b/arch/arm/plat-omap/include/plat/nand.h deleted file mode 100644 index 6562cd082bb..00000000000 --- a/arch/arm/plat-omap/include/plat/nand.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/nand.h - * - * Copyright (C) 2006 Micron Technology Inc. - * - * 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/mtd/partitions.h> - -struct omap_nand_platform_data { -	unsigned int		options; -	int			cs; -	int			gpio_irq; -	struct mtd_partition	*parts; -	struct gpmc_timings	*gpmc_t; -	int			nr_parts; -	int			(*nand_setup)(void); -	int			(*dev_ready)(struct omap_nand_platform_data *); -	int			dma_channel; -	unsigned long		phys_base; -	int			devsize; -}; - -/* minimum size for IO mapping */ -#define	NAND_IO_SIZE	4 - -#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE) -extern int gpmc_nand_init(struct omap_nand_platform_data *d); -#else -static inline int gpmc_nand_init(struct omap_nand_platform_data *d) -{ -	return 0; -} -#endif diff --git a/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h b/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h deleted file mode 100644 index 01ab6572ccb..00000000000 --- a/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H -#define __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H - -#include "display.h" - -/** - * struct nokia_dsi_panel_data - Nokia DSI panel driver configuration - * @name: panel name - * @use_ext_te: use external TE - * @ext_te_gpio: external TE GPIO - * @use_esd_check: perform ESD checks - * @max_backlight_level: maximum backlight level - * @set_backlight: pointer to backlight set function - * @get_backlight: pointer to backlight get function - */ -struct nokia_dsi_panel_data { -	const char *name; - -	int reset_gpio; - -	bool use_ext_te; -	int ext_te_gpio; - -	bool use_esd_check; - -	int max_backlight_level; -	int (*set_backlight)(struct omap_dss_device *dssdev, int level); -	int (*get_backlight)(struct omap_dss_device *dssdev); -}; - -#endif /* __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H */ diff --git a/arch/arm/plat-omap/include/plat/omap-alsa.h b/arch/arm/plat-omap/include/plat/omap-alsa.h deleted file mode 100644 index b53055b390d..00000000000 --- a/arch/arm/plat-omap/include/plat/omap-alsa.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/omap-alsa.h - * - * Alsa Driver for AIC23 and TSC2101 codecs on OMAP platform boards. - * - * Copyright (C) 2006 Mika Laitio <lamikr@cc.jyu.fi> - * - * Copyright (C) 2005 Instituto Nokia de Tecnologia - INdT - Manaus Brazil - * Written by Daniel Petrini, David Cohen, Anderson Briglia - *            {daniel.petrini, david.cohen, anderson.briglia}@indt.org.br - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - *  History - *  ------- - * - *  2005/07/25 INdT-10LE Kernel Team - 	Alsa driver for omap osk, - *  					original version based in sa1100 driver - *  					and omap oss driver. - */ - -#ifndef __OMAP_ALSA_H -#define __OMAP_ALSA_H - -#include <plat/dma.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <plat/mcbsp.h> -#include <linux/platform_device.h> - -#define DMA_BUF_SIZE	(1024 * 8) - -/* - * Buffer management for alsa and dma - */ -struct audio_stream { -	char *id;		/* identification string */ -	int stream_id;		/* numeric identification */ -	int dma_dev;		/* dma number of that device */ -	int *lch;		/* Chain of channels this stream is linked to */ -	char started;		/* to store if the chain was started or not */ -	int dma_q_head;		/* DMA Channel Q Head */ -	int dma_q_tail;		/* DMA Channel Q Tail */ -	char dma_q_count;	/* DMA Channel Q Count */ -	int active:1;		/* we are using this stream for transfer now */ -	int period;		/* current transfer period */ -	int periods;		/* current count of periods registerd in the DMA engine */ -	spinlock_t dma_lock;	/* for locking in DMA operations */ -	struct snd_pcm_substream *stream;	/* the pcm stream */ -	unsigned linked:1;	/* dma channels linked */ -	int offset;		/* store start position of the last period in the alsa buffer */ -	int (*hw_start)(void);  /* interface to start HW interface, e.g. McBSP */ -	int (*hw_stop)(void);   /* interface to stop HW interface, e.g. McBSP */ -}; - -/* - * Alsa card structure for aic23 - */ -struct snd_card_omap_codec { -	struct snd_card *card; -	struct snd_pcm *pcm; -	long samplerate; -	struct audio_stream s[2];	/* playback & capture */ -}; - -/* Codec specific information and function pointers. - * Codec (omap-alsa-aic23.c and omap-alsa-tsc2101.c) - * are responsible for defining the function pointers. - */ -struct omap_alsa_codec_config { -	char 	*name; -	struct	omap_mcbsp_reg_cfg *mcbsp_regs_alsa; -	struct	snd_pcm_hw_constraint_list *hw_constraints_rates; -	struct	snd_pcm_hardware *snd_omap_alsa_playback; -	struct	snd_pcm_hardware *snd_omap_alsa_capture; -	void	(*codec_configure_dev)(void); -	void	(*codec_set_samplerate)(long); -	void	(*codec_clock_setup)(void); -	int	(*codec_clock_on)(void); -	int 	(*codec_clock_off)(void); -	int	(*get_default_samplerate)(void); -}; - -/*********** Mixer function prototypes *************************/ -int snd_omap_mixer(struct snd_card_omap_codec *); -void snd_omap_init_mixer(void); - -#ifdef CONFIG_PM -void snd_omap_suspend_mixer(void); -void snd_omap_resume_mixer(void); -#endif - -int snd_omap_alsa_post_probe(struct platform_device *pdev, struct omap_alsa_codec_config *config); -int snd_omap_alsa_remove(struct platform_device *pdev); -#ifdef CONFIG_PM -int snd_omap_alsa_suspend(struct platform_device *pdev, pm_message_t state); -int snd_omap_alsa_resume(struct platform_device *pdev); -#else -#define snd_omap_alsa_suspend	NULL -#define snd_omap_alsa_resume	NULL -#endif - -void callback_omap_alsa_sound_dma(void *); - -#endif diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h b/arch/arm/plat-omap/include/plat/omap-pm.h deleted file mode 100644 index 728fbb9dd54..00000000000 --- a/arch/arm/plat-omap/include/plat/omap-pm.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * omap-pm.h - OMAP power management interface - * - * Copyright (C) 2008-2010 Texas Instruments, Inc. - * Copyright (C) 2008-2010 Nokia Corporation - * Paul Walmsley - * - * Interface developed by (in alphabetical order): Karthik Dasu, Jouni - * Högander, Tony Lindgren, Rajendra Nayak, Sakari Poussa, - * Veeramanikandan Raju, Anand Sawant, Igor Stoppa, Paul Walmsley, - * Richard Woodruff - */ - -#ifndef ASM_ARM_ARCH_OMAP_OMAP_PM_H -#define ASM_ARM_ARCH_OMAP_OMAP_PM_H - -#include <linux/device.h> -#include <linux/cpufreq.h> -#include <linux/clk.h> - -#include "powerdomain.h" - -/** - * struct omap_opp - clock frequency-to-OPP ID table for DSP, MPU - * @rate: target clock rate - * @opp_id: OPP ID - * @min_vdd: minimum VDD1 voltage (in millivolts) for this OPP - * - * Operating performance point data.  Can vary by OMAP chip and board. - */ -struct omap_opp { -	unsigned long rate; -	u8 opp_id; -	u16 min_vdd; -}; - -extern struct omap_opp *mpu_opps; -extern struct omap_opp *dsp_opps; -extern struct omap_opp *l3_opps; - -/* - * agent_id values for use with omap_pm_set_min_bus_tput(): - * - * OCP_INITIATOR_AGENT is only valid for devices that can act as - * initiators -- it represents the device's L3 interconnect - * connection.  OCP_TARGET_AGENT represents the device's L4 - * interconnect connection. - */ -#define OCP_TARGET_AGENT		1 -#define OCP_INITIATOR_AGENT		2 - -/** - * omap_pm_if_early_init - OMAP PM init code called before clock fw init - * @mpu_opp_table: array ptr to struct omap_opp for MPU - * @dsp_opp_table: array ptr to struct omap_opp for DSP - * @l3_opp_table : array ptr to struct omap_opp for CORE - * - * Initialize anything that must be configured before the clock - * framework starts.  The "_if_" is to avoid name collisions with the - * PM idle-loop code. - */ -int __init omap_pm_if_early_init(struct omap_opp *mpu_opp_table, -				 struct omap_opp *dsp_opp_table, -				 struct omap_opp *l3_opp_table); - -/** - * omap_pm_if_init - OMAP PM init code called after clock fw init - * - * The main initialization code.  OPP tables are passed in here.  The - * "_if_" is to avoid name collisions with the PM idle-loop code. - */ -int __init omap_pm_if_init(void); - -/** - * omap_pm_if_exit - OMAP PM exit code - * - * Exit code; currently unused.  The "_if_" is to avoid name - * collisions with the PM idle-loop code. - */ -void omap_pm_if_exit(void); - -/* - * Device-driver-originated constraints (via board-*.c files, platform_data) - */ - - -/** - * omap_pm_set_max_mpu_wakeup_lat - set the maximum MPU wakeup latency - * @dev: struct device * requesting the constraint - * @t: maximum MPU wakeup latency in microseconds - * - * Request that the maximum interrupt latency for the MPU to be no - * greater than @t microseconds. "Interrupt latency" in this case is - * defined as the elapsed time from the occurrence of a hardware or - * timer interrupt to the time when the device driver's interrupt - * service routine has been entered by the MPU. - * - * It is intended that underlying PM code will use this information to - * determine what power state to put the MPU powerdomain into, and - * possibly the CORE powerdomain as well, since interrupt handling - * code currently runs from SDRAM.  Advanced PM or board*.c code may - * also configure interrupt controller priorities, OCP bus priorities, - * CPU speed(s), etc. - * - * This function will not affect device wakeup latency, e.g., time - * elapsed from when a device driver enables a hardware device with - * clk_enable(), to when the device is ready for register access or - * other use.  To control this device wakeup latency, use - * omap_pm_set_max_dev_wakeup_lat() - * - * Multiple calls to omap_pm_set_max_mpu_wakeup_lat() will replace the - * previous t value.  To remove the latency target for the MPU, call - * with t = -1. - * - * XXX This constraint will be deprecated soon in favor of the more - * general omap_pm_set_max_dev_wakeup_lat() - * - * Returns -EINVAL for an invalid argument, -ERANGE if the constraint - * is not satisfiable, or 0 upon success. - */ -int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t); - - -/** - * omap_pm_set_min_bus_tput - set minimum bus throughput needed by device - * @dev: struct device * requesting the constraint - * @tbus_id: interconnect to operate on (OCP_{INITIATOR,TARGET}_AGENT) - * @r: minimum throughput (in KiB/s) - * - * Request that the minimum data throughput on the OCP interconnect - * attached to device @dev interconnect agent @tbus_id be no less - * than @r KiB/s. - * - * It is expected that the OMAP PM or bus code will use this - * information to set the interconnect clock to run at the lowest - * possible speed that satisfies all current system users.  The PM or - * bus code will adjust the estimate based on its model of the bus, so - * device driver authors should attempt to specify an accurate - * quantity for their device use case, and let the PM or bus code - * overestimate the numbers as necessary to handle request/response - * latency, other competing users on the system, etc.  On OMAP2/3, if - * a driver requests a minimum L4 interconnect speed constraint, the - * code will also need to add an minimum L3 interconnect speed - * constraint, - * - * Multiple calls to omap_pm_set_min_bus_tput() will replace the - * previous rate value for this device.  To remove the interconnect - * throughput restriction for this device, call with r = 0. - * - * Returns -EINVAL for an invalid argument, -ERANGE if the constraint - * is not satisfiable, or 0 upon success. - */ -int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r); - - -/** - * omap_pm_set_max_dev_wakeup_lat - set the maximum device enable latency - * @req_dev: struct device * requesting the constraint, or NULL if none - * @dev: struct device * to set the constraint one - * @t: maximum device wakeup latency in microseconds - * - * Request that the maximum amount of time necessary for a device @dev - * to become accessible after its clocks are enabled should be no - * greater than @t microseconds.  Specifically, this represents the - * time from when a device driver enables device clocks with - * clk_enable(), to when the register reads and writes on the device - * will succeed.  This function should be called before clk_disable() - * is called, since the power state transition decision may be made - * during clk_disable(). - * - * It is intended that underlying PM code will use this information to - * determine what power state to put the powerdomain enclosing this - * device into. - * - * Multiple calls to omap_pm_set_max_dev_wakeup_lat() will replace the - * previous wakeup latency values for this device.  To remove the - * wakeup latency restriction for this device, call with t = -1. - * - * Returns -EINVAL for an invalid argument, -ERANGE if the constraint - * is not satisfiable, or 0 upon success. - */ -int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, -				   long t); - - -/** - * omap_pm_set_max_sdma_lat - set the maximum system DMA transfer start latency - * @dev: struct device * - * @t: maximum DMA transfer start latency in microseconds - * - * Request that the maximum system DMA transfer start latency for this - * device 'dev' should be no greater than 't' microseconds.  "DMA - * transfer start latency" here is defined as the elapsed time from - * when a device (e.g., McBSP) requests that a system DMA transfer - * start or continue, to the time at which data starts to flow into - * that device from the system DMA controller. - * - * It is intended that underlying PM code will use this information to - * determine what power state to put the CORE powerdomain into. - * - * Since system DMA transfers may not involve the MPU, this function - * will not affect MPU wakeup latency.  Use set_max_cpu_lat() to do - * so.  Similarly, this function will not affect device wakeup latency - * -- use set_max_dev_wakeup_lat() to affect that. - * - * Multiple calls to set_max_sdma_lat() will replace the previous t - * value for this device.  To remove the maximum DMA latency for this - * device, call with t = -1. - * - * Returns -EINVAL for an invalid argument, -ERANGE if the constraint - * is not satisfiable, or 0 upon success. - */ -int omap_pm_set_max_sdma_lat(struct device *dev, long t); - - -/** - * omap_pm_set_min_clk_rate - set minimum clock rate requested by @dev - * @dev: struct device * requesting the constraint - * @clk: struct clk * to set the minimum rate constraint on - * @r: minimum rate in Hz - * - * Request that the minimum clock rate on the device @dev's clk @clk - * be no less than @r Hz. - * - * It is expected that the OMAP PM code will use this information to - * find an OPP or clock setting that will satisfy this clock rate - * constraint, along with any other applicable system constraints on - * the clock rate or corresponding voltage, etc. - * - * omap_pm_set_min_clk_rate() differs from the clock code's - * clk_set_rate() in that it considers other constraints before taking - * any hardware action, and may change a system OPP rather than just a - * clock rate.  clk_set_rate() is intended to be a low-level - * interface. - * - * omap_pm_set_min_clk_rate() is easily open to abuse.  A better API - * would be something like "omap_pm_set_min_dev_performance()"; - * however, there is no easily-generalizable concept of performance - * that applies to all devices.  Only a device (and possibly the - * device subsystem) has both the subsystem-specific knowledge, and - * the hardware IP block-specific knowledge, to translate a constraint - * on "touchscreen sampling accuracy" or "number of pixels or polygons - * rendered per second" to a clock rate.  This translation can be - * dependent on the hardware IP block's revision, or firmware version, - * and the driver is the only code on the system that has this - * information and can know how to translate that into a clock rate. - * - * The intended use-case for this function is for userspace or other - * kernel code to communicate a particular performance requirement to - * a subsystem; then for the subsystem to communicate that requirement - * to something that is meaningful to the device driver; then for the - * device driver to convert that requirement to a clock rate, and to - * then call omap_pm_set_min_clk_rate(). - * - * Users of this function (such as device drivers) should not simply - * call this function with some high clock rate to ensure "high - * performance."  Rather, the device driver should take a performance - * constraint from its subsystem, such as "render at least X polygons - * per second," and use some formula or table to convert that into a - * clock rate constraint given the hardware type and hardware - * revision.  Device drivers or subsystems should not assume that they - * know how to make a power/performance tradeoff - some device use - * cases may tolerate a lower-fidelity device function for lower power - * consumption; others may demand a higher-fidelity device function, - * no matter what the power consumption. - * - * Multiple calls to omap_pm_set_min_clk_rate() will replace the - * previous rate value for the device @dev.  To remove the minimum clock - * rate constraint for the device, call with r = 0. - * - * Returns -EINVAL for an invalid argument, -ERANGE if the constraint - * is not satisfiable, or 0 upon success. - */ -int omap_pm_set_min_clk_rate(struct device *dev, struct clk *c, long r); - -/* - * DSP Bridge-specific constraints - */ - -/** - * omap_pm_dsp_get_opp_table - get OPP->DSP clock frequency table - * - * Intended for use by DSPBridge.  Returns an array of OPP->DSP clock - * frequency entries.  The final item in the array should have .rate = - * .opp_id = 0. - */ -const struct omap_opp *omap_pm_dsp_get_opp_table(void); - -/** - * omap_pm_dsp_set_min_opp - receive desired OPP target ID from DSP Bridge - * @opp_id: target DSP OPP ID - * - * Set a minimum OPP ID for the DSP.  This is intended to be called - * only from the DSP Bridge MPU-side driver.  Unfortunately, the only - * information that code receives from the DSP/BIOS load estimator is the - * target OPP ID; hence, this interface.  No return value. - */ -void omap_pm_dsp_set_min_opp(u8 opp_id); - -/** - * omap_pm_dsp_get_opp - report the current DSP OPP ID - * - * Report the current OPP for the DSP.  Since on OMAP3, the DSP and - * MPU share a single voltage domain, the OPP ID returned back may - * represent a higher DSP speed than the OPP requested via - * omap_pm_dsp_set_min_opp(). - * - * Returns the current VDD1 OPP ID, or 0 upon error. - */ -u8 omap_pm_dsp_get_opp(void); - - -/* - * CPUFreq-originated constraint - * - * In the future, this should be handled by custom OPP clocktype - * functions. - */ - -/** - * omap_pm_cpu_get_freq_table - return a cpufreq_frequency_table array ptr - * - * Provide a frequency table usable by CPUFreq for the current chip/board. - * Returns a pointer to a struct cpufreq_frequency_table array or NULL - * upon error. - */ -struct cpufreq_frequency_table **omap_pm_cpu_get_freq_table(void); - -/** - * omap_pm_cpu_set_freq - set the current minimum MPU frequency - * @f: MPU frequency in Hz - * - * Set the current minimum CPU frequency.  The actual CPU frequency - * used could end up higher if the DSP requested a higher OPP. - * Intended to be called by plat-omap/cpu_omap.c:omap_target().  No - * return value. - */ -void omap_pm_cpu_set_freq(unsigned long f); - -/** - * omap_pm_cpu_get_freq - report the current CPU frequency - * - * Returns the current MPU frequency, or 0 upon error. - */ -unsigned long omap_pm_cpu_get_freq(void); - - -/* - * Device context loss tracking - */ - -/** - * omap_pm_get_dev_context_loss_count - return count of times dev has lost ctx - * @dev: struct device * - * - * This function returns the number of times that the device @dev has - * lost its internal context.  This generally occurs on a powerdomain - * transition to OFF.  Drivers use this as an optimization to avoid restoring - * context if the device hasn't lost it.  To use, drivers should initially - * call this in their context save functions and store the result.  Early in - * the driver's context restore function, the driver should call this function - * again, and compare the result to the stored counter.  If they differ, the - * driver must restore device context.   If the number of context losses - * exceeds the maximum positive integer, the function will wrap to 0 and - * continue counting.  Returns the number of context losses for this device, - * or -EINVAL upon error. - */ -int omap_pm_get_dev_context_loss_count(struct device *dev); - - -#endif diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h b/arch/arm/plat-omap/include/plat/omap-serial.h deleted file mode 100644 index c8dae02f070..00000000000 --- a/arch/arm/plat-omap/include/plat/omap-serial.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Driver for OMAP-UART controller. - * Based on drivers/serial/8250.c - * - * Copyright (C) 2010 Texas Instruments. - * - * Authors: - *	Govindraj R	<govindraj.raja@ti.com> - *	Thara Gopinath	<thara@ti.com> - * - * 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 __OMAP_SERIAL_H__ -#define __OMAP_SERIAL_H__ - -#include <linux/serial_core.h> -#include <linux/platform_device.h> - -#include <plat/mux.h> - -#define DRIVER_NAME	"omap-hsuart" - -/* - * Use tty device name as ttyO, [O -> OMAP] - * in bootargs we specify as console=ttyO0 if uart1 - * is used as console uart. - */ -#define OMAP_SERIAL_NAME	"ttyO" - -#define OMAP_MDR1_DISABLE	0x07 -#define OMAP_MDR1_MODE13X	0x03 -#define OMAP_MDR1_MODE16X	0x00 -#define OMAP_MODE13X_SPEED	230400 - -/* - * LCR = 0XBF: Switch to Configuration Mode B. - * In configuration mode b allow access - * to EFR,DLL,DLH. - * Reference OMAP TRM Chapter 17 - * Section: 1.4.3 Mode Selection - */ -#define OMAP_UART_LCR_CONF_MDB	0XBF - -/* WER = 0x7F - * Enable module level wakeup in WER reg - */ -#define OMAP_UART_WER_MOD_WKUP	0X7F - -/* Enable XON/XOFF flow control on output */ -#define OMAP_UART_SW_TX		0x04 - -/* Enable XON/XOFF flow control on input */ -#define OMAP_UART_SW_RX		0x04 - -#define OMAP_UART_SYSC_RESET	0X07 -#define OMAP_UART_TCR_TRIG	0X0F -#define OMAP_UART_SW_CLR	0XF0 -#define OMAP_UART_FIFO_CLR	0X06 - -#define OMAP_UART_DMA_CH_FREE	-1 - -#define RX_TIMEOUT		(3 * HZ) -#define OMAP_MAX_HSUART_PORTS	4 - -#define MSR_SAVE_FLAGS		UART_MSR_ANY_DELTA - -struct omap_uart_port_info { -	bool			dma_enabled;	/* To specify DMA Mode */ -	unsigned int		uartclk;	/* UART clock rate */ -	void __iomem		*membase;	/* ioremap cookie or NULL */ -	resource_size_t		mapbase;	/* resource base */ -	unsigned long		irqflags;	/* request_irq flags */ -	upf_t			flags;		/* UPF_* flags */ -}; - -struct uart_omap_dma { -	u8			uart_dma_tx; -	u8			uart_dma_rx; -	int			rx_dma_channel; -	int			tx_dma_channel; -	dma_addr_t		rx_buf_dma_phys; -	dma_addr_t		tx_buf_dma_phys; -	unsigned int		uart_base; -	/* -	 * Buffer for rx dma.It is not required for tx because the buffer -	 * comes from port structure. -	 */ -	unsigned char		*rx_buf; -	unsigned int		prev_rx_dma_pos; -	int			tx_buf_size; -	int			tx_dma_used; -	int			rx_dma_used; -	spinlock_t		tx_lock; -	spinlock_t		rx_lock; -	/* timer to poll activity on rx dma */ -	struct timer_list	rx_timer; -	int			rx_buf_size; -	int			rx_timeout; -}; - -struct uart_omap_port { -	struct uart_port	port; -	struct uart_omap_dma	uart_dma; -	struct platform_device	*pdev; - -	unsigned char		ier; -	unsigned char		lcr; -	unsigned char		mcr; -	unsigned char		fcr; -	unsigned char		efr; - -	int			use_dma; -	/* -	 * Some bits in registers are cleared on a read, so they must -	 * be saved whenever the register is read but the bits will not -	 * be immediately processed. -	 */ -	unsigned int		lsr_break_flag; -	unsigned char		msr_saved_flags; -	char			name[20]; -	unsigned long		port_activity; -}; - -#endif /* __OMAP_SERIAL_H__ */ diff --git a/arch/arm/plat-omap/include/plat/omap1510.h b/arch/arm/plat-omap/include/plat/omap1510.h deleted file mode 100644 index d2400466813..00000000000 --- a/arch/arm/plat-omap/include/plat/omap1510.h +++ /dev/null @@ -1,50 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap1510.h - * - * Hardware definitions for TI OMAP1510 processor. - * - * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP15XX_H -#define __ASM_ARCH_OMAP15XX_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP1510_DSP_BASE	0xE0000000 -#define OMAP1510_DSP_SIZE	0x28000 -#define OMAP1510_DSP_START	0xE0000000 - -#define OMAP1510_DSPREG_BASE	0xE1000000 -#define OMAP1510_DSPREG_SIZE	SZ_128K -#define OMAP1510_DSPREG_START	0xE1000000 - -#define OMAP1510_DSP_MMU_BASE	(0xfffed200) - -#endif /*  __ASM_ARCH_OMAP15XX_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap16xx.h b/arch/arm/plat-omap/include/plat/omap16xx.h deleted file mode 100644 index e69e1d857b4..00000000000 --- a/arch/arm/plat-omap/include/plat/omap16xx.h +++ /dev/null @@ -1,202 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap16xx.h - * - * Hardware definitions for TI OMAP1610/5912/1710 processors. - * - * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP16XX_H -#define __ASM_ARCH_OMAP16XX_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP16XX_DSP_BASE	0xE0000000 -#define OMAP16XX_DSP_SIZE	0x28000 -#define OMAP16XX_DSP_START	0xE0000000 - -#define OMAP16XX_DSPREG_BASE	0xE1000000 -#define OMAP16XX_DSPREG_SIZE	SZ_128K -#define OMAP16XX_DSPREG_START	0xE1000000 - -#define OMAP16XX_SEC_BASE	0xFFFE4000 -#define OMAP16XX_SEC_DES	(OMAP16XX_SEC_BASE + 0x0000) -#define OMAP16XX_SEC_SHA1MD5	(OMAP16XX_SEC_BASE + 0x0800) -#define OMAP16XX_SEC_RNG	(OMAP16XX_SEC_BASE + 0x1000) - -/* - * --------------------------------------------------------------------------- - * Interrupts - * --------------------------------------------------------------------------- - */ -#define OMAP_IH2_0_BASE		(0xfffe0000) -#define OMAP_IH2_1_BASE		(0xfffe0100) -#define OMAP_IH2_2_BASE		(0xfffe0200) -#define OMAP_IH2_3_BASE		(0xfffe0300) - -#define OMAP_IH2_0_ITR		(OMAP_IH2_0_BASE + 0x00) -#define OMAP_IH2_0_MIR		(OMAP_IH2_0_BASE + 0x04) -#define OMAP_IH2_0_SIR_IRQ	(OMAP_IH2_0_BASE + 0x10) -#define OMAP_IH2_0_SIR_FIQ	(OMAP_IH2_0_BASE + 0x14) -#define OMAP_IH2_0_CONTROL	(OMAP_IH2_0_BASE + 0x18) -#define OMAP_IH2_0_ILR0		(OMAP_IH2_0_BASE + 0x1c) -#define OMAP_IH2_0_ISR		(OMAP_IH2_0_BASE + 0x9c) - -#define OMAP_IH2_1_ITR		(OMAP_IH2_1_BASE + 0x00) -#define OMAP_IH2_1_MIR		(OMAP_IH2_1_BASE + 0x04) -#define OMAP_IH2_1_SIR_IRQ	(OMAP_IH2_1_BASE + 0x10) -#define OMAP_IH2_1_SIR_FIQ	(OMAP_IH2_1_BASE + 0x14) -#define OMAP_IH2_1_CONTROL	(OMAP_IH2_1_BASE + 0x18) -#define OMAP_IH2_1_ILR1		(OMAP_IH2_1_BASE + 0x1c) -#define OMAP_IH2_1_ISR		(OMAP_IH2_1_BASE + 0x9c) - -#define OMAP_IH2_2_ITR		(OMAP_IH2_2_BASE + 0x00) -#define OMAP_IH2_2_MIR		(OMAP_IH2_2_BASE + 0x04) -#define OMAP_IH2_2_SIR_IRQ	(OMAP_IH2_2_BASE + 0x10) -#define OMAP_IH2_2_SIR_FIQ	(OMAP_IH2_2_BASE + 0x14) -#define OMAP_IH2_2_CONTROL	(OMAP_IH2_2_BASE + 0x18) -#define OMAP_IH2_2_ILR2		(OMAP_IH2_2_BASE + 0x1c) -#define OMAP_IH2_2_ISR		(OMAP_IH2_2_BASE + 0x9c) - -#define OMAP_IH2_3_ITR		(OMAP_IH2_3_BASE + 0x00) -#define OMAP_IH2_3_MIR		(OMAP_IH2_3_BASE + 0x04) -#define OMAP_IH2_3_SIR_IRQ	(OMAP_IH2_3_BASE + 0x10) -#define OMAP_IH2_3_SIR_FIQ	(OMAP_IH2_3_BASE + 0x14) -#define OMAP_IH2_3_CONTROL	(OMAP_IH2_3_BASE + 0x18) -#define OMAP_IH2_3_ILR3		(OMAP_IH2_3_BASE + 0x1c) -#define OMAP_IH2_3_ISR		(OMAP_IH2_3_BASE + 0x9c) - -/* - * ---------------------------------------------------------------------------- - * Clocks - * ---------------------------------------------------------------------------- - */ -#define OMAP16XX_ARM_IDLECT3	(CLKGEN_REG_BASE + 0x24) - -/* - * ---------------------------------------------------------------------------- - * Pin configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP16XX_CONF_VOLTAGE_VDDSHV6	(1 << 8) -#define OMAP16XX_CONF_VOLTAGE_VDDSHV7	(1 << 9) -#define OMAP16XX_CONF_VOLTAGE_VDDSHV8	(1 << 10) -#define OMAP16XX_CONF_VOLTAGE_VDDSHV9	(1 << 11) -#define OMAP16XX_SUBLVDS_CONF_VALID	(1 << 13) - -/* - * ---------------------------------------------------------------------------- - * System control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP1610_RESET_CONTROL  0xfffe1140 - -/* - * --------------------------------------------------------------------------- - * TIPB bus interface - * --------------------------------------------------------------------------- - */ -#define TIPB_SWITCH_BASE		 (0xfffbc800) -#define OMAP16XX_MMCSD2_SSW_MPU_CONF	(TIPB_SWITCH_BASE + 0x160) - -/* UART3 Registers Mapping through MPU bus */ -#define UART3_RHR               (OMAP1_UART3_BASE + 0) -#define UART3_THR               (OMAP1_UART3_BASE + 0) -#define UART3_DLL               (OMAP1_UART3_BASE + 0) -#define UART3_IER               (OMAP1_UART3_BASE + 4) -#define UART3_DLH               (OMAP1_UART3_BASE + 4) -#define UART3_IIR               (OMAP1_UART3_BASE + 8) -#define UART3_FCR               (OMAP1_UART3_BASE + 8) -#define UART3_EFR               (OMAP1_UART3_BASE + 8) -#define UART3_LCR               (OMAP1_UART3_BASE + 0x0C) -#define UART3_MCR               (OMAP1_UART3_BASE + 0x10) -#define UART3_XON1_ADDR1        (OMAP1_UART3_BASE + 0x10) -#define UART3_XON2_ADDR2        (OMAP1_UART3_BASE + 0x14) -#define UART3_LSR               (OMAP1_UART3_BASE + 0x14) -#define UART3_TCR               (OMAP1_UART3_BASE + 0x18) -#define UART3_MSR               (OMAP1_UART3_BASE + 0x18) -#define UART3_XOFF1             (OMAP1_UART3_BASE + 0x18) -#define UART3_XOFF2             (OMAP1_UART3_BASE + 0x1C) -#define UART3_SPR               (OMAP1_UART3_BASE + 0x1C) -#define UART3_TLR               (OMAP1_UART3_BASE + 0x1C) -#define UART3_MDR1              (OMAP1_UART3_BASE + 0x20) -#define UART3_MDR2              (OMAP1_UART3_BASE + 0x24) -#define UART3_SFLSR             (OMAP1_UART3_BASE + 0x28) -#define UART3_TXFLL             (OMAP1_UART3_BASE + 0x28) -#define UART3_RESUME            (OMAP1_UART3_BASE + 0x2C) -#define UART3_TXFLH             (OMAP1_UART3_BASE + 0x2C) -#define UART3_SFREGL            (OMAP1_UART3_BASE + 0x30) -#define UART3_RXFLL             (OMAP1_UART3_BASE + 0x30) -#define UART3_SFREGH            (OMAP1_UART3_BASE + 0x34) -#define UART3_RXFLH             (OMAP1_UART3_BASE + 0x34) -#define UART3_BLR               (OMAP1_UART3_BASE + 0x38) -#define UART3_ACREG             (OMAP1_UART3_BASE + 0x3C) -#define UART3_DIV16             (OMAP1_UART3_BASE + 0x3C) -#define UART3_SCR               (OMAP1_UART3_BASE + 0x40) -#define UART3_SSR               (OMAP1_UART3_BASE + 0x44) -#define UART3_EBLR              (OMAP1_UART3_BASE + 0x48) -#define UART3_OSC_12M_SEL       (OMAP1_UART3_BASE + 0x4C) -#define UART3_MVR               (OMAP1_UART3_BASE + 0x50) - -/* - * --------------------------------------------------------------------------- - * Watchdog timer - * --------------------------------------------------------------------------- - */ - -/* 32-bit Watchdog timer in OMAP 16XX */ -#define OMAP_16XX_WATCHDOG_BASE        (0xfffeb000) -#define OMAP_16XX_WIDR         (OMAP_16XX_WATCHDOG_BASE + 0x00) -#define OMAP_16XX_WD_SYSCONFIG (OMAP_16XX_WATCHDOG_BASE + 0x10) -#define OMAP_16XX_WD_SYSSTATUS (OMAP_16XX_WATCHDOG_BASE + 0x14) -#define OMAP_16XX_WCLR         (OMAP_16XX_WATCHDOG_BASE + 0x24) -#define OMAP_16XX_WCRR         (OMAP_16XX_WATCHDOG_BASE + 0x28) -#define OMAP_16XX_WLDR         (OMAP_16XX_WATCHDOG_BASE + 0x2c) -#define OMAP_16XX_WTGR         (OMAP_16XX_WATCHDOG_BASE + 0x30) -#define OMAP_16XX_WWPS         (OMAP_16XX_WATCHDOG_BASE + 0x34) -#define OMAP_16XX_WSPR         (OMAP_16XX_WATCHDOG_BASE + 0x48) - -#define WCLR_PRE_SHIFT         5 -#define WCLR_PTV_SHIFT         2 - -#define WWPS_W_PEND_WSPR       (1 << 4) -#define WWPS_W_PEND_WTGR       (1 << 3) -#define WWPS_W_PEND_WLDR       (1 << 2) -#define WWPS_W_PEND_WCRR       (1 << 1) -#define WWPS_W_PEND_WCLR       (1 << 0) - -#define WSPR_ENABLE_0          (0x0000bbbb) -#define WSPR_ENABLE_1          (0x00004444) -#define WSPR_DISABLE_0         (0x0000aaaa) -#define WSPR_DISABLE_1         (0x00005555) - -#define OMAP16XX_DSP_MMU_BASE	(0xfffed200) -#define OMAP16XX_MAILBOX_BASE	(0xfffcf000) - -#endif /*  __ASM_ARCH_OMAP16XX_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap24xx.h b/arch/arm/plat-omap/include/plat/omap24xx.h deleted file mode 100644 index 92df9e27cc5..00000000000 --- a/arch/arm/plat-omap/include/plat/omap24xx.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/omap24xx.h - * - * This file contains the processor specific definitions - * of the TI OMAP24XX. - * - * Copyright (C) 2007 Texas Instruments. - * Copyright (C) 2007 Nokia Corporation. - * - * 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 - * - */ - -#ifndef __ASM_ARCH_OMAP2_H -#define __ASM_ARCH_OMAP2_H - -/* - * Please place only base defines here and put the rest in device - * specific headers. Note also that some of these defines are needed - * for omap1 to compile without adding ifdefs. - */ - -#define L4_24XX_BASE		0x48000000 -#define L4_WK_243X_BASE		0x49000000 -#define L3_24XX_BASE		0x68000000 - -/* interrupt controller */ -#define OMAP24XX_IC_BASE	(L4_24XX_BASE + 0xfe000) -#define OMAP24XX_IVA_INTC_BASE	0x40000000 - -#define OMAP242X_CTRL_BASE	L4_24XX_BASE -#define OMAP2420_32KSYNCT_BASE	(L4_24XX_BASE + 0x4000) -#define OMAP2420_PRCM_BASE	(L4_24XX_BASE + 0x8000) -#define OMAP2420_CM_BASE	(L4_24XX_BASE + 0x8000) -#define OMAP2420_PRM_BASE	OMAP2420_CM_BASE -#define OMAP2420_SDRC_BASE	(L3_24XX_BASE + 0x9000) -#define OMAP2420_SMS_BASE	0x68008000 -#define OMAP2420_GPMC_BASE	0x6800a000 - -#define OMAP2430_32KSYNCT_BASE	(L4_WK_243X_BASE + 0x20000) -#define OMAP2430_PRCM_BASE	(L4_WK_243X_BASE + 0x6000) -#define OMAP2430_CM_BASE	(L4_WK_243X_BASE + 0x6000) -#define OMAP2430_PRM_BASE	OMAP2430_CM_BASE - -#define OMAP243X_SMS_BASE	0x6C000000 -#define OMAP243X_SDRC_BASE	0x6D000000 -#define OMAP243X_GPMC_BASE	0x6E000000 -#define OMAP243X_SCM_BASE	(L4_WK_243X_BASE + 0x2000) -#define OMAP243X_CTRL_BASE	OMAP243X_SCM_BASE -#define OMAP243X_HS_BASE	(L4_24XX_BASE + 0x000ac000) - -/* DSP SS */ -#define OMAP2420_DSP_BASE	0x58000000 -#define OMAP2420_DSP_MEM_BASE	(OMAP2420_DSP_BASE + 0x0) -#define OMAP2420_DSP_IPI_BASE	(OMAP2420_DSP_BASE + 0x1000000) -#define OMAP2420_DSP_MMU_BASE	(OMAP2420_DSP_BASE + 0x2000000) - -#define OMAP243X_DSP_BASE	0x5C000000 -#define OMAP243X_DSP_MEM_BASE	(OMAP243X_DSP_BASE + 0x0) -#define OMAP243X_DSP_MMU_BASE	(OMAP243X_DSP_BASE + 0x1000000) - -/* Mailbox */ -#define OMAP24XX_MAILBOX_BASE	(L4_24XX_BASE + 0x94000) - -/* Camera */ -#define OMAP24XX_CAMERA_BASE	(L4_24XX_BASE + 0x52000) - -/* Security */ -#define OMAP24XX_SEC_BASE	(L4_24XX_BASE + 0xA0000) -#define OMAP24XX_SEC_RNG_BASE	(OMAP24XX_SEC_BASE + 0x0000) -#define OMAP24XX_SEC_DES_BASE	(OMAP24XX_SEC_BASE + 0x2000) -#define OMAP24XX_SEC_SHA1MD5_BASE (OMAP24XX_SEC_BASE + 0x4000) -#define OMAP24XX_SEC_AES_BASE	(OMAP24XX_SEC_BASE + 0x6000) -#define OMAP24XX_SEC_PKA_BASE	(OMAP24XX_SEC_BASE + 0x8000) - -#endif /* __ASM_ARCH_OMAP2_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap34xx.h b/arch/arm/plat-omap/include/plat/omap34xx.h deleted file mode 100644 index 98fc8b4a4cc..00000000000 --- a/arch/arm/plat-omap/include/plat/omap34xx.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/omap34xx.h - * - * This file contains the processor specific definitions of the TI OMAP34XX. - * - * Copyright (C) 2007 Texas Instruments. - * Copyright (C) 2007 Nokia Corporation. - * - * 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 - */ - -#ifndef __ASM_ARCH_OMAP3_H -#define __ASM_ARCH_OMAP3_H - -/* - * Please place only base defines here and put the rest in device - * specific headers. - */ - -#define L4_34XX_BASE		0x48000000 -#define L4_WK_34XX_BASE		0x48300000 -#define L4_PER_34XX_BASE	0x49000000 -#define L4_EMU_34XX_BASE	0x54000000 -#define L3_34XX_BASE		0x68000000 - -#define OMAP3430_32KSYNCT_BASE	0x48320000 -#define OMAP3430_CM_BASE	0x48004800 -#define OMAP3430_PRM_BASE	0x48306800 -#define OMAP343X_SMS_BASE	0x6C000000 -#define OMAP343X_SDRC_BASE	0x6D000000 -#define OMAP34XX_GPMC_BASE	0x6E000000 -#define OMAP343X_SCM_BASE	0x48002000 -#define OMAP343X_CTRL_BASE	OMAP343X_SCM_BASE - -#define OMAP34XX_IC_BASE	0x48200000 - -#define OMAP3430_ISP_BASE		(L4_34XX_BASE + 0xBC000) -#define OMAP3430_ISP_CBUFF_BASE		(OMAP3430_ISP_BASE + 0x0100) -#define OMAP3430_ISP_CCP2_BASE		(OMAP3430_ISP_BASE + 0x0400) -#define OMAP3430_ISP_CCDC_BASE		(OMAP3430_ISP_BASE + 0x0600) -#define OMAP3430_ISP_HIST_BASE		(OMAP3430_ISP_BASE + 0x0A00) -#define OMAP3430_ISP_H3A_BASE		(OMAP3430_ISP_BASE + 0x0C00) -#define OMAP3430_ISP_PREV_BASE		(OMAP3430_ISP_BASE + 0x0E00) -#define OMAP3430_ISP_RESZ_BASE		(OMAP3430_ISP_BASE + 0x1000) -#define OMAP3430_ISP_SBL_BASE		(OMAP3430_ISP_BASE + 0x1200) -#define OMAP3430_ISP_MMU_BASE		(OMAP3430_ISP_BASE + 0x1400) -#define OMAP3430_ISP_CSI2A_BASE		(OMAP3430_ISP_BASE + 0x1800) -#define OMAP3430_ISP_CSI2PHY_BASE	(OMAP3430_ISP_BASE + 0x1970) - -#define OMAP3430_ISP_END		(OMAP3430_ISP_BASE         + 0x06F) -#define OMAP3430_ISP_CBUFF_END		(OMAP3430_ISP_CBUFF_BASE   + 0x077) -#define OMAP3430_ISP_CCP2_END		(OMAP3430_ISP_CCP2_BASE    + 0x1EF) -#define OMAP3430_ISP_CCDC_END		(OMAP3430_ISP_CCDC_BASE    + 0x0A7) -#define OMAP3430_ISP_HIST_END		(OMAP3430_ISP_HIST_BASE    + 0x047) -#define OMAP3430_ISP_H3A_END		(OMAP3430_ISP_H3A_BASE     + 0x05F) -#define OMAP3430_ISP_PREV_END		(OMAP3430_ISP_PREV_BASE    + 0x09F) -#define OMAP3430_ISP_RESZ_END		(OMAP3430_ISP_RESZ_BASE    + 0x0AB) -#define OMAP3430_ISP_SBL_END		(OMAP3430_ISP_SBL_BASE     + 0x0FB) -#define OMAP3430_ISP_MMU_END		(OMAP3430_ISP_MMU_BASE     + 0x06F) -#define OMAP3430_ISP_CSI2A_END		(OMAP3430_ISP_CSI2A_BASE   + 0x16F) -#define OMAP3430_ISP_CSI2PHY_END	(OMAP3430_ISP_CSI2PHY_BASE + 0x007) - -#define OMAP34XX_HSUSB_OTG_BASE	(L4_34XX_BASE + 0xAB000) -#define OMAP34XX_USBTLL_BASE	(L4_34XX_BASE + 0x62000) -#define OMAP34XX_UHH_CONFIG_BASE	(L4_34XX_BASE + 0x64000) -#define OMAP34XX_OHCI_BASE	(L4_34XX_BASE + 0x64400) -#define OMAP34XX_EHCI_BASE	(L4_34XX_BASE + 0x64800) -#define OMAP34XX_SR1_BASE	0x480C9000 -#define OMAP34XX_SR2_BASE	0x480CB000 - -#define OMAP34XX_MAILBOX_BASE		(L4_34XX_BASE + 0x94000) - -/* Security */ -#define OMAP34XX_SEC_BASE	(L4_34XX_BASE + 0xA0000) -#define OMAP34XX_SEC_SHA1MD5_BASE	(OMAP34XX_SEC_BASE + 0x23000) -#define OMAP34XX_SEC_AES_BASE	(OMAP34XX_SEC_BASE + 0x25000) - -#endif /* __ASM_ARCH_OMAP3_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap4-keypad.h b/arch/arm/plat-omap/include/plat/omap4-keypad.h deleted file mode 100644 index 2b1d9bc1eeb..00000000000 --- a/arch/arm/plat-omap/include/plat/omap4-keypad.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ARCH_ARM_PLAT_OMAP4_KEYPAD_H -#define ARCH_ARM_PLAT_OMAP4_KEYPAD_H - -#include <linux/input/matrix_keypad.h> - -struct omap4_keypad_platform_data { -	const struct matrix_keymap_data *keymap_data; - -	u8 rows; -	u8 cols; -}; - -extern int omap4_keyboard_init(struct omap4_keypad_platform_data *); -#endif diff --git a/arch/arm/plat-omap/include/plat/omap44xx.h b/arch/arm/plat-omap/include/plat/omap44xx.h deleted file mode 100644 index 8b3f12ff5cb..00000000000 --- a/arch/arm/plat-omap/include/plat/omap44xx.h +++ /dev/null @@ -1,56 +0,0 @@ -/*: - * Address mappings and base address for OMAP4 interconnects - * and peripherals. - * - * Copyright (C) 2009 Texas Instruments - * - * Author: 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. - */ -#ifndef __ASM_ARCH_OMAP44XX_H -#define __ASM_ARCH_OMAP44XX_H - -/* - * Please place only base defines here and put the rest in device - * specific headers. - */ -#define L4_44XX_BASE			0x4a000000 -#define L4_WK_44XX_BASE			0x4a300000 -#define L4_PER_44XX_BASE		0x48000000 -#define L4_EMU_44XX_BASE		0x54000000 -#define L3_44XX_BASE			0x44000000 -#define OMAP44XX_EMIF1_BASE		0x4c000000 -#define OMAP44XX_EMIF2_BASE		0x4d000000 -#define OMAP44XX_DMM_BASE		0x4e000000 -#define OMAP4430_32KSYNCT_BASE		0x4a304000 -#define OMAP4430_CM1_BASE		0x4a004000 -#define OMAP4430_CM_BASE		OMAP4430_CM1_BASE -#define OMAP4430_CM2_BASE		0x4a008000 -#define OMAP4430_PRM_BASE		0x4a306000 -#define OMAP4430_PRCM_MPU_BASE		0x48243000 -#define OMAP44XX_GPMC_BASE		0x50000000 -#define OMAP443X_SCM_BASE		0x4a002000 -#define OMAP443X_CTRL_BASE		0x4a100000 -#define OMAP44XX_IC_BASE		0x48200000 -#define OMAP44XX_IVA_INTC_BASE		0x40000000 -#define IRQ_SIR_IRQ			0x0040 -#define OMAP44XX_GIC_DIST_BASE		0x48241000 -#define OMAP44XX_GIC_CPU_BASE		0x48240100 -#define OMAP44XX_SCU_BASE		0x48240000 -#define OMAP44XX_LOCAL_TWD_BASE		0x48240600 -#define OMAP44XX_L2CACHE_BASE		0x48242000 -#define OMAP44XX_WKUPGEN_BASE		0x48281000 -#define OMAP44XX_MCPDM_BASE		0x40132000 -#define OMAP44XX_MCPDM_L3_BASE		0x49032000 - -#define OMAP44XX_MAILBOX_BASE		(L4_44XX_BASE + 0xF4000) -#define OMAP44XX_HSUSB_OTG_BASE		(L4_44XX_BASE + 0xAB000) - -#define OMAP4_MMU1_BASE			0x55082000 -#define OMAP4_MMU2_BASE			0x4A066000 - -#endif /* __ASM_ARCH_OMAP44XX_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap730.h b/arch/arm/plat-omap/include/plat/omap730.h deleted file mode 100644 index 14272bc1a6f..00000000000 --- a/arch/arm/plat-omap/include/plat/omap730.h +++ /dev/null @@ -1,102 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap730.h - * - * Hardware definitions for TI OMAP730 processor. - * - * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP730_H -#define __ASM_ARCH_OMAP730_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP730_DSP_BASE	0xE0000000 -#define OMAP730_DSP_SIZE	0x50000 -#define OMAP730_DSP_START	0xE0000000 - -#define OMAP730_DSPREG_BASE	0xE1000000 -#define OMAP730_DSPREG_SIZE	SZ_128K -#define OMAP730_DSPREG_START	0xE1000000 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 specific configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_CONFIG_BASE	0xfffe1000 -#define OMAP730_IO_CONF_0	0xfffe1070 -#define OMAP730_IO_CONF_1	0xfffe1074 -#define OMAP730_IO_CONF_2	0xfffe1078 -#define OMAP730_IO_CONF_3	0xfffe107c -#define OMAP730_IO_CONF_4	0xfffe1080 -#define OMAP730_IO_CONF_5	0xfffe1084 -#define OMAP730_IO_CONF_6	0xfffe1088 -#define OMAP730_IO_CONF_7	0xfffe108c -#define OMAP730_IO_CONF_8	0xfffe1090 -#define OMAP730_IO_CONF_9	0xfffe1094 -#define OMAP730_IO_CONF_10	0xfffe1098 -#define OMAP730_IO_CONF_11	0xfffe109c -#define OMAP730_IO_CONF_12	0xfffe10a0 -#define OMAP730_IO_CONF_13	0xfffe10a4 - -#define OMAP730_MODE_1		0xfffe1010 -#define OMAP730_MODE_2		0xfffe1014 - -/* CSMI specials: in terms of base + offset */ -#define OMAP730_MODE2_OFFSET	0x14 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 traffic controller configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_FLASH_CFG_0	0xfffecc10 -#define OMAP730_FLASH_ACFG_0	0xfffecc50 -#define OMAP730_FLASH_CFG_1	0xfffecc14 -#define OMAP730_FLASH_ACFG_1	0xfffecc54 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 DSP control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_ICR_BASE	0xfffbb800 -#define OMAP730_DSP_M_CTL	0xfffbb804 -#define OMAP730_DSP_MMU_BASE	0xfffed200 - -/* - * ---------------------------------------------------------------------------- - * OMAP730 PCC_UPLD configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP730_PCC_UPLD_CTRL_BASE	(0xfffe0900) -#define OMAP730_PCC_UPLD_CTRL		(OMAP730_PCC_UPLD_CTRL_BASE + 0x00) - -#endif /*  __ASM_ARCH_OMAP730_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap7xx.h b/arch/arm/plat-omap/include/plat/omap7xx.h deleted file mode 100644 index 48e4757e1e3..00000000000 --- a/arch/arm/plat-omap/include/plat/omap7xx.h +++ /dev/null @@ -1,107 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap7xx.h - * - * Hardware definitions for TI OMAP7XX processor. - * - * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com> - * Adapted for omap850 by Zebediah C. McClure <zmc@lurian.net> - * Adapted for omap7xx by Alistair Buxton <a.j.buxton@gmail.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP7XX_H -#define __ASM_ARCH_OMAP7XX_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP7XX_DSP_BASE	0xE0000000 -#define OMAP7XX_DSP_SIZE	0x50000 -#define OMAP7XX_DSP_START	0xE0000000 - -#define OMAP7XX_DSPREG_BASE	0xE1000000 -#define OMAP7XX_DSPREG_SIZE	SZ_128K -#define OMAP7XX_DSPREG_START	0xE1000000 - -#define OMAP7XX_SPI1_BASE	0xfffc0800 -#define OMAP7XX_SPI2_BASE	0xfffc1000 - -/* - * ---------------------------------------------------------------------------- - * OMAP7XX specific configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP7XX_CONFIG_BASE	0xfffe1000 -#define OMAP7XX_IO_CONF_0	0xfffe1070 -#define OMAP7XX_IO_CONF_1	0xfffe1074 -#define OMAP7XX_IO_CONF_2	0xfffe1078 -#define OMAP7XX_IO_CONF_3	0xfffe107c -#define OMAP7XX_IO_CONF_4	0xfffe1080 -#define OMAP7XX_IO_CONF_5	0xfffe1084 -#define OMAP7XX_IO_CONF_6	0xfffe1088 -#define OMAP7XX_IO_CONF_7	0xfffe108c -#define OMAP7XX_IO_CONF_8	0xfffe1090 -#define OMAP7XX_IO_CONF_9	0xfffe1094 -#define OMAP7XX_IO_CONF_10	0xfffe1098 -#define OMAP7XX_IO_CONF_11	0xfffe109c -#define OMAP7XX_IO_CONF_12	0xfffe10a0 -#define OMAP7XX_IO_CONF_13	0xfffe10a4 - -#define OMAP7XX_MODE_1		0xfffe1010 -#define OMAP7XX_MODE_2		0xfffe1014 - -/* CSMI specials: in terms of base + offset */ -#define OMAP7XX_MODE2_OFFSET	0x14 - -/* - * ---------------------------------------------------------------------------- - * OMAP7XX traffic controller configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP7XX_FLASH_CFG_0	0xfffecc10 -#define OMAP7XX_FLASH_ACFG_0	0xfffecc50 -#define OMAP7XX_FLASH_CFG_1	0xfffecc14 -#define OMAP7XX_FLASH_ACFG_1	0xfffecc54 - -/* - * ---------------------------------------------------------------------------- - * OMAP7XX DSP control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP7XX_ICR_BASE	0xfffbb800 -#define OMAP7XX_DSP_M_CTL	0xfffbb804 -#define OMAP7XX_DSP_MMU_BASE	0xfffed200 - -/* - * ---------------------------------------------------------------------------- - * OMAP7XX PCC_UPLD configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP7XX_PCC_UPLD_CTRL_BASE	(0xfffe0900) -#define OMAP7XX_PCC_UPLD_CTRL		(OMAP7XX_PCC_UPLD_CTRL_BASE + 0x00) - -#endif /*  __ASM_ARCH_OMAP7XX_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap850.h b/arch/arm/plat-omap/include/plat/omap850.h deleted file mode 100644 index c33f6798171..00000000000 --- a/arch/arm/plat-omap/include/plat/omap850.h +++ /dev/null @@ -1,102 +0,0 @@ -/* arch/arm/plat-omap/include/mach/omap850.h - * - * Hardware definitions for TI OMAP850 processor. - * - * Derived from omap730.h by Zebediah C. McClure <zmc@lurian.net> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ASM_ARCH_OMAP850_H -#define __ASM_ARCH_OMAP850_H - -/* - * ---------------------------------------------------------------------------- - * Base addresses - * ---------------------------------------------------------------------------- - */ - -/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */ - -#define OMAP850_DSP_BASE	0xE0000000 -#define OMAP850_DSP_SIZE	0x50000 -#define OMAP850_DSP_START	0xE0000000 - -#define OMAP850_DSPREG_BASE	0xE1000000 -#define OMAP850_DSPREG_SIZE	SZ_128K -#define OMAP850_DSPREG_START	0xE1000000 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 specific configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_CONFIG_BASE	0xfffe1000 -#define OMAP850_IO_CONF_0	0xfffe1070 -#define OMAP850_IO_CONF_1	0xfffe1074 -#define OMAP850_IO_CONF_2	0xfffe1078 -#define OMAP850_IO_CONF_3	0xfffe107c -#define OMAP850_IO_CONF_4	0xfffe1080 -#define OMAP850_IO_CONF_5	0xfffe1084 -#define OMAP850_IO_CONF_6	0xfffe1088 -#define OMAP850_IO_CONF_7	0xfffe108c -#define OMAP850_IO_CONF_8	0xfffe1090 -#define OMAP850_IO_CONF_9	0xfffe1094 -#define OMAP850_IO_CONF_10	0xfffe1098 -#define OMAP850_IO_CONF_11	0xfffe109c -#define OMAP850_IO_CONF_12	0xfffe10a0 -#define OMAP850_IO_CONF_13	0xfffe10a4 - -#define OMAP850_MODE_1		0xfffe1010 -#define OMAP850_MODE_2		0xfffe1014 - -/* CSMI specials: in terms of base + offset */ -#define OMAP850_MODE2_OFFSET	0x14 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 traffic controller configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_FLASH_CFG_0	0xfffecc10 -#define OMAP850_FLASH_ACFG_0	0xfffecc50 -#define OMAP850_FLASH_CFG_1	0xfffecc14 -#define OMAP850_FLASH_ACFG_1	0xfffecc54 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 DSP control registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_ICR_BASE	0xfffbb800 -#define OMAP850_DSP_M_CTL	0xfffbb804 -#define OMAP850_DSP_MMU_BASE	0xfffed200 - -/* - * ---------------------------------------------------------------------------- - * OMAP850 PCC_UPLD configuration registers - * ---------------------------------------------------------------------------- - */ -#define OMAP850_PCC_UPLD_CTRL_BASE	(0xfffe0900) -#define OMAP850_PCC_UPLD_CTRL		(OMAP850_PCC_UPLD_CTRL_BASE + 0x00) - -#endif /*  __ASM_ARCH_OMAP850_H */ - diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h deleted file mode 100644 index 28e2d1a7843..00000000000 --- a/arch/arm/plat-omap/include/plat/omap_device.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * omap_device headers - * - * Copyright (C) 2009 Nokia Corporation - * Paul Walmsley - * - * Developed in collaboration with (alphabetical order): Benoit - * Cousson, Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram - * Pandita, Sakari Poussa, Anand Sawant, Santosh Shilimkar, Richard - * Woodruff - * - * 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. - * - * Eventually this type of functionality should either be - * a) implemented via arch-specific pointers in platform_device - * or - * b) implemented as a proper omap_bus/omap_device in Linux, no more - *    platform_device - * - * omap_device differs from omap_hwmod in that it includes external - * (e.g., board- and system-level) integration details.  omap_hwmod - * stores hardware data that is invariant for a given OMAP chip. - * - * To do: - * - GPIO integration - * - regulator integration - * - */ -#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H -#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H - -#include <linux/kernel.h> -#include <linux/platform_device.h> - -#include <plat/omap_hwmod.h> - -extern struct device omap_device_parent; - -/* omap_device._state values */ -#define OMAP_DEVICE_STATE_UNKNOWN	0 -#define OMAP_DEVICE_STATE_ENABLED	1 -#define OMAP_DEVICE_STATE_IDLE		2 -#define OMAP_DEVICE_STATE_SHUTDOWN	3 - -/** - * struct omap_device - omap_device wrapper for platform_devices - * @pdev: platform_device - * @hwmods: (one .. many per omap_device) - * @hwmods_cnt: ARRAY_SIZE() of @hwmods - * @pm_lats: ptr to an omap_device_pm_latency table - * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats - * @pm_lat_level: array index of the last odpl entry executed - -1 if never - * @dev_wakeup_lat: dev wakeup latency in nanoseconds - * @_dev_wakeup_lat_limit: dev wakeup latency limit in nsec - set by OMAP PM - * @_state: one of OMAP_DEVICE_STATE_* (see above) - * @flags: device flags - * - * Integrates omap_hwmod data into Linux platform_device. - * - * Field names beginning with underscores are for the internal use of - * the omap_device code. - * - */ -struct omap_device { -	struct platform_device		pdev; -	struct omap_hwmod		**hwmods; -	struct omap_device_pm_latency	*pm_lats; -	u32				dev_wakeup_lat; -	u32				_dev_wakeup_lat_limit; -	u8				pm_lats_cnt; -	s8				pm_lat_level; -	u8				hwmods_cnt; -	u8				_state; -}; - -/* Device driver interface (call via platform_data fn ptrs) */ - -int omap_device_enable(struct platform_device *pdev); -int omap_device_idle(struct platform_device *pdev); -int omap_device_shutdown(struct platform_device *pdev); - -/* Core code interface */ - -int omap_device_count_resources(struct omap_device *od); -int omap_device_fill_resources(struct omap_device *od, struct resource *res); - -struct omap_device *omap_device_build(const char *pdev_name, int pdev_id, -				      struct omap_hwmod *oh, void *pdata, -				      int pdata_len, -				      struct omap_device_pm_latency *pm_lats, -				      int pm_lats_cnt, int is_early_device); - -struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, -					 struct omap_hwmod **oh, int oh_cnt, -					 void *pdata, int pdata_len, -					 struct omap_device_pm_latency *pm_lats, -					 int pm_lats_cnt, int is_early_device); - -int omap_device_register(struct omap_device *od); -int omap_early_device_register(struct omap_device *od); - -void __iomem *omap_device_get_rt_va(struct omap_device *od); - -/* OMAP PM interface */ -int omap_device_align_pm_lat(struct platform_device *pdev, -			     u32 new_wakeup_lat_limit); -struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); - -/* Other */ - -int omap_device_idle_hwmods(struct omap_device *od); -int omap_device_enable_hwmods(struct omap_device *od); - -int omap_device_disable_clocks(struct omap_device *od); -int omap_device_enable_clocks(struct omap_device *od); - - -/* - * Entries should be kept in latency order ascending - * - * deact_lat is the maximum number of microseconds required to complete - * deactivate_func() at the device's slowest OPP. - * - * act_lat is the maximum number of microseconds required to complete - * activate_func() at the device's slowest OPP. - * - * This will result in some suboptimal power management decisions at fast - * OPPs, but avoids having to recompute all device power management decisions - * if the system shifts from a fast OPP to a slow OPP (in order to meet - * latency requirements). - * - * XXX should deactivate_func/activate_func() take platform_device pointers - * rather than omap_device pointers? - */ -struct omap_device_pm_latency { -	u32 deactivate_lat; -	u32 deactivate_lat_worst; -	int (*deactivate_func)(struct omap_device *od); -	u32 activate_lat; -	u32 activate_lat_worst; -	int (*activate_func)(struct omap_device *od); -	u32 flags; -}; - -#define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1) - -/* Get omap_device pointer from platform_device pointer */ -#define to_omap_device(x) container_of((x), struct omap_device, pdev) - -#endif diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h deleted file mode 100644 index 7eaa8edf3b1..00000000000 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ /dev/null @@ -1,568 +0,0 @@ -/* - * omap_hwmod macros, structures - * - * Copyright (C) 2009-2010 Nokia Corporation - * Paul Walmsley - * - * Created in collaboration with (alphabetical order): Benoît Cousson, - * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari - * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff - * - * 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. - * - * These headers and macros are used to define OMAP on-chip module - * data and their integration with other OMAP modules and Linux. - * Copious documentation and references can also be found in the - * omap_hwmod code, in arch/arm/mach-omap2/omap_hwmod.c (as of this - * writing). - * - * To do: - * - add interconnect error log structures - * - add pinmuxing - * - init_conn_id_bit (CONNID_BIT_VECTOR) - * - implement default hwmod SMS/SDRC flags? - * - remove unused fields - * - */ -#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H -#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H - -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/ioport.h> -#include <linux/mutex.h> -#include <plat/cpu.h> - -struct omap_device; - -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; - -/* - * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant - * with the original PRCM protocol defined for OMAP2420 - */ -#define SYSC_TYPE1_MIDLEMODE_SHIFT	12 -#define SYSC_TYPE1_MIDLEMODE_MASK	(0x3 << SYSC_MIDLEMODE_SHIFT) -#define SYSC_TYPE1_CLOCKACTIVITY_SHIFT	8 -#define SYSC_TYPE1_CLOCKACTIVITY_MASK	(0x3 << SYSC_CLOCKACTIVITY_SHIFT) -#define SYSC_TYPE1_SIDLEMODE_SHIFT	3 -#define SYSC_TYPE1_SIDLEMODE_MASK	(0x3 << SYSC_SIDLEMODE_SHIFT) -#define SYSC_TYPE1_ENAWAKEUP_SHIFT	2 -#define SYSC_TYPE1_ENAWAKEUP_MASK	(1 << SYSC_ENAWAKEUP_SHIFT) -#define SYSC_TYPE1_SOFTRESET_SHIFT	1 -#define SYSC_TYPE1_SOFTRESET_MASK	(1 << SYSC_SOFTRESET_SHIFT) -#define SYSC_TYPE1_AUTOIDLE_SHIFT	0 -#define SYSC_TYPE1_AUTOIDLE_MASK	(1 << SYSC_AUTOIDLE_SHIFT) - -/* - * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant - * with the new PRCM protocol defined for new OMAP4 IPs. - */ -#define SYSC_TYPE2_SOFTRESET_SHIFT	0 -#define SYSC_TYPE2_SOFTRESET_MASK	(1 << SYSC_TYPE2_SOFTRESET_SHIFT) -#define SYSC_TYPE2_SIDLEMODE_SHIFT	2 -#define SYSC_TYPE2_SIDLEMODE_MASK	(0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT) -#define SYSC_TYPE2_MIDLEMODE_SHIFT	4 -#define SYSC_TYPE2_MIDLEMODE_MASK	(0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT) - -/* OCP SYSSTATUS bit shifts/masks */ -#define SYSS_RESETDONE_SHIFT		0 -#define SYSS_RESETDONE_MASK		(1 << SYSS_RESETDONE_SHIFT) - -/* Master standby/slave idle mode flags */ -#define HWMOD_IDLEMODE_FORCE		(1 << 0) -#define HWMOD_IDLEMODE_NO		(1 << 1) -#define HWMOD_IDLEMODE_SMART		(1 << 2) - -/** - * struct omap_hwmod_irq_info - MPU IRQs used by the hwmod - * @name: name of the IRQ channel (module local name) - * @irq_ch: IRQ channel ID - * - * @name should be something short, e.g., "tx" or "rx".  It is for use - * by platform_get_resource_byname().  It is defined locally to the - * hwmod. - */ -struct omap_hwmod_irq_info { -	const char	*name; -	u16		irq; -}; - -/** - * struct omap_hwmod_dma_info - DMA channels used by the hwmod - * @name: name of the DMA channel (module local name) - * @dma_req: DMA request ID - * - * @name should be something short, e.g., "tx" or "rx".  It is for use - * by platform_get_resource_byname().  It is defined locally to the - * hwmod. - */ -struct omap_hwmod_dma_info { -	const char	*name; -	u16		dma_req; -}; - -/** - * struct omap_hwmod_rst_info - IPs reset lines use by hwmod - * @name: name of the reset line (module local name) - * @rst_shift: Offset of the reset bit - * - * @name should be something short, e.g., "cpu0" or "rst". It is defined - * locally to the hwmod. - */ -struct omap_hwmod_rst_info { -	const char	*name; -	u8		rst_shift; -}; - -/** - * struct omap_hwmod_opt_clk - optional clocks used by this hwmod - * @role: "sys", "32k", "tv", etc -- for use in clk_get() - * @clk: opt clock: OMAP clock name - * @_clk: pointer to the struct clk (filled in at runtime) - * - * The module's interface clock and main functional clock should not - * be added as optional clocks. - */ -struct omap_hwmod_opt_clk { -	const char	*role; -	const char	*clk; -	struct clk	*_clk; -}; - - -/* omap_hwmod_omap2_firewall.flags bits */ -#define OMAP_FIREWALL_L3		(1 << 0) -#define OMAP_FIREWALL_L4		(1 << 1) - -/** - * struct omap_hwmod_omap2_firewall - OMAP2/3 device firewall data - * @l3_perm_bit: bit shift for L3_PM_*_PERMISSION_* - * @l4_fw_region: L4 firewall region ID - * @l4_prot_group: L4 protection group ID - * @flags: (see omap_hwmod_omap2_firewall.flags macros above) - */ -struct omap_hwmod_omap2_firewall { -	u8 l3_perm_bit; -	u8 l4_fw_region; -	u8 l4_prot_group; -	u8 flags; -}; - - -/* - * omap_hwmod_addr_space.flags bits - * - * ADDR_MAP_ON_INIT: Map this address space during omap_hwmod init. - * ADDR_TYPE_RT: Address space contains module register target data. - */ -#define ADDR_MAP_ON_INIT	(1 << 0) -#define ADDR_TYPE_RT		(1 << 1) - -/** - * struct omap_hwmod_addr_space - MPU address space handled by the hwmod - * @pa_start: starting physical address - * @pa_end: ending physical address - * @flags: (see omap_hwmod_addr_space.flags macros above) - * - * Address space doesn't necessarily follow physical interconnect - * structure.  GPMC is one example. - */ -struct omap_hwmod_addr_space { -	u32 pa_start; -	u32 pa_end; -	u8 flags; -}; - - -/* - * omap_hwmod_ocp_if.user bits: these indicate the initiators that use this - * interface to interact with the hwmod.  Used to add sleep dependencies - * when the module is enabled or disabled. - */ -#define OCP_USER_MPU			(1 << 0) -#define OCP_USER_SDMA			(1 << 1) - -/* omap_hwmod_ocp_if.flags bits */ -#define OCPIF_SWSUP_IDLE		(1 << 0) -#define OCPIF_CAN_BURST			(1 << 1) - -/** - * struct omap_hwmod_ocp_if - OCP interface data - * @master: struct omap_hwmod that initiates OCP transactions on this link - * @slave: struct omap_hwmod that responds to OCP transactions on this link - * @addr: address space associated with this link - * @clk: interface clock: OMAP clock name - * @_clk: pointer to the interface struct clk (filled in at runtime) - * @fw: interface firewall data - * @addr_cnt: ARRAY_SIZE(@addr) - * @width: OCP data width - * @thread_cnt: number of threads - * @max_burst_len: maximum burst length in @width sized words (0 if unlimited) - * @user: initiators using this interface (see OCP_USER_* macros above) - * @flags: OCP interface flags (see OCPIF_* macros above) - * - * It may also be useful to add a tag_cnt field for OCP2.x devices. - * - * Parameter names beginning with an underscore are managed internally by - * the omap_hwmod code and should not be set during initialization. - */ -struct omap_hwmod_ocp_if { -	struct omap_hwmod		*master; -	struct omap_hwmod		*slave; -	struct omap_hwmod_addr_space	*addr; -	const char			*clk; -	struct clk			*_clk; -	union { -		struct omap_hwmod_omap2_firewall omap2; -	}				fw; -	u8				addr_cnt; -	u8				width; -	u8				thread_cnt; -	u8				max_burst_len; -	u8				user; -	u8				flags; -}; - - -/* Macros for use in struct omap_hwmod_sysconfig */ - -/* Flags for use in omap_hwmod_sysconfig.idlemodes */ -#define MASTER_STANDBY_SHIFT	2 -#define SLAVE_IDLE_SHIFT	0 -#define SIDLE_FORCE		(HWMOD_IDLEMODE_FORCE << SLAVE_IDLE_SHIFT) -#define SIDLE_NO		(HWMOD_IDLEMODE_NO << SLAVE_IDLE_SHIFT) -#define SIDLE_SMART		(HWMOD_IDLEMODE_SMART << SLAVE_IDLE_SHIFT) -#define MSTANDBY_FORCE		(HWMOD_IDLEMODE_FORCE << MASTER_STANDBY_SHIFT) -#define MSTANDBY_NO		(HWMOD_IDLEMODE_NO << MASTER_STANDBY_SHIFT) -#define MSTANDBY_SMART		(HWMOD_IDLEMODE_SMART << MASTER_STANDBY_SHIFT) - -/* omap_hwmod_sysconfig.sysc_flags capability flags */ -#define SYSC_HAS_AUTOIDLE	(1 << 0) -#define SYSC_HAS_SOFTRESET	(1 << 1) -#define SYSC_HAS_ENAWAKEUP	(1 << 2) -#define SYSC_HAS_EMUFREE	(1 << 3) -#define SYSC_HAS_CLOCKACTIVITY	(1 << 4) -#define SYSC_HAS_SIDLEMODE	(1 << 5) -#define SYSC_HAS_MIDLEMODE	(1 << 6) -#define SYSS_HAS_RESET_STATUS	(1 << 7) -#define SYSC_NO_CACHE		(1 << 8)  /* XXX SW flag, belongs elsewhere */ -#define SYSC_HAS_RESET_STATUS	(1 << 9) - -/* omap_hwmod_sysconfig.clockact flags */ -#define CLOCKACT_TEST_BOTH	0x0 -#define CLOCKACT_TEST_MAIN	0x1 -#define CLOCKACT_TEST_ICLK	0x2 -#define CLOCKACT_TEST_NONE	0x3 - -/** - * struct omap_hwmod_sysc_fields - hwmod OCP_SYSCONFIG register field offsets. - * @midle_shift: Offset of the midle bit - * @clkact_shift: Offset of the clockactivity bit - * @sidle_shift: Offset of the sidle bit - * @enwkup_shift: Offset of the enawakeup bit - * @srst_shift: Offset of the softreset bit - * @autoidle_shift: Offset of the autoidle bit - */ -struct omap_hwmod_sysc_fields { -	u8 midle_shift; -	u8 clkact_shift; -	u8 sidle_shift; -	u8 enwkup_shift; -	u8 srst_shift; -	u8 autoidle_shift; -}; - -/** - * struct omap_hwmod_class_sysconfig - hwmod class OCP_SYS* data - * @rev_offs: IP block revision register offset (from module base addr) - * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr) - * @syss_offs: OCP_SYSSTATUS register offset (from module base addr) - * @idlemodes: One or more of {SIDLE,MSTANDBY}_{OFF,FORCE,SMART} - * @sysc_flags: SYS{C,S}_HAS* flags indicating SYSCONFIG bits supported - * @clockact: the default value of the module CLOCKACTIVITY bits - * - * @clockact describes to the module which clocks are likely to be - * disabled when the PRCM issues its idle request to the module.  Some - * modules have separate clockdomains for the interface clock and main - * functional clock, and can check whether they should acknowledge the - * idle request based on the internal module functionality that has - * been associated with the clocks marked in @clockact.  This field is - * only used if HWMOD_SET_DEFAULT_CLOCKACT is set (see below) - * - * @sysc_fields: structure containing the offset positions of various bits in - * SYSCONFIG register. This can be populated using omap_hwmod_sysc_type1 or - * omap_hwmod_sysc_type2 defined in omap_hwmod_common_data.c depending on - * whether the device ip is compliant with the original PRCM protocol - * defined for OMAP2420 or the new PRCM protocol for new OMAP4 IPs. - * If the device follows a different scheme for the sysconfig register , - * then this field has to be populated with the correct offset structure. - */ -struct omap_hwmod_class_sysconfig { -	u16 rev_offs; -	u16 sysc_offs; -	u16 syss_offs; -	u16 sysc_flags; -	u8 idlemodes; -	u8 clockact; -	struct omap_hwmod_sysc_fields *sysc_fields; -}; - -/** - * struct omap_hwmod_omap2_prcm - OMAP2/3-specific PRCM data - * @module_offs: PRCM submodule offset from the start of the PRM/CM - * @prcm_reg_id: PRCM register ID (e.g., 3 for CM_AUTOIDLE3) - * @module_bit: register bit shift for AUTOIDLE, WKST, WKEN, GRPSEL regs - * @idlest_reg_id: IDLEST register ID (e.g., 3 for CM_IDLEST3) - * @idlest_idle_bit: register bit shift for CM_IDLEST slave idle bit - * @idlest_stdby_bit: register bit shift for CM_IDLEST master standby bit - * - * @prcm_reg_id and @module_bit are specific to the AUTOIDLE, WKST, - * WKEN, GRPSEL registers.  In an ideal world, no extra information - * would be needed for IDLEST information, but alas, there are some - * exceptions, so @idlest_reg_id, @idlest_idle_bit, @idlest_stdby_bit - * are needed for the IDLEST registers (c.f. 2430 I2CHS, 3430 USBHOST) - */ -struct omap_hwmod_omap2_prcm { -	s16 module_offs; -	u8 prcm_reg_id; -	u8 module_bit; -	u8 idlest_reg_id; -	u8 idlest_idle_bit; -	u8 idlest_stdby_bit; -}; - - -/** - * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data - * @clkctrl_reg: PRCM address of the clock control register - * @rstctrl_reg: adress of the XXX_RSTCTRL register located in the PRM - * @submodule_wkdep_bit: bit shift of the WKDEP range - */ -struct omap_hwmod_omap4_prcm { -	void __iomem	*clkctrl_reg; -	void __iomem	*rstctrl_reg; -	u8		submodule_wkdep_bit; -}; - - -/* - * omap_hwmod.flags definitions - * - * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out - *     of idle, rather than relying on module smart-idle - * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out - *     of standby, rather than relying on module smart-standby - * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for - *     SDRAM controller, etc. - * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM - *     controller, etc. - * HWMOD_NO_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE) - *     when module is enabled, rather than the default, which is to - *     enable autoidle - * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup - * HWMOD_NO_IDLEST : this module does not have idle status - this is the case - *     only for few initiator modules on OMAP2 & 3. - * HWMOD_CONTROL_OPT_CLKS_IN_RESET: Enable all optional clocks during reset. - *     This is needed for devices like DSS that require optional clocks enabled - *     in order to complete the reset. Optional clocks will be disabled - *     again after the reset. - * HWMOD_16BIT_REG: Module has 16bit registers - */ -#define HWMOD_SWSUP_SIDLE			(1 << 0) -#define HWMOD_SWSUP_MSTANDBY			(1 << 1) -#define HWMOD_INIT_NO_RESET			(1 << 2) -#define HWMOD_INIT_NO_IDLE			(1 << 3) -#define HWMOD_NO_OCP_AUTOIDLE			(1 << 4) -#define HWMOD_SET_DEFAULT_CLOCKACT		(1 << 5) -#define HWMOD_NO_IDLEST				(1 << 6) -#define HWMOD_CONTROL_OPT_CLKS_IN_RESET		(1 << 7) -#define HWMOD_16BIT_REG				(1 << 8) - -/* - * omap_hwmod._int_flags definitions - * These are for internal use only and are managed by the omap_hwmod code. - * - * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module - * _HWMOD_WAKEUP_ENABLED: set when the omap_hwmod code has enabled ENAWAKEUP - * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached - */ -#define _HWMOD_NO_MPU_PORT			(1 << 0) -#define _HWMOD_WAKEUP_ENABLED			(1 << 1) -#define _HWMOD_SYSCONFIG_LOADED			(1 << 2) - -/* - * omap_hwmod._state definitions - * - * INITIALIZED: reset (optionally), initialized, enabled, disabled - *              (optionally) - * - * - */ -#define _HWMOD_STATE_UNKNOWN			0 -#define _HWMOD_STATE_REGISTERED			1 -#define _HWMOD_STATE_CLKS_INITED		2 -#define _HWMOD_STATE_INITIALIZED		3 -#define _HWMOD_STATE_ENABLED			4 -#define _HWMOD_STATE_IDLE			5 -#define _HWMOD_STATE_DISABLED			6 - -/** - * struct omap_hwmod_class - the type of an IP block - * @name: name of the hwmod_class - * @sysc: device SYSCONFIG/SYSSTATUS register data - * @rev: revision of the IP class - * - * Represent the class of a OMAP hardware "modules" (e.g. timer, - * smartreflex, gpio, uart...) - */ -struct omap_hwmod_class { -	const char				*name; -	struct omap_hwmod_class_sysconfig	*sysc; -	u32					rev; -}; - -/** - * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks) - * @name: name of the hwmod - * @class: struct omap_hwmod_class * to the class of this hwmod - * @od: struct omap_device currently associated with this hwmod (internal use) - * @mpu_irqs: ptr to an array of MPU IRQs (see also mpu_irqs_cnt) - * @sdma_reqs: ptr to an array of System DMA request IDs (see sdma_reqs_cnt) - * @prcm: PRCM data pertaining to this hwmod - * @main_clk: main clock: OMAP clock name - * @_clk: pointer to the main struct clk (filled in at runtime) - * @opt_clks: other device clocks that drivers can request (0..*) - * @masters: ptr to array of OCP ifs that this hwmod can initiate on - * @slaves: ptr to array of OCP ifs that this hwmod can respond on - * @dev_attr: arbitrary device attributes that can be passed to the driver - * @_sysc_cache: internal-use hwmod flags - * @_mpu_rt_va: cached register target start address (internal use) - * @_mpu_port_index: cached MPU register target slave ID (internal use) - * @msuspendmux_reg_id: CONTROL_MSUSPENDMUX register ID (1-6) - * @msuspendmux_shift: CONTROL_MSUSPENDMUX register bit shift - * @mpu_irqs_cnt: number of @mpu_irqs - * @sdma_reqs_cnt: number of @sdma_reqs - * @opt_clks_cnt: number of @opt_clks - * @master_cnt: number of @master entries - * @slaves_cnt: number of @slave entries - * @response_lat: device OCP response latency (in interface clock cycles) - * @_int_flags: internal-use hwmod flags - * @_state: internal-use hwmod state - * @flags: hwmod flags (documented below) - * @omap_chip: OMAP chips this hwmod is present on - * @_mutex: mutex serializing operations on this hwmod - * @node: list node for hwmod list (internal use) - * - * @main_clk refers to this module's "main clock," which for our - * purposes is defined as "the functional clock needed for register - * accesses to complete."  Modules may not have a main clock if the - * interface clock also serves as a main clock. - * - * Parameter names beginning with an underscore are managed internally by - * the omap_hwmod code and should not be set during initialization. - */ -struct omap_hwmod { -	const char			*name; -	struct omap_hwmod_class		*class; -	struct omap_device		*od; -	struct omap_hwmod_irq_info	*mpu_irqs; -	struct omap_hwmod_dma_info	*sdma_reqs; -	struct omap_hwmod_rst_info	*rst_lines; -	union { -		struct omap_hwmod_omap2_prcm omap2; -		struct omap_hwmod_omap4_prcm omap4; -	}				prcm; -	const char			*main_clk; -	struct clk			*_clk; -	struct omap_hwmod_opt_clk	*opt_clks; -	struct omap_hwmod_ocp_if	**masters; /* connect to *_IA */ -	struct omap_hwmod_ocp_if	**slaves;  /* connect to *_TA */ -	void				*dev_attr; -	u32				_sysc_cache; -	void __iomem			*_mpu_rt_va; -	struct mutex			_mutex; -	struct list_head		node; -	u16				flags; -	u8				_mpu_port_index; -	u8				msuspendmux_reg_id; -	u8				msuspendmux_shift; -	u8				response_lat; -	u8				mpu_irqs_cnt; -	u8				sdma_reqs_cnt; -	u8				rst_lines_cnt; -	u8				opt_clks_cnt; -	u8				masters_cnt; -	u8				slaves_cnt; -	u8				hwmods_cnt; -	u8				_int_flags; -	u8				_state; -	const struct omap_chip_id	omap_chip; -}; - -int omap_hwmod_init(struct omap_hwmod **ohs); -int omap_hwmod_register(struct omap_hwmod *oh); -int omap_hwmod_unregister(struct omap_hwmod *oh); -struct omap_hwmod *omap_hwmod_lookup(const char *name); -int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), -			void *data); -int omap_hwmod_late_init(u8 skip_setup_idle); - -int omap_hwmod_enable(struct omap_hwmod *oh); -int _omap_hwmod_enable(struct omap_hwmod *oh); -int omap_hwmod_idle(struct omap_hwmod *oh); -int _omap_hwmod_idle(struct omap_hwmod *oh); -int omap_hwmod_shutdown(struct omap_hwmod *oh); - -int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name); -int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name); -int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name); - -int omap_hwmod_enable_clocks(struct omap_hwmod *oh); -int omap_hwmod_disable_clocks(struct omap_hwmod *oh); - -int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); - -int omap_hwmod_reset(struct omap_hwmod *oh); -void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); - -void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs); -u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs); - -int omap_hwmod_count_resources(struct omap_hwmod *oh); -int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res); - -struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh); -void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh); - -int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh, -				 struct omap_hwmod *init_oh); -int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh, -				 struct omap_hwmod *init_oh); - -int omap_hwmod_set_clockact_both(struct omap_hwmod *oh); -int omap_hwmod_set_clockact_main(struct omap_hwmod *oh); -int omap_hwmod_set_clockact_iclk(struct omap_hwmod *oh); -int omap_hwmod_set_clockact_none(struct omap_hwmod *oh); - -int omap_hwmod_enable_wakeup(struct omap_hwmod *oh); -int omap_hwmod_disable_wakeup(struct omap_hwmod *oh); - -int omap_hwmod_for_each_by_class(const char *classname, -				 int (*fn)(struct omap_hwmod *oh, -					   void *user), -				 void *user); - -/* - * Chip variant-specific hwmod init routines - XXX should be converted - * to use initcalls once the initial boot ordering is straightened out - */ -extern int omap2420_hwmod_init(void); -extern int omap2430_hwmod_init(void); -extern int omap3xxx_hwmod_init(void); -extern int omap44xx_hwmod_init(void); - -#endif diff --git a/arch/arm/plat-omap/include/plat/onenand.h b/arch/arm/plat-omap/include/plat/onenand.h deleted file mode 100644 index 72f433d7d82..00000000000 --- a/arch/arm/plat-omap/include/plat/onenand.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/onenand.h - * - * Copyright (C) 2006 Nokia Corporation - * Author: Juha Yrjola - * - * 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/mtd/mtd.h> -#include <linux/mtd/partitions.h> - -#define ONENAND_SYNC_READ	(1 << 0) -#define ONENAND_SYNC_READWRITE	(1 << 1) - -struct omap_onenand_platform_data { -	int			cs; -	int			gpio_irq; -	struct mtd_partition	*parts; -	int			nr_parts; -	int                     (*onenand_setup)(void __iomem *, int freq); -	int			dma_channel; -	u8			flags; -}; - -#define ONENAND_MAX_PARTITIONS 8 - -#if defined(CONFIG_MTD_ONENAND_OMAP2) || \ -	defined(CONFIG_MTD_ONENAND_OMAP2_MODULE) - -extern void gpmc_onenand_init(struct omap_onenand_platform_data *d); - -#else - -#define board_onenand_data	NULL - -static inline void gpmc_onenand_init(struct omap_onenand_platform_data *d) -{ -} - -#endif diff --git a/arch/arm/plat-omap/include/plat/param.h b/arch/arm/plat-omap/include/plat/param.h deleted file mode 100644 index 1eb4dc32697..00000000000 --- a/arch/arm/plat-omap/include/plat/param.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - *  arch/arm/plat-omap/include/mach/param.h - * - */ - -#ifdef CONFIG_OMAP_32K_TIMER_HZ -#define HZ	CONFIG_OMAP_32K_TIMER_HZ -#endif diff --git a/arch/arm/plat-omap/include/plat/powerdomain.h b/arch/arm/plat-omap/include/plat/powerdomain.h deleted file mode 100644 index 9ca420dcd2f..00000000000 --- a/arch/arm/plat-omap/include/plat/powerdomain.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * OMAP2/3 powerdomain control - * - * Copyright (C) 2007-2008 Texas Instruments, Inc. - * Copyright (C) 2007-2009 Nokia Corporation - * - * Written by 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. - */ - -#ifndef ASM_ARM_ARCH_OMAP_POWERDOMAIN -#define ASM_ARM_ARCH_OMAP_POWERDOMAIN - -#include <linux/types.h> -#include <linux/list.h> - -#include <asm/atomic.h> - -#include <plat/cpu.h> - - -/* Powerdomain basic power states */ -#define PWRDM_POWER_OFF		0x0 -#define PWRDM_POWER_RET		0x1 -#define PWRDM_POWER_INACTIVE	0x2 -#define PWRDM_POWER_ON		0x3 - -#define PWRDM_MAX_PWRSTS	4 - -/* Powerdomain allowable state bitfields */ -#define PWRSTS_ON		(1 << PWRDM_POWER_ON) -#define PWRSTS_OFF		(1 << PWRDM_POWER_OFF) -#define PWRSTS_OFF_ON		((1 << PWRDM_POWER_OFF) | \ -				 (1 << PWRDM_POWER_ON)) - -#define PWRSTS_OFF_RET		((1 << PWRDM_POWER_OFF) | \ -				 (1 << PWRDM_POWER_RET)) - -#define PWRSTS_RET_ON		((1 << PWRDM_POWER_RET) | \ -				 (1 << PWRDM_POWER_ON)) - -#define PWRSTS_OFF_RET_ON	(PWRSTS_OFF_RET | (1 << PWRDM_POWER_ON)) - - -/* Powerdomain flags */ -#define PWRDM_HAS_HDWR_SAR	(1 << 0) /* hardware save-and-restore support */ -#define PWRDM_HAS_MPU_QUIRK	(1 << 1) /* MPU pwr domain has MEM bank 0 bits -					  * in MEM bank 1 position. This is -					  * true for OMAP3430 -					  */ -#define PWRDM_HAS_LOWPOWERSTATECHANGE	(1 << 2) /* -						  * support to transition from a -						  * sleep state to a lower sleep -						  * state without waking up the -						  * powerdomain -						  */ - -/* - * Number of memory banks that are power-controllable.	On OMAP4430, the - * maximum is 5. - */ -#define PWRDM_MAX_MEM_BANKS	5 - -/* - * Maximum number of clockdomains that can be associated with a powerdomain. - * CORE powerdomain on OMAP4 is the worst case - */ -#define PWRDM_MAX_CLKDMS	9 - -/* XXX A completely arbitrary number. What is reasonable here? */ -#define PWRDM_TRANSITION_BAILOUT 100000 - -struct clockdomain; -struct powerdomain; - -/** - * struct powerdomain - OMAP powerdomain - * @name: Powerdomain name - * @omap_chip: represents the OMAP chip types containing this pwrdm - * @prcm_offs: the address offset from CM_BASE/PRM_BASE - * @pwrsts: Possible powerdomain power states - * @pwrsts_logic_ret: Possible logic power states when pwrdm in RETENTION - * @flags: Powerdomain flags - * @banks: Number of software-controllable memory banks in this powerdomain - * @pwrsts_mem_ret: Possible memory bank pwrstates when pwrdm in RETENTION - * @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON - * @pwrdm_clkdms: Clockdomains in this powerdomain - * @node: list_head linking all powerdomains - * @state: - * @state_counter: - * @timer: - * @state_timer: - */ -struct powerdomain { -	const char *name; -	const struct omap_chip_id omap_chip; -	const s16 prcm_offs; -	const u8 pwrsts; -	const u8 pwrsts_logic_ret; -	const u8 flags; -	const u8 banks; -	const u8 pwrsts_mem_ret[PWRDM_MAX_MEM_BANKS]; -	const u8 pwrsts_mem_on[PWRDM_MAX_MEM_BANKS]; -	struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS]; -	struct list_head node; -	int state; -	unsigned state_counter[PWRDM_MAX_PWRSTS]; -	unsigned ret_logic_off_counter; -	unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS]; - -#ifdef CONFIG_PM_DEBUG -	s64 timer; -	s64 state_timer[PWRDM_MAX_PWRSTS]; -#endif -}; - - -void pwrdm_init(struct powerdomain **pwrdm_list); - -struct powerdomain *pwrdm_lookup(const char *name); - -int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), -			void *user); -int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user), -			void *user); - -int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); -int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); -int pwrdm_for_each_clkdm(struct powerdomain *pwrdm, -			 int (*fn)(struct powerdomain *pwrdm, -				   struct clockdomain *clkdm)); - -int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm); - -int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst); -int pwrdm_read_next_pwrst(struct powerdomain *pwrdm); -int pwrdm_read_pwrst(struct powerdomain *pwrdm); -int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm); -int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm); - -int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst); -int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst); -int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst); - -int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm); -int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm); -int pwrdm_read_logic_retst(struct powerdomain *pwrdm); -int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank); -int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank); -int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank); - -int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm); -int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm); -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); - -#endif 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 ab77442e42a..00000000000 --- a/arch/arm/plat-omap/include/plat/prcm.h +++ /dev/null @@ -1,50 +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 - */ - -#ifndef __ASM_ARM_ARCH_OMAP_PRCM_H -#define __ASM_ARM_ARCH_OMAP_PRCM_H - -u32 omap_prcm_get_reset_sources(void); -void omap_prcm_arch_reset(char mode, const char *cmd); -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, -			 const char *name); - -#define START_PADCONF_SAVE 0x2 -#define PADCONF_SAVE_DONE  0x1 - -void omap3_prcm_save_context(void); -void omap3_prcm_restore_context(void); - -u32 prm_read_mod_reg(s16 module, u16 idx); -void prm_write_mod_reg(u32 val, s16 module, u16 idx); -u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx); -u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask); -u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask); -u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg); -u32 cm_read_mod_reg(s16 module, u16 idx); -void cm_write_mod_reg(u32 val, s16 module, u16 idx); -u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx); - -#endif - - - diff --git a/arch/arm/plat-omap/include/plat/sdrc.h b/arch/arm/plat-omap/include/plat/sdrc.h deleted file mode 100644 index efd87c8dda6..00000000000 --- a/arch/arm/plat-omap/include/plat/sdrc.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef ____ASM_ARCH_SDRC_H -#define ____ASM_ARCH_SDRC_H - -/* - * OMAP2/3 SDRC/SMS register definitions - * - * Copyright (C) 2007-2008 Texas Instruments, Inc. - * Copyright (C) 2007-2008 Nokia Corporation - * - * Tony Lindgren - * Paul Walmsley - * Richard Woodruff - * - * 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 <mach/io.h> - -/* SDRC register offsets - read/write with sdrc_{read,write}_reg() */ - -#define SDRC_SYSCONFIG		0x010 -#define SDRC_CS_CFG		0x040 -#define SDRC_SHARING		0x044 -#define SDRC_ERR_TYPE		0x04C -#define SDRC_DLLA_CTRL		0x060 -#define SDRC_DLLA_STATUS	0x064 -#define SDRC_DLLB_CTRL		0x068 -#define SDRC_DLLB_STATUS	0x06C -#define SDRC_POWER		0x070 -#define SDRC_MCFG_0		0x080 -#define SDRC_MR_0		0x084 -#define SDRC_EMR2_0		0x08c -#define SDRC_ACTIM_CTRL_A_0	0x09c -#define SDRC_ACTIM_CTRL_B_0	0x0a0 -#define SDRC_RFR_CTRL_0		0x0a4 -#define SDRC_MANUAL_0		0x0a8 -#define SDRC_MCFG_1		0x0B0 -#define SDRC_MR_1		0x0B4 -#define SDRC_EMR2_1		0x0BC -#define SDRC_ACTIM_CTRL_A_1	0x0C4 -#define SDRC_ACTIM_CTRL_B_1	0x0C8 -#define SDRC_RFR_CTRL_1		0x0D4 -#define SDRC_MANUAL_1		0x0D8 - -#define SDRC_POWER_AUTOCOUNT_SHIFT	8 -#define SDRC_POWER_AUTOCOUNT_MASK	(0xffff << SDRC_POWER_AUTOCOUNT_SHIFT) -#define SDRC_POWER_CLKCTRL_SHIFT	4 -#define SDRC_POWER_CLKCTRL_MASK		(0x3 << SDRC_POWER_CLKCTRL_SHIFT) -#define SDRC_SELF_REFRESH_ON_AUTOCOUNT	(0x2 << SDRC_POWER_CLKCTRL_SHIFT) - -/* - * These values represent the number of memory clock cycles between - * autorefresh initiation.  They assume 1 refresh per 64 ms (JEDEC), 8192 - * rows per device, and include a subtraction of a 50 cycle window in the - * event that the autorefresh command is delayed due to other SDRC activity. - * The '| 1' sets the ARE field to send one autorefresh when the autorefresh - * counter reaches 0. - * - * These represent optimal values for common parts, it won't work for all. - * As long as you scale down, most parameters are still work, they just - * become sub-optimal. The RFR value goes in the opposite direction. If you - * don't adjust it down as your clock period increases the refresh interval - * will not be met. Setting all parameters for complete worst case may work, - * but may cut memory performance by 2x. Due to errata the DLLs need to be - * unlocked and their value needs run time calibration.	A dynamic call is - * need for that as no single right value exists acorss production samples. - * - * Only the FULL speed values are given. Current code is such that rate - * changes must be made at DPLLoutx2. The actual value adjustment for low - * frequency operation will be handled by omap_set_performance() - * - * By having the boot loader boot up in the fastest L4 speed available likely - * will result in something which you can switch between. - */ -#define SDRC_RFR_CTRL_165MHz	(0x00044c00 | 1) -#define SDRC_RFR_CTRL_133MHz	(0x0003de00 | 1) -#define SDRC_RFR_CTRL_100MHz	(0x0002da01 | 1) -#define SDRC_RFR_CTRL_110MHz	(0x0002da01 | 1) /* Need to calc */ -#define SDRC_RFR_CTRL_BYPASS	(0x00005000 | 1) /* Need to calc */ - - -/* - * SMS register access - */ - -#define OMAP242X_SMS_REGADDR(reg)					\ -		(void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE + reg) -#define OMAP243X_SMS_REGADDR(reg)					\ -		(void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE + reg) -#define OMAP343X_SMS_REGADDR(reg)					\ -		(void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE + reg) - -/* SMS register offsets - read/write with sms_{read,write}_reg() */ - -#define SMS_SYSCONFIG			0x010 -#define SMS_ROT_CONTROL(context)	(0x180 + 0x10 * context) -#define SMS_ROT_SIZE(context)		(0x184 + 0x10 * context) -#define SMS_ROT_PHYSICAL_BA(context)	(0x188 + 0x10 * context) -/* REVISIT: fill in other SMS registers here */ - - -#ifndef __ASSEMBLER__ - -/** - * struct omap_sdrc_params - SDRC parameters for a given SDRC clock rate - * @rate: SDRC clock rate (in Hz) - * @actim_ctrla: Value to program to SDRC_ACTIM_CTRLA for this rate - * @actim_ctrlb: Value to program to SDRC_ACTIM_CTRLB for this rate - * @rfr_ctrl: Value to program to SDRC_RFR_CTRL for this rate - * @mr: Value to program to SDRC_MR for this rate - * - * This structure holds a pre-computed set of register values for the - * SDRC for a given SDRC clock rate and SDRAM chip.  These are - * intended to be pre-computed and specified in an array in the board-*.c - * files.  The structure is keyed off the 'rate' field. - */ -struct omap_sdrc_params { -	unsigned long rate; -	u32 actim_ctrla; -	u32 actim_ctrlb; -	u32 rfr_ctrl; -	u32 mr; -}; - -void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0, -			    struct omap_sdrc_params *sdrc_cs1); -int omap2_sdrc_get_params(unsigned long r, -			  struct omap_sdrc_params **sdrc_cs0, -			  struct omap_sdrc_params **sdrc_cs1); -void omap2_sms_save_context(void); -void omap2_sms_restore_context(void); - -void omap2_sms_write_rot_control(u32 val, unsigned ctx); -void omap2_sms_write_rot_size(u32 val, unsigned ctx); -void omap2_sms_write_rot_physical_ba(u32 val, unsigned ctx); - -#ifdef CONFIG_ARCH_OMAP2 - -struct memory_timings { -	u32 m_type;		/* ddr = 1, sdr = 0 */ -	u32 dll_mode;		/* use lock mode = 1, unlock mode = 0 */ -	u32 slow_dll_ctrl;	/* unlock mode, dll value for slow speed */ -	u32 fast_dll_ctrl;	/* unlock mode, dll value for fast speed */ -	u32 base_cs;		/* base chip select to use for calculations */ -}; - -extern void omap2xxx_sdrc_init_params(u32 force_lock_to_unlock_mode); -struct omap_sdrc_params *rx51_get_sdram_timings(void); - -u32 omap2xxx_sdrc_dll_is_unlocked(void); -u32 omap2xxx_sdrc_reprogram(u32 level, u32 force); - -#endif  /* CONFIG_ARCH_OMAP2 */ - -#endif  /* __ASSEMBLER__ */ - -#endif diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h deleted file mode 100644 index 19145f5c32b..00000000000 --- a/arch/arm/plat-omap/include/plat/serial.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/serial.h - * - * Copyright (C) 2009 Texas Instruments - * Addded OMAP4 support- Santosh Shilimkar <santosh.shilimkar@ti.com> - * - * 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. - */ - -#ifndef __ASM_ARCH_SERIAL_H -#define __ASM_ARCH_SERIAL_H - -#include <linux/init.h> - -/* - * Memory entry used for the DEBUG_LL UART configuration. See also - * uncompress.h and debug-macro.S. - * - * Note that using a memory location for storing the UART configuration - * has at least two limitations: - * - * 1. Kernel uncompress code cannot overlap OMAP_UART_INFO as the - *    uncompress code could then partially overwrite itself - * 2. We assume printascii is called at least once before paging_init, - *    and addruart has a chance to read OMAP_UART_INFO - */ -#define OMAP_UART_INFO		(PHYS_OFFSET + 0x3ffc) - -/* OMAP1 serial ports */ -#define OMAP1_UART1_BASE	0xfffb0000 -#define OMAP1_UART2_BASE	0xfffb0800 -#define OMAP1_UART3_BASE	0xfffb9800 - -/* OMAP2 serial ports */ -#define OMAP2_UART1_BASE	0x4806a000 -#define OMAP2_UART2_BASE	0x4806c000 -#define OMAP2_UART3_BASE	0x4806e000 - -/* OMAP3 serial ports */ -#define OMAP3_UART1_BASE	OMAP2_UART1_BASE -#define OMAP3_UART2_BASE	OMAP2_UART2_BASE -#define OMAP3_UART3_BASE	0x49020000 -#define OMAP3_UART4_BASE	0x49042000	/* Only on 36xx */ - -/* OMAP4 serial ports */ -#define OMAP4_UART1_BASE	OMAP2_UART1_BASE -#define OMAP4_UART2_BASE	OMAP2_UART2_BASE -#define OMAP4_UART3_BASE	0x48020000 -#define OMAP4_UART4_BASE	0x4806e000 - -/* External port on Zoom2/3 */ -#define ZOOM_UART_BASE		0x10000000 -#define ZOOM_UART_VIRT		0xfa400000 - -#define OMAP_PORT_SHIFT		2 -#define OMAP7XX_PORT_SHIFT	0 -#define ZOOM_PORT_SHIFT		1 - -#define OMAP1510_BASE_BAUD	(12000000/16) -#define OMAP16XX_BASE_BAUD	(48000000/16) -#define OMAP24XX_BASE_BAUD	(48000000/16) - -/* - * DEBUG_LL port encoding stored into the UART1 scratchpad register by - * decomp_setup in uncompress.h - */ -#define OMAP1UART1		11 -#define OMAP1UART2		12 -#define OMAP1UART3		13 -#define OMAP2UART1		21 -#define OMAP2UART2		22 -#define OMAP2UART3		23 -#define OMAP3UART1		OMAP2UART1 -#define OMAP3UART2		OMAP2UART2 -#define OMAP3UART3		33 -#define OMAP3UART4		34		/* Only on 36xx */ -#define OMAP4UART1		OMAP2UART1 -#define OMAP4UART2		OMAP2UART2 -#define OMAP4UART3		43 -#define OMAP4UART4		44 -#define ZOOM_UART		95		/* Only on zoom2/3 */ - -/* This is only used by 8250.c for omap1510 */ -#define is_omap_port(pt)	({int __ret = 0;			\ -			if ((pt)->port.mapbase == OMAP1_UART1_BASE ||	\ -			    (pt)->port.mapbase == OMAP1_UART2_BASE ||	\ -			    (pt)->port.mapbase == OMAP1_UART3_BASE)	\ -				__ret = 1;				\ -			__ret;						\ -			}) - -#ifndef __ASSEMBLER__ -extern void __init omap_serial_early_init(void); -extern void omap_serial_init(void); -extern void omap_serial_init_port(int port); -extern int omap_uart_can_sleep(void); -extern void omap_uart_check_wakeup(void); -extern void omap_uart_prepare_suspend(void); -extern void omap_uart_prepare_idle(int num); -extern void omap_uart_resume_idle(int num); -extern void omap_uart_enable_irqs(int enable); -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/smp.h b/arch/arm/plat-omap/include/plat/smp.h deleted file mode 100644 index ecd6a488c49..00000000000 --- a/arch/arm/plat-omap/include/plat/smp.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * OMAP4 machine specific smp.h - * - * Copyright (C) 2009 Texas Instruments, Inc. - * - * Author: - *	Santosh Shilimkar <santosh.shilimkar@ti.com> - * - * Interface functions needed for the SMP. This file is based on arm - * realview smp platform. - * Copyright (c) 2003 ARM Limited. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef OMAP_ARCH_SMP_H -#define OMAP_ARCH_SMP_H - -#include <asm/hardware/gic.h> -#include <asm/smp_mpidr.h> - -/* Needed for secondary core boot */ -extern void omap_secondary_startup(void); -extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask); -extern void omap_auxcoreboot_addr(u32 cpu_addr); -extern u32 omap_read_auxcoreboot0(void); - -/* - * We use Soft IRQ1 as the IPI - */ -static inline void smp_cross_call(const struct cpumask *mask) -{ -	gic_raise_softirq(mask, 1); -} - -#endif diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h index 5905100b29a..ba4525059a9 100644 --- a/arch/arm/plat-omap/include/plat/sram.h +++ b/arch/arm/plat-omap/include/plat/sram.h @@ -1,77 +1,16 @@ -/* - * arch/arm/plat-omap/include/mach/sram.h - * - * Interface for functions that need to be run in internal SRAM - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __ARCH_ARM_OMAP_SRAM_H -#define __ARCH_ARM_OMAP_SRAM_H - -extern void * omap_sram_push(void * start, unsigned long size); -extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl); - -extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, -				u32 base_cs, u32 force_unlock); -extern void omap2_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, -				      u32 mem_type); -extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass); - -extern u32 omap3_configure_core_dpll( -			u32 m2, u32 unlock_dll, u32 f, u32 inc, -			u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, -			u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, -			u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, -			u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); -extern void omap3_sram_restore_context(void); - -/* Do not use these */ -extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); -extern unsigned long omap1_sram_reprogram_clock_sz; - -extern void omap24xx_sram_reprogram_clock(u32 ckctl, u32 dpllctl); -extern unsigned long omap24xx_sram_reprogram_clock_sz; - -extern void omap242x_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, -						u32 base_cs, u32 force_unlock); -extern unsigned long omap242x_sram_ddr_init_sz; - -extern u32 omap242x_sram_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, -						int bypass); -extern unsigned long omap242x_sram_set_prcm_sz; - -extern void omap242x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, -						u32 mem_type); -extern unsigned long omap242x_sram_reprogram_sdrc_sz; - - -extern void omap243x_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, -						u32 base_cs, u32 force_unlock); -extern unsigned long omap243x_sram_ddr_init_sz; - -extern u32 omap243x_sram_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, -						int bypass); -extern unsigned long omap243x_sram_set_prcm_sz; - -extern void omap243x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, -						u32 mem_type); -extern unsigned long omap243x_sram_reprogram_sdrc_sz; - -extern u32 omap3_sram_configure_core_dpll( -			u32 m2, u32 unlock_dll, u32 f, u32 inc, -			u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, -			u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, -			u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, -			u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); -extern unsigned long omap3_sram_configure_core_dpll_sz; - -#ifdef CONFIG_PM -extern void omap_push_sram_idle(void); -#else -static inline void omap_push_sram_idle(void) {} -#endif /* CONFIG_PM */ - -#endif +int omap_sram_init(void); + +void omap_map_sram(unsigned long start, unsigned long size, +			unsigned long skip, int cached); +void omap_sram_reset(void); + +extern void *omap_sram_push_address(unsigned long size); + +/* Macro to push a function to the internal SRAM, using the fncpy API */ +#define omap_sram_push(funcp, size) ({				\ +	typeof(&(funcp)) _res = NULL;				\ +	void *_sram_address = omap_sram_push_address(size);	\ +	if (_sram_address)					\ +		_res = fncpy(_sram_address, &(funcp), size);	\ +	_res;							\ +}) diff --git a/arch/arm/plat-omap/include/plat/system.h b/arch/arm/plat-omap/include/plat/system.h deleted file mode 100644 index d0a119f735b..00000000000 --- a/arch/arm/plat-omap/include/plat/system.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copied from arch/arm/mach-sa1100/include/mach/system.h - * Copyright (c) 1999 Nicolas Pitre <nico@fluxnic.net> - */ -#ifndef __ASM_ARCH_SYSTEM_H -#define __ASM_ARCH_SYSTEM_H -#include <linux/clk.h> - -#include <asm/mach-types.h> -#include <mach/hardware.h> - -#include <plat/prcm.h> - -#ifndef CONFIG_MACH_VOICEBLUE -#define voiceblue_reset()		do {} while (0) -#else -extern void voiceblue_reset(void); -#endif - -static inline void arch_idle(void) -{ -	cpu_do_idle(); -} - -static inline void omap1_arch_reset(char mode, const char *cmd) -{ -	/* -	 * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 -	 * "Global Software Reset Affects Traffic Controller Frequency". -	 */ -	if (cpu_is_omap5912()) { -		omap_writew(omap_readw(DPLL_CTL) & ~(1 << 4), -				 DPLL_CTL); -		omap_writew(0x8, ARM_RSTCT1); -	} - -	if (machine_is_voiceblue()) -		voiceblue_reset(); -	else -		omap_writew(1, ARM_RSTCT1); -} - -static inline void arch_reset(char mode, const char *cmd) -{ -	if (!cpu_class_is_omap2()) -		omap1_arch_reset(mode, cmd); -	else -		omap_prcm_arch_reset(mode, cmd); -} - -#endif diff --git a/arch/arm/plat-omap/include/plat/tc.h b/arch/arm/plat-omap/include/plat/tc.h deleted file mode 100644 index d2fcd789bb9..00000000000 --- a/arch/arm/plat-omap/include/plat/tc.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/tc.h - * - * OMAP Traffic Controller - * - * Copyright (C) 2004 Nokia Corporation - * Author: Imre Deak <imre.deak@nokia.com> - * - * 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. - */ - -#ifndef __ASM_ARCH_TC_H -#define __ASM_ARCH_TC_H - -#define TCMIF_BASE		0xfffecc00 -#define OMAP_TC_OCPT1_PRIOR	(TCMIF_BASE + 0x00) -#define OMAP_TC_EMIFS_PRIOR	(TCMIF_BASE + 0x04) -#define OMAP_TC_EMIFF_PRIOR	(TCMIF_BASE + 0x08) -#define EMIFS_CONFIG		(TCMIF_BASE + 0x0c) -#define EMIFS_CS0_CONFIG	(TCMIF_BASE + 0x10) -#define EMIFS_CS1_CONFIG	(TCMIF_BASE + 0x14) -#define EMIFS_CS2_CONFIG	(TCMIF_BASE + 0x18) -#define EMIFS_CS3_CONFIG	(TCMIF_BASE + 0x1c) -#define EMIFF_SDRAM_CONFIG	(TCMIF_BASE + 0x20) -#define EMIFF_MRS		(TCMIF_BASE + 0x24) -#define TC_TIMEOUT1		(TCMIF_BASE + 0x28) -#define TC_TIMEOUT2		(TCMIF_BASE + 0x2c) -#define TC_TIMEOUT3		(TCMIF_BASE + 0x30) -#define TC_ENDIANISM		(TCMIF_BASE + 0x34) -#define EMIFF_SDRAM_CONFIG_2	(TCMIF_BASE + 0x3c) -#define EMIF_CFG_DYNAMIC_WS	(TCMIF_BASE + 0x40) -#define EMIFS_ACS0		(TCMIF_BASE + 0x50) -#define EMIFS_ACS1		(TCMIF_BASE + 0x54) -#define EMIFS_ACS2		(TCMIF_BASE + 0x58) -#define EMIFS_ACS3		(TCMIF_BASE + 0x5c) -#define OMAP_TC_OCPT2_PRIOR	(TCMIF_BASE + 0xd0) - -/* external EMIFS chipselect regions */ -#define	OMAP_CS0_PHYS		0x00000000 -#define	OMAP_CS0_SIZE		SZ_64M - -#define	OMAP_CS1_PHYS		0x04000000 -#define	OMAP_CS1_SIZE		SZ_64M - -#define	OMAP_CS1A_PHYS		OMAP_CS1_PHYS -#define	OMAP_CS1A_SIZE		SZ_32M - -#define	OMAP_CS1B_PHYS		(OMAP_CS1A_PHYS + OMAP_CS1A_SIZE) -#define	OMAP_CS1B_SIZE		SZ_32M - -#define	OMAP_CS2_PHYS		0x08000000 -#define	OMAP_CS2_SIZE		SZ_64M - -#define	OMAP_CS2A_PHYS		OMAP_CS2_PHYS -#define	OMAP_CS2A_SIZE		SZ_32M - -#define	OMAP_CS2B_PHYS		(OMAP_CS2A_PHYS + OMAP_CS2A_SIZE) -#define	OMAP_CS2B_SIZE		SZ_32M - -#define	OMAP_CS3_PHYS		0x0c000000 -#define	OMAP_CS3_SIZE		SZ_64M - -#ifndef	__ASSEMBLER__ - -/* EMIF Slow Interface Configuration Register */ -#define OMAP_EMIFS_CONFIG_FR		(1 << 4) -#define OMAP_EMIFS_CONFIG_PDE		(1 << 3) -#define OMAP_EMIFS_CONFIG_PWD_EN	(1 << 2) -#define OMAP_EMIFS_CONFIG_BM		(1 << 1) -#define OMAP_EMIFS_CONFIG_WP		(1 << 0) - -#define EMIFS_CCS(n)		(EMIFS_CS0_CONFIG + (4 * (n))) -#define EMIFS_ACS(n)		(EMIFS_ACS0 + (4 * (n))) - -/* Almost all documentation for chip and board memory maps assumes - * BM is clear.  Most devel boards have a switch to control booting - * from NOR flash (using external chipselect 3) rather than mask ROM, - * which uses BM to interchange the physical CS0 and CS3 addresses. - */ -static inline u32 omap_cs0_phys(void) -{ -	return (omap_readl(EMIFS_CONFIG) & OMAP_EMIFS_CONFIG_BM) -			?  OMAP_CS3_PHYS : 0; -} - -static inline u32 omap_cs3_phys(void) -{ -	return (omap_readl(EMIFS_CONFIG) & OMAP_EMIFS_CONFIG_BM) -			? 0 : OMAP_CS3_PHYS; -} - -#endif	/* __ASSEMBLER__ */ - -#endif	/* __ASM_ARCH_TC_H */ diff --git a/arch/arm/plat-omap/include/plat/timex.h b/arch/arm/plat-omap/include/plat/timex.h deleted file mode 100644 index 6d35767bc48..00000000000 --- a/arch/arm/plat-omap/include/plat/timex.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/timex.h - * - * Copyright (C) 2000 RidgeRun, Inc. - * Author:  Greg Lonnon <glonnon@ridgerun.com> - * - * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(__ASM_ARCH_OMAP_TIMEX_H) -#define __ASM_ARCH_OMAP_TIMEX_H - -/* - * OMAP 32KHz timer updates time one jiffie at a time from a secondary timer, - * and that's why the CLOCK_TICK_RATE is not 32768. - */ -#ifdef CONFIG_OMAP_32K_TIMER -#define CLOCK_TICK_RATE		(CONFIG_OMAP_32K_TIMER_HZ) -#else -#define CLOCK_TICK_RATE		(HZ * 100000UL) -#endif - -#endif /* __ASM_ARCH_OMAP_TIMEX_H */ diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h deleted file mode 100644 index 9036e374e0a..00000000000 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * arch/arm/plat-omap/include/mach/uncompress.h - * - * Serial port stubs for kernel decompress status messages - * - * Initially based on: - * linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h - * Copyright (C) 2000 RidgeRun, Inc. - * Author: Greg Lonnon <glonnon@ridgerun.com> - * - * Rewritten by: - * Author: <source@mvista.com> - * 2004 (c) MontaVista Software, Inc. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include <linux/types.h> -#include <linux/serial_reg.h> - -#include <asm/memory.h> -#include <asm/mach-types.h> - -#include <plat/serial.h> - -#define MDR1_MODE_MASK			0x07 - -static volatile u8 *uart_base; -static int uart_shift; - -/* - * Store the DEBUG_LL uart number into memory. - * See also debug-macro.S, and serial.c for related code. - */ -static void set_omap_uart_info(unsigned char port) -{ -	*(volatile u32 *)OMAP_UART_INFO = port; -} - -static void putc(int c) -{ -	if (!uart_base) -		return; - -	/* Check for UART 16x mode */ -	if ((uart_base[UART_OMAP_MDR1 << uart_shift] & MDR1_MODE_MASK) != 0) -		return; - -	while (!(uart_base[UART_LSR << uart_shift] & UART_LSR_THRE)) -		barrier(); -	uart_base[UART_TX << uart_shift] = c; -} - -static inline void flush(void) -{ -} - -/* - * Macros to configure UART1 and debug UART - */ -#define _DEBUG_LL_ENTRY(mach, dbg_uart, dbg_shft, dbg_id)		\ -	if (machine_is_##mach()) {					\ -		uart_base = (volatile u8 *)(dbg_uart);			\ -		uart_shift = (dbg_shft);				\ -		port = (dbg_id);					\ -		set_omap_uart_info(port);				\ -		break;							\ -	} - -#define DEBUG_LL_OMAP7XX(p, mach)					\ -	_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT,	\ -		OMAP1UART##p) - -#define DEBUG_LL_OMAP1(p, mach)						\ -	_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT,	\ -		OMAP1UART##p) - -#define DEBUG_LL_OMAP2(p, mach)						\ -	_DEBUG_LL_ENTRY(mach, OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT,	\ -		OMAP2UART##p) - -#define DEBUG_LL_OMAP3(p, mach)						\ -	_DEBUG_LL_ENTRY(mach, OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT,	\ -		OMAP3UART##p) - -#define DEBUG_LL_OMAP4(p, mach)						\ -	_DEBUG_LL_ENTRY(mach, OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT,	\ -		OMAP4UART##p) - -/* Zoom2/3 shift is different for UART1 and external port */ -#define DEBUG_LL_ZOOM(mach)						\ -	_DEBUG_LL_ENTRY(mach, ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART) - -static inline void __arch_decomp_setup(unsigned long arch_id) -{ -	int port = 0; - -	/* -	 * Initialize the port based on the machine ID from the bootloader. -	 * Note that we're using macros here instead of switch statement -	 * as machine_is functions are optimized out for the boards that -	 * are not selected. -	 */ -	do { -		/* omap7xx/8xx based boards using UART1 with shift 0 */ -		DEBUG_LL_OMAP7XX(1, herald); -		DEBUG_LL_OMAP7XX(1, omap_perseus2); - -		/* omap15xx/16xx based boards using UART1 */ -		DEBUG_LL_OMAP1(1, ams_delta); -		DEBUG_LL_OMAP1(1, nokia770); -		DEBUG_LL_OMAP1(1, omap_h2); -		DEBUG_LL_OMAP1(1, omap_h3); -		DEBUG_LL_OMAP1(1, omap_innovator); -		DEBUG_LL_OMAP1(1, omap_osk); -		DEBUG_LL_OMAP1(1, omap_palmte); -		DEBUG_LL_OMAP1(1, omap_palmz71); - -		/* omap15xx/16xx based boards using UART2 */ -		DEBUG_LL_OMAP1(2, omap_palmtt); - -		/* omap15xx/16xx based boards using UART3 */ -		DEBUG_LL_OMAP1(3, sx1); - -		/* omap2 based boards using UART1 */ -		DEBUG_LL_OMAP2(1, omap2evm); -		DEBUG_LL_OMAP2(1, omap_2430sdp); -		DEBUG_LL_OMAP2(1, omap_apollon); -		DEBUG_LL_OMAP2(1, omap_h4); - -		/* omap2 based boards using UART3 */ -		DEBUG_LL_OMAP2(3, nokia_n800); -		DEBUG_LL_OMAP2(3, nokia_n810); -		DEBUG_LL_OMAP2(3, nokia_n810_wimax); - -		/* omap3 based boards using UART1 */ -		DEBUG_LL_OMAP2(1, omap3evm); -		DEBUG_LL_OMAP3(1, omap_3430sdp); -		DEBUG_LL_OMAP3(1, omap_3630sdp); -		DEBUG_LL_OMAP3(1, omap3530_lv_som); -		DEBUG_LL_OMAP3(1, omap3_torpedo); - -		/* omap3 based boards using UART3 */ -		DEBUG_LL_OMAP3(3, cm_t35); -		DEBUG_LL_OMAP3(3, cm_t3517); -		DEBUG_LL_OMAP3(3, igep0020); -		DEBUG_LL_OMAP3(3, igep0030); -		DEBUG_LL_OMAP3(3, nokia_rx51); -		DEBUG_LL_OMAP3(3, omap3517evm); -		DEBUG_LL_OMAP3(3, omap3_beagle); -		DEBUG_LL_OMAP3(3, omap3_pandora); -		DEBUG_LL_OMAP3(3, omap_ldp); -		DEBUG_LL_OMAP3(3, overo); -		DEBUG_LL_OMAP3(3, touchbook); - -		/* omap4 based boards using UART3 */ -		DEBUG_LL_OMAP4(3, omap_4430sdp); -		DEBUG_LL_OMAP4(3, omap4_panda); - -		/* zoom2/3 external uart */ -		DEBUG_LL_ZOOM(omap_zoom2); -		DEBUG_LL_ZOOM(omap_zoom3); - -	} while (0); -} - -#define arch_decomp_setup()	__arch_decomp_setup(arch_id) - -/* - * nothing to do - */ -#define arch_decomp_wdog() diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h deleted file mode 100644 index 59c7fe731f2..00000000000 --- a/arch/arm/plat-omap/include/plat/usb.h +++ /dev/null @@ -1,263 +0,0 @@ -// include/asm-arm/mach-omap/usb.h - -#ifndef	__ASM_ARCH_OMAP_USB_H -#define	__ASM_ARCH_OMAP_USB_H - -#include <linux/usb/musb.h> -#include <plat/board.h> - -#define OMAP3_HS_USB_PORTS	3 -enum ehci_hcd_omap_mode { -	EHCI_HCD_OMAP_MODE_UNKNOWN, -	EHCI_HCD_OMAP_MODE_PHY, -	EHCI_HCD_OMAP_MODE_TLL, -}; - -enum ohci_omap3_port_mode { -	OMAP_OHCI_PORT_MODE_UNUSED, -	OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0, -	OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM, -	OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0, -	OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM, -	OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0, -	OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM, -	OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0, -	OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM, -	OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0, -	OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM, -}; - -struct ehci_hcd_omap_platform_data { -	enum ehci_hcd_omap_mode		port_mode[OMAP3_HS_USB_PORTS]; -	unsigned			phy_reset:1; - -	/* have to be valid if phy_reset is true and portx is in phy mode */ -	int	reset_gpio_port[OMAP3_HS_USB_PORTS]; -}; - -struct ohci_hcd_omap_platform_data { -	enum ohci_omap3_port_mode	port_mode[OMAP3_HS_USB_PORTS]; - -	/* Set this to true for ES2.x silicon */ -	unsigned			es2_compatibility:1; -}; - -/*-------------------------------------------------------------------------*/ - -#define OMAP1_OTG_BASE			0xfffb0400 -#define OMAP1_UDC_BASE			0xfffb4000 -#define OMAP1_OHCI_BASE			0xfffba000 - -#define OMAP2_OHCI_BASE			0x4805e000 -#define OMAP2_UDC_BASE			0x4805e200 -#define OMAP2_OTG_BASE			0x4805e300 - -#ifdef CONFIG_ARCH_OMAP1 - -#define OTG_BASE			OMAP1_OTG_BASE -#define UDC_BASE			OMAP1_UDC_BASE -#define OMAP_OHCI_BASE			OMAP1_OHCI_BASE - -#else - -#define OTG_BASE			OMAP2_OTG_BASE -#define UDC_BASE			OMAP2_UDC_BASE -#define OMAP_OHCI_BASE			OMAP2_OHCI_BASE - -struct omap_musb_board_data { -	u8	interface_type; -	u8	mode; -	u16	power; -	unsigned extvbus:1; -}; - -enum musb_interface    {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI}; - -extern void usb_musb_init(struct omap_musb_board_data *board_data); - -extern void usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata); - -extern void usb_ohci_init(const struct ohci_hcd_omap_platform_data *pdata); - -#endif - - -/* - * FIXME correct answer depends on hmc_mode, - * as does (on omap1) any nonzero value for config->otg port number - */ -#ifdef	CONFIG_USB_GADGET_OMAP -#define	is_usb0_device(config)	1 -#else -#define	is_usb0_device(config)	0 -#endif - -void omap_otg_init(struct omap_usb_config *config); - -#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE) -void omap1_usb_init(struct omap_usb_config *pdata); -#else -static inline void omap1_usb_init(struct omap_usb_config *pdata) -{ -} -#endif - -#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP_OTG_MODULE) -void omap2_usbfs_init(struct omap_usb_config *pdata); -#else -static inline void omap2_usbfs_init(struct omap_usb_config *pdata) -{ -} -#endif - -/*-------------------------------------------------------------------------*/ - -/* - * OTG and transceiver registers, for OMAPs starting with ARM926 - */ -#define OTG_REV				(OTG_BASE + 0x00) -#define OTG_SYSCON_1			(OTG_BASE + 0x04) -#	define	 USB2_TRX_MODE(w)	(((w)>>24)&0x07) -#	define	 USB1_TRX_MODE(w)	(((w)>>20)&0x07) -#	define	 USB0_TRX_MODE(w)	(((w)>>16)&0x07) -#	define	 OTG_IDLE_EN		(1 << 15) -#	define	 HST_IDLE_EN		(1 << 14) -#	define	 DEV_IDLE_EN		(1 << 13) -#	define	 OTG_RESET_DONE		(1 << 2) -#	define	 OTG_SOFT_RESET		(1 << 1) -#define OTG_SYSCON_2			(OTG_BASE + 0x08) -#	define	 OTG_EN			(1 << 31) -#	define	 USBX_SYNCHRO		(1 << 30) -#	define	 OTG_MST16		(1 << 29) -#	define	 SRP_GPDATA		(1 << 28) -#	define	 SRP_GPDVBUS		(1 << 27) -#	define	 SRP_GPUVBUS(w)		(((w)>>24)&0x07) -#	define	 A_WAIT_VRISE(w)	(((w)>>20)&0x07) -#	define	 B_ASE_BRST(w)		(((w)>>16)&0x07) -#	define	 SRP_DPW		(1 << 14) -#	define	 SRP_DATA		(1 << 13) -#	define	 SRP_VBUS		(1 << 12) -#	define	 OTG_PADEN		(1 << 10) -#	define	 HMC_PADEN		(1 << 9) -#	define	 UHOST_EN		(1 << 8) -#	define	 HMC_TLLSPEED		(1 << 7) -#	define	 HMC_TLLATTACH		(1 << 6) -#	define	 OTG_HMC(w)		(((w)>>0)&0x3f) -#define OTG_CTRL			(OTG_BASE + 0x0c) -#	define	 OTG_USB2_EN		(1 << 29) -#	define	 OTG_USB2_DP		(1 << 28) -#	define	 OTG_USB2_DM		(1 << 27) -#	define	 OTG_USB1_EN		(1 << 26) -#	define	 OTG_USB1_DP		(1 << 25) -#	define	 OTG_USB1_DM		(1 << 24) -#	define	 OTG_USB0_EN		(1 << 23) -#	define	 OTG_USB0_DP		(1 << 22) -#	define	 OTG_USB0_DM		(1 << 21) -#	define	 OTG_ASESSVLD		(1 << 20) -#	define	 OTG_BSESSEND		(1 << 19) -#	define	 OTG_BSESSVLD		(1 << 18) -#	define	 OTG_VBUSVLD		(1 << 17) -#	define	 OTG_ID			(1 << 16) -#	define	 OTG_DRIVER_SEL		(1 << 15) -#	define	 OTG_A_SETB_HNPEN	(1 << 12) -#	define	 OTG_A_BUSREQ		(1 << 11) -#	define	 OTG_B_HNPEN		(1 << 9) -#	define	 OTG_B_BUSREQ		(1 << 8) -#	define	 OTG_BUSDROP		(1 << 7) -#	define	 OTG_PULLDOWN		(1 << 5) -#	define	 OTG_PULLUP		(1 << 4) -#	define	 OTG_DRV_VBUS		(1 << 3) -#	define	 OTG_PD_VBUS		(1 << 2) -#	define	 OTG_PU_VBUS		(1 << 1) -#	define	 OTG_PU_ID		(1 << 0) -#define OTG_IRQ_EN			(OTG_BASE + 0x10)	/* 16-bit */ -#	define	 DRIVER_SWITCH		(1 << 15) -#	define	 A_VBUS_ERR		(1 << 13) -#	define	 A_REQ_TMROUT		(1 << 12) -#	define	 A_SRP_DETECT		(1 << 11) -#	define	 B_HNP_FAIL		(1 << 10) -#	define	 B_SRP_TMROUT		(1 << 9) -#	define	 B_SRP_DONE		(1 << 8) -#	define	 B_SRP_STARTED		(1 << 7) -#	define	 OPRT_CHG		(1 << 0) -#define OTG_IRQ_SRC			(OTG_BASE + 0x14)	/* 16-bit */ -	// same bits as in IRQ_EN -#define OTG_OUTCTRL			(OTG_BASE + 0x18)	/* 16-bit */ -#	define	 OTGVPD			(1 << 14) -#	define	 OTGVPU			(1 << 13) -#	define	 OTGPUID		(1 << 12) -#	define	 USB2VDR		(1 << 10) -#	define	 USB2PDEN		(1 << 9) -#	define	 USB2PUEN		(1 << 8) -#	define	 USB1VDR		(1 << 6) -#	define	 USB1PDEN		(1 << 5) -#	define	 USB1PUEN		(1 << 4) -#	define	 USB0VDR		(1 << 2) -#	define	 USB0PDEN		(1 << 1) -#	define	 USB0PUEN		(1 << 0) -#define OTG_TEST			(OTG_BASE + 0x20)	/* 16-bit */ -#define OTG_VENDOR_CODE			(OTG_BASE + 0xfc)	/* 16-bit */ - -/*-------------------------------------------------------------------------*/ - -/* OMAP1 */ -#define	USB_TRANSCEIVER_CTRL		(0xfffe1000 + 0x0064) -#	define	CONF_USB2_UNI_R		(1 << 8) -#	define	CONF_USB1_UNI_R		(1 << 7) -#	define	CONF_USB_PORT0_R(x)	(((x)>>4)&0x7) -#	define	CONF_USB0_ISOLATE_R	(1 << 3) -#	define	CONF_USB_PWRDN_DM_R	(1 << 2) -#	define	CONF_USB_PWRDN_DP_R	(1 << 1) - -/* OMAP2 */ -#	define	USB_UNIDIR			0x0 -#	define	USB_UNIDIR_TLL			0x1 -#	define	USB_BIDIR			0x2 -#	define	USB_BIDIR_TLL			0x3 -#	define	USBTXWRMODEI(port, x)	((x) << (22 - (port * 2))) -#	define	USBT2TLL5PI		(1 << 17) -#	define	USB0PUENACTLOI		(1 << 16) -#	define	USBSTANDBYCTRL		(1 << 15) -/* AM35x */ -/* USB 2.0 PHY Control */ -#define CONF2_PHY_GPIOMODE	(1 << 23) -#define CONF2_OTGMODE		(3 << 14) -#define CONF2_NO_OVERRIDE	(0 << 14) -#define CONF2_FORCE_HOST	(1 << 14) -#define CONF2_FORCE_DEVICE	(2 << 14) -#define CONF2_FORCE_HOST_VBUS_LOW (3 << 14) -#define CONF2_SESENDEN		(1 << 13) -#define CONF2_VBDTCTEN		(1 << 12) -#define CONF2_REFFREQ_24MHZ	(2 << 8) -#define CONF2_REFFREQ_26MHZ	(7 << 8) -#define CONF2_REFFREQ_13MHZ	(6 << 8) -#define CONF2_REFFREQ		(0xf << 8) -#define CONF2_PHYCLKGD		(1 << 7) -#define CONF2_VBUSSENSE		(1 << 6) -#define CONF2_PHY_PLLON		(1 << 5) -#define CONF2_RESET		(1 << 4) -#define CONF2_PHYPWRDN		(1 << 3) -#define CONF2_OTGPWRDN		(1 << 2) -#define CONF2_DATPOL		(1 << 1) - -#if defined(CONFIG_ARCH_OMAP1) && defined(CONFIG_USB) -u32 omap1_usb0_init(unsigned nwires, unsigned is_device); -u32 omap1_usb1_init(unsigned nwires); -u32 omap1_usb2_init(unsigned nwires, unsigned alt_pingroup); -#else -static inline u32 omap1_usb0_init(unsigned nwires, unsigned is_device) -{ -	return 0; -} -static inline u32 omap1_usb1_init(unsigned nwires) -{ -	return 0; - -} -static inline u32 omap1_usb2_init(unsigned nwires, unsigned alt_pingroup) -{ -	return 0; -} -#endif - -#endif	/* __ASM_ARCH_OMAP_USB_H */ diff --git a/arch/arm/plat-omap/include/plat/vram.h b/arch/arm/plat-omap/include/plat/vram.h deleted file mode 100644 index 0aa4ecd12c7..00000000000 --- a/arch/arm/plat-omap/include/plat/vram.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * VRAM manager for OMAP - * - * Copyright (C) 2009 Nokia Corporation - * Author: Tomi Valkeinen <tomi.valkeinen@nokia.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., - * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. - */ - -#ifndef __OMAP_VRAM_H__ -#define __OMAP_VRAM_H__ - -#include <linux/types.h> - -#define OMAP_VRAM_MEMTYPE_SDRAM		0 -#define OMAP_VRAM_MEMTYPE_SRAM		1 -#define OMAP_VRAM_MEMTYPE_MAX		1 - -extern int omap_vram_add_region(unsigned long paddr, size_t size); -extern int omap_vram_free(unsigned long paddr, size_t size); -extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr); -extern int omap_vram_reserve(unsigned long paddr, size_t size); -extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram, -		unsigned long *largest_free_block); - -#ifdef CONFIG_OMAP2_VRAM -extern void omap_vram_set_sdram_vram(u32 size, u32 start); -extern void omap_vram_set_sram_vram(u32 size, u32 start); - -extern void omap_vram_reserve_sdram_memblock(void); -extern unsigned long omap_vram_reserve_sram(unsigned long sram_pstart, -					    unsigned long sram_vstart, -					    unsigned long sram_size, -					    unsigned long pstart_avail, -					    unsigned long size_avail); -#else -static inline void omap_vram_set_sdram_vram(u32 size, u32 start) { } -static inline void omap_vram_set_sram_vram(u32 size, u32 start) { } - -static inline void omap_vram_reserve_sdram_memblock(void) { } -static inline unsigned long omap_vram_reserve_sram(unsigned long sram_pstart, -					    unsigned long sram_vstart, -					    unsigned long sram_size, -					    unsigned long pstart_avail, -					    unsigned long size_avail) -{ -	return 0; -} -#endif - -#endif diff --git a/arch/arm/plat-omap/include/plat/vrfb.h b/arch/arm/plat-omap/include/plat/vrfb.h deleted file mode 100644 index 3792bdea2f6..00000000000 --- a/arch/arm/plat-omap/include/plat/vrfb.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * VRFB Rotation Engine - * - * Copyright (C) 2009 Nokia Corporation - * Author: Tomi Valkeinen <tomi.valkeinen@nokia.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., - * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. - */ - -#ifndef __OMAP_VRFB_H__ -#define __OMAP_VRFB_H__ - -#define OMAP_VRFB_LINE_LEN 2048 - -struct vrfb { -	u8 context; -	void __iomem *vaddr[4]; -	unsigned long paddr[4]; -	u16 xres; -	u16 yres; -	u16 xoffset; -	u16 yoffset; -	u8 bytespp; -	bool yuv_mode; -}; - -#ifdef CONFIG_OMAP2_VRFB -extern int omap_vrfb_request_ctx(struct vrfb *vrfb); -extern void omap_vrfb_release_ctx(struct vrfb *vrfb); -extern void omap_vrfb_adjust_size(u16 *width, u16 *height, -		u8 bytespp); -extern u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp); -extern u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp); -extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, -		u16 width, u16 height, -		unsigned bytespp, bool yuv_mode); -extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot); -extern void omap_vrfb_restore_context(void); - -#else -static inline int omap_vrfb_request_ctx(struct vrfb *vrfb) { return 0; } -static inline void omap_vrfb_release_ctx(struct vrfb *vrfb) {} -static inline void omap_vrfb_adjust_size(u16 *width, u16 *height, -		u8 bytespp) {} -static inline u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp) -		{ return 0; } -static inline u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp) -		{ return 0; } -static inline void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, -		u16 width, u16 height, unsigned bytespp, bool yuv_mode) {} -static inline int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot) -		{ return 0; } -static inline void omap_vrfb_restore_context(void) {} -#endif -#endif /* __VRFB_H */ diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c deleted file mode 100644 index b0078cf9628..00000000000 --- a/arch/arm/plat-omap/io.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Common io.c file - * This file is created by Russell King <rmk+kernel@arm.linux.org.uk> - * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - 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/module.h> -#include <linux/io.h> -#include <linux/mm.h> - -#include <plat/omap7xx.h> -#include <plat/omap1510.h> -#include <plat/omap16xx.h> -#include <plat/omap24xx.h> -#include <plat/omap34xx.h> -#include <plat/omap44xx.h> - -#define BETWEEN(p,st,sz)	((p) >= (st) && (p) < ((st) + (sz))) -#define XLATE(p,pst,vst)	((void __iomem *)((p) - (pst) + (vst))) - -/* - * Intercept ioremap() requests for addresses in our fixed mapping regions. - */ -void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) -{ -#ifdef CONFIG_ARCH_OMAP1 -	if (cpu_class_is_omap1()) { -		if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE)) -			return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT); -	} -	if (cpu_is_omap7xx()) { -		if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE)) -			return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START); - -		if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE)) -			return XLATE(p, OMAP7XX_DSPREG_BASE, -					OMAP7XX_DSPREG_START); -	} -	if (cpu_is_omap15xx()) { -		if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE)) -			return XLATE(p, OMAP1510_DSP_BASE, OMAP1510_DSP_START); - -		if (BETWEEN(p, OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_SIZE)) -			return XLATE(p, OMAP1510_DSPREG_BASE, -					OMAP1510_DSPREG_START); -	} -	if (cpu_is_omap16xx()) { -		if (BETWEEN(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_SIZE)) -			return XLATE(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_START); - -		if (BETWEEN(p, OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_SIZE)) -			return XLATE(p, OMAP16XX_DSPREG_BASE, -					OMAP16XX_DSPREG_START); -	} -#endif -#ifdef CONFIG_ARCH_OMAP2 -	if (cpu_is_omap24xx()) { -		if (BETWEEN(p, L3_24XX_PHYS, L3_24XX_SIZE)) -			return XLATE(p, L3_24XX_PHYS, L3_24XX_VIRT); -		if (BETWEEN(p, L4_24XX_PHYS, L4_24XX_SIZE)) -			return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); -	} -	if (cpu_is_omap2420()) { -		if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE)) -			return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT); -		if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE)) -			return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE); -		if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE)) -			return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT); -	} -	if (cpu_is_omap2430()) { -		if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) -			return XLATE(p, L4_WK_243X_PHYS, L4_WK_243X_VIRT); -		if (BETWEEN(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_SIZE)) -			return XLATE(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_VIRT); -		if (BETWEEN(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_SIZE)) -			return XLATE(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_VIRT); -		if (BETWEEN(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_SIZE)) -			return XLATE(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_VIRT); -	} -#endif -#ifdef CONFIG_ARCH_OMAP3 -	if (cpu_is_omap34xx()) { -		if (BETWEEN(p, L3_34XX_PHYS, L3_34XX_SIZE)) -			return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT); -		if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) -			return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); -		if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE)) -			return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT); -		if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE)) -			return XLATE(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_VIRT); -		if (BETWEEN(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_SIZE)) -			return XLATE(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_VIRT); -		if (BETWEEN(p, L4_PER_34XX_PHYS, L4_PER_34XX_SIZE)) -			return XLATE(p, L4_PER_34XX_PHYS, L4_PER_34XX_VIRT); -		if (BETWEEN(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_SIZE)) -			return XLATE(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_VIRT); -	} -#endif -#ifdef CONFIG_ARCH_OMAP4 -	if (cpu_is_omap44xx()) { -		if (BETWEEN(p, L3_44XX_PHYS, L3_44XX_SIZE)) -			return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT); -		if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE)) -			return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT); -		if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE)) -			return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT); -		if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE)) -			return XLATE(p, OMAP44XX_EMIF1_PHYS,		\ -							OMAP44XX_EMIF1_VIRT); -		if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE)) -			return XLATE(p, OMAP44XX_EMIF2_PHYS,		\ -							OMAP44XX_EMIF2_VIRT); -		if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE)) -			return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT); -		if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE)) -			return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT); -		if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE)) -			return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT); -	} -#endif -	return __arm_ioremap_caller(p, size, type, __builtin_return_address(0)); -} -EXPORT_SYMBOL(omap_ioremap); - -void omap_iounmap(volatile void __iomem *addr) -{ -	unsigned long virt = (unsigned long)addr; - -	if (virt >= VMALLOC_START && virt < VMALLOC_END) -		__iounmap(addr); -} -EXPORT_SYMBOL(omap_iounmap); - -/* - * NOTE: Please use ioremap + __raw_read/write where possible instead of these - */ - -u8 omap_readb(u32 pa) -{ -	if (cpu_class_is_omap1()) -		return __raw_readb(OMAP1_IO_ADDRESS(pa)); -	else -		return __raw_readb(OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_readb); - -u16 omap_readw(u32 pa) -{ -	if (cpu_class_is_omap1()) -		return __raw_readw(OMAP1_IO_ADDRESS(pa)); -	else -		return __raw_readw(OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_readw); - -u32 omap_readl(u32 pa) -{ -	if (cpu_class_is_omap1()) -		return __raw_readl(OMAP1_IO_ADDRESS(pa)); -	else -		return __raw_readl(OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_readl); - -void omap_writeb(u8 v, u32 pa) -{ -	if (cpu_class_is_omap1()) -		__raw_writeb(v, OMAP1_IO_ADDRESS(pa)); -	else -		__raw_writeb(v, OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_writeb); - -void omap_writew(u16 v, u32 pa) -{ -	if (cpu_class_is_omap1()) -		__raw_writew(v, OMAP1_IO_ADDRESS(pa)); -	else -		__raw_writew(v, OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_writew); - -void omap_writel(u32 v, u32 pa) -{ -	if (cpu_class_is_omap1()) -		__raw_writel(v, OMAP1_IO_ADDRESS(pa)); -	else -		__raw_writel(v, OMAP2_L4_IO_ADDRESS(pa)); -} -EXPORT_SYMBOL(omap_writel); diff --git a/arch/arm/plat-omap/iommu-debug.c b/arch/arm/plat-omap/iommu-debug.c deleted file mode 100644 index f07cf2f08e0..00000000000 --- a/arch/arm/plat-omap/iommu-debug.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * omap iommu: debugfs interface - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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/err.h> -#include <linux/clk.h> -#include <linux/io.h> -#include <linux/slab.h> -#include <linux/uaccess.h> -#include <linux/platform_device.h> -#include <linux/debugfs.h> - -#include <plat/iommu.h> -#include <plat/iovmm.h> - -#include "iopgtable.h" - -#define MAXCOLUMN 100 /* for short messages */ - -static DEFINE_MUTEX(iommu_debug_lock); - -static struct dentry *iommu_debug_root; - -static ssize_t debug_read_ver(struct file *file, char __user *userbuf, -			      size_t count, loff_t *ppos) -{ -	u32 ver = iommu_arch_version(); -	char buf[MAXCOLUMN], *p = buf; - -	p += sprintf(p, "H/W version: %d.%d\n", (ver >> 4) & 0xf , ver & 0xf); - -	return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); -} - -static ssize_t debug_read_regs(struct file *file, char __user *userbuf, -			       size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	char *p, *buf; -	ssize_t bytes; - -	buf = kmalloc(count, GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	mutex_lock(&iommu_debug_lock); - -	bytes = iommu_dump_ctx(obj, p, count); -	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, bytes); - -	mutex_unlock(&iommu_debug_lock); -	kfree(buf); - -	return bytes; -} - -static ssize_t debug_read_tlb(struct file *file, char __user *userbuf, -			      size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	char *p, *buf; -	ssize_t bytes, rest; - -	buf = kmalloc(count, GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	mutex_lock(&iommu_debug_lock); - -	p += sprintf(p, "%8s %8s\n", "cam:", "ram:"); -	p += sprintf(p, "-----------------------------------------\n"); -	rest = count - (p - buf); -	p += dump_tlb_entries(obj, p, rest); - -	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); - -	mutex_unlock(&iommu_debug_lock); -	kfree(buf); - -	return bytes; -} - -static ssize_t debug_write_pagetable(struct file *file, -		     const char __user *userbuf, size_t count, loff_t *ppos) -{ -	struct iotlb_entry e; -	struct cr_regs cr; -	int err; -	struct iommu *obj = file->private_data; -	char buf[MAXCOLUMN], *p = buf; - -	count = min(count, sizeof(buf)); - -	mutex_lock(&iommu_debug_lock); -	if (copy_from_user(p, userbuf, count)) { -		mutex_unlock(&iommu_debug_lock); -		return -EFAULT; -	} - -	sscanf(p, "%x %x", &cr.cam, &cr.ram); -	if (!cr.cam || !cr.ram) { -		mutex_unlock(&iommu_debug_lock); -		return -EINVAL; -	} - -	iotlb_cr_to_e(&cr, &e); -	err = iopgtable_store_entry(obj, &e); -	if (err) -		dev_err(obj->dev, "%s: fail to store cr\n", __func__); - -	mutex_unlock(&iommu_debug_lock); -	return count; -} - -#define dump_ioptable_entry_one(lv, da, val)			\ -	({							\ -		int __err = 0;					\ -		ssize_t bytes;					\ -		const int maxcol = 22;				\ -		const char *str = "%d: %08x %08x\n";		\ -		bytes = snprintf(p, maxcol, str, lv, da, val);	\ -		p += bytes;					\ -		len -= bytes;					\ -		if (len < maxcol)				\ -			__err = -ENOMEM;			\ -		__err;						\ -	}) - -static ssize_t dump_ioptable(struct iommu *obj, char *buf, ssize_t len) -{ -	int i; -	u32 *iopgd; -	char *p = buf; - -	spin_lock(&obj->page_table_lock); - -	iopgd = iopgd_offset(obj, 0); -	for (i = 0; i < PTRS_PER_IOPGD; i++, iopgd++) { -		int j, err; -		u32 *iopte; -		u32 da; - -		if (!*iopgd) -			continue; - -		if (!(*iopgd & IOPGD_TABLE)) { -			da = i << IOPGD_SHIFT; - -			err = dump_ioptable_entry_one(1, da, *iopgd); -			if (err) -				goto out; -			continue; -		} - -		iopte = iopte_offset(iopgd, 0); - -		for (j = 0; j < PTRS_PER_IOPTE; j++, iopte++) { -			if (!*iopte) -				continue; - -			da = (i << IOPGD_SHIFT) + (j << IOPTE_SHIFT); -			err = dump_ioptable_entry_one(2, da, *iopgd); -			if (err) -				goto out; -		} -	} -out: -	spin_unlock(&obj->page_table_lock); - -	return p - buf; -} - -static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf, -				    size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	char *p, *buf; -	size_t bytes; - -	buf = (char *)__get_free_page(GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	p += sprintf(p, "L: %8s %8s\n", "da:", "pa:"); -	p += sprintf(p, "-----------------------------------------\n"); - -	mutex_lock(&iommu_debug_lock); - -	bytes = PAGE_SIZE - (p - buf); -	p += dump_ioptable(obj, p, bytes); - -	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); - -	mutex_unlock(&iommu_debug_lock); -	free_page((unsigned long)buf); - -	return bytes; -} - -static ssize_t debug_read_mmap(struct file *file, char __user *userbuf, -			       size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	char *p, *buf; -	struct iovm_struct *tmp; -	int uninitialized_var(i); -	ssize_t bytes; - -	buf = (char *)__get_free_page(GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	p += sprintf(p, "%-3s %-8s %-8s %6s %8s\n", -		     "No", "start", "end", "size", "flags"); -	p += sprintf(p, "-------------------------------------------------\n"); - -	mutex_lock(&iommu_debug_lock); - -	list_for_each_entry(tmp, &obj->mmap, list) { -		size_t len; -		const char *str = "%3d %08x-%08x %6x %8x\n"; -		const int maxcol = 39; - -		len = tmp->da_end - tmp->da_start; -		p += snprintf(p, maxcol, str, -			      i, tmp->da_start, tmp->da_end, len, tmp->flags); - -		if (PAGE_SIZE - (p - buf) < maxcol) -			break; -		i++; -	} - -	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); - -	mutex_unlock(&iommu_debug_lock); -	free_page((unsigned long)buf); - -	return bytes; -} - -static ssize_t debug_read_mem(struct file *file, char __user *userbuf, -			      size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	char *p, *buf; -	struct iovm_struct *area; -	ssize_t bytes; - -	count = min_t(ssize_t, count, PAGE_SIZE); - -	buf = (char *)__get_free_page(GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	mutex_lock(&iommu_debug_lock); - -	area = find_iovm_area(obj, (u32)ppos); -	if (IS_ERR(area)) { -		bytes = -EINVAL; -		goto err_out; -	} -	memcpy(p, area->va, count); -	p += count; - -	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); -err_out: -	mutex_unlock(&iommu_debug_lock); -	free_page((unsigned long)buf); - -	return bytes; -} - -static ssize_t debug_write_mem(struct file *file, const char __user *userbuf, -			       size_t count, loff_t *ppos) -{ -	struct iommu *obj = file->private_data; -	struct iovm_struct *area; -	char *p, *buf; - -	count = min_t(size_t, count, PAGE_SIZE); - -	buf = (char *)__get_free_page(GFP_KERNEL); -	if (!buf) -		return -ENOMEM; -	p = buf; - -	mutex_lock(&iommu_debug_lock); - -	if (copy_from_user(p, userbuf, count)) { -		count =  -EFAULT; -		goto err_out; -	} - -	area = find_iovm_area(obj, (u32)ppos); -	if (IS_ERR(area)) { -		count = -EINVAL; -		goto err_out; -	} -	memcpy(area->va, p, count); -err_out: -	mutex_unlock(&iommu_debug_lock); -	free_page((unsigned long)buf); - -	return count; -} - -static int debug_open_generic(struct inode *inode, struct file *file) -{ -	file->private_data = inode->i_private; -	return 0; -} - -#define DEBUG_FOPS(name)						\ -	static const struct file_operations debug_##name##_fops = {	\ -		.open = debug_open_generic,				\ -		.read = debug_read_##name,				\ -		.write = debug_write_##name,				\ -		.llseek = generic_file_llseek,				\ -	}; - -#define DEBUG_FOPS_RO(name)						\ -	static const struct file_operations debug_##name##_fops = {	\ -		.open = debug_open_generic,				\ -		.read = debug_read_##name,				\ -		.llseek = generic_file_llseek,				\ -	}; - -DEBUG_FOPS_RO(ver); -DEBUG_FOPS_RO(regs); -DEBUG_FOPS_RO(tlb); -DEBUG_FOPS(pagetable); -DEBUG_FOPS_RO(mmap); -DEBUG_FOPS(mem); - -#define __DEBUG_ADD_FILE(attr, mode)					\ -	{								\ -		struct dentry *dent;					\ -		dent = debugfs_create_file(#attr, mode, parent,		\ -					   obj, &debug_##attr##_fops);	\ -		if (!dent)						\ -			return -ENOMEM;					\ -	} - -#define DEBUG_ADD_FILE(name) __DEBUG_ADD_FILE(name, 600) -#define DEBUG_ADD_FILE_RO(name) __DEBUG_ADD_FILE(name, 400) - -static int iommu_debug_register(struct device *dev, void *data) -{ -	struct platform_device *pdev = to_platform_device(dev); -	struct iommu *obj = platform_get_drvdata(pdev); -	struct dentry *d, *parent; - -	if (!obj || !obj->dev) -		return -EINVAL; - -	d = debugfs_create_dir(obj->name, iommu_debug_root); -	if (!d) -		return -ENOMEM; -	parent = d; - -	d = debugfs_create_u8("nr_tlb_entries", 400, parent, -			      (u8 *)&obj->nr_tlb_entries); -	if (!d) -		return -ENOMEM; - -	DEBUG_ADD_FILE_RO(ver); -	DEBUG_ADD_FILE_RO(regs); -	DEBUG_ADD_FILE_RO(tlb); -	DEBUG_ADD_FILE(pagetable); -	DEBUG_ADD_FILE_RO(mmap); -	DEBUG_ADD_FILE(mem); - -	return 0; -} - -static int __init iommu_debug_init(void) -{ -	struct dentry *d; -	int err; - -	d = debugfs_create_dir("iommu", NULL); -	if (!d) -		return -ENOMEM; -	iommu_debug_root = d; - -	err = foreach_iommu_device(d, iommu_debug_register); -	if (err) -		goto err_out; -	return 0; - -err_out: -	debugfs_remove_recursive(iommu_debug_root); -	return err; -} -module_init(iommu_debug_init) - -static void __exit iommu_debugfs_exit(void) -{ -	debugfs_remove_recursive(iommu_debug_root); -} -module_exit(iommu_debugfs_exit) - -MODULE_DESCRIPTION("omap iommu: debugfs interface"); -MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c deleted file mode 100644 index 6cd151b31bc..00000000000 --- a/arch/arm/plat-omap/iommu.c +++ /dev/null @@ -1,1049 +0,0 @@ -/* - * omap iommu: tlb and pagetable primitives - * - * Copyright (C) 2008-2010 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, - *		Paul Mundt and Toshihiro Kobayashi - * - * 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/err.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/interrupt.h> -#include <linux/ioport.h> -#include <linux/clk.h> -#include <linux/platform_device.h> - -#include <asm/cacheflush.h> - -#include <plat/iommu.h> - -#include "iopgtable.h" - -#define for_each_iotlb_cr(obj, n, __i, cr)				\ -	for (__i = 0;							\ -	     (__i < (n)) && (cr = __iotlb_read_cr((obj), __i), true);	\ -	     __i++) - -/* accommodate the difference between omap1 and omap2/3 */ -static const struct iommu_functions *arch_iommu; - -static struct platform_driver omap_iommu_driver; -static struct kmem_cache *iopte_cachep; - -/** - * install_iommu_arch - Install archtecure specific iommu functions - * @ops:	a pointer to architecture specific iommu functions - * - * There are several kind of iommu algorithm(tlb, pagetable) among - * omap series. This interface installs such an iommu algorighm. - **/ -int install_iommu_arch(const struct iommu_functions *ops) -{ -	if (arch_iommu) -		return -EBUSY; - -	arch_iommu = ops; -	return 0; -} -EXPORT_SYMBOL_GPL(install_iommu_arch); - -/** - * uninstall_iommu_arch - Uninstall archtecure specific iommu functions - * @ops:	a pointer to architecture specific iommu functions - * - * This interface uninstalls the iommu algorighm installed previously. - **/ -void uninstall_iommu_arch(const struct iommu_functions *ops) -{ -	if (arch_iommu != ops) -		pr_err("%s: not your arch\n", __func__); - -	arch_iommu = NULL; -} -EXPORT_SYMBOL_GPL(uninstall_iommu_arch); - -/** - * iommu_save_ctx - Save registers for pm off-mode support - * @obj:	target iommu - **/ -void iommu_save_ctx(struct iommu *obj) -{ -	arch_iommu->save_ctx(obj); -} -EXPORT_SYMBOL_GPL(iommu_save_ctx); - -/** - * iommu_restore_ctx - Restore registers for pm off-mode support - * @obj:	target iommu - **/ -void iommu_restore_ctx(struct iommu *obj) -{ -	arch_iommu->restore_ctx(obj); -} -EXPORT_SYMBOL_GPL(iommu_restore_ctx); - -/** - * iommu_arch_version - Return running iommu arch version - **/ -u32 iommu_arch_version(void) -{ -	return arch_iommu->version; -} -EXPORT_SYMBOL_GPL(iommu_arch_version); - -static int iommu_enable(struct iommu *obj) -{ -	int err; - -	if (!obj) -		return -EINVAL; - -	clk_enable(obj->clk); - -	err = arch_iommu->enable(obj); - -	clk_disable(obj->clk); -	return err; -} - -static void iommu_disable(struct iommu *obj) -{ -	if (!obj) -		return; - -	clk_enable(obj->clk); - -	arch_iommu->disable(obj); - -	clk_disable(obj->clk); -} - -/* - *	TLB operations - */ -void iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e) -{ -	BUG_ON(!cr || !e); - -	arch_iommu->cr_to_e(cr, e); -} -EXPORT_SYMBOL_GPL(iotlb_cr_to_e); - -static inline int iotlb_cr_valid(struct cr_regs *cr) -{ -	if (!cr) -		return -EINVAL; - -	return arch_iommu->cr_valid(cr); -} - -static inline struct cr_regs *iotlb_alloc_cr(struct iommu *obj, -					     struct iotlb_entry *e) -{ -	if (!e) -		return NULL; - -	return arch_iommu->alloc_cr(obj, e); -} - -u32 iotlb_cr_to_virt(struct cr_regs *cr) -{ -	return arch_iommu->cr_to_virt(cr); -} -EXPORT_SYMBOL_GPL(iotlb_cr_to_virt); - -static u32 get_iopte_attr(struct iotlb_entry *e) -{ -	return arch_iommu->get_pte_attr(e); -} - -static u32 iommu_report_fault(struct iommu *obj, u32 *da) -{ -	return arch_iommu->fault_isr(obj, da); -} - -static void iotlb_lock_get(struct iommu *obj, struct iotlb_lock *l) -{ -	u32 val; - -	val = iommu_read_reg(obj, MMU_LOCK); - -	l->base = MMU_LOCK_BASE(val); -	l->vict = MMU_LOCK_VICT(val); - -} - -static void iotlb_lock_set(struct iommu *obj, struct iotlb_lock *l) -{ -	u32 val; - -	val = (l->base << MMU_LOCK_BASE_SHIFT); -	val |= (l->vict << MMU_LOCK_VICT_SHIFT); - -	iommu_write_reg(obj, val, MMU_LOCK); -} - -static void iotlb_read_cr(struct iommu *obj, struct cr_regs *cr) -{ -	arch_iommu->tlb_read_cr(obj, cr); -} - -static void iotlb_load_cr(struct iommu *obj, struct cr_regs *cr) -{ -	arch_iommu->tlb_load_cr(obj, cr); - -	iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); -	iommu_write_reg(obj, 1, MMU_LD_TLB); -} - -/** - * iotlb_dump_cr - Dump an iommu tlb entry into buf - * @obj:	target iommu - * @cr:		contents of cam and ram register - * @buf:	output buffer - **/ -static inline ssize_t iotlb_dump_cr(struct iommu *obj, struct cr_regs *cr, -				    char *buf) -{ -	BUG_ON(!cr || !buf); - -	return arch_iommu->dump_cr(obj, cr, buf); -} - -/* only used in iotlb iteration for-loop */ -static struct cr_regs __iotlb_read_cr(struct iommu *obj, int n) -{ -	struct cr_regs cr; -	struct iotlb_lock l; - -	iotlb_lock_get(obj, &l); -	l.vict = n; -	iotlb_lock_set(obj, &l); -	iotlb_read_cr(obj, &cr); - -	return cr; -} - -/** - * load_iotlb_entry - Set an iommu tlb entry - * @obj:	target iommu - * @e:		an iommu tlb entry info - **/ -int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e) -{ -	int err = 0; -	struct iotlb_lock l; -	struct cr_regs *cr; - -	if (!obj || !obj->nr_tlb_entries || !e) -		return -EINVAL; - -	clk_enable(obj->clk); - -	iotlb_lock_get(obj, &l); -	if (l.base == obj->nr_tlb_entries) { -		dev_warn(obj->dev, "%s: preserve entries full\n", __func__); -		err = -EBUSY; -		goto out; -	} -	if (!e->prsvd) { -		int i; -		struct cr_regs tmp; - -		for_each_iotlb_cr(obj, obj->nr_tlb_entries, i, tmp) -			if (!iotlb_cr_valid(&tmp)) -				break; - -		if (i == obj->nr_tlb_entries) { -			dev_dbg(obj->dev, "%s: full: no entry\n", __func__); -			err = -EBUSY; -			goto out; -		} - -		iotlb_lock_get(obj, &l); -	} else { -		l.vict = l.base; -		iotlb_lock_set(obj, &l); -	} - -	cr = iotlb_alloc_cr(obj, e); -	if (IS_ERR(cr)) { -		clk_disable(obj->clk); -		return PTR_ERR(cr); -	} - -	iotlb_load_cr(obj, cr); -	kfree(cr); - -	if (e->prsvd) -		l.base++; -	/* increment victim for next tlb load */ -	if (++l.vict == obj->nr_tlb_entries) -		l.vict = l.base; -	iotlb_lock_set(obj, &l); -out: -	clk_disable(obj->clk); -	return err; -} -EXPORT_SYMBOL_GPL(load_iotlb_entry); - -/** - * flush_iotlb_page - Clear an iommu tlb entry - * @obj:	target iommu - * @da:		iommu device virtual address - * - * Clear an iommu tlb entry which includes 'da' address. - **/ -void flush_iotlb_page(struct iommu *obj, u32 da) -{ -	int i; -	struct cr_regs cr; - -	clk_enable(obj->clk); - -	for_each_iotlb_cr(obj, obj->nr_tlb_entries, i, cr) { -		u32 start; -		size_t bytes; - -		if (!iotlb_cr_valid(&cr)) -			continue; - -		start = iotlb_cr_to_virt(&cr); -		bytes = iopgsz_to_bytes(cr.cam & 3); - -		if ((start <= da) && (da < start + bytes)) { -			dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n", -				__func__, start, da, bytes); -			iotlb_load_cr(obj, &cr); -			iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); -		} -	} -	clk_disable(obj->clk); - -	if (i == obj->nr_tlb_entries) -		dev_dbg(obj->dev, "%s: no page for %08x\n", __func__, da); -} -EXPORT_SYMBOL_GPL(flush_iotlb_page); - -/** - * flush_iotlb_range - Clear an iommu tlb entries - * @obj:	target iommu - * @start:	iommu device virtual address(start) - * @end:	iommu device virtual address(end) - * - * Clear an iommu tlb entry which includes 'da' address. - **/ -void flush_iotlb_range(struct iommu *obj, u32 start, u32 end) -{ -	u32 da = start; - -	while (da < end) { -		flush_iotlb_page(obj, da); -		/* FIXME: Optimize for multiple page size */ -		da += IOPTE_SIZE; -	} -} -EXPORT_SYMBOL_GPL(flush_iotlb_range); - -/** - * flush_iotlb_all - Clear all iommu tlb entries - * @obj:	target iommu - **/ -void flush_iotlb_all(struct iommu *obj) -{ -	struct iotlb_lock l; - -	clk_enable(obj->clk); - -	l.base = 0; -	l.vict = 0; -	iotlb_lock_set(obj, &l); - -	iommu_write_reg(obj, 1, MMU_GFLUSH); - -	clk_disable(obj->clk); -} -EXPORT_SYMBOL_GPL(flush_iotlb_all); - -/** - * iommu_set_twl - enable/disable table walking logic - * @obj:	target iommu - * @on:		enable/disable - * - * Function used to enable/disable TWL. If one wants to work - * exclusively with locked TLB entries and receive notifications - * for TLB miss then call this function to disable TWL. - */ -void iommu_set_twl(struct iommu *obj, bool on) -{ -	clk_enable(obj->clk); -	arch_iommu->set_twl(obj, on); -	clk_disable(obj->clk); -} -EXPORT_SYMBOL_GPL(iommu_set_twl); - -#if defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE) - -ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t bytes) -{ -	if (!obj || !buf) -		return -EINVAL; - -	clk_enable(obj->clk); - -	bytes = arch_iommu->dump_ctx(obj, buf, bytes); - -	clk_disable(obj->clk); - -	return bytes; -} -EXPORT_SYMBOL_GPL(iommu_dump_ctx); - -static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs, int num) -{ -	int i; -	struct iotlb_lock saved; -	struct cr_regs tmp; -	struct cr_regs *p = crs; - -	clk_enable(obj->clk); -	iotlb_lock_get(obj, &saved); - -	for_each_iotlb_cr(obj, num, i, tmp) { -		if (!iotlb_cr_valid(&tmp)) -			continue; -		*p++ = tmp; -	} - -	iotlb_lock_set(obj, &saved); -	clk_disable(obj->clk); - -	return  p - crs; -} - -/** - * dump_tlb_entries - dump cr arrays to given buffer - * @obj:	target iommu - * @buf:	output buffer - **/ -size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t bytes) -{ -	int i, num; -	struct cr_regs *cr; -	char *p = buf; - -	num = bytes / sizeof(*cr); -	num = min(obj->nr_tlb_entries, num); - -	cr = kcalloc(num, sizeof(*cr), GFP_KERNEL); -	if (!cr) -		return 0; - -	num = __dump_tlb_entries(obj, cr, num); -	for (i = 0; i < num; i++) -		p += iotlb_dump_cr(obj, cr + i, p); -	kfree(cr); - -	return p - buf; -} -EXPORT_SYMBOL_GPL(dump_tlb_entries); - -int foreach_iommu_device(void *data, int (*fn)(struct device *, void *)) -{ -	return driver_for_each_device(&omap_iommu_driver.driver, -				      NULL, data, fn); -} -EXPORT_SYMBOL_GPL(foreach_iommu_device); - -#endif /* CONFIG_OMAP_IOMMU_DEBUG_MODULE */ - -/* - *	H/W pagetable operations - */ -static void flush_iopgd_range(u32 *first, u32 *last) -{ -	/* FIXME: L2 cache should be taken care of if it exists */ -	do { -		asm("mcr	p15, 0, %0, c7, c10, 1 @ flush_pgd" -		    : : "r" (first)); -		first += L1_CACHE_BYTES / sizeof(*first); -	} while (first <= last); -} - -static void flush_iopte_range(u32 *first, u32 *last) -{ -	/* FIXME: L2 cache should be taken care of if it exists */ -	do { -		asm("mcr	p15, 0, %0, c7, c10, 1 @ flush_pte" -		    : : "r" (first)); -		first += L1_CACHE_BYTES / sizeof(*first); -	} while (first <= last); -} - -static void iopte_free(u32 *iopte) -{ -	/* Note: freed iopte's must be clean ready for re-use */ -	kmem_cache_free(iopte_cachep, iopte); -} - -static u32 *iopte_alloc(struct iommu *obj, u32 *iopgd, u32 da) -{ -	u32 *iopte; - -	/* a table has already existed */ -	if (*iopgd) -		goto pte_ready; - -	/* -	 * do the allocation outside the page table lock -	 */ -	spin_unlock(&obj->page_table_lock); -	iopte = kmem_cache_zalloc(iopte_cachep, GFP_KERNEL); -	spin_lock(&obj->page_table_lock); - -	if (!*iopgd) { -		if (!iopte) -			return ERR_PTR(-ENOMEM); - -		*iopgd = virt_to_phys(iopte) | IOPGD_TABLE; -		flush_iopgd_range(iopgd, iopgd); - -		dev_vdbg(obj->dev, "%s: a new pte:%p\n", __func__, iopte); -	} else { -		/* We raced, free the reduniovant table */ -		iopte_free(iopte); -	} - -pte_ready: -	iopte = iopte_offset(iopgd, da); - -	dev_vdbg(obj->dev, -		 "%s: da:%08x pgd:%p *pgd:%08x pte:%p *pte:%08x\n", -		 __func__, da, iopgd, *iopgd, iopte, *iopte); - -	return iopte; -} - -static int iopgd_alloc_section(struct iommu *obj, u32 da, u32 pa, u32 prot) -{ -	u32 *iopgd = iopgd_offset(obj, da); - -	if ((da | pa) & ~IOSECTION_MASK) { -		dev_err(obj->dev, "%s: %08x:%08x should aligned on %08lx\n", -			__func__, da, pa, IOSECTION_SIZE); -		return -EINVAL; -	} - -	*iopgd = (pa & IOSECTION_MASK) | prot | IOPGD_SECTION; -	flush_iopgd_range(iopgd, iopgd); -	return 0; -} - -static int iopgd_alloc_super(struct iommu *obj, u32 da, u32 pa, u32 prot) -{ -	u32 *iopgd = iopgd_offset(obj, da); -	int i; - -	if ((da | pa) & ~IOSUPER_MASK) { -		dev_err(obj->dev, "%s: %08x:%08x should aligned on %08lx\n", -			__func__, da, pa, IOSUPER_SIZE); -		return -EINVAL; -	} - -	for (i = 0; i < 16; i++) -		*(iopgd + i) = (pa & IOSUPER_MASK) | prot | IOPGD_SUPER; -	flush_iopgd_range(iopgd, iopgd + 15); -	return 0; -} - -static int iopte_alloc_page(struct iommu *obj, u32 da, u32 pa, u32 prot) -{ -	u32 *iopgd = iopgd_offset(obj, da); -	u32 *iopte = iopte_alloc(obj, iopgd, da); - -	if (IS_ERR(iopte)) -		return PTR_ERR(iopte); - -	*iopte = (pa & IOPAGE_MASK) | prot | IOPTE_SMALL; -	flush_iopte_range(iopte, iopte); - -	dev_vdbg(obj->dev, "%s: da:%08x pa:%08x pte:%p *pte:%08x\n", -		 __func__, da, pa, iopte, *iopte); - -	return 0; -} - -static int iopte_alloc_large(struct iommu *obj, u32 da, u32 pa, u32 prot) -{ -	u32 *iopgd = iopgd_offset(obj, da); -	u32 *iopte = iopte_alloc(obj, iopgd, da); -	int i; - -	if ((da | pa) & ~IOLARGE_MASK) { -		dev_err(obj->dev, "%s: %08x:%08x should aligned on %08lx\n", -			__func__, da, pa, IOLARGE_SIZE); -		return -EINVAL; -	} - -	if (IS_ERR(iopte)) -		return PTR_ERR(iopte); - -	for (i = 0; i < 16; i++) -		*(iopte + i) = (pa & IOLARGE_MASK) | prot | IOPTE_LARGE; -	flush_iopte_range(iopte, iopte + 15); -	return 0; -} - -static int iopgtable_store_entry_core(struct iommu *obj, struct iotlb_entry *e) -{ -	int (*fn)(struct iommu *, u32, u32, u32); -	u32 prot; -	int err; - -	if (!obj || !e) -		return -EINVAL; - -	switch (e->pgsz) { -	case MMU_CAM_PGSZ_16M: -		fn = iopgd_alloc_super; -		break; -	case MMU_CAM_PGSZ_1M: -		fn = iopgd_alloc_section; -		break; -	case MMU_CAM_PGSZ_64K: -		fn = iopte_alloc_large; -		break; -	case MMU_CAM_PGSZ_4K: -		fn = iopte_alloc_page; -		break; -	default: -		fn = NULL; -		BUG(); -		break; -	} - -	prot = get_iopte_attr(e); - -	spin_lock(&obj->page_table_lock); -	err = fn(obj, e->da, e->pa, prot); -	spin_unlock(&obj->page_table_lock); - -	return err; -} - -/** - * iopgtable_store_entry - Make an iommu pte entry - * @obj:	target iommu - * @e:		an iommu tlb entry info - **/ -int iopgtable_store_entry(struct iommu *obj, struct iotlb_entry *e) -{ -	int err; - -	flush_iotlb_page(obj, e->da); -	err = iopgtable_store_entry_core(obj, e); -#ifdef PREFETCH_IOTLB -	if (!err) -		load_iotlb_entry(obj, e); -#endif -	return err; -} -EXPORT_SYMBOL_GPL(iopgtable_store_entry); - -/** - * iopgtable_lookup_entry - Lookup an iommu pte entry - * @obj:	target iommu - * @da:		iommu device virtual address - * @ppgd:	iommu pgd entry pointer to be returned - * @ppte:	iommu pte entry pointer to be returned - **/ -void iopgtable_lookup_entry(struct iommu *obj, u32 da, u32 **ppgd, u32 **ppte) -{ -	u32 *iopgd, *iopte = NULL; - -	iopgd = iopgd_offset(obj, da); -	if (!*iopgd) -		goto out; - -	if (iopgd_is_table(*iopgd)) -		iopte = iopte_offset(iopgd, da); -out: -	*ppgd = iopgd; -	*ppte = iopte; -} -EXPORT_SYMBOL_GPL(iopgtable_lookup_entry); - -static size_t iopgtable_clear_entry_core(struct iommu *obj, u32 da) -{ -	size_t bytes; -	u32 *iopgd = iopgd_offset(obj, da); -	int nent = 1; - -	if (!*iopgd) -		return 0; - -	if (iopgd_is_table(*iopgd)) { -		int i; -		u32 *iopte = iopte_offset(iopgd, da); - -		bytes = IOPTE_SIZE; -		if (*iopte & IOPTE_LARGE) { -			nent *= 16; -			/* rewind to the 1st entry */ -			iopte = iopte_offset(iopgd, (da & IOLARGE_MASK)); -		} -		bytes *= nent; -		memset(iopte, 0, nent * sizeof(*iopte)); -		flush_iopte_range(iopte, iopte + (nent - 1) * sizeof(*iopte)); - -		/* -		 * do table walk to check if this table is necessary or not -		 */ -		iopte = iopte_offset(iopgd, 0); -		for (i = 0; i < PTRS_PER_IOPTE; i++) -			if (iopte[i]) -				goto out; - -		iopte_free(iopte); -		nent = 1; /* for the next L1 entry */ -	} else { -		bytes = IOPGD_SIZE; -		if ((*iopgd & IOPGD_SUPER) == IOPGD_SUPER) { -			nent *= 16; -			/* rewind to the 1st entry */ -			iopgd = iopgd_offset(obj, (da & IOSUPER_MASK)); -		} -		bytes *= nent; -	} -	memset(iopgd, 0, nent * sizeof(*iopgd)); -	flush_iopgd_range(iopgd, iopgd + (nent - 1) * sizeof(*iopgd)); -out: -	return bytes; -} - -/** - * iopgtable_clear_entry - Remove an iommu pte entry - * @obj:	target iommu - * @da:		iommu device virtual address - **/ -size_t iopgtable_clear_entry(struct iommu *obj, u32 da) -{ -	size_t bytes; - -	spin_lock(&obj->page_table_lock); - -	bytes = iopgtable_clear_entry_core(obj, da); -	flush_iotlb_page(obj, da); - -	spin_unlock(&obj->page_table_lock); - -	return bytes; -} -EXPORT_SYMBOL_GPL(iopgtable_clear_entry); - -static void iopgtable_clear_entry_all(struct iommu *obj) -{ -	int i; - -	spin_lock(&obj->page_table_lock); - -	for (i = 0; i < PTRS_PER_IOPGD; i++) { -		u32 da; -		u32 *iopgd; - -		da = i << IOPGD_SHIFT; -		iopgd = iopgd_offset(obj, da); - -		if (!*iopgd) -			continue; - -		if (iopgd_is_table(*iopgd)) -			iopte_free(iopte_offset(iopgd, 0)); - -		*iopgd = 0; -		flush_iopgd_range(iopgd, iopgd); -	} - -	flush_iotlb_all(obj); - -	spin_unlock(&obj->page_table_lock); -} - -/* - *	Device IOMMU generic operations - */ -static irqreturn_t iommu_fault_handler(int irq, void *data) -{ -	u32 stat, da; -	u32 *iopgd, *iopte; -	int err = -EIO; -	struct iommu *obj = data; - -	if (!obj->refcount) -		return IRQ_NONE; - -	/* Dynamic loading TLB or PTE */ -	if (obj->isr) -		err = obj->isr(obj); - -	if (!err) -		return IRQ_HANDLED; - -	clk_enable(obj->clk); -	stat = iommu_report_fault(obj, &da); -	clk_disable(obj->clk); -	if (!stat) -		return IRQ_HANDLED; - -	iommu_disable(obj); - -	iopgd = iopgd_offset(obj, da); - -	if (!iopgd_is_table(*iopgd)) { -		dev_err(obj->dev, "%s: da:%08x pgd:%p *pgd:%08x\n", __func__, -			da, iopgd, *iopgd); -		return IRQ_NONE; -	} - -	iopte = iopte_offset(iopgd, da); - -	dev_err(obj->dev, "%s: da:%08x pgd:%p *pgd:%08x pte:%p *pte:%08x\n", -		__func__, da, iopgd, *iopgd, iopte, *iopte); - -	return IRQ_NONE; -} - -static int device_match_by_alias(struct device *dev, void *data) -{ -	struct iommu *obj = to_iommu(dev); -	const char *name = data; - -	pr_debug("%s: %s %s\n", __func__, obj->name, name); - -	return strcmp(obj->name, name) == 0; -} - -/** - * iommu_get - Get iommu handler - * @name:	target iommu name - **/ -struct iommu *iommu_get(const char *name) -{ -	int err = -ENOMEM; -	struct device *dev; -	struct iommu *obj; - -	dev = driver_find_device(&omap_iommu_driver.driver, NULL, (void *)name, -				 device_match_by_alias); -	if (!dev) -		return ERR_PTR(-ENODEV); - -	obj = to_iommu(dev); - -	mutex_lock(&obj->iommu_lock); - -	if (obj->refcount++ == 0) { -		err = iommu_enable(obj); -		if (err) -			goto err_enable; -		flush_iotlb_all(obj); -	} - -	if (!try_module_get(obj->owner)) -		goto err_module; - -	mutex_unlock(&obj->iommu_lock); - -	dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name); -	return obj; - -err_module: -	if (obj->refcount == 1) -		iommu_disable(obj); -err_enable: -	obj->refcount--; -	mutex_unlock(&obj->iommu_lock); -	return ERR_PTR(err); -} -EXPORT_SYMBOL_GPL(iommu_get); - -/** - * iommu_put - Put back iommu handler - * @obj:	target iommu - **/ -void iommu_put(struct iommu *obj) -{ -	if (!obj || IS_ERR(obj)) -		return; - -	mutex_lock(&obj->iommu_lock); - -	if (--obj->refcount == 0) -		iommu_disable(obj); - -	module_put(obj->owner); - -	mutex_unlock(&obj->iommu_lock); - -	dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name); -} -EXPORT_SYMBOL_GPL(iommu_put); - -/* - *	OMAP Device MMU(IOMMU) detection - */ -static int __devinit omap_iommu_probe(struct platform_device *pdev) -{ -	int err = -ENODEV; -	void *p; -	int irq; -	struct iommu *obj; -	struct resource *res; -	struct iommu_platform_data *pdata = pdev->dev.platform_data; - -	if (pdev->num_resources != 2) -		return -EINVAL; - -	obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL); -	if (!obj) -		return -ENOMEM; - -	obj->clk = clk_get(&pdev->dev, pdata->clk_name); -	if (IS_ERR(obj->clk)) -		goto err_clk; - -	obj->nr_tlb_entries = pdata->nr_tlb_entries; -	obj->name = pdata->name; -	obj->dev = &pdev->dev; -	obj->ctx = (void *)obj + sizeof(*obj); - -	mutex_init(&obj->iommu_lock); -	mutex_init(&obj->mmap_lock); -	spin_lock_init(&obj->page_table_lock); -	INIT_LIST_HEAD(&obj->mmap); - -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) { -		err = -ENODEV; -		goto err_mem; -	} -	obj->regbase = ioremap(res->start, resource_size(res)); -	if (!obj->regbase) { -		err = -ENOMEM; -		goto err_mem; -	} - -	res = request_mem_region(res->start, resource_size(res), -				 dev_name(&pdev->dev)); -	if (!res) { -		err = -EIO; -		goto err_mem; -	} - -	irq = platform_get_irq(pdev, 0); -	if (irq < 0) { -		err = -ENODEV; -		goto err_irq; -	} -	err = request_irq(irq, iommu_fault_handler, IRQF_SHARED, -			  dev_name(&pdev->dev), obj); -	if (err < 0) -		goto err_irq; -	platform_set_drvdata(pdev, obj); - -	p = (void *)__get_free_pages(GFP_KERNEL, get_order(IOPGD_TABLE_SIZE)); -	if (!p) { -		err = -ENOMEM; -		goto err_pgd; -	} -	memset(p, 0, IOPGD_TABLE_SIZE); -	clean_dcache_area(p, IOPGD_TABLE_SIZE); -	obj->iopgd = p; - -	BUG_ON(!IS_ALIGNED((unsigned long)obj->iopgd, IOPGD_TABLE_SIZE)); - -	dev_info(&pdev->dev, "%s registered\n", obj->name); -	return 0; - -err_pgd: -	free_irq(irq, obj); -err_irq: -	release_mem_region(res->start, resource_size(res)); -	iounmap(obj->regbase); -err_mem: -	clk_put(obj->clk); -err_clk: -	kfree(obj); -	return err; -} - -static int __devexit omap_iommu_remove(struct platform_device *pdev) -{ -	int irq; -	struct resource *res; -	struct iommu *obj = platform_get_drvdata(pdev); - -	platform_set_drvdata(pdev, NULL); - -	iopgtable_clear_entry_all(obj); -	free_pages((unsigned long)obj->iopgd, get_order(IOPGD_TABLE_SIZE)); - -	irq = platform_get_irq(pdev, 0); -	free_irq(irq, obj); -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(res->start, resource_size(res)); -	iounmap(obj->regbase); - -	clk_put(obj->clk); -	dev_info(&pdev->dev, "%s removed\n", obj->name); -	kfree(obj); -	return 0; -} - -static struct platform_driver omap_iommu_driver = { -	.probe	= omap_iommu_probe, -	.remove	= __devexit_p(omap_iommu_remove), -	.driver	= { -		.name	= "omap-iommu", -	}, -}; - -static void iopte_cachep_ctor(void *iopte) -{ -	clean_dcache_area(iopte, IOPTE_TABLE_SIZE); -} - -static int __init omap_iommu_init(void) -{ -	struct kmem_cache *p; -	const unsigned long flags = SLAB_HWCACHE_ALIGN; -	size_t align = 1 << 10; /* L2 pagetable alignement */ - -	p = kmem_cache_create("iopte_cache", IOPTE_TABLE_SIZE, align, flags, -			      iopte_cachep_ctor); -	if (!p) -		return -ENOMEM; -	iopte_cachep = p; - -	return platform_driver_register(&omap_iommu_driver); -} -module_init(omap_iommu_init); - -static void __exit omap_iommu_exit(void) -{ -	kmem_cache_destroy(iopte_cachep); - -	platform_driver_unregister(&omap_iommu_driver); -} -module_exit(omap_iommu_exit); - -MODULE_DESCRIPTION("omap iommu: tlb and pagetable primitives"); -MODULE_ALIAS("platform:omap-iommu"); -MODULE_AUTHOR("Hiroshi DOYU, Paul Mundt and Toshihiro Kobayashi"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/plat-omap/iopgtable.h b/arch/arm/plat-omap/iopgtable.h deleted file mode 100644 index c3e93bb0911..00000000000 --- a/arch/arm/plat-omap/iopgtable.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * omap iommu: pagetable definitions - * - * Copyright (C) 2008-2010 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __PLAT_OMAP_IOMMU_H -#define __PLAT_OMAP_IOMMU_H - -/* - * "L2 table" address mask and size definitions. - */ -#define IOPGD_SHIFT		20 -#define IOPGD_SIZE		(1UL << IOPGD_SHIFT) -#define IOPGD_MASK		(~(IOPGD_SIZE - 1)) - -/* - * "section" address mask and size definitions. - */ -#define IOSECTION_SHIFT		20 -#define IOSECTION_SIZE		(1UL << IOSECTION_SHIFT) -#define IOSECTION_MASK		(~(IOSECTION_SIZE - 1)) - -/* - * "supersection" address mask and size definitions. - */ -#define IOSUPER_SHIFT		24 -#define IOSUPER_SIZE		(1UL << IOSUPER_SHIFT) -#define IOSUPER_MASK		(~(IOSUPER_SIZE - 1)) - -#define PTRS_PER_IOPGD		(1UL << (32 - IOPGD_SHIFT)) -#define IOPGD_TABLE_SIZE	(PTRS_PER_IOPGD * sizeof(u32)) - -/* - * "small page" address mask and size definitions. - */ -#define IOPTE_SHIFT		12 -#define IOPTE_SIZE		(1UL << IOPTE_SHIFT) -#define IOPTE_MASK		(~(IOPTE_SIZE - 1)) - -/* - * "large page" address mask and size definitions. - */ -#define IOLARGE_SHIFT		16 -#define IOLARGE_SIZE		(1UL << IOLARGE_SHIFT) -#define IOLARGE_MASK		(~(IOLARGE_SIZE - 1)) - -#define PTRS_PER_IOPTE		(1UL << (IOPGD_SHIFT - IOPTE_SHIFT)) -#define IOPTE_TABLE_SIZE	(PTRS_PER_IOPTE * sizeof(u32)) - -#define IOPAGE_MASK		IOPTE_MASK - -/* - * some descriptor attributes. - */ -#define IOPGD_TABLE		(1 << 0) -#define IOPGD_SECTION		(2 << 0) -#define IOPGD_SUPER		(1 << 18 | 2 << 0) - -#define iopgd_is_table(x)	(((x) & 3) == IOPGD_TABLE) - -#define IOPTE_SMALL		(2 << 0) -#define IOPTE_LARGE		(1 << 0) - -/* to find an entry in a page-table-directory */ -#define iopgd_index(da)		(((da) >> IOPGD_SHIFT) & (PTRS_PER_IOPGD - 1)) -#define iopgd_offset(obj, da)	((obj)->iopgd + iopgd_index(da)) - -#define iopgd_page_paddr(iopgd)	(*iopgd & ~((1 << 10) - 1)) -#define iopgd_page_vaddr(iopgd)	((u32 *)phys_to_virt(iopgd_page_paddr(iopgd))) - -/* to find an entry in the second-level page table. */ -#define iopte_index(da)		(((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) -#define iopte_offset(iopgd, da)	(iopgd_page_vaddr(iopgd) + iopte_index(da)) - -static inline u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, -				   u32 flags) -{ -	memset(e, 0, sizeof(*e)); - -	e->da		= da; -	e->pa		= pa; -	e->valid	= 1; -	/* FIXME: add OMAP1 support */ -	e->pgsz		= flags & MMU_CAM_PGSZ_MASK; -	e->endian	= flags & MMU_RAM_ENDIAN_MASK; -	e->elsz		= flags & MMU_RAM_ELSZ_MASK; -	e->mixed	= flags & MMU_RAM_MIXED_MASK; - -	return iopgsz_to_bytes(e->pgsz); -} - -#define to_iommu(dev)							\ -	(struct iommu *)platform_get_drvdata(to_platform_device(dev)) - -#endif /* __PLAT_OMAP_IOMMU_H */ diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c deleted file mode 100644 index 8ce0de247c7..00000000000 --- a/arch/arm/plat-omap/iovmm.c +++ /dev/null @@ -1,903 +0,0 @@ -/* - * omap iommu: simple virtual address space management - * - * Copyright (C) 2008-2009 Nokia Corporation - * - * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.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/err.h> -#include <linux/slab.h> -#include <linux/vmalloc.h> -#include <linux/device.h> -#include <linux/scatterlist.h> - -#include <asm/cacheflush.h> -#include <asm/mach/map.h> - -#include <plat/iommu.h> -#include <plat/iovmm.h> - -#include "iopgtable.h" - -/* - * A device driver needs to create address mappings between: - * - * - iommu/device address - * - physical address - * - mpu virtual address - * - * There are 4 possible patterns for them: - * - *    |iova/			  mapping		iommu_		page - *    | da	pa	va	(d)-(p)-(v)		function	type - *  --------------------------------------------------------------------------- - *  1 | c	c	c	 1 - 1 - 1	  _kmap() / _kunmap()	s - *  2 | c	c,a	c	 1 - 1 - 1	_kmalloc()/ _kfree()	s - *  3 | c	d	c	 1 - n - 1	  _vmap() / _vunmap()	s - *  4 | c	d,a	c	 1 - n - 1	_vmalloc()/ _vfree()	n* - * - * - *	'iova':	device iommu virtual address - *	'da':	alias of 'iova' - *	'pa':	physical address - *	'va':	mpu virtual address - * - *	'c':	contiguous memory area - *	'd':	discontiguous memory area - *	'a':	anonymous memory allocation - *	'()':	optional feature - * - *	'n':	a normal page(4KB) size is used. - *	's':	multiple iommu superpage(16MB, 1MB, 64KB, 4KB) size is used. - * - *	'*':	not yet, but feasible. - */ - -static struct kmem_cache *iovm_area_cachep; - -/* return total bytes of sg buffers */ -static size_t sgtable_len(const struct sg_table *sgt) -{ -	unsigned int i, total = 0; -	struct scatterlist *sg; - -	if (!sgt) -		return 0; - -	for_each_sg(sgt->sgl, sg, sgt->nents, i) { -		size_t bytes; - -		bytes = sg_dma_len(sg); - -		if (!iopgsz_ok(bytes)) { -			pr_err("%s: sg[%d] not iommu pagesize(%x)\n", -			       __func__, i, bytes); -			return 0; -		} - -		total += bytes; -	} - -	return total; -} -#define sgtable_ok(x)	(!!sgtable_len(x)) - -/* - * calculate the optimal number sg elements from total bytes based on - * iommu superpages - */ -static unsigned int sgtable_nents(size_t bytes) -{ -	int i; -	unsigned int nr_entries; -	const unsigned long pagesize[] = { SZ_16M, SZ_1M, SZ_64K, SZ_4K, }; - -	if (!IS_ALIGNED(bytes, PAGE_SIZE)) { -		pr_err("%s: wrong size %08x\n", __func__, bytes); -		return 0; -	} - -	nr_entries = 0; -	for (i = 0; i < ARRAY_SIZE(pagesize); i++) { -		if (bytes >= pagesize[i]) { -			nr_entries += (bytes / pagesize[i]); -			bytes %= pagesize[i]; -		} -	} -	BUG_ON(bytes); - -	return nr_entries; -} - -/* allocate and initialize sg_table header(a kind of 'superblock') */ -static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags) -{ -	unsigned int nr_entries; -	int err; -	struct sg_table *sgt; - -	if (!bytes) -		return ERR_PTR(-EINVAL); - -	if (!IS_ALIGNED(bytes, PAGE_SIZE)) -		return ERR_PTR(-EINVAL); - -	/* FIXME: IOVMF_DA_FIXED should support 'superpages' */ -	if ((flags & IOVMF_LINEAR) && (flags & IOVMF_DA_ANON)) { -		nr_entries = sgtable_nents(bytes); -		if (!nr_entries) -			return ERR_PTR(-EINVAL); -	} else -		nr_entries =  bytes / PAGE_SIZE; - -	sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); -	if (!sgt) -		return ERR_PTR(-ENOMEM); - -	err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); -	if (err) { -		kfree(sgt); -		return ERR_PTR(err); -	} - -	pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); - -	return sgt; -} - -/* free sg_table header(a kind of superblock) */ -static void sgtable_free(struct sg_table *sgt) -{ -	if (!sgt) -		return; - -	sg_free_table(sgt); -	kfree(sgt); - -	pr_debug("%s: sgt:%p\n", __func__, sgt); -} - -/* map 'sglist' to a contiguous mpu virtual area and return 'va' */ -static void *vmap_sg(const struct sg_table *sgt) -{ -	u32 va; -	size_t total; -	unsigned int i; -	struct scatterlist *sg; -	struct vm_struct *new; -	const struct mem_type *mtype; - -	mtype = get_mem_type(MT_DEVICE); -	if (!mtype) -		return ERR_PTR(-EINVAL); - -	total = sgtable_len(sgt); -	if (!total) -		return ERR_PTR(-EINVAL); - -	new = __get_vm_area(total, VM_IOREMAP, VMALLOC_START, VMALLOC_END); -	if (!new) -		return ERR_PTR(-ENOMEM); -	va = (u32)new->addr; - -	for_each_sg(sgt->sgl, sg, sgt->nents, i) { -		size_t bytes; -		u32 pa; -		int err; - -		pa = sg_phys(sg); -		bytes = sg_dma_len(sg); - -		BUG_ON(bytes != PAGE_SIZE); - -		err = ioremap_page(va,  pa, mtype); -		if (err) -			goto err_out; - -		va += bytes; -	} - -	flush_cache_vmap((unsigned long)new->addr, -				(unsigned long)(new->addr + total)); -	return new->addr; - -err_out: -	WARN_ON(1); /* FIXME: cleanup some mpu mappings */ -	vunmap(new->addr); -	return ERR_PTR(-EAGAIN); -} - -static inline void vunmap_sg(const void *va) -{ -	vunmap(va); -} - -static struct iovm_struct *__find_iovm_area(struct iommu *obj, const u32 da) -{ -	struct iovm_struct *tmp; - -	list_for_each_entry(tmp, &obj->mmap, list) { -		if ((da >= tmp->da_start) && (da < tmp->da_end)) { -			size_t len; - -			len = tmp->da_end - tmp->da_start; - -			dev_dbg(obj->dev, "%s: %08x-%08x-%08x(%x) %08x\n", -				__func__, tmp->da_start, da, tmp->da_end, len, -				tmp->flags); - -			return tmp; -		} -	} - -	return NULL; -} - -/** - * find_iovm_area  -  find iovma which includes @da - * @da:		iommu device virtual address - * - * Find the existing iovma starting at @da - */ -struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da) -{ -	struct iovm_struct *area; - -	mutex_lock(&obj->mmap_lock); -	area = __find_iovm_area(obj, da); -	mutex_unlock(&obj->mmap_lock); - -	return area; -} -EXPORT_SYMBOL_GPL(find_iovm_area); - -/* - * This finds the hole(area) which fits the requested address and len - * in iovmas mmap, and returns the new allocated iovma. - */ -static struct iovm_struct *alloc_iovm_area(struct iommu *obj, u32 da, -					   size_t bytes, u32 flags) -{ -	struct iovm_struct *new, *tmp; -	u32 start, prev_end, alignement; - -	if (!obj || !bytes) -		return ERR_PTR(-EINVAL); - -	start = da; -	alignement = PAGE_SIZE; - -	if (flags & IOVMF_DA_ANON) { -		/* -		 * Reserve the first page for NULL -		 */ -		start = PAGE_SIZE; -		if (flags & IOVMF_LINEAR) -			alignement = iopgsz_max(bytes); -		start = roundup(start, alignement); -	} - -	tmp = NULL; -	if (list_empty(&obj->mmap)) -		goto found; - -	prev_end = 0; -	list_for_each_entry(tmp, &obj->mmap, list) { - -		if (prev_end >= start) -			break; - -		if (start + bytes < tmp->da_start) -			goto found; - -		if (flags & IOVMF_DA_ANON) -			start = roundup(tmp->da_end + 1, alignement); - -		prev_end = tmp->da_end; -	} - -	if ((start > prev_end) && (ULONG_MAX - start >= bytes)) -		goto found; - -	dev_dbg(obj->dev, "%s: no space to fit %08x(%x) flags: %08x\n", -		__func__, da, bytes, flags); - -	return ERR_PTR(-EINVAL); - -found: -	new = kmem_cache_zalloc(iovm_area_cachep, GFP_KERNEL); -	if (!new) -		return ERR_PTR(-ENOMEM); - -	new->iommu = obj; -	new->da_start = start; -	new->da_end = start + bytes; -	new->flags = flags; - -	/* -	 * keep ascending order of iovmas -	 */ -	if (tmp) -		list_add_tail(&new->list, &tmp->list); -	else -		list_add(&new->list, &obj->mmap); - -	dev_dbg(obj->dev, "%s: found %08x-%08x-%08x(%x) %08x\n", -		__func__, new->da_start, start, new->da_end, bytes, flags); - -	return new; -} - -static void free_iovm_area(struct iommu *obj, struct iovm_struct *area) -{ -	size_t bytes; - -	BUG_ON(!obj || !area); - -	bytes = area->da_end - area->da_start; - -	dev_dbg(obj->dev, "%s: %08x-%08x(%x) %08x\n", -		__func__, area->da_start, area->da_end, bytes, area->flags); - -	list_del(&area->list); -	kmem_cache_free(iovm_area_cachep, area); -} - -/** - * da_to_va - convert (d) to (v) - * @obj:	objective iommu - * @da:		iommu device virtual address - * @va:		mpu virtual address - * - * Returns mpu virtual addr which corresponds to a given device virtual addr - */ -void *da_to_va(struct iommu *obj, u32 da) -{ -	void *va = NULL; -	struct iovm_struct *area; - -	mutex_lock(&obj->mmap_lock); - -	area = __find_iovm_area(obj, da); -	if (!area) { -		dev_dbg(obj->dev, "%s: no da area(%08x)\n", __func__, da); -		goto out; -	} -	va = area->va; -out: -	mutex_unlock(&obj->mmap_lock); - -	return va; -} -EXPORT_SYMBOL_GPL(da_to_va); - -static void sgtable_fill_vmalloc(struct sg_table *sgt, void *_va) -{ -	unsigned int i; -	struct scatterlist *sg; -	void *va = _va; -	void *va_end; - -	for_each_sg(sgt->sgl, sg, sgt->nents, i) { -		struct page *pg; -		const size_t bytes = PAGE_SIZE; - -		/* -		 * iommu 'superpage' isn't supported with 'iommu_vmalloc()' -		 */ -		pg = vmalloc_to_page(va); -		BUG_ON(!pg); -		sg_set_page(sg, pg, bytes, 0); - -		va += bytes; -	} - -	va_end = _va + PAGE_SIZE * i; -} - -static inline void sgtable_drain_vmalloc(struct sg_table *sgt) -{ -	/* -	 * Actually this is not necessary at all, just exists for -	 * consistency of the code readability. -	 */ -	BUG_ON(!sgt); -} - -static void sgtable_fill_kmalloc(struct sg_table *sgt, u32 pa, size_t len) -{ -	unsigned int i; -	struct scatterlist *sg; -	void *va; - -	va = phys_to_virt(pa); - -	for_each_sg(sgt->sgl, sg, sgt->nents, i) { -		size_t bytes; - -		bytes = iopgsz_max(len); - -		BUG_ON(!iopgsz_ok(bytes)); - -		sg_set_buf(sg, phys_to_virt(pa), bytes); -		/* -		 * 'pa' is cotinuous(linear). -		 */ -		pa += bytes; -		len -= bytes; -	} -	BUG_ON(len); -} - -static inline void sgtable_drain_kmalloc(struct sg_table *sgt) -{ -	/* -	 * Actually this is not necessary at all, just exists for -	 * consistency of the code readability -	 */ -	BUG_ON(!sgt); -} - -/* create 'da' <-> 'pa' mapping from 'sgt' */ -static int map_iovm_area(struct iommu *obj, struct iovm_struct *new, -			 const struct sg_table *sgt, u32 flags) -{ -	int err; -	unsigned int i, j; -	struct scatterlist *sg; -	u32 da = new->da_start; - -	if (!obj || !sgt) -		return -EINVAL; - -	BUG_ON(!sgtable_ok(sgt)); - -	for_each_sg(sgt->sgl, sg, sgt->nents, i) { -		u32 pa; -		int pgsz; -		size_t bytes; -		struct iotlb_entry e; - -		pa = sg_phys(sg); -		bytes = sg_dma_len(sg); - -		flags &= ~IOVMF_PGSZ_MASK; -		pgsz = bytes_to_iopgsz(bytes); -		if (pgsz < 0) -			goto err_out; -		flags |= pgsz; - -		pr_debug("%s: [%d] %08x %08x(%x)\n", __func__, -			 i, da, pa, bytes); - -		iotlb_init_entry(&e, da, pa, flags); -		err = iopgtable_store_entry(obj, &e); -		if (err) -			goto err_out; - -		da += bytes; -	} -	return 0; - -err_out: -	da = new->da_start; - -	for_each_sg(sgt->sgl, sg, i, j) { -		size_t bytes; - -		bytes = iopgtable_clear_entry(obj, da); - -		BUG_ON(!iopgsz_ok(bytes)); - -		da += bytes; -	} -	return err; -} - -/* release 'da' <-> 'pa' mapping */ -static void unmap_iovm_area(struct iommu *obj, struct iovm_struct *area) -{ -	u32 start; -	size_t total = area->da_end - area->da_start; - -	BUG_ON((!total) || !IS_ALIGNED(total, PAGE_SIZE)); - -	start = area->da_start; -	while (total > 0) { -		size_t bytes; - -		bytes = iopgtable_clear_entry(obj, start); -		if (bytes == 0) -			bytes = PAGE_SIZE; -		else -			dev_dbg(obj->dev, "%s: unmap %08x(%x) %08x\n", -				__func__, start, bytes, area->flags); - -		BUG_ON(!IS_ALIGNED(bytes, PAGE_SIZE)); - -		total -= bytes; -		start += bytes; -	} -	BUG_ON(total); -} - -/* template function for all unmapping */ -static struct sg_table *unmap_vm_area(struct iommu *obj, const u32 da, -				      void (*fn)(const void *), u32 flags) -{ -	struct sg_table *sgt = NULL; -	struct iovm_struct *area; - -	if (!IS_ALIGNED(da, PAGE_SIZE)) { -		dev_err(obj->dev, "%s: alignment err(%08x)\n", __func__, da); -		return NULL; -	} - -	mutex_lock(&obj->mmap_lock); - -	area = __find_iovm_area(obj, da); -	if (!area) { -		dev_dbg(obj->dev, "%s: no da area(%08x)\n", __func__, da); -		goto out; -	} - -	if ((area->flags & flags) != flags) { -		dev_err(obj->dev, "%s: wrong flags(%08x)\n", __func__, -			area->flags); -		goto out; -	} -	sgt = (struct sg_table *)area->sgt; - -	unmap_iovm_area(obj, area); - -	fn(area->va); - -	dev_dbg(obj->dev, "%s: %08x-%08x-%08x(%x) %08x\n", __func__, -		area->da_start, da, area->da_end, -		area->da_end - area->da_start, area->flags); - -	free_iovm_area(obj, area); -out: -	mutex_unlock(&obj->mmap_lock); - -	return sgt; -} - -static u32 map_iommu_region(struct iommu *obj, u32 da, -	      const struct sg_table *sgt, void *va, size_t bytes, u32 flags) -{ -	int err = -ENOMEM; -	struct iovm_struct *new; - -	mutex_lock(&obj->mmap_lock); - -	new = alloc_iovm_area(obj, da, bytes, flags); -	if (IS_ERR(new)) { -		err = PTR_ERR(new); -		goto err_alloc_iovma; -	} -	new->va = va; -	new->sgt = sgt; - -	if (map_iovm_area(obj, new, sgt, new->flags)) -		goto err_map; - -	mutex_unlock(&obj->mmap_lock); - -	dev_dbg(obj->dev, "%s: da:%08x(%x) flags:%08x va:%p\n", -		__func__, new->da_start, bytes, new->flags, va); - -	return new->da_start; - -err_map: -	free_iovm_area(obj, new); -err_alloc_iovma: -	mutex_unlock(&obj->mmap_lock); -	return err; -} - -static inline u32 __iommu_vmap(struct iommu *obj, u32 da, -		 const struct sg_table *sgt, void *va, size_t bytes, u32 flags) -{ -	return map_iommu_region(obj, da, sgt, va, bytes, flags); -} - -/** - * iommu_vmap  -  (d)-(p)-(v) address mapper - * @obj:	objective iommu - * @sgt:	address of scatter gather table - * @flags:	iovma and page property - * - * Creates 1-n-1 mapping with given @sgt and returns @da. - * All @sgt element must be io page size aligned. - */ -u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt, -		 u32 flags) -{ -	size_t bytes; -	void *va = NULL; - -	if (!obj || !obj->dev || !sgt) -		return -EINVAL; - -	bytes = sgtable_len(sgt); -	if (!bytes) -		return -EINVAL; -	bytes = PAGE_ALIGN(bytes); - -	if (flags & IOVMF_MMIO) { -		va = vmap_sg(sgt); -		if (IS_ERR(va)) -			return PTR_ERR(va); -	} - -	flags &= IOVMF_HW_MASK; -	flags |= IOVMF_DISCONT; -	flags |= IOVMF_MMIO; -	flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); - -	da = __iommu_vmap(obj, da, sgt, va, bytes, flags); -	if (IS_ERR_VALUE(da)) -		vunmap_sg(va); - -	return da; -} -EXPORT_SYMBOL_GPL(iommu_vmap); - -/** - * iommu_vunmap  -  release virtual mapping obtained by 'iommu_vmap()' - * @obj:	objective iommu - * @da:		iommu device virtual address - * - * Free the iommu virtually contiguous memory area starting at - * @da, which was returned by 'iommu_vmap()'. - */ -struct sg_table *iommu_vunmap(struct iommu *obj, u32 da) -{ -	struct sg_table *sgt; -	/* -	 * 'sgt' is allocated before 'iommu_vmalloc()' is called. -	 * Just returns 'sgt' to the caller to free -	 */ -	sgt = unmap_vm_area(obj, da, vunmap_sg, IOVMF_DISCONT | IOVMF_MMIO); -	if (!sgt) -		dev_dbg(obj->dev, "%s: No sgt\n", __func__); -	return sgt; -} -EXPORT_SYMBOL_GPL(iommu_vunmap); - -/** - * iommu_vmalloc  -  (d)-(p)-(v) address allocator and mapper - * @obj:	objective iommu - * @da:		contiguous iommu virtual memory - * @bytes:	allocation size - * @flags:	iovma and page property - * - * Allocate @bytes linearly and creates 1-n-1 mapping and returns - * @da again, which might be adjusted if 'IOVMF_DA_ANON' is set. - */ -u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) -{ -	void *va; -	struct sg_table *sgt; - -	if (!obj || !obj->dev || !bytes) -		return -EINVAL; - -	bytes = PAGE_ALIGN(bytes); - -	va = vmalloc(bytes); -	if (!va) -		return -ENOMEM; - -	sgt = sgtable_alloc(bytes, flags); -	if (IS_ERR(sgt)) { -		da = PTR_ERR(sgt); -		goto err_sgt_alloc; -	} -	sgtable_fill_vmalloc(sgt, va); - -	flags &= IOVMF_HW_MASK; -	flags |= IOVMF_DISCONT; -	flags |= IOVMF_ALLOC; -	flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); - -	da = __iommu_vmap(obj, da, sgt, va, bytes, flags); -	if (IS_ERR_VALUE(da)) -		goto err_iommu_vmap; - -	return da; - -err_iommu_vmap: -	sgtable_drain_vmalloc(sgt); -	sgtable_free(sgt); -err_sgt_alloc: -	vfree(va); -	return da; -} -EXPORT_SYMBOL_GPL(iommu_vmalloc); - -/** - * iommu_vfree  -  release memory allocated by 'iommu_vmalloc()' - * @obj:	objective iommu - * @da:		iommu device virtual address - * - * Frees the iommu virtually continuous memory area starting at - * @da, as obtained from 'iommu_vmalloc()'. - */ -void iommu_vfree(struct iommu *obj, const u32 da) -{ -	struct sg_table *sgt; - -	sgt = unmap_vm_area(obj, da, vfree, IOVMF_DISCONT | IOVMF_ALLOC); -	if (!sgt) -		dev_dbg(obj->dev, "%s: No sgt\n", __func__); -	sgtable_free(sgt); -} -EXPORT_SYMBOL_GPL(iommu_vfree); - -static u32 __iommu_kmap(struct iommu *obj, u32 da, u32 pa, void *va, -			  size_t bytes, u32 flags) -{ -	struct sg_table *sgt; - -	sgt = sgtable_alloc(bytes, flags); -	if (IS_ERR(sgt)) -		return PTR_ERR(sgt); - -	sgtable_fill_kmalloc(sgt, pa, bytes); - -	da = map_iommu_region(obj, da, sgt, va, bytes, flags); -	if (IS_ERR_VALUE(da)) { -		sgtable_drain_kmalloc(sgt); -		sgtable_free(sgt); -	} - -	return da; -} - -/** - * iommu_kmap  -  (d)-(p)-(v) address mapper - * @obj:	objective iommu - * @da:		contiguous iommu virtual memory - * @pa:		contiguous physical memory - * @flags:	iovma and page property - * - * Creates 1-1-1 mapping and returns @da again, which can be - * adjusted if 'IOVMF_DA_ANON' is set. - */ -u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, -		 u32 flags) -{ -	void *va; - -	if (!obj || !obj->dev || !bytes) -		return -EINVAL; - -	bytes = PAGE_ALIGN(bytes); - -	va = ioremap(pa, bytes); -	if (!va) -		return -ENOMEM; - -	flags &= IOVMF_HW_MASK; -	flags |= IOVMF_LINEAR; -	flags |= IOVMF_MMIO; -	flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); - -	da = __iommu_kmap(obj, da, pa, va, bytes, flags); -	if (IS_ERR_VALUE(da)) -		iounmap(va); - -	return da; -} -EXPORT_SYMBOL_GPL(iommu_kmap); - -/** - * iommu_kunmap  -  release virtual mapping obtained by 'iommu_kmap()' - * @obj:	objective iommu - * @da:		iommu device virtual address - * - * Frees the iommu virtually contiguous memory area starting at - * @da, which was passed to and was returned by'iommu_kmap()'. - */ -void iommu_kunmap(struct iommu *obj, u32 da) -{ -	struct sg_table *sgt; -	typedef void (*func_t)(const void *); - -	sgt = unmap_vm_area(obj, da, (func_t)__iounmap, -			    IOVMF_LINEAR | IOVMF_MMIO); -	if (!sgt) -		dev_dbg(obj->dev, "%s: No sgt\n", __func__); -	sgtable_free(sgt); -} -EXPORT_SYMBOL_GPL(iommu_kunmap); - -/** - * iommu_kmalloc  -  (d)-(p)-(v) address allocator and mapper - * @obj:	objective iommu - * @da:		contiguous iommu virtual memory - * @bytes:	bytes for allocation - * @flags:	iovma and page property - * - * Allocate @bytes linearly and creates 1-1-1 mapping and returns - * @da again, which might be adjusted if 'IOVMF_DA_ANON' is set. - */ -u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, u32 flags) -{ -	void *va; -	u32 pa; - -	if (!obj || !obj->dev || !bytes) -		return -EINVAL; - -	bytes = PAGE_ALIGN(bytes); - -	va = kmalloc(bytes, GFP_KERNEL | GFP_DMA); -	if (!va) -		return -ENOMEM; -	pa = virt_to_phys(va); - -	flags &= IOVMF_HW_MASK; -	flags |= IOVMF_LINEAR; -	flags |= IOVMF_ALLOC; -	flags |= (da ? IOVMF_DA_FIXED : IOVMF_DA_ANON); - -	da = __iommu_kmap(obj, da, pa, va, bytes, flags); -	if (IS_ERR_VALUE(da)) -		kfree(va); - -	return da; -} -EXPORT_SYMBOL_GPL(iommu_kmalloc); - -/** - * iommu_kfree  -  release virtual mapping obtained by 'iommu_kmalloc()' - * @obj:	objective iommu - * @da:		iommu device virtual address - * - * Frees the iommu virtually contiguous memory area starting at - * @da, which was passed to and was returned by'iommu_kmalloc()'. - */ -void iommu_kfree(struct iommu *obj, u32 da) -{ -	struct sg_table *sgt; - -	sgt = unmap_vm_area(obj, da, kfree, IOVMF_LINEAR | IOVMF_ALLOC); -	if (!sgt) -		dev_dbg(obj->dev, "%s: No sgt\n", __func__); -	sgtable_free(sgt); -} -EXPORT_SYMBOL_GPL(iommu_kfree); - - -static int __init iovmm_init(void) -{ -	const unsigned long flags = SLAB_HWCACHE_ALIGN; -	struct kmem_cache *p; - -	p = kmem_cache_create("iovm_area_cache", sizeof(struct iovm_struct), 0, -			      flags, NULL); -	if (!p) -		return -ENOMEM; -	iovm_area_cachep = p; - -	return 0; -} -module_init(iovmm_init); - -static void __exit iovmm_exit(void) -{ -	kmem_cache_destroy(iovm_area_cachep); -} -module_exit(iovmm_exit); - -MODULE_DESCRIPTION("omap iommu: simple virtual address space management"); -MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>"); -MODULE_LICENSE("GPL v2"); diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c deleted file mode 100644 index d2fafb892f7..00000000000 --- a/arch/arm/plat-omap/mailbox.c +++ /dev/null @@ -1,410 +0,0 @@ -/* - * OMAP mailbox driver - * - * Copyright (C) 2006-2009 Nokia Corporation. All rights reserved. - * - * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.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 <linux/interrupt.h> -#include <linux/spinlock.h> -#include <linux/mutex.h> -#include <linux/delay.h> -#include <linux/slab.h> -#include <linux/kfifo.h> -#include <linux/err.h> - -#include <plat/mailbox.h> - -static struct workqueue_struct *mboxd; -static struct omap_mbox **mboxes; -static bool rq_full; - -static int mbox_configured; -static DEFINE_MUTEX(mbox_configured_lock); - -static unsigned int mbox_kfifo_size = CONFIG_OMAP_MBOX_KFIFO_SIZE; -module_param(mbox_kfifo_size, uint, S_IRUGO); -MODULE_PARM_DESC(mbox_kfifo_size, "Size of omap's mailbox kfifo (bytes)"); - -/* Mailbox FIFO handle functions */ -static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox) -{ -	return mbox->ops->fifo_read(mbox); -} -static inline void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) -{ -	mbox->ops->fifo_write(mbox, msg); -} -static inline int mbox_fifo_empty(struct omap_mbox *mbox) -{ -	return mbox->ops->fifo_empty(mbox); -} -static inline int mbox_fifo_full(struct omap_mbox *mbox) -{ -	return mbox->ops->fifo_full(mbox); -} - -/* Mailbox IRQ handle functions */ -static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) -{ -	if (mbox->ops->ack_irq) -		mbox->ops->ack_irq(mbox, irq); -} -static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) -{ -	return mbox->ops->is_irq(mbox, irq); -} - -/* - * message sender - */ -static int __mbox_poll_for_space(struct omap_mbox *mbox) -{ -	int ret = 0, i = 1000; - -	while (mbox_fifo_full(mbox)) { -		if (mbox->ops->type == OMAP_MBOX_TYPE2) -			return -1; -		if (--i == 0) -			return -1; -		udelay(1); -	} -	return ret; -} - -int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) -{ -	struct omap_mbox_queue *mq = mbox->txq; -	int ret = 0, len; - -	spin_lock(&mq->lock); - -	if (kfifo_avail(&mq->fifo) < sizeof(msg)) { -		ret = -ENOMEM; -		goto out; -	} - -	len = kfifo_in(&mq->fifo, (unsigned char *)&msg, sizeof(msg)); -	WARN_ON(len != sizeof(msg)); - -	tasklet_schedule(&mbox->txq->tasklet); - -out: -	spin_unlock(&mq->lock); -	return ret; -} -EXPORT_SYMBOL(omap_mbox_msg_send); - -static void mbox_tx_tasklet(unsigned long tx_data) -{ -	struct omap_mbox *mbox = (struct omap_mbox *)tx_data; -	struct omap_mbox_queue *mq = mbox->txq; -	mbox_msg_t msg; -	int ret; - -	while (kfifo_len(&mq->fifo)) { -		if (__mbox_poll_for_space(mbox)) { -			omap_mbox_enable_irq(mbox, IRQ_TX); -			break; -		} - -		ret = kfifo_out(&mq->fifo, (unsigned char *)&msg, -								sizeof(msg)); -		WARN_ON(ret != sizeof(msg)); - -		mbox_fifo_write(mbox, msg); -	} -} - -/* - * Message receiver(workqueue) - */ -static void mbox_rx_work(struct work_struct *work) -{ -	struct omap_mbox_queue *mq = -			container_of(work, struct omap_mbox_queue, work); -	mbox_msg_t msg; -	int len; - -	while (kfifo_len(&mq->fifo) >= sizeof(msg)) { -		len = kfifo_out(&mq->fifo, (unsigned char *)&msg, sizeof(msg)); -		WARN_ON(len != sizeof(msg)); - -		if (mq->callback) -			mq->callback((void *)msg); -	} -} - -/* - * Mailbox interrupt handler - */ -static void __mbox_tx_interrupt(struct omap_mbox *mbox) -{ -	omap_mbox_disable_irq(mbox, IRQ_TX); -	ack_mbox_irq(mbox, IRQ_TX); -	tasklet_schedule(&mbox->txq->tasklet); -} - -static void __mbox_rx_interrupt(struct omap_mbox *mbox) -{ -	struct omap_mbox_queue *mq = mbox->rxq; -	mbox_msg_t msg; -	int len; - -	while (!mbox_fifo_empty(mbox)) { -		if (unlikely(kfifo_avail(&mq->fifo) < sizeof(msg))) { -			omap_mbox_disable_irq(mbox, IRQ_RX); -			rq_full = true; -			goto nomem; -		} - -		msg = mbox_fifo_read(mbox); - -		len = kfifo_in(&mq->fifo, (unsigned char *)&msg, sizeof(msg)); -		WARN_ON(len != sizeof(msg)); - -		if (mbox->ops->type == OMAP_MBOX_TYPE1) -			break; -	} - -	/* no more messages in the fifo. clear IRQ source. */ -	ack_mbox_irq(mbox, IRQ_RX); -nomem: -	queue_work(mboxd, &mbox->rxq->work); -} - -static irqreturn_t mbox_interrupt(int irq, void *p) -{ -	struct omap_mbox *mbox = p; - -	if (is_mbox_irq(mbox, IRQ_TX)) -		__mbox_tx_interrupt(mbox); - -	if (is_mbox_irq(mbox, IRQ_RX)) -		__mbox_rx_interrupt(mbox); - -	return IRQ_HANDLED; -} - -static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, -					void (*work) (struct work_struct *), -					void (*tasklet)(unsigned long)) -{ -	struct omap_mbox_queue *mq; - -	mq = kzalloc(sizeof(struct omap_mbox_queue), GFP_KERNEL); -	if (!mq) -		return NULL; - -	spin_lock_init(&mq->lock); - -	if (kfifo_alloc(&mq->fifo, mbox_kfifo_size, GFP_KERNEL)) -		goto error; - -	if (work) -		INIT_WORK(&mq->work, work); - -	if (tasklet) -		tasklet_init(&mq->tasklet, tasklet, (unsigned long)mbox); -	return mq; -error: -	kfree(mq); -	return NULL; -} - -static void mbox_queue_free(struct omap_mbox_queue *q) -{ -	kfifo_free(&q->fifo); -	kfree(q); -} - -static int omap_mbox_startup(struct omap_mbox *mbox) -{ -	int ret = 0; -	struct omap_mbox_queue *mq; - -	if (mbox->ops->startup) { -		mutex_lock(&mbox_configured_lock); -		if (!mbox_configured) -			ret = mbox->ops->startup(mbox); - -		if (ret) { -			mutex_unlock(&mbox_configured_lock); -			return ret; -		} -		mbox_configured++; -		mutex_unlock(&mbox_configured_lock); -	} - -	ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, -				mbox->name, mbox); -	if (ret) { -		printk(KERN_ERR -			"failed to register mailbox interrupt:%d\n", ret); -		goto fail_request_irq; -	} - -	mq = mbox_queue_alloc(mbox, NULL, mbox_tx_tasklet); -	if (!mq) { -		ret = -ENOMEM; -		goto fail_alloc_txq; -	} -	mbox->txq = mq; - -	mq = mbox_queue_alloc(mbox, mbox_rx_work, NULL); -	if (!mq) { -		ret = -ENOMEM; -		goto fail_alloc_rxq; -	} -	mbox->rxq = mq; - -	return 0; - - fail_alloc_rxq: -	mbox_queue_free(mbox->txq); - fail_alloc_txq: -	free_irq(mbox->irq, mbox); - fail_request_irq: -	if (mbox->ops->shutdown) -		mbox->ops->shutdown(mbox); - -	return ret; -} - -static void omap_mbox_fini(struct omap_mbox *mbox) -{ -	free_irq(mbox->irq, mbox); -	tasklet_kill(&mbox->txq->tasklet); -	flush_work(&mbox->rxq->work); -	mbox_queue_free(mbox->txq); -	mbox_queue_free(mbox->rxq); - -	if (mbox->ops->shutdown) { -		mutex_lock(&mbox_configured_lock); -		if (mbox_configured > 0) -			mbox_configured--; -		if (!mbox_configured) -			mbox->ops->shutdown(mbox); -		mutex_unlock(&mbox_configured_lock); -	} -} - -struct omap_mbox *omap_mbox_get(const char *name) -{ -	struct omap_mbox *mbox; -	int ret; - -	if (!mboxes) -		return ERR_PTR(-EINVAL); - -	for (mbox = *mboxes; mbox; mbox++) -		if (!strcmp(mbox->name, name)) -			break; - -	if (!mbox) -		return ERR_PTR(-ENOENT); - -	ret = omap_mbox_startup(mbox); -	if (ret) -		return ERR_PTR(-ENODEV); - -	return mbox; -} -EXPORT_SYMBOL(omap_mbox_get); - -void omap_mbox_put(struct omap_mbox *mbox) -{ -	omap_mbox_fini(mbox); -} -EXPORT_SYMBOL(omap_mbox_put); - -static struct class omap_mbox_class = { .name = "mbox", }; - -int omap_mbox_register(struct device *parent, struct omap_mbox **list) -{ -	int ret; -	int i; - -	mboxes = list; -	if (!mboxes) -		return -EINVAL; - -	for (i = 0; mboxes[i]; i++) { -		struct omap_mbox *mbox = mboxes[i]; -		mbox->dev = device_create(&omap_mbox_class, -				parent, 0, mbox, "%s", mbox->name); -		if (IS_ERR(mbox->dev)) { -			ret = PTR_ERR(mbox->dev); -			goto err_out; -		} -	} -	return 0; - -err_out: -	while (i--) -		device_unregister(mboxes[i]->dev); -	return ret; -} -EXPORT_SYMBOL(omap_mbox_register); - -int omap_mbox_unregister(void) -{ -	int i; - -	if (!mboxes) -		return -EINVAL; - -	for (i = 0; mboxes[i]; i++) -		device_unregister(mboxes[i]->dev); -	mboxes = NULL; -	return 0; -} -EXPORT_SYMBOL(omap_mbox_unregister); - -static int __init omap_mbox_init(void) -{ -	int err; - -	err = class_register(&omap_mbox_class); -	if (err) -		return err; - -	mboxd = create_workqueue("mboxd"); -	if (!mboxd) -		return -ENOMEM; - -	/* kfifo size sanity check: alignment and minimal size */ -	mbox_kfifo_size = ALIGN(mbox_kfifo_size, sizeof(mbox_msg_t)); -	mbox_kfifo_size = max_t(unsigned int, mbox_kfifo_size, sizeof(mbox_msg_t)); - -	return 0; -} -subsys_initcall(omap_mbox_init); - -static void __exit omap_mbox_exit(void) -{ -	destroy_workqueue(mboxd); -	class_unregister(&omap_mbox_class); -} -module_exit(omap_mbox_exit); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("omap mailbox: interrupt driven messaging"); -MODULE_AUTHOR("Toshihiro Kobayashi"); -MODULE_AUTHOR("Hiroshi DOYU"); diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c deleted file mode 100644 index eac4b978e9f..00000000000 --- a/arch/arm/plat-omap/mcbsp.c +++ /dev/null @@ -1,1867 +0,0 @@ -/* - * linux/arch/arm/plat-omap/mcbsp.c - * - * Copyright (C) 2004 Nokia Corporation - * Author: Samuel Ortiz <samuel.ortiz@nokia.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. - * - * Multichannel mode not supported. - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/wait.h> -#include <linux/completion.h> -#include <linux/interrupt.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/delay.h> -#include <linux/io.h> -#include <linux/slab.h> - -#include <plat/dma.h> -#include <plat/mcbsp.h> - -#include "../mach-omap2/cm-regbits-34xx.h" - -struct omap_mcbsp **mcbsp_ptr; -int omap_mcbsp_count, omap_mcbsp_cache_size; - -static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) -{ -	if (cpu_class_is_omap1()) { -		((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)] = (u16)val; -		__raw_writew((u16)val, mcbsp->io_base + reg); -	} else if (cpu_is_omap2420()) { -		((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)] = (u16)val; -		__raw_writew((u16)val, mcbsp->io_base + reg); -	} else { -		((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)] = val; -		__raw_writel(val, mcbsp->io_base + reg); -	} -} - -static int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, bool from_cache) -{ -	if (cpu_class_is_omap1()) { -		return !from_cache ? __raw_readw(mcbsp->io_base + reg) : -				((u16 *)mcbsp->reg_cache)[reg / sizeof(u16)]; -	} else if (cpu_is_omap2420()) { -		return !from_cache ? __raw_readw(mcbsp->io_base + reg) : -				((u16 *)mcbsp->reg_cache)[reg / sizeof(u32)]; -	} else { -		return !from_cache ? __raw_readl(mcbsp->io_base + reg) : -				((u32 *)mcbsp->reg_cache)[reg / sizeof(u32)]; -	} -} - -#ifdef CONFIG_ARCH_OMAP3 -static void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) -{ -	__raw_writel(val, mcbsp->st_data->io_base_st + reg); -} - -static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg) -{ -	return __raw_readl(mcbsp->st_data->io_base_st + reg); -} -#endif - -#define MCBSP_READ(mcbsp, reg) \ -		omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0) -#define MCBSP_WRITE(mcbsp, reg, val) \ -		omap_mcbsp_write(mcbsp, OMAP_MCBSP_REG_##reg, val) -#define MCBSP_READ_CACHE(mcbsp, reg) \ -		omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1) - -#define MCBSP_ST_READ(mcbsp, reg) \ -			omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg) -#define MCBSP_ST_WRITE(mcbsp, reg, val) \ -			omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val) - -static void omap_mcbsp_dump_reg(u8 id) -{ -	struct omap_mcbsp *mcbsp = id_to_mcbsp_ptr(id); - -	dev_dbg(mcbsp->dev, "**** McBSP%d regs ****\n", mcbsp->id); -	dev_dbg(mcbsp->dev, "DRR2:  0x%04x\n", -			MCBSP_READ(mcbsp, DRR2)); -	dev_dbg(mcbsp->dev, "DRR1:  0x%04x\n", -			MCBSP_READ(mcbsp, DRR1)); -	dev_dbg(mcbsp->dev, "DXR2:  0x%04x\n", -			MCBSP_READ(mcbsp, DXR2)); -	dev_dbg(mcbsp->dev, "DXR1:  0x%04x\n", -			MCBSP_READ(mcbsp, DXR1)); -	dev_dbg(mcbsp->dev, "SPCR2: 0x%04x\n", -			MCBSP_READ(mcbsp, SPCR2)); -	dev_dbg(mcbsp->dev, "SPCR1: 0x%04x\n", -			MCBSP_READ(mcbsp, SPCR1)); -	dev_dbg(mcbsp->dev, "RCR2:  0x%04x\n", -			MCBSP_READ(mcbsp, RCR2)); -	dev_dbg(mcbsp->dev, "RCR1:  0x%04x\n", -			MCBSP_READ(mcbsp, RCR1)); -	dev_dbg(mcbsp->dev, "XCR2:  0x%04x\n", -			MCBSP_READ(mcbsp, XCR2)); -	dev_dbg(mcbsp->dev, "XCR1:  0x%04x\n", -			MCBSP_READ(mcbsp, XCR1)); -	dev_dbg(mcbsp->dev, "SRGR2: 0x%04x\n", -			MCBSP_READ(mcbsp, SRGR2)); -	dev_dbg(mcbsp->dev, "SRGR1: 0x%04x\n", -			MCBSP_READ(mcbsp, SRGR1)); -	dev_dbg(mcbsp->dev, "PCR0:  0x%04x\n", -			MCBSP_READ(mcbsp, PCR0)); -	dev_dbg(mcbsp->dev, "***********************\n"); -} - -static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id) -{ -	struct omap_mcbsp *mcbsp_tx = dev_id; -	u16 irqst_spcr2; - -	irqst_spcr2 = MCBSP_READ(mcbsp_tx, SPCR2); -	dev_dbg(mcbsp_tx->dev, "TX IRQ callback : 0x%x\n", irqst_spcr2); - -	if (irqst_spcr2 & XSYNC_ERR) { -		dev_err(mcbsp_tx->dev, "TX Frame Sync Error! : 0x%x\n", -			irqst_spcr2); -		/* Writing zero to XSYNC_ERR clears the IRQ */ -		MCBSP_WRITE(mcbsp_tx, SPCR2, MCBSP_READ_CACHE(mcbsp_tx, SPCR2)); -	} else { -		complete(&mcbsp_tx->tx_irq_completion); -	} - -	return IRQ_HANDLED; -} - -static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id) -{ -	struct omap_mcbsp *mcbsp_rx = dev_id; -	u16 irqst_spcr1; - -	irqst_spcr1 = MCBSP_READ(mcbsp_rx, SPCR1); -	dev_dbg(mcbsp_rx->dev, "RX IRQ callback : 0x%x\n", irqst_spcr1); - -	if (irqst_spcr1 & RSYNC_ERR) { -		dev_err(mcbsp_rx->dev, "RX Frame Sync Error! : 0x%x\n", -			irqst_spcr1); -		/* Writing zero to RSYNC_ERR clears the IRQ */ -		MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1)); -	} else { -		complete(&mcbsp_rx->rx_irq_completion); -	} - -	return IRQ_HANDLED; -} - -static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data) -{ -	struct omap_mcbsp *mcbsp_dma_tx = data; - -	dev_dbg(mcbsp_dma_tx->dev, "TX DMA callback : 0x%x\n", -		MCBSP_READ(mcbsp_dma_tx, SPCR2)); - -	/* We can free the channels */ -	omap_free_dma(mcbsp_dma_tx->dma_tx_lch); -	mcbsp_dma_tx->dma_tx_lch = -1; - -	complete(&mcbsp_dma_tx->tx_dma_completion); -} - -static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data) -{ -	struct omap_mcbsp *mcbsp_dma_rx = data; - -	dev_dbg(mcbsp_dma_rx->dev, "RX DMA callback : 0x%x\n", -		MCBSP_READ(mcbsp_dma_rx, SPCR2)); - -	/* We can free the channels */ -	omap_free_dma(mcbsp_dma_rx->dma_rx_lch); -	mcbsp_dma_rx->dma_rx_lch = -1; - -	complete(&mcbsp_dma_rx->rx_dma_completion); -} - -/* - * omap_mcbsp_config simply write a config to the - * appropriate McBSP. - * You either call this function or set the McBSP registers - * by yourself before calling omap_mcbsp_start(). - */ -void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg *config) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	dev_dbg(mcbsp->dev, "Configuring McBSP%d  phys_base: 0x%08lx\n", -			mcbsp->id, mcbsp->phys_base); - -	/* We write the given config */ -	MCBSP_WRITE(mcbsp, SPCR2, config->spcr2); -	MCBSP_WRITE(mcbsp, SPCR1, config->spcr1); -	MCBSP_WRITE(mcbsp, RCR2, config->rcr2); -	MCBSP_WRITE(mcbsp, RCR1, config->rcr1); -	MCBSP_WRITE(mcbsp, XCR2, config->xcr2); -	MCBSP_WRITE(mcbsp, XCR1, config->xcr1); -	MCBSP_WRITE(mcbsp, SRGR2, config->srgr2); -	MCBSP_WRITE(mcbsp, SRGR1, config->srgr1); -	MCBSP_WRITE(mcbsp, MCR2, config->mcr2); -	MCBSP_WRITE(mcbsp, MCR1, config->mcr1); -	MCBSP_WRITE(mcbsp, PCR0, config->pcr0); -	if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { -		MCBSP_WRITE(mcbsp, XCCR, config->xccr); -		MCBSP_WRITE(mcbsp, RCCR, config->rccr); -	} -} -EXPORT_SYMBOL(omap_mcbsp_config); - -#ifdef CONFIG_ARCH_OMAP3 -static void omap_st_on(struct omap_mcbsp *mcbsp) -{ -	unsigned int w; - -	/* -	 * Sidetone uses McBSP ICLK - which must not idle when sidetones -	 * are enabled or sidetones start sounding ugly. -	 */ -	w = cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); -	w &= ~(1 << (mcbsp->id - 2)); -	cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE); - -	/* Enable McBSP Sidetone */ -	w = MCBSP_READ(mcbsp, SSELCR); -	MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN); - -	w = MCBSP_ST_READ(mcbsp, SYSCONFIG); -	MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE)); - -	/* Enable Sidetone from Sidetone Core */ -	w = MCBSP_ST_READ(mcbsp, SSELCR); -	MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN); -} - -static void omap_st_off(struct omap_mcbsp *mcbsp) -{ -	unsigned int w; - -	w = MCBSP_ST_READ(mcbsp, SSELCR); -	MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN)); - -	w = MCBSP_ST_READ(mcbsp, SYSCONFIG); -	MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE); - -	w = MCBSP_READ(mcbsp, SSELCR); -	MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN)); - -	w = cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); -	w |= 1 << (mcbsp->id - 2); -	cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE); -} - -static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir) -{ -	u16 val, i; - -	val = MCBSP_ST_READ(mcbsp, SYSCONFIG); -	MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val & ~(ST_AUTOIDLE)); - -	val = MCBSP_ST_READ(mcbsp, SSELCR); - -	if (val & ST_COEFFWREN) -		MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN)); - -	MCBSP_ST_WRITE(mcbsp, SSELCR, val | ST_COEFFWREN); - -	for (i = 0; i < 128; i++) -		MCBSP_ST_WRITE(mcbsp, SFIRCR, fir[i]); - -	i = 0; - -	val = MCBSP_ST_READ(mcbsp, SSELCR); -	while (!(val & ST_COEFFWRDONE) && (++i < 1000)) -		val = MCBSP_ST_READ(mcbsp, SSELCR); - -	MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN)); - -	if (i == 1000) -		dev_err(mcbsp->dev, "McBSP FIR load error!\n"); -} - -static void omap_st_chgain(struct omap_mcbsp *mcbsp) -{ -	u16 w; -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; - -	w = MCBSP_ST_READ(mcbsp, SYSCONFIG); -	MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE)); - -	w = MCBSP_ST_READ(mcbsp, SSELCR); - -	MCBSP_ST_WRITE(mcbsp, SGAINCR, ST_CH0GAIN(st_data->ch0gain) | \ -		      ST_CH1GAIN(st_data->ch1gain)); -} - -int omap_st_set_chgain(unsigned int id, int channel, s16 chgain) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_st_data *st_data; -	int ret = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	st_data = mcbsp->st_data; - -	if (!st_data) -		return -ENOENT; - -	spin_lock_irq(&mcbsp->lock); -	if (channel == 0) -		st_data->ch0gain = chgain; -	else if (channel == 1) -		st_data->ch1gain = chgain; -	else -		ret = -EINVAL; - -	if (st_data->enabled) -		omap_st_chgain(mcbsp); -	spin_unlock_irq(&mcbsp->lock); - -	return ret; -} -EXPORT_SYMBOL(omap_st_set_chgain); - -int omap_st_get_chgain(unsigned int id, int channel, s16 *chgain) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_st_data *st_data; -	int ret = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	st_data = mcbsp->st_data; - -	if (!st_data) -		return -ENOENT; - -	spin_lock_irq(&mcbsp->lock); -	if (channel == 0) -		*chgain = st_data->ch0gain; -	else if (channel == 1) -		*chgain = st_data->ch1gain; -	else -		ret = -EINVAL; -	spin_unlock_irq(&mcbsp->lock); - -	return ret; -} -EXPORT_SYMBOL(omap_st_get_chgain); - -static int omap_st_start(struct omap_mcbsp *mcbsp) -{ -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; - -	if (st_data && st_data->enabled && !st_data->running) { -		omap_st_fir_write(mcbsp, st_data->taps); -		omap_st_chgain(mcbsp); - -		if (!mcbsp->free) { -			omap_st_on(mcbsp); -			st_data->running = 1; -		} -	} - -	return 0; -} - -int omap_st_enable(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_st_data *st_data; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	st_data = mcbsp->st_data; - -	if (!st_data) -		return -ENODEV; - -	spin_lock_irq(&mcbsp->lock); -	st_data->enabled = 1; -	omap_st_start(mcbsp); -	spin_unlock_irq(&mcbsp->lock); - -	return 0; -} -EXPORT_SYMBOL(omap_st_enable); - -static int omap_st_stop(struct omap_mcbsp *mcbsp) -{ -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; - -	if (st_data && st_data->running) { -		if (!mcbsp->free) { -			omap_st_off(mcbsp); -			st_data->running = 0; -		} -	} - -	return 0; -} - -int omap_st_disable(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_st_data *st_data; -	int ret = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	st_data = mcbsp->st_data; - -	if (!st_data) -		return -ENODEV; - -	spin_lock_irq(&mcbsp->lock); -	omap_st_stop(mcbsp); -	st_data->enabled = 0; -	spin_unlock_irq(&mcbsp->lock); - -	return ret; -} -EXPORT_SYMBOL(omap_st_disable); - -int omap_st_is_enabled(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_st_data *st_data; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	st_data = mcbsp->st_data; - -	if (!st_data) -		return -ENODEV; - - -	return st_data->enabled; -} -EXPORT_SYMBOL(omap_st_is_enabled); - -/* - * omap_mcbsp_set_rx_threshold configures the transmit threshold in words. - * The threshold parameter is 1 based, and it is converted (threshold - 1) - * for the THRSH2 register. - */ -void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold) -{ -	struct omap_mcbsp *mcbsp; - -	if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) -		return; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (threshold && threshold <= mcbsp->max_tx_thres) -		MCBSP_WRITE(mcbsp, THRSH2, threshold - 1); -} -EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold); - -/* - * omap_mcbsp_set_rx_threshold configures the receive threshold in words. - * The threshold parameter is 1 based, and it is converted (threshold - 1) - * for the THRSH1 register. - */ -void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold) -{ -	struct omap_mcbsp *mcbsp; - -	if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) -		return; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (threshold && threshold <= mcbsp->max_rx_thres) -		MCBSP_WRITE(mcbsp, THRSH1, threshold - 1); -} -EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold); - -/* - * omap_mcbsp_get_max_tx_thres just return the current configured - * maximum threshold for transmission - */ -u16 omap_mcbsp_get_max_tx_threshold(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	return mcbsp->max_tx_thres; -} -EXPORT_SYMBOL(omap_mcbsp_get_max_tx_threshold); - -/* - * omap_mcbsp_get_max_rx_thres just return the current configured - * maximum threshold for reception - */ -u16 omap_mcbsp_get_max_rx_threshold(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	return mcbsp->max_rx_thres; -} -EXPORT_SYMBOL(omap_mcbsp_get_max_rx_threshold); - -u16 omap_mcbsp_get_fifo_size(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	return mcbsp->pdata->buffer_size; -} -EXPORT_SYMBOL(omap_mcbsp_get_fifo_size); - -/* - * omap_mcbsp_get_tx_delay returns the number of used slots in the McBSP FIFO - */ -u16 omap_mcbsp_get_tx_delay(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	u16 buffstat; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	/* Returns the number of free locations in the buffer */ -	buffstat = MCBSP_READ(mcbsp, XBUFFSTAT); - -	/* Number of slots are different in McBSP ports */ -	return mcbsp->pdata->buffer_size - buffstat; -} -EXPORT_SYMBOL(omap_mcbsp_get_tx_delay); - -/* - * omap_mcbsp_get_rx_delay returns the number of free slots in the McBSP FIFO - * to reach the threshold value (when the DMA will be triggered to read it) - */ -u16 omap_mcbsp_get_rx_delay(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	u16 buffstat, threshold; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	/* Returns the number of used locations in the buffer */ -	buffstat = MCBSP_READ(mcbsp, RBUFFSTAT); -	/* RX threshold */ -	threshold = MCBSP_READ(mcbsp, THRSH1); - -	/* Return the number of location till we reach the threshold limit */ -	if (threshold <= buffstat) -		return 0; -	else -		return threshold - buffstat; -} -EXPORT_SYMBOL(omap_mcbsp_get_rx_delay); - -/* - * omap_mcbsp_get_dma_op_mode just return the current configured - * operating mode for the mcbsp channel - */ -int omap_mcbsp_get_dma_op_mode(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	int dma_op_mode; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%u)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	dma_op_mode = mcbsp->dma_op_mode; - -	return dma_op_mode; -} -EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode); - -static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) -{ -	/* -	 * Enable wakup behavior, smart idle and all wakeups -	 * REVISIT: some wakeups may be unnecessary -	 */ -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		u16 syscon; - -		syscon = MCBSP_READ(mcbsp, SYSCON); -		syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03)); - -		if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) { -			syscon |= (ENAWAKEUP | SIDLEMODE(0x02) | -					CLOCKACTIVITY(0x02)); -			MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN); -		} else { -			syscon |= SIDLEMODE(0x01); -		} - -		MCBSP_WRITE(mcbsp, SYSCON, syscon); -	} -} - -static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) -{ -	/* -	 * Disable wakup behavior, smart idle and all wakeups -	 */ -	if (cpu_is_omap34xx() || cpu_is_omap44xx()) { -		u16 syscon; - -		syscon = MCBSP_READ(mcbsp, SYSCON); -		syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03)); -		/* -		 * HW bug workaround - If no_idle mode is taken, we need to -		 * go to smart_idle before going to always_idle, or the -		 * device will not hit retention anymore. -		 */ -		syscon |= SIDLEMODE(0x02); -		MCBSP_WRITE(mcbsp, SYSCON, syscon); - -		syscon &= ~(SIDLEMODE(0x03)); -		MCBSP_WRITE(mcbsp, SYSCON, syscon); - -		MCBSP_WRITE(mcbsp, WAKEUPEN, 0); -	} -} -#else -static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp) {} -static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp) {} -static inline void omap_st_start(struct omap_mcbsp *mcbsp) {} -static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {} -#endif - -/* - * We can choose between IRQ based or polled IO. - * This needs to be called before omap_mcbsp_request(). - */ -int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	spin_lock(&mcbsp->lock); - -	if (!mcbsp->free) { -		dev_err(mcbsp->dev, "McBSP%d is currently in use\n", -			mcbsp->id); -		spin_unlock(&mcbsp->lock); -		return -EINVAL; -	} - -	mcbsp->io_type = io_type; - -	spin_unlock(&mcbsp->lock); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_set_io_type); - -int omap_mcbsp_request(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	void *reg_cache; -	int err; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	reg_cache = kzalloc(omap_mcbsp_cache_size, GFP_KERNEL); -	if (!reg_cache) { -		return -ENOMEM; -	} - -	spin_lock(&mcbsp->lock); -	if (!mcbsp->free) { -		dev_err(mcbsp->dev, "McBSP%d is currently in use\n", -			mcbsp->id); -		err = -EBUSY; -		goto err_kfree; -	} - -	mcbsp->free = 0; -	mcbsp->reg_cache = reg_cache; -	spin_unlock(&mcbsp->lock); - -	if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request) -		mcbsp->pdata->ops->request(id); - -	clk_enable(mcbsp->iclk); -	clk_enable(mcbsp->fclk); - -	/* Do procedure specific to omap34xx arch, if applicable */ -	omap34xx_mcbsp_request(mcbsp); - -	/* -	 * Make sure that transmitter, receiver and sample-rate generator are -	 * not running before activating IRQs. -	 */ -	MCBSP_WRITE(mcbsp, SPCR1, 0); -	MCBSP_WRITE(mcbsp, SPCR2, 0); - -	if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { -		/* We need to get IRQs here */ -		init_completion(&mcbsp->tx_irq_completion); -		err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler, -					0, "McBSP", (void *)mcbsp); -		if (err != 0) { -			dev_err(mcbsp->dev, "Unable to request TX IRQ %d " -					"for McBSP%d\n", mcbsp->tx_irq, -					mcbsp->id); -			goto err_clk_disable; -		} - -		if (mcbsp->rx_irq) { -			init_completion(&mcbsp->rx_irq_completion); -			err = request_irq(mcbsp->rx_irq, -					omap_mcbsp_rx_irq_handler, -					0, "McBSP", (void *)mcbsp); -			if (err != 0) { -				dev_err(mcbsp->dev, "Unable to request RX IRQ %d " -						"for McBSP%d\n", mcbsp->rx_irq, -						mcbsp->id); -				goto err_free_irq; -			} -		} -	} - -	return 0; -err_free_irq: -	free_irq(mcbsp->tx_irq, (void *)mcbsp); -err_clk_disable: -	if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) -		mcbsp->pdata->ops->free(id); - -	/* Do procedure specific to omap34xx arch, if applicable */ -	omap34xx_mcbsp_free(mcbsp); - -	clk_disable(mcbsp->fclk); -	clk_disable(mcbsp->iclk); - -	spin_lock(&mcbsp->lock); -	mcbsp->free = 1; -	mcbsp->reg_cache = NULL; -err_kfree: -	spin_unlock(&mcbsp->lock); -	kfree(reg_cache); - -	return err; -} -EXPORT_SYMBOL(omap_mcbsp_request); - -void omap_mcbsp_free(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	void *reg_cache; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free) -		mcbsp->pdata->ops->free(id); - -	/* Do procedure specific to omap34xx arch, if applicable */ -	omap34xx_mcbsp_free(mcbsp); - -	clk_disable(mcbsp->fclk); -	clk_disable(mcbsp->iclk); - -	if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { -		/* Free IRQs */ -		if (mcbsp->rx_irq) -			free_irq(mcbsp->rx_irq, (void *)mcbsp); -		free_irq(mcbsp->tx_irq, (void *)mcbsp); -	} - -	reg_cache = mcbsp->reg_cache; - -	spin_lock(&mcbsp->lock); -	if (mcbsp->free) -		dev_err(mcbsp->dev, "McBSP%d was not reserved\n", mcbsp->id); -	else -		mcbsp->free = 1; -	mcbsp->reg_cache = NULL; -	spin_unlock(&mcbsp->lock); - -	if (reg_cache) -		kfree(reg_cache); -} -EXPORT_SYMBOL(omap_mcbsp_free); - -/* - * Here we start the McBSP, by enabling transmitter, receiver or both. - * If no transmitter or receiver is active prior calling, then sample-rate - * generator and frame sync are started. - */ -void omap_mcbsp_start(unsigned int id, int tx, int rx) -{ -	struct omap_mcbsp *mcbsp; -	int enable_srg = 0; -	u16 w; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (cpu_is_omap34xx()) -		omap_st_start(mcbsp); - -	mcbsp->rx_word_length = (MCBSP_READ_CACHE(mcbsp, RCR1) >> 5) & 0x7; -	mcbsp->tx_word_length = (MCBSP_READ_CACHE(mcbsp, XCR1) >> 5) & 0x7; - -	/* Only enable SRG, if McBSP is master */ -	w = MCBSP_READ_CACHE(mcbsp, PCR0); -	if (w & (FSXM | FSRM | CLKXM | CLKRM)) -		enable_srg = !((MCBSP_READ_CACHE(mcbsp, SPCR2) | -				MCBSP_READ_CACHE(mcbsp, SPCR1)) & 1); - -	if (enable_srg) { -		/* Start the sample generator */ -		w = MCBSP_READ_CACHE(mcbsp, SPCR2); -		MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 6)); -	} - -	/* Enable transmitter and receiver */ -	tx &= 1; -	w = MCBSP_READ_CACHE(mcbsp, SPCR2); -	MCBSP_WRITE(mcbsp, SPCR2, w | tx); - -	rx &= 1; -	w = MCBSP_READ_CACHE(mcbsp, SPCR1); -	MCBSP_WRITE(mcbsp, SPCR1, w | rx); - -	/* -	 * Worst case: CLKSRG*2 = 8000khz: (1/8000) * 2 * 2 usec -	 * REVISIT: 100us may give enough time for two CLKSRG, however -	 * due to some unknown PM related, clock gating etc. reason it -	 * is now at 500us. -	 */ -	udelay(500); - -	if (enable_srg) { -		/* Start frame sync */ -		w = MCBSP_READ_CACHE(mcbsp, SPCR2); -		MCBSP_WRITE(mcbsp, SPCR2, w | (1 << 7)); -	} - -	if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { -		/* Release the transmitter and receiver */ -		w = MCBSP_READ_CACHE(mcbsp, XCCR); -		w &= ~(tx ? XDISABLE : 0); -		MCBSP_WRITE(mcbsp, XCCR, w); -		w = MCBSP_READ_CACHE(mcbsp, RCCR); -		w &= ~(rx ? RDISABLE : 0); -		MCBSP_WRITE(mcbsp, RCCR, w); -	} - -	/* Dump McBSP Regs */ -	omap_mcbsp_dump_reg(id); -} -EXPORT_SYMBOL(omap_mcbsp_start); - -void omap_mcbsp_stop(unsigned int id, int tx, int rx) -{ -	struct omap_mcbsp *mcbsp; -	int idle; -	u16 w; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} - -	mcbsp = id_to_mcbsp_ptr(id); - -	/* Reset transmitter */ -	tx &= 1; -	if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { -		w = MCBSP_READ_CACHE(mcbsp, XCCR); -		w |= (tx ? XDISABLE : 0); -		MCBSP_WRITE(mcbsp, XCCR, w); -	} -	w = MCBSP_READ_CACHE(mcbsp, SPCR2); -	MCBSP_WRITE(mcbsp, SPCR2, w & ~tx); - -	/* Reset receiver */ -	rx &= 1; -	if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { -		w = MCBSP_READ_CACHE(mcbsp, RCCR); -		w |= (rx ? RDISABLE : 0); -		MCBSP_WRITE(mcbsp, RCCR, w); -	} -	w = MCBSP_READ_CACHE(mcbsp, SPCR1); -	MCBSP_WRITE(mcbsp, SPCR1, w & ~rx); - -	idle = !((MCBSP_READ_CACHE(mcbsp, SPCR2) | -			MCBSP_READ_CACHE(mcbsp, SPCR1)) & 1); - -	if (idle) { -		/* Reset the sample rate generator */ -		w = MCBSP_READ_CACHE(mcbsp, SPCR2); -		MCBSP_WRITE(mcbsp, SPCR2, w & ~(1 << 6)); -	} - -	if (cpu_is_omap34xx()) -		omap_st_stop(mcbsp); -} -EXPORT_SYMBOL(omap_mcbsp_stop); - -/* polled mcbsp i/o operations */ -int omap_mcbsp_pollwrite(unsigned int id, u16 buf) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); - -	MCBSP_WRITE(mcbsp, DXR1, buf); -	/* if frame sync error - clear the error */ -	if (MCBSP_READ(mcbsp, SPCR2) & XSYNC_ERR) { -		/* clear error */ -		MCBSP_WRITE(mcbsp, SPCR2, MCBSP_READ_CACHE(mcbsp, SPCR2)); -		/* resend */ -		return -1; -	} else { -		/* wait for transmit confirmation */ -		int attemps = 0; -		while (!(MCBSP_READ(mcbsp, SPCR2) & XRDY)) { -			if (attemps++ > 1000) { -				MCBSP_WRITE(mcbsp, SPCR2, -						MCBSP_READ_CACHE(mcbsp, SPCR2) & -						(~XRST)); -				udelay(10); -				MCBSP_WRITE(mcbsp, SPCR2, -						MCBSP_READ_CACHE(mcbsp, SPCR2) | -						(XRST)); -				udelay(10); -				dev_err(mcbsp->dev, "Could not write to" -					" McBSP%d Register\n", mcbsp->id); -				return -2; -			} -		} -	} - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_pollwrite); - -int omap_mcbsp_pollread(unsigned int id, u16 *buf) -{ -	struct omap_mcbsp *mcbsp; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	/* if frame sync error - clear the error */ -	if (MCBSP_READ(mcbsp, SPCR1) & RSYNC_ERR) { -		/* clear error */ -		MCBSP_WRITE(mcbsp, SPCR1, MCBSP_READ_CACHE(mcbsp, SPCR1)); -		/* resend */ -		return -1; -	} else { -		/* wait for recieve confirmation */ -		int attemps = 0; -		while (!(MCBSP_READ(mcbsp, SPCR1) & RRDY)) { -			if (attemps++ > 1000) { -				MCBSP_WRITE(mcbsp, SPCR1, -						MCBSP_READ_CACHE(mcbsp, SPCR1) & -						(~RRST)); -				udelay(10); -				MCBSP_WRITE(mcbsp, SPCR1, -						MCBSP_READ_CACHE(mcbsp, SPCR1) | -						(RRST)); -				udelay(10); -				dev_err(mcbsp->dev, "Could not read from" -					" McBSP%d Register\n", mcbsp->id); -				return -2; -			} -		} -	} -	*buf = MCBSP_READ(mcbsp, DRR1); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_pollread); - -/* - * IRQ based word transmission. - */ -void omap_mcbsp_xmit_word(unsigned int id, u32 word) -{ -	struct omap_mcbsp *mcbsp; -	omap_mcbsp_word_length word_length; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} - -	mcbsp = id_to_mcbsp_ptr(id); -	word_length = mcbsp->tx_word_length; - -	wait_for_completion(&mcbsp->tx_irq_completion); - -	if (word_length > OMAP_MCBSP_WORD_16) -		MCBSP_WRITE(mcbsp, DXR2, word >> 16); -	MCBSP_WRITE(mcbsp, DXR1, word & 0xffff); -} -EXPORT_SYMBOL(omap_mcbsp_xmit_word); - -u32 omap_mcbsp_recv_word(unsigned int id) -{ -	struct omap_mcbsp *mcbsp; -	u16 word_lsb, word_msb = 0; -	omap_mcbsp_word_length word_length; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	word_length = mcbsp->rx_word_length; - -	wait_for_completion(&mcbsp->rx_irq_completion); - -	if (word_length > OMAP_MCBSP_WORD_16) -		word_msb = MCBSP_READ(mcbsp, DRR2); -	word_lsb = MCBSP_READ(mcbsp, DRR1); - -	return (word_lsb | (word_msb << 16)); -} -EXPORT_SYMBOL(omap_mcbsp_recv_word); - -int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word) -{ -	struct omap_mcbsp *mcbsp; -	omap_mcbsp_word_length tx_word_length; -	omap_mcbsp_word_length rx_word_length; -	u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); -	tx_word_length = mcbsp->tx_word_length; -	rx_word_length = mcbsp->rx_word_length; - -	if (tx_word_length != rx_word_length) -		return -EINVAL; - -	/* First we wait for the transmitter to be ready */ -	spcr2 = MCBSP_READ(mcbsp, SPCR2); -	while (!(spcr2 & XRDY)) { -		spcr2 = MCBSP_READ(mcbsp, SPCR2); -		if (attempts++ > 1000) { -			/* We must reset the transmitter */ -			MCBSP_WRITE(mcbsp, SPCR2, -				    MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST)); -			udelay(10); -			MCBSP_WRITE(mcbsp, SPCR2, -				    MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST); -			udelay(10); -			dev_err(mcbsp->dev, "McBSP%d transmitter not " -				"ready\n", mcbsp->id); -			return -EAGAIN; -		} -	} - -	/* Now we can push the data */ -	if (tx_word_length > OMAP_MCBSP_WORD_16) -		MCBSP_WRITE(mcbsp, DXR2, word >> 16); -	MCBSP_WRITE(mcbsp, DXR1, word & 0xffff); - -	/* We wait for the receiver to be ready */ -	spcr1 = MCBSP_READ(mcbsp, SPCR1); -	while (!(spcr1 & RRDY)) { -		spcr1 = MCBSP_READ(mcbsp, SPCR1); -		if (attempts++ > 1000) { -			/* We must reset the receiver */ -			MCBSP_WRITE(mcbsp, SPCR1, -				    MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST)); -			udelay(10); -			MCBSP_WRITE(mcbsp, SPCR1, -				    MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST); -			udelay(10); -			dev_err(mcbsp->dev, "McBSP%d receiver not " -				"ready\n", mcbsp->id); -			return -EAGAIN; -		} -	} - -	/* Receiver is ready, let's read the dummy data */ -	if (rx_word_length > OMAP_MCBSP_WORD_16) -		word_msb = MCBSP_READ(mcbsp, DRR2); -	word_lsb = MCBSP_READ(mcbsp, DRR1); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_spi_master_xmit_word_poll); - -int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word) -{ -	struct omap_mcbsp *mcbsp; -	u32 clock_word = 0; -	omap_mcbsp_word_length tx_word_length; -	omap_mcbsp_word_length rx_word_length; -	u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} - -	mcbsp = id_to_mcbsp_ptr(id); - -	tx_word_length = mcbsp->tx_word_length; -	rx_word_length = mcbsp->rx_word_length; - -	if (tx_word_length != rx_word_length) -		return -EINVAL; - -	/* First we wait for the transmitter to be ready */ -	spcr2 = MCBSP_READ(mcbsp, SPCR2); -	while (!(spcr2 & XRDY)) { -		spcr2 = MCBSP_READ(mcbsp, SPCR2); -		if (attempts++ > 1000) { -			/* We must reset the transmitter */ -			MCBSP_WRITE(mcbsp, SPCR2, -				    MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST)); -			udelay(10); -			MCBSP_WRITE(mcbsp, SPCR2, -				    MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST); -			udelay(10); -			dev_err(mcbsp->dev, "McBSP%d transmitter not " -				"ready\n", mcbsp->id); -			return -EAGAIN; -		} -	} - -	/* We first need to enable the bus clock */ -	if (tx_word_length > OMAP_MCBSP_WORD_16) -		MCBSP_WRITE(mcbsp, DXR2, clock_word >> 16); -	MCBSP_WRITE(mcbsp, DXR1, clock_word & 0xffff); - -	/* We wait for the receiver to be ready */ -	spcr1 = MCBSP_READ(mcbsp, SPCR1); -	while (!(spcr1 & RRDY)) { -		spcr1 = MCBSP_READ(mcbsp, SPCR1); -		if (attempts++ > 1000) { -			/* We must reset the receiver */ -			MCBSP_WRITE(mcbsp, SPCR1, -				    MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST)); -			udelay(10); -			MCBSP_WRITE(mcbsp, SPCR1, -				    MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST); -			udelay(10); -			dev_err(mcbsp->dev, "McBSP%d receiver not " -				"ready\n", mcbsp->id); -			return -EAGAIN; -		} -	} - -	/* Receiver is ready, there is something for us */ -	if (rx_word_length > OMAP_MCBSP_WORD_16) -		word_msb = MCBSP_READ(mcbsp, DRR2); -	word_lsb = MCBSP_READ(mcbsp, DRR1); - -	word[0] = (word_lsb | (word_msb << 16)); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_spi_master_recv_word_poll); - -/* - * Simple DMA based buffer rx/tx routines. - * Nothing fancy, just a single buffer tx/rx through DMA. - * The DMA resources are released once the transfer is done. - * For anything fancier, you should use your own customized DMA - * routines and callbacks. - */ -int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, -				unsigned int length) -{ -	struct omap_mcbsp *mcbsp; -	int dma_tx_ch; -	int src_port = 0; -	int dest_port = 0; -	int sync_dev = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (omap_request_dma(mcbsp->dma_tx_sync, "McBSP TX", -				omap_mcbsp_tx_dma_callback, -				mcbsp, -				&dma_tx_ch)) { -		dev_err(mcbsp->dev, " Unable to request DMA channel for " -				"McBSP%d TX. Trying IRQ based TX\n", -				mcbsp->id); -		return -EAGAIN; -	} -	mcbsp->dma_tx_lch = dma_tx_ch; - -	dev_err(mcbsp->dev, "McBSP%d TX DMA on channel %d\n", mcbsp->id, -		dma_tx_ch); - -	init_completion(&mcbsp->tx_dma_completion); - -	if (cpu_class_is_omap1()) { -		src_port = OMAP_DMA_PORT_TIPB; -		dest_port = OMAP_DMA_PORT_EMIFF; -	} -	if (cpu_class_is_omap2()) -		sync_dev = mcbsp->dma_tx_sync; - -	omap_set_dma_transfer_params(mcbsp->dma_tx_lch, -				     OMAP_DMA_DATA_TYPE_S16, -				     length >> 1, 1, -				     OMAP_DMA_SYNC_ELEMENT, -	 sync_dev, 0); - -	omap_set_dma_dest_params(mcbsp->dma_tx_lch, -				 src_port, -				 OMAP_DMA_AMODE_CONSTANT, -				 mcbsp->phys_base + OMAP_MCBSP_REG_DXR1, -				 0, 0); - -	omap_set_dma_src_params(mcbsp->dma_tx_lch, -				dest_port, -				OMAP_DMA_AMODE_POST_INC, -				buffer, -				0, 0); - -	omap_start_dma(mcbsp->dma_tx_lch); -	wait_for_completion(&mcbsp->tx_dma_completion); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_xmit_buffer); - -int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, -				unsigned int length) -{ -	struct omap_mcbsp *mcbsp; -	int dma_rx_ch; -	int src_port = 0; -	int dest_port = 0; -	int sync_dev = 0; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return -ENODEV; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	if (omap_request_dma(mcbsp->dma_rx_sync, "McBSP RX", -				omap_mcbsp_rx_dma_callback, -				mcbsp, -				&dma_rx_ch)) { -		dev_err(mcbsp->dev, "Unable to request DMA channel for " -				"McBSP%d RX. Trying IRQ based RX\n", -				mcbsp->id); -		return -EAGAIN; -	} -	mcbsp->dma_rx_lch = dma_rx_ch; - -	dev_err(mcbsp->dev, "McBSP%d RX DMA on channel %d\n", mcbsp->id, -		dma_rx_ch); - -	init_completion(&mcbsp->rx_dma_completion); - -	if (cpu_class_is_omap1()) { -		src_port = OMAP_DMA_PORT_TIPB; -		dest_port = OMAP_DMA_PORT_EMIFF; -	} -	if (cpu_class_is_omap2()) -		sync_dev = mcbsp->dma_rx_sync; - -	omap_set_dma_transfer_params(mcbsp->dma_rx_lch, -					OMAP_DMA_DATA_TYPE_S16, -					length >> 1, 1, -					OMAP_DMA_SYNC_ELEMENT, -					sync_dev, 0); - -	omap_set_dma_src_params(mcbsp->dma_rx_lch, -				src_port, -				OMAP_DMA_AMODE_CONSTANT, -				mcbsp->phys_base + OMAP_MCBSP_REG_DRR1, -				0, 0); - -	omap_set_dma_dest_params(mcbsp->dma_rx_lch, -					dest_port, -					OMAP_DMA_AMODE_POST_INC, -					buffer, -					0, 0); - -	omap_start_dma(mcbsp->dma_rx_lch); -	wait_for_completion(&mcbsp->rx_dma_completion); - -	return 0; -} -EXPORT_SYMBOL(omap_mcbsp_recv_buffer); - -/* - * SPI wrapper. - * Since SPI setup is much simpler than the generic McBSP one, - * this wrapper just need an omap_mcbsp_spi_cfg structure as an input. - * Once this is done, you can call omap_mcbsp_start(). - */ -void omap_mcbsp_set_spi_mode(unsigned int id, -				const struct omap_mcbsp_spi_cfg *spi_cfg) -{ -	struct omap_mcbsp *mcbsp; -	struct omap_mcbsp_reg_cfg mcbsp_cfg; - -	if (!omap_mcbsp_check_valid_id(id)) { -		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); -		return; -	} -	mcbsp = id_to_mcbsp_ptr(id); - -	memset(&mcbsp_cfg, 0, sizeof(struct omap_mcbsp_reg_cfg)); - -	/* SPI has only one frame */ -	mcbsp_cfg.rcr1 |= (RWDLEN1(spi_cfg->word_length) | RFRLEN1(0)); -	mcbsp_cfg.xcr1 |= (XWDLEN1(spi_cfg->word_length) | XFRLEN1(0)); - -	/* Clock stop mode */ -	if (spi_cfg->clk_stp_mode == OMAP_MCBSP_CLK_STP_MODE_NO_DELAY) -		mcbsp_cfg.spcr1 |= (1 << 12); -	else -		mcbsp_cfg.spcr1 |= (3 << 11); - -	/* Set clock parities */ -	if (spi_cfg->rx_clock_polarity == OMAP_MCBSP_CLK_RISING) -		mcbsp_cfg.pcr0 |= CLKRP; -	else -		mcbsp_cfg.pcr0 &= ~CLKRP; - -	if (spi_cfg->tx_clock_polarity == OMAP_MCBSP_CLK_RISING) -		mcbsp_cfg.pcr0 &= ~CLKXP; -	else -		mcbsp_cfg.pcr0 |= CLKXP; - -	/* Set SCLKME to 0 and CLKSM to 1 */ -	mcbsp_cfg.pcr0 &= ~SCLKME; -	mcbsp_cfg.srgr2 |= CLKSM; - -	/* Set FSXP */ -	if (spi_cfg->fsx_polarity == OMAP_MCBSP_FS_ACTIVE_HIGH) -		mcbsp_cfg.pcr0 &= ~FSXP; -	else -		mcbsp_cfg.pcr0 |= FSXP; - -	if (spi_cfg->spi_mode == OMAP_MCBSP_SPI_MASTER) { -		mcbsp_cfg.pcr0 |= CLKXM; -		mcbsp_cfg.srgr1 |= CLKGDV(spi_cfg->clk_div - 1); -		mcbsp_cfg.pcr0 |= FSXM; -		mcbsp_cfg.srgr2 &= ~FSGM; -		mcbsp_cfg.xcr2 |= XDATDLY(1); -		mcbsp_cfg.rcr2 |= RDATDLY(1); -	} else { -		mcbsp_cfg.pcr0 &= ~CLKXM; -		mcbsp_cfg.srgr1 |= CLKGDV(1); -		mcbsp_cfg.pcr0 &= ~FSXM; -		mcbsp_cfg.xcr2 &= ~XDATDLY(3); -		mcbsp_cfg.rcr2 &= ~RDATDLY(3); -	} - -	mcbsp_cfg.xcr2 &= ~XPHASE; -	mcbsp_cfg.rcr2 &= ~RPHASE; - -	omap_mcbsp_config(id, &mcbsp_cfg); -} -EXPORT_SYMBOL(omap_mcbsp_set_spi_mode); - -#ifdef CONFIG_ARCH_OMAP3 -#define max_thres(m)			(mcbsp->pdata->buffer_size) -#define valid_threshold(m, val)		((val) <= max_thres(m)) -#define THRESHOLD_PROP_BUILDER(prop)					\ -static ssize_t prop##_show(struct device *dev,				\ -			struct device_attribute *attr, char *buf)	\ -{									\ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);		\ -									\ -	return sprintf(buf, "%u\n", mcbsp->prop);			\ -}									\ -									\ -static ssize_t prop##_store(struct device *dev,				\ -				struct device_attribute *attr,		\ -				const char *buf, size_t size)		\ -{									\ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);		\ -	unsigned long val;						\ -	int status;							\ -									\ -	status = strict_strtoul(buf, 0, &val);				\ -	if (status)							\ -		return status;						\ -									\ -	if (!valid_threshold(mcbsp, val))				\ -		return -EDOM;						\ -									\ -	mcbsp->prop = val;						\ -	return size;							\ -}									\ -									\ -static DEVICE_ATTR(prop, 0644, prop##_show, prop##_store); - -THRESHOLD_PROP_BUILDER(max_tx_thres); -THRESHOLD_PROP_BUILDER(max_rx_thres); - -static const char *dma_op_modes[] = { -	"element", "threshold", "frame", -}; - -static ssize_t dma_op_mode_show(struct device *dev, -			struct device_attribute *attr, char *buf) -{ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev); -	int dma_op_mode, i = 0; -	ssize_t len = 0; -	const char * const *s; - -	dma_op_mode = mcbsp->dma_op_mode; - -	for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++) { -		if (dma_op_mode == i) -			len += sprintf(buf + len, "[%s] ", *s); -		else -			len += sprintf(buf + len, "%s ", *s); -	} -	len += sprintf(buf + len, "\n"); - -	return len; -} - -static ssize_t dma_op_mode_store(struct device *dev, -				struct device_attribute *attr, -				const char *buf, size_t size) -{ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev); -	const char * const *s; -	int i = 0; - -	for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++) -		if (sysfs_streq(buf, *s)) -			break; - -	if (i == ARRAY_SIZE(dma_op_modes)) -		return -EINVAL; - -	spin_lock_irq(&mcbsp->lock); -	if (!mcbsp->free) { -		size = -EBUSY; -		goto unlock; -	} -	mcbsp->dma_op_mode = i; - -unlock: -	spin_unlock_irq(&mcbsp->lock); - -	return size; -} - -static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store); - -static ssize_t st_taps_show(struct device *dev, -			    struct device_attribute *attr, char *buf) -{ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev); -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; -	ssize_t status = 0; -	int i; - -	spin_lock_irq(&mcbsp->lock); -	for (i = 0; i < st_data->nr_taps; i++) -		status += sprintf(&buf[status], (i ? ", %d" : "%d"), -				  st_data->taps[i]); -	if (i) -		status += sprintf(&buf[status], "\n"); -	spin_unlock_irq(&mcbsp->lock); - -	return status; -} - -static ssize_t st_taps_store(struct device *dev, -			     struct device_attribute *attr, -			     const char *buf, size_t size) -{ -	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev); -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; -	int val, tmp, status, i = 0; - -	spin_lock_irq(&mcbsp->lock); -	memset(st_data->taps, 0, sizeof(st_data->taps)); -	st_data->nr_taps = 0; - -	do { -		status = sscanf(buf, "%d%n", &val, &tmp); -		if (status < 0 || status == 0) { -			size = -EINVAL; -			goto out; -		} -		if (val < -32768 || val > 32767) { -			size = -EINVAL; -			goto out; -		} -		st_data->taps[i++] = val; -		buf += tmp; -		if (*buf != ',') -			break; -		buf++; -	} while (1); - -	st_data->nr_taps = i; - -out: -	spin_unlock_irq(&mcbsp->lock); - -	return size; -} - -static DEVICE_ATTR(st_taps, 0644, st_taps_show, st_taps_store); - -static const struct attribute *additional_attrs[] = { -	&dev_attr_max_tx_thres.attr, -	&dev_attr_max_rx_thres.attr, -	&dev_attr_dma_op_mode.attr, -	NULL, -}; - -static const struct attribute_group additional_attr_group = { -	.attrs = (struct attribute **)additional_attrs, -}; - -static inline int __devinit omap_additional_add(struct device *dev) -{ -	return sysfs_create_group(&dev->kobj, &additional_attr_group); -} - -static inline void __devexit omap_additional_remove(struct device *dev) -{ -	sysfs_remove_group(&dev->kobj, &additional_attr_group); -} - -static const struct attribute *sidetone_attrs[] = { -	&dev_attr_st_taps.attr, -	NULL, -}; - -static const struct attribute_group sidetone_attr_group = { -	.attrs = (struct attribute **)sidetone_attrs, -}; - -static int __devinit omap_st_add(struct omap_mcbsp *mcbsp) -{ -	struct omap_mcbsp_platform_data *pdata = mcbsp->pdata; -	struct omap_mcbsp_st_data *st_data; -	int err; - -	st_data = kzalloc(sizeof(*mcbsp->st_data), GFP_KERNEL); -	if (!st_data) { -		err = -ENOMEM; -		goto err1; -	} - -	st_data->io_base_st = ioremap(pdata->phys_base_st, SZ_4K); -	if (!st_data->io_base_st) { -		err = -ENOMEM; -		goto err2; -	} - -	err = sysfs_create_group(&mcbsp->dev->kobj, &sidetone_attr_group); -	if (err) -		goto err3; - -	mcbsp->st_data = st_data; -	return 0; - -err3: -	iounmap(st_data->io_base_st); -err2: -	kfree(st_data); -err1: -	return err; - -} - -static void __devexit omap_st_remove(struct omap_mcbsp *mcbsp) -{ -	struct omap_mcbsp_st_data *st_data = mcbsp->st_data; - -	if (st_data) { -		sysfs_remove_group(&mcbsp->dev->kobj, &sidetone_attr_group); -		iounmap(st_data->io_base_st); -		kfree(st_data); -	} -} - -static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) -{ -	mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT; -	if (cpu_is_omap34xx()) { -		/* -		 * Initially configure the maximum thresholds to a safe value. -		 * The McBSP FIFO usage with these values should not go under -		 * 16 locations. -		 * If the whole FIFO without safety buffer is used, than there -		 * is a possibility that the DMA will be not able to push the -		 * new data on time, causing channel shifts in runtime. -		 */ -		mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10; -		mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10; -		/* -		 * REVISIT: Set dmap_op_mode to THRESHOLD as default -		 * for mcbsp2 instances. -		 */ -		if (omap_additional_add(mcbsp->dev)) -			dev_warn(mcbsp->dev, -				"Unable to create additional controls\n"); - -		if (mcbsp->id == 2 || mcbsp->id == 3) -			if (omap_st_add(mcbsp)) -				dev_warn(mcbsp->dev, -				 "Unable to create sidetone controls\n"); - -	} else { -		mcbsp->max_tx_thres = -EINVAL; -		mcbsp->max_rx_thres = -EINVAL; -	} -} - -static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) -{ -	if (cpu_is_omap34xx()) { -		omap_additional_remove(mcbsp->dev); - -		if (mcbsp->id == 2 || mcbsp->id == 3) -			omap_st_remove(mcbsp); -	} -} -#else -static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {} -static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {} -#endif /* CONFIG_ARCH_OMAP3 */ - -/* - * McBSP1 and McBSP3 are directly mapped on 1610 and 1510. - * 730 has only 2 McBSP, and both of them are MPU peripherals. - */ -static int __devinit omap_mcbsp_probe(struct platform_device *pdev) -{ -	struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data; -	struct omap_mcbsp *mcbsp; -	int id = pdev->id - 1; -	int ret = 0; - -	if (!pdata) { -		dev_err(&pdev->dev, "McBSP device initialized without" -				"platform data\n"); -		ret = -EINVAL; -		goto exit; -	} - -	dev_dbg(&pdev->dev, "Initializing OMAP McBSP (%d).\n", pdev->id); - -	if (id >= omap_mcbsp_count) { -		dev_err(&pdev->dev, "Invalid McBSP device id (%d)\n", id); -		ret = -EINVAL; -		goto exit; -	} - -	mcbsp = kzalloc(sizeof(struct omap_mcbsp), GFP_KERNEL); -	if (!mcbsp) { -		ret = -ENOMEM; -		goto exit; -	} - -	spin_lock_init(&mcbsp->lock); -	mcbsp->id = id + 1; -	mcbsp->free = 1; -	mcbsp->dma_tx_lch = -1; -	mcbsp->dma_rx_lch = -1; - -	mcbsp->phys_base = pdata->phys_base; -	mcbsp->io_base = ioremap(pdata->phys_base, SZ_4K); -	if (!mcbsp->io_base) { -		ret = -ENOMEM; -		goto err_ioremap; -	} - -	/* Default I/O is IRQ based */ -	mcbsp->io_type = OMAP_MCBSP_IRQ_IO; -	mcbsp->tx_irq = pdata->tx_irq; -	mcbsp->rx_irq = pdata->rx_irq; -	mcbsp->dma_rx_sync = pdata->dma_rx_sync; -	mcbsp->dma_tx_sync = pdata->dma_tx_sync; - -	mcbsp->iclk = clk_get(&pdev->dev, "ick"); -	if (IS_ERR(mcbsp->iclk)) { -		ret = PTR_ERR(mcbsp->iclk); -		dev_err(&pdev->dev, "unable to get ick: %d\n", ret); -		goto err_iclk; -	} - -	mcbsp->fclk = clk_get(&pdev->dev, "fck"); -	if (IS_ERR(mcbsp->fclk)) { -		ret = PTR_ERR(mcbsp->fclk); -		dev_err(&pdev->dev, "unable to get fck: %d\n", ret); -		goto err_fclk; -	} - -	mcbsp->pdata = pdata; -	mcbsp->dev = &pdev->dev; -	mcbsp_ptr[id] = mcbsp; -	platform_set_drvdata(pdev, mcbsp); - -	/* Initialize mcbsp properties for OMAP34XX if needed / applicable */ -	omap34xx_device_init(mcbsp); - -	return 0; - -err_fclk: -	clk_put(mcbsp->iclk); -err_iclk: -	iounmap(mcbsp->io_base); -err_ioremap: -	kfree(mcbsp); -exit: -	return ret; -} - -static int __devexit omap_mcbsp_remove(struct platform_device *pdev) -{ -	struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev); - -	platform_set_drvdata(pdev, NULL); -	if (mcbsp) { - -		if (mcbsp->pdata && mcbsp->pdata->ops && -				mcbsp->pdata->ops->free) -			mcbsp->pdata->ops->free(mcbsp->id); - -		omap34xx_device_exit(mcbsp); - -		clk_disable(mcbsp->fclk); -		clk_disable(mcbsp->iclk); -		clk_put(mcbsp->fclk); -		clk_put(mcbsp->iclk); - -		iounmap(mcbsp->io_base); - -		mcbsp->fclk = NULL; -		mcbsp->iclk = NULL; -		mcbsp->free = 0; -		mcbsp->dev = NULL; -	} - -	return 0; -} - -static struct platform_driver omap_mcbsp_driver = { -	.probe		= omap_mcbsp_probe, -	.remove		= __devexit_p(omap_mcbsp_remove), -	.driver		= { -		.name	= "omap-mcbsp", -	}, -}; - -int __init omap_mcbsp_init(void) -{ -	/* Register the McBSP driver */ -	return platform_driver_register(&omap_mcbsp_driver); -} diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c deleted file mode 100644 index 0d4aa0d5876..00000000000 --- a/arch/arm/plat-omap/mux.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * linux/arch/arm/plat-omap/mux.c - * - * Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h - * - * Copyright (C) 2003 - 2008 Nokia Corporation - * - * Written by Tony Lindgren - * - * 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 - * - */ -#include <linux/module.h> -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/io.h> -#include <asm/system.h> -#include <linux/spinlock.h> -#include <plat/mux.h> - -#ifdef CONFIG_OMAP_MUX - -static struct omap_mux_cfg *mux_cfg; - -int __init omap_mux_register(struct omap_mux_cfg *arch_mux_cfg) -{ -	if (!arch_mux_cfg || !arch_mux_cfg->pins || arch_mux_cfg->size == 0 -			|| !arch_mux_cfg->cfg_reg) { -		printk(KERN_ERR "Invalid pin table\n"); -		return -EINVAL; -	} - -	mux_cfg = arch_mux_cfg; - -	return 0; -} - -/* - * Sets the Omap MUX and PULL_DWN registers based on the table - */ -int __init_or_module omap_cfg_reg(const unsigned long index) -{ -	struct pin_config *reg; - -	if (!cpu_class_is_omap1()) { -		printk(KERN_ERR "mux: Broken omap_cfg_reg(%lu) entry\n", -				index); -		WARN_ON(1); -		return -EINVAL; -	} - -	if (mux_cfg == NULL) { -		printk(KERN_ERR "Pin mux table not initialized\n"); -		return -ENODEV; -	} - -	if (index >= mux_cfg->size) { -		printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n", -		       index, mux_cfg->size); -		dump_stack(); -		return -ENODEV; -	} - -	reg = (struct pin_config *)&mux_cfg->pins[index]; - -	if (!mux_cfg->cfg_reg) -		return -ENODEV; - -	return mux_cfg->cfg_reg(reg); -} -EXPORT_SYMBOL(omap_cfg_reg); -#else -#define omap_mux_init() do {} while(0) -#define omap_cfg_reg(x)	do {} while(0) -#endif	/* CONFIG_OMAP_MUX */ diff --git a/arch/arm/plat-omap/ocpi.c b/arch/arm/plat-omap/ocpi.c deleted file mode 100644 index ebe0c73c890..00000000000 --- a/arch/arm/plat-omap/ocpi.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * linux/arch/arm/plat-omap/ocpi.c - * - * Minimal OCP bus support for omap16xx - * - * Copyright (C) 2003 - 2005 Nokia Corporation - * Written by Tony Lindgren <tony@atomide.com> - * - * Modified for clock framework by Paul Mundt <paul.mundt@nokia.com>. - * - * 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 - */ - -#include <linux/module.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/spinlock.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <linux/io.h> - -#include <mach/hardware.h> - -#define OCPI_BASE		0xfffec320 -#define OCPI_FAULT		(OCPI_BASE + 0x00) -#define OCPI_CMD_FAULT		(OCPI_BASE + 0x04) -#define OCPI_SINT0		(OCPI_BASE + 0x08) -#define OCPI_TABORT		(OCPI_BASE + 0x0c) -#define OCPI_SINT1		(OCPI_BASE + 0x10) -#define OCPI_PROT		(OCPI_BASE + 0x14) -#define OCPI_SEC		(OCPI_BASE + 0x18) - -/* USB OHCI OCPI access error registers */ -#define HOSTUEADDR	0xfffba0e0 -#define HOSTUESTATUS	0xfffba0e4 - -static struct clk *ocpi_ck; - -/* - * Enables device access to OMAP buses via the OCPI bridge - * FIXME: Add locking - */ -int ocpi_enable(void) -{ -	unsigned int val; - -	if (!cpu_is_omap16xx()) -		return -ENODEV; - -	/* Enable access for OHCI in OCPI */ -	val = omap_readl(OCPI_PROT); -	val &= ~0xff; -	//val &= (1 << 0);	/* Allow access only to EMIFS */ -	omap_writel(val, OCPI_PROT); - -	val = omap_readl(OCPI_SEC); -	val &= ~0xff; -	omap_writel(val, OCPI_SEC); - -	return 0; -} -EXPORT_SYMBOL(ocpi_enable); - -static int __init omap_ocpi_init(void) -{ -	if (!cpu_is_omap16xx()) -		return -ENODEV; - -	ocpi_ck = clk_get(NULL, "l3_ocpi_ck"); -	if (IS_ERR(ocpi_ck)) -		return PTR_ERR(ocpi_ck); - -	clk_enable(ocpi_ck); -	ocpi_enable(); -	printk("OMAP OCPI interconnect driver loaded\n"); - -	return 0; -} - -static void __exit omap_ocpi_exit(void) -{ -	/* REVISIT: Disable OCPI */ - -	if (!cpu_is_omap16xx()) -		return; - -	clk_disable(ocpi_ck); -	clk_put(ocpi_ck); -} - -MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>"); -MODULE_DESCRIPTION("OMAP OCPI bus controller module"); -MODULE_LICENSE("GPL"); -module_init(omap_ocpi_init); -module_exit(omap_ocpi_exit); diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c deleted file mode 100644 index e129ce80c53..00000000000 --- a/arch/arm/plat-omap/omap-pm-noop.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - * omap-pm-noop.c - OMAP power management interface - dummy version - * - * This code implements the OMAP power management interface to - * drivers, CPUIdle, CPUFreq, and DSP Bridge.  It is strictly for - * debug/demonstration use, as it does nothing but printk() whenever a - * function is called (when DEBUG is defined, below) - * - * Copyright (C) 2008-2009 Texas Instruments, Inc. - * Copyright (C) 2008-2009 Nokia Corporation - * Paul Walmsley - * - * Interface developed by (in alphabetical order): - * Karthik Dasu, Tony Lindgren, Rajendra Nayak, Sakari Poussa, Veeramanikandan - * Raju, Anand Sawant, Igor Stoppa, Paul Walmsley, Richard Woodruff - */ - -#undef DEBUG - -#include <linux/init.h> -#include <linux/cpufreq.h> -#include <linux/device.h> - -/* Interface documentation is in mach/omap-pm.h */ -#include <plat/omap-pm.h> - -#include <plat/powerdomain.h> - -struct omap_opp *dsp_opps; -struct omap_opp *mpu_opps; -struct omap_opp *l3_opps; - -/* - * Device-driver-originated constraints (via board-*.c files) - */ - -int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t) -{ -	if (!dev || t < -1) { -		WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); -		return -EINVAL; -	}; - -	if (t == -1) -		pr_debug("OMAP PM: remove max MPU wakeup latency constraint: " -			 "dev %s\n", dev_name(dev)); -	else -		pr_debug("OMAP PM: add max MPU wakeup latency constraint: " -			 "dev %s, t = %ld usec\n", dev_name(dev), t); - -	/* -	 * For current Linux, this needs to map the MPU to a -	 * powerdomain, then go through the list of current max lat -	 * constraints on the MPU and find the smallest.  If -	 * the latency constraint has changed, the code should -	 * recompute the state to enter for the next powerdomain -	 * state. -	 * -	 * TI CDP code can call constraint_set here. -	 */ - -	return 0; -} - -int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) -{ -	if (!dev || (agent_id != OCP_INITIATOR_AGENT && -	    agent_id != OCP_TARGET_AGENT)) { -		WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); -		return -EINVAL; -	}; - -	if (r == 0) -		pr_debug("OMAP PM: remove min bus tput constraint: " -			 "dev %s for agent_id %d\n", dev_name(dev), agent_id); -	else -		pr_debug("OMAP PM: add min bus tput constraint: " -			 "dev %s for agent_id %d: rate %ld KiB\n", -			 dev_name(dev), agent_id, r); - -	/* -	 * This code should model the interconnect and compute the -	 * required clock frequency, convert that to a VDD2 OPP ID, then -	 * set the VDD2 OPP appropriately. -	 * -	 * TI CDP code can call constraint_set here on the VDD2 OPP. -	 */ - -	return 0; -} - -int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, -				   long t) -{ -	if (!req_dev || !dev || t < -1) { -		WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); -		return -EINVAL; -	}; - -	if (t == -1) -		pr_debug("OMAP PM: remove max device latency constraint: " -			 "dev %s\n", dev_name(dev)); -	else -		pr_debug("OMAP PM: add max device latency constraint: " -			 "dev %s, t = %ld usec\n", dev_name(dev), t); - -	/* -	 * For current Linux, this needs to map the device to a -	 * powerdomain, then go through the list of current max lat -	 * constraints on that powerdomain and find the smallest.  If -	 * the latency constraint has changed, the code should -	 * recompute the state to enter for the next powerdomain -	 * state.  Conceivably, this code should also determine -	 * whether to actually disable the device clocks or not, -	 * depending on how long it takes to re-enable the clocks. -	 * -	 * TI CDP code can call constraint_set here. -	 */ - -	return 0; -} - -int omap_pm_set_max_sdma_lat(struct device *dev, long t) -{ -	if (!dev || t < -1) { -		WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); -		return -EINVAL; -	}; - -	if (t == -1) -		pr_debug("OMAP PM: remove max DMA latency constraint: " -			 "dev %s\n", dev_name(dev)); -	else -		pr_debug("OMAP PM: add max DMA latency constraint: " -			 "dev %s, t = %ld usec\n", dev_name(dev), t); - -	/* -	 * For current Linux PM QOS params, this code should scan the -	 * list of maximum CPU and DMA latencies and select the -	 * smallest, then set cpu_dma_latency pm_qos_param -	 * accordingly. -	 * -	 * For future Linux PM QOS params, with separate CPU and DMA -	 * latency params, this code should just set the dma_latency param. -	 * -	 * TI CDP code can call constraint_set here. -	 */ - -	return 0; -} - -int omap_pm_set_min_clk_rate(struct device *dev, struct clk *c, long r) -{ -	if (!dev || !c || r < 0) { -		WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); -		return -EINVAL; -	} - -	if (r == 0) -		pr_debug("OMAP PM: remove min clk rate constraint: " -			 "dev %s\n", dev_name(dev)); -	else -		pr_debug("OMAP PM: add min clk rate constraint: " -			 "dev %s, rate = %ld Hz\n", dev_name(dev), r); - -	/* -	 * Code in a real implementation should keep track of these -	 * constraints on the clock, and determine the highest minimum -	 * clock rate.  It should iterate over each OPP and determine -	 * whether the OPP will result in a clock rate that would -	 * satisfy this constraint (and any other PM constraint in effect -	 * at that time).  Once it finds the lowest-voltage OPP that -	 * meets those conditions, it should switch to it, or return -	 * an error if the code is not capable of doing so. -	 */ - -	return 0; -} - -/* - * DSP Bridge-specific constraints - */ - -const struct omap_opp *omap_pm_dsp_get_opp_table(void) -{ -	pr_debug("OMAP PM: DSP request for OPP table\n"); - -	/* -	 * Return DSP frequency table here:  The final item in the -	 * array should have .rate = .opp_id = 0. -	 */ - -	return NULL; -} - -void omap_pm_dsp_set_min_opp(u8 opp_id) -{ -	if (opp_id == 0) { -		WARN_ON(1); -		return; -	} - -	pr_debug("OMAP PM: DSP requests minimum VDD1 OPP to be %d\n", opp_id); - -	/* -	 * -	 * For l-o dev tree, our VDD1 clk is keyed on OPP ID, so we -	 * can just test to see which is higher, the CPU's desired OPP -	 * ID or the DSP's desired OPP ID, and use whichever is -	 * highest. -	 * -	 * In CDP12.14+, the VDD1 OPP custom clock that controls the DSP -	 * rate is keyed on MPU speed, not the OPP ID.  So we need to -	 * map the OPP ID to the MPU speed for use with clk_set_rate() -	 * if it is higher than the current OPP clock rate. -	 * -	 */ -} - - -u8 omap_pm_dsp_get_opp(void) -{ -	pr_debug("OMAP PM: DSP requests current DSP OPP ID\n"); - -	/* -	 * For l-o dev tree, call clk_get_rate() on VDD1 OPP clock -	 * -	 * CDP12.14+: -	 * Call clk_get_rate() on the OPP custom clock, map that to an -	 * OPP ID using the tables defined in board-*.c/chip-*.c files. -	 */ - -	return 0; -} - -/* - * CPUFreq-originated constraint - * - * In the future, this should be handled by custom OPP clocktype - * functions. - */ - -struct cpufreq_frequency_table **omap_pm_cpu_get_freq_table(void) -{ -	pr_debug("OMAP PM: CPUFreq request for frequency table\n"); - -	/* -	 * Return CPUFreq frequency table here: loop over -	 * all VDD1 clkrates, pull out the mpu_ck frequencies, build -	 * table -	 */ - -	return NULL; -} - -void omap_pm_cpu_set_freq(unsigned long f) -{ -	if (f == 0) { -		WARN_ON(1); -		return; -	} - -	pr_debug("OMAP PM: CPUFreq requests CPU frequency to be set to %lu\n", -		 f); - -	/* -	 * For l-o dev tree, determine whether MPU freq or DSP OPP id -	 * freq is higher.  Find the OPP ID corresponding to the -	 * higher frequency.  Call clk_round_rate() and clk_set_rate() -	 * on the OPP custom clock. -	 * -	 * CDP should just be able to set the VDD1 OPP clock rate here. -	 */ -} - -unsigned long omap_pm_cpu_get_freq(void) -{ -	pr_debug("OMAP PM: CPUFreq requests current CPU frequency\n"); - -	/* -	 * Call clk_get_rate() on the mpu_ck. -	 */ - -	return 0; -} - -/* - * Device context loss tracking - */ - -int omap_pm_get_dev_context_loss_count(struct device *dev) -{ -	if (!dev) { -		WARN_ON(1); -		return -EINVAL; -	}; - -	pr_debug("OMAP PM: returning context loss count for dev %s\n", -		 dev_name(dev)); - -	/* -	 * Map the device to the powerdomain.  Return the powerdomain -	 * off counter. -	 */ - -	return 0; -} - - -/* Should be called before clk framework init */ -int __init omap_pm_if_early_init(struct omap_opp *mpu_opp_table, -				 struct omap_opp *dsp_opp_table, -				 struct omap_opp *l3_opp_table) -{ -	mpu_opps = mpu_opp_table; -	dsp_opps = dsp_opp_table; -	l3_opps = l3_opp_table; -	return 0; -} - -/* Must be called after clock framework is initialized */ -int __init omap_pm_if_init(void) -{ -	return 0; -} - -void omap_pm_if_exit(void) -{ -	/* Deallocate CPUFreq frequency table here */ -} - diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c deleted file mode 100644 index abe933cd8f0..00000000000 --- a/arch/arm/plat-omap/omap_device.c +++ /dev/null @@ -1,785 +0,0 @@ -/* - * omap_device implementation - * - * Copyright (C) 2009-2010 Nokia Corporation - * Paul Walmsley, Kevin Hilman - * - * Developed in collaboration with (alphabetical order): Benoit - * Cousson, Thara Gopinath, Tony Lindgren, Rajendra Nayak, Vikram - * Pandita, Sakari Poussa, Anand Sawant, Santosh Shilimkar, Richard - * Woodruff - * - * 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 code provides a consistent interface for OMAP device drivers - * to control power management and interconnect properties of their - * devices. - * - * In the medium- to long-term, this code should either be - * a) implemented via arch-specific pointers in platform_data - * or - * b) implemented as a proper omap_bus/omap_device in Linux, no more - *    platform_data func pointers - * - * - * Guidelines for usage by driver authors: - * - * 1. These functions are intended to be used by device drivers via - * function pointers in struct platform_data.  As an example, - * omap_device_enable() should be passed to the driver as - * - * struct foo_driver_platform_data { - * ... - *      int (*device_enable)(struct platform_device *pdev); - * ... - * } - * - * Note that the generic "device_enable" name is used, rather than - * "omap_device_enable".  This is so other architectures can pass in their - * own enable/disable functions here. - * - * This should be populated during device setup: - * - * ... - * pdata->device_enable = omap_device_enable; - * ... - * - * 2. Drivers should first check to ensure the function pointer is not null - * before calling it, as in: - * - * if (pdata->device_enable) - *     pdata->device_enable(pdev); - * - * This allows other architectures that don't use similar device_enable()/ - * device_shutdown() functions to execute normally. - * - * ... - * - * Suggested usage by device drivers: - * - * During device initialization: - * device_enable() - * - * During device idle: - * (save remaining device context if necessary) - * device_idle(); - * - * During device resume: - * device_enable(); - * (restore context if necessary) - * - * During device shutdown: - * device_shutdown() - * (device must be reinitialized at this point to use it again) - * - */ -#undef DEBUG - -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/clk.h> - -#include <plat/omap_device.h> -#include <plat/omap_hwmod.h> - -/* These parameters are passed to _omap_device_{de,}activate() */ -#define USE_WAKEUP_LAT			0 -#define IGNORE_WAKEUP_LAT		1 - -/* Private functions */ - -/** - * _omap_device_activate - increase device readiness - * @od: struct omap_device * - * @ignore_lat: increase to latency target (0) or full readiness (1)? - * - * Increase readiness of omap_device @od (thus decreasing device - * wakeup latency, but consuming more power).  If @ignore_lat is - * IGNORE_WAKEUP_LAT, make the omap_device fully active.  Otherwise, - * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup - * latency is greater than the requested maximum wakeup latency, step - * backwards in the omap_device_pm_latency table to ensure the - * device's maximum wakeup latency is less than or equal to the - * requested maximum wakeup latency.  Returns 0. - */ -static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) -{ -	struct timespec a, b, c; - -	pr_debug("omap_device: %s: activating\n", od->pdev.name); - -	while (od->pm_lat_level > 0) { -		struct omap_device_pm_latency *odpl; -		unsigned long long act_lat = 0; - -		od->pm_lat_level--; - -		odpl = od->pm_lats + od->pm_lat_level; - -		if (!ignore_lat && -		    (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit)) -			break; - -		read_persistent_clock(&a); - -		/* XXX check return code */ -		odpl->activate_func(od); - -		read_persistent_clock(&b); - -		c = timespec_sub(b, a); -		act_lat = timespec_to_ns(&c); - -		pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time " -			 "%llu nsec\n", od->pdev.name, od->pm_lat_level, -			 act_lat); - -		if (act_lat > odpl->activate_lat) { -			odpl->activate_lat_worst = act_lat; -			if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { -				odpl->activate_lat = act_lat; -				pr_warning("omap_device: %s.%d: new worst case " -					   "activate latency %d: %llu\n", -					   od->pdev.name, od->pdev.id, -					   od->pm_lat_level, act_lat); -			} else -				pr_warning("omap_device: %s.%d: activate " -					   "latency %d higher than exptected. " -					   "(%llu > %d)\n", -					   od->pdev.name, od->pdev.id, -					   od->pm_lat_level, act_lat, -					   odpl->activate_lat); -		} - -		od->dev_wakeup_lat -= odpl->activate_lat; -	} - -	return 0; -} - -/** - * _omap_device_deactivate - decrease device readiness - * @od: struct omap_device * - * @ignore_lat: decrease to latency target (0) or full inactivity (1)? - * - * Decrease readiness of omap_device @od (thus increasing device - * wakeup latency, but conserving power).  If @ignore_lat is - * IGNORE_WAKEUP_LAT, make the omap_device fully inactive.  Otherwise, - * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup - * latency is less than the requested maximum wakeup latency, step - * forwards in the omap_device_pm_latency table to ensure the device's - * maximum wakeup latency is less than or equal to the requested - * maximum wakeup latency.  Returns 0. - */ -static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) -{ -	struct timespec a, b, c; - -	pr_debug("omap_device: %s: deactivating\n", od->pdev.name); - -	while (od->pm_lat_level < od->pm_lats_cnt) { -		struct omap_device_pm_latency *odpl; -		unsigned long long deact_lat = 0; - -		odpl = od->pm_lats + od->pm_lat_level; - -		if (!ignore_lat && -		    ((od->dev_wakeup_lat + odpl->activate_lat) > -		     od->_dev_wakeup_lat_limit)) -			break; - -		read_persistent_clock(&a); - -		/* XXX check return code */ -		odpl->deactivate_func(od); - -		read_persistent_clock(&b); - -		c = timespec_sub(b, a); -		deact_lat = timespec_to_ns(&c); - -		pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time " -			 "%llu nsec\n", od->pdev.name, od->pm_lat_level, -			 deact_lat); - -		if (deact_lat > odpl->deactivate_lat) { -			odpl->deactivate_lat_worst = deact_lat; -			if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { -				odpl->deactivate_lat = deact_lat; -				pr_warning("omap_device: %s.%d: new worst case " -					   "deactivate latency %d: %llu\n", -					   od->pdev.name, od->pdev.id, -					   od->pm_lat_level, deact_lat); -			} else -				pr_warning("omap_device: %s.%d: deactivate " -					   "latency %d higher than exptected. " -					   "(%llu > %d)\n", -					   od->pdev.name, od->pdev.id, -					   od->pm_lat_level, deact_lat, -					   odpl->deactivate_lat); -		} - - -		od->dev_wakeup_lat += odpl->activate_lat; - -		od->pm_lat_level++; -	} - -	return 0; -} - -static inline struct omap_device *_find_by_pdev(struct platform_device *pdev) -{ -	return container_of(pdev, struct omap_device, pdev); -} - -/** - * _add_optional_clock_alias - Add clock alias for hwmod optional clocks - * @od: struct omap_device *od - * - * For every optional clock present per hwmod per omap_device, this function - * adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role> - * if an entry is already present in it with the form <dev-id=NULL, con-id=role> - * - * The function is called from inside omap_device_build_ss(), after - * omap_device_register. - * - * This allows drivers to get a pointer to its optional clocks based on its role - * by calling clk_get(<dev*>, <role>). - * - * No return value. - */ -static void _add_optional_clock_alias(struct omap_device *od, -				      struct omap_hwmod *oh) -{ -	int i; - -	for (i = 0; i < oh->opt_clks_cnt; i++) { -		struct omap_hwmod_opt_clk *oc; -		int r; - -		oc = &oh->opt_clks[i]; - -		if (!oc->_clk) -			continue; - -		r = clk_add_alias(oc->role, dev_name(&od->pdev.dev), -				  (char *)oc->clk, &od->pdev.dev); -		if (r) -			pr_err("omap_device: %s: clk_add_alias for %s failed\n", -			       dev_name(&od->pdev.dev), oc->role); -	} -} - - -/* Public functions for use by core code */ - -/** - * omap_device_count_resources - count number of struct resource entries needed - * @od: struct omap_device * - * - * Count the number of struct resource entries needed for this - * omap_device @od.  Used by omap_device_build_ss() to determine how - * much memory to allocate before calling - * omap_device_fill_resources().  Returns the count. - */ -int omap_device_count_resources(struct omap_device *od) -{ -	int c = 0; -	int i; - -	for (i = 0; i < od->hwmods_cnt; i++) -		c += omap_hwmod_count_resources(od->hwmods[i]); - -	pr_debug("omap_device: %s: counted %d total resources across %d " -		 "hwmods\n", od->pdev.name, c, od->hwmods_cnt); - -	return c; -} - -/** - * omap_device_fill_resources - fill in array of struct resource - * @od: struct omap_device * - * @res: pointer to an array of struct resource to be filled in - * - * Populate one or more empty struct resource pointed to by @res with - * the resource data for this omap_device @od.  Used by - * omap_device_build_ss() after calling omap_device_count_resources(). - * Ideally this function would not be needed at all.  If omap_device - * replaces platform_device, then we can specify our own - * get_resource()/ get_irq()/etc functions that use the underlying - * omap_hwmod information.  Or if platform_device is extended to use - * subarchitecture-specific function pointers, the various - * platform_device functions can simply call omap_device internal - * functions to get device resources.  Hacking around the existing - * platform_device code wastes memory.  Returns 0. - */ -int omap_device_fill_resources(struct omap_device *od, struct resource *res) -{ -	int c = 0; -	int i, r; - -	for (i = 0; i < od->hwmods_cnt; i++) { -		r = omap_hwmod_fill_resources(od->hwmods[i], res); -		res += r; -		c += r; -	} - -	return 0; -} - -/** - * omap_device_build - build and register an omap_device with one omap_hwmod - * @pdev_name: name of the platform_device driver to use - * @pdev_id: this platform_device's connection ID - * @oh: ptr to the single omap_hwmod that backs this omap_device - * @pdata: platform_data ptr to associate with the platform_device - * @pdata_len: amount of memory pointed to by @pdata - * @pm_lats: pointer to a omap_device_pm_latency array for this device - * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats - * @is_early_device: should the device be registered as an early device or not - * - * Convenience function for building and registering a single - * omap_device record, which in turn builds and registers a - * platform_device record.  See omap_device_build_ss() for more - * information.  Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, - * passes along the return value of omap_device_build_ss(). - */ -struct omap_device *omap_device_build(const char *pdev_name, int pdev_id, -				      struct omap_hwmod *oh, void *pdata, -				      int pdata_len, -				      struct omap_device_pm_latency *pm_lats, -				      int pm_lats_cnt, int is_early_device) -{ -	struct omap_hwmod *ohs[] = { oh }; - -	if (!oh) -		return ERR_PTR(-EINVAL); - -	return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata, -				    pdata_len, pm_lats, pm_lats_cnt, -				    is_early_device); -} - -/** - * omap_device_build_ss - build and register an omap_device with multiple hwmods - * @pdev_name: name of the platform_device driver to use - * @pdev_id: this platform_device's connection ID - * @oh: ptr to the single omap_hwmod that backs this omap_device - * @pdata: platform_data ptr to associate with the platform_device - * @pdata_len: amount of memory pointed to by @pdata - * @pm_lats: pointer to a omap_device_pm_latency array for this device - * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats - * @is_early_device: should the device be registered as an early device or not - * - * Convenience function for building and registering an omap_device - * subsystem record.  Subsystem records consist of multiple - * omap_hwmods.  This function in turn builds and registers a - * platform_device record.  Returns an ERR_PTR() on error, or passes - * along the return value of omap_device_register(). - */ -struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, -					 struct omap_hwmod **ohs, int oh_cnt, -					 void *pdata, int pdata_len, -					 struct omap_device_pm_latency *pm_lats, -					 int pm_lats_cnt, int is_early_device) -{ -	int ret = -ENOMEM; -	struct omap_device *od; -	char *pdev_name2; -	struct resource *res = NULL; -	int i, res_count; -	struct omap_hwmod **hwmods; - -	if (!ohs || oh_cnt == 0 || !pdev_name) -		return ERR_PTR(-EINVAL); - -	if (!pdata && pdata_len > 0) -		return ERR_PTR(-EINVAL); - -	pr_debug("omap_device: %s: building with %d hwmods\n", pdev_name, -		 oh_cnt); - -	od = kzalloc(sizeof(struct omap_device), GFP_KERNEL); -	if (!od) -		return ERR_PTR(-ENOMEM); - -	od->hwmods_cnt = oh_cnt; - -	hwmods = kzalloc(sizeof(struct omap_hwmod *) * oh_cnt, -			 GFP_KERNEL); -	if (!hwmods) -		goto odbs_exit1; - -	memcpy(hwmods, ohs, sizeof(struct omap_hwmod *) * oh_cnt); -	od->hwmods = hwmods; - -	pdev_name2 = kzalloc(strlen(pdev_name) + 1, GFP_KERNEL); -	if (!pdev_name2) -		goto odbs_exit2; -	strcpy(pdev_name2, pdev_name); - -	od->pdev.name = pdev_name2; -	od->pdev.id = pdev_id; - -	res_count = omap_device_count_resources(od); -	if (res_count > 0) { -		res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL); -		if (!res) -			goto odbs_exit3; -	} -	omap_device_fill_resources(od, res); - -	od->pdev.num_resources = res_count; -	od->pdev.resource = res; - -	ret = platform_device_add_data(&od->pdev, pdata, pdata_len); -	if (ret) -		goto odbs_exit4; - -	od->pm_lats = pm_lats; -	od->pm_lats_cnt = pm_lats_cnt; - -	if (is_early_device) -		ret = omap_early_device_register(od); -	else -		ret = omap_device_register(od); - -	for (i = 0; i < oh_cnt; i++) { -		hwmods[i]->od = od; -		_add_optional_clock_alias(od, hwmods[i]); -	} - -	if (ret) -		goto odbs_exit4; - -	return od; - -odbs_exit4: -	kfree(res); -odbs_exit3: -	kfree(pdev_name2); -odbs_exit2: -	kfree(hwmods); -odbs_exit1: -	kfree(od); - -	pr_err("omap_device: %s: build failed (%d)\n", pdev_name, ret); - -	return ERR_PTR(ret); -} - -/** - * omap_early_device_register - register an omap_device as an early platform - * device. - * @od: struct omap_device * to register - * - * Register the omap_device structure.  This currently just calls - * platform_early_add_device() on the underlying platform_device. - * Returns 0 by default. - */ -int omap_early_device_register(struct omap_device *od) -{ -	struct platform_device *devices[1]; - -	devices[0] = &(od->pdev); -	early_platform_add_devices(devices, 1); -	return 0; -} - -/** - * omap_device_register - register an omap_device with one omap_hwmod - * @od: struct omap_device * to register - * - * Register the omap_device structure.  This currently just calls - * platform_device_register() on the underlying platform_device. - * Returns the return value of platform_device_register(). - */ -int omap_device_register(struct omap_device *od) -{ -	pr_debug("omap_device: %s: registering\n", od->pdev.name); - -	od->pdev.dev.parent = &omap_device_parent; -	return platform_device_register(&od->pdev); -} - - -/* Public functions for use by device drivers through struct platform_data */ - -/** - * omap_device_enable - fully activate an omap_device - * @od: struct omap_device * to activate - * - * Do whatever is necessary for the hwmods underlying omap_device @od - * to be accessible and ready to operate.  This generally involves - * enabling clocks, setting SYSCONFIG registers; and in the future may - * involve remuxing pins.  Device drivers should call this function - * (through platform_data function pointers) where they would normally - * enable clocks, etc.  Returns -EINVAL if called when the omap_device - * is already enabled, or passes along the return value of - * _omap_device_activate(). - */ -int omap_device_enable(struct platform_device *pdev) -{ -	int ret; -	struct omap_device *od; - -	od = _find_by_pdev(pdev); - -	if (od->_state == OMAP_DEVICE_STATE_ENABLED) { -		WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", -		     od->pdev.name, od->pdev.id, __func__, od->_state); -		return -EINVAL; -	} - -	/* Enable everything if we're enabling this device from scratch */ -	if (od->_state == OMAP_DEVICE_STATE_UNKNOWN) -		od->pm_lat_level = od->pm_lats_cnt; - -	ret = _omap_device_activate(od, IGNORE_WAKEUP_LAT); - -	od->dev_wakeup_lat = 0; -	od->_dev_wakeup_lat_limit = UINT_MAX; -	od->_state = OMAP_DEVICE_STATE_ENABLED; - -	return ret; -} - -/** - * omap_device_idle - idle an omap_device - * @od: struct omap_device * to idle - * - * Idle omap_device @od by calling as many .deactivate_func() entries - * in the omap_device's pm_lats table as is possible without exceeding - * the device's maximum wakeup latency limit, pm_lat_limit.  Device - * drivers should call this function (through platform_data function - * pointers) where they would normally disable clocks after operations - * complete, etc..  Returns -EINVAL if the omap_device is not - * currently enabled, or passes along the return value of - * _omap_device_deactivate(). - */ -int omap_device_idle(struct platform_device *pdev) -{ -	int ret; -	struct omap_device *od; - -	od = _find_by_pdev(pdev); - -	if (od->_state != OMAP_DEVICE_STATE_ENABLED) { -		WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", -		     od->pdev.name, od->pdev.id, __func__, od->_state); -		return -EINVAL; -	} - -	ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); - -	od->_state = OMAP_DEVICE_STATE_IDLE; - -	return ret; -} - -/** - * omap_device_shutdown - shut down an omap_device - * @od: struct omap_device * to shut down - * - * Shut down omap_device @od by calling all .deactivate_func() entries - * in the omap_device's pm_lats table and then shutting down all of - * the underlying omap_hwmods.  Used when a device is being "removed" - * or a device driver is being unloaded.  Returns -EINVAL if the - * omap_device is not currently enabled or idle, or passes along the - * return value of _omap_device_deactivate(). - */ -int omap_device_shutdown(struct platform_device *pdev) -{ -	int ret, i; -	struct omap_device *od; - -	od = _find_by_pdev(pdev); - -	if (od->_state != OMAP_DEVICE_STATE_ENABLED && -	    od->_state != OMAP_DEVICE_STATE_IDLE) { -		WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", -		     od->pdev.name, od->pdev.id, __func__, od->_state); -		return -EINVAL; -	} - -	ret = _omap_device_deactivate(od, IGNORE_WAKEUP_LAT); - -	for (i = 0; i < od->hwmods_cnt; i++) -		omap_hwmod_shutdown(od->hwmods[i]); - -	od->_state = OMAP_DEVICE_STATE_SHUTDOWN; - -	return ret; -} - -/** - * omap_device_align_pm_lat - activate/deactivate device to match wakeup lat lim - * @od: struct omap_device * - * - * When a device's maximum wakeup latency limit changes, call some of - * the .activate_func or .deactivate_func function pointers in the - * omap_device's pm_lats array to ensure that the device's maximum - * wakeup latency is less than or equal to the new latency limit. - * Intended to be called by OMAP PM code whenever a device's maximum - * wakeup latency limit changes (e.g., via - * omap_pm_set_dev_wakeup_lat()).  Returns 0 if nothing needs to be - * done (e.g., if the omap_device is not currently idle, or if the - * wakeup latency is already current with the new limit) or passes - * along the return value of _omap_device_deactivate() or - * _omap_device_activate(). - */ -int omap_device_align_pm_lat(struct platform_device *pdev, -			     u32 new_wakeup_lat_limit) -{ -	int ret = -EINVAL; -	struct omap_device *od; - -	od = _find_by_pdev(pdev); - -	if (new_wakeup_lat_limit == od->dev_wakeup_lat) -		return 0; - -	od->_dev_wakeup_lat_limit = new_wakeup_lat_limit; - -	if (od->_state != OMAP_DEVICE_STATE_IDLE) -		return 0; -	else if (new_wakeup_lat_limit > od->dev_wakeup_lat) -		ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); -	else if (new_wakeup_lat_limit < od->dev_wakeup_lat) -		ret = _omap_device_activate(od, USE_WAKEUP_LAT); - -	return ret; -} - -/** - * omap_device_get_pwrdm - return the powerdomain * associated with @od - * @od: struct omap_device * - * - * Return the powerdomain associated with the first underlying - * omap_hwmod for this omap_device.  Intended for use by core OMAP PM - * code.  Returns NULL on error or a struct powerdomain * upon - * success. - */ -struct powerdomain *omap_device_get_pwrdm(struct omap_device *od) -{ -	/* -	 * XXX Assumes that all omap_hwmod powerdomains are identical. -	 * This may not necessarily be true.  There should be a sanity -	 * check in here to WARN() if any difference appears. -	 */ -	if (!od->hwmods_cnt) -		return NULL; - -	return omap_hwmod_get_pwrdm(od->hwmods[0]); -} - -/** - * omap_device_get_mpu_rt_va - return the MPU's virtual addr for the hwmod base - * @od: struct omap_device * - * - * Return the MPU's virtual address for the base of the hwmod, from - * the ioremap() that the hwmod code does.  Only valid if there is one - * hwmod associated with this device.  Returns NULL if there are zero - * or more than one hwmods associated with this omap_device; - * otherwise, passes along the return value from - * omap_hwmod_get_mpu_rt_va(). - */ -void __iomem *omap_device_get_rt_va(struct omap_device *od) -{ -	if (od->hwmods_cnt != 1) -		return NULL; - -	return omap_hwmod_get_mpu_rt_va(od->hwmods[0]); -} - -/* - * Public functions intended for use in omap_device_pm_latency - * .activate_func and .deactivate_func function pointers - */ - -/** - * omap_device_enable_hwmods - call omap_hwmod_enable() on all hwmods - * @od: struct omap_device *od - * - * Enable all underlying hwmods.  Returns 0. - */ -int omap_device_enable_hwmods(struct omap_device *od) -{ -	int i; - -	for (i = 0; i < od->hwmods_cnt; i++) -		omap_hwmod_enable(od->hwmods[i]); - -	/* XXX pass along return value here? */ -	return 0; -} - -/** - * omap_device_idle_hwmods - call omap_hwmod_idle() on all hwmods - * @od: struct omap_device *od - * - * Idle all underlying hwmods.  Returns 0. - */ -int omap_device_idle_hwmods(struct omap_device *od) -{ -	int i; - -	for (i = 0; i < od->hwmods_cnt; i++) -		omap_hwmod_idle(od->hwmods[i]); - -	/* XXX pass along return value here? */ -	return 0; -} - -/** - * omap_device_disable_clocks - disable all main and interface clocks - * @od: struct omap_device *od - * - * Disable the main functional clock and interface clock for all of the - * omap_hwmods associated with the omap_device.  Returns 0. - */ -int omap_device_disable_clocks(struct omap_device *od) -{ -	int i; - -	for (i = 0; i < od->hwmods_cnt; i++) -		omap_hwmod_disable_clocks(od->hwmods[i]); - -	/* XXX pass along return value here? */ -	return 0; -} - -/** - * omap_device_enable_clocks - enable all main and interface clocks - * @od: struct omap_device *od - * - * Enable the main functional clock and interface clock for all of the - * omap_hwmods associated with the omap_device.  Returns 0. - */ -int omap_device_enable_clocks(struct omap_device *od) -{ -	int i; - -	for (i = 0; i < od->hwmods_cnt; i++) -		omap_hwmod_enable_clocks(od->hwmods[i]); - -	/* XXX pass along return value here? */ -	return 0; -} - -struct device omap_device_parent = { -	.init_name	= "omap", -	.parent         = &platform_bus, -}; - -static int __init omap_device_init(void) -{ -	return device_register(&omap_device_parent); -} -core_initcall(omap_device_init); diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index e2c8eebe6b3..a5bc92d7e47 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c @@ -6,8 +6,8 @@   * Copyright (C) 2005 Nokia Corporation   * Written by Tony Lindgren <tony@atomide.com>   * - * Copyright (C) 2009 Texas Instruments - * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> + * Copyright (C) 2009-2012 Texas Instruments + * Added OMAP4/5 support - 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 @@ -19,423 +19,80 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/io.h> -#include <linux/omapfb.h> +#include <asm/fncpy.h>  #include <asm/tlb.h>  #include <asm/cacheflush.h>  #include <asm/mach/map.h>  #include <plat/sram.h> -#include <plat/board.h> -#include <plat/cpu.h> -#include <plat/vram.h> - -#include "sram.h" -#include "fb.h" -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -# include "../mach-omap2/prm.h" -# include "../mach-omap2/cm.h" -# include "../mach-omap2/sdrc.h" -#endif - -#define OMAP1_SRAM_PA		0x20000000 -#define OMAP1_SRAM_VA		VMALLOC_END -#define OMAP2_SRAM_PA		0x40200000 -#define OMAP2_SRAM_PUB_PA	0x4020f800 -#define OMAP2_SRAM_VA		0xfe400000 -#define OMAP2_SRAM_PUB_VA	(OMAP2_SRAM_VA + 0x800) -#define OMAP3_SRAM_PA           0x40200000 -#define OMAP3_SRAM_VA           0xfe400000 -#define OMAP3_SRAM_PUB_PA       0x40208000 -#define OMAP3_SRAM_PUB_VA       (OMAP3_SRAM_VA + 0x8000) -#define OMAP4_SRAM_PA		0x40300000 -#define OMAP4_SRAM_VA		0xfe400000 -#define OMAP4_SRAM_PUB_PA	(OMAP4_SRAM_PA + 0x4000) -#define OMAP4_SRAM_PUB_VA	(OMAP4_SRAM_VA + 0x4000) - -#if defined(CONFIG_ARCH_OMAP2PLUS) -#define SRAM_BOOTLOADER_SZ	0x00 -#else -#define SRAM_BOOTLOADER_SZ	0x80 -#endif - -#define OMAP24XX_VA_REQINFOPERM0	OMAP2_L3_IO_ADDRESS(0x68005048) -#define OMAP24XX_VA_READPERM0		OMAP2_L3_IO_ADDRESS(0x68005050) -#define OMAP24XX_VA_WRITEPERM0		OMAP2_L3_IO_ADDRESS(0x68005058) - -#define OMAP34XX_VA_REQINFOPERM0	OMAP2_L3_IO_ADDRESS(0x68012848) -#define OMAP34XX_VA_READPERM0		OMAP2_L3_IO_ADDRESS(0x68012850) -#define OMAP34XX_VA_WRITEPERM0		OMAP2_L3_IO_ADDRESS(0x68012858) -#define OMAP34XX_VA_ADDR_MATCH2		OMAP2_L3_IO_ADDRESS(0x68012880) -#define OMAP34XX_VA_SMS_RG_ATT0		OMAP2_L3_IO_ADDRESS(0x6C000048) - -#define GP_DEVICE		0x300  #define ROUND_DOWN(value,boundary)	((value) & (~((boundary)-1))) -static unsigned long omap_sram_start; -static unsigned long omap_sram_base; +static void __iomem *omap_sram_base; +static unsigned long omap_sram_skip;  static unsigned long omap_sram_size; -static unsigned long omap_sram_ceil; +static void __iomem *omap_sram_ceil;  /* - * Depending on the target RAMFS firewall setup, the public usable amount of - * SRAM varies.  The default accessible size for all device types is 2k. A GP - * device allows ARM11 but not other initiators for full size. This - * functionality seems ok until some nice security API happens. - */ -static int is_sram_locked(void) -{ -	if (OMAP2_DEVICE_TYPE_GP == omap_type()) { -		/* RAMFW: R/W access to all initiators for all qualifier sets */ -		if (cpu_is_omap242x()) { -			__raw_writel(0xFF, OMAP24XX_VA_REQINFOPERM0); /* all q-vects */ -			__raw_writel(0xCFDE, OMAP24XX_VA_READPERM0);  /* all i-read */ -			__raw_writel(0xCFDE, OMAP24XX_VA_WRITEPERM0); /* all i-write */ -		} -		if (cpu_is_omap34xx()) { -			__raw_writel(0xFFFF, OMAP34XX_VA_REQINFOPERM0); /* all q-vects */ -			__raw_writel(0xFFFF, OMAP34XX_VA_READPERM0);  /* all i-read */ -			__raw_writel(0xFFFF, OMAP34XX_VA_WRITEPERM0); /* all i-write */ -			__raw_writel(0x0, OMAP34XX_VA_ADDR_MATCH2); -			__raw_writel(0xFFFFFFFF, OMAP34XX_VA_SMS_RG_ATT0); -		} -		return 0; -	} else -		return 1; /* assume locked with no PPA or security driver */ -} - -/* - * The amount of SRAM depends on the core type. - * Note that we cannot try to test for SRAM here because writes - * to secure SRAM will hang the system. Also the SRAM is not - * yet mapped at this point. + * Memory allocator for SRAM: calculates the new ceiling address + * for pushing a function using the fncpy API. + * + * Note that fncpy requires the returned address to be aligned + * to an 8-byte boundary.   */ -static void __init omap_detect_sram(void) +void *omap_sram_push_address(unsigned long size)  { -	unsigned long reserved; +	unsigned long available, new_ceil = (unsigned long)omap_sram_ceil; -	if (cpu_class_is_omap2()) { -		if (is_sram_locked()) { -			if (cpu_is_omap34xx()) { -				omap_sram_base = OMAP3_SRAM_PUB_VA; -				omap_sram_start = OMAP3_SRAM_PUB_PA; -				if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) || -				    (omap_type() == OMAP2_DEVICE_TYPE_SEC)) { -					omap_sram_size = 0x7000; /* 28K */ -				} else { -					omap_sram_size = 0x8000; /* 32K */ -				} -			} else if (cpu_is_omap44xx()) { -				omap_sram_base = OMAP4_SRAM_PUB_VA; -				omap_sram_start = OMAP4_SRAM_PUB_PA; -				omap_sram_size = 0xa000; /* 40K */ -			} else { -				omap_sram_base = OMAP2_SRAM_PUB_VA; -				omap_sram_start = OMAP2_SRAM_PUB_PA; -				omap_sram_size = 0x800; /* 2K */ -			} -		} else { -			if (cpu_is_omap34xx()) { -				omap_sram_base = OMAP3_SRAM_VA; -				omap_sram_start = OMAP3_SRAM_PA; -				omap_sram_size = 0x10000; /* 64K */ -			} else if (cpu_is_omap44xx()) { -				omap_sram_base = OMAP4_SRAM_VA; -				omap_sram_start = OMAP4_SRAM_PA; -				omap_sram_size = 0xe000; /* 56K */ -			} else { -				omap_sram_base = OMAP2_SRAM_VA; -				omap_sram_start = OMAP2_SRAM_PA; -				if (cpu_is_omap242x()) -					omap_sram_size = 0xa0000; /* 640K */ -				else if (cpu_is_omap243x()) -					omap_sram_size = 0x10000; /* 64K */ -			} -		} -	} else { -		omap_sram_base = OMAP1_SRAM_VA; -		omap_sram_start = OMAP1_SRAM_PA; +	available = omap_sram_ceil - (omap_sram_base + omap_sram_skip); -		if (cpu_is_omap7xx()) -			omap_sram_size = 0x32000;	/* 200K */ -		else if (cpu_is_omap15xx()) -			omap_sram_size = 0x30000;	/* 192K */ -		else if (cpu_is_omap1610() || cpu_is_omap1621() || -		     cpu_is_omap1710()) -			omap_sram_size = 0x4000;	/* 16K */ -		else if (cpu_is_omap1611()) -			omap_sram_size = 0x3e800;	/* 250K */ -		else { -			printk(KERN_ERR "Could not detect SRAM size\n"); -			omap_sram_size = 0x4000; -		} +	if (size > available) { +		pr_err("Not enough space in SRAM\n"); +		return NULL;  	} -	reserved = omapfb_reserve_sram(omap_sram_start, omap_sram_base, -				       omap_sram_size, -				       omap_sram_start + SRAM_BOOTLOADER_SZ, -				       omap_sram_size - SRAM_BOOTLOADER_SZ); -	omap_sram_size -= reserved; -	reserved = omap_vram_reserve_sram(omap_sram_start, omap_sram_base, -			omap_sram_size, -			omap_sram_start + SRAM_BOOTLOADER_SZ, -			omap_sram_size - SRAM_BOOTLOADER_SZ); -	omap_sram_size -= reserved; +	new_ceil -= size; +	new_ceil = ROUND_DOWN(new_ceil, FNCPY_ALIGN); +	omap_sram_ceil = IOMEM(new_ceil); -	omap_sram_ceil = omap_sram_base + omap_sram_size; +	return (void *)omap_sram_ceil;  } -static struct map_desc omap_sram_io_desc[] __initdata = { -	{	/* .length gets filled in at runtime */ -		.virtual	= OMAP1_SRAM_VA, -		.pfn		= __phys_to_pfn(OMAP1_SRAM_PA), -		.type		= MT_MEMORY -	} -}; +/* + * The SRAM context is lost during off-idle and stack + * needs to be reset. + */ +void omap_sram_reset(void) +{ +	omap_sram_ceil = omap_sram_base + omap_sram_size; +}  /*   * Note that we cannot use ioremap for SRAM, as clock init needs SRAM early.   */ -static void __init omap_map_sram(void) +void __init omap_map_sram(unsigned long start, unsigned long size, +				 unsigned long skip, int cached)  { -	unsigned long base; - -	if (omap_sram_size == 0) +	if (size == 0)  		return; -	if (cpu_is_omap34xx()) { -		/* -		 * SRAM must be marked as non-cached on OMAP3 since the -		 * CORE DPLL M2 divider change code (in SRAM) runs with the -		 * SDRAM controller disabled, and if it is marked cached, -		 * the ARM may attempt to write cache lines back to SDRAM -		 * which will cause the system to hang. -		 */ -		omap_sram_io_desc[0].type = MT_MEMORY_NONCACHED; +	start = ROUND_DOWN(start, PAGE_SIZE); +	omap_sram_size = size; +	omap_sram_skip = skip; +	omap_sram_base = __arm_ioremap_exec(start, size, cached); +	if (!omap_sram_base) { +		pr_err("SRAM: Could not map\n"); +		return;  	} -	omap_sram_io_desc[0].virtual = omap_sram_base; -	base = omap_sram_start; -	base = ROUND_DOWN(base, PAGE_SIZE); -	omap_sram_io_desc[0].pfn = __phys_to_pfn(base); -	omap_sram_io_desc[0].length = ROUND_DOWN(omap_sram_size, PAGE_SIZE); -	iotable_init(omap_sram_io_desc, ARRAY_SIZE(omap_sram_io_desc)); - -	printk(KERN_INFO "SRAM: Mapped pa 0x%08lx to va 0x%08lx size: 0x%lx\n", -	__pfn_to_phys(omap_sram_io_desc[0].pfn), -	omap_sram_io_desc[0].virtual, -	       omap_sram_io_desc[0].length); - -	/* -	 * Normally devicemaps_init() would flush caches and tlb after -	 * mdesc->map_io(), but since we're called from map_io(), we -	 * must do it here. -	 */ -	local_flush_tlb_all(); -	flush_cache_all(); +	omap_sram_reset();  	/*  	 * Looks like we need to preserve some bootloader code at the  	 * beginning of SRAM for jumping to flash for reboot to work...  	 */ -	memset((void *)omap_sram_base + SRAM_BOOTLOADER_SZ, 0, -	       omap_sram_size - SRAM_BOOTLOADER_SZ); -} - -void * omap_sram_push(void * start, unsigned long size) -{ -	if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) { -		printk(KERN_ERR "Not enough space in SRAM\n"); -		return NULL; -	} - -	omap_sram_ceil -= size; -	omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); -	memcpy((void *)omap_sram_ceil, start, size); -	flush_icache_range((unsigned long)omap_sram_ceil, -		(unsigned long)(omap_sram_ceil + size)); - -	return (void *)omap_sram_ceil; -} - -#ifdef CONFIG_ARCH_OMAP1 - -static void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl); - -void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl) -{ -	BUG_ON(!_omap_sram_reprogram_clock); -	_omap_sram_reprogram_clock(dpllctl, ckctl); -} - -int __init omap1_sram_init(void) -{ -	_omap_sram_reprogram_clock = -			omap_sram_push(omap1_sram_reprogram_clock, -					omap1_sram_reprogram_clock_sz); - -	return 0; -} - -#else -#define omap1_sram_init()	do {} while (0) -#endif - -#if defined(CONFIG_ARCH_OMAP2) - -static void (*_omap2_sram_ddr_init)(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, -			      u32 base_cs, u32 force_unlock); - -void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl, -		   u32 base_cs, u32 force_unlock) -{ -	BUG_ON(!_omap2_sram_ddr_init); -	_omap2_sram_ddr_init(slow_dll_ctrl, fast_dll_ctrl, -			     base_cs, force_unlock); -} - -static void (*_omap2_sram_reprogram_sdrc)(u32 perf_level, u32 dll_val, -					  u32 mem_type); - -void omap2_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, u32 mem_type) -{ -	BUG_ON(!_omap2_sram_reprogram_sdrc); -	_omap2_sram_reprogram_sdrc(perf_level, dll_val, mem_type); -} - -static u32 (*_omap2_set_prcm)(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass); - -u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass) -{ -	BUG_ON(!_omap2_set_prcm); -	return _omap2_set_prcm(dpll_ctrl_val, sdrc_rfr_val, bypass); -} -#endif - -#ifdef CONFIG_ARCH_OMAP2420 -static int __init omap242x_sram_init(void) -{ -	_omap2_sram_ddr_init = omap_sram_push(omap242x_sram_ddr_init, -					omap242x_sram_ddr_init_sz); - -	_omap2_sram_reprogram_sdrc = omap_sram_push(omap242x_sram_reprogram_sdrc, -					    omap242x_sram_reprogram_sdrc_sz); - -	_omap2_set_prcm = omap_sram_push(omap242x_sram_set_prcm, -					 omap242x_sram_set_prcm_sz); - -	return 0; -} -#else -static inline int omap242x_sram_init(void) -{ -	return 0; -} -#endif - -#ifdef CONFIG_ARCH_OMAP2430 -static int __init omap243x_sram_init(void) -{ -	_omap2_sram_ddr_init = omap_sram_push(omap243x_sram_ddr_init, -					omap243x_sram_ddr_init_sz); - -	_omap2_sram_reprogram_sdrc = omap_sram_push(omap243x_sram_reprogram_sdrc, -					    omap243x_sram_reprogram_sdrc_sz); - -	_omap2_set_prcm = omap_sram_push(omap243x_sram_set_prcm, -					 omap243x_sram_set_prcm_sz); - -	return 0; -} -#else -static inline int omap243x_sram_init(void) -{ -	return 0; -} -#endif - -#ifdef CONFIG_ARCH_OMAP3 - -static u32 (*_omap3_sram_configure_core_dpll)( -			u32 m2, u32 unlock_dll, u32 f, u32 inc, -			u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, -			u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, -			u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, -			u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); - -u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc, -			u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, -			u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, -			u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, -			u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1) -{ -	BUG_ON(!_omap3_sram_configure_core_dpll); -	return _omap3_sram_configure_core_dpll( -			m2, unlock_dll, f, inc, -			sdrc_rfr_ctrl_0, sdrc_actim_ctrl_a_0, -			sdrc_actim_ctrl_b_0, sdrc_mr_0, -			sdrc_rfr_ctrl_1, sdrc_actim_ctrl_a_1, -			sdrc_actim_ctrl_b_1, sdrc_mr_1); -} - -#ifdef CONFIG_PM -void omap3_sram_restore_context(void) -{ -	omap_sram_ceil = omap_sram_base + omap_sram_size; - -	_omap3_sram_configure_core_dpll = -		omap_sram_push(omap3_sram_configure_core_dpll, -			       omap3_sram_configure_core_dpll_sz); -	omap_push_sram_idle(); -} -#endif /* CONFIG_PM */ - -static int __init omap34xx_sram_init(void) -{ -	_omap3_sram_configure_core_dpll = -		omap_sram_push(omap3_sram_configure_core_dpll, -			       omap3_sram_configure_core_dpll_sz); -	omap_push_sram_idle(); -	return 0; -} -#else -static inline int omap34xx_sram_init(void) -{ -	return 0; -} -#endif - -#ifdef CONFIG_ARCH_OMAP4 -static int __init omap44xx_sram_init(void) -{ -	printk(KERN_ERR "FIXME: %s not implemented\n", __func__); - -	return -ENODEV; -} -#else -static inline int omap44xx_sram_init(void) -{ -	return 0; -} -#endif - -int __init omap_sram_init(void) -{ -	omap_detect_sram(); -	omap_map_sram(); - -	if (!(cpu_class_is_omap2())) -		omap1_sram_init(); -	else if (cpu_is_omap242x()) -		omap242x_sram_init(); -	else if (cpu_is_omap2430()) -		omap243x_sram_init(); -	else if (cpu_is_omap34xx()) -		omap34xx_sram_init(); -	else if (cpu_is_omap44xx()) -		omap44xx_sram_init(); - -	return 0; +	memset_io(omap_sram_base + omap_sram_skip, 0, +		  omap_sram_size - omap_sram_skip);  } diff --git a/arch/arm/plat-omap/sram.h b/arch/arm/plat-omap/sram.h deleted file mode 100644 index 29b43ef97f2..00000000000 --- a/arch/arm/plat-omap/sram.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __PLAT_OMAP_SRAM_H__ -#define __PLAT_OMAP_SRAM_H__ - -extern int __init omap_sram_init(void); - -#endif /* __PLAT_OMAP_SRAM_H__ */ diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c deleted file mode 100644 index f3570884883..00000000000 --- a/arch/arm/plat-omap/usb.c +++ /dev/null @@ -1,143 +0,0 @@ - /* - * arch/arm/plat-omap/usb.c -- platform level USB initialization - * - * Copyright (C) 2004 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 - */ - -#undef	DEBUG - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/io.h> - -#include <plat/usb.h> -#include <plat/board.h> - -#ifdef	CONFIG_ARCH_OMAP_OTG - -void __init -omap_otg_init(struct omap_usb_config *config) -{ -	u32		syscon; -	int		status; -	int		alt_pingroup = 0; - -	/* NOTE:  no bus or clock setup (yet?) */ - -	syscon = omap_readl(OTG_SYSCON_1) & 0xffff; -	if (!(syscon & OTG_RESET_DONE)) -		pr_debug("USB resets not complete?\n"); - -	//omap_writew(0, OTG_IRQ_EN); - -	/* pin muxing and transceiver pinouts */ -	if (config->pins[0] > 2)	/* alt pingroup 2 */ -		alt_pingroup = 1; -	syscon |= config->usb0_init(config->pins[0], is_usb0_device(config)); -	syscon |= config->usb1_init(config->pins[1]); -	syscon |= config->usb2_init(config->pins[2], alt_pingroup); -	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); -	omap_writel(syscon, OTG_SYSCON_1); - -	syscon = config->hmc_mode; -	syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */; -#ifdef	CONFIG_USB_OTG -	if (config->otg) -		syscon |= OTG_EN; -#endif -	if (cpu_class_is_omap1()) -		pr_debug("USB_TRANSCEIVER_CTRL = %03x\n", -			 omap_readl(USB_TRANSCEIVER_CTRL)); -	pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2)); -	omap_writel(syscon, OTG_SYSCON_2); - -	printk("USB: hmc %d", config->hmc_mode); -	if (!alt_pingroup) -		printk(", usb2 alt %d wires", config->pins[2]); -	else if (config->pins[0]) -		printk(", usb0 %d wires%s", config->pins[0], -			is_usb0_device(config) ? " (dev)" : ""); -	if (config->pins[1]) -		printk(", usb1 %d wires", config->pins[1]); -	if (!alt_pingroup && config->pins[2]) -		printk(", usb2 %d wires", config->pins[2]); -	if (config->otg) -		printk(", Mini-AB on usb%d", config->otg - 1); -	printk("\n"); - -	if (cpu_class_is_omap1()) { -		u16 w; - -		/* leave USB clocks/controllers off until needed */ -		w = omap_readw(ULPD_SOFT_REQ); -		w &= ~SOFT_USB_CLK_REQ; -		omap_writew(w, ULPD_SOFT_REQ); - -		w = omap_readw(ULPD_CLOCK_CTRL); -		w &= ~USB_MCLK_EN; -		w |= DIS_USB_PVCI_CLK; -		omap_writew(w, ULPD_CLOCK_CTRL); -	} -	syscon = omap_readl(OTG_SYSCON_1); -	syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN; - -#ifdef	CONFIG_USB_GADGET_OMAP -	if (config->otg || config->register_dev) { -		struct platform_device *udc_device = config->udc_device; - -		syscon &= ~DEV_IDLE_EN; -		udc_device->dev.platform_data = config; -		status = platform_device_register(udc_device); -		if (status) -			pr_debug("can't register UDC device, %d\n", status); -	} -#endif - -#if	defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) -	if (config->otg || config->register_host) { -		struct platform_device *ohci_device = config->ohci_device; - -		syscon &= ~HST_IDLE_EN; -		ohci_device->dev.platform_data = config; -		status = platform_device_register(ohci_device); -		if (status) -			pr_debug("can't register OHCI device, %d\n", status); -	} -#endif - -#ifdef	CONFIG_USB_OTG -	if (config->otg) { -		struct platform_device *otg_device = config->otg_device; - -		syscon &= ~OTG_IDLE_EN; -		otg_device->dev.platform_data = config; -		status = platform_device_register(otg_device); -		if (status) -			pr_debug("can't register OTG device, %d\n", status); -	} -#endif -	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); -	omap_writel(syscon, OTG_SYSCON_1); - -	status = 0; -} - -#else -void omap_otg_init(struct omap_usb_config *config) {} -#endif  | 
