diff options
| author | Kumar Gala <galak@kernel.crashing.org> | 2011-06-10 02:52:57 -0400 |
|---|---|---|
| committer | Kumar Gala <galak@kernel.crashing.org> | 2011-07-08 01:21:35 -0400 |
| commit | a77ce8167cc1d0370fcb1d79b367d62e050cb2b0 (patch) | |
| tree | dcc1ad81d57546e066edbaddb9f6ebbd70e1c6a5 /drivers/base | |
| parent | 3160b09796129abc9523ea3cd1633b0faba64a02 (diff) | |
driver core: Add ability for arch code to setup pdev_archdata
On some architectures we need to setup pdev_archdata before we add the
device. Waiting til a bus_notifier is too late since we might need the
pdev_archdata in the bus notifier. One example is setting up of dma_mask
pointers such that it can be used in a bus_notifier.
We add weak noop version of arch_setup_pdev_archdata() and allow the arch
code to override with access the full definitions of struct device,
struct platform_device, and struct pdev_archdata.
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/platform.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 6040717b62bb..0cad9c7f6bb5 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -32,6 +32,25 @@ struct device platform_bus = { | |||
| 32 | EXPORT_SYMBOL_GPL(platform_bus); | 32 | EXPORT_SYMBOL_GPL(platform_bus); |
| 33 | 33 | ||
| 34 | /** | 34 | /** |
| 35 | * arch_setup_pdev_archdata - Allow manipulation of archdata before its used | ||
| 36 | * @dev: platform device | ||
| 37 | * | ||
| 38 | * This is called before platform_device_add() such that any pdev_archdata may | ||
| 39 | * be setup before the platform_notifier is called. So if a user needs to | ||
| 40 | * manipulate any relevant information in the pdev_archdata they can do: | ||
| 41 | * | ||
| 42 | * platform_devic_alloc() | ||
| 43 | * ... manipulate ... | ||
| 44 | * platform_device_add() | ||
| 45 | * | ||
| 46 | * And if they don't care they can just call platform_device_register() and | ||
| 47 | * everything will just work out. | ||
| 48 | */ | ||
| 49 | void __weak arch_setup_pdev_archdata(struct platform_device *pdev) | ||
| 50 | { | ||
| 51 | } | ||
| 52 | |||
| 53 | /** | ||
| 35 | * platform_get_resource - get a resource for a device | 54 | * platform_get_resource - get a resource for a device |
| 36 | * @dev: platform device | 55 | * @dev: platform device |
| 37 | * @type: resource type | 56 | * @type: resource type |
| @@ -173,6 +192,7 @@ struct platform_device *platform_device_alloc(const char *name, int id) | |||
| 173 | pa->pdev.id = id; | 192 | pa->pdev.id = id; |
| 174 | device_initialize(&pa->pdev.dev); | 193 | device_initialize(&pa->pdev.dev); |
| 175 | pa->pdev.dev.release = platform_device_release; | 194 | pa->pdev.dev.release = platform_device_release; |
| 195 | arch_setup_pdev_archdata(&pa->pdev); | ||
| 176 | } | 196 | } |
| 177 | 197 | ||
| 178 | return pa ? &pa->pdev : NULL; | 198 | return pa ? &pa->pdev : NULL; |
| @@ -334,6 +354,7 @@ EXPORT_SYMBOL_GPL(platform_device_del); | |||
| 334 | int platform_device_register(struct platform_device *pdev) | 354 | int platform_device_register(struct platform_device *pdev) |
| 335 | { | 355 | { |
| 336 | device_initialize(&pdev->dev); | 356 | device_initialize(&pdev->dev); |
| 357 | arch_setup_pdev_archdata(pdev); | ||
| 337 | return platform_device_add(pdev); | 358 | return platform_device_add(pdev); |
| 338 | } | 359 | } |
| 339 | EXPORT_SYMBOL_GPL(platform_device_register); | 360 | EXPORT_SYMBOL_GPL(platform_device_register); |
