xref: /rk3399_rockchip-uboot/include/spi.h (revision d255bb0e78d1cac5b7c8c98cb77a095f5f16de0d)
177f85581Swdenk /*
277f85581Swdenk  * (C) Copyright 2001
377f85581Swdenk  * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
477f85581Swdenk  *
577f85581Swdenk  * See file CREDITS for list of people who contributed to this
677f85581Swdenk  * project.
777f85581Swdenk  *
877f85581Swdenk  * This program is free software; you can redistribute it and/or
977f85581Swdenk  * modify it under the terms of the GNU General Public License as
1077f85581Swdenk  * published by the Free Software Foundation; either version 2 of
1177f85581Swdenk  * the License, or (at your option) any later version.
1277f85581Swdenk  *
1377f85581Swdenk  * This program is distributed in the hope that it will be useful,
1477f85581Swdenk  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1577f85581Swdenk  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1677f85581Swdenk  * GNU General Public License for more details.
1777f85581Swdenk  *
1877f85581Swdenk  * You should have received a copy of the GNU General Public License
1977f85581Swdenk  * along with this program; if not, write to the Free Software
2077f85581Swdenk  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
2177f85581Swdenk  * MA 02111-1307 USA
2277f85581Swdenk  */
2377f85581Swdenk 
2477f85581Swdenk #ifndef _SPI_H_
2577f85581Swdenk #define _SPI_H_
2677f85581Swdenk 
2738254f45SGuennadi Liakhovetski /* SPI mode flags */
2838254f45SGuennadi Liakhovetski #define	SPI_CPHA	0x01			/* clock phase */
2938254f45SGuennadi Liakhovetski #define	SPI_CPOL	0x02			/* clock polarity */
3038254f45SGuennadi Liakhovetski #define	SPI_MODE_0	(0|0)			/* (original MicroWire) */
3138254f45SGuennadi Liakhovetski #define	SPI_MODE_1	(0|SPI_CPHA)
3238254f45SGuennadi Liakhovetski #define	SPI_MODE_2	(SPI_CPOL|0)
3338254f45SGuennadi Liakhovetski #define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)
34*d255bb0eSHaavard Skinnemoen #define	SPI_CS_HIGH	0x04			/* CS active high */
3538254f45SGuennadi Liakhovetski #define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */
3638254f45SGuennadi Liakhovetski #define	SPI_3WIRE	0x10			/* SI/SO signals shared */
3738254f45SGuennadi Liakhovetski #define	SPI_LOOP	0x20			/* loopback mode */
3838254f45SGuennadi Liakhovetski 
39*d255bb0eSHaavard Skinnemoen /* SPI transfer flags */
40*d255bb0eSHaavard Skinnemoen #define SPI_XFER_BEGIN	0x01			/* Assert CS before transfer */
41*d255bb0eSHaavard Skinnemoen #define SPI_XFER_END	0x02			/* Deassert CS after transfer */
4277f85581Swdenk 
43*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
44*d255bb0eSHaavard Skinnemoen  * Representation of a SPI slave, i.e. what we're communicating with.
45*d255bb0eSHaavard Skinnemoen  *
46*d255bb0eSHaavard Skinnemoen  * Drivers are expected to extend this with controller-specific data.
47*d255bb0eSHaavard Skinnemoen  *
48*d255bb0eSHaavard Skinnemoen  *   bus:	ID of the bus that the slave is attached to.
49*d255bb0eSHaavard Skinnemoen  *   cs:	ID of the chip select connected to the slave.
50*d255bb0eSHaavard Skinnemoen  */
51*d255bb0eSHaavard Skinnemoen struct spi_slave {
52*d255bb0eSHaavard Skinnemoen 	unsigned int	bus;
53*d255bb0eSHaavard Skinnemoen 	unsigned int	cs;
54*d255bb0eSHaavard Skinnemoen };
5577f85581Swdenk 
5677f85581Swdenk /*-----------------------------------------------------------------------
5777f85581Swdenk  * Initialization, must be called once on start up.
58*d255bb0eSHaavard Skinnemoen  *
59*d255bb0eSHaavard Skinnemoen  * TODO: I don't think we really need this.
6077f85581Swdenk  */
6177f85581Swdenk void spi_init(void);
6277f85581Swdenk 
63*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
64*d255bb0eSHaavard Skinnemoen  * Set up communications parameters for a SPI slave.
65*d255bb0eSHaavard Skinnemoen  *
66*d255bb0eSHaavard Skinnemoen  * This must be called once for each slave. Note that this function
67*d255bb0eSHaavard Skinnemoen  * usually doesn't touch any actual hardware, it only initializes the
68*d255bb0eSHaavard Skinnemoen  * contents of spi_slave so that the hardware can be easily
69*d255bb0eSHaavard Skinnemoen  * initialized later.
70*d255bb0eSHaavard Skinnemoen  *
71*d255bb0eSHaavard Skinnemoen  *   bus:     Bus ID of the slave chip.
72*d255bb0eSHaavard Skinnemoen  *   cs:      Chip select ID of the slave chip on the specified bus.
73*d255bb0eSHaavard Skinnemoen  *   max_hz:  Maximum SCK rate in Hz.
74*d255bb0eSHaavard Skinnemoen  *   mode:    Clock polarity, clock phase and other parameters.
75*d255bb0eSHaavard Skinnemoen  *
76*d255bb0eSHaavard Skinnemoen  * Returns: A spi_slave reference that can be used in subsequent SPI
77*d255bb0eSHaavard Skinnemoen  * calls, or NULL if one or more of the parameters are not supported.
78*d255bb0eSHaavard Skinnemoen  */
79*d255bb0eSHaavard Skinnemoen struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
80*d255bb0eSHaavard Skinnemoen 		unsigned int max_hz, unsigned int mode);
81*d255bb0eSHaavard Skinnemoen 
82*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
83*d255bb0eSHaavard Skinnemoen  * Free any memory associated with a SPI slave.
84*d255bb0eSHaavard Skinnemoen  *
85*d255bb0eSHaavard Skinnemoen  *   slave:	The SPI slave
86*d255bb0eSHaavard Skinnemoen  */
87*d255bb0eSHaavard Skinnemoen void spi_free_slave(struct spi_slave *slave);
88*d255bb0eSHaavard Skinnemoen 
89*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
90*d255bb0eSHaavard Skinnemoen  * Claim the bus and prepare it for communication with a given slave.
91*d255bb0eSHaavard Skinnemoen  *
92*d255bb0eSHaavard Skinnemoen  * This must be called before doing any transfers with a SPI slave. It
93*d255bb0eSHaavard Skinnemoen  * will enable and initialize any SPI hardware as necessary, and make
94*d255bb0eSHaavard Skinnemoen  * sure that the SCK line is in the correct idle state. It is not
95*d255bb0eSHaavard Skinnemoen  * allowed to claim the same bus for several slaves without releasing
96*d255bb0eSHaavard Skinnemoen  * the bus in between.
97*d255bb0eSHaavard Skinnemoen  *
98*d255bb0eSHaavard Skinnemoen  *   slave:	The SPI slave
99*d255bb0eSHaavard Skinnemoen  *
100*d255bb0eSHaavard Skinnemoen  * Returns: 0 if the bus was claimed successfully, or a negative value
101*d255bb0eSHaavard Skinnemoen  * if it wasn't.
102*d255bb0eSHaavard Skinnemoen  */
103*d255bb0eSHaavard Skinnemoen int spi_claim_bus(struct spi_slave *slave);
104*d255bb0eSHaavard Skinnemoen 
105*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
106*d255bb0eSHaavard Skinnemoen  * Release the SPI bus
107*d255bb0eSHaavard Skinnemoen  *
108*d255bb0eSHaavard Skinnemoen  * This must be called once for every call to spi_claim_bus() after
109*d255bb0eSHaavard Skinnemoen  * all transfers have finished. It may disable any SPI hardware as
110*d255bb0eSHaavard Skinnemoen  * appropriate.
111*d255bb0eSHaavard Skinnemoen  *
112*d255bb0eSHaavard Skinnemoen  *   slave:	The SPI slave
113*d255bb0eSHaavard Skinnemoen  */
114*d255bb0eSHaavard Skinnemoen void spi_release_bus(struct spi_slave *slave);
11577f85581Swdenk 
11677f85581Swdenk /*-----------------------------------------------------------------------
11777f85581Swdenk  * SPI transfer
11877f85581Swdenk  *
11977f85581Swdenk  * This writes "bitlen" bits out the SPI MOSI port and simultaneously clocks
12077f85581Swdenk  * "bitlen" bits in the SPI MISO port.  That's just the way SPI works.
12177f85581Swdenk  *
12277f85581Swdenk  * The source of the outgoing bits is the "dout" parameter and the
12377f85581Swdenk  * destination of the input bits is the "din" parameter.  Note that "dout"
12477f85581Swdenk  * and "din" can point to the same memory location, in which case the
12577f85581Swdenk  * input data overwrites the output data (since both are buffered by
12677f85581Swdenk  * temporary variables, this is OK).
12777f85581Swdenk  *
12877f85581Swdenk  * spi_xfer() interface:
129*d255bb0eSHaavard Skinnemoen  *   slave:	The SPI slave which will be sending/receiving the data.
130*d255bb0eSHaavard Skinnemoen  *   bitlen:	How many bits to write and read.
13177f85581Swdenk  *   dout:	Pointer to a string of bits to send out.  The bits are
13277f85581Swdenk  *		held in a byte array and are sent MSB first.
13377f85581Swdenk  *   din:	Pointer to a string of bits that will be filled in.
134*d255bb0eSHaavard Skinnemoen  *   flags:	A bitwise combination of SPI_XFER_* flags.
13577f85581Swdenk  *
13677f85581Swdenk  *   Returns: 0 on success, not 0 on failure
13777f85581Swdenk  */
138*d255bb0eSHaavard Skinnemoen int  spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
139*d255bb0eSHaavard Skinnemoen 		void *din, unsigned long flags);
14077f85581Swdenk 
141*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
142*d255bb0eSHaavard Skinnemoen  * Determine if a SPI chipselect is valid.
143*d255bb0eSHaavard Skinnemoen  * This function is provided by the board if the low-level SPI driver
144*d255bb0eSHaavard Skinnemoen  * needs it to determine if a given chipselect is actually valid.
145*d255bb0eSHaavard Skinnemoen  *
146*d255bb0eSHaavard Skinnemoen  * Returns: 1 if bus:cs identifies a valid chip on this board, 0
147*d255bb0eSHaavard Skinnemoen  * otherwise.
148*d255bb0eSHaavard Skinnemoen  */
149*d255bb0eSHaavard Skinnemoen int  spi_cs_is_valid(unsigned int bus, unsigned int cs);
150*d255bb0eSHaavard Skinnemoen 
151*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
152*d255bb0eSHaavard Skinnemoen  * Activate a SPI chipselect.
153*d255bb0eSHaavard Skinnemoen  * This function is provided by the board code when using a driver
154*d255bb0eSHaavard Skinnemoen  * that can't control its chipselects automatically (e.g.
155*d255bb0eSHaavard Skinnemoen  * common/soft_spi.c). When called, it should activate the chip select
156*d255bb0eSHaavard Skinnemoen  * to the device identified by "slave".
157*d255bb0eSHaavard Skinnemoen  */
158*d255bb0eSHaavard Skinnemoen void spi_cs_activate(struct spi_slave *slave);
159*d255bb0eSHaavard Skinnemoen 
160*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
161*d255bb0eSHaavard Skinnemoen  * Deactivate a SPI chipselect.
162*d255bb0eSHaavard Skinnemoen  * This function is provided by the board code when using a driver
163*d255bb0eSHaavard Skinnemoen  * that can't control its chipselects automatically (e.g.
164*d255bb0eSHaavard Skinnemoen  * common/soft_spi.c). When called, it should deactivate the chip
165*d255bb0eSHaavard Skinnemoen  * select to the device identified by "slave".
166*d255bb0eSHaavard Skinnemoen  */
167*d255bb0eSHaavard Skinnemoen void spi_cs_deactivate(struct spi_slave *slave);
168*d255bb0eSHaavard Skinnemoen 
169*d255bb0eSHaavard Skinnemoen /*-----------------------------------------------------------------------
170*d255bb0eSHaavard Skinnemoen  * Write 8 bits, then read 8 bits.
171*d255bb0eSHaavard Skinnemoen  *   slave:	The SPI slave we're communicating with
172*d255bb0eSHaavard Skinnemoen  *   byte:	Byte to be written
173*d255bb0eSHaavard Skinnemoen  *
174*d255bb0eSHaavard Skinnemoen  * Returns: The value that was read, or a negative value on error.
175*d255bb0eSHaavard Skinnemoen  *
176*d255bb0eSHaavard Skinnemoen  * TODO: This function probably shouldn't be inlined.
177*d255bb0eSHaavard Skinnemoen  */
178*d255bb0eSHaavard Skinnemoen static inline int spi_w8r8(struct spi_slave *slave, unsigned char byte)
179*d255bb0eSHaavard Skinnemoen {
180*d255bb0eSHaavard Skinnemoen 	unsigned char dout[2];
181*d255bb0eSHaavard Skinnemoen 	unsigned char din[2];
182*d255bb0eSHaavard Skinnemoen 	int ret;
183*d255bb0eSHaavard Skinnemoen 
184*d255bb0eSHaavard Skinnemoen 	dout[0] = byte;
185*d255bb0eSHaavard Skinnemoen 	dout[1] = 0;
186*d255bb0eSHaavard Skinnemoen 
187*d255bb0eSHaavard Skinnemoen 	ret = spi_xfer(slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);
188*d255bb0eSHaavard Skinnemoen 	return ret < 0 ? ret : din[1];
189*d255bb0eSHaavard Skinnemoen }
19038254f45SGuennadi Liakhovetski 
19177f85581Swdenk #endif	/* _SPI_H_ */
192