static int dc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) { struct dc_pinmap *pmap = gpiochip_get_data(chip); int reg_off = GP_DRIVE0(gpio/PINS_PER_COLLECTION); int bit_off = gpio % PINS_PER_COLLECTION; u8 drive; unsigned long flags; spin_lock_irqsave(&pmap->lock, flags); drive = readb_relaxed(pmap->regs + reg_off); drive &= ~BIT(bit_off); writeb_relaxed(drive, pmap->regs + reg_off); spin_unlock_irqrestore(&pmap->lock, flags); return 0; }
static int dc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value) { struct dc_pinmap *pmap = container_of(chip, struct dc_pinmap, chip); int reg_off = GP_DRIVE0(gpio/PINS_PER_COLLECTION); int bit_off = gpio % PINS_PER_COLLECTION; u8 drive; unsigned long flags; dc_gpio_set(chip, gpio, value); spin_lock_irqsave(&pmap->lock, flags); drive = readb_relaxed(pmap->regs + reg_off); drive |= BIT(bit_off); writeb_relaxed(drive, pmap->regs + reg_off); spin_unlock_irqrestore(&pmap->lock, flags); return 0; }