Blame view
include/spi.h
9.37 KB
77f855819 Initial revision |
1 |
/* |
469146c09 sf: Minor cleanups. |
2 3 |
* Common SPI Interface: Controller-specific definitions * |
77f855819 Initial revision |
4 5 6 |
* (C) Copyright 2001 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com. * |
1a4596601 Add GPL-2.0+ SPDX... |
7 |
* SPDX-License-Identifier: GPL-2.0+ |
77f855819 Initial revision |
8 9 10 11 |
*/ #ifndef _SPI_H_ #define _SPI_H_ |
38254f45b 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 SPI API improvements |
19 |
#define SPI_CS_HIGH 0x04 /* CS active high */ |
38254f45b 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 spi: Add support ... |
23 24 |
#define SPI_SLAVE 0x40 /* slave mode */ #define SPI_PREAMBLE 0x80 /* Skip preamble bytes */ |
38254f45b New i.MX31 SPI dr... |
25 |
|
d255bb0e7 SPI API improvements |
26 |
/* SPI transfer flags */ |
ce22b922d 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 spi: define SPI_X... |
31 |
#define SPI_XFER_ONCE (SPI_XFER_BEGIN | SPI_XFER_END) |
f77f46911 sf: Add dual memo... |
32 |
#define SPI_XFER_U_PAGE (1 << 5) |
77f855819 Initial revision |
33 |
|
3163aaa63 sf: Add quad read... |
34 35 |
/* SPI TX operation modes */ #define SPI_OPM_TX_QPP 1 << 0 |
4e09cc1e2 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 sf: Add quad read... |
40 |
#define SPI_OPM_RX_QOF 1 << 3 |
c4ba0d82d sf: Add QUAD_IO_F... |
41 |
#define SPI_OPM_RX_QIOF 1 << 4 |
3163aaa63 sf: Add quad read... |
42 |
#define SPI_OPM_RX_EXTN SPI_OPM_RX_AS | SPI_OPM_RX_DOUT | \ |
c4ba0d82d sf: Add QUAD_IO_F... |
43 44 |
SPI_OPM_RX_DIO | SPI_OPM_RX_QOF | \ SPI_OPM_RX_QIOF |
4e09cc1e2 sf: Add extended ... |
45 |
|
f77f46911 sf: Add dual memo... |
46 47 |
/* SPI bus connection options */ #define SPI_CONN_DUAL_SHARED 1 << 0 |
056fbc73d sf: Add dual memo... |
48 |
#define SPI_CONN_DUAL_SEPARATED 1 << 1 |
f77f46911 sf: Add dual memo... |
49 |
|
bb786b84b spi: Add support ... |
50 |
/* Header byte that marks the start of the message */ |
ce22b922d sf: Minor cleanups |
51 |
#define SPI_PREAMBLE_END_BYTE 0xec |
bb786b84b spi: Add support ... |
52 |
|
5753d09b1 spi: omap3: add s... |
53 |
#define SPI_DEFAULT_WORDLEN 8 |
1b1bd9a7b spi: spi cleanups |
54 |
/** |
ce22b922d sf: Minor cleanups |
55 |
* struct spi_slave - Representation of a SPI slave |
d255bb0e7 SPI API improvements |
56 57 58 |
* * Drivers are expected to extend this with controller-specific data. * |
ce22b922d 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 sf: Add extended ... |
61 |
* @op_mode_rx: SPI RX operation mode. |
3163aaa63 sf: Add quad read... |
62 |
* @op_mode_tx: SPI TX operation mode. |
5753d09b1 spi: omap3: add s... |
63 |
* @wordlen: Size of SPI word in number of bits |
ce22b922d 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 sf: Add dual memo... |
67 |
* @option: Varies SPI bus options - separate, shared bus. |
f77f46911 sf: Add dual memo... |
68 |
* @flags: Indication of SPI flags. |
d255bb0e7 SPI API improvements |
69 70 |
*/ struct spi_slave { |
1b1bd9a7b spi: spi cleanups |
71 72 |
unsigned int bus; unsigned int cs; |
4e09cc1e2 sf: Add extended ... |
73 |
u8 op_mode_rx; |
3163aaa63 sf: Add quad read... |
74 |
u8 op_mode_tx; |
5753d09b1 spi: omap3: add s... |
75 |
unsigned int wordlen; |
0c456cee9 spi: Add paramete... |
76 |
unsigned int max_write_size; |
004f15b60 sf: Add memory ma... |
77 |
void *memory_map; |
f77f46911 sf: Add dual memo... |
78 79 |
u8 option; u8 flags; |
d255bb0e7 SPI API improvements |
80 |
}; |
77f855819 Initial revision |
81 |
|
1b1bd9a7b spi: spi cleanups |
82 |
/** |
77f855819 Initial revision |
83 |
* Initialization, must be called once on start up. |
d255bb0e7 SPI API improvements |
84 85 |
* * TODO: I don't think we really need this. |
77f855819 Initial revision |
86 87 |
*/ void spi_init(void); |
ba6c3ce9b 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 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 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 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 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 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 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 spi: spi cleanups |
128 |
/** |
d255bb0e7 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 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 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 spi: spi cleanups |
146 |
/** |
d255bb0e7 SPI API improvements |
147 148 |
* Free any memory associated with a SPI slave. * |
1b1bd9a7b spi: spi cleanups |
149 |
* @slave: The SPI slave |
d255bb0e7 SPI API improvements |
150 151 |
*/ void spi_free_slave(struct spi_slave *slave); |
1b1bd9a7b spi: spi cleanups |
152 |
/** |
d255bb0e7 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 spi: spi cleanups |
161 |
* @slave: The SPI slave |
d255bb0e7 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 spi: spi cleanups |
167 |
/** |
d255bb0e7 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 spi: spi cleanups |
174 |
* @slave: The SPI slave |
d255bb0e7 SPI API improvements |
175 176 |
*/ void spi_release_bus(struct spi_slave *slave); |
77f855819 Initial revision |
177 |
|
1b1bd9a7b spi: spi cleanups |
178 |
/** |
5753d09b1 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 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 Initial revision |
202 |
* spi_xfer() interface: |
1b1bd9a7b 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 SPI API improvements |
206 |
* held in a byte array and are sent MSB first. |
1b1bd9a7b 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 Initial revision |
209 |
* |
1b1bd9a7b spi: spi cleanups |
210 |
* Returns: 0 on success, not 0 on failure |
77f855819 Initial revision |
211 |
*/ |
d255bb0e7 SPI API improvements |
212 213 |
int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, void *din, unsigned long flags); |
1b1bd9a7b spi: spi cleanups |
214 |
/** |
d255bb0e7 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 spi: spi cleanups |
223 |
/** |
d255bb0e7 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 spi: spi cleanups |
231 |
/** |
d255bb0e7 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 spi: spi cleanups |
239 |
/** |
fa1423e70 spi: add spi_set_... |
240 241 |
* Set transfer speed. * This sets a new speed to be applied for next spi_xfer(). |
1b1bd9a7b spi: spi cleanups |
242 243 |
* @slave: The SPI slave * @hz: The transfer speed |
fa1423e70 spi: add spi_set_... |
244 245 |
*/ void spi_set_speed(struct spi_slave *slave, uint hz); |
1b1bd9a7b spi: spi cleanups |
246 |
/** |
d255bb0e7 SPI API improvements |
247 |
* Write 8 bits, then read 8 bits. |
1b1bd9a7b spi: spi cleanups |
248 249 |
* @slave: The SPI slave we're communicating with * @byte: Byte to be written |
d255bb0e7 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 New i.MX31 SPI dr... |
263 |
|
d255bb0e7 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 Initial revision |
267 |
|
f3424c554 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 sf: Minor cleanups. |
274 |
* @param blob: Device tree blob |
0efc02499 spi_flash: Add sp... |
275 276 |
* @param slave_node: Slave node to use * @param spi_node: SPI peripheral node to use |
f3424c554 cros: exynos: add... |
277 278 |
* @return pointer to new spi_slave structure */ |
0efc02499 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 cros: exynos: add... |
294 |
|
77f855819 Initial revision |
295 |
#endif /* _SPI_H_ */ |