Blame view

include/spi.h 9.37 KB
77f855819   wdenk   Initial revision
1
  /*
469146c09   Jagannadha Sutradharudu Teki   sf: Minor cleanups.
2
3
   * Common SPI Interface: Controller-specific definitions
   *
77f855819   wdenk   Initial revision
4
5
6
   * (C) Copyright 2001
   * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
7
   * SPDX-License-Identifier:	GPL-2.0+
77f855819   wdenk   Initial revision
8
9
10
11
   */
  
  #ifndef _SPI_H_
  #define _SPI_H_
38254f45b   Guennadi Liakhovetski   New i.MX31 SPI dr...
12
13
14
15
16
17
18
  /* SPI mode flags */
  #define	SPI_CPHA	0x01			/* clock phase */
  #define	SPI_CPOL	0x02			/* clock polarity */
  #define	SPI_MODE_0	(0|0)			/* (original MicroWire) */
  #define	SPI_MODE_1	(0|SPI_CPHA)
  #define	SPI_MODE_2	(SPI_CPOL|0)
  #define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)
d255bb0e7   Haavard Skinnemoen   SPI API improvements
19
  #define	SPI_CS_HIGH	0x04			/* CS active high */
38254f45b   Guennadi Liakhovetski   New i.MX31 SPI dr...
20
21
22
  #define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */
  #define	SPI_3WIRE	0x10			/* SI/SO signals shared */
  #define	SPI_LOOP	0x20			/* loopback mode */
bb786b84b   Rajeshwari Shinde   spi: Add support ...
23
24
  #define	SPI_SLAVE	0x40			/* slave mode */
  #define	SPI_PREAMBLE	0x80			/* Skip preamble bytes */
38254f45b   Guennadi Liakhovetski   New i.MX31 SPI dr...
25

d255bb0e7   Haavard Skinnemoen   SPI API improvements
26
  /* SPI transfer flags */
ce22b922d   Jagannadha Sutradharudu Teki   sf: Minor cleanups
27
28
29
30
  #define SPI_XFER_BEGIN		0x01	/* Assert CS before transfer */
  #define SPI_XFER_END		0x02	/* Deassert CS after transfer */
  #define SPI_XFER_MMAP		0x08	/* Memory Mapped start */
  #define SPI_XFER_MMAP_END	0x10	/* Memory Mapped End */
4700219dc   Nikita Kiryanov   spi: define SPI_X...
31
  #define SPI_XFER_ONCE		(SPI_XFER_BEGIN | SPI_XFER_END)
f77f46911   Jagannadha Sutradharudu Teki   sf: Add dual memo...
32
  #define SPI_XFER_U_PAGE		(1 << 5)
77f855819   wdenk   Initial revision
33

3163aaa63   Jagannadha Sutradharudu Teki   sf: Add quad read...
34
35
  /* SPI TX operation modes */
  #define SPI_OPM_TX_QPP		1 << 0
4e09cc1e2   Jagannadha Sutradharudu Teki   sf: Add extended ...
36
37
38
39
  /* SPI RX operation modes */
  #define SPI_OPM_RX_AS		1 << 0
  #define SPI_OPM_RX_DOUT		1 << 1
  #define SPI_OPM_RX_DIO		1 << 2
3163aaa63   Jagannadha Sutradharudu Teki   sf: Add quad read...
40
  #define SPI_OPM_RX_QOF		1 << 3
c4ba0d82d   Jagannadha Sutradharudu Teki   sf: Add QUAD_IO_F...
41
  #define SPI_OPM_RX_QIOF		1 << 4
3163aaa63   Jagannadha Sutradharudu Teki   sf: Add quad read...
42
  #define SPI_OPM_RX_EXTN		SPI_OPM_RX_AS | SPI_OPM_RX_DOUT | \
c4ba0d82d   Jagannadha Sutradharudu Teki   sf: Add QUAD_IO_F...
43
44
  				SPI_OPM_RX_DIO | SPI_OPM_RX_QOF | \
  				SPI_OPM_RX_QIOF
4e09cc1e2   Jagannadha Sutradharudu Teki   sf: Add extended ...
45

f77f46911   Jagannadha Sutradharudu Teki   sf: Add dual memo...
46
47
  /* SPI bus connection options */
  #define SPI_CONN_DUAL_SHARED	1 << 0
056fbc73d   Jagannadha Sutradharudu Teki   sf: Add dual memo...
48
  #define SPI_CONN_DUAL_SEPARATED	1 << 1
