diff options
Diffstat (limited to 'drivers/switch/switch_class.c')
-rw-r--r-- | drivers/switch/switch_class.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/switch/switch_class.c b/drivers/switch/switch_class.c index 1c2ca29..d5e18e6 100644 --- a/drivers/switch/switch_class.c +++ b/drivers/switch/switch_class.c @@ -22,6 +22,7 @@ #include <linux/fs.h> #include <linux/err.h> #include <linux/switch.h> +#include <linux/hrtimer.h> struct class *switch_class; static atomic_t device_count; @@ -32,7 +33,13 @@ static ssize_t state_show(struct device *dev, struct device_attribute *attr, struct switch_dev *sdev = (struct switch_dev *) dev_get_drvdata(dev); - if (sdev && sdev->print_state) { + if (!sdev) { + printk(KERN_ERR "switch device is NULL\n"); + BUG(); + return 0; /* meaningless */ + } + + if (sdev->print_state) { int ret = sdev->print_state(sdev, buf); if (ret >= 0) return ret; @@ -46,7 +53,13 @@ static ssize_t name_show(struct device *dev, struct device_attribute *attr, struct switch_dev *sdev = (struct switch_dev *) dev_get_drvdata(dev); - if (sdev && sdev->print_name) { + if (!sdev) { + printk(KERN_ERR "switch device is NULL\n"); + BUG(); + return 0; /* meaningless */ + } + + if (sdev->print_name) { int ret = sdev->print_name(sdev, buf); if (ret >= 0) return ret; @@ -61,8 +74,9 @@ void switch_set_state(struct switch_dev *sdev, int state) { char name_buf[120]; char state_buf[120]; + char timestamp_buf[120]; char *prop_buf; - char *envp[3]; + char *envp[4]; int env_offset = 0; int length; @@ -87,6 +101,9 @@ void switch_set_state(struct switch_dev *sdev, int state) "SWITCH_STATE=%s", prop_buf); envp[env_offset++] = state_buf; } + snprintf(timestamp_buf, sizeof(timestamp_buf), + "SWITCH_TIME=%llu", ktime_to_ns(ktime_get())); + envp[env_offset++] = timestamp_buf; envp[env_offset] = NULL; kobject_uevent_env(&sdev->dev->kobj, KOBJ_CHANGE, envp); free_page((unsigned long)prop_buf); |