]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
mmc: sdhci-acpi: Let devices define their own private data
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 19 Oct 2017 10:41:45 +0000 (13:41 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 2 Nov 2017 14:20:27 +0000 (15:20 +0100)
Let devices define their own private data to facilitate device-specific
operations. The size of the private structure is specified in the
sdhci_acpi_slot structure, then sdhci_acpi_probe() will allocate extra
space for it, and sdhci_acpi_priv() can be used to get a reference to it.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-acpi.c

index 640be5b618fc6d1f78c57e91a5149f7492a2445b..5bb5880403b2918381fee95ff9c82db9fa3d15e0 100644 (file)
@@ -73,6 +73,7 @@ struct sdhci_acpi_slot {
        unsigned int    caps2;
        mmc_pm_flag_t   pm_caps;
        unsigned int    flags;
+       size_t          priv_size;
        int (*probe_slot)(struct platform_device *, const char *, const char *);
        int (*remove_slot)(struct platform_device *);
 };
@@ -82,8 +83,14 @@ struct sdhci_acpi_host {
        const struct sdhci_acpi_slot    *slot;
        struct platform_device          *pdev;
        bool                            use_runtime_pm;
+       unsigned long                   private[0] ____cacheline_aligned;
 };
 
+static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c)
+{
+       return (void *)c->private;
+}
+
 static inline bool sdhci_acpi_flag(struct sdhci_acpi_host *c, unsigned int flag)
 {
        return c->slot && (c->slot->flags & flag);
@@ -393,11 +400,13 @@ static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid,
 static int sdhci_acpi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
+       const struct sdhci_acpi_slot *slot;
        struct acpi_device *device, *child;
        struct sdhci_acpi_host *c;
        struct sdhci_host *host;
        struct resource *iomem;
        resource_size_t len;
+       size_t priv_size;
        const char *hid;
        const char *uid;
        int err;
@@ -409,6 +418,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
        hid = acpi_device_hid(device);
        uid = acpi_device_uid(device);
 
+       slot = sdhci_acpi_get_slot(hid, uid);
+
        /* Power on the SDHCI controller and its children */
        acpi_device_fix_up_power(device);
        if (!sdhci_acpi_no_fixup_child_power(hid, uid)) {
@@ -431,13 +442,14 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
        if (!devm_request_mem_region(dev, iomem->start, len, dev_name(dev)))
                return -ENOMEM;
 
-       host = sdhci_alloc_host(dev, sizeof(struct sdhci_acpi_host));
+       priv_size = slot ? slot->priv_size : 0;
+       host = sdhci_alloc_host(dev, sizeof(struct sdhci_acpi_host) + priv_size);
        if (IS_ERR(host))
                return PTR_ERR(host);
 
        c = sdhci_priv(host);
        c->host = host;
-       c->slot = sdhci_acpi_get_slot(hid, uid);
+       c->slot = slot;
        c->pdev = pdev;
        c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM);