]> git.sur5r.net Git - u-boot/blobdiff - board/tqc/tqm8xx/tqm8xx.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[u-boot] / board / tqc / tqm8xx / tqm8xx.c
index e065d69dd4685ba72d27119b3332eb7df8d7e158..9ce2a5739f321b936c884d29f6f7621661fbf4d2 100644 (file)
@@ -2,31 +2,20 @@
  * (C) Copyright 2000-2008
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <hwconfig.h>
 #include <mpc8xx.h>
 #ifdef CONFIG_PS2MULT
 #include <ps2mult.h>
 #endif
 
+#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
+#include <libfdt.h>
+#endif
+
 extern flash_info_t flash_info[];      /* FLASH chips info */
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -101,31 +90,33 @@ const uint sdram_table[] =
 
 int checkboard (void)
 {
-       char *s = getenv ("serial#");
+       char buf[64];
+       int i;
+       int l = getenv_f("serial#", buf, sizeof(buf));
 
        puts ("Board: ");
 
-       if (!s || strncmp (s, "TQM8", 4)) {
+       if (l < 0 || strncmp(buf, "TQM8", 4)) {
                puts ("### No HW ID - assuming TQM8xxL\n");
                return (0);
        }
 
-       if ((*(s + 6) == 'L')) {        /* a TQM8xxL type */
+       if ((buf[6] == 'L')) {  /* a TQM8xxL type */
                gd->board_type = 'L';
        }
 
-       if ((*(s + 6) == 'M')) {        /* a TQM8xxM type */
+       if ((buf[6] == 'M')) {  /* a TQM8xxM type */
                gd->board_type = 'M';
        }
 
-       if ((*(s + 6) == 'D')) {        /* a TQM885D type */
+       if ((buf[6] == 'D')) {  /* a TQM885D type */
                gd->board_type = 'D';
        }
 
-       for (; *s; ++s) {
-               if (*s == ' ')
+       for (i = 0; i < l; ++i) {
+               if (buf[i] == ' ')
                        break;
-               putc (*s);
+               putc (buf[i]);
        }
 #ifdef CONFIG_VIRTLAB2
        puts (" (Virtlab2)");
@@ -425,35 +416,15 @@ static long int dram_size (long int mamr_value, long int *base, long int maxsize
 
 /* ------------------------------------------------------------------------- */
 
-#ifdef CONFIG_PS2MULT
-
-#ifdef CONFIG_HMI10
-#define BASE_BAUD ( 1843200 / 16 )
-struct serial_state rs_table[] = {
-       { BASE_BAUD, 4,  (void*)0xec140000 },
-       { BASE_BAUD, 2,  (void*)0xec150000 },
-       { BASE_BAUD, 6,  (void*)0xec160000 },
-       { BASE_BAUD, 10, (void*)0xec170000 },
-};
-
-#ifdef CONFIG_BOARD_EARLY_INIT_R
-int board_early_init_r (void)
-{
-       ps2mult_early_init();
-       return (0);
-}
-#endif
-#endif /* CONFIG_HMI10 */
-
-#endif /* CONFIG_PS2MULT */
-
-
 #ifdef CONFIG_MISC_INIT_R
+extern void load_sernum_ethaddr(void);
 int misc_init_r (void)
 {
        volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
        volatile memctl8xx_t *memctl = &immap->im_memctl;
 
+       load_sernum_ethaddr();
+
 #ifdef CONFIG_SYS_OR_TIMING_FLASH_AT_50MHZ
        int scy, trlx, flash_or_timing, clk_diff;
 
@@ -596,6 +567,120 @@ void lcd_show_board_info(void)
 }
 #endif /* CONFIG_LCD_INFO */
 
+/*
+ * Device Tree Support
+ */
+#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
+int fdt_set_node_and_value (void *blob,
+                               char *nodename,
+                               char *regname,
+                               void *var,
+                               int size)
+{
+       int ret = 0;
+       int nodeoffset = 0;
+
+       nodeoffset = fdt_path_offset (blob, nodename);
+       if (nodeoffset >= 0) {
+               ret = fdt_setprop (blob, nodeoffset, regname, var,
+                                       size);
+               if (ret < 0) {
+                       printf("ft_blob_update(): "
+                               "cannot set %s/%s property; err: %s\n",
+                               nodename, regname, fdt_strerror (ret));
+               }
+       } else {
+               printf("ft_blob_update(): "
+                       "cannot find %s node err:%s\n",
+                       nodename, fdt_strerror (nodeoffset));
+       }
+       return ret;
+}
+
+int fdt_del_node_name (void *blob, char *nodename)
+{
+       int ret = 0;
+       int nodeoffset = 0;
+
+       nodeoffset = fdt_path_offset (blob, nodename);
+       if (nodeoffset >= 0) {
+               ret = fdt_del_node (blob, nodeoffset);
+               if (ret < 0) {
+                       printf("%s: cannot delete %s; err: %s\n",
+                               __func__, nodename, fdt_strerror (ret));
+               }
+       } else {
+               printf("%s: cannot find %s node err:%s\n",
+                       __func__, nodename, fdt_strerror (nodeoffset));
+       }
+       return ret;
+}
+
+int fdt_del_prop_name (void *blob, char *nodename, char *propname)
+{
+       int ret = 0;
+       int nodeoffset = 0;
+
+       nodeoffset = fdt_path_offset (blob, nodename);
+       if (nodeoffset >= 0) {
+               ret = fdt_delprop (blob, nodeoffset, propname);
+               if (ret < 0) {
+                       printf("%s: cannot delete %s %s; err: %s\n",
+                               __func__, nodename, propname,
+                               fdt_strerror (ret));
+               }
+       } else {
+               printf("%s: cannot find %s node err:%s\n",
+                       __func__, nodename, fdt_strerror (nodeoffset));
+       }
+       return ret;
+}
+
+/*
+ * update "brg" property in the blob
+ */
+void ft_blob_update (void *blob, bd_t *bd)
+{
+       uchar enetaddr[6];
+       ulong brg_data = 0;
+
+       /* BRG */
+       brg_data = cpu_to_be32(bd->bi_busfreq);
+       fdt_set_node_and_value(blob,
+                               "/soc/cpm", "brg-frequency",
+                               &brg_data, sizeof(brg_data));
+
+       /* MAC addr */
+       if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
+               fdt_set_node_and_value(blob,
+                                       "ethernet0", "local-mac-address",
+                                       enetaddr, sizeof(u8) * 6);
+       }
+
+       if (hwconfig_arg_cmp("fec", "off")) {
+               /* no FEC on this plattform, delete DTS nodes */
+               fdt_del_node_name (blob, "ethernet1");
+               fdt_del_node_name (blob, "mdio1");
+               /* also the aliases entries */
+               fdt_del_prop_name (blob, "/aliases", "ethernet1");
+               fdt_del_prop_name (blob, "/aliases", "mdio1");
+       } else {
+               /* adjust local-mac-address for FEC ethernet */
+               if (eth_getenv_enetaddr("eth1addr", enetaddr)) {
+                       fdt_set_node_and_value(blob,
+                                       "ethernet1", "local-mac-address",
+                                       enetaddr, sizeof(u8) * 6);
+               }
+       }
+}
+
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       ft_cpu_setup(blob, bd);
+       ft_blob_update(blob, bd);
+}
+#endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
+
 /* ---------------------------------------------------------------------------- */
 /* TK885D specific initializaion                                               */
 /* ---------------------------------------------------------------------------- */
@@ -623,15 +708,15 @@ int last_stage_init(void)
                return 0;
 
        for (i = 0; i < 2; i++) {
-               ret = miiphy_read("FEC ETHERNET", phy[i], PHY_BMCR, &reg);
+               ret = miiphy_read("FEC", phy[i], MII_BMCR, &reg);
                if (ret) {
                        printf("Cannot read BMCR on PHY %d\n", phy[i]);
                        return 0;
                }
                /* Auto-negotiation off, hard set full duplex, 100Mbps */
-               ret = miiphy_write("FEC ETHERNET", phy[i],
-                                  PHY_BMCR, (reg | PHY_BMCR_100MB |
-                                             PHY_BMCR_DPLX) & ~PHY_BMCR_AUTON);
+               ret = miiphy_write("FEC", phy[i],
+                                  MII_BMCR, (reg | BMCR_SPEED100 |
+                                             BMCR_FULLDPLX) & ~BMCR_ANENABLE);
                if (ret) {
                        printf("Cannot write BMCR on PHY %d\n", phy[i]);
                        return 0;