Lines Matching +full:spi +full:- +full:gpio
2 * 74Hx164 - Generic serial-in/parallel-out 8-bits shift register GPIO driver
14 #include <linux/spi/spi.h>
15 #include <linux/spi/74x164.h>
16 #include <linux/gpio.h>
21 struct spi_device *spi; member
34 return spi_write(chip->spi, in __gen_74x164_write_config()
35 &chip->port_config, sizeof(chip->port_config)); in __gen_74x164_write_config()
43 mutex_lock(&chip->lock); in gen_74x164_get_value()
44 ret = (chip->port_config >> offset) & 0x1; in gen_74x164_get_value()
45 mutex_unlock(&chip->lock); in gen_74x164_get_value()
55 mutex_lock(&chip->lock); in gen_74x164_set_value()
57 chip->port_config |= (1 << offset); in gen_74x164_set_value()
59 chip->port_config &= ~(1 << offset); in gen_74x164_set_value()
62 mutex_unlock(&chip->lock); in gen_74x164_set_value()
72 static int __devinit gen_74x164_probe(struct spi_device *spi) in gen_74x164_probe() argument
78 pdata = spi->dev.platform_data; in gen_74x164_probe()
79 if (!pdata || !pdata->base) { in gen_74x164_probe()
80 dev_dbg(&spi->dev, "incorrect or missing platform data\n"); in gen_74x164_probe()
81 return -EINVAL; in gen_74x164_probe()
87 spi->bits_per_word = 8; in gen_74x164_probe()
89 ret = spi_setup(spi); in gen_74x164_probe()
95 return -ENOMEM; in gen_74x164_probe()
97 mutex_init(&chip->lock); in gen_74x164_probe()
99 dev_set_drvdata(&spi->dev, chip); in gen_74x164_probe()
101 chip->spi = spi; in gen_74x164_probe()
103 chip->gpio_chip.label = spi->modalias; in gen_74x164_probe()
104 chip->gpio_chip.direction_output = gen_74x164_direction_output; in gen_74x164_probe()
105 chip->gpio_chip.get = gen_74x164_get_value; in gen_74x164_probe()
106 chip->gpio_chip.set = gen_74x164_set_value; in gen_74x164_probe()
107 chip->gpio_chip.base = pdata->base; in gen_74x164_probe()
108 chip->gpio_chip.ngpio = 8; in gen_74x164_probe()
109 chip->gpio_chip.can_sleep = 1; in gen_74x164_probe()
110 chip->gpio_chip.dev = &spi->dev; in gen_74x164_probe()
111 chip->gpio_chip.owner = THIS_MODULE; in gen_74x164_probe()
115 dev_err(&spi->dev, "Failed writing: %d\n", ret); in gen_74x164_probe()
119 ret = gpiochip_add(&chip->gpio_chip); in gen_74x164_probe()
126 dev_set_drvdata(&spi->dev, NULL); in gen_74x164_probe()
127 mutex_destroy(&chip->lock); in gen_74x164_probe()
132 static int __devexit gen_74x164_remove(struct spi_device *spi) in gen_74x164_remove() argument
137 chip = dev_get_drvdata(&spi->dev); in gen_74x164_remove()
139 return -ENODEV; in gen_74x164_remove()
141 dev_set_drvdata(&spi->dev, NULL); in gen_74x164_remove()
143 ret = gpiochip_remove(&chip->gpio_chip); in gen_74x164_remove()
145 mutex_destroy(&chip->lock); in gen_74x164_remove()
148 dev_err(&spi->dev, "Failed to remove the GPIO controller: %d\n", in gen_74x164_remove()
177 MODULE_DESCRIPTION("GPIO expander driver for 74X164 8-bits shift register");