summaryrefslogtreecommitdiff
path: root/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.c
blob: 3b26ca97284f5822b0870d7992b8254673b9a297 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
 * @file inv_counters.c
 * @brief Exports i2c read write counts through sysfs
 *
 * @version 0.1
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
#include <linux/err.h>
#include <linux/sysfs.h>
#include <linux/kdev_t.h>
#include <linux/string.h>
#include <linux/jiffies.h>
#include <linux/spinlock.h>
#include <linux/kernel_stat.h>

#include "inv_counters.h"

static int mpu_irq;
static int accel_irq;
static int compass_irq;

struct inv_counters {
	uint32_t i2c_tempreads;
	uint32_t i2c_mpureads;
	uint32_t i2c_mpuwrites;
	uint32_t i2c_accelreads;
	uint32_t i2c_accelwrites;
	uint32_t i2c_compassreads;
	uint32_t i2c_compasswrites;
	uint32_t i2c_compassirq;
	uint32_t i2c_accelirq;
};

static struct inv_counters Counters;

static ssize_t i2c_counters_show(struct class *cls,
			struct class_attribute *attr, char *buf)
{
	return scnprintf(buf, PAGE_SIZE,
		"%ld.%03ld %u %u %u %u %u %u %u %u %u %u\n",
		jiffies / HZ, ((jiffies % HZ) * (1024 / HZ)),
		mpu_irq ? kstat_irqs(mpu_irq) : 0,
		Counters.i2c_tempreads,
		Counters.i2c_mpureads, Counters.i2c_mpuwrites,
		accel_irq ? kstat_irqs(accel_irq) : Counters.i2c_accelirq,
		Counters.i2c_accelreads, Counters.i2c_accelwrites,
		compass_irq ? kstat_irqs(compass_irq) : Counters.i2c_compassirq,
		Counters.i2c_compassreads, Counters.i2c_compasswrites);
}

void inv_iio_counters_set_i2cirq(enum irqtype type, int irq)
{
	switch (type) {
	case IRQ_MPU:
		mpu_irq = irq;
		break;
	case IRQ_ACCEL:
		accel_irq = irq;
		break;
	case IRQ_COMPASS:
		compass_irq = irq;
		break;
	}
}
EXPORT_SYMBOL_GPL(inv_iio_counters_set_i2cirq);

void inv_iio_counters_tempread(int count)
{
	Counters.i2c_tempreads += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_tempread);

void inv_iio_counters_mpuread(int count)
{
	Counters.i2c_mpureads += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_mpuread);

void inv_iio_counters_mpuwrite(int count)
{
	Counters.i2c_mpuwrites += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_mpuwrite);

void inv_iio_counters_accelread(int count)
{
	Counters.i2c_accelreads += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_accelread);

void inv_iio_counters_accelwrite(int count)
{
	Counters.i2c_accelwrites += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_accelwrite);

void inv_iio_counters_compassread(int count)
{
	Counters.i2c_compassreads += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_compassread);

void inv_iio_counters_compasswrite(int count)
{
	Counters.i2c_compasswrites += count;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_compasswrite);

void inv_iio_counters_compassirq(void)
{
	Counters.i2c_compassirq++;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_compassirq);

void inv_iio_counters_accelirq(void)
{
	Counters.i2c_accelirq++;
}
EXPORT_SYMBOL_GPL(inv_iio_counters_accelirq);

static struct class_attribute inv_class_attr[] = {
	__ATTR(i2c_counter, S_IRUGO, i2c_counters_show, NULL),
	__ATTR_NULL
};

static struct class inv_counters_class = {
	.name = "inv_counters",
	.owner = THIS_MODULE,
	.class_attrs = (struct class_attribute *) &inv_class_attr
};

static int __init inv_counters_init(void)
{
	memset(&Counters, 0, sizeof(Counters));

	return class_register(&inv_counters_class);
}

static void __exit inv_counters_exit(void)
{
	class_unregister(&inv_counters_class);
}

module_init(inv_counters_init);
module_exit(inv_counters_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("GESL");
MODULE_DESCRIPTION("inv_counters debug support");