Lines Matching +full:spi +full:- +full:gpio
2 * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
18 #include <linux/gpio/consumer.h>
19 #include <linux/gpio/driver.h>
22 #include <linux/spi/spi.h>
27 * struct pisosr_gpio - GPIO driver data
28 * @chip: GPIO controller chip
29 * @spi: SPI device pointer
32 * @load_gpio: GPIO pin used to load input into device
37 struct spi_device *spi; member
44 static int pisosr_gpio_refresh(struct pisosr_gpio *gpio) in pisosr_gpio_refresh() argument
48 mutex_lock(&gpio->lock); in pisosr_gpio_refresh()
50 if (gpio->load_gpio) { in pisosr_gpio_refresh()
51 gpiod_set_value_cansleep(gpio->load_gpio, 1); in pisosr_gpio_refresh()
53 gpiod_set_value_cansleep(gpio->load_gpio, 0); in pisosr_gpio_refresh()
57 ret = spi_read(gpio->spi, gpio->buffer, gpio->buffer_size); in pisosr_gpio_refresh()
59 mutex_unlock(&gpio->lock); in pisosr_gpio_refresh()
82 return -EINVAL; in pisosr_gpio_direction_output()
87 struct pisosr_gpio *gpio = gpiochip_get_data(chip); in pisosr_gpio_get() local
90 pisosr_gpio_refresh(gpio); in pisosr_gpio_get()
92 return (gpio->buffer[offset / 8] >> (offset % 8)) & 0x1; in pisosr_gpio_get()
98 struct pisosr_gpio *gpio = gpiochip_get_data(chip); in pisosr_gpio_get_multiple() local
103 pisosr_gpio_refresh(gpio); in pisosr_gpio_get_multiple()
105 bitmap_zero(bits, chip->ngpio); in pisosr_gpio_get_multiple()
106 for_each_set_clump8(offset, gpio_mask, mask, chip->ngpio) { in pisosr_gpio_get_multiple()
107 buffer_state = gpio->buffer[offset / 8] & gpio_mask; in pisosr_gpio_get_multiple()
115 .label = "pisosr-gpio",
122 .base = -1,
127 static int pisosr_gpio_probe(struct spi_device *spi) in pisosr_gpio_probe() argument
129 struct device *dev = &spi->dev; in pisosr_gpio_probe()
130 struct pisosr_gpio *gpio; in pisosr_gpio_probe() local
133 gpio = devm_kzalloc(dev, sizeof(*gpio), GFP_KERNEL); in pisosr_gpio_probe()
134 if (!gpio) in pisosr_gpio_probe()
135 return -ENOMEM; in pisosr_gpio_probe()
137 spi_set_drvdata(spi, gpio); in pisosr_gpio_probe()
139 gpio->chip = template_chip; in pisosr_gpio_probe()
140 gpio->chip.parent = dev; in pisosr_gpio_probe()
141 of_property_read_u16(dev->of_node, "ngpios", &gpio->chip.ngpio); in pisosr_gpio_probe()
143 gpio->spi = spi; in pisosr_gpio_probe()
145 gpio->buffer_size = DIV_ROUND_UP(gpio->chip.ngpio, 8); in pisosr_gpio_probe()
146 gpio->buffer = devm_kzalloc(dev, gpio->buffer_size, GFP_KERNEL); in pisosr_gpio_probe()
147 if (!gpio->buffer) in pisosr_gpio_probe()
148 return -ENOMEM; in pisosr_gpio_probe()
150 gpio->load_gpio = devm_gpiod_get_optional(dev, "load", GPIOD_OUT_LOW); in pisosr_gpio_probe()
151 if (IS_ERR(gpio->load_gpio)) in pisosr_gpio_probe()
152 return dev_err_probe(dev, PTR_ERR(gpio->load_gpio), in pisosr_gpio_probe()
153 "Unable to allocate load GPIO\n"); in pisosr_gpio_probe()
155 mutex_init(&gpio->lock); in pisosr_gpio_probe()
157 ret = gpiochip_add_data(&gpio->chip, gpio); in pisosr_gpio_probe()
166 static int pisosr_gpio_remove(struct spi_device *spi) in pisosr_gpio_remove() argument
168 struct pisosr_gpio *gpio = spi_get_drvdata(spi); in pisosr_gpio_remove() local
170 gpiochip_remove(&gpio->chip); in pisosr_gpio_remove()
172 mutex_destroy(&gpio->lock); in pisosr_gpio_remove()
178 { "pisosr-gpio", },
181 MODULE_DEVICE_TABLE(spi, pisosr_gpio_id_table);
184 { .compatible = "pisosr-gpio", },
191 .name = "pisosr-gpio",
201 MODULE_DESCRIPTION("SPI Compatible PISO Shift Register GPIO Driver");