f77f46911   Jagannadha Sutradharudu Teki   sf: Add dual memo...
49

bb786b84b   Rajeshwari Shinde   spi: Add support ...
50
  /* Header byte that marks the start of the message */
ce22b922d   Jagannadha Sutradharudu Teki   sf: Minor cleanups
51
  #define SPI_PREAMBLE_END_BYTE	0xec
bb786b84b   Rajeshwari Shinde   spi: Add support ...
52

5753d09b1   Nikita Kiryanov   spi: omap3: add s...
53
  #define SPI_DEFAULT_WORDLEN 8
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
54
  /**
ce22b922d   Jagannadha Sutradharudu Teki   sf: Minor cleanups
55
   * struct spi_slave - Representation of a SPI slave
d255bb0e7   Haavard Skinnemoen   SPI API improvements
56
57
58
   *
   * Drivers are expected to extend this with controller-specific data.
   *
ce22b922d   Jagannadha Sutradharudu Teki   sf: Minor cleanups
59
60
   * @bus:		ID of the bus that the slave is attached to.
   * @cs:			ID of the chip select connected to the slave.
4e09cc1e2   Jagannadha Sutradharudu Teki   sf: Add extended ...
61
   * @op_mode_rx:		SPI RX operation mode.
3163aaa63   Jagannadha Sutradharudu Teki   sf: Add quad read...
62
   * @op_mode_tx:		SPI TX operation mode.
5753d09b1   Nikita Kiryanov   spi: omap3: add s...
63
   * @wordlen:		Size of SPI word in number of bits
ce22b922d   Jagannadha Sutradharudu Teki   sf: Minor cleanups
64
65
66
   * @max_write_size:	If non-zero, the maximum number of bytes which can
   *			be written at once, excluding command bytes.
   * @memory_map:		Address of read-only SPI flash access.
056fbc73d   Jagannadha Sutradharudu Teki   sf: Add dual memo...
67
   * @option:		Varies SPI bus options - separate, shared bus.
f77f46911   Jagannadha Sutradharudu Teki   sf: Add dual memo...
68
   * @flags:		Indication of SPI flags.
d255bb0e7   Haavard Skinnemoen   SPI API improvements
69
70
   */
  struct spi_slave {
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
71
72
  	unsigned int bus;
  	unsigned int cs;
4e09cc1e2   Jagannadha Sutradharudu Teki   sf: Add extended ...
73
  	u8 op_mode_rx;
3163aaa63   Jagannadha Sutradharudu Teki   sf: Add quad read...
74
  	u8 op_mode_tx;
5753d09b1   Nikita Kiryanov   spi: omap3: add s...
75
  	unsigned int wordlen;
0c456cee9   Simon Glass   spi: Add paramete...
76
  	unsigned int max_write_size;
004f15b60   Poddar, Sourav   sf: Add memory ma...
77
  	void *memory_map;
f77f46911   Jagannadha Sutradharudu Teki   sf: Add dual memo...
78
79
  	u8 option;
  	u8 flags;
d255bb0e7   Haavard Skinnemoen   SPI API improvements
80
  };
77f855819   wdenk   Initial revision
81

1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
82
  /**
77f855819   wdenk   Initial revision
83
   * Initialization, must be called once on start up.
d255bb0e7   Haavard Skinnemoen   SPI API improvements
84
85
   *
   * TODO: I don't think we really need this.
77f855819   wdenk   Initial revision
86
87
   */
  void spi_init(void);
