- Cleaned up one static declaration and removed a few superfluous data structures
authorTom Knot <tomasknot@gmail.com>
Tue, 26 Jun 2018 12:14:55 +0000 (14:14 +0200)
committerTom Knot <tomasknot@gmail.com>
Tue, 26 Jun 2018 12:14:55 +0000 (14:14 +0200)
- Reduced TX work limit to 4

modules/unipi/src/unipi_common.h
modules/unipi/src/unipi_iio.c
modules/unipi/src/unipi_spi.c
modules/unipi/src/unipi_sysfs.c
modules/unipi/src/unipi_tty.c
modules/unipi/src/unipi_uart.c
modules/unipi/src/unipi_uart.h
version.txt

index 2ee40c7b7a30cb771272f11631eede2503d49ca8..1b2137c3f8fab66f04dc208d27af6b7d712b6096 100644 (file)
@@ -120,7 +120,8 @@ struct neuronspi_port
        struct kthread_work                     tx_work;
        struct kthread_work                     rx_work;
        struct kthread_work                     irq_work;
-       struct spinlock                         tx_lock;
+       struct spinlock                         tx_counter_lock;
+       struct mutex                            tx_lock;
        u8                                                      tx_work_count;
        u32                                                     flags;
        u8                                                      ier_clear;
@@ -237,33 +238,13 @@ struct neuronspi_sec_ao_driver
        u16 dev_count;
 };
 
-struct neuronspi_stm_ai_data
+struct neuronspi_analog_data
 {
        u32 index;
        u32 mode;
        struct spi_device *parent;
 };
 
-struct neuronspi_stm_ao_data
-{
-       u32 index;
-       u32 mode;
-       struct spi_device *parent;
-};
-
-struct neuronspi_sec_ai_data
-{
-       u32 index;
-       u32 mode;
-       struct spi_device *parent;
-};
-
-struct neuronspi_sec_ao_data
-{
-       u32 index;
-       u32 mode;
-       struct spi_device *parent;
-};
 
 // Instantiated once per LED
 struct neuronspi_led_driver
