Merge branch 'master' of git://git.denx.de/u-boot
[oweals/u-boot.git] / drivers / mmc / mmc_legacy.c
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