2005-04-16 15:20:36 -07:00
/*
* linux / include / asm - arm / arch - omap / gpio . h
*
* OMAP GPIO handling defines and functions
*
2005-09-07 17:20:27 +01:00
* Copyright ( C ) 2003 - 2005 Nokia Corporation
2005-04-16 15:20:36 -07:00
*
2007-05-09 08:30:57 +02:00
* Written by Juha Yrjölä < juha . yrjola @ nokia . com >
2005-04-16 15:20:36 -07:00
*
* 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 .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
# ifndef __ASM_ARCH_OMAP_GPIO_H
# define __ASM_ARCH_OMAP_GPIO_H
2005-11-16 14:51:20 +00:00
# include <asm/hardware.h>
2005-04-16 15:20:36 -07:00
# include <asm/arch/irqs.h>
# include <asm/io.h>
2005-09-07 17:20:27 +01:00
# define OMAP_MPUIO_BASE (void __iomem *)0xfffb5000
# ifdef CONFIG_ARCH_OMAP730
# define OMAP_MPUIO_INPUT_LATCH 0x00
# define OMAP_MPUIO_OUTPUT 0x02
# define OMAP_MPUIO_IO_CNTL 0x04
# define OMAP_MPUIO_KBR_LATCH 0x08
# define OMAP_MPUIO_KBC 0x0a
# define OMAP_MPUIO_GPIO_EVENT_MODE 0x0c
# define OMAP_MPUIO_GPIO_INT_EDGE 0x0e
# define OMAP_MPUIO_KBD_INT 0x10
# define OMAP_MPUIO_GPIO_INT 0x12
# define OMAP_MPUIO_KBD_MASKIT 0x14
# define OMAP_MPUIO_GPIO_MASKIT 0x16
# define OMAP_MPUIO_GPIO_DEBOUNCING 0x18
# define OMAP_MPUIO_LATCH 0x1a
# else
2005-04-16 15:20:36 -07:00
# define OMAP_MPUIO_INPUT_LATCH 0x00
# define OMAP_MPUIO_OUTPUT 0x04
# define OMAP_MPUIO_IO_CNTL 0x08
# define OMAP_MPUIO_KBR_LATCH 0x10
# define OMAP_MPUIO_KBC 0x14
# define OMAP_MPUIO_GPIO_EVENT_MODE 0x18
# define OMAP_MPUIO_GPIO_INT_EDGE 0x1c
# define OMAP_MPUIO_KBD_INT 0x20
# define OMAP_MPUIO_GPIO_INT 0x24
# define OMAP_MPUIO_KBD_MASKIT 0x28
# define OMAP_MPUIO_GPIO_MASKIT 0x2c
# define OMAP_MPUIO_GPIO_DEBOUNCING 0x30
# define OMAP_MPUIO_LATCH 0x34
2005-09-07 17:20:27 +01:00
# endif
2005-04-16 15:20:36 -07:00
# define OMAP_MPUIO(nr) (OMAP_MAX_GPIO_LINES + (nr))
# define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES)
# define OMAP_GPIO_IRQ(nr) (OMAP_GPIO_IS_MPUIO(nr) ? \
IH_MPUIO_BASE + ( ( nr ) & 0x0f ) : \
2005-11-10 14:26:53 +00:00
IH_GPIO_BASE + ( nr ) )
2005-04-16 15:20:36 -07:00
extern int omap_gpio_init ( void ) ; /* Call from board init only */
extern int omap_request_gpio ( int gpio ) ;
extern void omap_free_gpio ( int gpio ) ;
extern void omap_set_gpio_direction ( int gpio , int is_input ) ;
extern void omap_set_gpio_dataout ( int gpio , int enable ) ;
extern int omap_get_gpio_datain ( int gpio ) ;
2007-02-12 00:53:12 -08:00
/*-------------------------------------------------------------------------*/
/* wrappers for "new style" GPIO calls. the old OMAP-specfic ones should
* eventually be removed ( along with this errno . h inclusion ) , and maybe
* gpios should put MPUIOs last too .
*/
# include <asm/errno.h>
static inline int gpio_request ( unsigned gpio , const char * label )
{
return omap_request_gpio ( gpio ) ;
}
static inline void gpio_free ( unsigned gpio )
{
omap_free_gpio ( gpio ) ;
}
static inline int __gpio_set_direction ( unsigned gpio , int is_input )
{
if ( cpu_class_is_omap2 ( ) ) {
if ( gpio > OMAP_MAX_GPIO_LINES )
return - EINVAL ;
} else {
if ( gpio > ( OMAP_MAX_GPIO_LINES + 16 /* MPUIO */ ) )
return - EINVAL ;
}
omap_set_gpio_direction ( gpio , is_input ) ;
return 0 ;
}
static inline int gpio_direction_input ( unsigned gpio )
{
return __gpio_set_direction ( gpio , 1 ) ;
}
2007-03-16 13:38:14 -08:00
static inline int gpio_direction_output ( unsigned gpio , int value )
2007-02-12 00:53:12 -08:00
{
2007-03-16 13:38:14 -08:00
omap_set_gpio_dataout ( gpio , value ) ;
2007-02-12 00:53:12 -08:00
return __gpio_set_direction ( gpio , 0 ) ;
}
static inline int gpio_get_value ( unsigned gpio )
{
return omap_get_gpio_datain ( gpio ) ;
}
static inline void gpio_set_value ( unsigned gpio , int value )
{
omap_set_gpio_dataout ( gpio , value ) ;
}
# include <asm-generic/gpio.h> /* cansleep wrappers */
static inline int gpio_to_irq ( unsigned gpio )
{
return OMAP_GPIO_IRQ ( gpio ) ;
}
static inline int irq_to_gpio ( unsigned irq )
{
if ( cpu_class_is_omap1 ( ) & & ( irq < ( IH_MPUIO_BASE + 16 ) ) )
return ( irq - IH_MPUIO_BASE ) + OMAP_MAX_GPIO_LINES ;
return irq - IH_GPIO_BASE ;
}
2005-04-16 15:20:36 -07:00
# endif