All of lore.kernel.org
 help / color / mirror / Atom feed
* (no subject)
@ 2009-04-14  9:41 Johannes Weiner
  2009-04-14  9:41 ` [patch 01/12] xtensa: always use correct stack pointer for stack traces Johannes Weiner
                   ` (12 more replies)
  0 siblings, 13 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel

Hi Andrew,

these are fixes and dependency patches for xtensa code in mainline and
your tree that came in during this merge window.

Thanks,
	Hannes


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [patch 01/12] xtensa: always use correct stack pointer for stack traces
  2009-04-14  9:41 Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 02/12] xtensa: register gpio chip before use Johannes Weiner
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel

Commit '28a0ce7 xtensa: use correct stack pointer for stack traces'
changed the stack tracer from always reading the stack pointer
register to always using the saved value in the task descriptor.

The author was too dense to consider the fact that the saved stack
value is stale for a running process und thus unusable for 'current'.

What we do now is to use the stack pointer register (a1) for when the
task is unknown - we can't help it then - or when the task is
'current'.  For everything else use the saved stack pointer value
contained in the task descriptor.

Signed-off-by: Johannes Weiner <jw@emlix.com>
---
 arch/xtensa/kernel/traps.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c
index 9f0b711..ba9ab93 100644
--- a/arch/xtensa/kernel/traps.c
+++ b/arch/xtensa/kernel/traps.c
@@ -369,6 +369,18 @@ void show_regs(struct pt_regs * regs)
 		       regs->syscall);
 }
 
