]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'master' of /home/git/u-boot/
authorWolfgang Denk <wd@denx.de>
Sat, 20 Oct 2007 22:10:34 +0000 (00:10 +0200)
committerWolfgang Denk <wd@denx.de>
Sat, 20 Oct 2007 22:10:34 +0000 (00:10 +0200)
MAKEALL
Makefile
board/amcc/sequoia/cmd_sequoia.c
board/amcc/sequoia/sequoia.c
board/amcc/yosemite/yosemite.c
board/freescale/common/pq-mds-pib.c
common/cmd_bootm.c
common/cmd_dtt.c
drivers/isp116x-hcd.c
include/configs/sequoia.h
include/configs/yosemite.h

diff --git a/MAKEALL b/MAKEALL
index 2597d1fa352e227b997c69cf6dc60352fa52ec5a..20e81370f7c31a2c1e683d7b6efae73ce1b2bd4f 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -301,10 +301,12 @@ LIST_83xx="               \
        MPC8313ERDB_66  \
        MPC8323ERDB     \
        MPC832XEMDS     \
+       MPC832XEMDS_ATM \
        MPC8349EMDS     \
        MPC8349ITX      \
        MPC8349ITXGP    \
        MPC8360EMDS     \
+       MPC8360EMDS_ATM \
        sbc8349         \
        TQM834x         \
 "
index e1cea0d36fb29e35486992117474d132fdc74fff..ce7b07f9d18acba0e1862d40781fca88434548ab 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1766,7 +1766,8 @@ MPC8323ERDB_config:       unconfig
 MPC832XEMDS_config \
 MPC832XEMDS_HOST_33_config \
 MPC832XEMDS_HOST_66_config \
-MPC832XEMDS_SLAVE_config:      unconfig
+MPC832XEMDS_SLAVE_config \
+MPC832XEMDS_ATM_config:        unconfig
        @mkdir -p $(obj)include
        @echo "" >$(obj)include/config.h ; \
        if [ "$(findstring _HOST_,$@)" ] ; then \
@@ -1781,11 +1782,18 @@ MPC832XEMDS_SLAVE_config:       unconfig
        if [ "$(findstring _33_,$@)" ] ; then \
                echo -n "...33M ..." ; \
                echo "#define PCI_33M" >>$(obj)include/config.h ; \
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _66_,$@)" ] ; then \
                echo -n "...66M..." ; \
                echo "#define PCI_66M" >>$(obj)include/config.h ; \
-       fi ;
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
+       fi ; \
+       if [ "$(findstring _ATM_,$@)" ] ; then \
+               echo -n "...ATM..." ; \
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
+               echo "#define CONFIG_PQ_MDS_PIB_ATM     1" >>$(obj)include/config.h ; \
+        fi ;
        @$(MKCONFIG) -a MPC832XEMDS ppc mpc83xx mpc832xemds freescale
 
 MPC8349EMDS_config:    unconfig
@@ -1808,7 +1816,8 @@ MPC8349ITXGP_config:      unconfig
 MPC8360EMDS_config \
 MPC8360EMDS_HOST_33_config \
 MPC8360EMDS_HOST_66_config \
-MPC8360EMDS_SLAVE_config:      unconfig
+MPC8360EMDS_SLAVE_config \
+MPC8360EMDS_ATM_config: unconfig
        @mkdir -p $(obj)include
        @echo "" >$(obj)include/config.h ; \
        if [ "$(findstring _HOST_,$@)" ] ; then \
@@ -1823,10 +1832,17 @@ MPC8360EMDS_SLAVE_config:       unconfig
        if [ "$(findstring _33_,$@)" ] ; then \
                echo -n "...33M ..." ; \
                echo "#define PCI_33M" >>$(obj)include/config.h ; \
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _66_,$@)" ] ; then \
                echo -n "...66M..." ; \
                echo "#define PCI_66M" >>$(obj)include/config.h ; \
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
+       fi ; \
+       if [ "$(findstring _ATM_,$@)" ] ; then \
+               echo -n "...ATM..." ; \
+               echo "#define CONFIG_PQ_MDS_PIB 1" >>$(obj)include/config.h ; \
+               echo "#define CONFIG_PQ_MDS_PIB_ATM     1" >>$(obj)include/config.h ; \
        fi ;
        @$(MKCONFIG) -a MPC8360EMDS ppc mpc83xx mpc8360emds freescale
 
