* [PATCH] Create PNP device attributes via dev_attrs field of struct device
@ 2008-09-23 21:24 Drew Moseley
2008-09-24 4:59 ` Kay Sievers
0 siblings, 1 reply; 8+ messages in thread
From: Drew Moseley @ 2008-09-23 21:24 UTC (permalink / raw)
To: ambx1; +Cc: linux-kernel
Hello,
I have seen an issue where the sysfs entries for a PNP device are
created nonatomically resulting in a race condition with freedesktop
HAL. The patch below is my first attempt at addressing this by creating
the device attributes as default bus attributes and allowing the
device_register() call to create them. Any nasty side effects I am not
addressing? Comments?
Regards,
Drew Moseley
Signed-off-by: Drew Moseley <dmoseley@mvista.com>
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
index 9fd7bb9..b07787f 100644
--- a/drivers/pnp/base.h
+++ b/drivers/pnp/base.h
@@ -16,7 +16,7 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *,
int id, char *pnpid);
int pnp_add_device(struct pnp_dev *dev);
struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id);
-int pnp_interface_attach_device(struct pnp_dev *dev);
+void pnp_interface_attach_device(struct pnp_dev *dev);
int pnp_add_card(struct pnp_card *card);
void pnp_remove_card(struct pnp_card *card);
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c
index a411582..bcd49ba 100644
--- a/drivers/pnp/core.c
+++ b/drivers/pnp/core.c
@@ -159,8 +159,6 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol
*protocol, int id, char *pnpid
int __pnp_add_device(struct pnp_dev *dev)
{
- int ret;
-
pnp_fixup_device(dev);
dev->status = PNP_READY;
spin_lock(&pnp_lock);
@@ -168,12 +166,8 @@ int __pnp_add_device(struct pnp_dev *dev)
list_add_tail(&dev->protocol_list, &dev->protocol->devices);
spin_unlock(&pnp_lock);
- ret = device_register(&dev->dev);
- if (ret)
- return ret;
-
pnp_interface_attach_device(dev);
- return 0;
+ return device_register(&dev->dev);
}
/*
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c
index a876ecf..442684d 100644
--- a/drivers/pnp/interface.c
+++ b/drivers/pnp/interface.c
@@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,
return ret;
}
-static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL);
-
static ssize_t pnp_show_current_resources(struct device *dmdev,
struct device_attribute *attr,
char *buf)
@@ -420,9 +418,6 @@ done:
return count;
}
-static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR,
- pnp_show_current_resources, pnp_set_current_resources);
-
static ssize_t pnp_show_current_ids(struct device *dmdev,
struct device_attribute *attr, char *buf)
{
@@ -437,27 +432,16 @@ static ssize_t pnp_show_current_ids(struct device
*dmdev,
return (str - buf);
}
-static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL);
+static struct device_attribute pnp_interface_attrs[] = {
+ __ATTR(resources, S_IRUGO | S_IWUSR,
+ pnp_show_current_resources,
+ pnp_set_current_resources),
+ __ATTR(options, S_IRUGO, pnp_show_options, NULL),
+ __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
+ __ATTR_NULL,
+};
-int pnp_interface_attach_device(struct pnp_dev *dev)
+void pnp_interface_attach_device(struct pnp_dev *dev)
{
- int rc = device_create_file(&dev->dev, &dev_attr_options);
-
- if (rc)
- goto err;
- rc = device_create_file(&dev->dev, &dev_attr_resources);
- if (rc)
- goto err_opt;
- rc = device_create_file(&dev->dev, &dev_attr_id);
- if (rc)
- goto err_res;
-
- return 0;
-
-err_res:
- device_remove_file(&dev->dev, &dev_attr_resources);
-err_opt:
- device_remove_file(&dev->dev, &dev_attr_options);
-err:
- return rc;
+ dev->dev.bus->dev_attrs = pnp_interface_attrs;
}
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-23 21:24 [PATCH] Create PNP device attributes via dev_attrs field of struct device Drew Moseley
@ 2008-09-24 4:59 ` Kay Sievers
2008-09-24 17:22 ` Drew Moseley
0 siblings, 1 reply; 8+ messages in thread
From: Kay Sievers @ 2008-09-24 4:59 UTC (permalink / raw)
To: Drew Moseley; +Cc: ambx1, linux-kernel
On Tue, Sep 23, 2008 at 14:24, Drew Moseley <dmoseley@mvista.com> wrote:
> I have seen an issue where the sysfs entries for a PNP device are
> created nonatomically resulting in a race condition with freedesktop
> HAL. The patch below is my first attempt at addressing this by creating
> the device attributes as default bus attributes and allowing the
> device_register() call to create them. Any nasty side effects I am not
> addressing? Comments?
> diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
> index 9fd7bb9..b07787f 100644
> --- a/drivers/pnp/base.h
> +++ b/drivers/pnp/base.h
> @@ -16,7 +16,7 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *,
> int id, char *pnpid);
>
> int pnp_add_device(struct pnp_dev *dev);
> struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id);
> -int pnp_interface_attach_device(struct pnp_dev *dev);
> +void pnp_interface_attach_device(struct pnp_dev *dev);
>
> int pnp_add_card(struct pnp_card *card);
> void pnp_remove_card(struct pnp_card *card);
> diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c
> index a411582..bcd49ba 100644
> --- a/drivers/pnp/core.c
> +++ b/drivers/pnp/core.c
> @@ -159,8 +159,6 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol
> *protocol, int id, char *pnpid
>
> int __pnp_add_device(struct pnp_dev *dev)
> {
> - int ret;
> -
> pnp_fixup_device(dev);
> dev->status = PNP_READY;
> spin_lock(&pnp_lock);
> @@ -168,12 +166,8 @@ int __pnp_add_device(struct pnp_dev *dev)
> list_add_tail(&dev->protocol_list, &dev->protocol->devices);
> spin_unlock(&pnp_lock);
>
> - ret = device_register(&dev->dev);
> - if (ret)
> - return ret;
> -
> pnp_interface_attach_device(dev);
> - return 0;
> + return device_register(&dev->dev);
> }
>
> /*
> diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c
> index a876ecf..442684d 100644
> --- a/drivers/pnp/interface.c
> +++ b/drivers/pnp/interface.c
> @@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,
> return ret;
> }
>
> -static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL);
> -
> static ssize_t pnp_show_current_resources(struct device *dmdev,
> struct device_attribute *attr,
> char *buf)
> @@ -420,9 +418,6 @@ done:
> return count;
> }
>
> -static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR,
> - pnp_show_current_resources, pnp_set_current_resources);
> -
> static ssize_t pnp_show_current_ids(struct device *dmdev,
> struct device_attribute *attr, char *buf)
> {
> @@ -437,27 +432,16 @@ static ssize_t pnp_show_current_ids(struct device
> *dmdev,
> return (str - buf);
> }
>
> -static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL);
> +static struct device_attribute pnp_interface_attrs[] = {
> + __ATTR(resources, S_IRUGO | S_IWUSR,
> + pnp_show_current_resources,
> + pnp_set_current_resources),
> + __ATTR(options, S_IRUGO, pnp_show_options, NULL),
> + __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
> + __ATTR_NULL,
> +};
>
> -int pnp_interface_attach_device(struct pnp_dev *dev)
> +void pnp_interface_attach_device(struct pnp_dev *dev)
> {
> - int rc = device_create_file(&dev->dev, &dev_attr_options);
> -
> - if (rc)
> - goto err;
> - rc = device_create_file(&dev->dev, &dev_attr_resources);
> - if (rc)
> - goto err_opt;
> - rc = device_create_file(&dev->dev, &dev_attr_id);
> - if (rc)
> - goto err_res;
> -
> - return 0;
> -
> -err_res:
> - device_remove_file(&dev->dev, &dev_attr_resources);
> -err_opt:
> - device_remove_file(&dev->dev, &dev_attr_options);
> -err:
> - return rc;
> + dev->dev.bus->dev_attrs = pnp_interface_attrs;
Any reason not to assign it statically to pnp_bus_type at in
drivers/pnp/driver.c?
> }
Thanks,
Kay
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-24 4:59 ` Kay Sievers
@ 2008-09-24 17:22 ` Drew Moseley
2008-09-24 19:03 ` Kay Sievers
0 siblings, 1 reply; 8+ messages in thread
From: Drew Moseley @ 2008-09-24 17:22 UTC (permalink / raw)
To: Kay Sievers; +Cc: ambx1, linux-kernel
Kay Sievers wrote:
>
> Any reason not to assign it statically to pnp_bus_type at in
> drivers/pnp/driver.c?
>
> Thanks,
> Kay
Not really but since everything in the dev_attrs array is statically
defined in interface.c it was simpler to implement it this way. To
assign it in driver.c, the array can be made non-static and an extern
added in driver.c, or the array definition can be moved to driver.c and
all the set and show functions be made non-static. Is there a preference?
Thanks,
Drew
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-24 17:22 ` Drew Moseley
@ 2008-09-24 19:03 ` Kay Sievers
2008-09-24 19:37 ` Drew Moseley
0 siblings, 1 reply; 8+ messages in thread
From: Kay Sievers @ 2008-09-24 19:03 UTC (permalink / raw)
To: Drew Moseley; +Cc: ambx1, linux-kernel
On Wed, Sep 24, 2008 at 10:22, Drew Moseley <dmoseley@mvista.com> wrote:
> Kay Sievers wrote:
>>
>> Any reason not to assign it statically to pnp_bus_type at in
>> drivers/pnp/driver.c?
> Not really but since everything in the dev_attrs array is statically
> defined in interface.c it was simpler to implement it this way. To
> assign it in driver.c, the array can be made non-static and an extern
> added in driver.c, or the array definition can be moved to driver.c and
> all the set and show functions be made non-static. Is there a preference?
Yeah, it looks weird to mangle the bus_type values from a device
routine, and set the same value again and again with every device
creation. Just declare the array non-static, if moving the code around
between files does not allow a static declaration.
Thanks,
Kay
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-24 19:03 ` Kay Sievers
@ 2008-09-24 19:37 ` Drew Moseley
2008-09-25 10:13 ` Kay Sievers
0 siblings, 1 reply; 8+ messages in thread
From: Drew Moseley @ 2008-09-24 19:37 UTC (permalink / raw)
To: Kay Sievers; +Cc: ambx1, linux-kernel
Kay Sievers wrote:
> Yeah, it looks weird to mangle the bus_type values from a device
> routine, and set the same value again and again with every device
> creation. Just declare the array non-static, if moving the code around
> between files does not allow a static declaration.
Updated patch.
Drew
Signed-off-by: Drew Moseley <dmoseley@mvista.com>
Index: linux-2.6.21/drivers/pnp/base.h
===================================================================
--- linux-2.6.21.orig/drivers/pnp/base.h
+++ linux-2.6.21/drivers/pnp/base.h
@@ -1,6 +1,5 @@
extern spinlock_t pnp_lock;
void *pnp_alloc(long size);
-int pnp_interface_attach_device(struct pnp_dev *dev);
void pnp_fixup_device(struct pnp_dev *dev);
void pnp_free_option(struct pnp_option *option);
int __pnp_add_device(struct pnp_dev *dev);
Index: linux-2.6.21/drivers/pnp/core.c
===================================================================
--- linux-2.6.21.orig/drivers/pnp/core.c
+++ linux-2.6.21/drivers/pnp/core.c
@@ -111,7 +111,6 @@ static void pnp_release_device(struct de
int __pnp_add_device(struct pnp_dev *dev)
{
- int ret;
pnp_fixup_device(dev);
dev->dev.bus = &pnp_bus_type;
dev->dev.release = &pnp_release_device;
@@ -120,11 +119,7 @@ int __pnp_add_device(struct pnp_dev *dev
list_add_tail(&dev->global_list, &pnp_global);
list_add_tail(&dev->protocol_list, &dev->protocol->devices);
spin_unlock(&pnp_lock);
-
- ret = device_register(&dev->dev);
- if (ret == 0)
- pnp_interface_attach_device(dev);
- return ret;
+ return device_register(&dev->dev);
}
/*
Index: linux-2.6.21/drivers/pnp/interface.c
===================================================================
--- linux-2.6.21.orig/drivers/pnp/interface.c
+++ linux-2.6.21/drivers/pnp/interface.c
@@ -233,9 +233,6 @@ static ssize_t pnp_show_options(struct d
return ret;
}
-static DEVICE_ATTR(options,S_IRUGO,pnp_show_options,NULL);
-
-
static ssize_t pnp_show_current_resources(struct device *dmdev, struct
device_attribute *attr, char *buf)
{
struct pnp_dev *dev = to_pnp_dev(dmdev);
@@ -441,9 +438,6 @@ pnp_set_current_resources(struct device
return count;
}
-static DEVICE_ATTR(resources,S_IRUGO | S_IWUSR,
- pnp_show_current_resources,pnp_set_current_resources);
-
static ssize_t pnp_show_current_ids(struct device *dmdev, struct
device_attribute *attr, char *buf)
{
char *str = buf;
@@ -457,23 +451,11 @@ static ssize_t pnp_show_current_ids(stru
return (str - buf);
}
-static DEVICE_ATTR(id,S_IRUGO,pnp_show_current_ids,NULL);
-
-int pnp_interface_attach_device(struct pnp_dev *dev)
-{
- int rc = device_create_file(&dev->dev,&dev_attr_options);
- if (rc) goto err;
- rc = device_create_file(&dev->dev,&dev_attr_resources);
- if (rc) goto err_opt;
- rc = device_create_file(&dev->dev,&dev_attr_id);
- if (rc) goto err_res;
-
- return 0;
-
-err_res:
- device_remove_file(&dev->dev,&dev_attr_resources);
-err_opt:
- device_remove_file(&dev->dev,&dev_attr_options);
-err:
- return rc;
-}
+struct device_attribute pnp_interface_attrs[] = {
+ __ATTR(resources, S_IRUGO | S_IWUSR,
+ pnp_show_current_resources,
+ pnp_set_current_resources),
+ __ATTR(options, S_IRUGO, pnp_show_options, NULL),
+ __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
+ __ATTR_NULL,
+};
Index: linux-2.6.21/drivers/pnp/driver.c
===================================================================
--- linux-2.6.21.orig/drivers/pnp/driver.c
+++ linux-2.6.21/drivers/pnp/driver.c
@@ -191,6 +191,7 @@ static int pnp_bus_resume(struct device
return 0;
}
+extern struct device_attribute pnp_interface_attrs[];
struct bus_type pnp_bus_type = {
.name = "pnp",
.match = pnp_bus_match,
@@ -198,6 +199,7 @@ struct bus_type pnp_bus_type = {
.remove = pnp_device_remove,
.suspend = pnp_bus_suspend,
.resume = pnp_bus_resume,
+ .dev_attrs = pnp_interface_attrs,
};
int pnp_register_driver(struct pnp_driver *drv)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-24 19:37 ` Drew Moseley
@ 2008-09-25 10:13 ` Kay Sievers
2008-09-25 16:42 ` Drew Moseley
0 siblings, 1 reply; 8+ messages in thread
From: Kay Sievers @ 2008-09-25 10:13 UTC (permalink / raw)
To: Drew Moseley; +Cc: ambx1, linux-kernel
On Wed, Sep 24, 2008 at 12:37, Drew Moseley <dmoseley@mvista.com> wrote:
> Kay Sievers wrote:
>> Yeah, it looks weird to mangle the bus_type values from a device
>> routine, and set the same value again and again with every device
>> creation. Just declare the array non-static, if moving the code around
>> between files does not allow a static declaration.
>
> Updated patch.
> Signed-off-by: Drew Moseley <dmoseley@mvista.com>
> Index: linux-2.6.21/drivers/pnp/base.h
This seems not to apply. Oh, you are patching a 1.5 years old kernel?
:) Care to redo this for a recent one?
Thanks,
Kay
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-25 10:13 ` Kay Sievers
@ 2008-09-25 16:42 ` Drew Moseley
2008-09-27 23:31 ` Kay Sievers
0 siblings, 1 reply; 8+ messages in thread
From: Drew Moseley @ 2008-09-25 16:42 UTC (permalink / raw)
To: Kay Sievers; +Cc: ambx1, linux-kernel
Kay Sievers wrote:
> This seems not to apply. Oh, you are patching a 1.5 years old kernel?
> :) Care to redo this for a recent one?
Ack. Sorry about that. Wrong tree. Here's the right one. ;-)
Signed-off-by: Drew Moseley <dmoseley@mvista.com>
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
index 9fd7bb9..3532984 100644
--- a/drivers/pnp/base.h
+++ b/drivers/pnp/base.h
@@ -4,6 +4,7 @@
*/
extern spinlock_t pnp_lock;
+extern struct device_attribute pnp_interface_attrs[];
void *pnp_alloc(long size);
int pnp_register_protocol(struct pnp_protocol *protocol);
@@ -16,7 +17,6 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *,
int id, char *pnpid);
int pnp_add_device(struct pnp_dev *dev);
struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id);
-int pnp_interface_attach_device(struct pnp_dev *dev);
int pnp_add_card(struct pnp_card *card);
void pnp_remove_card(struct pnp_card *card);
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c
index a411582..7d65da8 100644
--- a/drivers/pnp/core.c
+++ b/drivers/pnp/core.c
@@ -159,21 +159,13 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol
*protocol, int id, char *pnpid
int __pnp_add_device(struct pnp_dev *dev)
{
- int ret;
-
pnp_fixup_device(dev);
dev->status = PNP_READY;
spin_lock(&pnp_lock);
list_add_tail(&dev->global_list, &pnp_global);
list_add_tail(&dev->protocol_list, &dev->protocol->devices);
spin_unlock(&pnp_lock);
-
- ret = device_register(&dev->dev);
- if (ret)
- return ret;
-
- pnp_interface_attach_device(dev);
- return 0;
+ return device_register(&dev->dev);
}
/*
diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c
index d3f869e..e3f7e89 100644
--- a/drivers/pnp/driver.c
+++ b/drivers/pnp/driver.c
@@ -206,6 +206,7 @@ struct bus_type pnp_bus_type = {
.remove = pnp_device_remove,
.suspend = pnp_bus_suspend,
.resume = pnp_bus_resume,
+ .dev_attrs = pnp_interface_attrs,
};
int pnp_register_driver(struct pnp_driver *drv)
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c
index a876ecf..478a4a7 100644
--- a/drivers/pnp/interface.c
+++ b/drivers/pnp/interface.c
@@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,
return ret;
}
-static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL);
-
static ssize_t pnp_show_current_resources(struct device *dmdev,
struct device_attribute *attr,
char *buf)
@@ -420,9 +418,6 @@ done:
return count;
}
-static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR,
- pnp_show_current_resources, pnp_set_current_resources);
-
static ssize_t pnp_show_current_ids(struct device *dmdev,
struct device_attribute *attr, char *buf)
{
@@ -437,27 +432,11 @@ static ssize_t pnp_show_current_ids(struct device
*dmdev,
return (str - buf);
}
-static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL);
-
-int pnp_interface_attach_device(struct pnp_dev *dev)
-{
- int rc = device_create_file(&dev->dev, &dev_attr_options);
-
- if (rc)
- goto err;
- rc = device_create_file(&dev->dev, &dev_attr_resources);
- if (rc)
- goto err_opt;
- rc = device_create_file(&dev->dev, &dev_attr_id);
- if (rc)
- goto err_res;
-
- return 0;
-
-err_res:
- device_remove_file(&dev->dev, &dev_attr_resources);
-err_opt:
- device_remove_file(&dev->dev, &dev_attr_options);
-err:
- return rc;
-}
+struct device_attribute pnp_interface_attrs[] = {
+ __ATTR(resources, S_IRUGO | S_IWUSR,
+ pnp_show_current_resources,
+ pnp_set_current_resources),
+ __ATTR(options, S_IRUGO, pnp_show_options, NULL),
+ __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
+ __ATTR_NULL,
+};
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] Create PNP device attributes via dev_attrs field of struct device
2008-09-25 16:42 ` Drew Moseley
@ 2008-09-27 23:31 ` Kay Sievers
0 siblings, 0 replies; 8+ messages in thread
From: Kay Sievers @ 2008-09-27 23:31 UTC (permalink / raw)
To: Drew Moseley; +Cc: ambx1, linux-kernel, Greg KH
On Thu, 2008-09-25 at 09:42 -0700, Drew Moseley wrote:
> Kay Sievers wrote:
> > This seems not to apply. Oh, you are patching a 1.5 years old kernel?
> > :) Care to redo this for a recent one?
>
> Ack. Sorry about that. Wrong tree. Here's the right one. ;-)
Looks good to me, and seems to work fine here. Thanks for the patch.
Greg, can you pick up the patch below?
Thanks,
Kay
From: Drew Moseley <dmoseley@mvista.com>
Subject: PNP: create device attributes via default device attributes
This creates the attributes before the uevent is sent.
Signed-off-by: Drew Moseley <dmoseley@mvista.com>
Acked-by: Kay Sievers <kay.sievers@vrfy.org>
---
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
index 9fd7bb9..3532984 100644
--- a/drivers/pnp/base.h
+++ b/drivers/pnp/base.h
@@ -4,6 +4,7 @@
*/
extern spinlock_t pnp_lock;
+extern struct device_attribute pnp_interface_attrs[];
void *pnp_alloc(long size);
int pnp_register_protocol(struct pnp_protocol *protocol);
@@ -16,7 +17,6 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);
int pnp_add_device(struct pnp_dev *dev);
struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id);
-int pnp_interface_attach_device(struct pnp_dev *dev);
int pnp_add_card(struct pnp_card *card);
void pnp_remove_card(struct pnp_card *card);
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c
index a411582..7d65da8 100644
--- a/drivers/pnp/core.c
+++ b/drivers/pnp/core.c
@@ -159,21 +159,13 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid
int __pnp_add_device(struct pnp_dev *dev)
{
- int ret;
-
pnp_fixup_device(dev);
dev->status = PNP_READY;
spin_lock(&pnp_lock);
list_add_tail(&dev->global_list, &pnp_global);
list_add_tail(&dev->protocol_list, &dev->protocol->devices);
spin_unlock(&pnp_lock);
-
- ret = device_register(&dev->dev);
- if (ret)
- return ret;
-
- pnp_interface_attach_device(dev);
- return 0;
+ return device_register(&dev->dev);
}
/*
diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c
index d3f869e..e3f7e89 100644
--- a/drivers/pnp/driver.c
+++ b/drivers/pnp/driver.c
@@ -206,6 +206,7 @@ struct bus_type pnp_bus_type = {
.remove = pnp_device_remove,
.suspend = pnp_bus_suspend,
.resume = pnp_bus_resume,
+ .dev_attrs = pnp_interface_attrs,
};
int pnp_register_driver(struct pnp_driver *drv)
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c
index a876ecf..478a4a7 100644
--- a/drivers/pnp/interface.c
+++ b/drivers/pnp/interface.c
@@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,
return ret;
}
-static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL);
-
static ssize_t pnp_show_current_resources(struct device *dmdev,
struct device_attribute *attr,
char *buf)
@@ -420,9 +418,6 @@ done:
return count;
}
-static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR,
- pnp_show_current_resources, pnp_set_current_resources);
-
static ssize_t pnp_show_current_ids(struct device *dmdev,
struct device_attribute *attr, char *buf)
{
@@ -437,27 +432,11 @@ static ssize_t pnp_show_current_ids(struct device *dmdev,
return (str - buf);
}
-static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL);
-
-int pnp_interface_attach_device(struct pnp_dev *dev)
-{
- int rc = device_create_file(&dev->dev, &dev_attr_options);
-
- if (rc)
- goto err;
- rc = device_create_file(&dev->dev, &dev_attr_resources);
- if (rc)
- goto err_opt;
- rc = device_create_file(&dev->dev, &dev_attr_id);
- if (rc)
- goto err_res;
-
- return 0;
-
-err_res:
- device_remove_file(&dev->dev, &dev_attr_resources);
-err_opt:
- device_remove_file(&dev->dev, &dev_attr_options);
-err:
- return rc;
-}
+struct device_attribute pnp_interface_attrs[] = {
+ __ATTR(resources, S_IRUGO | S_IWUSR,
+ pnp_show_current_resources,
+ pnp_set_current_resources),
+ __ATTR(options, S_IRUGO, pnp_show_options, NULL),
+ __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
+ __ATTR_NULL,
+};
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-09-27 23:32 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-23 21:24 [PATCH] Create PNP device attributes via dev_attrs field of struct device Drew Moseley
2008-09-24 4:59 ` Kay Sievers
2008-09-24 17:22 ` Drew Moseley
2008-09-24 19:03 ` Kay Sievers
2008-09-24 19:37 ` Drew Moseley
2008-09-25 10:13 ` Kay Sievers
2008-09-25 16:42 ` Drew Moseley
2008-09-27 23:31 ` Kay Sievers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox