summaryrefslogtreecommitdiff
path: root/drivers/base/bus.c
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2014-04-07 23:49:35 (GMT)
committerScott Wood <scottwood@freescale.com>2014-04-07 23:49:35 (GMT)
commit62b8c978ee6b8d135d9e7953221de58000dba986 (patch)
tree683b04b2e627f6710c22c151b23c8cc9a165315e /drivers/base/bus.c
parent78fd82238d0e5716578c326404184a27ba67fd6e (diff)
downloadlinux-fsl-qoriq-62b8c978ee6b8d135d9e7953221de58000dba986.tar.xz
Rewind v3.13-rc3+ (78fd82238d0e5716) to v3.12
Diffstat (limited to 'drivers/base/bus.c')
-rw-r--r--drivers/base/bus.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 73f6c29..4c289ab 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -591,6 +591,37 @@ void bus_remove_device(struct device *dev)
bus_put(dev->bus);
}
+static int driver_add_attrs(struct bus_type *bus, struct device_driver *drv)
+{
+ int error = 0;
+ int i;
+
+ if (bus->drv_attrs) {
+ for (i = 0; bus->drv_attrs[i].attr.name; i++) {
+ error = driver_create_file(drv, &bus->drv_attrs[i]);
+ if (error)
+ goto err;
+ }
+ }
+done:
+ return error;
+err:
+ while (--i >= 0)
+ driver_remove_file(drv, &bus->drv_attrs[i]);
+ goto done;
+}
+
+static void driver_remove_attrs(struct bus_type *bus,
+ struct device_driver *drv)
+{
+ int i;
+
+ if (bus->drv_attrs) {
+ for (i = 0; bus->drv_attrs[i].attr.name; i++)
+ driver_remove_file(drv, &bus->drv_attrs[i]);
+ }
+}
+
static int __must_check add_bind_files(struct device_driver *drv)
{
int ret;
@@ -689,12 +720,16 @@ int bus_add_driver(struct device_driver *drv)
printk(KERN_ERR "%s: uevent attr (%s) failed\n",
__func__, drv->name);
}
- error = driver_add_groups(drv, bus->drv_groups);
+ error = driver_add_attrs(bus, drv);
if (error) {
/* How the hell do we get out of this pickle? Give up */
- printk(KERN_ERR "%s: driver_create_groups(%s) failed\n",
+ printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",
__func__, drv->name);
}
+ error = driver_add_groups(drv, bus->drv_groups);
+ if (error)
+ printk(KERN_ERR "%s: driver_create_groups(%s) failed\n",
+ __func__, drv->name);
if (!drv->suppress_bind_attrs) {
error = add_bind_files(drv);
@@ -731,6 +766,7 @@ void bus_remove_driver(struct device_driver *drv)
if (!drv->suppress_bind_attrs)
remove_bind_files(drv);
+ driver_remove_attrs(drv->bus, drv);
driver_remove_groups(drv, drv->bus->drv_groups);
driver_remove_file(drv, &driver_attr_uevent);
klist_remove(&drv->p->knode_bus);
@@ -810,6 +846,42 @@ struct bus_type *find_bus(char *name)
}
#endif /* 0 */
+
+/**
+ * bus_add_attrs - Add default attributes for this bus.
+ * @bus: Bus that has just been registered.
+ */
+
+static int bus_add_attrs(struct bus_type *bus)
+{
+ int error = 0;
+ int i;
+
+ if (bus->bus_attrs) {
+ for (i = 0; bus->bus_attrs[i].attr.name; i++) {
+ error = bus_create_file(bus, &bus->bus_attrs[i]);
+ if (error)
+ goto err;
+ }
+ }
+done:
+ return error;
+err:
+ while (--i >= 0)
+ bus_remove_file(bus, &bus->bus_attrs[i]);
+ goto done;
+}
+
+static void bus_remove_attrs(struct bus_type *bus)
+{
+ int i;
+
+ if (bus->bus_attrs) {
+ for (i = 0; bus->bus_attrs[i].attr.name; i++)
+ bus_remove_file(bus, &bus->bus_attrs[i]);
+ }
+}
+
static int bus_add_groups(struct bus_type *bus,
const struct attribute_group **groups)
{
@@ -911,6 +983,9 @@ int bus_register(struct bus_type *bus)
if (retval)
goto bus_probe_files_fail;
+ retval = bus_add_attrs(bus);
+ if (retval)
+ goto bus_attrs_fail;
retval = bus_add_groups(bus, bus->bus_groups);
if (retval)
goto bus_groups_fail;
@@ -919,6 +994,8 @@ int bus_register(struct bus_type *bus)
return 0;
bus_groups_fail:
+ bus_remove_attrs(bus);
+bus_attrs_fail:
remove_probe_files(bus);
bus_probe_files_fail:
kset_unregister(bus->p->drivers_kset);
@@ -947,6 +1024,7 @@ void bus_unregister(struct bus_type *bus)
pr_debug("bus: '%s': unregistering\n", bus->name);
if (bus->dev_root)
device_unregister(bus->dev_root);
+ bus_remove_attrs(bus);
bus_remove_groups(bus, bus->bus_groups);
remove_probe_files(bus);
kset_unregister(bus->p->drivers_kset);