Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
[powerpc.git] / drivers / pcmcia / yenta_socket.c
index ba4d78e..4145eb8 100644 (file)
@@ -49,7 +49,13 @@ MODULE_PARM_DESC(pwr_irqs_off, "Force IRQs off during power-on of slot. Use only
 #define to_cycles(ns)  ((ns)/120)
 #define to_ns(cycles)  ((cycles)*120)
 
+/**
+ * yenta PCI irq probing.
+ * currently only used in the TI/EnE initialization code
+ */
+#ifdef CONFIG_YENTA_TI
 static int yenta_probe_cb_irq(struct yenta_socket *socket);
+#endif
 
 
 static unsigned int override_bios;
@@ -151,6 +157,40 @@ static void exca_writew(struct yenta_socket *socket, unsigned reg, u16 val)
        readb(socket->base + 0x800 + reg + 1);
 }
 
+static ssize_t show_yenta_registers(struct device *yentadev, struct device_attribute *attr, char *buf)
+{
+       struct pci_dev *dev = to_pci_dev(yentadev);
+       struct yenta_socket *socket = pci_get_drvdata(dev);
+       int offset = 0, i;
+
+       offset = snprintf(buf, PAGE_SIZE, "CB registers:");
+       for (i = 0; i < 0x24; i += 4) {
+               unsigned val;
+               if (!(i & 15))
+                       offset += snprintf(buf + offset, PAGE_SIZE - offset, "\n%02x:", i);
+               val = cb_readl(socket, i);
+               offset += snprintf(buf + offset, PAGE_SIZE - offset, " %08x", val);
+       }
+
+       offset += snprintf(buf + offset, PAGE_SIZE - offset, "\n\nExCA registers:");
+       for (i = 0; i < 0x45; i++) {
+               unsigned char val;
+               if (!(i & 7)) {
+                       if (i & 8) {
+                               memcpy(buf + offset, " -", 2);
+                               offset += 2;
+                       } else
+                               offset += snprintf(buf + offset, PAGE_SIZE - offset, "\n%02x:", i);
+               }
+               val = exca_readb(socket, i);
+               offset += snprintf(buf + offset, PAGE_SIZE - offset, " %02x", val);
+       }
+       buf[offset++] = '\n';
+       return offset;
+}
+
+static DEVICE_ATTR(yenta_registers, S_IRUSR, show_yenta_registers, NULL);
+
 /*
  * Ugh, mixed-mode cardbus and 16-bit pccard state: things depend
  * on what kind of card is inserted..
@@ -190,95 +230,6 @@ static int yenta_get_status(struct pcmcia_socket *sock, unsigned int *value)
        return 0;
 }
 
-static void yenta_get_power(struct yenta_socket *socket, socket_state_t *state)
-{
-       if (!(cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) &&
-           (socket->flags & YENTA_16BIT_POWER_EXCA)) {
-               u8 reg, vcc, vpp;
-
-               reg = exca_readb(socket, I365_POWER);
-               vcc = reg & I365_VCC_MASK;
-               vpp = reg & I365_VPP1_MASK;
-               state->Vcc = state->Vpp = 0;
-
-               if (socket->flags & YENTA_16BIT_POWER_DF) {
-                       if (vcc == I365_VCC_3V)
-                               state->Vcc = 33;
-                       if (vcc == I365_VCC_5V)
-                               state->Vcc = 50;
-                       if (vpp == I365_VPP1_5V)
-                               state->Vpp = state->Vcc;
-                       if (vpp == I365_VPP1_12V)
-                               state->Vpp = 120;
-               } else {
-                       if (reg & I365_VCC_5V) {
-                               state->Vcc = 50;
-                               if (vpp == I365_VPP1_5V)
-                                       state->Vpp = 50;
-                               if (vpp == I365_VPP1_12V)
-                                       state->Vpp = 120;
-                       }
-               }
-       } else {
-               u32 control;
-
-               control = cb_readl(socket, CB_SOCKET_CONTROL);
-
-               switch (control & CB_SC_VCC_MASK) {
-               case CB_SC_VCC_5V: state->Vcc = 50; break;
-               case CB_SC_VCC_3V: state->Vcc = 33; break;
-               default: state->Vcc = 0;
-               }
-
-               switch (control & CB_SC_VPP_MASK) {
-               case CB_SC_VPP_12V: state->Vpp = 120; break;
-               case CB_SC_VPP_5V: state->Vpp = 50; break;
-               case CB_SC_VPP_3V: state->Vpp = 33; break;
-               default: state->Vpp = 0;
-               }
-       }
-}
-
-static int yenta_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
-{
-       struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-       u8 reg;
-       u32 control;
-
-       control = cb_readl(socket, CB_SOCKET_CONTROL);
-
-       yenta_get_power(socket, state);
-       state->io_irq = socket->io_irq;
-
-       if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) {
-               u16 bridge = config_readw(socket, CB_BRIDGE_CONTROL);
-               if (bridge & CB_BRIDGE_CRST)
-                       state->flags |= SS_RESET;
-               return 0;
-       }
-
-       /* 16-bit card state.. */
-       reg = exca_readb(socket, I365_POWER);
-       state->flags = (reg & I365_PWR_AUTO) ? SS_PWR_AUTO : 0;
-       state->flags |= (reg & I365_PWR_OUT) ? SS_OUTPUT_ENA : 0;
-
-       reg = exca_readb(socket, I365_INTCTL);
-       state->flags |= (reg & I365_PC_RESET) ? 0 : SS_RESET;
-       state->flags |= (reg & I365_PC_IOCARD) ? SS_IOCARD : 0;
-
-       reg = exca_readb(socket, I365_CSCINT);
-       state->csc_mask = (reg & I365_CSC_DETECT) ? SS_DETECT : 0;
-       if (state->flags & SS_IOCARD) {
-               state->csc_mask |= (reg & I365_CSC_STSCHG) ? SS_STSCHG : 0;
-       } else {
-               state->csc_mask |= (reg & I365_CSC_BVD1) ? SS_BATDEAD : 0;
-               state->csc_mask |= (reg & I365_CSC_BVD2) ? SS_BATWARN : 0;
-               state->csc_mask |= (reg & I365_CSC_READY) ? SS_READY : 0;
-       }
-
-       return 0;
-}
-
 static void yenta_set_power(struct yenta_socket *socket, socket_state_t *state)
 {
        /* some birdges require to use the ExCA registers to power 16bit cards */
@@ -497,6 +448,9 @@ static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
        csc = exca_readb(socket, I365_CSC);
 
+       if (!(cb_event || csc))
+               return IRQ_NONE;
+
        events = (cb_event & (CB_CD1EVENT | CB_CD2EVENT)) ? SS_DETECT : 0 ;
        events |= (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
        if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) {
@@ -510,10 +464,7 @@ static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        if (events)
                pcmcia_parse_events(&socket->socket, events);
 
-       if (cb_event || csc)
-               return IRQ_HANDLED;
-
-       return IRQ_NONE;
+       return IRQ_HANDLED;
 }
 
 static void yenta_interrupt_wrapper(unsigned long data)
@@ -559,12 +510,6 @@ static void yenta_interrogate(struct yenta_socket *socket)
 static int yenta_sock_init(struct pcmcia_socket *sock)
 {
        struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
-       u16 bridge;
-
-       bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~CB_BRIDGE_INTR;
-       if (!socket->cb_irq)
-               bridge |= CB_BRIDGE_INTR;
-       config_writew(socket, CB_BRIDGE_CONTROL, bridge);
 
        exca_writeb(socket, I365_GBLCTL, 0x00);
        exca_writeb(socket, I365_GENCTL, 0x00);
@@ -771,6 +716,9 @@ static void yenta_close(struct pci_dev *dev)
 {
        struct yenta_socket *sock = pci_get_drvdata(dev);
 
+       /* Remove the register attributes */
+       device_remove_file(&dev->dev, &dev_attr_yenta_registers);
+
        /* we don't want a dying socket registered */
        pcmcia_unregister_socket(&sock->socket);
        
@@ -797,17 +745,24 @@ static struct pccard_operations yenta_socket_operations = {
        .init                   = yenta_sock_init,
        .suspend                = yenta_sock_suspend,
        .get_status             = yenta_get_status,
-       .get_socket             = yenta_get_socket,
        .set_socket             = yenta_set_socket,
        .set_io_map             = yenta_set_io_map,
        .set_mem_map            = yenta_set_mem_map,
 };
 
 
+#ifdef CONFIG_YENTA_TI
 #include "ti113x.h"
+#endif
+#ifdef CONFIG_YENTA_RICOH
 #include "ricoh.h"
+#endif
+#ifdef CONFIG_YENTA_TOSHIBA
 #include "topic.h"
+#endif
+#ifdef CONFIG_YENTA_O2
 #include "o2micro.h"
+#endif
 
 enum {
        CARDBUS_TYPE_DEFAULT = -1,
@@ -819,6 +774,7 @@ enum {
        CARDBUS_TYPE_TOPIC95,
        CARDBUS_TYPE_TOPIC97,
        CARDBUS_TYPE_O2MICRO,
+       CARDBUS_TYPE_ENE,
 };
 
 /*
@@ -826,6 +782,7 @@ enum {
  * initialization sequences etc details. List them here..
  */
 static struct cardbus_type cardbus_type[] = {
+#ifdef CONFIG_YENTA_TI
        [CARDBUS_TYPE_TI]       = {
                .override       = ti_override,
                .save_state     = ti_save_state,
@@ -850,21 +807,36 @@ static struct cardbus_type cardbus_type[] = {
                .restore_state  = ti_restore_state,
                .sock_init      = ti_init,
        },
+#endif
+#ifdef CONFIG_YENTA_RICOH
        [CARDBUS_TYPE_RICOH]    = {
                .override       = ricoh_override,
                .save_state     = ricoh_save_state,
                .restore_state  = ricoh_restore_state,
        },
+#endif
+#ifdef CONFIG_YENTA_TOSHIBA
        [CARDBUS_TYPE_TOPIC95]  = {
                .override       = topic95_override,
        },
        [CARDBUS_TYPE_TOPIC97]  = {
                .override       = topic97_override,
        },
+#endif
+#ifdef CONFIG_YENTA_O2
        [CARDBUS_TYPE_O2MICRO]  = {
                .override       = o2micro_override,
                .restore_state  = o2micro_restore_state,
        },
+#endif
+#ifdef CONFIG_YENTA_TI
+       [CARDBUS_TYPE_ENE]      = {
+               .override       = ene_override,
+               .save_state     = ti_save_state,
+               .restore_state  = ti_restore_state,
+               .sock_init      = ti_init,
+       },
+#endif
 };
 
 
@@ -883,16 +855,8 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas
 {
        int i;
        unsigned long val;
-       u16 bridge_ctrl;
        u32 mask;
 
-       /* Set up ISA irq routing to probe the ISA irqs.. */
-       bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL);
-       if (!(bridge_ctrl & CB_BRIDGE_INTR)) {
-               bridge_ctrl |= CB_BRIDGE_INTR;
-               config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
-       }
-
        /*
         * Probe for usable interrupts using the force
         * register to generate bogus card status events.
@@ -914,13 +878,16 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas
 
        mask = probe_irq_mask(val) & 0xffff;
 
-       bridge_ctrl &= ~CB_BRIDGE_INTR;
-       config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
-
        return mask;
 }
 
 
+/**
+ * yenta PCI irq probing.
+ * currently only used in the TI/EnE initialization code
+ */
+#ifdef CONFIG_YENTA_TI
+
 /* interrupt handler, only used during probing */
 static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -944,18 +911,11 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *re
 /* probes the PCI interrupt, use only on override functions */
 static int yenta_probe_cb_irq(struct yenta_socket *socket)
 {
-       u16 bridge_ctrl;
-
        if (!socket->cb_irq)
                return -1;
 
        socket->probe_status = 0;
 
-       /* disable ISA interrupts */
-       bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL);
-       bridge_ctrl &= ~CB_BRIDGE_INTR;
-       config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
-
        if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) {
                printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n");
                return -1;
@@ -966,7 +926,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket)
        cb_writel(socket, CB_SOCKET_EVENT, -1);
        cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
        cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS);
-       
+
        msleep(100);
 
        /* disable interrupts */
@@ -980,6 +940,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket)
        return (int) socket->probe_status;
 }
 
+#endif /* CONFIG_YENTA_TI */
 
 
 /*
@@ -1004,11 +965,12 @@ static void yenta_config_init(struct yenta_socket *socket)
 {
        u16 bridge;
        struct pci_dev *dev = socket->dev;
+       struct pci_bus_region region;
 
-       pci_set_power_state(socket->dev, 0);
+       pcibios_resource_to_bus(socket->dev, &region, &dev->resource[0]);
 
        config_writel(socket, CB_LEGACY_MODE_BASE, 0);
-       config_writel(socket, PCI_BASE_ADDRESS_0, dev->resource[0].start);
+       config_writel(socket, PCI_BASE_ADDRESS_0, region.start);
        config_writew(socket, PCI_COMMAND,
                        PCI_COMMAND_IO |
                        PCI_COMMAND_MEMORY |
@@ -1031,8 +993,8 @@ static void yenta_config_init(struct yenta_socket *socket)
         *  - PCI interrupts enabled if a PCI interrupt exists..
         */
        bridge = config_readw(socket, CB_BRIDGE_CONTROL);
-       bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_INTR | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN);
-       bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN | CB_BRIDGE_INTR;
+       bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN);
+       bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN;
        config_writew(socket, CB_BRIDGE_CONTROL, bridge);
 }
 
