projects
/
oweals
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix e-mail address of Gary Jennejohn.
[oweals/u-boot.git]
/
cpu
/
mpc5xxx
/
i2c.c
diff --git
a/cpu/mpc5xxx/i2c.c
b/cpu/mpc5xxx/i2c.c
index 74a610f940aafd2cbb66c8f5e9a6deb6ddea3912..23419324ba592b6091fef2081d9ec9aec09605b6 100644
(file)
--- a/
cpu/mpc5xxx/i2c.c
+++ b/
cpu/mpc5xxx/i2c.c
@@
-23,20
+23,22
@@
#include <common.h>
#include <common.h>
+DECLARE_GLOBAL_DATA_PTR;
+
#ifdef CONFIG_HARD_I2C
#include <mpc5xxx.h>
#include <i2c.h>
#ifdef CONFIG_HARD_I2C
#include <mpc5xxx.h>
#include <i2c.h>
-#if (C
FG
_I2C_MODULE == 2)
+#if (C
ONFIG_SYS
_I2C_MODULE == 2)
#define I2C_BASE MPC5XXX_I2C2
#define I2C_BASE MPC5XXX_I2C2
-#elif (C
FG
_I2C_MODULE == 1)
+#elif (C
ONFIG_SYS
_I2C_MODULE == 1)
#define I2C_BASE MPC5XXX_I2C1
#else
#define I2C_BASE MPC5XXX_I2C1
#else
-#error C
FG
_I2C_MODULE is not properly configured
+#error C
ONFIG_SYS
_I2C_MODULE is not properly configured
#endif
#endif
-#define I2C_TIMEOUT
100
+#define I2C_TIMEOUT
6667
#define I2C_RETRIES 3
struct mpc5xxx_i2c_tap {
#define I2C_RETRIES 3
struct mpc5xxx_i2c_tap {
@@
-55,8
+57,9
@@
static int mpc_get_fdr (int);
static int mpc_reg_in(volatile u32 *reg)
{
static int mpc_reg_in(volatile u32 *reg)
{
-
return
*reg >> 24;
+
int ret =
*reg >> 24;
__asm__ __volatile__ ("eieio");
__asm__ __volatile__ ("eieio");
+ return ret;
}
static void mpc_reg_out(volatile u32 *reg, int val, int mask)
}
static void mpc_reg_out(volatile u32 *reg, int val, int mask)
@@
-91,7
+94,7
@@
static int wait_for_bb(void)
mpc_reg_out(®s->mcr, 0, 0);
mpc_reg_out(®s->mcr, I2C_EN, 0);
#endif
mpc_reg_out(®s->mcr, 0, 0);
mpc_reg_out(®s->mcr, I2C_EN, 0);
#endif
- udelay(1
000
);
+ udelay(1
5
);
status = mpc_reg_in(®s->msr);
}
status = mpc_reg_in(®s->msr);
}
@@
-106,7
+109,7
@@
static int wait_for_pin(int *status)
*status = mpc_reg_in(®s->msr);
while (timeout-- && !(*status & I2C_IF)) {
*status = mpc_reg_in(®s->msr);
while (timeout-- && !(*status & I2C_IF)) {
- udelay(1
000
);
+ udelay(1
5
);
*status = mpc_reg_in(®s->msr);
}
*status = mpc_reg_in(®s->msr);
}
@@
-133,13
+136,13
@@
static int do_address(uchar chip, char rdwr_flag)
mpc_reg_out(®s->mcr, I2C_TX, I2C_TX);
mpc_reg_out(®s->mdr, chip, 0);
mpc_reg_out(®s->mcr, I2C_TX, I2C_TX);
mpc_reg_out(®s->mdr, chip, 0);
-
if (wait_for_pin(&status)) {
-
return -2;
-
}
+ if (wait_for_pin(&status)) {
+ return -2;
+ }
-
if (status & I2C_RXAK) {
-
return -3;
-
}
+ if (status & I2C_RXAK) {
+ return -3;
+ }
return 0;
}
return 0;
}
@@
-227,11
+230,11
@@
void i2c_init(int speed, int saddr)
static int mpc_get_fdr(int speed)
{
static int mpc_get_fdr(int speed)
{
- DECLARE_GLOBAL_DATA_PTR;
static int fdr = -1;
static int fdr = -1;
- static int best_speed = 0;
if (fdr == -1) {
if (fdr == -1) {
+ ulong best_speed = 0;
+ ulong divider;
ulong ipb, scl;
ulong bestmatch = 0xffffffffUL;
int best_i = 0, best_j = 0, i, j;
ulong ipb, scl;
ulong bestmatch = 0xffffffffUL;
int best_i = 0, best_j = 0, i, j;
@@
-250,7
+253,7
@@
static int mpc_get_fdr(int speed)
ipb = gd->ipb_clk;
for (i = 7; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
ipb = gd->ipb_clk;
for (i = 7; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
- scl = 2 * (scltap[j].scl2tap +
+ scl = 2 * (scltap[j].scl2tap +
(SCL_Tap[i] - 1) * scltap[j].tap2tap + 2);
if (ipb <= speed*scl) {
if ((speed*scl - ipb) < bestmatch) {
(SCL_Tap[i] - 1) * scltap[j].tap2tap + 2);
if (ipb <= speed*scl) {
if ((speed*scl - ipb) < bestmatch) {
@@
-262,8
+265,14
@@
static int mpc_get_fdr(int speed)
}
}
}
}
}
}
- fdr = (best_i & 3) | ((best_i & 4) << 3) | (best_j << 2);
- printf("%d kHz, ", best_speed / 1000);
+ divider = (best_i & 3) | ((best_i & 4) << 3) | (best_j << 2);
+ if (gd->flags & GD_FLG_RELOC) {
+ fdr = divider;
+ } else {
+ if (gd->have_console)
+ printf("%ld kHz, ", best_speed / 1000);
+ return divider;
+ }
}
return fdr;
}
return fdr;
@@
-279,6
+288,7
@@
int i2c_probe(uchar chip)
if (! do_address(chip, 0)) {
mpc_reg_out(®s->mcr, 0, I2C_STA);
if (! do_address(chip, 0)) {
mpc_reg_out(®s->mcr, 0, I2C_STA);
+ udelay(500);
break;
}
break;
}
@@
-291,7
+301,7
@@
int i2c_probe(uchar chip)
int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
{
int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
{
-
u
char xaddr[4];
+ char xaddr[4];
struct mpc5xxx_i2c * regs = (struct mpc5xxx_i2c *)I2C_BASE;
int ret = -1;
struct mpc5xxx_i2c * regs = (struct mpc5xxx_i2c *)I2C_BASE;
int ret = -1;
@@
-301,29
+311,34
@@
int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
xaddr[3] = addr & 0xFF;
if (wait_for_bb()) {
xaddr[3] = addr & 0xFF;
if (wait_for_bb()) {
- printf("i2c_read: bus is busy\n");
+ if (gd->have_console)
+ printf("i2c_read: bus is busy\n");
goto Done;
}
mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
if (do_address(chip, 0)) {
goto Done;
}
mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
if (do_address(chip, 0)) {
- printf("i2c_read: failed to address chip\n");
+ if (gd->have_console)
+ printf("i2c_read: failed to address chip\n");
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
- printf("i2c_read: send_bytes failed\n");
+ if (gd->have_console)
+ printf("i2c_read: send_bytes failed\n");
goto Done;
}
mpc_reg_out(®s->mcr, I2C_RSTA, I2C_RSTA);
if (do_address(chip, 1)) {
goto Done;
}
mpc_reg_out(®s->mcr, I2C_RSTA, I2C_RSTA);
if (do_address(chip, 1)) {
- printf("i2c_read: failed to address chip\n");
+ if (gd->have_console)
+ printf("i2c_read: failed to address chip\n");
goto Done;
}
goto Done;
}
- if (receive_bytes(chip, buf, len)) {
- printf("i2c_read: receive_bytes failed\n");
+ if (receive_bytes(chip, (char *)buf, len)) {
+ if (gd->have_console)
+ printf("i2c_read: receive_bytes failed\n");
goto Done;
}
goto Done;
}
@@
-335,7
+350,7
@@
Done:
int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
{
int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
{
-
u
char xaddr[4];
+ char xaddr[4];
struct mpc5xxx_i2c *regs = (struct mpc5xxx_i2c *)I2C_BASE;
int ret = -1;
struct mpc5xxx_i2c *regs = (struct mpc5xxx_i2c *)I2C_BASE;
int ret = -1;
@@
-344,24
+359,28
@@
int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
xaddr[2] = (addr >> 8) & 0xFF;
xaddr[3] = addr & 0xFF;
xaddr[2] = (addr >> 8) & 0xFF;
xaddr[3] = addr & 0xFF;
- if (wait_for_bb()) {
- printf("i2c_write: bus is busy\n");
+ if (wait_for_bb()) {
+ if (gd->have_console)
+ printf("i2c_write: bus is busy\n");
goto Done;
}
goto Done;
}
- mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
- if (do_address(chip, 0)) {
- printf("i2c_write: failed to address chip\n");
+ mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
+ if (do_address(chip, 0)) {
+ if (gd->have_console)
+ printf("i2c_write: failed to address chip\n");
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
- printf("i2c_write: send_bytes failed\n");
+ if (gd->have_console)
+ printf("i2c_write: send_bytes failed\n");
goto Done;
}
goto Done;
}
- if (send_bytes(chip, buf, len)) {
- printf("i2c_write: send_bytes failed\n");
+ if (send_bytes(chip, (char *)buf, len)) {
+ if (gd->have_console)
+ printf("i2c_write: send_bytes failed\n");
goto Done;
}
goto Done;
}
@@
-371,20
+390,4
@@
Done:
return ret;
}
return ret;
}
-uchar i2c_reg_read(uchar chip, uchar reg)
-{
- char buf;
-
- i2c_read(chip, reg, 1, &buf, 1);
-
- return buf;
-}
-
-void i2c_reg_write(uchar chip, uchar reg, uchar val)
-{
- i2c_write(chip, reg, 1, &val, 1);
-
- return;
-}
-
#endif /* CONFIG_HARD_I2C */
#endif /* CONFIG_HARD_I2C */