2005-04-16 15:20:36 -07:00
/* linux/arch/arm/mach-s3c2410/gpio.c
*
2007-02-11 18:31:01 +01:00
* Copyright ( c ) 2004 - 2006 Simtec Electronics
2005-04-16 15:20:36 -07:00
* Ben Dooks < ben @ simtec . co . uk >
*
2007-02-11 18:31:01 +01:00
* S3C2410 GPIO support
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
2007-02-11 18:31:01 +01:00
*/
2005-04-16 15:20:36 -07:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/interrupt.h>
# include <linux/ioport.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2005-04-16 15:20:36 -07:00
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2009-10-26 21:21:32 +00:00
# include <mach/gpio-fns.h>
2005-04-16 15:20:36 -07:00
# include <asm/irq.h>
2008-08-05 16:14:15 +01:00
# include <mach/regs-gpio.h>
2005-04-16 15:20:36 -07:00
2007-02-11 18:31:01 +01:00
int s3c2410_gpio_irqfilter ( unsigned int pin , unsigned int on ,
unsigned int config )
2005-04-16 15:20:36 -07:00
{
2007-02-11 18:31:01 +01:00
void __iomem * reg = S3C24XX_EINFLT0 ;
2005-04-16 15:20:36 -07:00
unsigned long flags ;
2007-02-11 18:31:01 +01:00
unsigned long val ;
2005-04-16 15:20:36 -07:00
2009-05-17 22:32:23 +01:00
if ( pin < S3C2410_GPG ( 8 ) | | pin > S3C2410_GPG ( 15 ) )
2009-05-18 19:40:18 +01:00
return - EINVAL ;
2005-04-16 15:20:36 -07:00
2007-02-11 18:31:01 +01:00
config & = 0xff ;
2005-04-16 15:20:36 -07:00
2009-05-17 22:32:23 +01:00
pin - = S3C2410_GPG ( 8 ) ;
2007-02-11 18:31:01 +01:00
reg + = pin & ~ 3 ;
2005-04-16 15:20:36 -07:00
local_irq_save ( flags ) ;
2007-02-11 18:31:01 +01:00
/* update filter width and clock source */
2005-04-16 15:20:36 -07:00
2007-02-11 18:31:01 +01:00
val = __raw_readl ( reg ) ;
val & = ~ ( 0xff < < ( ( pin & 3 ) * 8 ) ) ;
val | = config < < ( ( pin & 3 ) * 8 ) ;
__raw_writel ( val , reg ) ;
2005-04-16 15:20:36 -07:00
2007-02-11 18:31:01 +01:00
/* update filter enable */
2005-04-16 15:20:36 -07:00
2007-02-11 18:31:01 +01:00
val = __raw_readl ( S3C24XX_EXTINT2 ) ;
val & = ~ ( 1 < < ( ( pin * 4 ) + 3 ) ) ;
val | = on < < ( ( pin * 4 ) + 3 ) ;
__raw_writel ( val , S3C24XX_EXTINT2 ) ;
2005-04-16 15:20:36 -07:00
local_irq_restore ( flags ) ;
2007-02-11 18:31:01 +01:00
return 0 ;
2006-10-30 02:27:45 +01:00
}
2007-02-11 18:31:01 +01:00
EXPORT_SYMBOL ( s3c2410_gpio_irqfilter ) ;