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;
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
************************/
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) {
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) {
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) {
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);
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 *
************************/
*/
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;
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;
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;
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;
*/
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;
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;
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;
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;
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;
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;
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;
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
}
#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";
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";
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";
}
}
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";
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);
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);
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);
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);
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);
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);
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);
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);
#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);
unsigned long neuronspi_lines;
struct uart_driver* neuronspi_uart;
+struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 };
+
/************************
* Non-static Functions *
************************/
(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);
}
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;
spin_lock(&port->tx_lock);
port->tx_work_count--;
spin_unlock(&port->tx_lock);
- spin_unlock(&port->port.lock);
return;
}
spin_lock(&port->tx_lock);
port->tx_work_count--;
spin_unlock(&port->tx_lock);
- spin_unlock(&port->port.lock);
return;
}
/* 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;
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)
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;
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;
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;
}
#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 *
-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