+static __always_inline unsigned long *stack_pointer(struct task_struct *task)
+{
+	unsigned long *sp;
+
+	if (!task || task == current)
+		__asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp));
+	else
+		sp = (unsigned long *)task->thread.sp;
+
+	return sp;
+}
+
 void show_trace(struct task_struct *task, unsigned long *sp)
 {
 	unsigned long a0, a1, pc;
@@ -377,7 +389,7 @@ void show_trace(struct task_struct *task, unsigned long *sp)
 	if (sp)
 		a1 = (unsigned long)sp;
 	else
-		a1 = task->thread.sp;
+		a1 = (unsigned long)stack_pointer(task);
 
 	sp_start = a1 & ~(THREAD_SIZE-1);
 	sp_end = sp_start + THREAD_SIZE;
@@ -420,7 +432,7 @@ void show_stack(struct task_struct *task, unsigned long *sp)
 	unsigned long *stack;
 
 	if (!sp)
-		sp = (unsigned long *)task->thread.sp;
+		sp = stack_pointer(task);
  	stack = sp;
 
 	printk("\nStack: ");
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 02/12] xtensa: register gpio chip before use
  2009-04-14  9:41 Johannes Weiner
  2009-04-14  9:41 ` [patch 01/12] xtensa: always use correct stack pointer for stack traces Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 03/12] xtensa: fix wrong extern declaration renamed in code using it Johannes Weiner
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel

Platform initialization sets up the LED heartbeat that is controlled
via GPIO.  Requesting the GPIO pins fails, however, as the chip is
only initialized later by a device_initcall().

Fix this up by exporting the initialization function.  Let the
platform set up the chip before it starts using it.

Signed-off-by: Johannes Weiner <jw@emlix.com>
---
 arch/xtensa/platforms/s6105/setup.c               |    3 +++
 arch/xtensa/variants/s6000/gpio.c                 |    3 +--
 arch/xtensa/variants/s6000/include/variant/gpio.h |    6 ++++++
 3 files changed, 10 insertions(+), 2 deletions(-)
 create mode 100644 arch/xtensa/variants/s6000/include/variant/gpio.h

diff --git a/arch/xtensa/platforms/s6105/setup.c b/arch/xtensa/platforms/s6105/setup.c
index ae041d5..855ddea 100644
--- a/arch/xtensa/platforms/s6105/setup.c
+++ b/arch/xtensa/platforms/s6105/setup.c
@@ -10,6 +10,8 @@
 #include <asm/bootparam.h>
 
 #include <variant/hardware.h>
+#include <variant/gpio.h>
+
 #include <platform/gpio.h>
 
 void platform_halt(void)
@@ -47,6 +49,7 @@ void __init platform_setup(char **cmdline)
 
 void __init platform_init(bp_tag_t *first)
 {
+	s6_gpio_init();
 	gpio_request(GPIO_LED1_NGREEN, "led1_green");
 	gpio_request(GPIO_LED1_RED, "led1_red");
 	gpio_direction_output(GPIO_LED1_NGREEN, 1);
diff --git a/arch/xtensa/variants/s6000/gpio.c b/arch/xtensa/variants/s6000/gpio.c
index 33a8d95..79317fd 100644
--- a/arch/xtensa/variants/s6000/gpio.c
+++ b/arch/xtensa/variants/s6000/gpio.c
@@ -64,8 +64,7 @@ static struct gpio_chip gpiochip = {
 	.exported = 0, /* no exporting to userspace */
 };
 
-static int gpio_init(void)
+int s6_gpio_init(void)
 {
 	return gpiochip_add(&gpiochip);
 }
-device_initcall(gpio_init);
diff --git a/arch/xtensa/variants/s6000/include/variant/gpio.h b/arch/xtensa/variants/s6000/include/variant/gpio.h
new file mode 100644
index 0000000..8327f62
--- /dev/null
+++ b/arch/xtensa/variants/s6000/include/variant/gpio.h
@@ -0,0 +1,6 @@
+#ifndef _XTENSA_VARIANT_S6000_GPIO_H
+#define _XTENSA_VARIANT_S6000_GPIO_H
+
+extern int s6_gpio_init(void);
+
+#endif /* _XTENSA_VARIANT_S6000_GPIO_H */
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 03/12] xtensa: fix wrong extern declaration renamed in code using it
  2009-04-14  9:41 Johannes Weiner
  2009-04-14  9:41 ` [patch 01/12] xtensa: always use correct stack pointer for stack traces Johannes Weiner
  2009-04-14  9:41 ` [patch 02/12] xtensa: register gpio chip before use Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 04/12] xtensa: implement ccount calibration for s6000 Johannes Weiner
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Oskar Schirmer

From: Oskar Schirmer <os@emlix.com>

The variable ccount_nsec has been renamed to nsec_per_ccount
in arch/xtensa/kernel/time.c in 2b8aea74 (2007-08-05),
but the fix failed to rename the variable in
arch/xtensa/include/asm/timex.h as well.

Signed-off-by: Oskar Schirmer <os@emlix.com>
---
 arch/xtensa/include/asm/timex.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/include/asm/timex.h b/arch/xtensa/include/asm/timex.h
index b83a818..053bc42 100644
--- a/arch/xtensa/include/asm/timex.h
+++ b/arch/xtensa/include/asm/timex.h
@@ -39,9 +39,9 @@
 
 #ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT
 extern unsigned long ccount_per_jiffy;
-extern unsigned long ccount_nsec;
+extern unsigned long nsec_per_ccount;
 #define CCOUNT_PER_JIFFY ccount_per_jiffy
-#define NSEC_PER_CCOUNT  ccount_nsec
+#define NSEC_PER_CCOUNT  nsec_per_ccount
 #else
 #define CCOUNT_PER_JIFFY (CONFIG_XTENSA_CPU_CLOCK*(1000000UL/HZ))
 #define NSEC_PER_CCOUNT (1000UL / CONFIG_XTENSA_CPU_CLOCK)
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 04/12] xtensa: implement ccount calibration for s6000
  2009-04-14  9:41 Johannes Weiner
                   ` (2 preceding siblings ...)
  2009-04-14  9:41 ` [patch 03/12] xtensa: fix wrong extern declaration renamed in code using it Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 05/12] xtensa: update s6105_defconfig for ccount calibration Johannes Weiner
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Oskar Schirmer

From: Oskar Schirmer <os@emlix.com>

Calculate core frequency from timers at boot time
instead of assuming a fixed frequency. This is
useful as the true frequency is set up by the
boot loader, thus variable.

Signed-off-by: Oskar Schirmer <os@emlix.com>
---
 arch/xtensa/Kconfig                 |    1 +
 arch/xtensa/variants/s6000/Makefile |    1 +
 arch/xtensa/variants/s6000/delay.c  |   27 +++++++++++++++++++++++++++
 3 files changed, 29 insertions(+), 0 deletions(-)
 create mode 100644 arch/xtensa/variants/s6000/delay.c

diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index fa6dc4d..ac02f3c 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -80,6 +80,7 @@ config XTENSA_VARIANT_S6000
 	bool "s6000 - Stretch software configurable processor"
 	select VARIANT_IRQ_SWITCH
 	select ARCH_REQUIRE_GPIOLIB
+	select XTENSA_CALIBRATE_CCOUNT
 endchoice
 
 config XTENSA_UNALIGNED_USER
diff --git a/arch/xtensa/variants/s6000/Makefile b/arch/xtensa/variants/s6000/Makefile
index 03b3975..d83f380 100644
--- a/arch/xtensa/variants/s6000/Makefile
+++ b/arch/xtensa/variants/s6000/Makefile
@@ -1,3 +1,4 @@
 # s6000 Makefile
 
 obj-y		+= irq.o gpio.o
+obj-$(CONFIG_XTENSA_CALIBRATE_CCOUNT)	+= delay.o
diff --git a/arch/xtensa/variants/s6000/delay.c b/arch/xtensa/variants/s6000/delay.c
new file mode 100644
index 0000000..54b2b57
--- /dev/null
+++ b/arch/xtensa/variants/s6000/delay.c
@@ -0,0 +1,27 @@
+#include <asm/delay.h>
+#include <asm/timex.h>
+#include <asm/io.h>
+#include <variant/hardware.h>
+
+#define LOOPS 10
+void platform_calibrate_ccount(void)
+{
+	u32 uninitialized_var(a);
+	u32 uninitialized_var(u);
+	u32 b;
+	u32 tstamp = S6_REG_GREG1 + S6_GREG1_GLOBAL_TIMER;
+	int i = LOOPS+1;
+	do {
+		u32 t = u;
+		asm volatile(
+		"1:	l32i %0, %2, 0 ;"
+		"	beq %0, %1, 1b ;"
+		: "=&a"(u) : "a"(t), "a"(tstamp));
+		b = xtensa_get_ccount();
+		if (i == LOOPS)
+			a = b;
+	} while (--i >= 0);
+	b -= a;
+	nsec_per_ccount = (LOOPS * 10000) / b;
+	ccount_per_jiffy = b * (100000UL / (LOOPS * HZ));
+}
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 05/12] xtensa: update s6105_defconfig for ccount calibration
  2009-04-14  9:41 Johannes Weiner
                   ` (3 preceding siblings ...)
  2009-04-14  9:41 ` [patch 04/12] xtensa: implement ccount calibration for s6000 Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 06/12] xtensa: implement CLK API Johannes Weiner
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Oskar Schirmer

From: Oskar Schirmer <os@emlix.com>

The previous patch enabled ccount calibration for the s6000 variant.
This patch updates the defconfig for the s6105 platform to reflect this
change.

Signed-off-by: Oskar Schirmer <os@emlix.com>
---
 arch/xtensa/configs/s6105_defconfig |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/configs/s6105_defconfig b/arch/xtensa/configs/s6105_defconfig
index 6e1deff..768bee0 100644
--- a/arch/xtensa/configs/s6105_defconfig
+++ b/arch/xtensa/configs/s6105_defconfig
@@ -115,7 +115,7 @@ CONFIG_XTENSA_VARIANT_S6000=y
 CONFIG_PREEMPT=y
 # CONFIG_MATH_EMULATION is not set
 # CONFIG_HIGHMEM is not set
-# CONFIG_XTENSA_CALIBRATE_CCOUNT is not set
+CONFIG_XTENSA_CALIBRATE_CCOUNT=y
 CONFIG_SERIAL_CONSOLE=y
 # CONFIG_XTENSA_ISS_NETWORK is not set
 
@@ -131,7 +131,6 @@ CONFIG_SERIAL_CONSOLE=y
 # CONFIG_XTENSA_PLATFORM_ISS is not set
 # CONFIG_XTENSA_PLATFORM_XT2000 is not set
 CONFIG_XTENSA_PLATFORM_S6105=y
-CONFIG_XTENSA_CPU_CLOCK=300
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="console=ttyS1,38400 debug bootmem_debug loglevel=7"
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 06/12] xtensa: implement CLK API
  2009-04-14  9:41 Johannes Weiner
                   ` (4 preceding siblings ...)
  2009-04-14  9:41 ` [patch 05/12] xtensa: update s6105_defconfig for ccount calibration Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 07/12] xtensa: implement PTRACE_PEEKUSER addresses for nommu Johannes Weiner
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Daniel Glöckner

From: Daniel Glöckner <dg@emlix.com>

Implement access to the peripheral clock (half of cpu clock) by means
of the generic CLK API.

Signed-off-by: Daniel Glöckner <dg@emlix.com>
---
 arch/xtensa/platforms/s6105/Makefile |    2 +-
 arch/xtensa/platforms/s6105/clocks.c |   49 ++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletions(-)
 create mode 100644 arch/xtensa/platforms/s6105/clocks.c

diff --git a/arch/xtensa/platforms/s6105/Makefile b/arch/xtensa/platforms/s6105/Makefile
index 0be6194..294427b 100644
--- a/arch/xtensa/platforms/s6105/Makefile
+++ b/arch/xtensa/platforms/s6105/Makefile
@@ -1,3 +1,3 @@
 # Makefile for the Stretch S6105 eval board
 
-obj-y		:= setup.o device.o
+obj-y		:= setup.o device.o clocks.o
diff --git a/arch/xtensa/platforms/s6105/clocks.c b/arch/xtensa/platforms/s6105/clocks.c
new file mode 100644
index 0000000..fcd3bad
--- /dev/null
+++ b/arch/xtensa/platforms/s6105/clocks.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2009 emlix GmbH
+ * Author:	Daniel Gloeckner <dg@emlix.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <asm/param.h>
+#include <asm/timex.h>
+
+struct clk {
+	unsigned long rate;
+};
+
+static struct clk pclk;
+
+struct clk *clk_get(struct device *dev, const char *id)
+{
+	if (!strcmp(id, "PCLK")) {
+		pclk.rate = CCOUNT_PER_JIFFY * HZ / 2;
+		return &pclk;
+	}
+	return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL(clk_get);
+
+int clk_enable(struct clk *clk)
+{
+	return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+void clk_disable(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+	return clk->rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+void clk_put(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_put);
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 07/12] xtensa: implement PTRACE_PEEKUSER addresses for nommu
  2009-04-14  9:41 Johannes Weiner
                   ` (5 preceding siblings ...)
  2009-04-14  9:41 ` [patch 06/12] xtensa: implement CLK API Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 08/12] xtensa: s6000 dma engine support Johannes Weiner
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Daniel Glöckner

From: Daniel Glöckner <dg@emlix.com>

On nommu gdbserver needs to be able to look up where the currently
debugged application has been relocated. Based on the Blackfin
implementation, this introduces three "addresses" PT_TEXT_ADDR,
PT_DATA_ADDR, and PT_TEXT_END_ADDR for PTRACE_PEEKUSER.

Signed-off-by: Daniel Glöckner <dg@emlix.com>
---
 arch/xtensa/include/asm/ptrace.h |    4 ++++
 arch/xtensa/kernel/ptrace.c      |   12 ++++++++++++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/arch/xtensa/include/asm/ptrace.h b/arch/xtensa/include/asm/ptrace.h
index 905e1e6..8f4fbf3 100644
--- a/arch/xtensa/include/asm/ptrace.h
+++ b/arch/xtensa/include/asm/ptrace.h
@@ -66,6 +66,10 @@
 
 #define SYSCALL_NR	0x00ff
 
+#define PT_TEXT_ADDR	0x0300
+#define PT_DATA_ADDR	0x0301
+#define PT_TEXT_END_ADDR	0x0302
+
 /* Other PTRACE_ values defined in <linux/ptrace.h> using values 0-9,16,17,24 */
 
 #define PTRACE_GETREGS		12
diff --git a/arch/xtensa/kernel/ptrace.c b/arch/xtensa/kernel/ptrace.c
index 9486882..82f3620 100644
--- a/arch/xtensa/kernel/ptrace.c
+++ b/arch/xtensa/kernel/ptrace.c
@@ -211,6 +211,18 @@ int ptrace_peekusr(struct task_struct *child, long regno, long __user *ret)
 			tmp = regs->syscall;
 			break;
 
+		case PT_TEXT_ADDR:
+			tmp = child->mm->start_code;
+			break;
+
+		case PT_DATA_ADDR:
+			tmp = child->mm->start_data;
+			break;
+
+		case PT_TEXT_END_ADDR:
+			tmp = child->mm->end_code;
+			break;
+
 		default:
 			return -EIO;
 	}
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 08/12] xtensa: s6000 dma engine support
  2009-04-14  9:41 Johannes Weiner
                   ` (6 preceding siblings ...)
  2009-04-14  9:41 ` [patch 07/12] xtensa: implement PTRACE_PEEKUSER addresses for nommu Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 09/12] xtensa: allow platform and variant to initialize own irq chips Johannes Weiner
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Chris Zankel, linux-kernel, Oskar Schirmer, Daniel Glöckner,
	Fabian Godehardt

From: Oskar Schirmer <os@emlix.com>

There are four slightly different dma engines on the s6000 family.
One for memory-memory transfers, the other three for memory-device.

This patch implements a platform-specific kernel-API to control these
engines.  It is needed for the network, video, audio peripherals on
s6000.

Signed-off-by: Oskar Schirmer <os@emlix.com>
Signed-off-by: Daniel Glöckner <dg@emlix.com>
Signed-off-by: Fabian Godehardt <fg@emlix.com>
---
 arch/xtensa/variants/s6000/Makefile               |    2 +-
 arch/xtensa/variants/s6000/dmac.c                 |  174 +++++++++
 arch/xtensa/variants/s6000/include/variant/dmac.h |  387 +++++++++++++++++++++
 3 files changed, 562 insertions(+), 1 deletions(-)
 create mode 100644 arch/xtensa/variants/s6000/dmac.c
 create mode 100644 arch/xtensa/variants/s6000/include/variant/dmac.h

diff --git a/arch/xtensa/variants/s6000/Makefile b/arch/xtensa/variants/s6000/Makefile
index d83f380..3e7ef0a 100644
--- a/arch/xtensa/variants/s6000/Makefile
+++ b/arch/xtensa/variants/s6000/Makefile
@@ -1,4 +1,4 @@
 # s6000 Makefile
 
-obj-y		+= irq.o gpio.o
+obj-y		+= irq.o gpio.o dmac.o
 obj-$(CONFIG_XTENSA_CALIBRATE_CCOUNT)	+= delay.o
diff --git a/arch/xtensa/variants/s6000/dmac.c b/arch/xtensa/variants/s6000/dmac.c
new file mode 100644
index 0000000..d658a48
--- /dev/null
+++ b/arch/xtensa/variants/s6000/dmac.c
@@ -0,0 +1,174 @@
+/*
+ * Authors:	Oskar Schirmer <os@emlix.com>
+ *		Daniel Gloeckner <dg@emlix.com>
+ * (c) 2008 emlix GmbH http://www.emlix.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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/spinlock.h>
+#include <asm/cacheflush.h>
+#include <variant/dmac.h>
+
+/* DMA engine lookup */
+
+struct s6dmac_ctrl s6dmac_ctrl[S6_DMAC_NB];
+
+
+/* DMA control, per engine */
+
+void s6dmac_put_fifo_cache(u32 dmac, int chan, u32 src, u32 dst, u32 size)
+{
+	if (xtensa_need_flush_dma_source(src)) {
+		u32 base = src;
+		u32 span = size;
+		u32 chunk = readl(DMA_CHNL(dmac, chan) + S6_DMA_CMONCHUNK);
+		if (chunk && (size > chunk)) {
+			s32 skip =
+				readl(DMA_CHNL(dmac, chan) + S6_DMA_SRCSKIP);
+			u32 gaps = (size+chunk-1)/chunk - 1;
+			if (skip >= 0) {
+				span += gaps * skip;
+			} else if (-skip > chunk) {
+				s32 decr = gaps * (chunk + skip);
+				base += decr;
+				span = chunk - decr;
+			} else {
+				span = max(span + gaps * skip,
+					(chunk + skip) * gaps - skip);
+			}
+		}
+		flush_dcache_unaligned(base, span);
+	}
+	if (xtensa_need_invalidate_dma_destination(dst)) {
+		u32 base = dst;
+		u32 span = size;
+		u32 chunk = readl(DMA_CHNL(dmac, chan) + S6_DMA_CMONCHUNK);
+		if (chunk && (size > chunk)) {
+			s32 skip =
+				readl(DMA_CHNL(dmac, chan) + S6_DMA_DSTSKIP);
+			u32 gaps = (size+chunk-1)/chunk - 1;
+			if (skip >= 0) {
+				span += gaps * skip;
+			} else if (-skip > chunk) {
+				s32 decr = gaps * (chunk + skip);
+				base += decr;
+				span = chunk - decr;
+			} else {
+				span = max(span + gaps * skip,
+					(chunk + skip) * gaps - skip);
+			}
+		}
+		invalidate_dcache_unaligned(base, span);
+	}
+	s6dmac_put_fifo(dmac, chan, src, dst, size);
+}
+
+void s6dmac_disable_error_irqs(u32 dmac, u32 mask)
+{
+	unsigned long flags;
+	spinlock_t *spinl = &s6dmac_ctrl[_dmac_addr_index(dmac)].lock;
+	spin_lock_irqsave(spinl, flags);
+	_s6dmac_disable_error_irqs(dmac, mask);
+	spin_unlock_irqrestore(spinl, flags);
+}
+
+u32 s6dmac_int_sources(u32 dmac, u32 channel)
+{
+	u32 mask, ret, tmp;
+	mask = 1 << channel;
+
+	tmp = readl(dmac + S6_DMA_TERMCNTIRQSTAT);
+	tmp &= mask;
+	writel(tmp, dmac + S6_DMA_TERMCNTIRQCLR);
+	ret = tmp >> channel;
+
+	tmp = readl(dmac + S6_DMA_PENDCNTIRQSTAT);
+	tmp &= mask;
+	writel(tmp, dmac + S6_DMA_PENDCNTIRQCLR);
+	ret |= (tmp >> channel) << 1;
+
+	tmp = readl(dmac + S6_DMA_LOWWMRKIRQSTAT);
+	tmp &= mask;
+	writel(tmp, dmac + S6_DMA_LOWWMRKIRQCLR);
+	ret |= (tmp >> channel) << 2;
+
+	tmp = readl(dmac + S6_DMA_INTRAW0);
+	tmp &= (mask << S6_DMA_INT0_OVER) | (mask << S6_DMA_INT0_UNDER);
+	writel(tmp, dmac + S6_DMA_INTCLEAR0);
+
+	if (tmp & (mask << S6_DMA_INT0_UNDER))
+		ret |= 1 << 3;
+	if (tmp & (mask << S6_DMA_INT0_OVER))
+		ret |= 1 << 4;
+
+	tmp = readl(dmac + S6_DMA_MASTERERRINFO);
+	mask <<= S6_DMA_INT1_CHANNEL;
+	if (((tmp >> S6_DMA_MASTERERR_CHAN(0)) & S6_DMA_MASTERERR_CHAN_MASK)
+			== channel)
+		mask |= 1 << S6_DMA_INT1_MASTER;
+	if (((tmp >> S6_DMA_MASTERERR_CHAN(1)) & S6_DMA_MASTERERR_CHAN_MASK)
+			== channel)
+		mask |= 1 << (S6_DMA_INT1_MASTER + 1);
+	if (((tmp >> S6_DMA_MASTERERR_CHAN(2)) & S6_DMA_MASTERERR_CHAN_MASK)
+			== channel)
+		mask |= 1 << (S6_DMA_INT1_MASTER + 2);
+
+	tmp = readl(dmac + S6_DMA_INTRAW1) & mask;
+	writel(tmp, dmac + S6_DMA_INTCLEAR1);
+	ret |= ((tmp >> channel) & 1) << 5;
+	ret |= ((tmp >> S6_DMA_INT1_MASTER) & S6_DMA_INT1_MASTER_MASK) << 6;
+
+	return ret;
+}
+
+void s6dmac_release_chan(u32 dmac, int chan)
+{
+	if (chan >= 0)
+		s6dmac_disable_chan(dmac, chan);
+}
+
+
+/* global init */
+
+static inline void __init dmac_init(u32 dmac, u8 chan_nb)
+{
+	s6dmac_ctrl[S6_DMAC_INDEX(dmac)].dmac = dmac;
+	spin_lock_init(&s6dmac_ctrl[S6_DMAC_INDEX(dmac)].lock);
+	s6dmac_ctrl[S6_DMAC_INDEX(dmac)].chan_nb = chan_nb;
+	writel(S6_DMA_INT1_MASTER_MASK << S6_DMA_INT1_MASTER,
+		dmac + S6_DMA_INTCLEAR1);
+}
+
+static inline void __init dmac_master(u32 dmac,
+	u32 m0start, u32 m0end, u32 m1start, u32 m1end)
+{
+	writel(m0start, dmac + S6_DMA_MASTER0START);
+	writel(m0end - 1, dmac + S6_DMA_MASTER0END);
+	writel(m1start, dmac + S6_DMA_MASTER1START);
+	writel(m1end - 1, dmac + S6_DMA_MASTER1END);
+}
+
+static int __init s6_dmac_init(void)
+{
+	dmac_init(S6_REG_LMSDMA, S6_LMSDMA_NB);
+	dmac_master(S6_REG_LMSDMA,
+		S6_MEM_DDR, S6_MEM_PCIE_APER, S6_MEM_EFI, S6_MEM_GMAC);
+	dmac_init(S6_REG_NIDMA, S6_NIDMA_NB);
+	dmac_init(S6_REG_DPDMA, S6_DPDMA_NB);
+	dmac_master(S6_REG_DPDMA,
+		S6_MEM_DDR, S6_MEM_PCIE_APER, S6_REG_DP, S6_REG_DPDMA);
+	dmac_init(S6_REG_HIFDMA, S6_HIFDMA_NB);
+	dmac_master(S6_REG_HIFDMA,
+		S6_MEM_GMAC, S6_MEM_PCIE_CFG, S6_MEM_PCIE_APER, S6_MEM_AUX);
+	return 0;
+}
+
+arch_initcall(s6_dmac_init);
diff --git a/arch/xtensa/variants/s6000/include/variant/dmac.h b/arch/xtensa/variants/s6000/include/variant/dmac.h
new file mode 100644
index 0000000..89ab948
--- /dev/null
+++ b/arch/xtensa/variants/s6000/include/variant/dmac.h
@@ -0,0 +1,387 @@
+/*
+ * include/asm-xtensa/variant-s6000/dmac.h
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2006 Tensilica Inc.
+ * Copyright (C) 2008 Emlix GmbH <info@emlix.com>
+ * Authors:	Fabian Godehardt <fg@emlix.com>
+ *		Oskar Schirmer <os@emlix.com>
+ *		Daniel Gloeckner <dg@emlix.com>
+ */
+
+#ifndef __ASM_XTENSA_S6000_DMAC_H
+#define __ASM_XTENSA_S6000_DMAC_H
+#include <linux/io.h>
+#include <variant/hardware.h>
+
+/* DMA global */
+
+#define S6_DMA_INTSTAT0		0x000
+#define S6_DMA_INTSTAT1		0x004
+#define S6_DMA_INTENABLE0	0x008
+#define S6_DMA_INTENABLE1	0x00C
+#define S6_DMA_INTRAW0		0x010
+#define S6_DMA_INTRAW1		0x014
+#define S6_DMA_INTCLEAR0	0x018
+#define S6_DMA_INTCLEAR1	0x01C
+#define S6_DMA_INTSET0		0x020
+#define S6_DMA_INTSET1		0x024
+#define S6_DMA_INT0_UNDER		0
+#define S6_DMA_INT0_OVER		16
+#define S6_DMA_INT1_CHANNEL		0
+#define S6_DMA_INT1_MASTER		16
+#define S6_DMA_INT1_MASTER_MASK			7
+#define S6_DMA_TERMCNTIRQSTAT	0x028
+#define S6_DMA_TERMCNTIRQCLR	0x02C
+#define S6_DMA_TERMCNTIRQSET	0x030
+#define S6_DMA_PENDCNTIRQSTAT	0x034
+#define S6_DMA_PENDCNTIRQCLR	0x038
+#define S6_DMA_PENDCNTIRQSET	0x03C
+#define S6_DMA_LOWWMRKIRQSTAT	0x040
+#define S6_DMA_LOWWMRKIRQCLR	0x044
+#define S6_DMA_LOWWMRKIRQSET	0x048
+#define S6_DMA_MASTERERRINFO	0x04C
+#define S6_DMA_MASTERERR_CHAN(n)	(4*(n))
+#define S6_DMA_MASTERERR_CHAN_MASK		0xF
+#define S6_DMA_DESCRFIFO0	0x050
+#define S6_DMA_DESCRFIFO1	0x054
+#define S6_DMA_DESCRFIFO2	0x058
+#define S6_DMA_DESCRFIFO2_AUTODISABLE	24
+#define S6_DMA_DESCRFIFO3	0x05C
+#define S6_DMA_MASTER0START	0x060
+#define S6_DMA_MASTER0END	0x064
+#define S6_DMA_MASTER1START	0x068
+#define S6_DMA_MASTER1END	0x06C
+#define S6_DMA_NEXTFREE		0x070
+#define S6_DMA_NEXTFREE_CHAN		0
+#define S6_DMA_NEXTFREE_CHAN_MASK	0x1F
+#define S6_DMA_NEXTFREE_ENA		16
+#define S6_DMA_NEXTFREE_ENA_MASK	((1 << 16) - 1)
+#define S6_DMA_DPORTCTRLGRP(p)	((p) * 4 + 0x074)
+#define S6_DMA_DPORTCTRLGRP_FRAMEREP	0
+#define S6_DMA_DPORTCTRLGRP_NRCHANS	1
+#define S6_DMA_DPORTCTRLGRP_NRCHANS_1		0
+#define S6_DMA_DPORTCTRLGRP_NRCHANS_3		1
+#define S6_DMA_DPORTCTRLGRP_NRCHANS_4		2
+#define S6_DMA_DPORTCTRLGRP_NRCHANS_2		3
+#define S6_DMA_DPORTCTRLGRP_ENA		31
+
+
+/* DMA per channel */
+
+#define DMA_CHNL(dmac, n)	((dmac) + 0x1000 + (n) * 0x100)
+#define DMA_INDEX_CHNL(addr)	(((addr) >> 8) & 0xF)
+#define DMA_MASK_DMAC(addr)	((addr) & 0xFFFF0000)
+#define S6_DMA_CHNCTRL		0x000
+#define S6_DMA_CHNCTRL_ENABLE		0
+#define S6_DMA_CHNCTRL_PAUSE		1
+#define S6_DMA_CHNCTRL_PRIO		2
+#define S6_DMA_CHNCTRL_PRIO_MASK		3
+#define S6_DMA_CHNCTRL_PERIPHXFER	4
+#define S6_DMA_CHNCTRL_PERIPHENA	5
+#define S6_DMA_CHNCTRL_SRCINC		6
+#define S6_DMA_CHNCTRL_DSTINC		7
+#define S6_DMA_CHNCTRL_BURSTLOG		8
+#define S6_DMA_CHNCTRL_BURSTLOG_MASK		7
+#define S6_DMA_CHNCTRL_DESCFIFODEPTH	12
+#define S6_DMA_CHNCTRL_DESCFIFODEPTH_MASK	0x1F
+#define S6_DMA_CHNCTRL_DESCFIFOFULL	17
+#define S6_DMA_CHNCTRL_BWCONSEL		18
+#define S6_DMA_CHNCTRL_BWCONENA		19
+#define S6_DMA_CHNCTRL_PENDGCNTSTAT	20
+#define S6_DMA_CHNCTRL_PENDGCNTSTAT_MASK	0x3F
+#define S6_DMA_CHNCTRL_LOWWMARK		26
+#define S6_DMA_CHNCTRL_LOWWMARK_MASK		0xF
+#define S6_DMA_CHNCTRL_TSTAMP		30
+#define S6_DMA_TERMCNTNB	0x004
+#define S6_DMA_TERMCNTNB_MASK			0xFFFF
+#define S6_DMA_TERMCNTTMO	0x008
+#define S6_DMA_TERMCNTSTAT	0x00C
+#define S6_DMA_TERMCNTSTAT_MASK		0xFF
+#define S6_DMA_CMONCHUNK	0x010
+#define S6_DMA_SRCSKIP		0x014
+#define S6_DMA_DSTSKIP		0x018
+#define S6_DMA_CUR_SRC		0x024
+#define S6_DMA_CUR_DST		0x028
+#define S6_DMA_TIMESTAMP	0x030
+
+/* DMA channel lists */
+
+#define S6_DPDMA_CHAN(stream, channel)	(4 * (stream) + (channel))
+#define S6_DPDMA_NB	16
+
+#define S6_HIFDMA_GMACTX	0
+#define S6_HIFDMA_GMACRX	1
+#define S6_HIFDMA_I2S0		2
+#define S6_HIFDMA_I2S1		3
+#define S6_HIFDMA_EGIB		4
+#define S6_HIFDMA_PCITX		5
+#define S6_HIFDMA_PCIRX		6
+#define S6_HIFDMA_NB	7
+
+#define S6_NIDMA_NB	4
+
+#define S6_LMSDMA_NB	12
+
+/* controller access */
+
+#define S6_DMAC_NB	4
+#define S6_DMAC_INDEX(dmac)	(((unsigned)(dmac) >> 18) % S6_DMAC_NB)
+
+struct s6dmac_ctrl {
+	u32 dmac;
+	spinlock_t lock;
+	u8 chan_nb;
+};
+
+extern struct s6dmac_ctrl s6dmac_ctrl[S6_DMAC_NB];
+
+
+/* DMA control, per channel */
+
+static inline int s6dmac_fifo_full(u32 dmac, int chan)
+{
+	return (readl(DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL)
+		& (1 << S6_DMA_CHNCTRL_DESCFIFOFULL)) && 1;
+}
+
+static inline int s6dmac_termcnt_irq(u32 dmac, int chan)
+{
+	u32 m = 1 << chan;
+	int r = (readl(dmac + S6_DMA_TERMCNTIRQSTAT) & m) && 1;
+	if (r)
+		writel(m, dmac + S6_DMA_TERMCNTIRQCLR);
+	return r;
+}
+
+static inline int s6dmac_pendcnt_irq(u32 dmac, int chan)
+{
+	u32 m = 1 << chan;
+	int r = (readl(dmac + S6_DMA_PENDCNTIRQSTAT) & m) && 1;
+	if (r)
+		writel(m, dmac + S6_DMA_PENDCNTIRQCLR);
+	return r;
+}
+
+static inline int s6dmac_lowwmark_irq(u32 dmac, int chan)
+{
+	int r = (readl(dmac + S6_DMA_LOWWMRKIRQSTAT) & (1 << chan)) ? 1 : 0;
+	if (r)
+		writel(1 << chan, dmac + S6_DMA_LOWWMRKIRQCLR);
+	return r;
+}
+
+static inline u32 s6dmac_pending_count(u32 dmac, int chan)
+{
+	return (readl(DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL)
+			>> S6_DMA_CHNCTRL_PENDGCNTSTAT)
+		& S6_DMA_CHNCTRL_PENDGCNTSTAT_MASK;
+}
+
+static inline void s6dmac_set_terminal_count(u32 dmac, int chan, u32 n)
+{
+	n &= S6_DMA_TERMCNTNB_MASK;
+	n |= readl(DMA_CHNL(dmac, chan) + S6_DMA_TERMCNTNB)
+	      & ~S6_DMA_TERMCNTNB_MASK;
+	writel(n, DMA_CHNL(dmac, chan) + S6_DMA_TERMCNTNB);
+}
+
+static inline u32 s6dmac_get_terminal_count(u32 dmac, int chan)
+{
+	return (readl(DMA_CHNL(dmac, chan) + S6_DMA_TERMCNTNB))
+		& S6_DMA_TERMCNTNB_MASK;
+}
+
+static inline u32 s6dmac_timestamp(u32 dmac, int chan)
+{
+	return readl(DMA_CHNL(dmac, chan) + S6_DMA_TIMESTAMP);
+}
+
+static inline u32 s6dmac_cur_src(u32 dmac, int chan)
+{
+	return readl(DMA_CHNL(dmac, chan) + S6_DMA_CUR_SRC);
+}
+
+static inline u32 s6dmac_cur_dst(u32 dmac, int chan)
+{
+	return readl(DMA_CHNL(dmac, chan) + S6_DMA_CUR_DST);
+}
+
+static inline void s6dmac_disable_chan(u32 dmac, int chan)
+{
+	u32 ctrl;
+	writel(readl(DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL)
+		& ~(1 << S6_DMA_CHNCTRL_ENABLE),
+		DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL);
+	do
+		ctrl = readl(DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL);
+	while (ctrl & (1 << S6_DMA_CHNCTRL_ENABLE));
+}
+
+static inline void s6dmac_set_stride_skip(u32 dmac, int chan,
+	int comchunk,		/* 0: disable scatter/gather */
+	int srcskip, int dstskip)
+{
+	writel(comchunk, DMA_CHNL(dmac, chan) + S6_DMA_CMONCHUNK);
+	writel(srcskip, DMA_CHNL(dmac, chan) + S6_DMA_SRCSKIP);
+	writel(dstskip, DMA_CHNL(dmac, chan) + S6_DMA_DSTSKIP);
+}
+
+static inline void s6dmac_enable_chan(u32 dmac, int chan,
+	int prio,               /* 0 (highest) .. 3 (lowest) */
+	int periphxfer,         /* <0: disable p.req.line, 0..1: mode */
+	int srcinc, int dstinc, /* 0: dont increment src/dst address */
+	int comchunk,		/* 0: disable scatter/gather */
+	int srcskip, int dstskip,
+	int burstsize,		/* 4 for I2S, 7 for everything else */
+	int bandwidthconserve,  /* <0: disable, 0..1: select */
+	int lowwmark,           /* 0..15 */
+	int timestamp,		/* 0: disable timestamp */
+	int enable)		/* 0: disable for now */
+{
+	writel(1, DMA_CHNL(dmac, chan) + S6_DMA_TERMCNTNB);
+	writel(0, DMA_CHNL(dmac, chan) + S6_DMA_TERMCNTTMO);
+	writel(lowwmark << S6_DMA_CHNCTRL_LOWWMARK,
+		DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL);
+	s6dmac_set_stride_skip(dmac, chan, comchunk, srcskip, dstskip);
+	writel(((enable ? 1 : 0) << S6_DMA_CHNCTRL_ENABLE) |
+		(prio << S6_DMA_CHNCTRL_PRIO) |
+		(((periphxfer > 0) ? 1 : 0) << S6_DMA_CHNCTRL_PERIPHXFER) |
+		(((periphxfer < 0) ? 0 : 1) << S6_DMA_CHNCTRL_PERIPHENA) |
+		((srcinc ? 1 : 0) << S6_DMA_CHNCTRL_SRCINC) |
+		((dstinc ? 1 : 0) << S6_DMA_CHNCTRL_DSTINC) |
+		(burstsize << S6_DMA_CHNCTRL_BURSTLOG) |
+		(((bandwidthconserve > 0) ? 1 : 0) << S6_DMA_CHNCTRL_BWCONSEL) |
+		(((bandwidthconserve < 0) ? 0 : 1) << S6_DMA_CHNCTRL_BWCONENA) |
+		(lowwmark << S6_DMA_CHNCTRL_LOWWMARK) |
+		((timestamp ? 1 : 0) << S6_DMA_CHNCTRL_TSTAMP),
+		DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL);
+}
+
+
+/* DMA control, per engine */
+
+static inline unsigned _dmac_addr_index(u32 dmac)
+{
+	unsigned i = S6_DMAC_INDEX(dmac);
+	if (s6dmac_ctrl[i].dmac != dmac)
+		BUG();
+	return i;
+}
+
+static inline void _s6dmac_disable_error_irqs(u32 dmac, u32 mask)
+{
+	writel(mask, dmac + S6_DMA_TERMCNTIRQCLR);
+	writel(mask, dmac + S6_DMA_PENDCNTIRQCLR);
+	writel(mask, dmac + S6_DMA_LOWWMRKIRQCLR);
+	writel(readl(dmac + S6_DMA_INTENABLE0)
+		& ~((mask << S6_DMA_INT0_UNDER) | (mask << S6_DMA_INT0_OVER)),
+		dmac + S6_DMA_INTENABLE0);
+	writel(readl(dmac + S6_DMA_INTENABLE1) & ~(mask << S6_DMA_INT1_CHANNEL),
+		dmac + S6_DMA_INTENABLE1);
+	writel((mask << S6_DMA_INT0_UNDER) | (mask << S6_DMA_INT0_OVER),
+		dmac + S6_DMA_INTCLEAR0);
+	writel(mask << S6_DMA_INT1_CHANNEL, dmac + S6_DMA_INTCLEAR1);
+}
+
+/*
+ * request channel from specified engine
+ * with chan<0, accept any channel
+ * further parameters see s6dmac_enable_chan
+ * returns < 0 upon error, channel nb otherwise
+ */
+static inline int s6dmac_request_chan(u32 dmac, int chan,
+	int prio,
+	int periphxfer,
+	int srcinc, int dstinc,
+	int comchunk,
+	int srcskip, int dstskip,
+	int burstsize,
+	int bandwidthconserve,
+	int lowwmark,
+	int timestamp,
+	int enable)
+{
+	int r = chan;
+	unsigned long flags;
+	spinlock_t *spinl = &s6dmac_ctrl[_dmac_addr_index(dmac)].lock;
+	spin_lock_irqsave(spinl, flags);
+	if (r < 0) {
+		r = (readl(dmac + S6_DMA_NEXTFREE) >> S6_DMA_NEXTFREE_CHAN)
+			& S6_DMA_NEXTFREE_CHAN_MASK;
+	}
+	if (r >= s6dmac_ctrl[_dmac_addr_index(dmac)].chan_nb) {
+		if (chan < 0)
+			r = -EBUSY;
+		else
+			r = -ENXIO;
+	} else if (((readl(dmac + S6_DMA_NEXTFREE) >> S6_DMA_NEXTFREE_ENA)
+			>> r) & 1) {
+		r = -EBUSY;
+	} else {
+		s6dmac_enable_chan(dmac, r, prio, periphxfer,
+			srcinc, dstinc, comchunk, srcskip, dstskip, burstsize,
+			bandwidthconserve, lowwmark, timestamp, enable);
+	}
+	spin_unlock_irqrestore(spinl, flags);
+	return r;
+}
+
+static inline void s6dmac_put_fifo(u32 dmac, int chan,
+	u32 src, u32 dst, u32 size)
+{
+	unsigned long flags;
+	spinlock_t *spinl = &s6dmac_ctrl[_dmac_addr_index(dmac)].lock;
+	spin_lock_irqsave(spinl, flags);
+	writel(src, dmac + S6_DMA_DESCRFIFO0);
+	writel(dst, dmac + S6_DMA_DESCRFIFO1);
+	writel(size, dmac + S6_DMA_DESCRFIFO2);
+	writel(chan, dmac + S6_DMA_DESCRFIFO3);
+	spin_unlock_irqrestore(spinl, flags);
+}
+
+static inline u32 s6dmac_channel_enabled(u32 dmac, int chan)
+{
+	return readl(DMA_CHNL(dmac, chan) + S6_DMA_CHNCTRL) &
+			(1 << S6_DMA_CHNCTRL_ENABLE);
+}
+
+/*
+ * group 1-4 data port channels
+ * with port=0..3, nrch=1-4 channels,
+ * frrep=0/1 (dis- or enable frame repeat)
+ */
+static inline void s6dmac_dp_setup_group(u32 dmac, int port,
+			int nrch, int frrep)
+{
+	const static u8 mask[4] = {0, 3, 1, 2};
+	BUG_ON(dmac != S6_REG_DPDMA);
+	if ((port < 0) || (port > 3) || (nrch < 1) || (nrch > 4))
+		return;
+	writel((mask[nrch - 1] << S6_DMA_DPORTCTRLGRP_NRCHANS)
+		| ((frrep ? 1 : 0) << S6_DMA_DPORTCTRLGRP_FRAMEREP),
+		dmac + S6_DMA_DPORTCTRLGRP(port));
+}
+
+static inline void s6dmac_dp_switch_group(u32 dmac, int port, int enable)
+{
+	u32 tmp;
+	BUG_ON(dmac != S6_REG_DPDMA);
+	tmp = readl(dmac + S6_DMA_DPORTCTRLGRP(port));
+	if (enable)
+		tmp |= (1 << S6_DMA_DPORTCTRLGRP_ENA);
+	else
+		tmp &= ~(1 << S6_DMA_DPORTCTRLGRP_ENA);
+	writel(tmp, dmac + S6_DMA_DPORTCTRLGRP(port));
+}
+
+extern void s6dmac_put_fifo_cache(u32 dmac, int chan,
+	u32 src, u32 dst, u32 size);
+extern void s6dmac_disable_error_irqs(u32 dmac, u32 mask);
+extern u32 s6dmac_int_sources(u32 dmac, u32 channel);
+extern void s6dmac_release_chan(u32 dmac, int chan);
+
+#endif /* __ASM_XTENSA_S6000_DMAC_H */
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 09/12] xtensa: allow platform and variant to initialize own irq chips
  2009-04-14  9:41 Johannes Weiner
                   ` (7 preceding siblings ...)
  2009-04-14  9:41 ` [patch 08/12] xtensa: s6000 dma engine support Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-23  7:19   ` Chris Zankel
  2009-04-14  9:41 ` [patch 10/12] xtensa: support s6000 gpio irqs and alternate function selection Johannes Weiner
                   ` (3 subsequent siblings)
  12 siblings, 1 reply; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Daniel Glöckner

