1*05e6a563SLionel Debieve /* 2*05e6a563SLionel Debieve * Copyright (c) 2019, STMicroelectronics - All Rights Reserved 3*05e6a563SLionel Debieve * 4*05e6a563SLionel Debieve * SPDX-License-Identifier: BSD-3-Clause 5*05e6a563SLionel Debieve */ 6*05e6a563SLionel Debieve 7*05e6a563SLionel Debieve #ifndef DRIVERS_SPI_MEM_H 8*05e6a563SLionel Debieve #define DRIVERS_SPI_MEM_H 9*05e6a563SLionel Debieve 10*05e6a563SLionel Debieve #include <errno.h> 11*05e6a563SLionel Debieve #include <stdbool.h> 12*05e6a563SLionel Debieve #include <stdint.h> 13*05e6a563SLionel Debieve 14*05e6a563SLionel Debieve #define SPI_MEM_BUSWIDTH_1_LINE 1U 15*05e6a563SLionel Debieve #define SPI_MEM_BUSWIDTH_2_LINE 2U 16*05e6a563SLionel Debieve #define SPI_MEM_BUSWIDTH_4_LINE 4U 17*05e6a563SLionel Debieve 18*05e6a563SLionel Debieve /* 19*05e6a563SLionel Debieve * enum spi_mem_data_dir - Describes the direction of a SPI memory data 20*05e6a563SLionel Debieve * transfer from the controller perspective. 21*05e6a563SLionel Debieve * @SPI_MEM_DATA_IN: data coming from the SPI memory. 22*05e6a563SLionel Debieve * @SPI_MEM_DATA_OUT: data sent to the SPI memory. 23*05e6a563SLionel Debieve */ 24*05e6a563SLionel Debieve enum spi_mem_data_dir { 25*05e6a563SLionel Debieve SPI_MEM_DATA_IN, 26*05e6a563SLionel Debieve SPI_MEM_DATA_OUT, 27*05e6a563SLionel Debieve }; 28*05e6a563SLionel Debieve 29*05e6a563SLionel Debieve /* 30*05e6a563SLionel Debieve * struct spi_mem_op - Describes a SPI memory operation. 31*05e6a563SLionel Debieve * 32*05e6a563SLionel Debieve * @cmd.buswidth: Number of IO lines used to transmit the command. 33*05e6a563SLionel Debieve * @cmd.opcode: Operation opcode. 34*05e6a563SLionel Debieve * @addr.nbytes: Number of address bytes to send. Can be zero if the operation 35*05e6a563SLionel Debieve * does not need to send an address. 36*05e6a563SLionel Debieve * @addr.buswidth: Number of IO lines used to transmit the address. 37*05e6a563SLionel Debieve * @addr.val: Address value. This value is always sent MSB first on the bus. 38*05e6a563SLionel Debieve * Note that only @addr.nbytes are taken into account in this 39*05e6a563SLionel Debieve * address value, so users should make sure the value fits in the 40*05e6a563SLionel Debieve * assigned number of bytes. 41*05e6a563SLionel Debieve * @dummy.nbytes: Number of dummy bytes to send after an opcode or address. Can 42*05e6a563SLionel Debieve * be zero if the operation does not require dummy bytes. 43*05e6a563SLionel Debieve * @dummy.buswidth: Number of IO lines used to transmit the dummy bytes. 44*05e6a563SLionel Debieve * @data.buswidth: Number of IO lines used to send/receive the data. 45*05e6a563SLionel Debieve * @data.dir: Direction of the transfer. 46*05e6a563SLionel Debieve * @data.nbytes: Number of data bytes to transfer. 47*05e6a563SLionel Debieve * @data.buf: Input or output data buffer depending on data::dir. 48*05e6a563SLionel Debieve */ 49*05e6a563SLionel Debieve struct spi_mem_op { 50*05e6a563SLionel Debieve struct { 51*05e6a563SLionel Debieve uint8_t buswidth; 52*05e6a563SLionel Debieve uint8_t opcode; 53*05e6a563SLionel Debieve } cmd; 54*05e6a563SLionel Debieve 55*05e6a563SLionel Debieve struct { 56*05e6a563SLionel Debieve uint8_t nbytes; 57*05e6a563SLionel Debieve uint8_t buswidth; 58*05e6a563SLionel Debieve uint64_t val; 59*05e6a563SLionel Debieve } addr; 60*05e6a563SLionel Debieve 61*05e6a563SLionel Debieve struct { 62*05e6a563SLionel Debieve uint8_t nbytes; 63*05e6a563SLionel Debieve uint8_t buswidth; 64*05e6a563SLionel Debieve } dummy; 65*05e6a563SLionel Debieve 66*05e6a563SLionel Debieve struct { 67*05e6a563SLionel Debieve uint8_t buswidth; 68*05e6a563SLionel Debieve enum spi_mem_data_dir dir; 69*05e6a563SLionel Debieve unsigned int nbytes; 70*05e6a563SLionel Debieve void *buf; 71*05e6a563SLionel Debieve } data; 72*05e6a563SLionel Debieve }; 73*05e6a563SLionel Debieve 74*05e6a563SLionel Debieve /* SPI mode flags */ 75*05e6a563SLionel Debieve #define SPI_CPHA BIT(0) /* clock phase */ 76*05e6a563SLionel Debieve #define SPI_CPOL BIT(1) /* clock polarity */ 77*05e6a563SLionel Debieve #define SPI_CS_HIGH BIT(2) /* CS active high */ 78*05e6a563SLionel Debieve #define SPI_LSB_FIRST BIT(3) /* per-word bits-on-wire */ 79*05e6a563SLionel Debieve #define SPI_3WIRE BIT(4) /* SI/SO signals shared */ 80*05e6a563SLionel Debieve #define SPI_PREAMBLE BIT(5) /* Skip preamble bytes */ 81*05e6a563SLionel Debieve #define SPI_TX_DUAL BIT(6) /* transmit with 2 wires */ 82*05e6a563SLionel Debieve #define SPI_TX_QUAD BIT(7) /* transmit with 4 wires */ 83*05e6a563SLionel Debieve #define SPI_RX_DUAL BIT(8) /* receive with 2 wires */ 84*05e6a563SLionel Debieve #define SPI_RX_QUAD BIT(9) /* receive with 4 wires */ 85*05e6a563SLionel Debieve 86*05e6a563SLionel Debieve struct spi_bus_ops { 87*05e6a563SLionel Debieve /* 88*05e6a563SLionel Debieve * Claim the bus and prepare it for communication. 89*05e6a563SLionel Debieve * 90*05e6a563SLionel Debieve * @cs: The chip select. 91*05e6a563SLionel Debieve * Returns: 0 if the bus was claimed successfully, or a negative value 92*05e6a563SLionel Debieve * if it wasn't. 93*05e6a563SLionel Debieve */ 94*05e6a563SLionel Debieve int (*claim_bus)(unsigned int cs); 95*05e6a563SLionel Debieve 96*05e6a563SLionel Debieve /* 97*05e6a563SLionel Debieve * Release the SPI bus. 98*05e6a563SLionel Debieve */ 99*05e6a563SLionel Debieve void (*release_bus)(void); 100*05e6a563SLionel Debieve 101*05e6a563SLionel Debieve /* 102*05e6a563SLionel Debieve * Set transfer speed. 103*05e6a563SLionel Debieve * 104*05e6a563SLionel Debieve * @hz: The transfer speed in Hertz. 105*05e6a563SLionel Debieve * Returns: 0 on success, a negative error code otherwise. 106*05e6a563SLionel Debieve */ 107*05e6a563SLionel Debieve int (*set_speed)(unsigned int hz); 108*05e6a563SLionel Debieve 109*05e6a563SLionel Debieve /* 110*05e6a563SLionel Debieve * Set the SPI mode/flags. 111*05e6a563SLionel Debieve * 112*05e6a563SLionel Debieve * @mode: Requested SPI mode (SPI_... flags). 113*05e6a563SLionel Debieve * Returns: 0 on success, a negative error code otherwise. 114*05e6a563SLionel Debieve */ 115*05e6a563SLionel Debieve int (*set_mode)(unsigned int mode); 116*05e6a563SLionel Debieve 117*05e6a563SLionel Debieve /* 118*05e6a563SLionel Debieve * Execute a SPI memory operation. 119*05e6a563SLionel Debieve * 120*05e6a563SLionel Debieve * @op: The memory operation to execute. 121*05e6a563SLionel Debieve * Returns: 0 on success, a negative error code otherwise. 122*05e6a563SLionel Debieve */ 123*05e6a563SLionel Debieve int (*exec_op)(const struct spi_mem_op *op); 124*05e6a563SLionel Debieve }; 125*05e6a563SLionel Debieve 126*05e6a563SLionel Debieve int spi_mem_exec_op(const struct spi_mem_op *op); 127*05e6a563SLionel Debieve int spi_mem_init_slave(void *fdt, int bus_node, 128*05e6a563SLionel Debieve const struct spi_bus_ops *ops); 129*05e6a563SLionel Debieve 130*05e6a563SLionel Debieve #endif /* DRIVERS_SPI_MEM_H */ 131