index ab7a31ca80ce62e1273bcc813c3f3dafe309b9f7..d82a72926b3be7dccca21d838389685ad7b88ed8 100644 (file)
  ************************/
 
 int neuronspi_iio_stm_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) {
-       struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
-       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg, &ai_data->mode);
+       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg + ai_data->index, &ai_data->mode);
        switch(ai_data->mode) {
        case 0: {
                if (ch->type == IIO_VOLTAGE) {
@@ -56,10 +56,10 @@ int neuronspi_iio_stm_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spe
 
 int neuronspi_iio_stm_ao_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
-       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg, &ao_data->mode);
+       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &ao_data->mode);
        switch(ao_data->mode) {
        case 3: {
                if (ch->type == IIO_RESISTANCE) {
@@ -79,10 +79,10 @@ int neuronspi_iio_stm_ao_read_raw(struct iio_dev *indio_dev, struct iio_chan_spe
 
 int neuronspi_iio_stm_ao_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int val, int val2, long mask)
 {
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
-       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg, &ao_data->mode);
+       regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &ao_data->mode);
        switch(ao_data->mode) {
        case 0: {
                if (ch->type == IIO_VOLTAGE) {
@@ -111,7 +111,7 @@ int neuronspi_iio_stm_ao_write_raw(struct iio_dev *indio_dev, struct iio_chan_sp
 
 int neuronspi_iio_sec_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ai_mode_reg + ai_data->index, &ai_data->mode);
index 00ac1490f463cc2a70c24d80ca41a1757533ed0b..8812f3a5c3f1ccb1a7cc46b2a6c3629f248885d2 100644 (file)
@@ -71,6 +71,8 @@ spinlock_t neuronspi_probe_spinlock;
 struct spi_device* neuronspi_s_dev[NEURONSPI_MAX_DEVS];
 struct task_struct *neuronspi_invalidate_thread;
 
+struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
+
 /************************
  * Non-static Functions *
  ************************/
@@ -448,7 +450,7 @@ u8 neuronspi_spi_uart_get_ldisc(struct spi_device* spi_dev, u8 port)
  */
 void neuronspi_spi_iio_sec_ai_read_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 sec_ai_val_l = 0;
@@ -472,7 +474,7 @@ void neuronspi_spi_iio_sec_ai_read_voltage(struct iio_dev *indio_dev, struct iio
 
 void neuronspi_spi_iio_sec_ai_read_current(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 sec_ai_val_l = 0;
@@ -495,7 +497,7 @@ void neuronspi_spi_iio_sec_ai_read_current(struct iio_dev *indio_dev, struct iio
 
 void neuronspi_spi_iio_sec_ai_read_resistance(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 sec_ai_val_l = 0;
@@ -517,7 +519,7 @@ void neuronspi_spi_iio_sec_ai_read_resistance(struct iio_dev *indio_dev, struct
 
 void neuronspi_spi_iio_sec_ao_set_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
 {
-       struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 sec_true_val = (val * 2) / 5;
@@ -531,7 +533,7 @@ void neuronspi_spi_iio_sec_ao_set_voltage(struct iio_dev *indio_dev, struct iio_
  */
 void neuronspi_spi_iio_stm_ai_read_voltage(struct iio_dev *iio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_stm_ai_data *ai_data = iio_priv(iio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(iio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 stm_ai_val = 0;
@@ -559,7 +561,7 @@ void neuronspi_spi_iio_stm_ai_read_voltage(struct iio_dev *iio_dev, struct iio_c
 
 void neuronspi_spi_iio_stm_ai_read_current(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 stm_ai_val = 0;
@@ -587,7 +589,7 @@ void neuronspi_spi_iio_stm_ai_read_current(struct iio_dev *indio_dev, struct iio
 
 void neuronspi_spi_iio_stm_ao_read_resistance(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask)
 {
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 stm_aio_val = 0;
@@ -598,7 +600,7 @@ void neuronspi_spi_iio_stm_ao_read_resistance(struct iio_dev *indio_dev, struct
 
 void neuronspi_spi_iio_stm_ao_set_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
 {
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 stm_v_int_ref = 0;
@@ -624,7 +626,7 @@ void neuronspi_spi_iio_stm_ao_set_voltage(struct iio_dev *indio_dev, struct iio_
 
 void neuronspi_spi_iio_stm_ao_set_current(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
 {
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        u32 stm_v_int_ref = 0;
@@ -648,27 +650,6 @@ void neuronspi_spi_iio_stm_ao_set_current(struct iio_dev *indio_dev, struct iio_
        regmap_write(n_spi->reg_map, n_spi->regstart_table->stm_ao_val_reg, (unsigned int)stm_true_val);
 }
 
-/*
-static s32 neuronspi_spi_watchdog(void *data)
-{
-       s32 *cycle = (s32 *) data;
-       while (!kthread_should_stop()) {
-               msleep(*cycle);
-               spin_lock(neuronspi_spi_w_spinlock);
-               if (neuronspi_spi_w_flag == 0) {
-                       panic_timeout = -1;
-                       panic("SPI Watchdog Failure\n");
-               } else {
-                       neuronspi_spi_w_flag = 0;
-               }
-               spin_unlock(neuronspi_spi_w_spinlock);
-       }
-       return 0;
-}
-*/
-
-
-
 int neuronspi_spi_send_message(struct spi_device* spi_dev, u8 *send_buf, u8 *recv_buf, s32 len, s32 freq, s32 delay, s32 send_header, u8 lock_val)
 {
        s32 i = 0;
@@ -917,7 +898,6 @@ int neuronspi_spi_gpio_ro_set(struct spi_device* spi_dev, u32 id, int value)
 s32 neuronspi_spi_probe(struct spi_device *spi)
 {
        const struct neuronspi_devtype *devtype;
-       struct sched_param sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
        struct neuronspi_driver_data *n_spi;
        s32 ret, i, no_irq = 0;
        u8 uart_count = 0;
@@ -979,7 +959,7 @@ s32 neuronspi_spi_probe(struct spi_device *spi)
                ret = PTR_ERR(n_spi->primary_worker_task);
                return ret;
        }
-       sched_setscheduler(n_spi->primary_worker_task, SCHED_FIFO, &sched_param);
+       sched_setscheduler(n_spi->primary_worker_task, SCHED_FIFO, &neuronspi_sched_param);
 
 
        // We perform an initial probe of registers 1000-1004 to identify the device, using a premade message
@@ -1267,9 +1247,9 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n",
                }
 #endif
                if (n_spi->features->stm_ai_count) {
-                       n_spi->stm_ai_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_stm_ai_data));
-                       ((struct neuronspi_stm_ai_data*)iio_priv(n_spi->stm_ai_driver))->parent = spi;
-                       ((struct neuronspi_stm_ai_data*)iio_priv(n_spi->stm_ai_driver))->index = i;
+                       n_spi->stm_ai_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data));
+                       ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ai_driver))->parent = spi;
+                       ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ai_driver))->index = i;
                        n_spi->stm_ai_driver->modes = INDIO_DIRECT_MODE;
                        n_spi->stm_ai_driver->currentmode = INDIO_DIRECT_MODE;
                        n_spi->stm_ai_driver->name = "ai_type_a";
@@ -1281,9 +1261,9 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n",
                        iio_device_register(n_spi->stm_ai_driver);
                }
                if (n_spi->features->stm_ao_count) {
-                       n_spi->stm_ao_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_stm_ai_data));
-                       ((struct neuronspi_stm_ao_data*)iio_priv(n_spi->stm_ao_driver))->parent = spi;
-                       ((struct neuronspi_stm_ao_data*)iio_priv(n_spi->stm_ao_driver))->index = i;
+                       n_spi->stm_ao_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data));
+                       ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ao_driver))->parent = spi;
+                       ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ao_driver))->index = i;
                        n_spi->stm_ao_driver->modes = INDIO_DIRECT_MODE;
                        n_spi->stm_ao_driver->currentmode = INDIO_DIRECT_MODE;
                        n_spi->stm_ao_driver->name = "ao_type_a";
@@ -1295,11 +1275,11 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n",
                        iio_device_register(n_spi->stm_ao_driver);
                }
                if (n_spi->features->sec_ai_count) {
-                       n_spi->sec_ai_driver = kzalloc(sizeof(struct neuronspi_sec_ai_data*) * n_spi->features->sec_ai_count, GFP_ATOMIC);
+                       n_spi->sec_ai_driver = kzalloc(sizeof(struct neuronspi_analog_data*) * n_spi->features->sec_ai_count, GFP_ATOMIC);
                        for (i = 0; i < n_spi->features->sec_ai_count; i++) {
-                               n_spi->sec_ai_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_sec_ai_data));
-                               ((struct neuronspi_sec_ai_data*)iio_priv(n_spi->sec_ai_driver[i]))->parent = spi;
-                               ((struct neuronspi_sec_ai_data*)iio_priv(n_spi->sec_ai_driver[i]))->index = i;
+                               n_spi->sec_ai_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data));
+                               ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ai_driver[i]))->parent = spi;
+                               ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ai_driver[i]))->index = i;
                                n_spi->sec_ai_driver[i]->modes = INDIO_DIRECT_MODE;
                                n_spi->sec_ai_driver[i]->currentmode = INDIO_DIRECT_MODE;
                                n_spi->sec_ai_driver[i]->name = "ai_type_b";
@@ -1312,11 +1292,11 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n",
                        }
                }
                if (n_spi->features->sec_ao_count) {
-                       n_spi->sec_ao_driver = kzalloc(sizeof(struct neuronspi_sec_ao_data*) * n_spi->features->sec_ao_count, GFP_ATOMIC);
+                       n_spi->sec_ao_driver = kzalloc(sizeof(struct neuronspi_analog_data*) * n_spi->features->sec_ao_count, GFP_ATOMIC);
                        for (i = 0; i < n_spi->features->sec_ao_count; i++) {
-                               n_spi->sec_ao_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_sec_ao_data));
-                               ((struct neuronspi_sec_ao_data*)iio_priv(n_spi->sec_ao_driver[i]))->parent = spi;
-                               ((struct neuronspi_sec_ao_data*)iio_priv(n_spi->sec_ao_driver[i]))->index = i;
+                               n_spi->sec_ao_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data));
+                               ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ao_driver[i]))->parent = spi;
+                               ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ao_driver[i]))->index = i;
                                n_spi->sec_ao_driver[i]->modes = INDIO_DIRECT_MODE;
                                n_spi->sec_ao_driver[i]->currentmode = INDIO_DIRECT_MODE;
                                n_spi->sec_ao_driver[i]->name = "ao_type_b";
