spi_gpio
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
gpiod_set_value_cansleep(spi_gpio->sck, spi->mode & SPI_CPOL);
if (spi_gpio->cs_gpios) {
struct gpio_desc *cs = spi_gpio->cs_gpios[spi_get_chipselect(spi, 0)];
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
gpiod_set_value_cansleep(spi_gpio->mosi,
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
if (spi_gpio->cs_gpios) {
cs = spi_gpio->cs_gpios[spi_get_chipselect(spi, 0)];
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
return gpiod_direction_output(spi_gpio->mosi, 1);
ret = gpiod_direction_input(spi_gpio->mosi);
gpiod_set_value_cansleep(spi_gpio->sck,
gpiod_set_value_cansleep(spi_gpio->sck,
static int spi_gpio_request(struct device *dev, struct spi_gpio *spi_gpio)
spi_gpio->mosi = devm_gpiod_get_optional(dev, "mosi", GPIOD_OUT_LOW);
if (IS_ERR(spi_gpio->mosi))
return PTR_ERR(spi_gpio->mosi);
spi_gpio->miso = devm_gpiod_get_optional(dev, "miso", GPIOD_IN);
if (IS_ERR(spi_gpio->miso))
return PTR_ERR(spi_gpio->miso);
spi_gpio->sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW);
return PTR_ERR_OR_ZERO(spi_gpio->sck);
struct spi_gpio *spi_gpio = spi_controller_get_devdata(host);
spi_gpio->cs_gpios = devm_kcalloc(dev, host->num_chipselect,
sizeof(*spi_gpio->cs_gpios),
if (!spi_gpio->cs_gpios)
spi_gpio->cs_gpios[i] = devm_gpiod_get_index(dev, "cs", i,
if (IS_ERR(spi_gpio->cs_gpios[i]))
return PTR_ERR(spi_gpio->cs_gpios[i]);
struct spi_gpio *spi_gpio;
host = devm_spi_alloc_host(dev, sizeof(*spi_gpio));
spi_gpio = spi_controller_get_devdata(host);
status = spi_gpio_request(dev, spi_gpio);
if (!spi_gpio->mosi) {
bb = &spi_gpio->bitbang;
status = spi_bitbang_init(&spi_gpio->bitbang);
static inline struct spi_gpio *__pure
struct spi_gpio *spi_gpio;
spi_gpio = container_of(bang, struct spi_gpio, bitbang);
return spi_gpio;
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
gpiod_set_value_cansleep(spi_gpio->sck, is_on);
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
gpiod_set_value_cansleep(spi_gpio->mosi, is_on);
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
return !!gpiod_get_value_cansleep(spi_gpio->mosi);
return !!gpiod_get_value_cansleep(spi_gpio->miso);