1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-29 22:41:17 +02:00

dm: mmc: Allow disabling driver model in SPL

At present if U-Boot proper uses driver model for MMC, then SPL has to
also. While this is desirable, it places a significant barrier to moving
to driver model in some cases. For example, with a space-constrained SPL
it may be necessary to enable CONFIG_SPL_OF_PLATDATA which involves
adjusting some drivers.

Add new SPL versions of the options for DM_MMC, DM_MMC_OPS and BLK. By
default these follow their non-SPL versions, but this can be changed by
boards which need it.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2017-07-04 13:31:19 -06:00
committed by Jaehoon Chung
parent 745a94f352
commit c4d660d4d0
13 changed files with 79 additions and 46 deletions

View File

@@ -115,7 +115,7 @@ static int spl_mmc_get_device_index(u32 boot_device)
static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device) static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device)
{ {
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
struct udevice *dev; struct udevice *dev;
#endif #endif
int err, mmc_dev; int err, mmc_dev;
@@ -132,7 +132,7 @@ static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device)
return err; return err;
} }
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
err = uclass_get_device(UCLASS_MMC, mmc_dev, &dev); err = uclass_get_device(UCLASS_MMC, mmc_dev, &dev);
if (!err) if (!err)
*mmcp = mmc_get_mmc_dev(dev); *mmcp = mmc_get_mmc_dev(dev);

View File

@@ -10,6 +10,18 @@ config BLK
be partitioned into several areas, called 'partitions' in U-Boot. be partitioned into several areas, called 'partitions' in U-Boot.
A filesystem can be placed in each partition. A filesystem can be placed in each partition.
config SPL_BLK
bool "Support block devices in SPL"
depends on SPL_DM && BLK
default y
help
Enable support for block devices, such as SCSI, MMC and USB
flash sticks. These provide a block-level interface which permits
reading, writing and (in some cases) erasing blocks. Block
devices often have a partition table which allows the device to
be partitioned into several areas, called 'partitions' in U-Boot.
A filesystem can be placed in each partition.
config BLOCK_CACHE config BLOCK_CACHE
bool "Use block device cache" bool "Use block device cache"
default n default n

View File

@@ -5,9 +5,9 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
obj-$(CONFIG_BLK) += blk-uclass.o obj-$(CONFIG_$(SPL_)BLK) += blk-uclass.o
ifndef CONFIG_BLK ifndef CONFIG_$(SPL_)BLK
obj-y += blk_legacy.o obj-y += blk_legacy.o
endif endif

View File

@@ -30,6 +30,27 @@ config DM_MMC_OPS
option will be removed as soon as all DM_MMC drivers use it, as it option will be removed as soon as all DM_MMC drivers use it, as it
will the only supported behaviour. will the only supported behaviour.
config SPL_DM_MMC
bool "Enable MMC controllers using Driver Model in SPL"
depends on SPL_DM && DM_MMC
default y
help
This enables the MultiMediaCard (MMC) uclass which supports 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 SPL_DM_MMC_OPS
bool "Support MMC controller operations using Driver Model in SPL"
depends on SPL_DM && DM_MMC_OPS
default y
help
Driver model provides a means of supporting device operations. This
option moves MMC operations under the control of driver model. The
option will be removed as soon as all DM_MMC drivers use it, as it
will the only supported behaviour.
if MMC if MMC
config SPL_MMC_TINY config SPL_MMC_TINY

View File

@@ -6,9 +6,9 @@
# #
obj-y += mmc.o obj-y += mmc.o
obj-$(CONFIG_DM_MMC) += mmc-uclass.o obj-$(CONFIG_$(SPL_)DM_MMC) += mmc-uclass.o
ifndef CONFIG_BLK ifndef CONFIG_$(SPL_)BLK
obj-y += mmc_legacy.o obj-y += mmc_legacy.o
endif endif

View File

