Add support for CompactFlash on ATC board
authorwdenk <wdenk>
Sun, 18 May 2003 11:30:09 +0000 (11:30 +0000)
committerwdenk <wdenk>
Sun, 18 May 2003 11:30:09 +0000 (11:30 +0000)
(includes support for Intel 82365 and compatible PC Card controllers,
and Yenta-compatible PCI-to-CardBus controllers)

15 files changed:
CHANGELOG
board/atc/atc.c
common/cmd_pcmcia.c
cpu/mpc8260/pci.c
drivers/Makefile
drivers/i82365.c [new file with mode: 0644]
drivers/pci_indirect.c
include/configs/TQM860L.h
include/configs/atc.h
include/pci_ids.h
include/pcmcia.h
include/pcmcia/i82365.h [new file with mode: 0644]
include/pcmcia/ss.h [new file with mode: 0644]
include/pcmcia/ti113x.h [new file with mode: 0644]
include/pcmcia/yenta.h [new file with mode: 0644]

index d1ed914..0741782 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,10 @@
 Changes since U-Boot 0.3.1:
 ======================================================================
 
+* Add support for CompactFlash on ATC board
+  (includes support for Intel 82365 and compatible PC Card controllers,
+  and Yenta-compatible PCI-to-CardBus controllers)
+
 * Patch by Mathijs Haarman, 08 May 2003:
   Add lan91c96 driver (tested on Lubbock and custom PXA250 board only)
 
index 3547f41..21ed2b0 100644 (file)
@@ -24,6 +24,7 @@
 #include <common.h>
 #include <ioports.h>
 #include <mpc8260.h>
+#include <pci.h>
 
 /*
  * I/O Port configuration table
@@ -364,3 +365,14 @@ void doc_init (void)
        doc_probe (CFG_DOC_BASE);
 }
 #endif
+
+#ifdef CONFIG_PCI
+struct pci_controller hose;
+
+extern void pci_mpc8250_init(struct pci_controller *);
+
+void pci_init_board(void)
+{
+       pci_mpc8250_init(&hose);
+}
+#endif
index c009156..cb7600c 100644 (file)
@@ -72,16 +72,20 @@ int pcmcia_on (void);
 
 #if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
 static int  pcmcia_off (void);
+#endif
+
+#ifdef CONFIG_I82365
+
+extern int i82365_init (void);
+extern void i82365_exit (void);
+
+#else /* ! CONFIG_I82365 */
+
+#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
 static int  hardware_disable(int slot);
 #endif
 static int  hardware_enable (int slot);
 static int  voltage_set(int slot, int vcc, int vpp);
-#ifdef CONFIG_IDE_8xx_PCCARD
-static void print_funcid (int func);
-static void print_fixed  (volatile uchar *p);
-static int  identify     (volatile uchar *p);
-static int  check_ide_device (int slot);
-#endif /* CONFIG_IDE_8xx_PCCARD */
 
 static u_int m8xx_get_graycode(u_int size);
 #if 0
@@ -99,6 +103,15 @@ static u_int *pcmcia_pgcrx[2] = {
 
 #define PCMCIA_PGCRX(slot)     (*pcmcia_pgcrx[slot])
 
+#endif /* CONFIG_I82365 */
+
+#ifdef CONFIG_IDE_8xx_PCCARD
+static void print_funcid (int func);
+static void print_fixed  (volatile uchar *p);
+static int  identify     (volatile uchar *p);
+static int  check_ide_device (int slot);
+#endif /* CONFIG_IDE_8xx_PCCARD */
+
 const char *indent = "\t   ";
 
 /* -------------------------------------------------------------------- */
@@ -128,6 +141,24 @@ int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 /* -------------------------------------------------------------------- */
 
+#ifdef CONFIG_I82365
+int pcmcia_on (void)
+{
+       u_int rc;
+
+       debug ("Enable PCMCIA " PCMCIA_SLOT_MSG "\n");
+
+       rc = i82365_init();
+
+       if (rc == 0)
+       {
+               rc = check_ide_device(0);
+       }
+
+       return (rc);
+}
+#else
+
 #if defined(CONFIG_LWMON)
 # define  CFG_PCMCIA_TIMING    (PCMCIA_SHT(9) | PCMCIA_SST(3) | PCMCIA_SL(12))
 #else
@@ -222,11 +253,22 @@ int pcmcia_on (void)
        }
        return (rc);
 }
+#endif /* CONFIG_I82365 */
 
 /* -------------------------------------------------------------------- */
 
 #if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
 
+#ifdef CONFIG_I82365
+static int pcmcia_off (void)
+{
+       printf ("Disable PCMCIA " PCMCIA_SLOT_MSG "\n");
+
+       i82365_exit();
+
+       return 0;
+}
+#else
 static int pcmcia_off (void)
 {
        int i;
@@ -258,6 +300,7 @@ static int pcmcia_off (void)
        hardware_disable(_slot_);
        return 0;
 }
+#endif /* CONFIG_I82365 */
 
 #endif /* CFG_CMD_PCMCIA */
 
index f9f1e27..b7a04d5 100644 (file)
  */
 
 #define PCI_MSTR_IO_LOCAL       0xA0000000          /* Local base */
+#ifdef CONFIG_ATC
+#define PCI_MSTR_IO_BUS         0x00000000          /* PCI base   */
+#else
 #define PCI_MSTR_IO_BUS         0xA0000000          /* PCI base   */
+#endif
 #define CPU_PCI_IO_START        PCI_MSTR_IO_LOCAL
 #define PCI_MSTR_IO_SIZE        0x10000000          /* 256MB */
 #define POCMR2_MASK_ATTRIB      (POCMR_MASK_256MB | POCMR_ENABLE | POCMR_PCI_IO)
index 2101a27..c28ed9f 100644 (file)
@@ -30,8 +30,8 @@ LIB   = libdrivers.a
 OBJS   = 3c589.o 5701rls.o at91rm9200_ether.o \
          bcm570x.o bcm570x_autoneg.o \
          cfb_console.o cs8900.o ct69000.o dc2114x.o \
-         eepro100.o i8042.o inca-ip_sw.o lan91c96.o\
-         natsemi.o ns16550.o ns8382x.o ns87308.o \
+         eepro100.o i8042.o i82365.o inca-ip_sw.o \
+         lan91c96.o natsemi.o ns16550.o ns8382x.o ns87308.o \
          pci.o pci_auto.o pci_indirect.o \
          pcnet.o plb2800_eth.o \
          s3c24x0_i2c.o sed13806.o serial.o \
