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() local
142 return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio)); in bgpio_get()
147 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set() local
148 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set()
151 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set()
154 bgc->data |= mask; in bgpio_set()
156 bgc->data &= ~mask; in bgpio_set()
158 bgc->write_reg(bgc->reg_dat, bgc->data); in bgpio_set()
160 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set()
166 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_with_clear() local
167 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set_with_clear()
170 bgc->write_reg(bgc->reg_set, mask); in bgpio_set_with_clear()
172 bgc->write_reg(bgc->reg_clr, mask); in bgpio_set_with_clear()
177 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_set() local
178 unsigned long mask = bgc->pin2mask(bgc, gpio); in bgpio_set_set()
181 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set_set()
184 bgc->data |= mask; in bgpio_set_set()
186 bgc->data &= ~mask; in bgpio_set_set()
188 bgc->write_reg(bgc->reg_set, bgc->data); in bgpio_set_set()
190 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set_set()
193 static void bgpio_multiple_get_masks(struct bgpio_chip *bgc, in bgpio_multiple_get_masks() argument
203 for (i = 0; i < bgc->bits; i++) { in bgpio_multiple_get_masks()
208 *set_mask |= bgc->pin2mask(bgc, i); in bgpio_multiple_get_masks()
210 *clear_mask |= bgc->pin2mask(bgc, i); in bgpio_multiple_get_masks()
215 static void bgpio_set_multiple_single_reg(struct bgpio_chip *bgc, in bgpio_set_multiple_single_reg() argument
223 spin_lock_irqsave(&bgc->lock, flags); in bgpio_set_multiple_single_reg()
225 bgpio_multiple_get_masks(bgc, mask, bits, &set_mask, &clear_mask); in bgpio_set_multiple_single_reg()
227 bgc->data |= set_mask; in bgpio_set_multiple_single_reg()
228 bgc->data &= ~clear_mask; in bgpio_set_multiple_single_reg()
230 bgc->write_reg(reg, bgc->data); in bgpio_set_multiple_single_reg()
232 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_set_multiple_single_reg()
238 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple() local
240 bgpio_set_multiple_single_reg(bgc, mask, bits, bgc->reg_dat); in bgpio_set_multiple()
246 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple_set() local
248 bgpio_set_multiple_single_reg(bgc, mask, bits, bgc->reg_set); in bgpio_set_multiple_set()
255 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_set_multiple_with_clear() local
258 bgpio_multiple_get_masks(bgc, mask, bits, &set_mask, &clear_mask); in bgpio_set_multiple_with_clear()
261 bgc->write_reg(bgc->reg_set, set_mask); in bgpio_set_multiple_with_clear()
263 bgc->write_reg(bgc->reg_clr, clear_mask); in bgpio_set_multiple_with_clear()
281 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_in() local
284 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_in()
286 bgc->dir &= ~bgc->pin2mask(bgc, gpio); in bgpio_dir_in()
287 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_in()
289 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_in()
296 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_out() local
301 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_out()
303 bgc->dir |= bgc->pin2mask(bgc, gpio); in bgpio_dir_out()
304 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_out()
306 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_out()
313 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_in_inv() local
316 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_in_inv()
318 bgc->dir |= bgc->pin2mask(bgc, gpio); in bgpio_dir_in_inv()
319 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_in_inv()
321 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_in_inv()
328 struct bgpio_chip *bgc = to_bgpio_chip(gc); in bgpio_dir_out_inv() local
333 spin_lock_irqsave(&bgc->lock, flags); in bgpio_dir_out_inv()
335 bgc->dir &= ~bgc->pin2mask(bgc, gpio); in bgpio_dir_out_inv()
336 bgc->write_reg(bgc->reg_dir, bgc->dir); in bgpio_dir_out_inv()
338 spin_unlock_irqrestore(&bgc->lock, flags); in bgpio_dir_out_inv()
344 struct bgpio_chip *bgc, in bgpio_setup_accessors() argument
349 switch (bgc->bits) { in bgpio_setup_accessors()
351 bgc->read_reg = bgpio_read8; in bgpio_setup_accessors()
352 bgc->write_reg = bgpio_write8; in bgpio_setup_accessors()
356 bgc->read_reg = bgpio_read16be; in bgpio_setup_accessors()
357 bgc->write_reg = bgpio_write16be; in bgpio_setup_accessors()
359 bgc->read_reg = bgpio_read16; in bgpio_setup_accessors()
360 bgc->write_reg = bgpio_write16; in bgpio_setup_accessors()
365 bgc->read_reg = bgpio_read32be; in bgpio_setup_accessors()
366 bgc->write_reg = bgpio_write32be; in bgpio_setup_accessors()
368 bgc->read_reg = bgpio_read32; in bgpio_setup_accessors()
369 bgc->write_reg = bgpio_write32; in bgpio_setup_accessors()
379 bgc->read_reg = bgpio_read64; in bgpio_setup_accessors()
380 bgc->write_reg = bgpio_write64; in bgpio_setup_accessors()
385 dev_err(dev, "unsupported data width %u bits\n", bgc->bits); in bgpio_setup_accessors()
389 bgc->pin2mask = bit_be ? bgpio_pin2mask_be : bgpio_pin2mask; in bgpio_setup_accessors()
416 static int bgpio_setup_io(struct bgpio_chip *bgc, in bgpio_setup_io() argument
422 bgc->reg_dat = dat; in bgpio_setup_io()
423 if (!bgc->reg_dat) in bgpio_setup_io()
427 bgc->reg_set = set; in bgpio_setup_io()
428 bgc->reg_clr = clr; in bgpio_setup_io()
429 bgc->gc.set = bgpio_set_with_clear; in bgpio_setup_io()
430 bgc->gc.set_multiple = bgpio_set_multiple_with_clear; in bgpio_setup_io()
432 bgc->reg_set = set; in bgpio_setup_io()
433 bgc->gc.set = bgpio_set_set; in bgpio_setup_io()
434 bgc->gc.set_multiple = bgpio_set_multiple_set; in bgpio_setup_io()
436 bgc->gc.set = bgpio_set; in bgpio_setup_io()
437 bgc->gc.set_multiple = bgpio_set_multiple; in bgpio_setup_io()
440 bgc->gc.get = bgpio_get; in bgpio_setup_io()
445 static int bgpio_setup_direction(struct bgpio_chip *bgc, in bgpio_setup_direction() argument
452 bgc->reg_dir = dirout; in bgpio_setup_direction()
453 bgc->gc.direction_output = bgpio_dir_out; in bgpio_setup_direction()
454 bgc->gc.direction_input = bgpio_dir_in; in bgpio_setup_direction()
456 bgc->reg_dir = dirin; in bgpio_setup_direction()
457 bgc->gc.direction_output = bgpio_dir_out_inv; in bgpio_setup_direction()
458 bgc->gc.direction_input = bgpio_dir_in_inv; in bgpio_setup_direction()
460 bgc->gc.direction_output = bgpio_simple_dir_out; in bgpio_setup_direction()
461 bgc->gc.direction_input = bgpio_simple_dir_in; in bgpio_setup_direction()
475 int bgpio_remove(struct bgpio_chip *bgc) in bgpio_remove() argument
477 gpiochip_remove(&bgc->gc); in bgpio_remove()
482 int bgpio_init(struct bgpio_chip *bgc, struct device *dev, in bgpio_init() argument
492 bgc->bits = sz * 8; in bgpio_init()
493 if (bgc->bits > BITS_PER_LONG) in bgpio_init()
496 spin_lock_init(&bgc->lock); in bgpio_init()
497 bgc->gc.dev = dev; in bgpio_init()
498 bgc->gc.label = dev_name(dev); in bgpio_init()
499 bgc->gc.base = -1; in bgpio_init()
500 bgc->gc.ngpio = bgc->bits; in bgpio_init()
501 bgc->gc.request = bgpio_request; in bgpio_init()
503 ret = bgpio_setup_io(bgc, dat, set, clr); in bgpio_init()
507 ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN, in bgpio_init()
512 ret = bgpio_setup_direction(bgc, dirout, dirin); in bgpio_init()
516 bgc->data = bgc->read_reg(bgc->reg_dat); in bgpio_init()
517 if (bgc->gc.set == bgpio_set_set && in bgpio_init()
519 bgc->data = bgc->read_reg(bgc->reg_set); in bgpio_init()
520 if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR)) in bgpio_init()
521 bgc->dir = bgc->read_reg(bgc->reg_dir); in bgpio_init()
579 struct bgpio_chip *bgc; in bgpio_pdev_probe() local
608 bgc = devm_kzalloc(&pdev->dev, sizeof(*bgc), GFP_KERNEL); in bgpio_pdev_probe()
609 if (!bgc) in bgpio_pdev_probe()
612 err = bgpio_init(bgc, dev, sz, dat, set, clr, dirout, dirin, flags); in bgpio_pdev_probe()
618 bgc->gc.label = pdata->label; in bgpio_pdev_probe()
619 bgc->gc.base = pdata->base; in bgpio_pdev_probe()
621 bgc->gc.ngpio = pdata->ngpio; in bgpio_pdev_probe()
624 platform_set_drvdata(pdev, bgc); in bgpio_pdev_probe()
626 return gpiochip_add(&bgc->gc); in bgpio_pdev_probe()
631 struct bgpio_chip *bgc = platform_get_drvdata(pdev); in bgpio_pdev_remove() local
633 return bgpio_remove(bgc); in bgpio_pdev_remove()