Lines Matching +full:mb86s70 +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/drivers/gpio/gpio-mb86s7x.c
18 #include <linux/gpio/driver.h>
23 #include "gpiolib-acpi.h"
42 static int mb86s70_gpio_request(struct gpio_chip *gc, unsigned gpio) in mb86s70_gpio_request() argument
48 spin_lock_irqsave(&gchip->lock, flags); in mb86s70_gpio_request()
50 val = readl(gchip->base + PFR(gpio)); in mb86s70_gpio_request()
51 val &= ~OFFSET(gpio); in mb86s70_gpio_request()
52 writel(val, gchip->base + PFR(gpio)); in mb86s70_gpio_request()
54 spin_unlock_irqrestore(&gchip->lock, flags); in mb86s70_gpio_request()
59 static void mb86s70_gpio_free(struct gpio_chip *gc, unsigned gpio) in mb86s70_gpio_free() argument
65 spin_lock_irqsave(&gchip->lock, flags); in mb86s70_gpio_free()
67 val = readl(gchip->base + PFR(gpio)); in mb86s70_gpio_free()
68 val |= OFFSET(gpio); in mb86s70_gpio_free()
69 writel(val, gchip->base + PFR(gpio)); in mb86s70_gpio_free()
71 spin_unlock_irqrestore(&gchip->lock, flags); in mb86s70_gpio_free()
74 static int mb86s70_gpio_direction_input(struct gpio_chip *gc, unsigned gpio) in mb86s70_gpio_direction_input() argument
80 spin_lock_irqsave(&gchip->lock, flags); in mb86s70_gpio_direction_input()
82 val = readl(gchip->base + DDR(gpio)); in mb86s70_gpio_direction_input()
83 val &= ~OFFSET(gpio); in mb86s70_gpio_direction_input()
84 writel(val, gchip->base + DDR(gpio)); in mb86s70_gpio_direction_input()
86 spin_unlock_irqrestore(&gchip->lock, flags); in mb86s70_gpio_direction_input()
92 unsigned gpio, int value) in mb86s70_gpio_direction_output() argument
98 spin_lock_irqsave(&gchip->lock, flags); in mb86s70_gpio_direction_output()
100 val = readl(gchip->base + PDR(gpio)); in mb86s70_gpio_direction_output()
102 val |= OFFSET(gpio); in mb86s70_gpio_direction_output()
104 val &= ~OFFSET(gpio); in mb86s70_gpio_direction_output()
105 writel(val, gchip->base + PDR(gpio)); in mb86s70_gpio_direction_output()
107 val = readl(gchip->base + DDR(gpio)); in mb86s70_gpio_direction_output()
108 val |= OFFSET(gpio); in mb86s70_gpio_direction_output()
109 writel(val, gchip->base + DDR(gpio)); in mb86s70_gpio_direction_output()
111 spin_unlock_irqrestore(&gchip->lock, flags); in mb86s70_gpio_direction_output()
116 static int mb86s70_gpio_get(struct gpio_chip *gc, unsigned gpio) in mb86s70_gpio_get() argument
120 return !!(readl(gchip->base + PDR(gpio)) & OFFSET(gpio)); in mb86s70_gpio_get()
123 static void mb86s70_gpio_set(struct gpio_chip *gc, unsigned gpio, int value) in mb86s70_gpio_set() argument
129 spin_lock_irqsave(&gchip->lock, flags); in mb86s70_gpio_set()
131 val = readl(gchip->base + PDR(gpio)); in mb86s70_gpio_set()
133 val |= OFFSET(gpio); in mb86s70_gpio_set()
135 val &= ~OFFSET(gpio); in mb86s70_gpio_set()
136 writel(val, gchip->base + PDR(gpio)); in mb86s70_gpio_set()
138 spin_unlock_irqrestore(&gchip->lock, flags); in mb86s70_gpio_set()
146 irq = platform_get_irq(to_platform_device(gc->parent), index); in mb86s70_gpio_to_irq()
151 if (irq_get_irq_data(irq)->hwirq == offset) in mb86s70_gpio_to_irq()
154 return -EINVAL; in mb86s70_gpio_to_irq()
162 gchip = devm_kzalloc(&pdev->dev, sizeof(*gchip), GFP_KERNEL); in mb86s70_gpio_probe()
164 return -ENOMEM; in mb86s70_gpio_probe()
168 gchip->base = devm_platform_ioremap_resource(pdev, 0); in mb86s70_gpio_probe()
169 if (IS_ERR(gchip->base)) in mb86s70_gpio_probe()
170 return PTR_ERR(gchip->base); in mb86s70_gpio_probe()
172 gchip->clk = devm_clk_get_optional(&pdev->dev, NULL); in mb86s70_gpio_probe()
173 if (IS_ERR(gchip->clk)) in mb86s70_gpio_probe()
174 return PTR_ERR(gchip->clk); in mb86s70_gpio_probe()
176 ret = clk_prepare_enable(gchip->clk); in mb86s70_gpio_probe()
180 spin_lock_init(&gchip->lock); in mb86s70_gpio_probe()
182 gchip->gc.direction_output = mb86s70_gpio_direction_output; in mb86s70_gpio_probe()
183 gchip->gc.direction_input = mb86s70_gpio_direction_input; in mb86s70_gpio_probe()
184 gchip->gc.request = mb86s70_gpio_request; in mb86s70_gpio_probe()
185 gchip->gc.free = mb86s70_gpio_free; in mb86s70_gpio_probe()
186 gchip->gc.get = mb86s70_gpio_get; in mb86s70_gpio_probe()
187 gchip->gc.set = mb86s70_gpio_set; in mb86s70_gpio_probe()
188 gchip->gc.to_irq = mb86s70_gpio_to_irq; in mb86s70_gpio_probe()
189 gchip->gc.label = dev_name(&pdev->dev); in mb86s70_gpio_probe()
190 gchip->gc.ngpio = 32; in mb86s70_gpio_probe()
191 gchip->gc.owner = THIS_MODULE; in mb86s70_gpio_probe()
192 gchip->gc.parent = &pdev->dev; in mb86s70_gpio_probe()
193 gchip->gc.base = -1; in mb86s70_gpio_probe()
195 ret = gpiochip_add_data(&gchip->gc, gchip); in mb86s70_gpio_probe()
197 dev_err(&pdev->dev, "couldn't register gpio driver\n"); in mb86s70_gpio_probe()
198 clk_disable_unprepare(gchip->clk); in mb86s70_gpio_probe()
202 acpi_gpiochip_request_interrupts(&gchip->gc); in mb86s70_gpio_probe()
211 acpi_gpiochip_free_interrupts(&gchip->gc); in mb86s70_gpio_remove()
212 gpiochip_remove(&gchip->gc); in mb86s70_gpio_remove()
213 clk_disable_unprepare(gchip->clk); in mb86s70_gpio_remove()
217 { .compatible = "fujitsu,mb86s70-gpio" },
232 .name = "mb86s70-gpio",
241 MODULE_DESCRIPTION("MB86S7x GPIO Driver");
242 MODULE_ALIAS("platform:mb86s70-gpio");