gpio.h revision e4b41dbd60e30463cc8fab21ed45b7d6227fc338
1dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner/*
2dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner *  include/asm-sh/gpio.h
3dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner *
42967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm * Generic GPIO API and pinmux table support for SuperH.
5dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner *
62967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm * Copyright (c) 2008 Magnus Damm
7dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner *
8dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner * This file is subject to the terms and conditions of the GNU General Public
9dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner * License.  See the file "COPYING" in the main directory of this archive
10dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner * for more details.
11dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner */
12dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner#ifndef __ASM_SH_GPIO_H
13dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner#define __ASM_SH_GPIO_H
14dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner
15e4b41dbd60e30463cc8fab21ed45b7d6227fc338Paul Mundt#include <linux/kernel.h>
16550109378450e7982101f299d41a80e8efc759eaPaul Mundt#include <linux/errno.h>
17550109378450e7982101f299d41a80e8efc759eaPaul Mundt
18dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner#if defined(CONFIG_CPU_SH3)
19f15cbe6f1a4b4d9df59142fc8e4abb973302cf44Paul Mundt#include <cpu/gpio.h>
20dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner#endif
21dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner
222967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammtypedef unsigned short pinmux_enum_t;
232967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammtypedef unsigned char pinmux_flag_t;
242967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
252967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_NONE            0
262967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_FUNCTION        1
272967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_GPIO            2
282967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_OUTPUT          3
292967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_INPUT           4
302967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_INPUT_PULLUP    5
312967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_TYPE_INPUT_PULLDOWN  6
322967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
332967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_FLAG_TYPE            (0x7)
342967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_FLAG_WANT_PULLUP     (1 << 3)
352967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_FLAG_WANT_PULLDOWN   (1 << 4)
362967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
372967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstruct pinmux_gpio {
382967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t enum_id;
392967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_flag_t flags;
402967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm};
412967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
422967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark }
432967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0
442967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
452967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstruct pinmux_cfg_reg {
462967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned long reg, reg_width, field_width;
472967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned long *cnt;
482967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t *enum_ids;
492967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm};
502967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
512967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_CFG_REG(name, r, r_width, f_width) \
522967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	.reg = r, .reg_width = r_width, .field_width = f_width,		\
532967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	.cnt = (unsigned long [r_width / f_width]) {}, \
542967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \
552967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
562967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstruct pinmux_data_reg {
572967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned long reg, reg_width;
582967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t *enum_ids;
592967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm};
602967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
612967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm#define PINMUX_DATA_REG(name, r, r_width) \
622967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	.reg = r, .reg_width = r_width,	\
632967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	.enum_ids = (pinmux_enum_t [r_width]) \
642967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
652967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstruct pinmux_range {
662967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t begin;
672967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t end;
6842eed42bac41c8106ed52b6b84409d84c0981e36Magnus Damm	pinmux_enum_t force;
692967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm};
702967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
712967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstruct pinmux_info {
722967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	char *name;
732967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t reserved_id;
742967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range data;
752967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range input;
762967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range input_pd;
772967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range input_pu;
782967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range output;
792967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range mark;
802967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_range function;
812967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
822967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned first_gpio, last_gpio;
832967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
842967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_gpio *gpios;
852967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_cfg_reg *cfg_regs;
862967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	struct pinmux_data_reg *data_regs;
872967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
882967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	pinmux_enum_t *gpio_data;
892967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned int gpio_data_size;
902967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
912967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	unsigned long *gpio_in_use;
922967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm};
932967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
942967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammint register_pinmux(struct pinmux_info *pip);
952967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
962967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammint __gpio_request(unsigned gpio);
972967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammstatic inline int gpio_request(unsigned gpio, const char *label)
982967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm{
992967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm	return __gpio_request(gpio);
1002967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm}
1012967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammvoid gpio_free(unsigned gpio);
1022967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammint gpio_direction_input(unsigned gpio);
1032967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammint gpio_direction_output(unsigned gpio, int value);
1042967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammint gpio_get_value(unsigned gpio);
1052967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Dammvoid gpio_set_value(unsigned gpio, int value);
10610bfc6e190c55b583ec312a6a8ef274924e16d8aPaul Mundt
107550109378450e7982101f299d41a80e8efc759eaPaul Mundt/* IRQ modes are unspported */
108550109378450e7982101f299d41a80e8efc759eaPaul Mundtstatic inline int gpio_to_irq(unsigned gpio)
109550109378450e7982101f299d41a80e8efc759eaPaul Mundt{
110550109378450e7982101f299d41a80e8efc759eaPaul Mundt	WARN_ON(1);
111550109378450e7982101f299d41a80e8efc759eaPaul Mundt	return -EINVAL;
112550109378450e7982101f299d41a80e8efc759eaPaul Mundt}
113550109378450e7982101f299d41a80e8efc759eaPaul Mundt
114550109378450e7982101f299d41a80e8efc759eaPaul Mundtstatic inline int irq_to_gpio(unsigned irq)
115550109378450e7982101f299d41a80e8efc759eaPaul Mundt{
116550109378450e7982101f299d41a80e8efc759eaPaul Mundt	WARN_ON(1);
117550109378450e7982101f299d41a80e8efc759eaPaul Mundt	return -EINVAL;
118550109378450e7982101f299d41a80e8efc759eaPaul Mundt}
119550109378450e7982101f299d41a80e8efc759eaPaul Mundt
12010bfc6e190c55b583ec312a6a8ef274924e16d8aPaul Mundt#include <asm-generic/gpio.h>
1212967dab1ae37e30f1b71316513b49fd25c42eabeMagnus Damm
122dfc5ed2a939baf08f9385a8c6249b719cac63665Markus Brunner#endif /* __ASM_SH_GPIO_H */
123