Lines Matching +full:gpio +full:- +full:sck
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * SPI host driver using generic bitbanged GPIO
8 #include <linux/gpio/consumer.h>
25 * platform_device->driver_data ... points to spi_gpio
27 * spi->controller_state ... reserved for bitbang framework code
29 * spi->controller->dev.driver_data ... points to spi_gpio->bitbang
34 struct gpio_desc *sck; member
40 /*----------------------------------------------------------------------*/
44 /*----------------------------------------------------------------------*/
52 bang = spi_controller_get_devdata(spi->controller); in spi_to_spi_gpio()
62 gpiod_set_value_cansleep(spi_gpio->sck, is_on); in setsck()
69 gpiod_set_value_cansleep(spi_gpio->mosi, is_on); in setmosi()
76 if (spi->mode & SPI_3WIRE) in getmiso()
77 return !!gpiod_get_value_cansleep(spi_gpio->mosi); in getmiso()
79 return !!gpiod_get_value_cansleep(spi_gpio->miso); in getmiso()
86 * we'll just assume we never need additional per-bit slowdowns.
90 #include "spi-bitbang-txrx.h"
93 * These functions can leverage inline expansion of GPIO calls to shrink
96 * even with default 8-bit words.
103 * even without inlined GPIO calls; __attribute__((hot)) on GCC 4.3?
109 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode0()
118 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode1()
127 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode2()
136 if (unlikely(spi->mode & SPI_LSB_FIRST)) in spi_gpio_txrx_word_mode3()
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()
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()
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()
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()
192 /*----------------------------------------------------------------------*/
200 gpiod_set_value_cansleep(spi_gpio->sck, spi->mode & SPI_CPOL); in spi_gpio_chipselect()
203 if (spi_gpio->cs_gpios) { 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()
215 gpiod_set_value_cansleep(spi_gpio->mosi, in spi_gpio_set_mosi_idle()
216 !!(spi->mode & SPI_MOSI_IDLE_HIGH)); in spi_gpio_set_mosi_idle()
229 if (spi_gpio->cs_gpios) { 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()
247 return gpiod_direction_output(spi_gpio->mosi, 1); in spi_gpio_set_direction()
253 * be left logic high if there is a pull-up. Transmitting in spi_gpio_set_direction()
257 if (spi->mode & SPI_3WIRE) { in spi_gpio_set_direction()
258 ret = gpiod_direction_input(spi_gpio->mosi); in spi_gpio_set_direction()
266 * nsec delay function for bit-banged GPIO is simply in spi_gpio_set_direction()
267 * {} because bit-banging just doesn't get fast enough in spi_gpio_set_direction()
270 if (spi->mode & SPI_3WIRE_HIZ) { in spi_gpio_set_direction()
271 gpiod_set_value_cansleep(spi_gpio->sck, in spi_gpio_set_direction()
272 !(spi->mode & SPI_CPOL)); in spi_gpio_set_direction()
273 gpiod_set_value_cansleep(spi_gpio->sck, in spi_gpio_set_direction()
274 !!(spi->mode & SPI_CPOL)); in spi_gpio_set_direction()
292 * drivers expect to see all-ones data as the no target "response".)
296 spi_gpio->mosi = devm_gpiod_get_optional(dev, "mosi", GPIOD_OUT_LOW); in spi_gpio_request()
297 if (IS_ERR(spi_gpio->mosi)) in spi_gpio_request()
298 return PTR_ERR(spi_gpio->mosi); in spi_gpio_request()
300 spi_gpio->miso = devm_gpiod_get_optional(dev, "miso", GPIOD_IN); in spi_gpio_request()
301 if (IS_ERR(spi_gpio->miso)) in spi_gpio_request()
302 return PTR_ERR(spi_gpio->miso); in spi_gpio_request()
304 spi_gpio->sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW); in spi_gpio_request()
305 return PTR_ERR_OR_ZERO(spi_gpio->sck); in spi_gpio_request()
311 struct device *dev = &pdev->dev; in spi_gpio_probe_pdata()
317 return -ENODEV; in spi_gpio_probe_pdata()
319 /* It's just one always-selected device, fine to continue */ in spi_gpio_probe_pdata()
320 if (!pdata->num_chipselect) in spi_gpio_probe_pdata()
323 host->num_chipselect = pdata->num_chipselect; in spi_gpio_probe_pdata()
324 spi_gpio->cs_gpios = devm_kcalloc(dev, host->num_chipselect, in spi_gpio_probe_pdata()
325 sizeof(*spi_gpio->cs_gpios), in spi_gpio_probe_pdata()
327 if (!spi_gpio->cs_gpios) in spi_gpio_probe_pdata()
328 return -ENOMEM; in spi_gpio_probe_pdata()
330 for (i = 0; i < host->num_chipselect; i++) { in spi_gpio_probe_pdata()
331 spi_gpio->cs_gpios[i] = devm_gpiod_get_index(dev, "cs", i, in spi_gpio_probe_pdata()
333 if (IS_ERR(spi_gpio->cs_gpios[i])) in spi_gpio_probe_pdata()
334 return PTR_ERR(spi_gpio->cs_gpios[i]); in spi_gpio_probe_pdata()
345 struct device *dev = &pdev->dev; in spi_gpio_probe()
351 return -ENOMEM; in spi_gpio_probe()
354 device_set_node(&host->dev, fwnode); in spi_gpio_probe()
355 host->use_gpio_descriptors = true; in spi_gpio_probe()
368 host->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); in spi_gpio_probe()
369 host->mode_bits = SPI_3WIRE | SPI_3WIRE_HIZ | SPI_CPHA | SPI_CPOL | in spi_gpio_probe()
372 if (!spi_gpio->mosi) { in spi_gpio_probe()
375 * No setting SPI_CONTROLLER_NO_RX here - if there is only in spi_gpio_probe()
379 host->flags = SPI_CONTROLLER_NO_TX; in spi_gpio_probe()
382 host->bus_num = pdev->id; in spi_gpio_probe()
383 host->setup = spi_gpio_setup; in spi_gpio_probe()
384 host->cleanup = spi_gpio_cleanup; in spi_gpio_probe()
386 bb = &spi_gpio->bitbang; in spi_gpio_probe()
387 bb->ctlr = host; in spi_gpio_probe()
389 * There is some additional business, apart from driving the CS GPIO in spi_gpio_probe()
393 host->flags |= SPI_CONTROLLER_GPIO_SS; in spi_gpio_probe()
394 bb->chipselect = spi_gpio_chipselect; in spi_gpio_probe()
395 bb->set_line_direction = spi_gpio_set_direction; in spi_gpio_probe()
396 bb->set_mosi_idle = spi_gpio_set_mosi_idle; in spi_gpio_probe()
398 if (host->flags & SPI_CONTROLLER_NO_TX) { in spi_gpio_probe()
399 bb->txrx_word[SPI_MODE_0] = spi_gpio_spec_txrx_word_mode0; in spi_gpio_probe()
400 bb->txrx_word[SPI_MODE_1] = spi_gpio_spec_txrx_word_mode1; in spi_gpio_probe()
401 bb->txrx_word[SPI_MODE_2] = spi_gpio_spec_txrx_word_mode2; in spi_gpio_probe()
402 bb->txrx_word[SPI_MODE_3] = spi_gpio_spec_txrx_word_mode3; in spi_gpio_probe()
404 bb->txrx_word[SPI_MODE_0] = spi_gpio_txrx_word_mode0; in spi_gpio_probe()
405 bb->txrx_word[SPI_MODE_1] = spi_gpio_txrx_word_mode1; in spi_gpio_probe()
406 bb->txrx_word[SPI_MODE_2] = spi_gpio_txrx_word_mode2; in spi_gpio_probe()
407 bb->txrx_word[SPI_MODE_3] = spi_gpio_txrx_word_mode3; in spi_gpio_probe()
409 bb->setup_transfer = spi_bitbang_setup_transfer; in spi_gpio_probe()
411 status = spi_bitbang_init(&spi_gpio->bitbang); in spi_gpio_probe()
415 return devm_spi_register_controller(&pdev->dev, host); in spi_gpio_probe()
419 { .compatible = "spi-gpio" },
433 MODULE_DESCRIPTION("SPI host driver using generic bitbanged GPIO ");