diff options
-rw-r--r-- | drivers/base/platform.c | 18 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_mainstone.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_sharpsl.c | 1 | ||||
-rw-r--r-- | include/linux/device.h | 4 |
4 files changed, 22 insertions, 2 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 17b5ece8f82c..eb84d9d44645 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -160,6 +160,11 @@ static void platform_device_release(struct device *dev) | |||
160 | * | 160 | * |
161 | * Create a platform device object which can have other objects attached | 161 | * Create a platform device object which can have other objects attached |
162 | * to it, and which will have attached objects freed when it is released. | 162 | * to it, and which will have attached objects freed when it is released. |
163 | * | ||
164 | * This device will be marked as not supporting hotpluggable drivers; no | ||
165 | * device add/remove uevents will be generated. In the unusual case that | ||
166 | * the device isn't being dynamically allocated as a legacy "probe the | ||
167 | * hardware" driver, infrastructure code should reverse this marking. | ||
163 | */ | 168 | */ |
164 | struct platform_device *platform_device_alloc(const char *name, unsigned int id) | 169 | struct platform_device *platform_device_alloc(const char *name, unsigned int id) |
165 | { | 170 | { |
@@ -172,6 +177,12 @@ struct platform_device *platform_device_alloc(const char *name, unsigned int id) | |||
172 | pa->pdev.id = id; | 177 | pa->pdev.id = id; |
173 | device_initialize(&pa->pdev.dev); | 178 | device_initialize(&pa->pdev.dev); |
174 | pa->pdev.dev.release = platform_device_release; | 179 | pa->pdev.dev.release = platform_device_release; |
180 | |||
181 | /* prevent hotplug "modprobe $(MODALIAS)" from causing trouble in | ||
182 | * legacy probe-the-hardware drivers, which don't properly split | ||
183 | * out device enumeration logic from drivers. | ||
184 | */ | ||
185 | pa->pdev.dev.uevent_suppress = 1; | ||
175 | } | 186 | } |
176 | 187 | ||
177 | return pa ? &pa->pdev : NULL; | 188 | return pa ? &pa->pdev : NULL; |
@@ -351,6 +362,13 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); | |||
351 | * memory allocated for the device allows drivers using such devices | 362 | * memory allocated for the device allows drivers using such devices |
352 | * to be unloaded iwithout waiting for the last reference to the device | 363 | * to be unloaded iwithout waiting for the last reference to the device |
353 | * to be dropped. | 364 | * to be dropped. |
365 | * | ||
366 | * This interface is primarily intended for use with legacy drivers | ||
367 | * which probe hardware directly. Because such drivers create sysfs | ||
368 | * device nodes themselves, rather than letting system infrastructure | ||
369 | * handle such device enumeration tasks, they don't fully conform to | ||
370 | * the Linux driver model. In particular, when such drivers are built | ||
371 | * as modules, they can't be "hotplugged". | ||
354 | */ | 372 | */ |
355 | struct platform_device *platform_device_register_simple(char *name, unsigned int id, | 373 | struct platform_device *platform_device_register_simple(char *name, unsigned int id, |
356 | struct resource *res, unsigned int num) | 374 | struct resource *res, unsigned int num) |
diff --git a/drivers/pcmcia/pxa2xx_mainstone.c b/drivers/pcmcia/pxa2xx_mainstone.c index fda06941e730..383107ba4bd3 100644 --- a/drivers/pcmcia/pxa2xx_mainstone.c +++ b/drivers/pcmcia/pxa2xx_mainstone.c | |||
@@ -175,6 +175,7 @@ static int __init mst_pcmcia_init(void) | |||
175 | if (!mst_pcmcia_device) | 175 | if (!mst_pcmcia_device) |
176 | return -ENOMEM; | 176 | return -ENOMEM; |
177 | 177 | ||
178 | mst_pcmcia_device->dev.uevent_suppress = 0; | ||
178 | mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops; | 179 | mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops; |
179 | 180 | ||
180 | ret = platform_device_add(mst_pcmcia_device); | 181 | ret = platform_device_add(mst_pcmcia_device); |
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c index b7b9e149c5b9..a2daa3f531b2 100644 --- a/drivers/pcmcia/pxa2xx_sharpsl.c +++ b/drivers/pcmcia/pxa2xx_sharpsl.c | |||
@@ -261,6 +261,7 @@ static int __init sharpsl_pcmcia_init(void) | |||
261 | if (!sharpsl_pcmcia_device) | 261 | if (!sharpsl_pcmcia_device) |
262 | return -ENOMEM; | 262 | return -ENOMEM; |
263 | 263 | ||
264 | sharpsl_pcmcia_device->dev.uevent_suppress = 0; | ||
264 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; | 265 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; |
265 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; | 266 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; |
266 | 267 | ||
diff --git a/include/linux/device.h b/include/linux/device.h index 6579068134d1..2e1a2988b7e1 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -412,12 +412,13 @@ struct device { | |||
412 | struct klist_node knode_parent; /* node in sibling list */ | 412 | struct klist_node knode_parent; /* node in sibling list */ |
413 | struct klist_node knode_driver; | 413 | struct klist_node knode_driver; |
414 | struct klist_node knode_bus; | 414 | struct klist_node knode_bus; |
415 | struct device * parent; | 415 | struct device *parent; |
416 | 416 | ||
417 | struct kobject kobj; | 417 | struct kobject kobj; |
418 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ | 418 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ |
419 | struct device_type *type; | 419 | struct device_type *type; |
420 | unsigned is_registered:1; | 420 | unsigned is_registered:1; |
421 | unsigned uevent_suppress:1; | ||
421 | struct device_attribute uevent_attr; | 422 | struct device_attribute uevent_attr; |
422 | struct device_attribute *devt_attr; | 423 | struct device_attribute *devt_attr; |
423 | 424 | ||
@@ -458,7 +459,6 @@ struct device { | |||
458 | struct class *class; | 459 | struct class *class; |
459 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | 460 | dev_t devt; /* dev_t, creates the sysfs "dev" */ |
460 | struct attribute_group **groups; /* optional groups */ | 461 | struct attribute_group **groups; /* optional groups */ |
461 | int uevent_suppress; | ||
462 | 462 | ||
463 | void (*release)(struct device * dev); | 463 | void (*release)(struct device * dev); |
464 | }; | 464 | }; |