/**
@verbatim

Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.

	ADDI-DATA GmbH
	Dieselstrasse 3
	D-77833 Ottersweier
	Tel: +19(0)7223/9493-0
	Fax: +49(0)7223/9493-92
	http://www.addi-data.com
	info@addi-data.com

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

You should also find the complete GPL in the COPYING file accompanying this source code.

@endverbatim
*/
/*

  +-----------------------------------------------------------------------+
  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
  +-----------------------------------------------------------------------+
  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
  +-----------------------------------------------------------------------+
  | Project     : API APCI1648    | Compiler : gcc                        |
  | Module name : TTL.C           | Version  : 2.96                       |
  +-------------------------------+---------------------------------------+
  | Project manager: S. Weber     | Date     :  25/05/2005                |
  +-----------------------------------------------------------------------+
  | Description :   APCI-16XX TTL I/O module                              |
  |                                                                       |
  |                                                                       |
  +-----------------------------------------------------------------------+
  |                             UPDATES                                   |
  +-----------------------------------------------------------------------+
  |   Date   |   Author  |          Description of updates                |
  +----------+-----------+------------------------------------------------+
  |25.05.2005| S.Weber   | Creation                                       |
  |          |           |                                                |
  +-----------------------------------------------------------------------+
*/

/*
+----------------------------------------------------------------------------+
|                               Included files                               |
+----------------------------------------------------------------------------+
*/

#include "hwdrv_apci16xx.h"

/*
+----------------------------------------------------------------------------+
| Function Name     : int   i_APCI16XX_InsnConfigInitTTLIO                   |
|                          (struct comedi_device    *dev,                           |
|                           struct comedi_subdevice *s,                             |
|                           struct comedi_insn      *insn,                          |
|                           unsigned int         *data)                          |
+----------------------------------------------------------------------------+
| Task           APCI16XX_TTL_INIT (using defaults)   :                      |
|                Configure the TTL I/O operating mode from all ports         |
|                You must calling this function be                           |
|                for you call any other function witch access of TTL.        |
|                APCI16XX_TTL_INITDIRECTION(user inputs for direction)       |
+----------------------------------------------------------------------------+
| Input Parameters  : b_InitType    = (unsigned char) data[0];                        |
|                     b_Port0Mode   = (unsigned char) data[1];                        |
|                     b_Port1Mode   = (unsigned char) data[2];                        |
|                     b_Port2Mode   = (unsigned char) data[3];                        |
|                     b_Port3Mode   = (unsigned char) data[4];                        |
|                     ........                                               |
+----------------------------------------------------------------------------+
| Output Parameters : -                                                      |
+----------------------------------------------------------------------------+
| Return Value      :>0: No error                                            |
|                    -1: Port 0 mode selection is wrong                      |
|                    -2: Port 1 mode selection is wrong                      |
|                    -3: Port 2 mode selection is wrong                      |
|                    -4: Port 3 mode selection is wrong                      |
|                    -X: Port X-1 mode selection is wrong                    |
|                    ....                                                    |
|                    -100 : Config command error                             |
|                    -101 : Data size error                                  |
+----------------------------------------------------------------------------+
*/

