167d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks/* linux/arch/arm/mach-s3c2412/gpio.c
267d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks *
367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * Copyright (c) 2007 Simtec Electronics
467d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks *	Ben Dooks <ben@simtec.co.uk>
567d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks *
667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * http://armlinux.simtec.co.uk/.
767d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks *
867d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * S3C2412/S3C2413 specific GPIO support
967d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks *
1067d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * This program is free software; you can redistribute it and/or modify
1167d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * it under the terms of the GNU General Public License version 2 as
1267d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks * published by the Free Software Foundation.
1367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks*/
1467d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
1567d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <linux/kernel.h>
1667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <linux/types.h>
1767d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <linux/module.h>
1867d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <linux/interrupt.h>
197987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks#include <linux/gpio.h>
2067d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
2167d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <asm/mach/arch.h>
2267d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks#include <asm/mach/map.h>
2367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
24a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-gpio.h>
25a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
2667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
277987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks#include <plat/gpio-core.h>
287987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks
2967d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooksint s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state)
3067d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks{
31782d8a3c0bdf23ec24fc8facb5af8510b2cf6de1Kukjin Kim	struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin);
327987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks	unsigned long offs = pin - chip->chip.base;
3367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	unsigned long flags;
3467d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	unsigned long slpcon;
3567d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
3667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	offs *= 2;
3767d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
382c8fcfbf735e2d3b139e4247eb3e73edf64bb23fBen Dooks	if (pin < S3C2410_GPB(0))
3967d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks		return -EINVAL;
4067d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
412c8fcfbf735e2d3b139e4247eb3e73edf64bb23fBen Dooks	if (pin >= S3C2410_GPF(0) &&
422c8fcfbf735e2d3b139e4247eb3e73edf64bb23fBen Dooks	    pin <= S3C2410_GPG(16))
4367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks		return -EINVAL;
4467d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
452c8fcfbf735e2d3b139e4247eb3e73edf64bb23fBen Dooks	if (pin > S3C2410_GPH(16))
4667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks		return -EINVAL;
4767d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
4867d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	local_irq_save(flags);
4967d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
507987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks	slpcon = __raw_readl(chip->base + 0x0C);
5167d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
5267d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	slpcon &= ~(3 << offs);
5367d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	slpcon |= state << offs;
5467d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
557987bd7a7051c979f7b9b572898f92dbef6aaeb1Ben Dooks	__raw_writel(slpcon, chip->base + 0x0C);
5667d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
5767d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	local_irq_restore(flags);
5867d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
5967d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks	return 0;
6067d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks}
6167d729adc0e76e21c82a2c59853f25f5f784ca79Ben Dooks
6267d729adc0e76e21c82a2c59853f25f5f784ca79Ben DooksEXPORT_SYMBOL(s3c2412_gpio_set_sleepcfg);
63