diff options
9 files changed, 228 insertions, 179 deletions
| diff --git a/target/linux/cns3xxx/patches-3.0/002-cns3xxx_wdt.patch b/target/linux/cns3xxx/patches-3.0/002-cns3xxx_wdt.patch new file mode 100644 index 000000000..233898b2f --- /dev/null +++ b/target/linux/cns3xxx/patches-3.0/002-cns3xxx_wdt.patch @@ -0,0 +1,69 @@ +1. Made the connection between CNS3xxx SOCs(ARCH_CNS3xxx) and MPcore watchdog +   since the CNS3xxx SOCs have ARM11 MPcore CPU. +2. Enable mpcore_watchdog option as module to default configuration at +   arch/arm/configs/cns3420vb_defconfig. + +Signed-off-by: Tommy Lin <tommy.lin@caviumnetworks.com> + +--- +arch/arm/Kconfig                     |    1 + + arch/arm/configs/cns3420vb_defconfig |    2 ++ + arch/arm/mach-cns3xxx/cns3420vb.c    |   22 ++++++++++++++++++++++ + 3 files changed, 25 insertions(+), 0 deletions(-) + +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -327,6 +327,7 @@ config ARCH_CNS3XXX + 	select ARM_GIC + 	select MIGHT_HAVE_PCI + 	select PCI_DOMAINS if PCI ++	select HAVE_ARM_TWD + 	help + 	  Support for Cavium Networks CNS3XXX platform. +  +--- a/arch/arm/configs/cns3420vb_defconfig ++++ b/arch/arm/configs/cns3420vb_defconfig +@@ -53,6 +53,8 @@ CONFIG_LEGACY_PTY_COUNT=16 + # CONFIG_HW_RANDOM is not set + # CONFIG_HWMON is not set + # CONFIG_VGA_CONSOLE is not set ++CONFIG_WATCHDOG=y ++CONFIG_MPCORE_WATCHDOG=m + # CONFIG_HID_SUPPORT is not set + # CONFIG_USB_SUPPORT is not set + CONFIG_MMC=y +--- a/arch/arm/mach-cns3xxx/cns3420vb.c ++++ b/arch/arm/mach-cns3xxx/cns3420vb.c +@@ -159,10 +159,32 @@ static struct platform_device cns3xxx_us + 	}, + }; +  ++/* Watchdog */ ++static struct resource cns3xxx_watchdog_resources[] = { ++	[0] = { ++		.start = CNS3XXX_TC11MP_TWD_BASE, ++		.end   = CNS3XXX_TC11MP_TWD_BASE + PAGE_SIZE - 1, ++		.flags = IORESOURCE_MEM, ++	}, ++	[1] = { ++		.start = IRQ_LOCALWDOG, ++		.end   = IRQ_LOCALWDOG, ++		.flags = IORESOURCE_IRQ, ++	} ++}; ++ ++static struct platform_device cns3xxx_watchdog_device = { ++	.name		= "mpcore_wdt", ++	.id		= -1, ++	.num_resources	= ARRAY_SIZE(cns3xxx_watchdog_resources), ++	.resource	= cns3xxx_watchdog_resources, ++}; ++ + /* +  * Initialization +  */ + static struct platform_device *cns3420_pdevs[] __initdata = { ++	&cns3xxx_watchdog_device, + 	&cns3420_nor_pdev, + 	&cns3xxx_usb_ehci_device, + 	&cns3xxx_usb_ohci_device, diff --git a/target/linux/cns3xxx/patches-3.0/003-cns3xxx_l2cache.patch b/target/linux/cns3xxx/patches-3.0/003-cns3xxx_l2cache.patch new file mode 100644 index 000000000..8bd3ac8c5 --- /dev/null +++ b/target/linux/cns3xxx/patches-3.0/003-cns3xxx_l2cache.patch @@ -0,0 +1,108 @@ +CNS3xxx SOCs have L310-compatible cache controller, so let's use it. + +With this patch benchmarking with 'gzip' shows that performance is +doubled, and I'm still able to boot full-fledged userland over NFS +(using PCIe NIC), so the support should be pretty robust. + +Signed-off-by: Anton Vorontsov <avorontsov@mvista.com> +--- + + arch/arm/mach-cns3xxx/cns3420vb.c |    2 + + arch/arm/mach-cns3xxx/core.c      |   43 +++++++++++++++++++++++++++++++++++++ + arch/arm/mach-cns3xxx/core.h      |    6 +++++ + arch/arm/mm/Kconfig               |    2 +- + 4 files changed, 52 insertions(+), 1 deletions(-) + +--- a/arch/arm/mach-cns3xxx/cns3420vb.c ++++ b/arch/arm/mach-cns3xxx/cns3420vb.c +@@ -192,6 +192,8 @@ static struct platform_device *cns3420_p +  + static void __init cns3420_init(void) + { ++	cns3xxx_l2x0_init(); ++ + 	platform_add_devices(cns3420_pdevs, ARRAY_SIZE(cns3420_pdevs)); +  + 	cns3xxx_ahci_init(); +--- a/arch/arm/mach-cns3xxx/core.c ++++ b/arch/arm/mach-cns3xxx/core.c +@@ -16,6 +16,7 @@ + #include <asm/mach/time.h> + #include <asm/mach/irq.h> + #include <asm/hardware/gic.h> ++#include <asm/hardware/cache-l2x0.h> + #include <mach/cns3xxx.h> + #include "core.h" +  +@@ -244,3 +245,45 @@ static void __init cns3xxx_timer_init(vo + struct sys_timer cns3xxx_timer = { + 	.init = cns3xxx_timer_init, + }; ++ ++#ifdef CONFIG_CACHE_L2X0 ++ ++void __init cns3xxx_l2x0_init(void) ++{ ++	void __iomem *base = ioremap(CNS3XXX_L2C_BASE, SZ_4K); ++	u32 val; ++ ++	if (WARN_ON(!base)) ++		return; ++ ++	/* ++	 * Tag RAM Control register ++	 * ++	 * bit[10:8]	- 1 cycle of write accesses latency ++	 * bit[6:4]	- 1 cycle of read accesses latency ++	 * bit[3:0]	- 1 cycle of setup latency ++	 * ++	 * 1 cycle of latency for setup, read and write accesses ++	 */ ++	val = readl(base + L2X0_TAG_LATENCY_CTRL); ++	val &= 0xfffff888; ++	writel(val, base + L2X0_TAG_LATENCY_CTRL); ++ ++	/* ++	 * Data RAM Control register ++	 * ++	 * bit[10:8]	- 1 cycles of write accesses latency ++	 * bit[6:4]	- 1 cycles of read accesses latency ++	 * bit[3:0]	- 1 cycle of setup latency ++	 * ++	 * 1 cycle of latency for setup, read and write accesses ++	 */ ++	val = readl(base + L2X0_DATA_LATENCY_CTRL); ++	val &= 0xfffff888; ++	writel(val, base + L2X0_DATA_LATENCY_CTRL); ++ ++	/* 32 KiB, 8-way, parity disable */ ++	l2x0_init(base, 0x00540000, 0xfe000fff); ++} ++ ++#endif /* CONFIG_CACHE_L2X0 */ +--- a/arch/arm/mach-cns3xxx/core.h ++++ b/arch/arm/mach-cns3xxx/core.h +@@ -13,6 +13,12 @@ +  + extern struct sys_timer cns3xxx_timer; +  ++#ifdef CONFIG_CACHE_L2X0 ++void __init cns3xxx_l2x0_init(void); ++#else ++static inline void cns3xxx_l2x0_init(void) {} ++#endif /* CONFIG_CACHE_L2X0 */ ++ + void __init cns3xxx_map_io(void); + void __init cns3xxx_init_irq(void); + void cns3xxx_power_off(void); +--- a/arch/arm/mm/Kconfig ++++ b/arch/arm/mm/Kconfig +@@ -821,7 +821,7 @@ config CACHE_L2X0 + 	depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \ + 		   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \ + 		   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \ +-		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE ++		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || ARCH_CNS3XXX + 	default y + 	select OUTER_CACHE + 	select OUTER_CACHE_SYNC diff --git a/target/linux/cns3xxx/patches-3.0/049-cns3xxx_smp_support.patch b/target/linux/cns3xxx/patches-3.0/049-cns3xxx_smp_support.patch index df428caf7..07516ac01 100644 --- a/target/linux/cns3xxx/patches-3.0/049-cns3xxx_smp_support.patch +++ b/target/linux/cns3xxx/patches-3.0/049-cns3xxx_smp_support.patch @@ -185,6 +185,16 @@  +	 */  +	return cpu == 0 ? -EPERM : 0;  +} +--- a/arch/arm/mach-cns3xxx/Kconfig ++++ b/arch/arm/mach-cns3xxx/Kconfig +@@ -3,6 +3,7 @@ menu "CNS3XXX platform type" +  + config MACH_CNS3420VB + 	bool "Support for CNS3420 Validation Board" ++	select HAVE_ARM_SCU if SMP + 	select MIGHT_HAVE_PCI + 	help + 	  Include support for the Cavium Networks CNS3420 MPCore Platform  --- /dev/null  +++ b/arch/arm/mach-cns3xxx/localtimer.c  @@ -0,0 +1,26 @@ @@ -394,7 +404,7 @@  +}  --- a/arch/arm/Kconfig  +++ b/arch/arm/Kconfig -@@ -1312,7 +1312,7 @@ config SMP +@@ -1313,7 +1313,7 @@ config SMP   	depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \   		 MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \   		 ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ diff --git a/target/linux/cns3xxx/patches-3.0/053-cns3xxx_wdt.patch b/target/linux/cns3xxx/patches-3.0/053-cns3xxx_wdt.patch deleted file mode 100644 index 85a73ab1d..000000000 --- a/target/linux/cns3xxx/patches-3.0/053-cns3xxx_wdt.patch +++ /dev/null @@ -1,77 +0,0 @@ ---- a/drivers/watchdog/Kconfig -+++ b/drivers/watchdog/Kconfig -@@ -188,7 +188,7 @@ config SA1100_WATCHDOG -  - config MPCORE_WATCHDOG - 	tristate "MPcore watchdog" --	depends on HAVE_ARM_TWD -+	depends on ARCH_CNS3XXX - 	help - 	  Watchdog timer embedded into the MPcore system. -  ---- a/drivers/watchdog/mpcore_wdt.c -+++ b/drivers/watchdog/mpcore_wdt.c -@@ -32,11 +32,14 @@ - #include <linux/uaccess.h> - #include <linux/slab.h> - #include <linux/io.h> -+#include <linux/jiffies.h> -+#include <linux/delay.h> -  - #include <asm/smp_twd.h> -  - struct mpcore_wdt { - 	unsigned long	timer_alive; -+	unsigned long	timer_rate; - 	struct device	*dev; - 	void __iomem	*base; - 	int		irq; -@@ -98,14 +101,12 @@ static void mpcore_wdt_keepalive(struct - 	unsigned long count; -  - 	spin_lock(&wdt_lock); --	/* Assume prescale is set to 256 */ --	count =  __raw_readl(wdt->base + TWD_WDOG_COUNTER); --	count = (0xFFFFFFFFU - count) * (HZ / 5); --	count = (count / 256) * mpcore_margin; -+	count = (wdt->timer_rate / 256) * mpcore_margin; -  - 	/* Reload the counter */ - 	writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); - 	wdt->perturb = wdt->perturb ? 0 : 1; -+ - 	spin_unlock(&wdt_lock); - } -  -@@ -329,6 +330,8 @@ static int __devinit mpcore_wdt_probe(st - 	struct mpcore_wdt *wdt; - 	struct resource *res; - 	int ret; -+	unsigned long count; -+	u64 waitjiffies; -  - 	/* We only accept one device, and it must have an id of -1 */ - 	if (dev->id != -1) -@@ -375,6 +378,22 @@ static int __devinit mpcore_wdt_probe(st - 		goto err_irq; - 	} -  -+	waitjiffies = get_jiffies_64() + 1; -+	while (get_jiffies_64() < waitjiffies) -+		udelay(10); -+ -+	waitjiffies += 5; -+ -+	__raw_writel(0x00000001, wdt->base + TWD_WDOG_CONTROL); -+	__raw_writel(0xFFFFFFFFU, wdt->base + TWD_WDOG_LOAD); -+ -+	while (get_jiffies_64() < waitjiffies) -+		udelay(10); -+ -+	count =  __raw_readl(wdt->base + TWD_WDOG_COUNTER); -+ -+	wdt->timer_rate = (0xFFFFFFFFU - count) * (HZ / 5); -+ - 	mpcore_wdt_stop(wdt); - 	platform_set_drvdata(dev, wdt); - 	mpcore_wdt_dev = dev; diff --git a/target/linux/cns3xxx/patches-3.0/100-laguna_support.patch b/target/linux/cns3xxx/patches-3.0/100-laguna_support.patch index b0399db4b..a7f9938f6 100644 --- a/target/linux/cns3xxx/patches-3.0/100-laguna_support.patch +++ b/target/linux/cns3xxx/patches-3.0/100-laguna_support.patch @@ -555,23 +555,24 @@  + * Watchdog  + */  + -+static struct resource laguna_watchdog_resource[] = { -+	{ -+		.start = CNS3XXX_TC11MP_TWD_BASE, -+		.end = CNS3XXX_TC11MP_TWD_BASE + SZ_4K - 1, -+		.flags = IORESOURCE_MEM, -+	},{ -+		.start = IRQ_LOCALWDOG, -+		.end = IRQ_LOCALWDOG, -+		.flags = IORESOURCE_IRQ, ++static struct resource laguna_watchdog_resources[] = { ++	[0] = { ++		.start	= CNS3XXX_TC11MP_TWD_BASE, ++		.end	= CNS3XXX_TC11MP_TWD_BASE + SZ_4K - 1, ++		.flags	= IORESOURCE_MEM, ++	}, ++	[1] = { ++		.start	= IRQ_LOCALWDOG, ++		.end	= IRQ_LOCALWDOG, ++		.flags	= IORESOURCE_IRQ,  +	}  +};  +  +static struct platform_device laguna_watchdog = { -+	.name = "mpcore_wdt", -+	.id = -1, -+	.num_resources = ARRAY_SIZE(laguna_watchdog_resource), -+	.resource = laguna_watchdog_resource, ++	.name		= "mpcore_wdt", ++	.id		= -1, ++	.num_resources	= ARRAY_SIZE(laguna_watchdog_resources), ++	.resource	= laguna_watchdog_resources,  +};  +  +/* @@ -580,6 +581,8 @@  +  +static void __init laguna_init(void)  +{ ++	cns3xxx_l2x0_init(); ++  +	platform_device_register(&laguna_watchdog);  +  +	platform_device_register(&laguna_i2c_controller); @@ -587,7 +590,6 @@  +	i2c_register_board_info(0, laguna_i2c_devices,  +			ARRAY_SIZE(laguna_i2c_devices));  + -+  +	pm_power_off = cns3xxx_power_off;  +}  + @@ -614,11 +616,9 @@  +{  +	cns3xxx_map_io();  +	iotable_init(laguna_io_desc, ARRAY_SIZE(laguna_io_desc)); -+  +	laguna_early_serial_setup();  +}  + -+  +static int __init laguna_model_setup(void)  +{  +	u32 __iomem *mem; @@ -764,12 +764,13 @@  +MACHINE_END  --- a/arch/arm/mach-cns3xxx/Kconfig  +++ b/arch/arm/mach-cns3xxx/Kconfig -@@ -10,4 +10,13 @@ config MACH_CNS3420VB +@@ -11,4 +11,14 @@ config MACH_CNS3420VB   	  This is a platform with an on-board ARM11 MPCore and has support   	  for USB, USB-OTG, MMC/SD/SDIO, SATA, PCI-E, etc.  +config MACH_GW2388  +	bool "Support for Gateworks Laguna Platform" ++	select HAVE_ARM_SCU if SMP  +	select MIGHT_HAVE_PCI  +	help  +	  Include support for the Gateworks Laguna Platform @@ -785,10 +786,10 @@   #include <asm/mach/irq.h>   #include <asm/hardware/gic.h>  +#include <asm/smp_twd.h> + #include <asm/hardware/cache-l2x0.h>   #include <mach/cns3xxx.h>   #include "core.h" -  -@@ -60,11 +61,24 @@ static struct map_desc cns3xxx_io_desc[] +@@ -61,11 +62,24 @@ static struct map_desc cns3xxx_io_desc[]   		.pfn		= __phys_to_pfn(CNS3XXX_PM_BASE),   		.length		= SZ_4K,   		.type		= MT_DEVICE, @@ -962,7 +963,7 @@  -device_initcall(cns3xxx_pcie_init);  --- a/arch/arm/mach-cns3xxx/cns3420vb.c  +++ b/arch/arm/mach-cns3xxx/cns3420vb.c -@@ -175,6 +175,8 @@ static void __init cns3420_init(void) +@@ -199,6 +199,8 @@ static void __init cns3420_init(void)   	cns3xxx_ahci_init();   	cns3xxx_sdhci_init(); diff --git a/target/linux/cns3xxx/patches-3.0/102-cns3xxx_timers.patch b/target/linux/cns3xxx/patches-3.0/102-cns3xxx_timers.patch index c99d0e9fb..dddb85a4d 100644 --- a/target/linux/cns3xxx/patches-3.0/102-cns3xxx_timers.patch +++ b/target/linux/cns3xxx/patches-3.0/102-cns3xxx_timers.patch @@ -1,6 +1,6 @@  --- a/arch/arm/mach-cns3xxx/core.c  +++ b/arch/arm/mach-cns3xxx/core.c -@@ -117,12 +117,13 @@ static void cns3xxx_timer_set_mode(enum +@@ -118,12 +118,13 @@ static void cns3xxx_timer_set_mode(enum   	switch (mode) {   	case CLOCK_EVT_MODE_PERIODIC: @@ -15,7 +15,7 @@   		ctrl |= (1 << 2) | (1 << 9);   		break;   	case CLOCK_EVT_MODE_UNUSED: -@@ -147,11 +148,11 @@ static int cns3xxx_timer_set_next_event( +@@ -148,11 +149,11 @@ static int cns3xxx_timer_set_next_event(   static struct clock_event_device cns3xxx_tmr1_clockevent = {   	.name		= "cns3xxx timer1", @@ -29,7 +29,7 @@   	.cpumask	= cpu_all_mask,   }; -@@ -193,6 +194,35 @@ static struct irqaction cns3xxx_timer_ir +@@ -194,6 +195,35 @@ static struct irqaction cns3xxx_timer_ir   	.handler	= cns3xxx_timer_interrupt,   }; @@ -65,7 +65,7 @@   /*    * Set up the clock source and clock events devices    */ -@@ -210,13 +240,12 @@ static void __init __cns3xxx_timer_init( +@@ -211,13 +241,12 @@ static void __init __cns3xxx_timer_init(   	/* stop free running timer3 */   	writel(0, cns3xxx_tmr1 + TIMER_FREERUN_CONTROL_OFFSET); @@ -82,7 +82,7 @@   	/* mask irq, non-mask timer1 overflow */   	irq_mask = readl(cns3xxx_tmr1 + TIMER1_2_INTERRUPT_MASK_OFFSET);   	irq_mask &= ~(1 << 2); -@@ -228,23 +257,9 @@ static void __init __cns3xxx_timer_init( +@@ -229,23 +258,9 @@ static void __init __cns3xxx_timer_init(   	val |= (1 << 9);   	writel(val, cns3xxx_tmr1 + TIMER1_2_CONTROL_OFFSET); diff --git a/target/linux/cns3xxx/patches-3.0/103-cns3xxx_l2cache.patch b/target/linux/cns3xxx/patches-3.0/103-cns3xxx_l2cache.patch deleted file mode 100644 index 27d4b5211..000000000 --- a/target/linux/cns3xxx/patches-3.0/103-cns3xxx_l2cache.patch +++ /dev/null @@ -1,61 +0,0 @@ ---- a/arch/arm/mach-cns3xxx/core.c -+++ b/arch/arm/mach-cns3xxx/core.c -@@ -15,6 +15,7 @@ - #include <asm/mach/map.h> - #include <asm/mach/time.h> - #include <asm/mach/irq.h> -+#include <asm/hardware/cache-l2x0.h> - #include <asm/hardware/gic.h> - #include <asm/smp_twd.h> - #include <mach/cns3xxx.h> -@@ -71,15 +72,29 @@ static struct map_desc cns3xxx_io_desc[] - 		.pfn		= __phys_to_pfn(CNS3XXX_SSP_BASE), - 		.length		= SZ_4K, - 		.type		= MT_DEVICE, -+	}, { -+		.virtual	= CNS3XXX_L2C_BASE_VIRT, -+		.pfn		= __phys_to_pfn(CNS3XXX_L2C_BASE), -+		.length		= SZ_4K, -+		.type		= MT_DEVICE, - 	}, - }; -  - void __init cns3xxx_map_io(void) - { -+	iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc)); -+#ifdef CONFIG_CACHE_L2X0 -+	void __iomem *l2x0_base = (void __iomem *) CNS3XXX_L2C_BASE_VIRT; -+ -+	/* set RAM latencies to 1 cycle for this core tile. */ -+	writel(0, l2x0_base + L2X0_TAG_LATENCY_CTRL); -+	writel(0, l2x0_base + L2X0_DATA_LATENCY_CTRL); -+ -+	l2x0_init(l2x0_base, 0x00400000, 0xfe0fffff); -+#endif - #ifdef CONFIG_LOCAL_TIMERS - 	twd_base = (void __iomem *) CNS3XXX_TC11MP_TWD_BASE_VIRT; - #endif --	iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc)); - } -  - /* used by entry-macro.S */ ---- a/arch/arm/mm/Kconfig -+++ b/arch/arm/mm/Kconfig -@@ -821,7 +821,7 @@ config CACHE_L2X0 - 	depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \ - 		   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \ - 		   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \ --		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE -+		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || ARCH_CNS3XXX - 	default y - 	select OUTER_CACHE - 	select OUTER_CACHE_SYNC -@@ -866,7 +866,7 @@ config ARM_L1_CACHE_SHIFT - config ARM_DMA_MEM_BUFFERABLE - 	bool "Use non-cacheable memory for DMA" if (CPU_V6 || CPU_V6K) && !CPU_V7 - 	depends on !(MACH_REALVIEW_PB1176 || REALVIEW_EB_ARM11MP || \ --		     MACH_REALVIEW_PB11MP) -+		     MACH_REALVIEW_PB11MP || ARCH_CNS3XXX) - 	default y if CPU_V6 || CPU_V6K || CPU_V7 - 	help - 	  Historically, the kernel has used strongly ordered mappings to diff --git a/target/linux/cns3xxx/patches-3.0/104-cns3xxx_gpio.patch b/target/linux/cns3xxx/patches-3.0/104-cns3xxx_gpio.patch index d7d09ff42..8b656965f 100644 --- a/target/linux/cns3xxx/patches-3.0/104-cns3xxx_gpio.patch +++ b/target/linux/cns3xxx/patches-3.0/104-cns3xxx_gpio.patch @@ -1,6 +1,6 @@  --- a/arch/arm/mach-cns3xxx/cns3420vb.c  +++ b/arch/arm/mach-cns3xxx/cns3420vb.c -@@ -191,7 +191,7 @@ static struct map_desc cns3420_io_desc[] +@@ -215,7 +215,7 @@ static struct map_desc cns3420_io_desc[]   static void __init cns3420_map_io(void)   { @@ -12,14 +12,14 @@  --- a/arch/arm/mach-cns3xxx/core.c  +++ b/arch/arm/mach-cns3xxx/core.c  @@ -18,6 +18,7 @@ - #include <asm/hardware/cache-l2x0.h>   #include <asm/hardware/gic.h>   #include <asm/smp_twd.h> + #include <asm/hardware/cache-l2x0.h>  +#include <asm/gpio.h>   #include <mach/cns3xxx.h>   #include "core.h" -@@ -80,7 +81,89 @@ static struct map_desc cns3xxx_io_desc[] +@@ -75,12 +76,96 @@ static struct map_desc cns3xxx_io_desc[]   	},   }; @@ -108,21 +108,20 @@  +  +void __init cns3xxx_common_init(void)   { - 	iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc)); - #ifdef CONFIG_CACHE_L2X0 -@@ -95,6 +178,7 @@ void __init cns3xxx_map_io(void)   #ifdef CONFIG_LOCAL_TIMERS   	twd_base = (void __iomem *) CNS3XXX_TC11MP_TWD_BASE_VIRT;   #endif + 	iotable_init(cns3xxx_io_desc, ARRAY_SIZE(cns3xxx_io_desc)); ++  +	gpiochip_add(&cns3xxx_gpio_chip);   }   /* used by entry-macro.S */  --- a/arch/arm/mach-cns3xxx/core.h  +++ b/arch/arm/mach-cns3xxx/core.h -@@ -13,7 +13,7 @@ -  - extern struct sys_timer cns3xxx_timer; +@@ -19,7 +19,7 @@ void __init cns3xxx_l2x0_init(void); + static inline void cns3xxx_l2x0_init(void) {} + #endif /* CONFIG_CACHE_L2X0 */  -void __init cns3xxx_map_io(void);  +void __init cns3xxx_common_init(void); @@ -131,12 +130,12 @@  --- a/arch/arm/mach-cns3xxx/laguna.c  +++ b/arch/arm/mach-cns3xxx/laguna.c -@@ -609,7 +609,7 @@ static struct map_desc laguna_io_desc[] +@@ -611,7 +611,7 @@ static struct map_desc laguna_io_desc[]   static void __init laguna_map_io(void)   {  -	cns3xxx_map_io();  +	cns3xxx_common_init();   	iotable_init(laguna_io_desc, ARRAY_SIZE(laguna_io_desc)); -    	laguna_early_serial_setup(); + } diff --git a/target/linux/cns3xxx/patches-3.0/105-cns3xxx_pcie_io.patch b/target/linux/cns3xxx/patches-3.0/105-cns3xxx_pcie_io.patch index da8d0a9ad..6c6d268a9 100644 --- a/target/linux/cns3xxx/patches-3.0/105-cns3xxx_pcie_io.patch +++ b/target/linux/cns3xxx/patches-3.0/105-cns3xxx_pcie_io.patch @@ -1,7 +1,7 @@  --- a/arch/arm/mach-cns3xxx/core.c  +++ b/arch/arm/mach-cns3xxx/core.c -@@ -78,6 +78,16 @@ static struct map_desc cns3xxx_io_desc[] - 		.pfn		= __phys_to_pfn(CNS3XXX_L2C_BASE), +@@ -73,6 +73,16 @@ static struct map_desc cns3xxx_io_desc[] + 		.pfn		= __phys_to_pfn(CNS3XXX_SSP_BASE),   		.length		= SZ_4K,   		.type		= MT_DEVICE,  +	}, { @@ -17,7 +17,7 @@   	},   }; -@@ -184,13 +194,13 @@ void __init cns3xxx_common_init(void) +@@ -171,13 +181,13 @@ void __init cns3xxx_common_init(void)   /* used by entry-macro.S */   void __init cns3xxx_init_irq(void)   { @@ -34,7 +34,7 @@   	u32 clkctrl;   	printk(KERN_INFO "powering system down...\n"); -@@ -364,7 +374,7 @@ static void __init __cns3xxx_timer_init( +@@ -351,7 +361,7 @@ static void __init __cns3xxx_timer_init(   static void __init cns3xxx_timer_init(void)   { | 
