From aa72c96509b775c5013f34468f0199c1f0f95f3c Mon Sep 17 00:00:00 2001 From: Miroslav Ondra Date: Wed, 5 Sep 2018 11:08:37 +0200 Subject: [PATCH] move chardev private data from h to unipi_spi.c remove duplicate structure in neuronspi_file_data (global neuronspi_s_dev) --- modules/unipi/src/unipi_common.h | 5 +- modules/unipi/src/unipi_spi.c | 101 +++++++++++++++++-------------- modules/unipi/src/unipi_spi.h | 24 -------- 3 files changed, 57 insertions(+), 73 deletions(-) diff --git a/modules/unipi/src/unipi_common.h b/modules/unipi/src/unipi_common.h index 0cfd3d4..be2902f 100644 --- a/modules/unipi/src/unipi_common.h +++ b/modules/unipi/src/unipi_common.h @@ -263,6 +263,7 @@ struct neuronspi_led_driver spinlock_t lock; }; +/* struct neuronspi_file_data { struct spi_device** spi_device; @@ -273,6 +274,7 @@ struct neuronspi_file_data u8 device_index; u8 has_first_message; }; +*/ struct neuronspi_direct_acc { @@ -284,9 +286,6 @@ struct neuronspi_direct_acc * Data Declarations * *********************/ -extern struct mutex neuronspi_master_mutex; -extern struct neuronspi_char_driver neuronspi_cdrv; -extern struct spinlock* neuronspi_spi_w_spinlock; extern struct spi_device* neuronspi_s_dev[NEURONSPI_MAX_DEVS]; extern struct task_struct *neuronspi_invalidate_thread; diff --git a/modules/unipi/src/unipi_spi.c b/modules/unipi/src/unipi_spi.c index 887265b..4eded51 100644 --- a/modules/unipi/src/unipi_spi.c +++ b/modules/unipi/src/unipi_spi.c @@ -47,33 +47,6 @@ * Data Definitions * ********************/ -MODULE_DEVICE_TABLE(of, neuronspi_id_match); - -struct spi_driver neuronspi_spi_driver = -{ - .driver = - { - .name = NEURON_DRIVER_NAME, - .of_match_table = of_match_ptr(neuronspi_id_match) - }, - .probe = neuronspi_spi_probe, - .remove = neuronspi_spi_remove, -}; - -struct file_operations file_ops = -{ - .open = neuronspi_open, - .read = neuronspi_read, - .write = neuronspi_write, - .release = neuronspi_release, - .owner = THIS_MODULE -}; - -struct neuronspi_char_driver neuronspi_cdrv = -{ - .dev = NULL -}; - struct mutex neuronspi_master_mutex; struct mutex unipi_inv_speed_mutex; int neuronspi_model_id = -1; @@ -84,6 +57,22 @@ static u8 neuronspi_probe_count = 0; static struct spinlock *neuronspi_probe_spinlock; static struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 }; +struct neuronspi_char_driver neuronspi_cdrv = +{ + .dev = NULL +}; + +struct neuronspi_file_data +{ + //struct spi_device** spi_device; + struct mutex lock; + struct neuronspi_op_buffer send_buf; + struct neuronspi_op_buffer recv_buf; + u32 message_len; + u8 device_index; + u8 has_first_message; +}; + /************************ * Non-static Functions * ************************/ @@ -301,7 +290,7 @@ int neuronspi_open (struct inode *inode_p, struct file *file_p) f_internal_data = kzalloc(sizeof(*f_internal_data), GFP_ATOMIC); f_internal_data->recv_buf.second_message = kzalloc(NEURONSPI_BUFFER_MAX, GFP_ATOMIC); f_internal_data->send_buf.second_message = kzalloc(NEURONSPI_BUFFER_MAX, GFP_ATOMIC); - f_internal_data->spi_device = neuronspi_s_dev; + //f_internal_data->spi_device = neuronspi_s_dev; mutex_init(&f_internal_data->lock); file_p->private_data = f_internal_data; return 0; @@ -314,7 +303,7 @@ int neuronspi_release (struct inode *inode_p, struct file *file_p) return -1; } f_internal_data = (struct neuronspi_file_data*)file_p->private_data; - f_internal_data->spi_device = NULL; + //f_internal_data->spi_device = NULL; kfree(f_internal_data->recv_buf.second_message); f_internal_data->recv_buf.second_message = NULL; kfree(f_internal_data->send_buf.second_message); @@ -331,7 +320,7 @@ ssize_t neuronspi_read (struct file *file_p, char *buffer, size_t len, loff_t *o s32 result = 0; loff_t dummy_offset = 0; struct neuronspi_file_data* private_data; - struct spi_device* spi_driver_data; + struct spi_device* spi; struct neuronspi_driver_data* driver_data; // Sanity checking if (neuronspi_cdrv.open_counter == 0) { @@ -350,10 +339,10 @@ ssize_t neuronspi_read (struct file *file_p, char *buffer, size_t len, loff_t *o } private_data = (struct neuronspi_file_data*) file_p->private_data; if (private_data == NULL) return -4; - spi_driver_data = private_data->spi_device[private_data->device_index]; // Get private (driver) data from FP - if (spi_driver_data == NULL) return -2; + spi = neuronspi_s_dev[private_data->device_index]; + if (spi == NULL) return -2; - driver_data = spi_get_drvdata(spi_driver_data); + driver_data = spi_get_drvdata(spi); if (driver_data == NULL) return -2; //if (driver_data->spi_driver == NULL) return -2; // Invalid private data //if ((driver_data->first_probe_reply[0] == 0) && !(driver_data->probe_always_succeeds) ) return -3; // couldnt happen @@ -363,8 +352,8 @@ ssize_t neuronspi_read (struct file *file_p, char *buffer, size_t len, loff_t *o mutex_unlock(&(private_data->lock)); return -10; } - unipi_spi_trace(KERN_INFO "UNIPISPI: CDEV Read %d, DEV:%s%d DRV:%d msglen=%d offset=%d\n", len, (spi_driver_data->dev.of_node->name), - (spi_driver_data->chip_select), (private_data->device_index),private_data->message_len, (int)*offset); + unipi_spi_trace(KERN_INFO "UNIPISPI: CDEV Read %d, nspi:%d msglen=%d offset=%d\n", len, + (private_data->device_index), private_data->message_len, (int)*offset); if (private_data->has_first_message & UNIPISPI_OP_MODE_SEND_HEADER) { result = simple_read_from_buffer(buffer, len, &dummy_offset, private_data->recv_buf.first_message, NEURONSPI_FIRST_MESSAGE_LENGTH); @@ -400,7 +389,7 @@ ssize_t neuronspi_write (struct file *file_p, const char *buffer, size_t len, lo size_t datalen; //unsigned long flags; struct neuronspi_file_data* private_data; - struct spi_device* spi_driver_data; + struct spi_device* spi; struct neuronspi_driver_data* driver_data; // Sanity checking if (neuronspi_cdrv.open_counter == 0) { @@ -432,10 +421,10 @@ ssize_t neuronspi_write (struct file *file_p, const char *buffer, size_t len, lo if (device_index > NEURONSPI_MAX_DEVS - 1) return -2; private_data = (struct neuronspi_file_data*) file_p->private_data; - spi_driver_data = private_data->spi_device[device_index]; // Get private (driver) data from FP - if (spi_driver_data == NULL) return -2; + spi = neuronspi_s_dev[device_index]; + if (spi == NULL) return -2; - driver_data = spi_get_drvdata(spi_driver_data); + driver_data = spi_get_drvdata(spi); if (driver_data == NULL) return -2; //if (driver_data->spi_driver == NULL) return -2; // Invalid private data //if ((driver_data->first_probe_reply[0] == 0) && !(driver_data->probe_always_succeeds) ) @@ -488,7 +477,7 @@ ssize_t neuronspi_write (struct file *file_p, const char *buffer, size_t len, lo return len; } } - neuronspi_spi_send_op(spi_driver_data, &private_data->send_buf, &private_data->recv_buf, private_data->message_len, + neuronspi_spi_send_op(spi, &private_data->send_buf, &private_data->recv_buf, private_data->message_len, frequency, delay, send_header, reservation); mutex_unlock(&private_data->lock); return len; @@ -829,8 +818,8 @@ void neuronspi_enable_uart_interrupt(struct neuronspi_port* n_port) if (n_spi->no_irq) { // start polling n_spi->poll_enabled = 1; + // invoke first probe -> which invokes hrtimer kthread_queue_work(&n_spi->primary_worker, &n_spi->irq_work); - //hrtimer_start_range_ns(&n_spi->poll_timer, 2000000, 4000000, HRTIMER_MODE_REL); } } @@ -852,7 +841,7 @@ s32 neuronspi_spi_probe(struct spi_device *spi) spin_unlock_irqrestore(neuronspi_probe_spinlock, flags); if (!n_spi) return -ENOMEM; - unipi_spi_trace(KERN_INFO "UNIPISPI: Probe Started\n"); + unipi_spi_trace(KERN_INFO "UNIPISPI: CS%d Probe Started\n", spi->chip_select); if (spi == NULL) { kfree(n_spi); return -8; @@ -1137,6 +1126,17 @@ s32 neuronspi_spi_remove(struct spi_device *spi) return 0; } + +struct file_operations file_ops = +{ + .open = neuronspi_open, + .read = neuronspi_read, + .write = neuronspi_write, + .release = neuronspi_release, + .owner = THIS_MODULE +}; + + s32 char_register_driver(void) { s32 ret = 0; @@ -1186,6 +1186,19 @@ s32 char_unregister_driver(void) /********************* * Final definitions * *********************/ +MODULE_DEVICE_TABLE(of, neuronspi_id_match); + +struct spi_driver neuronspi_spi_driver = +{ + .driver = + { + .name = NEURON_DRIVER_NAME, + .of_match_table = of_match_ptr(neuronspi_id_match) + }, + .probe = neuronspi_spi_probe, + .remove = neuronspi_spi_remove, +}; + MODULE_ALIAS("spi:unipispi"); @@ -1206,11 +1219,7 @@ static s32 __init neuronspi_init(void) printk(KERN_ERR "UNIPISPI: Failed to init neuronspi spi --> %d\n", ret); return ret; } else { -#ifdef NEURONSPI_MAJOR_VERSIONSTRING printk(KERN_INFO "UNIPISPI: SPI Driver Registered, Major Version: %s\n", NEURONSPI_MAJOR_VERSIONSTRING); -#else - printk(KERN_INFO "UNIPISPI: SPI Driver Registered\n"); -#endif } neuronspi_invalidate_thread = kthread_create(neuronspi_regmap_invalidate, NULL, "unipispi_inv"); diff --git a/modules/unipi/src/unipi_spi.h b/modules/unipi/src/unipi_spi.h index 5f293c5..2ed625d 100644 --- a/modules/unipi/src/unipi_spi.h +++ b/modules/unipi/src/unipi_spi.h @@ -116,22 +116,6 @@ static const struct of_device_id neuronspi_id_match[] = { * Function Declarations * *************************/ -int neuronspi_open (struct inode *, struct file *); -int neuronspi_release (struct inode *, struct file *); -ssize_t neuronspi_read (struct file *, char *, size_t, loff_t *); -ssize_t neuronspi_write (struct file *, const char *, size_t, loff_t *); -s32 char_register_driver(void); -s32 char_unregister_driver(void); -irqreturn_t neuronspi_spi_irq(s32 irq, void *dev_id); -s32 neuronspi_spi_probe(struct spi_device *spi); -s32 neuronspi_spi_remove(struct spi_device *spi); - -int neuronspi_spi_send_const_op(struct spi_device* spi_dev, const struct neuronspi_op_buffer* send_buf, - struct neuronspi_op_buffer* recv_buf, s32 len, - s32 freq, s32 delay); -int neuronspi_spi_send_op(struct spi_device* spi_dev, struct neuronspi_op_buffer* send_buf, - struct neuronspi_op_buffer* recv_buf, s32 len, - s32 freq, s32 delay, s32 send_header, u8 lock_val); s32 neuronspi_spi_uart_write(struct spi_device *spi, u8 *send_buf, int length, u8 uart_index); void neuronspi_spi_uart_read(struct spi_device* spi_dev, u8 *recv_buf, s32 len, u8 uart_index); int unipispi_modbus_read_register(struct spi_device* spi_dev, u16 reg, u16* value); @@ -142,13 +126,6 @@ int unipispi_modbus_write_u32(struct spi_device* spi_dev, u16 reg, u32 value); int unipispi_modbus_write_many(struct spi_device* spi_dev, u16 reg, u16* value, int register_count); int unipispi_modbus_write_coil(struct spi_device* spi_dev, u16 coil, int value); -/*void neuronspi_spi_set_irqs(struct spi_device* spi_dev, u16 to); - -int neuronspi_spi_gpio_do_set(struct spi_device* spi_dev, u32 id, int value); -int neuronspi_spi_gpio_ro_set(struct spi_device* spi_dev, u32 id, int value); -int neuronspi_spi_gpio_di_get(struct spi_device* spi_dev, u32 id); -int neuronspi_spi_gpio_di_get(struct spi_device* spi_dev, u32 id); -*/ void neuronspi_enable_uart_interrupt(struct neuronspi_port* n_port); @@ -158,7 +135,6 @@ void neuronspi_enable_uart_interrupt(struct neuronspi_port* n_port); // Host driver struct extern struct spi_driver neuronspi_spi_driver; -extern struct file_operations file_ops; extern struct mutex unipi_inv_speed_mutex; -- 2.34.1