static int bgpio_get_dir_inv(struct gpio_chip *gc, unsigned int gpio) { struct bgpio_chip *bgc = to_bgpio_chip(gc); return (bgc->read_reg(bgc->reg_dir) & bgc->pin2mask(bgc, gpio)) ? GPIOF_DIR_IN : GPIOF_DIR_OUT; }
static void bgpio_set_multiple_set(struct gpio_chip *gc, unsigned long *mask, unsigned long *bits) { struct bgpio_chip *bgc = to_bgpio_chip(gc); bgpio_set_multiple_single_reg(bgc, mask, bits, bgc->reg_set); }
static int bgpio_dir_in_inv(struct gpio_chip *gc, unsigned int gpio) { struct bgpio_chip *bgc = to_bgpio_chip(gc); bgc->dir |= bgc->pin2mask(bgc, gpio); bgc->write_reg(bgc->reg_dir, bgc->dir); return 0; }
static int moxart_gpio_get(struct gpio_chip *chip, unsigned offset) { struct bgpio_chip *bgc = to_bgpio_chip(chip); u32 ret = bgc->read_reg(bgc->reg_dir); if (ret & BIT(offset)) return !!(bgc->read_reg(bgc->reg_set) & BIT(offset)); else return !!(bgc->read_reg(bgc->reg_dat) & BIT(offset)); }
static int bgpio_get_set(struct gpio_chip *gc, unsigned int gpio) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned long pinmask = bgc->pin2mask(bgc, gpio); if (bgc->dir & pinmask) return !!(bgc->read_reg(bgc->reg_set) & pinmask); else return !!(bgc->read_reg(bgc->reg_dat) & pinmask); }
static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio, int val) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned long mask = bgc->pin2mask(bgc, gpio); if (val) bgc->write_reg(bgc->reg_set, mask); else bgc->write_reg(bgc->reg_clr, mask); }
static int bgpio_dir_out_inv(struct gpio_chip *gc, unsigned int gpio, int val) { struct bgpio_chip *bgc = to_bgpio_chip(gc); gc->ops->set(gc, gpio, val); bgc->dir &= ~bgc->pin2mask(bgc, gpio); bgc->write_reg(bgc->reg_dir, bgc->dir); return 0; }
static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned int mask = bgc->pin2mask(bgc, gpio); if (val) bgc->data |= mask; else bgc->data &= ~mask; bgc->write_reg(bgc->reg_set, bgc->data); }
static int bgpio_dir_in_inv(struct gpio_chip *gc, unsigned int gpio) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned long flags; spin_lock_irqsave(&bgc->lock, flags); bgc->dir |= bgc->pin2mask(bgc, gpio); bgc->write_reg(bgc->reg_dir, bgc->dir); spin_unlock_irqrestore(&bgc->lock, flags); return 0; }
static void bgpio_set_multiple_with_clear(struct gpio_chip *gc, unsigned long *mask, unsigned long *bits) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned long set_mask, clear_mask; bgpio_multiple_get_masks(bgc, mask, bits, &set_mask, &clear_mask); if (set_mask) bgc->write_reg(bgc->reg_set, set_mask); if (clear_mask) bgc->write_reg(bgc->reg_clr, clear_mask); }
static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val) { struct bgpio_chip *bgc = to_bgpio_chip(gc); unsigned long mask = bgc->pin2mask(bgc, gpio); unsigned long flags; spin_lock_irqsave(&bgc->lock, flags); if (val) bgc->data |= mask; else bgc->data &= ~mask; bgc->write_reg(bgc->reg_set, bgc->data); spin_unlock_irqrestore(&bgc->lock, flags); }
static int bgpio_get(struct gpio_chip *gc, unsigned int gpio) { struct bgpio_chip *bgc = to_bgpio_chip(gc); return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio)); }