
/*
 *  rio_linux.h
 *
 *  Copyright (C) 1998,1999,2000 R.E.Wolff@BitWizard.nl
 *
 *      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., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  RIO serial driver.
 *
 *  Version 1.0 -- July, 1999. 
 * 
 */
#include <linux/config.h>

#define RIO_NBOARDS        4
#define RIO_PORTSPERBOARD 128
#define RIO_NPORTS        (RIO_NBOARDS * RIO_PORTSPERBOARD)

#define MODEM_SUPPORT

#ifdef __KERNEL__

#define RIO_MAGIC 0x12345678


struct vpd_prom {
  unsigned short id;
  char hwrev;
  char hwass;
  int uniqid;
  char myear;
  char mweek;
  char hw_feature[5];
  char oem_id;
  char identifier[16];
};


#define RIO_DEBUG_ALL           0xffffffff

#define O_OTHER(tty)    \
      ((O_OLCUC(tty))  ||\
      (O_ONLCR(tty))   ||\
      (O_OCRNL(tty))   ||\
      (O_ONOCR(tty))   ||\
      (O_ONLRET(tty))  ||\
      (O_OFILL(tty))   ||\
      (O_OFDEL(tty))   ||\
      (O_NLDLY(tty))   ||\
      (O_CRDLY(tty))   ||\
      (O_TABDLY(tty))  ||\
      (O_BSDLY(tty))   ||\
      (O_VTDLY(tty))   ||\
      (O_FFDLY(tty)))

/* Same for input. */
#define I_OTHER(tty)    \
      ((I_INLCR(tty))  ||\
      (I_IGNCR(tty))   ||\
      (I_ICRNL(tty))   ||\
      (I_IUCLC(tty))   ||\
      (L_ISIG(tty)))


#endif /* __KERNEL__ */


#define RIO_BOARD_INTR_LOCK  1


#ifndef RIOCTL_MISC_MINOR 
/* Allow others to gather this into "major.h" or something like that */
#define RIOCTL_MISC_MINOR    169
#endif


void rio_dec_mod_count (void);
void rio_inc_mod_count (void);

/* Allow us to debug "in the field" without requiring clients to
   recompile.... */
#if 1
#define rio_spin_lock_irqsave(sem, flags) do { \
	spin_lock_irqsave(sem, flags);\
	rio_dprintk (RIO_DEBUG_SPINLOCK, "spinlockirqsave: %p %s:%d\n", \
					sem, __FILE__, __LINE__);\
        } while (0)

#define rio_spin_unlock_irqrestore(sem, flags) do { \
	rio_dprintk (RIO_DEBUG_SPINLOCK, "spinunlockirqrestore: %p %s:%d\n",\
					sem, __FILE__, __LINE__);\
	spin_unlock_irqrestore(sem, flags);\
        } while (0)


#define rio_spin_lock(sem) do { \
        spin_lock(sem);\
	rio_dprintk (RIO_DEBUG_SPINLOCK, "spinlock: %p %s:%d\n",\
					sem, __FILE__, __LINE__);\
        } while (0)

#define rio_spin_unlock(sem) do { \
	rio_dprintk (RIO_DEBUG_SPINLOCK, "spinunlock: %p %s:%d\n",\
					sem, __FILE__, __LINE__);\
        spin_unlock(sem);\
        } while (0)
#else
#define rio_spin_lock_irqsave(sem, flags) \
            spin_lock_irqsave(sem, flags)

#define rio_spin_unlock_irqrestore(sem, flags) \
            spin_unlock_irqrestore(sem, flags)

#define rio_spin_lock(sem) \
            spin_lock(sem) 

#define rio_spin_unlock(sem) \
            spin_unlock(sem) 

#endif



#ifdef CONFIG_RIO_OLDPCI
static inline void *rio_memcpy_toio (void *dummy, void *dest, void *source, int n)
{
  char *dst = dest;
  char *src = source;

  while (n--) {
    writeb (*src++, dst++);
    (void) readb (dummy);
  }

  return dest;
}


static inline void *rio_memcpy_fromio (void *dest, void *source, int n)
{
  char *dst = dest;
  char *src = source;

  while (n--) 
    *dst++ = readb (src++);

  return dest;
}

#else
#define rio_memcpy_toio(dummy,dest,source,n)   memcpy_toio(dest, source, n)
#define rio_memcpy_fromio                      memcpy_fromio
#endif

#define DEBUG 1


/* 
   This driver can spew a whole lot of debugging output at you. If you
   need maximum performance, you should disable the DEBUG define. To
   aid in debugging in the field, I'm leaving the compile-time debug
   features enabled, and disable them "runtime". That allows me to
   instruct people with problems to enable debugging without requiring
   them to recompile... 
*/

#ifdef DEBUG
#define rio_dprintk(f, str...) do { if (rio_debug & f) printk (str);} while (0)
#define func_enter() rio_dprintk (RIO_DEBUG_FLOW, "rio: enter " __FUNCTION__ "\n")
#define func_exit()  rio_dprintk (RIO_DEBUG_FLOW, "rio: exit  " __FUNCTION__ "\n")
#define func_enter2() rio_dprintk (RIO_DEBUG_FLOW, "rio: enter " __FUNCTION__ \
                                   "(port %d)\n", port->line)
#else
#define rio_dprintk(f, str...) /* nothing */
#define func_enter()
#define func_exit()
#define func_enter2()
#endif

/* Documentation says to use these defines. Why aren't they in a
 * header then?  Hmm. They are in the header "riowinif.h", however
 * that file doesn't compile. I give up. Copied here. -- REW
 */

#define MSET_RTS        0x01            /* RTS modem signal */
#define MSET_DTR        0x02            /* DTR modem signal */

#define MODEM_DSR               0x80    /* Data Set Ready modem state */
#define MODEM_CTS               0x40    /* Clear To Send modem state */
#define MODEM_RI                0x20    /* Ring Indicate modem state */
#define MODEM_CD                0x10    /* Carrier Detect modem state */
#define MODEM_TSTOP             0x08    /* Transmit Stopped state */
#define MODEM_TEMPTY    0x04    /* Transmit Empty state */
#define MODEM_DTR               0x02    /* DTR modem output state */
#define MODEM_RTS               0x01    /* RTS modem output state */

