@ -26,8 +26,12 @@ struct soft_spi_platdata {
struct gpio_desc mosi ;
struct gpio_desc miso ;
int spi_delay_us ;
int flags ;
} ;
# define SPI_MASTER_NO_RX BIT(0)
# define SPI_MASTER_NO_TX BIT(1)
struct soft_spi_priv {
unsigned int mode ;
} ;
@ -139,14 +143,16 @@ static int soft_spi_xfer(struct udevice *dev, unsigned int bitlen,
if ( ! cpha )
soft_spi_scl ( dev , 0 ) ;
soft_spi_sda ( dev , ! ! ( tmpdout & 0x80 ) ) ;
if ( ( plat - > flags & SPI_MASTER_NO_TX ) = = 0 )
soft_spi_sda ( dev , ! ! ( tmpdout & 0x80 ) ) ;
udelay ( plat - > spi_delay_us ) ;
if ( cpha )
soft_spi_scl ( dev , 0 ) ;
else
soft_spi_scl ( dev , 1 ) ;
tmpdin < < = 1 ;
tmpdin | = dm_gpio_get_value ( & plat - > miso ) ;
if ( ( plat - > flags & SPI_MASTER_NO_RX ) = = 0 )
tmpdin | = dm_gpio_get_value ( & plat - > miso ) ;
tmpdout < < = 1 ;
udelay ( plat - > spi_delay_us ) ;
if ( cpha )
@ -208,24 +214,36 @@ static int soft_spi_probe(struct udevice *dev)
struct spi_slave * slave = dev_get_parent_priv ( dev ) ;
struct soft_spi_platdata * plat = dev - > platdata ;
int cs_flags , clk_flags ;
int ret ;
cs_flags = ( slave - > mode & SPI_CS_HIGH ) ? 0 : GPIOD_ACTIVE_LOW ;
clk_flags = ( slave - > mode & SPI_CPOL ) ? GPIOD_ACTIVE_LOW : 0 ;
if ( gpio_request_by_name ( dev , " cs-gpio " , 0 , & plat - > cs ,
if ( gpio_request_by_name ( dev , " cs-gpios " , 0 , & plat - > cs ,
GPIOD_IS_OUT | cs_flags ) | |
gpio_request_by_name ( dev , " sclk-gpio " , 0 , & plat - > sclk ,
GPIOD_IS_OUT | clk_flags ) | |
gpio_request_by_name ( dev , " mosi-gpio " , 0 , & plat - > mosi ,
GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE ) | |
gpio_request_by_name ( dev , " miso-gpio " , 0 , & plat - > miso ,
GPIOD_IS_IN ) )
gpio_request_by_name ( dev , " gpio-sck " , 0 , & plat - > sclk ,
GPIOD_IS_OUT | clk_flags ) )
return - EINVAL ;
ret = gpio_request_by_name ( dev , " gpio-mosi " , 0 , & plat - > mosi ,
GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE ) ;
if ( ret )
plat - > flags | = SPI_MASTER_NO_TX ;
ret = gpio_request_by_name ( dev , " gpio-miso " , 0 , & plat - > miso ,
GPIOD_IS_IN ) ;
if ( ret )
plat - > flags | = SPI_MASTER_NO_RX ;
if ( ( plat - > flags & ( SPI_MASTER_NO_RX | SPI_MASTER_NO_TX ) ) = =
( SPI_MASTER_NO_RX | SPI_MASTER_NO_TX ) )
return - EINVAL ;
return 0 ;
}
static const struct udevice_id soft_spi_ids [ ] = {
{ . compatible = " u-boot,soft-spi " } ,
{ . compatible = " spi-gpio " } ,
{ }
} ;