@@ -1057,10 +1019,9 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
                return -ENODEV;
        }
 
-       socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL);
+       socket = kzalloc(sizeof(struct yenta_socket), GFP_KERNEL);
        if (!socket)
                return -ENOMEM;
-       memset(socket, 0, sizeof(*socket));
 
        /* prepare pcmcia_socket */
        socket->socket.ops = &yenta_socket_operations;
@@ -1154,8 +1115,11 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
 
        /* Register it with the pcmcia layer.. */
        ret = pcmcia_register_socket(&socket->socket);
-       if (ret == 0)
+       if (ret == 0) {
+               /* Add the yenta register attributes */
+               device_create_file(&dev->dev, &dev_attr_yenta_registers);
                goto out;
+       }
 
  unmap:
        iounmap(socket->base);
@@ -1239,6 +1203,7 @@ static struct pci_device_id yenta_table [] = {
         * advanced overrides instead.  (I can't get the
         * data sheets for these devices. --rmk)
         */
+#ifdef CONFIG_YENTA_TI
        CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1210, TI),
 
        CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1130, TI113X),
@@ -1265,22 +1230,41 @@ static struct pci_device_id yenta_table [] = {
        CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250),
        CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1410, TI1250),
 
-       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, TI12XX),
-       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, TI12XX),
-       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, TI1250),
-       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, TI12XX),
-
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7510, TI12XX),
+       CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7610, TI12XX),
+
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_710, TI12XX),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_712, TI12XX),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_720, TI12XX),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_722, TI12XX),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, ENE),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, ENE),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, ENE),
+       CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, ENE),
+#endif /* CONFIG_YENTA_TI */
+
+#ifdef CONFIG_YENTA_RICOH
        CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C465, RICOH),
        CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C466, RICOH),
        CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C475, RICOH),
        CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, RICOH),
        CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C478, RICOH),
+#endif
 
+#ifdef CONFIG_YENTA_TOSHIBA
        CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC95, TOPIC95),
        CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC97, TOPIC97),
        CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC100, TOPIC97),
+#endif
 
+#ifdef CONFIG_YENTA_O2
        CB_ID(PCI_VENDOR_ID_O2, PCI_ANY_ID, O2MICRO),
+#endif
 
        /* match any cardbus bridge */
        CB_ID(PCI_ANY_ID, PCI_ANY_ID, DEFAULT),