Lines Matching +full:pin +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0-only
3 * GPIO controller in LSI ZEVIO SoCs.
5 * Author: Fabian Vogt <fabian@ritter-vogt.de>
25 …* http://hackspire.unsads.com/wiki/index.php/Memory-mapped_I/O_ports#90000000_-_General_Purpose_I.…
27 * 0x00-0x3F: Section 0
28 * +0x00: Masked interrupt status (read-only)
31 * +0x0C: W: Unmask interrupt (write-only)
34 * +0x18: Input (read-only)
36 * 0x40-0x7F: Section 1
37 * 0x80-0xBF: Section 2
38 * 0xC0-0xFF: Section 3
62 static inline u32 zevio_gpio_port_get(struct zevio_gpio *c, unsigned pin, in zevio_gpio_port_get() argument
65 unsigned section_offset = ((pin >> 3) & 3)*ZEVIO_GPIO_SECTION_SIZE; in zevio_gpio_port_get()
66 return readl(IOMEM(c->regs + section_offset + port_offset)); in zevio_gpio_port_get()
69 static inline void zevio_gpio_port_set(struct zevio_gpio *c, unsigned pin, in zevio_gpio_port_set() argument
72 unsigned section_offset = ((pin >> 3) & 3)*ZEVIO_GPIO_SECTION_SIZE; in zevio_gpio_port_set()
73 writel(val, IOMEM(c->regs + section_offset + port_offset)); in zevio_gpio_port_set()
77 static int zevio_gpio_get(struct gpio_chip *chip, unsigned pin) in zevio_gpio_get() argument
79 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_get() local
82 spin_lock(&controller->lock); in zevio_gpio_get()
83 dir = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_get()
84 if (dir & BIT(ZEVIO_GPIO_BIT(pin))) in zevio_gpio_get()
85 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_INPUT); in zevio_gpio_get()
87 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_get()
88 spin_unlock(&controller->lock); in zevio_gpio_get()
90 return (val >> ZEVIO_GPIO_BIT(pin)) & 0x1; in zevio_gpio_get()
93 static void zevio_gpio_set(struct gpio_chip *chip, unsigned pin, int value) in zevio_gpio_set() argument
95 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_set() local
98 spin_lock(&controller->lock); in zevio_gpio_set()
99 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_set()
101 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_set()
103 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_set()
105 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_OUTPUT, val); in zevio_gpio_set()
106 spin_unlock(&controller->lock); in zevio_gpio_set()
109 static int zevio_gpio_direction_input(struct gpio_chip *chip, unsigned pin) in zevio_gpio_direction_input() argument
111 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_direction_input() local
114 spin_lock(&controller->lock); in zevio_gpio_direction_input()
116 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_direction_input()
117 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_input()
118 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_DIRECTION, val); in zevio_gpio_direction_input()
120 spin_unlock(&controller->lock); in zevio_gpio_direction_input()
126 unsigned pin, int value) in zevio_gpio_direction_output() argument
128 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_direction_output() local
131 spin_lock(&controller->lock); in zevio_gpio_direction_output()
132 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_direction_output()
134 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
136 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
138 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_OUTPUT, val); in zevio_gpio_direction_output()
139 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_direction_output()
140 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
141 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_DIRECTION, val); in zevio_gpio_direction_output()
143 spin_unlock(&controller->lock); in zevio_gpio_direction_output()
148 static int zevio_gpio_to_irq(struct gpio_chip *chip, unsigned pin) in zevio_gpio_to_irq() argument
155 return -ENXIO; in zevio_gpio_to_irq()
172 struct zevio_gpio *controller; in zevio_gpio_probe() local
175 controller = devm_kzalloc(&pdev->dev, sizeof(*controller), GFP_KERNEL); in zevio_gpio_probe()
176 if (!controller) in zevio_gpio_probe()
177 return -ENOMEM; in zevio_gpio_probe()
180 controller->chip = zevio_gpio_chip; in zevio_gpio_probe()
181 controller->chip.parent = &pdev->dev; in zevio_gpio_probe()
183 controller->regs = devm_platform_ioremap_resource(pdev, 0); in zevio_gpio_probe()
184 if (IS_ERR(controller->regs)) in zevio_gpio_probe()
185 return dev_err_probe(&pdev->dev, PTR_ERR(controller->regs), in zevio_gpio_probe()
188 status = devm_gpiochip_add_data(&pdev->dev, &controller->chip, controller); in zevio_gpio_probe()
190 dev_err(&pdev->dev, "failed to add gpiochip: %d\n", status); in zevio_gpio_probe()
194 spin_lock_init(&controller->lock); in zevio_gpio_probe()
197 for (i = 0; i < controller->chip.ngpio; i += 8) in zevio_gpio_probe()
198 zevio_gpio_port_set(controller, i, ZEVIO_GPIO_INT_MASK, 0xFF); in zevio_gpio_probe()
200 dev_dbg(controller->chip.parent, "ZEVIO GPIO controller set up!\n"); in zevio_gpio_probe()
206 { .compatible = "lsi,zevio-gpio", },
212 .name = "gpio-zevio",