Example #1
0
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);

	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, &reg);
	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, &reg);
	if (ret)
		return ret;

	if (debounce)
		reg |= 1 << offset;
	else
		reg &= ~(1 << offset);

	return palmas_gpio_write(palmas, PALMAS_GPIO_DATA_DIR, reg);
}