index f3803c09f899c85f34458c9421034ee9f3fcae31..6b9043a0586bf3512709e83fbe9f1f88e0a20623 100644 (file)
@@ -25,6 +25,7 @@
 #include <common.h>
 #include <command.h>
 #include <i2c.h>
+#include <asm/io.h>
 
 /*
  * There are 2 versions of production Sequoia & Rainier platforms.
@@ -39,7 +40,7 @@
  * All Sequoias & Rainiers select from two possible EEPROMs in Boot
  * Config F. One for 33MHz PCI, one for 66MHz PCI. The following
  * values are for the 33MHz PCI configuration. Byte 5 (0 base) is
- * the only  value affected for a 66MHz PCI and simply needs a +0x10.
+ * the only value affected for a 33MHz PCI and simply needs a | 0x08.
  */
 
 #define NAND_COMPATIBLE        0x01
@@ -56,6 +57,7 @@ static char *config_labels[] = {
        "CPU: 416 PLB: 166 OPB: 83 EBC: 55",
        "CPU: 500 PLB: 166 OPB: 83 EBC: 55",
        "CPU: 533 PLB: 133 OPB: 66 EBC: 66",
+       "CPU: 667 PLB: 133 OPB: 66 EBC: 66",
        "CPU: 667 PLB: 166 OPB: 83 EBC: 55",
        NULL
 };
@@ -96,6 +98,11 @@ static u8 boot_configs[][17] = {
                0x87, 0x78, 0x82, 0x52, 0x09, 0x57, 0xa0, 0x30, 0x40,
                0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
        },
