/* * Copyright (C) 2016 Google, Inc * Written by Simon Glass * * SPDX-License-Identifier: GPL-2.0+ */ #include #include static struct list_head mmc_devices; static int cur_dev_num = -1; struct mmc *find_mmc_device(int dev_num) { struct mmc *m; struct list_head *entry; list_for_each(entry, &mmc_devices) { m = list_entry(entry, struct mmc, link); if (m->block_dev.devnum == dev_num) return m; } #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) printf("MMC Device %d not found\n", dev_num); #endif return NULL; } int mmc_get_next_devnum(void) { return cur_dev_num++; } struct blk_desc *mmc_get_blk_desc(struct mmc *mmc) { return &mmc->block_dev; } int get_mmc_num(void) { return cur_dev_num; } void mmc_do_preinit(void) { struct mmc *m; struct list_head *entry; list_for_each(entry, &mmc_devices) { m = list_entry(entry, struct mmc, link); #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT mmc_set_preinit(m, 1); #endif if (m->preinit) mmc_start_init(m); } } void mmc_list_init(void) { INIT_LIST_HEAD(&mmc_devices); cur_dev_num = 0; } void mmc_list_add(struct mmc *mmc) { INIT_LIST_HEAD(&mmc->link); list_add_tail(&mmc->link, &mmc_devices); } #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) void print_mmc_devices(char separator) { struct mmc *m; struct list_head *entry; char *mmc_type; list_for_each(entry, &mmc_devices) { m = list_entry(entry, struct mmc, link); if (m->has_init) mmc_type = IS_SD(m) ? "SD" : "eMMC"; else mmc_type = NULL; printf("%s: %d", m->cfg->name, m->block_dev.devnum); if (mmc_type) printf(" (%s)", mmc_type); if (entry->next != &mmc_devices) { printf("%c", separator); if (separator != '\n') puts(" "); } } printf("\n"); } #else void print_mmc_devices(char separator) { } #endif