예제 #1
0
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);
}
예제 #2
0
파일: gpio.c 프로젝트: BinVul/linux2.6.32
int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state)
{
	void __iomem *base = S3C24XX_GPIO_BASE(pin);
	unsigned long offs = S3C2410_GPIO_OFFSET(pin);
	unsigned long flags;
	unsigned long slpcon;

	offs *= 2;

	if (pin < S3C2410_GPIO_BANKB)
		return -EINVAL;

	if (pin >= S3C2410_GPIO_BANKF &&
	    pin <= S3C2410_GPIO_BANKG)
		return -EINVAL;

	if (pin > (S3C2410_GPIO_BANKH + 32))
		return -EINVAL;

	local_irq_save(flags);

	slpcon = __raw_readl(base + 0x0C);

	slpcon &= ~(3 << offs);
	slpcon |= state << offs;

	__raw_writel(slpcon, base + 0x0C);

	local_irq_restore(flags);

	return 0;
}
예제 #3
0
파일: gpio.c 프로젝트: 10x-Amin/nAa-kernel
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
{
	void __iomem *base = S3C24XX_GPIO_BASE(pin);
	unsigned long val = __raw_readl(base);

	if (pin < S3C2410_GPIO_BANKB) {
		val >>= S3C2410_GPIO_OFFSET(pin);
		val &= 1;
		val += 1;
	} else {
예제 #4
0
파일: gpio.c 프로젝트: 10x-Amin/nAa-kernel
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
{
	void __iomem *base = S3C24XX_GPIO_BASE(pin);
	unsigned long mask;
	unsigned long con;
	unsigned long flags;

	if (pin < S3C2410_GPIO_BANKB) {
		mask = 1 << S3C2410_GPIO_OFFSET(pin);
	} else {
		mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
	}

	switch (function) {
	case S3C2410_GPIO_LEAVE:
		mask = 0;
		function = 0;
		break;

	case S3C2410_GPIO_INPUT:
	case S3C2410_GPIO_OUTPUT:
	case S3C2410_GPIO_SFN2:
	case S3C2410_GPIO_SFN3:
		if (pin < S3C2410_GPIO_BANKB) {
			function -= 1;
			function &= 1;
			function <<= S3C2410_GPIO_OFFSET(pin);
		} else {
			function &= 3;
			function <<= S3C2410_GPIO_OFFSET(pin)*2;
		}
	}

	/* modify the specified register wwith IRQs off */

	local_irq_save(flags);

	con  = __raw_readl(base + 0x00);
	con &= ~mask;
	con |= function;

	__raw_writel(con, base + 0x00);

	local_irq_restore(flags);
}
예제 #5
0
		return IRQ_EINT0 + offset;
	
	if (offset < 8)
		return IRQ_EINT4 + offset - 4;
	
	return -EINVAL;
}

static int s3c24xx_gpiolib_bankg_toirq(struct gpio_chip *chip, unsigned offset)
{
	return IRQ_EINT8 + offset;
}

struct s3c_gpio_chip s3c24xx_gpios[] = {
	[0] = {
		.base	= S3C24XX_GPIO_BASE(S3C2410_GPA0),
		.chip	= {
			.base			= S3C2410_GPA0,
			.owner			= THIS_MODULE,
			.label			= "GPIOA",
			.ngpio			= 24,
			.direction_input	= s3c24xx_gpiolib_banka_input,
			.direction_output	= s3c24xx_gpiolib_banka_output,
		},
	},
	[1] = {
		.base	= S3C24XX_GPIO_BASE(S3C2410_GPB0),
		.chip	= {
			.base			= S3C2410_GPB0,
			.owner			= THIS_MODULE,
			.label			= "GPIOB",