]>
git.ipfire.org Git - people/ms/u-boot.git/blob - cpu/mpc8220/i2c.c
62f7c0f5d330df815284ca99031017880c66273c
2 * (C) Copyright 2004, Freescale, Inc
3 * TsiChung Liew, Tsi-Chung.Liew@freescale.com.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
26 #ifdef CONFIG_HARD_I2C
31 typedef struct mpc8220_i2c
{
32 volatile u32 adr
; /* I2Cn + 0x00 */
33 volatile u32 fdr
; /* I2Cn + 0x04 */
34 volatile u32 cr
; /* I2Cn + 0x08 */
35 volatile u32 sr
; /* I2Cn + 0x0C */
36 volatile u32 dr
; /* I2Cn + 0x10 */
39 /* I2Cn control register bits */
46 #define I2C_INIT_MASK (I2C_EN | I2C_STA | I2C_TX | I2C_RSTA)
48 /* I2Cn status register bits */
57 #define I2C_TIMEOUT 100
60 struct mpc8220_i2c_tap
{
65 static int mpc_reg_in (volatile u32
* reg
);
66 static void mpc_reg_out (volatile u32
* reg
, int val
, int mask
);
67 static int wait_for_bb (void);
68 static int wait_for_pin (int *status
);
69 static int do_address (uchar chip
, char rdwr_flag
);
70 static int send_bytes (uchar chip
, char *buf
, int len
);
71 static int receive_bytes (uchar chip
, char *buf
, int len
);
72 static int mpc_get_fdr (int);
74 static int mpc_reg_in (volatile u32
* reg
)
78 __asm__
__volatile__ ("eieio");
82 static void mpc_reg_out (volatile u32
* reg
, int val
, int mask
)
89 tmp
= mpc_reg_in (reg
);
90 *reg
= ((tmp
& ~mask
) | (val
& mask
)) << 24;
92 __asm__
__volatile__ ("eieio");
97 static int wait_for_bb (void)
99 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
100 int timeout
= I2C_TIMEOUT
;
103 status
= mpc_reg_in (®s
->sr
);
105 while (timeout
-- && (status
& I2C_BB
)) {
109 mpc_reg_out (®s
->cr
, I2C_STA
, I2C_STA
);
110 temp
= mpc_reg_in (®s
->dr
);
111 mpc_reg_out (®s
->cr
, 0, I2C_STA
);
112 mpc_reg_out (®s
->cr
, 0, 0);
113 mpc_reg_out (®s
->cr
, I2C_EN
, 0);
116 status
= mpc_reg_in (®s
->sr
);
119 return (status
& I2C_BB
);
122 static int wait_for_pin (int *status
)
124 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
125 int timeout
= I2C_TIMEOUT
;
127 *status
= mpc_reg_in (®s
->sr
);
129 while (timeout
-- && !(*status
& I2C_IF
)) {
131 *status
= mpc_reg_in (®s
->sr
);
134 if (!(*status
& I2C_IF
)) {
138 mpc_reg_out (®s
->sr
, 0, I2C_IF
);
142 static int do_address (uchar chip
, char rdwr_flag
)
144 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
152 mpc_reg_out (®s
->cr
, I2C_TX
, I2C_TX
);
153 mpc_reg_out (®s
->dr
, chip
, 0);
155 if (wait_for_pin (&status
))
157 if (status
& I2C_RXAK
)
162 static int send_bytes (uchar chip
, char *buf
, int len
)
164 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
168 for (wrcount
= 0; wrcount
< len
; ++wrcount
) {
170 mpc_reg_out (®s
->dr
, buf
[wrcount
], 0);
172 if (wait_for_pin (&status
))
175 if (status
& I2C_RXAK
)
180 return !(wrcount
== len
);
184 static int receive_bytes (uchar chip
, char *buf
, int len
)
186 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
192 mpc_reg_out (®s
->cr
, 0, I2C_TX
);
194 for (i
= 0; i
< len
; ++i
) {
195 buf
[rdcount
] = mpc_reg_in (®s
->dr
);
202 if (wait_for_pin (&status
))
206 mpc_reg_out (®s
->cr
, I2C_TXAK
, I2C_TXAK
);
207 buf
[rdcount
++] = mpc_reg_in (®s
->dr
);
209 if (wait_for_pin (&status
))
212 mpc_reg_out (®s
->cr
, 0, I2C_TXAK
);
216 /**************** I2C API ****************/
218 void i2c_init (int speed
, int saddr
)
220 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
222 mpc_reg_out (®s
->cr
, 0, 0);
223 mpc_reg_out (®s
->adr
, saddr
<< 1, 0);
227 mpc_reg_out (®s
->fdr
, mpc_get_fdr (speed
), 0);
231 mpc_reg_out (®s
->cr
, I2C_EN
, I2C_INIT_MASK
);
232 mpc_reg_out (®s
->sr
, 0, I2C_IF
);
236 static int mpc_get_fdr (int speed
)
238 DECLARE_GLOBAL_DATA_PTR
;
242 ulong best_speed
= 0;
245 ulong bestmatch
= 0xffffffffUL
;
246 int best_i
= 0, best_j
= 0, i
, j
;
247 int SCL_Tap
[] = { 9, 10, 12, 15, 5, 6, 7, 8 };
248 struct mpc8220_i2c_tap scltap
[] = {
260 for (i
= 7; i
>= 0; i
--) {
261 for (j
= 7; j
>= 0; j
--) {
262 scl
= 2 * (scltap
[j
].scl2tap
+
264 1) * scltap
[j
].tap2tap
+ 2);
265 if (ipb
<= speed
* scl
) {
266 if ((speed
* scl
- ipb
) < bestmatch
) {
267 bestmatch
= speed
* scl
- ipb
;
270 best_speed
= ipb
/ scl
;
275 divider
= (best_i
& 3) | ((best_i
& 4) << 3) | (best_j
<< 2);
276 if (gd
->flags
& GD_FLG_RELOC
) {
279 printf ("%ld kHz, ", best_speed
/ 1000);
287 int i2c_probe (uchar chip
)
289 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
292 for (i
= 0; i
< I2C_RETRIES
; i
++) {
293 mpc_reg_out (®s
->cr
, I2C_STA
, I2C_STA
);
295 if (!do_address (chip
, 0)) {
296 mpc_reg_out (®s
->cr
, 0, I2C_STA
);
300 mpc_reg_out (®s
->cr
, 0, I2C_STA
);
304 return (i
== I2C_RETRIES
);
307 int i2c_read (uchar chip
, uint addr
, int alen
, uchar
* buf
, int len
)
310 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
313 xaddr
[0] = (addr
>> 24) & 0xFF;
314 xaddr
[1] = (addr
>> 16) & 0xFF;
315 xaddr
[2] = (addr
>> 8) & 0xFF;
316 xaddr
[3] = addr
& 0xFF;
318 if (wait_for_bb ()) {
319 printf ("i2c_read: bus is busy\n");
323 mpc_reg_out (®s
->cr
, I2C_STA
, I2C_STA
);
324 if (do_address (chip
, 0)) {
325 printf ("i2c_read: failed to address chip\n");
329 if (send_bytes (chip
, (char *)&xaddr
[4 - alen
], alen
)) {
330 printf ("i2c_read: send_bytes failed\n");
334 mpc_reg_out (®s
->cr
, I2C_RSTA
, I2C_RSTA
);
335 if (do_address (chip
, 1)) {
336 printf ("i2c_read: failed to address chip\n");
340 if (receive_bytes (chip
, (char *)buf
, len
)) {
341 printf ("i2c_read: receive_bytes failed\n");
347 mpc_reg_out (®s
->cr
, 0, I2C_STA
);
351 int i2c_write (uchar chip
, uint addr
, int alen
, uchar
* buf
, int len
)
354 i2c_t
*regs
= (i2c_t
*) MMAP_I2C
;
357 xaddr
[0] = (addr
>> 24) & 0xFF;
358 xaddr
[1] = (addr
>> 16) & 0xFF;
359 xaddr
[2] = (addr
>> 8) & 0xFF;
360 xaddr
[3] = addr
& 0xFF;
362 if (wait_for_bb ()) {
363 printf ("i2c_write: bus is busy\n");
367 mpc_reg_out (®s
->cr
, I2C_STA
, I2C_STA
);
368 if (do_address (chip
, 0)) {
369 printf ("i2c_write: failed to address chip\n");
373 if (send_bytes (chip
, (char *)&xaddr
[4 - alen
], alen
)) {
374 printf ("i2c_write: send_bytes failed\n");
378 if (send_bytes (chip
, (char *)buf
, len
)) {
379 printf ("i2c_write: send_bytes failed\n");
385 mpc_reg_out (®s
->cr
, 0, I2C_STA
);
389 uchar
i2c_reg_read (uchar chip
, uchar reg
)
393 i2c_read (chip
, reg
, 1, &buf
, 1);
398 void i2c_reg_write (uchar chip
, uchar reg
, uchar val
)
400 i2c_write (chip
, reg
, 1, &val
, 1);
405 #endif /* CONFIG_HARD_I2C */