index e94e5c2f4621eddd807b749f2893a96c6a5f8f99..fe2fcb914d1972ab6c3d6d06d374e4fb3896edfb 100644 (file)
@@ -996,7 +996,7 @@ static ssize_t neuronspi_iio_show_primary_ai_mode(struct device *dev, struct dev
        int ret = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg + ai_data->index, &val);
@@ -1009,7 +1009,7 @@ static ssize_t neuronspi_iio_store_primary_ai_mode(struct device *dev, struct de
        ssize_t err = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        err = kstrtouint(buf, 0, &val);
@@ -1026,7 +1026,7 @@ static ssize_t neuronspi_iio_show_primary_ao_mode(struct device *dev, struct dev
        int ret = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &val);
@@ -1039,7 +1039,7 @@ static ssize_t neuronspi_iio_store_primary_ao_mode(struct device *dev, struct de
        ssize_t err = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        err = kstrtouint(buf, 0, &val);
@@ -1056,7 +1056,7 @@ static ssize_t neuronspi_iio_show_secondary_ai_mode(struct device *dev, struct d
        int ret = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ai_mode_reg + ai_data->index, &val);
@@ -1068,7 +1068,7 @@ static ssize_t neuronspi_iio_store_secondary_ai_mode(struct device *dev, struct
        ssize_t err = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ai_data = iio_priv(indio_dev);
        struct spi_device *spi = ai_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        err = kstrtouint(buf, 0, &val);
@@ -1084,7 +1084,7 @@ static ssize_t neuronspi_iio_show_secondary_ao_mode(struct device *dev, struct d
        int ret = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ao_mode_reg + ao_data->index, &val);
@@ -1096,7 +1096,7 @@ static ssize_t neuronspi_iio_store_secondary_ao_mode(struct device *dev, struct
        ssize_t err = 0;
        unsigned int val = 0;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev);
+       struct neuronspi_analog_data *ao_data = iio_priv(indio_dev);
        struct spi_device *spi = ao_data->parent;
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        err = kstrtouint(buf, 0, &val);
index 222ae776ac84bf2d605c82b89b865090bc30d1f6..6b238263002cdea36bc66ab373400fa082902204 100644 (file)
 #include <linux/mm.h>
 #include <linux/string.h>
 
+static struct tty_ldisc_ops neuronspi_tty_ldisc;
 
 int neuronspi_tty_init()
 {
        int err;
-       static struct tty_ldisc_ops neuronspi_tty_ldisc;
        printk(KERN_INFO "NEURONSPI TTYInit\n");
        memset(&neuronspi_tty_ldisc, 0, sizeof(neuronspi_tty_ldisc));
        n_tty_inherit_ops(&neuronspi_tty_ldisc);
index 287a6597476a5d7c3b39508c2451e99c833ef358..a316a2ee49f0362d7dec2306459751787d1162a4 100644 (file)
@@ -27,6 +27,8 @@ struct neuronspi_uart_data* neuronspi_uart_glob_data;
 unsigned long neuronspi_lines;
 struct uart_driver* neuronspi_uart;
 
+struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
+
 /************************
  * Non-static Functions *
  ************************/
@@ -77,7 +79,6 @@ void neuronspi_uart_tx_proc(struct kthread_work *ws)
            (port->port.rs485.delay_rts_before_send > 0)) {
                msleep(port->port.rs485.delay_rts_before_send);
        }
-       spin_lock(&port->port.lock);
        neuronspi_uart_handle_tx(port);
 }
 
@@ -288,7 +289,7 @@ void neuronspi_uart_handle_rx(struct neuronspi_port *port, u32 rxlen, u32 iir)
 
 void neuronspi_uart_handle_tx(struct neuronspi_port *port)
 {
-       u32 max_txlen, to_send, i;
+       u32 max_txlen, to_send, to_send_packet, i;
        struct spi_device *spi;
        struct neuronspi_driver_data *d_data;
        struct circ_buf *xmit;
@@ -304,7 +305,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port)
                spin_lock(&port->tx_lock);
                port->tx_work_count--;
                spin_unlock(&port->tx_lock);
-               spin_unlock(&port->port.lock);
                return;
        }
 
@@ -312,7 +312,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port)
                spin_lock(&port->tx_lock);
                port->tx_work_count--;
                spin_unlock(&port->tx_lock);
