Source
x
static void indirect_resetbit(struct pd6729_socket *socket, unsigned short reg,
/*
* Driver for the Cirrus PD6729 PCI-PCMCIA bridge.
*
* Based on the i82092.c driver.
*
* This software may be used and distributed according to the terms of
* the GNU General Public License, incorporated herein by reference.
*/
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver for the Cirrus PD6729 PCI-PCMCIA bridge");
MODULE_AUTHOR("Jun Komuro <komurojun-mbn@nifty.com>");
/*
* simple helper functions
* External clock time, in nanoseconds. 120 ns = 8.33 MHz
*/
/*
* PARAMETERS
* irq_mode=n
* Specifies the interrupt delivery mode. The default (1) is to use PCI
* interrupts; a value of 0 selects ISA interrupts. This must be set for
* correct operation of PCI card readers.
*/
static int irq_mode = 1; /* 0 = ISA interrupt, 1 = PCI interrupt */
module_param(irq_mode, int, 0444);
MODULE_PARM_DESC(irq_mode,
"interrupt delivery mode. 0 = ISA, 1 = PCI. default is 1");
static DEFINE_SPINLOCK(port_lock);
/* basic value read/write functions */
static unsigned char indirect_read(struct pd6729_socket *socket,
unsigned short reg)
{
unsigned long port;
unsigned char val;
unsigned long flags;
spin_lock_irqsave(&port_lock, flags);
reg += socket->number * 0x40;
port = socket->io_base;
outb(reg, port);
val = inb(port + 1);
spin_unlock_irqrestore(&port_lock, flags);
return val;
}
static unsigned short indirect_read16(struct pd6729_socket *socket,
unsigned short reg)
{
unsigned long port;
unsigned short tmp;
unsigned long flags;
spin_lock_irqsave(&port_lock, flags);
reg = reg + socket->number * 0x40;
port = socket->io_base;
outb(reg, port);
tmp = inb(port + 1);
reg++;
outb(reg, port);
tmp = tmp | (inb(port + 1) << 8);