diff options
author | lars <lars@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-05-18 17:55:41 +0000 |
---|---|---|
committer | lars <lars@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-05-18 17:55:41 +0000 |
commit | fb189822fcab111e55d1c7e83c482dc2c144500a (patch) | |
tree | dd10e61f382ace3afbe40af3af8238757cf5e3d0 /target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c | |
parent | c5f7c391b56bb88e21895f0fc9310cd0919e8d0c (diff) |
[s3c24xx] bump to 2.6.30-rc6
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15918 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c')
-rw-r--r-- | target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c b/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c new file mode 100644 index 000000000..c65304ae1 --- /dev/null +++ b/target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c @@ -0,0 +1,86 @@ +/* + * Common utility code for GTA02 + * + * Copyright (C) 2008 by Openmoko, Inc. + * Author: Holger Hans Peter Freyther <freyther@openmoko.org> + * All rights reserved. + * + * 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 + * + */ + +#include <linux/module.h> +#include <linux/io.h> +#include <linux/irq.h> + +#include <asm/gpio.h> +#include <mach/regs-gpio.h> +#include <linux/gta02-shadow.h> + +/** + * Shadow GPIO bank B handling. For the LEDs we need to keep track of the state + * in software. The s3c2410_gpio_setpin must not be used for GPIOs on bank B + */ +static unsigned long gpb_mask; +static unsigned long gpb_state; + +void gta02_gpb_add_shadow_gpio(unsigned int gpio) +{ + unsigned long offset = S3C2410_GPIO_OFFSET(gpio); + unsigned long flags; + + local_irq_save(flags); + gpb_mask |= 1L << offset; + local_irq_restore(flags); +} +EXPORT_SYMBOL(gta02_gpb_add_shadow_gpio); + +static void set_shadow_gpio(unsigned long offset, unsigned int value) +{ + unsigned long state = value != 0; + + gpb_state &= ~(1L << offset); + gpb_state |= state << offset; +} + +void gta02_gpb_setpin(unsigned int pin, unsigned to) +{ + void __iomem *base = S3C24XX_GPIO_BASE(S3C2410_GPB0); + unsigned long offset = S3C2410_GPIO_OFFSET(pin); + unsigned long flags; + unsigned long dat; + + BUG_ON(base != S3C24XX_GPIO_BASE(pin)); + + local_irq_save(flags); + dat = __raw_readl(base + 0x04); + + /* Add the shadow values */ + dat &= ~gpb_mask; + dat |= gpb_state; + + /* Do the operation like s3c2410_gpio_setpin */ + dat &= ~(1L << offset); + dat |= to << offset; + + /* Update the shadow state */ + if ((1L << offset) & gpb_mask) + set_shadow_gpio(offset, to); + + __raw_writel(dat, base + 0x04); + local_irq_restore(flags); +} +EXPORT_SYMBOL(gta02_gpb_setpin); |