dm: mmc: Tidy up handling of block devices
Subsystems (4)
cover dm: mmc: Tidy up handling of block devices
The current MMC block device support has a few deficiencies which show up when both CONFIG_BLK and CONFIG_DM_MMC_OPS are defined:
- Block device numbering does not always following MMC device numbering
- Environment in MMC does not always work correctly
In addition some parts of the code can be implemented in a better way.
This series fixes the above problems, adds a few tests and converts Tegra over to use CONFIG_BLK and CONFIG_DM_MMC_OPS.
Simon Glass (8):
dm: mmc: Don't re-init when accessing environment
dm: blk: Allow finding block devices without probing
dm: blk: Add a function to find the next block device number
dm: blk: Improve block device claiming
dm: mmc: Avoid probing block devices in find_mmc_device()
dm: mmc: Check that drivers have operations
dm: mmc: Rewrite mmc_blk_probe()
tegra: Convert MMC to use driver model for operations
arch/sandbox/dts/test.dts | 12 +++++- board/toradex/common/tdx-cfg-block.c | 2 +- common/env_mmc.c | 3 +- configs/apalis-tk1_defconfig | 2 - configs/apalis_t30_defconfig | 2 - configs/beaver_defconfig | 2 - configs/cardhu_defconfig | 2 - configs/cei-tk1-som_defconfig | 2 - configs/colibri_t20_defconfig | 2 - configs/colibri_t30_defconfig | 2 - configs/dalmore_defconfig | 2 - configs/e2220-1170_defconfig | 2 - configs/harmony_defconfig | 2 - configs/jetson-tk1_defconfig | 2 - configs/medcom-wide_defconfig | 2 - configs/nyan-big_defconfig | 2 - configs/p2371-0000_defconfig | 2 - configs/p2371-2180_defconfig | 2 - configs/p2571_defconfig | 2 - configs/p2771-0000-000_defconfig | 2 - configs/p2771-0000-500_defconfig | 2 - configs/paz00_defconfig | 2 - configs/plutux_defconfig | 2 - configs/seaboard_defconfig | 2 - configs/tec-ng_defconfig | 2 - configs/tec_defconfig | 2 - configs/trimslice_defconfig | 2 - configs/venice2_defconfig | 2 - configs/ventana_defconfig | 2 - configs/whistler_defconfig | 2 - drivers/block/blk-uclass.c | 65 ++++++++++++++++++++++++++++---- drivers/mmc/mmc-uclass.c | 27 ++++++++++---- drivers/mmc/tegra_mmc.c | 72 ++++++++++++++++++++---------------- include/blk.h | 15 +++++++- test/dm/blk.c | 60 +++++++++++++++++++++++++++++- 35 files changed, 203 insertions(+), 107 deletions(-)
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 1/8 dm: mmc: Don't re-init when accessing environment
With driver model MMC is probed automatically when needed. We should not re-init MMC each time.
---
common/env_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
common/env_mmc.c +2 -1
@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)if (!mmc)return "!No MMC card found" ; +#ifndef CONFIG_BLK if (mmc_init (mmc))return "!MMC init failed" ; - +#endif if (mmc_set_env_part (mmc))return "!MMC partition switch failed" ;
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 1/8 dm: mmc: Don't re-init when accessing environment
Hi Simon,
Quoted 14 lines · Simon Glass
With driver model MMC is probed automatically when needed. We should not re-init MMC each time.
Signed-off-by Simon Glass <[email protected]>---
common/env_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)common/env_mmc.c +0
-0
common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 104
Quoted 8 lines
common/env_mmc.c +2
-1@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)if (!mmc)return "!No MMC card found" ; +#ifndef CONFIG_BLK if (mmc_init (mmc))return "!MMC init failed" ; - +#endif
I'm not convinced by this. mmc_init() is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and most probe() functions do not call mmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)
Jean-Jacques
Quoted 3 lines
common/env_mmc.c +0
-0if (mmc_set_env_part (mmc))return "!MMC partition switch failed" ;
PATCH 1/8 dm: mmc: Don't re-init when accessing environment
Hi Jean-Jacques,
Quoted 26 lines · Jean-Jacques Hiblot
Hi Simon,
Quoted 15 lines · Simon Glass
With driver model MMC is probed automatically when needed. We should not re-init MMC each time.
Signed-off-by Simon Glass <[email protected]>---
common/env_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)common/env_mmc.c +0
-0common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 103
Quoted 7 lines
common/env_mmc.c +1
-1@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)if (!mmc)return "!No MMC card found" ; +#ifndef CONFIG_BLKif (mmc_init (mmc))return "!MMC init failed" ; - +#endif
Quoted 7 lines
I'm not convinced by this.
mmc_init()is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and mostprobe()functions do not callmmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)
Yes I would like that too.
One option is to add an init() method to mmc and call that when the block device is probed.
Quoted 9 lines
Jean-Jacques
Quoted 3 lines
common/env_mmc.c +0
-0if (mmc_set_env_part (mmc))return "!MMC partition switch failed" ;
Regards,
Simon
PATCH 1/8 dm: mmc: Don't re-init when accessing environment
Hi,
Quoted 37 lines · Simon Glass
Hi Jean-Jacques,
Quoted 26 lines · Jean-Jacques Hiblot
Hi Simon,
Quoted 15 lines · Simon Glass
With driver model MMC is probed automatically when needed. We should not re-init MMC each time.
Signed-off-by Simon Glass <[email protected]>---
common/env_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)common/env_mmc.c +0
-0common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 103
Quoted 7 lines
common/env_mmc.c +1
-1@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)if (!mmc)return "!No MMC card found" ; +#ifndef CONFIG_BLKif (mmc_init (mmc))return "!MMC init failed" ; - +#endif Quoted 7 lines
I'm not convinced by this.
mmc_init()is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and mostprobe()functions do not callmmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)
Quoted 4 lines
Yes I would like that too.
One option is to add an
init()method to mmc and call that when the block device is probed.
Do you think that would work? I can try it out in the next version perhaps.
Then we have:
mmc device probe - very fast, just sets up clocks, etc. blk device probe - slow, tries to read card, partition table, etc.
Quoted 7 lines
Quoted 7 lines
Jean-Jacques
Quoted 2 lines
common/env_mmc.c +0
-0if (mmc_set_env_part (mmc))return "!MMC partition switch failed" ;
Regards,
Simon
PATCH 1/8 dm: mmc: Don't re-init when accessing environment
Hi Simon,
Quoted 41 lines · Simon Glass
Hi,
Quoted 38 lines · Simon Glass
Hi Jean-Jacques,
Quoted 23 lines · Jean-Jacques Hiblot
Hi Simon,
Quoted 20 lines · Simon Glass
With driver model MMC is probed automatically when needed. We should not re-init MMC each time.
Signed-off-by Simon Glass <[email protected]>---
common/env_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)common/env_mmc.c +0
-1@@ -98,9 +98,10 @@ static const char *init_mmc_for_env(struct mmc *mmc)if (!mmc)return "!No MMC card found" ; +#ifndef CONFIG_BLKif (mmc_init (mmc))return "!MMC init failed" ; -Quoted 8 lines
common/env_mmc.c static const char *init_mmc_for_env(struct mmc *mmc) · line 104
Quoted 1 line
common/env_mmc.c +1
-0+#endif I'm not convinced by this.
mmc_init()is the starting point of the MMC device initialization process and it must be called somehow before accessing the device and mostprobe()functions do not callmmc_init(). The sandbox driver does it, but I'm not sure it's the right way because the MMC device initialization process takes a long time. I'd rather have the device initialized only when it's accessed for the first time not when it's probed (especially in the SPL)Yes I would like that too.
One option is to add an
init()method to mmc and call that when the block device is probed.
I've just discovered that in mmc_init() is now called from the 'blk' probe of the mc device (it wasn't on the code base I had been looking at). So it should be fine to remove the call to mmc_init() from init_mmc_for_env(). I did the test on DRA7 and it's working. So you can ignore my previous comment.
However I tried to go further by removing it from spl_mmc.c as well because mmc_init() is called from there first and then I ran into problems with the detection of the partitions. I don't really have time to look at it right now. It may be related to the fact that my env is not located on the boot device.
Jean-Jacques
Quoted 15 lines
Do you think that would work? I can try it out in the next version perhaps.
Then we have:
mmc device probe - very fast, just sets up clocks, etc. blk device probe - slow, tries to read card, partition table, etc.
Quoted 5 lines
Quoted 5 lines
Jean-Jacques
Quoted 2 lines
common/env_mmc.c +0
-0if (mmc_set_env_part (mmc))return "!MMC partition switch failed" ;Regards,
Simon
PATCH 2/8 dm: blk: Allow finding block devices without probing
In reply to Simon GlassSometimes it is useful to be able to find a block device without also probing it. Add a function for this as well as the associated test.
---
drivers/block/blk-uclass.c | 15 +++++++++++++-- include/blk.h | 15 ++++++++++++++- test/dm/blk.c | 21 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-)
drivers/block/blk-uclass.c +13 -2
@@ -363,7 +363,7 @@ int blk_next_device(struct udevice **devp) }while (1 ); } -int blk_get_device (int if_type,int devnum,struct udevice **devp) +int blk_find_device (int if_type,int devnum,struct udevice **devp) {struct uclass *uc;struct udevice *dev;
@@ -379,13 +379,24 @@ int blk_get_device(int if_type, int devnum, struct udevice **devp) if_type, devnum, dev->name, desc->if_type, desc->devnum);if (desc->if_type == if_type && desc->devnum == devnum) { *devp = dev; -return device_probe (dev); +return 0 ; } }return -ENODEV ; } +int blk_get_device (int if_type,int devnum,struct udevice **devp) +{ +int ret; + + ret =blk_find_device (if_type, devnum, devp); +if (ret) +return ret; + +return device_probe (*devp); +} +unsigned long blk_dread (struct blk_desc *block_dev,lbaint_t start,lbaint_t blkcnt,void *buffer) {
include/blk.h +14 -1
@@ -253,12 +253,25 @@ unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt);/** +* blk_find_device() - Find a block device +* +* This function does not activate the device. The device will be returned +* whether or not it is activated. +* +* @if_type: Interface type (enum if_type_t) +* @devnum: Device number (specific to each interface type) +* @devp: the device, if found +* @return 0 if found, -ENODEV if no device found, or other -ve error value +*/ +int blk_find_device (int if_type,int devnum,struct udevice **devp); + +/** * blk_get_device() - Find and probe a block device ready for use * * @if_type: Interface type (enum if_type_t) * @devnum: Device number (specific to each interface type) * @devp: the device, if found -* @return - if found, -ENODEV if no device found, or other -ve error value +* @return 0 if found, -ENODEV if no device found, or other -ve error value */ int blk_get_device (int if_type,int devnum,struct udevice **devp);
test/dm/blk.c +21 -0
@@ -94,3 +94,24 @@ static int dm_test_blk_usb(struct unit_test_state *uts)return 0 ; }DM_TEST (dm_test_blk_usb,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT ); + +/* Test that we can find block devices without probing them */ +static int dm_test_blk_find (struct unit_test_state *uts) +{ +struct udevice *blk, *dev; + +ut_assertok (blk_create_device (gd->dm_root,"sandbox_host_blk" ,"test" , +IF_TYPE_HOST ,1 ,512 ,1024 , &blk)); +ut_asserteq (-ENODEV ,blk_find_device (IF_TYPE_HOST ,0 , &dev)); +ut_assertok (blk_find_device (IF_TYPE_HOST ,1 , &dev)); +ut_asserteq_ptr (blk, dev); +ut_asserteq (false,device_active (dev)); + +/* Now activate it */ +ut_assertok (blk_get_device (IF_TYPE_HOST ,1 , &dev)); +ut_asserteq_ptr (blk, dev); +ut_asserteq (true,device_active (dev)); + +return 0 ; +} +DM_TEST (dm_test_blk_find,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT );
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 2/8 dm: blk: Allow finding block devices without probing
Sometimes it is useful to be able to find a block device without also probing it. Add a function for this as well as the associated test.
---
drivers/block/blk-uclass.c | 15 +++++++++++++-- include/blk.h | 15 ++++++++++++++- test/dm/blk.c | 21 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-)
Applied to u-boot-dm
PATCH 3/8 dm: blk: Add a function to find the next block device number
In reply to Simon GlassAt present this code is inline. Move it into a function to allow it to be used elsewhere.
---
drivers/block/blk-uclass.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
drivers/block/blk-uclass.c +16 -6
@@ -473,6 +473,19 @@ int blk_find_max_devnum(enum if_type if_type)return max_devnum; } +static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ; +else if (ret <0 ) +return ret; +else +return ret +1 ; +} +int blk_create_device (struct udevice *parent,const char *drv_name,const char *name,int if_type,int devnum,int blksz,lbaint_t size,struct udevice **devp)
@@ -482,13 +495,10 @@ int blk_create_device(struct udevice *parent, const char *drv_name,int ret;if (devnum ==-1 ) { - ret =blk_find_max_devnum (if_type); -if (ret == -ENODEV ) - devnum =0 ; -else if (ret <0 ) + ret =blk_next_free_devnum (if_type); +if (ret <0 )return ret; -else - devnum = ret +1 ; + devnum = ret; } ret =device_bind_driver (parent, drv_name, name, &dev);if (ret)
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 3/8 dm: blk: Add a function to find the next block device number
Quoted 5 lines · Simon Glass
At present this code is inline. Move it into a function to allow it to be used elsewhere.
Signed-off-by Simon Glass <[email protected]>
drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483
Quoted 9 lines
drivers/block/blk-uclass.c +8
-0+static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ; +else if (ret <0 )
Useless 'else'.
drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret; + else
Ditto.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret +1 ; +}
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH 3/8 dm: blk: Add a function to find the next block device number
Hi Andy,
Quoted 14 lines · Andy Shevchenko
Quoted 12 lines · Simon Glass
At present this code is inline. Move it into a function to allow it to be used elsewhere.
Signed-off-by Simon Glass <[email protected]>drivers/block/blk-uclass.c +7
-0+static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ;
Quoted 11 lines
Quoted 1 line
+ else if (ret < 0)
Useless 'else'.
drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret; + elseDitto.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret +1 ; +}
I think it is clearer with these. At least, I would ask for them to be added if they were missing.
What do you think of this series as a whole?
Regards,
Simon
PATCH 3/8 dm: blk: Add a function to find the next block device number
Quoted 24 lines · Simon Glass
Hi Andy,
Quoted 21 lines · Andy Shevchenko
Quoted 5 lines · Simon Glass
At present this code is inline. Move it into a function to allow it to be used elsewhere.
Signed-off-by Simon Glass <[email protected]>drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483
Quoted 9 lines
drivers/block/blk-uclass.c +8
-0+static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ; +else if (ret <0 )Useless 'else'.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret; + else
Quoted 7 lines
Quoted 4 lines
Ditto.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret +1 ; +}I think it is clearer with these. At least, I would ask for them to be added if they were missing.
Really? It's just noise in the code which makes it harder to read. In Linux kernel we remove that. If U-Boot has the above style kinda mandatory I would be really surprised.
Quoted 1 line
What do you think of this series as a whole?
It was a while ago. So, if there were no comments from me, that means I have nothing to argue of.
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH 3/8 dm: blk: Add a function to find the next block device number
Quoted 24 lines · Simon Glass
Hi Andy,
Quoted 21 lines · Andy Shevchenko
Quoted 5 lines · Simon Glass
At present this code is inline. Move it into a function to allow it to be used elsewhere.
Signed-off-by Simon Glass <[email protected]>drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 483
Quoted 9 lines
drivers/block/blk-uclass.c +8
-0+static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ; +else if (ret <0 )Useless 'else'.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret; + else
Quoted 7 lines
Quoted 4 lines
Ditto.
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret +1 ; +}I think it is clearer with these. At least, I would ask for them to be added if they were missing.
Really? It's just noise in the code which makes it harder to read. In Linux kernel we remove that. If U-Boot has the above style kinda mandatory I would be really surprised.
Quoted 1 line
What do you think of this series as a whole?
It was a while ago. So, if there were no comments from me, that means I have nothing to argue of.
Signature · 4 lines
With Best Regards, Andy Shevchenko Applied to u-boot-dm
PATCH 3/8 dm: blk: Add a function to find the next block device number
Hi Andy,
Quoted 18 lines · On 18 May 2017 at 10:01, <[email protected]> wrote:
Quoted 17 lines · Simon Glass
Hi Andy,
Quoted 14 lines · Andy Shevchenko
Quoted 12 lines · Simon Glass
At present this code is inline. Move it into a function to allow it to be used elsewhere.
Signed-off-by Simon Glass <[email protected]>drivers/block/blk-uclass.c +7
-0+static int blk_next_free_devnum (enum if_type if_type) +{ +int ret; + + ret =blk_find_max_devnum (if_type); +if (ret == -ENODEV ) +return 0 ;
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 1 line
+ else if (ret < 0)
Useless 'else'.
drivers/block/blk-uclass.c int blk_find_max_devnum(enum if_type if_type) · line 485
Quoted 2 lines
drivers/block/blk-uclass.c +2
-0+return ret; + elseDitto.
I updated these when applying.
- Simon
PATCH 4/8 dm: blk: Improve block device claiming
In reply to Simon GlassThe intention with block devices is that the device number (devnum field in its descriptor) matches the alias of its parent device. For example, with:
aliases {
mmc0 = "/sdhci at 700b0600";
mmc1 = "/sdhci at 700b0400";
}we expect that the block devices for mmc0 and mmc1 would have device numbers of 0 and 1 respectively.
Unfortunately this does not currently always happen. If there is another MMC device earlier in the driver model data structures its block device will be created first. It will therefore get device number 0 and mmc0 will therefore miss out. In this case the MMC device will have sequence number 0 but its block device will not.
To avoid this, allow a device to request a device number and bump any existing device number that is using it. This all happens during the binding phase so it is safe to change these numbers around. This allows device numbers to match the aliases in all circumstances.
Add a test to verify the behaviour.
---
arch/sandbox/dts/test.dts | 12 +++++++++++- drivers/block/blk-uclass.c | 34 +++++++++++++++++++++++++++++++--- test/dm/blk.c | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 6 deletions(-)
arch/sandbox/dts/test.dts +11 -1
@@ -12,6 +12,8 @@ eth3 = ð_3; eth5 = ð_5; i2c0 = "/i2c at 0"; + mmc0 = "/mmc0"; + mmc1 = "/mmc1"; pci0 = &pci; remoteproc1 = &rproc_1; remoteproc2 = &rproc_2;
@@ -242,7 +244,15 @@ mbox-names = "other", "test"; }; - mmc { + mmc2 { + compatible = "sandbox,mmc"; + }; + + mmc1 { + compatible = "sandbox,mmc"; + }; + + mmc0 { compatible = "sandbox,mmc"; };
drivers/block/blk-uclass.c +31 -3
@@ -486,6 +486,31 @@ static int blk_next_free_devnum(enum if_type if_type)return ret +1 ; } +static int blk_claim_devnum (enum if_type if_type,int devnum) +{ +struct udevice *dev; +struct uclass *uc; +int ret; + + ret =uclass_get (UCLASS_BLK , &uc); +if (ret) +return ret; + uclass_foreach_dev(dev, uc) { +struct blk_desc *desc =dev_get_uclass_platdata (dev); + +if (desc->if_type == if_type && desc->devnum == devnum) { +int next =blk_next_free_devnum (if_type); + +if (next <0 ) +return next; + desc->devnum = next; +return 0 ; + } + } + +return -ENOENT ; +} +int blk_create_device (struct udevice *parent,const char *drv_name,const char *name,int if_type,int devnum,int blksz,lbaint_t size,struct udevice **devp)
@@ -495,11 +520,14 @@ int blk_create_device(struct udevice *parent, const char *drv_name,int ret;if (devnum ==-1 ) { - ret =blk_next_free_devnum (if_type); -if (ret <0 ) + devnum =blk_next_free_devnum (if_type); + }else { + ret =blk_claim_devnum (if_type, devnum); +if (ret <0 && ret != -ENOENT )return ret; - devnum = ret; } +if (devnum <0 ) +return devnum; ret =device_bind_driver (parent, drv_name, name, &dev);if (ret)return ret;
test/dm/blk.c +37 -2
@@ -83,12 +83,12 @@ static int dm_test_blk_usb(struct unit_test_state *uts)ut_asserteq_ptr (usb_dev,dev_get_parent (dev));/* Check we have one block device for each mass storage device */ -ut_asserteq (4 ,count_blk_devices ()); +ut_asserteq (6 ,count_blk_devices ());/* Now go around again, making sure the old devices were unbound */ ut_assertok (usb_stop ());ut_assertok (usb_init ()); -ut_asserteq (4 ,count_blk_devices ()); +ut_asserteq (6 ,count_blk_devices ());ut_assertok (usb_stop ());return 0 ;
@@ -115,3 +115,38 @@ static int dm_test_blk_find(struct unit_test_state *uts)return 0 ; }DM_TEST (dm_test_blk_find,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT ); + +/* Test that block device numbering works as expected */ +static int dm_test_blk_devnum (struct unit_test_state *uts) +{ +struct udevice *dev, *mmc_dev, *parent; +int i; + +/* +* Probe the devices, with the first one being probed last. This is the +* one with no alias / sequence numnber. +*/ +ut_assertok (uclass_get_device (UCLASS_MMC ,1 , &dev)); +ut_assertok (uclass_get_device (UCLASS_MMC ,2 , &dev)); +ut_assertok (uclass_get_device (UCLASS_MMC ,0 , &dev)); +for (i =0 ; i <3 ; i++) { +struct blk_desc *desc; + +/* Check that the bblock device is attached */ +ut_assertok (uclass_get_device_by_seq (UCLASS_MMC , i, &mmc_dev)); +ut_assertok (blk_find_device (IF_TYPE_MMC , i, &dev)); + parent =dev_get_parent (dev); +ut_asserteq_ptr (parent, mmc_dev); +ut_asserteq (trailing_strtol (mmc_dev->name), i); + +/* +* Check that the block device devnum matches its parent's +* sequence number +*/ + desc =dev_get_uclass_platdata (dev); +ut_asserteq (desc->devnum, i); + } + +return 0 ; +} +DM_TEST (dm_test_blk_devnum,DM_TESTF_SCAN_PDATA |DM_TESTF_SCAN_FDT );
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 4/8 dm: blk: Improve block device claiming
The intention with block devices is that the device number (devnum field in its descriptor) matches the alias of its parent device. For example, with:
aliases {
mmc0 = "/sdhci at 700b0600";
mmc1 = "/sdhci at 700b0400";
}we expect that the block devices for mmc0 and mmc1 would have device numbers of 0 and 1 respectively.
Unfortunately this does not currently always happen. If there is another MMC device earlier in the driver model data structures its block device will be created first. It will therefore get device number 0 and mmc0 will therefore miss out. In this case the MMC device will have sequence number 0 but its block device will not.
To avoid this, allow a device to request a device number and bump any existing device number that is using it. This all happens during the binding phase so it is safe to change these numbers around. This allows device numbers to match the aliases in all circumstances.
Add a test to verify the behaviour.
---
arch/sandbox/dts/test.dts | 12 +++++++++++- drivers/block/blk-uclass.c | 34 +++++++++++++++++++++++++++++++--- test/dm/blk.c | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 6 deletions(-)
Applied to u-boot-dm
PATCH 5/8 dm: mmc: Avoid probing block devices in find_mmc_device()
In reply to Simon GlassWe do not need to probe the block device here, so avoid doing so. The MMC device itself must be active, but the block device can come later.
---
drivers/mmc/mmc-uclass.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mmc/mmc-uclass.c +4 -2
@@ -97,7 +97,7 @@ struct mmc *find_mmc_device(int dev_num)struct udevice *dev, *mmc_dev;int ret; - ret =blk_get_device (IF_TYPE_MMC , dev_num, &dev); + ret =blk_find_device (IF_TYPE_MMC , dev_num, &dev);if (ret) {#if !defined(CONFIG_SPL_BUILD ) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT )
@@ -108,7 +108,9 @@ struct mmc *find_mmc_device(int dev_num) mmc_dev =dev_get_parent (dev); -return mmc_get_mmc_dev (mmc_dev); +struct mmc *mmc =mmc_get_mmc_dev (mmc_dev); + +return mmc; }int get_mmc_num (void )
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 5/8 dm: mmc: Avoid probing block devices in find_mmc_device()
We do not need to probe the block device here, so avoid doing so. The MMC device itself must be active, but the block device can come later.
---
drivers/mmc/mmc-uclass.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
Applied to u-boot-dm
PATCH 6/8 dm: mmc: Check that drivers have operations
In reply to Simon GlassWhen binding a new MMC device, make sure that it has the required operations. Since for now we still support *not* having the operations (with CONFIG_DM_MMC_OPS not enabled) it makes sense to add this check.
---
drivers/mmc/mmc-uclass.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/mmc/mmc-uclass.c +4 -0
@@ -198,6 +198,10 @@ 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 (!mmc_get_ops (dev)) +return -ENOSYS ; +#endif #ifndef CONFIG_SPL_BUILD /* Use the fixed index with aliase node's index */ fdtdec_get_alias_seq (gd->fdt_blob,"mmc" , dev->of_offset, &devnum);
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 6/8 dm: mmc: Check that drivers have operations
When binding a new MMC device, make sure that it has the required operations. Since for now we still support *not* having the operations (with CONFIG_DM_MMC_OPS not enabled) it makes sense to add this check.
---
drivers/mmc/mmc-uclass.c | 4 ++++ 1 file changed, 4 insertions(+)
Applied to u-boot-dm
PATCH 7/8 dm: mmc: Rewrite mmc_blk_probe()
In reply to Simon GlassThis function is called when the MMC block device is being probed. There is a recursive call in this function since find_mmc_device() itself can cause the MMC device to be probed.
Admittedly the MMC device should already be probed, since we would not be probing its child otherwise, but the current code is unnecessarily convoluted.
Rewrite this to access the MMC structure directly.
---
drivers/mmc/mmc-uclass.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/mmc/mmc-uclass.c +11 -6
@@ -262,13 +262,18 @@ static int mmc_select_hwpart(struct udevice *bdev, int hwpart)static int mmc_blk_probe (struct udevice *dev) { -struct blk_desc *block_dev =dev_get_uclass_platdata (dev); -int dev_num = block_dev->devnum; -struct mmc *mmc =find_mmc_device (dev_num); +struct udevice *mmc_dev =dev_get_parent (dev); +struct mmc_uclass_priv *upriv =dev_get_uclass_priv (mmc_dev); +struct mmc *mmc = upriv->mmc; +int ret; + + ret =mmc_init (mmc); +if (ret) { +debug ("%s: mmc_init() failed (err=%d)\n" , __func__, ret); +return ret; + } -if (!mmc) -return -ENODEV ; -return mmc_init (mmc); +return 0 ; }static const struct blk_ops mmc_blk_ops = {
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 7/8 dm: mmc: Rewrite mmc_blk_probe()
This function is called when the MMC block device is being probed. There is a recursive call in this function since find_mmc_device() itself can cause the MMC device to be probed.
Admittedly the MMC device should already be probed, since we would not be probing its child otherwise, but the current code is unnecessarily convoluted.
Rewrite this to access the MMC structure directly.
---
drivers/mmc/mmc-uclass.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
Applied to u-boot-dm
PATCH 8/8 tegra: Convert MMC to use driver model for operations
In reply to Simon GlassEnable CONFIG_DM_MMC_OPS and CONFIG_BLK for all Tegra devices. This moves Tegra to use driver model fully for MMC.
---
board/toradex/common/tdx-cfg-block.c | 2 +- configs/apalis-tk1_defconfig | 2 - configs/apalis_t30_defconfig | 2 - configs/beaver_defconfig | 2 - configs/cardhu_defconfig | 2 - configs/cei-tk1-som_defconfig | 2 - configs/colibri_t20_defconfig | 2 - configs/colibri_t30_defconfig | 2 - configs/dalmore_defconfig | 2 - configs/e2220-1170_defconfig | 2 - configs/harmony_defconfig | 2 - configs/jetson-tk1_defconfig | 2 - configs/medcom-wide_defconfig | 2 - configs/nyan-big_defconfig | 2 - configs/p2371-0000_defconfig | 2 - configs/p2371-2180_defconfig | 2 - configs/p2571_defconfig | 2 - configs/p2771-0000-000_defconfig | 2 - configs/p2771-0000-500_defconfig | 2 - configs/paz00_defconfig | 2 - configs/plutux_defconfig | 2 - configs/seaboard_defconfig | 2 - configs/tec-ng_defconfig | 2 - configs/tec_defconfig | 2 - configs/trimslice_defconfig | 2 - configs/venice2_defconfig | 2 - configs/ventana_defconfig | 2 - configs/whistler_defconfig | 2 - drivers/mmc/tegra_mmc.c | 72 ++++++++++++++++++++---------------- 29 files changed, 42 insertions(+), 86 deletions(-)
board/toradex/common/tdx-cfg-block.c +1 -1
@@ -110,7 +110,7 @@ static int tdx_cfg_block_mmc_storage(u8 *config_block, int write) ret = -ENODEV ; goto out; } -if (part != mmc->block_dev.hwpart) { +if (part !=mmc_get_blk_desc (mmc)->hwpart) {if (blk_select_hwpart_devnum (IF_TYPE_MMC , dev, part)) {puts ("MMC partition switch failed\n" ); ret = -ENODEV ;
configs/apalis-tk1_defconfig +0 -2
@@ -24,10 +24,8 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y -# CONFIG_DM_MMC_OPS is not set CONFIG_TEGRA124_MMC_DISABLE_EXT_LOOPBACK=y CONFIG_E1000=y CONFIG_PCI=y
configs/apalis_t30_defconfig +0 -2
@@ -25,10 +25,8 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y -# CONFIG_DM_MMC_OPS is not set CONFIG_E1000=y CONFIG_PCI=y CONFIG_DM_PCI=y
configs/beaver_defconfig +0 -2
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/cardhu_defconfig +0 -2
@@ -24,8 +24,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/cei-tk1-som_defconfig +0 -2
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/colibri_t20_defconfig +0 -2
@@ -28,10 +28,8 @@ CONFIG_CMD_UBI=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y -# CONFIG_DM_MMC_OPS is not set CONFIG_MTD_UBI_FASTMAP=y CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y
configs/colibri_t30_defconfig +0 -2
@@ -25,10 +25,8 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SYS_NS16550=y CONFIG_USB=y CONFIG_DM_USB=y
configs/dalmore_defconfig +0 -2
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/e2220-1170_defconfig +0 -2
@@ -21,11 +21,9 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/harmony_defconfig +0 -2
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_PCI=y CONFIG_DM_PCI=y CONFIG_DM_PCI_COMPAT=y
configs/jetson-tk1_defconfig +0 -2
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/medcom-wide_defconfig +0 -2
@@ -23,8 +23,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y
configs/nyan-big_defconfig +0 -2
@@ -31,14 +31,12 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y CONFIG_CROS_EC_KEYB=y CONFIG_CROS_EC=y CONFIG_CROS_EC_SPI=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_DM_PMIC=y
configs/p2371-0000_defconfig +0 -2
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/p2371-2180_defconfig +0 -2
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/p2571_defconfig +0 -2
@@ -22,11 +22,9 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/p2771-0000-000_defconfig +0 -2
@@ -19,9 +19,7 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_TEGRA186_BPMP_I2C=y -# CONFIG_DM_MMC_OPS is not set CONFIG_DWC_ETH_QOS=y CONFIG_E1000=y CONFIG_RTL8169=y
configs/p2771-0000-500_defconfig +0 -2
@@ -19,9 +19,7 @@ CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set # CONFIG_CMD_NFS is not set CONFIG_CMD_EXT4_WRITE=y -# CONFIG_BLK is not set CONFIG_TEGRA186_BPMP_I2C=y -# CONFIG_DM_MMC_OPS is not set CONFIG_DWC_ETH_QOS=y CONFIG_E1000=y CONFIG_RTL8169=y
configs/paz00_defconfig +0 -2
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y
configs/plutux_defconfig +0 -2
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_SYS_NS16550=y CONFIG_USB=y CONFIG_DM_USB=y
configs/seaboard_defconfig +0 -2
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y
configs/tec-ng_defconfig +0 -2
@@ -25,8 +25,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/tec_defconfig +0 -2
@@ -23,8 +23,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y
configs/trimslice_defconfig +0 -2
@@ -24,8 +24,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_RTL8169=y
configs/venice2_defconfig +0 -2
@@ -26,11 +26,9 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set CONFIG_DFU_MMC=y CONFIG_DFU_RAM=y CONFIG_DFU_SF=y -# CONFIG_DM_MMC_OPS is not set CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_SYS_NS16550=y
configs/ventana_defconfig +0 -2
@@ -21,8 +21,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_DM_PMIC=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y
configs/whistler_defconfig +0 -2
@@ -22,8 +22,6 @@ CONFIG_CMD_EXT4_WRITE=y # CONFIG_SPL_ISO_PARTITION is not set # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_DM=y -# CONFIG_BLK is not set -# CONFIG_DM_MMC_OPS is not set CONFIG_SYS_NS16550=y CONFIG_USB=y CONFIG_DM_USB=y
drivers/mmc/tegra_mmc.c +41 -31
169 lines not on this page · raw message
Signature · 1 line
2.12.2.816.g2cccc81164-goog
PATCH 8/8 tegra: Convert MMC to use driver model for operations
Enable CONFIG_DM_MMC_OPS and CONFIG_BLK for all Tegra devices. This moves Tegra to use driver model fully for MMC.
---
board/toradex/common/tdx-cfg-block.c | 2 +- configs/apalis-tk1_defconfig | 2 - configs/apalis_t30_defconfig | 2 - configs/beaver_defconfig | 2 - configs/cardhu_defconfig | 2 - configs/cei-tk1-som_defconfig | 2 - configs/colibri_t20_defconfig | 2 - configs/colibri_t30_defconfig | 2 - configs/dalmore_defconfig | 2 - configs/e2220-1170_defconfig | 2 - configs/harmony_defconfig | 2 - configs/jetson-tk1_defconfig | 2 - configs/medcom-wide_defconfig | 2 - configs/nyan-big_defconfig | 2 - configs/p2371-0000_defconfig | 2 - configs/p2371-2180_defconfig | 2 - configs/p2571_defconfig | 2 - configs/p2771-0000-000_defconfig | 2 - configs/p2771-0000-500_defconfig | 2 - configs/paz00_defconfig | 2 - configs/plutux_defconfig | 2 - configs/seaboard_defconfig | 2 - configs/tec-ng_defconfig | 2 - configs/tec_defconfig | 2 - configs/trimslice_defconfig | 2 - configs/venice2_defconfig | 2 - configs/ventana_defconfig | 2 - configs/whistler_defconfig | 2 - drivers/mmc/tegra_mmc.c | 72 ++++++++++++++++++++---------------- 29 files changed, 42 insertions(+), 86 deletions(-)
Applied to u-boot-dm
PATCH 8/8 tegra: Convert MMC to use driver model for operations
Simon,
What testing did you do?
Tom
--
nvpublic
Quoted 54 lines
-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com]
Sent: Thursday, May 18, 2017 9:01 AM
To: Simon Glass <[email protected]>
Cc: Alban Bedel <[email protected]>; Max Krummenacher <[email protected]>; Masahiro Yamada <[email protected]>; Tom Warren <[email protected]>; Peter.Chubb at data61.csiro.au; Stephen Warren <[email protected]>; Stefan Agner <[email protected]>; Lucas Stach <[email protected]>; Allen Martin <[email protected]>; Marcel Ziswiler <[email protected]>; Jaehoon Chung <[email protected]>; Stephen Warren <[email protected]>; U-Boot Mailing List <u- boot at lists.denx.de>
Subject: Re: [PATCH 8/8] tegra: Convert MMC to use driver model for operationsEnable
CONFIG_DM_MMC_OPSandCONFIG_BLKfor all Tegra devices. This moves Tegra to use driver model fully for MMC.Signed-off-by Simon Glass <[email protected]>---
board/toradex/common/tdx-cfg-block.c | 2 +- configs/apalis-tk1_defconfig | 2 - configs/apalis_t30_defconfig | 2 - configs/beaver_defconfig | 2 - configs/cardhu_defconfig | 2 - configs/cei-tk1-som_defconfig | 2 - configs/colibri_t20_defconfig | 2 - configs/colibri_t30_defconfig | 2 - configs/dalmore_defconfig | 2 - configs/e2220-1170_defconfig | 2 - configs/harmony_defconfig | 2 - configs/jetson-tk1_defconfig | 2 - configs/medcom-wide_defconfig | 2 - configs/nyan-big_defconfig | 2 - configs/p2371-0000_defconfig | 2 - configs/p2371-2180_defconfig | 2 - configs/p2571_defconfig | 2 - configs/p2771-0000-000_defconfig | 2 - configs/p2771-0000-500_defconfig | 2 - configs/paz00_defconfig | 2 - configs/plutux_defconfig | 2 - configs/seaboard_defconfig | 2 - configs/tec-ng_defconfig | 2 - configs/tec_defconfig | 2 - configs/trimslice_defconfig | 2 - configs/venice2_defconfig | 2 - configs/ventana_defconfig | 2 - configs/whistler_defconfig | 2 - drivers/mmc/tegra_mmc.c | 72 ++++++++++++++++++++---------------- 29 files changed, 42 insertions(+), 86 deletions(-)Applied to u-boot-dm
PATCH 8/8 tegra: Convert MMC to use driver model for operations
Hi Tom,
Quoted 3 lines · Tom Warren
Simon,
What testing did you do?
This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)
Quoted 4 lines
Tom
--
nvpublic
Regards,
Simon
PATCH 8/8 tegra: Convert MMC to use driver model for operations
Hi Simon
Quoted 9 lines · Simon Glass
Hi Tom,
Quoted 3 lines · Tom Warren
Simon,
What testing did you do?
This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)
Sorry about that, been mighty busy around here.
I just tested dm/master on all our Tegra hardware being Apalis T30, Apalis TK1, Colibri T20 and Colibri T30 and all works fine including e.g. the 3 SD/MMC controllers via driver model now:
Apalis TK1 # dm tree
Class Probed Name
----------------------------------------
root [ + ] root_driver
...
mmc [ + ] |-- sdhci at 700b0000 blk [ + ] | `-- sdhci at 700b0000.blk mmc [ + ] |-- sdhci at 700b0400 blk [ + ] | `-- sdhci at 700b0400.blk mmc [ + ] |-- sdhci at 700b0600 blk [ + ] | `-- sdhci at 700b0600.blk usb [ ] |-- usb at 7d000000 usb [ ] |-- usb at 7d004000 usb [ ] |-- usb at 7d008000
simple_bus [ ] `-- clocks
clk [ ] `-- clock at 0
With the live tree stuff I had less success but will post on resp. message there.
Quoted 1 line
Quoted 1 line
Tom
Cheers
Marcel
Quoted 9 lines
Quoted 2 lines
--
nvpublicRegards,
Simon
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
https://lists.denx.de/listinfo/u-boot
PATCH 8/8 tegra: Convert MMC to use driver model for operations
Hi Marcel,
Quoted 10 lines · Marcel Ziswiler
Hi Simon
Quoted 7 lines · Simon Glass
Hi Tom,
Quoted 3 lines · Tom Warren
Simon,
What testing did you do?
Quoted 8 lines
Quoted 2 lines
This was tested on Nyan. I'd be grateful for any Tegra review / testing that you can arrange. It seems mighty quiet around here :-)
Sorry about that, been mighty busy around here.
I just tested dm/master on all our Tegra hardware being Apalis T30, Apalis TK1, Colibri T20 and Colibri T30 and all works fine including e.g. the 3 SD/MMC controllers via driver model now:
OK good, thanks!
Regards,
Simon
cover dm: mmc: Tidy up handling of block devices
In reply to Simon GlassQuoted 12 lines · Simon Glass
The current MMC block device support has a few deficiencies which show up when both
CONFIG_BLKandCONFIG_DM_MMC_OPSare defined:- Block device numbering does not always following MMC device numbering
- Environment in MMC does not always work correctlyIn addition some parts of the code can be implemented in a better way.
This series fixes the above problems, adds a few tests and converts Tegra over to use
CONFIG_BLKandCONFIG_DM_MMC_OPS.
As far as I can see this series doesn't change power flow for MMC anyhow. If it's true, take my
Quoted 54 lines
Simon Glass (8):
dm: mmc: Don't re-init when accessing environment
dm: blk: Allow finding block devices without probing
dm: blk: Add a function to find the next block device number
dm: blk: Improve block device claiming
dm: mmc: Avoid probing block devices infind_mmc_device()
dm: mmc: Check that drivers have operations
dm: mmc: Rewritemmc_blk_probe()
tegra: Convert MMC to use driver model for operationsarch/sandbox/dts/test.dts | 12 +++++- board/toradex/common/tdx-cfg-block.c | 2 +- common/env_mmc.c | 3 +- configs/apalis-tk1_defconfig | 2 - configs/apalis_t30_defconfig | 2 - configs/beaver_defconfig | 2 - configs/cardhu_defconfig | 2 - configs/cei-tk1-som_defconfig | 2 - configs/colibri_t20_defconfig | 2 - configs/colibri_t30_defconfig | 2 - configs/dalmore_defconfig | 2 - configs/e2220-1170_defconfig | 2 - configs/harmony_defconfig | 2 - configs/jetson-tk1_defconfig | 2 - configs/medcom-wide_defconfig | 2 - configs/nyan-big_defconfig | 2 - configs/p2371-0000_defconfig | 2 - configs/p2371-2180_defconfig | 2 - configs/p2571_defconfig | 2 - configs/p2771-0000-000_defconfig | 2 - configs/p2771-0000-500_defconfig | 2 - configs/paz00_defconfig | 2 - configs/plutux_defconfig | 2 - configs/seaboard_defconfig | 2 - configs/tec-ng_defconfig | 2 - configs/tec_defconfig | 2 - configs/trimslice_defconfig | 2 - configs/venice2_defconfig | 2 - configs/ventana_defconfig | 2 - configs/whistler_defconfig | 2 - drivers/block/blk-uclass.c | 65 ++++++++++++++++++++++++++++---- drivers/mmc/mmc-uclass.c | 27 ++++++++++---- drivers/mmc/tegra_mmc.c | 72 ++++++++++++++++++++---------------- include/blk.h | 15 +++++++- test/dm/blk.c | 60 +++++++++++++++++++++++++++++- 35 files changed, 203 insertions(+), 107 deletions(-)--
2.12.2.816.g2cccc81164-goog_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
https://lists.denx.de/listinfo/u-boot
Signature · 2 lines
With Best Regards, Andy Shevchenko