From d863af110f26502f378d1bf053c28104f743ddd0 Mon Sep 17 00:00:00 2001 From: Oron Peled Date: Sun, 14 Oct 2012 16:20:49 +0200 Subject: [PATCH] dahdi: sysfs: add channel attributes Signed-off-by: Oron Peled --- drivers/dahdi/dahdi-base.c | 4 +- drivers/dahdi/dahdi-sysfs-chan.c | 63 ++++++++++++++++++++++++++++++-- include/dahdi/kernel.h | 6 +++ 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index d518710..f4ce805 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -811,7 +811,7 @@ ssize_t lineconfig_str(int lineconfig, char buf[], size_t size) EXPORT_SYMBOL(lineconfig_str); #ifdef CONFIG_PROC_FS -static const char *sigstr(int sig) +const char *sigstr(int sig) { switch (sig) { case DAHDI_SIG_FXSLS: @@ -858,7 +858,7 @@ static const char *sigstr(int sig) } } -static int fill_alarm_string(char *buf, int count, int alarms) +int fill_alarm_string(char *buf, int count, int alarms) { int len; diff --git a/drivers/dahdi/dahdi-sysfs-chan.c b/drivers/dahdi/dahdi-sysfs-chan.c index 2f9ea9a..a609f78 100644 --- a/drivers/dahdi/dahdi-sysfs-chan.c +++ b/drivers/dahdi/dahdi-sysfs-chan.c @@ -51,8 +51,65 @@ static struct { int cdev:1; } should_cleanup; +#define chan_attr(field, format_string) \ +static BUS_ATTR_READER(field##_show, dev, buf) \ +{ \ + struct dahdi_chan *chan; \ + \ + chan = dev_to_chan(dev); \ + return sprintf(buf, format_string, chan->field); \ +} + +chan_attr(name, "%s\n"); +chan_attr(channo, "%d\n"); +chan_attr(chanpos, "%d\n"); +chan_attr(sigcap, "0x%x\n"); +chan_attr(blocksize, "%d\n"); +#ifdef OPTIMIZE_CHANMUTE +chan_attr(chanmute, "%d\n"); +#endif + +static BUS_ATTR_READER(sig_show, dev, buf) +{ + struct dahdi_chan *chan; + + chan = dev_to_chan(dev); + return sprintf(buf, "%s\n", sigstr(chan->sig)); +} + +static BUS_ATTR_READER(in_use_show, dev, buf) +{ + struct dahdi_chan *chan; + + chan = dev_to_chan(dev); + return sprintf(buf, "%d\n", test_bit(DAHDI_FLAGBIT_OPEN, &chan->flags)); +} + +static BUS_ATTR_READER(alarms_show, dev, buf) +{ + struct dahdi_chan *chan; + int len; + + chan = dev_to_chan(dev); + len = fill_alarm_string(buf, PAGE_SIZE, chan->chan_alarms); + buf[len++] = '\n'; + return len; +} + + static struct device_attribute chan_dev_attrs[] = { - __ATTR_NULL, + __ATTR_RO(name), + __ATTR_RO(channo), + __ATTR_RO(chanpos), + __ATTR_RO(sig), + __ATTR_RO(sigcap), + __ATTR_RO(alarms), + __ATTR_RO(blocksize), +#ifdef OPTIMIZE_CHANMUTE + __ATTR_RO(chanmute), +#endif + __ATTR_RO(in_use), + __ATTR_NULL, }; static void chan_release(struct device *dev) @@ -143,7 +200,7 @@ int chan_sysfs_create(struct dahdi_chan *chan) void chan_sysfs_remove(struct dahdi_chan *chan) { - struct device *dev = &chan->chan_device; + struct device *dev = &chan->chan_device; chan_dbg(DEVICES, chan, "Destroying channel %d\n", chan->channo); if (!dev_get_drvdata(dev)) @@ -168,7 +225,7 @@ int dahdi_register_chardev(struct dahdi_chardev *dev) char *udevname; udevname = kzalloc(strlen(dev->name) + sizeof(DAHDI_STRING) + 1, - GFP_KERNEL); + GFP_KERNEL); if (!udevname) return -ENOMEM; diff --git a/include/dahdi/kernel.h b/include/dahdi/kernel.h index 0643add..06f9e4a 100644 --- a/include/dahdi/kernel.h +++ b/include/dahdi/kernel.h @@ -1230,6 +1230,12 @@ void dahdi_init_tone_state(struct dahdi_tone_state *ts, struct dahdi_tone *zt); /*! \brief Get a given MF tone struct, suitable for dahdi_tone_nextsample. */ struct dahdi_tone *dahdi_mf_tone(const struct dahdi_chan *chan, char digit, int digitmode); +/*! \brief Convert signalling bits to human readable string */ +const char *sigstr(int sig); + +/*! \brief Convert alarm bits to human readable string */ +int fill_alarm_string(char *buf, int count, int alarms); + /* Echo cancel a receive and transmit chunk for a given channel. This should be called by the low-level driver as close to the interface as possible. ECHO CANCELLATION IS NO LONGER AUTOMATICALLY DONE