staging: unisys: visorbus: remove unused sysfs attribute devmajorminor/*
The sysfs attribute directory at: /sys/bus/visorbus/devices/vbus<x>:dev<y>/devmajorminor/* or /sys/devices/visorbus<x>/vbus<x>:dev<y>/devmajorminor/* previously provided a location where a visorbus function driver could publish information (for usermode use) about possibly-multiple major and minor device numbers for character devices created for a each visorbus device, using visorbus_registerdevnode(). This functionality is not currently used, so it has been removed by this cset. Signed-off-by: Tim Sell <Timothy.Sell@unisys.com> Signed-off-by: David Kershner <david.kershner@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
4000622ec2
commit
b750b05939
|
@ -137,12 +137,6 @@ called automatically by the visorbus driver at appropriate times:
|
||||||
|
|
||||||
* The resume() function is the "book-end" to pause(), and is described above.
|
* The resume() function is the "book-end" to pause(), and is described above.
|
||||||
|
|
||||||
If/when a function driver creates a Linux device (that needs to be accessed
|
|
||||||
from usermode), it calls visorbus_registerdevnode(), passing the major and
|
|
||||||
minor number of the device. (Of course not all function drivers will need
|
|
||||||
to do this.) This simply creates the appropriate "devmajorminor" sysfs entry
|
|
||||||
described below, so that a hotplug script can use it to create a device node.
|
|
||||||
|
|
||||||
2.1.3. sysfs Advertised Information
|
2.1.3. sysfs Advertised Information
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|
@ -197,19 +191,6 @@ The following files exist under /sys/devices/visorbus<x>/vbus<x>:dev<y>:
|
||||||
if the appropriate function driver has not
|
if the appropriate function driver has not
|
||||||
been loaded yet.
|
been loaded yet.
|
||||||
|
|
||||||
devmajorminor
|
|
||||||
|
|
||||||
<devname> if applicable, each file here identifies (via
|
|
||||||
... its file contents) the
|
|
||||||
"<major>:<minor>" needed for a device node to
|
|
||||||
enable access from usermode. There is exactly
|
|
||||||
one file here for each different device node
|
|
||||||
that can be accessed (from usermode). Note
|
|
||||||
that this info is provided by a particular
|
|
||||||
function driver, so these will not exist
|
|
||||||
until AFTER the appropriate function driver
|
|
||||||
controlling this device class is loaded.
|
|
||||||
|
|
||||||
channel properties of the device channel (all in
|
channel properties of the device channel (all in
|
||||||
ascii text format)
|
ascii text format)
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,6 @@ struct visor_device {
|
||||||
struct periodic_work *periodic_work;
|
struct periodic_work *periodic_work;
|
||||||
bool being_removed;
|
bool being_removed;
|
||||||
bool responded_to_device_create;
|
bool responded_to_device_create;
|
||||||
struct kobject kobjdevmajorminor; /* visorbus<x>/dev<y>/devmajorminor/*/
|
|
||||||
struct {
|
struct {
|
||||||
int major, minor;
|
int major, minor;
|
||||||
void *attr; /* private use by devmajorminor_attr.c you can
|
void *attr; /* private use by devmajorminor_attr.c you can
|
||||||
|
@ -174,8 +173,6 @@ int visorbus_write_channel(struct visor_device *dev,
|
||||||
unsigned long nbytes);
|
unsigned long nbytes);
|
||||||
int visorbus_clear_channel(struct visor_device *dev,
|
int visorbus_clear_channel(struct visor_device *dev,
|
||||||
unsigned long offset, u8 ch, unsigned long nbytes);
|
unsigned long offset, u8 ch, unsigned long nbytes);
|
||||||
int visorbus_registerdevnode(struct visor_device *dev,
|
|
||||||
const char *name, int major, int minor);
|
|
||||||
void visorbus_enable_channel_interrupts(struct visor_device *dev);
|
void visorbus_enable_channel_interrupts(struct visor_device *dev);
|
||||||
void visorbus_disable_channel_interrupts(struct visor_device *dev);
|
void visorbus_disable_channel_interrupts(struct visor_device *dev);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -243,180 +243,6 @@ visorbus_release_device(struct device *xdev)
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implement publishing of device node attributes under:
|
|
||||||
*
|
|
||||||
* /sys/bus/visorbus<x>/dev<y>/devmajorminor
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define to_devmajorminor_attr(_attr) \
|
|
||||||
container_of(_attr, struct devmajorminor_attribute, attr)
|
|
||||||
#define to_visor_device_from_kobjdevmajorminor(obj) \
|
|
||||||
container_of(obj, struct visor_device, kobjdevmajorminor)
|
|
||||||
|
|
||||||
struct devmajorminor_attribute {
|
|
||||||
struct attribute attr;
|
|
||||||
int slot;
|
|
||||||
ssize_t (*show)(struct visor_device *, int slot, char *buf);
|
|
||||||
ssize_t (*store)(struct visor_device *, int slot, const char *buf,
|
|
||||||
size_t count);
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t DEVMAJORMINOR_ATTR(struct visor_device *dev, int slot, char *buf)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
|
|
||||||
if (slot < 0 || slot >= maxdevnodes)
|
|
||||||
return 0;
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%d:%d\n",
|
|
||||||
dev->devnodes[slot].major, dev->devnodes[slot].minor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
devmajorminor_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct devmajorminor_attribute *devmajorminor_attr =
|
|
||||||
to_devmajorminor_attr(attr);
|
|
||||||
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
|
||||||
ssize_t ret = 0;
|
|
||||||
|
|
||||||
if (devmajorminor_attr->show)
|
|
||||||
ret = devmajorminor_attr->show(dev,
|
|
||||||
devmajorminor_attr->slot, buf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
devmajorminor_attr_store(struct kobject *kobj,
|
|
||||||
struct attribute *attr, const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct devmajorminor_attribute *devmajorminor_attr =
|
|
||||||
to_devmajorminor_attr(attr);
|
|
||||||
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
|
||||||
ssize_t ret = 0;
|
|
||||||
|
|
||||||
if (devmajorminor_attr->store)
|
|
||||||
ret = devmajorminor_attr->store(dev,
|
|
||||||
devmajorminor_attr->slot,
|
|
||||||
buf, count);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int register_devmajorminor_attributes(struct visor_device *dev);
|
|
||||||
|
|
||||||
static int
|
|
||||||
devmajorminor_create_file(struct visor_device *dev, const char *name,
|
|
||||||
int major, int minor)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
struct devmajorminor_attribute *myattr = NULL;
|
|
||||||
int x = -1, rc = 0, slot = -1;
|
|
||||||
|
|
||||||
register_devmajorminor_attributes(dev);
|
|
||||||
for (slot = 0; slot < maxdevnodes; slot++)
|
|
||||||
if (!dev->devnodes[slot].attr)
|
|
||||||
break;
|
|
||||||
if (slot == maxdevnodes) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
myattr = kzalloc(sizeof(*myattr), GFP_KERNEL);
|
|
||||||
if (!myattr) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
myattr->show = DEVMAJORMINOR_ATTR;
|
|
||||||
myattr->store = NULL;
|
|
||||||
myattr->slot = slot;
|
|
||||||
myattr->attr.name = name;
|
|
||||||
myattr->attr.mode = S_IRUGO;
|
|
||||||
dev->devnodes[slot].attr = myattr;
|
|
||||||
dev->devnodes[slot].major = major;
|
|
||||||
dev->devnodes[slot].minor = minor;
|
|
||||||
x = sysfs_create_file(&dev->kobjdevmajorminor, &myattr->attr);
|
|
||||||
if (x < 0) {
|
|
||||||
rc = x;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
kobject_uevent(&dev->device.kobj, KOBJ_ONLINE);
|
|
||||||
away:
|
|
||||||
if (rc < 0) {
|
|
||||||
kfree(myattr);
|
|
||||||
myattr = NULL;
|
|
||||||
dev->devnodes[slot].attr = NULL;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
devmajorminor_remove_file(struct visor_device *dev, int slot)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
struct devmajorminor_attribute *myattr = NULL;
|
|
||||||
|
|
||||||
if (slot < 0 || slot >= maxdevnodes)
|
|
||||||
return;
|
|
||||||
myattr = (struct devmajorminor_attribute *)(dev->devnodes[slot].attr);
|
|
||||||
if (!myattr)
|
|
||||||
return;
|
|
||||||
sysfs_remove_file(&dev->kobjdevmajorminor, &myattr->attr);
|
|
||||||
kobject_uevent(&dev->device.kobj, KOBJ_OFFLINE);
|
|
||||||
dev->devnodes[slot].attr = NULL;
|
|
||||||
kfree(myattr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
devmajorminor_remove_all_files(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
|
|
||||||
for (i = 0; i < maxdevnodes; i++)
|
|
||||||
devmajorminor_remove_file(dev, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct sysfs_ops devmajorminor_sysfs_ops = {
|
|
||||||
.show = devmajorminor_attr_show,
|
|
||||||
.store = devmajorminor_attr_store,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct kobj_type devmajorminor_kobj_type = {
|
|
||||||
.sysfs_ops = &devmajorminor_sysfs_ops
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
register_devmajorminor_attributes(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
int rc = 0, x = 0;
|
|
||||||
|
|
||||||
if (dev->kobjdevmajorminor.parent)
|
|
||||||
goto away; /* already registered */
|
|
||||||
x = kobject_init_and_add(&dev->kobjdevmajorminor,
|
|
||||||
&devmajorminor_kobj_type, &dev->device.kobj,
|
|
||||||
"devmajorminor");
|
|
||||||
if (x < 0) {
|
|
||||||
rc = x;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
|
|
||||||
kobject_uevent(&dev->kobjdevmajorminor, KOBJ_ADD);
|
|
||||||
|
|
||||||
away:
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
unregister_devmajorminor_attributes(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
if (!dev->kobjdevmajorminor.parent)
|
|
||||||
return; /* already unregistered */
|
|
||||||
devmajorminor_remove_all_files(dev);
|
|
||||||
|
|
||||||
kobject_del(&dev->kobjdevmajorminor);
|
|
||||||
kobject_put(&dev->kobjdevmajorminor);
|
|
||||||
dev->kobjdevmajorminor.parent = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* begin implementation of specific channel attributes to appear under
|
/* begin implementation of specific channel attributes to appear under
|
||||||
* /sys/bus/visorbus<x>/dev<y>/channel
|
* /sys/bus/visorbus<x>/dev<y>/channel
|
||||||
*/
|
*/
|
||||||
|
@ -801,7 +627,6 @@ visordriver_remove_device(struct device *xdev)
|
||||||
}
|
}
|
||||||
up(&dev->visordriver_callback_lock);
|
up(&dev->visordriver_callback_lock);
|
||||||
dev_stop_periodic_work(dev);
|
dev_stop_periodic_work(dev);
|
||||||
devmajorminor_remove_all_files(dev);
|
|
||||||
|
|
||||||
put_device(&dev->device);
|
put_device(&dev->device);
|
||||||
|
|
||||||
|
@ -920,14 +745,6 @@ visorbus_clear_channel(struct visor_device *dev, unsigned long offset, u8 ch,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(visorbus_clear_channel);
|
EXPORT_SYMBOL_GPL(visorbus_clear_channel);
|
||||||
|
|
||||||
int
|
|
||||||
visorbus_registerdevnode(struct visor_device *dev,
|
|
||||||
const char *name, int major, int minor)
|
|
||||||
{
|
|
||||||
return devmajorminor_create_file(dev, name, major, minor);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(visorbus_registerdevnode);
|
|
||||||
|
|
||||||
/** We don't really have a real interrupt, so for now we just call the
|
/** We don't really have a real interrupt, so for now we just call the
|
||||||
* interrupt function periodically...
|
* interrupt function periodically...
|
||||||
*/
|
*/
|
||||||
|
@ -1018,19 +835,9 @@ create_visor_device(struct visor_device *dev)
|
||||||
goto away;
|
goto away;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = register_devmajorminor_attributes(dev);
|
|
||||||
if (rc < 0) {
|
|
||||||
POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
|
|
||||||
DIAG_SEVERITY_ERR);
|
|
||||||
goto away_unregister;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_add_tail(&dev->list_all, &list_all_device_instances);
|
list_add_tail(&dev->list_all, &list_all_device_instances);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
away_unregister:
|
|
||||||
device_unregister(&dev->device);
|
|
||||||
|
|
||||||
away:
|
away:
|
||||||
put_device(&dev->device);
|
put_device(&dev->device);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -1040,7 +847,6 @@ static void
|
||||||
remove_visor_device(struct visor_device *dev)
|
remove_visor_device(struct visor_device *dev)
|
||||||
{
|
{
|
||||||
list_del(&dev->list_all);
|
list_del(&dev->list_all);
|
||||||
unregister_devmajorminor_attributes(dev);
|
|
||||||
put_device(&dev->device);
|
put_device(&dev->device);
|
||||||
device_unregister(&dev->device);
|
device_unregister(&dev->device);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue