dahdi: sysfs: a channel bus (not usefull yet)
* Added minimal infrastructure: - A 'chan_device' member to struct dahdi_chan - An empty 'device_attribute' array - A 'bus_type' with its methods - A 'device_driver' with its methods - Initialization/Cleanup code Signed-off-by: Oron Peled <oron.peled@xorcom.com>
This commit is contained in:
parent
5f7ebe98da
commit
53219879c8
@ -38,6 +38,72 @@
|
|||||||
|
|
||||||
static struct class *dahdi_class;
|
static struct class *dahdi_class;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags to remember what initializations already
|
||||||
|
* succeeded.
|
||||||
|
*/
|
||||||
|
static struct {
|
||||||
|
int channel_driver:1;
|
||||||
|
int channels_bus:1;
|
||||||
|
} should_cleanup;
|
||||||
|
|
||||||
|
static struct device_attribute chan_dev_attrs[] = {
|
||||||
|
__ATTR_NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void chan_release(struct device *dev)
|
||||||
|
{
|
||||||
|
struct dahdi_chan *chan;
|
||||||
|
|
||||||
|
BUG_ON(!dev);
|
||||||
|
chan = dev_to_chan(dev);
|
||||||
|
chan_dbg(DEVICES, chan, "SYSFS\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int chan_match(struct device *dev, struct device_driver *driver)
|
||||||
|
{
|
||||||
|
struct dahdi_chan *chan;
|
||||||
|
|
||||||
|
chan = dev_to_chan(dev);
|
||||||
|
chan_dbg(DEVICES, chan, "SYSFS\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct bus_type chan_bus_type = {
|
||||||
|
.name = "dahdi_channels",
|
||||||
|
.match = chan_match,
|
||||||
|
.dev_attrs = chan_dev_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int chan_probe(struct device *dev)
|
||||||
|
{
|
||||||
|
struct dahdi_chan *chan;
|
||||||
|
|
||||||
|
chan = dev_to_chan(dev);
|
||||||
|
chan_dbg(DEVICES, chan, "SYSFS\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int chan_remove(struct device *dev)
|
||||||
|
{
|
||||||
|
struct dahdi_chan *chan;
|
||||||
|
|
||||||
|
chan = dev_to_chan(dev);
|
||||||
|
chan_dbg(DEVICES, chan, "SYSFS\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct device_driver chan_driver = {
|
||||||
|
.name = "dahdi",
|
||||||
|
.bus = &chan_bus_type,
|
||||||
|
#ifndef OLD_HOTPLUG_SUPPORT
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
#endif
|
||||||
|
.probe = chan_probe,
|
||||||
|
.remove = chan_remove
|
||||||
|
};
|
||||||
|
|
||||||
int chan_sysfs_create(struct dahdi_chan *chan)
|
int chan_sysfs_create(struct dahdi_chan *chan)
|
||||||
{
|
{
|
||||||
char chan_name[32];
|
char chan_name[32];
|
||||||
@ -187,17 +253,45 @@ static void sysfs_channels_cleanup(void)
|
|||||||
class_destroy(dahdi_class);
|
class_destroy(dahdi_class);
|
||||||
dahdi_class = NULL;
|
dahdi_class = NULL;
|
||||||
}
|
}
|
||||||
|
if (should_cleanup.channel_driver) {
|
||||||
|
dahdi_dbg(DEVICES, "Removing channel driver\n");
|
||||||
|
driver_unregister(&chan_driver);
|
||||||
|
should_cleanup.channel_driver = 0;
|
||||||
|
}
|
||||||
|
if (should_cleanup.channels_bus) {
|
||||||
|
dahdi_dbg(DEVICES, "Removing channels bus\n");
|
||||||
|
bus_unregister(&chan_bus_type);
|
||||||
|
should_cleanup.channels_bus = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init dahdi_sysfs_chan_init(const struct file_operations *fops)
|
int __init dahdi_sysfs_chan_init(const struct file_operations *fops)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
|
dahdi_dbg(DEVICES, "Registering channels bus\n");
|
||||||
|
res = bus_register(&chan_bus_type);
|
||||||
|
if (res) {
|
||||||
|
dahdi_err("%s: bus_register(%s) failed. Error number %d\n",
|
||||||
|
__func__, chan_bus_type.name, res);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
should_cleanup.channels_bus = 1;
|
||||||
|
|
||||||
|
dahdi_dbg(DEVICES, "Registering channel driver\n");
|
||||||
|
res = driver_register(&chan_driver);
|
||||||
|
if (res) {
|
||||||
|
dahdi_err("%s: driver_register(%s) failed. Error number %d",
|
||||||
|
__func__, chan_driver.name, res);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
should_cleanup.channel_driver = 1;
|
||||||
|
|
||||||
dahdi_class = class_create(THIS_MODULE, "dahdi");
|
dahdi_class = class_create(THIS_MODULE, "dahdi");
|
||||||
if (IS_ERR(dahdi_class)) {
|
if (IS_ERR(dahdi_class)) {
|
||||||
res = PTR_ERR(dahdi_class);
|
res = PTR_ERR(dahdi_class);
|
||||||
dahdi_err("%s: class_create(dahi_chan) failed. Error: %d\n",
|
dahdi_err("%s: class_create(dahi_chan) failed. Error: %d\n",
|
||||||
__func__, res);
|
__func__, res);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
res = fixed_devfiles_create();
|
res = fixed_devfiles_create();
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/cdev.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
|
|
||||||
@ -605,6 +606,8 @@ struct dahdi_chan {
|
|||||||
#else
|
#else
|
||||||
unsigned char *lin2x;
|
unsigned char *lin2x;
|
||||||
#endif
|
#endif
|
||||||
|
struct device chan_device; /*!< Kernel object for this chan */
|
||||||
|
#define dev_to_chan(dev) container_of(dev, struct dahdi_chan, chan_device)
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_DAHDI_NET
|
#ifdef CONFIG_DAHDI_NET
|
||||||
|
Loading…
Reference in New Issue
Block a user