Lines Matching +full:bit +full:- +full:shift

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014-2017 Broadcom
9 * chipCommonG GPIO controller, and the always-on GPIO controller. Basic
30 #include <linux/pinctrl/pinconf-generic.h>
34 #include "../pinctrl-utils.h"
68 #define GPIO_DRV_STRENGTH_BIT_MASK ((1 << GPIO_DRV_STRENGTH_BITS) - 1)
125 * Mapping from PINCONF pins to GPIO pins is 1-to-1
133 * iproc_set_bit - set or clear one bit (corresponding to the GPIO pin) in a
145 unsigned int shift = IPROC_GPIO_SHIFT(gpio); in iproc_set_bit() local
148 val = readl(chip->base + offset); in iproc_set_bit()
150 val |= BIT(shift); in iproc_set_bit()
152 val &= ~BIT(shift); in iproc_set_bit()
153 writel(val, chip->base + offset); in iproc_set_bit()
160 unsigned int shift = IPROC_GPIO_SHIFT(gpio); in iproc_get_bit() local
162 return !!(readl(chip->base + offset) & BIT(shift)); in iproc_get_bit()
170 int i, bit; in iproc_gpio_irq_handler() local
175 for (i = 0; i < chip->num_banks; i++) { in iproc_gpio_irq_handler()
176 unsigned long val = readl(chip->base + (i * GPIO_BANK_SIZE) + in iproc_gpio_irq_handler()
179 for_each_set_bit(bit, &val, NGPIOS_PER_BANK) { in iproc_gpio_irq_handler()
180 unsigned pin = NGPIOS_PER_BANK * i + bit; in iproc_gpio_irq_handler()
186 writel(BIT(bit), chip->base + (i * GPIO_BANK_SIZE) + in iproc_gpio_irq_handler()
189 generic_handle_domain_irq(gc->irq.domain, pin); in iproc_gpio_irq_handler()
201 unsigned gpio = d->hwirq; in iproc_gpio_irq_ack()
204 unsigned int shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_irq_ack() local
205 u32 val = BIT(shift); in iproc_gpio_irq_ack()
207 writel(val, chip->base + offset); in iproc_gpio_irq_ack()
211 * iproc_gpio_irq_set_mask - mask/unmask a GPIO interrupt
231 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_irq_mask()
233 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_irq_mask()
244 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_irq_unmask()
246 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_irq_unmask()
253 unsigned gpio = d->hwirq; in iproc_gpio_irq_set_type()
281 dev_err(chip->dev, "invalid GPIO IRQ type 0x%x\n", in iproc_gpio_irq_set_type()
283 return -EINVAL; in iproc_gpio_irq_set_type()
286 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_irq_set_type()
298 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_irq_set_type()
300 dev_dbg(chip->dev, in iproc_gpio_irq_set_type()
312 seq_puts(p, dev_name(chip->dev)); in iproc_gpio_irq_print_chip()
335 if (!chip->pinmux_is_supported) in iproc_gpio_request()
345 if (!chip->pinmux_is_supported) in iproc_gpio_free()
356 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_direction_input()
358 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_direction_input()
360 dev_dbg(chip->dev, "gpio:%u set input\n", gpio); in iproc_gpio_direction_input()
371 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_direction_output()
374 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_direction_output()
376 dev_dbg(chip->dev, "gpio:%u set output, value:%d\n", gpio, val); in iproc_gpio_direction_output()
385 unsigned int shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_get_direction() local
387 if (readl(chip->base + offset) & BIT(shift)) in iproc_gpio_get_direction()
398 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_set()
400 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_set()
402 dev_dbg(chip->dev, "gpio:%u set, value:%d\n", gpio, val); in iproc_gpio_set()
412 unsigned int shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_get() local
414 return !!(readl(chip->base + offset) & BIT(shift)); in iproc_gpio_get()
433 if (!chip->nr_pinconf_disable) in iproc_pinconf_param_is_disabled()
436 for (i = 0; i < chip->nr_pinconf_disable; i++) in iproc_pinconf_param_is_disabled()
437 if (chip->pinconf_disable[i] == param) in iproc_pinconf_param_is_disabled()
447 unsigned int bit, nbits = 0; in iproc_pinconf_disable_map_create() local
450 for_each_set_bit(bit, &disable_mask, map_size) in iproc_pinconf_disable_map_create()
460 chip->pinconf_disable = devm_kcalloc(chip->dev, nbits, in iproc_pinconf_disable_map_create()
461 sizeof(*chip->pinconf_disable), in iproc_pinconf_disable_map_create()
463 if (!chip->pinconf_disable) in iproc_pinconf_disable_map_create()
464 return -ENOMEM; in iproc_pinconf_disable_map_create()
466 chip->nr_pinconf_disable = nbits; in iproc_pinconf_disable_map_create()
470 for_each_set_bit(bit, &disable_mask, map_size) in iproc_pinconf_disable_map_create()
471 chip->pinconf_disable[nbits++] = iproc_pinconf_disable_map[bit]; in iproc_pinconf_disable_map_create()
503 unsigned int shift; in iproc_gpio_set_pull() local
506 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_set_pull()
507 if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { in iproc_gpio_set_pull()
508 base = chip->io_ctrl; in iproc_gpio_set_pull()
509 shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_set_pull()
514 /* no pull-up or pull-down */ in iproc_gpio_set_pull()
515 val_1 &= ~BIT(shift); in iproc_gpio_set_pull()
516 val_2 &= ~BIT(shift); in iproc_gpio_set_pull()
518 val_1 |= BIT(shift); in iproc_gpio_set_pull()
519 val_2 &= ~BIT(shift); in iproc_gpio_set_pull()
521 val_1 &= ~BIT(shift); in iproc_gpio_set_pull()
522 val_2 |= BIT(shift); in iproc_gpio_set_pull()
538 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_set_pull()
539 dev_dbg(chip->dev, "gpio:%u set pullup:%d\n", gpio, pull_up); in iproc_gpio_set_pull()
549 unsigned int shift; in iproc_gpio_get_pull() local
552 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_get_pull()
553 if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { in iproc_gpio_get_pull()
554 base = chip->io_ctrl; in iproc_gpio_get_pull()
555 shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_get_pull()
557 val_1 = readl(base + IPROC_GPIO_PULL_UP_OFFSET) & BIT(shift); in iproc_gpio_get_pull()
558 val_2 = readl(base + IPROC_GPIO_PULL_DN_OFFSET) & BIT(shift); in iproc_gpio_get_pull()
567 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_get_pull()
570 #define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \ argument
571 ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
573 ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
574 ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET)))
580 unsigned int i, offset, shift; in iproc_gpio_set_strength() local
586 return -ENOTSUPP; in iproc_gpio_set_strength()
588 if (chip->io_ctrl) { in iproc_gpio_set_strength()
589 base = chip->io_ctrl; in iproc_gpio_set_strength()
591 base = chip->base; in iproc_gpio_set_strength()
594 shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_set_strength()
596 dev_dbg(chip->dev, "gpio:%u set drive strength:%d mA\n", gpio, in iproc_gpio_set_strength()
599 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_set_strength()
600 strength = (strength / 2) - 1; in iproc_gpio_set_strength()
602 offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); in iproc_gpio_set_strength()
604 val &= ~BIT(shift); in iproc_gpio_set_strength()
605 val |= ((strength >> i) & 0x1) << shift; in iproc_gpio_set_strength()
608 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_set_strength()
617 unsigned int i, offset, shift; in iproc_gpio_get_strength() local
621 if (chip->io_ctrl) { in iproc_gpio_get_strength()
622 base = chip->io_ctrl; in iproc_gpio_get_strength()
624 base = chip->base; in iproc_gpio_get_strength()
627 shift = IPROC_GPIO_SHIFT(gpio); in iproc_gpio_get_strength()
629 raw_spin_lock_irqsave(&chip->lock, flags); in iproc_gpio_get_strength()
632 offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); in iproc_gpio_get_strength()
633 val = readl(base + offset) & BIT(shift); in iproc_gpio_get_strength()
634 val >>= shift; in iproc_gpio_get_strength()
640 raw_spin_unlock_irqrestore(&chip->lock, flags); in iproc_gpio_get_strength()
656 return -ENOTSUPP; in iproc_pin_config_get()
664 return -EINVAL; in iproc_pin_config_get()
671 return -EINVAL; in iproc_pin_config_get()
678 return -EINVAL; in iproc_pin_config_get()
689 return -ENOTSUPP; in iproc_pin_config_get()
692 return -ENOTSUPP; in iproc_pin_config_get()
702 int ret = -ENOTSUPP; in iproc_pin_config_set()
708 return -ENOTSUPP; in iproc_pin_config_set()
738 dev_err(chip->dev, "invalid configuration\n"); in iproc_pin_config_set()
739 return -ENOTSUPP; in iproc_pin_config_set()
757 * Here a local pinctrl device is created with simple 1-to-1 pin mapping to the
762 struct pinctrl_desc *pctldesc = &chip->pctldesc; in iproc_gpio_register_pinconf()
764 struct gpio_chip *gc = &chip->gc; in iproc_gpio_register_pinconf()
767 pins = devm_kcalloc(chip->dev, gc->ngpio, sizeof(*pins), GFP_KERNEL); in iproc_gpio_register_pinconf()
769 return -ENOMEM; in iproc_gpio_register_pinconf()
771 for (i = 0; i < gc->ngpio; i++) { in iproc_gpio_register_pinconf()
773 pins[i].name = devm_kasprintf(chip->dev, GFP_KERNEL, in iproc_gpio_register_pinconf()
774 "gpio-%d", i); in iproc_gpio_register_pinconf()
776 return -ENOMEM; in iproc_gpio_register_pinconf()
779 pctldesc->name = dev_name(chip->dev); in iproc_gpio_register_pinconf()
780 pctldesc->pctlops = &iproc_pctrl_ops; in iproc_gpio_register_pinconf()
781 pctldesc->pins = pins; in iproc_gpio_register_pinconf()
782 pctldesc->npins = gc->ngpio; in iproc_gpio_register_pinconf()
783 pctldesc->confops = &iproc_pconf_ops; in iproc_gpio_register_pinconf()
785 chip->pctl = devm_pinctrl_register(chip->dev, pctldesc, chip); in iproc_gpio_register_pinconf()
786 if (IS_ERR(chip->pctl)) { in iproc_gpio_register_pinconf()
787 dev_err(chip->dev, "unable to register pinctrl device\n"); in iproc_gpio_register_pinconf()
788 return PTR_ERR(chip->pctl); in iproc_gpio_register_pinconf()
795 { .compatible = "brcm,iproc-gpio" },
796 { .compatible = "brcm,cygnus-ccm-gpio" },
797 { .compatible = "brcm,cygnus-asiu-gpio" },
798 { .compatible = "brcm,cygnus-crmu-gpio" },
799 { .compatible = "brcm,iproc-nsp-gpio" },
800 { .compatible = "brcm,iproc-stingray-gpio" },
806 struct device *dev = &pdev->dev; in iproc_gpio_probe()
816 if (of_device_is_compatible(dev->of_node, "brcm,iproc-nsp-gpio")) in iproc_gpio_probe()
817 pinconf_disable_mask = BIT(IPROC_PINCONF_DRIVE_STRENGTH); in iproc_gpio_probe()
819 else if (of_device_is_compatible(dev->of_node, in iproc_gpio_probe()
820 "brcm,iproc-stingray-gpio")) in iproc_gpio_probe()
825 return -ENOMEM; in iproc_gpio_probe()
827 chip->dev = dev; in iproc_gpio_probe()
830 chip->base = devm_platform_ioremap_resource(pdev, 0); in iproc_gpio_probe()
831 if (IS_ERR(chip->base)) { in iproc_gpio_probe()
833 return PTR_ERR(chip->base); in iproc_gpio_probe()
838 chip->io_ctrl = devm_ioremap_resource(dev, res); in iproc_gpio_probe()
839 if (IS_ERR(chip->io_ctrl)) in iproc_gpio_probe()
840 return PTR_ERR(chip->io_ctrl); in iproc_gpio_probe()
841 if (of_device_is_compatible(dev->of_node, in iproc_gpio_probe()
842 "brcm,cygnus-ccm-gpio")) in iproc_gpio_probe()
848 chip->io_ctrl_type = io_ctrl_type; in iproc_gpio_probe()
850 if (of_property_read_u32(dev->of_node, "ngpios", &ngpios)) { in iproc_gpio_probe()
851 dev_err(&pdev->dev, "missing ngpios DT property\n"); in iproc_gpio_probe()
852 return -ENODEV; in iproc_gpio_probe()
855 raw_spin_lock_init(&chip->lock); in iproc_gpio_probe()
857 gc = &chip->gc; in iproc_gpio_probe()
858 gc->base = -1; in iproc_gpio_probe()
859 gc->ngpio = ngpios; in iproc_gpio_probe()
860 chip->num_banks = (ngpios + NGPIOS_PER_BANK - 1) / NGPIOS_PER_BANK; in iproc_gpio_probe()
861 gc->label = dev_name(dev); in iproc_gpio_probe()
862 gc->parent = dev; in iproc_gpio_probe()
863 gc->request = iproc_gpio_request; in iproc_gpio_probe()
864 gc->free = iproc_gpio_free; in iproc_gpio_probe()
865 gc->direction_input = iproc_gpio_direction_input; in iproc_gpio_probe()
866 gc->direction_output = iproc_gpio_direction_output; in iproc_gpio_probe()
867 gc->get_direction = iproc_gpio_get_direction; in iproc_gpio_probe()
868 gc->set = iproc_gpio_set; in iproc_gpio_probe()
869 gc->get = iproc_gpio_get; in iproc_gpio_probe()
871 chip->pinmux_is_supported = of_property_read_bool(dev->of_node, in iproc_gpio_probe()
872 "gpio-ranges"); in iproc_gpio_probe()
879 girq = &gc->irq; in iproc_gpio_probe()
881 girq->parent_handler = iproc_gpio_irq_handler; in iproc_gpio_probe()
882 girq->num_parents = 1; in iproc_gpio_probe()
883 girq->parents = devm_kcalloc(dev, 1, in iproc_gpio_probe()
884 sizeof(*girq->parents), in iproc_gpio_probe()
886 if (!girq->parents) in iproc_gpio_probe()
887 return -ENOMEM; in iproc_gpio_probe()
888 girq->parents[0] = irq; in iproc_gpio_probe()
889 girq->default_type = IRQ_TYPE_NONE; in iproc_gpio_probe()
890 girq->handler = handle_bad_irq; in iproc_gpio_probe()
925 .name = "iproc-gpio",