mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andres Salomon <dilinger@queued.net>
To: Samuel Ortiz <sameo@linux.intel.com>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 28/29] mfd-core: add platform_device sharing support for mfd (v2)
Date: Thu, 17 Feb 2011 19:07:35 -0800	[thread overview]
Message-ID: <1297998456-7615-29-git-send-email-dilinger@queued.net> (raw)
In-Reply-To: <1297998456-7615-1-git-send-email-dilinger@queued.net>

This adds functions to enable platform_device sharing for mfd clients.

Each platform driver (mfd client) that wants to share an mfd_cell's
platform_device uses the mfd_shared_platform_driver_{un,}register()
functions instead of platform_driver_{un,}register().  Along with
registering the platform driver, these also register a new platform
device with the same characteristics as the original cell, but a different
name.  Given an mfd_cell with the name "foo", drivers that want to
share access to its resources can call mfd_shared_platform_driver_register
with platform drivers named (for example) "bar" and "baz".  This
will register two platform devices and drivers named "bar" and "baz"
that share the same cell as the platform device "foo".  The drivers
can then call "foo" cell's enable hooks (or mfd_shared_cell_enable)
to enable resources, and obtain platform resources as they normally
would.

This deals with platform handling only; mfd driver-specific details,
hardware handling, refcounting, etc are all dealt with separately.

v2: Drop the randomized names, and instead let drivers specify
their own names.  This gets rid of a bunch of code, and ensures
that userspace will know where platform drivers/devices will show
up in sysfs.

Signed-off-by: Andres Salomon <dilinger@queued.net>
---
 drivers/mfd/mfd-core.c   |   61 ++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/core.h |    9 +++++++
 2 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index ca789f8..bb2264c 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -184,5 +184,66 @@ void mfd_remove_devices(struct device *parent)
 }
 EXPORT_SYMBOL(mfd_remove_devices);
 
