diff mbox

[3/4] mmc: sdhci-acpi: Let devices define their own private data

Message ID 1508409706-27026-4-git-send-email-adrian.hunter@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Adrian Hunter Oct. 19, 2017, 10:41 a.m. UTC
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(-)

Comments

Ulf Hansson Oct. 30, 2017, 11:40 a.m. UTC | #1
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 mbox

Patch

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);