diff --git a/drivers/i82365.c b/drivers/i82365.c
new file mode 100644 (file)
index 0000000..81736b9
--- /dev/null
@@ -0,0 +1,590 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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
+ *
+ ********************************************************************
+ *
+ * Lots of code copied from:
+ *
+ * i82365.c 1.352 - Linux driver for Intel 82365 and compatible
+ * PC Card controllers, and Yenta-compatible PCI-to-CardBus controllers.
+ * (C) 1999 David A. Hinds <dahinds@users.sourceforge.net>
+ */
+
+#include <common.h>
+
+#ifdef CONFIG_I82365
+
+#include <command.h>
+#include <pci.h>
+#include <pcmcia.h>
+#include <cmd_pcmcia.h>
+#include <asm/io.h>
+
+#include <pcmcia/ss.h>
+#include <pcmcia/i82365.h>
+#include <pcmcia/ti113x.h>
+#include <pcmcia/yenta.h>
+
+/* #define DEBUG */
+
+static struct pci_device_id supported[] = {
+       {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1510},
+       {0, 0}
+};
+
+#define CYCLE_TIME     120
+
+#ifdef DEBUG
+static void i82365_dump_regions (pci_dev_t dev);
+#endif
+
+typedef struct socket_info_t {
+    pci_dev_t          dev;
+    u_short            bcr;
+    u_char             pci_lat, cb_lat, sub_bus, cache;
+    u_int              cb_phys;
+
+    socket_cap_t       cap;
+    ti113x_state_t     state;
+} socket_info_t;
+
+static socket_info_t socket;
+static socket_state_t state;
+static struct pccard_mem_map mem;
+static struct pccard_io_map io;
+
+/*====================================================================*/
+
+/* Some PCI shortcuts */
+
+static int pci_readb (socket_info_t * s, int r, u_char * v)
+{
+       return pci_read_config_byte (s->dev, r, v);
+}
+static int pci_writeb (socket_info_t * s, int r, u_char v)
+{
+       return pci_write_config_byte (s->dev, r, v);
+}
+static int pci_readw (socket_info_t * s, int r, u_short * v)
+{
+       return pci_read_config_word (s->dev, r, v);
+}
+static int pci_writew (socket_info_t * s, int r, u_short v)
+{
+       return pci_write_config_word (s->dev, r, v);
+}
+static int pci_readl (socket_info_t * s, int r, u_int * v)
+{
+       return pci_read_config_dword (s->dev, r, v);
+}
+static int pci_writel (socket_info_t * s, int r, u_int v)
+{
+       return pci_write_config_dword (s->dev, r, v);
+}
+
+#define cb_readb(s, r)         readb((s)->cb_phys + (r))
+#define cb_readl(s, r)         readl((s)->cb_phys + (r))
+#define cb_writeb(s, r, v)     writeb(v, (s)->cb_phys + (r))
+#define cb_writel(s, r, v)     writel(v, (s)->cb_phys + (r))
+
+/*====================================================================*/
+
+static u_char i365_get (socket_info_t * s, u_short reg)
+{
+       return cb_readb (s, 0x0800 + reg);
+}
+
+static void i365_set (socket_info_t * s, u_short reg, u_char data)
+{
+       cb_writeb (s, 0x0800 + reg, data);
+}
+
+static void i365_bset (socket_info_t * s, u_short reg, u_char mask)
+{
+       i365_set (s, reg, i365_get (s, reg) | mask);
+}
+
+static void i365_bclr (socket_info_t * s, u_short reg, u_char mask)
+{
+       i365_set (s, reg, i365_get (s, reg) & ~mask);
+}
+
+#if 0  /* not used */
+static void i365_bflip (socket_info_t * s, u_short reg, u_char mask, int b)
+{
+       u_char d = i365_get (s, reg);
+
+       i365_set (s, reg, (b) ? (d | mask) : (d & ~mask));
+}
+
+static u_short i365_get_pair (socket_info_t * s, u_short reg)
+{
+       return (i365_get (s, reg) + (i365_get (s, reg + 1) << 8));
+}
+#endif /* not used */
+
+static void i365_set_pair (socket_info_t * s, u_short reg, u_short data)
+{
+       i365_set (s, reg, data & 0xff);
+       i365_set (s, reg + 1, data >> 8);
+}
+
+/*======================================================================
+
+    Code to save and restore global state information for TI 1130 and
+    TI 1131 controllers, and to set and report global configuration
+    options.
+    
+======================================================================*/
+
+static void ti113x_get_state (socket_info_t * s)
+{
+       ti113x_state_t *p = &s->state;
+
+       pci_readl (s, TI113X_SYSTEM_CONTROL, &p->sysctl);
+       pci_readb (s, TI113X_CARD_CONTROL, &p->cardctl);
+       pci_readb (s, TI113X_DEVICE_CONTROL, &p->devctl);
+       pci_readb (s, TI1250_DIAGNOSTIC, &p->diag);
+       pci_readl (s, TI12XX_IRQMUX, &p->irqmux);
+}
+
+static void ti113x_set_state (socket_info_t * s)
+{
+       ti113x_state_t *p = &s->state;
+
+       pci_writel (s, TI113X_SYSTEM_CONTROL, p->sysctl);
+       pci_writeb (s, TI113X_CARD_CONTROL, p->cardctl);
+       pci_writeb (s, TI113X_DEVICE_CONTROL, p->devctl);
+       pci_writeb (s, TI1250_MULTIMEDIA_CTL, 0);
+       pci_writeb (s, TI1250_DIAGNOSTIC, p->diag);
+       pci_writel (s, TI12XX_IRQMUX, p->irqmux);
+       i365_set_pair (s, TI113X_IO_OFFSET (0), 0);
+       i365_set_pair (s, TI113X_IO_OFFSET (1), 0);
+}
+
+static u_int ti113x_set_opts (socket_info_t * s)
+{
+       ti113x_state_t *p = &s->state;
+       u_int mask = 0xffff;
+
+       p->cardctl &= ~TI113X_CCR_ZVENABLE;
+       p->cardctl |= TI113X_CCR_SPKROUTEN;
+
+       return mask;
+}
+
+/*======================================================================
+
+    Routines to handle common CardBus options
+    
+======================================================================*/
+
+/* Default settings for PCI command configuration register */
+#define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \
+                 PCI_COMMAND_MASTER|PCI_COMMAND_WAIT)
+
+static void cb_get_state (socket_info_t * s)
+{
+       pci_readb (s, PCI_CACHE_LINE_SIZE, &s->cache);
+       pci_readb (s, PCI_LATENCY_TIMER, &s->pci_lat);
+       pci_readb (s, CB_LATENCY_TIMER, &s->cb_lat);
+       pci_readb (s, CB_CARDBUS_BUS, &s->cap.cardbus);
+       pci_readb (s, CB_SUBORD_BUS, &s->sub_bus);
+       pci_readw (s, CB_BRIDGE_CONTROL, &s->bcr);
+}
+
+static void cb_set_state (socket_info_t * s)
+{
+       pci_writel (s, CB_LEGACY_MODE_BASE, 0);
+       pci_writel (s, PCI_BASE_ADDRESS_0, s->cb_phys);
+       pci_writew (s, PCI_COMMAND, CMD_DFLT);
+       pci_writeb (s, PCI_CACHE_LINE_SIZE, s->cache);
+       pci_writeb (s, PCI_LATENCY_TIMER, s->pci_lat);
+       pci_writeb (s, CB_LATENCY_TIMER, s->cb_lat);
+       pci_writeb (s, CB_CARDBUS_BUS, s->cap.cardbus);
+       pci_writeb (s, CB_SUBORD_BUS, s->sub_bus);
+       pci_writew (s, CB_BRIDGE_CONTROL, s->bcr);
+}
+
+static void cb_set_opts (socket_info_t * s)
+{
+       if (s->cache == 0)
+               s->cache = 8;
+       if (s->pci_lat == 0)
+               s->pci_lat = 0xa8;
+       if (s->cb_lat == 0)
+               s->cb_lat = 0xb0;
+}
+
+/*======================================================================
+
+    Power control for Cardbus controllers: used both for 16-bit and
+    Cardbus cards.
+    
+======================================================================*/
+
+static int cb_set_power (socket_info_t * s, socket_state_t * state)
+{
+       u_int reg = 0;
+
+       /* restart card voltage detection if it seems appropriate */
+       if ((state->Vcc == 0) && (state->Vpp == 0) &&
+               !(cb_readl (s, CB_SOCKET_STATE) & CB_SS_VSENSE))
+               cb_writel (s, CB_SOCKET_FORCE, CB_SF_CVSTEST);
+       switch (state->Vcc) {
+       case 0:
+               reg = 0;
+               break;
+       case 33:
+               reg = CB_SC_VCC_3V;
+               break;
+       case 50:
+               reg = CB_SC_VCC_5V;
+               break;
+       default:
+               return -1;
+       }
+       switch (state->Vpp) {
+       case 0:
+               break;
+       case 33:
+               reg |= CB_SC_VPP_3V;
+               break;
+       case 50:
+               reg |= CB_SC_VPP_5V;
+               break;
+       case 120:
+               reg |= CB_SC_VPP_12V;
+               break;
+       default:
+               return -1;
+       }
+       if (reg != cb_readl (s, CB_SOCKET_CONTROL))
+               cb_writel (s, CB_SOCKET_CONTROL, reg);
+       return 0;
+}
+
+/*======================================================================
+
+    Generic routines to get and set controller options
+    
+======================================================================*/
+
+static void get_bridge_state (socket_info_t * s)
+{
+       ti113x_get_state (s);
+       cb_get_state (s);
+}
+
+static void set_bridge_state (socket_info_t * s)
+{
+       cb_set_state (s);
+       i365_set (s, I365_GBLCTL, 0x00);
+       i365_set (s, I365_GENCTL, 0x00);
+       ti113x_set_state (s);
+}
+
+static void set_bridge_opts (socket_info_t * s)
+{
+       ti113x_set_opts (s);
+       cb_set_opts (s);
+}
+
+/*====================================================================*/
+
+static int i365_get_status (socket_info_t * s, u_int * value)
+{
+       u_int status;
+
+       status = i365_get (s, I365_STATUS);
+       *value = ((status & I365_CS_DETECT) == I365_CS_DETECT) ? SS_DETECT : 0;
+       if (i365_get (s, I365_INTCTL) & I365_PC_IOCARD) {
+               *value |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
+       } else {
+               *value |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
+               *value |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
+       }
+       *value |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
+       *value |= (status & I365_CS_READY) ? SS_READY : 0;
+       *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
+
+       status = cb_readl (s, CB_SOCKET_STATE);
+       *value |= (status & CB_SS_32BIT) ? SS_CARDBUS : 0;
+       *value |= (status & CB_SS_3VCARD) ? SS_3VCARD : 0;
+       *value |= (status & CB_SS_XVCARD) ? SS_XVCARD : 0;
+       *value |= (status & CB_SS_VSENSE) ? 0 : SS_PENDING;
+       /* For now, ignore cards with unsupported voltage keys */
+       if (*value & SS_XVCARD)
+               *value &= ~(SS_DETECT | SS_3VCARD | SS_XVCARD);
+
+       return 0;
+}      /* i365_get_status */
+
+static int i365_set_socket (socket_info_t * s, socket_state_t * state)
+{
+       u_char reg;
+
+       set_bridge_state (s);
+
+       /* IO card, RESET flag */
+       reg = 0;
+       reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
+       reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
+       i365_set (s, I365_INTCTL, reg);
+
+       reg = I365_PWR_NORESET;
+       if (state->flags & SS_PWR_AUTO)
+               reg |= I365_PWR_AUTO;
+       if (state->flags & SS_OUTPUT_ENA)
+               reg |= I365_PWR_OUT;
+
+       cb_set_power (s, state);
+       reg |= i365_get (s, I365_POWER) & (I365_VCC_MASK | I365_VPP1_MASK);
+
+       if (reg != i365_get (s, I365_POWER))
+               i365_set (s, I365_POWER, reg);
+
+       return 0;
+}      /* i365_set_socket */
+
+/*====================================================================*/
+
+static int i365_set_mem_map (socket_info_t * s, struct pccard_mem_map *mem)
+{
+       u_short base, i;
+       u_char map;
+
+       map = mem->map;
+       if ((map > 4) ||
+           (mem->card_start > 0x3ffffff) ||
+           (mem->sys_start > mem->sys_stop) ||
+           (mem->speed > 1000)) {
+               return -1;
+       }
+
+       /* Turn off the window before changing anything */
+       if (i365_get (s, I365_ADDRWIN) & I365_ENA_MEM (map))
+               i365_bclr (s, I365_ADDRWIN, I365_ENA_MEM (map));
+
+       /* Take care of high byte, for PCI controllers */
+       i365_set (s, CB_MEM_PAGE (map), mem->sys_start >> 24);
+
+       base = I365_MEM (map);
+       i = (mem->sys_start >> 12) & 0x0fff;
+       if (mem->flags & MAP_16BIT)
+               i |= I365_MEM_16BIT;
+       if (mem->flags & MAP_0WS)
+               i |= I365_MEM_0WS;
+       i365_set_pair (s, base + I365_W_START, i);
+
+       i = (mem->sys_stop >> 12) & 0x0fff;
+       switch (mem->speed / CYCLE_TIME) {
+       case 0:
+               break;
+       case 1:
+               i |= I365_MEM_WS0;
+               break;
+       case 2:
+               i |= I365_MEM_WS1;
+               break;
+       default:
+               i |= I365_MEM_WS1 | I365_MEM_WS0;
+               break;
+       }
+       i365_set_pair (s, base + I365_W_STOP, i);
+
+       i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff;
+       if (mem->flags & MAP_WRPROT)
+               i |= I365_MEM_WRPROT;
+       if (mem->flags & MAP_ATTRIB)
+               i |= I365_MEM_REG;
+       i365_set_pair (s, base + I365_W_OFF, i);
+
+       /* Turn on the window if necessary */
+       if (mem->flags & MAP_ACTIVE)
+               i365_bset (s, I365_ADDRWIN, I365_ENA_MEM (map));
+       return 0;
+}      /* i365_set_mem_map */
+
+static int i365_set_io_map (socket_info_t * s, struct pccard_io_map *io)
+{
+       u_char map, ioctl;
+
+       map = io->map;
+       if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
+               (io->stop < io->start))
+               return -1;
+       /* Turn off the window before changing anything */
+       if (i365_get (s, I365_ADDRWIN) & I365_ENA_IO (map))
+               i365_bclr (s, I365_ADDRWIN, I365_ENA_IO (map));
+       i365_set_pair (s, I365_IO (map) + I365_W_START, io->start);
+       i365_set_pair (s, I365_IO (map) + I365_W_STOP, io->stop);
+       ioctl = i365_get (s, I365_IOCTL) & ~I365_IOCTL_MASK (map);
+       if (io->speed)
+               ioctl |= I365_IOCTL_WAIT (map);
+       if (io->flags & MAP_0WS)
+               ioctl |= I365_IOCTL_0WS (map);
+       if (io->flags & MAP_16BIT)
+               ioctl |= I365_IOCTL_16BIT (map);
+       if (io->flags & MAP_AUTOSZ)
+               ioctl |= I365_IOCTL_IOCS16 (map);
+       i365_set (s, I365_IOCTL, ioctl);
+       /* Turn on the window if necessary */
+       if (io->flags & MAP_ACTIVE)
+               i365_bset (s, I365_ADDRWIN, I365_ENA_IO (map));
+       return 0;
+}      /* i365_set_io_map */
+
+/*====================================================================*/
+
+int i82365_init (void)
+{
+       u_int val;
+       int i;
+
+       if ((socket.dev = pci_find_devices (supported, 0)) < 0) {
+               /* Controller not found */
+               return 1;
+       }
+
+       pci_read_config_dword (socket.dev, PCI_BASE_ADDRESS_0, &socket.cb_phys);
+       socket.cb_phys &= ~0xf;
+
+       get_bridge_state (&socket);
+       set_bridge_opts (&socket);
+
+       i365_get_status (&socket, &val);
+
+       if (val & SS_DETECT) {
+               if (val & SS_3VCARD) {
+                       state.Vcc = state.Vpp = 33;
+                       puts (" 3.3V card found: ");
+               } else if (!(val & SS_XVCARD)) {
+                       state.Vcc = state.Vpp = 50;
+                       puts (" 5.0V card found: ");
+               } else {
+                       printf ("i82365: unsupported voltage key\n");
+                       state.Vcc = state.Vpp = 0;
+               }
+       } else {
+               /* No card inserted */
+               return 1;
+       }
+
+       state.flags = SS_IOCARD | SS_OUTPUT_ENA;
+       state.csc_mask = 0;
+       state.io_irq = 0;
+
+       i365_set_socket (&socket, &state);
+
+       for (i = 500; i; i--) {
+               if ((i365_get (&socket, I365_STATUS) & I365_CS_READY))
+                       break;
+               udelay (1000);
+       }
+
+       if (i == 0) {
+               /* PC Card not ready for data transfer */
+               return 1;
+       }
+
+       mem.map = 0;
+       mem.flags = MAP_ATTRIB | MAP_ACTIVE;
+       mem.speed = 300;
+       mem.sys_start = CFG_PCMCIA_MEM_ADDR;
+       mem.sys_stop = CFG_PCMCIA_MEM_ADDR + CFG_PCMCIA_MEM_SIZE - 1;
+       mem.card_start = 0;
+
+       i365_set_mem_map (&socket, &mem);
+
+       io.map = 0;
+       io.flags = MAP_AUTOSZ | MAP_ACTIVE;
+       io.speed = 0;
+       io.start = 0x0100;
+       io.stop = 0x010F;
+
+       i365_set_io_map (&socket, &io);
+
+#ifdef DEBUG
+       i82365_dump_regions (socket.dev);
+#endif
+
+       return 0;
+}
+
+void i82365_exit (void)
+{
+       io.map = 0;
+       io.flags = 0;
+       io.speed = 0;
+       io.start = 0;
+       io.stop = 0x1;
+
+       i365_set_io_map (&socket, &io);
+
+       mem.map = 0;
+       mem.flags = 0;
+       mem.speed = 0;
+       mem.sys_start = 0;
+       mem.sys_stop = 0x1000;
+       mem.card_start = 0;
+
+       i365_set_mem_map (&socket, &mem);
+
+       socket.state.sysctl &= 0xFFFF00FF;
+
+       state.Vcc = state.Vpp = 0;
+
+       i365_set_socket (&socket, &state);
+}
+
+/*======================================================================
+
+    Debug stuff
+    
+======================================================================*/
+
+#ifdef DEBUG
+static void i82365_dump_regions (pci_dev_t dev)
+{
+       u_int tmp[2];
+       u_int *mem = (void *) sock.cb_phys;
+       u_char *cis = (void *) CFG_PCMCIA_MEM_ADDR;
+       u_char *ide = (void *) (CFG_ATA_BASE_ADDR + CFG_ATA_REG_OFFSET);
+
+       pci_read_config_dword (dev, 0x00, tmp + 0);
+       pci_read_config_dword (dev, 0x80, tmp + 1);
+
+       printf ("PCI CONF: %08X ... %08X\n", tmp[0], tmp[1]);
+       printf ("PCI MEM:  ... %08X ... %08X\n", mem[0x8 / 4], mem[0x800 / 4]);
+       printf ("CIS:      ...%c%c%c%c%c%c%c%c...\n",
+               cis[0x38], cis[0x3a], cis[0x3c], cis[0x3e],
+               cis[0x40], cis[0x42], cis[0x44], cis[0x48]);
+       printf ("CIS CONF: %02X %02X %02X ...\n",
+               cis[0x200], cis[0x202], cis[0x204]);
+       printf ("IDE:      %02X %02X %02X %02X %02X %02X %02X %02X\n",
+               ide[0], ide[1], ide[2], ide[3],
+               ide[4], ide[5], ide[6], ide[7]);
+}
+#endif /* DEBUG */
+
+#endif /* CONFIG_I82365 */
index f7b4422..fdf4d13 100644 (file)
@@ -21,7 +21,7 @@
 #define cfg_read(val, addr, type, op)  *val = op((type)(addr))
 #define cfg_write(val, addr, type, op) op((type *)(addr), (val))
 
-#ifdef CONFIG_PM826
+#if defined(CONFIG_PM826) || defined(CONFIG_ATC)
 #define INDIRECT_PCI_OP(rw, size, type, op, mask)                       \
 static int                                                              \
 indirect_##rw##_config_##size(struct pci_controller *hose,              \
index 0d0b8c3..a9d1aff 100644 (file)
@@ -92,6 +92,7 @@
 #define CONFIG_COMMANDS              ( CONFIG_CMD_DFL  | \
                                CFG_CMD_ASKENV  | \
                                CFG_CMD_DHCP    | \
+                               CFG_CMD_ELF     | \
                                CFG_CMD_IDE     | \
                                CFG_CMD_DATE    )
 
index 0651ede..4f30847 100644 (file)
 
 #define CONFIG_BOOTP_MASK      (CONFIG_BOOTP_DEFAULT|CONFIG_BOOTP_BOOTFILESIZE)
 
-#define CONFIG_COMMANDS                (CONFIG_CMD_DFL | CFG_CMD_EEPROM)
+#define CONFIG_COMMANDS                (CONFIG_CMD_DFL | \
+                                CFG_CMD_EEPROM | \
+                                CFG_CMD_PCI | \
+                                CFG_CMD_PCMCIA | \
+                                CFG_CMD_IDE)
+#define CONFIG_DOS_PARTITION
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
 
 #define        CFG_LOAD_ADDR   0x100000        /* default load address */
 