+static int add_shared_platform_device(const char *cell, const char *name)
+{
+	struct mfd_cell cell_entry;
+	struct device *dev;
+	struct platform_device *pdev;
+	int err;
+
+	/* check if we've already registered a device (don't fail if we have) */
+	if (bus_find_device_by_name(&platform_bus_type, NULL, name))
+		return 0;
+
+	/* fetch the parent cell's device (should already be registered!) */
+	dev = bus_find_device_by_name(&platform_bus_type, NULL, cell);
+	if (!dev) {
+		printk(KERN_ERR "failed to find device for cell %s\n", cell);
+		return -ENODEV;
+	}
+	pdev = to_platform_device(dev);
+	memcpy(&cell_entry, mfd_get_cell(pdev), sizeof(cell_entry));
+
+	WARN_ON(!cell_entry.enable);
+
+	cell_entry.name = name;
+	err = mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0);
+	if (err)
+		dev_err(dev, "MFD add devices failed: %d\n", err);
+	return err;
+}
+
+int mfd_shared_platform_driver_register(struct platform_driver *drv,
+		const char *cellname)
+{
+	int err;
+
+	err = add_shared_platform_device(cellname, drv->driver.name);
+	if (err)
+		printk(KERN_ERR "failed to add platform device %s\n",
+				drv->driver.name);
+
+	err = platform_driver_register(drv);
+	if (err)
+		printk(KERN_ERR "failed to add platform driver %s\n",
+				drv->driver.name);
+
+	return err;
+}
+EXPORT_SYMBOL(mfd_shared_platform_driver_register);
+
+void mfd_shared_platform_driver_unregister(struct platform_driver *drv)
+{
+	struct device *dev;
+
+	dev = bus_find_device_by_name(&platform_bus_type, NULL,
+			drv->driver.name);
+	if (dev)
+		platform_device_unregister(to_platform_device(dev));
+
+	platform_driver_unregister(drv);
+}
+EXPORT_SYMBOL(mfd_shared_platform_driver_unregister);
+
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Ian Molton, Dmitry Baryshkov");
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
index 22a2f5e..ed99704 100644
--- a/include/linux/mfd/core.h
+++ b/include/linux/mfd/core.h
@@ -87,4 +87,13 @@ extern int mfd_add_devices(struct device *parent, int id,
 
 extern void mfd_remove_devices(struct device *parent);
 
+/*
+ * For MFD drivers with clients sharing access to resources, these create
+ * multiple platform devices per cell.  Contention handling must still be
+ * handled via drivers (ie, with enable/disable hooks).
+ */
+extern int mfd_shared_platform_driver_register(struct platform_driver *drv,
+		const char *cellname);
+extern void mfd_shared_platform_driver_unregister(struct platform_driver *drv);
+
 #endif
-- 
1.7.2.3


  parent reply	other threads:[~2011-02-18  3:10 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-18  3:07 MFD sharing support (v3, full) Andres Salomon
2011-02-18  3:07 ` [PATCH 01/29] mfd-core: fix up typos/vagueness in comment Andres Salomon
2011-02-18  3:07 ` [PATCH 02/29] mfd-core: unconditionally add mfd_cell to every platform_device Andres Salomon
2011-02-18  3:07 ` [PATCH 03/29] jz4740: mfd_cell is now implicitly available to drivers Andres Salomon
2011-02-18  3:07 ` [PATCH 04/29] ab3550: " Andres Salomon
2011-02-18  3:07 ` [PATCH 05/29] ab3100: mfd_cell is now implicitly available to drivers (v2) Andres Salomon
2011-02-18  3:07 ` [PATCH 06/29] asic3: mfd_cell is now implicitly available to drivers Andres Salomon
2011-02-18  3:07 ` [PATCH 07/29] htc-pasic3: " Andres Salomon
2011-02-18  3:07 ` [PATCH 08/29] timberdale: mfd_cell is now implicitly available to drivers (v2) Andres Salomon
2011-02-18  3:07 ` [PATCH 09/29] t7166xb: mfd_cell is now implicitly available to drivers Andres Salomon
2011-02-25  9:05   ` Artem Bityutskiy
2011-02-25 10:47     ` Samuel Ortiz
2011-02-18  3:07 ` [PATCH 10/29] wl1273: " Andres Salomon
2011-02-18  3:07 ` [PATCH 11/29] sh_mobile_sdhi: " Andres Salomon
2011-02-18  3:07 ` [PATCH 12/29] tc6393xb: " Andres Salomon
2011-02-18  3:07 ` [PATCH 13/29] twl4030: mfd_cell is now implicitly available to drivers (v2) Andres Salomon
2011-02-18  6:44   ` Peter Ujfalusi
2011-02-18  3:07 ` [PATCH 14/29] tc6387xb: mfd_cell is now implicitly available to drivers Andres Salomon
2011-02-18  3:07 ` [PATCH 15/29] janz: mfd_cell is now implicitly available to drivers (v2) Andres Salomon
2011-02-18  3:07 ` [PATCH 16/29] mc13xxx: " Andres Salomon
2011-02-18  3:07 ` [PATCH 17/29] mfd-core: drop data_size from mfd_cell struct Andres Salomon
2011-02-18  3:07 ` [PATCH 18/29] mfd-core: rename platform_data field of mfd_cell to mfd_data Andres Salomon
2011-02-18  3:07 ` [PATCH 19/29] davinci_voicecodec: use mfd_data instead of driver_data Andres Salomon
2011-02-18  3:07 ` [PATCH 20/29] wm8400-codec: use mfd_data instead of driver_data (v2) Andres Salomon
2011-02-18  3:51   ` Mark Brown
2011-02-18  3:07 ` [PATCH 21/29] ds1wm: use mfd_data instead of driver_data Andres Salomon
2011-02-18  3:07 ` [PATCH 22/29] tmio-mmc: " Andres Salomon
2011-02-18  3:07 ` [PATCH 23/29] tmio-nand: " Andres Salomon
2011-02-18  3:07 ` [PATCH 24/29] tmio-fb: " Andres Salomon
2011-02-18  3:07 ` [PATCH 25/29] rdc321x-southbridge: use mfd_data instead of driver_data (v2) Andres Salomon
2011-02-18  3:07 ` [PATCH 26/29] mfd-core: remove driver_data field from mfd_cell Andres Salomon
2011-02-18  3:07 ` [PATCH 27/29] mfd-core: add refcounting support to mfd_cells (v2) Andres Salomon
2011-02-28 16:39   ` Samuel Ortiz
2011-02-18  3:07 ` Andres Salomon [this message]
2011-02-28 16:40   ` [PATCH 28/29] mfd-core: add platform_device sharing support for mfd (v2) Samuel Ortiz
2011-02-18  3:07 ` [PATCH 29/29] cs5535-mfd: add sharing for acpi/pms cells Andres Salomon
2011-02-28 16:39 ` MFD sharing support (v3, full) Samuel Ortiz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1297998456-7615-29-git-send-email-dilinger@queued.net \
    --to=dilinger@queued.net \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sameo@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome