2 * (C) Copyright 2003 - 2009
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * SPDX-License-Identifier: GPL-2.0+
7 * Based on the MPC5xxx code.
13 DECLARE_GLOBAL_DATA_PTR;
15 #ifdef CONFIG_HARD_I2C
19 /* by default set I2C bus 0 active */
20 static unsigned int bus_num __attribute__ ((section (".data"))) = 0;
22 #define I2C_TIMEOUT 100
25 struct mpc512x_i2c_tap {
30 static int mpc_reg_in(volatile u32 *reg);
31 static void mpc_reg_out(volatile u32 *reg, int val, int mask);
32 static int wait_for_bb(void);
33 static int wait_for_pin(int *status);
34 static int do_address(uchar chip, char rdwr_flag);
35 static int send_bytes(uchar chip, char *buf, int len);
36 static int receive_bytes(uchar chip, char *buf, int len);
37 static int mpc_get_fdr(int);
39 static int mpc_reg_in (volatile u32 *reg)
41 int ret = in_be32(reg) >> 24;
46 static void mpc_reg_out (volatile u32 *reg, int val, int mask)
49 out_be32(reg, val << 24);
51 clrsetbits_be32(reg, mask << 24, (val & mask) << 24);
55 static int wait_for_bb (void)
57 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
58 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
59 int timeout = I2C_TIMEOUT;
62 status = mpc_reg_in (®s->msr);
64 while (timeout-- && (status & I2C_BB)) {
65 mpc_reg_out (®s->mcr, I2C_STA, I2C_STA);
66 (void)mpc_reg_in(®s->mdr);
67 mpc_reg_out (®s->mcr, 0, I2C_STA);
68 mpc_reg_out (®s->mcr, 0, 0);
69 mpc_reg_out (®s->mcr, I2C_EN, 0);
72 status = mpc_reg_in (®s->msr);
75 return (status & I2C_BB);
78 static int wait_for_pin (int *status)
80 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
81 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
82 int timeout = I2C_TIMEOUT;
84 *status = mpc_reg_in (®s->msr);
86 while (timeout-- && !(*status & I2C_IF)) {
88 *status = mpc_reg_in (®s->msr);
91 if (!(*status & I2C_IF)) {
95 mpc_reg_out (®s->msr, 0, I2C_IF);
100 static int do_address (uchar chip, char rdwr_flag)
102 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
103 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
112 mpc_reg_out (®s->mcr, I2C_TX, I2C_TX);
113 mpc_reg_out (®s->mdr, chip, 0);
115 if (wait_for_pin (&status)) {
119 if (status & I2C_RXAK) {
126 static int send_bytes (uchar chip, char *buf, int len)
128 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
129 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
133 for (wrcount = 0; wrcount < len; ++wrcount) {
135 mpc_reg_out (®s->mdr, buf[wrcount], 0);
137 if (wait_for_pin (&status)) {
141 if (status & I2C_RXAK) {
147 return !(wrcount == len);
150 static int receive_bytes (uchar chip, char *buf, int len)
152 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
153 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
159 mpc_reg_out (®s->mcr, 0, I2C_TX);
161 for (i = 0; i < len; ++i) {
162 buf[rdcount] = mpc_reg_in (®s->mdr);
170 if (wait_for_pin (&status)) {
175 mpc_reg_out (®s->mcr, I2C_TXAK, I2C_TXAK);
176 buf[rdcount++] = mpc_reg_in (®s->mdr);
178 if (wait_for_pin (&status)) {
182 mpc_reg_out (®s->mcr, 0, I2C_TXAK);
187 /**************** I2C API ****************/
189 void i2c_init (int speed, int saddr)
191 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
194 for (i = 0; i < I2C_BUS_CNT; i++){
195 volatile i2c512x_dev_t *regs = &im->i2c.dev[i];
197 mpc_reg_out (®s->mcr, 0, 0);
200 mpc_reg_out (®s->mfdr, mpc_get_fdr (speed), 0);
201 mpc_reg_out (®s->madr, saddr << 1, 0);
204 mpc_reg_out (®s->mcr, I2C_EN, I2C_INIT_MASK);
205 mpc_reg_out (®s->msr, 0, I2C_IF);
208 /* Disable interrupts */
209 out_be32(&im->i2c.icr, 0);
211 /* Turn off filters */
212 out_be32(&im->i2c.mifr, 0);
215 static int mpc_get_fdr (int speed)
220 ulong best_speed = 0;
223 ulong bestmatch = 0xffffffffUL;
224 int best_i = 0, best_j = 0, i, j;
225 int SCL_Tap[] = { 9, 10, 12, 15, 5, 6, 7, 8};
226 struct mpc512x_i2c_tap scltap[] = {
237 ips = gd->arch.ips_clk;
238 for (i = 7; i >= 0; i--) {
239 for (j = 7; j >= 0; j--) {
240 scl = 2 * (scltap[j].scl2tap +
241 (SCL_Tap[i] - 1) * scltap[j].tap2tap
243 if (ips <= speed*scl) {
244 if ((speed*scl - ips) < bestmatch) {
245 bestmatch = speed*scl - ips;
248 best_speed = ips/scl;
253 divider = (best_i & 3) | ((best_i & 4) << 3) | (best_j << 2);
254 if (gd->flags & GD_FLG_RELOC) {
257 debug("%ld kHz, \n", best_speed / 1000);
265 int i2c_probe (uchar chip)
267 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
268 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
271 for (i = 0; i < I2C_RETRIES; i++) {
272 mpc_reg_out (®s->mcr, I2C_STA, I2C_STA);
274 if (! do_address (chip, 0)) {
275 mpc_reg_out (®s->mcr, 0, I2C_STA);
280 mpc_reg_out (®s->mcr, 0, I2C_STA);
284 return (i == I2C_RETRIES);
287 int i2c_read (uchar chip, uint addr, int alen, uchar *buf, int len)
289 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
290 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
294 xaddr[0] = (addr >> 24) & 0xFF;
295 xaddr[1] = (addr >> 16) & 0xFF;
296 xaddr[2] = (addr >> 8) & 0xFF;
297 xaddr[3] = addr & 0xFF;
299 if (wait_for_bb ()) {
300 printf ("i2c_read: bus is busy\n");
304 mpc_reg_out (®s->mcr, I2C_STA, I2C_STA);
305 if (do_address (chip, 0)) {
306 printf ("i2c_read: failed to address chip\n");
310 if (send_bytes (chip, &xaddr[4-alen], alen)) {
311 printf ("i2c_read: send_bytes failed\n");
315 mpc_reg_out (®s->mcr, I2C_RSTA, I2C_RSTA);
316 if (do_address (chip, 1)) {
317 printf ("i2c_read: failed to address chip\n");
321 if (receive_bytes (chip, (char *)buf, len)) {
322 printf ("i2c_read: receive_bytes failed\n");
328 mpc_reg_out (®s->mcr, 0, I2C_STA);
332 int i2c_write (uchar chip, uint addr, int alen, uchar *buf, int len)
334 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
335 volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
339 xaddr[0] = (addr >> 24) & 0xFF;
340 xaddr[1] = (addr >> 16) & 0xFF;
341 xaddr[2] = (addr >> 8) & 0xFF;
342 xaddr[3] = addr & 0xFF;
344 if (wait_for_bb ()) {
345 printf ("i2c_write: bus is busy\n");
349 mpc_reg_out (®s->mcr, I2C_STA, I2C_STA);
350 if (do_address (chip, 0)) {
351 printf ("i2c_write: failed to address chip\n");
355 if (send_bytes (chip, &xaddr[4-alen], alen)) {
356 printf ("i2c_write: send_bytes failed\n");
360 if (send_bytes (chip, (char *)buf, len)) {
361 printf ("i2c_write: send_bytes failed\n");
367 mpc_reg_out (®s->mcr, 0, I2C_STA);
371 int i2c_set_bus_num (unsigned int bus)
373 if (bus >= I2C_BUS_CNT) {
381 unsigned int i2c_get_bus_num (void)
386 #endif /* CONFIG_HARD_I2C */