diff options
Diffstat (limited to 'drivers/iio/imu-aosp/inv_mpu6515/inv_test')
4 files changed, 245 insertions, 0 deletions
diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Kconfig b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Kconfig new file mode 100755 index 00000000000..86c30bd8a63 --- /dev/null +++ b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Kconfig @@ -0,0 +1,13 @@ +# +# Kconfig for Invensense IIO testing hooks +# + +config INV_TESTING +    boolean "Invensense IIO testing hooks" +    depends on INV_MPU_IIO || INV_AMI306_IIO || INV_YAS530 || INV_HUB_IIO +    default n +    help +      This flag enables display of additional testing information from the +      Invensense IIO drivers. +      It also enables the I2C counters facility to perform IO profiling. +      Some additional sysfs entries will appear when this flag is enabled. diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Makefile b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Makefile new file mode 100755 index 00000000000..4f0edd3de90 --- /dev/null +++ b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for Invensense IIO testing hooks. +# + +obj-$(CONFIG_INV_TESTING) += inv_counters.o + diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.c b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.c new file mode 100755 index 00000000000..3b26ca97284 --- /dev/null +++ b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.c @@ -0,0 +1,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"); + diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.h b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.h new file mode 100755 index 00000000000..d60dac9d97b --- /dev/null +++ b/drivers/iio/imu-aosp/inv_mpu6515/inv_test/inv_counters.h @@ -0,0 +1,72 @@ +/* + * @file  inv_counters.h + * @brief Debug file to keep track of various counters for the InvenSense + *        sensor drivers. + * + * @version 0.1 + */ + +#ifndef _INV_COUNTERS_H_ +#define _INV_COUNTERS_H_ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/err.h> +#include <linux/sysfs.h> +#include <linux/string.h> +#include <linux/jiffies.h> +#include <linux/spinlock.h> + +#ifdef CONFIG_INV_TESTING + +enum irqtype { +	IRQ_MPU, +	IRQ_ACCEL, +	IRQ_COMPASS +}; + +#define INV_I2C_INC_MPUREAD(x)		inv_iio_counters_mpuread(x) +#define INV_I2C_INC_MPUWRITE(x)		inv_iio_counters_mpuwrite(x) +#define INV_I2C_INC_ACCELREAD(x)	inv_iio_counters_accelread(x) +#define INV_I2C_INC_ACCELWRITE(x)	inv_iio_counters_accelwrite(x) +#define INV_I2C_INC_COMPASSREAD(x)	inv_iio_counters_compassread(x) +#define INV_I2C_INC_COMPASSWRITE(x)	inv_iio_counters_compasswrite(x) + +#define INV_I2C_INC_TEMPREAD(x)		inv_iio_counters_tempread(x) + +#define INV_I2C_SETIRQ(type, irq)	inv_iio_counters_set_i2cirq(type, irq) +#define INV_I2C_INC_COMPASSIRQ()	inv_iio_counters_compassirq() +#define INV_I2C_INC_ACCELIRQ()		inv_iio_counters_accelirq() + +void inv_iio_counters_mpuread(int count); +void inv_iio_counters_mpuwrite(int count); +void inv_iio_counters_accelread(int count); +void inv_iio_counters_accelwrite(int count); +void inv_iio_counters_compassread(int count); +void inv_iio_counters_compasswrite(int count); + +void inv_iio_counters_tempread(int count); + +void inv_iio_counters_set_i2cirq(enum irqtype type, int irq); +void inv_iio_counters_compassirq(void); +void inv_iio_counters_accelirq(void); + +#else + +#define INV_I2C_INC_MPUREAD(x) +#define INV_I2C_INC_MPUWRITE(x) +#define INV_I2C_INC_ACCELREAD(x) +#define INV_I2C_INC_ACCELWRITE(x) +#define INV_I2C_INC_COMPASSREAD(x) +#define INV_I2C_INC_COMPASSWRITE(x) + +#define INV_I2C_INC_TEMPREAD(x) + +#define INV_I2C_SETIRQ(type, irq) +#define INV_I2C_INC_COMPASSIRQ() +#define INV_I2C_INC_ACCELIRQ() + +#endif /* CONFIG_INV_TESTING */ + +#endif /* _INV_COUNTERS_H_ */ +  |