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