2013-03-13 02:22:22 +08:00
|
|
|
From patchwork Fri Jan 4 15:30:38 2013
|
|
|
|
Content-Type: text/plain; charset="utf-8"
|
|
|
|
MIME-Version: 1.0
|
|
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
Subject: [RFC,1/3] ARM: gemini: get platform to build again
|
|
|
|
Date: Fri, 04 Jan 2013 15:30:38 -0000
|
|
|
|
From: Arnd Bergmann <arnd@arndb.de>
|
|
|
|
X-Patchwork-Id: 1933501
|
|
|
|
Message-Id: <1357313440-20092-1-git-send-email-arnd@arndb.de>
|
|
|
|
To: Hans Ulli Kroll <ulli.kroll@googlemail.com>
|
|
|
|
Cc: Russell King <rmk+kernel@arm.linux.org.uk>, Arnd Bergmann <arnd@arndb.de>,
|
|
|
|
Florian Fainelli <florian@openwrt.org>,
|
|
|
|
linux-arm-kernel@lists.infradead.org
|
|
|
|
|
|
|
|
There is no defconfig file for gemini, which has lead to a lot
|
|
|
|
of bitrot. This makes the broken board files, the gpio implementation
|
|
|
|
and the reset logic work again, and fixes the build warnings
|
|
|
|
that got introduced with the changes to the readl/writel prototypes.
|
|
|
|
|
|
|
|
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
|
|
|
|
|
|
|
---
|
|
|
|
(retransmitted because the original was rejected by linux-arm-kernel)
|
|
|
|
|
|
|
|
arch/arm/Kconfig | 1 +
|
|
|
|
arch/arm/mach-gemini/Makefile | 2 +-
|
|
|
|
arch/arm/mach-gemini/board-nas4220b.c | 1 +
|
|
|
|
arch/arm/mach-gemini/board-rut1xx.c | 2 ++
|
|
|
|
arch/arm/mach-gemini/board-wbd111.c | 1 +
|
|
|
|
arch/arm/mach-gemini/board-wbd222.c | 1 +
|
|
|
|
arch/arm/mach-gemini/common.h | 2 ++
|
|
|
|
arch/arm/mach-gemini/gpio.c | 19 ++++++++++---------
|
|
|
|
arch/arm/mach-gemini/include/mach/hardware.h | 2 +-
|
|
|
|
arch/arm/mach-gemini/include/mach/system.h | 23 -----------------------
|
|
|
|
arch/arm/mach-gemini/irq.c | 4 ++--
|
|
|
|
arch/arm/mach-gemini/mm.c | 22 +++++++++++-----------
|
|
|
|
arch/arm/mach-gemini/reset.c | 23 +++++++++++++++++++++++
|
|
|
|
13 files changed, 56 insertions(+), 47 deletions(-)
|
|
|
|
delete mode 100644 arch/arm/mach-gemini/include/mach/system.h
|
|
|
|
create mode 100644 arch/arm/mach-gemini/reset.c
|
|
|
|
|
|
|
|
--- a/arch/arm/Kconfig
|
|
|
|
+++ b/arch/arm/Kconfig
|
2013-03-25 22:18:32 +08:00
|
|
|
@@ -410,6 +410,7 @@ config ARCH_GEMINI
|
2013-03-13 02:22:22 +08:00
|
|
|
bool "Cortina Systems Gemini"
|
|
|
|
select ARCH_REQUIRE_GPIOLIB
|
|
|
|
select ARCH_USES_GETTIMEOFFSET
|
|
|
|
+ select NEED_MACH_GPIO_H
|
|
|
|
select CPU_FA526
|
|
|
|
help
|
|
|
|
Support for the Cortina Systems Gemini family SoCs
|
|
|
|
--- a/arch/arm/mach-gemini/Makefile
|
|
|
|
+++ b/arch/arm/mach-gemini/Makefile
|
|
|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
|
|
|
# Object file lists.
|
|
|
|
|
|
|
|
-obj-y := irq.o mm.o time.o devices.o gpio.o idle.o
|
|
|
|
+obj-y := irq.o mm.o time.o devices.o gpio.o idle.o reset.o
|
|
|
|
|
|
|
|
# Board-specific support
|
|
|
|
obj-$(CONFIG_MACH_NAS4220B) += board-nas4220b.o
|
|
|
|
--- a/arch/arm/mach-gemini/board-nas4220b.c
|
|
|
|
+++ b/arch/arm/mach-gemini/board-nas4220b.c
|
2013-03-25 22:18:32 +08:00
|
|
|
@@ -103,4 +103,5 @@ MACHINE_START(NAS4220B, "Raidsonic NAS I
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_irq = gemini_init_irq,
|
2013-03-25 22:18:32 +08:00
|
|
|
.init_time = gemini_timer_init,
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_machine = ib4220b_init,
|
|
|
|
+ .restart = gemini_restart,
|
|
|
|
MACHINE_END
|
|
|
|
--- a/arch/arm/mach-gemini/board-rut1xx.c
|
|
|
|
+++ b/arch/arm/mach-gemini/board-rut1xx.c
|
|
|
|
@@ -14,6 +14,7 @@
|
|
|
|
#include <linux/leds.h>
|
|
|
|
#include <linux/input.h>
|
|
|
|
#include <linux/gpio_keys.h>
|
|
|
|
+#include <linux/sizes.h>
|
|
|
|
|
|
|
|
#include <asm/mach-types.h>
|
|
|
|
#include <asm/mach/arch.h>
|
2013-03-25 22:18:32 +08:00
|
|
|
@@ -87,4 +88,5 @@ MACHINE_START(RUT100, "Teltonika RUT100"
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_irq = gemini_init_irq,
|
2013-03-25 22:18:32 +08:00
|
|
|
.init_time = gemini_timer_init,
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_machine = rut1xx_init,
|
|
|
|
+ .restart = gemini_restart,
|
|
|
|
MACHINE_END
|
|
|
|
--- a/arch/arm/mach-gemini/board-wbd111.c
|
|
|
|
+++ b/arch/arm/mach-gemini/board-wbd111.c
|
2013-03-25 22:18:32 +08:00
|
|
|
@@ -130,4 +130,5 @@ MACHINE_START(WBD111, "Wiliboard WBD-111
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_irq = gemini_init_irq,
|
2013-03-25 22:18:32 +08:00
|
|
|
.init_time = gemini_timer_init,
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_machine = wbd111_init,
|
|
|
|
+ .restart = gemini_restart,
|
|
|
|
MACHINE_END
|
|
|
|
--- a/arch/arm/mach-gemini/board-wbd222.c
|
|
|
|
+++ b/arch/arm/mach-gemini/board-wbd222.c
|
2013-03-25 22:18:32 +08:00
|
|
|
@@ -130,4 +130,5 @@ MACHINE_START(WBD222, "Wiliboard WBD-222
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_irq = gemini_init_irq,
|
2013-03-25 22:18:32 +08:00
|
|
|
.init_time = gemini_timer_init,
|
2013-03-13 02:22:22 +08:00
|
|
|
.init_machine = wbd222_init,
|
|
|
|
+ .restart = gemini_restart,
|
|
|
|
MACHINE_END
|
|
|
|
--- a/arch/arm/mach-gemini/common.h
|
|
|
|
+++ b/arch/arm/mach-gemini/common.h
|
|
|
|
@@ -26,4 +26,6 @@ extern int platform_register_pflash(unsi
|
|
|
|
struct mtd_partition *parts,
|
|
|
|
unsigned int nr_parts);
|
|
|
|
|
|
|
|
+extern void gemini_restart(char mode, const char *cmd);
|
|
|
|
+
|
|
|
|
#endif /* __GEMINI_COMMON_H__ */
|
|
|
|
--- a/arch/arm/mach-gemini/gpio.c
|
|
|
|
+++ b/arch/arm/mach-gemini/gpio.c
|
|
|
|
@@ -21,6 +21,7 @@
|
|
|
|
|
|
|
|
#include <mach/hardware.h>
|
|
|
|
#include <mach/irqs.h>
|
|
|
|
+#include <mach/gpio.h>
|
|
|
|
|
|
|
|
#define GPIO_BASE(x) IO_ADDRESS(GEMINI_GPIO_BASE(x))
|
|
|
|
|
|
|
|
@@ -44,7 +45,7 @@
|
|
|
|
|
|
|
|
#define GPIO_PORT_NUM 3
|
|
|
|
|
|
|
|
-static void _set_gpio_irqenable(unsigned int base, unsigned int index,
|
|
|
|
+static void _set_gpio_irqenable(void __iomem *base, unsigned int index,
|
|
|
|
int enable)
|
|
|
|
{
|
|
|
|
unsigned int reg;
|
|
|
|
@@ -57,7 +58,7 @@ static void _set_gpio_irqenable(unsigned
|
|
|
|
static void gpio_ack_irq(struct irq_data *d)
|
|
|
|
{
|
|
|
|
unsigned int gpio = irq_to_gpio(d->irq);
|
|
|
|
- unsigned int base = GPIO_BASE(gpio / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(gpio / 32);
|
|
|
|
|
|
|
|
__raw_writel(1 << (gpio % 32), base + GPIO_INT_CLR);
|
|
|
|
}
|
|
|
|
@@ -65,7 +66,7 @@ static void gpio_ack_irq(struct irq_data
|
|
|
|
static void gpio_mask_irq(struct irq_data *d)
|
|
|
|
{
|
|
|
|
unsigned int gpio = irq_to_gpio(d->irq);
|
|
|
|
- unsigned int base = GPIO_BASE(gpio / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(gpio / 32);
|
|
|
|
|
|
|
|
_set_gpio_irqenable(base, gpio % 32, 0);
|
|
|
|
}
|
|
|
|
@@ -73,7 +74,7 @@ static void gpio_mask_irq(struct irq_dat
|
|
|
|
static void gpio_unmask_irq(struct irq_data *d)
|
|
|
|
{
|
|
|
|
unsigned int gpio = irq_to_gpio(d->irq);
|
|
|
|
- unsigned int base = GPIO_BASE(gpio / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(gpio / 32);
|
|
|
|
|
|
|
|
_set_gpio_irqenable(base, gpio % 32, 1);
|
|
|
|
}
|
|
|
|
@@ -82,7 +83,7 @@ static int gpio_set_irq_type(struct irq_
|
|
|
|
{
|
|
|
|
unsigned int gpio = irq_to_gpio(d->irq);
|
|
|
|
unsigned int gpio_mask = 1 << (gpio % 32);
|
|
|
|
- unsigned int base = GPIO_BASE(gpio / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(gpio / 32);
|
|
|
|
unsigned int reg_both, reg_level, reg_type;
|
|
|
|
|
|
|
|
reg_type = __raw_readl(base + GPIO_INT_TYPE);
|
|
|
|
@@ -120,7 +121,7 @@ static int gpio_set_irq_type(struct irq_
|
|
|
|
__raw_writel(reg_level, base + GPIO_INT_LEVEL);
|
|
|
|
__raw_writel(reg_both, base + GPIO_INT_BOTH_EDGE);
|
|
|
|
|
|
|
|
- gpio_ack_irq(d->irq);
|
|
|
|
+ gpio_ack_irq(d);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
@@ -153,7 +154,7 @@ static struct irq_chip gpio_irq_chip = {
|
|
|
|
static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset,
|
|
|
|
int dir)
|
|
|
|
{
|
|
|
|
- unsigned int base = GPIO_BASE(offset / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(offset / 32);
|
|
|
|
unsigned int reg;
|
|
|
|
|
|
|
|
reg = __raw_readl(base + GPIO_DIR);
|
|
|
|
@@ -166,7 +167,7 @@ static void _set_gpio_direction(struct g
|
|
|
|
|
|
|
|
static void gemini_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
|
|
|
{
|
|
|
|
- unsigned int base = GPIO_BASE(offset / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(offset / 32);
|
|
|
|
|
|
|
|
if (value)
|
|
|
|
__raw_writel(1 << (offset % 32), base + GPIO_DATA_SET);
|
|
|
|
@@ -176,7 +177,7 @@ static void gemini_gpio_set(struct gpio_
|
|
|
|
|
|
|
|
static int gemini_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|
|
|
{
|
|
|
|
- unsigned int base = GPIO_BASE(offset / 32);
|
|
|
|
+ void __iomem *base = GPIO_BASE(offset / 32);
|
|
|
|
|
|
|
|
return (__raw_readl(base + GPIO_DATA_IN) >> (offset % 32)) & 1;
|
|
|
|
}
|
|
|
|
--- a/arch/arm/mach-gemini/include/mach/hardware.h
|
|
|
|
+++ b/arch/arm/mach-gemini/include/mach/hardware.h
|
|
|
|
@@ -69,6 +69,6 @@
|
|
|
|
/*
|
|
|
|
* macro to get at IO space when running virtually
|
|
|
|
*/
|
|
|
|
-#define IO_ADDRESS(x) ((((x) & 0xFFF00000) >> 4) | ((x) & 0x000FFFFF) | 0xF0000000)
|
|
|
|
+#define IO_ADDRESS(x) IOMEM((((x) & 0xFFF00000) >> 4) | ((x) & 0x000FFFFF) | 0xF0000000)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
--- a/arch/arm/mach-gemini/include/mach/system.h
|
|
|
|
+++ /dev/null
|
|
|
|
@@ -1,23 +0,0 @@
|
|
|
|
-/*
|
|
|
|
- * Copyright (C) 2001-2006 Storlink, Corp.
|
|
|
|
- * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
|
|
|
|
- *
|
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
- * (at your option) any later version.
|
|
|
|
- */
|
|
|
|
-#ifndef __MACH_SYSTEM_H
|
|
|
|
-#define __MACH_SYSTEM_H
|
|
|
|
-
|
|
|
|
-#include <linux/io.h>
|
|
|
|
-#include <mach/hardware.h>
|
|
|
|
-#include <mach/global_reg.h>
|
|
|
|
-
|
|
|
|
-static inline void arch_reset(char mode, const char *cmd)
|
|
|
|
-{
|
|
|
|
- __raw_writel(RESET_GLOBAL | RESET_CPU1,
|
|
|
|
- IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_RESET);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-#endif /* __MACH_SYSTEM_H */
|
|
|
|
--- a/arch/arm/mach-gemini/irq.c
|
|
|
|
+++ b/arch/arm/mach-gemini/irq.c
|
|
|
|
@@ -65,8 +65,8 @@ static struct irq_chip gemini_irq_chip =
|
|
|
|
|
|
|
|
static struct resource irq_resource = {
|
|
|
|
.name = "irq_handler",
|
|
|
|
- .start = IO_ADDRESS(GEMINI_INTERRUPT_BASE),
|
|
|
|
- .end = IO_ADDRESS(FIQ_STATUS(GEMINI_INTERRUPT_BASE)) + 4,
|
|
|
|
+ .start = GEMINI_INTERRUPT_BASE,
|
|
|
|
+ .end = FIQ_STATUS(GEMINI_INTERRUPT_BASE) + 4,
|
|
|
|
};
|
|
|
|
|
|
|
|
void __init gemini_init_irq(void)
|
|
|
|
--- a/arch/arm/mach-gemini/mm.c
|
|
|
|
+++ b/arch/arm/mach-gemini/mm.c
|
|
|
|
@@ -19,57 +19,57 @@
|
|
|
|
/* Page table mapping for I/O region */
|
|
|
|
static struct map_desc gemini_io_desc[] __initdata = {
|
|
|
|
{
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_GLOBAL_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_GLOBAL_BASE),
|
|
|
|
.pfn =__phys_to_pfn(GEMINI_GLOBAL_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_UART_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_UART_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_UART_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_TIMER_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_TIMER_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_TIMER_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_INTERRUPT_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_INTERRUPT_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_INTERRUPT_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_POWER_CTRL_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_POWER_CTRL_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_POWER_CTRL_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_GPIO_BASE(0)),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_GPIO_BASE(0)),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_GPIO_BASE(0)),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_GPIO_BASE(1)),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_GPIO_BASE(1)),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_GPIO_BASE(1)),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_GPIO_BASE(2)),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_GPIO_BASE(2)),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_GPIO_BASE(2)),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_FLASH_CTRL_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_FLASH_CTRL_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_FLASH_CTRL_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_DRAM_CTRL_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_DRAM_CTRL_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_DRAM_CTRL_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
}, {
|
|
|
|
- .virtual = IO_ADDRESS(GEMINI_GENERAL_DMA_BASE),
|
|
|
|
+ .virtual = (unsigned long)IO_ADDRESS(GEMINI_GENERAL_DMA_BASE),
|
|
|
|
.pfn = __phys_to_pfn(GEMINI_GENERAL_DMA_BASE),
|
|
|
|
.length = SZ_512K,
|
|
|
|
.type = MT_DEVICE,
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/arch/arm/mach-gemini/reset.c
|
|
|
|
@@ -0,0 +1,23 @@
|
|
|
|
+/*
|
|
|
|
+ * Copyright (C) 2001-2006 Storlink, Corp.
|
|
|
|
+ * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
|
|
|
|
+ *
|
|
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
|
|
+ * (at your option) any later version.
|
|
|
|
+ */
|
|
|
|
+#ifndef __MACH_SYSTEM_H
|
|
|
|
+#define __MACH_SYSTEM_H
|
|
|
|
+
|
|
|
|
+#include <linux/io.h>
|
|
|
|
+#include <mach/hardware.h>
|
|
|
|
+#include <mach/global_reg.h>
|
|
|
|
+
|
|
|
|
+void gemini_restart(char mode, const char *cmd)
|
|
|
|
+{
|
|
|
|
+ __raw_writel(RESET_GLOBAL | RESET_CPU1,
|
|
|
|
+ IO_ADDRESS(GEMINI_GLOBAL_BASE) + GLOBAL_RESET);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif /* __MACH_SYSTEM_H */
|