+#define CFG_PIO_MODE           0       /* IDE interface in PIO Mode 0  */
+
 #define        CFG_HZ          1000            /* decrementer freq: 1 ms ticks */
 
 #define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
 # define CFG_RAMBOOT
 #endif
 
+#define        CONFIG_PCI
+#define        CONFIG_PCI_PNP
+
 #if 1
 /* environment is in Flash */
 #define CFG_ENV_IS_IN_FLASH    1
 #define CFG_PSDMR       CFG_PSDMR_8COL
 #endif /* CFG_RAMBOOT */
 
+/*-----------------------------------------------------------------------
+ * PCMCIA stuff
+ *-----------------------------------------------------------------------
+ *
+ */
+#define CONFIG_I82365
+
+#define CFG_PCMCIA_MEM_ADDR    0x81000000
+#define CFG_PCMCIA_MEM_SIZE    0x1000
+
+/*-----------------------------------------------------------------------
+ * IDE/ATA stuff (Supports IDE harddisk on PCMCIA Adapter)
+ *-----------------------------------------------------------------------
+ */
+
+#define CONFIG_IDE_8xx_PCCARD  1       /* Use IDE with PC Card Adapter */
+
+#undef CONFIG_IDE_8xx_DIRECT           /* Direct IDE    not supported  */
+#undef CONFIG_IDE_LED                  /* LED   for ide not supported  */
+#undef CONFIG_IDE_RESET                /* reset for ide not supported  */
+
+#define CFG_IDE_MAXBUS         1       /* max. 1 IDE bus               */
+#define CFG_IDE_MAXDEVICE      1       /* max. 1 drive per IDE bus     */
+
+#define CFG_ATA_IDE0_OFFSET    0x0000
+
+#define CFG_ATA_BASE_ADDR      0xa0000000
+
+/* Offset for data I/O                 */
+#define CFG_ATA_DATA_OFFSET    0x100
+
+/* Offset for normal register accesses */
+#define CFG_ATA_REG_OFFSET     0x100
+
+/* Offset for alternate registers      */
+#define CFG_ATA_ALT_OFFSET     0x108
+
 #endif /* __CONFIG_H */
