Skip to content

Commit

Permalink
sh: GPIO and pinmux base code
Browse files Browse the repository at this point in the history
This patch adds gpio code together with the pinmux table parser.
In the future we should optimize this and switch back to gpiolib.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Oct 20, 2008
1 parent 1486654 commit 2967dab
Show file tree
Hide file tree
Showing 5 changed files with 593 additions and 4 deletions.
3 changes: 3 additions & 0 deletions arch/sh/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ
config GENERIC_IRQ_PROBE
def_bool y

config GENERIC_GPIO
def_bool n

config GENERIC_CALIBRATE_DELAY
bool

Expand Down
92 changes: 90 additions & 2 deletions arch/sh/include/asm/gpio.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/*
* include/asm-sh/gpio.h
*
* Copyright (C) 2007 Markus Brunner, Mark Jonas
* Generic GPIO API and pinmux table support for SuperH.
*
* Addresses for the Pin Function Controller
* Copyright (c) 2008 Magnus Damm
*
* 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
Expand All @@ -16,4 +16,92 @@
#include <cpu/gpio.h>
#endif

typedef unsigned short pinmux_enum_t;
typedef unsigned char pinmux_flag_t;

#define PINMUX_TYPE_NONE 0
#define PINMUX_TYPE_FUNCTION 1
#define PINMUX_TYPE_GPIO 2
#define PINMUX_TYPE_OUTPUT 3
#define PINMUX_TYPE_INPUT 4
#define PINMUX_TYPE_INPUT_PULLUP 5
#define PINMUX_TYPE_INPUT_PULLDOWN 6

#define PINMUX_FLAG_TYPE (0x7)
#define PINMUX_FLAG_WANT_PULLUP (1 << 3)
#define PINMUX_FLAG_WANT_PULLDOWN (1 << 4)

struct pinmux_gpio {
pinmux_enum_t enum_id;
pinmux_flag_t flags;
};

#define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark }
#define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0

struct pinmux_cfg_reg {
unsigned long reg, reg_width, field_width;
unsigned long *cnt;
pinmux_enum_t *enum_ids;
};

#define PINMUX_CFG_REG(name, r, r_width, f_width) \
.reg = r, .reg_width = r_width, .field_width = f_width, \
.cnt = (unsigned long [r_width / f_width]) {}, \
.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \

struct pinmux_data_reg {
unsigned long reg, reg_width;
pinmux_enum_t *enum_ids;
};

#define PINMUX_DATA_REG(name, r, r_width) \
.reg = r, .reg_width = r_width, \
.enum_ids = (pinmux_enum_t [r_width]) \

struct pinmux_range {
pinmux_enum_t begin;
pinmux_enum_t end;
};

struct pinmux_info {
char *name;
pinmux_enum_t reserved_id;
struct pinmux_range data;
struct pinmux_range input;
struct pinmux_range input_pd;
struct pinmux_range input_pu;
struct pinmux_range output;
struct pinmux_range mark;
struct pinmux_range function;

unsigned first_gpio, last_gpio;

struct pinmux_gpio *gpios;
struct pinmux_cfg_reg *cfg_regs;
struct pinmux_data_reg *data_regs;

pinmux_enum_t *gpio_data;
unsigned int gpio_data_size;

unsigned long *gpio_in_use;
};

int register_pinmux(struct pinmux_info *pip);

int __gpio_request(unsigned gpio);
static inline int gpio_request(unsigned gpio, const char *label)
{
return __gpio_request(gpio);
}
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned gpio);
void gpio_set_value(unsigned gpio, int value);
static inline int gpio_export(unsigned gpio, bool direction_may_change)
{
return 0;
}

#endif /* __ASM_SH_GPIO_H */
2 changes: 1 addition & 1 deletion arch/sh/kernel/Makefile_32
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
extra-y := head_32.o init_task.o vmlinux.lds

obj-y := debugtraps.o io.o io_generic.o irq.o machvec.o process_32.o \
ptrace_32.o setup.o signal_32.o sys_sh.o sys_sh32.o \
ptrace_32.o setup.o signal_32.o sys_sh.o sys_sh32.o gpio.o \
syscalls_32.o time_32.o topology.o traps.o traps_32.o

obj-y += cpu/ timers/
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/kernel/Makefile_64
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
extra-y := head_64.o init_task.o vmlinux.lds

obj-y := debugtraps.o io.o io_generic.o irq.o machvec.o process_64.o \
ptrace_64.o setup.o signal_64.o sys_sh.o sys_sh64.o \
ptrace_64.o setup.o signal_64.o sys_sh.o sys_sh64.o gpio.o \
syscalls_64.o time_64.o topology.o traps.o traps_64.o

obj-y += cpu/ timers/
Expand Down
Loading

0 comments on commit 2967dab

Please sign in to comment.