int i_APCI16XX_InsnConfigInitTTLIO(struct comedi_device *dev,
	struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
	int i_ReturnValue = insn->n;
	unsigned char b_Command = 0;
	unsigned char b_Cpt = 0;
	unsigned char b_NumberOfPort =
		(unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);

	/************************/
	/* Test the buffer size */
	/************************/

	if (insn->n >= 1) {
	   /*******************/
		/* Get the command */
		/* **************** */

		b_Command = (unsigned char) data[0];

	   /********************/
		/* Test the command */
	   /********************/

		if ((b_Command == APCI16XX_TTL_INIT) ||
			(b_Command == APCI16XX_TTL_INITDIRECTION) ||
			(b_Command == APCI16XX_TTL_OUTPUTMEMORY)) {
	      /***************************************/
			/* Test the initialisation buffer size */
	      /***************************************/

			if ((b_Command == APCI16XX_TTL_INITDIRECTION)
				&& ((unsigned char) (insn->n - 1) != b_NumberOfPort)) {
		 /*******************/
				/* Data size error */
		 /*******************/

				printk("\nBuffer size error");
				i_ReturnValue = -101;
			}

			if ((b_Command == APCI16XX_TTL_OUTPUTMEMORY)
				&& ((unsigned char) (insn->n) != 2)) {
		 /*******************/
				/* Data size error */
		 /*******************/

				printk("\nBuffer size error");
				i_ReturnValue = -101;
			}
		} else {
	      /************************/
			/* Config command error */
	      /************************/

			printk("\nCommand selection error");
			i_ReturnValue = -100;
		}
	} else {
	   /*******************/
		/* Data size error */
	   /*******************/

		printk("\nBuffer size error");
		i_ReturnValue = -101;
	}

	/**************************************************************************/
	/* Test if no error occur and APCI16XX_TTL_INITDIRECTION command selected */
	/**************************************************************************/

	if ((i_ReturnValue >= 0) && (b_Command == APCI16XX_TTL_INITDIRECTION)) {
		memset(devpriv->ul_TTLPortConfiguration, 0,
			sizeof(devpriv->ul_TTLPortConfiguration));

	   /*************************************/
		/* Test the port direction selection */
	   /*************************************/

		for (b_Cpt = 1;
			(b_Cpt <= b_NumberOfPort) && (i_ReturnValue >= 0);
			b_Cpt++) {
	      /**********************/
			/* Test the direction */
	      /**********************/

			if ((data[b_Cpt] != 0) && (data[b_Cpt] != 0xFF)) {
		 /************************/
				/* Port direction error */
		 /************************/

				printk("\nPort %d direction selection error",
					(int) b_Cpt);
				i_ReturnValue = -(int) b_Cpt;
			}

	      /**************************/
			/* Save the configuration */
	      /**************************/

			devpriv->ul_TTLPortConfiguration[(b_Cpt - 1) / 4] =
				devpriv->ul_TTLPortConfiguration[(b_Cpt -
					1) / 4] | (data[b_Cpt] << (8 * ((b_Cpt -
							1) % 4)));
		}
	}

	/**************************/
	/* Test if no error occur */
	/**************************/

	if (i_ReturnValue >= 0) {
	   /***********************************/
		/* Test if TTL port initilaisation */
	   /***********************************/

		if ((b_Command == APCI16XX_TTL_INIT)
			|| (b_Command == APCI16XX_TTL_INITDIRECTION)) {
	      /******************************/
			/* Set all port configuration */
	      /******************************/

			for (b_Cpt = 0; b_Cpt <= b_NumberOfPort; b_Cpt++) {
				if ((b_Cpt % 4) == 0) {
		    /*************************/
					/* Set the configuration */
		    /*************************/

					outl(devpriv->
						ul_TTLPortConfiguration[b_Cpt /
							4],
						devpriv->iobase + 32 + b_Cpt);
				}
			}
		}
	}

	/************************************************/
	/* Test if output memory initialisation command */
	/************************************************/

	if (b_Command == APCI16XX_TTL_OUTPUTMEMORY) {
		if (data[1]) {
			devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
		} else {
			devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
		}
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
|                            INPUT FUNCTIONS                                 |
+----------------------------------------------------------------------------+
*/

/*
+----------------------------------------------------------------------------+
| Function Name     : int     i_APCI16XX_InsnBitsReadTTLIO                   |
|                          (struct comedi_device    *dev,                           |
|                           struct comedi_subdevice *s,                             |
|                           struct comedi_insn      *insn,                          |
|                           unsigned int         *data)                          |
+----------------------------------------------------------------------------+
| Task              : Read the status from selected TTL digital input        |
|                     (b_InputChannel)                                       |
+----------------------------------------------------------------------------+
| Task              : Read the status from digital input port                |
|                     (b_SelectedPort)                                       |
+----------------------------------------------------------------------------+
| Input Parameters  :                                                        |
|              APCI16XX_TTL_READCHANNEL                                      |
|                    b_SelectedPort= CR_RANGE(insn->chanspec);               |
|                    b_InputChannel= CR_CHAN(insn->chanspec);                |
|                    b_ReadType	  = (unsigned char) data[0];                          |
|                                                                            |
|              APCI16XX_TTL_READPORT                                         |
|                    b_SelectedPort= CR_RANGE(insn->chanspec);               |
|                    b_ReadType	  = (unsigned char) data[0];                          |
+----------------------------------------------------------------------------+
| Output Parameters : data[0]    0 : Channle is not active                   |
|                                1 : Channle is active                       |
+----------------------------------------------------------------------------+
| Return Value      : >0  : No error                                         |
|                    -100 : Config command error                             |
|                    -101 : Data size error                                  |
|                    -102 : The selected TTL input port is wrong             |
|                    -103 : The selected TTL digital input is wrong          |
+----------------------------------------------------------------------------+
*/

int i_APCI16XX_InsnBitsReadTTLIO(struct comedi_device *dev,
	struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
	int i_ReturnValue = insn->n;
	unsigned char b_Command = 0;
	unsigned char b_NumberOfPort =
		(unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
	unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
	unsigned char b_InputChannel = CR_CHAN(insn->chanspec);
	unsigned char *pb_Status;
	unsigned int dw_Status;

	/************************/
	/* Test the buffer size */
	/************************/

	if (insn->n >= 1) {
	   /*******************/
		/* Get the command */
		/* **************** */

		b_Command = (unsigned char) data[0];

	   /********************/
		/* Test the command */
	   /********************/

		if ((b_Command == APCI16XX_TTL_READCHANNEL)
			|| (b_Command == APCI16XX_TTL_READPORT)) {
	      /**************************/
			/* Test the selected port */
	      /**************************/

			if (b_SelectedPort < b_NumberOfPort) {
		 /**********************/
				/* Test if input port */
		 /**********************/

				if (((devpriv->ul_TTLPortConfiguration
							[b_SelectedPort /
								4] >> (8 *
								(b_SelectedPort
									%
									4))) &
						0xFF) == 0) {
		    /***************************/
					/* Test the channel number */
		    /***************************/

					if ((b_Command ==
							APCI16XX_TTL_READCHANNEL)
						&& (b_InputChannel > 7)) {
		       /*******************************************/
						/* The selected TTL digital input is wrong */
		       /*******************************************/

						printk("\nChannel selection error");
						i_ReturnValue = -103;
					}
				} else {
		    /****************************************/
					/* The selected TTL input port is wrong */
		    /****************************************/

					printk("\nPort selection error");
					i_ReturnValue = -102;
				}
			} else {
		 /****************************************/
				/* The selected TTL input port is wrong */
		 /****************************************/

				printk("\nPort selection error");
				i_ReturnValue = -102;
			}
		} else {
	      /************************/
			/* Config command error */
	      /************************/

			printk("\nCommand selection error");
			i_ReturnValue = -100;
		}
	} else {
	   /*******************/
		/* Data size error */
	   /*******************/

		printk("\nBuffer size error");
		i_ReturnValue = -101;
	}

	/**************************/
	/* Test if no error occur */
	/**************************/

	if (i_ReturnValue >= 0) {
		pb_Status = (unsigned char *) &data[0];

	   /*******************************/
		/* Get the digital inpu status */
	   /*******************************/

		dw_Status =
			inl(devpriv->iobase + 8 + ((b_SelectedPort / 4) * 4));
		dw_Status = (dw_Status >> (8 * (b_SelectedPort % 4))) & 0xFF;

	   /***********************/
		/* Save the port value */
	   /***********************/

		*pb_Status = (unsigned char) dw_Status;

	   /***************************************/
		/* Test if read channel status command */
	   /***************************************/

		if (b_Command == APCI16XX_TTL_READCHANNEL) {
			*pb_Status = (*pb_Status >> b_InputChannel) & 1;
		}
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
| Function Name     : int i_APCI16XX_InsnReadTTLIOAllPortValue               |
|                          (struct comedi_device    *dev,                           |
|                           struct comedi_subdevice *s,                             |
|                           struct comedi_insn      *insn,                          |
|                           unsigned int         *data)                          |
+----------------------------------------------------------------------------+
| Task              : Read the status from all digital input ports           |
+----------------------------------------------------------------------------+
| Input Parameters  : -                                                      |
+----------------------------------------------------------------------------+
| Output Parameters : data[0] : Port 0 to 3 data                             |
|                     data[1] : Port 4 to 7 data                             |
|                     ....                                                   |
+----------------------------------------------------------------------------+
| Return Value      : 0: No error                                            |
|                    -100 : Read command error                               |
|                    -101 : Data size error                                  |
+----------------------------------------------------------------------------+
*/

int i_APCI16XX_InsnReadTTLIOAllPortValue(struct comedi_device *dev,
	struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
	unsigned char b_Command = (unsigned char) CR_AREF(insn->chanspec);
	int i_ReturnValue = insn->n;
	unsigned char b_Cpt = 0;
	unsigned char b_NumberOfPort = 0;
	unsigned int *pls_ReadData = data;

	/********************/
	/* Test the command */
	/********************/

	if ((b_Command == APCI16XX_TTL_READ_ALL_INPUTS)
		|| (b_Command == APCI16XX_TTL_READ_ALL_OUTPUTS)) {
	   /**********************************/
		/* Get the number of 32-Bit ports */
	   /**********************************/

		b_NumberOfPort =
			(unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 32);
		if ((b_NumberOfPort * 32) <
			devpriv->ps_BoardInfo->i_NbrTTLChannel) {
			b_NumberOfPort = b_NumberOfPort + 1;
		}

	   /************************/
		/* Test the buffer size */
	   /************************/

		if (insn->n >= b_NumberOfPort) {
			if (b_Command == APCI16XX_TTL_READ_ALL_INPUTS) {
		 /**************************/
				/* Read all digital input */
		 /**************************/

				for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
		    /************************/
					/* Read the 32-Bit port */
		    /************************/

					pls_ReadData[b_Cpt] =
						inl(devpriv->iobase + 8 +
						(b_Cpt * 4));

		    /**************************************/
					/* Mask all channels used als outputs */
		    /**************************************/

					pls_ReadData[b_Cpt] =
						pls_ReadData[b_Cpt] &
						(~devpriv->
						ul_TTLPortConfiguration[b_Cpt]);
				}
			} else {
		 /****************************/
				/* Read all digital outputs */
		 /****************************/

				for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
		    /************************/
					/* Read the 32-Bit port */
		    /************************/

					pls_ReadData[b_Cpt] =
						inl(devpriv->iobase + 20 +
						(b_Cpt * 4));

		    /**************************************/
					/* Mask all channels used als outputs */
		    /**************************************/

					pls_ReadData[b_Cpt] =
						pls_ReadData[b_Cpt] & devpriv->
						ul_TTLPortConfiguration[b_Cpt];
				}
			}
		} else {
	      /*******************/
			/* Data size error */
	      /*******************/

			printk("\nBuffer size error");
			i_ReturnValue = -101;
		}
	} else {
	   /*****************/
		/* Command error */
	   /*****************/

		printk("\nCommand selection error");
		i_ReturnValue = -100;
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
|                            OUTPUT FUNCTIONS                                |
+----------------------------------------------------------------------------+
*/

/*
+----------------------------------------------------------------------------+
| Function Name     : int     i_APCI16XX_InsnBitsWriteTTLIO                  |
|                          (struct comedi_device    *dev,                           |
|                           struct comedi_subdevice *s,                             |
|                           struct comedi_insn      *insn,                          |
|                           unsigned int         *data)                          |
+----------------------------------------------------------------------------+
| Task              : Set the state from selected TTL digital output         |
|                     (b_OutputChannel)                                      |
+----------------------------------------------------------------------------+
| Task              : Set the state from digital output port                 |
|                     (b_SelectedPort)                                       |
+----------------------------------------------------------------------------+
| Input Parameters  :                                                        |
|              APCI16XX_TTL_WRITECHANNEL_ON | APCI16XX_TTL_WRITECHANNEL_OFF  |
|                    b_SelectedPort = CR_RANGE(insn->chanspec);              |
|                    b_OutputChannel= CR_CHAN(insn->chanspec);               |
|                    b_Command      = (unsigned char) data[0];                        |
|                                                                            |
|              APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF        |
|                    b_SelectedPort = CR_RANGE(insn->chanspec);              |
|                    b_Command      = (unsigned char) data[0];                        |
+----------------------------------------------------------------------------+
| Output Parameters : data[0] : TTL output port 0 to 3 data                  |
|                     data[1] : TTL output port 4 to 7 data                  |
|                     ....                                                   |
+----------------------------------------------------------------------------+
| Return Value      : >0  : No error                                         |
|                    -100 : Command error                                    |
|                    -101 : Data size error                                  |
|                    -102 : The selected TTL output port is wrong            |
|                    -103 : The selected TTL digital output is wrong         |
|                    -104 : Output memory disabled                           |
+----------------------------------------------------------------------------+
*/

int i_APCI16XX_InsnBitsWriteTTLIO(struct comedi_device *dev,
	struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
	int i_ReturnValue = insn->n;
	unsigned char b_Command = 0;
	unsigned char b_NumberOfPort =
		(unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
	unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
	unsigned char b_OutputChannel = CR_CHAN(insn->chanspec);
	unsigned int dw_Status = 0;

	/************************/
	/* Test the buffer size */
	/************************/

	if (insn->n >= 1) {
	   /*******************/
		/* Get the command */
		/* **************** */

		b_Command = (unsigned char) data[0];

	   /********************/
		/* Test the command */
	   /********************/

		if ((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) ||
			(b_Command == APCI16XX_TTL_WRITEPORT_ON) ||
			(b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) ||
			(b_Command == APCI16XX_TTL_WRITEPORT_OFF)) {
	      /**************************/
			/* Test the selected port */
	      /**************************/

			if (b_SelectedPort < b_NumberOfPort) {
		 /***********************/
				/* Test if output port */
		 /***********************/

				if (((devpriv->ul_TTLPortConfiguration
							[b_SelectedPort /
								4] >> (8 *
								(b_SelectedPort
									%
									4))) &
						0xFF) == 0xFF) {
		    /***************************/
					/* Test the channel number */
		    /***************************/

					if (((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF)) && (b_OutputChannel > 7)) {
		       /********************************************/
						/* The selected TTL digital output is wrong */
		       /********************************************/

						printk("\nChannel selection error");
						i_ReturnValue = -103;
					}

					if (((b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE)) {
		       /********************************************/
						/* The selected TTL digital output is wrong */
		       /********************************************/

						printk("\nOutput memory disabled");
						i_ReturnValue = -104;
					}

		    /************************/
					/* Test the buffer size */
		    /************************/

					if (((b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (insn->n < 2)) {
		       /*******************/
						/* Data size error */
		       /*******************/

						printk("\nBuffer size error");
						i_ReturnValue = -101;
					}
				} else {
		    /*****************************************/
					/* The selected TTL output port is wrong */
		    /*****************************************/

					printk("\nPort selection error %lX",
						(unsigned long)devpriv->
						ul_TTLPortConfiguration[0]);
					i_ReturnValue = -102;
				}
			} else {
		 /****************************************/
				/* The selected TTL output port is wrong */
		 /****************************************/

				printk("\nPort selection error %d %d",
					b_SelectedPort, b_NumberOfPort);
				i_ReturnValue = -102;
			}
		} else {
	      /************************/
			/* Config command error */
	      /************************/

			printk("\nCommand selection error");
			i_ReturnValue = -100;
		}
	} else {
	   /*******************/
		/* Data size error */
	   /*******************/

		printk("\nBuffer size error");
		i_ReturnValue = -101;
	}

	/**************************/
	/* Test if no error occur */
	/**************************/

	if (i_ReturnValue >= 0) {
	   /********************************/
		/* Get the digital output state */
	   /********************************/

		dw_Status =
			inl(devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));

	   /**********************************/
		/* Test if output memory not used */
	   /**********************************/

		if (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE) {
	      /*********************************/
			/* Clear the selected port value */
	      /*********************************/

			dw_Status =
				dw_Status & (0xFFFFFFFFUL -
				(0xFFUL << (8 * (b_SelectedPort % 4))));
		}

	   /******************************/
		/* Test if setting channel ON */
	   /******************************/

		if (b_Command == APCI16XX_TTL_WRITECHANNEL_ON) {
			dw_Status =
				dw_Status | (1UL << ((8 * (b_SelectedPort %
							4)) + b_OutputChannel));
		}

	   /***************************/
		/* Test if setting port ON */
	   /***************************/

		if (b_Command == APCI16XX_TTL_WRITEPORT_ON) {
			dw_Status =
				dw_Status | ((data[1] & 0xFF) << (8 *
					(b_SelectedPort % 4)));
		}

	   /*******************************/
		/* Test if setting channel OFF */
	   /*******************************/

		if (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) {
			dw_Status =
				dw_Status & (0xFFFFFFFFUL -
				(1UL << ((8 * (b_SelectedPort % 4)) +
						b_OutputChannel)));
		}

	   /****************************/
		/* Test if setting port OFF */
	   /****************************/

		if (b_Command == APCI16XX_TTL_WRITEPORT_OFF) {
			dw_Status =
				dw_Status & (0xFFFFFFFFUL -
				((data[1] & 0xFF) << (8 * (b_SelectedPort %
							4))));
		}

		outl(dw_Status,
			devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
| Function   Name   : int i_APCI2200_Reset(struct comedi_device *dev)               |                                                         +----------------------------------------------------------------------------+
| Task              :resets all the registers                                |
+----------------------------------------------------------------------------+
| Input Parameters  : struct comedi_device *dev                                     |
+----------------------------------------------------------------------------+
| Output Parameters : -                                                      |
+----------------------------------------------------------------------------+
| Return Value      : -                                                      |
+----------------------------------------------------------------------------+
*/

int i_APCI16XX_Reset(struct comedi_device *dev)
{
	return 0;
}