From: Daniel Glöckner <dg@emlix.com>

There was already a PLATFORM_NR_IRQS define, which is now accompanied
by a VARIANT_NR_IRQS. To be able to initialize these interrupts,
init_IRQ now calls variant and platform specific hooks.

Signed-off-by: Daniel Glöckner <dg@emlix.com>
---
 arch/xtensa/include/asm/irq.h                     |   21 ++++++++++++++++++---
 arch/xtensa/kernel/irq.c                          |    3 +++
 arch/xtensa/variants/dc232b/include/variant/irq.h |    4 ++++
 arch/xtensa/variants/fsf/include/variant/irq.h    |    4 ++++
 arch/xtensa/variants/s6000/include/variant/irq.h  |    1 +
 5 files changed, 30 insertions(+), 3 deletions(-)
 create mode 100644 arch/xtensa/variants/dc232b/include/variant/irq.h
 create mode 100644 arch/xtensa/variants/fsf/include/variant/irq.h

diff --git a/arch/xtensa/include/asm/irq.h b/arch/xtensa/include/asm/irq.h
index dfac82d..c3c10a7 100644
--- a/arch/xtensa/include/asm/irq.h
+++ b/arch/xtensa/include/asm/irq.h
@@ -11,21 +11,36 @@
 #ifndef _XTENSA_IRQ_H
 #define _XTENSA_IRQ_H
 
