linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 3/4] Add header file,Kconfig and Makefile
@ 2019-03-08 12:35 Morris Ku
  2019-03-08 20:54 ` Enrico Weigelt, metux IT consult
  2019-03-09  3:15 ` Randy Dunlap
  0 siblings, 2 replies; 4+ messages in thread
From: Morris Ku @ 2019-03-08 12:35 UTC (permalink / raw)
  To: gregkh; +Cc: morris_ku, linux-kernel, arnd, Morris Ku

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=y, Size: 41842 bytes --]

This patch add header file, Kconfig and Makefile. 

Signed-off-by: Morris Ku <saumah@gmail.com>
---
 char/snx/Kconfig       |   15 +
 char/snx/Makefile      |    9 +
 char/snx/driver_extd.h |  170 ++++++
 char/snx/snx_common.h  | 1157 ++++++++++++++++++++++++++++++++++++++++
 char/snx/snx_lp.h      |  126 +++++
 char/snx/snx_ppdev.h   |   43 ++
 6 files changed, 1520 insertions(+)
 create mode 100644 char/snx/Kconfig
 create mode 100644 char/snx/Makefile
 create mode 100644 char/snx/driver_extd.h
 create mode 100644 char/snx/snx_common.h
 create mode 100644 char/snx/snx_lp.h
 create mode 100644 char/snx/snx_ppdev.h

diff --git a/char/snx/Kconfig b/char/snx/Kconfig
new file mode 100644
index 00000000..86f38352
--- /dev/null
+++ b/char/snx/Kconfig
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Character device configuration
+#
+
+config SNX
+	tristate "SUNIX Multi-IO Board Drvier"
+	Driver for SUNIX Multi-I/O Board device driver Based on
+	drivers/char/serial.c, parport_pc.c, ppdev.c and lp.c by Linus
+	Torvalds, Theodore Ts'o.
+	help
+	   Say Y here if you have a SUNIX Multi-IO card.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called snx.
diff --git a/char/snx/Makefile b/char/snx/Makefile
new file mode 100644
index 00000000..47348926
--- /dev/null
+++ b/char/snx/Makefile
@@ -0,0 +1,9 @@
+#
+# drivers/char/snx/Makefile
+#
+# Makefile for the sunix multi-io device drivers.
+#
+
+obj-$(CONFIG_SNX) += snx.o
+
+snx-y := snx_main.o snx_devtable.o snx_serial.o snx_parallel.o snx_share.o snx_ieee1284.o snx_ieee1284_ops.o snx_ppdev.o snx_lp.o
diff --git a/char/snx/driver_extd.h b/char/snx/driver_extd.h
new file mode 100644
index 00000000..27f69570
--- /dev/null
+++ b/char/snx/driver_extd.h
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _SNXHW_DRVR_EXTR_H_
+#define _SNXHW_DRVR_EXTR_H_
+
+#ifndef SNX_IOCTL
+#define SNX_IOCTL 0x900
+#endif
+
+#define SNX_COMM_GET_BOARD_CNT          (SNX_IOCTL + 100)
+#define SNX_COMM_GET_BOARD_INFO         (SNX_IOCTL + 101)
+
+#define SNX_GPIO_GET                    (SNX_IOCTL + 200)
+#define SNX_GPIO_SET                    (SNX_IOCTL + 201)
+#define SNX_GPIO_READ                   (SNX_IOCTL + 202)
+#define SNX_GPIO_WRITE                  (SNX_IOCTL + 203)
+#define SNX_GPIO_SET_DEFAULT            (SNX_IOCTL + 204)
+#define SNX_GPIO_WRITE_DEFAULT          (SNX_IOCTL + 205)
+#define SNX_GPIO_GET_INPUT_INVERT       (SNX_IOCTL + 206)
+#define SNX_GPIO_SET_INPUT_INVERT       (SNX_IOCTL + 207)
+
+#define SNX_UART_GET_TYPE               (SNX_IOCTL + 300)
+#define SNX_UART_SET_TYPE               (SNX_IOCTL + 301)
+#define SNX_UART_GET_ACS                (SNX_IOCTL + 302)
+#define SNX_UART_SET_ACS                (SNX_IOCTL + 303)
+
+#define SNX_BOARD_MAX_UARTCNT     32
+
+#define SNX_GPIO_IN               0
+#define SNX_GPIO_OUT              1
+#define SNX_GPIO_LOW              0
+#define SNX_GPIO_HI               1
+#define SNX_GPIO_INPUT_INVERT_D   0
+#define SNX_GPIO_INPUT_INVERT_E   1
+
+#define SNX_UART_RS232            0
+#define SNX_UART_RS422            1
+#define SNX_UART_RS485            2
+#define SNX_UART_A422485          3
+#define SNX_UART_ACS_D            0
+#define SNX_UART_ACS_E            1
+
+#define SNX_GPIO_TYPE_STANDARD    0
+#define SNX_GPIO_TYPE_CASHDRAWER  1
+
+#define SNX_UART_TYPE_RS232       0
+#define SNX_UART_TYPE_RS422485    1
+#define SNX_UART_TYPE_3IN1        2
+
+
+typedef struct _SNX_DRVR_BOARD_CNT {
+	int                 cnt;
+
+} SNX_DRVR_BOARD_CNT, *PSNX_DRVR_BOARD_CNT;
+
+typedef struct _SNX_DRVR_UART_INFO {
+	int                 status;
+	int                 node_num;
+	int                 uart_type;
+
+} SNX_DRVR_UART_INFO, *PSNX_DRVR_UART_INFO;
+
+
+typedef struct _SNX_DRVR_BOARD_INFO {
+	int                 board_id;
+	int                 subvender_id;
+	int                 subsystem_id;
+	int                 oem_id;
+	int                 uart_cnt;
+	SNX_DRVR_UART_INFO  uart_info[SNX_BOARD_MAX_UARTCNT];
+	int                 gpio_chl_cnt;
+	int                 board_uart_type;
+int                 board_gpio_type;
+
+} SNX_DRVR_BOARD_INFO, *PSNX_DRVR_BOARD_INFO;
+
+
+typedef struct _SNX_DRVR_GPIO_GET {
+	int                 board_id;
+	unsigned char       bank1_direct;
+	unsigned char       bank2_direct;
+	unsigned char       bank3_direct;
+	unsigned char       bank4_direct;
+
+} SNX_DRVR_GPIO_GET, *PSNX_DRVR_GPIO_GET;
+
+
+typedef struct _SNX_DRVR_GPIO_SET {
+	int                 board_id;
+	unsigned char       bank1_direct;
+	unsigned char       bank2_direct;
+	unsigned char       bank3_direct;
+	unsigned char       bank4_direct;
+
+} SNX_DRVR_GPIO_SET, *PSNX_DRVR_GPIO_SET;
+
+
+typedef struct _SNX_DRVR_GPIO_READ {
+	int                 board_id;
+	unsigned char       bank1_signal;
+	unsigned char       bank2_signal;
+	unsigned char       bank3_signal;
+	unsigned char       bank4_signal;
+
+} SNX_DRVR_GPIO_READ, *PSNX_DRVR_GPIO_READ;
+
+
+typedef struct _SNX_DRVR_GPIO_WRITE {
+	int                 board_id;
+	unsigned char       bank1_signal;
+	unsigned char       bank2_signal;
+	unsigned char       bank3_signal;
+	unsigned char       bank4_signal;
+
+} SNX_DRVR_GPIO_WRITE, *PSNX_DRVR_GPIO_WRITE;
+
+
+typedef struct _SNX_DRVR_GPIO_GET_INPUT_INVERT {
+	int                 board_id;
+	unsigned char       bank1_invert;
+	unsigned char       bank2_invert;
+	unsigned char       bank3_invert;
+	unsigned char       bank4_invert;
+
+} SNX_DRVR_GPIO_GET_INPUT_INVERT, *PSNX_DRVR_GPIO_GET_INPUT_INVERT;
+
+
+typedef struct _SNX_DRVR_GPIO_SET_INPUT_INVERT {
+	int                 board_id;
+	unsigned char       bank1_invert;
+	unsigned char       bank2_invert;
+	unsigned char       bank3_invert;
+	unsigned char       bank4_invert;
+
+} SNX_DRVR_GPIO_SET_INPUT_INVERT, *PSNX_DRVR_GPIO_SET_INPUT_INVERT;
+
+
+typedef struct _SNX_DRVR_UART_GET_TYPE {
+	int                 board_id;
+	int                 uart_num;
+	int                 uart_type;
+
+} SNX_DRVR_UART_GET_TYPE, *PSNX_DRVR_UART_GET_TYPE;
+
+
+typedef struct _SNX_DRVR_UART_SET_TYPE {
+	int                 board_id;
+	int                 uart_num;
+	int                 uart_type;
+
+} SNX_DRVR_UART_SET_TYPE, *PSNX_DRVR_UART_SET_TYPE;
+
+
+typedef struct _SNX_DRVR_UART_GET_ACS {
+	int                 board_id;
+	int                 uart_num;
+	int                 uart_acs;
+
+} SNX_DRVR_UART_GET_ACS, *PSNX_DRVR_UART_GET_ACS;
+
+
+typedef struct _SNX_DRVR_UART_SET_ACS {
+	int                 board_id;
+	int                 uart_num;
+	int                 uart_acs;
+
+} SNX_DRVR_UART_SET_ACS, *PSNX_DRVR_UART_SET_ACS;
+
+
+#endif
diff --git a/char/snx/snx_common.h b/char/snx/snx_common.h
new file mode 100644
index 00000000..16dd8f02
--- /dev/null
+++ b/char/snx/snx_common.h
@@ -0,0 +1,1157 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#ifdef	MODVERSIONS
+#ifndef MODULE
+#define	MODULE
+#endif
+#endif
+
+#include "driver_extd.h"
+#include <linux/version.h>
+
+#ifndef KERNEL_VERSION
+#define KERNEL_VERSION(ver, rel, seq)	((ver << 16) | (rel << 8) | seq)
+#endif
+
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial.h>
+#include <linux/serial_reg.h>
+#include <linux/ioport.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/wait.h>
+#include <linux/tty_driver.h>
+#include <linux/pci.h>
+#include <linux/circ_buf.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/segment.h>
+#include <asm/serial.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/workqueue.h>
+#include <linux/moduleparam.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/kref.h>
+#include <linux/parport.h>
+#include <linux/ctype.h>
+#include <linux/poll.h>
+#include <linux/sched.h>
+#include <linux/serial_8250.h>
+#include <linux/cdev.h>
+#include <linux/sched/signal.h>
+
+extern int snx_board_count;
+
+#define SNX_DRIVER_VERSION	"V2.0.4.5"
+#define SNX_DRIVER_AUTHOR	"SUNIX Co., Ltd.<info@sunix.com.tw>"
+#define SNX_DRIVER_DESC	"SUNIX Multi-I/O Board Driver Module"
+
+#define SNX_DBG			0
+#define SNX_DBG_BOARD			0
+#define SNX_DBG_SERPORT		0
+#define SNX_DBG_PARPORT		0
+
+#define	VENID_GOLDEN		0x1409
+#define	DEVID_G_SERIAL		0x7168
+#define DEVID_G_PARALL			0x7268
+#define SUBVENID_GOLDEN		0x1409
+
+#define	VENID_MATRIX		0x1FD4
+#define	DEVID_M_SERIAL		0x0001
+#define SUBVENID_MATRIX		0x0001
+
+#define	VENID_SUN1999		0x1FD4
+#define	DEVID_S_SERIAL		0x1999
+#define DEVID_S_PARALL			0x1999
+#define SUBVENID_SUN1999		0x1FD4
+
+// golden board
+#define SUBDEVID_TEST			0x9999
+
+// matrix board
+// P1002
+#define SUBDEVID_P1002			0x1002
+// P1004
+#define SUBDEVID_P1004			0x1004
+// P1008
+#define SUBDEVID_P1008			0x1008
+// P1016
+#define SUBDEVID_P1016			0x1016
+// P2002
+#define SUBDEVID_P2002			0x2002
+// P2004
+#define SUBDEVID_P2004			0x2004
+// P2008
+#define SUBDEVID_P2008			0x2008
+// P3002
+#define SUBDEVID_P3002			0x3002
+// P3004
+#define SUBDEVID_P3004			0x3004
+// P3008
+#define SUBDEVID_P3008			0x3008
+
+
+// SUN1999 board
+//5027A 5027H 5027AL 5027HL
+#define SUBDEVID_5027A			0x0001
+//5037A 5037H
+#define SUBDEVID_5037A			0x0002
+//5056A 5056AL 5056H 5056HL
+#define SUBDEVID_5056A			0x0004
+//5066A 5066H
+#define SUBDEVID_5066A			0x0008
+//5016A
+#define SUBDEVID_5016A			0x0010
+
+
+// SUN1999-multi I/O
+//5069A 5069H
+#define SUBDEVID_5069A			0x0101
+//5079A 5079H
+#define SUBDEVID_5079A			0x0102
+//5099A 5099H
+#define SUBDEVID_5099A			0x0104
+
+// SUN1999-parallel board
+//5008A/AL
+#define SUBDEVID_5008A			0x0100
+
+//IPC-P2102 IPC-P2102SI
+#define SUBDEVID_P2102			0x0002
+//IPC-P2104 IPC-P2104SI
+#define SUBDEVID_P2104			0x0004
+//IPC-P2108 IPC-P2108SI
+#define SUBDEVID_P2108			0x0008
+//IPC-P2116
+#define SUBDEVID_P2116			0x0010
+
+// 3_in_1
+//IPC-P3104 IPC-P3104SI
+#define SUBDEVID_P3104			0x0084
+
+//IPC-P3108 IPC-P3104SI
+#define SUBDEVID_P3108			0x0088
+
+//CASH DRAWER CARD
+#define SUBDEVID_CASH_2S		0x0002
+#define SUBDEVID_CASH_4S		0x0004
+
+//DIO CARD
+#define SUBDEVID_DIO0802		0x0002
+
+#define SUBDEVID_DIO1604		0x0004
+
+#define SUBDEVID_DIO3204		0x0004
+
+
+// for chip_flag
+#define SUNNONE_HWID			0x0000
+#define SUN1889_HWID			0x0001
+#define SUN1699_HWID			0x0002
+#define SUN1888_HWID			0x0004
+#define SUN1689_HWID			0x0008
+#define SUNMATX_HWID			0x0010
+#define SUN1999_HWID			0x0020
+
+// for board_flag
+#define BOARDFLAG_NONE			0x0000
+#define BOARDFLAG_REMAP		0x0001
+#define BOARDFLAG_16PORTS		0x0002
+
+// for port_flag
+#define PORTFLAG_NONE			0x0000
+#define PORTFLAG_REMAP			0x0001
+#define PORTFLAG_16PORTS		0x0002
+
+// for part_number
+#define PART_NUMBER_NONE    0x0000
+
+// for card_type )
+#define CARD_TYPE_UART_ONLY    0x00
+#define CARD_TYPE_UART_GINTR   0x01
+#define CARD_TYPE_UART_GEXTR   0x02
+
+// for Gpio_ch_cnt )
+#define GPIO_NONE			0
+#define INTR_GPIO_6PORT		6
+#define EXTR_GPIO_8PORT		8
+#define EXTR_GPIO_16PORT	16
+#define EXTR_GPIO_32PORT	32
+
+// for port_flag
+#define PORTFLAG_NONE			0x0000
+#define PORTFLAG_REMAP			0x0001
+#define PORTFLAG_16PORTS		0x0002
+
+// board info
+#define SNX_BOARDS_MAX			4
+#define SNX_PORT_ONBOARD_MAX	16
+
+#define SNX_SER_TOTAL_MAX		32
+#define SNX_SER_ONBOARD_MAX		16
+
+// include lp0 and lp1 (mother board)
+#define SNX_PAR_SUPPORT_MAX		2
+#define SNX_PAR_TOTAL_MAX		4
+#define SNX_PAR_ONBOARD_MAX		2
+
+#define SUN1699_CLK_DIVIDER_DISABLE	0x10
+
+// 1889 uart fifo info
+#define SUN1889_FIFOSIZE_16				16
+#define SUN1889_TRIGGER_LEVEL_16FIFO_01		1
+#define SUN1889_TRIGGER_LEVEL_16FIFO_04		4
+#define SUN1889_TRIGGER_LEVEL_16FIFO_08		8
+#define SUN1889_TRIGGER_LEVEL_16FIFO_14		14
+
+#define SUN1889_FIFOSIZE_32				32
+#define SUN1889_TRIGGER_LEVEL_32FIFO_08		8
+#define SUN1889_TRIGGER_LEVEL_32FIFO_16		16
+#define SUN1889_TRIGGER_LEVEL_32FIFO_24		24
+#define SUN1889_TRIGGER_LEVEL_32FIFO_28		28
+
+// 1699 uart fifo info
+#define SUN1699_FIFOSIZE_16				16
+#define SUN1699_TRIGGER_LEVEL_16FIFO_01		1
+#define SUN1699_TRIGGER_LEVEL_16FIFO_04		4
+#define SUN1699_TRIGGER_LEVEL_16FIFO_08		8
+#define SUN1699_TRIGGER_LEVEL_16FIFO_14		14
+
+#define SUN1699_FIFOSIZE_32				32
+#define SUN1699_TRIGGER_LEVEL_32FIFO_08		8
+#define SUN1699_TRIGGER_LEVEL_32FIFO_16		16
+#define SUN1699_TRIGGER_LEVEL_32FIFO_24		24
+#define SUN1699_TRIGGER_LEVEL_32FIFO_28		28
+
+#define SUN1699_FIFOSIZE_64				64
+#define SUN1699_TRIGGER_LEVEL_64FIFO_16		16
+#define SUN1699_TRIGGER_LEVEL_64FIFO_32		32
+#define SUN1699_TRIGGER_LEVEL_64FIFO_48		48
+#define SUN1699_TRIGGER_LEVEL_64FIFO_56		56
+
+// matrix uart fifo info
+#define SUNMATX_FIFOSIZE_16				16
+#define SUNMATX_TRIGGER_LEVEL_16FIFO_01		1
+#define SUNMATX_TRIGGER_LEVEL_16FIFO_04		4
+#define SUNMATX_TRIGGER_LEVEL_16FIFO_08		8
+#define SUNMATX_TRIGGER_LEVEL_16FIFO_14		14
+
+#define SUNMATX_FIFOSIZE_64				64
+#define SUNMATX_TRIGGER_LEVEL_64FIFO_01		1
+#define SUNMATX_TRIGGER_LEVEL_64FIFO_16		16
+#define SUNMATX_TRIGGER_LEVEL_64FIFO_32		32
+#define SUNMATX_TRIGGER_LEVEL_64FIFO_56		56
+
+// 1999 uart fifo info
+#define SUN1999_FIFOSIZE_32				32
+#define SUN1999_TRIGGER_LEVEL_32FIFO_01		1
+#define SUN1999_TRIGGER_LEVEL_32FIFO_8			8
+#define SUN1999_TRIGGER_LEVEL_32FIFO_16		16
+#define SUN1999_TRIGGER_LEVEL_32FIFO_28		28
+
+#define SUN1999_FIFOSIZE_128				128
+#define SUN1999_TRIGGER_LEVEL_128FIFO_01	1
+#define SUN1999_TRIGGER_LEVEL_128FIFO_32	32
+#define SUN1999_TRIGGER_LEVEL_128FIFO_64	64
+#define SUN1999_TRIGGER_LEVEL_128FIFO_112	112
+
+// uart fifo setup
+#define SUN1889_FIFOSIZE_SET		SUN1889_FIFOSIZE_32
+#define SUN1889_TRIGGER_LEVEL_SET	SUN1889_TRIGGER_LEVEL_32FIFO_16
+
+#define SUN1699_FIFOSIZE_SET		SUN1699_FIFOSIZE_32
+#define SUN1699_TRIGGER_LEVEL_SET	SUN1699_TRIGGER_LEVEL_32FIFO_16
+
+#define SUNMATX_FIFOSIZE_SET		SUNMATX_FIFOSIZE_64
+#define SUNMATX_TRIGGER_LEVEL_SET	SUNMATX_TRIGGER_LEVEL_64FIFO_32
+
+#define SUN1999_FIFOSIZE_SET		SUN1999_FIFOSIZE_128
+#define SUN1999_TRIGGER_LEVEL_SET	SUN1999_TRIGGER_LEVEL_128FIFO_64
+
+#define UART_SUN1889_FCR_16BYTE		0x00
+#define UART_SUN1889_FCR_32BYTE		0x20
+
+#define UART_SUN1699_FCR_16BYTE		0x00
+#define UART_SUN1699_FCR_32BYTE		0x20
+#define UART_SUN1699_FCR_64BYTE		0x30
+
+#define UART_SUNMATX_FCR_64BYTE		0x20
+
+#define UART_SUN1999_FCR_128BYTE		0x20
+#define UART_DEFAULT_FCR			0x00
+
+#define DEFAULT_FIFOSIZE		1
+#define DEFAULT_TRIGGER_LEVEL		1
+
+// register status info
+#define UART_LSR_ERR_IN_RFIFO		0x80
+#define UART_MCR_AFE			0x20
+#define UART_IIR_CTO			0x0C
+
+// interrupt vedtor offset
+#define SUN1889_INTRSERVREG		0x1C
+
+// serial address length
+#define SNX_SER_ADDRESS_LENGTH		8
+
+// parallel address length
+#define SNX_PAR_ADDRESS_LENGTH		8
+#define SNX_PAR_STD_ADDR_LENGTH	3
+#define SNX_PAR_ETD_ADDR_LENGTH	5
+
+// PCI configuration bar 0 ~ 5
+#define SNX_PCICFG_BAR_TOTAL		6
+
+#define INTERRUPT_COUNT 128
+#define WAKEUP_CHARS    256
+
+#define SNXTERMIOS  ktermios
+
+// for snx_ser_port->snx_type
+#define SNX_SER_PORT_MAX_UART	5
+#define SNX_SER_PORT_UNKNOWN	0
+#define SNX_SER_PORT_SUN1889	1
+#define SNX_SER_PORT_SUN1699	2
+#define SNX_SER_PORT_SUNMATX	3
+#define SNX_SER_PORT_SUN1999    4
+
+
+// for snx_ser_port->setserial_flag
+#define SNX_SER_BAUD_SETSERIAL	1
+#define SNX_SER_BAUD_NOTSETSER	0
+
+// name length
+#define SNX_BOARDNAME_LENGTH  15
+#define SNX_DRIVERVERSION_LENGTH 15
+
+
+struct snx_ser_port_info {
+	char			board_name_info[SNX_BOARDNAME_LENGTH];
+	unsigned int	bus_number_info;
+	unsigned int	dev_number_info;
+	unsigned int	port_info;
+	unsigned int	base_info;
+	unsigned int	irq_info;
+};
+
+
+struct snx_par_port_info {
+	char			board_name_info[SNX_BOARDNAME_LENGTH];
+	unsigned int	bus_number_info;
+	unsigned int	dev_number_info;
+	unsigned int	port_info;
+	unsigned int	base_info;
+	unsigned int	base_hi_info;
+	unsigned int	irq_info;
+	unsigned int	minor;
+
+};
+
+
+typedef struct _PORT {
+	char		type;
+
+	int		bar1;
+	unsigned char	offset1;
+	unsigned char	length1;
+
+	int		bar2;
+	unsigned char	offset2;
+	unsigned char	length2;
+
+	unsigned int	intmask;
+	unsigned int	chip_flag;
+
+} PORT;
+
+
+typedef struct _PCI_BOARD {
+	unsigned int	vendor_id;
+	unsigned int	device_id;
+	unsigned int	sub_vendor_id;
+	unsigned int	sub_device_id;
+
+	unsigned int	num_serport;
+	unsigned int	num_parport;
+
+	unsigned int	intr_vector_bar;
+	unsigned char	intr_vector_offset;
+
+	char		board_name[SNX_BOARDNAME_LENGTH];
+	unsigned int	board_flag;
+	unsigned int	part_number;
+	unsigned int	card_type;
+	int		gpio_ch_cnt;
+
+	PORT		port[SNX_PORT_ONBOARD_MAX];
+
+} PCI_BOARD;
+
+
+struct sunix_board;
+struct sunix_ser_port;
+struct sunix_par_port;
+
+
+struct sunix_board {
+	int				board_enum;
+	int				board_number;
+	unsigned int			bus_number;
+	unsigned int			dev_number;
+
+	unsigned int			ports;
+	unsigned int			ser_port;
+	unsigned int			par_port;
+
+	unsigned int			ser_port_index;
+	unsigned int			par_port_index;
+
+	unsigned int			bar_addr[SNX_PCICFG_BAR_TOTAL];
+	unsigned int			irq;
+
+	unsigned int			board_flag;
+
+	unsigned int			vector_mask;
+	PCI_BOARD		pb_info;
+	struct pci_dev		*pdev;
+	int	(*ser_isr)(struct sunix_board *sb, struct sunix_ser_port *port);
+	int	(*par_isr)(struct sunix_board *sb, struct sunix_par_port *port);
+
+	unsigned int	oem_id;
+	int		uart_cnt;
+	int		gpio_chl_cnt;
+	unsigned char		board_uart_type;
+	unsigned char		board_gpio_type;
+	unsigned char		board_gpio_card_type;
+
+};
+
+#define SNX_IOCTL  0x900
+#define SNX_SER_DUMP_PORT_INFO  (SNX_IOCTL + 50)
+#define SNX_SER_DUMP_PORT_PERF  (SNX_IOCTL + 51)
+#define SNX_SER_DUMP_DRIVER_VER (SNX_IOCTL + 52)
+#define SNX_PAR_DUMP_PORT_INFO  (SNX_IOCTL + 53)
+#define SNX_PAR_DUMP_DRIVER_VER (SNX_IOCTL + 54)
+
+#define PORT_SER_UNKNOWN		0
+#define PORT_SER_8250			1
+#define PORT_SER_16450			2
+#define PORT_SER_16550			3
+#define PORT_SER_16550A		4
+#define PORT_SER_CIRRUS        	5
+#define PORT_SER_16650			6
+#define PORT_SER_16650V2		7
+#define PORT_SER_16750			8
+#define PORT_SER_MAX_UART		8	/* max serial port ID */
+
+
+#define SNX_USF_CLOSING_WAIT_INF	(0)
+#define SNX_USF_CLOSING_WAIT_NONE	(65535)
+#define SNX_UART_CONFIG_TYPE	(1 << 0)
+#define SNX_UART_CONFIG_IRQ		(1 << 1)
+
+#define SNX_UART_XMIT_SIZE		4096
+
+#define snx_ser_circ_empty(circ)	\
+((circ)->head == (circ)->tail)
+#define snx_ser_circ_clear(circ)	\
+((circ)->head = (circ)->tail = 0)
+#define snx_ser_circ_chars_pending(circ)	\
+(CIRC_CNT((circ)->head, (circ)->tail, SNX_UART_XMIT_SIZE))
+#define snx_ser_circ_chars_free(circ)	\
+(CIRC_SPACE((circ)->head, (circ)->tail, SNX_UART_XMIT_SIZE))
+#define snx_ser_tx_stopped(port)	\
+((port)->info->tty->stopped || (port)->info->tty->hw_stopped)
+
+
+#if defined(__i386__) && (defined(CONFIG_M386) ||	\
+defined(CONFIG_M486))
+#define SNX_SERIAL_INLINE
+#endif
+
+#ifdef SNX_SERIAL_INLINE
+#define _INLINE_ inline
+#else
+#define _INLINE_
+#endif
+
+
+#define SNX_UPIO_PORT				(0)
+#define SNX_UPIO_MEM				(1)
+
+#define SNX_UPF_SAK				(1 << 2)
+#define SNX_UPF_SPD_MASK			(0x1030)
+#define SNX_UPF_SPD_HI				(0x0010)
+#define SNX_UPF_SPD_VHI				(0x0020)
+#define SNX_UPF_SPD_CUST			(0x0030)
+#define SNX_UPF_SPD_SHI				(0x1000)
+#define SNX_UPF_SPD_WARP			(0x1010)
+#define SNX_UPF_SKIP_TEST			(1 << 6)
+#define SNX_UPF_HARDPPS_CD		(1 << 11)
+#define SNX_UPF_LOW_LATENCY		(1 << 13)
+#define SNX_UPF_BUGGY_UART		(1 << 14)
+#define SNX_UPF_MAGIC_MULTIPLIER	(1 << 16)
+
+#define SNX_UPF_CHANGE_MASK		(0x17fff)
+#define SNX_UPF_USR_MASK	(SNX_UPF_SPD_MASK | SNX_UPF_LOW_LATENCY)
+
+
+#define SNX_UIF_CHECK_CD			(1 << 25)
+#define SNX_UIF_CTS_FLOW			(1 << 26)
+
+#define SNX_UIF_NORMAL_ACTIVE			(1 << 29)
+#define SNX_UIF_INITIALIZED			(1 << 31)
+
+
+#define SNX_ENABLE_MS(port, cflag)	\
+((port)->flags & SNX_UPF_HARDPPS_CD ||	\
+(cflag) & CRTSCTS || !((cflag) & CLOCAL))
+
+#define SNX_SER_DEVNUM(x)   ((x)->index)
+
+struct snx_ser_info;
+struct snx_ser_port;
+
+struct snx_ser_icount {
+	__u32	cts;
+	__u32	dsr;
+	__u32	rng;
+	__u32	dcd;
+	__u32	rx;
+	__u32	tx;
+	__u32	frame;
+	__u32	overrun;
+	__u32	parity;
+	__u32	brk;
+	__u32	buf_overrun;
+};
+
+
+struct snx_ser_info {
+	struct tty_struct		*tty;
+	struct circ_buf			xmit;
+	unsigned int			flags;
+	unsigned char			*tmpbuf;
+	struct semaphore		tmpbuf_sem;
+	int				blocked_open;
+	struct tasklet_struct	tlet;
+
+	wait_queue_head_t		open_wait;
+	wait_queue_head_t		delta_msr_wait;
+};
+
+
+struct snx_ser_driver {
+	struct module	*owner;
+	const char	*driver_name;
+	const char	*dev_name;
+	int		major;
+	int		minor;
+	int		nr;
+	struct snx_ser_state	*state;
+
+	struct tty_driver	*tty_driver;
+};
+
+
+struct snx_ser_port {
+	spinlock_t			lock;
+	unsigned int			iobase;
+	unsigned int			irq;
+	unsigned int			uartclk;
+	unsigned char			fifosize;
+	unsigned char			x_char;
+	unsigned char			iotype;
+
+	unsigned int			read_status_mask;
+	unsigned int			ignore_status_mask;
+	struct snx_ser_info		*info;
+	struct snx_ser_icount		icount;
+
+
+	unsigned int			flags;
+	unsigned int			mctrl;
+	unsigned int			timeout;
+	unsigned int			snx_type;
+	unsigned int			type;
+	unsigned int			custom_divisor;
+	unsigned int			line;
+
+
+	int				board_enum;
+	unsigned int			bus_number;
+	unsigned int			dev_number;
+	PCI_BOARD			pb_info;
+	unsigned int			vector;
+	unsigned int			vector_mask;
+	unsigned char			chip_flag;
+	unsigned int			port_flag;
+	unsigned int			baud_base;
+	int				rx_trigger;
+	unsigned char			ldisc_stop_rx;
+
+	unsigned int			setserial_flag;
+
+	int AHDC_State;
+	int RS422_State;
+
+	unsigned char			suspended;
+	struct device			*dev;
+};
+
+
+struct snx_ser_state {
+	struct tty_port			tport;
+
+	unsigned int			close_delay;
+	unsigned int			closing_wait;
+	int				count;
+	struct snx_ser_info	  	*info;
+	struct snx_ser_port		*port;
+	struct semaphore		sem;
+};
+
+
+static inline int snx_ser_handle_break(struct snx_ser_port *port)
+{
+	struct snx_ser_info *info = port->info;
+
+	if (info->flags & SNX_UPF_SAK)
+		do_SAK(info->tty);
+
+	return 0;
+}
+
+
+static inline void snx_ser_handle_dcd_change(struct snx_ser_port *port,
+unsigned int status)
+{
+	struct snx_ser_info *info = port->info;
+
+	port->icount.dcd++;
+
+	if (info->flags & SNX_UIF_CHECK_CD) {
+		if (status)
+			wake_up_interruptible(&info->open_wait);
+		else if (info->tty)
+			tty_hangup(info->tty);
+	}
+}
+
+
+#include <linux/tty_flip.h>
+
+static inline void snx_ser_insert_char
+(
+		struct snx_ser_port *port,
+		unsigned int status,
+		unsigned int overrun,
+		unsigned int ch,
+		unsigned int flag
+)
+{
+	struct snx_ser_info *info = port->info;
+	struct tty_struct *tty = info->tty;
+	struct snx_ser_state *state = NULL;
+	struct tty_port *tport = NULL;
+
+	state = tty->driver_data;
+
+	tport = &state->tport;
+
+	if ((status & port->ignore_status_mask & ~overrun) == 0) {
+
+		if (tty_insert_flip_char(tport, ch, flag) == 0)
+			++port->icount.buf_overrun;
+	}
+
+	if (status & ~port->ignore_status_mask & overrun) {
+
+		if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
+			++port->icount.buf_overrun;
+	}
+}
+
+struct sunix_ser_port {
+	struct snx_ser_port port;
+	struct timer_list	timer;
+	struct list_head	list;
+
+	unsigned int		capabilities;
+	unsigned char		ier;
+	unsigned char		lcr;
+	unsigned char		mcr;
+	unsigned char		mcr_mask;
+	unsigned char		mcr_force;
+	unsigned char		lsr_break_flag;
+};
+
+#define SNX_CONFIG_PARPORT_1284
+#define SNX_CONFIG_PARPORT_PC_FIFO
+
+#ifdef SNX_CONFIG_PARPORT_1284
+#undef SNX_CONFIG_PARPORT_1284
+#endif
+
+#ifdef SNX_CONFIG_PARPORT_PC_FIFO
+#undef SNX_CONFIG_PARPORT_PC_FIFO
+#endif
+
+#define SNX_PAR_PORT_MAX_UART	5
+#define SNX_PAR_PORT_UNKNOWN	0
+#define SNX_PAR_PORT_SUN1888	1
+#define SNX_PAR_PORT_SUN1689	2
+#define SNX_PAR_PORT_SUNMATX	3
+#define SNX_PAR_PORT_SUN1999    4
+
+#define SNX_ECR(p)	((p)->base_hi + 0x2)
+#define SNX_CFGB(p)	((p)->base_hi + 0x1)
+#define SNX_CFGA(p)	((p)->base_hi + 0x0)
+#define SNX_FIFO(p)	((p)->base_hi + 0x0)
+#define SNX_EPPDATA(p)	((p)->base    + 0x4)
+#define SNX_EPPADDR(p)	((p)->base    + 0x3)
+#define SNX_DCR(p)	((p)->base    + 0x2)
+#define SNX_DSR(p)	((p)->base    + 0x1)
+#define SNX_DATA(p)	((p)->base    + 0x0)
+
+#define SNX_ROUND_UP(x, y) (((x)+(y)-1)/(y))
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef PARPORT_W91284PIC
+#define PARPORT_W91284PIC (1 << 1)
+#endif
+
+#define SNX_PARPORT_INACTIVITY_O_NONBLOCK 1
+
+struct snx_parport;
+struct snx_pardevice;
+
+
+struct snx_parport_driver {
+	const char	*name;
+	void	(*attach)(struct snx_parport *port);
+	void	(*detach)(struct snx_parport *port);
+	struct list_head	list;
+};
+
+struct snx_pc_parport_state {
+	unsigned int ctr;
+	unsigned int ecr;
+};
+
+struct snx_parport_state {
+	union {
+		struct snx_pc_parport_state pc;
+		void *misc;
+	} u;
+};
+
+struct snx_parport_ops {
+	void	(*write_data)(struct snx_parport *p, unsigned char d);
+	unsigned char	(*read_data)(struct snx_parport *p);
+	void	(*write_control)(struct snx_parport *p, unsigned char ctl);
+	unsigned char	(*read_control)(struct snx_parport *p);
+	unsigned char	(*frob_control)(struct snx_parport *p,
+					unsigned char mask, unsigned char val);
+	unsigned char	(*read_status)(struct snx_parport *p);
+	void		(*enable_irq)(struct snx_parport *p);
+	void		(*disable_irq)(struct snx_parport *p);
+	void		(*data_forward)(struct snx_parport *p);
+	void		(*data_reverse)(struct snx_parport *p);
+	void		(*init_state)(struct snx_pardevice *d,
+						struct snx_parport_state *s);
+	void	(*save_state)(struct snx_parport *p,
+						struct snx_parport_state *s);
+	void	(*restore_state)(struct snx_parport *p,
+						struct snx_parport_state *s);
+
+	size_t	(*epp_write_data)(struct snx_parport *port,
+					const void *buf, size_t len, int flags);
+	size_t	(*epp_read_data)(struct snx_parport *port,
+					void *buf, size_t len, int flags);
+	size_t	(*epp_write_addr)(struct snx_parport *port,
+					const void *buf, size_t len, int flags);
+	size_t	(*epp_read_addr)(struct snx_parport *port,
+					void *buf, size_t len, int flags);
+	size_t	(*ecp_write_data)(struct snx_parport *port,
+					const void *buf, size_t len, int flags);
+	size_t	(*ecp_read_data)(struct snx_parport *port,
+					void *buf, size_t len, int flags);
+	size_t	(*ecp_write_addr)(struct snx_parport *port,
+					const void *buf, size_t len, int flags);
+
+	size_t	(*compat_write_data)(struct snx_parport *port,
+					const void *buf, size_t len, int flags);
+	size_t	(*nibble_read_data)(struct snx_parport *port,
+					void *buf, size_t len, int flags);
+	size_t	(*byte_read_data)(struct snx_parport *port,
+					void *buf, size_t len, int flags);
+	struct module	*owner;
+};
+
+
+struct snx_parport_device_info {
+	parport_device_class	class;
+	const char	*class_name;
+	const char	*mfr;
+	const char	*model;
+	const char	*cmdset;
+	const char	*description;
+};
+
+
+struct snx_pardevice {
+	const char		*name;
+	struct snx_parport	*port;
+
+	int			daisy;
+	int			(*preempt)(void *);
+	void			(*wakeup)(void *);
+	void			*private;
+	void			(*irq_func)(int, void *, struct pt_regs *);
+	unsigned int		flags;
+	struct snx_pardevice		*next;
+	struct snx_pardevice		*prev;
+	struct snx_parport_state	*state;
+
+	wait_queue_head_t		wait_q;
+	unsigned long int		time;
+	unsigned long int		timeslice;
+
+	volatile long int		timeout;
+
+	unsigned long			waiting;
+	struct snx_pardevice		*waitprev;
+	struct snx_pardevice		*waitnext;
+
+	void				*sysctl_table;
+};
+
+
+struct snx_parport {
+	unsigned long	base;
+	unsigned long	base_hi;
+	unsigned int	size;
+	const char	*name;
+	unsigned int	modes;
+	int		irq;
+	int		dma;
+	int		muxport;
+	int		portnum;
+
+	struct snx_parport	*physport;
+	struct snx_pardevice	*devices;
+	struct snx_pardevice	*cad;
+
+	int		daisy;
+	int		muxsel;
+
+	struct snx_pardevice	*waithead;
+	struct snx_pardevice	*waittail;
+
+	struct list_head	list;
+	struct timer_list	timer;
+	unsigned int		flags;
+	void				*sysctl_table;
+	struct snx_parport_device_info	probe_info[5];
+	struct ieee1284_info		ieee1284;
+	struct snx_parport_ops		*ops;
+	void	*private_data;
+	int		number;
+	spinlock_t		pardevice_lock;
+	spinlock_t		waitlist_lock;
+	rwlock_t		cad_lock;
+	int			spintime;
+	atomic_t		ref_count;
+	struct list_head	full_list;
+	struct snx_parport	*slaves[3];
+	struct snx_parport	*next;
+	dev_t	dev;
+	struct semaphore	sem;
+};
+
+
+struct sunix_par_port {
+	struct snx_parport	*port;
+
+	unsigned char		ctr;
+	unsigned char		ctr_writable;
+	int			ecr;
+	int			fifo_depth;
+	int			pword;
+	int			read_intr_threshold;
+	int			write_intr_threshold;
+
+	char			*dma_buf;
+	dma_addr_t		dma_handle;
+	struct list_head	list;
+
+	unsigned long		base;
+	unsigned long		base_hi;
+	int			irq;
+	int			portnum;
+	unsigned int		snx_type;
+
+	int			board_enum;
+	unsigned int		bus_number;
+	unsigned int		dev_number;
+
+	PCI_BOARD		pb_info;
+
+	unsigned char		chip_flag;
+	unsigned int		port_flag;
+};
+
+// snx_devtable.c
+extern PCI_BOARD snx_pci_board_conf[];
+
+// snx_ieee1284_ops.c
+extern size_t	sunix_parport_ieee1284_write_compat(
+struct snx_parport *port, const void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_read_nibble(
+struct snx_parport *port, void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_read_byte(
+struct snx_parport *port, void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_ecp_write_data(
+struct snx_parport *port, const void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_ecp_read_data(
+struct snx_parport *port, void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_ecp_write_addr(
+struct snx_parport *port, const void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_epp_write_data(
+struct snx_parport *port, const void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_epp_read_data(
+struct snx_parport *port, void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_epp_write_addr(
+struct snx_parport *port, const void *buffer, size_t len, int flags);
+extern size_t	sunix_parport_ieee1284_epp_read_addr(
+struct snx_parport *port, void *buffer, size_t len, int flags);
+
+// snx_ieee1284.c
+extern int	sunix_parport_wait_event(struct snx_parport *port,
+				signed long timeout);
+extern int		sunix_parport_poll_peripheral(struct snx_parport *port,
+unsigned char mask, unsigned char result, int usec);
+
+extern int	sunix_parport_wait_peripheral(struct snx_parport *port,
+	unsigned char mask, unsigned char result);
+
+extern int		sunix_parport_negotiate(struct snx_parport *port,
+					int mode);
+extern ssize_t	sunix_parport_write(struct snx_parport *port,
+					const void *buffer, size_t len);
+extern ssize_t	sunix_parport_read(struct snx_parport *port,
+					void *buffer, size_t len);
+extern long	sunix_parport_set_timeout(struct snx_pardevice *dev,
+					long inactivity);
+
+// snx_share.c
+extern int		sunix_parport_default_spintime;
+extern int	sunix_parport_register_driver(struct snx_parport_driver *drv);
+extern void	sunix_parport_unregister_driver(struct snx_parport_driver *drv);
+extern void	sunix_parport_put_port(struct snx_parport *port);
+extern void	sunix_parport_announce_port(struct snx_parport *port);
+extern void	sunix_parport_remove_port(struct snx_parport *port);
+extern void	sunix_parport_unregister_device(struct snx_pardevice *dev);
+extern int	sunix_parport_claim(struct snx_pardevice *dev);
+extern int	sunix_parport_claim_or_block(struct snx_pardevice *dev);
+extern void	sunix_parport_release(struct snx_pardevice *dev);
+extern struct snx_parport *sunix_parport_get_port(struct snx_parport *port);
+
+extern struct snx_parport *sunix_parport_register_port(
+struct sunix_par_port *priv,  struct snx_parport_ops *ops);
+
+extern struct snx_parport *sunix_parport_find_number(int number);
+extern struct snx_parport *sunix_parport_find_base(unsigned long base);
+extern struct snx_pardevice *sunix_parport_register_device(
+	struct snx_parport	*port,
+	const char			*name,
+	int		(*pf)(void *),
+	void	(*kf)(void *),
+	void	(*irq_func)(int, void *, struct pt_regs *),
+	int		flags,
+	void	*handle
+	);
+
+// snx_parallel.c
+extern int		sunix_par_parport_init(void);
+extern void		sunix_par_parport_exit(void);
+
+// snx_serial.c
+extern int		sunix_ser_register_ports(struct snx_ser_driver *drv);
+extern void		sunix_ser_unregister_ports(struct snx_ser_driver *drv);
+extern int		sunix_ser_register_driver(struct snx_ser_driver *drv);
+extern void		sunix_ser_unregister_driver(struct snx_ser_driver *drv);
+extern int		sunix_ser_interrupt(struct sunix_board *sb,
+struct sunix_ser_port *first_sp);
+extern void		snx_ser_change_speed(struct snx_ser_state *state,
+struct SNXTERMIOS *old_termios);
+
+// snx_ppdev.c
+extern int	sunix_par_ppdev_init(void);
+extern void	sunix_par_ppdev_exit(void);
+
+// snx_lp.c
+extern int	sunix_par_lp_init(void);
+extern void	sunix_par_lp_exit(void);
+
+// snx_main.c
+extern struct sunix_board	sunix_board_table[SNX_BOARDS_MAX];
+extern struct sunix_ser_port	sunix_ser_table[SNX_SER_TOTAL_MAX + 1];
+extern struct sunix_par_port	sunix_par_table[SNX_PAR_TOTAL_MAX];
+extern char snx_ser_ic_table[SNX_SER_PORT_MAX_UART][10];
+extern char snx_par_ic_table[SNX_PAR_PORT_MAX_UART][10];
+extern char snx_port_remap[2][10];
+
+extern int      snx_ser_startup(struct snx_ser_state *state, int init_hw);
+extern void     snx_ser_update_termios(struct snx_ser_state *state);
+
+
+#define sunix_parport_write_data(p, x)	sunix_parport_pc_write_data(p, x)
+#define sunix_parport_read_data(p)	sunix_parport_pc_read_data(p)
+#define sunix_parport_write_control(p, x)	\
+sunix_parport_pc_write_control(p, x)
+#define sunix_parport_read_control(p)	sunix_parport_pc_read_control(p)
+#define sunix_parport_frob_control(p, m, v)	\
+sunix_parport_pc_frob_control(p, m, v)
+#define sunix_parport_read_status(p)	\
+sunix_parport_pc_read_status(p)
+#define sunix_parport_enable_irq(p)	sunix_parport_pc_enable_irq(p)
+#define sunix_parport_disable_irq(p)	sunix_parport_pc_disable_irq(p)
+#define sunix_parport_data_forward(p)	sunix_parport_pc_data_forward(p)
+#define sunix_parport_data_reverse(p)	sunix_parport_pc_data_reverse(p)
+
+
+static inline void sunix_parport_pc_write_data(struct snx_parport *p,
+unsigned char d)
+{
+	outb(d, SNX_DATA(p));
+}
+
+static inline unsigned char sunix_parport_pc_read_data(struct snx_parport *p)
+{
+	unsigned char val = inb(SNX_DATA(p));
+
+	return val;
+}
+
+static inline unsigned char __sunix_parport_pc_frob_control(
+struct snx_parport *p, unsigned char mask, unsigned char val)
+{
+	struct sunix_par_port *priv = p->physport->private_data;
+	unsigned char ctr = priv->ctr;
+
+	ctr = (ctr & ~mask) ^ val;
+	ctr &= priv->ctr_writable;
+	outb(ctr, SNX_DCR(p));
+	priv->ctr = ctr;
+	return ctr;
+}
+
+static inline void sunix_parport_pc_data_reverse(struct snx_parport *p)
+{
+	__sunix_parport_pc_frob_control(p, 0x20, 0x20);
+}
+
+
+static inline void sunix_parport_pc_data_forward(struct snx_parport *p)
+{
+	__sunix_parport_pc_frob_control(p, 0x20, 0x00);
+}
+
+static inline void sunix_parport_pc_write_control(struct snx_parport *p,
+unsigned char d)
+{
+	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+							PARPORT_CONTROL_AUTOFD |
+							PARPORT_CONTROL_INIT |
+							PARPORT_CONTROL_SELECT);
+
+	if (d & 0x20)
+		sunix_parport_pc_data_reverse(p);
+
+
+	__sunix_parport_pc_frob_control(p, wm, d & wm);
+}
+
+
+static inline unsigned char sunix_parport_pc_read_control(struct snx_parport *p)
+{
+	const unsigned char rm = (PARPORT_CONTROL_STROBE |
+							PARPORT_CONTROL_AUTOFD |
+							PARPORT_CONTROL_INIT |
+							PARPORT_CONTROL_SELECT);
+
+	const struct sunix_par_port *priv = p->physport->private_data;
+
+	return priv->ctr & rm;
+}
+
+
+static inline unsigned char sunix_parport_pc_frob_control(
+struct snx_parport *p, unsigned char mask, unsigned char val)
+{
+	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+							PARPORT_CONTROL_AUTOFD |
+							PARPORT_CONTROL_INIT |
+							PARPORT_CONTROL_SELECT);
+
+	if (mask & 0x20) {
+		if (val & 0x20)
+			sunix_parport_pc_data_reverse(p);
+		else
+			sunix_parport_pc_data_forward(p);
+
+	}
+
+	mask &= wm;
+	val &= wm;
+
+	return __sunix_parport_pc_frob_control(p, mask, val);
+}
+
+
+static inline unsigned char sunix_parport_pc_read_status(struct snx_parport *p)
+{
+	return inb(SNX_DSR(p));
+}
+
+
+static inline void sunix_parport_pc_disable_irq(struct snx_parport *p)
+{
+	__sunix_parport_pc_frob_control(p, 0x10, 0x00);
+}
+
+
+static inline void sunix_parport_pc_enable_irq(struct snx_parport *p)
+{
+	__sunix_parport_pc_frob_control(p, 0x10, 0x10);
+}
+
+
+static inline int sunix_parport_yield_blocking(struct snx_pardevice *dev)
+{
+	unsigned long int timeslip = (jiffies - dev->time);
+
+	if ((dev->port->waithead == NULL) || (timeslip < dev->timeslice))
+		return 0;
+
+
+	sunix_parport_release(dev);
+	return sunix_parport_claim_or_block(dev);
+}
+
diff --git a/char/snx/snx_lp.h b/char/snx/snx_lp.h
new file mode 100644
index 00000000..8c48deea
--- /dev/null
+++ b/char/snx/snx_lp.h
@@ -0,0 +1,126 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_SNX_LP_H
+#define _LINUX_SNX_LP_H
+
+#define SNX_LP_EXIST		0x0001
+#define SNX_LP_SELEC		0x0002
+#define SNX_LP_BUSY		0x0004
+#define SNX_LP_BUSY_BIT_POS	2
+#define SNX_LP_OFFL		0x0008
+#define SNX_LP_NOPA		0x0010
+#define SNX_LP_ERR		0x0020
+#define SNX_LP_ABORT		0x0040
+#define SNX_LP_CAREFUL		0x0080
+#define SNX_LP_ABORTOPEN	0x0100
+
+#define SNX_LP_TRUST_IRQ_	0x0200
+#define SNX_LP_NO_REVERSE	0x0400
+#define SNX_LP_DATA_AVAIL	0x0800
+
+#define SNX_LP_PBUSY		0x80
+#define SNX_LP_PACK		0x40
+#define SNX_LP_POUTPA		0x20
+#define SNX_LP_PSELECD		0x10
+#define SNX_LP_PERRORP		0x08
+
+#define SNX_LP_INIT_CHAR	1000
+#define SNX_LP_INIT_WAIT	1
+#define SNX_LP_INIT_TIME	2
+
+#define SNX_LPCHAR		0x0601
+#define SNX_LPTIME		0x0602
+#define SNX_LPABORT		0x0604
+#define SNX_LPSETIRQ		0x0605
+#define SNX_LPGETIRQ		0x0606
+#define SNX_LPWAIT		0x0608
+
+#define SNX_LPCAREFUL		0x0609
+#define SNX_LPABORTOPEN	0x060a
+#define SNX_LPGETSTATUS	0x060b
+#define SNX_LPRESET		0x060c
+
+#ifdef SNX_LP_STATS
+#define SNX_LPGETSTATS		0x060d
+#endif
+
+#define SNX_LPGETFLAGS		0x060e
+#define SNX_LPSETTIMEOUT	0x060f
+
+
+#define SNX_LP_TIMEOUT_INTERRUPT	(60 * HZ)
+#define SNX_LP_TIMEOUT_POLLED		(10 * HZ)
+
+#define __KERNEL__	1
+
+#ifdef __KERNEL__
+
+#include <linux/mutex.h>
+
+#define SNX_LP_PARPORT_UNSPEC	-4
+#define SNX_LP_PARPORT_AUTO	-3
+#define SNX_LP_PARPORT_OFF	-2
+#define SNX_LP_PARPORT_NONE	-1
+
+#define SNX_LP_F(minor)	snx_lp_table[(minor)].flags
+#define SNX_LP_CHAR(minor)	snx_lp_table[(minor)].chars
+#define SNX_LP_TIME(minor)	snx_lp_table[(minor)].time
+#define SNX_LP_WAIT(minor)	snx_lp_table[(minor)].wait
+#define SNX_LP_IRQ(minor)	snx_lp_table[(minor)].dev->port->irq
+
+#ifdef SNX_LP_STATS
+#define SNX_LP_STAT(minor)		snx_lp_table[(minor)].stats
+#endif
+#define SNX_LP_BUFFER_SIZE PAGE_SIZE
+
+#define SNX_LP_BASE(x)			snx_lp_table[(x)].dev->port->base
+
+#ifdef SNX_LP_STATS
+struct snx_lp_stats {
+	unsigned long	chars;
+	unsigned long	sleeps;
+	unsigned int	maxrun;
+	unsigned int	maxwait;
+	unsigned int	meanwait;
+	unsigned int	mdev;
+};
+#endif
+
+struct snx_lp_struct {
+	struct snx_pardevice	*dev;
+	unsigned long		flags;
+	unsigned int		chars;
+	unsigned int		time;
+	unsigned int		wait;
+	char			*lp_buffer;
+
+#ifdef SNX_LP_STATS
+	unsigned int		lastcall;
+	unsigned int		runchars;
+	struct snx_lp_stats	stats;
+#endif
+
+	wait_queue_head_t	waitq;
+
+	unsigned int		last_error;
+	struct mutex		port_mutex;
+
+	wait_queue_head_t	dataq;
+
+	long			timeout;
+	unsigned int		best_mode;
+	unsigned int		current_mode;
+	unsigned long		bits;
+};
+
+
+#define SNX_LP_PINTEN		0x10
+#define SNX_LP_PSELECP		0x08
+#define SNX_LP_PINITP		0x04
+#define SNX_LP_PAUTOLF		0x02
+#define SNX_LP_PSTROBE		0x01
+#define SNX_LP_DUMMY		0x00
+#define SNX_LP_DELAY		50
+
+#endif
+#endif
+
diff --git a/char/snx/snx_ppdev.h b/char/snx/snx_ppdev.h
new file mode 100644
index 00000000..635f99e1
--- /dev/null
+++ b/char/snx/snx_ppdev.h
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include "snx_common.h"
+
+#define SNX_PP_IOCTL	'p'
+
+struct snx_ppdev_frob_struct {
+	unsigned char mask;
+	unsigned char val;
+};
+
+
+#define SNX_PPSETMODE		_IOW(SNX_PP_IOCTL, 0x80, int)
+#define SNX_PPRSTATUS		_IOR(SNX_PP_IOCTL, 0x81, unsigned char)
+#define SNX_PPRCONTROL		_IOR(SNX_PP_IOCTL, 0x83, unsigned char)
+#define SNX_PPWCONTROL		_IOW(SNX_PP_IOCTL, 0x84, unsigned char)
+#define SNX_PPFCONTROL		_IOW(SNX_PP_IOCTL, 0x8e,\
+struct snx_ppdev_frob_struct)
+#define SNX_PPRDATA		_IOR(SNX_PP_IOCTL, 0x85, unsigned char)
+#define SNX_PPWDATA		_IOW(SNX_PP_IOCTL, 0x86, unsigned char)
+#define SNX_PPCLAIM		_IO(SNX_PP_IOCTL, 0x8b)
+#define SNX_PPRELEASE		_IO(SNX_PP_IOCTL, 0x8c)
+#define SNX_PPYIELD		_IO(SNX_PP_IOCTL, 0x8d)
+#define SNX_PPEXCL		_IO(SNX_PP_IOCTL, 0x8f)
+#define SNX_PPDATADIR		_IOW(SNX_PP_IOCTL, 0x90, int)
+#define SNX_PPNEGOT		_IOW(SNX_PP_IOCTL, 0x91, int)
+#define SNX_PPWCTLONIRQ		_IOW(SNX_PP_IOCTL, 0x92, unsigned char)
+#define SNX_PPCLRIRQ		_IOR(SNX_PP_IOCTL, 0x93, int)
+#define SNX_PPSETPHASE		_IOW(SNX_PP_IOCTL, 0x94, int)
+#define SNX_PPGETTIME		_IOR(SNX_PP_IOCTL, 0x95, struct timeval)
+#define SNX_PPSETTIME		_IOW(SNX_PP_IOCTL, 0x96, struct timeval)
+#define SNX_PPGETMODES		_IOR(SNX_PP_IOCTL, 0x97, unsigned int)
+#define SNX_PPGETMODE		_IOR(SNX_PP_IOCTL, 0x98, int)
+#define SNX_PPGETPHASE		_IOR(SNX_PP_IOCTL, 0x99, int)
+#define SNX_PPGETFLAGS		_IOR(SNX_PP_IOCTL, 0x9a, int)
+#define SNX_PPSETFLAGS		_IOW(SNX_PP_IOCTL, 0x9b, int)
+
+#define SNX_PP_FASTWRITE	(1<<2)
+#define SNX_PP_FASTREAD		(1<<3)
+#define SNX_PP_W91284PIC	(1<<4)
+
+#define SNX_PP_FLAGMASK		(SNX_PP_FASTWRITE | SNX_PP_FASTREAD \
+							| SNX_PP_W91284PIC)
+
--
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/4] Add header file,Kconfig and Makefile
  2019-03-08 12:35 [PATCH 3/4] Add header file,Kconfig and Makefile Morris Ku
@ 2019-03-08 20:54 ` Enrico Weigelt, metux IT consult
  2019-03-09  3:15 ` Randy Dunlap
  1 sibling, 0 replies; 4+ messages in thread
From: Enrico Weigelt, metux IT consult @ 2019-03-08 20:54 UTC (permalink / raw)
  To: Morris Ku, gregkh; +Cc: morris_ku, linux-kernel, arnd

On 08.03.19 13:35, Morris Ku wrote:
> This patch add header file, Kconfig and Makefile. 
> 
> Signed-off-by: Morris Ku <saumah@gmail.com>
> ---
>  char/snx/Kconfig       |   15 +
>  char/snx/Makefile      |    9 +
>  char/snx/driver_extd.h |  170 ++++++
>  char/snx/snx_common.h  | 1157 ++++++++++++++++++++++++++++++++++++++++
>  char/snx/snx_lp.h      |  126 +++++
>  char/snx/snx_ppdev.h   |   43 ++

why isn't that in ./drivers/tty/serial/sunix/ ?

<snip>

> diff --git a/char/snx/Kconfig b/char/snx/Kconfig
> new file mode 100644
> index 00000000..86f38352
> --- /dev/null
> +++ b/char/snx/Kconfig
> @@ -0,0 +1,15 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# Character device configuration
> +#
> +
> +config SNX

please use full name: SUNIX

<snip>

> diff --git a/char/snx/driver_extd.h b/char/snx/driver_extd.h
> new file mode 100644
> index 00000000..27f69570
> --- /dev/null
> +++ b/char/snx/driver_extd.h
> @@ -0,0 +1,170 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +
> +#ifndef _SNXHW_DRVR_EXTR_H_
> +#define _SNXHW_DRVR_EXTR_H_
> +
> +#ifndef SNX_IOCTL
> +#define SNX_IOCTL 0x900
> +#endif
> +
> +#define SNX_COMM_GET_BOARD_CNT          (SNX_IOCTL + 100)
> +#define SNX_COMM_GET_BOARD_INFO         (SNX_IOCTL + 101)
> +
> +#define SNX_GPIO_GET                    (SNX_IOCTL + 200)
> +#define SNX_GPIO_SET                    (SNX_IOCTL + 201)
> +#define SNX_GPIO_READ                   (SNX_IOCTL + 202)
> +#define SNX_GPIO_WRITE                  (SNX_IOCTL + 203)
> +#define SNX_GPIO_SET_DEFAULT            (SNX_IOCTL + 204)
> +#define SNX_GPIO_WRITE_DEFAULT          (SNX_IOCTL + 205)
> +#define SNX_GPIO_GET_INPUT_INVERT       (SNX_IOCTL + 206)
> +#define SNX_GPIO_SET_INPUT_INVERT       (SNX_IOCTL + 207)
> +
> +#define SNX_UART_GET_TYPE               (SNX_IOCTL + 300)
> +#define SNX_UART_SET_TYPE               (SNX_IOCTL + 301)
> +#define SNX_UART_GET_ACS                (SNX_IOCTL + 302)
> +#define SNX_UART_SET_ACS                (SNX_IOCTL + 303)

why exactly do you introduce driver-specific ioctls ?
what is "ACS"

> +#define SNX_GPIO_IN               0
> +#define SNX_GPIO_OUT              1
> +#define SNX_GPIO_LOW              0
> +#define SNX_GPIO_HI               1
> +#define SNX_GPIO_INPUT_INVERT_D   0
> +#define SNX_GPIO_INPUT_INVERT_E   1

GPIO stuff belongs into the gpio subsystem. see drivers/gpio/

<snip>

> diff --git a/char/snx/snx_common.h b/char/snx/snx_common.h
> new file mode 100644
> index 00000000..16dd8f02
> --- /dev/null
> +++ b/char/snx/snx_common.h
> @@ -0,0 +1,1157 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#ifdef	MODVERSIONS
> +#ifndef MODULE
> +#define	MODULE
> +#endif
> +#endif

dont need that. please drop it.

<snip>

> +#ifndef KERNEL_VERSION
> +#define KERNEL_VERSION(ver, rel, seq)	((ver << 16) | (rel << 8) | seq)
> +#endif

same here.

> +#include <linux/errno.h>
> +#include <linux/signal.h>
> +#include <linux/tty.h>
> +#include <linux/tty_flip.h>
> +#include <linux/serial.h>
> +#include <linux/serial_reg.h>
> +#include <linux/ioport.h>
> +#include <linux/mm.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/wait.h>
> +#include <linux/tty_driver.h>
> +#include <linux/pci.h>
> +#include <linux/circ_buf.h>
> +#include <asm/uaccess.h>
> +#include <asm/io.h>
> +#include <asm/irq.h>
> +#include <asm/segment.h>
> +#include <asm/serial.h>
> +#include <linux/interrupt.h>
> +#include <linux/module.h>
> +#include <linux/workqueue.h>
> +#include <linux/moduleparam.h>
> +#include <linux/console.h>
> +#include <linux/sysrq.h>
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +#include <linux/kref.h>
> +#include <linux/parport.h>
> +#include <linux/ctype.h>
> +#include <linux/poll.h>
> +#include <linux/sched.h>
> +#include <linux/serial_8250.h>
> +#include <linux/cdev.h>
> +#include <linux/sched/signal.h>

are these really all needed within the header ?

> +extern int snx_board_count;

Why that extern field ?

> +#define SNX_DRIVER_VERSION	"V2.0.4.5"
> +#define SNX_DRIVER_AUTHOR	"SUNIX Co., Ltd.<info@sunix.com.tw>"
> +#define SNX_DRIVER_DESC	"SUNIX Multi-I/O Board Driver Module"

Does it need to be in here ? (see MODULE_*() macros)

<snip>

> +typedef struct _PORT {
> +	char		type;
> +
> +	int		bar1;
> +	unsigned char	offset1;
> +	unsigned char	length1;
> +
> +	int		bar2;
> +	unsigned char	offset2;
> +	unsigned char	length2;
> +
> +	unsigned int	intmask;
> +	unsigned int	chip_flag;
> +
> +} PORT;

please no uppercase type names, and use proper prefix.

> +#if defined(__i386__) && (defined(CONFIG_M386) ||	\
> +defined(CONFIG_M486))
> +#define SNX_SERIAL_INLINE
> +#endif
> +
> +#ifdef SNX_SERIAL_INLINE
> +#define _INLINE_ inline
> +#else
> +#define _INLINE_
> +#endif

what is that for ?!

> +struct snx_ser_driver {
> +	struct module	*owner;
> +	const char	*driver_name;
> +	const char	*dev_name;
> +	int		major;
> +	int		minor;
> +	int		nr;
> +	struct snx_ser_state	*state;
> +	struct tty_driver	*tty_driver;
> +};

oh, not good. the struct tty_driver should be contained in
snx_ser_driver (not a pointer to it). or the other way round:
give the tty driver a pointer to a driver-private struct.

and this data looks as it should be assigned to individual
devices, not to driver globally.

> +#include <linux/tty_flip.h>

put all includes together at the top


> +static inline void snx_ser_insert_char
> +(
> +		struct snx_ser_port *port,
> +		unsigned int status,
> +		unsigned int overrun,
> +		unsigned int ch,
> +		unsigned int flag
> +)
> +{
> +	struct snx_ser_info *info = port->info;
> +	struct tty_struct *tty = info->tty;
> +	struct snx_ser_state *state = NULL;
> +	struct tty_port *tport = NULL;
> +
> +	state = tty->driver_data;
> +
> +	tport = &state->tport;
> +
> +	if ((status & port->ignore_status_mask & ~overrun) == 0) {
> +
> +		if (tty_insert_flip_char(tport, ch, flag) == 0)
> +			++port->icount.buf_overrun;
> +	}
> +
> +	if (status & ~port->ignore_status_mask & overrun) {
> +
> +		if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
> +			++port->icount.buf_overrun;
> +	}
> +}

too big for an inline function.


> +#define SNX_CONFIG_PARPORT_1284
> +#define SNX_CONFIG_PARPORT_PC_FIFO
> +
> +#ifdef SNX_CONFIG_PARPORT_1284
> +#undef SNX_CONFIG_PARPORT_1284
> +#endif
> +
> +#ifdef SNX_CONFIG_PARPORT_PC_FIFO
> +#undef SNX_CONFIG_PARPORT_PC_FIFO
> +#endif

parport, serial port, gpio should be separate drivers.

> +struct snx_parport_ops {

Why does the driver introduce its own callback vectors ?
> +
> +struct sunix_par_port {
> +	struct snx_parport	*port;
> +
> +	unsigned char		ctr;
> +	unsigned char		ctr_writable;
> +	int			ecr;
> +	int			fifo_depth;
> +	int			pword;
> +	int			read_intr_threshold;
> +	int			write_intr_threshold;
> +
> +	char			*dma_buf;

why not void * ?

> +	dma_addr_t		dma_handle;
> +	struct list_head	list;
> +
> +	unsigned long		base;
> +	unsigned long		base_hi;
> +	int			irq;
> +	int			portnum;
> +	unsigned int		snx_type;
> +
> +	int			board_enum;
> +	unsigned int		bus_number;
> +	unsigned int		dev_number;
> +
> +	PCI_BOARD		pb_info;
> +
> +	unsigned char		chip_flag;
> +	unsigned int		port_flag;
> +};
> +
> +// snx_devtable.c
> +extern PCI_BOARD snx_pci_board_conf[];
<snip>

why all these extern functions ?

<snip>

> +extern char snx_ser_ic_table[SNX_SER_PORT_MAX_UART][10];
> +extern char snx_par_ic_table[SNX_PAR_PORT_MAX_UART][10];
> +extern char snx_port_remap[2][10];

please try not to use global fields. these things look they belong into
the corresponding device private data structs.

> +#define sunix_parport_write_data(p, x)	sunix_parport_pc_write_data(p, x)
> +#define sunix_parport_read_data(p)	sunix_parport_pc_read_data(p)
> +#define sunix_parport_write_control(p, x)	\
> +sunix_parport_pc_write_control(p, x)
> +#define sunix_parport_read_control(p)	sunix_parport_pc_read_control(p)
> +#define sunix_parport_frob_control(p, m, v)	\
> +sunix_parport_pc_frob_control(p, m, v)
> +#define sunix_parport_read_status(p)	\
> +sunix_parport_pc_read_status(p)
> +#define sunix_parport_enable_irq(p)	sunix_parport_pc_enable_irq(p)
> +#define sunix_parport_disable_irq(p)	sunix_parport_pc_disable_irq(p)
> +#define sunix_parport_data_forward(p)	sunix_parport_pc_data_forward(p)
> +#define sunix_parport_data_reverse(p)	sunix_parport_pc_data_reverse(p)

does that really need to be in a header file ?

<snip>

> +static inline unsigned char sunix_parport_pc_frob_control(
> +struct snx_parport *p, unsigned char mask, unsigned char val)
> +{
> +	const unsigned char wm = (PARPORT_CONTROL_STROBE |
> +							PARPORT_CONTROL_AUTOFD |
> +							PARPORT_CONTROL_INIT |
> +							PARPORT_CONTROL_SELECT);
> +
> +	if (mask & 0x20) {
> +		if (val & 0x20)
> +			sunix_parport_pc_data_reverse(p);
> +		else
> +			sunix_parport_pc_data_forward(p);
> +
> +	}
> +
> +	mask &= wm;
> +	val &= wm;
> +
> +	return __sunix_parport_pc_frob_control(p, mask, val);
> +}

do these functions really *need* to be in the header and static inline ?
(IOW: are they really needed from multiple .c files ?)

> diff --git a/char/snx/snx_lp.h b/char/snx/snx_lp.h
> new file mode 100644
> index 00000000..8c48deea
> --- /dev/null
> +++ b/char/snx/snx_lp.h

<snip>

> +#define __KERNEL__	1
> +
> +#ifdef __KERNEL__

doesn't belong here. drop that.

> +
> +#include <linux/mutex.h>

put this at the top. if it's really needed here.

> diff --git a/char/snx/snx_ppdev.h b/char/snx/snx_ppdev.h
> new file mode 100644
> index 00000000..635f99e1
> --- /dev/null
> +++ b/char/snx/snx_ppdev.h
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#include "snx_common.h"
> +
> +#define SNX_PP_IOCTL	'p'
> +
> +struct snx_ppdev_frob_struct {
> +	unsigned char mask;
> +	unsigned char val;
> +};
> +
> +
> +#define SNX_PPSETMODE		_IOW(SNX_PP_IOCTL, 0x80, int)
> +#define SNX_PPRSTATUS		_IOR(SNX_PP_IOCTL, 0x81, unsigned char)
> +#define SNX_PPRCONTROL		_IOR(SNX_PP_IOCTL, 0x83, unsigned char)
> +#define SNX_PPWCONTROL		_IOW(SNX_PP_IOCTL, 0x84, unsigned char)
> +#define SNX_PPFCONTROL		_IOW(SNX_PP_IOCTL, 0x8e,\
> +struct snx_ppdev_frob_struct)
> +#define SNX_PPRDATA		_IOR(SNX_PP_IOCTL, 0x85, unsigned char)
> +#define SNX_PPWDATA		_IOW(SNX_PP_IOCTL, 0x86, unsigned char)
> +#define SNX_PPCLAIM		_IO(SNX_PP_IOCTL, 0x8b)
> +#define SNX_PPRELEASE		_IO(SNX_PP_IOCTL, 0x8c)
> +#define SNX_PPYIELD		_IO(SNX_PP_IOCTL, 0x8d)
> +#define SNX_PPEXCL		_IO(SNX_PP_IOCTL, 0x8f)
> +#define SNX_PPDATADIR		_IOW(SNX_PP_IOCTL, 0x90, int)
> +#define SNX_PPNEGOT		_IOW(SNX_PP_IOCTL, 0x91, int)
> +#define SNX_PPWCTLONIRQ		_IOW(SNX_PP_IOCTL, 0x92, unsigned char)
> +#define SNX_PPCLRIRQ		_IOR(SNX_PP_IOCTL, 0x93, int)
> +#define SNX_PPSETPHASE		_IOW(SNX_PP_IOCTL, 0x94, int)
> +#define SNX_PPGETTIME		_IOR(SNX_PP_IOCTL, 0x95, struct timeval)
> +#define SNX_PPSETTIME		_IOW(SNX_PP_IOCTL, 0x96, struct timeval)
> +#define SNX_PPGETMODES		_IOR(SNX_PP_IOCTL, 0x97, unsigned int)
> +#define SNX_PPGETMODE		_IOR(SNX_PP_IOCTL, 0x98, int)
> +#define SNX_PPGETPHASE		_IOR(SNX_PP_IOCTL, 0x99, int)
> +#define SNX_PPGETFLAGS		_IOR(SNX_PP_IOCTL, 0x9a, int)
> +#define SNX_PPSETFLAGS		_IOW(SNX_PP_IOCTL, 0x9b, int)
> +
> +#define SNX_PP_FASTWRITE	(1<<2)
> +#define SNX_PP_FASTREAD		(1<<3)
> +#define SNX_PP_W91284PIC	(1<<4)
> +
> +#define SNX_PP_FLAGMASK		(SNX_PP_FASTWRITE | SNX_PP_FASTREAD \

what exactly are these needed for ?


--mtx

-- 
Enrico Weigelt, metux IT consult
Free software and Linux embedded engineering
info@metux.net -- +49-151-27565287

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/4] Add header file,Kconfig and Makefile
  2019-03-08 12:35 [PATCH 3/4] Add header file,Kconfig and Makefile Morris Ku
  2019-03-08 20:54 ` Enrico Weigelt, metux IT consult
@ 2019-03-09  3:15 ` Randy Dunlap
       [not found]   ` <HK2PR03MB45297EB467A0A7550CCBB94795480@HK2PR03MB4529.apcprd03.prod.outlook.com>
  1 sibling, 1 reply; 4+ messages in thread
From: Randy Dunlap @ 2019-03-09  3:15 UTC (permalink / raw)
  To: Morris Ku, gregkh; +Cc: morris_ku, linux-kernel, arnd

On 3/8/19 4:35 AM, Morris Ku wrote:
> This patch add header file, Kconfig and Makefile. 
> 
> Signed-off-by: Morris Ku <saumah@gmail.com>
> ---

> diff --git a/char/snx/Kconfig b/char/snx/Kconfig
> new file mode 100644
> index 00000000..86f38352
> --- /dev/null
> +++ b/char/snx/Kconfig
> @@ -0,0 +1,15 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# Character device configuration
> +#
> +
> +config SNX
> +	tristate "SUNIX Multi-IO Board Drvier"

	                               Driver

> +	Driver for SUNIX Multi-I/O Board device driver Based on
> +	drivers/char/serial.c, parport_pc.c, ppdev.c and lp.c by Linus
> +	Torvalds, Theodore Ts'o.

kconfig does not like those 3 lines above.  That indicates some lack of
testing.

They could be put under "help", but they really should just be deleted or
moved to some source file if you think that they are needed.

> +	help
> +	   Say Y here if you have a SUNIX Multi-IO card.

Indent with tab + 2 spaces, not 3 spaces.

> +
> +	  To compile this driver as a module, choose M here: the
> +	  module will be called snx.


-- 
~Randy

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/4] Add header file,Kconfig and Makefile
       [not found]   ` <HK2PR03MB45297EB467A0A7550CCBB94795480@HK2PR03MB4529.apcprd03.prod.outlook.com>
@ 2019-03-11  3:52     ` Randy Dunlap
  0 siblings, 0 replies; 4+ messages in thread
From: Randy Dunlap @ 2019-03-11  3:52 UTC (permalink / raw)
  To: Morris Ku 古文俊, Morris Ku, gregkh; +Cc: linux-kernel, arnd

On 3/10/19 8:25 PM, Morris Ku 古文俊 wrote:
> Hi,
> 
>> This patch add header file, Kconfig and Makefile. 
>> 
>> Signed-off-by: Morris Ku <saumah@gmail.com>
>> ---
> ok , I'll delete Kconfig  in next version.

Hi,
Please just send plain text emails -- no html.

vger.kernel.org (the mailing list server) ignores emails
that contain html.

thanks.
-- 
~Randy

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-03-11  3:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-08 12:35 [PATCH 3/4] Add header file,Kconfig and Makefile Morris Ku
2019-03-08 20:54 ` Enrico Weigelt, metux IT consult
2019-03-09  3:15 ` Randy Dunlap
     [not found]   ` <HK2PR03MB45297EB467A0A7550CCBB94795480@HK2PR03MB4529.apcprd03.prod.outlook.com>
2019-03-11  3:52     ` Randy Dunlap

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).