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>
26 …* http://hackspire.unsads.com/wiki/index.php/Memory-mapped_I/O_ports#90000000_-_General_Purpose_I.…
28 * 0x00-0x3F: Section 0
29 * +0x00: Masked interrupt status (read-only)
32 * +0x0C: W: Unmask interrupt (write-only)
35 * +0x18: Input (read-only)
37 * 0x40-0x7F: Section 1
38 * 0x80-0xBF: Section 2
39 * 0xC0-0xFF: Section 3
63 static inline u32 zevio_gpio_port_get(struct zevio_gpio *c, unsigned pin, in zevio_gpio_port_get() argument
66 unsigned section_offset = ((pin >> 3) & 3)*ZEVIO_GPIO_SECTION_SIZE; in zevio_gpio_port_get()
67 return readl(IOMEM(c->regs + section_offset + port_offset)); in zevio_gpio_port_get()
70 static inline void zevio_gpio_port_set(struct zevio_gpio *c, unsigned pin, in zevio_gpio_port_set() argument
73 unsigned section_offset = ((pin >> 3) & 3)*ZEVIO_GPIO_SECTION_SIZE; in zevio_gpio_port_set()
74 writel(val, IOMEM(c->regs + section_offset + port_offset)); in zevio_gpio_port_set()
78 static int zevio_gpio_get(struct gpio_chip *chip, unsigned pin) in zevio_gpio_get() argument
80 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_get() local
83 spin_lock(&controller->lock); in zevio_gpio_get()
84 dir = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_get()
85 if (dir & BIT(ZEVIO_GPIO_BIT(pin))) in zevio_gpio_get()
86 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_INPUT); in zevio_gpio_get()
88 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_get()
89 spin_unlock(&controller->lock); in zevio_gpio_get()
91 return (val >> ZEVIO_GPIO_BIT(pin)) & 0x1; in zevio_gpio_get()
94 static void zevio_gpio_set(struct gpio_chip *chip, unsigned pin, int value) in zevio_gpio_set() argument
96 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_set() local
99 spin_lock(&controller->lock); in zevio_gpio_set()
100 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_set()
102 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_set()
104 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_set()
106 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_OUTPUT, val); in zevio_gpio_set()
107 spin_unlock(&controller->lock); in zevio_gpio_set()
110 static int zevio_gpio_direction_input(struct gpio_chip *chip, unsigned pin) in zevio_gpio_direction_input() argument
112 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_direction_input() local
115 spin_lock(&controller->lock); in zevio_gpio_direction_input()
117 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_direction_input()
118 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_input()
119 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_DIRECTION, val); in zevio_gpio_direction_input()
121 spin_unlock(&controller->lock); in zevio_gpio_direction_input()
127 unsigned pin, int value) in zevio_gpio_direction_output() argument
129 struct zevio_gpio *controller = gpiochip_get_data(chip); in zevio_gpio_direction_output() local
132 spin_lock(&controller->lock); in zevio_gpio_direction_output()
133 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT); in zevio_gpio_direction_output()
135 val |= BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
137 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
139 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_OUTPUT, val); in zevio_gpio_direction_output()
140 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION); in zevio_gpio_direction_output()
141 val &= ~BIT(ZEVIO_GPIO_BIT(pin)); in zevio_gpio_direction_output()
142 zevio_gpio_port_set(controller, pin, ZEVIO_GPIO_DIRECTION, val); in zevio_gpio_direction_output()
144 spin_unlock(&controller->lock); in zevio_gpio_direction_output()
149 static int zevio_gpio_to_irq(struct gpio_chip *chip, unsigned pin) in zevio_gpio_to_irq() argument
156 return -ENXIO; in zevio_gpio_to_irq()
173 struct device *dev = &pdev->dev; in zevio_gpio_probe()
174 struct zevio_gpio *controller; in zevio_gpio_probe() local
177 controller = devm_kzalloc(&pdev->dev, sizeof(*controller), GFP_KERNEL); in zevio_gpio_probe()
178 if (!controller) in zevio_gpio_probe()
179 return -ENOMEM; in zevio_gpio_probe()
182 controller->chip = zevio_gpio_chip; in zevio_gpio_probe()
183 controller->chip.parent = &pdev->dev; in zevio_gpio_probe()
185 controller->chip.label = devm_kasprintf(dev, GFP_KERNEL, "%pfw", dev_fwnode(dev)); in zevio_gpio_probe()
186 if (!controller->chip.label) in zevio_gpio_probe()
187 return -ENOMEM; in zevio_gpio_probe()
189 controller->regs = devm_platform_ioremap_resource(pdev, 0); in zevio_gpio_probe()
190 if (IS_ERR(controller->regs)) in zevio_gpio_probe()
191 return dev_err_probe(&pdev->dev, PTR_ERR(controller->regs), in zevio_gpio_probe()
194 status = devm_gpiochip_add_data(&pdev->dev, &controller->chip, controller); in zevio_gpio_probe()
196 dev_err(&pdev->dev, "failed to add gpiochip: %d\n", status); in zevio_gpio_probe()
200 spin_lock_init(&controller->lock); in zevio_gpio_probe()
203 for (i = 0; i < controller->chip.ngpio; i += 8) in zevio_gpio_probe()
204 zevio_gpio_port_set(controller, i, ZEVIO_GPIO_INT_MASK, 0xFF); in zevio_gpio_probe()
206 dev_dbg(controller->chip.parent, "ZEVIO GPIO controller set up!\n"); in zevio_gpio_probe()
212 { .compatible = "lsi,zevio-gpio", },
218 .name = "gpio-zevio",