Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 140356
b: refs/heads/master
c: 000af2c
h: refs/heads/master
v: v3
  • Loading branch information
Johannes Weiner authored and Chris Zankel committed Apr 3, 2009
1 parent 7b5f632 commit cc24607
Show file tree
Hide file tree
Showing 9 changed files with 482 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eff35af9c0c83a24376a67ff88c65679c25c7a51
refs/heads/master: 000af2c5a8913ebd763313d0c9ebc66c2c4765b1
8 changes: 8 additions & 0 deletions trunk/arch/xtensa/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ config GENERIC_HWEIGHT
config GENERIC_HARDIRQS
def_bool y

config GENERIC_GPIO
def_bool y

config ARCH_HAS_ILOG2_U32
def_bool n

Expand Down Expand Up @@ -69,6 +72,11 @@ config XTENSA_VARIANT_DC232B
select MMU
help
This variant refers to Tensilica's Diamond 232L Standard core Rev.B (LE).

config XTENSA_VARIANT_S6000
bool "s6000 - Stretch software configurable processor"
select VARIANT_IRQ_SWITCH
select ARCH_REQUIRE_GPIOLIB
endchoice

config XTENSA_UNALIGNED_USER
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/xtensa/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

variant-$(CONFIG_XTENSA_VARIANT_FSF) := fsf
variant-$(CONFIG_XTENSA_VARIANT_DC232B) := dc232b
variant-$(CONFIG_XTENSA_VARIANT_S6000) := s6000
variant-$(CONFIG_XTENSA_VARIANT_LINUX_CUSTOM) := custom

VARIANT = $(variant-y)
Expand Down
56 changes: 56 additions & 0 deletions trunk/arch/xtensa/include/asm/gpio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Generic GPIO API implementation for xtensa.
*
* Stolen from x86, which is derived from the generic GPIO API for powerpc:
*
* Copyright (c) 2007-2008 MontaVista Software, Inc.
*
* Author: Anton Vorontsov <avorontsov@ru.mvista.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.
*/

#ifndef _ASM_XTENSA_GPIO_H
#define _ASM_XTENSA_GPIO_H

#include <asm-generic/gpio.h>

#ifdef CONFIG_GPIOLIB

/*
* Just call gpiolib.
*/
static inline int gpio_get_value(unsigned int gpio)
{
return __gpio_get_value(gpio);
}

static inline void gpio_set_value(unsigned int gpio, int value)
{
__gpio_set_value(gpio, value);
}

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;
}

static inline int irq_to_gpio(unsigned int irq)
{
return -EINVAL;
}

#endif /* CONFIG_GPIOLIB */

#endif /* _ASM_XTENSA_GPIO_H */
3 changes: 3 additions & 0 deletions trunk/arch/xtensa/variants/s6000/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# s6000 Makefile

obj-y += irq.o gpio.o
71 changes: 71 additions & 0 deletions trunk/arch/xtensa/variants/s6000/gpio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* s6000 gpio driver
*
* Copyright (c) 2009 emlix GmbH
* Authors: Oskar Schirmer <os@emlix.com>
* Johannes Weiner <jw@emlix.com>
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/gpio.h>

#include <variant/hardware.h>

#define S6_GPIO_DATA 0x000
#define S6_GPIO_IS 0x404
#define S6_GPIO_IBE 0x408
#define S6_GPIO_IEV 0x40C
#define S6_GPIO_IE 0x410
#define S6_GPIO_RIS 0x414
#define S6_GPIO_MIS 0x418
#define S6_GPIO_IC 0x41C
#define S6_GPIO_AFSEL 0x420
#define S6_GPIO_DIR 0x800
#define S6_GPIO_BANK(nr) ((nr) * 0x1000)
#define S6_GPIO_MASK(nr) (4 << (nr))
#define S6_GPIO_OFFSET(nr) \
(S6_GPIO_BANK((nr) >> 3) + S6_GPIO_MASK((nr) & 7))

static int direction_input(struct gpio_chip *chip, unsigned int off)
{
writeb(0, S6_REG_GPIO + S6_GPIO_DIR + S6_GPIO_OFFSET(off));
return 0;
}

static int get(struct gpio_chip *chip, unsigned int off)
{
return readb(S6_REG_GPIO + S6_GPIO_DATA + S6_GPIO_OFFSET(off));
}

static int direction_output(struct gpio_chip *chip, unsigned int off, int val)
{
unsigned rel = S6_GPIO_OFFSET(off);
writeb(~0, S6_REG_GPIO + S6_GPIO_DIR + rel);
writeb(val ? ~0 : 0, S6_REG_GPIO + S6_GPIO_DATA + rel);
return 0;
}

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 struct gpio_chip gpiochip = {
.owner = THIS_MODULE,
.direction_input = direction_input,
.get = get,
.direction_output = direction_output,
.set = set,
.base = 0,
.ngpio = 24,
.can_sleep = 0, /* no blocking io needed */
.exported = 0, /* no exporting to userspace */
};

static int gpio_init(void)
{
return gpiochip_add(&gpiochip);
}
device_initcall(gpio_init);
Loading

0 comments on commit cc24607

Please sign in to comment.