Hi Mikhail,

On Thu, 27 Jun 2024 at 12:35, Mikhail Kshevetskiy
<mikhail.kshevets...@iopsys.eu> wrote:
>
> Rebinding of the mmc driver causes reregistration of block device.
> Thus second mmc device appears and the first becomes broken.
>
> Fix an issue by using already registered block device instead of
> registering a new one.
>
> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
> ---
>  drivers/mmc/mmc-uclass.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
> index 24170c59ecc..403d20dad53 100644
> --- a/drivers/mmc/mmc-uclass.c
> +++ b/drivers/mmc/mmc-uclass.c
> @@ -420,11 +420,17 @@ int mmc_bind(struct udevice *dev, struct mmc *mmc, 
> const struct mmc_config *cfg)
>         /* Use the fixed index with aliases node's index */
>         debug("%s: alias devnum=%d\n", __func__, dev_seq(dev));
>
> -       ret = blk_create_devicef(dev, "mmc_blk", "blk", UCLASS_MMC,
> -                                dev_seq(dev), DEFAULT_BLKSZ, 0, &bdev);
> -       if (ret) {
> -               debug("Cannot create block device\n");
> -               return ret;
> +#if CONFIG_IS_ENABLED(MULTI_DTB_FIT_RESCAN)
> +       device_find_first_child_by_uclass(dev, UCLASS_BLK, &bdev);
> +       if (!bdev)
> +#endif
> +       {
> +               ret = blk_create_devicef(dev, "mmc_blk", "blk", UCLASS_MMC,
> +                                        dev_seq(dev), DEFAULT_BLKSZ, 0, 
> &bdev);
> +               if (ret) {
> +                       debug("Cannot create block device\n");
> +                       return ret;
> +               }
>         }
>         bdesc = dev_get_uclass_plat(bdev);
>         mmc->cfg = cfg;
> --
> 2.43.0
>

There is a mmc_unbind() function which is supposed to handle unbinding
the mmc block device Can you got into a little more detail as to what
is going wrong?

Regards,
Simon

Reply via email to