/*
- * (C) Copyright 2003 - 2007
+ * (C) Copyright 2003 - 2009
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
*/
#include <common.h>
+#include <asm/io.h>
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_HARD_I2C
-#include <mpc512x.h>
#include <i2c.h>
-#define immr ((immap_t *)CFG_IMMR)
-
/* by default set I2C bus 0 active */
-static unsigned int bus_num = 0;
+static unsigned int bus_num __attribute__ ((section (".data"))) = 0;
#define I2C_TIMEOUT 100
#define I2C_RETRIES 3
static int mpc_reg_in (volatile u32 *reg)
{
- int ret = *reg >> 24;
- __asm__ __volatile__ ("eieio");
+ int ret = in_be32(reg) >> 24;
+
return ret;
}
static void mpc_reg_out (volatile u32 *reg, int val, int mask)
{
- int tmp;
-
if (!mask) {
- *reg = val << 24;
+ out_be32(reg, val << 24);
} else {
- tmp = mpc_reg_in (reg);
- *reg = ((tmp & ~mask) | (val & mask)) << 24;
+ clrsetbits_be32(reg, mask << 24, (val & mask) << 24);
}
- __asm__ __volatile__ ("eieio");
-
- return;
}
static int wait_for_bb (void)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int timeout = I2C_TIMEOUT;
int status;
static int wait_for_pin (int *status)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int timeout = I2C_TIMEOUT;
*status = mpc_reg_in (®s->msr);
static int do_address (uchar chip, char rdwr_flag)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int status;
chip <<= 1;
static int send_bytes (uchar chip, char *buf, int len)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int wrcount;
int status;
static int receive_bytes (uchar chip, char *buf, int len)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int dummy = 1;
int rdcount = 0;
int status;
void i2c_init (int speed, int saddr)
{
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
int i;
- for(i = 0; i < I2C_BUS_CNT; i++){
- i2c512x_dev_t *regs = &immr->i2c.dev[i];
+
+ for (i = 0; i < I2C_BUS_CNT; i++){
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[i];
+
mpc_reg_out (®s->mcr, 0, 0);
/* Set clock */
}
/* Disable interrupts */
- immr->i2c.icr = 0;
+ out_be32(&im->i2c.icr, 0);
+
/* Turn off filters */
- immr->i2c.mifr = 0;
- return;
+ out_be32(&im->i2c.mifr, 0);
}
static int mpc_get_fdr (int speed)
if (fdr == -1) {
ulong best_speed = 0;
ulong divider;
- ulong ipb, scl;
+ ulong ips, scl;
ulong bestmatch = 0xffffffffUL;
int best_i = 0, best_j = 0, i, j;
int SCL_Tap[] = { 9, 10, 12, 15, 5, 6, 7, 8};
{126, 128}
};
- ipb = gd->ipb_clk;
+ ips = gd->ips_clk;
for (i = 7; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
scl = 2 * (scltap[j].scl2tap +
(SCL_Tap[i] - 1) * scltap[j].tap2tap
+ 2);
- if (ipb <= speed*scl) {
- if ((speed*scl - ipb) < bestmatch) {
- bestmatch = speed*scl - ipb;
+ if (ips <= speed*scl) {
+ if ((speed*scl - ips) < bestmatch) {
+ bestmatch = speed*scl - ips;
best_i = i;
best_j = j;
- best_speed = ipb/scl;
+ best_speed = ips/scl;
}
}
}
int i2c_probe (uchar chip)
{
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
int i;
for (i = 0; i < I2C_RETRIES; i++) {
int i2c_read (uchar chip, uint addr, int alen, uchar *buf, int len)
{
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
char xaddr[4];
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
int ret = -1;
xaddr[0] = (addr >> 24) & 0xFF;
int i2c_write (uchar chip, uint addr, int alen, uchar *buf, int len)
{
+ volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
+ volatile i2c512x_dev_t *regs = &im->i2c.dev[bus_num];
char xaddr[4];
- i2c512x_dev_t *regs = &immr->i2c.dev[bus_num];
int ret = -1;
xaddr[0] = (addr >> 24) & 0xFF;
return ret;
}
-uchar i2c_reg_read (uchar chip, uchar reg)
-{
- uchar 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;
-}
-
-
int i2c_set_bus_num (unsigned int bus)
{
if (bus >= I2C_BUS_CNT) {
return bus_num;
}
-/* TODO */
-unsigned int i2c_get_bus_speed (void)
-{
- return -1;
-}
-
-int i2c_set_bus_speed (unsigned int speed)
-{
- if (speed != CFG_I2C_SPEED)
- return -1;
-
- return 0;
-}
-
#endif /* CONFIG_HARD_I2C */