+#include <linux/init.h>
 #include <platform/hardware.h>
 #include <variant/core.h>
 
-#ifdef CONFIG_VARIANT_IRQ_SWITCH
 #include <variant/irq.h>
-#else
+#ifndef CONFIG_VARIANT_IRQ_SWITCH
 static inline void variant_irq_enable(unsigned int irq) { }
 static inline void variant_irq_disable(unsigned int irq) { }
 #endif
 
+#ifndef VARIANT_NR_IRQS
+# define VARIANT_NR_IRQS 0
+#endif
 #ifndef PLATFORM_NR_IRQS
 # define PLATFORM_NR_IRQS 0
 #endif
 #define XTENSA_NR_IRQS XCHAL_NUM_INTERRUPTS
-#define NR_IRQS (XTENSA_NR_IRQS + PLATFORM_NR_IRQS)
+#define NR_IRQS (XTENSA_NR_IRQS + VARIANT_NR_IRQS + PLATFORM_NR_IRQS)
+
+#if VARIANT_NR_IRQS == 0
+static inline void variant_init_IRQ(void) { }
+#else
+void variant_init_IRQ(void) __init;
+#endif
+
+#if PLATFORM_NR_IRQS == 0
+static inline void platform_init_IRQ(void) { }
+#else
+void platform_init_IRQ(void) __init;
+#endif
 
 static __inline__ int irq_canonicalize(int irq)
 {
diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c
index a36c85e..61c03a3 100644
--- a/arch/xtensa/kernel/irq.c
+++ b/arch/xtensa/kernel/irq.c
@@ -197,4 +197,7 @@ void __init init_IRQ(void)
 	}
 
 	cached_irq_mask = 0;
