int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long offs = pin - chip->chip.base; unsigned long flags; unsigned long slpcon; offs *= 2; if (pin < S3C2410_GPB(0)) return -EINVAL; if (pin >= S3C2410_GPF(0) && pin <= S3C2410_GPG(16)) return -EINVAL; if (pin > S3C2410_GPH(16)) return -EINVAL; local_irq_save(flags); slpcon = __raw_readl(chip->base + 0x0C); slpcon &= ~(3 << offs); slpcon |= state << offs; __raw_writel(slpcon, chip->base + 0x0C); local_irq_restore(flags); return 0; }
samsung_gpio_pull_t s3c_gpio_getpull(unsigned int pin) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long flags; int offset; u32 pup = 0; if (chip) { offset = pin - chip->chip.base; samsung_gpio_lock(chip, flags); pup = samsung_gpio_do_getpull(chip, offset); samsung_gpio_unlock(chip, flags); } return (__force samsung_gpio_pull_t)pup; }
int s3c_gpio_setpull(unsigned int pin, samsung_gpio_pull_t pull) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long flags; int offset, ret; if (!chip) return -EINVAL; offset = pin - chip->chip.base; samsung_gpio_lock(chip, flags); ret = samsung_gpio_do_setpull(chip, offset, pull); samsung_gpio_unlock(chip, flags); return ret; }
unsigned s3c_gpio_getcfg(unsigned int pin) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long flags; unsigned ret = 0; int offset; if (chip) { offset = pin - chip->chip.base; samsung_gpio_lock(chip, flags); ret = samsung_gpio_do_getcfg(chip, offset); samsung_gpio_unlock(chip, flags); } return ret; }
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned long flags; int offset; int ret; if (!chip) return -EINVAL; offset = pin - chip->chip.base; samsung_gpio_lock(chip, flags); ret = samsung_gpio_do_setcfg(chip, offset, config); samsung_gpio_unlock(chip, flags); return ret; }
s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned int off; void __iomem *reg; int shift; u32 drvstr; if (!chip) return -EINVAL; off = pin - chip->chip.base; shift = off * 2; reg = chip->base + 0x0C; drvstr = __raw_readl(reg); drvstr = drvstr >> shift; drvstr &= 0x3; return (__force s5p_gpio_drvstr_t)drvstr; }
int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr) { struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin); unsigned int off; void __iomem *reg; int shift; u32 tmp; if (!chip) return -EINVAL; off = pin - chip->chip.base; shift = off * 2; reg = chip->base + 0x0C; tmp = __raw_readl(reg); tmp &= ~(0x3 << shift); tmp |= drvstr << shift; __raw_writel(tmp, reg); return 0; }