Lines Matching +full:gpio +full:- +full:1
3 * GPIO driver
6 * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de>
11 #include <linux/gpio/driver.h>
22 static int bcma_gpio_get_value(struct gpio_chip *chip, unsigned gpio) in bcma_gpio_get_value() argument
26 return !!bcma_chipco_gpio_in(cc, 1 << gpio); in bcma_gpio_get_value()
29 static int bcma_gpio_set_value(struct gpio_chip *chip, unsigned int gpio, in bcma_gpio_set_value() argument
34 bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); in bcma_gpio_set_value()
39 static int bcma_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) in bcma_gpio_direction_input() argument
43 bcma_chipco_gpio_outen(cc, 1 << gpio, 0); in bcma_gpio_direction_input()
47 static int bcma_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, in bcma_gpio_direction_output() argument
52 bcma_chipco_gpio_outen(cc, 1 << gpio, 1 << gpio); in bcma_gpio_direction_output()
53 bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); in bcma_gpio_direction_output()
57 static int bcma_gpio_request(struct gpio_chip *chip, unsigned gpio) in bcma_gpio_request() argument
61 bcma_chipco_gpio_control(cc, 1 << gpio, 0); in bcma_gpio_request()
63 bcma_chipco_gpio_pulldown(cc, 1 << gpio, 0); in bcma_gpio_request()
65 bcma_chipco_gpio_pullup(cc, 1 << gpio, 1 << gpio); in bcma_gpio_request()
70 static void bcma_gpio_free(struct gpio_chip *chip, unsigned gpio) in bcma_gpio_free() argument
75 bcma_chipco_gpio_pullup(cc, 1 << gpio, 0); in bcma_gpio_free()
84 int gpio = irqd_to_hwirq(d); in bcma_gpio_irq_unmask() local
85 u32 val = bcma_chipco_gpio_in(cc, BIT(gpio)); in bcma_gpio_irq_unmask()
87 gpiochip_enable_irq(gc, gpio); in bcma_gpio_irq_unmask()
88 bcma_chipco_gpio_polarity(cc, BIT(gpio), val); in bcma_gpio_irq_unmask()
89 bcma_chipco_gpio_intmask(cc, BIT(gpio), BIT(gpio)); in bcma_gpio_irq_unmask()
96 int gpio = irqd_to_hwirq(d); in bcma_gpio_irq_mask() local
98 bcma_chipco_gpio_intmask(cc, BIT(gpio), 0); in bcma_gpio_irq_mask()
99 gpiochip_disable_irq(gc, gpio); in bcma_gpio_irq_mask()
103 .name = "BCMA-GPIO",
113 struct gpio_chip *gc = &cc->gpio; in bcma_gpio_irq_handler()
118 int gpio; in bcma_gpio_irq_handler() local
123 for_each_set_bit(gpio, &irqs, gc->ngpio) in bcma_gpio_irq_handler()
124 generic_handle_domain_irq_safe(gc->irq.domain, gpio); in bcma_gpio_irq_handler()
132 struct gpio_chip *chip = &cc->gpio; in bcma_gpio_irq_init()
133 struct gpio_irq_chip *girq = &chip->irq; in bcma_gpio_irq_init()
136 if (cc->core->bus->hosttype != BCMA_HOSTTYPE_SOC) in bcma_gpio_irq_init()
139 hwirq = bcma_core_irq(cc->core, 0); in bcma_gpio_irq_init()
140 err = request_irq(hwirq, bcma_gpio_irq_handler, IRQF_SHARED, "gpio", in bcma_gpio_irq_init()
150 girq->parent_handler = NULL; in bcma_gpio_irq_init()
151 girq->num_parents = 0; in bcma_gpio_irq_init()
152 girq->parents = NULL; in bcma_gpio_irq_init()
153 girq->default_type = IRQ_TYPE_NONE; in bcma_gpio_irq_init()
154 girq->handler = handle_simple_irq; in bcma_gpio_irq_init()
161 if (cc->core->bus->hosttype != BCMA_HOSTTYPE_SOC) in bcma_gpio_irq_exit()
165 free_irq(bcma_core_irq(cc->core, 0), cc); in bcma_gpio_irq_exit()
180 struct bcma_bus *bus = cc->core->bus; in bcma_gpio_init()
181 struct gpio_chip *chip = &cc->gpio; in bcma_gpio_init()
184 chip->label = "bcma_gpio"; in bcma_gpio_init()
185 chip->owner = THIS_MODULE; in bcma_gpio_init()
186 chip->request = bcma_gpio_request; in bcma_gpio_init()
187 chip->free = bcma_gpio_free; in bcma_gpio_init()
188 chip->get = bcma_gpio_get_value; in bcma_gpio_init()
189 chip->set = bcma_gpio_set_value; in bcma_gpio_init()
190 chip->direction_input = bcma_gpio_direction_input; in bcma_gpio_init()
191 chip->direction_output = bcma_gpio_direction_output; in bcma_gpio_init()
192 chip->parent = bus->dev; in bcma_gpio_init()
193 chip->fwnode = dev_fwnode(&cc->core->dev); in bcma_gpio_init()
195 switch (bus->chipinfo.id) { in bcma_gpio_init()
201 chip->ngpio = 32; in bcma_gpio_init()
204 chip->ngpio = 16; in bcma_gpio_init()
208 * Register SoC GPIO devices with absolute GPIO pin base. in bcma_gpio_init()
210 * GPIO numbers. in bcma_gpio_init()
211 * On some ARM devices, user space may want to access some system GPIO in bcma_gpio_init()
212 * pins directly, which is easier to do with a predictable GPIO base. in bcma_gpio_init()
215 cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC) in bcma_gpio_init()
216 chip->base = bus->num * BCMA_GPIO_MAX_PINS; in bcma_gpio_init()
218 chip->base = -1; in bcma_gpio_init()
236 gpiochip_remove(&cc->gpio); in bcma_gpio_unregister()