+
+	variant_init_IRQ();
+	platform_init_IRQ();
 }
diff --git a/arch/xtensa/variants/dc232b/include/variant/irq.h b/arch/xtensa/variants/dc232b/include/variant/irq.h
new file mode 100644
index 0000000..070b9f5
--- /dev/null
+++ b/arch/xtensa/variants/dc232b/include/variant/irq.h
@@ -0,0 +1,4 @@
+#ifndef __XTENSA_VARIANT_IRQ_H
+#define __XTENSA_VARIANT_IRQ_H
+
+#endif
diff --git a/arch/xtensa/variants/fsf/include/variant/irq.h b/arch/xtensa/variants/fsf/include/variant/irq.h
new file mode 100644
index 0000000..070b9f5
--- /dev/null
+++ b/arch/xtensa/variants/fsf/include/variant/irq.h
@@ -0,0 +1,4 @@
+#ifndef __XTENSA_VARIANT_IRQ_H
+#define __XTENSA_VARIANT_IRQ_H
+
+#endif
diff --git a/arch/xtensa/variants/s6000/include/variant/irq.h b/arch/xtensa/variants/s6000/include/variant/irq.h
index fa031cb..55403d1 100644
--- a/arch/xtensa/variants/s6000/include/variant/irq.h
+++ b/arch/xtensa/variants/s6000/include/variant/irq.h
@@ -2,6 +2,7 @@
 #define __XTENSA_S6000_IRQ_H
 
 #define NO_IRQ		(-1)
+#define VARIANT_NR_IRQS 8 /* GPIO interrupts */
 
 extern void variant_irq_enable(unsigned int irq);
 extern void variant_irq_disable(unsigned int irq);
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 10/12] xtensa: support s6000 gpio irqs and alternate function selection
  2009-04-14  9:41 Johannes Weiner
                   ` (8 preceding siblings ...)
  2009-04-14  9:41 ` [patch 09/12] xtensa: allow platform and variant to initialize own irq chips Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 11/12] xtensa: s6105 specific configuration for s6gmac Johannes Weiner
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Daniel Glöckner

From: Daniel Glöckner <dg@emlix.com>

Implement an irq chip to handle interrupts via gpio.  The GPIO chip
initialization function now takes a bitmask denoting pins that should
be configured for their alternate function.

Signed-off-by: Daniel Glöckner <dg@emlix.com>
Signed-off-by: Johannes Weiner <jw@emlix.com>
---
 arch/xtensa/include/asm/gpio.h                    |    8 +-
 arch/xtensa/platforms/s6105/setup.c               |    2 +-
 arch/xtensa/variants/s6000/gpio.c                 |  163 ++++++++++++++++++++-
 arch/xtensa/variants/s6000/include/variant/gpio.h |    2 +-
 4 files changed, 168 insertions(+), 7 deletions(-)

diff --git a/arch/xtensa/include/asm/gpio.h b/arch/xtensa/include/asm/gpio.h
index 0763b07..a8c9fc4 100644
--- a/arch/xtensa/include/asm/gpio.h
+++ b/arch/xtensa/include/asm/gpio.h
@@ -38,14 +38,14 @@ static inline int gpio_cansleep(unsigned int gpio)
 	return __gpio_cansleep(gpio);
 }
 
-/*
- * Not implemented, yet.
- */
 static inline int gpio_to_irq(unsigned int gpio)
 {
-	return -ENOSYS;
+	return __gpio_to_irq(gpio);
 }
 