@@ -15,7 +15,7 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DM_MMC_OPS #if CONFIG_IS_ENABLED(DM_MMC_OPS)
int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
struct mmc_data *data) struct mmc_data *data)
{ {
@@ -91,7 +91,7 @@ struct mmc *mmc_get_mmc_dev(struct udevice *dev)
return upriv->mmc; return upriv->mmc;
} }
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
struct mmc *find_mmc_device(int dev_num) struct mmc *find_mmc_device(int dev_num)
{ {
struct udevice *dev, *mmc_dev; struct udevice *dev, *mmc_dev;
@@ -198,7 +198,7 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
struct udevice *bdev; struct udevice *bdev;
int ret, devnum = -1; int ret, devnum = -1;
#ifdef CONFIG_DM_MMC_OPS #if CONFIG_IS_ENABLED(DM_MMC_OPS)
if (!mmc_get_ops(dev)) if (!mmc_get_ops(dev))
return -ENOSYS; return -ENOSYS;
#endif #endif

View File

@@ -53,7 +53,7 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
} }
#endif #endif
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
__weak int board_mmc_getwp(struct mmc *mmc) __weak int board_mmc_getwp(struct mmc *mmc)
{ {
return -1; return -1;
@@ -149,7 +149,7 @@ void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
} }
#endif #endif
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
{ {
int ret; int ret;
@@ -261,14 +261,14 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
return blkcnt; return blkcnt;
} }
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst) ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
#else #else
ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt, ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
void *dst) void *dst)
#endif #endif
{ {
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
struct blk_desc *block_dev = dev_get_uclass_platdata(dev); struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
#endif #endif
int dev_num = block_dev->devnum; int dev_num = block_dev->devnum;
@@ -839,7 +839,7 @@ int mmc_hwpart_config(struct mmc *mmc,
return 0; return 0;
} }
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
int mmc_getcd(struct mmc *mmc) int mmc_getcd(struct mmc *mmc)
{ {
int cd; int cd;
@@ -1075,7 +1075,7 @@ static const u8 multipliers[] = {
80, 80,
}; };
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
static void mmc_set_ios(struct mmc *mmc) static void mmc_set_ios(struct mmc *mmc)
{ {
if (mmc->cfg->ops->set_ios) if (mmc->cfg->ops->set_ios)
@@ -1608,7 +1608,7 @@ static int mmc_send_if_cond(struct mmc *mmc)
return 0; return 0;
} }
#ifndef CONFIG_DM_MMC #if !CONFIG_IS_ENABLED(DM_MMC)
/* board-specific MMC power initializations. */ /* board-specific MMC power initializations. */
__weak void board_mmc_power_init(void) __weak void board_mmc_power_init(void)
{ {
@@ -1617,7 +1617,7 @@ __weak void board_mmc_power_init(void)
static int mmc_power_init(struct mmc *mmc) static int mmc_power_init(struct mmc *mmc)
{ {
#if defined(CONFIG_DM_MMC) #if CONFIG_IS_ENABLED(DM_MMC)
#if defined(CONFIG_DM_REGULATOR) && !defined(CONFIG_SPL_BUILD) #if defined(CONFIG_DM_REGULATOR) && !defined(CONFIG_SPL_BUILD)
struct udevice *vmmc_supply; struct udevice *vmmc_supply;
int ret; int ret;
@@ -1652,7 +1652,7 @@ int mmc_start_init(struct mmc *mmc)
/* we pretend there's no card when init is NULL */ /* we pretend there's no card when init is NULL */
no_card = mmc_getcd(mmc) == 0; no_card = mmc_getcd(mmc) == 0;
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
no_card = no_card || (mmc->cfg->ops->init == NULL); no_card = no_card || (mmc->cfg->ops->init == NULL);
#endif #endif
if (no_card) { if (no_card) {
@@ -1673,7 +1673,7 @@ int mmc_start_init(struct mmc *mmc)
if (err) if (err)
return err; return err;
#ifdef CONFIG_DM_MMC_OPS #if CONFIG_IS_ENABLED(DM_MMC_OPS)
/* The device has already been probed ready for use */ /* The device has already been probed ready for use */
#else #else
/* made sure it's not NULL earlier */ /* made sure it's not NULL earlier */
@@ -1739,7 +1739,7 @@ int mmc_init(struct mmc *mmc)
{ {
int err = 0; int err = 0;
__maybe_unused unsigned start; __maybe_unused unsigned start;
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev); struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
upriv->mmc = mmc; upriv->mmc = mmc;
@@ -1783,12 +1783,12 @@ void mmc_set_preinit(struct mmc *mmc, int preinit)
mmc->preinit = preinit; mmc->preinit = preinit;
} }
#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD) #if CONFIG_IS_ENABLED(DM_MMC) && defined(CONFIG_SPL_BUILD)
static int mmc_probe(bd_t *bis) static int mmc_probe(bd_t *bis)
{ {
return 0; return 0;
} }
#elif defined(CONFIG_DM_MMC) #elif CONFIG_IS_ENABLED(DM_MMC)
static int mmc_probe(bd_t *bis) static int mmc_probe(bd_t *bis)
{ {
int ret, i; int ret, i;
@@ -1835,7 +1835,7 @@ int mmc_initialize(bd_t *bis)
return 0; return 0;
initialized = 1; initialized = 1;
#ifndef CONFIG_BLK #if !CONFIG_IS_ENABLED(BLK)
#if !CONFIG_IS_ENABLED(MMC_TINY) #if !CONFIG_IS_ENABLED(MMC_TINY)
mmc_list_init(); mmc_list_init();
#endif #endif

View File

@@ -150,7 +150,7 @@ struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
cfg->f_max == 0 || cfg->b_max == 0) cfg->f_max == 0 || cfg->b_max == 0)
return NULL; return NULL;
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
if (cfg->ops == NULL || cfg->ops->send_cmd == NULL) if (cfg->ops == NULL || cfg->ops->send_cmd == NULL)
return NULL; return NULL;
#endif #endif

View File

@@ -20,7 +20,7 @@ extern int mmc_set_blocklen(struct mmc *mmc, int len);
void mmc_adapter_card_type_ident(void); void mmc_adapter_card_type_ident(void);
#endif #endif
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
void *dst); void *dst);
#else #else
@@ -30,7 +30,7 @@ ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
#if !(defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_SAVEENV)) #if !(defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_SAVEENV))
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
const void *src); const void *src);
ulong mmc_berase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt); ulong mmc_berase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt);
@@ -44,7 +44,7 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt);
/* declare dummies to reduce code size. */ /* declare dummies to reduce code size. */
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
static inline unsigned long mmc_berase(struct udevice *dev, static inline unsigned long mmc_berase(struct udevice *dev,
lbaint_t start, lbaint_t blkcnt) lbaint_t start, lbaint_t blkcnt)
{ {

View File

@@ -62,11 +62,11 @@ struct omap2_mmc_platform_config {
struct omap_hsmmc_data { struct omap_hsmmc_data {
struct hsmmc *base_addr; struct hsmmc *base_addr;
#ifndef CONFIG_DM_MMC #if !CONFIG_IS_ENABLED(DM_MMC)
struct mmc_config cfg; struct mmc_config cfg;
#endif #endif
#ifdef OMAP_HSMMC_USE_GPIO #ifdef OMAP_HSMMC_USE_GPIO
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
struct gpio_desc cd_gpio; /* Change Detect GPIO */ struct gpio_desc cd_gpio; /* Change Detect GPIO */
struct gpio_desc wp_gpio; /* Write Protect GPIO */ struct gpio_desc wp_gpio; /* Write Protect GPIO */
bool cd_inverted; bool cd_inverted;
@@ -86,7 +86,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
static inline struct omap_hsmmc_data *omap_hsmmc_get_data(struct mmc *mmc) static inline struct omap_hsmmc_data *omap_hsmmc_get_data(struct mmc *mmc)
{ {
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
return dev_get_priv(mmc->dev); return dev_get_priv(mmc->dev);
#else #else
return (struct omap_hsmmc_data *)mmc->priv; return (struct omap_hsmmc_data *)mmc->priv;
@@ -94,7 +94,7 @@ static inline struct omap_hsmmc_data *omap_hsmmc_get_data(struct mmc *mmc)
} }
static inline struct mmc_config *omap_hsmmc_get_cfg(struct mmc *mmc) static inline struct mmc_config *omap_hsmmc_get_cfg(struct mmc *mmc)
{ {
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
struct omap_hsmmc_plat *plat = dev_get_platdata(mmc->dev); struct omap_hsmmc_plat *plat = dev_get_platdata(mmc->dev);
return &plat->cfg; return &plat->cfg;
#else #else
@@ -102,7 +102,7 @@ static inline struct mmc_config *omap_hsmmc_get_cfg(struct mmc *mmc)
#endif #endif
} }
#if defined(OMAP_HSMMC_USE_GPIO) && !defined(CONFIG_DM_MMC) #if defined(OMAP_HSMMC_USE_GPIO) && !CONFIG_IS_ENABLED(DM_MMC)
static int omap_mmc_setup_gpio_in(int gpio, const char *label) static int omap_mmc_setup_gpio_in(int gpio, const char *label)
{ {
int ret; int ret;
@@ -326,7 +326,7 @@ static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
} }
} }
} }
#ifndef CONFIG_DM_MMC #if !CONFIG_IS_ENABLED(DM_MMC)
static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
struct mmc_data *data) struct mmc_data *data)
{ {
@@ -564,7 +564,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
return 0; return 0;
} }
#ifndef CONFIG_DM_MMC #if !CONFIG_IS_ENABLED(DM_MMC)
static int omap_hsmmc_set_ios(struct mmc *mmc) static int omap_hsmmc_set_ios(struct mmc *mmc)
{ {
struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc); struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
@@ -630,7 +630,7 @@ static int omap_hsmmc_set_ios(struct udevice *dev)
} }
#ifdef OMAP_HSMMC_USE_GPIO #ifdef OMAP_HSMMC_USE_GPIO
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
static int omap_hsmmc_getcd(struct udevice *dev) static int omap_hsmmc_getcd(struct udevice *dev)
{ {
struct omap_hsmmc_data *priv = dev_get_priv(dev); struct omap_hsmmc_data *priv = dev_get_priv(dev);
@@ -688,7 +688,7 @@ static int omap_hsmmc_getwp(struct mmc *mmc)
#endif #endif
#endif #endif
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
static const struct dm_mmc_ops omap_hsmmc_ops = { static const struct dm_mmc_ops omap_hsmmc_ops = {
.send_cmd = omap_hsmmc_send_cmd, .send_cmd = omap_hsmmc_send_cmd,
.set_ios = omap_hsmmc_set_ios, .set_ios = omap_hsmmc_set_ios,
@@ -709,7 +709,7 @@ static const struct mmc_ops omap_hsmmc_ops = {
}; };
#endif #endif
#ifndef CONFIG_DM_MMC #if !CONFIG_IS_ENABLED(DM_MMC)
int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio, int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
int wp_gpio) int wp_gpio)
{ {

View File

@@ -451,7 +451,7 @@ static void scsi_init_dev_desc_priv(struct blk_desc *dev_desc)
dev_desc->product[0] = 0; dev_desc->product[0] = 0;
dev_desc->revision[0] = 0; dev_desc->revision[0] = 0;
dev_desc->removable = false; dev_desc->removable = false;
#ifndef CONFIG_BLK #if !CONFIG_IS_ENABLED(BLK)
dev_desc->block_read = scsi_read; dev_desc->block_read = scsi_read;
dev_desc->block_write = scsi_write; dev_desc->block_write = scsi_write;
#endif #endif

View File

@@ -62,7 +62,7 @@ struct blk_desc {
char vendor[40+1]; /* IDE model, SCSI Vendor */ char vendor[40+1]; /* IDE model, SCSI Vendor */
char product[20+1]; /* IDE Serial no, SCSI product */ char product[20+1]; /* IDE Serial no, SCSI product */
char revision[8+1]; /* firmware revision */ char revision[8+1]; /* firmware revision */
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
/* /*
* For now we have a few functions which take struct blk_desc as a * For now we have a few functions which take struct blk_desc as a
* parameter. This field allows them to look up the associated * parameter. This field allows them to look up the associated
@@ -174,7 +174,7 @@ static inline void blkcache_invalidate(int iftype, int dev) {}
#endif #endif
#ifdef CONFIG_BLK #if CONFIG_IS_ENABLED(BLK)
struct udevice; struct udevice;
/* Operations on block devices */ /* Operations on block devices */

View File

@@ -321,7 +321,7 @@ struct mmc_data {
/* forward decl. */ /* forward decl. */
struct mmc; struct mmc;
#ifdef CONFIG_DM_MMC_OPS #if CONFIG_IS_ENABLED(DM_MMC_OPS)
struct dm_mmc_ops { struct dm_mmc_ops {
/** /**
* send_cmd() - Send a command to the MMC device * send_cmd() - Send a command to the MMC device
@@ -385,7 +385,7 @@ struct mmc_ops {
struct mmc_config { struct mmc_config {
const char *name; const char *name;
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
const struct mmc_ops *ops; const struct mmc_ops *ops;
#endif #endif
uint host_caps; uint host_caps;
@@ -409,7 +409,7 @@ struct sd_ssr {
* TODO struct mmc should be in mmc_private but it's hard to fix right now * TODO struct mmc should be in mmc_private but it's hard to fix right now
*/ */
struct mmc { struct mmc {
#ifndef CONFIG_BLK #if !CONFIG_IS_ENABLED(BLK)
struct list_head link; struct list_head link;
#endif #endif
const struct mmc_config *cfg; /* provided configuration */ const struct mmc_config *cfg; /* provided configuration */
@@ -444,14 +444,14 @@ struct mmc {
u64 capacity_gp[4]; u64 capacity_gp[4];
u64 enh_user_start; u64 enh_user_start;
u64 enh_user_size; u64 enh_user_size;
#ifndef CONFIG_BLK #if !CONFIG_IS_ENABLED(BLK)
struct blk_desc block_dev; struct blk_desc block_dev;
#endif #endif
char op_cond_pending; /* 1 if we are waiting on an op_cond command */ char op_cond_pending; /* 1 if we are waiting on an op_cond command */
char init_in_progress; /* 1 if we have done mmc_start_init() */ char init_in_progress; /* 1 if we have done mmc_start_init() */
char preinit; /* start init as early as possible */ char preinit; /* start init as early as possible */
int ddr_mode; int ddr_mode;
#ifdef CONFIG_DM_MMC #if CONFIG_IS_ENABLED(DM_MMC)
struct udevice *dev; /* Device for this MMC controller */ struct udevice *dev; /* Device for this MMC controller */
#endif #endif
}; };
@@ -519,7 +519,7 @@ int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf, int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
enum mmc_hwpart_conf_mode mode); enum mmc_hwpart_conf_mode mode);
#ifndef CONFIG_DM_MMC_OPS #if !CONFIG_IS_ENABLED(DM_MMC_OPS)
int mmc_getcd(struct mmc *mmc); int mmc_getcd(struct mmc *mmc);
int board_mmc_getcd(struct mmc *mmc); int board_mmc_getcd(struct mmc *mmc);
int mmc_getwp(struct mmc *mmc); int mmc_getwp(struct mmc *mmc);