Skip to content

Commit

Permalink
pcmcia: remove pccard_sysfs_interface warnings
Browse files Browse the repository at this point in the history
Make the PCMCIA core stop using class_interface to hide socket attribute
registration.  This removes the associated section mismatch warnings, and
helps get to the point where that mechanism can finally be removed.

Simplify that attribute registration by using an attribute_group.
This is a net shrink in object size.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
David Brownell authored and Greg Kroah-Hartman committed Apr 30, 2008
1 parent 4f452e8 commit 4356d73
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 40 deletions.
13 changes: 5 additions & 8 deletions drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,9 @@ static int pccardd(void *__skt)
complete(&skt->thread_done);
return 0;
}
ret = pccard_sysfs_add_socket(&skt->dev);
if (ret)
dev_warn(&skt->dev, "err %d adding socket attributes\n", ret);

add_wait_queue(&skt->thread_wait, &wait);
complete(&skt->thread_done);
Expand Down Expand Up @@ -694,6 +697,7 @@ static int pccardd(void *__skt)
remove_wait_queue(&skt->thread_wait, &wait);

/* remove from the device core */
pccard_sysfs_remove_socket(&skt->dev);
device_unregister(&skt->dev);

return 0;
Expand Down Expand Up @@ -940,20 +944,13 @@ EXPORT_SYMBOL(pcmcia_socket_class);

static int __init init_pcmcia_cs(void)
{
int ret;

init_completion(&pcmcia_unload);
ret = class_register(&pcmcia_socket_class);
if (ret)
return (ret);
return class_interface_register(&pccard_sysfs_interface);
return class_register(&pcmcia_socket_class);
}

static void __exit exit_pcmcia_cs(void)
{
class_interface_unregister(&pccard_sysfs_interface);
class_unregister(&pcmcia_socket_class);

wait_for_completion(&pcmcia_unload);
}

Expand Down
3 changes: 2 additions & 1 deletion drivers/pcmcia/cs_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align,
void release_resource_db(struct pcmcia_socket *s);

/* In socket_sysfs.c */
extern struct class_interface pccard_sysfs_interface;
extern int pccard_sysfs_add_socket(struct device *dev);
extern void pccard_sysfs_remove_socket(struct device *dev);

/* In cs.c */
extern struct rw_semaphore pcmcia_socket_list_rwsem;
Expand Down
52 changes: 21 additions & 31 deletions drivers/pcmcia/socket_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,55 +356,45 @@ static ssize_t pccard_store_cis(struct kobject *kobj,
}


static struct device_attribute *pccard_socket_attributes[] = {
&dev_attr_card_type,
&dev_attr_card_voltage,
&dev_attr_card_vpp,
&dev_attr_card_vcc,
&dev_attr_card_insert,
&dev_attr_card_pm_state,
&dev_attr_card_eject,
&dev_attr_card_irq_mask,
&dev_attr_available_resources_setup_done,
static struct attribute *pccard_socket_attributes[] = {
&dev_attr_card_type.attr,
&dev_attr_card_voltage.attr,
&dev_attr_card_vpp.attr,
&dev_attr_card_vcc.attr,
&dev_attr_card_insert.attr,
&dev_attr_card_pm_state.attr,
&dev_attr_card_eject.attr,
&dev_attr_card_irq_mask.attr,
&dev_attr_available_resources_setup_done.attr,
NULL,
};

static const struct attribute_group socket_attrs = {
.attrs = pccard_socket_attributes,
};

static struct bin_attribute pccard_cis_attr = {
.attr = { .name = "cis", .mode = S_IRUGO | S_IWUSR },
.size = 0x200,
.read = pccard_show_cis,
.write = pccard_store_cis,
};

static int __devinit pccard_sysfs_add_socket(struct device *dev,
struct class_interface *class_intf)
int pccard_sysfs_add_socket(struct device *dev)
{
struct device_attribute **attr;
int ret = 0;

for (attr = pccard_socket_attributes; *attr; attr++) {
ret = device_create_file(dev, *attr);
ret = sysfs_create_group(&dev->kobj, &socket_attrs);
if (!ret) {
ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr);
if (ret)
break;
sysfs_remove_group(&dev->kobj, &socket_attrs);
}
if (!ret)
ret = sysfs_create_bin_file(&dev->kobj, &pccard_cis_attr);

return ret;
}

static void __devexit pccard_sysfs_remove_socket(struct device *dev,
struct class_interface *class_intf)
void pccard_sysfs_remove_socket(struct device *dev)
{
struct device_attribute **attr;

sysfs_remove_bin_file(&dev->kobj, &pccard_cis_attr);
for (attr = pccard_socket_attributes; *attr; attr++)
device_remove_file(dev, *attr);
sysfs_remove_group(&dev->kobj, &socket_attrs);
}

struct class_interface pccard_sysfs_interface = {
.class = &pcmcia_socket_class,
.add_dev = &pccard_sysfs_add_socket,
.remove_dev = __devexit_p(&pccard_sysfs_remove_socket),
};

0 comments on commit 4356d73

Please sign in to comment.