diff options
| author | Andres Salomon <dilinger@queued.net> | 2011-03-21 22:19:35 -0400 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-03-26 19:09:30 -0400 |
| commit | fa1df691688f34cbcd5bf77bd084bbe47e9d6bfe (patch) | |
| tree | 83df18f1d427115c0016a059535b04f2d600a2d0 /include/linux/mfd | |
| parent | 16c29dafcc86024048f1dbb8349d31cb22c7c55a (diff) | |
mfd: Add mfd_clone_cell(), convert cs5535-mfd/olpc-xo1 to it
Replace mfd_shared_platform_driver_register with mfd_clone_cell. The
former was called by an mfd client, and registered both a platform driver
and device. The latter is called by an mfd driver, and registers only a
platform device.
The downside of this is that mfd drivers need to be modified whenever
new clients are added that share a cell; the upside is that it fits
Linux's driver model better. It's also simpler.
This also converts cs5535-mfd/olpc-xo1 from the old API. cs5535-mfd
now creates the olpc-xo1-{acpi,pms} devices, while olpc-xo1 binds to
them via platform drivers.
Signed-off-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'include/linux/mfd')
| -rw-r--r-- | include/linux/mfd/core.h | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h index 1408bf8eed5f..ad1b19aa6508 100644 --- a/include/linux/mfd/core.h +++ b/include/linux/mfd/core.h | |||
| @@ -63,6 +63,24 @@ extern int mfd_cell_enable(struct platform_device *pdev); | |||
| 63 | extern int mfd_cell_disable(struct platform_device *pdev); | 63 | extern int mfd_cell_disable(struct platform_device *pdev); |
| 64 | 64 | ||
| 65 | /* | 65 | /* |
| 66 | * "Clone" multiple platform devices for a single cell. This is to be used | ||
| 67 | * for devices that have multiple users of a cell. For example, if an mfd | ||
| 68 | * driver wants the cell "foo" to be used by a GPIO driver, an MTD driver, | ||
| 69 | * and a platform driver, the following bit of code would be use after first | ||
| 70 | * calling mfd_add_devices(): | ||
| 71 | * | ||
| 72 | * const char *fclones[] = { "foo-gpio", "foo-mtd" }; | ||
| 73 | * err = mfd_clone_cells("foo", fclones, ARRAY_SIZE(fclones)); | ||
| 74 | * | ||
| 75 | * Each driver (MTD, GPIO, and platform driver) would then register | ||
| 76 | * platform_drivers for "foo-mtd", "foo-gpio", and "foo", respectively. | ||
| 77 | * The cell's .enable/.disable hooks should be used to deal with hardware | ||
| 78 | * resource contention. | ||
| 79 | */ | ||
| 80 | extern int mfd_clone_cell(const char *cell, const char **clones, | ||
| 81 | size_t n_clones); | ||
| 82 | |||
| 83 | /* | ||
| 66 | * Given a platform device that's been created by mfd_add_devices(), fetch | 84 | * Given a platform device that's been created by mfd_add_devices(), fetch |
| 67 | * the mfd_cell that created it. | 85 | * the mfd_cell that created it. |
| 68 | */ | 86 | */ |
| @@ -87,13 +105,4 @@ extern int mfd_add_devices(struct device *parent, int id, | |||
| 87 | 105 | ||
| 88 | extern void mfd_remove_devices(struct device *parent); | 106 | extern void mfd_remove_devices(struct device *parent); |
| 89 | 107 | ||
| 90 | /* | ||
| 91 | * For MFD drivers with clients sharing access to resources, these create | ||
| 92 | * multiple platform devices per cell. Contention handling must still be | ||
| 93 | * handled via drivers (ie, with enable/disable hooks). | ||
| 94 | */ | ||
| 95 | extern int mfd_shared_platform_driver_register(struct platform_driver *drv, | ||
| 96 | const char *cellname); | ||
| 97 | extern void mfd_shared_platform_driver_unregister(struct platform_driver *drv); | ||
| 98 | |||
| 99 | #endif | 108 | #endif |
