[U-Boot] [PATCH v2 02/15] dm: mmc: Allow disabling driver model in SPL
Jean-Jacques Hiblot
jjhiblot at ti.com
Thu Jul 6 14:55:09 UTC 2017
Hi Simon,
On 04/07/2017 21:31, Simon Glass wrote:
> 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 at chromium.org>
> ---
>
> Changes in v2: None
>
> common/spl/spl_mmc.c | 4 ++--
> drivers/block/Kconfig | 12 ++++++++++++
> drivers/block/Makefile | 4 ++--
> drivers/mmc/Kconfig | 21 +++++++++++++++++++++
> drivers/mmc/Makefile | 4 ++--
> drivers/mmc/mmc-uclass.c | 6 +++---
> drivers/mmc/mmc.c | 28 ++++++++++++++--------------
> drivers/mmc/mmc_legacy.c | 2 +-
> drivers/mmc/mmc_private.h | 6 +++---
> drivers/mmc/omap_hsmmc.c | 20 ++++++++++----------
> drivers/scsi/scsi.c | 2 +-
> include/blk.h | 4 ++--
> include/mmc.h | 12 ++++++------
> 13 files changed, 79 insertions(+), 46 deletions(-)
>
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index 18c1b59b22..953e484e27 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -115,7 +115,7 @@ int spl_mmc_get_device_index(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;
> #endif
> int err, mmc_dev;
> @@ -132,7 +132,7 @@ static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device)
> return err;
> }
>
> -#ifdef CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> err = uclass_get_device(UCLASS_MMC, mmc_dev, &dev);
> if (!err)
> *mmcp = mmc_get_mmc_dev(dev);
> diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
> index ca7692d8a5..26760895f9 100644
> --- a/drivers/block/Kconfig
> +++ b/drivers/block/Kconfig
> @@ -10,6 +10,18 @@ config BLK
> be partitioned into several areas, called 'partitions' in U-Boot.
> 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
> bool "Use block device cache"
> default n
> diff --git a/drivers/block/Makefile b/drivers/block/Makefile
> index a5e7307c97..dea2c15c14 100644
> --- a/drivers/block/Makefile
> +++ b/drivers/block/Makefile
> @@ -5,9 +5,9 @@
> # 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
> endif
>
> diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
> index 82b8d75686..51a87cdd77 100644
> --- a/drivers/mmc/Kconfig
> +++ b/drivers/mmc/Kconfig
> @@ -30,6 +30,27 @@ config DM_MMC_OPS
> option will be removed as soon as all DM_MMC drivers use it, as it
> 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
>
> config SPL_MMC_TINY
> diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile
> index 2d781c38a6..a6becb2309 100644
> --- a/drivers/mmc/Makefile
> +++ b/drivers/mmc/Makefile
> @@ -6,9 +6,9 @@
> #
>
> 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
> endif
There are numerous places where #if(n)defCONFIG_BLK is used, should they
not all be replaced with #if CONFIG_IS_ENABLED(BLK) ? In my case
common/env_mmc.c won't compile because of this.
Other than this problem with common/env_mmc.c and a few other
adjustments not related to the mmc that unselecting DM_SPL required,
this has been tested OK on a TI DRA72 evm.
Jean-Jacques
>
> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
> index 994d2686f4..3e907253ea 100644
> --- a/drivers/mmc/mmc-uclass.c
> +++ b/drivers/mmc/mmc-uclass.c
> @@ -15,7 +15,7 @@
>
> 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,
> struct mmc_data *data)
> {
> @@ -91,7 +91,7 @@ struct mmc *mmc_get_mmc_dev(struct udevice *dev)
> return upriv->mmc;
> }
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> struct mmc *find_mmc_device(int dev_num)
> {
> 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;
> int ret, devnum = -1;
>
> -#ifdef CONFIG_DM_MMC_OPS
> +#if CONFIG_IS_ENABLED(DM_MMC_OPS)
> if (!mmc_get_ops(dev))
> return -ENOSYS;
> #endif
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 3cdf6a4f3b..38e1c800e1 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -53,7 +53,7 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
> }
> #endif
>
> -#ifndef CONFIG_DM_MMC_OPS
> +#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
> __weak int board_mmc_getwp(struct mmc *mmc)
> {
> return -1;
> @@ -149,7 +149,7 @@ void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
> }
> #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 ret;
> @@ -261,14 +261,14 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
> return blkcnt;
> }
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
> #else
> ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
> void *dst)
> #endif
> {
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
> #endif
> int dev_num = block_dev->devnum;
> @@ -839,7 +839,7 @@ int mmc_hwpart_config(struct mmc *mmc,
> return 0;
> }
>
> -#ifndef CONFIG_DM_MMC_OPS
> +#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
> int mmc_getcd(struct mmc *mmc)
> {
> int cd;
> @@ -1075,7 +1075,7 @@ static const u8 multipliers[] = {
> 80,
> };
>
> -#ifndef CONFIG_DM_MMC_OPS
> +#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
> static void mmc_set_ios(struct mmc *mmc)
> {
> if (mmc->cfg->ops->set_ios)
> @@ -1608,7 +1608,7 @@ static int mmc_send_if_cond(struct mmc *mmc)
> return 0;
> }
>
> -#ifndef CONFIG_DM_MMC
> +#if !CONFIG_IS_ENABLED(DM_MMC)
> /* board-specific MMC power initializations. */
> __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)
> {
> -#if defined(CONFIG_DM_MMC)
> +#if CONFIG_IS_ENABLED(DM_MMC)
> #if defined(CONFIG_DM_REGULATOR) && !defined(CONFIG_SPL_BUILD)
> struct udevice *vmmc_supply;
> int ret;
> @@ -1652,7 +1652,7 @@ int mmc_start_init(struct mmc *mmc)
>
> /* we pretend there's no card when init is NULL */
> 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);
> #endif
> if (no_card) {
> @@ -1673,7 +1673,7 @@ int mmc_start_init(struct mmc *mmc)
> if (err)
> return err;
>
> -#ifdef CONFIG_DM_MMC_OPS
> +#if CONFIG_IS_ENABLED(DM_MMC_OPS)
> /* The device has already been probed ready for use */
> #else
> /* made sure it's not NULL earlier */
> @@ -1739,7 +1739,7 @@ int mmc_init(struct mmc *mmc)
> {
> int err = 0;
> __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);
>
> upriv->mmc = mmc;
> @@ -1783,12 +1783,12 @@ void mmc_set_preinit(struct mmc *mmc, int 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)
> {
> return 0;
> }
> -#elif defined(CONFIG_DM_MMC)
> +#elif CONFIG_IS_ENABLED(DM_MMC)
> static int mmc_probe(bd_t *bis)
> {
> int ret, i;
> @@ -1835,7 +1835,7 @@ int mmc_initialize(bd_t *bis)
> return 0;
> initialized = 1;
>
> -#ifndef CONFIG_BLK
> +#if !CONFIG_IS_ENABLED(BLK)
> #if !CONFIG_IS_ENABLED(MMC_TINY)
> mmc_list_init();
> #endif
> diff --git a/drivers/mmc/mmc_legacy.c b/drivers/mmc/mmc_legacy.c
> index bdf9d984dd..59dc3df35f 100644
> --- a/drivers/mmc/mmc_legacy.c
> +++ b/drivers/mmc/mmc_legacy.c
> @@ -150,7 +150,7 @@ struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
> cfg->f_max == 0 || cfg->b_max == 0)
> return NULL;
>
> -#ifndef CONFIG_DM_MMC_OPS
> +#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
> if (cfg->ops == NULL || cfg->ops->send_cmd == NULL)
> return NULL;
> #endif
> diff --git a/drivers/mmc/mmc_private.h b/drivers/mmc/mmc_private.h
> index 03bf24d5fe..1290eed590 100644
> --- a/drivers/mmc/mmc_private.h
> +++ b/drivers/mmc/mmc_private.h
> @@ -20,7 +20,7 @@ extern int mmc_set_blocklen(struct mmc *mmc, int len);
> void mmc_adapter_card_type_ident(void);
> #endif
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
> void *dst);
> #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))
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
> const void *src);
> 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. */
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> static inline unsigned long mmc_berase(struct udevice *dev,
> lbaint_t start, lbaint_t blkcnt)
> {
> diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
> index bb10caaf32..efa43896fc 100644
> --- a/drivers/mmc/omap_hsmmc.c
> +++ b/drivers/mmc/omap_hsmmc.c
> @@ -62,11 +62,11 @@ struct omap2_mmc_platform_config {
>
> struct omap_hsmmc_data {
> struct hsmmc *base_addr;
> -#ifndef CONFIG_DM_MMC
> +#if !CONFIG_IS_ENABLED(DM_MMC)
> struct mmc_config cfg;
> #endif
> #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 wp_gpio; /* Write Protect GPIO */
> 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)
> {
> -#ifdef CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> return dev_get_priv(mmc->dev);
> #else
> 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)
> {
> -#ifdef CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> struct omap_hsmmc_plat *plat = dev_get_platdata(mmc->dev);
> return &plat->cfg;
> #else
> @@ -102,7 +102,7 @@ static inline struct mmc_config *omap_hsmmc_get_cfg(struct mmc *mmc)
> #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)
> {
> 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,
> struct mmc_data *data)
> {
> @@ -564,7 +564,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
> return 0;
> }
>
> -#ifndef CONFIG_DM_MMC
> +#if !CONFIG_IS_ENABLED(DM_MMC)
> static int omap_hsmmc_set_ios(struct mmc *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 CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> static int omap_hsmmc_getcd(struct udevice *dev)
> {
> struct omap_hsmmc_data *priv = dev_get_priv(dev);
> @@ -688,7 +688,7 @@ static int omap_hsmmc_getwp(struct mmc *mmc)
> #endif
> #endif
>
> -#ifdef CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> static const struct dm_mmc_ops omap_hsmmc_ops = {
> .send_cmd = omap_hsmmc_send_cmd,
> .set_ios = omap_hsmmc_set_ios,
> @@ -709,7 +709,7 @@ static const struct mmc_ops omap_hsmmc_ops = {
> };
> #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 wp_gpio)
> {
> diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
> index 7ec7ecc295..f192ca597c 100644
> --- a/drivers/scsi/scsi.c
> +++ b/drivers/scsi/scsi.c
> @@ -451,7 +451,7 @@ static void scsi_init_dev_desc_priv(struct blk_desc *dev_desc)
> dev_desc->product[0] = 0;
> dev_desc->revision[0] = 0;
> dev_desc->removable = false;
> -#ifndef CONFIG_BLK
> +#if !CONFIG_IS_ENABLED(BLK)
> dev_desc->block_read = scsi_read;
> dev_desc->block_write = scsi_write;
> #endif
> diff --git a/include/blk.h b/include/blk.h
> index ef29a07ee2..1e6239ac9e 100644
> --- a/include/blk.h
> +++ b/include/blk.h
> @@ -62,7 +62,7 @@ struct blk_desc {
> char vendor[40+1]; /* IDE model, SCSI Vendor */
> char product[20+1]; /* IDE Serial no, SCSI product */
> 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
> * parameter. This field allows them to look up the associated
> @@ -174,7 +174,7 @@ static inline void blkcache_invalidate(int iftype, int dev) {}
>
> #endif
>
> -#ifdef CONFIG_BLK
> +#if CONFIG_IS_ENABLED(BLK)
> struct udevice;
>
> /* Operations on block devices */
> diff --git a/include/mmc.h b/include/mmc.h
> index 00576fa3d0..ad9716c057 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -321,7 +321,7 @@ struct mmc_data {
> /* forward decl. */
> struct mmc;
>
> -#ifdef CONFIG_DM_MMC_OPS
> +#if CONFIG_IS_ENABLED(DM_MMC_OPS)
> struct dm_mmc_ops {
> /**
> * send_cmd() - Send a command to the MMC device
> @@ -385,7 +385,7 @@ struct mmc_ops {
>
> struct mmc_config {
> const char *name;
> -#ifndef CONFIG_DM_MMC_OPS
> +#if !CONFIG_IS_ENABLED(DM_MMC_OPS)
> const struct mmc_ops *ops;
> #endif
> 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
> */
> struct mmc {
> -#ifndef CONFIG_BLK
> +#if !CONFIG_IS_ENABLED(BLK)
> struct list_head link;
> #endif
> const struct mmc_config *cfg; /* provided configuration */
> @@ -444,14 +444,14 @@ struct mmc {
> u64 capacity_gp[4];
> u64 enh_user_start;
> u64 enh_user_size;
> -#ifndef CONFIG_BLK
> +#if !CONFIG_IS_ENABLED(BLK)
> struct blk_desc block_dev;
> #endif
> 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 preinit; /* start init as early as possible */
> int ddr_mode;
> -#ifdef CONFIG_DM_MMC
> +#if CONFIG_IS_ENABLED(DM_MMC)
> struct udevice *dev; /* Device for this MMC controller */
> #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,
> 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 board_mmc_getcd(struct mmc *mmc);
> int mmc_getwp(struct mmc *mmc);
More information about the U-Boot
mailing list