Lines Matching refs:chip

122 static inline void cygnus_set_bit(struct cygnus_gpio *chip, unsigned int reg,  in cygnus_set_bit()  argument
129 val = readl(chip->base + offset); in cygnus_set_bit()
134 writel(val, chip->base + offset); in cygnus_set_bit()
137 static inline bool cygnus_get_bit(struct cygnus_gpio *chip, unsigned int reg, in cygnus_get_bit() argument
143 return !!(readl(chip->base + offset) & BIT(shift)); in cygnus_get_bit()
149 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_handler() local
156 for (i = 0; i < chip->num_banks; i++) { in cygnus_gpio_irq_handler()
157 unsigned long val = readl(chip->base + (i * GPIO_BANK_SIZE) + in cygnus_gpio_irq_handler()
168 writel(BIT(bit), chip->base + (i * GPIO_BANK_SIZE) + in cygnus_gpio_irq_handler()
182 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_ack() local
189 writel(val, chip->base + offset); in cygnus_gpio_irq_ack()
201 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_set_mask() local
204 cygnus_set_bit(chip, CYGNUS_GPIO_INT_MSK_OFFSET, gpio, unmask); in cygnus_gpio_irq_set_mask()
210 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_mask() local
213 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_irq_mask()
215 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_irq_mask()
221 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_unmask() local
224 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_irq_unmask()
226 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_irq_unmask()
232 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_irq_set_type() local
261 dev_err(chip->dev, "invalid GPIO IRQ type 0x%x\n", in cygnus_gpio_irq_set_type()
266 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_irq_set_type()
267 cygnus_set_bit(chip, CYGNUS_GPIO_IN_TYPE_OFFSET, gpio, in cygnus_gpio_irq_set_type()
269 cygnus_set_bit(chip, CYGNUS_GPIO_INT_DE_OFFSET, gpio, dual_edge); in cygnus_gpio_irq_set_type()
270 cygnus_set_bit(chip, CYGNUS_GPIO_INT_EDGE_OFFSET, gpio, in cygnus_gpio_irq_set_type()
272 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_irq_set_type()
274 dev_dbg(chip->dev, in cygnus_gpio_irq_set_type()
294 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_request() local
298 if (!chip->pinmux_is_supported) in cygnus_gpio_request()
306 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_free() local
309 if (!chip->pinmux_is_supported) in cygnus_gpio_free()
317 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_direction_input() local
320 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_direction_input()
321 cygnus_set_bit(chip, CYGNUS_GPIO_OUT_EN_OFFSET, gpio, false); in cygnus_gpio_direction_input()
322 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_direction_input()
324 dev_dbg(chip->dev, "gpio:%u set input\n", gpio); in cygnus_gpio_direction_input()
332 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_direction_output() local
335 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_direction_output()
336 cygnus_set_bit(chip, CYGNUS_GPIO_OUT_EN_OFFSET, gpio, true); in cygnus_gpio_direction_output()
337 cygnus_set_bit(chip, CYGNUS_GPIO_DATA_OUT_OFFSET, gpio, !!(val)); in cygnus_gpio_direction_output()
338 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_direction_output()
340 dev_dbg(chip->dev, "gpio:%u set output, value:%d\n", gpio, val); in cygnus_gpio_direction_output()
347 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_set() local
350 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_set()
351 cygnus_set_bit(chip, CYGNUS_GPIO_DATA_OUT_OFFSET, gpio, !!(val)); in cygnus_gpio_set()
352 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_set()
354 dev_dbg(chip->dev, "gpio:%u set, value:%d\n", gpio, val); in cygnus_gpio_set()
359 struct cygnus_gpio *chip = to_cygnus_gpio(gc); in cygnus_gpio_get() local
364 return !!(readl(chip->base + offset) & BIT(shift)); in cygnus_gpio_get()
389 static int cygnus_gpio_set_pull(struct cygnus_gpio *chip, unsigned gpio, in cygnus_gpio_set_pull() argument
394 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_set_pull()
397 cygnus_set_bit(chip, CYGNUS_GPIO_RES_EN_OFFSET, gpio, false); in cygnus_gpio_set_pull()
399 cygnus_set_bit(chip, CYGNUS_GPIO_PAD_RES_OFFSET, gpio, in cygnus_gpio_set_pull()
401 cygnus_set_bit(chip, CYGNUS_GPIO_RES_EN_OFFSET, gpio, true); in cygnus_gpio_set_pull()
404 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_set_pull()
406 dev_dbg(chip->dev, "gpio:%u set pullup:%d\n", gpio, pull_up); in cygnus_gpio_set_pull()
411 static void cygnus_gpio_get_pull(struct cygnus_gpio *chip, unsigned gpio, in cygnus_gpio_get_pull() argument
416 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_get_pull()
417 *disable = !cygnus_get_bit(chip, CYGNUS_GPIO_RES_EN_OFFSET, gpio); in cygnus_gpio_get_pull()
418 *pull_up = cygnus_get_bit(chip, CYGNUS_GPIO_PAD_RES_OFFSET, gpio); in cygnus_gpio_get_pull()
419 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_get_pull()
422 static int cygnus_gpio_set_strength(struct cygnus_gpio *chip, unsigned gpio, in cygnus_gpio_set_strength() argument
434 if (chip->io_ctrl) { in cygnus_gpio_set_strength()
435 base = chip->io_ctrl; in cygnus_gpio_set_strength()
438 base = chip->base; in cygnus_gpio_set_strength()
445 dev_dbg(chip->dev, "gpio:%u set drive strength:%d mA\n", gpio, in cygnus_gpio_set_strength()
448 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_set_strength()
457 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_set_strength()
462 static int cygnus_gpio_get_strength(struct cygnus_gpio *chip, unsigned gpio, in cygnus_gpio_get_strength() argument
470 if (chip->io_ctrl) { in cygnus_gpio_get_strength()
471 base = chip->io_ctrl; in cygnus_gpio_get_strength()
474 base = chip->base; in cygnus_gpio_get_strength()
481 spin_lock_irqsave(&chip->lock, flags); in cygnus_gpio_get_strength()
492 spin_unlock_irqrestore(&chip->lock, flags); in cygnus_gpio_get_strength()
500 struct cygnus_gpio *chip = pinctrl_dev_get_drvdata(pctldev); in cygnus_pin_config_get() local
509 cygnus_gpio_get_pull(chip, gpio, &disable, &pull_up); in cygnus_pin_config_get()
516 cygnus_gpio_get_pull(chip, gpio, &disable, &pull_up); in cygnus_pin_config_get()
523 cygnus_gpio_get_pull(chip, gpio, &disable, &pull_up); in cygnus_pin_config_get()
530 ret = cygnus_gpio_get_strength(chip, gpio, &arg); in cygnus_pin_config_get()
548 struct cygnus_gpio *chip = pinctrl_dev_get_drvdata(pctldev); in cygnus_pin_config_set() local
560 ret = cygnus_gpio_set_pull(chip, gpio, true, false); in cygnus_pin_config_set()
566 ret = cygnus_gpio_set_pull(chip, gpio, false, true); in cygnus_pin_config_set()
572 ret = cygnus_gpio_set_pull(chip, gpio, false, false); in cygnus_pin_config_set()
578 ret = cygnus_gpio_set_strength(chip, gpio, arg); in cygnus_pin_config_set()
584 dev_err(chip->dev, "invalid configuration\n"); in cygnus_pin_config_set()
675 static int cygnus_gpio_pinmux_add_range(struct cygnus_gpio *chip) in cygnus_gpio_pinmux_add_range() argument
677 struct device_node *node = chip->dev->of_node; in cygnus_gpio_pinmux_add_range()
680 struct gpio_chip *gc = &chip->gc; in cygnus_gpio_pinmux_add_range()
692 dev_err(chip->dev, "failed to get pinmux device\n"); in cygnus_gpio_pinmux_add_range()
703 dev_err(chip->dev, "unable to add GPIO pin range\n"); in cygnus_gpio_pinmux_add_range()
708 chip->pinmux_is_supported = true; in cygnus_gpio_pinmux_add_range()
727 static int cygnus_gpio_register_pinconf(struct cygnus_gpio *chip) in cygnus_gpio_register_pinconf() argument
729 struct pinctrl_desc *pctldesc = &chip->pctldesc; in cygnus_gpio_register_pinconf()
731 struct gpio_chip *gc = &chip->gc; in cygnus_gpio_register_pinconf()
734 pins = devm_kcalloc(chip->dev, gc->ngpio, sizeof(*pins), GFP_KERNEL); in cygnus_gpio_register_pinconf()
740 pins[i].name = devm_kasprintf(chip->dev, GFP_KERNEL, in cygnus_gpio_register_pinconf()
746 pctldesc->name = dev_name(chip->dev); in cygnus_gpio_register_pinconf()
752 chip->pctl = pinctrl_register(pctldesc, chip->dev, chip); in cygnus_gpio_register_pinconf()
753 if (!chip->pctl) { in cygnus_gpio_register_pinconf()
754 dev_err(chip->dev, "unable to register pinctrl device\n"); in cygnus_gpio_register_pinconf()
761 static void cygnus_gpio_unregister_pinconf(struct cygnus_gpio *chip) in cygnus_gpio_unregister_pinconf() argument
763 if (chip->pctl) in cygnus_gpio_unregister_pinconf()
764 pinctrl_unregister(chip->pctl); in cygnus_gpio_unregister_pinconf()
802 struct cygnus_gpio *chip; in cygnus_gpio_probe() local
815 chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); in cygnus_gpio_probe()
816 if (!chip) in cygnus_gpio_probe()
819 chip->dev = dev; in cygnus_gpio_probe()
820 platform_set_drvdata(pdev, chip); in cygnus_gpio_probe()
823 chip->base = devm_ioremap_resource(dev, res); in cygnus_gpio_probe()
824 if (IS_ERR(chip->base)) { in cygnus_gpio_probe()
826 return PTR_ERR(chip->base); in cygnus_gpio_probe()
831 chip->io_ctrl = devm_ioremap_resource(dev, res); in cygnus_gpio_probe()
832 if (IS_ERR(chip->io_ctrl)) { in cygnus_gpio_probe()
834 return PTR_ERR(chip->io_ctrl); in cygnus_gpio_probe()
838 spin_lock_init(&chip->lock); in cygnus_gpio_probe()
840 gc = &chip->gc; in cygnus_gpio_probe()
843 chip->num_banks = (ngpios + NGPIOS_PER_BANK - 1) / NGPIOS_PER_BANK; in cygnus_gpio_probe()
860 ret = cygnus_gpio_pinmux_add_range(chip); in cygnus_gpio_probe()
866 ret = cygnus_gpio_register_pinconf(chip); in cygnus_gpio_probe()
889 cygnus_gpio_unregister_pinconf(chip); in cygnus_gpio_probe()