From f5affd4f36d839d706b02f1ffb69e0cf70c4140c Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Mon, 18 May 2009 17:55:41 +0000 Subject: bump to 2.6.30-rc6 SVN-Revision: 15918 --- .../arch/arm/mach-s3c2442/gta02-shadow.c | 86 ++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c (limited to 'target/linux/s3c24xx/files-2.6.30/arch/arm/mach-s3c2442/gta02-shadow.c') 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 0000000000..c65304ae19 --- /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 + * 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 +#include +#include + +#include +#include +#include + +/** + * 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); -- cgit v1.2.3