#include <linux/gpio/driver.h>
#include <linux/gpio/gpio-reg.h>
#include <linux/spinlock.h>
struct irq_domain *irqdomain;
#define to_gpio_reg(x) container_of(x, struct gpio_reg, gc)
static int gpio_reg_get_direction(struct gpio_chip *gc, unsigned offset)
struct gpio_reg *r = to_gpio_reg(gc);
return r->direction & BIT(offset) ? 1 : 0;
static int gpio_reg_direction_output(struct gpio_chip *gc, unsigned offset,
struct gpio_reg *r = to_gpio_reg(gc);
if (r->direction & BIT(offset))
gc->set(gc, offset, value);
static int gpio_reg_direction_input(struct gpio_chip *gc, unsigned offset)
struct gpio_reg *r = to_gpio_reg(gc);
return r->direction & BIT(offset) ? 0 : -ENOTSUPP;
static void gpio_reg_set(struct gpio_chip *gc, unsigned offset, int value)
struct gpio_reg *r = to_gpio_reg(gc);
u32 val, mask = BIT(offset);
spin_lock_irqsave(&r->lock, flags);