+       {
+               (NOR_COMPATIBLE),
+               0x87, 0x78, 0xa2, 0x56, 0x09, 0x57, 0xa0, 0x30, 0x40,
+               0x08, 0x23, 0x50, 0x0d, 0x05, 0x00, 0x00
+       },
        {
                (NAND_COMPATIBLE | NOR_COMPATIBLE),
                0x87, 0x78, 0xa2, 0x52, 0x09, 0xd7, 0xa0, 0x30, 0x40,
@@ -200,8 +207,12 @@ static int do_bootstrap(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        }
 
        /* check CPLD register +5 for PCI 66MHz flag */
-       if (in8(CFG_BCSR_BASE + 5) & 0x01)
-               buf[5] += 0x10;
+       if ((in_8((void *)(CFG_BCSR_BASE + 5)) & CFG_BCSR5_PCI66EN) == 0)
+               /*
+                * PLB-to-PCI divisor = 3 for 33MHz sync PCI
+                * instead of 2 for 66MHz systems
+                */
+               buf[5] |= 0x08;
 
        if (i2c_write(I2C_EEPROM_ADDR, 0, 1, buf, 16) != 0)
                printf("Error writing to EEPROM at address 0x%x\n", I2C_EEPROM_ADDR);
index f823117687e70fc27bb083894a6515ee1ba2e7df..4e47ab395b4ff22de9ec1589fac93b574ed669c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * (C) Copyright 2006
@@ -24,6 +24,7 @@
 
 #include <common.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 #include <ppc440.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -362,8 +363,8 @@ int checkboard(void)
        printf("Board: Rainier - AMCC PPC440GRx Evaluation Board");
 #endif
 
-       rev = in8(CFG_BCSR_BASE + 0);
-       val = in8(CFG_BCSR_BASE + 5) & 0x01;
+       rev = in_8((void *)(CFG_BCSR_BASE + 0));
+       val = in_8((void *)(CFG_BCSR_BASE + 5)) & CFG_BCSR5_PCI66EN;
        printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
 
        if (s != NULL) {
index 912f09ee4395b62c52f25fa12ecda59d6ecd8e00..6ec922ab0074a74c796ea05ab052fca64d09ded7 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * (C) Copyright 2006-2007
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -22,6 +24,7 @@
 #include <common.h>
 #include <ppc4xx.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 #include <spd_sdram.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -181,8 +184,8 @@ int checkboard(void)
        printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
 #endif
 
-       rev = *(u8 *)(CFG_CPLD + 0);
-       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
+       rev = in_8((void *)(CFG_BCSR_BASE + 0));
+       val = in_8((void *)(CFG_BCSR_BASE + 5)) & CFG_BCSR5_PCI66EN;
        printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
 
        if (s != NULL) {
index d79f2eb2e82ba5eac3e598e9ed1f7331f1296402..e4f96e8848dbff691d60a0197dd834ae527958f7 100644 (file)
@@ -79,19 +79,19 @@ int pib_init(void)
 
        printf("QOC3 ATM card on PMC0\n");
 #elif defined(CONFIG_MPC832XEMDS)
-       val = 0;
-       i2c_write(0x26, 0x7, 1, &val, 1);
-       val = 0xf7;
-       i2c_write(0x26, 0x3, 1, &val, 1);
-
-       val = 0;
-       i2c_write(0x21, 0x6, 1, &val, 1);
-       i2c_write(0x21, 0x7, 1, &val, 1);
-
-       val = 0xdf;
-       i2c_write(0x21, 0x2, 1, &val, 1);
-       val = 0xef;
-       i2c_write(0x21, 0x3, 1, &val, 1);
+       val8 = 0;
+       i2c_write(0x26, 0x7, 1, &val8, 1);
+       val8 = 0xf7;
+       i2c_write(0x26, 0x3, 1, &val8, 1);
+
+       val8 = 0;
+       i2c_write(0x21, 0x6, 1, &val8, 1);
+       i2c_write(0x21, 0x7, 1, &val8, 1);
+
+       val8 = 0xdf;
+       i2c_write(0x21, 0x2, 1, &val8, 1);
+       val8 = 0xef;
+       i2c_write(0x21, 0x3, 1, &val8, 1);
 
        eieio();
 
index 6ebedfbc8333d38d400d993ffc1675a236a34343..d8163494e826aba8a28302ee64c34787dad137e2 100644 (file)
@@ -466,7 +466,7 @@ U_BOOT_CMD(
        "\t'arg' can be the address of an initrd image\n"
 #if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        "\tWhen booting a Linux kernel which requires a flat device-tree\n"
-       "\ta third argument is required which is the address of the of the\n"
+       "\ta third argument is required which is the address of the\n"
        "\tdevice-tree blob. To boot that kernel without an initrd image,\n"
        "\tuse a '-' for the second argument. If you do not pass a third\n"
        "\ta bd_info struct will be passed instead\n"
index 8da95bf9d39385d486634a34a9388cfcc823751e..804d467f251f3aaa13fd4c00e642454d23c67f3b 100644 (file)
@@ -57,7 +57,7 @@ int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 
 U_BOOT_CMD(
          dtt,  1,      1,      do_dtt,
-         "dtt     - Digital Thermometer and Themostat\n",
+         "dtt     - Digital Thermometer and Thermostat\n",
          "        - Read temperature from digital thermometer and thermostat.\n"
 );
 
index 8e2bc7adcc9814b4516a03325908ae3c265f0bd6..b21af10d0ba090ef504911befa970ec96133b4d4 100644 (file)
@@ -113,9 +113,9 @@ static const char hcd_name[] = "isp116x-hcd";
 
 struct isp116x isp116x_dev;
 struct isp116x_platform_data isp116x_board;
-int got_rhsc = 0;              /* root hub status change */
+static int got_rhsc;           /* root hub status change */
 struct usb_device *devgone;    /* device which was disconnected */
-int rh_devnum = 0;             /* address of Root Hub endpoint */
+static int rh_devnum;          /* address of Root Hub endpoint */
 
 /* ------------------------------------------------------------------------- */
 
@@ -522,11 +522,13 @@ static int unpack_fifo(struct isp116x *isp116x, struct usb_device *dev,
                done += PTD_GET_LEN(&ptd[i]);
 
                cc = PTD_GET_CC(&ptd[i]);
-               if (cc == TD_DATAUNDERRUN) {    /* underrun is no error... */
-                       DBG("allowed data underrun");
-                       cc = TD_CC_NOERROR;
-               }
-               if (cc != TD_CC_NOERROR && ret == TD_CC_NOERROR)
+
+               /* Data underrun means basically that we had more buffer space than
+                * the function had data. It is perfectly normal but upper levels have
+                * to know how much we actually transferred.
+                */
+               if (cc == TD_NOTACCESSED ||
+                               (cc != TD_CC_NOERROR && (ret == TD_CC_NOERROR || ret == TD_DATAUNDERRUN)))
                        ret = cc;
        }
 
@@ -592,11 +594,19 @@ static int isp116x_interrupt(struct isp116x *isp116x)
        return ret;
 }
 
-#define PTD_NUM                        64      /* it should be enougth... */
-struct ptd ptd[PTD_NUM];
+/* With one PTD we can transfer almost 1K in one go;
+ * HC does the splitting into endpoint digestible transactions
+ */
+struct ptd ptd[1];
+
 static inline int max_transfer_len(struct usb_device *dev, unsigned long pipe)
 {
-       return min(PTD_NUM * usb_maxpacket(dev, pipe), PTD_NUM * 16);
+       unsigned mpck = usb_maxpacket(dev, pipe);
+
+       /* One PTD can transfer 1023 bytes but try to always
+        * transfer multiples of endpoint buffer size
+        */
+       return 1023 / mpck * mpck;
 }
 
 /* Do an USB transfer
@@ -610,13 +620,21 @@ static int isp116x_submit_job(struct usb_device *dev, unsigned long pipe,
        int max = usb_maxpacket(dev, pipe);
        int dir_out = usb_pipeout(pipe);
        int speed_low = usb_pipeslow(pipe);
-       int i, done, stat, timeout, cc;
-       int retries = 10;
+       int i, done = 0, stat, timeout, cc;
+
+       /* 500 frames or 0.5s timeout when function is busy and NAKs transactions for a while */
+       int retries = 500;
 
        DBG("------------------------------------------------");
        dump_msg(dev, pipe, buffer, len, "SUBMIT");
        DBG("------------------------------------------------");
 
+       if (len >= 1024) {
+               ERR("Too big job");
+               dev->status = USB_ST_CRC_ERR;
+               return -1;
+       }
+
        if (isp116x->disabled) {
                ERR("EPIPE");
                dev->status = USB_ST_CRC_ERR;
@@ -653,29 +671,15 @@ static int isp116x_submit_job(struct usb_device *dev, unsigned long pipe,
        isp116x_write_reg32(isp116x, HCINTSTAT, 0xff);
 
        /* Prepare the PTD data */
-       done = 0;
-       i = 0;
-       do {
-               ptd[i].count = PTD_CC_MSK | PTD_ACTIVE_MSK |
-                   PTD_TOGGLE(usb_gettoggle(dev, epnum, dir_out));
-               ptd[i].mps = PTD_MPS(max) | PTD_SPD(speed_low) | PTD_EP(epnum);
-               ptd[i].len = PTD_LEN(max > len - done ? len - done : max) |
-                   PTD_DIR(dir);
-               ptd[i].faddr = PTD_FA(usb_pipedevice(pipe));
-
-               usb_dotoggle(dev, epnum, dir_out);
-               done += PTD_GET_LEN(&ptd[i]);
-               i++;
-               if (i >= PTD_NUM) {
-                       ERR("****** Cannot pack buffer! ******");
-                       dev->status = USB_ST_BUF_ERR;
-                       return -1;
-               }
-       } while (done < len);
-       ptd[i - 1].mps |= PTD_LAST_MSK;
+       ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK |
+               PTD_TOGGLE(usb_gettoggle(dev, epnum, dir_out));
+       ptd->mps = PTD_MPS(max) | PTD_SPD(speed_low) | PTD_EP(epnum) | PTD_LAST_MSK;
+       ptd->len = PTD_LEN(len) | PTD_DIR(dir);
+       ptd->faddr = PTD_FA(usb_pipedevice(pipe));
 
+retry_same:
        /* Pack data into FIFO ram */
-       pack_fifo(isp116x, dev, pipe, ptd, i, buffer, len);
+       pack_fifo(isp116x, dev, pipe, ptd, 1, buffer, len);
 #ifdef EXTRA_DELAY
        wait_ms(EXTRA_DELAY);
 #endif
@@ -738,17 +742,42 @@ static int isp116x_submit_job(struct usb_device *dev, unsigned long pipe,
        }
 
        /* Unpack data from FIFO ram */
-       cc = unpack_fifo(isp116x, dev, pipe, ptd, i, buffer, len);
+       cc = unpack_fifo(isp116x, dev, pipe, ptd, 1, buffer, len);
+
+       i = PTD_GET_COUNT(ptd);
+       done += i;
+       buffer += i;
+       len -= i;
 
-       /* Mmm... sometime we get 0x0f as cc which is a non sense!
-        * Just retry the transfer...
+       /* There was some kind of real problem; Prepare the PTD again
+        * and retry from the failed transaction on
         */
-       if (cc == 0x0f && retries-- > 0) {
-               usb_dotoggle(dev, epnum, dir_out);
-               goto retry;
+       if (cc && cc != TD_NOTACCESSED && cc != TD_DATAUNDERRUN) {
+               if (retries >= 100) {
+                       retries -= 100;
+                       /* The chip will have toggled the toggle bit for the failed
+                        * transaction too. We have to toggle it back.
+                        */
+                       usb_settoggle(dev, epnum, dir_out, !PTD_GET_TOGGLE(ptd));
+                       goto retry;
+               }
+       }
+       /* "Normal" errors; TD_NOTACCESSED would mean in effect that the function have NAKed
+        * the transactions from the first on for the whole frame. It may be busy and we retry
+        * with the same PTD. PTD_ACTIVE (and not TD_NOTACCESSED) would mean that some of the
+        * PTD didn't make it because the function was busy or the frame ended before the PTD
+        * finished. We prepare the rest of the data and try again.
+        */
+       else if (cc == TD_NOTACCESSED || PTD_GET_ACTIVE(ptd) || (cc != TD_DATAUNDERRUN && PTD_GET_COUNT(ptd) < PTD_GET_LEN(ptd))) {
+               if (retries) {
+                       --retries;
+                       if (cc == TD_NOTACCESSED && PTD_GET_ACTIVE(ptd) && !PTD_GET_COUNT(ptd)) goto retry_same;
+                       usb_settoggle(dev, epnum, dir_out, PTD_GET_TOGGLE(ptd));
+                       goto retry;
+               }
        }
 
-       if (cc != TD_CC_NOERROR) {
+       if (cc != TD_CC_NOERROR && cc != TD_DATAUNDERRUN) {
                DBG("****** completition code error %x ******", cc);
                switch (cc) {
                case TD_CC_BITSTUFFING:
@@ -766,6 +795,7 @@ static int isp116x_submit_job(struct usb_device *dev, unsigned long pipe,
                }
                return -cc;
        }
+       else usb_settoggle(dev, epnum, dir_out, PTD_GET_TOGGLE(ptd));
 
        dump_msg(dev, pipe, buffer, len, "SUBMIT(ret)");
 
@@ -1369,6 +1399,8 @@ int usb_lowlevel_init(void)
 
        DBG("");
 
+       got_rhsc = rh_devnum = 0;
+
        /* Init device registers addr */
        isp116x->addr_reg = (u16 *) ISP116X_HCD_ADDR;
        isp116x->data_reg = (u16 *) ISP116X_HCD_DATA;
index c2e1386217f9dcda7f28ea8162ba0da016316062..600f98cf0d40525fa758057d8a273664f3dec8a1 100644 (file)
 #define CFG_EBC_PB2AP          0x24814580
 #define CFG_EBC_PB2CR          (CFG_BCSR_BASE | 0x38000)
 
+#define CFG_BCSR5_PCI66EN      0x80
+
 /*-----------------------------------------------------------------------
  * NAND FLASH
  *----------------------------------------------------------------------*/
index 6a5b7f1eaacd4b38e07d22f56757e22a784c57e3..35bce4af904905075a9e7c37e2650756eb5b6162 100644 (file)
 #define CFG_EBC_PB2AP          0x04814500
 #define CFG_EBC_PB2CR          (CFG_CPLD | 0x18000)
 
+#define CFG_BCSR5_PCI66EN      0x80
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */