Message ID | 1508409706-27026-4-git-send-email-adrian.hunter@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 19 October 2017 at 12:41, Adrian Hunter <adrian.hunter@intel.com> wrote: > 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> Thanks, applied for next! Kind regards Uffe > --- > drivers/mmc/host/sdhci-acpi.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c > index 640be5b618fc..5bb5880403b2 100644 > --- a/drivers/mmc/host/sdhci-acpi.c > +++ b/drivers/mmc/host/sdhci-acpi.c > @@ -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); > > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index 640be5b618fc..5bb5880403b2 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c @@ -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);
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> --- drivers/mmc/host/sdhci-acpi.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)