The mecia support has moved to the mecia driver, so remove the copy of
it here.
This commit is contained in:
parent
29a0946cc9
commit
308ca3aa7a
@ -29,10 +29,6 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#define MECIA_SUPPORT
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/systm.h>
|
||||
@ -42,12 +38,6 @@
|
||||
#include <pccard/i82365.h>
|
||||
#include <pccard/cardinfo.h>
|
||||
#include <pccard/slot.h>
|
||||
#ifdef MECIA_SUPPORT
|
||||
#include <pccard/pcic98reg.h>
|
||||
#ifndef PCIC98_IOBASE
|
||||
#define PCIC98_IOBASE 0x80d0
|
||||
#endif
|
||||
#endif /* MECIA_SUPPORT */
|
||||
|
||||
/* Get pnp IDs */
|
||||
#include <isa/isavar.h>
|
||||
@ -72,16 +62,6 @@ static struct callout_handle pcictimeout_ch
|
||||
= CALLOUT_HANDLE_INITIALIZER(&pcictimeout_ch);
|
||||
static int pcic_memory(struct slot *, int);
|
||||
static int pcic_io(struct slot *, int);
|
||||
#ifdef MECIA_SUPPORT
|
||||
/* local functions for PC-98 Original PC-Card controller */
|
||||
static int pcic98_power(struct slot *);
|
||||
static void pcic98_mapirq(struct slot *, int);
|
||||
static int pcic98_memory(struct slot *, int);
|
||||
static int pcic98_io(struct slot *, int);
|
||||
static timeout_t pcic98_reset;
|
||||
static void pcic98_disable(struct slot *);
|
||||
static void pcic98_resume(struct slot *);
|
||||
#endif /* MECIA_SUPPORT */
|
||||
|
||||
/*
|
||||
* Per-slot data table.
|
||||
@ -117,10 +97,6 @@ static struct isa_pnp_id pcic_ids[] = {
|
||||
{0}
|
||||
};
|
||||
|
||||
#ifdef MECIA_SUPPORT
|
||||
static u_char pcic98_last_reg1;
|
||||
#endif /* MECIA_SUPPORT */
|
||||
|
||||
static char *bridges[] =
|
||||
{
|
||||
"Intel i82365",
|
||||
@ -134,7 +110,6 @@ static char *bridges[] =
|
||||
"Vadem 469",
|
||||
"Ricoh RF5C396",
|
||||
"IBM KING PCMCIA Controller",
|
||||
"PC-98 MECIA Controller"
|
||||
};
|
||||
|
||||
/*
|
||||
@ -485,32 +460,6 @@ pcic_probe(device_t dev)
|
||||
}
|
||||
}
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, rid, r);
|
||||
if (validslots != 0)
|
||||
return (0);
|
||||
#ifdef PC98
|
||||
sp = &sc->slots[0];
|
||||
if (inb(PCIC98_REG0) != 0xff) {
|
||||
sp->controller = PCIC_PC98;
|
||||
sp->revision = 0;
|
||||
cinfo.mapmem = pcic98_memory;
|
||||
cinfo.mapio = pcic98_io;
|
||||
cinfo.power = pcic98_power;
|
||||
cinfo.mapirq = pcic98_mapirq;
|
||||
cinfo.reset = pcic98_reset;
|
||||
cinfo.disable = pcic98_disable;
|
||||
cinfo.resume = pcic98_resume;
|
||||
cinfo.maxmem = 1;
|
||||
#if 0
|
||||
cinfo.maxio = 1;
|
||||
#else
|
||||
cinfo.maxio = 2; /* fake for UE2212 LAN card */
|
||||
#endif
|
||||
validslots++;
|
||||
sp->slt = (struct slot *) 1;
|
||||
/* XXX need to allocated the port resources */
|
||||
device_set_desc(dev, "MECIA PC98 Original PCMCIA Controller");
|
||||
}
|
||||
#endif /* MECIA_SUPPORT */
|
||||
return (validslots ? 0 : ENXIO);
|
||||
}
|
||||
|
||||
@ -605,32 +554,18 @@ pcic_attach(device_t dev)
|
||||
if (sp->slt == NULL)
|
||||
continue;
|
||||
|
||||
#ifdef MECIA_SUPPORT
|
||||
if (sp->controller == PCIC_PC98) {
|
||||
pcic98_last_reg1 = inb(PCIC98_REG1);
|
||||
if (pcic98_last_reg1 & PCIC98_CARDEXIST) {
|
||||
/* PCMCIA card exist */
|
||||
sp->slt->laststate = sp->slt->state = filled;
|
||||
pccard_event(sp->slt, card_inserted);
|
||||
} else {
|
||||
sp->slt->laststate = sp->slt->state = empty;
|
||||
}
|
||||
} else
|
||||
#endif /* MECIA_SUPPORT */
|
||||
{
|
||||
do_mgt_irq(sp, irq);
|
||||
do_mgt_irq(sp, irq);
|
||||
|
||||
/* Check for changes */
|
||||
setb(sp, PCIC_POWER, PCIC_PCPWRE| PCIC_DISRST);
|
||||
stat = sp->getb(sp, PCIC_STATUS);
|
||||
if (bootverbose)
|
||||
printf("stat is %x\n", stat);
|
||||
if ((stat & PCIC_CD) != PCIC_CD) {
|
||||
sp->slt->laststate = sp->slt->state = empty;
|
||||
} else {
|
||||
sp->slt->laststate = sp->slt->state = filled;
|
||||
pccard_event(sp->slt, card_inserted);
|
||||
}
|
||||
/* Check for changes */
|
||||
setb(sp, PCIC_POWER, PCIC_PCPWRE| PCIC_DISRST);
|
||||
stat = sp->getb(sp, PCIC_STATUS);
|
||||
if (bootverbose)
|
||||
printf("stat is %x\n", stat);
|
||||
if ((stat & PCIC_CD) != PCIC_CD) {
|
||||
sp->slt->laststate = sp->slt->state = empty;
|
||||
} else {
|
||||
sp->slt->laststate = sp->slt->state = filled;
|
||||
pccard_event(sp->slt, card_inserted);
|
||||
}
|
||||
sp->slt->irq = irq;
|
||||
}
|
||||
@ -860,49 +795,29 @@ pcicintr1(void *arg)
|
||||
struct pcic_slot *sp = &sc->slots[0];
|
||||
|
||||
s = splhigh();
|
||||
#ifdef MECIA_SUPPORT
|
||||
if (sp->controller == PCIC_PC98) {
|
||||
u_char reg1;
|
||||
/* Check for a card in this slot */
|
||||
reg1 = inb(PCIC98_REG1);
|
||||
if ((pcic98_last_reg1 ^ reg1) & PCIC98_CARDEXIST) {
|
||||
pcic98_last_reg1 = reg1;
|
||||
if (reg1 & PCIC98_CARDEXIST)
|
||||
pccard_event(sp->slt, card_inserted);
|
||||
else
|
||||
pccard_event(sp->slt, card_removed);
|
||||
}
|
||||
} else
|
||||
#endif /* MECIA_SUPPORT */
|
||||
{
|
||||
for (slot = 0; slot < PCIC_CARD_SLOTS; slot++, sp++) {
|
||||
if (sp->slt &&
|
||||
(chg = sp->getb(sp, PCIC_STAT_CHG)) != 0) {
|
||||
/*
|
||||
* if chg is 0xff, then we know that
|
||||
* we've hit the famous "static bug" for
|
||||
* some desktop pcmcia cards. This is
|
||||
* caused by static discharge frying the
|
||||
* poor card's mind and it starts return 0xff
|
||||
* forever. We return an error and stop
|
||||
* polling the card. When we're interrupt
|
||||
* based, we never see this. The card just
|
||||
* goes away silently.
|
||||
*/
|
||||
if (chg == 0xff) {
|
||||
splx(s);
|
||||
return (EIO);
|
||||
}
|
||||
if (chg & PCIC_CDTCH) {
|
||||
if ((sp->getb(sp, PCIC_STATUS) &
|
||||
PCIC_CD) == PCIC_CD) {
|
||||
pccard_event(sp->slt,
|
||||
card_inserted);
|
||||
} else {
|
||||
pccard_event(sp->slt,
|
||||
card_removed);
|
||||
cinfo.disable(sp->slt);
|
||||
}
|
||||
for (slot = 0; slot < PCIC_CARD_SLOTS; slot++, sp++) {
|
||||
if (sp->slt && (chg = sp->getb(sp, PCIC_STAT_CHG)) != 0) {
|
||||
/*
|
||||
* if chg is 0xff, then we know that we've hit
|
||||
* the famous "static bug" for some desktop
|
||||
* pcmcia cards. This is caused by static
|
||||
* discharge frying the poor card's mind and
|
||||
* it starts return 0xff forever. We return
|
||||
* an error and stop polling the card. When
|
||||
* we're interrupt based, we never see this.
|
||||
* The card just goes away silently.
|
||||
*/
|
||||
if (chg == 0xff) {
|
||||
splx(s);
|
||||
return (EIO);
|
||||
}
|
||||
if (chg & PCIC_CDTCH) {
|
||||
if ((sp->getb(sp, PCIC_STATUS) & PCIC_CD) ==
|
||||
PCIC_CD) {
|
||||
pccard_event(sp->slt, card_inserted);
|
||||
} else {
|
||||
pccard_event(sp->slt, card_removed);
|
||||
cinfo.disable(sp->slt);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -926,237 +841,6 @@ pcic_resume(struct slot *slt)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MECIA_SUPPORT
|
||||
/*
|
||||
* local functions for PC-98 Original PC-Card controller
|
||||
*/
|
||||
#define PCIC98_ALWAYS_128MAPPING 1 /* trick for using UE2212 */
|
||||
|
||||
int pcic98_mode = 0; /* almost the same as the value in PCIC98_REG2 */
|
||||
|
||||
static unsigned char reg_winsel = PCIC98_UNMAPWIN;
|
||||
static unsigned short reg_pagofs = 0;
|
||||
|
||||
static int
|
||||
pcic98_memory(struct slot *slt, int win)
|
||||
{
|
||||
struct mem_desc *mp = &slt->mem[win];
|
||||
unsigned char x;
|
||||
|
||||
if (mp->flags & MDF_ACTIVE) {
|
||||
/* slot = 0, window = 0, sys_addr = 0xda000, length = 8KB */
|
||||
if ((unsigned long)mp->start != 0xda000) {
|
||||
printf(
|
||||
"sys_addr must be 0xda000. requested address = %p\n",
|
||||
mp->start);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/* omajinai ??? */
|
||||
outb(PCIC98_REG0, 0);
|
||||
x = inb(PCIC98_REG1);
|
||||
x &= 0xfc;
|
||||
x |= 0x02;
|
||||
outb(PCIC98_REG1, x);
|
||||
reg_winsel = inb(PCIC98_REG_WINSEL);
|
||||
reg_pagofs = inw(PCIC98_REG_PAGOFS);
|
||||
outb(PCIC98_REG_WINSEL, PCIC98_MAPWIN);
|
||||
outw(PCIC98_REG_PAGOFS, (mp->card >> 13)); /* 8KB */
|
||||
|
||||
if (mp->flags & MDF_ATTR) {
|
||||
outb(PCIC98_REG7, inb(PCIC98_REG7) | PCIC98_ATTRMEM);
|
||||
}else{
|
||||
outb(PCIC98_REG7, inb(PCIC98_REG7) & (~PCIC98_ATTRMEM));
|
||||
}
|
||||
|
||||
outb(PCIC98_REG_WINSEL, PCIC98_MAPWIN);
|
||||
#if 0
|
||||
if ((mp->flags & MDF_16BITS) == 1) { /* 16bit */
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) & (~PCIC98_8BIT));
|
||||
}else{ /* 8bit */
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) | PCIC98_8BIT);
|
||||
}
|
||||
#endif
|
||||
} else { /* !(mp->flags & MDF_ACTIVE) */
|
||||
outb(PCIC98_REG0, 0);
|
||||
x = inb(PCIC98_REG1);
|
||||
x &= 0xfc;
|
||||
x |= 0x02;
|
||||
outb(PCIC98_REG1, x);
|
||||
#if 0
|
||||
outb(PCIC98_REG_WINSEL, PCIC98_UNMAPWIN);
|
||||
outw(PCIC98_REG_PAGOFS, 0);
|
||||
#else
|
||||
outb(PCIC98_REG_WINSEL, reg_winsel);
|
||||
outw(PCIC98_REG_PAGOFS, reg_pagofs);
|
||||
#endif
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
pcic98_io(struct slot *slt, int win)
|
||||
{
|
||||
struct io_desc *ip = &slt->io[win];
|
||||
unsigned char x;
|
||||
unsigned short cardbase;
|
||||
u_short ofst;
|
||||
|
||||
if (win != 0) {
|
||||
/* ignore for UE2212 */
|
||||
printf(
|
||||
"pcic98:Illegal PCIC I/O window(%d) request! Ignored.\n", win);
|
||||
/* return (EINVAL);*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (ip->flags & IODF_ACTIVE) {
|
||||
x = inb(PCIC98_REG2) & 0x0f;
|
||||
#if 0
|
||||
if (! (ip->flags & IODF_CS16))
|
||||
x |= PCIC98_8BIT;
|
||||
#else
|
||||
if (! (ip->flags & IODF_16BIT)) {
|
||||
x |= PCIC98_8BIT;
|
||||
pcic98_mode |= PCIC98_8BIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
ofst = ip->start & 0xf;
|
||||
cardbase = ip->start & ~0xf;
|
||||
#ifndef PCIC98_ALWAYS_128MAPPING
|
||||
if (ip->size + ofst > 16)
|
||||
#endif
|
||||
{ /* 128bytes mapping */
|
||||
x |= PCIC98_MAP128;
|
||||
pcic98_mode |= PCIC98_MAP128;
|
||||
ofst |= ((cardbase & 0x70) << 4);
|
||||
cardbase &= ~0x70;
|
||||
}
|
||||
|
||||
x |= PCIC98_MAPIO;
|
||||
outb(PCIC98_REG2, x);
|
||||
|
||||
outw(PCIC98_REG4, PCIC98_IOBASE); /* 98side I/O base */
|
||||
outw(PCIC98_REG5, cardbase); /* card side I/O base */
|
||||
|
||||
if (bootverbose) {
|
||||
printf("pcic98: I/O mapped 0x%04x(98) -> "
|
||||
"0x%04x(Card) and width %d bytes\n",
|
||||
PCIC98_IOBASE+ofst, ip->start, ip->size);
|
||||
printf("pcic98: reg2=0x%02x reg3=0x%02x reg7=0x%02x\n",
|
||||
inb(PCIC98_REG2), inb(PCIC98_REG3),
|
||||
inb(PCIC98_REG7));
|
||||
printf("pcic98: mode=%d\n", pcic98_mode);
|
||||
}
|
||||
|
||||
ip->start = PCIC98_IOBASE + ofst;
|
||||
} else {
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) & (~PCIC98_MAPIO));
|
||||
pcic98_mode = 0;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
pcic98_power(struct slot *slt)
|
||||
{
|
||||
unsigned char reg;
|
||||
|
||||
reg = inb(PCIC98_REG7) & (~PCIC98_VPP12V);
|
||||
switch(slt->pwr.vpp) {
|
||||
default:
|
||||
return (EINVAL);
|
||||
case 50:
|
||||
break;
|
||||
case 120:
|
||||
reg |= PCIC98_VPP12V;
|
||||
break;
|
||||
}
|
||||
outb(PCIC98_REG7, reg);
|
||||
DELAY(100*1000);
|
||||
|
||||
reg = inb(PCIC98_REG2) & (~PCIC98_VCC3P3V);
|
||||
switch(slt->pwr.vcc) {
|
||||
default:
|
||||
return (EINVAL);
|
||||
case 33:
|
||||
reg |= PCIC98_VCC3P3V;
|
||||
break;
|
||||
case 50:
|
||||
break;
|
||||
}
|
||||
outb(PCIC98_REG2, reg);
|
||||
DELAY(100*1000);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
pcic98_mapirq(struct slot *slt, int irq)
|
||||
{
|
||||
u_char x;
|
||||
|
||||
switch (irq) {
|
||||
case 3:
|
||||
x = PCIC98_INT0;
|
||||
break;
|
||||
case 5:
|
||||
x = PCIC98_INT1;
|
||||
break;
|
||||
case 6:
|
||||
x = PCIC98_INT2;
|
||||
break;
|
||||
case 10:
|
||||
x = PCIC98_INT4;
|
||||
break;
|
||||
case 12:
|
||||
x = PCIC98_INT5;
|
||||
break;
|
||||
case 0: /* disable */
|
||||
x = PCIC98_INTDISABLE;
|
||||
break;
|
||||
default:
|
||||
printf("pcic98: illegal irq %d\n", irq);
|
||||
return;
|
||||
}
|
||||
#ifdef PCIC_DEBUG
|
||||
printf("pcic98: irq=%d mapped.\n", irq);
|
||||
#endif
|
||||
outb(PCIC98_REG3, x);
|
||||
}
|
||||
|
||||
static void
|
||||
pcic98_reset(void *chan)
|
||||
{
|
||||
struct slot *slt = chan;
|
||||
|
||||
outb(PCIC98_REG0, 0);
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) & (~PCIC98_MAPIO));
|
||||
outb(PCIC98_REG3, PCIC98_INTDISABLE);
|
||||
#if 0
|
||||
/* pcic98_reset() is called after pcic98_power() */
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) & (~PCIC98_VCC3P3V));
|
||||
outb(PCIC98_REG7, inb(PCIC98_REG7) & (~PCIC98_VPP12V));
|
||||
#endif
|
||||
outb(PCIC98_REG1, 0);
|
||||
|
||||
selwakeup(&slt->selp);
|
||||
}
|
||||
|
||||
static void
|
||||
pcic98_disable(struct slot *slt)
|
||||
{
|
||||
/* null function */
|
||||
}
|
||||
|
||||
static void
|
||||
pcic98_resume(struct slot *slt)
|
||||
{
|
||||
/* XXX PCIC98 How ? */
|
||||
}
|
||||
#endif /* MECIA_SUPPORT */
|
||||
/* end of local functions for PC-98 Original PC-Card controller */
|
||||
|
||||
static int
|
||||
pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
|
Loading…
Reference in New Issue
Block a user