+/*
+ * Not implemented, yet.
+ */
 static inline int irq_to_gpio(unsigned int irq)
 {
 	return -EINVAL;
diff --git a/arch/xtensa/platforms/s6105/setup.c b/arch/xtensa/platforms/s6105/setup.c
index 855ddea..95fa23c 100644
--- a/arch/xtensa/platforms/s6105/setup.c
+++ b/arch/xtensa/platforms/s6105/setup.c
@@ -49,7 +49,7 @@ void __init platform_setup(char **cmdline)
 
 void __init platform_init(bp_tag_t *first)
 {
-	s6_gpio_init();
+	s6_gpio_init(0);
 	gpio_request(GPIO_LED1_NGREEN, "led1_green");
 	gpio_request(GPIO_LED1_RED, "led1_red");
 	gpio_direction_output(GPIO_LED1_NGREEN, 1);
diff --git a/arch/xtensa/variants/s6000/gpio.c b/arch/xtensa/variants/s6000/gpio.c
index 79317fd..5171e56 100644
--- a/arch/xtensa/variants/s6000/gpio.c
+++ b/arch/xtensa/variants/s6000/gpio.c
@@ -4,15 +4,20 @@
  * Copyright (c) 2009 emlix GmbH
  * Authors:	Oskar Schirmer <os@emlix.com>
  *		Johannes Weiner <jw@emlix.com>
+ *		Daniel Gloeckner <dg@emlix.com>
  */
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/gpio.h>
 
 #include <variant/hardware.h>
 
+#define IRQ_BASE XTENSA_NR_IRQS
+
 #define S6_GPIO_DATA		0x000
 #define S6_GPIO_IS		0x404
 #define S6_GPIO_IBE		0x408
@@ -52,19 +57,175 @@ static void set(struct gpio_chip *chip, unsigned int off, int val)
 	writeb(val ? ~0 : 0, S6_REG_GPIO + S6_GPIO_DATA + S6_GPIO_OFFSET(off));
 }
 
+static int to_irq(struct gpio_chip *chip, unsigned offset)
+{
+	if (offset < 8)
+		return offset + IRQ_BASE;
+	return -EINVAL;
+}
+
 static struct gpio_chip gpiochip = {
 	.owner = THIS_MODULE,
 	.direction_input = direction_input,
 	.get = get,
 	.direction_output = direction_output,
 	.set = set,
+	.to_irq = to_irq,
 	.base = 0,
 	.ngpio = 24,
 	.can_sleep = 0, /* no blocking io needed */
 	.exported = 0, /* no exporting to userspace */
 };
 
-int s6_gpio_init(void)
+int s6_gpio_init(u32 afsel)
 {
+	writeb(afsel, S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_AFSEL);
+	writeb(afsel >> 8, S6_REG_GPIO + S6_GPIO_BANK(1) + S6_GPIO_AFSEL);
+	writeb(afsel >> 16, S6_REG_GPIO + S6_GPIO_BANK(2) + S6_GPIO_AFSEL);
 	return gpiochip_add(&gpiochip);
 }
+
+static void ack(unsigned int irq)
+{
+	writeb(1 << (irq - IRQ_BASE), S6_REG_GPIO + S6_GPIO_IC);
+}
+
+static void mask(unsigned int irq)
+{
+	u8 r = readb(S6_REG_GPIO + S6_GPIO_IE);
+	r &= ~(1 << (irq - IRQ_BASE));
+	writeb(r, S6_REG_GPIO + S6_GPIO_IE);
+}
+
+static void unmask(unsigned int irq)
+{
+	u8 m = readb(S6_REG_GPIO + S6_GPIO_IE);
+	m |= 1 << (irq - IRQ_BASE);
+	writeb(m, S6_REG_GPIO + S6_GPIO_IE);
+}
+
+static int set_type(unsigned int irq, unsigned int type)
+{
+	const u8 m = 1 << (irq - IRQ_BASE);
+	irq_flow_handler_t handler;
+	struct irq_desc *desc;
+	u8 reg;
+
+	if (type == IRQ_TYPE_PROBE) {
+		if ((readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_AFSEL) & m)
+		    || (readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IE) & m)
+		    || readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_DIR
+			      + S6_GPIO_MASK(irq - IRQ_BASE)))
+			return 0;
+		type = IRQ_TYPE_EDGE_BOTH;
+	}
+
+	reg = readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IS);
+	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) {
+		reg |= m;
+		handler = handle_level_irq;
+	} else {
+		reg = ~m;
+		handler = handle_edge_irq;
+	}
+	writeb(reg, S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IS);
+	desc = irq_to_desc(irq);
+	desc->handle_irq = handler;
+
+	reg = readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IEV);
+	if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_EDGE_RISING))
+		reg |= m;
+	else
+		reg &= ~m;
+	writeb(reg, S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IEV);
+
+	reg = readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IBE);
+	if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH)
+		reg |= m;
+	else
+		reg &= ~m;
+	writeb(reg, S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IBE);
+	return 0;
+}
+
+static struct irq_chip gpioirqs = {
+	.name = "GPIO",
+	.ack = ack,
+	.mask = mask,
+	.unmask = unmask,
+	.set_type = set_type,
+};
+
+static u8 demux_masks[4];
+
+static void demux_irqs(unsigned int irq, struct irq_desc *desc)
+{
+	u8 *mask = get_irq_desc_data(desc);
+	u8 pending;
+	int cirq;
+
+	desc->chip->mask(irq);
+	desc->chip->ack(irq);
+	pending = readb(S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_MIS) & *mask;
+	cirq = IRQ_BASE - 1;
+	while (pending) {
+		int n = ffs(pending);
+		cirq += n;
+		pending >>= n;
+		generic_handle_irq(cirq);
+	}
+	desc->chip->unmask(irq);
+}
+
+extern const signed char *platform_irq_mappings[XTENSA_NR_IRQS];
+
+void __init variant_init_IRQ(void)
+{
+	int irq, n;
+	writeb(0, S6_REG_GPIO + S6_GPIO_BANK(0) + S6_GPIO_IE);
+	for (irq = n = 0; irq < XTENSA_NR_IRQS; irq++) {
+		const signed char *mapping = platform_irq_mappings[irq];
+		int alone = 1;
+		u8 mask;
+		if (!mapping)
+			continue;
+		for(mask = 0; *mapping != -1; mapping++)
+			switch (*mapping) {
+			case S6_INTC_GPIO(0):
+				mask |= 1 << 0;
+				break;
+			case S6_INTC_GPIO(1):
+				mask |= 1 << 1;
+				break;
+			case S6_INTC_GPIO(2):
+				mask |= 1 << 2;
+				break;
+			case S6_INTC_GPIO(3):
+				mask |= 0x1f << 3;
+				break;
+			default:
+				alone = 0;
+			}
+		if (mask) {
+			int cirq, i;
+			if (!alone) {
+				printk(KERN_ERR "chained irq chips can't share"
+					" parent irq %i\n", irq);
+				continue;
+			}
+			demux_masks[n] = mask;
+			cirq = IRQ_BASE - 1;
+			do {
+				i = ffs(mask);
+				cirq += i;
+				mask >>= i;
+				set_irq_chip(cirq, &gpioirqs);
+				set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
+			} while (mask);
+			set_irq_data(irq, demux_masks + n);
+			set_irq_chained_handler(irq, demux_irqs);
+			if (++n == ARRAY_SIZE(demux_masks))
+				break;
+		}
+	}
+}
diff --git a/arch/xtensa/variants/s6000/include/variant/gpio.h b/arch/xtensa/variants/s6000/include/variant/gpio.h
index 8327f62..8484ab0 100644
--- a/arch/xtensa/variants/s6000/include/variant/gpio.h
+++ b/arch/xtensa/variants/s6000/include/variant/gpio.h
@@ -1,6 +1,6 @@
 #ifndef _XTENSA_VARIANT_S6000_GPIO_H
 #define _XTENSA_VARIANT_S6000_GPIO_H
 
-extern int s6_gpio_init(void);
+extern int s6_gpio_init(u32 afsel);
 
 #endif /* _XTENSA_VARIANT_S6000_GPIO_H */
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 11/12] xtensa: s6105 specific configuration for s6gmac
  2009-04-14  9:41 Johannes Weiner
                   ` (9 preceding siblings ...)
  2009-04-14  9:41 ` [patch 10/12] xtensa: support s6000 gpio irqs and alternate function selection Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-14  9:41 ` [patch 12/12] xtensa: enable s6gmac in s6105_defconfig Johannes Weiner
  2009-04-16  7:42 ` Xtensa patches Chris Zankel
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Chris Zankel, linux-kernel, Oskar Schirmer, Daniel Glöckner

From: Oskar Schirmer <os@emlix.com>

Platform-specific configuration for the s6gmac driver, including the
PHY interrupt line.

Signed-off-by: Daniel Glöckner <dg@emlix.com>
Signed-off-by: Oskar Schirmer <os@emlix.com>
---
 arch/xtensa/platforms/s6105/device.c |   91 ++++++++++++++++++++++++++++++++++
 arch/xtensa/platforms/s6105/setup.c  |    9 +++
 2 files changed, 100 insertions(+), 0 deletions(-)

diff --git a/arch/xtensa/platforms/s6105/device.c b/arch/xtensa/platforms/s6105/device.c
index 78b08be..963634a 100644
--- a/arch/xtensa/platforms/s6105/device.c
+++ b/arch/xtensa/platforms/s6105/device.c
@@ -5,14 +5,27 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/gpio.h>
 #include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/phy.h>
 #include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_8250.h>
 
 #include <variant/hardware.h>
+#include <variant/dmac.h>
 
+#include <platform/gpio.h>
+
+#define GPIO3_INTNUM		3
 #define UART_INTNUM		4