ba6c3ce9b   Simon Glass   spi: Add function...
88
89
90
91
92
93
  /**
   * spi_do_alloc_slave - Allocate a new SPI slave (internal)
   *
   * Allocate and zero all fields in the spi slave, and set the bus/chip
   * select. Use the helper macro spi_alloc_slave() to call this.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
94
95
96
97
   * @offset:	Offset of struct spi_slave within slave structure.
   * @size:	Size of slave structure.
   * @bus:	Bus ID of the slave chip.
   * @cs:		Chip select ID of the slave chip on the specified bus.
ba6c3ce9b   Simon Glass   spi: Add function...
98
99
100
101
102
103
104
105
106
107
   */
  void *spi_do_alloc_slave(int offset, int size, unsigned int bus,
  			 unsigned int cs);
  
  /**
   * spi_alloc_slave - Allocate a new SPI slave
   *
   * Allocate and zero all fields in the spi slave, and set the bus/chip
   * select.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
108
109
110
111
   * @_struct:	Name of structure to allocate (e.g. struct tegra_spi).
   *		This structure must contain a member 'struct spi_slave *slave'.
   * @bus:	Bus ID of the slave chip.
   * @cs:		Chip select ID of the slave chip on the specified bus.
ba6c3ce9b   Simon Glass   spi: Add function...
112
113
114
115
116
117
118
119
120
121
122
   */
  #define spi_alloc_slave(_struct, bus, cs) \
  	spi_do_alloc_slave(offsetof(_struct, slave), \
  			    sizeof(_struct), bus, cs)
  
  /**
   * spi_alloc_slave_base - Allocate a new SPI slave with no private data
   *
   * Allocate and zero all fields in the spi slave, and set the bus/chip
   * select.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
123
124
   * @bus:	Bus ID of the slave chip.
   * @cs:		Chip select ID of the slave chip on the specified bus.
ba6c3ce9b   Simon Glass   spi: Add function...
125
126
127
   */
  #define spi_alloc_slave_base(bus, cs) \
  	spi_do_alloc_slave(0, sizeof(struct spi_slave), bus, cs)
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
128
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
129
130
131
132
133
134
135
   * Set up communications parameters for a SPI slave.
   *
   * This must be called once for each slave. Note that this function
   * usually doesn't touch any actual hardware, it only initializes the
   * contents of spi_slave so that the hardware can be easily
   * initialized later.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
136
137
138
139
   * @bus:	Bus ID of the slave chip.
   * @cs:		Chip select ID of the slave chip on the specified bus.
   * @max_hz:	Maximum SCK rate in Hz.
   * @mode:	Clock polarity, clock phase and other parameters.
d255bb0e7   Haavard Skinnemoen   SPI API improvements
140
141
142
143
144
145
   *
   * Returns: A spi_slave reference that can be used in subsequent SPI
   * calls, or NULL if one or more of the parameters are not supported.
   */
  struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
  		unsigned int max_hz, unsigned int mode);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
146
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
147
148
   * Free any memory associated with a SPI slave.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
149
   * @slave:	The SPI slave
d255bb0e7   Haavard Skinnemoen   SPI API improvements
150
151
   */
  void spi_free_slave(struct spi_slave *slave);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
152
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
153
154
155
156
157
158
159
160
   * Claim the bus and prepare it for communication with a given slave.
   *
   * This must be called before doing any transfers with a SPI slave. It
   * will enable and initialize any SPI hardware as necessary, and make
   * sure that the SCK line is in the correct idle state. It is not
   * allowed to claim the same bus for several slaves without releasing
   * the bus in between.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
161
   * @slave:	The SPI slave
d255bb0e7   Haavard Skinnemoen   SPI API improvements
162
163
164
165
166
   *
   * Returns: 0 if the bus was claimed successfully, or a negative value
   * if it wasn't.
   */
  int spi_claim_bus(struct spi_slave *slave);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
167
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
168
169
170
171
172
173
   * Release the SPI bus
   *
   * This must be called once for every call to spi_claim_bus() after
   * all transfers have finished. It may disable any SPI hardware as
   * appropriate.
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
174
   * @slave:	The SPI slave
d255bb0e7   Haavard Skinnemoen   SPI API improvements
175
176
   */
  void spi_release_bus(struct spi_slave *slave);
77f855819   wdenk   Initial revision
177

1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
178
  /**
5753d09b1   Nikita Kiryanov   spi: omap3: add s...
179
180
181
182
183
184
185
186
187
188
189
190
   * Set the word length for SPI transactions
   *
   * Set the word length (number of bits per word) for SPI transactions.
   *
   * @slave:	The SPI slave
   * @wordlen:	The number of bits in a word
   *
   * Returns: 0 on success, -1 on failure.
   */
  int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen);
  
  /**
77f855819   wdenk   Initial revision
191
192
193
194
195
196
197
198
199
200
201
   * SPI transfer
   *
   * This writes "bitlen" bits out the SPI MOSI port and simultaneously clocks
   * "bitlen" bits in the SPI MISO port.  That's just the way SPI works.
   *
   * The source of the outgoing bits is the "dout" parameter and the
   * destination of the input bits is the "din" parameter.  Note that "dout"
   * and "din" can point to the same memory location, in which case the
   * input data overwrites the output data (since both are buffered by
   * temporary variables, this is OK).
   *
77f855819   wdenk   Initial revision
202
   * spi_xfer() interface:
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
203
204
205
   * @slave:	The SPI slave which will be sending/receiving the data.
   * @bitlen:	How many bits to write and read.
   * @dout:	Pointer to a string of bits to send out.  The bits are
d255bb0e7   Haavard Skinnemoen   SPI API improvements
206
   *		held in a byte array and are sent MSB first.
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
207
208
   * @din:	Pointer to a string of bits that will be filled in.
   * @flags:	A bitwise combination of SPI_XFER_* flags.
77f855819   wdenk   Initial revision
209
   *
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
210
   * Returns: 0 on success, not 0 on failure
77f855819   wdenk   Initial revision
211
   */