index 87de6a9..f4fc52f 100644 (file)
 #define PCI_DEVICE_ID_TI_1211          0xac1e
 #define PCI_DEVICE_ID_TI_1251B         0xac1f
 #define PCI_DEVICE_ID_TI_1420          0xac51
+#define PCI_DEVICE_ID_TI_1510          0xac56
 
 #define PCI_VENDOR_ID_SONY             0x104d
 #define PCI_DEVICE_ID_SONY_CXD3222     0x8039
index 16653f3..1609632 100644 (file)
@@ -62,6 +62,8 @@
 # define CONFIG_PCMCIA_SLOT_B
 #elif defined(CONFIG_R360MPI)          /* The R360MPI use SLOT_B       */
 # define CONFIG_PCMCIA_SLOT_B
+#elif defined(CONFIG_ATC)              /* The ATC use SLOT_A   */
+# define CONFIG_PCMCIA_SLOT_A
 #else
 # error "PCMCIA Slot not configured"
 #endif
diff --git a/include/pcmcia/i82365.h b/include/pcmcia/i82365.h
new file mode 100644 (file)
index 0000000..27ee583
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * i82365.h 1.21 2001/08/24 12:15:33
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License. 
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+
+#ifndef _LINUX_I82365_H
+#define _LINUX_I82365_H
+
+/* register definitions for the Intel 82365SL PCMCIA controller */
+
+/* Offsets for PCIC registers */
+#define I365_IDENT     0x00    /* Identification and revision */
+#define I365_STATUS    0x01    /* Interface status */
+#define I365_POWER     0x02    /* Power and RESETDRV control */
+#define I365_INTCTL    0x03    /* Interrupt and general control */
+#define I365_CSC       0x04    /* Card status change */
+#define I365_CSCINT    0x05    /* Card status change interrupt control */
+#define I365_ADDRWIN   0x06    /* Address window enable */
+#define I365_IOCTL     0x07    /* I/O control */
+#define I365_GENCTL    0x16    /* Card detect and general control */
+#define I365_GBLCTL    0x1E    /* Global control register */
+
+/* Offsets for I/O and memory window registers */
+#define I365_IO(map)   (0x08+((map)<<2))
+#define I365_MEM(map)  (0x10+((map)<<3))
+#define I365_W_START   0
+#define I365_W_STOP    2
+#define I365_W_OFF     4
+
+/* Flags for I365_STATUS */
+#define I365_CS_BVD1   0x01
+#define I365_CS_STSCHG 0x01
+#define I365_CS_BVD2   0x02
+#define I365_CS_SPKR   0x02
+#define I365_CS_DETECT 0x0C
+#define I365_CS_WRPROT 0x10
+#define I365_CS_READY  0x20    /* Inverted */
+#define I365_CS_POWERON        0x40
+#define I365_CS_GPI    0x80
+
+/* Flags for I365_POWER */
+#define I365_PWR_OFF   0x00    /* Turn off the socket */
+#define I365_PWR_OUT   0x80    /* Output enable */
+#define I365_PWR_NORESET 0x40  /* Disable RESETDRV on resume */
+#define I365_PWR_AUTO  0x20    /* Auto pwr switch enable */
+#define I365_VCC_MASK  0x18    /* Mask for turning off Vcc */
+/* There are different layouts for B-step and DF-step chips: the B
+   step has independent Vpp1/Vpp2 control, and the DF step has only
+   Vpp1 control, plus 3V control */
+#define I365_VCC_5V    0x10    /* Vcc = 5.0v */
+#define I365_VCC_3V    0x18    /* Vcc = 3.3v */
+#define I365_VPP2_MASK 0x0c    /* Mask for turning off Vpp2 */
+#define I365_VPP2_5V   0x04    /* Vpp2 = 5.0v */
+#define I365_VPP2_12V  0x08    /* Vpp2 = 12.0v */
+#define I365_VPP1_MASK 0x03    /* Mask for turning off Vpp1 */
+#define I365_VPP1_5V   0x01    /* Vpp2 = 5.0v */
+#define I365_VPP1_12V  0x02    /* Vpp2 = 12.0v */
+
+/* Flags for I365_INTCTL */
+#define I365_RING_ENA  0x80
+#define I365_PC_RESET  0x40
+#define I365_PC_IOCARD 0x20
+#define I365_INTR_ENA  0x10
+#define I365_IRQ_MASK  0x0F
+
+/* Flags for I365_CSC and I365_CSCINT*/
+#define I365_CSC_BVD1  0x01
+#define I365_CSC_STSCHG        0x01
+#define I365_CSC_BVD2  0x02
+#define I365_CSC_READY 0x04
+#define I365_CSC_DETECT        0x08
+#define I365_CSC_ANY   0x0F
+#define I365_CSC_GPI   0x10
+
+/* Flags for I365_ADDRWIN */
+#define I365_ADDR_MEMCS16      0x20
+#define I365_ENA_IO(map)       (0x40 << (map))
+#define I365_ENA_MEM(map)      (0x01 << (map))
+
+/* Flags for I365_IOCTL */
+#define I365_IOCTL_MASK(map)   (0x0F << (map<<2))
+#define I365_IOCTL_WAIT(map)   (0x08 << (map<<2))
+#define I365_IOCTL_0WS(map)    (0x04 << (map<<2))
+#define I365_IOCTL_IOCS16(map) (0x02 << (map<<2))
+#define I365_IOCTL_16BIT(map)  (0x01 << (map<<2))
+
+/* Flags for I365_GENCTL */
+#define I365_CTL_16DELAY       0x01
+#define I365_CTL_RESET         0x02
+#define I365_CTL_GPI_ENA       0x04
+#define I365_CTL_GPI_CTL       0x08
+#define I365_CTL_RESUME                0x10
+#define I365_CTL_SW_IRQ                0x20
+
+/* Flags for I365_GBLCTL */
+#define I365_GBL_PWRDOWN       0x01
+#define I365_GBL_CSC_LEV       0x02
+#define I365_GBL_WRBACK                0x04
+#define I365_GBL_IRQ_0_LEV     0x08
+#define I365_GBL_IRQ_1_LEV     0x10
+
+/* Flags for memory window registers */
+#define I365_MEM_16BIT 0x8000  /* In memory start high byte */
+#define I365_MEM_0WS   0x4000
+#define I365_MEM_WS1   0x8000  /* In memory stop high byte */
+#define I365_MEM_WS0   0x4000
+#define I365_MEM_WRPROT        0x8000  /* In offset high byte */
+#define I365_MEM_REG   0x4000
+
+#define I365_REG(slot, reg)    (((slot) << 6) | (reg))
+
+/* Default ISA interrupt mask */
+#define I365_ISA_IRQ_MASK      0xdeb8  /* irq's 3-5,7,9-12,14,15 */
+
+/* Device ID's for PCI-to-PCMCIA bridges */
+
+#ifndef PCI_VENDOR_ID_INTEL
+#define PCI_VENDOR_ID_INTEL            0x8086
+#endif
+#ifndef PCI_DEVICE_ID_INTEL_82092AA_0
+#define PCI_DEVICE_ID_INTEL_82092AA_0  0x1221
+#endif
+#ifndef PCI_VENDOR_ID_OMEGA
+#define PCI_VENDOR_ID_OMEGA            0x119b
+#endif
+#ifndef PCI_DEVICE_ID_OMEGA_82C092G
+#define PCI_DEVICE_ID_OMEGA_82C092G    0x1221
+#endif
+
+#endif /* _LINUX_I82365_H */
diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h
new file mode 100644 (file)
index 0000000..d197e42
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * ss.h 1.31 2001/08/24 12:16:13
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License. 
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+
+#ifndef _LINUX_SS_H
+#define _LINUX_SS_H
+
+/* For RegisterCallback */
+typedef struct ss_callback_t {
+    void       (*handler)(void *info, u_int events);
+    void       *info;
+} ss_callback_t;
+
+/* Definitions for card status flags for GetStatus */
+#define SS_WRPROT      0x0001
+#define SS_CARDLOCK    0x0002
+#define SS_EJECTION    0x0004
+#define SS_INSERTION   0x0008
+#define SS_BATDEAD     0x0010
+#define SS_BATWARN     0x0020
+#define SS_READY       0x0040
+#define SS_DETECT      0x0080
+#define SS_POWERON     0x0100
+#define SS_GPI         0x0200
+#define SS_STSCHG      0x0400
+#define SS_CARDBUS     0x0800
+#define SS_3VCARD      0x1000
+#define SS_XVCARD      0x2000
+#define SS_PENDING     0x4000
+
+/* for InquireSocket */
+typedef struct socket_cap_t {
+    u_int      features;
+    u_int      irq_mask;
+    u_int      map_size;
+    u_char     pci_irq;
+    u_char     cardbus;
+    struct pci_bus *cb_bus;
+    struct bus_operations *bus;
+} socket_cap_t;
+
+/* InquireSocket capabilities */
+#define SS_CAP_PAGE_REGS       0x0001
+#define SS_CAP_VIRTUAL_BUS     0x0002
+#define SS_CAP_MEM_ALIGN       0x0004
+#define SS_CAP_STATIC_MAP      0x0008
+#define SS_CAP_PCCARD          0x4000
+#define SS_CAP_CARDBUS         0x8000
+
+/* for GetSocket, SetSocket */
+typedef struct socket_state_t {
+    u_int      flags;
+    u_int      csc_mask;
+    u_char     Vcc, Vpp;
+    u_char     io_irq;
+} socket_state_t;
+
+/* Socket configuration flags */
+#define SS_PWR_AUTO    0x0010
+#define SS_IOCARD      0x0020
+#define SS_RESET       0x0040
+#define SS_DMA_MODE    0x0080
+#define SS_SPKR_ENA    0x0100
+#define SS_OUTPUT_ENA  0x0200
+#define SS_ZVCARD      0x0400
+
+/* Flags for I/O port and memory windows */
+#define MAP_ACTIVE     0x01
+#define MAP_16BIT      0x02
+#define MAP_AUTOSZ     0x04
+#define MAP_0WS                0x08
+#define MAP_WRPROT     0x10
+#define MAP_ATTRIB     0x20
+#define MAP_USE_WAIT   0x40
+#define MAP_PREFETCH   0x80
+
+/* Use this just for bridge windows */
+#define MAP_IOSPACE    0x20
+
+typedef struct pccard_io_map {
+    u_char     map;
+    u_char     flags;
+    u_short    speed;
+    u_short    start, stop;
+} pccard_io_map;
+
+typedef struct pccard_mem_map {
+    u_char     map;
+    u_char     flags;
+    u_short    speed;
+    u_long     sys_start, sys_stop;
+    u_int      card_start;
+} pccard_mem_map;
+
+typedef struct cb_bridge_map {
+    u_char     map;
+    u_char     flags;
+    u_int      start, stop;
+} cb_bridge_map;
+
+enum ss_service {
+    SS_RegisterCallback, SS_InquireSocket,
+    SS_GetStatus, SS_GetSocket, SS_SetSocket,
+    SS_GetIOMap, SS_SetIOMap, SS_GetMemMap, SS_SetMemMap,
+    SS_GetBridge, SS_SetBridge, SS_ProcSetup
+};
+
+#endif /* _LINUX_SS_H */
diff --git a/include/pcmcia/ti113x.h b/include/pcmcia/ti113x.h
new file mode 100644 (file)
index 0000000..26c5764
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+ * ti113x.h 1.31 2002/05/12 18:19:47
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License. 
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+
+#ifndef _LINUX_TI113X_H
+#define _LINUX_TI113X_H
+
+#ifndef PCI_VENDOR_ID_TI
+#define PCI_VENDOR_ID_TI               0x104c
+#endif
+
+#ifndef PCI_DEVICE_ID_TI_1130
+#define PCI_DEVICE_ID_TI_1130          0xac12
+#endif
+#ifndef PCI_DEVICE_ID_TI_1031
+#define PCI_DEVICE_ID_TI_1031          0xac13
+#endif
+#ifndef PCI_DEVICE_ID_TI_1131
+#define PCI_DEVICE_ID_TI_1131          0xac15
+#endif
+#ifndef PCI_DEVICE_ID_TI_1210
+#define PCI_DEVICE_ID_TI_1210          0xac1a
+#endif
+#ifndef PCI_DEVICE_ID_TI_1211
+#define PCI_DEVICE_ID_TI_1211          0xac1e
+#endif
+#ifndef PCI_DEVICE_ID_TI_1220
+#define PCI_DEVICE_ID_TI_1220          0xac17
+#endif
+#ifndef PCI_DEVICE_ID_TI_1221
+#define PCI_DEVICE_ID_TI_1221          0xac19
+#endif
+#ifndef PCI_DEVICE_ID_TI_1250A
+#define PCI_DEVICE_ID_TI_1250A         0xac16
+#endif
+#ifndef PCI_DEVICE_ID_TI_1225
+#define PCI_DEVICE_ID_TI_1225          0xac1c
+#endif
+#ifndef PCI_DEVICE_ID_TI_1251A
+#define PCI_DEVICE_ID_TI_1251A         0xac1d
+#endif
+#ifndef PCI_DEVICE_ID_TI_1251B
+#define PCI_DEVICE_ID_TI_1251B         0xac1f
+#endif
+#ifndef PCI_DEVICE_ID_TI_1410
+#define PCI_DEVICE_ID_TI_1410          0xac50
+#endif
+#ifndef PCI_DEVICE_ID_TI_1420
+#define PCI_DEVICE_ID_TI_1420          0xac51
+#endif
+#ifndef PCI_DEVICE_ID_TI_1450
+#define PCI_DEVICE_ID_TI_1450          0xac1b
+#endif
+#ifndef PCI_DEVICE_ID_TI_1451
+#define PCI_DEVICE_ID_TI_1451          0xac52
+#endif
+#ifndef PCI_DEVICE_ID_TI_1510
+#define PCI_DEVICE_ID_TI_1510          0xac56
+#endif
+#ifndef PCI_DEVICE_ID_TI_4410
+#define PCI_DEVICE_ID_TI_4410          0xac41
+#endif
+#ifndef PCI_DEVICE_ID_TI_4450
+#define PCI_DEVICE_ID_TI_4450          0xac40
+#endif
+#ifndef PCI_DEVICE_ID_TI_4451
+#define PCI_DEVICE_ID_TI_4451          0xac42
+#endif
+
+/* Register definitions for TI 113X PCI-to-CardBus bridges */
+
+/* System Control Register */
+#define TI113X_SYSTEM_CONTROL          0x80    /* 32 bit */
+#define  TI113X_SCR_SMIROUTE           0x04000000
+#define  TI113X_SCR_SMISTATUS          0x02000000
+#define  TI113X_SCR_SMIENB             0x01000000
+#define  TI113X_SCR_VCCPROT            0x00200000
+#define  TI113X_SCR_REDUCEZV           0x00100000
+#define  TI113X_SCR_CDREQEN            0x00080000
+#define  TI113X_SCR_CDMACHAN           0x00070000
+#define  TI113X_SCR_SOCACTIVE          0x00002000
+#define  TI113X_SCR_PWRSTREAM          0x00000800
+#define  TI113X_SCR_DELAYUP            0x00000400
+#define  TI113X_SCR_DELAYDOWN          0x00000200
+#define  TI113X_SCR_INTERROGATE                0x00000100
+#define  TI113X_SCR_CLKRUN_SEL         0x00000080
+#define  TI113X_SCR_PWRSAVINGS         0x00000040
+#define  TI113X_SCR_SUBSYSRW           0x00000020
+#define  TI113X_SCR_CB_DPAR            0x00000010
+#define  TI113X_SCR_CDMA_EN            0x00000008
+#define  TI113X_SCR_ASYNC_IRQ          0x00000004
+#define  TI113X_SCR_KEEPCLK            0x00000002
+#define  TI113X_SCR_CLKRUN_ENA         0x00000001  
+
+#define  TI122X_SCR_SER_STEP           0xc0000000
+#define  TI122X_SCR_INTRTIE            0x20000000
+#define  TI122X_SCR_P2CCLK             0x08000000
+#define  TI122X_SCR_CBRSVD             0x00400000
+#define  TI122X_SCR_MRBURSTDN          0x00008000
+#define  TI122X_SCR_MRBURSTUP          0x00004000
+#define  TI122X_SCR_RIMUX              0x00000001
+
+/* Multimedia Control Register */
+#define TI1250_MULTIMEDIA_CTL          0x84    /* 8 bit */
+#define  TI1250_MMC_ZVOUTEN            0x80
+#define  TI1250_MMC_PORTSEL            0x40
+#define  TI1250_MMC_ZVEN1              0x02
+#define  TI1250_MMC_ZVEN0              0x01
+
+#define TI1250_GENERAL_STATUS          0x85    /* 8 bit */
+#define TI1250_GPIO0_CONTROL           0x88    /* 8 bit */
+#define TI1250_GPIO1_CONTROL           0x89    /* 8 bit */
+#define TI1250_GPIO2_CONTROL           0x8a    /* 8 bit */
+#define TI1250_GPIO3_CONTROL           0x8b    /* 8 bit */
+#define TI12XX_IRQMUX                  0x8c    /* 32 bit */
+
+/* Retry Status Register */
+#define TI113X_RETRY_STATUS            0x90    /* 8 bit */
+#define  TI113X_RSR_PCIRETRY           0x80
+#define  TI113X_RSR_CBRETRY            0x40
+#define  TI113X_RSR_TEXP_CBB           0x20
+#define  TI113X_RSR_MEXP_CBB           0x10
+#define  TI113X_RSR_TEXP_CBA           0x08
+#define  TI113X_RSR_MEXP_CBA           0x04
+#define  TI113X_RSR_TEXP_PCI           0x02
+#define  TI113X_RSR_MEXP_PCI           0x01
+
+/* Card Control Register */
+#define TI113X_CARD_CONTROL            0x91    /* 8 bit */
+#define  TI113X_CCR_RIENB              0x80
+#define  TI113X_CCR_ZVENABLE           0x40
+#define  TI113X_CCR_PCI_IRQ_ENA                0x20
+#define  TI113X_CCR_PCI_IREQ           0x10
+#define  TI113X_CCR_PCI_CSC            0x08
+#define  TI113X_CCR_SPKROUTEN          0x02
+#define  TI113X_CCR_IFG                        0x01
+
+#define  TI1220_CCR_PORT_SEL           0x20
+#define  TI122X_CCR_AUD2MUX            0x04
+
+/* Device Control Register */
+#define TI113X_DEVICE_CONTROL          0x92    /* 8 bit */
+#define  TI113X_DCR_5V_FORCE           0x40
+#define  TI113X_DCR_3V_FORCE           0x20
+#define  TI113X_DCR_IMODE_MASK         0x06
+#define  TI113X_DCR_IMODE_ISA          0x02
+#define  TI113X_DCR_IMODE_SERIAL       0x04
+
+#define  TI12XX_DCR_IMODE_PCI_ONLY     0x00
+#define  TI12XX_DCR_IMODE_ALL_SERIAL   0x06
+
+/* Buffer Control Register */
+#define TI113X_BUFFER_CONTROL          0x93    /* 8 bit */
+#define  TI113X_BCR_CB_READ_DEPTH      0x08
+#define  TI113X_BCR_CB_WRITE_DEPTH     0x04
+#define  TI113X_BCR_PCI_READ_DEPTH     0x02
+#define  TI113X_BCR_PCI_WRITE_DEPTH    0x01
+
+/* Diagnostic Register */
+#define TI1250_DIAGNOSTIC              0x93    /* 8 bit */
+#define  TI1250_DIAG_TRUE_VALUE                0x80
+#define  TI1250_DIAG_PCI_IREQ          0x40
+#define  TI1250_DIAG_PCI_CSC           0x20
+#define  TI1250_DIAG_ASYNC_CSC         0x01
+
+/* DMA Registers */
+#define TI113X_DMA_0                   0x94    /* 32 bit */
+#define TI113X_DMA_1                   0x98    /* 32 bit */
+
+/* ExCA IO offset registers */
+#define TI113X_IO_OFFSET(map)          (0x36+((map)<<1))
+
+/* Data structure for tracking vendor-specific state */
+typedef struct ti113x_state_t {
+    u32                        sysctl;         /* TI113X_SYSTEM_CONTROL */
+    u8                 cardctl;        /* TI113X_CARD_CONTROL */
+    u8                 devctl;         /* TI113X_DEVICE_CONTROL */
+    u8                 diag;           /* TI1250_DIAGNOSTIC */
+    u32                        irqmux;         /* TI12XX_IRQMUX */
+} ti113x_state_t;
+
+#define TI_PCIC_ID \
+    IS_TI1130, IS_TI1131, IS_TI1031, IS_TI1210, IS_TI1211,     \
+    IS_TI1220, IS_TI1221, IS_TI1225, IS_TI1250A, IS_TI1251A,   \
+    IS_TI1251B, IS_TI1410, IS_TI1420, IS_TI1450, IS_TI1451,    \
+    IS_TI1510, IS_TI4410, IS_TI4450, IS_TI4451
+
+#define TI_PCIC_INFO \
+    { "TI 1130",  IS_TI|IS_CARDBUS, ID(TI, 1130) }, \
+    { "TI 1131",  IS_TI|IS_CARDBUS, ID(TI, 1131) }, \
+    { "TI 1031",  IS_TI|IS_CARDBUS, ID(TI, 1031) }, \
+    { "TI 1210",  IS_TI|IS_CARDBUS, ID(TI, 1210) }, \
+    { "TI 1211",  IS_TI|IS_CARDBUS, ID(TI, 1211) }, \
+    { "TI 1220",  IS_TI|IS_CARDBUS, ID(TI, 1220) }, \
+    { "TI 1221",  IS_TI|IS_CARDBUS, ID(TI, 1221) }, \
+    { "TI 1225",  IS_TI|IS_CARDBUS, ID(TI, 1225) }, \
+    { "TI 1250A", IS_TI|IS_CARDBUS, ID(TI, 1250A) }, \
+    { "TI 1251A", IS_TI|IS_CARDBUS, ID(TI, 1251A) }, \
+    { "TI 1251B", IS_TI|IS_CARDBUS, ID(TI, 1251B) }, \
+    { "TI 1410",  IS_TI|IS_CARDBUS, ID(TI, 1410) }, \
+    { "TI 1420",  IS_TI|IS_CARDBUS, ID(TI, 1420) }, \
+    { "TI 1450",  IS_TI|IS_CARDBUS, ID(TI, 1450) }, \
+    { "TI 1451",  IS_TI|IS_CARDBUS, ID(TI, 1451) }, \
+    { "TI 1510",  IS_TI|IS_CARDBUS, ID(TI, 1510) }, \
+    { "TI 4410",  IS_TI|IS_CARDBUS, ID(TI, 4410) }, \
+    { "TI 4450",  IS_TI|IS_CARDBUS, ID(TI, 4450) }, \
+    { "TI 4451",  IS_TI|IS_CARDBUS, ID(TI, 4451) }
+
+#endif /* _LINUX_TI113X_H */
diff --git a/include/pcmcia/yenta.h b/include/pcmcia/yenta.h
new file mode 100644 (file)
index 0000000..525d8ec
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * yenta.h 1.20 2001/08/24 12:15:34
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License. 
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use
+ * your version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+
+#ifndef _LINUX_YENTA_H
+#define _LINUX_YENTA_H
+
+/* PCI Configuration Registers */
+
+#define PCI_STATUS_CAPLIST             0x10
+#define PCI_CB_CAPABILITY_POINTER      0x14    /* 8 bit */
+#define PCI_CAPABILITY_ID              0x00    /* 8 bit */
+#define  PCI_CAPABILITY_PM             0x01
+#define PCI_NEXT_CAPABILITY            0x01    /* 8 bit */
+#define PCI_PM_CAPABILITIES            0x02    /* 16 bit */
+#define  PCI_PMCAP_PME_D3COLD          0x8000
+#define  PCI_PMCAP_PME_D3HOT           0x4000
+#define  PCI_PMCAP_PME_D2              0x2000
+#define  PCI_PMCAP_PME_D1              0x1000
+#define  PCI_PMCAP_PME_D0              0x0800
+#define  PCI_PMCAP_D2_CAP              0x0400
+#define  PCI_PMCAP_D1_CAP              0x0200
+#define  PCI_PMCAP_DYN_DATA            0x0100
+#define  PCI_PMCAP_DSI                 0x0020
+#define  PCI_PMCAP_AUX_PWR             0x0010
+#define  PCI_PMCAP_PMECLK              0x0008
+#define  PCI_PMCAP_VERSION_MASK                0x0007
+#define PCI_PM_CONTROL_STATUS          0x04    /* 16 bit */
+#define  PCI_PMCS_PME_STATUS           0x8000
+#define  PCI_PMCS_DATASCALE_MASK       0x6000
+#define  PCI_PMCS_DATASCALE_SHIFT      13
+#define  PCI_PMCS_DATASEL_MASK         0x1e00
+#define  PCI_PMCS_DATASEL_SHIFT                9
+#define  PCI_PMCS_PME_ENABLE           0x0100
+#define  PCI_PMCS_PWR_STATE_MASK       0x0003
+#define  PCI_PMCS_PWR_STATE_D0         0x0000
+#define  PCI_PMCS_PWR_STATE_D1         0x0001
+#define  PCI_PMCS_PWR_STATE_D2         0x0002
+#define  PCI_PMCS_PWR_STATE_D3         0x0003
+#define PCI_PM_BRIDGE_EXT              0x06    /* 8 bit */
+#define PCI_PM_DATA                    0x07    /* 8 bit */
+
+#define CB_PRIMARY_BUS                 0x18    /* 8 bit */
+#define CB_CARDBUS_BUS                 0x19    /* 8 bit */
+#define CB_SUBORD_BUS                  0x1a    /* 8 bit */
+#define CB_LATENCY_TIMER               0x1b    /* 8 bit */
+
+#define CB_MEM_BASE(m)                 (0x1c + 8*(m))
+#define CB_MEM_LIMIT(m)                        (0x20 + 8*(m))
+#define CB_IO_BASE(m)                  (0x2c + 8*(m))
+#define CB_IO_LIMIT(m)                 (0x30 + 8*(m))
+
+#define CB_BRIDGE_CONTROL              0x3e    /* 16 bit */
+#define  CB_BCR_PARITY_ENA             0x0001
+#define  CB_BCR_SERR_ENA               0x0002
+#define  CB_BCR_ISA_ENA                        0x0004
+#define  CB_BCR_VGA_ENA                        0x0008
+#define  CB_BCR_MABORT                 0x0020
+#define  CB_BCR_CB_RESET               0x0040
+#define  CB_BCR_ISA_IRQ                        0x0080
+#define  CB_BCR_PREFETCH(m)            (0x0100 << (m))
+#define  CB_BCR_WRITE_POST             0x0400
+
+#define CB_LEGACY_MODE_BASE            0x44
+
+/* Memory mapped registers */
+
+#define CB_SOCKET_EVENT                        0x0000
+#define  CB_SE_CSTSCHG                 0x00000001
+#define  CB_SE_CCD                     0x00000006
+#define  CB_SE_CCD1                    0x00000002
+#define  CB_SE_CCD2                    0x00000004
+#define  CB_SE_PWRCYCLE                        0x00000008
+
+#define CB_SOCKET_MASK                 0x0004
+#define  CB_SM_CSTSCHG                 0x00000001
+#define  CB_SM_CCD                     0x00000006
+#define  CB_SM_PWRCYCLE                        0x00000008
+
+#define CB_SOCKET_STATE                        0x0008
+#define  CB_SS_CSTSCHG                 0x00000001
+#define  CB_SS_CCD                     0x00000006
+#define  CB_SS_CCD1                    0x00000002
+#define  CB_SS_CCD2                    0x00000004
+#define  CB_SS_PWRCYCLE                        0x00000008
+#define  CB_SS_16BIT                   0x00000010
+#define  CB_SS_32BIT                   0x00000020
+#define  CB_SS_CINT                    0x00000040
+#define  CB_SS_BADCARD                 0x00000080
+#define  CB_SS_DATALOST                        0x00000100
+#define  CB_SS_BADVCC                  0x00000200
+#define  CB_SS_5VCARD                  0x00000400
+#define  CB_SS_3VCARD                  0x00000800
+#define  CB_SS_XVCARD                  0x00001000
+#define  CB_SS_YVCARD                  0x00002000
+#define  CB_SS_VSENSE                  0x00003c86
+#define  CB_SS_5VSOCKET                        0x10000000
+#define  CB_SS_3VSOCKET                        0x20000000
+#define  CB_SS_XVSOCKET                        0x40000000
+#define  CB_SS_YVSOCKET                        0x80000000
+
+#define CB_SOCKET_FORCE                        0x000c
+#define  CB_SF_CVSTEST                 0x00004000
+
+#define CB_SOCKET_CONTROL              0x0010
+#define  CB_SC_VPP_MASK                        0x00000007
+#define   CB_SC_VPP_OFF                        0x00000000
+#define   CB_SC_VPP_12V                        0x00000001
+#define   CB_SC_VPP_5V                 0x00000002
+#define   CB_SC_VPP_3V                 0x00000003
+#define   CB_SC_VPP_XV                 0x00000004
+#define   CB_SC_VPP_YV                 0x00000005
+#define  CB_SC_VCC_MASK                        0x00000070
+#define   CB_SC_VCC_OFF                        0x00000000
+#define   CB_SC_VCC_5V                 0x00000020
+#define   CB_SC_VCC_3V                 0x00000030
+#define   CB_SC_VCC_XV                 0x00000040
+#define   CB_SC_VCC_YV                 0x00000050
+#define  CB_SC_CCLK_STOP               0x00000080
+
+#define CB_SOCKET_POWER                        0x0020
+#define  CB_SP_CLK_CTRL                        0x00000001
+#define  CB_SP_CLK_CTRL_ENA            0x00010000
+#define  CB_SP_CLK_MODE                        0x01000000
+#define  CB_SP_ACCESS                  0x02000000
+
+/* Address bits 31..24 for memory windows for 16-bit cards,
+   accessable only by memory mapping the 16-bit register set */
+#define CB_MEM_PAGE(map)               (0x40 + (map))
+
+#endif /* _LINUX_YENTA_H */