Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+22
+21
drivers/base/platform.c
··· 32 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 54 * platform_get_resource - get a resource for a device 36 55 * @dev: platform device 37 56 * @type: resource type ··· 192 173 pa->pdev.id = id; 193 174 device_initialize(&pa->pdev.dev); 194 175 pa->pdev.dev.release = platform_device_release; 176 + arch_setup_pdev_archdata(&pa->pdev); 195 177 } 196 178 197 179 return pa ? &pa->pdev : NULL; ··· 354 334 int platform_device_register(struct platform_device *pdev) 355 335 { 356 336 device_initialize(&pdev->dev); 337 + arch_setup_pdev_archdata(pdev); 357 338 return platform_device_add(pdev); 358 339 } 359 340 EXPORT_SYMBOL_GPL(platform_device_register);
+1
include/linux/platform_device.h
··· 42 42 extern struct bus_type platform_bus_type; 43 43 extern struct device platform_bus; 44 44 45 + extern void arch_setup_pdev_archdata(struct platform_device *); 45 46 extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int); 46 47 extern int platform_get_irq(struct platform_device *, unsigned int); 47 48 extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);