Merge tag 'mmc-2020-3-9' of https://gitlab.denx.de/u-boot/custodians/u-boot-mmc
[oweals/u-boot.git] / drivers / mmc / mmc-uclass.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2015 Google, Inc
4  * Written by Simon Glass <sjg@chromium.org>
5  */
6
7 #include <common.h>
8 #include <mmc.h>
9 #include <dm.h>
10 #include <dm/device-internal.h>
11 #include <dm/device_compat.h>
12 #include <dm/lists.h>
13 #include <linux/compat.h>
14 #include "mmc_private.h"
15
16 int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
17                     struct mmc_data *data)
18 {
19         struct mmc *mmc = mmc_get_mmc_dev(dev);
20         struct dm_mmc_ops *ops = mmc_get_ops(dev);
21         int ret;
22
23         mmmc_trace_before_send(mmc, cmd);
24         if (ops->send_cmd)
25                 ret = ops->send_cmd(dev, cmd, data);
26         else
27                 ret = -ENOSYS;
28         mmmc_trace_after_send(mmc, cmd, ret);
29
30         return ret;
31 }
32
33 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
34 {
35         return dm_mmc_send_cmd(mmc->dev, cmd, data);
36 }
37
38 int dm_mmc_set_ios(struct udevice *dev)
39 {
40         struct dm_mmc_ops *ops = mmc_get_ops(dev);
41
42         if (!ops->set_ios)
43                 return -ENOSYS;
44         return ops->set_ios(dev);
45 }
46
47 int mmc_set_ios(struct mmc *mmc)
48 {
49         return dm_mmc_set_ios(mmc->dev);
50 }
51
52 int dm_mmc_wait_dat0(struct udevice *dev, int state, int timeout_us)
53 {
54         struct dm_mmc_ops *ops = mmc_get_ops(dev);
55
56         if (!ops->wait_dat0)
57                 return -ENOSYS;
58         return ops->wait_dat0(dev, state, timeout_us);
59 }
60
61 int mmc_wait_dat0(struct mmc *mmc, int state, int timeout_us)
62 {
63         return dm_mmc_wait_dat0(mmc->dev, state, timeout_us);
64 }
65
66 int dm_mmc_get_wp(struct udevice *dev)
67 {
68         struct dm_mmc_ops *ops = mmc_get_ops(dev);
69
70         if (!ops->get_wp)
71                 return -ENOSYS;
72         return ops->get_wp(dev);
73 }
74
75 int mmc_getwp(struct mmc *mmc)
76 {
77         return dm_mmc_get_wp(mmc->dev);
78 }
79
80 int dm_mmc_get_cd(struct udevice *dev)
81 {
82         struct dm_mmc_ops *ops = mmc_get_ops(dev);
83
84         if (!ops->get_cd)
85                 return -ENOSYS;
86         return ops->get_cd(dev);
87 }
88
89 int mmc_getcd(struct mmc *mmc)
90 {
91         return dm_mmc_get_cd(mmc->dev);
92 }
93
94 #ifdef MMC_SUPPORTS_TUNING
95 int dm_mmc_execute_tuning(struct udevice *dev, uint opcode)
96 {
97         struct dm_mmc_ops *ops = mmc_get_ops(dev);
98
99         if (!ops->execute_tuning)
100                 return -ENOSYS;
101         return ops->execute_tuning(dev, opcode);
102 }
103
104 int mmc_execute_tuning(struct mmc *mmc, uint opcode)
105 {
106         return dm_mmc_execute_tuning(mmc->dev, opcode);
107 }
108 #endif
109
110 #if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
111 int dm_mmc_set_enhanced_strobe(struct udevice *dev)
112 {
113         struct dm_mmc_ops *ops = mmc_get_ops(dev);
114
115         if (ops->set_enhanced_strobe)
116                 return ops->set_enhanced_strobe(dev);
117
118         return -ENOTSUPP;
119 }
120
121 int mmc_set_enhanced_strobe(struct mmc *mmc)
122 {
123         return dm_mmc_set_enhanced_strobe(mmc->dev);
124 }
125 #endif
126
127 int dm_mmc_host_power_cycle(struct udevice *dev)
128 {
129         struct dm_mmc_ops *ops = mmc_get_ops(dev);
130
131         if (ops->host_power_cycle)
132                 return ops->host_power_cycle(dev);
133         return 0;
134 }
135
136 int mmc_host_power_cycle(struct mmc *mmc)
137 {
138         return dm_mmc_host_power_cycle(mmc->dev);
139 }
140
141 int dm_mmc_deferred_probe(struct udevice *dev)
142 {
143         struct dm_mmc_ops *ops = mmc_get_ops(dev);
144
145         if (ops->deferred_probe)
146                 return ops->deferred_probe(dev);
147
148         return 0;
149 }
150
151 int mmc_deferred_probe(struct mmc *mmc)
152 {
153         return dm_mmc_deferred_probe(mmc->dev);
154 }
155
156 int mmc_of_parse(struct udevice *dev, struct mmc_config *cfg)
157 {
158         int val;
159
160         val = dev_read_u32_default(dev, "bus-width", 1);
161
162         switch (val) {
163         case 0x8:
164                 cfg->host_caps |= MMC_MODE_8BIT;
165                 /* fall through */
166         case 0x4:
167                 cfg->host_caps |= MMC_MODE_4BIT;
168                 /* fall through */
169         case 0x1:
170                 cfg->host_caps |= MMC_MODE_1BIT;
171                 break;
172         default:
173                 dev_err(dev, "Invalid \"bus-width\" value %u!\n", val);
174                 return -EINVAL;
175         }
176
177         /* f_max is obtained from the optional "max-frequency" property */
178         dev_read_u32(dev, "max-frequency", &cfg->f_max);
179
180         if (dev_read_bool(dev, "cap-sd-highspeed"))
181                 cfg->host_caps |= MMC_CAP(SD_HS);
182         if (dev_read_bool(dev, "cap-mmc-highspeed"))
183                 cfg->host_caps |= MMC_CAP(MMC_HS);
184         if (dev_read_bool(dev, "sd-uhs-sdr12"))
185                 cfg->host_caps |= MMC_CAP(UHS_SDR12);
186         if (dev_read_bool(dev, "sd-uhs-sdr25"))
187                 cfg->host_caps |= MMC_CAP(UHS_SDR25);
188         if (dev_read_bool(dev, "sd-uhs-sdr50"))
189                 cfg->host_caps |= MMC_CAP(UHS_SDR50);
190         if (dev_read_bool(dev, "sd-uhs-sdr104"))
191                 cfg->host_caps |= MMC_CAP(UHS_SDR104);
192         if (dev_read_bool(dev, "sd-uhs-ddr50"))
193                 cfg->host_caps |= MMC_CAP(UHS_DDR50);
194         if (dev_read_bool(dev, "mmc-ddr-1_8v"))
195                 cfg->host_caps |= MMC_CAP(MMC_DDR_52);
196         if (dev_read_bool(dev, "mmc-ddr-1_2v"))
197                 cfg->host_caps |= MMC_CAP(MMC_DDR_52);
198         if (dev_read_bool(dev, "mmc-hs200-1_8v"))
199                 cfg->host_caps |= MMC_CAP(MMC_HS_200);
200         if (dev_read_bool(dev, "mmc-hs200-1_2v"))
201                 cfg->host_caps |= MMC_CAP(MMC_HS_200);
202         if (dev_read_bool(dev, "mmc-hs400-1_8v"))
203                 cfg->host_caps |= MMC_CAP(MMC_HS_400);
204         if (dev_read_bool(dev, "mmc-hs400-1_2v"))
205                 cfg->host_caps |= MMC_CAP(MMC_HS_400);
206         if (dev_read_bool(dev, "mmc-hs400-enhanced-strobe"))
207                 cfg->host_caps |= MMC_CAP(MMC_HS_400_ES);
208
209         if (dev_read_bool(dev, "non-removable")) {
210                 cfg->host_caps |= MMC_CAP_NONREMOVABLE;
211         } else {
212                 if (dev_read_bool(dev, "cd-inverted"))
213                         cfg->host_caps |= MMC_CAP_CD_ACTIVE_HIGH;
214                 if (dev_read_bool(dev, "broken-cd"))
215                         cfg->host_caps |= MMC_CAP_NEEDS_POLL;
216         }
217
218         if (dev_read_bool(dev, "no-1-8-v")) {
219                 cfg->host_caps &= ~(UHS_CAPS | MMC_MODE_HS200 |
220                                     MMC_MODE_HS400 | MMC_MODE_HS400_ES);
221         }
222
223         return 0;
224 }
225
226 struct mmc *mmc_get_mmc_dev(struct udevice *dev)
227 {
228         struct mmc_uclass_priv *upriv;
229
230         if (!device_active(dev))
231                 return NULL;
232         upriv = dev_get_uclass_priv(dev);
233         return upriv->mmc;
234 }
235
236 #if CONFIG_IS_ENABLED(BLK)
237 struct mmc *find_mmc_device(int dev_num)
238 {
239         struct udevice *dev, *mmc_dev;
240         int ret;
241
242         ret = blk_find_device(IF_TYPE_MMC, dev_num, &dev);
243
244         if (ret) {
245 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
246                 printf("MMC Device %d not found\n", dev_num);
247 #endif
248                 return NULL;
249         }
250
251         mmc_dev = dev_get_parent(dev);
252
253         struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
254
255         return mmc;
256 }
257
258 int get_mmc_num(void)
259 {
260         return max((blk_find_max_devnum(IF_TYPE_MMC) + 1), 0);
261 }
262
263 int mmc_get_next_devnum(void)
264 {
265         return blk_find_max_devnum(IF_TYPE_MMC);
266 }
267
268 struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
269 {
270         struct blk_desc *desc;
271         struct udevice *dev;
272
273         device_find_first_child(mmc->dev, &dev);
274         if (!dev)
275                 return NULL;
276         desc = dev_get_uclass_platdata(dev);
277
278         return desc;
279 }
280
281 void mmc_do_preinit(void)
282 {
283         struct udevice *dev;
284         struct uclass *uc;
285         int ret;
286
287         ret = uclass_get(UCLASS_MMC, &uc);
288         if (ret)
289                 return;
290         uclass_foreach_dev(dev, uc) {
291                 struct mmc *m = mmc_get_mmc_dev(dev);
292
293                 if (!m)
294                         continue;
295 #ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
296                 mmc_set_preinit(m, 1);
297 #endif
298                 if (m->preinit)
299                         mmc_start_init(m);
300         }
301 }
302
303 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
304 void print_mmc_devices(char separator)
305 {
306         struct udevice *dev;
307         char *mmc_type;
308         bool first = true;
309
310         for (uclass_first_device(UCLASS_MMC, &dev);
311              dev;
312              uclass_next_device(&dev), first = false) {
313                 struct mmc *m = mmc_get_mmc_dev(dev);
314
315                 if (!first) {
316                         printf("%c", separator);
317                         if (separator != '\n')
318                                 puts(" ");
319                 }
320                 if (m->has_init)
321                         mmc_type = IS_SD(m) ? "SD" : "eMMC";
322                 else
323                         mmc_type = NULL;
324
325                 printf("%s: %d", m->cfg->name, mmc_get_blk_desc(m)->devnum);
326                 if (mmc_type)
327                         printf(" (%s)", mmc_type);
328         }
329
330         printf("\n");
331 }
332
333 #else
334 void print_mmc_devices(char separator) { }
335 #endif
336
337 int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
338 {
339         struct blk_desc *bdesc;
340         struct udevice *bdev;
341         int ret, devnum = -1;
342
343         if (!mmc_get_ops(dev))
344                 return -ENOSYS;
345 #ifndef CONFIG_SPL_BUILD
346         /* Use the fixed index with aliase node's index */
347         ret = dev_read_alias_seq(dev, &devnum);
348         debug("%s: alias ret=%d, devnum=%d\n", __func__, ret, devnum);
349 #endif
350
351         ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC,
352                         devnum, 512, 0, &bdev);
353         if (ret) {
354                 debug("Cannot create block device\n");
355                 return ret;
356         }
357         bdesc = dev_get_uclass_platdata(bdev);
358         mmc->cfg = cfg;
359         mmc->priv = dev;
360
361         /* the following chunk was from mmc_register() */
362
363         /* Setup dsr related values */
364         mmc->dsr_imp = 0;
365         mmc->dsr = 0xffffffff;
366         /* Setup the universal parts of the block interface just once */
367         bdesc->removable = 1;
368
369         /* setup initial part type */
370         bdesc->part_type = cfg->part_type;
371         mmc->dev = dev;
372
373         return 0;
374 }
375
376 int mmc_unbind(struct udevice *dev)
377 {
378         struct udevice *bdev;
379
380         device_find_first_child(dev, &bdev);
381         if (bdev) {
382                 device_remove(bdev, DM_REMOVE_NORMAL);
383                 device_unbind(bdev);
384         }
385
386         return 0;
387 }
388
389 static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
390 {
391         struct udevice *mmc_dev = dev_get_parent(bdev);
392         struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
393         struct blk_desc *desc = dev_get_uclass_platdata(bdev);
394         int ret;
395
396         if (desc->hwpart == hwpart)
397                 return 0;
398
399         if (mmc->part_config == MMCPART_NOAVAILABLE)
400                 return -EMEDIUMTYPE;
401
402         ret = mmc_switch_part(mmc, hwpart);
403         if (!ret)
404                 blkcache_invalidate(desc->if_type, desc->devnum);
405
406         return ret;
407 }
408
409 static int mmc_blk_probe(struct udevice *dev)
410 {
411         struct udevice *mmc_dev = dev_get_parent(dev);
412         struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc_dev);
413         struct mmc *mmc = upriv->mmc;
414         int ret;
415
416         ret = mmc_init(mmc);
417         if (ret) {
418                 debug("%s: mmc_init() failed (err=%d)\n", __func__, ret);
419                 return ret;
420         }
421
422         return 0;
423 }
424
425 #if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT) || \
426     CONFIG_IS_ENABLED(MMC_HS200_SUPPORT) || \
427     CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
428 static int mmc_blk_remove(struct udevice *dev)
429 {
430         struct udevice *mmc_dev = dev_get_parent(dev);
431         struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc_dev);
432         struct mmc *mmc = upriv->mmc;
433
434         return mmc_deinit(mmc);
435 }
436 #endif
437
438 static const struct blk_ops mmc_blk_ops = {
439         .read   = mmc_bread,
440 #if CONFIG_IS_ENABLED(MMC_WRITE)
441         .write  = mmc_bwrite,
442         .erase  = mmc_berase,
443 #endif
444         .select_hwpart  = mmc_select_hwpart,
445 };
446
447 U_BOOT_DRIVER(mmc_blk) = {
448         .name           = "mmc_blk",
449         .id             = UCLASS_BLK,
450         .ops            = &mmc_blk_ops,
451         .probe          = mmc_blk_probe,
452 #if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT) || \
453     CONFIG_IS_ENABLED(MMC_HS200_SUPPORT) || \
454     CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
455         .remove         = mmc_blk_remove,
456         .flags          = DM_FLAG_OS_PREPARE,
457 #endif
458 };
459 #endif /* CONFIG_BLK */
460
461
462 UCLASS_DRIVER(mmc) = {
463         .id             = UCLASS_MMC,
464         .name           = "mmc",
465         .flags          = DM_UC_FLAG_SEQ_ALIAS,
466         .per_device_auto_alloc_size = sizeof(struct mmc_uclass_priv),
467 };