xref: /rk3399_ARM-atf/include/drivers/spi_mem.h (revision 0a910952f641cac20f9be29276483ee2e8a70d4c)
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