Lines Matching refs:bgc

127 static unsigned long bgpio_pin2mask(struct bgpio_chip *bgc, unsigned int pin)  in bgpio_pin2mask()  argument
132 static unsigned long bgpio_pin2mask_be(struct bgpio_chip *bgc, in bgpio_pin2mask_be() argument
135 return 1 << (bgc->bits - 1 - pin); in bgpio_pin2mask_be()
140 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_get_set() local
141 unsigned long pinmask = bgc->pin2mask(bgc, gpio); in bgpio_get_set()
143 if (bgc->dir & pinmask) in bgpio_get_set()
144 return !!(bgc->read_reg(bgc->reg_set) & pinmask); in bgpio_get_set()
146 return !!(bgc->read_reg(bgc->reg_dat) & pinmask); in bgpio_get_set()
151 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_get() local
153 return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio)); in bgpio_get()
162 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set() local
163 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set()
166 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set()
169 bgc->data |= mask; in bgpio_set()
171 bgc->data &= ~mask; in bgpio_set()
173 bgc->write_reg(bgc->reg_dat, bgc->data); in bgpio_set()
175 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set()
181 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_with_clear() local
182 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set_with_clear()
185 bgc->write_reg(bgc->reg_set, mask); in bgpio_set_with_clear()
187 bgc->write_reg(bgc->reg_clr, mask); in bgpio_set_with_clear()
192 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_set() local
193 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set_set()
196 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set_set()
199 bgc->data |= mask; in bgpio_set_set()
201 bgc->data &= ~mask; in bgpio_set_set()
203 bgc->write_reg(bgc->reg_set, bgc->data); in bgpio_set_set()
205 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set_set()
208 static void bgpio_multiple_get_masks(struct bgpio_chip *bgc, in bgpio_multiple_get_masks() argument
218 for (i = 0; i < bgc->bits; i++) { in bgpio_multiple_get_masks()
223 *set_mask |= bgc->pin2mask(bgc, i); in bgpio_multiple_get_masks()
225 *clear_mask |= bgc->pin2mask(bgc, i); in bgpio_multiple_get_masks()
230 static void bgpio_set_multiple_single_reg(struct bgpio_chip *bgc, in bgpio_set_multiple_single_reg() argument
238 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set_multiple_single_reg()
240 bgpio_multiple_get_masks(bgc, mask, bits, &set_mask, &clear_mask); in bgpio_set_multiple_single_reg()
242 bgc->data |= set_mask; in bgpio_set_multiple_single_reg()
243 bgc->data &= ~clear_mask; in bgpio_set_multiple_single_reg()
245 bgc->write_reg(reg, bgc->data); in bgpio_set_multiple_single_reg()
247 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set_multiple_single_reg()
253 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple() local
255 bgpio_set_multiple_single_reg(bgc, mask, bits, bgc->reg_dat); in bgpio_set_multiple()
261 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple_set() local
263 bgpio_set_multiple_single_reg(bgc, mask, bits, bgc->reg_set); in bgpio_set_multiple_set()
270 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple_with_clear() local
273 bgpio_multiple_get_masks(bgc, mask, bits, &set_mask, &clear_mask); in bgpio_set_multiple_with_clear()
276 bgc->write_reg(bgc->reg_set, set_mask); in bgpio_set_multiple_with_clear()
278 bgc->write_reg(bgc->reg_clr, clear_mask); in bgpio_set_multiple_with_clear()
302 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_in() local
305 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_in()
307 bgc->dir &= ~bgc->pin2mask(bgc, gpio); in bgpio_dir_in()
308 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_in()
310 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_in()
317 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_get_dir() local
319 return (bgc->read_reg(bgc->reg_dir) & bgc->pin2mask(bgc, gpio)) ? in bgpio_get_dir()
325 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_out() local
330 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_out()
332 bgc->dir |= bgc->pin2mask(bgc, gpio); in bgpio_dir_out()
333 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_out()
335 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_out()
342 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_in_inv() local
345 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_in_inv()
347 bgc->dir |= bgc->pin2mask(bgc, gpio); in bgpio_dir_in_inv()
348 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_in_inv()
350 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_in_inv()
357 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_out_inv() local
362 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_out_inv()
364 bgc->dir &= ~bgc->pin2mask(bgc, gpio); in bgpio_dir_out_inv()
365 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_out_inv()
367 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_out_inv()
374 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_get_dir_inv() local
376 return (bgc->read_reg(bgc->reg_dir) & bgc->pin2mask(bgc, gpio)) ? in bgpio_get_dir_inv()
381 struct bgpio_chip *bgc, in bgpio_setup_accessors() argument
386 switch (bgc->bits) { in bgpio_setup_accessors()
388 bgc->read_reg = bgpio_read8; in bgpio_setup_accessors()
389 bgc->write_reg = bgpio_write8; in bgpio_setup_accessors()
393 bgc->read_reg = bgpio_read16be; in bgpio_setup_accessors()
394 bgc->write_reg = bgpio_write16be; in bgpio_setup_accessors()
396 bgc->read_reg = bgpio_read16; in bgpio_setup_accessors()
397 bgc->write_reg = bgpio_write16; in bgpio_setup_accessors()
402 bgc->read_reg = bgpio_read32be; in bgpio_setup_accessors()
403 bgc->write_reg = bgpio_write32be; in bgpio_setup_accessors()
405 bgc->read_reg = bgpio_read32; in bgpio_setup_accessors()
406 bgc->write_reg = bgpio_write32; in bgpio_setup_accessors()
416 bgc->read_reg = bgpio_read64; in bgpio_setup_accessors()
417 bgc->write_reg = bgpio_write64; in bgpio_setup_accessors()
422 dev_err(dev, "unsupported data width %u bits\n", bgc->bits); in bgpio_setup_accessors()
426 bgc->pin2mask = bit_be ? bgpio_pin2mask_be : bgpio_pin2mask; in bgpio_setup_accessors()
453 static int bgpio_setup_io(struct bgpio_chip *bgc, in bgpio_setup_io() argument
460 bgc->reg_dat = dat; in bgpio_setup_io()
461 if (!bgc->reg_dat) in bgpio_setup_io()
465 bgc->reg_set = set; in bgpio_setup_io()
466 bgc->reg_clr = clr; in bgpio_setup_io()
467 bgc->gc.set = bgpio_set_with_clear; in bgpio_setup_io()
468 bgc->gc.set_multiple = bgpio_set_multiple_with_clear; in bgpio_setup_io()
470 bgc->reg_set = set; in bgpio_setup_io()
471 bgc->gc.set = bgpio_set_set; in bgpio_setup_io()
472 bgc->gc.set_multiple = bgpio_set_multiple_set; in bgpio_setup_io()
474 bgc->gc.set = bgpio_set_none; in bgpio_setup_io()
475 bgc->gc.set_multiple = NULL; in bgpio_setup_io()
477 bgc->gc.set = bgpio_set; in bgpio_setup_io()
478 bgc->gc.set_multiple = bgpio_set_multiple; in bgpio_setup_io()
483 bgc->gc.get = bgpio_get_set; in bgpio_setup_io()
485 bgc->gc.get = bgpio_get; in bgpio_setup_io()
490 static int bgpio_setup_direction(struct bgpio_chip *bgc, in bgpio_setup_direction() argument
498 bgc->reg_dir = dirout; in bgpio_setup_direction()
499 bgc->gc.direction_output = bgpio_dir_out; in bgpio_setup_direction()
500 bgc->gc.direction_input = bgpio_dir_in; in bgpio_setup_direction()
501 bgc->gc.get_direction = bgpio_get_dir; in bgpio_setup_direction()
503 bgc->reg_dir = dirin; in bgpio_setup_direction()
504 bgc->gc.direction_output = bgpio_dir_out_inv; in bgpio_setup_direction()
505 bgc->gc.direction_input = bgpio_dir_in_inv; in bgpio_setup_direction()
506 bgc->gc.get_direction = bgpio_get_dir_inv; in bgpio_setup_direction()
509 bgc->gc.direction_output = bgpio_dir_out_err; in bgpio_setup_direction()
511 bgc->gc.direction_output = bgpio_simple_dir_out; in bgpio_setup_direction()
512 bgc->gc.direction_input = bgpio_simple_dir_in; in bgpio_setup_direction()
526 int bgpio_remove(struct bgpio_chip *bgc) in bgpio_remove() argument
528 gpiochip_remove(&bgc->gc); in bgpio_remove()
533 int bgpio_init(struct bgpio_chip *bgc, struct device *dev, in bgpio_init() argument
543 bgc->bits = sz * 8; in bgpio_init()
544 if (bgc->bits > BITS_PER_LONG) in bgpio_init()
547 spin_lock_init(&bgc->lock); in bgpio_init()
548 bgc->gc.dev = dev; in bgpio_init()
549 bgc->gc.label = dev_name(dev); in bgpio_init()
550 bgc->gc.base = -1; in bgpio_init()
551 bgc->gc.ngpio = bgc->bits; in bgpio_init()
552 bgc->gc.request = bgpio_request; in bgpio_init()
554 ret = bgpio_setup_io(bgc, dat, set, clr, flags); in bgpio_init()
558 ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN, in bgpio_init()
563 ret = bgpio_setup_direction(bgc, dirout, dirin, flags); in bgpio_init()
567 bgc->data = bgc->read_reg(bgc->reg_dat); in bgpio_init()
568 if (bgc->gc.set == bgpio_set_set && in bgpio_init()
570 bgc->data = bgc->read_reg(bgc->reg_set); in bgpio_init()
571 if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR)) in bgpio_init()
572 bgc->dir = bgc->read_reg(bgc->reg_dir); in bgpio_init()
610 struct bgpio_chip *bgc; in bgpio_pdev_probe() local
639 bgc = devm_kzalloc(&pdev->dev, sizeof(*bgc), GFP_KERNEL); in bgpio_pdev_probe()
640 if (!bgc) in bgpio_pdev_probe()
643 err = bgpio_init(bgc, dev, sz, dat, set, clr, dirout, dirin, flags); in bgpio_pdev_probe()
649 bgc->gc.label = pdata->label; in bgpio_pdev_probe()
650 bgc->gc.base = pdata->base; in bgpio_pdev_probe()
652 bgc->gc.ngpio = pdata->ngpio; in bgpio_pdev_probe()
655 platform_set_drvdata(pdev, bgc); in bgpio_pdev_probe()
657 return gpiochip_add(&bgc->gc); in bgpio_pdev_probe()
662 struct bgpio_chip *bgc = platform_get_drvdata(pdev); in bgpio_pdev_remove() local
664 return bgpio_remove(bgc); in bgpio_pdev_remove()