aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/switch/switch_class.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/switch/switch_class.c')
-rw-r--r--drivers/switch/switch_class.c23
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);