mmc: core: add devm_mmc_alloc_host
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 3 Feb 2023 23:53:35 +0000 (00:53 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 13 Feb 2023 22:55:43 +0000 (23:55 +0100)
Add a device-managed version of mmc_alloc_host().

The argument order is reversed compared to mmc_alloc_host() because
device-managed functions typically have the device argument first.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Link: https://lore.kernel.org/r/6d8f9fdc-7c9e-8e4f-e6ef-5470b971c74e@gmail.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/host.c
include/linux/mmc/host.h

index d17eda7..6a7475a 100644 (file)
@@ -588,6 +588,32 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 
 EXPORT_SYMBOL(mmc_alloc_host);
 
+static void devm_mmc_host_release(struct device *dev, void *res)
+{
+       mmc_free_host(*(struct mmc_host **)res);
+}
+
+struct mmc_host *devm_mmc_alloc_host(struct device *dev, int extra)
+{
+       struct mmc_host **dr, *host;
+
+       dr = devres_alloc(devm_mmc_host_release, sizeof(*dr), GFP_KERNEL);
+       if (!dr)
+               return ERR_PTR(-ENOMEM);
+
+       host = mmc_alloc_host(extra, dev);
+       if (IS_ERR(host)) {
+               devres_free(dr);
+               return host;
+       }
+
+       *dr = host;
+       devres_add(dev, dr);
+
+       return host;
+}
+EXPORT_SYMBOL(devm_mmc_alloc_host);
+
 static int mmc_validate_host_caps(struct mmc_host *host)
 {
        struct device *dev = host->parent;
index 8fdd3cf..812e6b5 100644 (file)
@@ -527,6 +527,7 @@ struct mmc_host {
 struct device_node;
 
 struct mmc_host *mmc_alloc_host(int extra, struct device *);
+struct mmc_host *devm_mmc_alloc_host(struct device *dev, int extra);
 int mmc_add_host(struct mmc_host *);
 void mmc_remove_host(struct mmc_host *);
 void mmc_free_host(struct mmc_host *);