mirror of https://gitee.com/openkylin/linux.git
Merge branch 'topic/3wire-gpio' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-4.21 mode conflict
This commit is contained in:
commit
ae218f7847
|
@ -256,11 +256,29 @@ static int spi_gpio_setup(struct spi_device *spi)
|
||||||
static int spi_gpio_set_direction(struct spi_device *spi, bool output)
|
static int spi_gpio_set_direction(struct spi_device *spi, bool output)
|
||||||
{
|
{
|
||||||
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
|
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (output)
|
if (output)
|
||||||
return gpiod_direction_output(spi_gpio->mosi, 1);
|
return gpiod_direction_output(spi_gpio->mosi, 1);
|
||||||
else
|
|
||||||
return gpiod_direction_input(spi_gpio->mosi);
|
ret = gpiod_direction_input(spi_gpio->mosi);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
/*
|
||||||
|
* Send a turnaround high impedance cycle when switching
|
||||||
|
* from output to input. Theoretically there should be
|
||||||
|
* a clock delay here, but as has been noted above, the
|
||||||
|
* nsec delay function for bit-banged GPIO is simply
|
||||||
|
* {} because bit-banging just doesn't get fast enough
|
||||||
|
* anyway.
|
||||||
|
*/
|
||||||
|
if (spi->mode & SPI_3WIRE_HIZ) {
|
||||||
|
gpiod_set_value_cansleep(spi_gpio->sck,
|
||||||
|
!(spi->mode & SPI_CPOL));
|
||||||
|
gpiod_set_value_cansleep(spi_gpio->sck,
|
||||||
|
!!(spi->mode & SPI_CPOL));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spi_gpio_cleanup(struct spi_device *spi)
|
static void spi_gpio_cleanup(struct spi_device *spi)
|
||||||
|
@ -410,7 +428,7 @@ static int spi_gpio_probe(struct platform_device *pdev)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
|
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
|
||||||
master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL;
|
master->mode_bits = SPI_3WIRE | SPI_3WIRE_HIZ | SPI_CPHA | SPI_CPOL;
|
||||||
master->flags = master_flags;
|
master->flags = master_flags;
|
||||||
master->bus_num = pdev->id;
|
master->bus_num = pdev->id;
|
||||||
/* The master needs to think there is a chipselect even if not connected */
|
/* The master needs to think there is a chipselect even if not connected */
|
||||||
|
|
|
@ -157,6 +157,7 @@ struct spi_device {
|
||||||
#define SPI_CS_WORD 0x1000 /* toggle cs after each word */
|
#define SPI_CS_WORD 0x1000 /* toggle cs after each word */
|
||||||
#define SPI_TX_OCTAL 0x2000 /* transmit with 8 wires */
|
#define SPI_TX_OCTAL 0x2000 /* transmit with 8 wires */
|
||||||
#define SPI_RX_OCTAL 0x4000 /* receive with 8 wires */
|
#define SPI_RX_OCTAL 0x4000 /* receive with 8 wires */
|
||||||
|
#define SPI_3WIRE_HIZ 0x8000 /* high impedance turnaround */
|
||||||
int irq;
|
int irq;
|
||||||
void *controller_state;
|
void *controller_state;
|
||||||
void *controller_data;
|
void *controller_data;
|
||||||
|
|
Loading…
Reference in New Issue