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>
master
Simon Glass 9 years ago
parent fdfa39d3f2
commit e7ecf7cb5a
  1. 10
      drivers/mmc/Kconfig
  2. 2
      drivers/mmc/Makefile
  3. 34
      drivers/mmc/mmc-uclass.c
  4. 2
      drivers/mmc/mmc.c
  5. 1
      include/dm/uclass-id.h
  6. 22
      include/mmc.h

@ -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

@ -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

@ -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),
};

@ -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(',');

@ -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 */

@ -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;

Loading…
Cancel
Save