+#define GMAC_INTNUM		5
+
+static const signed char gpio3_irq_mappings[] = {
+	S6_INTC_GPIO(3),
+	-1
+};
 
 static const signed char uart_irq_mappings[] = {
 	S6_INTC_UART(0),
@@ -20,8 +33,18 @@ static const signed char uart_irq_mappings[] = {
 	-1,
 };
 
+static const signed char gmac_irq_mappings[] = {
+	S6_INTC_GMAC_STAT,
+	S6_INTC_GMAC_ERR,
+	S6_INTC_DMA_HOSTTERMCNT(0),
+	S6_INTC_DMA_HOSTTERMCNT(1),
+	-1
+};
+
 const signed char *platform_irq_mappings[NR_IRQS] = {
+	[GPIO3_INTNUM] = gpio3_irq_mappings,
 	[UART_INTNUM] = uart_irq_mappings,
+	[GMAC_INTNUM] = gmac_irq_mappings,
 };
 
 static struct plat_serial8250_port serial_platform_data[] = {
@@ -46,6 +69,66 @@ static struct plat_serial8250_port serial_platform_data[] = {
 	{ },
 };
 
+static struct resource s6_gmac_resource[] = {
+	{
+		.name   = "mem",
+		.start  = (resource_size_t)S6_REG_GMAC,
+		.end    = (resource_size_t)S6_REG_GMAC + 0x10000 - 1,
+		.flags  = IORESOURCE_MEM,
+	},
+	{
+		.name   = "dma",
+		.start  = (resource_size_t)
+			DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACTX),
+		.end    = (resource_size_t)
+			DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACTX) + 0x100 - 1,
+		.flags  = IORESOURCE_DMA,
+	},
+	{
+		.name   = "dma",
+		.start  = (resource_size_t)
+			DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACRX),
+		.end    = (resource_size_t)
+			DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACRX) + 0x100 - 1,
+		.flags  = IORESOURCE_DMA,
+	},
+	{
+		.name   = "io",
+		.start  = (resource_size_t)S6_MEM_GMAC,
+		.end    = (resource_size_t)S6_MEM_GMAC + 0x2000000 - 1,
+		.flags  = IORESOURCE_IO,
+	},
+	{
+		.name   = "irq",
+		.start  = (resource_size_t)GMAC_INTNUM,
+		.flags  = IORESOURCE_IRQ,
+	},
+	{
+		.name   = "irq",
+		.start  = (resource_size_t)PHY_POLL,
+		.flags  = IORESOURCE_IRQ,
+	},
+};
+
+static int __init prepare_phy_irq(int pin)
+{
+	int irq;
+	if (gpio_request(pin, "s6gmac_phy") < 0)
+		goto fail;
+	if (gpio_direction_input(pin) < 0)
+		goto free;
+	irq = gpio_to_irq(pin);
+	if (irq < 0)
+		goto free;
+	if (set_irq_type(irq, IRQ_TYPE_LEVEL_LOW) < 0)
+		goto free;
+	return irq;
+free:
+	gpio_free(pin);
+fail:
+	return PHY_POLL;
+}
+
 static struct platform_device platform_devices[] = {
 	{
 		.name = "serial8250",
@@ -54,12 +137,20 @@ static struct platform_device platform_devices[] = {
 			.platform_data = serial_platform_data,
 		},
 	},
+	{
+		.name = "s6gmac",
+		.id = 0,
+		.resource = s6_gmac_resource,
+		.num_resources = ARRAY_SIZE(s6_gmac_resource),
+	},
 };
 
 static int __init device_init(void)
 {
 	int i;
 
+	s6_gmac_resource[5].start = prepare_phy_irq(GPIO_PHY_IRQ);
+
 	for (i = 0; i < ARRAY_SIZE(platform_devices); i++)
 		platform_device_register(&platform_devices[i]);
 	return 0;
diff --git a/arch/xtensa/platforms/s6105/setup.c b/arch/xtensa/platforms/s6105/setup.c
index 95fa23c..86ce730 100644
--- a/arch/xtensa/platforms/s6105/setup.c
+++ b/arch/xtensa/platforms/s6105/setup.c
@@ -35,12 +35,21 @@ void __init platform_setup(char **cmdline)
 {
 	unsigned long reg;
 
+	reg = readl(S6_REG_GREG1 + S6_GREG1_PLLSEL);
+	reg &= ~(S6_GREG1_PLLSEL_GMAC_MASK << S6_GREG1_PLLSEL_GMAC |
+		S6_GREG1_PLLSEL_GMII_MASK << S6_GREG1_PLLSEL_GMII);
+	reg |= S6_GREG1_PLLSEL_GMAC_125MHZ << S6_GREG1_PLLSEL_GMAC |
+		S6_GREG1_PLLSEL_GMII_125MHZ << S6_GREG1_PLLSEL_GMII;
+	writel(reg, S6_REG_GREG1 + S6_GREG1_PLLSEL);
+
 	reg = readl(S6_REG_GREG1 + S6_GREG1_CLKGATE);
 	reg &= ~(1 << S6_GREG1_BLOCK_SB);
+	reg &= ~(1 << S6_GREG1_BLOCK_GMAC);
 	writel(reg, S6_REG_GREG1 + S6_GREG1_CLKGATE);
 
 	reg = readl(S6_REG_GREG1 + S6_GREG1_BLOCKENA);
 	reg |= 1 << S6_GREG1_BLOCK_SB;
+	reg |= 1 << S6_GREG1_BLOCK_GMAC;
 	writel(reg, S6_REG_GREG1 + S6_GREG1_BLOCKENA);
 
 	printk(KERN_NOTICE "S6105 on Stretch S6000 - "
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [patch 12/12] xtensa: enable s6gmac in s6105_defconfig
  2009-04-14  9:41 Johannes Weiner
                   ` (10 preceding siblings ...)
  2009-04-14  9:41 ` [patch 11/12] xtensa: s6105 specific configuration for s6gmac Johannes Weiner
@ 2009-04-14  9:41 ` Johannes Weiner
  2009-04-16  7:42 ` Xtensa patches Chris Zankel
  12 siblings, 0 replies; 22+ messages in thread
From: Johannes Weiner @ 2009-04-14  9:41 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, linux-kernel, Daniel Glöckner

From: Daniel Glöckner <dg@emlix.com>

Signed-off-by: Daniel Glöckner <dg@emlix.com>
---
 arch/xtensa/configs/s6105_defconfig |   49 ++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/arch/xtensa/configs/s6105_defconfig b/arch/xtensa/configs/s6105_defconfig
index 768bee0..a1eca01 100644
--- a/arch/xtensa/configs/s6105_defconfig
+++ b/arch/xtensa/configs/s6105_defconfig
@@ -263,7 +263,54 @@ CONFIG_HAVE_IDE=y
 # CONFIG_SCSI_NETLINK is not set
 # CONFIG_ATA is not set
 # CONFIG_MD is not set
-# CONFIG_NETDEVICES is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+CONFIG_SMSC_PHY=y
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_NET_ETHERNET is not set
+CONFIG_NETDEV_1000=y
+CONFIG_S6GMAC=y
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_IWLWIFI_LEDS is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 # CONFIG_ISDN is not set
 # CONFIG_PHONE is not set
 
-- 
1.6.2.107.ge47ee


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-14  9:41 Johannes Weiner
                   ` (11 preceding siblings ...)
  2009-04-14  9:41 ` [patch 12/12] xtensa: enable s6gmac in s6105_defconfig Johannes Weiner
@ 2009-04-16  7:42 ` Chris Zankel
  2009-04-16  8:24   ` Andrew Morton
  12 siblings, 1 reply; 22+ messages in thread
From: Chris Zankel @ 2009-04-16  7:42 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Johannes Weiner, linux-kernel

Hi Andrew,

I will look over those patches and commit them to xtensa-2.6.

Thanks,
-Chris


Johannes Weiner wrote:
> Hi Andrew,
> 
> these are fixes and dependency patches for xtensa code in mainline and
> your tree that came in during this merge window.
> 
> Thanks,
> 	Hannes


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  7:42 ` Xtensa patches Chris Zankel
@ 2009-04-16  8:24   ` Andrew Morton
  2009-04-16  8:30     ` Paul Mundt
  2009-04-16  8:35     ` Stephen Rothwell
  0 siblings, 2 replies; 22+ messages in thread
From: Andrew Morton @ 2009-04-16  8:24 UTC (permalink / raw)
  To: Chris Zankel; +Cc: Johannes Weiner, linux-kernel

On Thu, 16 Apr 2009 00:42:13 -0700 Chris Zankel <chris@zankel.net> wrote:

> Hi Andrew,
> 
> I will look over those patches and commit them to xtensa-2.6.
> 

OK.  I have a random pile if i-dont-know-what xtensa stuff here.

xtensa-add-flat-support-checkpatch-fixes.patch
xtensa-variant-specific-code.patch
xtensa-cache-inquiry-and-unaligned-cache-handling-functions.patch
xtensa-s6000-dma-engine-support.patch
xtensa-allow-platform-and-variant-to-initialize-own-irq-chips.patch
xtensa-support-s6000-gpio-irqs-and-alternate-function-selection.patch
s6gmac-xtensa-s6000-on-chip-ethernet-driver.patch
s6gmac-xtensa-s6000-on-chip-ethernet-driver-fix.patch
xtensa-s6105-specific-configuration-for-s6gmac.patch
xtensa-enable-s6gmac-in-s6105_defconfig.patch
xtensa-add-m41t62-rtc-to-s6105-platform.patch
xtensa-enable-m41t80-driver-in-s6105_defconfig.patch

I'll drop xtensa-add-flat-support-checkpatch-fixes.patch (as I usually
do when someone merges the base patch but doesn't run checkpatch on it
- hint) and I'll send the rest over at you.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  8:24   ` Andrew Morton
@ 2009-04-16  8:30     ` Paul Mundt
  2009-04-16  8:56       ` Andrew Morton
  2009-04-16  8:35     ` Stephen Rothwell
  1 sibling, 1 reply; 22+ messages in thread
From: Paul Mundt @ 2009-04-16  8:30 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, Johannes Weiner, linux-kernel

On Thu, Apr 16, 2009 at 01:24:47AM -0700, Andrew Morton wrote:
> On Thu, 16 Apr 2009 00:42:13 -0700 Chris Zankel <chris@zankel.net> wrote:
> 
> > Hi Andrew,
> > 
> > I will look over those patches and commit them to xtensa-2.6.
> > 
> 
> OK.  I have a random pile if i-dont-know-what xtensa stuff here.
> 
> xtensa-add-flat-support-checkpatch-fixes.patch
> xtensa-variant-specific-code.patch
> xtensa-cache-inquiry-and-unaligned-cache-handling-functions.patch
> xtensa-s6000-dma-engine-support.patch
> xtensa-allow-platform-and-variant-to-initialize-own-irq-chips.patch
> xtensa-support-s6000-gpio-irqs-and-alternate-function-selection.patch
> s6gmac-xtensa-s6000-on-chip-ethernet-driver.patch
> s6gmac-xtensa-s6000-on-chip-ethernet-driver-fix.patch
> xtensa-s6105-specific-configuration-for-s6gmac.patch
> xtensa-enable-s6gmac-in-s6105_defconfig.patch
> xtensa-add-m41t62-rtc-to-s6105-platform.patch
> xtensa-enable-m41t80-driver-in-s6105_defconfig.patch
> 
> I'll drop xtensa-add-flat-support-checkpatch-fixes.patch (as I usually
> do when someone merges the base patch but doesn't run checkpatch on it
> - hint) and I'll send the rest over at you.
> 
Presumably the nommu xtensa bits still depend on

flat-fix-data-sections-alignment.patch

?

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  8:24   ` Andrew Morton
  2009-04-16  8:30     ` Paul Mundt
@ 2009-04-16  8:35     ` Stephen Rothwell
  2009-04-16  9:15       ` Chris Zankel
  1 sibling, 1 reply; 22+ messages in thread
From: Stephen Rothwell @ 2009-04-16  8:35 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Chris Zankel, Johannes Weiner, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 662 bytes --]

Hi Chris,

On Thu, 16 Apr 2009 01:24:47 -0700 Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Thu, 16 Apr 2009 00:42:13 -0700 Chris Zankel <chris@zankel.net> wrote:
> 
> > Hi Andrew,
> > 
> > I will look over those patches and commit them to xtensa-2.6.
> > 
> 
> OK.  I have a random pile if i-dont-know-what xtensa stuff here.

Interestingly, there is an xtensa tree in linux-next that tracks the
master branch of
git://git.kernel.org/pub/scm/linux/kernel/git/czankel/xtensa-next.git.
It hasn't been updated since January ...

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  8:30     ` Paul Mundt
@ 2009-04-16  8:56       ` Andrew Morton
  2009-04-16  9:06         ` Paul Mundt
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Morton @ 2009-04-16  8:56 UTC (permalink / raw)
  To: Paul Mundt
  Cc: Chris Zankel, Johannes Weiner, linux-kernel, Oskar Schirmer,
	Greg Ungerer

On Thu, 16 Apr 2009 17:30:00 +0900 Paul Mundt <lethal@linux-sh.org> wrote:

> On Thu, Apr 16, 2009 at 01:24:47AM -0700, Andrew Morton wrote:
> > On Thu, 16 Apr 2009 00:42:13 -0700 Chris Zankel <chris@zankel.net> wrote:
> > 
> > > Hi Andrew,
> > > 
> > > I will look over those patches and commit them to xtensa-2.6.
> > > 
> > 
> > OK.  I have a random pile if i-dont-know-what xtensa stuff here.
> > 
> > xtensa-add-flat-support-checkpatch-fixes.patch
> > xtensa-variant-specific-code.patch
> > xtensa-cache-inquiry-and-unaligned-cache-handling-functions.patch
> > xtensa-s6000-dma-engine-support.patch
> > xtensa-allow-platform-and-variant-to-initialize-own-irq-chips.patch
> > xtensa-support-s6000-gpio-irqs-and-alternate-function-selection.patch
> > s6gmac-xtensa-s6000-on-chip-ethernet-driver.patch
> > s6gmac-xtensa-s6000-on-chip-ethernet-driver-fix.patch
> > xtensa-s6105-specific-configuration-for-s6gmac.patch
> > xtensa-enable-s6gmac-in-s6105_defconfig.patch
> > xtensa-add-m41t62-rtc-to-s6105-platform.patch
> > xtensa-enable-m41t80-driver-in-s6105_defconfig.patch
> > 
> > I'll drop xtensa-add-flat-support-checkpatch-fixes.patch (as I usually
> > do when someone merges the base patch but doesn't run checkpatch on it
> > - hint) and I'll send the rest over at you.
> > 
> Presumably the nommu xtensa bits still depend on
> 
> flat-fix-data-sections-alignment.patch
> 
> ?

I don't think I ever knew that.

What's happening with flat-fix-data-sections-alignment.patch, btw?  It
seems to be stuck.



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  8:56       ` Andrew Morton
@ 2009-04-16  9:06         ` Paul Mundt
  0 siblings, 0 replies; 22+ messages in thread
From: Paul Mundt @ 2009-04-16  9:06 UTC (permalink / raw)
  To: Andrew Morton, Mike Frysinger
  Cc: Chris Zankel, Johannes Weiner, linux-kernel, Oskar Schirmer,
	Greg Ungerer

On Thu, Apr 16, 2009 at 01:56:01AM -0700, Andrew Morton wrote:
> On Thu, 16 Apr 2009 17:30:00 +0900 Paul Mundt <lethal@linux-sh.org> wrote:
> > On Thu, Apr 16, 2009 at 01:24:47AM -0700, Andrew Morton wrote:
> > > OK.  I have a random pile if i-dont-know-what xtensa stuff here.
> > > 
> > > xtensa-add-flat-support-checkpatch-fixes.patch
> > > xtensa-variant-specific-code.patch
> > > xtensa-cache-inquiry-and-unaligned-cache-handling-functions.patch
> > > xtensa-s6000-dma-engine-support.patch
> > > xtensa-allow-platform-and-variant-to-initialize-own-irq-chips.patch
> > > xtensa-support-s6000-gpio-irqs-and-alternate-function-selection.patch
> > > s6gmac-xtensa-s6000-on-chip-ethernet-driver.patch
> > > s6gmac-xtensa-s6000-on-chip-ethernet-driver-fix.patch
> > > xtensa-s6105-specific-configuration-for-s6gmac.patch
> > > xtensa-enable-s6gmac-in-s6105_defconfig.patch
> > > xtensa-add-m41t62-rtc-to-s6105-platform.patch
> > > xtensa-enable-m41t80-driver-in-s6105_defconfig.patch
> > > 
> > > I'll drop xtensa-add-flat-support-checkpatch-fixes.patch (as I usually
> > > do when someone merges the base patch but doesn't run checkpatch on it
> > > - hint) and I'll send the rest over at you.
> > > 
> > Presumably the nommu xtensa bits still depend on
> > 
> > flat-fix-data-sections-alignment.patch
> > 
> > ?
> 
> I don't think I ever knew that.
> 
http://lkml.org/lkml/2009/4/9/241

