1 /***********************license start***************
2  * Copyright (c) 2003-2010  Cavium Inc. ([email protected]). All rights
3  * reserved.
4  *
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *   * Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer.
12  *
13  *   * Redistributions in binary form must reproduce the above
14  *     copyright notice, this list of conditions and the following
15  *     disclaimer in the documentation and/or other materials provided
16  *     with the distribution.
17 
18  *   * Neither the name of Cavium Inc. nor the names of
19  *     its contributors may be used to endorse or promote products
20  *     derived from this software without specific prior written
21  *     permission.
22 
23  * This Software, including technical data, may be subject to U.S. export  control
24  * laws, including the U.S. Export Administration Act and its  associated
25  * regulations, and may be subject to export or import  regulations in other
26  * countries.
27 
28  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
29  * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30  * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31  * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32  * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33  * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34  * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35  * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36  * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37  * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38  ***********************license end**************************************/
39 
40 
41 
42 
43 
44 
45 
46 /**
47  * @file
48  *
49  * Interface to the TWSI / I2C bus
50  *
51  * Note: Currently on 7 bit device addresses are supported
52  *
53  * <hr>$Revision: 70030 $<hr>
54  *
55  */
56 
57 #ifndef __CVMX_TWSI_H__
58 #define __CVMX_TWSI_H__
59 
60 #ifdef	__cplusplus
61 extern "C" {
62 #endif
63 
64 
65     /* Extra TWSI Bus Opcodes */
66 #define TWSI_SLAVE_ADD     0
67 #define TWSI_DATA          1
68 #define TWSI_CTL           2
69 #define TWSI_CLKCTL_STAT   3       /* R=0 selects CLKCTL, R=1 selects STAT */
70 #define TWSI_STAT          3       /* when R = 1 */
71 #define TWSI_SLAVE_ADD_EXT 4
72 #define TWSI_RST           7
73 
74 
75 /**
76  * Do a twsi read from a 7 bit device address using an (optional) internal address.
77  * Up to 8 bytes can be read at a time.
78  *
79  * @param twsi_id   which Octeon TWSI bus to use
80  * @param dev_addr  Device address (7 bit)
81  * @param internal_addr
82  *                  Internal address.  Can be 0, 1 or 2 bytes in width
83  * @param num_bytes Number of data bytes to read
84  * @param ia_width_bytes
85  *                  Internal address size in bytes (0, 1, or 2)
86  * @param data      Pointer argument where the read data is returned.
87  *
88  * @return read data returned in 'data' argument
89  *         Number of bytes read on success
90  *         -1 on failure
91  */
92 int cvmx_twsix_read_ia(int twsi_id, uint8_t dev_addr, uint16_t internal_addr, int num_bytes, int ia_width_bytes, uint64_t *data);
93 
94 
95 
96 
97 /**
98  * A convenience wrapper function around cvmx_twsix_read_ia() that
99  * only supports 8 bit internal addresses.
100  * Reads up to 7 bytes, and returns both the value read or error
101  * value in the return value
102  *
103  * @param twsi_id   which Octeon TWSI bus to use
104  * @param dev_addr  Device address (7 bit only)
105  * @param internal_addr
106  *                  Internal address (8 bit only)
107  * @param num_bytes Number of bytes to read (0-7)
108  *
109  * @return Value read from TWSI on success
110  *         -1 on error
111  */
cvmx_twsix_read_ia8(int twsi_id,uint8_t dev_addr,uint8_t internal_addr,int num_bytes)112 static inline int64_t cvmx_twsix_read_ia8(int twsi_id, uint8_t dev_addr, uint8_t internal_addr, int num_bytes)
113 {
114     uint64_t data;
115     if (num_bytes < 1 || num_bytes > 7)
116         return -1;
117     if (cvmx_twsix_read_ia(twsi_id,dev_addr,internal_addr,num_bytes, 1, &data) < 0)
118         return -1;
119     return data;
120 }
121 
122 /**
123  * A convenience wrapper function around cvmx_twsix_read_ia() that
124  * only supports 16 bit internal addresses.
125  * Reads up to 7 bytes, and returns both the value read or error
126  * value in the return value
127  *
128  * @param twsi_id   which Octeon TWSI bus to use
129  * @param dev_addr  Device address (7 bit only)
130  * @param internal_addr
131  *                  Internal address (16 bit only)
132  * @param num_bytes Number of bytes to read (0-7)
133  *
134  * @return Value read from TWSI on success
135  *         -1 on error
136  */
cvmx_twsix_read_ia16(int twsi_id,uint8_t dev_addr,uint16_t internal_addr,int num_bytes)137 static inline int64_t cvmx_twsix_read_ia16(int twsi_id, uint8_t dev_addr, uint16_t internal_addr, int num_bytes)
138 {
139     uint64_t data;
140     if (num_bytes < 1 || num_bytes > 7)
141         return -1;
142     if (cvmx_twsix_read_ia(twsi_id, dev_addr, internal_addr, num_bytes, 2, &data) < 0)
143         return -1;
144     return data;
145 }
146 
147 
148 
149 /**
150  * Read from a TWSI device (7 bit device address only) without generating any
151  * internal addresses.
152  * Read from 1-8 bytes and returns them in the data pointer.
153  *
154  * @param twsi_id   TWSI interface on Octeon to use
155  * @param dev_addr  TWSI device address (7 bit only)
156  * @param num_bytes number of bytes to read
157  * @param data      Pointer to data read from TWSI device
158  *
159  * @return Number of bytes read on success
160  *         -1 on error
161  */
162 int cvmx_twsix_read(int twsi_id, uint8_t dev_addr, int num_bytes, uint64_t *data);
163 
164 
165 
166 /**
167  * Perform a twsi write operation to a 7 bit device address.
168  *
169  * Note that many eeprom devices have page restrictions regarding address boundaries
170  * that can be crossed in one write operation.  This is device dependent, and this routine
171  * does nothing in this regard.
172  * This command does not generate any internal addressess.
173  *
174  * @param twsi_id   Octeon TWSI interface to use
175  * @param dev_addr  TWSI device address
176  * @param num_bytes Number of bytes to write (between 1 and 8 inclusive)
177  * @param data      Data to write
178  *
179  * @return 0 on success
180  *         -1 on failure
181  */
182 int cvmx_twsix_write(int twsi_id, uint8_t dev_addr, int num_bytes, uint64_t data);
183 
184 /**
185  * Write 1-8 bytes to a TWSI device using an internal address.
186  *
187  * @param twsi_id   which TWSI interface on Octeon to use
188  * @param dev_addr  TWSI device address (7 bit only)
189  * @param internal_addr
190  *                  TWSI internal address (0, 8, or 16 bits)
191  * @param num_bytes Number of bytes to write (1-8)
192  * @param ia_width_bytes
193  *                  internal address width, in bytes (0, 1, 2)
194  * @param data      Data to write.  Data is written MSB first on the twsi bus, and only the lower
195  *                  num_bytes bytes of the argument are valid.  (If a 2 byte write is done, only
196  *                  the low 2 bytes of the argument is used.
197  *
198  * @return Number of bytes read on success,
199  *         -1 on error
200  */
201 int cvmx_twsix_write_ia(int twsi_id, uint8_t dev_addr, uint16_t internal_addr, int num_bytes, int ia_width_bytes, uint64_t data);
202 
203 /***********************************************************************
204 ** Functions below are deprecated, and not recomended for use.
205 ** They have been superceded by more flexible functions that are
206 ** now provided.
207 ************************************************************************/
208 
209 
210 
211 
212 
213 
214 /**
215  * Read 8-bit from a device on the TWSI / I2C bus
216  *
217  * @param twsi_id  Which TWSI bus to use. CN3XXX, CN58XX, and CN50XX only
218  *                 support 0. CN56XX and CN57XX support 0-1.
219  * @param dev_addr I2C device address (7 bit)
220  * @param internal_addr
221  *                 Internal device address
222  *
223  * @return 8-bit data or < 0 in case of error
224  */
cvmx_twsix_read8(int twsi_id,uint8_t dev_addr,uint8_t internal_addr)225 static inline int cvmx_twsix_read8(int twsi_id, uint8_t dev_addr, uint8_t internal_addr)
226 {
227     return cvmx_twsix_read_ia8(twsi_id, dev_addr, internal_addr, 1);
228 }
229 
230 /**
231  * Read 8-bit from a device on the TWSI / I2C bus
232  *
233  * Uses current internal address
234  *
235  * @param twsi_id  Which TWSI bus to use. CN3XXX, CN58XX, and CN50XX only
236  *                 support 0. CN56XX and CN57XX support 0-1.
237  * @param dev_addr I2C device address (7 bit)
238  *
239  * @return 8-bit value or < 0 in case of error
240  */
cvmx_twsix_read8_cur_addr(int twsi_id,uint8_t dev_addr)241 static inline int cvmx_twsix_read8_cur_addr(int twsi_id, uint8_t dev_addr)
242 {
243     uint64_t data;
244 
245     if (cvmx_twsix_read(twsi_id,dev_addr, 1, &data) < 0)
246         return -1;
247     return(data & 0xff);
248 }
249 
250 /**
251  * Write 8-bit to a device on the TWSI / I2C bus
252  *
253  * @param twsi_id  Which TWSI bus to use. CN3XXX, CN58XX, and CN50XX only
254  *                 support 0. CN56XX and CN57XX support 0-1.
255  * @param dev_addr I2C device address (7 bit)
256  * @param internal_addr
257  *                 Internal device address
258  * @param data     Data to be written
259  *
260  * @return 0 on success and < 0 in case of error
261  */
cvmx_twsix_write8(int twsi_id,uint8_t dev_addr,uint8_t internal_addr,uint8_t data)262 static inline int cvmx_twsix_write8(int twsi_id, uint8_t dev_addr, uint8_t internal_addr, uint8_t data)
263 {
264     if (cvmx_twsix_write_ia(twsi_id,dev_addr,internal_addr, 1, 1,data) < 0)
265         return -1;
266     return 0;
267 }
268 
269 /**
270  * Read 8-bit from a device on the TWSI / I2C bus zero.
271  *
272  * This function is for compatibility with SDK 1.6.0 and
273  * before which only supported a single TWSI bus.
274  *
275  * @param dev_addr I2C device address (7 bit)
276  * @param internal_addr
277  *                 Internal device address
278  *
279  * @return 8-bit data or < 0 in case of error
280  */
cvmx_twsi_read8(uint8_t dev_addr,uint8_t internal_addr)281 static inline int cvmx_twsi_read8(uint8_t dev_addr, uint8_t internal_addr)
282 {
283     return cvmx_twsix_read8(0, dev_addr, internal_addr);
284 }
285 
286 /**
287  * Read 8-bit from a device on the TWSI / I2C bus zero.
288  *
289  * Uses current internal address
290  *
291  * This function is for compatibility with SDK 1.6.0 and
292  * before which only supported a single TWSI bus.
293  *
294  * @param dev_addr I2C device address (7 bit)
295  *
296  * @return 8-bit value or < 0 in case of error
297  */
cvmx_twsi_read8_cur_addr(uint8_t dev_addr)298 static inline int cvmx_twsi_read8_cur_addr(uint8_t dev_addr)
299 {
300     return cvmx_twsix_read8_cur_addr(0, dev_addr);
301 }
302 
303 /**
304  * Write 8-bit to a device on the TWSI / I2C bus zero.
305  * This function is for compatibility with SDK 1.6.0 and
306  * before which only supported a single TWSI bus.
307  *
308  * @param dev_addr I2C device address (7 bit)
309  * @param internal_addr
310  *                 Internal device address
311  * @param data     Data to be written
312  *
313  * @return 0 on success and < 0 in case of error
314  */
cvmx_twsi_write8(uint8_t dev_addr,uint8_t internal_addr,uint8_t data)315 static inline int cvmx_twsi_write8(uint8_t dev_addr, uint8_t internal_addr, uint8_t data)
316 {
317     return cvmx_twsix_write8(0, dev_addr, internal_addr, data);
318 }
319 
320 #ifdef	__cplusplus
321 }
322 #endif
323 
324 #endif  /*  __CVMX_TWSI_H__ */
325