From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Warren Date: Tue, 05 Feb 2013 16:51:52 -0700 Subject: [U-Boot] [PATCH 2/2] Tegra: MMC: Add DT support to MMC driver for all T20 boards In-Reply-To: References: <1360021735-13286-1-git-send-email-twarren@nvidia.com> <1360021735-13286-3-git-send-email-twarren@nvidia.com> <511165A3.7060003@wwwdotorg.org> Message-ID: <51119B18.5090807@wwwdotorg.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 02/05/2013 02:02 PM, Tom Warren wrote: > Stephen, > > On Tue, Feb 5, 2013 at 1:03 PM, Stephen Warren wrote: >> On 02/04/2013 04:48 PM, Tom Warren wrote: >>> tegra_mmc_init() now uses DT info for bus width, WP/CD GPIOs, etc. >>> Tested on Seaboard, fully functional. >> >>> diff --git a/board/compal/paz00/paz00.c b/board/compal/paz00/paz00.c ... >>> @@ -55,18 +55,18 @@ static void pin_mux_mmc(void) >>> /* this is a weak define that we are overriding */ >>> int board_mmc_init(bd_t *bd) ... >>> + debug("%s: init eMMC\n", __func__); >>> + /* init dev 0, eMMC chip */ >>> + tegra_mmc_init(0); ... >>> + debug("%s: init SD slot\n", __func__); >>> + /* init dev 3, SD slot */ >>> + tegra_mmc_init(3); >> >> That doesn't look right. The board code still has knowledge of which >> SDHCI controllers are in use by the board. Instead, the board should >> just call tegra_mmc_init() with no parameters at all, and the MMC driver >> should scan the device tree for all present-and-enabled SDHCI nodes, and >> instantiate a U-Boot SDHCI device. Without this, the device tree isn't >> in control of the whole process, so there's little point doing the >> conversion; a new board couldn't be supported /just/ by creating a new >> device tree file. ... >>> static void tegra_get_setup(struct mmc_host *host, int dev_index) ... >>> + int count, node = 0; >>> + int node_list[MAX_HOSTS]; >>> + >>> + count = fdtdec_find_aliases_for_id(gd->fdt_blob, "sdmmc", >>> + COMPAT_NVIDIA_TEGRA20_SDMMC, node_list, MAX_HOSTS); >>> + debug("%s: count of nodes is %d\n", __func__, count); >>> + >>> + if (count < dev_index) { >>> + printf("%s: device index %d exceeds node count (%d)!\n", >>> + __func__, dev_index, count); >>> + return; >>> + } >> >> This requires that an alias exist in order for the SDHCI node to be >> found/processed. This isn't correct; the SDHCI nodes must be enumerated >> themselves, and then the aliases (if any are present) provide a naming >> hint for them, but even without aliases, the SDHCI nodes must be processed. > > Again, I used Allen's SLINK driver for as a template here. In fact, it > looks like our I2C and SPI/SLINK drivers do this, as well as the > Exynos SPI and S3C24x0 I2C driver all do this. Can you point out a > U-Boot driver that does it the right way (preferably with more than 1 > node, like MMC)? I can take a look at that code to use as an example > of what you're proposing above. Tegra's I2C driver has just a single i2c_init_board() function, which calls fdtdec_find_aliases_for_id() to find all the DT nodes for a given compatible value (and associated aliases if there are any, I believe), then calls process_nodes() to loop over them all, and initialize/register them.