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); }
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; }
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 {
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); }
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",