> What's happening with flat-fix-data-sections-alignment.patch, btw?  It
> seems to be stuck.
> 
As far as I know it was just waiting on Mike to comment, as he was the
only other one with concerns. Mike?

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Xtensa patches
  2009-04-16  8:35     ` Stephen Rothwell
@ 2009-04-16  9:15       ` Chris Zankel
  0 siblings, 0 replies; 22+ messages in thread
From: Chris Zankel @ 2009-04-16  9:15 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: Andrew Morton, Johannes Weiner, linux-kernel

Hi Stephen,

Stephen Rothwell wrote:
> On Thu, 16 Apr 2009 01:24:47 -0700 Andrew Morton <akpm@linux-foundation.org> wrote:
>> On Thu, 16 Apr 2009 00:42:13 -0700 Chris Zankel <chris@zankel.net> wrote:
>>
>>> Hi Andrew,
>>>
>>> I will look over those patches and commit them to xtensa-2.6.
>>>
>> OK.  I have a random pile if i-dont-know-what xtensa stuff here.
> 
> Interestingly, there is an xtensa tree in linux-next that tracks the
> master branch of
> git://git.kernel.org/pub/scm/linux/kernel/git/czankel/xtensa-next.git.
> It hasn't been updated since January ...

Should be updated now. There are a ton of patches outstanding, but they 
are tracked in a different tree somewhere else and require some heavy 
lifting to clean up.


What 'random pile' do you still have there that hasn't been merged, yet?

Thanks,
-Chris

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [patch 09/12] xtensa: allow platform and variant to initialize own irq chips
  2009-04-14  9:41 ` [patch 09/12] xtensa: allow platform and variant to initialize own irq chips Johannes Weiner
@ 2009-04-23  7:19   ` Chris Zankel
  2009-04-23 16:16     ` Daniel Glöckner
  0 siblings, 1 reply; 22+ messages in thread
From: Chris Zankel @ 2009-04-23  7:19 UTC (permalink / raw)
  To: Johannes Weiner; +Cc: Andrew Morton, linux-kernel, Daniel Glöckner

Hi Daniel,

What
Johannes Weiner wrote:
> From: Daniel Glöckner <dg@emlix.com>
> 
> diff --git a/arch/xtensa/include/asm/irq.h b/arch/xtensa/include/asm/irq.h
> index dfac82d..c3c10a7 100644
> --- a/arch/xtensa/include/asm/irq.h
> +++ b/arch/xtensa/include/asm/irq.h
> @@ -11,21 +11,36 @@
>  #ifndef _XTENSA_IRQ_H
>  #define _XTENSA_IRQ_H
>  
> +#include <linux/init.h>
>  #include <platform/hardware.h>
>  #include <variant/core.h>
>  
> -#ifdef CONFIG_VARIANT_IRQ_SWITCH
>  #include <variant/irq.h>
> -#else
> +#ifndef CONFIG_VARIANT_IRQ_SWITCH
>  static inline void variant_irq_enable(unsigned int irq) { }
>  static inline void variant_irq_disable(unsigned int irq) { }
>  #endif

What was the reason for this change? We shouldn't require all processor 
variants to provide an irq.h header file, unless required (and we 
wouldn't need to add the following files)

> diff --git a/arch/xtensa/variants/dc232b/include/variant/irq.h b/arch/xtensa/variants/dc232b/include/variant/irq.h
> new file mode 100644
> index 0000000..070b9f5
> --- /dev/null
> +++ b/arch/xtensa/variants/dc232b/include/variant/irq.h
> @@ -0,0 +1,4 @@
> +#ifndef __XTENSA_VARIANT_IRQ_H
> +#define __XTENSA_VARIANT_IRQ_H
> +
> +#endif
> diff --git a/arch/xtensa/variants/fsf/include/variant/irq.h b/arch/xtensa/variants/fsf/include/variant/irq.h
> new file mode 100644
> index 0000000..070b9f5
> --- /dev/null
> +++ b/arch/xtensa/variants/fsf/include/variant/irq.h
> @@ -0,0 +1,4 @@
> +#ifndef __XTENSA_VARIANT_IRQ_H
> +#define __XTENSA_VARIANT_IRQ_H
> +
> +#endif

Since you are at it, can you change __XTENSA_S6000_IRQ_H to 
_XTENSA_S6000_IRQ_H (single 'underscore' prefix).

> diff --git a/arch/xtensa/variants/s6000/include/variant/irq.h b/arch/xtensa/variants/s6000/include/variant/irq.h
> index fa031cb..55403d1 100644
> --- a/arch/xtensa/variants/s6000/include/variant/irq.h
> +++ b/arch/xtensa/variants/s6000/include/variant/irq.h
> @@ -2,6 +2,7 @@
>  #define __XTENSA_S6000_IRQ_H
>  
>  #define NO_IRQ		(-1)
> +#define VARIANT_NR_IRQS 8 /* GPIO interrupts */
>  
>  extern void variant_irq_enable(unsigned int irq);
>  extern void variant_irq_disable(unsigned int irq);

Thanks,
-Chris

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [patch 09/12] xtensa: allow platform and variant to initialize own irq chips
  2009-04-23  7:19   ` Chris Zankel
@ 2009-04-23 16:16     ` Daniel Glöckner
  0 siblings, 0 replies; 22+ messages in thread
From: Daniel Glöckner @ 2009-04-23 16:16 UTC (permalink / raw)
  To: Chris Zankel; +Cc: Johannes Weiner, Andrew Morton, linux-kernel

Hi,

On 04/23/2009 09:19 AM, Chris Zankel wrote:
>> -#ifdef CONFIG_VARIANT_IRQ_SWITCH
>>  #include <variant/irq.h>
>> -#else
>> +#ifndef CONFIG_VARIANT_IRQ_SWITCH
>>  static inline void variant_irq_enable(unsigned int irq) { }
>>  static inline void variant_irq_disable(unsigned int irq) { }
>>  #endif
> 
> What was the reason for this change? We shouldn't require all processor
> variants to provide an irq.h header file, unless required (and we
> wouldn't need to add the following files)

Let me quote a few more lines of that hunk:

>>
>> +#ifndef VARIANT_NR_IRQS
>> +# define VARIANT_NR_IRQS 0
>> +#endif

Where can a variant define VARIANT_NR_IRQS if not inside a new header?
Do you prefer it being defined in core.h, tie.h, or tie-asm.h?

I think this boils down to the restructuring necessary in arch/xtensa that will
draw a line between the Xtensa core and a SoC featuring that core (as it was
described by Marc on March 31 on the linux-xtensa list). Of course a "core" will
never need any IRQs beyond XTENSA_NR_IRQS.

Another possibility would be to select VARIANT_IRQ_SWITCH (or a dedicated new
Kconfig option) in all SoCs that need additional IRQs.

  Daniel

-- 
Dipl.-Math. Daniel Glöckner, emlix GmbH, http://www.emlix.com
Fon +49 551 30664-0, Fax -11, Bahnhofsallee 1b, 37081 Göttingen, Germany
Geschäftsführung: Dr. Uwe Kracke, Dr. Cord Seele, Ust-IdNr.: DE 205 198 055
Sitz der Gesellschaft: Göttingen, Amtsgericht Göttingen HR B 3160

emlix - your embedded linux partner

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2009-04-23 16:17 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-14  9:41 Johannes Weiner
2009-04-14  9:41 ` [patch 01/12] xtensa: always use correct stack pointer for stack traces Johannes Weiner
2009-04-14  9:41 ` [patch 02/12] xtensa: register gpio chip before use Johannes Weiner
2009-04-14  9:41 ` [patch 03/12] xtensa: fix wrong extern declaration renamed in code using it Johannes Weiner
2009-04-14  9:41 ` [patch 04/12] xtensa: implement ccount calibration for s6000 Johannes Weiner
2009-04-14  9:41 ` [patch 05/12] xtensa: update s6105_defconfig for ccount calibration Johannes Weiner
2009-04-14  9:41 ` [patch 06/12] xtensa: implement CLK API Johannes Weiner
2009-04-14  9:41 ` [patch 07/12] xtensa: implement PTRACE_PEEKUSER addresses for nommu Johannes Weiner
2009-04-14  9:41 ` [patch 08/12] xtensa: s6000 dma engine support Johannes Weiner
2009-04-14  9:41 ` [patch 09/12] xtensa: allow platform and variant to initialize own irq chips Johannes Weiner
2009-04-23  7:19   ` Chris Zankel
2009-04-23 16:16     ` Daniel Glöckner
2009-04-14  9:41 ` [patch 10/12] xtensa: support s6000 gpio irqs and alternate function selection Johannes Weiner
2009-04-14  9:41 ` [patch 11/12] xtensa: s6105 specific configuration for s6gmac Johannes Weiner
2009-04-14  9:41 ` [patch 12/12] xtensa: enable s6gmac in s6105_defconfig Johannes Weiner
2009-04-16  7:42 ` Xtensa patches Chris Zankel
2009-04-16  8:24   ` Andrew Morton
2009-04-16  8:30     ` Paul Mundt
2009-04-16  8:56       ` Andrew Morton
2009-04-16  9:06         ` Paul Mundt
2009-04-16  8:35     ` Stephen Rothwell
2009-04-16  9:15       ` Chris Zankel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.