tb10x_gpio
tb10x_gpio = devm_kzalloc(dev, sizeof(*tb10x_gpio), GFP_KERNEL);
if (tb10x_gpio == NULL)
tb10x_gpio->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(tb10x_gpio->base))
return PTR_ERR(tb10x_gpio->base);
tb10x_gpio->chip.gc.label =
if (!tb10x_gpio->chip.gc.label)
.dat = tb10x_gpio->base + OFFSET_TO_REG_DATA,
.dirout = tb10x_gpio->base + OFFSET_TO_REG_DDR,
ret = gpio_generic_chip_init(&tb10x_gpio->chip, &config);
tb10x_gpio->chip.gc.base = -1;
tb10x_gpio->chip.gc.parent = dev;
tb10x_gpio->chip.gc.owner = THIS_MODULE;
tb10x_gpio->chip.gc.ngpio = ngpio;
tb10x_gpio->chip.gc.request = gpiochip_generic_request;
tb10x_gpio->chip.gc.free = gpiochip_generic_free;
ret = devm_gpiochip_add_data(dev, &tb10x_gpio->chip.gc, tb10x_gpio);
platform_set_drvdata(pdev, tb10x_gpio);
tb10x_gpio->chip.gc.to_irq = tb10x_gpio_to_irq;
tb10x_gpio->irq = ret;
dev_name(dev), tb10x_gpio);
tb10x_gpio->domain = irq_domain_create_linear(dev_fwnode(dev),
tb10x_gpio->chip.gc.ngpio,
if (!tb10x_gpio->domain) {
ret = irq_alloc_domain_generic_chips(tb10x_gpio->domain,
tb10x_gpio->chip.gc.ngpio, 1, tb10x_gpio->chip.gc.label,
gc = tb10x_gpio->domain->gc->gc[0];
gc->reg_base = tb10x_gpio->base;
irq_domain_remove(tb10x_gpio->domain);
struct tb10x_gpio *tb10x_gpio = platform_get_drvdata(pdev);
if (tb10x_gpio->chip.gc.to_irq) {
irq_remove_generic_chip(tb10x_gpio->domain->gc->gc[0],
BIT(tb10x_gpio->chip.gc.ngpio) - 1, 0, 0);
kfree(tb10x_gpio->domain->gc);
irq_domain_remove(tb10x_gpio->domain);
static inline u32 tb10x_reg_read(struct tb10x_gpio *gpio, unsigned int offs)
struct tb10x_gpio *tb10x_gpio = gpiochip_get_data(chip);
return irq_create_mapping(tb10x_gpio->domain, offset);
struct tb10x_gpio *tb10x_gpio = data;
u32 r = tb10x_reg_read(tb10x_gpio, OFFSET_TO_REG_CHANGE);
u32 m = tb10x_reg_read(tb10x_gpio, OFFSET_TO_REG_INT_EN);
generic_handle_domain_irq(tb10x_gpio->domain, i);
struct tb10x_gpio *tb10x_gpio;