]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - cpu/mpc512x/i2c.c
Merge branch 'master' of git://git.denx.de/u-boot-mpc83xx
[karo-tx-uboot.git] / cpu / mpc512x / i2c.c
index 00e28d6404dfd439fa28f2147e42cdd90855a4b3..e2d909751ef3afc972f02e713b4813064944b709 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (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
@@ -56,29 +54,24 @@ static int  mpc_get_fdr(int);
 
 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;
 
@@ -101,7 +94,8 @@ static int wait_for_bb (void)
 
 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 (&regs->msr);
@@ -122,7 +116,8 @@ static int wait_for_pin (int *status)
 
 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;
@@ -147,7 +142,8 @@ static int do_address (uchar chip, char rdwr_flag)
 
 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;
 
@@ -170,7 +166,8 @@ static int send_bytes (uchar chip, char *buf, int len)
 
 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;
@@ -208,9 +205,12 @@ static int receive_bytes (uchar chip, char *buf, int len)
 
 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 (&regs->mcr, 0, 0);
 
                /* Set clock */
@@ -223,10 +223,10 @@ void i2c_init (int speed, int saddr)
        }
 
        /* 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)
@@ -236,7 +236,7 @@ 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};
@@ -251,18 +251,18 @@ static int mpc_get_fdr (int speed)
                        {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;
                                        }
                                }
                        }
@@ -281,7 +281,8 @@ static int mpc_get_fdr (int speed)
 
 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++) {
@@ -302,8 +303,9 @@ int i2c_probe (uchar chip)
 
 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;
@@ -346,8 +348,9 @@ Done:
 
 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;
@@ -382,23 +385,6 @@ Done:
        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) {
@@ -414,18 +400,4 @@ unsigned int i2c_get_bus_num (void)
        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 */