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