mmc: move more driver config options to Kconfig
[oweals/u-boot.git] / board / davinci / da8xxevm / da850evm.c
index beb56575e3bffe4e5b5382b24687517bd259d756..37d2f54d3bdd9bbed85ed82622c2a7d24b8b7541 100644 (file)
@@ -6,19 +6,7 @@
  * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
  *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <spi.h>
 #include <spi_flash.h>
 #include <asm/arch/hardware.h>
-#include <asm/arch/emif_defs.h>
+#include <asm/ti-common/davinci_nand.h>
 #include <asm/arch/emac_defs.h>
 #include <asm/arch/pinmux_defs.h>
 #include <asm/io.h>
 #include <asm/arch/davinci_misc.h>
-#include <asm/errno.h>
+#include <linux/errno.h>
 #include <hwconfig.h>
 
+#ifdef CONFIG_MMC_DAVINCI
+#include <mmc.h>
+#include <asm/arch/sdmmc_defs.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_DRIVER_TI_EMAC
@@ -132,13 +125,17 @@ int misc_init_r(void)
 {
        dspwake();
 
-#ifdef CONFIG_MAC_ADDR_IN_SPIFLASH
+#if defined(CONFIG_MAC_ADDR_IN_SPIFLASH) || defined(CONFIG_MAC_ADDR_IN_EEPROM)
+
        uchar env_enetaddr[6];
        int enetaddr_found;
+
+       enetaddr_found = eth_getenv_enetaddr("ethaddr", env_enetaddr);
+
+#ifdef CONFIG_MAC_ADDR_IN_SPIFLASH
        int spi_mac_read;
        uchar buff[6];
 
-       enetaddr_found = eth_getenv_enetaddr("ethaddr", env_enetaddr);
        spi_mac_read = get_mac_addr(buff);
 
        /*
@@ -148,7 +145,7 @@ int misc_init_r(void)
         */
        if (!enetaddr_found) {
                if (!spi_mac_read) {
-                       if (is_valid_ether_addr(buff)) {
+                       if (is_valid_ethaddr(buff)) {
                                if (eth_setenv_enetaddr("ethaddr", buff)) {
                                        printf("Warning: Failed to "
                                        "set MAC address from SPI flash\n");
@@ -163,21 +160,69 @@ int misc_init_r(void)
                 * MAC address present in environment compare it with
                 * the MAC address in SPI flash and warn on mismatch
                 */
-               if (!spi_mac_read && is_valid_ether_addr(buff) &&
-                                               memcmp(env_enetaddr, buff, 6))
+               if (!spi_mac_read && is_valid_ethaddr(buff) &&
+                   memcmp(env_enetaddr, buff, 6))
                        printf("Warning: MAC address in SPI flash don't match "
                                        "with the MAC address in the environment\n");
-                       printf("Default using MAC address from environment\n");
+               printf("Default using MAC address from environment\n");
        }
+#endif
+       uint8_t enetaddr[8];
+       int eeprom_mac_read;
+
+       /* Read Ethernet MAC address from EEPROM */
+       eeprom_mac_read = dvevm_read_mac_address(enetaddr);
+
+       /*
+        * MAC address not present in the environment
+        * try and read the MAC address from EEPROM flash
+        * and set it.
+        */
+       if (!enetaddr_found) {
+               if (eeprom_mac_read)
+                       /* Set Ethernet MAC address from EEPROM */
+                       davinci_sync_env_enetaddr(enetaddr);
+       } else {
+               /*
+                * MAC address present in environment compare it with
+                * the MAC address in EEPROM and warn on mismatch
+                */
+               if (eeprom_mac_read && memcmp(enetaddr, env_enetaddr, 6))
+                       printf("Warning: MAC address in EEPROM don't match "
+                                       "with the MAC address in the environment\n");
+               printf("Default using MAC address from environment\n");
+       }
+
 #endif
        return 0;
 }
 
+#ifdef CONFIG_MMC_DAVINCI
+static struct davinci_mmc mmc_sd0 = {
+       .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
+       .host_caps = MMC_MODE_4BIT,     /* DA850 supports only 4-bit SD/MMC */
+       .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
+       .version = MMC_CTLR_VERSION_2,
+};
+
+int board_mmc_init(bd_t *bis)
+{
+       mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
+
+       /* Add slot-0 to mmc subsystem */
+       return davinci_mmc_init(bis, &mmc_sd0);
+}
+#endif
+
 static const struct pinmux_config gpio_pins[] = {
 #ifdef CONFIG_USE_NOR
        /* GP0[11] is required for NOR to work on Rev 3 EVMs */
        { pinmux(0), 8, 4 },    /* GP0[11] */
 #endif
+#ifdef CONFIG_MMC_DAVINCI
+       /* GP0[11] is required for SD to work on Rev 3 EVMs */
+       { pinmux(0),  8, 4 },   /* GP0[11] */
+#endif
 };
 
 const struct pinmux_resource pinmuxes[] = {
@@ -205,6 +250,9 @@ const struct pinmux_resource pinmuxes[] = {
        PINMUX_ITEM(emifa_pins_nor),
 #endif
        PINMUX_ITEM(gpio_pins),
+#ifdef CONFIG_MMC_DAVINCI
+       PINMUX_ITEM(mmc0_pins),
+#endif
 };
 
 const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
@@ -215,6 +263,9 @@ const struct lpsc_resource lpsc[] = {
        { DAVINCI_LPSC_EMAC },  /* image download */
        { DAVINCI_LPSC_UART2 }, /* console */
        { DAVINCI_LPSC_GPIO },
+#ifdef CONFIG_MMC_DAVINCI
+       { DAVINCI_LPSC_MMC_SD },
+#endif
 };
 
 const int lpsc_size = ARRAY_SIZE(lpsc);
@@ -272,10 +323,6 @@ int board_early_init_f(void)
 
 int board_init(void)
 {
-#ifdef CONFIG_USE_NOR
-       u32 val;
-#endif
-
 #ifndef CONFIG_USE_IRQ
        irq_init();
 #endif
@@ -285,11 +332,11 @@ int board_init(void)
         * NAND CS setup - cycle counts based on da850evm NAND timings in the
         * Linux kernel @ 25MHz EMIFA
         */
-       writel((DAVINCI_ABCR_WSETUP(0) |
-               DAVINCI_ABCR_WSTROBE(1) |
-               DAVINCI_ABCR_WHOLD(0) |
-               DAVINCI_ABCR_RSETUP(0) |
-               DAVINCI_ABCR_RSTROBE(1) |
+       writel((DAVINCI_ABCR_WSETUP(2) |
+               DAVINCI_ABCR_WSTROBE(2) |
+               DAVINCI_ABCR_WHOLD(1) |
+               DAVINCI_ABCR_RSETUP(1) |
+               DAVINCI_ABCR_RSTROBE(4) |
                DAVINCI_ABCR_RHOLD(0) |
                DAVINCI_ABCR_TA(1) |
                DAVINCI_ABCR_ASIZE_8BIT),
@@ -315,12 +362,18 @@ int board_init(void)
 
 #ifdef CONFIG_USE_NOR
        /* Set the GPIO direction as output */
-       clrbits_be32((u32 *)GPIO_BANK0_REG_DIR_ADDR, (0x01 << 11));
+       clrbits_le32((u32 *)GPIO_BANK0_REG_DIR_ADDR, (0x01 << 11));
 
        /* Set the output as low */
-       val = readl(GPIO_BANK0_REG_SET_ADDR);
-       val |= (0x01 << 11);
-       writel(val, GPIO_BANK0_REG_CLR_ADDR);
+       writel(0x01 << 11, GPIO_BANK0_REG_CLR_ADDR);
+#endif
+
+#ifdef CONFIG_MMC_DAVINCI
+       /* Set the GPIO direction as output */
+       clrbits_le32((u32 *)GPIO_BANK0_REG_DIR_ADDR, (0x01 << 11));
+
+       /* Set the output as high */
+       writel(0x01 << 11, GPIO_BANK0_REG_SET_ADDR);
 #endif
 
 #ifdef CONFIG_DRIVER_TI_EMAC