3 * @brief Exports i2c read write counts through sysfs
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/device.h>
11 #include <linux/miscdevice.h>
12 #include <linux/err.h>
13 #include <linux/sysfs.h>
14 #include <linux/kdev_t.h>
15 #include <linux/string.h>
16 #include <linux/jiffies.h>
17 #include <linux/spinlock.h>
18 #include <linux/kernel_stat.h>
20 #include "inv_counters.h"
24 static int compass_irq;
27 uint32_t i2c_tempreads;
28 uint32_t i2c_mpureads;
29 uint32_t i2c_mpuwrites;
30 uint32_t i2c_accelreads;
31 uint32_t i2c_accelwrites;
32 uint32_t i2c_compassreads;
33 uint32_t i2c_compasswrites;
34 uint32_t i2c_compassirq;
35 uint32_t i2c_accelirq;
38 static struct inv_counters Counters;
40 static ssize_t i2c_counters_show(struct class *cls,
41 struct class_attribute *attr, char *buf)
43 return scnprintf(buf, PAGE_SIZE,
44 "%ld.%03ld %u %u %u %u %u %u %u %u %u %u\n",
45 jiffies / HZ, ((jiffies % HZ) * (1024 / HZ)),
46 mpu_irq ? kstat_irqs(mpu_irq) : 0,
47 Counters.i2c_tempreads,
48 Counters.i2c_mpureads, Counters.i2c_mpuwrites,
49 accel_irq ? kstat_irqs(accel_irq) : Counters.i2c_accelirq,
50 Counters.i2c_accelreads, Counters.i2c_accelwrites,
51 compass_irq ? kstat_irqs(compass_irq) : Counters.i2c_compassirq,
52 Counters.i2c_compassreads, Counters.i2c_compasswrites);
55 void inv_iio_counters_set_i2cirq(enum irqtype type, int irq)
69 EXPORT_SYMBOL_GPL(inv_iio_counters_set_i2cirq);
71 void inv_iio_counters_tempread(int count)
73 Counters.i2c_tempreads += count;
75 EXPORT_SYMBOL_GPL(inv_iio_counters_tempread);
77 void inv_iio_counters_mpuread(int count)
79 Counters.i2c_mpureads += count;
81 EXPORT_SYMBOL_GPL(inv_iio_counters_mpuread);
83 void inv_iio_counters_mpuwrite(int count)
85 Counters.i2c_mpuwrites += count;
87 EXPORT_SYMBOL_GPL(inv_iio_counters_mpuwrite);
89 void inv_iio_counters_accelread(int count)
91 Counters.i2c_accelreads += count;
93 EXPORT_SYMBOL_GPL(inv_iio_counters_accelread);
95 void inv_iio_counters_accelwrite(int count)
97 Counters.i2c_accelwrites += count;
99 EXPORT_SYMBOL_GPL(inv_iio_counters_accelwrite);
101 void inv_iio_counters_compassread(int count)
103 Counters.i2c_compassreads += count;
105 EXPORT_SYMBOL_GPL(inv_iio_counters_compassread);
107 void inv_iio_counters_compasswrite(int count)
109 Counters.i2c_compasswrites += count;
111 EXPORT_SYMBOL_GPL(inv_iio_counters_compasswrite);
113 void inv_iio_counters_compassirq(void)
115 Counters.i2c_compassirq++;
117 EXPORT_SYMBOL_GPL(inv_iio_counters_compassirq);
119 void inv_iio_counters_accelirq(void)
121 Counters.i2c_accelirq++;
123 EXPORT_SYMBOL_GPL(inv_iio_counters_accelirq);
125 static struct class_attribute inv_class_attr[] = {
126 __ATTR(i2c_counter, S_IRUGO, i2c_counters_show, NULL),
130 static struct class inv_counters_class = {
131 .name = "inv_counters",
132 .owner = THIS_MODULE,
133 .class_attrs = (struct class_attribute *) &inv_class_attr
136 static int __init inv_counters_init(void)
138 memset(&Counters, 0, sizeof(Counters));
140 return class_register(&inv_counters_class);
143 static void __exit inv_counters_exit(void)
145 class_unregister(&inv_counters_class);
148 module_init(inv_counters_init);
149 module_exit(inv_counters_exit);
151 MODULE_LICENSE("GPL");
152 MODULE_AUTHOR("GESL");
153 MODULE_DESCRIPTION("inv_counters debug support");