-               spin_unlock(&port->port.lock);
                return;
        }
 
@@ -323,18 +322,19 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port)
                /* Limit to size of (TX FIFO / 2) */
                max_txlen = NEURONSPI_FIFO_SIZE >> 1;
                while (to_send > max_txlen) {
-                       to_send = (to_send > max_txlen) ? max_txlen : to_send;
+                       to_send_packet = (to_send > max_txlen) ? max_txlen : to_send;
 
                        /* Add data to send */
-                       port->port.icount.tx += to_send;
+                       port->port.icount.tx += to_send_packet;
 
                        /* Convert to linear buffer */
-                       for (i = 0; i < to_send; ++i) {
+                       for (i = 0; i < to_send_packet; ++i) {
                                port->buf[i] = xmit->buf[xmit->tail];
                                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                        }
-                       printk(KERN_INFO "NEURONSPI UART_HANDLE_TX, to_send:%d, tx_work_count:%d\n", to_send, port->tx_work_count);
-                       neuronspi_uart_fifo_write(port, to_send);
+                       printk(KERN_INFO "NEURONSPI UART_HANDLE_TX, to_send:%d, tx_work_count:%d\n", to_send_packet, port->tx_work_count);
+                       neuronspi_uart_fifo_write(port, to_send_packet);
+                       to_send -= to_send_packet;
                }
                to_send = (to_send > NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS) ? NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS : to_send;
 
@@ -357,8 +357,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port)
        if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) {
                uart_write_wakeup(&port->port);
        }
