123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659 |
- #ifndef _SPI_H_
- #define _SPI_H_
- #define SPI_CPHA BIT(0)
- #define SPI_CPOL BIT(1)
- #define SPI_MODE_0 (0|0)
- #define SPI_MODE_1 (0|SPI_CPHA)
- #define SPI_MODE_2 (SPI_CPOL|0)
- #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
- #define SPI_CS_HIGH BIT(2)
- #define SPI_LSB_FIRST BIT(3)
- #define SPI_3WIRE BIT(4)
- #define SPI_LOOP BIT(5)
- #define SPI_SLAVE BIT(6)
- #define SPI_PREAMBLE BIT(7)
- #define SPI_TX_BYTE BIT(8)
- #define SPI_TX_DUAL BIT(9)
- #define SPI_TX_QUAD BIT(10)
- #define SPI_RX_SLOW BIT(11)
- #define SPI_RX_DUAL BIT(12)
- #define SPI_RX_QUAD BIT(13)
- #define SPI_PREAMBLE_END_BYTE 0xec
- #define SPI_DEFAULT_WORDLEN 8
- #ifdef CONFIG_DM_SPI
- struct dm_spi_bus {
- uint max_hz;
- };
- struct dm_spi_slave_platdata {
- unsigned int cs;
- uint max_hz;
- uint mode;
- };
- #endif
- struct spi_slave {
- #ifdef CONFIG_DM_SPI
- struct udevice *dev;
- uint max_hz;
- uint speed;
- #else
- unsigned int bus;
- unsigned int cs;
- #endif
- uint mode;
- unsigned int wordlen;
- unsigned int max_write_size;
- void *memory_map;
- u8 option;
- u8 flags;
- #define SPI_XFER_BEGIN BIT(0)
- #define SPI_XFER_END BIT(1)
- #define SPI_XFER_ONCE (SPI_XFER_BEGIN | SPI_XFER_END)
- #define SPI_XFER_MMAP BIT(2)
- #define SPI_XFER_MMAP_END BIT(3)
- };
- void spi_init(void);
- void *spi_do_alloc_slave(int offset, int size, unsigned int bus,
- unsigned int cs);
- #define spi_alloc_slave(_struct, bus, cs) \
- spi_do_alloc_slave(offsetof(_struct, slave), \
- sizeof(_struct), bus, cs)
- #define spi_alloc_slave_base(bus, cs) \
- spi_do_alloc_slave(0, sizeof(struct spi_slave), bus, cs)
- struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
- unsigned int max_hz, unsigned int mode);
- void spi_free_slave(struct spi_slave *slave);
- int spi_claim_bus(struct spi_slave *slave);
- void spi_release_bus(struct spi_slave *slave);
- int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen);
- int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
- void *din, unsigned long flags);
- void spi_flash_copy_mmap(void *data, void *offset, size_t len);
- int spi_cs_is_valid(unsigned int bus, unsigned int cs);
- #ifndef CONFIG_DM_SPI
- void spi_cs_activate(struct spi_slave *slave);
- void spi_cs_deactivate(struct spi_slave *slave);
- void spi_set_speed(struct spi_slave *slave, uint hz);
- #endif
- static inline int spi_w8r8(struct spi_slave *slave, unsigned char byte)
- {
- unsigned char dout[2];
- unsigned char din[2];
- int ret;
- dout[0] = byte;
- dout[1] = 0;
- ret = spi_xfer(slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);
- return ret < 0 ? ret : din[1];
- }
- struct spi_slave *spi_setup_slave_fdt(const void *blob, int slave_node,
- int spi_node);
- struct spi_slave *spi_base_setup_slave_fdt(const void *blob, int busnum,
- int node);
- #ifdef CONFIG_DM_SPI
- struct spi_cs_info {
- struct udevice *dev;
- };
- struct dm_spi_ops {
-
- int (*claim_bus)(struct udevice *dev);
-
- int (*release_bus)(struct udevice *dev);
-
- int (*set_wordlen)(struct udevice *dev, unsigned int wordlen);
-
- int (*xfer)(struct udevice *dev, unsigned int bitlen, const void *dout,
- void *din, unsigned long flags);
-
- int (*set_speed)(struct udevice *bus, uint hz);
-
- int (*set_mode)(struct udevice *bus, uint mode);
-
- int (*cs_info)(struct udevice *bus, uint cs, struct spi_cs_info *info);
- };
- struct dm_spi_emul_ops {
-
- int (*xfer)(struct udevice *slave, unsigned int bitlen,
- const void *dout, void *din, unsigned long flags);
- };
- int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
- struct udevice **devp);
- int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
- const char *drv_name, const char *dev_name,
- struct udevice **busp, struct spi_slave **devp);
- int spi_chip_select(struct udevice *slave);
- int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp);
- int spi_slave_ofdata_to_platdata(const void *blob, int node,
- struct dm_spi_slave_platdata *plat);
- int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info);
- struct sandbox_state;
- int sandbox_spi_get_emul(struct sandbox_state *state,
- struct udevice *bus, struct udevice *slave,
- struct udevice **emulp);
- int dm_spi_claim_bus(struct udevice *dev);
- void dm_spi_release_bus(struct udevice *dev);
- int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
- const void *dout, void *din, unsigned long flags);
- #define spi_get_ops(dev) ((struct dm_spi_ops *)(dev)->driver->ops)
- #define spi_emul_get_ops(dev) ((struct dm_spi_emul_ops *)(dev)->driver->ops)
- #endif
- #endif
|