This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/AM3358: How to configure eMMC in uboot ?

Part Number: AM3358
Other Parts Discussed in Thread: TLV320AIC3106, TPS65910, WL1271

Tool/software: Linux

Dear all

How to configure eMMC in uboot ? eMMC is  MTFC4GLDEA-0M.

The MMC0 interface connect to TF which is u-boot, the MMC1 interface connect to eMMC

ti-processor-sdk-linux-am335x-evm-05.00.00.15-Linux-x86-Install.bin

  • Hello Went,

    Enter the pinmux settings in your board's device tree and <Processor SDK>/u-boot-<version>/board/ti/am335x/mux.c file and that is all.

    Best regards,
    Kemal

  • /*
     * mux.c
     *
     * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
     *
     * 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 version 2.
     *
     * This program is distributed "as is" WITHOUT ANY WARRANTY of any
     * kind, whether express or implied; without even the implied warranty
     * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     * GNU General Public License for more details.
     */

    #include <common.h>
    #include <asm/arch/sys_proto.h>
    #include <asm/arch/hardware.h>
    #include <asm/arch/mux.h>
    #include <asm/io.h>
    #include <i2c.h>
    #include "../common/board_detect.h"
    #include "board.h"

    static struct module_pin_mux uart0_pin_mux[] = {
     {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART0_RXD */
     {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)},  /* UART0_TXD */
     {-1},
    };

    static struct module_pin_mux uart1_pin_mux[] = {
     {OFFSET(uart1_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART1_RXD */
     {OFFSET(uart1_txd), (MODE(0) | PULLUDEN)},  /* UART1_TXD */
     {-1},
    };

    static struct module_pin_mux uart2_pin_mux[] = {
     {OFFSET(spi0_sclk), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART2_RXD */
     {OFFSET(spi0_d0), (MODE(1) | PULLUDEN)},  /* UART2_TXD */
     {-1},
    };

    static struct module_pin_mux uart3_pin_mux[] = {
     {OFFSET(spi0_cs1), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART3_RXD */
     {OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)}, /* UART3_TXD */
     {-1},
    };

    static struct module_pin_mux uart4_pin_mux[] = {
     {OFFSET(gpmc_wait0), (MODE(6) | PULLUP_EN | RXACTIVE)}, /* UART4_RXD */
     {OFFSET(gpmc_wpn), (MODE(6) | PULLUDEN)},  /* UART4_TXD */
     {-1},
    };

    static struct module_pin_mux uart5_pin_mux[] = {
     {OFFSET(lcd_data9), (MODE(4) | PULLUP_EN | RXACTIVE)}, /* UART5_RXD */
     {OFFSET(lcd_data8), (MODE(4) | PULLUDEN)},  /* UART5_TXD */
     {-1},
    };

    static struct module_pin_mux mmc0_pin_mux[] = {
     {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
     {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
     {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
     {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
     {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
     {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
     {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)},  /* MMC0_WP */
     {OFFSET(spi0_cs1), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* GPIO0_6 */
     {-1},
    };

    static struct module_pin_mux mmc0_no_cd_pin_mux[] = {
     {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
     {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
     {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
     {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
     {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
     {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
     {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)},  /* MMC0_WP */
     {-1},
    };

    static struct module_pin_mux mmc0_pin_mux_sk_evm[] = {
     {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
     {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
     {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
     {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
     {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
     {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
     {OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
     {-1},
    };

    static struct module_pin_mux mmc1_pin_mux[] = {
     {OFFSET(gpmc_ad7),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT7 */
     {OFFSET(gpmc_ad6),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT6 */
     {OFFSET(gpmc_ad5),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT5 */
     {OFFSET(gpmc_ad4),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT4 */
     {OFFSET(gpmc_ad3),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT3 */
     {OFFSET(gpmc_ad2),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT2 */
     {OFFSET(gpmc_ad1),  (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT1 */
     {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT0 */
     {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
     {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
     /*{OFFSET(gpmc_csn0), (MODE(7) | RXACTIVE | PULLUP_EN)},*/ /* MMC1_WP */
     /*{OFFSET(gpmc_advn_ale), (MODE(7) | RXACTIVE | PULLUP_EN)},*/ /* MMC1_CD */
     {-1},
    };

    static struct module_pin_mux i2c0_pin_mux[] = {
     {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE |
       PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
     {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE |
       PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
     {-1},
    };

    static struct module_pin_mux i2c1_pin_mux[] = {
     {OFFSET(spi0_d1), (MODE(2) | RXACTIVE |
       PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
     {OFFSET(spi0_cs0), (MODE(2) | RXACTIVE |
       PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
     {-1},
    };

    static struct module_pin_mux spi0_pin_mux[] = {
     {OFFSET(spi0_sclk), (MODE(0) | RXACTIVE | PULLUDEN)}, /* SPI0_SCLK */
     {OFFSET(spi0_d0), (MODE(0) | RXACTIVE |
       PULLUDEN | PULLUP_EN)},   /* SPI0_D0 */
     {OFFSET(spi0_d1), (MODE(0) | RXACTIVE | PULLUDEN)}, /* SPI0_D1 */
     {OFFSET(spi0_cs0), (MODE(0) | RXACTIVE |
       PULLUDEN | PULLUP_EN)},   /* SPI0_CS0 */
     {-1},
    };

    static struct module_pin_mux gpio0_7_pin_mux[] = {
     {OFFSET(ecap0_in_pwm0_out), (MODE(7) | PULLUDEN)}, /* GPIO0_7 */
     {-1},
    };

    static struct module_pin_mux gpio0_18_pin_mux[] = {
     {OFFSET(usb0_drvvbus), (MODE(7) | PULLUDEN)}, /* GPIO0_18 */
     {-1},
    };

    static struct module_pin_mux rgmii1_pin_mux[] = {
     {OFFSET(mii1_txen), MODE(2)},   /* RGMII1_TCTL */
     {OFFSET(mii1_rxdv), MODE(2) | RXACTIVE}, /* RGMII1_RCTL */
     {OFFSET(mii1_txd3), MODE(2)},   /* RGMII1_TD3 */
     {OFFSET(mii1_txd2), MODE(2)},   /* RGMII1_TD2 */
     {OFFSET(mii1_txd1), MODE(2)},   /* RGMII1_TD1 */
     {OFFSET(mii1_txd0), MODE(2)},   /* RGMII1_TD0 */
     {OFFSET(mii1_txclk), MODE(2)},   /* RGMII1_TCLK */
     {OFFSET(mii1_rxclk), MODE(2) | RXACTIVE}, /* RGMII1_RCLK */
     {OFFSET(mii1_rxd3), MODE(2) | RXACTIVE}, /* RGMII1_RD3 */
     {OFFSET(mii1_rxd2), MODE(2) | RXACTIVE}, /* RGMII1_RD2 */
     {OFFSET(mii1_rxd1), MODE(2) | RXACTIVE}, /* RGMII1_RD1 */
     {OFFSET(mii1_rxd0), MODE(2) | RXACTIVE}, /* RGMII1_RD0 */
     {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN},/* MDIO_DATA */
     {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
     {-1},
    };

    static struct module_pin_mux mii1_pin_mux[] = {
     {OFFSET(mii1_rxerr), MODE(0) | RXACTIVE}, /* MII1_RXERR */
     {OFFSET(mii1_txen), MODE(0)},   /* MII1_TXEN */
     {OFFSET(mii1_rxdv), MODE(0) | RXACTIVE}, /* MII1_RXDV */
     {OFFSET(mii1_txd3), MODE(0)},   /* MII1_TXD3 */
     {OFFSET(mii1_txd2), MODE(0)},   /* MII1_TXD2 */
     {OFFSET(mii1_txd1), MODE(0)},   /* MII1_TXD1 */
     {OFFSET(mii1_txd0), MODE(0)},   /* MII1_TXD0 */
     {OFFSET(mii1_txclk), MODE(0) | RXACTIVE}, /* MII1_TXCLK */
     {OFFSET(mii1_rxclk), MODE(0) | RXACTIVE}, /* MII1_RXCLK */
     {OFFSET(mii1_rxd3), MODE(0) | RXACTIVE}, /* MII1_RXD3 */
     {OFFSET(mii1_rxd2), MODE(0) | RXACTIVE}, /* MII1_RXD2 */
     {OFFSET(mii1_rxd1), MODE(0) | RXACTIVE}, /* MII1_RXD1 */
     {OFFSET(mii1_rxd0), MODE(0) | RXACTIVE}, /* MII1_RXD0 */
     {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
     {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
     {-1},
    };

    static struct module_pin_mux rmii1_pin_mux[] = {
     {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
     {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
     {OFFSET(mii1_crs), MODE(1) | RXACTIVE},  /* MII1_CRS */
     {OFFSET(mii1_rxerr), MODE(1) | RXACTIVE}, /* MII1_RXERR */
     {OFFSET(mii1_txen), MODE(1)},   /* MII1_TXEN */
     {OFFSET(mii1_txd1), MODE(1)},   /* MII1_TXD1 */
     {OFFSET(mii1_txd0), MODE(1)},   /* MII1_TXD0 */
     {OFFSET(mii1_rxd1), MODE(1) | RXACTIVE}, /* MII1_RXD1 */
     {OFFSET(mii1_rxd0), MODE(1) | RXACTIVE}, /* MII1_RXD0 */
     {OFFSET(rmii1_refclk), MODE(0) | RXACTIVE}, /* RMII1_REFCLK */
     {-1},
    };

    #ifdef CONFIG_NAND
    static struct module_pin_mux nand_pin_mux[] = {
     {OFFSET(gpmc_ad0), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD0  */
     {OFFSET(gpmc_ad1), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD1  */
     {OFFSET(gpmc_ad2), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD2  */
     {OFFSET(gpmc_ad3), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD3  */
     {OFFSET(gpmc_ad4), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD4  */
     {OFFSET(gpmc_ad5), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD5  */
     {OFFSET(gpmc_ad6), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD6  */
     {OFFSET(gpmc_ad7), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD7  */
    #ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
     {OFFSET(gpmc_ad8), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD8  */
     {OFFSET(gpmc_ad9), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD9  */
     {OFFSET(gpmc_ad10), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD10 */
     {OFFSET(gpmc_ad11), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD11 */
     {OFFSET(gpmc_ad12), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD12 */
     {OFFSET(gpmc_ad13), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD13 */
     {OFFSET(gpmc_ad14), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD14 */
     {OFFSET(gpmc_ad15), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD15 */
    #endif
     {OFFSET(gpmc_wait0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* nWAIT */
     {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN)},     /* nWP */
     {OFFSET(gpmc_csn0), (MODE(0) | PULLUP_EN)},     /* nCS */
     {OFFSET(gpmc_wen), (MODE(0) | PULLDOWN_EN)},    /* WEN */
     {OFFSET(gpmc_oen_ren), (MODE(0) | PULLDOWN_EN)},    /* OE */
     {OFFSET(gpmc_advn_ale), (MODE(0) | PULLDOWN_EN)},    /* ADV_ALE */
     {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLDOWN_EN)},    /* BE_CLE */
     {-1},
    };
    #elif defined(CONFIG_NOR)
    static struct module_pin_mux bone_norcape_pin_mux[] = {
     {OFFSET(gpmc_a0), MODE(0) | PULLUDDIS},   /* NOR_A0 */
     {OFFSET(gpmc_a1), MODE(0) | PULLUDDIS},   /* NOR_A1 */
     {OFFSET(gpmc_a2), MODE(0) | PULLUDDIS},   /* NOR_A2 */
     {OFFSET(gpmc_a3), MODE(0) | PULLUDDIS},   /* NOR_A3 */
     {OFFSET(gpmc_a4), MODE(0) | PULLUDDIS},   /* NOR_A4 */
     {OFFSET(gpmc_a5), MODE(0) | PULLUDDIS},   /* NOR_A5 */
     {OFFSET(gpmc_a6), MODE(0) | PULLUDDIS},   /* NOR_A6 */
     {OFFSET(gpmc_a7), MODE(0) | PULLUDDIS},   /* NOR_A7 */
     {OFFSET(gpmc_ad0), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD0 */
     {OFFSET(gpmc_ad1), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD1 */
     {OFFSET(gpmc_ad2), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD2 */
     {OFFSET(gpmc_ad3), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD3 */
     {OFFSET(gpmc_ad4), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD4 */
     {OFFSET(gpmc_ad5), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD5 */
     {OFFSET(gpmc_ad6), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD6 */
     {OFFSET(gpmc_ad7), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD7 */
     {OFFSET(gpmc_ad8), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD8 */
     {OFFSET(gpmc_ad9), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD9 */
     {OFFSET(gpmc_ad10), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD10 */
     {OFFSET(gpmc_ad11), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD11 */
     {OFFSET(gpmc_ad12), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD12 */
     {OFFSET(gpmc_ad13), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD13 */
     {OFFSET(gpmc_ad14), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD14 */
     {OFFSET(gpmc_ad15), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD15 */
     {OFFSET(gpmc_csn0), MODE(0) | PULLUDEN | PULLUP_EN},     /* CE */
     {OFFSET(gpmc_advn_ale), MODE(0) | PULLUDEN | PULLDOWN_EN}, /* ALE */
     {OFFSET(gpmc_oen_ren), MODE(0) | PULLUDEN | PULLDOWN_EN},/* OEn_REN */
     {OFFSET(gpmc_be0n_cle), MODE(0) | PULLUDEN | PULLDOWN_EN},/* unused */
     {OFFSET(gpmc_wen), MODE(0) | PULLUDEN | PULLDOWN_EN},    /* WEN */
     {OFFSET(gpmc_wait0), MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE},/*WAIT*/
     {-1},
    };
    #endif

    static struct module_pin_mux uart3_icev2_pin_mux[] = {
     {OFFSET(mii1_rxd3), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART3_RXD */
     {OFFSET(mii1_rxd2), MODE(1) | PULLUDEN},  /* UART3_TXD */
     {-1},
    };

    #if defined(CONFIG_NOR_BOOT)
    void enable_norboot_pin_mux(void)
    {
     configure_module_pin_mux(bone_norcape_pin_mux);
    }
    #endif

    void enable_uart0_pin_mux(void)
    {
     configure_module_pin_mux(uart0_pin_mux);
    }

    void enable_uart1_pin_mux(void)
    {
     configure_module_pin_mux(uart1_pin_mux);
    }

    void enable_uart2_pin_mux(void)
    {
     configure_module_pin_mux(uart2_pin_mux);
    }

    void enable_uart3_pin_mux(void)
    {
     configure_module_pin_mux(uart3_pin_mux);
    }

    void enable_uart4_pin_mux(void)
    {
     configure_module_pin_mux(uart4_pin_mux);
    }

    void enable_uart5_pin_mux(void)
    {
     configure_module_pin_mux(uart5_pin_mux);
    }

    void enable_i2c0_pin_mux(void)
    {
     configure_module_pin_mux(i2c0_pin_mux);
    }

    /*
     * The AM335x GP EVM, if daughter card(s) are connected, can have 8
     * different profiles.  These profiles determine what peripherals are
     * valid and need pinmux to be configured.
     */
    #define PROFILE_NONE 0x0
    #define PROFILE_0 (1 << 0)
    #define PROFILE_1 (1 << 1)
    #define PROFILE_2 (1 << 2)
    #define PROFILE_3 (1 << 3)
    #define PROFILE_4 (1 << 4)
    #define PROFILE_5 (1 << 5)
    #define PROFILE_6 (1 << 6)
    #define PROFILE_7 (1 << 7)
    #define PROFILE_MASK 0x7
    #define PROFILE_ALL 0xFF

    /* CPLD registers */
    #define I2C_CPLD_ADDR 0x35
    #define CFG_REG  0x10

    static unsigned short detect_daughter_board_profile(void)
    {
     unsigned short val;

     if (i2c_probe(I2C_CPLD_ADDR))
      return PROFILE_NONE;

     if (i2c_read(I2C_CPLD_ADDR, CFG_REG, 1, (unsigned char *)(&val), 2))
      return PROFILE_NONE;

     return (1 << (val & PROFILE_MASK));
    }

    void enable_board_pin_mux(void)
    {
     /* Do board-specific muxes. */
     if (board_is_bone()) {
      /* Beaglebone pinmux */
      configure_module_pin_mux(mii1_pin_mux);
      configure_module_pin_mux(mmc0_pin_mux);
    #if defined(CONFIG_NAND)
      configure_module_pin_mux(nand_pin_mux);
    #elif defined(CONFIG_NOR)
      configure_module_pin_mux(bone_norcape_pin_mux);
    #else
      configure_module_pin_mux(mmc1_pin_mux);
    #endif
     } else if (board_is_gp_evm()) {
      /* General Purpose EVM */
      unsigned short profile = detect_daughter_board_profile();
      configure_module_pin_mux(rgmii1_pin_mux);
      configure_module_pin_mux(mmc0_pin_mux);
      /* In profile #2 i2c1 and spi0 conflict. */
      if (profile & ~PROFILE_2)
       configure_module_pin_mux(i2c1_pin_mux);
      /* Profiles 2 & 3 don't have NAND */
    #ifdef CONFIG_NAND
      if (profile & ~(PROFILE_2 | PROFILE_3))
       configure_module_pin_mux(nand_pin_mux);
    #endif
      else if (profile == PROFILE_2) {
       configure_module_pin_mux(mmc1_pin_mux);
       configure_module_pin_mux(spi0_pin_mux);
      }
     } else if (board_is_idk()) {
      /* Industrial Motor Control (IDK) */
      configure_module_pin_mux(mii1_pin_mux);
      configure_module_pin_mux(mmc0_no_cd_pin_mux);
     } else if (board_is_evm_sk()) {
      /* Starter Kit EVM */
      configure_module_pin_mux(i2c1_pin_mux);
      configure_module_pin_mux(gpio0_7_pin_mux);
      configure_module_pin_mux(rgmii1_pin_mux);
      configure_module_pin_mux(mmc0_pin_mux_sk_evm);
      configure_module_pin_mux(mmc1_pin_mux);
     } else if (board_is_bone_lt()) {
      /* Beaglebone LT pinmux */
      configure_module_pin_mux(mii1_pin_mux);
      configure_module_pin_mux(mmc0_pin_mux);
    #if defined(CONFIG_NAND) && defined(CONFIG_EMMC_BOOT)
      configure_module_pin_mux(nand_pin_mux);
    #elif defined(CONFIG_NOR) && defined(CONFIG_EMMC_BOOT)
      configure_module_pin_mux(bone_norcape_pin_mux);
    #else
      configure_module_pin_mux(mmc1_pin_mux);
    #endif
     } else if (board_is_icev2()) {
      configure_module_pin_mux(mmc0_pin_mux);
      configure_module_pin_mux(gpio0_18_pin_mux);
      configure_module_pin_mux(uart3_icev2_pin_mux);
      configure_module_pin_mux(rmii1_pin_mux);
      configure_module_pin_mux(spi0_pin_mux);
     } else {
      /* Unknown board. We might still be able to boot. */
      puts("Bad EEPROM or unknown board, cannot configure pinmux.");
     }
    }

  • /*
    * mux.c
    *
    * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
    *
    * 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 version 2.
    *
    * This program is distributed "as is" WITHOUT ANY WARRANTY of any
    * kind, whether express or implied; without even the implied warranty
    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU General Public License for more details.
    */

    #include <common.h>
    #include <asm/arch/sys_proto.h>
    #include <asm/arch/hardware.h>
    #include <asm/arch/mux.h>
    #include <asm/io.h>
    #include <i2c.h>
    #include "../common/board_detect.h"
    #include "board.h"

    static struct module_pin_mux uart0_pin_mux[] = {
    {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART0_RXD */
    {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)}, /* UART0_TXD */
    {-1},
    };

    static struct module_pin_mux uart1_pin_mux[] = {
    {OFFSET(uart1_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART1_RXD */
    {OFFSET(uart1_txd), (MODE(0) | PULLUDEN)}, /* UART1_TXD */
    {-1},
    };

    static struct module_pin_mux uart2_pin_mux[] = {
    {OFFSET(spi0_sclk), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART2_RXD */
    {OFFSET(spi0_d0), (MODE(1) | PULLUDEN)}, /* UART2_TXD */
    {-1},
    };

    static struct module_pin_mux uart3_pin_mux[] = {
    {OFFSET(spi0_cs1), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART3_RXD */
    {OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)}, /* UART3_TXD */
    {-1},
    };

    static struct module_pin_mux uart4_pin_mux[] = {
    {OFFSET(gpmc_wait0), (MODE(6) | PULLUP_EN | RXACTIVE)}, /* UART4_RXD */
    {OFFSET(gpmc_wpn), (MODE(6) | PULLUDEN)}, /* UART4_TXD */
    {-1},
    };

    static struct module_pin_mux uart5_pin_mux[] = {
    {OFFSET(lcd_data9), (MODE(4) | PULLUP_EN | RXACTIVE)}, /* UART5_RXD */
    {OFFSET(lcd_data8), (MODE(4) | PULLUDEN)}, /* UART5_TXD */
    {-1},
    };

    static struct module_pin_mux mmc0_pin_mux[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
    {OFFSET(spi0_cs1), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* GPIO0_6 */
    {-1},
    };

    static struct module_pin_mux mmc0_no_cd_pin_mux[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
    {-1},
    };

    static struct module_pin_mux mmc0_pin_mux_sk_evm[] = {
    {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
    {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
    {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
    {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
    {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
    {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
    {OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
    {-1},
    };

    static struct module_pin_mux mmc1_pin_mux[] = {
    {OFFSET(gpmc_ad7), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT7 */
    {OFFSET(gpmc_ad6), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT6 */
    {OFFSET(gpmc_ad5), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT5 */
    {OFFSET(gpmc_ad4), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT4 */
    {OFFSET(gpmc_ad3), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT3 */
    {OFFSET(gpmc_ad2), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT2 */
    {OFFSET(gpmc_ad1), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT1 */
    {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_DAT0 */
    {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
    {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
    /*{OFFSET(gpmc_csn0), (MODE(7) | RXACTIVE | PULLUP_EN)},*/ /* MMC1_WP */
    /*{OFFSET(gpmc_advn_ale), (MODE(7) | RXACTIVE | PULLUP_EN)},*/ /* MMC1_CD */
    {-1},
    };

    static struct module_pin_mux i2c0_pin_mux[] = {
    {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE |
    PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
    {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE |
    PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
    {-1},
    };

    static struct module_pin_mux i2c1_pin_mux[] = {
    {OFFSET(spi0_d1), (MODE(2) | RXACTIVE |
    PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
    {OFFSET(spi0_cs0), (MODE(2) | RXACTIVE |
    PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
    {-1},
    };

    static struct module_pin_mux spi0_pin_mux[] = {
    {OFFSET(spi0_sclk), (MODE(0) | RXACTIVE | PULLUDEN)}, /* SPI0_SCLK */
    {OFFSET(spi0_d0), (MODE(0) | RXACTIVE |
    PULLUDEN | PULLUP_EN)}, /* SPI0_D0 */
    {OFFSET(spi0_d1), (MODE(0) | RXACTIVE | PULLUDEN)}, /* SPI0_D1 */
    {OFFSET(spi0_cs0), (MODE(0) | RXACTIVE |
    PULLUDEN | PULLUP_EN)}, /* SPI0_CS0 */
    {-1},
    };

    static struct module_pin_mux gpio0_7_pin_mux[] = {
    {OFFSET(ecap0_in_pwm0_out), (MODE(7) | PULLUDEN)}, /* GPIO0_7 */
    {-1},
    };

    static struct module_pin_mux gpio0_18_pin_mux[] = {
    {OFFSET(usb0_drvvbus), (MODE(7) | PULLUDEN)}, /* GPIO0_18 */
    {-1},
    };

    static struct module_pin_mux rgmii1_pin_mux[] = {
    {OFFSET(mii1_txen), MODE(2)}, /* RGMII1_TCTL */
    {OFFSET(mii1_rxdv), MODE(2) | RXACTIVE}, /* RGMII1_RCTL */
    {OFFSET(mii1_txd3), MODE(2)}, /* RGMII1_TD3 */
    {OFFSET(mii1_txd2), MODE(2)}, /* RGMII1_TD2 */
    {OFFSET(mii1_txd1), MODE(2)}, /* RGMII1_TD1 */
    {OFFSET(mii1_txd0), MODE(2)}, /* RGMII1_TD0 */
    {OFFSET(mii1_txclk), MODE(2)}, /* RGMII1_TCLK */
    {OFFSET(mii1_rxclk), MODE(2) | RXACTIVE}, /* RGMII1_RCLK */
    {OFFSET(mii1_rxd3), MODE(2) | RXACTIVE}, /* RGMII1_RD3 */
    {OFFSET(mii1_rxd2), MODE(2) | RXACTIVE}, /* RGMII1_RD2 */
    {OFFSET(mii1_rxd1), MODE(2) | RXACTIVE}, /* RGMII1_RD1 */
    {OFFSET(mii1_rxd0), MODE(2) | RXACTIVE}, /* RGMII1_RD0 */
    {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN},/* MDIO_DATA */
    {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
    {-1},
    };

    static struct module_pin_mux mii1_pin_mux[] = {
    {OFFSET(mii1_rxerr), MODE(0) | RXACTIVE}, /* MII1_RXERR */
    {OFFSET(mii1_txen), MODE(0)}, /* MII1_TXEN */
    {OFFSET(mii1_rxdv), MODE(0) | RXACTIVE}, /* MII1_RXDV */
    {OFFSET(mii1_txd3), MODE(0)}, /* MII1_TXD3 */
    {OFFSET(mii1_txd2), MODE(0)}, /* MII1_TXD2 */
    {OFFSET(mii1_txd1), MODE(0)}, /* MII1_TXD1 */
    {OFFSET(mii1_txd0), MODE(0)}, /* MII1_TXD0 */
    {OFFSET(mii1_txclk), MODE(0) | RXACTIVE}, /* MII1_TXCLK */
    {OFFSET(mii1_rxclk), MODE(0) | RXACTIVE}, /* MII1_RXCLK */
    {OFFSET(mii1_rxd3), MODE(0) | RXACTIVE}, /* MII1_RXD3 */
    {OFFSET(mii1_rxd2), MODE(0) | RXACTIVE}, /* MII1_RXD2 */
    {OFFSET(mii1_rxd1), MODE(0) | RXACTIVE}, /* MII1_RXD1 */
    {OFFSET(mii1_rxd0), MODE(0) | RXACTIVE}, /* MII1_RXD0 */
    {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
    {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
    {-1},
    };

    static struct module_pin_mux rmii1_pin_mux[] = {
    {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
    {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
    {OFFSET(mii1_crs), MODE(1) | RXACTIVE}, /* MII1_CRS */
    {OFFSET(mii1_rxerr), MODE(1) | RXACTIVE}, /* MII1_RXERR */
    {OFFSET(mii1_txen), MODE(1)}, /* MII1_TXEN */
    {OFFSET(mii1_txd1), MODE(1)}, /* MII1_TXD1 */
    {OFFSET(mii1_txd0), MODE(1)}, /* MII1_TXD0 */
    {OFFSET(mii1_rxd1), MODE(1) | RXACTIVE}, /* MII1_RXD1 */
    {OFFSET(mii1_rxd0), MODE(1) | RXACTIVE}, /* MII1_RXD0 */
    {OFFSET(rmii1_refclk), MODE(0) | RXACTIVE}, /* RMII1_REFCLK */
    {-1},
    };

    #ifdef CONFIG_NAND
    static struct module_pin_mux nand_pin_mux[] = {
    {OFFSET(gpmc_ad0), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD0 */
    {OFFSET(gpmc_ad1), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD1 */
    {OFFSET(gpmc_ad2), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD2 */
    {OFFSET(gpmc_ad3), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD3 */
    {OFFSET(gpmc_ad4), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD4 */
    {OFFSET(gpmc_ad5), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD5 */
    {OFFSET(gpmc_ad6), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD6 */
    {OFFSET(gpmc_ad7), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD7 */
    #ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
    {OFFSET(gpmc_ad8), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD8 */
    {OFFSET(gpmc_ad9), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD9 */
    {OFFSET(gpmc_ad10), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD10 */
    {OFFSET(gpmc_ad11), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD11 */
    {OFFSET(gpmc_ad12), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD12 */
    {OFFSET(gpmc_ad13), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD13 */
    {OFFSET(gpmc_ad14), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD14 */
    {OFFSET(gpmc_ad15), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD15 */
    #endif
    {OFFSET(gpmc_wait0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* nWAIT */
    {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN)}, /* nWP */
    {OFFSET(gpmc_csn0), (MODE(0) | PULLUP_EN)}, /* nCS */
    {OFFSET(gpmc_wen), (MODE(0) | PULLDOWN_EN)}, /* WEN */
    {OFFSET(gpmc_oen_ren), (MODE(0) | PULLDOWN_EN)}, /* OE */
    {OFFSET(gpmc_advn_ale), (MODE(0) | PULLDOWN_EN)}, /* ADV_ALE */
    {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLDOWN_EN)}, /* BE_CLE */
    {-1},
    };
    #elif defined(CONFIG_NOR)
    static struct module_pin_mux bone_norcape_pin_mux[] = {
    {OFFSET(gpmc_a0), MODE(0) | PULLUDDIS}, /* NOR_A0 */
    {OFFSET(gpmc_a1), MODE(0) | PULLUDDIS}, /* NOR_A1 */
    {OFFSET(gpmc_a2), MODE(0) | PULLUDDIS}, /* NOR_A2 */
    {OFFSET(gpmc_a3), MODE(0) | PULLUDDIS}, /* NOR_A3 */
    {OFFSET(gpmc_a4), MODE(0) | PULLUDDIS}, /* NOR_A4 */
    {OFFSET(gpmc_a5), MODE(0) | PULLUDDIS}, /* NOR_A5 */
    {OFFSET(gpmc_a6), MODE(0) | PULLUDDIS}, /* NOR_A6 */
    {OFFSET(gpmc_a7), MODE(0) | PULLUDDIS}, /* NOR_A7 */
    {OFFSET(gpmc_ad0), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD0 */
    {OFFSET(gpmc_ad1), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD1 */
    {OFFSET(gpmc_ad2), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD2 */
    {OFFSET(gpmc_ad3), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD3 */
    {OFFSET(gpmc_ad4), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD4 */
    {OFFSET(gpmc_ad5), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD5 */
    {OFFSET(gpmc_ad6), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD6 */
    {OFFSET(gpmc_ad7), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD7 */
    {OFFSET(gpmc_ad8), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD8 */
    {OFFSET(gpmc_ad9), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD9 */
    {OFFSET(gpmc_ad10), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD10 */
    {OFFSET(gpmc_ad11), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD11 */
    {OFFSET(gpmc_ad12), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD12 */
    {OFFSET(gpmc_ad13), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD13 */
    {OFFSET(gpmc_ad14), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD14 */
    {OFFSET(gpmc_ad15), MODE(0) | PULLUDDIS | RXACTIVE}, /* NOR_AD15 */
    {OFFSET(gpmc_csn0), MODE(0) | PULLUDEN | PULLUP_EN}, /* CE */
    {OFFSET(gpmc_advn_ale), MODE(0) | PULLUDEN | PULLDOWN_EN}, /* ALE */
    {OFFSET(gpmc_oen_ren), MODE(0) | PULLUDEN | PULLDOWN_EN},/* OEn_REN */
    {OFFSET(gpmc_be0n_cle), MODE(0) | PULLUDEN | PULLDOWN_EN},/* unused */
    {OFFSET(gpmc_wen), MODE(0) | PULLUDEN | PULLDOWN_EN}, /* WEN */
    {OFFSET(gpmc_wait0), MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE},/*WAIT*/
    {-1},
    };
    #endif

    static struct module_pin_mux uart3_icev2_pin_mux[] = {
    {OFFSET(mii1_rxd3), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART3_RXD */
    {OFFSET(mii1_rxd2), MODE(1) | PULLUDEN}, /* UART3_TXD */
    {-1},
    };

    #if defined(CONFIG_NOR_BOOT)
    void enable_norboot_pin_mux(void)
    {
    configure_module_pin_mux(bone_norcape_pin_mux);
    }
    #endif

    void enable_uart0_pin_mux(void)
    {
    configure_module_pin_mux(uart0_pin_mux);
    }

    void enable_uart1_pin_mux(void)
    {
    configure_module_pin_mux(uart1_pin_mux);
    }

    void enable_uart2_pin_mux(void)
    {
    configure_module_pin_mux(uart2_pin_mux);
    }

    void enable_uart3_pin_mux(void)
    {
    configure_module_pin_mux(uart3_pin_mux);
    }

    void enable_uart4_pin_mux(void)
    {
    configure_module_pin_mux(uart4_pin_mux);
    }

    void enable_uart5_pin_mux(void)
    {
    configure_module_pin_mux(uart5_pin_mux);
    }

    void enable_i2c0_pin_mux(void)
    {
    configure_module_pin_mux(i2c0_pin_mux);
    }

    /*
    * The AM335x GP EVM, if daughter card(s) are connected, can have 8
    * different profiles. These profiles determine what peripherals are
    * valid and need pinmux to be configured.
    */
    #define PROFILE_NONE 0x0
    #define PROFILE_0 (1 << 0)
    #define PROFILE_1 (1 << 1)
    #define PROFILE_2 (1 << 2)
    #define PROFILE_3 (1 << 3)
    #define PROFILE_4 (1 << 4)
    #define PROFILE_5 (1 << 5)
    #define PROFILE_6 (1 << 6)
    #define PROFILE_7 (1 << 7)
    #define PROFILE_MASK 0x7
    #define PROFILE_ALL 0xFF

    /* CPLD registers */
    #define I2C_CPLD_ADDR 0x35
    #define CFG_REG 0x10

    static unsigned short detect_daughter_board_profile(void)
    {
    unsigned short val;

    if (i2c_probe(I2C_CPLD_ADDR))
    return PROFILE_NONE;

    if (i2c_read(I2C_CPLD_ADDR, CFG_REG, 1, (unsigned char *)(&val), 2))
    return PROFILE_NONE;

    return (1 << (val & PROFILE_MASK));
    }

    void enable_board_pin_mux(void)
    {
    /* Do board-specific muxes. */
    if (board_is_bone()) {
    /* Beaglebone pinmux */
    configure_module_pin_mux(mii1_pin_mux);
    configure_module_pin_mux(mmc0_pin_mux);
    #if defined(CONFIG_NAND)
    configure_module_pin_mux(nand_pin_mux);
    #elif defined(CONFIG_NOR)
    configure_module_pin_mux(bone_norcape_pin_mux);
    #else
    configure_module_pin_mux(mmc1_pin_mux);
    #endif
    } else if (board_is_gp_evm()) {
    /* General Purpose EVM */
    unsigned short profile = detect_daughter_board_profile();
    configure_module_pin_mux(rgmii1_pin_mux);
    configure_module_pin_mux(mmc0_pin_mux);
    /* In profile #2 i2c1 and spi0 conflict. */
    if (profile & ~PROFILE_2)
    configure_module_pin_mux(i2c1_pin_mux);
    /* Profiles 2 & 3 don't have NAND */
    #ifdef CONFIG_NAND
    if (profile & ~(PROFILE_2 | PROFILE_3))
    configure_module_pin_mux(nand_pin_mux);
    #endif
    else if (profile == PROFILE_2) {
    configure_module_pin_mux(mmc1_pin_mux);
    configure_module_pin_mux(spi0_pin_mux);
    }
    } else if (board_is_idk()) {
    /* Industrial Motor Control (IDK) */
    configure_module_pin_mux(mii1_pin_mux);
    configure_module_pin_mux(mmc0_no_cd_pin_mux);
    } else if (board_is_evm_sk()) {
    /* Starter Kit EVM */
    configure_module_pin_mux(i2c1_pin_mux);
    configure_module_pin_mux(gpio0_7_pin_mux);
    configure_module_pin_mux(rgmii1_pin_mux);
    configure_module_pin_mux(mmc0_pin_mux_sk_evm);
    configure_module_pin_mux(mmc1_pin_mux);
    } else if (board_is_bone_lt()) {
    /* Beaglebone LT pinmux */
    configure_module_pin_mux(mii1_pin_mux);
    configure_module_pin_mux(mmc0_pin_mux);
    #if defined(CONFIG_NAND) && defined(CONFIG_EMMC_BOOT)
    configure_module_pin_mux(nand_pin_mux);
    #elif defined(CONFIG_NOR) && defined(CONFIG_EMMC_BOOT)
    configure_module_pin_mux(bone_norcape_pin_mux);
    #else
    configure_module_pin_mux(mmc1_pin_mux);
    #endif
    } else if (board_is_icev2()) {
    configure_module_pin_mux(mmc0_pin_mux);
    configure_module_pin_mux(gpio0_18_pin_mux);
    configure_module_pin_mux(uart3_icev2_pin_mux);
    configure_module_pin_mux(rmii1_pin_mux);
    configure_module_pin_mux(spi0_pin_mux);
    } else {
    /* Unknown board. We might still be able to boot. */
    puts("Bad EEPROM or unknown board, cannot configure pinmux.");
    }
    }
  • I do not see the device tree. Can you post the device tree too?
  • /*
    * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License version 2 as
    * published by the Free Software Foundation.
    */

    /*
    * AM335x Starter Kit
    * www.ti.com/.../tmdssk3358
    */

    /dts-v1/;

    #include "am33xx.dtsi"
    #include <dt-bindings/pwm/pwm.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    / {
    model = "TI AM335x EVM-SK";
    compatible = "ti,am335x-evmsk", "ti,am33xx";

    chosen {
    stdout-path = &uart0;
    tick-timer = &timer2;
    };

    cpus {
    cpu@0 {
    cpu0-supply = <&vdd1_reg>;
    };
    };

    memory {
    device_type = "memory";
    reg = <0x80000000 0x10000000>; /* 256 MB */
    };

    vbat: fixedregulator@0 {
    compatible = "regulator-fixed";
    regulator-name = "vbat";
    regulator-min-microvolt = <5000000>;
    regulator-max-microvolt = <5000000>;
    regulator-boot-on;
    };

    lis3_reg: fixedregulator@1 {
    compatible = "regulator-fixed";
    regulator-name = "lis3_reg";
    regulator-boot-on;
    };

    wl12xx_vmmc: fixedregulator@2 {
    pinctrl-names = "default";
    pinctrl-0 = <&wl12xx_gpio>;
    compatible = "regulator-fixed";
    regulator-name = "vwl1271";
    regulator-min-microvolt = <1800000>;
    regulator-max-microvolt = <1800000>;
    gpio = <&gpio1 29 0>;
    startup-delay-us = <70000>;
    enable-active-high;
    };

    vtt_fixed: fixedregulator@3 {
    compatible = "regulator-fixed";
    regulator-name = "vtt";
    regulator-min-microvolt = <1500000>;
    regulator-max-microvolt = <1500000>;
    gpio = <&gpio0 7 GPIO_ACTIVE_HIGH>;
    regulator-always-on;
    regulator-boot-on;
    enable-active-high;
    };

    leds {
    pinctrl-names = "default";
    pinctrl-0 = <&user_leds_s0>;

    compatible = "gpio-leds";

    led@1 {
    label = "evmsk:green:usr0";
    gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
    default-state = "off";
    };

    led@2 {
    label = "evmsk:green:usr1";
    gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
    default-state = "off";
    };

    led@3 {
    label = "evmsk:green:mmc0";
    gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
    linux,default-trigger = "mmc0";
    default-state = "off";
    };

    led@4 {
    label = "evmsk:green:heartbeat";
    gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
    linux,default-trigger = "heartbeat";
    default-state = "off";
    };
    };

    gpio_buttons: gpio_buttons@0 {
    compatible = "gpio-keys";
    #address-cells = <1>;
    #size-cells = <0>;

    switch@1 {
    label = "button0";
    linux,code = <0x100>;
    gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
    };

    switch@2 {
    label = "button1";
    linux,code = <0x101>;
    gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
    };

    switch@3 {
    label = "button2";
    linux,code = <0x102>;
    gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
    wakeup-source;
    };

    switch@4 {
    label = "button3";
    linux,code = <0x103>;
    gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
    };
    };

    backlight {
    compatible = "pwm-backlight";
    pwms = <&ecap2 0 50000 PWM_POLARITY_INVERTED>;
    brightness-levels = <0 58 61 66 75 90 125 170 255>;
    default-brightness-level = <8>;
    };

    sound {
    compatible = "simple-audio-card";
    simple-audio-card,name = "AM335x-EVMSK";
    simple-audio-card,widgets =
    "Headphone", "Headphone Jack";
    simple-audio-card,routing =
    "Headphone Jack", "HPLOUT",
    "Headphone Jack", "HPROUT";
    simple-audio-card,format = "dsp_b";
    simple-audio-card,bitclock-master = <&sound_master>;
    simple-audio-card,frame-master = <&sound_master>;
    simple-audio-card,bitclock-inversion;

    simple-audio-card,cpu {
    sound-dai = <&mcasp1>;
    };

    sound_master: simple-audio-card,codec {
    sound-dai = <&tlv320aic3106>;
    system-clock-frequency = <24000000>;
    };
    };

    panel {
    compatible = "ti,tilcdc,panel";
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&lcd_pins_default>;
    pinctrl-1 = <&lcd_pins_sleep>;
    status = "okay";
    panel-info {
    ac-bias = <255>;
    ac-bias-intrpt = <0>;
    dma-burst-sz = <16>;
    bpp = <32>;
    fdd = <0x80>;
    sync-edge = <0>;
    sync-ctrl = <1>;
    raster-order = <0>;
    fifo-th = <0>;
    };
    display-timings {
    480x272 {
    hactive = <480>;
    vactive = <272>;
    hback-porch = <43>;
    hfront-porch = <8>;
    hsync-len = <4>;
    vback-porch = <12>;
    vfront-porch = <4>;
    vsync-len = <10>;
    clock-frequency = <9000000>;
    hsync-active = <0>;
    vsync-active = <0>;
    };
    };
    };
    };

    &am33xx_pinmux {
    pinctrl-names = "default";
    pinctrl-0 = <&gpio_keys_s0 &clkout2_pin>;

    lcd_pins_default: lcd_pins_default {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x820, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad8.lcd_data23 */
    AM33XX_IOPAD(0x824, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad9.lcd_data22 */
    AM33XX_IOPAD(0x828, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad10.lcd_data21 */
    AM33XX_IOPAD(0x82c, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad11.lcd_data20 */
    AM33XX_IOPAD(0x830, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad12.lcd_data19 */
    AM33XX_IOPAD(0x834, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad13.lcd_data18 */
    AM33XX_IOPAD(0x838, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad14.lcd_data17 */
    AM33XX_IOPAD(0x83c, PIN_OUTPUT | MUX_MODE1) /* gpmc_ad15.lcd_data16 */
    AM33XX_IOPAD(0x8a0, PIN_OUTPUT | MUX_MODE0) /* lcd_data0.lcd_data0 */
    AM33XX_IOPAD(0x8a4, PIN_OUTPUT | MUX_MODE0) /* lcd_data1.lcd_data1 */
    AM33XX_IOPAD(0x8a8, PIN_OUTPUT | MUX_MODE0) /* lcd_data2.lcd_data2 */
    AM33XX_IOPAD(0x8ac, PIN_OUTPUT | MUX_MODE0) /* lcd_data3.lcd_data3 */
    AM33XX_IOPAD(0x8b0, PIN_OUTPUT | MUX_MODE0) /* lcd_data4.lcd_data4 */
    AM33XX_IOPAD(0x8b4, PIN_OUTPUT | MUX_MODE0) /* lcd_data5.lcd_data5 */
    AM33XX_IOPAD(0x8b8, PIN_OUTPUT | MUX_MODE0) /* lcd_data6.lcd_data6 */
    AM33XX_IOPAD(0x8bc, PIN_OUTPUT | MUX_MODE0) /* lcd_data7.lcd_data7 */
    AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE0) /* lcd_data8.lcd_data8 */
    AM33XX_IOPAD(0x8c4, PIN_OUTPUT | MUX_MODE0) /* lcd_data9.lcd_data9 */
    AM33XX_IOPAD(0x8c8, PIN_OUTPUT | MUX_MODE0) /* lcd_data10.lcd_data10 */
    AM33XX_IOPAD(0x8cc, PIN_OUTPUT | MUX_MODE0) /* lcd_data11.lcd_data11 */
    AM33XX_IOPAD(0x8d0, PIN_OUTPUT | MUX_MODE0) /* lcd_data12.lcd_data12 */
    AM33XX_IOPAD(0x8d4, PIN_OUTPUT | MUX_MODE0) /* lcd_data13.lcd_data13 */
    AM33XX_IOPAD(0x8d8, PIN_OUTPUT | MUX_MODE0) /* lcd_data14.lcd_data14 */
    AM33XX_IOPAD(0x8dc, PIN_OUTPUT | MUX_MODE0) /* lcd_data15.lcd_data15 */
    AM33XX_IOPAD(0x8e0, PIN_OUTPUT | MUX_MODE0) /* lcd_vsync.lcd_vsync */
    AM33XX_IOPAD(0x8e4, PIN_OUTPUT | MUX_MODE0) /* lcd_hsync.lcd_hsync */
    AM33XX_IOPAD(0x8e8, PIN_OUTPUT | MUX_MODE0) /* lcd_pclk.lcd_pclk */
    AM33XX_IOPAD(0x8ec, PIN_OUTPUT | MUX_MODE0) /* lcd_ac_bias_en.lcd_ac_bias_en */
    >;
    };

    lcd_pins_sleep: lcd_pins_sleep {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x820, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad8.lcd_data23 */
    AM33XX_IOPAD(0x824, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad9.lcd_data22 */
    AM33XX_IOPAD(0x828, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad10.lcd_data21 */
    AM33XX_IOPAD(0x82c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad11.lcd_data20 */
    AM33XX_IOPAD(0x830, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad12.lcd_data19 */
    AM33XX_IOPAD(0x834, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad13.lcd_data18 */
    AM33XX_IOPAD(0x838, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad14.lcd_data17 */
    AM33XX_IOPAD(0x83c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad15.lcd_data16 */
    AM33XX_IOPAD(0x8a0, PULL_DISABLE | MUX_MODE7) /* lcd_data0.lcd_data0 */
    AM33XX_IOPAD(0x8a4, PULL_DISABLE | MUX_MODE7) /* lcd_data1.lcd_data1 */
    AM33XX_IOPAD(0x8a8, PULL_DISABLE | MUX_MODE7) /* lcd_data2.lcd_data2 */
    AM33XX_IOPAD(0x8ac, PULL_DISABLE | MUX_MODE7) /* lcd_data3.lcd_data3 */
    AM33XX_IOPAD(0x8b0, PULL_DISABLE | MUX_MODE7) /* lcd_data4.lcd_data4 */
    AM33XX_IOPAD(0x8b4, PULL_DISABLE | MUX_MODE7) /* lcd_data5.lcd_data5 */
    AM33XX_IOPAD(0x8b8, PULL_DISABLE | MUX_MODE7) /* lcd_data6.lcd_data6 */
    AM33XX_IOPAD(0x8bc, PULL_DISABLE | MUX_MODE7) /* lcd_data7.lcd_data7 */
    AM33XX_IOPAD(0x8c0, PULL_DISABLE | MUX_MODE7) /* lcd_data8.lcd_data8 */
    AM33XX_IOPAD(0x8c4, PULL_DISABLE | MUX_MODE7) /* lcd_data9.lcd_data9 */
    AM33XX_IOPAD(0x8c8, PULL_DISABLE | MUX_MODE7) /* lcd_data10.lcd_data10 */
    AM33XX_IOPAD(0x8cc, PULL_DISABLE | MUX_MODE7) /* lcd_data11.lcd_data11 */
    AM33XX_IOPAD(0x8d0, PULL_DISABLE | MUX_MODE7) /* lcd_data12.lcd_data12 */
    AM33XX_IOPAD(0x8d4, PULL_DISABLE | MUX_MODE7) /* lcd_data13.lcd_data13 */
    AM33XX_IOPAD(0x8d8, PULL_DISABLE | MUX_MODE7) /* lcd_data14.lcd_data14 */
    AM33XX_IOPAD(0x8dc, PULL_DISABLE | MUX_MODE7) /* lcd_data15.lcd_data15 */
    AM33XX_IOPAD(0x8e0, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_vsync.lcd_vsync */
    AM33XX_IOPAD(0x8e4, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_hsync.lcd_hsync */
    AM33XX_IOPAD(0x8e8, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_pclk.lcd_pclk */
    AM33XX_IOPAD(0x8ec, PIN_INPUT_PULLDOWN | MUX_MODE7) /* lcd_ac_bias_en.lcd_ac_bias_en */
    >;
    };


    user_leds_s0: user_leds_s0 {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x810, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad4.gpio1_4 */
    AM33XX_IOPAD(0x814, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad5.gpio1_5 */
    AM33XX_IOPAD(0x818, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad6.gpio1_6 */
    AM33XX_IOPAD(0x81c, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_ad7.gpio1_7 */
    >;
    };

    gpio_keys_s0: gpio_keys_s0 {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x894, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_oen_ren.gpio2_3 */
    AM33XX_IOPAD(0x890, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_advn_ale.gpio2_2 */
    AM33XX_IOPAD(0x870, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_wait0.gpio0_30 */
    AM33XX_IOPAD(0x89c, PIN_INPUT_PULLDOWN | MUX_MODE7) /* gpmc_ben0_cle.gpio2_5 */
    >;
    };

    i2c0_pins: pinmux_i2c0_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x988, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
    AM33XX_IOPAD(0x98c, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
    >;
    };

    uart0_pins: pinmux_uart0_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x970, PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
    AM33XX_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
    >;
    };

    clkout2_pin: pinmux_clkout2_pin {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x9b4, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
    >;
    };

    ecap2_pins: backlight_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x99c, MUX_MODE4) /* mcasp0_ahclkr.ecap2_in_pwm2_out */
    >;
    };

    cpsw_default: cpsw_default {
    pinctrl-single,pins = <
    /* Slave 1 */
    AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txen.rgmii1_tctl */
    AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxdv.rgmii1_rctl */
    AM33XX_IOPAD(0x91c, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd3.rgmii1_td3 */
    AM33XX_IOPAD(0x920, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd2.rgmii1_td2 */
    AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd1.rgmii1_td1 */
    AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd0.rgmii1_td0 */
    AM33XX_IOPAD(0x92c, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txclk.rgmii1_tclk */
    AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxclk.rgmii1_rclk */
    AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxd3.rgmii1_rd3 */
    AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxd2.rgmii1_rd2 */
    AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxd1.rgmii1_rd1 */
    AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxd0.rgmii1_rd0 */

    /* Slave 2 */
    AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a0.rgmii2_tctl */
    AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a1.rgmii2_rctl */
    AM33XX_IOPAD(0x848, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a2.rgmii2_td3 */
    AM33XX_IOPAD(0x84c, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a3.rgmii2_td2 */
    AM33XX_IOPAD(0x850, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a4.rgmii2_td1 */
    AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a5.rgmii2_td0 */
    AM33XX_IOPAD(0x858, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a6.rgmii2_tclk */
    AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a7.rgmii2_rclk */
    AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a8.rgmii2_rd3 */
    AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a9.rgmii2_rd2 */
    AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a10.rgmii2_rd1 */
    AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a11.rgmii2_rd0 */
    >;
    };

    cpsw_sleep: cpsw_sleep {
    pinctrl-single,pins = <
    /* Slave 1 reset value */
    AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x91c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x920, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x92c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7)

    /* Slave 2 reset value*/
    AM33XX_IOPAD(0x840, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x848, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x84c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x850, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x854, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x858, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    >;
    };

    davinci_mdio_default: davinci_mdio_default {
    pinctrl-single,pins = <
    /* MDIO */
    AM33XX_IOPAD(0x948, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
    AM33XX_IOPAD(0x94c, PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
    >;
    };

    davinci_mdio_sleep: davinci_mdio_sleep {
    pinctrl-single,pins = <
    /* MDIO reset value */
    AM33XX_IOPAD(0x948, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x94c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    >;
    };

    mmc1_pins: pinmux_mmc1_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x960, PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */
    >;
    };

    mcasp1_pins: mcasp1_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */
    AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_rxerr.mcasp1_fsx */
    AM33XX_IOPAD(0x908, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* mii1_col.mcasp1_axr2 */
    AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE4) /* rmii1_ref_clk.mcasp1_axr3 */
    >;
    };

    mcasp1_pins_sleep: mcasp1_pins_sleep {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x908, PIN_INPUT_PULLDOWN | MUX_MODE7)
    AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE7)
    >;
    };

    mmc2_pins: pinmux_mmc2_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_wpn.gpio0_31 */
    AM33XX_IOPAD(0x880, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */
    AM33XX_IOPAD(0x884, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
    AM33XX_IOPAD(0x800, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
    AM33XX_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
    AM33XX_IOPAD(0x808, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
    AM33XX_IOPAD(0x80c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
    >;
    };

    wl12xx_gpio: pinmux_wl12xx_gpio {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x87c, PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_csn0.gpio1_29 */
    >;
    };
    };

    &uart0 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_pins>;

    status = "okay";
    };

    &i2c0 {
    pinctrl-names = "default";
    pinctrl-0 = <&i2c0_pins>;

    status = "okay";
    clock-frequency = <400000>;

    tps: tps@2d {
    reg = <0x2d>;
    };

    lis331dlh: lis331dlh@18 {
    compatible = "st,lis331dlh", "st,lis3lv02d";
    reg = <0x18>;
    Vdd-supply = <&lis3_reg>;
    Vdd_IO-supply = <&lis3_reg>;

    st,click-single-x;
    st,click-single-y;
    st,click-single-z;
    st,click-thresh-x = <10>;
    st,click-thresh-y = <10>;
    st,click-thresh-z = <10>;
    st,irq1-click;
    st,irq2-click;
    st,wakeup-x-lo;
    st,wakeup-x-hi;
    st,wakeup-y-lo;
    st,wakeup-y-hi;
    st,wakeup-z-lo;
    st,wakeup-z-hi;
    st,min-limit-x = <120>;
    st,min-limit-y = <120>;
    st,min-limit-z = <140>;
    st,max-limit-x = <550>;
    st,max-limit-y = <550>;
    st,max-limit-z = <750>;
    };

    tlv320aic3106: tlv320aic3106@1b {
    #sound-dai-cells = <0>;
    compatible = "ti,tlv320aic3106";
    reg = <0x1b>;
    status = "okay";

    /* Regulators */
    AVDD-supply = <&vaux2_reg>;
    IOVDD-supply = <&vaux2_reg>;
    DRVDD-supply = <&vaux2_reg>;
    DVDD-supply = <&vbat>;
    };
    };

    &usb {
    status = "okay";
    };

    &usb_ctrl_mod {
    status = "okay";
    };

    &usb0_phy {
    status = "okay";
    };

    &usb1_phy {
    status = "okay";
    };

    &usb0 {
    status = "okay";
    };

    &usb1 {
    status = "okay";
    dr_mode = "host";
    };

    &cppi41dma {
    status = "okay";
    };

    &epwmss2 {
    status = "okay";

    ecap2: ecap@48304100 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&ecap2_pins>;
    };
    };

    #include "tps65910.dtsi"

    &tps {
    vcc1-supply = <&vbat>;
    vcc2-supply = <&vbat>;
    vcc3-supply = <&vbat>;
    vcc4-supply = <&vbat>;
    vcc5-supply = <&vbat>;
    vcc6-supply = <&vbat>;
    vcc7-supply = <&vbat>;
    vccio-supply = <&vbat>;

    regulators {
    vrtc_reg: regulator@0 {
    regulator-always-on;
    };

    vio_reg: regulator@1 {
    regulator-always-on;
    };

    vdd1_reg: regulator@2 {
    /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
    regulator-name = "vdd_mpu";
    regulator-min-microvolt = <912500>;
    regulator-max-microvolt = <1312500>;
    regulator-boot-on;
    regulator-always-on;
    };

    vdd2_reg: regulator@3 {
    /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
    regulator-name = "vdd_core";
    regulator-min-microvolt = <912500>;
    regulator-max-microvolt = <1150000>;
    regulator-boot-on;
    regulator-always-on;
    };

    vdd3_reg: regulator@4 {
    regulator-always-on;
    };

    vdig1_reg: regulator@5 {
    regulator-always-on;
    };

    vdig2_reg: regulator@6 {
    regulator-always-on;
    };

    vpll_reg: regulator@7 {
    regulator-always-on;
    };

    vdac_reg: regulator@8 {
    regulator-always-on;
    };

    vaux1_reg: regulator@9 {
    regulator-always-on;
    };

    vaux2_reg: regulator@10 {
    regulator-always-on;
    };

    vaux33_reg: regulator@11 {
    regulator-always-on;
    };

    vmmc_reg: regulator@12 {
    regulator-min-microvolt = <1800000>;
    regulator-max-microvolt = <3300000>;
    regulator-always-on;
    };
    };
    };

    &mac {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&cpsw_default>;
    pinctrl-1 = <&cpsw_sleep>;
    dual_emac = <1>;
    status = "okay";
    };

    &davinci_mdio {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&davinci_mdio_default>;
    pinctrl-1 = <&davinci_mdio_sleep>;
    status = "okay";
    };

    &cpsw_emac0 {
    phy_id = <&davinci_mdio>, <0>;
    phy-mode = "rgmii-txid";
    dual_emac_res_vlan = <1>;
    };

    &cpsw_emac1 {
    phy_id = <&davinci_mdio>, <1>;
    phy-mode = "rgmii-txid";
    dual_emac_res_vlan = <2>;
    };

    &mmc1 {
    status = "okay";
    vmmc-supply = <&vmmc_reg>;
    bus-width = <4>;
    pinctrl-names = "default";
    pinctrl-0 = <&mmc1_pins>;
    cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
    };

    &sham {
    status = "okay";
    };

    &aes {
    status = "okay";
    };

    &gpio0 {
    ti,no-reset-on-init;
    };

    &mmc2 {
    status = "okay";
    vmmc-supply = <&wl12xx_vmmc>;
    ti,non-removable;
    bus-width = <4>;
    cap-power-off-card;
    pinctrl-names = "default";
    pinctrl-0 = <&mmc2_pins>;

    #address-cells = <1>;
    #size-cells = <0>;
    wlcore: wlcore@2 {
    compatible = "ti,wl1271";
    reg = <2>;
    interrupt-parent = <&gpio0>;
    interrupts = <31 IRQ_TYPE_LEVEL_HIGH>; /* gpio 31 */
    ref-clock-frequency = <38400000>;
    };
    };

    &mcasp1 {
    #sound-dai-cells = <0>;
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&mcasp1_pins>;
    pinctrl-1 = <&mcasp1_pins_sleep>;

    status = "okay";

    op-mode = <0>; /* MCASP_IIS_MODE */
    tdm-slots = <2>;
    /* 4 serializers */
    serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
    0 0 1 2
    >;
    tx-num-evt = <32>;
    rx-num-evt = <32>;
    };

    &tscadc {
    status = "okay";
    tsc {
    ti,wires = <4>;
    ti,x-plate-resistance = <200>;
    ti,coordinate-readouts = <5>;
    ti,wire-config = <0x00 0x11 0x22 0x33>;
    };
    };

    &lcdc {
    status = "okay";
    };
  • By default, uboot will use the device tree?
  • Yes. Change the

    mmc2_pins: pinmux_mmc2_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_wpn.gpio0_31 */
    AM33XX_IOPAD(0x880, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */
    AM33XX_IOPAD(0x884, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
    AM33XX_IOPAD(0x800, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
    AM33XX_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
    AM33XX_IOPAD(0x808, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
    AM33XX_IOPAD(0x80c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
    >;
    };

    to

    mmc2_pins: pinmux_mmc2_pins {
    pinctrl-single,pins = <
    AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_wpn.gpio0_31 */
    AM33XX_IOPAD(0x880, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */
    AM33XX_IOPAD(0x884, PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
    AM33XX_IOPAD(0x800, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
    AM33XX_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
    AM33XX_IOPAD(0x808, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
    AM33XX_IOPAD(0x80c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
    AM33XX_IOPAD(0x810, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat4 */
    AM33XX_IOPAD(0x814, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat5 */
    AM33XX_IOPAD(0x818, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat6 */
    AM33XX_IOPAD(0x81c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat7 */
    >;
    };

    and

    &mmc2 {
    status = "okay";
    vmmc-supply = <&wl12xx_vmmc>;
    ti,non-removable;
    bus-width = <4>;
    cap-power-off-card;
    pinctrl-names = "default";
    pinctrl-0 = <&mmc2_pins>;

    #address-cells = <1>;
    #size-cells = <0>;
    wlcore: wlcore@2 {
    compatible = "ti,wl1271";
    reg = <2>;
    interrupt-parent = <&gpio0>;
    interrupts = <31 IRQ_TYPE_LEVEL_HIGH>; /* gpio 31 */
    ref-clock-frequency = <38400000>;
    };
    };

    to

    &mmc2 {
    vmmc-supply = <&vmmc_reg>;
    pinctrl-names = "default";
    pinctrl-0 = <&mmc2_pins>;
    bus-width = <8>;
    max-frequency = <50000000>;
    status = "okay";
    };
  • Currently using SD boot, which partition should the device tree copy, and what is the difference between uboot and kernel device tree?
  • Emmc still not recognized after modification?
  • Are your pimuxes correct? Can you post the part of the schematic where the eMMC gets connected to the processor? The device tree should be copied to the second partition. The U-Boot looks it for in /boot/ directory where it sat next to the zImage. The U-Boot device tree is for U-Boot, as the kernel device tree is for kernel. Can you also post the output of these commands?

    => mmc list
    => mmc dev 0
    => mmc part
    => mmc info
    => mmc dev 1
    => mmc part
    => mmc info
    => mmc rescan
    => mmc list
    => mmc dev 0
    => mmc dev 1

  • The kernel device tree and the uboot device tree have the same name, such as am335x_evmsk.dtb, and are placed in the boot, how to distinguish?

  • The U-Boot device tree is <Processor SDK>/board-support/u-boot-<version>/arch/arm/dts/am335x-evmsk.dts and it get embedded within u-boot.img. The kernel device tree is <Processor SDK>/board-support/linux-<version>/arch/arm/boot/dts/am335x-evmsk.dts and only it gets generated and used as am335x-evmsk.dtb separately, not embedded within the kernel.

  • => mmc list
    OMAP SD/MMC: 0 (SD)
    OMAP SD/MMC: 1
    => mmc dev 0
    init_mmc_device:start
    mmc_get_dev:start
    switch to partitions #0, OK
    mmc0 is current device
    => mmc part
    init_mmc_device:start
    mmc_get_dev:start

    Partition Map for MMC device 0  --   Partition Type: DOS

    Part    Start Sector    Num Sectors     UUID            Type
      1     2048            143360          000b107d-01     0c Boot
      2     145408          7567360         000b107d-02     83
    => mmc info
    init_mmc_device:start
    Device: OMAP SD/MMC
    Manufacturer ID: 3
    OEM: 5344
    Name: SU04G
    Bus Speed: 48000000
    Mode : SD High Speed (50MHz)
    Rd Block Len: 512
    SD version 3.0
    High Capacity: Yes
    Capacity: 3.7 GiB
    Bus Width: 4-bit
    Erase Group Size: 512 Bytes
    =>  mmc dev 1
    init_mmc_device:start
    => mmc part
    init_mmc_device:start
    mmc_get_dev:start

    Partition Map for MMC device 0  --   Partition Type: DOS

    Part    Start Sector    Num Sectors     UUID            Type
      1     2048            143360          000b107d-01     0c Boot
      2     145408          7567360         000b107d-02     83
    => mmc info
    init_mmc_device:start
    Device: OMAP SD/MMC
    Manufacturer ID: 3
    OEM: 5344
    Name: SU04G
    Bus Speed: 48000000
    Mode : SD High Speed (50MHz)
    Rd Block Len: 512
    SD version 3.0
    High Capacity: Yes
    Capacity: 3.7 GiB
    Bus Width: 4-bit
    Erase Group Size: 512 Bytes
    =>  mmc rescan
    init_mmc_device:start
    => mmc list
    OMAP SD/MMC: 0 (SD)
    OMAP SD/MMC: 1
    => mmc dev 0
    init_mmc_device:start
    mmc_get_dev:start
    switch to partitions #0, OK
    mmc0 is current device
    => mmc dev 1
    init_mmc_device:start
    =>

  • Can you post the part of the schematic where the eMMC gets connected to the processor? Can you check whether switching to mmc1 partition works with the U-Boot image from the latest Processor SDK 05_02_00_10?
  • Software version:

    ti-processor-sdk-linux-am335x-evm-05.00.00.15-Linux-x86-Install.bin

    Schematic:

  • Hello user5841609,

    Your pinmuxes and schematic is okay. I think the initialization hangs in this mmc_init function. Can you put some prints, see where it hangs and dig into? Also enable and disable the CONFIG_IS_ENABLED(DM_MMC) and see if it has any affect. Simultaneously attach an oscilloscope on these mmc1 lines and check the activity.

    <Processor SDK>/board-support/u-boot-<version>/drivers/mmc/mmc.c

    int mmc_init(struct mmc *mmc)
    {
    	int err = 0;
    	__maybe_unused unsigned start;
    #if CONFIG_IS_ENABLED(DM_MMC)
    	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
    
    	upriv->mmc = mmc;
    #endif
    	if (mmc->has_init)
    		return 0;
    
    	start = get_timer(0);
    
    	if (!mmc->init_in_progress)
    		err = mmc_start_init(mmc);
    
    	if (!err)
    		err = mmc_complete_init(mmc);
    	if (err)
    		pr_info("%s: %d, time %lu\n", __func__, err, get_timer(start));
    
    	return err;
    }

    Best regards,
    Kemal

  • Hello user5841609,

    Did you find the root cause of this issue?

    Best regards,
    Kemal
  • Hello user5841609,

    Is there any update with this issue?

    Best regards,
    Kemal