1 /* 2 * Copyright (C) 2016 Google, Inc 3 * Written by Simon Glass <sjg@chromium.org> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <mmc.h> 10 11 static struct list_head mmc_devices; 12 static int cur_dev_num = -1; 13 14 struct mmc *find_mmc_device(int dev_num) 15 { 16 struct mmc *m; 17 struct list_head *entry; 18 19 list_for_each(entry, &mmc_devices) { 20 m = list_entry(entry, struct mmc, link); 21 22 if (m->block_dev.devnum == dev_num) 23 return m; 24 } 25 26 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) 27 printf("MMC Device %d not found\n", dev_num); 28 #endif 29 30 return NULL; 31 } 32 33 int mmc_get_next_devnum(void) 34 { 35 return cur_dev_num++; 36 } 37 38 struct blk_desc *mmc_get_blk_desc(struct mmc *mmc) 39 { 40 return &mmc->block_dev; 41 } 42 43 int get_mmc_num(void) 44 { 45 return cur_dev_num; 46 } 47 48 void mmc_do_preinit(void) 49 { 50 struct mmc *m; 51 struct list_head *entry; 52 53 list_for_each(entry, &mmc_devices) { 54 m = list_entry(entry, struct mmc, link); 55 56 #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT 57 mmc_set_preinit(m, 1); 58 #endif 59 if (m->preinit) 60 mmc_start_init(m); 61 } 62 } 63 64 void mmc_list_init(void) 65 { 66 INIT_LIST_HEAD(&mmc_devices); 67 cur_dev_num = 0; 68 } 69 70 void mmc_list_add(struct mmc *mmc) 71 { 72 INIT_LIST_HEAD(&mmc->link); 73 74 list_add_tail(&mmc->link, &mmc_devices); 75 } 76 77 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT) 78 void print_mmc_devices(char separator) 79 { 80 struct mmc *m; 81 struct list_head *entry; 82 char *mmc_type; 83 84 list_for_each(entry, &mmc_devices) { 85 m = list_entry(entry, struct mmc, link); 86 87 if (m->has_init) 88 mmc_type = IS_SD(m) ? "SD" : "eMMC"; 89 else 90 mmc_type = NULL; 91 92 printf("%s: %d", m->cfg->name, m->block_dev.devnum); 93 if (mmc_type) 94 printf(" (%s)", mmc_type); 95 96 if (entry->next != &mmc_devices) { 97 printf("%c", separator); 98 if (separator != '\n') 99 puts(" "); 100 } 101 } 102 103 printf("\n"); 104 } 105 106 #else 107 void print_mmc_devices(char separator) { } 108 #endif 109