Lines Matching refs:mcp

136 static int mcp_read(struct mcp23s08 *mcp, unsigned int reg, unsigned int *val)  in mcp_read()  argument
138 return regmap_read(mcp->regmap, reg << mcp->reg_shift, val); in mcp_read()
141 static int mcp_write(struct mcp23s08 *mcp, unsigned int reg, unsigned int val) in mcp_write() argument
143 return regmap_write(mcp->regmap, reg << mcp->reg_shift, val); in mcp_write()
146 static int mcp_set_mask(struct mcp23s08 *mcp, unsigned int reg, in mcp_set_mask() argument
150 return regmap_update_bits(mcp->regmap, reg << mcp->reg_shift, in mcp_set_mask()
154 static int mcp_set_bit(struct mcp23s08 *mcp, unsigned int reg, in mcp_set_bit() argument
158 return mcp_set_mask(mcp, reg, mask, enabled); in mcp_set_bit()
223 struct mcp23s08 *mcp = pinctrl_dev_get_drvdata(pctldev); in mcp_pinconf_get() local
230 ret = mcp_read(mcp, MCP_GPPU, &data); in mcp_pinconf_get()
247 struct mcp23s08 *mcp = pinctrl_dev_get_drvdata(pctldev); in mcp_pinconf_set() local
259 ret = mcp_set_bit(mcp, MCP_GPPU, pin, arg); in mcp_pinconf_set()
262 dev_dbg(mcp->dev, "Invalid config param %04x\n", param); in mcp_pinconf_set()
280 struct mcp23s08 *mcp = gpiochip_get_data(chip); in mcp23s08_direction_input() local
283 mutex_lock(&mcp->lock); in mcp23s08_direction_input()
284 status = mcp_set_bit(mcp, MCP_IODIR, offset, true); in mcp23s08_direction_input()
285 mutex_unlock(&mcp->lock); in mcp23s08_direction_input()
292 struct mcp23s08 *mcp = gpiochip_get_data(chip); in mcp23s08_get() local
295 mutex_lock(&mcp->lock); in mcp23s08_get()
298 ret = mcp_read(mcp, MCP_GPIO, &status); in mcp23s08_get()
302 mcp->cached_gpio = status; in mcp23s08_get()
306 mutex_unlock(&mcp->lock); in mcp23s08_get()
310 static int __mcp23s08_set(struct mcp23s08 *mcp, unsigned mask, bool value) in __mcp23s08_set() argument
312 return mcp_set_mask(mcp, MCP_OLAT, mask, value); in __mcp23s08_set()
317 struct mcp23s08 *mcp = gpiochip_get_data(chip); in mcp23s08_set() local
320 mutex_lock(&mcp->lock); in mcp23s08_set()
321 __mcp23s08_set(mcp, mask, !!value); in mcp23s08_set()
322 mutex_unlock(&mcp->lock); in mcp23s08_set()
328 struct mcp23s08 *mcp = gpiochip_get_data(chip); in mcp23s08_direction_output() local
332 mutex_lock(&mcp->lock); in mcp23s08_direction_output()
333 status = __mcp23s08_set(mcp, mask, value); in mcp23s08_direction_output()
335 status = mcp_set_mask(mcp, MCP_IODIR, mask, false); in mcp23s08_direction_output()
337 mutex_unlock(&mcp->lock); in mcp23s08_direction_output()
344 struct mcp23s08 *mcp = data; in mcp23s08_irq() local
350 mutex_lock(&mcp->lock); in mcp23s08_irq()
351 if (mcp_read(mcp, MCP_INTF, &intf)) in mcp23s08_irq()
359 if (mcp_read(mcp, MCP_INTCAP, &intcap)) in mcp23s08_irq()
362 if (mcp_read(mcp, MCP_INTCON, &intcon)) in mcp23s08_irq()
365 if (mcp_read(mcp, MCP_DEFVAL, &defval)) in mcp23s08_irq()
369 if (mcp_read(mcp, MCP_GPIO, &gpio)) in mcp23s08_irq()
372 gpio_orig = mcp->cached_gpio; in mcp23s08_irq()
373 mcp->cached_gpio = gpio; in mcp23s08_irq()
374 mutex_unlock(&mcp->lock); in mcp23s08_irq()
376 dev_dbg(mcp->chip.parent, in mcp23s08_irq()
380 for (i = 0; i < mcp->chip.ngpio; i++) { in mcp23s08_irq()
418 (BIT(i) & mcp->irq_rise) && gpio_set) || in mcp23s08_irq()
420 (BIT(i) & mcp->irq_fall) && !gpio_set) || in mcp23s08_irq()
422 child_irq = irq_find_mapping(mcp->chip.irq.domain, i); in mcp23s08_irq()
430 mutex_unlock(&mcp->lock); in mcp23s08_irq()
437 struct mcp23s08 *mcp = gpiochip_get_data(gc); in mcp23s08_irq_mask() local
440 mcp_set_bit(mcp, MCP_GPINTEN, pos, false); in mcp23s08_irq_mask()
446 struct mcp23s08 *mcp = gpiochip_get_data(gc); in mcp23s08_irq_unmask() local
449 mcp_set_bit(mcp, MCP_GPINTEN, pos, true); in mcp23s08_irq_unmask()
455 struct mcp23s08 *mcp = gpiochip_get_data(gc); in mcp23s08_irq_set_type() local
459 mcp_set_bit(mcp, MCP_INTCON, pos, false); in mcp23s08_irq_set_type()
460 mcp->irq_rise |= BIT(pos); in mcp23s08_irq_set_type()
461 mcp->irq_fall |= BIT(pos); in mcp23s08_irq_set_type()
463 mcp_set_bit(mcp, MCP_INTCON, pos, false); in mcp23s08_irq_set_type()
464 mcp->irq_rise |= BIT(pos); in mcp23s08_irq_set_type()
465 mcp->irq_fall &= ~BIT(pos); in mcp23s08_irq_set_type()
467 mcp_set_bit(mcp, MCP_INTCON, pos, false); in mcp23s08_irq_set_type()
468 mcp->irq_rise &= ~BIT(pos); in mcp23s08_irq_set_type()
469 mcp->irq_fall |= BIT(pos); in mcp23s08_irq_set_type()
471 mcp_set_bit(mcp, MCP_INTCON, pos, true); in mcp23s08_irq_set_type()
472 mcp_set_bit(mcp, MCP_DEFVAL, pos, false); in mcp23s08_irq_set_type()
474 mcp_set_bit(mcp, MCP_INTCON, pos, true); in mcp23s08_irq_set_type()
475 mcp_set_bit(mcp, MCP_DEFVAL, pos, true); in mcp23s08_irq_set_type()
485 struct mcp23s08 *mcp = gpiochip_get_data(gc); in mcp23s08_irq_bus_lock() local
487 mutex_lock(&mcp->lock); in mcp23s08_irq_bus_lock()
488 regcache_cache_only(mcp->regmap, true); in mcp23s08_irq_bus_lock()
494 struct mcp23s08 *mcp = gpiochip_get_data(gc); in mcp23s08_irq_bus_unlock() local
496 regcache_cache_only(mcp->regmap, false); in mcp23s08_irq_bus_unlock()
497 regcache_sync(mcp->regmap); in mcp23s08_irq_bus_unlock()
499 mutex_unlock(&mcp->lock); in mcp23s08_irq_bus_unlock()
502 static int mcp23s08_irq_setup(struct mcp23s08 *mcp) in mcp23s08_irq_setup() argument
504 struct gpio_chip *chip = &mcp->chip; in mcp23s08_irq_setup()
508 if (mcp->irq_active_high) in mcp23s08_irq_setup()
513 err = devm_request_threaded_irq(chip->parent, mcp->irq, NULL, in mcp23s08_irq_setup()
515 irqflags, dev_name(chip->parent), mcp); in mcp23s08_irq_setup()
518 mcp->irq, err); in mcp23s08_irq_setup()
527 int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, in mcp23s08_probe_one() argument
534 mutex_init(&mcp->lock); in mcp23s08_probe_one()
536 mcp->dev = dev; in mcp23s08_probe_one()
537 mcp->addr = addr; in mcp23s08_probe_one()
539 mcp->irq_active_high = false; in mcp23s08_probe_one()
540 mcp->irq_chip.name = dev_name(dev); in mcp23s08_probe_one()
541 mcp->irq_chip.irq_mask = mcp23s08_irq_mask; in mcp23s08_probe_one()
542 mcp->irq_chip.irq_unmask = mcp23s08_irq_unmask; in mcp23s08_probe_one()
543 mcp->irq_chip.irq_set_type = mcp23s08_irq_set_type; in mcp23s08_probe_one()
544 mcp->irq_chip.irq_bus_lock = mcp23s08_irq_bus_lock; in mcp23s08_probe_one()
545 mcp->irq_chip.irq_bus_sync_unlock = mcp23s08_irq_bus_unlock; in mcp23s08_probe_one()
547 mcp->chip.direction_input = mcp23s08_direction_input; in mcp23s08_probe_one()
548 mcp->chip.get = mcp23s08_get; in mcp23s08_probe_one()
549 mcp->chip.direction_output = mcp23s08_direction_output; in mcp23s08_probe_one()
550 mcp->chip.set = mcp23s08_set; in mcp23s08_probe_one()
552 mcp->chip.of_gpio_n_cells = 2; in mcp23s08_probe_one()
553 mcp->chip.of_node = dev->of_node; in mcp23s08_probe_one()
556 mcp->chip.base = base; in mcp23s08_probe_one()
557 mcp->chip.can_sleep = true; in mcp23s08_probe_one()
558 mcp->chip.parent = dev; in mcp23s08_probe_one()
559 mcp->chip.owner = THIS_MODULE; in mcp23s08_probe_one()
565 ret = mcp_read(mcp, MCP_IOCON, &status); in mcp23s08_probe_one()
569 mcp->irq_controller = in mcp23s08_probe_one()
571 if (mcp->irq && mcp->irq_controller) { in mcp23s08_probe_one()
572 mcp->irq_active_high = in mcp23s08_probe_one()
581 mcp->irq_active_high || open_drain) { in mcp23s08_probe_one()
585 if (mcp->irq_active_high) in mcp23s08_probe_one()
599 ret = mcp_write(mcp, MCP_IOCON, status); in mcp23s08_probe_one()
604 if (mcp->irq && mcp->irq_controller) { in mcp23s08_probe_one()
605 struct gpio_irq_chip *girq = &mcp->chip.irq; in mcp23s08_probe_one()
607 girq->chip = &mcp->irq_chip; in mcp23s08_probe_one()
617 ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp); in mcp23s08_probe_one()
621 mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops; in mcp23s08_probe_one()
622 mcp->pinctrl_desc.confops = &mcp_pinconf_ops; in mcp23s08_probe_one()
623 mcp->pinctrl_desc.npins = mcp->chip.ngpio; in mcp23s08_probe_one()
624 if (mcp->pinctrl_desc.npins == 8) in mcp23s08_probe_one()
625 mcp->pinctrl_desc.pins = mcp23x08_pins; in mcp23s08_probe_one()
626 else if (mcp->pinctrl_desc.npins == 16) in mcp23s08_probe_one()
627 mcp->pinctrl_desc.pins = mcp23x17_pins; in mcp23s08_probe_one()
628 mcp->pinctrl_desc.owner = THIS_MODULE; in mcp23s08_probe_one()
630 mcp->pctldev = devm_pinctrl_register(dev, &mcp->pinctrl_desc, mcp); in mcp23s08_probe_one()
631 if (IS_ERR(mcp->pctldev)) in mcp23s08_probe_one()
632 return dev_err_probe(dev, PTR_ERR(mcp->pctldev), "can't register controller\n"); in mcp23s08_probe_one()
634 if (mcp->irq) { in mcp23s08_probe_one()
635 ret = mcp23s08_irq_setup(mcp); in mcp23s08_probe_one()