Lines Matching full:spi
3 * SPI host driver using generic bitbanged GPIO
15 #include <linux/spi/spi.h>
16 #include <linux/spi/spi_bitbang.h>
17 #include <linux/spi/spi_gpio.h>
20 * This bitbanging SPI host driver should help make systems usable
21 * when a native hardware SPI engine is not available, perhaps because
27 * spi->controller_state ... reserved for bitbang framework code
29 * spi->controller->dev.driver_data ... points to spi_gpio->bitbang
47 spi_to_spi_gpio(const struct spi_device *spi) in spi_to_spi_gpio() argument
52 bang = spi_controller_get_devdata(spi->controller); in spi_to_spi_gpio()
58 static inline void setsck(const struct spi_device *spi, int is_on) in setsck() argument
60 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in setsck()
65 static inline void setmosi(const struct spi_device *spi, int is_on) in setmosi() argument
67 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in setmosi()
72 static inline int getmiso(const struct spi_device *spi) in getmiso() argument
74 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in getmiso()
76 if (spi->mode & SPI_3WIRE) in getmiso()
90 #include "spi-bitbang-txrx.h"
106 static u32 spi_gpio_txrx_word_mode0(struct spi_device *spi, in spi_gpio_txrx_word_mode0() argument
109 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode0()
110 return bitbang_txrx_le_cpha0(spi, nsecs, 0, flags, word, bits); in spi_gpio_txrx_word_mode0()
112 return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); in spi_gpio_txrx_word_mode0()
115 static u32 spi_gpio_txrx_word_mode1(struct spi_device *spi, in spi_gpio_txrx_word_mode1() argument
118 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode1()
119 return bitbang_txrx_le_cpha1(spi, nsecs, 0, flags, word, bits); in spi_gpio_txrx_word_mode1()
121 return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); in spi_gpio_txrx_word_mode1()
124 static u32 spi_gpio_txrx_word_mode2(struct spi_device *spi, in spi_gpio_txrx_word_mode2() argument
127 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode2()
128 return bitbang_txrx_le_cpha0(spi, nsecs, 1, flags, word, bits); in spi_gpio_txrx_word_mode2()
130 return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); in spi_gpio_txrx_word_mode2()
133 static u32 spi_gpio_txrx_word_mode3(struct spi_device *spi, in spi_gpio_txrx_word_mode3() argument
136 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode3()
137 return bitbang_txrx_le_cpha1(spi, nsecs, 1, flags, word, bits); in spi_gpio_txrx_word_mode3()
139 return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); in spi_gpio_txrx_word_mode3()
152 static u32 spi_gpio_spec_txrx_word_mode0(struct spi_device *spi, in spi_gpio_spec_txrx_word_mode0() argument
155 flags = spi->controller->flags; in spi_gpio_spec_txrx_word_mode0()
156 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_spec_txrx_word_mode0()
157 return bitbang_txrx_le_cpha0(spi, nsecs, 0, flags, word, bits); in spi_gpio_spec_txrx_word_mode0()
159 return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); in spi_gpio_spec_txrx_word_mode0()
162 static u32 spi_gpio_spec_txrx_word_mode1(struct spi_device *spi, in spi_gpio_spec_txrx_word_mode1() argument
165 flags = spi->controller->flags; in spi_gpio_spec_txrx_word_mode1()
166 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_spec_txrx_word_mode1()
167 return bitbang_txrx_le_cpha1(spi, nsecs, 0, flags, word, bits); in spi_gpio_spec_txrx_word_mode1()
169 return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); in spi_gpio_spec_txrx_word_mode1()
172 static u32 spi_gpio_spec_txrx_word_mode2(struct spi_device *spi, in spi_gpio_spec_txrx_word_mode2() argument
175 flags = spi->controller->flags; in spi_gpio_spec_txrx_word_mode2()
176 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_spec_txrx_word_mode2()
177 return bitbang_txrx_le_cpha0(spi, nsecs, 1, flags, word, bits); in spi_gpio_spec_txrx_word_mode2()
179 return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); in spi_gpio_spec_txrx_word_mode2()
182 static u32 spi_gpio_spec_txrx_word_mode3(struct spi_device *spi, in spi_gpio_spec_txrx_word_mode3() argument
185 flags = spi->controller->flags; in spi_gpio_spec_txrx_word_mode3()
186 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_spec_txrx_word_mode3()
187 return bitbang_txrx_le_cpha1(spi, nsecs, 1, flags, word, bits); in spi_gpio_spec_txrx_word_mode3()
189 return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); in spi_gpio_spec_txrx_word_mode3()
194 static void spi_gpio_chipselect(struct spi_device *spi, int is_active) in spi_gpio_chipselect() argument
196 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in spi_gpio_chipselect()
200 gpiod_set_value_cansleep(spi_gpio->sck, spi->mode & SPI_CPOL); in spi_gpio_chipselect()
204 struct gpio_desc *cs = spi_gpio->cs_gpios[spi_get_chipselect(spi, 0)]; in spi_gpio_chipselect()
206 /* SPI chip selects are normally active-low */ in spi_gpio_chipselect()
207 gpiod_set_value_cansleep(cs, (spi->mode & SPI_CS_HIGH) ? is_active : !is_active); in spi_gpio_chipselect()
211 static void spi_gpio_set_mosi_idle(struct spi_device *spi) in spi_gpio_set_mosi_idle() argument
213 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in spi_gpio_set_mosi_idle()
216 !!(spi->mode & SPI_MOSI_IDLE_HIGH)); in spi_gpio_set_mosi_idle()
219 static int spi_gpio_setup(struct spi_device *spi) in spi_gpio_setup() argument
222 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in spi_gpio_setup()
230 cs = spi_gpio->cs_gpios[spi_get_chipselect(spi, 0)]; in spi_gpio_setup()
231 if (!spi->controller_state && cs) { in spi_gpio_setup()
232 ret = gpiod_direction_output(cs, !(spi->mode & SPI_CS_HIGH)); in spi_gpio_setup()
238 return spi_bitbang_setup(spi); in spi_gpio_setup()
241 static int spi_gpio_set_direction(struct spi_device *spi, bool output) in spi_gpio_set_direction() argument
243 struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); in spi_gpio_set_direction()
255 * SPI devices in to a bad state. in spi_gpio_set_direction()
257 if (spi->mode & SPI_3WIRE) { in spi_gpio_set_direction()
270 if (spi->mode & SPI_3WIRE_HIZ) { in spi_gpio_set_direction()
272 !(spi->mode & SPI_CPOL)); in spi_gpio_set_direction()
274 !!(spi->mode & SPI_CPOL)); in spi_gpio_set_direction()
279 static void spi_gpio_cleanup(struct spi_device *spi) in spi_gpio_cleanup() argument
281 spi_bitbang_cleanup(spi); in spi_gpio_cleanup()
286 * functions associated with a "native" SPI controller if a driver for that
419 { .compatible = "spi-gpio" },
433 MODULE_DESCRIPTION("SPI host driver using generic bitbanged GPIO ");