-
-       spin_unlock(&port->port.lock);
 }
 
 void neuronspi_uart_handle_irq(struct neuronspi_uart_data *uart_data, u32 portno)
@@ -405,7 +403,7 @@ void neuronspi_uart_pm(struct uart_port *port, u32 state, u32 oldstate)
 s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index)
 {
        struct neuronspi_driver_data* driver_data = spi_get_drvdata(dev);
-       struct sched_param sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
+
        s32 i, j, ret, new_uart_count;
        struct neuronspi_uart_data *uart_data = driver_data->uart_data;
 
@@ -436,7 +434,7 @@ s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index)
                uart_data->p[i].port.rs485_config = neuronspi_uart_config_rs485;
                uart_data->p[i].port.ops        = &neuronspi_uart_ops;
                uart_data->p[i].port.line       = neuronspi_uart_alloc_line();
-               spin_lock_init(&uart_data->p[i].tx_lock);
+               spin_lock_init(&uart_data->p[i].tx_counter_lock);
                spin_lock_init(&uart_data->p[i].port.lock);
                if (uart_data->p[i].port.line >= NEURONSPI_MAX_DEVS) {
                        ret = -ENOMEM;
@@ -500,7 +498,7 @@ s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index)
                if (IS_ERR(uart_data->kworker_task)) {
                        ret = PTR_ERR(uart_data->kworker_task);
                }
-               sched_setscheduler(uart_data->kworker_task, SCHED_FIFO, &sched_param);
+               sched_setscheduler(uart_data->kworker_task, SCHED_FIFO, &neuronspi_sched_param);
        }
        return ret;
 }
index db0ac06b5335c0a744d128157b68c93c49f77903..5e5f1ac0869bf9faa021aaf7e23ced626d139cc9 100644 (file)
@@ -30,7 +30,7 @@
 #define NEURONSPI_UART_LDISC_REGISTER  503
 #define NEURONSPI_UART_TIMEOUT_REGISTER 504
 
-#define NEURONSPI_MAX_TX_WORK  16
+#define NEURONSPI_MAX_TX_WORK  4
 
 /*************************
  * Function Declarations *
index d4b7292d2667bdc642b7bc841dfb60ab41f19a19..b624a65d5d94af212fc4e1299c4a5bd31dda8fd1 100644 (file)
@@ -1 +1 @@
-Repository:neuron-kernel ActiveBranch:[uart_timeout] PrecedingRelease:v.0.12 PrecedingRevision:56(8a63b19) LatestCommit:Mon Jun 25 21:06:19 CEST 2018
+Repository:neuron-kernel ActiveBranch:[uart_timeout] PrecedingRelease:v.0.12 PrecedingRevision:57(b6cfcc0) LatestCommit:Tue Jun 26 14:14:56 CEST 2018