From 624e11908da4c775717011a31bad086d2c268d2d Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Tue, 13 Jul 2010 16:28:37 +0000 Subject: Create /sys/devices/astribanks: * Astribank devices now reside under their own top-level device. * The USB device is still used as the 'transport'. * This means the astribanks parents are NOT the USB devices. * As a result, even after a USB disconnect, we have valid sysfs representation. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8904 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/xpp/xbus-sysfs.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c index 0a15a1d..e1278df 100644 --- a/drivers/dahdi/xpp/xbus-sysfs.c +++ b/drivers/dahdi/xpp/xbus-sysfs.c @@ -441,6 +441,16 @@ static void astribank_release(struct device *dev) xbus_free(xbus); } +static void toplevel_release(struct device *dev) +{ + NOTICE("%s\n", __func__); +} + +static struct device toplevel_device = { + .release = toplevel_release, + /* No Parent */ +}; + static struct bus_type toplevel_bus_type = { .name = "astribanks", .match = astribank_match, @@ -815,12 +825,19 @@ void xbus_sysfs_transport_remove(xbus_t *xbus) int xbus_sysfs_transport_create(xbus_t *xbus) { struct device *astribank; + struct device *transport_device; int ret = 0; BUG_ON(!xbus); XBUS_DBG(DEVICES, xbus, "\n"); astribank = &xbus->astribank; - ret = sysfs_create_link(&astribank->kobj, &astribank->parent->kobj, + BUG_ON(!astribank); + transport_device = xbus->transport.transport_device; + if (!transport_device) { + XBUS_ERR(xbus, "%s: Missing transport_device\n", __func__); + return -ENODEV; + } + ret = sysfs_create_link(&astribank->kobj, &transport_device->kobj, "transport"); if (ret < 0) { XBUS_ERR(xbus, "%s: sysfs_create_link failed: %d\n", @@ -853,7 +870,7 @@ int xbus_sysfs_create(xbus_t *xbus) astribank = &xbus->astribank; XBUS_DBG(DEVICES, xbus, "\n"); astribank->bus = &toplevel_bus_type; - astribank->parent = xbus->transport.transport_device; + astribank->parent = &toplevel_device; dev_set_name(astribank, "xbus-%02d", xbus->num); dev_set_drvdata(astribank, xbus); astribank->release = astribank_release; @@ -870,6 +887,12 @@ int __init xpp_driver_init(void) int ret; DBG(DEVICES, "SYSFS\n"); + dev_set_name(&toplevel_device, "astribanks"); + ret = device_register(&toplevel_device); + if (ret) { + ERR("%s: toplevel device_register failed: %d\n", __func__, ret); + goto failed_toplevel; + } if((ret = bus_register(&toplevel_bus_type)) < 0) { ERR("%s: bus_register(%s) failed. Error number %d", __FUNCTION__, toplevel_bus_type.name, ret); @@ -891,6 +914,8 @@ failed_xpd_bus: failed_xpp_driver: bus_unregister(&toplevel_bus_type); failed_bus: + device_unregister(&toplevel_device); +failed_toplevel: return ret; } @@ -900,6 +925,7 @@ void xpp_driver_exit(void) bus_unregister(&xpd_type); driver_unregister(&xpp_driver); bus_unregister(&toplevel_bus_type); + device_unregister(&toplevel_device); } EXPORT_SYMBOL(xpd_driver_register); -- cgit v1.2.3