/* SPI connection. */ #define SPI_LEN_UNSELECT -1 /* Used to simulate CS. */ #define SPI_LEN_NODATA 0 /* Used to read data without writing. */ #define SPI_DATA_EMPTY (1 << 31) #define SPI_DATA_PENDING (1 << 30) static inline int xlx_spi_valid_data(uint32_t data) { return !(data & SPI_DATA_EMPTY); } static inline int xlx_spi_data_pending(uint32_t data) { return data & SPI_DATA_PENDING; } typedef uint32_t (*spi_push_fn)(void *opaque, uint32_t data, int len); struct xlx_spi_ch { void *slave[32]; spi_push_fn txrx[32]; }; struct xlx_spi_device { void * (*init) (void); spi_push_fn txrx; const char * device_name; }; static inline void xlx_spi_connect_slave(struct xlx_spi_ch *spich, int nr, void *slave, spi_push_fn f) { spich->slave[nr] = slave; spich->txrx[nr] = f; } static inline uint32_t xlx_spi_txrx(struct xlx_spi_ch *spich, int nr, uint32_t data, int len) { return spich->txrx[nr](spich->slave[nr], data, len); }