int bgpio_init(struct bgpio_chip *bgc, struct device *dev, unsigned long sz, void __iomem *dat, void __iomem *set, void __iomem *clr, void __iomem *dirout, void __iomem *dirin, unsigned long flags) { int ret; if (!is_power_of_2(sz)) return -EINVAL; bgc->bits = sz * 8; if (bgc->bits > BITS_PER_LONG) return -EINVAL; spin_lock_init(&bgc->lock); bgc->gc.dev = dev; bgc->gc.label = dev_name(dev); bgc->gc.base = -1; bgc->gc.ngpio = bgc->bits; bgc->gc.request = bgpio_request; ret = bgpio_setup_io(bgc, dat, set, clr); if (ret) return ret; ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN, flags & BGPIOF_BIG_ENDIAN_BYTE_ORDER); if (ret) return ret; ret = bgpio_setup_direction(bgc, dirout, dirin); if (ret) return ret; bgc->data = bgc->read_reg(bgc->reg_dat); if (bgc->gc.set == bgpio_set_set && !(flags & BGPIOF_UNREADABLE_REG_SET)) bgc->data = bgc->read_reg(bgc->reg_set); if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR)) bgc->dir = bgc->read_reg(bgc->reg_dir); return ret; }
int bgpio_init(struct gpio_chip *gc, struct device *dev, unsigned long sz, void __iomem *dat, void __iomem *set, void __iomem *clr, void __iomem *dirout, void __iomem *dirin, unsigned long flags) { int ret; if (!is_power_of_2(sz)) return -EINVAL; gc->bgpio_bits = sz * 8; if (gc->bgpio_bits > BITS_PER_LONG) return -EINVAL; spin_lock_init(&gc->bgpio_lock); gc->parent = dev; gc->label = dev_name(dev); gc->base = -1; gc->ngpio = gc->bgpio_bits; gc->request = bgpio_request; ret = bgpio_setup_io(gc, dat, set, clr, flags); if (ret) return ret; ret = bgpio_setup_accessors(dev, gc, flags & BGPIOF_BIG_ENDIAN, flags & BGPIOF_BIG_ENDIAN_BYTE_ORDER); if (ret) return ret; ret = bgpio_setup_direction(gc, dirout, dirin, flags); if (ret) return ret; gc->bgpio_data = gc->read_reg(gc->reg_dat); if (gc->set == bgpio_set_set && !(flags & BGPIOF_UNREADABLE_REG_SET)) gc->bgpio_data = gc->read_reg(gc->reg_set); if (gc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR)) gc->bgpio_dir = gc->read_reg(gc->reg_dir); return ret; }
int bgpio_init(struct bgpio_chip *bgc, struct device_d *dev, unsigned int sz, void __iomem *dat, void __iomem *set, void __iomem *clr, void __iomem *dirout, void __iomem *dirin, unsigned long flags) { int ret; if ((sz > 4) || !is_power_of_2(sz)) return -EINVAL; bgc->bits = sz * 8; bgc->gc.ngpio = bgc->bits; bgc->gc.base = -1; bgc->gc.dev = dev; bgc->gc.ops = &bgc->ops; ret = bgpio_setup_io(bgc, dat, set, clr); if (ret) return ret; ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN); if (ret) return ret; ret = bgpio_setup_direction(bgc, dirout, dirin); if (ret) return ret; bgc->data = bgc->read_reg(bgc->reg_dat); if (bgc->gc.ops->set == bgpio_set_set && !(flags & BGPIOF_UNREADABLE_REG_SET)) bgc->data = bgc->read_reg(bgc->reg_set); if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR)) bgc->dir = bgc->read_reg(bgc->reg_dir); return ret; }
int bgpio_init(struct bgpio_chip *bgc, struct device *dev, unsigned long sz, void __iomem *dat, void __iomem *set, void __iomem *clr, void __iomem *dirout, void __iomem *dirin, bool big_endian) { int ret; if (!is_power_of_2(sz)) return -EINVAL; bgc->bits = sz * 8; if (bgc->bits > BITS_PER_LONG) return -EINVAL; spin_lock_init(&bgc->lock); bgc->gc.dev = dev; bgc->gc.label = dev_name(dev); bgc->gc.base = -1; bgc->gc.ngpio = bgc->bits; ret = bgpio_setup_io(bgc, dat, set, clr); if (ret) return ret; ret = bgpio_setup_accessors(dev, bgc, big_endian); if (ret) return ret; ret = bgpio_setup_direction(bgc, dirout, dirin); if (ret) return ret; bgc->data = bgc->read_reg(bgc->reg_dat); return ret; }