diff options
Diffstat (limited to 'arch/arm/mach-davinci')
27 files changed, 252 insertions, 87 deletions
diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig index f8eecb95941..0153950f606 100644 --- a/arch/arm/mach-davinci/Kconfig +++ b/arch/arm/mach-davinci/Kconfig @@ -58,6 +58,14 @@ config ARCH_DAVINCI_TNETV107X  comment "DaVinci Board Type" +config MACH_DA8XX_DT +	bool "Support DA8XX platforms using device tree" +	default y +	depends on ARCH_DAVINCI_DA8XX +	help +	  Say y here to include support for TI DaVinci DA850 based using +	  Flattened Device Tree. More information at Documentation/devicetree +  config MACH_DAVINCI_EVM  	bool "TI DM644x EVM"  	default ARCH_DAVINCI_DM644x diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 2227effcb0e..fb5c1aa98a6 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_AINTC)			+= irq.o  obj-$(CONFIG_CP_INTC)			+= cp_intc.o  # Board specific +obj-$(CONFIG_MACH_DA8XX_DT)		+= da8xx-dt.o  obj-$(CONFIG_MACH_DAVINCI_EVM)  	+= board-dm644x-evm.o  obj-$(CONFIG_MACH_SFFSDR)		+= board-sffsdr.o  obj-$(CONFIG_MACH_NEUROS_OSD2)		+= board-neuros-osd2.o diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index d9bc3fa7bb2..7211772edd9 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -11,39 +11,40 @@   * is licensed "as is" without any warranty of any kind, whether express   * or implied.   */ -#include <linux/kernel.h> -#include <linux/init.h>  #include <linux/console.h> +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/gpio_keys.h> +#include <linux/init.h> +#include <linux/kernel.h>  #include <linux/i2c.h>  #include <linux/i2c/at24.h>  #include <linux/i2c/pca953x.h>  #include <linux/input.h> +#include <linux/input/tps6507x-ts.h>  #include <linux/mfd/tps6507x.h> -#include <linux/gpio.h> -#include <linux/gpio_keys.h> -#include <linux/platform_device.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/nand.h>  #include <linux/mtd/partitions.h>  #include <linux/mtd/physmap.h> +#include <linux/platform_device.h> +#include <linux/platform_data/mtd-davinci.h> +#include <linux/platform_data/mtd-davinci-aemif.h> +#include <linux/platform_data/spi-davinci.h> +#include <linux/platform_data/uio_pruss.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/tps6507x.h> -#include <linux/input/tps6507x-ts.h>  #include <linux/spi/spi.h>  #include <linux/spi/flash.h> -#include <linux/delay.h>  #include <linux/wl12xx.h> -#include <asm/mach-types.h> -#include <asm/mach/arch.h> -#include <asm/system_info.h> -  #include <mach/cp_intc.h>  #include <mach/da8xx.h> -#include <linux/platform_data/mtd-davinci.h>  #include <mach/mux.h> -#include <linux/platform_data/mtd-davinci-aemif.h> -#include <linux/platform_data/spi-davinci.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/system_info.h>  #include <media/tvp514x.h>  #include <media/adv7343.h> @@ -1520,6 +1521,11 @@ static __init void da850_evm_init(void)  		pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",  				ret); +	ret = da8xx_register_uio_pruss(); +	if (ret) +		pr_warn("da850_evm_init: pruss initialization failed: %d\n", +				ret); +  	/* Handle board specific muxing for LCD here */  	ret = davinci_cfg_reg_list(da850_evm_lcdc_pins);  	if (ret) diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 88ebea89abd..cdf8d0746e7 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c @@ -324,7 +324,7 @@ static __init void dm355_evm_init(void)  	if (IS_ERR(aemif))  		WARN("%s: unable to get AEMIF clock\n", __func__);  	else -		clk_enable(aemif); +		clk_prepare_enable(aemif);  	platform_add_devices(davinci_evm_devices,  			     ARRAY_SIZE(davinci_evm_devices)); diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index 2f88103c645..d41954507fc 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c @@ -246,7 +246,7 @@ static __init void dm355_leopard_init(void)  	if (IS_ERR(aemif))  		WARN("%s: unable to get AEMIF clock\n", __func__);  	else -		clk_enable(aemif); +		clk_prepare_enable(aemif);  	platform_add_devices(davinci_leopard_devices,  			     ARRAY_SIZE(davinci_leopard_devices)); diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index 1b4a8adcfdc..5d49c75388c 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c @@ -478,7 +478,7 @@ static void __init evm_init_cpld(void)  	aemif_clk = clk_get(NULL, "aemif");  	if (IS_ERR(aemif_clk))  		return; -	clk_enable(aemif_clk); +	clk_prepare_enable(aemif_clk);  	if (request_mem_region(DM365_ASYNC_EMIF_DATA_CE1_BASE, SECTION_SIZE,  			"cpld") == NULL) @@ -489,7 +489,7 @@ static void __init evm_init_cpld(void)  				SECTION_SIZE);  fail:  		pr_err("ERROR: can't map CPLD\n"); -		clk_disable(aemif_clk); +		clk_disable_unprepare(aemif_clk);  		return;  	} diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index f22572cee49..f5e018de7fa 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -519,13 +519,11 @@ static int dm6444evm_msp430_get_pins(void)  	char buf[4];  	struct i2c_msg msg[2] = {  		{ -			.addr = dm6446evm_msp->addr,  			.flags = 0,  			.len = 2,  			.buf = (void __force *)txbuf,  		},  		{ -			.addr = dm6446evm_msp->addr,  			.flags = I2C_M_RD,  			.len = 4,  			.buf = buf, @@ -536,6 +534,9 @@ static int dm6444evm_msp430_get_pins(void)  	if (!dm6446evm_msp)  		return -ENXIO; +	msg[0].addr = dm6446evm_msp->addr; +	msg[1].addr = dm6446evm_msp->addr; +  	/* Command 4 == get input state, returns port 2 and port3 data  	 *   S Addr W [A] len=2 [A] cmd=4 [A]  	 *   RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P @@ -776,7 +777,7 @@ static __init void davinci_evm_init(void)  	struct davinci_soc_info *soc_info = &davinci_soc_info;  	aemif_clk = clk_get(NULL, "aemif"); -	clk_enable(aemif_clk); +	clk_prepare_enable(aemif_clk);  	if (HAS_ATA) {  		if (HAS_NAND || HAS_NOR) diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 1dbf85beed1..9211e8800c7 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -194,7 +194,7 @@ static int evm_led_setup(struct i2c_client *client, int gpio,  	while (ngpio--) {  		leds->gpio = gpio++;  		leds++; -	}; +	}  	evm_led_dev = platform_device_alloc("leds-gpio", 0);  	platform_device_add_data(evm_led_dev, &evm_led_data, diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index 144bf31d68d..3e3e3afebf8 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c @@ -188,7 +188,7 @@ static __init void davinci_ntosd2_init(void)  	struct davinci_soc_info *soc_info = &davinci_soc_info;  	aemif_clk = clk_get(NULL, "aemif"); -	clk_enable(aemif_clk); +	clk_prepare_enable(aemif_clk);  	if (HAS_ATA) {  		if (HAS_NAND) diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index 64b0f65a863..a794f6d9d44 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c @@ -87,8 +87,6 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info)  		iotable_init(davinci_soc_info.io_desc,  				davinci_soc_info.io_desc_num); -	init_consistent_dma_size(14 << 20); -  	/*  	 * Normally devicemaps_init() would flush caches and tlb after  	 * mdesc->map_io(), but we must also do it here because of the CPU diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index b90c172d554..68c5fe01857 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -212,6 +212,12 @@ static struct clk tptc2_clk = {  	.flags		= ALWAYS_ENABLED,  }; +static struct clk pruss_clk = { +	.name		= "pruss", +	.parent		= &pll0_sysclk2, +	.lpsc		= DA8XX_LPSC0_PRUSS, +}; +  static struct clk uart0_clk = {  	.name		= "uart0",  	.parent		= &pll0_sysclk2, @@ -385,6 +391,7 @@ static struct clk_lookup da850_clks[] = {  	CLK(NULL,		"tptc1",	&tptc1_clk),  	CLK(NULL,		"tpcc1",	&tpcc1_clk),  	CLK(NULL,		"tptc2",	&tptc2_clk), +	CLK("pruss_uio",	"pruss",	&pruss_clk),  	CLK(NULL,		"uart0",	&uart0_clk),  	CLK(NULL,		"uart1",	&uart1_clk),  	CLK(NULL,		"uart2",	&uart2_clk), @@ -781,12 +788,6 @@ static struct map_desc da850_io_desc[] = {  		.length		= DA8XX_CP_INTC_SIZE,  		.type		= MT_DEVICE  	}, -	{ -		.virtual	= SRAM_VIRT, -		.pfn		= __phys_to_pfn(DA8XX_ARM_RAM_BASE), -		.length		= SZ_8K, -		.type		= MT_DEVICE -	},  };  static u32 da850_psc_bases[] = { DA8XX_PSC0_BASE, DA8XX_PSC1_BASE }; @@ -1239,8 +1240,8 @@ static struct davinci_soc_info davinci_soc_info_da850 = {  	.gpio_irq		= IRQ_DA8XX_GPIO0,  	.serial_dev		= &da8xx_serial_device,  	.emac_pdata		= &da8xx_emac_pdata, -	.sram_dma		= DA8XX_ARM_RAM_BASE, -	.sram_len		= SZ_8K, +	.sram_dma		= DA8XX_SHARED_RAM_BASE, +	.sram_len		= SZ_128K,  };  void __init da850_init(void) diff --git a/arch/arm/mach-davinci/da8xx-dt.c b/arch/arm/mach-davinci/da8xx-dt.c new file mode 100644 index 00000000000..37c27af18fa --- /dev/null +++ b/arch/arm/mach-davinci/da8xx-dt.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ + * + * Modified from mach-omap/omap2/board-generic.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/io.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <linux/irqdomain.h> + +#include <asm/mach/arch.h> + +#include <mach/common.h> +#include <mach/cp_intc.h> +#include <mach/da8xx.h> + +#define DA8XX_NUM_UARTS	3 + +void __init da8xx_uart_clk_enable(void) +{ +	int i; +	for (i = 0; i < DA8XX_NUM_UARTS; i++) +		davinci_serial_setup_clk(i, NULL); +} + +static struct of_device_id da8xx_irq_match[] __initdata = { +	{ .compatible = "ti,cp-intc", .data = cp_intc_of_init, }, +	{ } +}; + +static void __init da8xx_init_irq(void) +{ +	of_irq_init(da8xx_irq_match); +} + +#ifdef CONFIG_ARCH_DAVINCI_DA850 + +static void __init da850_init_machine(void) +{ +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); + +	da8xx_uart_clk_enable(); +} + +static const char *da850_boards_compat[] __initdata = { +	"enbw,cmc", +	"ti,da850-evm", +	"ti,da850", +	NULL, +}; + +DT_MACHINE_START(DA850_DT, "Generic DA850/OMAP-L138/AM18x") +	.map_io		= da850_init, +	.init_irq	= da8xx_init_irq, +	.timer		= &davinci_timer, +	.init_machine	= da850_init_machine, +	.dt_compat	= da850_boards_compat, +	.init_late	= davinci_init_late, +	.restart	= da8xx_restart, +MACHINE_END + +#endif diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index bd2f72b414b..46c9a0c09ae 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -22,6 +22,7 @@  #include <mach/time.h>  #include <mach/da8xx.h>  #include <mach/cpuidle.h> +#include <mach/sram.h>  #include "clock.h"  #include "asp.h" @@ -32,6 +33,7 @@  #define DA8XX_WDOG_BASE			0x01c21000 /* DA8XX_TIMER64P1_BASE */  #define DA8XX_I2C0_BASE			0x01c22000  #define DA8XX_RTC_BASE			0x01c23000 +#define DA8XX_PRUSS_MEM_BASE		0x01c30000  #define DA8XX_MMCSD0_BASE		0x01c40000  #define DA8XX_SPI0_BASE			0x01c41000  #define DA830_SPI1_BASE			0x01e12000 @@ -518,6 +520,75 @@ void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)  	}  } +static struct resource da8xx_pruss_resources[] = { +	{ +		.start	= DA8XX_PRUSS_MEM_BASE, +		.end	= DA8XX_PRUSS_MEM_BASE + 0xFFFF, +		.flags	= IORESOURCE_MEM, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT0, +		.end	= IRQ_DA8XX_EVTOUT0, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT1, +		.end	= IRQ_DA8XX_EVTOUT1, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT2, +		.end	= IRQ_DA8XX_EVTOUT2, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT3, +		.end	= IRQ_DA8XX_EVTOUT3, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT4, +		.end	= IRQ_DA8XX_EVTOUT4, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT5, +		.end	= IRQ_DA8XX_EVTOUT5, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT6, +		.end	= IRQ_DA8XX_EVTOUT6, +		.flags	= IORESOURCE_IRQ, +	}, +	{ +		.start	= IRQ_DA8XX_EVTOUT7, +		.end	= IRQ_DA8XX_EVTOUT7, +		.flags	= IORESOURCE_IRQ, +	}, +}; + +static struct uio_pruss_pdata da8xx_uio_pruss_pdata = { +	.pintc_base	= 0x4000, +}; + +static struct platform_device da8xx_uio_pruss_dev = { +	.name		= "pruss_uio", +	.id		= -1, +	.num_resources	= ARRAY_SIZE(da8xx_pruss_resources), +	.resource	= da8xx_pruss_resources, +	.dev		= { +		.coherent_dma_mask	= DMA_BIT_MASK(32), +		.platform_data		= &da8xx_uio_pruss_pdata, +	} +}; + +int __init da8xx_register_uio_pruss(void) +{ +	da8xx_uio_pruss_pdata.sram_pool = sram_get_gen_pool(); +	return platform_device_register(&da8xx_uio_pruss_dev); +} +  static const struct display_panel disp_panel = {  	QVGA,  	16, @@ -900,7 +971,7 @@ static int da850_sata_init(struct device *dev, void __iomem *addr)  	if (IS_ERR(da850_sata_clk))  		return PTR_ERR(da850_sata_clk); -	ret = clk_enable(da850_sata_clk); +	ret = clk_prepare_enable(da850_sata_clk);  	if (ret)  		goto err0; @@ -931,7 +1002,7 @@ static int da850_sata_init(struct device *dev, void __iomem *addr)  	return 0;  err1: -	clk_disable(da850_sata_clk); +	clk_disable_unprepare(da850_sata_clk);  err0:  	clk_put(da850_sata_clk);  	return ret; @@ -939,7 +1010,7 @@ err0:  static void da850_sata_exit(struct device *dev)  { -	clk_disable(da850_sata_clk); +	clk_disable_unprepare(da850_sata_clk);  	clk_put(da850_sata_clk);  } diff --git a/arch/arm/mach-davinci/devices-tnetv107x.c b/arch/arm/mach-davinci/devices-tnetv107x.c index 29b17f7d3a5..773ab07a71a 100644 --- a/arch/arm/mach-davinci/devices-tnetv107x.c +++ b/arch/arm/mach-davinci/devices-tnetv107x.c @@ -374,7 +374,7 @@ void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)  	 * complete sample conversion in time.  	 */  	tsc_clk = clk_get(NULL, "sys_tsc_clk"); -	if (tsc_clk) { +	if (!IS_ERR(tsc_clk)) {  		error = clk_set_rate(tsc_clk, 5000000);  		WARN_ON(error < 0);  		clk_put(tsc_clk); diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index a255434908d..b49c3b77d55 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c @@ -758,12 +758,6 @@ static struct map_desc dm355_io_desc[] = {  		.length		= IO_SIZE,  		.type		= MT_DEVICE  	}, -	{ -		.virtual	= SRAM_VIRT, -		.pfn		= __phys_to_pfn(0x00010000), -		.length		= SZ_32K, -		.type		= MT_MEMORY_NONCACHED, -	},  };  /* Contents of JTAG ID register used to identify exact cpu type */ diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index b680c832e0b..6c3980540be 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c @@ -985,12 +985,6 @@ static struct map_desc dm365_io_desc[] = {  		.length		= IO_SIZE,  		.type		= MT_DEVICE  	}, -	{ -		.virtual	= SRAM_VIRT, -		.pfn		= __phys_to_pfn(0x00010000), -		.length		= SZ_32K, -		.type		= MT_MEMORY_NONCACHED, -	},  };  static struct resource dm365_ks_resources[] = { diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 14e9947bad6..11c79a3362e 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -785,12 +785,6 @@ static struct map_desc dm644x_io_desc[] = {  		.length		= IO_SIZE,  		.type		= MT_DEVICE  	}, -	{ -		.virtual	= SRAM_VIRT, -		.pfn		= __phys_to_pfn(0x00008000), -		.length		= SZ_16K, -		.type		= MT_MEMORY_NONCACHED, -	},  };  /* Contents of JTAG ID register used to identify exact cpu type */ diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index 97c0f8e555b..ac7b431c4c8 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c @@ -756,12 +756,6 @@ static struct map_desc dm646x_io_desc[] = {  		.length		= IO_SIZE,  		.type		= MT_DEVICE  	}, -	{ -		.virtual	= SRAM_VIRT, -		.pfn		= __phys_to_pfn(0x00010000), -		.length		= SZ_32K, -		.type		= MT_MEMORY_NONCACHED, -	},  };  /* Contents of JTAG ID register used to identify exact cpu type */ diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index bdc4aa8e672..046c7238a3d 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h @@ -104,8 +104,6 @@ int davinci_pm_init(void);  static inline int davinci_pm_init(void) { return 0; }  #endif -/* standard place to map on-chip SRAMs; they *may* support DMA */ -#define SRAM_VIRT	0xfffe0000  #define SRAM_SIZE	SZ_128K  #endif /* __ARCH_ARM_MACH_DAVINCI_COMMON_H */ diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index aaccdc4528f..700d311c685 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h @@ -26,6 +26,7 @@  #include <linux/platform_data/mmc-davinci.h>  #include <linux/platform_data/usb-davinci.h>  #include <linux/platform_data/spi-davinci.h> +#include <linux/platform_data/uio_pruss.h>  #include <media/davinci/vpif_types.h> @@ -72,6 +73,7 @@ extern unsigned int da850_max_speed;  #define DA8XX_AEMIF_CS2_BASE	0x60000000  #define DA8XX_AEMIF_CS3_BASE	0x62000000  #define DA8XX_AEMIF_CTL_BASE	0x68000000 +#define DA8XX_SHARED_RAM_BASE	0x80000000  #define DA8XX_ARM_RAM_BASE	0xffff0000  void __init da830_init(void); @@ -86,6 +88,7 @@ int da8xx_register_watchdog(void);  int da8xx_register_usb20(unsigned mA, unsigned potpgt);  int da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata);  int da8xx_register_emac(void); +int da8xx_register_uio_pruss(void);  int da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata);  int da8xx_register_mmcsd0(struct davinci_mmc_config *config);  int da850_register_mmcsd1(struct davinci_mmc_config *config); diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h index 46b3cd11c3c..62ad300440f 100644 --- a/arch/arm/mach-davinci/include/mach/serial.h +++ b/arch/arm/mach-davinci/include/mach/serial.h @@ -38,11 +38,12 @@  #ifndef __ASSEMBLY__  struct davinci_uart_config { -	/* Bit field of UARTs present; bit 0 --> UART1 */ +	/* Bit field of UARTs present; bit 0 --> UART0 */  	unsigned int enabled_uarts;  };  extern int davinci_serial_init(struct davinci_uart_config *); +extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);  #endif  #endif /* __ASM_ARCH_SERIAL_H */ diff --git a/arch/arm/mach-davinci/include/mach/sram.h b/arch/arm/mach-davinci/include/mach/sram.h index 111f7cc71e0..4e5db56218b 100644 --- a/arch/arm/mach-davinci/include/mach/sram.h +++ b/arch/arm/mach-davinci/include/mach/sram.h @@ -24,4 +24,7 @@  extern void *sram_alloc(size_t len, dma_addr_t *dma);  extern void sram_free(void *addr, size_t len); +/* Get the struct gen_pool * for use in platform data */ +extern struct gen_pool *sram_get_gen_pool(void); +  #endif /* __MACH_SRAM_H */ diff --git a/arch/arm/mach-davinci/include/mach/uncompress.h b/arch/arm/mach-davinci/include/mach/uncompress.h index 18cfd497715..3a0ff905a69 100644 --- a/arch/arm/mach-davinci/include/mach/uncompress.h +++ b/arch/arm/mach-davinci/include/mach/uncompress.h @@ -32,6 +32,9 @@ u32 *uart;  /* PORT_16C550A, in polled non-fifo mode */  static void putc(char c)  { +	if (!uart) +		return; +  	while (!(uart[UART_LSR] & UART_LSR_THRE))  		barrier();  	uart[UART_TX] = c; @@ -39,6 +42,9 @@ static void putc(char c)  static inline void flush(void)  { +	if (!uart) +		return; +  	while (!(uart[UART_LSR] & UART_LSR_THRE))  		barrier();  } diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c index 1875740fe27..f2625814c3c 100644 --- a/arch/arm/mach-davinci/serial.c +++ b/arch/arm/mach-davinci/serial.c @@ -70,11 +70,33 @@ static void __init davinci_serial_reset(struct plat_serial8250_port *p)  				 UART_DM646X_SCR_TX_WATERMARK);  } -int __init davinci_serial_init(struct davinci_uart_config *info) +/* Enable UART clock and obtain its rate */ +int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)  { -	int i;  	char name[16]; -	struct clk *uart_clk; +	struct clk *clk; +	struct davinci_soc_info *soc_info = &davinci_soc_info; +	struct device *dev = &soc_info->serial_dev->dev; + +	sprintf(name, "uart%d", instance); +	clk = clk_get(dev, name); +	if (IS_ERR(clk)) { +		pr_err("%s:%d: failed to get UART%d clock\n", +					__func__, __LINE__, instance); +		return PTR_ERR(clk); +	} + +	clk_prepare_enable(clk); + +	if (rate) +		*rate = clk_get_rate(clk); + +	return 0; +} + +int __init davinci_serial_init(struct davinci_uart_config *info) +{ +	int i, ret;  	struct davinci_soc_info *soc_info = &davinci_soc_info;  	struct device *dev = &soc_info->serial_dev->dev;  	struct plat_serial8250_port *p = dev->platform_data; @@ -87,16 +109,9 @@ int __init davinci_serial_init(struct davinci_uart_config *info)  		if (!(info->enabled_uarts & (1 << i)))  			continue; -		sprintf(name, "uart%d", i); -		uart_clk = clk_get(dev, name); -		if (IS_ERR(uart_clk)) { -			printk(KERN_ERR "%s:%d: failed to get UART%d clock\n", -					__func__, __LINE__, i); +		ret = davinci_serial_setup_clk(i, &p->uartclk); +		if (ret)  			continue; -		} - -		clk_enable(uart_clk); -		p->uartclk = clk_get_rate(uart_clk);  		if (!p->membase && p->mapbase) {  			p->membase = ioremap(p->mapbase, SZ_4K); diff --git a/arch/arm/mach-davinci/sram.c b/arch/arm/mach-davinci/sram.c index db0f7787faf..c5f7ee5cc80 100644 --- a/arch/arm/mach-davinci/sram.c +++ b/arch/arm/mach-davinci/sram.c @@ -10,6 +10,7 @@   */  #include <linux/module.h>  #include <linux/init.h> +#include <linux/io.h>  #include <linux/genalloc.h>  #include <mach/common.h> @@ -17,6 +18,11 @@  static struct gen_pool *sram_pool; +struct gen_pool *sram_get_gen_pool(void) +{ +	return sram_pool; +} +  void *sram_alloc(size_t len, dma_addr_t *dma)  {  	unsigned long vaddr; @@ -32,7 +38,7 @@ void *sram_alloc(size_t len, dma_addr_t *dma)  		return NULL;  	if (dma) -		*dma = dma_base + (vaddr - SRAM_VIRT); +		*dma = gen_pool_virt_to_phys(sram_pool, vaddr);  	return (void *)vaddr;  } @@ -53,8 +59,10 @@ EXPORT_SYMBOL(sram_free);   */  static int __init sram_init(void)  { +	phys_addr_t phys = davinci_soc_info.sram_dma;  	unsigned len = davinci_soc_info.sram_len;  	int status = 0; +	void *addr;  	if (len) {  		len = min_t(unsigned, len, SRAM_SIZE); @@ -62,8 +70,17 @@ static int __init sram_init(void)  		if (!sram_pool)  			status = -ENOMEM;  	} -	if (sram_pool) -		status = gen_pool_add(sram_pool, SRAM_VIRT, len, -1); + +	if (sram_pool) { +		addr = ioremap(phys, len); +		if (!addr) +			return -ENOMEM; +		status = gen_pool_add_virt(sram_pool, (unsigned)addr, +					   phys, len, -1); +		if (status < 0) +			iounmap(addr); +	} +  	WARN_ON(status < 0);  	return status;  } diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c index 75da315b658..9847938785c 100644 --- a/arch/arm/mach-davinci/time.c +++ b/arch/arm/mach-davinci/time.c @@ -379,7 +379,7 @@ static void __init davinci_timer_init(void)  	timer_clk = clk_get(NULL, "timer0");  	BUG_ON(IS_ERR(timer_clk)); -	clk_enable(timer_clk); +	clk_prepare_enable(timer_clk);  	/* init timer hw */  	timer_init(); @@ -429,7 +429,7 @@ void davinci_watchdog_reset(struct platform_device *pdev)  	wd_clk = clk_get(&pdev->dev, NULL);  	if (WARN_ON(IS_ERR(wd_clk)))  		return; -	clk_enable(wd_clk); +	clk_prepare_enable(wd_clk);  	/* disable, internal clock source */  	__raw_writel(0, base + TCR); diff --git a/arch/arm/mach-davinci/usb.c b/arch/arm/mach-davinci/usb.c index f77b95336e2..34509ffba22 100644 --- a/arch/arm/mach-davinci/usb.c +++ b/arch/arm/mach-davinci/usb.c @@ -42,14 +42,8 @@ static struct musb_hdrc_config musb_config = {  };  static struct musb_hdrc_platform_data usb_data = { -#if defined(CONFIG_USB_MUSB_OTG)  	/* OTG requires a Mini-AB connector */  	.mode           = MUSB_OTG, -#elif defined(CONFIG_USB_MUSB_PERIPHERAL) -	.mode           = MUSB_PERIPHERAL, -#elif defined(CONFIG_USB_MUSB_HOST) -	.mode           = MUSB_HOST, -#endif  	.clock		= "usb",  	.config		= &musb_config,  };  |