static void palmas_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct palmas_gpio *palmas_gpio = to_palmas_gpio(chip); struct palmas *palmas = palmas_gpio->palmas; unsigned int reg; if (!((1 << offset) & palmas->gpio_muxed)) return; palmas_gpio_read(palmas, PALMAS_GPIO_DATA_OUT, ®); reg &= ~(1 << offset); reg |= value << offset; palmas_gpio_write(palmas, PALMAS_GPIO_DATA_OUT, reg); }
static int palmas_gpio_direction_in(struct gpio_chip *chip, unsigned offset) { struct palmas_gpio *palmas_gpio = to_palmas_gpio(chip); struct palmas *palmas = palmas_gpio->palmas; int ret; unsigned int reg = 0; if (!((1 << offset) & palmas->gpio_muxed)) return -EINVAL; ret = palmas_gpio_read(palmas, PALMAS_GPIO_DATA_DIR, ®); if (ret) return ret; reg &= ~(1 << offset); return palmas_gpio_write(palmas, PALMAS_GPIO_DATA_DIR, reg); }
static int palmas_gpio_set_debounce(struct gpio_chip *chip, unsigned offset, unsigned debounce) { struct palmas_gpio *palmas_gpio = to_palmas_gpio(chip); struct palmas *palmas = palmas_gpio->palmas; int ret; unsigned int reg; if (!((1 << offset) & palmas->gpio_muxed)) return -EINVAL; ret = palmas_gpio_read(palmas, PALMAS_GPIO_DATA_DIR, ®); if (ret) return ret; if (debounce) reg |= 1 << offset; else reg &= ~(1 << offset); return palmas_gpio_write(palmas, PALMAS_GPIO_DATA_DIR, reg); }