d255bb0e7   Haavard Skinnemoen   SPI API improvements
212
213
  int  spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
  		void *din, unsigned long flags);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
214
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
215
216
217
218
219
220
221
222
   * Determine if a SPI chipselect is valid.
   * This function is provided by the board if the low-level SPI driver
   * needs it to determine if a given chipselect is actually valid.
   *
   * Returns: 1 if bus:cs identifies a valid chip on this board, 0
   * otherwise.
   */
  int  spi_cs_is_valid(unsigned int bus, unsigned int cs);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
223
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
224
225
226
227
228
229
230
   * Activate a SPI chipselect.
   * This function is provided by the board code when using a driver
   * that can't control its chipselects automatically (e.g.
   * common/soft_spi.c). When called, it should activate the chip select
   * to the device identified by "slave".
   */
  void spi_cs_activate(struct spi_slave *slave);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
231
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
232
233
234
235
236
237
238
   * Deactivate a SPI chipselect.
   * This function is provided by the board code when using a driver
   * that can't control its chipselects automatically (e.g.
   * common/soft_spi.c). When called, it should deactivate the chip
   * select to the device identified by "slave".
   */
  void spi_cs_deactivate(struct spi_slave *slave);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
239
  /**
fa1423e70   Thomas Chou   spi: add spi_set_...
240
241
   * Set transfer speed.
   * This sets a new speed to be applied for next spi_xfer().
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
242
243
   * @slave:	The SPI slave
   * @hz:		The transfer speed
fa1423e70   Thomas Chou   spi: add spi_set_...
244
245
   */
  void spi_set_speed(struct spi_slave *slave, uint hz);
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
246
  /**
d255bb0e7   Haavard Skinnemoen   SPI API improvements
247
   * Write 8 bits, then read 8 bits.
1b1bd9a7b   Jagannadha Sutradharudu Teki   spi: spi cleanups
248
249
   * @slave:	The SPI slave we're communicating with
   * @byte:	Byte to be written
d255bb0e7   Haavard Skinnemoen   SPI API improvements
250
251
252
253
254
255
256
257
258
259
260
261
262
   *
   * Returns: The value that was read, or a negative value on error.
   *
   * TODO: This function probably shouldn't be inlined.
   */
  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;
38254f45b   Guennadi Liakhovetski   New i.MX31 SPI dr...
263

d255bb0e7   Haavard Skinnemoen   SPI API improvements
264
265
266
  	ret = spi_xfer(slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);
  	return ret < 0 ? ret : din[1];
  }
77f855819   wdenk   Initial revision
267

f3424c554   Hung-ying Tyan   cros: exynos: add...
268
269
270
271
272
273
  /**
   * Set up a SPI slave for a particular device tree node
   *
   * This calls spi_setup_slave() with the correct bus number. Call
   * spi_free_slave() to free it later.
   *
469146c09   Jagannadha Sutradharudu Teki   sf: Minor cleanups.
274
   * @param blob:		Device tree blob
0efc02499   Simon Glass   spi_flash: Add sp...
275
276
   * @param slave_node:	Slave node to use
   * @param spi_node:	SPI peripheral node to use
f3424c554   Hung-ying Tyan   cros: exynos: add...
277
278
   * @return pointer to new spi_slave structure
   */
0efc02499   Simon Glass   spi_flash: Add sp...
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  struct spi_slave *spi_setup_slave_fdt(const void *blob, int slave_node,
  				      int spi_node);
  
  /**
   * spi_base_setup_slave_fdt() - helper function to set up a SPI slace
   *
   * This decodes SPI properties from the slave node to determine the
   * chip select and SPI parameters.
   *
   * @blob:	Device tree blob
   * @busnum:	Bus number to use
   * @node:	Device tree node for the SPI bus
   */
  struct spi_slave *spi_base_setup_slave_fdt(const void *blob, int busnum,
  					   int node);
f3424c554   Hung-ying Tyan   cros: exynos: add...
294

77f855819   wdenk   Initial revision
295
  #endif	/* _SPI_H_ */