diff options
Diffstat (limited to 'arch/arm/mach-omap1')
62 files changed, 1763 insertions, 144 deletions
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index cd169c38616..f0e69cbc5ba 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile @@ -3,7 +3,8 @@  #  # Common support -obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o +obj-y := io.o id.o sram-init.o sram.o time.o irq.o mux.o flash.o \ +	 serial.o devices.o dma.o  obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o  ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index e255164ff08..a8fce3ccc70 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -625,7 +625,6 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")  	.atag_offset	= 0x100,  	.map_io		= ams_delta_map_io,  	.init_early	= omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= ams_delta_init,  	.init_late	= ams_delta_init_late, diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 4b6de70c47a..560a7dcf0a5 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c @@ -27,16 +27,16 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/mux.h>  #include <mach/flash.h> -#include <plat/fpga.h>  #include <linux/platform_data/keypad-omap.h>  #include <mach/hardware.h>  #include "iomap.h"  #include "common.h" +#include "fpga.h"  /* fsample is pretty close to p2-sample */ @@ -123,9 +123,9 @@ static struct resource smc91x_resources[] = {  static void __init fsample_init_smc91x(void)  { -	fpga_write(1, H2P2_DBG_FPGA_LAN_RESET); +	__raw_writeb(1, H2P2_DBG_FPGA_LAN_RESET);  	mdelay(50); -	fpga_write(fpga_read(H2P2_DBG_FPGA_LAN_RESET) & ~1, +	__raw_writeb(__raw_readb(H2P2_DBG_FPGA_LAN_RESET) & ~1,  		   H2P2_DBG_FPGA_LAN_RESET);  	mdelay(50);  } @@ -307,8 +307,7 @@ static void __init omap_fsample_init(void)  	fsample_init_smc91x(); -	if (gpio_request(FSAMPLE_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(FSAMPLE_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(FSAMPLE_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); @@ -362,7 +361,6 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")  	.atag_offset	= 0x100,  	.map_io		= omap_fsample_map_io,  	.init_early	= omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_fsample_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 4ec579fdd36..608e7d2a277 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c @@ -81,7 +81,6 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")  	.atag_offset	= 0x100,  	.map_io		= omap16xx_map_io,  	.init_early	= omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_generic_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c index e1362ce4849..7119ef28e0a 100644 --- a/arch/arm/mach-omap1/board-h2-mmc.c +++ b/arch/arm/mach-omap1/board-h2-mmc.c @@ -13,12 +13,11 @@   */  #include <linux/gpio.h>  #include <linux/platform_device.h> - +#include <linux/platform_data/gpio-omap.h>  #include <linux/i2c/tps65010.h> -#include <plat/mmc.h> -  #include "board-h2.h" +#include "mmc.h"  #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 376f7f29ef7..2274bd677ef 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -39,8 +39,8 @@  #include <asm/mach/map.h>  #include <mach/mux.h> -#include <plat/dma.h> -#include <plat/tc.h> +#include <linux/omap-dma.h> +#include <mach/tc.h>  #include <mach/irda.h>  #include <linux/platform_data/keypad-omap.h>  #include <mach/flash.h> @@ -50,6 +50,7 @@  #include "common.h"  #include "board-h2.h" +#include "dma.h"  /* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */  #define OMAP1610_ETHR_START		0x04000300 @@ -411,8 +412,7 @@ static void __init h2_init(void)  	h2_nand_resource.end = h2_nand_resource.start = OMAP_CS2B_PHYS;  	h2_nand_resource.end += SZ_4K - 1; -	if (gpio_request(H2_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(H2_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(H2_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); @@ -458,7 +458,6 @@ MACHINE_START(OMAP_H2, "TI-H2")  	.atag_offset	= 0x100,  	.map_io		= omap16xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= h2_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-h3-mmc.c b/arch/arm/mach-omap1/board-h3-mmc.c index c74daace8cd..17d77914d76 100644 --- a/arch/arm/mach-omap1/board-h3-mmc.c +++ b/arch/arm/mach-omap1/board-h3-mmc.c @@ -16,9 +16,8 @@  #include <linux/i2c/tps65010.h> -#include <plat/mmc.h> -  #include "board-h3.h" +#include "mmc.h"  #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index ededdb7ef28..1051935f0aa 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -41,9 +41,9 @@  #include <asm/mach/map.h>  #include <mach/mux.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <linux/platform_data/keypad-omap.h> -#include <plat/dma.h> +#include <linux/omap-dma.h>  #include <mach/flash.h>  #include <mach/hardware.h> @@ -406,8 +406,7 @@ static void __init h3_init(void)  	nand_resource.end = nand_resource.start = OMAP_CS2B_PHYS;  	nand_resource.end += SZ_4K - 1; -	if (gpio_request(H3_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(H3_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(H3_NAND_RB_GPIO_PIN);  	/* GPIO10 Func_MUX_CTRL reg bit 29:27, Configure V2 to mode1 as GPIO */ @@ -452,7 +451,6 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")  	.atag_offset	= 0x100,  	.map_io		= omap16xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= h3_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 87ab2086ef9..356f816c84a 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c @@ -43,7 +43,7 @@  #include <asm/mach/arch.h>  #include <mach/omap7xx.h> -#include <plat/mmc.h> +#include "mmc.h"  #include <mach/irqs.h>  #include <mach/usb.h> @@ -600,7 +600,6 @@ MACHINE_START(HERALD, "HTC Herald")  	.atag_offset    = 0x100,  	.map_io         = htcherald_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq       = omap1_init_irq,  	.init_machine   = htcherald_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index db5f7d2976e..f8033fab0f8 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -33,16 +33,15 @@  #include <mach/mux.h>  #include <mach/flash.h> -#include <plat/fpga.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <linux/platform_data/keypad-omap.h> -#include <plat/mmc.h>  #include <mach/hardware.h>  #include <mach/usb.h>  #include "iomap.h"  #include "common.h" +#include "mmc.h"  /* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */  #define INNOVATOR1610_ETHR_START	0x04000300 @@ -215,7 +214,7 @@ static struct platform_device *innovator1510_devices[] __initdata = {  static int innovator_get_pendown_state(void)  { -	return !(fpga_read(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5)); +	return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));  }  static const struct ads7846_platform_data innovator1510_ts_info = { @@ -279,7 +278,7 @@ static struct platform_device *innovator1610_devices[] __initdata = {  static void __init innovator_init_smc91x(void)  {  	if (cpu_is_omap1510()) { -		fpga_write(fpga_read(OMAP1510_FPGA_RST) & ~1, +		__raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1,  			   OMAP1510_FPGA_RST);  		udelay(750);  	} else { @@ -335,10 +334,10 @@ static int mmc_set_power(struct device *dev, int slot, int power_on,  				int vdd)  {  	if (power_on) -		fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3), +		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) | (1 << 3),  				OMAP1510_FPGA_POWER);  	else -		fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3), +		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) & ~(1 << 3),  				OMAP1510_FPGA_POWER);  	return 0; @@ -390,14 +389,14 @@ static void __init innovator_init(void)  		omap_cfg_reg(UART3_TX);  		omap_cfg_reg(UART3_RX); -		reg = fpga_read(OMAP1510_FPGA_POWER); +		reg = __raw_readb(OMAP1510_FPGA_POWER);  		reg |= OMAP1510_FPGA_PCR_COM1_EN; -		fpga_write(reg, OMAP1510_FPGA_POWER); +		__raw_writeb(reg, OMAP1510_FPGA_POWER);  		udelay(10); -		reg = fpga_read(OMAP1510_FPGA_POWER); +		reg = __raw_readb(OMAP1510_FPGA_POWER);  		reg |= OMAP1510_FPGA_PCR_COM2_EN; -		fpga_write(reg, OMAP1510_FPGA_POWER); +		__raw_writeb(reg, OMAP1510_FPGA_POWER);  		udelay(10);  		platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices)); @@ -437,6 +436,7 @@ static void __init innovator_init(void)   */  static void __init innovator_map_io(void)  { +#ifdef CONFIG_ARCH_OMAP15XX  	omap15xx_map_io();  	iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc)); @@ -444,9 +444,10 @@ static void __init innovator_map_io(void)  	/* Dump the Innovator FPGA rev early - useful info for support. */  	pr_debug("Innovator FPGA Rev %d.%d Board Rev %d\n", -			fpga_read(OMAP1510_FPGA_REV_HIGH), -			fpga_read(OMAP1510_FPGA_REV_LOW), -			fpga_read(OMAP1510_FPGA_BOARD_REV)); +			__raw_readb(OMAP1510_FPGA_REV_HIGH), +			__raw_readb(OMAP1510_FPGA_REV_LOW), +			__raw_readb(OMAP1510_FPGA_BOARD_REV)); +#endif  }  MACHINE_START(OMAP_INNOVATOR, "TI-Innovator") @@ -454,7 +455,6 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")  	.atag_offset	= 0x100,  	.map_io		= innovator_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= innovator_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 7d5c06d6a52..3e8ead67e45 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -29,13 +29,13 @@  #include <asm/mach/map.h>  #include <mach/mux.h> -#include <plat/mmc.h> -#include <plat/clock.h>  #include <mach/hardware.h>  #include <mach/usb.h>  #include "common.h" +#include "clock.h" +#include "mmc.h"  #define ADS7846_PENDOWN_GPIO	15 @@ -251,7 +251,6 @@ MACHINE_START(NOKIA770, "Nokia 770")  	.atag_offset	= 0x100,  	.map_io		= omap16xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_nokia770_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 5973945a874..872ea47cd28 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -48,7 +48,7 @@  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/hardware.h>  #include <mach/usb.h> @@ -606,7 +606,6 @@ MACHINE_START(OMAP_OSK, "TI-OSK")  	.atag_offset	= 0x100,  	.map_io		= omap16xx_map_io,  	.init_early	= omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= osk_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 1c578d58923..c33dceb4660 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -36,8 +36,8 @@  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/tc.h> -#include <plat/dma.h> +#include <mach/tc.h> +#include <linux/omap-dma.h>  #include <mach/irda.h>  #include <linux/platform_data/keypad-omap.h> @@ -45,6 +45,7 @@  #include <mach/usb.h>  #include "common.h" +#include "dma.h"  #define PALMTE_USBDETECT_GPIO	0  #define PALMTE_USB_OR_DC_GPIO	1 @@ -264,7 +265,6 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")  	.atag_offset	= 0x100,  	.map_io		= omap15xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmte_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 97158095083..2948b0ee4be 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c @@ -28,16 +28,16 @@  #include <linux/spi/spi.h>  #include <linux/spi/ads7846.h>  #include <linux/platform_data/omap1_bl.h> +#include <linux/platform_data/leds-omap.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <plat/led.h>  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/dma.h> -#include <plat/tc.h> +#include <linux/omap-dma.h> +#include <mach/tc.h>  #include <mach/irda.h>  #include <linux/platform_data/keypad-omap.h> @@ -45,6 +45,7 @@  #include <mach/usb.h>  #include "common.h" +#include "dma.h"  #define PALMTT_USBDETECT_GPIO	0  #define PALMTT_CABLE_GPIO	1 @@ -310,7 +311,6 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T")  	.atag_offset	= 0x100,  	.map_io		= omap15xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmtt_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index e311032e7ee..7a05895c0be 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c @@ -38,8 +38,8 @@  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/dma.h> -#include <plat/tc.h> +#include <linux/omap-dma.h> +#include <mach/tc.h>  #include <mach/irda.h>  #include <linux/platform_data/keypad-omap.h> @@ -47,6 +47,7 @@  #include <mach/usb.h>  #include "common.h" +#include "dma.h"  #define PALMZ71_USBDETECT_GPIO	0  #define PALMZ71_PENIRQ_GPIO	6 @@ -326,7 +327,6 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71")  	.atag_offset	= 0x100,  	.map_io		= omap15xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_palmz71_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 198b05417bf..27f8d12ec22 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c @@ -28,15 +28,15 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/mux.h> -#include <plat/fpga.h>  #include <mach/flash.h>  #include <mach/hardware.h>  #include "iomap.h"  #include "common.h" +#include "fpga.h"  static const unsigned int p2_keymap[] = {  	KEY(0, 0, KEY_UP), @@ -231,9 +231,9 @@ static struct omap_lcd_config perseus2_lcd_config __initdata = {  static void __init perseus2_init_smc91x(void)  { -	fpga_write(1, H2P2_DBG_FPGA_LAN_RESET); +	__raw_writeb(1, H2P2_DBG_FPGA_LAN_RESET);  	mdelay(50); -	fpga_write(fpga_read(H2P2_DBG_FPGA_LAN_RESET) & ~1, +	__raw_writeb(__raw_readb(H2P2_DBG_FPGA_LAN_RESET) & ~1,  		   H2P2_DBG_FPGA_LAN_RESET);  	mdelay(50);  } @@ -275,8 +275,7 @@ static void __init omap_perseus2_init(void)  	perseus2_init_smc91x(); -	if (gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0) -		BUG(); +	BUG_ON(gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0);  	gpio_direction_input(P2_NAND_RB_GPIO_PIN);  	omap_cfg_reg(L3_1610_FLASH_CS2B_OE); @@ -324,7 +323,6 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")  	.atag_offset	= 0x100,  	.map_io		= omap_perseus2_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_perseus2_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-sx1-mmc.c b/arch/arm/mach-omap1/board-sx1-mmc.c index 5932d56e17b..4fcf19c78a0 100644 --- a/arch/arm/mach-omap1/board-sx1-mmc.c +++ b/arch/arm/mach-omap1/board-sx1-mmc.c @@ -16,9 +16,10 @@  #include <linux/platform_device.h>  #include <mach/hardware.h> -#include <plat/mmc.h>  #include <mach/board-sx1.h> +#include "mmc.h" +  #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)  static int mmc_set_power(struct device *dev, int slot, int power_on, diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 13bf2cc5681..20ed52ae171 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c @@ -36,15 +36,16 @@  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/dma.h> +#include <linux/omap-dma.h>  #include <mach/irda.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/board-sx1.h>  #include <mach/hardware.h>  #include <mach/usb.h>  #include "common.h" +#include "dma.h"  /* Write to I2C device */  int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value) @@ -403,7 +404,6 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1")  	.atag_offset	= 0x100,  	.map_io		= omap15xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= omap_sx1_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index ad75e3411d4..abf705f49b1 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -34,7 +34,7 @@  #include <mach/board-voiceblue.h>  #include <mach/flash.h>  #include <mach/mux.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/hardware.h>  #include <mach/usb.h> @@ -286,7 +286,6 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")  	.atag_offset	= 0x100,  	.map_io		= omap15xx_map_io,  	.init_early     = omap1_init_early, -	.reserve	= omap_reserve,  	.init_irq	= omap1_init_irq,  	.init_machine	= voiceblue_init,  	.init_late	= omap1_init_late, diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index 638f4070fc7..4f5fd4a084c 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c @@ -12,6 +12,7 @@   * published by the Free Software Foundation.   */  #include <linux/kernel.h> +#include <linux/export.h>  #include <linux/list.h>  #include <linux/errno.h>  #include <linux/err.h> @@ -21,21 +22,21 @@  #include <asm/mach-types.h> -#include <plat/cpu.h> -#include <plat/usb.h> -#include <plat/clock.h> -#include <plat/sram.h> -#include <plat/clkdev_omap.h> -  #include <mach/hardware.h> +#include "soc.h"  #include "iomap.h"  #include "clock.h"  #include "opp.h" +#include "sram.h"  __u32 arm_idlect1_mask;  struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p; +static LIST_HEAD(clocks); +static DEFINE_MUTEX(clocks_mutex); +static DEFINE_SPINLOCK(clockfw_lock); +  /*   * Omap1 specific clock functions   */ @@ -607,3 +608,497 @@ void omap1_clk_disable_unused(struct clk *clk)  }  #endif + + +int clk_enable(struct clk *clk) +{ +	unsigned long flags; +	int ret; + +	if (clk == NULL || IS_ERR(clk)) +		return -EINVAL; + +	spin_lock_irqsave(&clockfw_lock, flags); +	ret = omap1_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; +	} + +	omap1_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; + +	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; + +	if (clk == NULL || IS_ERR(clk)) +		return 0; + +	spin_lock_irqsave(&clockfw_lock, flags); +	ret = omap1_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); +	ret = omap1_clk_set_rate(clk, rate); +	if (ret == 0) +		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) +{ +	WARN_ONCE(1, "clk_set_parent() not implemented for OMAP1\n"); + +	return -EINVAL; +} +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; +} + +int omap_clk_enable_autoidle_all(void) +{ +	struct clk *c; +	unsigned long flags; + +	spin_lock_irqsave(&clockfw_lock, flags); + +	list_for_each_entry(c, &clocks, node) +		if (c->ops->allow_idle) +			c->ops->allow_idle(c); + +	spin_unlock_irqrestore(&clockfw_lock, flags); + +	return 0; +} + +int omap_clk_disable_autoidle_all(void) +{ +	struct clk *c; +	unsigned long flags; + +	spin_lock_irqsave(&clockfw_lock, flags); + +	list_for_each_entry(c, &clocks, node) +		if (c->ops->deny_idle) +			c->ops->deny_idle(c); + +	spin_unlock_irqrestore(&clockfw_lock, flags); + +	return 0; +} + +/* + * 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_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"); + +	spin_lock_irqsave(&clockfw_lock, flags); +	list_for_each_entry(ck, &clocks, node) { +		if (ck->ops == &clkops_null) +			continue; + +		if (ck->usecount > 0 || !ck->enable_reg) +			continue; + +		omap1_clk_disable_unused(ck); +	} +	spin_unlock_irqrestore(&clockfw_lock, flags); + +	return 0; +} +late_initcall(clk_disable_unused); +late_initcall(omap_clk_enable_autoidle_all); +#endif + +#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) +/* + *	debugfs support to trace clock tree hierarchy and attributes + */ + +#include <linux/debugfs.h> +#include <linux/seq_file.h> + +static struct dentry *clk_debugfs_root; + +static int clk_dbg_show_summary(struct seq_file *s, void *unused) +{ +	struct clk *c; +	struct clk *pa; + +	mutex_lock(&clocks_mutex); +	seq_printf(s, "%-30s %-30s %-10s %s\n", +		   "clock-name", "parent-name", "rate", "use-count"); + +	list_for_each_entry(c, &clocks, node) { +		pa = c->parent; +		seq_printf(s, "%-30s %-30s %-10lu %d\n", +			   c->name, pa ? pa->name : "none", c->rate, +			   c->usecount); +	} +	mutex_unlock(&clocks_mutex); + +	return 0; +} + +static int clk_dbg_open(struct inode *inode, struct file *file) +{ +	return single_open(file, clk_dbg_show_summary, inode->i_private); +} + +static const struct file_operations debug_clock_fops = { +	.open           = clk_dbg_open, +	.read           = seq_read, +	.llseek         = seq_lseek, +	.release        = single_release, +}; + +static int clk_debugfs_register_one(struct clk *c) +{ +	int err; +	struct dentry *d; +	struct clk *pa = c->parent; + +	d = debugfs_create_dir(c->name, 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: +	debugfs_remove_recursive(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; +	} + +	d = debugfs_create_file("summary", S_IRUGO, +		d, NULL, &debug_clock_fops); +	if (!d) +		return -ENOMEM; + +	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/mach-omap1/clock.h b/arch/arm/mach-omap1/clock.h index 3d04f4f6767..1e4918a3a5e 100644 --- a/arch/arm/mach-omap1/clock.h +++ b/arch/arm/mach-omap1/clock.h @@ -14,8 +14,184 @@  #define __ARCH_ARM_MACH_OMAP1_CLOCK_H  #include <linux/clk.h> +#include <linux/list.h> -#include <plat/clock.h> +#include <linux/clkdev.h> + +struct module; +struct clk; + +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_1710		(1 << 4)	/* 1710 extra for rate selection */ + + +/* Temporary, needed during the common clock framework conversion */ +#define __clk_get_name(clk)	(clk->name) +#define __clk_get_parent(clk)	(clk->parent) +#define __clk_get_rate(clk)	(clk->rate) + +/** + * 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 + * @allow_idle: fn ptr that enables autoidle for the current clock in hardware + * @deny_idle: fn ptr that disables autoidle for the current clock in hardware + * + * 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 *); +	void			(*allow_idle)(struct clk *); +	void			(*deny_idle)(struct clk *); +}; + +/* + * struct clk.flags possibilities + * + * XXX document the rest of the clock flags here + * + * CLOCK_CLKOUTX2: (OMAP4 only) DPLL CLKOUT and CLKOUTX2 GATE_CTRL + *     bits share the same register.  This flag allows the + *     omap4_dpllmx*() code to determine which GATE_CTRL bit field + *     should be used.  This is a temporary solution - a better approach + *     would be to associate clock type-specific data with the clock, + *     similar to the struct dpll_data approach. + */ +#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 */ +#define CLOCK_CLKOUTX2		(1 << 5) + +/** + * 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 + * @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; +	u8			rate_offset; +	u8			src_offset; +#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) +	struct dentry		*dent;	/* For visible tree hierarchy */ +#endif +}; + +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); +}; + +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); +extern struct clk *omap_clk_get_by_name(const char *name); +extern int omap_clk_enable_autoidle_all(void); +extern int omap_clk_disable_autoidle_all(void); + +extern const struct clkops clkops_null; + +extern struct clk dummy_ck;  int omap1_clk_init(void);  void omap1_clk_late_init(void); diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index 9b45f4b0ee2..cb7c6ae2e3f 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c @@ -22,16 +22,14 @@  #include <asm/mach-types.h>  /* for machine_is_* */ -#include <plat/clock.h> -#include <plat/cpu.h> -#include <plat/clkdev_omap.h> -#include <plat/sram.h>	/* for omap_sram_reprogram_clock() */ +#include "soc.h"  #include <mach/hardware.h>  #include <mach/usb.h>   /* for OTG_BASE */  #include "iomap.h"  #include "clock.h" +#include "sram.h"  /* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */  #define IDL_CLKOUT_ARM_SHIFT			12 @@ -765,14 +763,6 @@ static struct omap_clk omap_clks[] = {   * init   */ -static struct clk_functions omap1_clk_functions = { -	.clk_enable		= omap1_clk_enable, -	.clk_disable		= omap1_clk_disable, -	.clk_round_rate		= omap1_clk_round_rate, -	.clk_set_rate		= omap1_clk_set_rate, -	.clk_disable_unused	= omap1_clk_disable_unused, -}; -  static void __init omap1_show_rates(void)  {  	pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n", @@ -803,8 +793,6 @@ int __init omap1_clk_init(void)  	if (!cpu_is_omap15xx())  		omap_writew(0, SOFT_REQ_REG2); -	clk_init(&omap1_clk_functions); -  	/* By default all idlect1 clocks are allowed to idle */  	arm_idlect1_mask = ~0; diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index c2552b24f9f..b53e0854422 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h @@ -26,8 +26,10 @@  #ifndef __ARCH_ARM_MACH_OMAP1_COMMON_H  #define __ARCH_ARM_MACH_OMAP1_COMMON_H -#include <plat/common.h>  #include <linux/mtd/mtd.h> +#include <linux/i2c-omap.h> + +#include <plat/i2c.h>  #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)  void omap7xx_map_io(void); @@ -38,6 +40,7 @@ static inline void omap7xx_map_io(void)  #endif  #ifdef CONFIG_ARCH_OMAP15XX +void omap1510_fpga_init_irq(void);  void omap15xx_map_io(void);  #else  static inline void omap15xx_map_io(void) @@ -90,4 +93,6 @@ extern int ocpi_enable(void);  static inline int ocpi_enable(void) { return 0; }  #endif +extern u32 omap1_get_reset_sources(void); +  #endif /* __ARCH_ARM_MACH_OMAP1_COMMON_H */ diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index d3fec92c54c..0af635205e8 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -17,12 +17,12 @@  #include <linux/platform_device.h>  #include <linux/spi/spi.h> +#include <linux/platform_data/omap-wd-timer.h> +  #include <asm/mach/map.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/mux.h> -#include <plat/dma.h> -#include <plat/mmc.h>  #include <mach/omap7xx.h>  #include <mach/camera.h> @@ -30,6 +30,9 @@  #include "common.h"  #include "clock.h" +#include "dma.h" +#include "mmc.h" +#include "sram.h"  #if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE) @@ -175,6 +178,13 @@ static int __init omap_mmc_add(const char *name, int id, unsigned long base,  	res[3].name = "tx";  	res[3].flags = IORESOURCE_DMA; +	if (cpu_is_omap7xx()) +		data->slots[0].features = MMC_OMAP7XX; +	if (cpu_is_omap15xx()) +		data->slots[0].features = MMC_OMAP15XX; +	if (cpu_is_omap16xx()) +		data->slots[0].features = MMC_OMAP16XX; +  	ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));  	if (ret == 0)  		ret = platform_device_add_data(pdev, data, sizeof(*data)); @@ -439,18 +449,31 @@ static struct resource wdt_resources[] = {  };  static struct platform_device omap_wdt_device = { -	.name	   = "omap_wdt", -	.id	     = -1, +	.name		= "omap_wdt", +	.id		= -1,  	.num_resources	= ARRAY_SIZE(wdt_resources),  	.resource	= wdt_resources,  };  static int __init omap_init_wdt(void)  { +	struct omap_wd_timer_platform_data pdata; +	int ret; +  	if (!cpu_is_omap16xx())  		return -ENODEV; -	return platform_device_register(&omap_wdt_device); +	pdata.read_reset_sources = omap1_get_reset_sources; + +	ret = platform_device_register(&omap_wdt_device); +	if (!ret) { +		ret = platform_device_add_data(&omap_wdt_device, &pdata, +					       sizeof(pdata)); +		if (ret) +			platform_device_del(&omap_wdt_device); +	} + +	return ret;  }  subsys_initcall(omap_init_wdt);  #endif diff --git a/arch/arm/mach-omap1/dma.c b/arch/arm/mach-omap1/dma.c index 29007fef84c..e190611e4b4 100644 --- a/arch/arm/mach-omap1/dma.c +++ b/arch/arm/mach-omap1/dma.c @@ -25,11 +25,13 @@  #include <linux/device.h>  #include <linux/io.h> -#include <plat/dma.h> -#include <plat/tc.h> +#include <linux/omap-dma.h> +#include <mach/tc.h>  #include <mach/irqs.h> +#include "dma.h" +  #define OMAP1_DMA_BASE			(0xfffed800)  #define OMAP1_LOGICAL_DMA_CH_COUNT	17  #define OMAP1_DMA_STRIDE		0x40 @@ -319,6 +321,9 @@ static int __init omap1_system_dma_init(void)  		d->dev_caps = ENABLE_1510_MODE;  	enable_1510_mode = d->dev_caps & ENABLE_1510_MODE; +	if (cpu_is_omap16xx()) +		d->dev_caps = ENABLE_16XX_MODE; +  	d->dev_caps		|= SRC_PORT;  	d->dev_caps		|= DST_PORT;  	d->dev_caps		|= SRC_INDEX; diff --git a/arch/arm/mach-omap1/dma.h b/arch/arm/mach-omap1/dma.h new file mode 100644 index 00000000000..da6345dab03 --- /dev/null +++ b/arch/arm/mach-omap1/dma.h @@ -0,0 +1,83 @@ +/* + *  OMAP1 DMA channel definitions + * + * 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 __OMAP1_DMA_CHANNEL_H +#define __OMAP1_DMA_CHANNEL_H + +/* 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 + +#endif /* __OMAP1_DMA_CHANNEL_H */ diff --git a/arch/arm/mach-omap1/flash.c b/arch/arm/mach-omap1/flash.c index 73ae6169aa4..b3fb531af94 100644 --- a/arch/arm/mach-omap1/flash.c +++ b/arch/arm/mach-omap1/flash.c @@ -10,7 +10,7 @@  #include <linux/mtd/mtd.h>  #include <linux/mtd/map.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/flash.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index 29ec50fc688..8bd71b2d096 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c @@ -27,11 +27,11 @@  #include <asm/irq.h>  #include <asm/mach/irq.h> -#include <plat/fpga.h> -  #include <mach/hardware.h>  #include "iomap.h" +#include "common.h" +#include "fpga.h"  static void fpga_mask_irq(struct irq_data *d)  { diff --git a/arch/arm/mach-omap1/fpga.h b/arch/arm/mach-omap1/fpga.h new file mode 100644 index 00000000000..4b4307a80e4 --- /dev/null +++ b/arch/arm/mach-omap1/fpga.h @@ -0,0 +1,52 @@ +/* + * 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 + +/* + * --------------------------------------------------------------------------- + *  H2/P2 Debug board FPGA + * --------------------------------------------------------------------------- + */ +/* maps in the FPGA registers and the ETHR registers */ +#define H2P2_DBG_FPGA_BASE		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		IOMEM(H2P2_DBG_FPGA_BASE + 0x10)	/* FPGA Revision */ +#define H2P2_DBG_FPGA_BOARD_REV		IOMEM(H2P2_DBG_FPGA_BASE + 0x12)	/* Board Revision */ +#define H2P2_DBG_FPGA_GPIO		IOMEM(H2P2_DBG_FPGA_BASE + 0x14)	/* GPIO outputs */ +#define H2P2_DBG_FPGA_LEDS		IOMEM(H2P2_DBG_FPGA_BASE + 0x16)	/* LEDs outputs */ +#define H2P2_DBG_FPGA_MISC_INPUTS	IOMEM(H2P2_DBG_FPGA_BASE + 0x18)	/* Misc inputs */ +#define H2P2_DBG_FPGA_LAN_STATUS	IOMEM(H2P2_DBG_FPGA_BASE + 0x1A)	/* LAN Status line */ +#define H2P2_DBG_FPGA_LAN_RESET		IOMEM(H2P2_DBG_FPGA_BASE + 0x1C)	/* LAN Reset line */ + +/* 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) + +#endif diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c index 98e6f39224a..02b3eb2e201 100644 --- a/arch/arm/mach-omap1/gpio15xx.c +++ b/arch/arm/mach-omap1/gpio15xx.c @@ -19,6 +19,8 @@  #include <linux/gpio.h>  #include <linux/platform_data/gpio-omap.h> +#include <mach/irqs.h> +  #define OMAP1_MPUIO_VBASE		OMAP1_MPUIO_BASE  #define OMAP1510_GPIO_BASE		0xFFFCE000 diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c index 33f419236b1..b9952a258d8 100644 --- a/arch/arm/mach-omap1/gpio16xx.c +++ b/arch/arm/mach-omap1/gpio16xx.c @@ -19,6 +19,8 @@  #include <linux/gpio.h>  #include <linux/platform_data/gpio-omap.h> +#include <mach/irqs.h> +  #define OMAP1610_GPIO1_BASE		0xfffbe400  #define OMAP1610_GPIO2_BASE		0xfffbec00  #define OMAP1610_GPIO3_BASE		0xfffbb400 diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c index 958ce9acee9..f5819b2b7cb 100644 --- a/arch/arm/mach-omap1/gpio7xx.c +++ b/arch/arm/mach-omap1/gpio7xx.c @@ -19,6 +19,8 @@  #include <linux/gpio.h>  #include <linux/platform_data/gpio-omap.h> +#include <mach/irqs.h> +  #define OMAP7XX_GPIO1_BASE		0xfffbc000  #define OMAP7XX_GPIO2_BASE		0xfffbc800  #define OMAP7XX_GPIO3_BASE		0xfffbd000 diff --git a/arch/arm/mach-omap1/i2c.c b/arch/arm/mach-omap1/i2c.c index a0551a6d745..faca808cb3d 100644 --- a/arch/arm/mach-omap1/i2c.c +++ b/arch/arm/mach-omap1/i2c.c @@ -19,11 +19,25 @@   *   */ -#include <plat/i2c.h> +#include <linux/i2c-omap.h>  #include <mach/mux.h> -#include <plat/cpu.h> +#include "soc.h" + +#include <plat/i2c.h> + +#define OMAP_I2C_SIZE		0x3f +#define OMAP1_I2C_BASE		0xfffb3800 +#define OMAP1_INT_I2C		(32 + 4) + +static const char name[] = "omap_i2c"; -void __init omap1_i2c_mux_pins(int bus_id) +static struct resource i2c_resources[2] = { +}; + +static struct platform_device omap_i2c_devices[1] = { +}; + +static void __init omap1_i2c_mux_pins(int bus_id)  {  	if (cpu_is_omap7xx()) {  		omap_cfg_reg(I2C_7XX_SDA); @@ -33,3 +47,47 @@ void __init omap1_i2c_mux_pins(int bus_id)  		omap_cfg_reg(I2C_SCL);  	}  } + +int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *pdata, +				int bus_id) +{ +	struct platform_device *pdev; +	struct resource *res; + +	if (bus_id > 1) +		return -EINVAL; + +	omap1_i2c_mux_pins(bus_id); + +	pdev = &omap_i2c_devices[bus_id - 1]; +	pdev->id = bus_id; +	pdev->name = name; +	pdev->num_resources = ARRAY_SIZE(i2c_resources); +	res = i2c_resources; +	res[0].start = OMAP1_I2C_BASE; +	res[0].end = res[0].start + OMAP_I2C_SIZE; +	res[0].flags = IORESOURCE_MEM; +	res[1].start = OMAP1_INT_I2C; +	res[1].flags = IORESOURCE_IRQ; +	pdev->resource = res; + +	/* all OMAP1 have IP version 1 register set */ +	pdata->rev = OMAP_I2C_IP_VERSION_1; + +	/* all OMAP1 I2C are implemented like this */ +	pdata->flags = OMAP_I2C_FLAG_NO_FIFO | +		       OMAP_I2C_FLAG_SIMPLE_CLOCK | +		       OMAP_I2C_FLAG_16BIT_DATA_REG | +		       OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK; + +	/* how the cpu bus is wired up differs for 7xx only */ + +	if (cpu_is_omap7xx()) +		pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_1; +	else +		pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_2; + +	pdev->dev.platform_data = pdata; + +	return platform_device_register(pdev); +} diff --git a/arch/arm/mach-omap1/id.c b/arch/arm/mach-omap1/id.c index a1b846aacda..52de382fc80 100644 --- a/arch/arm/mach-omap1/id.c +++ b/arch/arm/mach-omap1/id.c @@ -17,7 +17,7 @@  #include <linux/io.h>  #include <asm/system_info.h> -#include <plat/cpu.h> +#include "soc.h"  #include <mach/hardware.h> diff --git a/arch/arm/mach-omap1/include/mach/debug-macro.S b/arch/arm/mach-omap1/include/mach/debug-macro.S index 2b36a281dc8..5c1a26c9f49 100644 --- a/arch/arm/mach-omap1/include/mach/debug-macro.S +++ b/arch/arm/mach-omap1/include/mach/debug-macro.S @@ -13,7 +13,7 @@  #include <linux/serial_reg.h> -#include <plat/serial.h> +#include "serial.h"  		.pushsection .data  omap_uart_phys:	.word	0x0 diff --git a/arch/arm/mach-omap1/include/mach/entry-macro.S b/arch/arm/mach-omap1/include/mach/entry-macro.S index 88f08cab171..78a8c6c2476 100644 --- a/arch/arm/mach-omap1/include/mach/entry-macro.S +++ b/arch/arm/mach-omap1/include/mach/entry-macro.S @@ -13,8 +13,6 @@  #include <mach/hardware.h>  #include <mach/irqs.h> -#include "../../iomap.h" -  		.macro  get_irqnr_preamble, base, tmp  		.endm diff --git a/arch/arm/mach-omap1/include/mach/gpio.h b/arch/arm/mach-omap1/include/mach/gpio.h deleted file mode 100644 index ebf86c0f4f4..00000000000 --- a/arch/arm/mach-omap1/include/mach/gpio.h +++ /dev/null @@ -1,3 +0,0 @@ -/* - * arch/arm/mach-omap1/include/mach/gpio.h - */ diff --git a/arch/arm/mach-omap1/include/mach/hardware.h b/arch/arm/mach-omap1/include/mach/hardware.h index 84248d250ad..5875a5098d3 100644 --- a/arch/arm/mach-omap1/include/mach/hardware.h +++ b/arch/arm/mach-omap1/include/mach/hardware.h @@ -39,7 +39,7 @@  #include <asm/sizes.h>  #ifndef __ASSEMBLER__  #include <asm/types.h> -#include <plat/cpu.h> +#include <mach/soc.h>  /*   * NOTE: Please use ioremap + __raw_read/write where possible instead of these @@ -51,7 +51,7 @@ extern void omap_writeb(u8 v, u32 pa);  extern void omap_writew(u16 v, u32 pa);  extern void omap_writel(u32 v, u32 pa); -#include <plat/tc.h> +#include <mach/tc.h>  /* Almost all documentation for chip and board memory maps assumes   * BM is clear.  Most devel boards have a switch to control booting @@ -72,7 +72,10 @@ static inline u32 omap_cs3_phys(void)  #endif	/* ifndef __ASSEMBLER__ */ -#include <plat/serial.h> +#define OMAP1_IO_OFFSET		0x01000000	/* Virtual IO = 0xfefb0000 */ +#define OMAP1_IO_ADDRESS(pa)	IOMEM((pa) - OMAP1_IO_OFFSET) + +#include <mach/serial.h>  /*   * --------------------------------------------------------------------------- diff --git a/arch/arm/mach-omap1/include/mach/memory.h b/arch/arm/mach-omap1/include/mach/memory.h index 901082def9b..3c253052311 100644 --- a/arch/arm/mach-omap1/include/mach/memory.h +++ b/arch/arm/mach-omap1/include/mach/memory.h @@ -19,7 +19,7 @@   * because of the strncmp().   */  #if defined(CONFIG_ARCH_OMAP15XX) && !defined(__ASSEMBLER__) -#include <plat/cpu.h> +#include <mach/soc.h>  /*   * OMAP-1510 Local Bus address offset diff --git a/arch/arm/mach-omap1/include/mach/omap1510.h b/arch/arm/mach-omap1/include/mach/omap1510.h index 8fe05d6137c..3d235244bf5 100644 --- a/arch/arm/mach-omap1/include/mach/omap1510.h +++ b/arch/arm/mach-omap1/include/mach/omap1510.h @@ -45,5 +45,118 @@  #define OMAP1510_DSP_MMU_BASE	(0xfffed200) +/* + * --------------------------------------------------------------------------- + *  OMAP-1510 FPGA + * --------------------------------------------------------------------------- + */ +#define OMAP1510_FPGA_BASE		0xE8000000		/* VA */ +#define OMAP1510_FPGA_SIZE		SZ_4K +#define OMAP1510_FPGA_START		0x08000000		/* PA */ + +/* Revision */ +#define OMAP1510_FPGA_REV_LOW			IOMEM(OMAP1510_FPGA_BASE + 0x0) +#define OMAP1510_FPGA_REV_HIGH			IOMEM(OMAP1510_FPGA_BASE + 0x1) +#define OMAP1510_FPGA_LCD_PANEL_CONTROL		IOMEM(OMAP1510_FPGA_BASE + 0x2) +#define OMAP1510_FPGA_LED_DIGIT			IOMEM(OMAP1510_FPGA_BASE + 0x3) +#define INNOVATOR_FPGA_HID_SPI			IOMEM(OMAP1510_FPGA_BASE + 0x4) +#define OMAP1510_FPGA_POWER			IOMEM(OMAP1510_FPGA_BASE + 0x5) + +/* Interrupt status */ +#define OMAP1510_FPGA_ISR_LO			IOMEM(OMAP1510_FPGA_BASE + 0x6) +#define OMAP1510_FPGA_ISR_HI			IOMEM(OMAP1510_FPGA_BASE + 0x7) + +/* Interrupt mask */ +#define OMAP1510_FPGA_IMR_LO			IOMEM(OMAP1510_FPGA_BASE + 0x8) +#define OMAP1510_FPGA_IMR_HI			IOMEM(OMAP1510_FPGA_BASE + 0x9) + +/* Reset registers */ +#define OMAP1510_FPGA_HOST_RESET		IOMEM(OMAP1510_FPGA_BASE + 0xa) +#define OMAP1510_FPGA_RST			IOMEM(OMAP1510_FPGA_BASE + 0xb) + +#define OMAP1510_FPGA_AUDIO			IOMEM(OMAP1510_FPGA_BASE + 0xc) +#define OMAP1510_FPGA_DIP			IOMEM(OMAP1510_FPGA_BASE + 0xe) +#define OMAP1510_FPGA_FPGA_IO			IOMEM(OMAP1510_FPGA_BASE + 0xf) +#define OMAP1510_FPGA_UART1			IOMEM(OMAP1510_FPGA_BASE + 0x14) +#define OMAP1510_FPGA_UART2			IOMEM(OMAP1510_FPGA_BASE + 0x15) +#define OMAP1510_FPGA_OMAP1510_STATUS		IOMEM(OMAP1510_FPGA_BASE + 0x16) +#define OMAP1510_FPGA_BOARD_REV			IOMEM(OMAP1510_FPGA_BASE + 0x18) +#define INNOVATOR_FPGA_CAM_USB_CONTROL		IOMEM(OMAP1510_FPGA_BASE + 0x20c) +#define OMAP1510P1_PPT_DATA			IOMEM(OMAP1510_FPGA_BASE + 0x100) +#define OMAP1510P1_PPT_STATUS			IOMEM(OMAP1510_FPGA_BASE + 0x101) +#define OMAP1510P1_PPT_CONTROL			IOMEM(OMAP1510_FPGA_BASE + 0x102) + +#define OMAP1510_FPGA_TOUCHSCREEN		IOMEM(OMAP1510_FPGA_BASE + 0x204) + +#define INNOVATOR_FPGA_INFO			IOMEM(OMAP1510_FPGA_BASE + 0x205) +#define INNOVATOR_FPGA_LCD_BRIGHT_LO		IOMEM(OMAP1510_FPGA_BASE + 0x206) +#define INNOVATOR_FPGA_LCD_BRIGHT_HI		IOMEM(OMAP1510_FPGA_BASE + 0x207) +#define INNOVATOR_FPGA_LED_GRN_LO		IOMEM(OMAP1510_FPGA_BASE + 0x208) +#define INNOVATOR_FPGA_LED_GRN_HI		IOMEM(OMAP1510_FPGA_BASE + 0x209) +#define INNOVATOR_FPGA_LED_RED_LO		IOMEM(OMAP1510_FPGA_BASE + 0x20a) +#define INNOVATOR_FPGA_LED_RED_HI		IOMEM(OMAP1510_FPGA_BASE + 0x20b) +#define INNOVATOR_FPGA_EXP_CONTROL		IOMEM(OMAP1510_FPGA_BASE + 0x20d) +#define INNOVATOR_FPGA_ISR2			IOMEM(OMAP1510_FPGA_BASE + 0x20e) +#define INNOVATOR_FPGA_IMR2			IOMEM(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 /*  __ASM_ARCH_OMAP15XX_H */ diff --git a/arch/arm/mach-omap1/include/mach/serial.h b/arch/arm/mach-omap1/include/mach/serial.h new file mode 100644 index 00000000000..2ce6a2db470 --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/serial.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2009 Texas Instruments + * Added 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, relative to + * start of RAM. 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_OFS	0x3ffc + +/* OMAP1 serial ports */ +#define OMAP1_UART1_BASE	0xfffb0000 +#define OMAP1_UART2_BASE	0xfffb0800 +#define OMAP1_UART3_BASE	0xfffb9800 + +#define OMAP_PORT_SHIFT		2 +#define OMAP7XX_PORT_SHIFT	0 + +#define OMAP1510_BASE_BAUD	(12000000/16) +#define OMAP16XX_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 + +#ifndef __ASSEMBLER__ +extern void omap_serial_init(void); +#endif + +#endif diff --git a/arch/arm/mach-omap1/include/mach/soc.h b/arch/arm/mach-omap1/include/mach/soc.h new file mode 100644 index 00000000000..6cf9c1cc2be --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/soc.h @@ -0,0 +1,229 @@ +/* + * OMAP cpu type detection + * + * Copyright (C) 2004, 2008 Nokia Corporation + * + * Copyright (C) 2009-11 Texas Instruments. + * + * Written by Tony Lindgren <tony.lindgren@nokia.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 + * 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_CPU_H +#define __ASM_ARCH_OMAP_CPU_H + +#ifndef __ASSEMBLY__ + +#include <linux/bitops.h> + +/* + * Test if multicore OMAP support is needed + */ +#undef MULTI_OMAP1 +#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 + +/* + * 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); + +/* + * 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 + */ +#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) + +#define cpu_is_omap7xx()		0 +#define cpu_is_omap15xx()		0 +#define cpu_is_omap16xx()		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 +#endif + +/* + * Macros to detect individual cpu types. + * These are only rarely needed. + * cpu_is_omap310():	True for OMAP310 + * 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 + */ +#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(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) + +#define cpu_is_omap310()		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 + +/* These are needed to compile common code */ +#ifdef CONFIG_ARCH_OMAP1 +#define cpu_is_omap242x()		0 +#define cpu_is_omap2430()		0 +#define cpu_is_omap243x()		0 +#define cpu_is_omap24xx()		0 +#define cpu_is_omap34xx()		0 +#define cpu_is_omap44xx()		0 +#define soc_is_omap54xx()		0 +#define soc_is_am33xx()			0 +#define cpu_class_is_omap1()		1 +#define cpu_class_is_omap2()		0 +#endif + +/* + * Whether we have MULTI_OMAP1 or not, we still need to distinguish + * between 310 vs. 1510 and 1611B/5912 vs. 1710. + */ + +#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 + +#endif	/* __ASSEMBLY__ */ +#endif diff --git a/arch/arm/mach-omap1/include/mach/tc.h b/arch/arm/mach-omap1/include/mach/tc.h new file mode 100644 index 00000000000..1b4b2da8620 --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/tc.h @@ -0,0 +1,89 @@ +/* + * 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))) + +#endif	/* __ASSEMBLER__ */ + +#endif	/* __ASM_ARCH_TC_H */ diff --git a/arch/arm/mach-omap1/include/mach/uncompress.h b/arch/arm/mach-omap1/include/mach/uncompress.h index 0ff22dc075c..ad6fbe7d83f 100644 --- a/arch/arm/mach-omap1/include/mach/uncompress.h +++ b/arch/arm/mach-omap1/include/mach/uncompress.h @@ -1,5 +1,122 @@  /* - * arch/arm/mach-omap1/include/mach/uncompress.h + * 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 <plat/uncompress.h> +#include <linux/types.h> +#include <linux/serial_reg.h> + +#include <asm/memory.h> +#include <asm/mach-types.h> + +#include "serial.h" + +#define MDR1_MODE_MASK			0x07 + +volatile u8 *uart_base; +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) +{ +	/* +	 * Get address of some.bss variable and round it down +	 * a la CONFIG_AUTO_ZRELADDR. +	 */ +	u32 ram_start = (u32)&uart_shift & 0xf8000000; +	u32 *uart_info = (u32 *)(ram_start + OMAP_UART_INFO_OFS); +	*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) + +static inline void arch_decomp_setup(void) +{ +	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); +	} while (0); +} + +/* + * nothing to do + */ +#define arch_decomp_wdog() diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index 6a5baab1f4c..499b8accb83 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c @@ -17,8 +17,8 @@  #include <asm/mach/map.h>  #include <mach/mux.h> -#include <plat/tc.h> -#include <plat/dma.h> +#include <mach/tc.h> +#include <linux/omap-dma.h>  #include "iomap.h"  #include "common.h" @@ -134,7 +134,6 @@ void __init omap1_init_early(void)  	 */  	omap1_clk_init();  	omap1_mux_init(); -	omap_init_consistent_dma_size();  }  void __init omap1_init_late(void) diff --git a/arch/arm/mach-omap1/iomap.h b/arch/arm/mach-omap1/iomap.h index 330c4716b02..f4e2d7a2136 100644 --- a/arch/arm/mach-omap1/iomap.h +++ b/arch/arm/mach-omap1/iomap.h @@ -22,9 +22,6 @@   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ -#define OMAP1_IO_OFFSET		0x01000000	/* Virtual IO = 0xfefb0000 */ -#define OMAP1_IO_ADDRESS(pa)	IOMEM((pa) - OMAP1_IO_OFFSET) -  /*   * ----------------------------------------------------------------------------   * Omap1 specific IO mapping diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index 6995fb6a334..122ef67939a 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c @@ -45,7 +45,7 @@  #include <asm/irq.h>  #include <asm/mach/irq.h> -#include <plat/cpu.h> +#include "soc.h"  #include <mach/hardware.h> diff --git a/arch/arm/mach-omap1/lcd_dma.c b/arch/arm/mach-omap1/lcd_dma.c index ed42628611b..77924be37d4 100644 --- a/arch/arm/mach-omap1/lcd_dma.c +++ b/arch/arm/mach-omap1/lcd_dma.c @@ -27,11 +27,13 @@  #include <linux/interrupt.h>  #include <linux/io.h> -#include <plat/dma.h> +#include <linux/omap-dma.h>  #include <mach/hardware.h>  #include <mach/lcdc.h> +#include "dma.h" +  int omap_lcd_dma_running(void)  {  	/* diff --git a/arch/arm/mach-omap1/mcbsp.c b/arch/arm/mach-omap1/mcbsp.c index bdc2e7541ad..b0d4723c9a9 100644 --- a/arch/arm/mach-omap1/mcbsp.c +++ b/arch/arm/mach-omap1/mcbsp.c @@ -19,14 +19,15 @@  #include <linux/platform_device.h>  #include <linux/slab.h> -#include <plat/dma.h> +#include <linux/omap-dma.h>  #include <mach/mux.h> -#include <plat/cpu.h> +#include "soc.h"  #include <linux/platform_data/asoc-ti-mcbsp.h>  #include <mach/irqs.h>  #include "iomap.h" +#include "dma.h"  #define DPS_RSTCT2_PER_EN	(1 << 0)  #define DSP_RSTCT2_WD_PER_EN	(1 << 1) diff --git a/arch/arm/mach-omap1/mmc.h b/arch/arm/mach-omap1/mmc.h new file mode 100644 index 00000000000..39c2b13de88 --- /dev/null +++ b/arch/arm/mach-omap1/mmc.h @@ -0,0 +1,18 @@ +#include <linux/mmc/host.h> +#include <linux/platform_data/mmc-omap.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 */ + +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) +void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, +				int nr_controllers); +#else +static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, +				int nr_controllers) +{ +} +#endif diff --git a/arch/arm/mach-omap1/opp_data.c b/arch/arm/mach-omap1/opp_data.c index 9cd4ddb5139..8dcebe6d888 100644 --- a/arch/arm/mach-omap1/opp_data.c +++ b/arch/arm/mach-omap1/opp_data.c @@ -10,7 +10,7 @@   * published by the Free Software Foundation.   */ -#include <plat/clkdev_omap.h> +#include "clock.h"  #include "opp.h"  /*------------------------------------------------------------------------- diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index 47ec1615548..7a7690ab6cb 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c @@ -44,23 +44,23 @@  #include <linux/io.h>  #include <linux/atomic.h> +#include <asm/fncpy.h>  #include <asm/system_misc.h>  #include <asm/irq.h>  #include <asm/mach/time.h>  #include <asm/mach/irq.h> -#include <plat/cpu.h> -#include <plat/clock.h> -#include <plat/sram.h> -#include <plat/tc.h> +#include <mach/tc.h>  #include <mach/mux.h> -#include <plat/dma.h> +#include <linux/omap-dma.h>  #include <plat/dmtimer.h>  #include <mach/irqs.h>  #include "iomap.h" +#include "clock.h"  #include "pm.h" +#include "sram.h"  static unsigned int arm_sleep_save[ARM_SLEEP_SAVE_SIZE];  static unsigned short dsp_sleep_save[DSP_SLEEP_SAVE_SIZE]; diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c index 7868e75ad07..3f2d3967239 100644 --- a/arch/arm/mach-omap1/pm_bus.c +++ b/arch/arm/mach-omap1/pm_bus.c @@ -19,8 +19,7 @@  #include <linux/clk.h>  #include <linux/err.h> -#include <plat/omap_device.h> -#include <plat/omap-pm.h> +#include "soc.h"  #ifdef CONFIG_PM_RUNTIME  static int omap1_pm_runtime_suspend(struct device *dev) diff --git a/arch/arm/mach-omap1/reset.c b/arch/arm/mach-omap1/reset.c index b1770910386..5eebd7e889d 100644 --- a/arch/arm/mach-omap1/reset.c +++ b/arch/arm/mach-omap1/reset.c @@ -4,12 +4,24 @@  #include <linux/kernel.h>  #include <linux/io.h> -#include <plat/prcm.h> -  #include <mach/hardware.h> +#include "iomap.h"  #include "common.h" +/* ARM_SYSST bit shifts related to SoC reset sources */ +#define ARM_SYSST_POR_SHIFT				5 +#define ARM_SYSST_EXT_RST_SHIFT				4 +#define ARM_SYSST_ARM_WDRST_SHIFT			2 +#define ARM_SYSST_GLOB_SWRST_SHIFT			1 + +/* Standardized reset source bits (across all OMAP SoCs) */ +#define OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT		0 +#define OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT		1 +#define OMAP_MPU_WD_RST_SRC_ID_SHIFT			3 +#define OMAP_EXTWARM_RST_SRC_ID_SHIFT			5 + +  void omap1_restart(char mode, const char *cmd)  {  	/* @@ -23,3 +35,28 @@ void omap1_restart(char mode, const char *cmd)  	omap_writew(1, ARM_RSTCT1);  } + +/** + * omap1_get_reset_sources - return the source of the SoC's last reset + * + * Returns bits that represent the last reset source for the SoC.  The + * format is standardized across OMAPs for use by the OMAP watchdog. + */ +u32 omap1_get_reset_sources(void) +{ +	u32 ret = 0; +	u16 rs; + +	rs = __raw_readw(OMAP1_IO_ADDRESS(ARM_SYSST)); + +	if (rs & (1 << ARM_SYSST_POR_SHIFT)) +		ret |= 1 << OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT; +	if (rs & (1 << ARM_SYSST_EXT_RST_SHIFT)) +		ret |= 1 << OMAP_EXTWARM_RST_SRC_ID_SHIFT; +	if (rs & (1 << ARM_SYSST_ARM_WDRST_SHIFT)) +		ret |= 1 << OMAP_MPU_WD_RST_SRC_ID_SHIFT; +	if (rs & (1 << ARM_SYSST_GLOB_SWRST_SHIFT)) +		ret |= 1 << OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT; + +	return ret; +} diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index b9d6834af83..d1ac08016f0 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c @@ -23,7 +23,6 @@  #include <asm/mach-types.h>  #include <mach/mux.h> -#include <plat/fpga.h>  #include "pm.h" diff --git a/arch/arm/mach-omap1/sleep.S b/arch/arm/mach-omap1/sleep.S index 0e628743bd0..a908c51839a 100644 --- a/arch/arm/mach-omap1/sleep.S +++ b/arch/arm/mach-omap1/sleep.S @@ -36,6 +36,8 @@  #include <asm/assembler.h> +#include <mach/hardware.h> +  #include "iomap.h"  #include "pm.h" diff --git a/arch/arm/mach-omap1/soc.h b/arch/arm/mach-omap1/soc.h new file mode 100644 index 00000000000..69daf0187b1 --- /dev/null +++ b/arch/arm/mach-omap1/soc.h @@ -0,0 +1,4 @@ +/* + * We can move mach/soc.h here once the drivers are fixed + */ +#include <mach/soc.h> diff --git a/arch/arm/mach-omap1/sram-init.c b/arch/arm/mach-omap1/sram-init.c new file mode 100644 index 00000000000..6431b0f862c --- /dev/null +++ b/arch/arm/mach-omap1/sram-init.c @@ -0,0 +1,76 @@ +/* + * OMAP SRAM detection and management + * + * Copyright (C) 2005 Nokia Corporation + * Written 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/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/io.h> + +#include <asm/fncpy.h> +#include <asm/tlb.h> +#include <asm/cacheflush.h> + +#include <asm/mach/map.h> + +#include "soc.h" +#include "sram.h" + +#define OMAP1_SRAM_PA		0x20000000 +#define SRAM_BOOTLOADER_SZ	0x80 + +/* + * 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. + */ +static void __init omap_detect_and_map_sram(void) +{ +	unsigned long omap_sram_skip = SRAM_BOOTLOADER_SZ; +	unsigned long omap_sram_start = OMAP1_SRAM_PA; +	unsigned long omap_sram_size; + +	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_omap1611() || +			cpu_is_omap1621() || cpu_is_omap1710()) +		omap_sram_size = 0x4000;	/* 16K */ +	else { +		pr_err("Could not detect SRAM size\n"); +		omap_sram_size = 0x4000; +	} + +	omap_map_sram(omap_sram_start, omap_sram_size, +		omap_sram_skip, 1); +} + +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); +	/* On 730, bit 13 must always be 1 */ +	if (cpu_is_omap7xx()) +		ckctl |= 0x2000; +	_omap_sram_reprogram_clock(dpllctl, ckctl); +} + +int __init omap_sram_init(void) +{ +	omap_detect_and_map_sram(); +	_omap_sram_reprogram_clock = +			omap_sram_push(omap1_sram_reprogram_clock, +					omap1_sram_reprogram_clock_sz); + +	return 0; +} diff --git a/arch/arm/mach-omap1/sram.h b/arch/arm/mach-omap1/sram.h new file mode 100644 index 00000000000..d5a6c836230 --- /dev/null +++ b/arch/arm/mach-omap1/sram.h @@ -0,0 +1,7 @@ +#include <plat/sram.h> + +extern void omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl); + +/* Do not use these */ +extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); +extern unsigned long omap1_sram_reprogram_clock_sz; diff --git a/arch/arm/mach-omap1/timer.c b/arch/arm/mach-omap1/timer.c index cdeb9d3ef64..bde7a35e500 100644 --- a/arch/arm/mach-omap1/timer.c +++ b/arch/arm/mach-omap1/timer.c @@ -25,6 +25,7 @@  #include <linux/err.h>  #include <linux/slab.h>  #include <linux/platform_device.h> +#include <linux/platform_data/dmtimer-omap.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 74529549130..41152fadd4c 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c @@ -50,7 +50,7 @@  #include <asm/mach/irq.h>  #include <asm/mach/time.h> -#include <plat/dmtimer.h> +#include <plat/counter-32k.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-omap1/usb.c b/arch/arm/mach-omap1/usb.c index 84267edd942..104fed366b8 100644 --- a/arch/arm/mach-omap1/usb.c +++ b/arch/arm/mach-omap1/usb.c @@ -301,7 +301,7 @@ static inline void otg_device_init(struct omap_usb_config *pdata)  #endif -u32 __init omap1_usb0_init(unsigned nwires, unsigned is_device) +static u32 __init omap1_usb0_init(unsigned nwires, unsigned is_device)  {  	u32	syscon1 = 0; @@ -409,7 +409,7 @@ u32 __init omap1_usb0_init(unsigned nwires, unsigned is_device)  	return syscon1 << 16;  } -u32 __init omap1_usb1_init(unsigned nwires) +static u32 __init omap1_usb1_init(unsigned nwires)  {  	u32	syscon1 = 0; @@ -475,7 +475,7 @@ bad:  	return syscon1 << 20;  } -u32 __init omap1_usb2_init(unsigned nwires, unsigned alt_pingroup) +static u32 __init omap1_usb2_init(unsigned nwires, unsigned alt_pingroup)  {  	u32	syscon1 = 0;  |