diff options
author | Simon Glass <sjg@chromium.org> | 2015-06-23 15:38:48 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-07-21 17:39:25 -0600 |
commit | e7ecf7cb5a6b873daf2d88daf03034d51fad4acc (patch) | |
tree | d7bc50bfa1fc488a40f5a05795325c03653a0417 | |
parent | fdfa39d3f20b669b0cdb8f5e934003e5689fd911 (diff) | |
download | u-boot-imx-e7ecf7cb5a6b873daf2d88daf03034d51fad4acc.zip u-boot-imx-e7ecf7cb5a6b873daf2d88daf03034d51fad4acc.tar.gz u-boot-imx-e7ecf7cb5a6b873daf2d88daf03034d51fad4acc.tar.bz2 |
dm: mmc: Add an MMC uclass
Add basic support for MMC, providing a uclass which can set up an MMC
device. This allows MMC drivers to move to using driver model.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | drivers/mmc/Kconfig | 10 | ||||
-rw-r--r-- | drivers/mmc/Makefile | 2 | ||||
-rw-r--r-- | drivers/mmc/mmc-uclass.c | 34 | ||||
-rw-r--r-- | drivers/mmc/mmc.c | 2 | ||||
-rw-r--r-- | include/dm/uclass-id.h | 1 | ||||
-rw-r--r-- | include/mmc.h | 22 |
6 files changed, 71 insertions, 0 deletions
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 7ba85a2..3e835f7 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -1,5 +1,15 @@ menu "MMC Host controller Support" +config DM_MMC + bool "Enable MMC controllers using Driver Model" + depends on DM + help + This enables the MultiMediaCard (MMC) uclass which suports MMC and + Secure Digital I/O (SDIO) cards. Both removable (SD, micro-SD, etc.) + and non-removable (e.g. eMMC chip) devices are supported. These + appear as block devices in U-Boot and can support filesystems such + as EXT4 and FAT. + config SH_SDHI bool "SuperH/Renesas ARM SoCs on-chip SDHI host controller support" depends on RMOBILE diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index ed73687..2680c63 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -5,6 +5,8 @@ # SPDX-License-Identifier: GPL-2.0+ # +obj-$(CONFIG_DM_MMC) += mmc-uclass.o + obj-$(CONFIG_ARM_PL180_MMCI) += arm_pl180_mmci.o obj-$(CONFIG_BCM2835_SDHCI) += bcm2835_sdhci.o obj-$(CONFIG_BFIN_SDH) += bfin_sdh.o diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c new file mode 100644 index 0000000..777489f --- /dev/null +++ b/drivers/mmc/mmc-uclass.c @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 Google, Inc + * Written by Simon Glass <sjg@chromium.org> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <mmc.h> +#include <dm.h> +#include <dm/lists.h> +#include <dm/root.h> + +struct mmc *mmc_get_mmc_dev(struct udevice *dev) +{ + struct mmc_uclass_priv *upriv; + + if (!device_active(dev)) + return NULL; + upriv = dev_get_uclass_priv(dev); + return upriv->mmc; +} + +U_BOOT_DRIVER(mmc) = { + .name = "mmc", + .id = UCLASS_MMC, +}; + +UCLASS_DRIVER(mmc) = { + .id = UCLASS_MMC, + .name = "mmc", + .flags = DM_UC_FLAG_SEQ_ALIAS, + .per_device_auto_alloc_size = sizeof(struct mmc_uclass_priv), +}; diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 79e6fee..4eab274 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1761,8 +1761,10 @@ int mmc_initialize(bd_t *bis) INIT_LIST_HEAD (&mmc_devices); cur_dev_num = 0; +#ifndef CONFIG_DM_MMC if (board_mmc_init(bis) < 0) cpu_mmc_init(bis); +#endif #ifndef CONFIG_SPL_BUILD print_mmc_devices(','); diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index a961648..cba7c0a 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -36,6 +36,7 @@ enum uclass_id { UCLASS_LED, /* Light-emitting diode (LED) */ UCLASS_LPC, /* x86 'low pin count' interface */ UCLASS_MASS_STORAGE, /* Mass storage device */ + UCLASS_MMC, /* SD / MMC card or chip */ UCLASS_MOD_EXP, /* RSA Mod Exp device */ UCLASS_PCH, /* x86 platform controller hub */ UCLASS_PCI, /* PCI bus */ diff --git a/include/mmc.h b/include/mmc.h index dd98b3b..cda9a19 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -266,6 +266,28 @@ #define MMC_NUM_BOOT_PARTITION 2 #define MMC_PART_RPMB 3 /* RPMB partition number */ +/* Driver model support */ + +/** + * struct mmc_uclass_priv - Holds information about a device used by the uclass + */ +struct mmc_uclass_priv { + struct mmc *mmc; +}; + +/** + * mmc_get_mmc_dev() - get the MMC struct pointer for a device + * + * Provided that the device is already probed and ready for use, this value + * will be available. + * + * @dev: Device + * @return associated mmc struct pointer if available, else NULL + */ +struct mmc *mmc_get_mmc_dev(struct udevice *dev); + +/* End of driver model support */ + struct mmc_cid { unsigned long psn; unsigned short oid; |