#include "unipi_platform.h"
#include "unipi_spi.h"
#include "unipi_common.h"
+#include "unipi_sysfs.h"
/***************************
* Static Data Definitions *
s32 neuronspi_regmap_invalidate(void *data)
{
int i;
+ u32 reading_freq;
int freq_cnt = 0;
while (!kthread_should_stop()) {
- usleep_range(15000,25000);
+ if (unipi_use_custom_speed) {
+ mutex_lock(&unipi_inv_speed_mutex);
+ reading_freq = unipi_custom_speed_value;
+ mutex_unlock(&unipi_inv_speed_mutex);
+ // TODO: This could be moved to sysfs.c so it does not have to be evaluated so often
+ usleep_range((1000000 / (reading_freq * 4)) * 3, (1000000 / (reading_freq * 4)) * 5);
+ } else {
+ usleep_range(15000,25000);
+ }
if (freq_cnt == 450001) freq_cnt = 0;
for (i = 0; i < NEURONSPI_MAX_DEVS; i++) {
if (neuronspi_s_dev[i] != NULL) {
};
struct mutex neuronspi_master_mutex;
+struct mutex unipi_inv_speed_mutex;
struct spinlock* neuronspi_ldisc_spinlock;
struct spinlock* neuronspi_spi_w_spinlock;
u8 neuronspi_spi_w_flag = 1;
neuronspi_spi_w_spinlock = kzalloc(sizeof(struct spinlock), GFP_KERNEL);
spin_lock_init(neuronspi_spi_w_spinlock);
mutex_init(&neuronspi_master_mutex);
+ mutex_init(&unipi_inv_speed_mutex);
memset(&neuronspi_s_dev, 0, sizeof(neuronspi_s_dev));
ret = spi_register_driver(&neuronspi_spi_driver);
if (ret < 0) {
************/
#include "unipi_sysfs.h"
+#include "unipi_spi.h"
+
+/*********************
+ * Data Declarations *
+ *********************/
+
+int unipi_use_custom_speed = 0;
+u32 unipi_custom_speed_value = NEURONSPI_DEFAULT_SYSFS_SPEED;
/************************
* Static Functions *
return ret;
}
+static ssize_t neuronspi_show_sysfs_speed(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ ssize_t ret = 0;
+ mutex_lock(&unipi_inv_speed_mutex);
+ ret = scnprintf(buf, 255, "%d Hz\n", unipi_custom_speed_value);
+ mutex_unlock(&unipi_inv_speed_mutex);
+ return ret;
+}
+
+static ssize_t neuronspi_store_sysfs_speed(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ ssize_t err = 0;
+ unsigned int val = 0;
+ err = kstrtouint(buf, 0, &val);
+ if (err < 0) goto err_end;
+ if (val == NEURONSPI_DEFAULT_SYSFS_SPEED) {
+ unipi_use_custom_speed = 0;
+ mutex_lock(&unipi_inv_speed_mutex);
+ unipi_custom_speed_value = 50;
+ mutex_unlock(&unipi_inv_speed_mutex);
+ } else if (val > 0) {
+ unipi_use_custom_speed = 1;
+ mutex_lock(&unipi_inv_speed_mutex);
+ unipi_custom_speed_value = val > 1000 ? 1000 : val;
+ mutex_unlock(&unipi_inv_speed_mutex);
+ }
+err_end:
+ return count;
+}
+
static ssize_t neuronspi_show_driver_version(struct device *dev, struct device_attribute *attr, char *buf)
{
ssize_t ret = 0;
n_di = platform_get_drvdata(plat);
n_spi = spi_get_drvdata(n_di->spi);
if (n_spi->features && n_spi->features->di_count > 0 && n_spi->di_driver) {
+ spin_lock(&n_spi->sysfs_regmap_lock);
ret = scnprintf(buf, 255, "%d\n", n_spi->di_driver[n_di->di_index]->gpio_c.ngpio);
+ spin_unlock(&n_spi->sysfs_regmap_lock);
}
return ret;
}
**********************************/
static DEVICE_ATTR(model_name, 0440, neuronspi_show_model, NULL);
+static DEVICE_ATTR(sys_reading_freq, 0660, neuronspi_show_sysfs_speed, neuronspi_store_sysfs_speed);
static DEVICE_ATTR(sys_eeprom_name, 0440, neuronspi_show_eeprom, NULL);
static DEVICE_ATTR(driver_version, 0440, neuronspi_show_driver_version, NULL);
static DEVICE_ATTR(register_read, 0660, neuronspi_show_regmap, neuronspi_store_regmap);
static struct attribute *neuron_plc_attrs[] = {
&dev_attr_model_name.attr,
+ &dev_attr_sysfs_reading_freq.attr,
&dev_attr_sys_eeprom_name.attr,
&dev_attr_driver_version.attr,
NULL,