Lines Matching +full:sgpio +full:- +full:gpio
9 * Copyright (c) 2011 - 2014 Cambridge Silicon Radio Limited, a CSR plc group
30 #include <linux/gpio.h>
33 #include "pinctrl-sirf.h"
35 #define DRIVER_NAME "pinmux-sirf"
107 dev_err(spmx->dev, "No child nodes passed via DT\n"); in sirfsoc_dt_node_to_map()
108 return -ENODEV; in sirfsoc_dt_node_to_map()
113 return -ENOMEM; in sirfsoc_dt_node_to_map()
154 const struct sirfsoc_muxmask *mask = mux->muxmask; in sirfsoc_pinmux_endisable()
156 for (i = 0; i < mux->muxmask_counts; i++) { in sirfsoc_pinmux_endisable()
158 muxval = readl(spmx->gpio_virtbase + in sirfsoc_pinmux_endisable()
164 writel(muxval, spmx->gpio_virtbase + in sirfsoc_pinmux_endisable()
168 if (mux->funcmask && enable) { in sirfsoc_pinmux_endisable()
172 readl(spmx->rsc_virtbase + mux->ctrlreg); in sirfsoc_pinmux_endisable()
174 (func_en_val & ~mux->funcmask) | (mux->funcval); in sirfsoc_pinmux_endisable()
175 writel(func_en_val, spmx->rsc_virtbase + mux->ctrlreg); in sirfsoc_pinmux_endisable()
217 int group = range->id; in sirfsoc_pinmux_request_gpio()
223 muxval = readl(spmx->gpio_virtbase + in sirfsoc_pinmux_request_gpio()
225 muxval = muxval | (1 << (offset - range->pin_base)); in sirfsoc_pinmux_request_gpio()
226 writel(muxval, spmx->gpio_virtbase + in sirfsoc_pinmux_request_gpio()
250 { .compatible = "sirf,prima2-rsc" }, in sirfsoc_rsc_of_iomap()
266 if (gpiospec->args[0] > SIRFSOC_GPIO_NO_OF_BANKS * SIRFSOC_GPIO_BANK_SIZE) in sirfsoc_gpio_of_xlate()
267 return -EINVAL; in sirfsoc_gpio_of_xlate()
270 *flags = gpiospec->args[1]; in sirfsoc_gpio_of_xlate()
272 return gpiospec->args[0]; in sirfsoc_gpio_of_xlate()
276 { .compatible = "sirf,prima2-pinctrl", .data = &prima2_pinctrl_data, },
277 { .compatible = "sirf,atlas6-pinctrl", .data = &atlas6_pinctrl_data, },
285 struct device_node *np = pdev->dev.of_node; in sirfsoc_pinmux_probe()
289 spmx = devm_kzalloc(&pdev->dev, sizeof(*spmx), GFP_KERNEL); in sirfsoc_pinmux_probe()
291 return -ENOMEM; in sirfsoc_pinmux_probe()
293 spmx->dev = &pdev->dev; in sirfsoc_pinmux_probe()
297 spmx->gpio_virtbase = of_iomap(np, 0); in sirfsoc_pinmux_probe()
298 if (!spmx->gpio_virtbase) { in sirfsoc_pinmux_probe()
299 dev_err(&pdev->dev, "can't map gpio registers\n"); in sirfsoc_pinmux_probe()
300 return -ENOMEM; in sirfsoc_pinmux_probe()
303 spmx->rsc_virtbase = sirfsoc_rsc_of_iomap(); in sirfsoc_pinmux_probe()
304 if (!spmx->rsc_virtbase) { in sirfsoc_pinmux_probe()
305 ret = -ENOMEM; in sirfsoc_pinmux_probe()
306 dev_err(&pdev->dev, "can't map rsc registers\n"); in sirfsoc_pinmux_probe()
310 pdata = of_match_node(pinmux_ids, np)->data; in sirfsoc_pinmux_probe()
311 sirfsoc_pin_groups = pdata->grps; in sirfsoc_pinmux_probe()
312 sirfsoc_pingrp_cnt = pdata->grps_cnt; in sirfsoc_pinmux_probe()
313 sirfsoc_pmx_functions = pdata->funcs; in sirfsoc_pinmux_probe()
314 sirfsoc_pmxfunc_cnt = pdata->funcs_cnt; in sirfsoc_pinmux_probe()
315 sirfsoc_pinmux_desc.pins = pdata->pads; in sirfsoc_pinmux_probe()
316 sirfsoc_pinmux_desc.npins = pdata->pads_cnt; in sirfsoc_pinmux_probe()
320 spmx->pmx = pinctrl_register(&sirfsoc_pinmux_desc, &pdev->dev, spmx); in sirfsoc_pinmux_probe()
321 if (IS_ERR(spmx->pmx)) { in sirfsoc_pinmux_probe()
322 dev_err(&pdev->dev, "could not register SIRFSOC pinmux driver\n"); in sirfsoc_pinmux_probe()
323 ret = PTR_ERR(spmx->pmx); in sirfsoc_pinmux_probe()
327 dev_info(&pdev->dev, "initialized SIRFSOC pinmux driver\n"); in sirfsoc_pinmux_probe()
332 iounmap(spmx->rsc_virtbase); in sirfsoc_pinmux_probe()
334 iounmap(spmx->gpio_virtbase); in sirfsoc_pinmux_probe()
346 spmx->gpio_regs[i][j] = readl(spmx->gpio_virtbase + in sirfsoc_pinmux_suspend_noirq()
349 spmx->ints_regs[i] = readl(spmx->gpio_virtbase + in sirfsoc_pinmux_suspend_noirq()
351 spmx->paden_regs[i] = readl(spmx->gpio_virtbase + in sirfsoc_pinmux_suspend_noirq()
354 spmx->dspen_regs = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_DSP_EN0); in sirfsoc_pinmux_suspend_noirq()
357 spmx->rsc_regs[i] = readl(spmx->rsc_virtbase + 4 * i); in sirfsoc_pinmux_suspend_noirq()
369 writel(spmx->gpio_regs[i][j], spmx->gpio_virtbase + in sirfsoc_pinmux_resume_noirq()
372 writel(spmx->ints_regs[i], spmx->gpio_virtbase + in sirfsoc_pinmux_resume_noirq()
374 writel(spmx->paden_regs[i], spmx->gpio_virtbase + in sirfsoc_pinmux_resume_noirq()
377 writel(spmx->dspen_regs, spmx->gpio_virtbase + SIRFSOC_GPIO_DSP_EN0); in sirfsoc_pinmux_resume_noirq()
380 writel(spmx->rsc_regs[i], spmx->rsc_virtbase + 4 * i); in sirfsoc_pinmux_resume_noirq()
411 sirfsoc_gpio_to_bank(struct sirfsoc_gpio_chip *sgpio, unsigned int offset) in sirfsoc_gpio_to_bank() argument
413 return &sgpio->sgpio_bank[offset / SIRFSOC_GPIO_BANK_SIZE]; in sirfsoc_gpio_to_bank()
424 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(gc); in sirfsoc_gpio_irq_ack() local
425 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); in sirfsoc_gpio_irq_ack()
426 int idx = sirfsoc_gpio_to_bankoff(d->hwirq); in sirfsoc_gpio_irq_ack()
430 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in sirfsoc_gpio_irq_ack()
432 spin_lock_irqsave(&sgpio->lock, flags); in sirfsoc_gpio_irq_ack()
434 val = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_irq_ack()
436 writel(val, sgpio->chip.regs + offset); in sirfsoc_gpio_irq_ack()
438 spin_unlock_irqrestore(&sgpio->lock, flags); in sirfsoc_gpio_irq_ack()
441 static void __sirfsoc_gpio_irq_mask(struct sirfsoc_gpio_chip *sgpio, in __sirfsoc_gpio_irq_mask() argument
448 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in __sirfsoc_gpio_irq_mask()
450 spin_lock_irqsave(&sgpio->lock, flags); in __sirfsoc_gpio_irq_mask()
452 val = readl(sgpio->chip.regs + offset); in __sirfsoc_gpio_irq_mask()
455 writel(val, sgpio->chip.regs + offset); in __sirfsoc_gpio_irq_mask()
457 spin_unlock_irqrestore(&sgpio->lock, flags); in __sirfsoc_gpio_irq_mask()
463 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(gc); in sirfsoc_gpio_irq_mask() local
464 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); in sirfsoc_gpio_irq_mask()
466 __sirfsoc_gpio_irq_mask(sgpio, bank, d->hwirq % SIRFSOC_GPIO_BANK_SIZE); in sirfsoc_gpio_irq_mask()
472 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(gc); in sirfsoc_gpio_irq_unmask() local
473 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); in sirfsoc_gpio_irq_unmask()
474 int idx = sirfsoc_gpio_to_bankoff(d->hwirq); in sirfsoc_gpio_irq_unmask()
478 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in sirfsoc_gpio_irq_unmask()
480 spin_lock_irqsave(&sgpio->lock, flags); in sirfsoc_gpio_irq_unmask()
482 val = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_irq_unmask()
485 writel(val, sgpio->chip.regs + offset); in sirfsoc_gpio_irq_unmask()
487 spin_unlock_irqrestore(&sgpio->lock, flags); in sirfsoc_gpio_irq_unmask()
493 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(gc); in sirfsoc_gpio_irq_type() local
494 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); in sirfsoc_gpio_irq_type()
495 int idx = sirfsoc_gpio_to_bankoff(d->hwirq); in sirfsoc_gpio_irq_type()
499 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in sirfsoc_gpio_irq_type()
501 spin_lock_irqsave(&sgpio->lock, flags); in sirfsoc_gpio_irq_type()
503 val = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_irq_type()
536 writel(val, sgpio->chip.regs + offset); in sirfsoc_gpio_irq_type()
538 spin_unlock_irqrestore(&sgpio->lock, flags); in sirfsoc_gpio_irq_type()
544 .name = "sirf-gpio-irq",
555 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(gc); in sirfsoc_gpio_handle_irq() local
563 bank = &sgpio->sgpio_bank[i]; in sirfsoc_gpio_handle_irq()
564 if (bank->parent_irq == irq) in sirfsoc_gpio_handle_irq()
571 status = readl(sgpio->chip.regs + SIRFSOC_GPIO_INT_STATUS(bank->id)); in sirfsoc_gpio_handle_irq()
574 "%s: gpio id %d status %#x no interrupt is flagged\n", in sirfsoc_gpio_handle_irq()
575 __func__, bank->id, status); in sirfsoc_gpio_handle_irq()
581 ctrl = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx)); in sirfsoc_gpio_handle_irq()
584 * Here we must check whether the corresponding GPIO's interrupt in sirfsoc_gpio_handle_irq()
588 pr_debug("%s: gpio id %d idx %d happens\n", in sirfsoc_gpio_handle_irq()
589 __func__, bank->id, idx); in sirfsoc_gpio_handle_irq()
590 generic_handle_irq(irq_find_mapping(gc->irq.domain, idx + in sirfsoc_gpio_handle_irq()
591 bank->id * SIRFSOC_GPIO_BANK_SIZE)); in sirfsoc_gpio_handle_irq()
601 static inline void sirfsoc_gpio_set_input(struct sirfsoc_gpio_chip *sgpio, in sirfsoc_gpio_set_input() argument
606 val = readl(sgpio->chip.regs + ctrl_offset); in sirfsoc_gpio_set_input()
608 writel(val, sgpio->chip.regs + ctrl_offset); in sirfsoc_gpio_set_input()
613 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_request() local
614 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset); in sirfsoc_gpio_request()
617 if (pinctrl_gpio_request(chip->base + offset)) in sirfsoc_gpio_request()
618 return -ENODEV; in sirfsoc_gpio_request()
620 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_request()
626 sirfsoc_gpio_set_input(sgpio, SIRFSOC_GPIO_CTRL(bank->id, offset)); in sirfsoc_gpio_request()
627 __sirfsoc_gpio_irq_mask(sgpio, bank, offset); in sirfsoc_gpio_request()
629 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_request()
636 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_free() local
637 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset); in sirfsoc_gpio_free()
640 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_free()
642 __sirfsoc_gpio_irq_mask(sgpio, bank, offset); in sirfsoc_gpio_free()
643 sirfsoc_gpio_set_input(sgpio, SIRFSOC_GPIO_CTRL(bank->id, offset)); in sirfsoc_gpio_free()
645 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_free()
647 pinctrl_gpio_free(chip->base + offset); in sirfsoc_gpio_free()
650 static int sirfsoc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) in sirfsoc_gpio_direction_input() argument
652 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_direction_input() local
653 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, gpio); in sirfsoc_gpio_direction_input()
654 int idx = sirfsoc_gpio_to_bankoff(gpio); in sirfsoc_gpio_direction_input()
658 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in sirfsoc_gpio_direction_input()
660 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_direction_input()
662 sirfsoc_gpio_set_input(sgpio, offset); in sirfsoc_gpio_direction_input()
664 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_direction_input()
669 static inline void sirfsoc_gpio_set_output(struct sirfsoc_gpio_chip *sgpio, in sirfsoc_gpio_set_output() argument
677 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_set_output()
679 out_ctrl = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_set_output()
687 writel(out_ctrl, sgpio->chip.regs + offset); in sirfsoc_gpio_set_output()
689 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_set_output()
693 unsigned gpio, int value) in sirfsoc_gpio_direction_output() argument
695 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_direction_output() local
696 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, gpio); in sirfsoc_gpio_direction_output()
697 int idx = sirfsoc_gpio_to_bankoff(gpio); in sirfsoc_gpio_direction_output()
701 offset = SIRFSOC_GPIO_CTRL(bank->id, idx); in sirfsoc_gpio_direction_output()
703 spin_lock_irqsave(&sgpio->lock, flags); in sirfsoc_gpio_direction_output()
705 sirfsoc_gpio_set_output(sgpio, bank, offset, value); in sirfsoc_gpio_direction_output()
707 spin_unlock_irqrestore(&sgpio->lock, flags); in sirfsoc_gpio_direction_output()
714 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_get_value() local
715 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset); in sirfsoc_gpio_get_value()
719 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_get_value()
721 val = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); in sirfsoc_gpio_get_value()
723 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_get_value()
731 struct sirfsoc_gpio_chip *sgpio = gpiochip_get_data(chip); in sirfsoc_gpio_set_value() local
732 struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset); in sirfsoc_gpio_set_value()
736 spin_lock_irqsave(&bank->lock, flags); in sirfsoc_gpio_set_value()
738 ctrl = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); in sirfsoc_gpio_set_value()
743 writel(ctrl, sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); in sirfsoc_gpio_set_value()
745 spin_unlock_irqrestore(&bank->lock, flags); in sirfsoc_gpio_set_value()
748 static void sirfsoc_gpio_set_pullup(struct sirfsoc_gpio_chip *sgpio, in sirfsoc_gpio_set_pullup() argument
757 u32 val = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_set_pullup()
760 writel(val, sgpio->chip.regs + offset); in sirfsoc_gpio_set_pullup()
765 static void sirfsoc_gpio_set_pulldown(struct sirfsoc_gpio_chip *sgpio, in sirfsoc_gpio_set_pulldown() argument
774 u32 val = readl(sgpio->chip.regs + offset); in sirfsoc_gpio_set_pulldown()
777 writel(val, sgpio->chip.regs + offset); in sirfsoc_gpio_set_pulldown()
785 static struct sirfsoc_gpio_chip *sgpio; in sirfsoc_gpio_probe() local
794 return -ENODEV; in sirfsoc_gpio_probe()
796 sgpio = devm_kzalloc(&pdev->dev, sizeof(*sgpio), GFP_KERNEL); in sirfsoc_gpio_probe()
797 if (!sgpio) in sirfsoc_gpio_probe()
798 return -ENOMEM; in sirfsoc_gpio_probe()
799 spin_lock_init(&sgpio->lock); in sirfsoc_gpio_probe()
803 return -ENOMEM; in sirfsoc_gpio_probe()
805 sgpio->chip.gc.request = sirfsoc_gpio_request; in sirfsoc_gpio_probe()
806 sgpio->chip.gc.free = sirfsoc_gpio_free; in sirfsoc_gpio_probe()
807 sgpio->chip.gc.direction_input = sirfsoc_gpio_direction_input; in sirfsoc_gpio_probe()
808 sgpio->chip.gc.get = sirfsoc_gpio_get_value; in sirfsoc_gpio_probe()
809 sgpio->chip.gc.direction_output = sirfsoc_gpio_direction_output; in sirfsoc_gpio_probe()
810 sgpio->chip.gc.set = sirfsoc_gpio_set_value; in sirfsoc_gpio_probe()
811 sgpio->chip.gc.base = 0; in sirfsoc_gpio_probe()
812 sgpio->chip.gc.ngpio = SIRFSOC_GPIO_BANK_SIZE * SIRFSOC_GPIO_NO_OF_BANKS; in sirfsoc_gpio_probe()
813 sgpio->chip.gc.label = kasprintf(GFP_KERNEL, "%pOF", np); in sirfsoc_gpio_probe()
814 sgpio->chip.gc.of_node = np; in sirfsoc_gpio_probe()
815 sgpio->chip.gc.of_xlate = sirfsoc_gpio_of_xlate; in sirfsoc_gpio_probe()
816 sgpio->chip.gc.of_gpio_n_cells = 2; in sirfsoc_gpio_probe()
817 sgpio->chip.gc.parent = &pdev->dev; in sirfsoc_gpio_probe()
818 sgpio->chip.regs = regs; in sirfsoc_gpio_probe()
820 err = gpiochip_add_data(&sgpio->chip.gc, sgpio); in sirfsoc_gpio_probe()
822 dev_err(&pdev->dev, "%pOF: error in probe function with status %d\n", in sirfsoc_gpio_probe()
827 err = gpiochip_irqchip_add(&sgpio->chip.gc, in sirfsoc_gpio_probe()
832 dev_err(&pdev->dev, in sirfsoc_gpio_probe()
838 bank = &sgpio->sgpio_bank[i]; in sirfsoc_gpio_probe()
839 spin_lock_init(&bank->lock); in sirfsoc_gpio_probe()
840 bank->parent_irq = platform_get_irq(pdev, i); in sirfsoc_gpio_probe()
841 if (bank->parent_irq < 0) { in sirfsoc_gpio_probe()
842 err = bank->parent_irq; in sirfsoc_gpio_probe()
846 gpiochip_set_chained_irqchip(&sgpio->chip.gc, in sirfsoc_gpio_probe()
848 bank->parent_irq, in sirfsoc_gpio_probe()
852 err = gpiochip_add_pin_range(&sgpio->chip.gc, dev_name(&pdev->dev), in sirfsoc_gpio_probe()
855 dev_err(&pdev->dev, in sirfsoc_gpio_probe()
862 sirfsoc_gpio_set_pullup(sgpio, pullups); in sirfsoc_gpio_probe()
866 sirfsoc_gpio_set_pulldown(sgpio, pulldowns); in sirfsoc_gpio_probe()
872 gpiochip_remove(&sgpio->chip.gc); in sirfsoc_gpio_probe()
886 return -ENODEV; in sirfsoc_gpio_init()