0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/pci.h>
0014 #include <linux/init.h>
0015 #include <linux/workqueue.h>
0016 #include <linux/interrupt.h>
0017 #include <linux/device.h>
0018
0019 #include <pcmcia/ss.h>
0020
0021 #include <linux/io.h>
0022
0023 #include "i82092aa.h"
0024 #include "i82365.h"
0025
0026 MODULE_LICENSE("GPL");
0027
0028
0029 static const struct pci_device_id i82092aa_pci_ids[] = {
0030 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82092AA_0) },
0031 { }
0032 };
0033 MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids);
0034
0035 static struct pci_driver i82092aa_pci_driver = {
0036 .name = "i82092aa",
0037 .id_table = i82092aa_pci_ids,
0038 .probe = i82092aa_pci_probe,
0039 .remove = i82092aa_pci_remove,
0040 };
0041
0042
0043
0044 static struct pccard_operations i82092aa_operations = {
0045 .init = i82092aa_init,
0046 .get_status = i82092aa_get_status,
0047 .set_socket = i82092aa_set_socket,
0048 .set_io_map = i82092aa_set_io_map,
0049 .set_mem_map = i82092aa_set_mem_map,
0050 };
0051
0052
0053
0054 struct socket_info {
0055 int number;
0056 int card_state;
0057
0058
0059
0060
0061
0062 unsigned int io_base;
0063
0064 struct pcmcia_socket socket;
0065 struct pci_dev *dev;
0066 };
0067
0068 #define MAX_SOCKETS 4
0069 static struct socket_info sockets[MAX_SOCKETS];
0070 static int socket_count;
0071
0072
0073 static int i82092aa_pci_probe(struct pci_dev *dev,
0074 const struct pci_device_id *id)
0075 {
0076 unsigned char configbyte;
0077 int i, ret;
0078
0079 ret = pci_enable_device(dev);
0080 if (ret)
0081 return ret;
0082
0083
0084 pci_read_config_byte(dev, 0x40, &configbyte);
0085
0086 switch (configbyte&6) {
0087 case 0:
0088 socket_count = 2;
0089 break;
0090 case 2:
0091 socket_count = 1;
0092 break;
0093 case 4:
0094 case 6:
0095 socket_count = 4;
0096 break;
0097
0098 default:
0099 dev_err(&dev->dev,
0100 "Oops, you did something we didn't think of.\n");
0101 ret = -EIO;
0102 goto err_out_disable;
0103 }
0104 dev_info(&dev->dev, "configured as a %d socket device.\n",
0105 socket_count);
0106
0107 if (!request_region(pci_resource_start(dev, 0), 2, "i82092aa")) {
0108 ret = -EBUSY;
0109 goto err_out_disable;
0110 }
0111
0112 for (i = 0; i < socket_count; i++) {
0113 sockets[i].card_state = 1;
0114 sockets[i].io_base = pci_resource_start(dev, 0);
0115 sockets[i].dev = dev;
0116 sockets[i].socket.features |= SS_CAP_PCCARD;
0117 sockets[i].socket.map_size = 0x1000;
0118 sockets[i].socket.irq_mask = 0;
0119 sockets[i].socket.pci_irq = dev->irq;
0120 sockets[i].socket.cb_dev = dev;
0121 sockets[i].socket.owner = THIS_MODULE;
0122
0123 sockets[i].number = i;
0124
0125 if (card_present(i)) {
0126 sockets[i].card_state = 3;
0127 dev_dbg(&dev->dev, "slot %i is occupied\n", i);
0128 } else {
0129 dev_dbg(&dev->dev, "slot %i is vacant\n", i);
0130 }
0131 }
0132
0133
0134
0135
0136 configbyte = 0xFF;
0137
0138
0139 pci_write_config_byte(dev, 0x50, configbyte);
0140
0141
0142 dev_dbg(&dev->dev, "Requesting interrupt %i\n", dev->irq);
0143 ret = request_irq(dev->irq, i82092aa_interrupt, IRQF_SHARED,
0144 "i82092aa", i82092aa_interrupt);
0145 if (ret) {
0146 dev_err(&dev->dev, "Failed to register IRQ %d, aborting\n",
0147 dev->irq);
0148 goto err_out_free_res;
0149 }
0150
0151 for (i = 0; i < socket_count; i++) {
0152 sockets[i].socket.dev.parent = &dev->dev;
0153 sockets[i].socket.ops = &i82092aa_operations;
0154 sockets[i].socket.resource_ops = &pccard_nonstatic_ops;
0155 ret = pcmcia_register_socket(&sockets[i].socket);
0156 if (ret)
0157 goto err_out_free_sockets;
0158 }
0159
0160 return 0;
0161
0162 err_out_free_sockets:
0163 if (i) {
0164 for (i--; i >= 0; i--)
0165 pcmcia_unregister_socket(&sockets[i].socket);
0166 }
0167 free_irq(dev->irq, i82092aa_interrupt);
0168 err_out_free_res:
0169 release_region(pci_resource_start(dev, 0), 2);
0170 err_out_disable:
0171 pci_disable_device(dev);
0172 return ret;
0173 }
0174
0175 static void i82092aa_pci_remove(struct pci_dev *dev)
0176 {
0177 int i;
0178
0179 free_irq(dev->irq, i82092aa_interrupt);
0180
0181 for (i = 0; i < socket_count; i++)
0182 pcmcia_unregister_socket(&sockets[i].socket);
0183 }
0184
0185 static DEFINE_SPINLOCK(port_lock);
0186
0187
0188
0189 static unsigned char indirect_read(int socket, unsigned short reg)
0190 {
0191 unsigned short int port;
0192 unsigned char val;
0193 unsigned long flags;
0194
0195 spin_lock_irqsave(&port_lock, flags);
0196 reg += socket * 0x40;
0197 port = sockets[socket].io_base;
0198 outb(reg, port);
0199 val = inb(port+1);
0200 spin_unlock_irqrestore(&port_lock, flags);
0201 return val;
0202 }
0203
0204 static void indirect_write(int socket, unsigned short reg, unsigned char value)
0205 {
0206 unsigned short int port;
0207 unsigned long flags;
0208
0209 spin_lock_irqsave(&port_lock, flags);
0210 reg = reg + socket * 0x40;
0211 port = sockets[socket].io_base;
0212 outb(reg, port);
0213 outb(value, port+1);
0214 spin_unlock_irqrestore(&port_lock, flags);
0215 }
0216
0217 static void indirect_setbit(int socket, unsigned short reg, unsigned char mask)
0218 {
0219 unsigned short int port;
0220 unsigned char val;
0221 unsigned long flags;
0222
0223 spin_lock_irqsave(&port_lock, flags);
0224 reg = reg + socket * 0x40;
0225 port = sockets[socket].io_base;
0226 outb(reg, port);
0227 val = inb(port+1);
0228 val |= mask;
0229 outb(reg, port);
0230 outb(val, port+1);
0231 spin_unlock_irqrestore(&port_lock, flags);
0232 }
0233
0234
0235 static void indirect_resetbit(int socket,
0236 unsigned short reg, unsigned char mask)
0237 {
0238 unsigned short int port;
0239 unsigned char val;
0240 unsigned long flags;
0241
0242 spin_lock_irqsave(&port_lock, flags);
0243 reg = reg + socket * 0x40;
0244 port = sockets[socket].io_base;
0245 outb(reg, port);
0246 val = inb(port+1);
0247 val &= ~mask;
0248 outb(reg, port);
0249 outb(val, port+1);
0250 spin_unlock_irqrestore(&port_lock, flags);
0251 }
0252
0253 static void indirect_write16(int socket,
0254 unsigned short reg, unsigned short value)
0255 {
0256 unsigned short int port;
0257 unsigned char val;
0258 unsigned long flags;
0259
0260 spin_lock_irqsave(&port_lock, flags);
0261 reg = reg + socket * 0x40;
0262 port = sockets[socket].io_base;
0263
0264 outb(reg, port);
0265 val = value & 255;
0266 outb(val, port+1);
0267
0268 reg++;
0269
0270 outb(reg, port);
0271 val = value>>8;
0272 outb(val, port+1);
0273 spin_unlock_irqrestore(&port_lock, flags);
0274 }
0275
0276
0277
0278 static int cycle_time = 120;
0279
0280 static int to_cycles(int ns)
0281 {
0282 if (cycle_time != 0)
0283 return ns/cycle_time;
0284 else
0285 return 0;
0286 }
0287
0288
0289
0290
0291 static irqreturn_t i82092aa_interrupt(int irq, void *dev)
0292 {
0293 int i;
0294 int loopcount = 0;
0295 int handled = 0;
0296
0297 unsigned int events, active = 0;
0298
0299 while (1) {
0300 loopcount++;
0301 if (loopcount > 20) {
0302 pr_err("i82092aa: infinite eventloop in interrupt\n");
0303 break;
0304 }
0305
0306 active = 0;
0307
0308 for (i = 0; i < socket_count; i++) {
0309 int csc;
0310
0311
0312 if (sockets[i].card_state == 0)
0313 continue;
0314
0315
0316 csc = indirect_read(i, I365_CSC);
0317
0318 if (csc == 0)
0319 continue;
0320 handled = 1;
0321 events = 0;
0322
0323 if (csc & I365_CSC_DETECT) {
0324 events |= SS_DETECT;
0325 dev_info(&sockets[i].dev->dev,
0326 "Card detected in socket %i!\n", i);
0327 }
0328
0329 if (indirect_read(i, I365_INTCTL) & I365_PC_IOCARD) {
0330
0331 if (csc & I365_CSC_STSCHG)
0332 events |= SS_STSCHG;
0333 } else {
0334
0335 if (csc & I365_CSC_BVD1)
0336 events |= SS_BATDEAD;
0337 if (csc & I365_CSC_BVD2)
0338 events |= SS_BATWARN;
0339 if (csc & I365_CSC_READY)
0340 events |= SS_READY;
0341 }
0342
0343 if (events)
0344 pcmcia_parse_events(&sockets[i].socket, events);
0345 active |= events;
0346 }
0347
0348 if (active == 0)
0349 break;
0350 }
0351 return IRQ_RETVAL(handled);
0352 }
0353
0354
0355
0356
0357
0358 static int card_present(int socketno)
0359 {
0360 unsigned int val;
0361
0362 if ((socketno < 0) || (socketno >= MAX_SOCKETS))
0363 return 0;
0364 if (sockets[socketno].io_base == 0)
0365 return 0;
0366
0367
0368 val = indirect_read(socketno, 1);
0369 if ((val&12) == 12)
0370 return 1;
0371
0372 return 0;
0373 }
0374
0375 static void set_bridge_state(int sock)
0376 {
0377 indirect_write(sock, I365_GBLCTL, 0x00);
0378 indirect_write(sock, I365_GENCTL, 0x00);
0379
0380 indirect_setbit(sock, I365_INTCTL, 0x08);
0381 }
0382
0383
0384 static int i82092aa_init(struct pcmcia_socket *sock)
0385 {
0386 int i;
0387 struct resource res = { .start = 0, .end = 0x0fff };
0388 pccard_io_map io = { 0, 0, 0, 0, 1 };
0389 pccard_mem_map mem = { .res = &res, };
0390
0391 for (i = 0; i < 2; i++) {
0392 io.map = i;
0393 i82092aa_set_io_map(sock, &io);
0394 }
0395 for (i = 0; i < 5; i++) {
0396 mem.map = i;
0397 i82092aa_set_mem_map(sock, &mem);
0398 }
0399
0400 return 0;
0401 }
0402
0403 static int i82092aa_get_status(struct pcmcia_socket *socket, u_int *value)
0404 {
0405 unsigned int sock = container_of(socket,
0406 struct socket_info, socket)->number;
0407 unsigned int status;
0408
0409
0410 status = indirect_read(sock, I365_STATUS);
0411
0412 *value = 0;
0413
0414 if ((status & I365_CS_DETECT) == I365_CS_DETECT)
0415 *value |= SS_DETECT;
0416
0417
0418
0419 if (indirect_read(sock, I365_INTCTL) & I365_PC_IOCARD) {
0420
0421 if (!(status & I365_CS_STSCHG))
0422 *value |= SS_STSCHG;
0423 } else {
0424 if (!(status & I365_CS_BVD1))
0425 *value |= SS_BATDEAD;
0426 if (!(status & I365_CS_BVD2))
0427 *value |= SS_BATWARN;
0428 }
0429
0430 if (status & I365_CS_WRPROT)
0431 (*value) |= SS_WRPROT;
0432
0433 if (status & I365_CS_READY)
0434 (*value) |= SS_READY;
0435
0436 if (status & I365_CS_POWERON)
0437 (*value) |= SS_POWERON;
0438
0439 return 0;
0440 }
0441
0442
0443 static int i82092aa_set_socket(struct pcmcia_socket *socket,
0444 socket_state_t *state)
0445 {
0446 struct socket_info *sock_info = container_of(socket, struct socket_info,
0447 socket);
0448 unsigned int sock = sock_info->number;
0449 unsigned char reg;
0450
0451
0452
0453 set_bridge_state(sock);
0454
0455
0456
0457 reg = 0;
0458
0459
0460 if (!(state->flags & SS_RESET))
0461 reg = reg | I365_PC_RESET;
0462 if (state->flags & SS_IOCARD)
0463 reg = reg | I365_PC_IOCARD;
0464
0465
0466 indirect_write(sock, I365_INTCTL, reg);
0467
0468
0469
0470 reg = I365_PWR_NORESET;
0471
0472 if (state->flags & SS_PWR_AUTO) {
0473 dev_info(&sock_info->dev->dev, "Auto power\n");
0474 reg |= I365_PWR_AUTO;
0475 }
0476 if (state->flags & SS_OUTPUT_ENA) {
0477 dev_info(&sock_info->dev->dev, "Power Enabled\n");
0478 reg |= I365_PWR_OUT;
0479 }
0480
0481 switch (state->Vcc) {
0482 case 0:
0483 break;
0484 case 50:
0485 dev_info(&sock_info->dev->dev,
0486 "setting voltage to Vcc to 5V on socket %i\n",
0487 sock);
0488 reg |= I365_VCC_5V;
0489 break;
0490 default:
0491 dev_err(&sock_info->dev->dev,
0492 "%s called with invalid VCC power value: %i",
0493 __func__, state->Vcc);
0494 return -EINVAL;
0495 }
0496
0497 switch (state->Vpp) {
0498 case 0:
0499 dev_info(&sock_info->dev->dev,
0500 "not setting Vpp on socket %i\n", sock);
0501 break;
0502 case 50:
0503 dev_info(&sock_info->dev->dev,
0504 "setting Vpp to 5.0 for socket %i\n", sock);
0505 reg |= I365_VPP1_5V | I365_VPP2_5V;
0506 break;
0507 case 120:
0508 dev_info(&sock_info->dev->dev, "setting Vpp to 12.0\n");
0509 reg |= I365_VPP1_12V | I365_VPP2_12V;
0510 break;
0511 default:
0512 dev_err(&sock_info->dev->dev,
0513 "%s called with invalid VPP power value: %i",
0514 __func__, state->Vcc);
0515 return -EINVAL;
0516 }
0517
0518 if (reg != indirect_read(sock, I365_POWER))
0519 indirect_write(sock, I365_POWER, reg);
0520
0521
0522
0523 reg = 0x00;
0524 if (state->csc_mask & SS_DETECT)
0525 reg |= I365_CSC_DETECT;
0526 if (state->flags & SS_IOCARD) {
0527 if (state->csc_mask & SS_STSCHG)
0528 reg |= I365_CSC_STSCHG;
0529 } else {
0530 if (state->csc_mask & SS_BATDEAD)
0531 reg |= I365_CSC_BVD1;
0532 if (state->csc_mask & SS_BATWARN)
0533 reg |= I365_CSC_BVD2;
0534 if (state->csc_mask & SS_READY)
0535 reg |= I365_CSC_READY;
0536
0537 }
0538
0539
0540
0541
0542
0543 indirect_write(sock, I365_CSCINT, reg);
0544 (void)indirect_read(sock, I365_CSC);
0545
0546 return 0;
0547 }
0548
0549 static int i82092aa_set_io_map(struct pcmcia_socket *socket,
0550 struct pccard_io_map *io)
0551 {
0552 struct socket_info *sock_info = container_of(socket, struct socket_info,
0553 socket);
0554 unsigned int sock = sock_info->number;
0555 unsigned char map, ioctl;
0556
0557 map = io->map;
0558
0559
0560 if (map > 1)
0561 return -EINVAL;
0562
0563 if ((io->start > 0xffff) || (io->stop > 0xffff)
0564 || (io->stop < io->start))
0565 return -EINVAL;
0566
0567
0568 if (indirect_read(sock, I365_ADDRWIN) & I365_ENA_IO(map))
0569 indirect_resetbit(sock, I365_ADDRWIN, I365_ENA_IO(map));
0570
0571
0572 indirect_write16(sock, I365_IO(map)+I365_W_START, io->start);
0573 indirect_write16(sock, I365_IO(map)+I365_W_STOP, io->stop);
0574
0575 ioctl = indirect_read(sock, I365_IOCTL) & ~I365_IOCTL_MASK(map);
0576
0577 if (io->flags & (MAP_16BIT|MAP_AUTOSZ))
0578 ioctl |= I365_IOCTL_16BIT(map);
0579
0580 indirect_write(sock, I365_IOCTL, ioctl);
0581
0582
0583 if (io->flags & MAP_ACTIVE)
0584 indirect_setbit(sock, I365_ADDRWIN, I365_ENA_IO(map));
0585
0586 return 0;
0587 }
0588
0589 static int i82092aa_set_mem_map(struct pcmcia_socket *socket,
0590 struct pccard_mem_map *mem)
0591 {
0592 struct socket_info *sock_info = container_of(socket, struct socket_info,
0593 socket);
0594 unsigned int sock = sock_info->number;
0595 struct pci_bus_region region;
0596 unsigned short base, i;
0597 unsigned char map;
0598
0599 pcibios_resource_to_bus(sock_info->dev->bus, ®ion, mem->res);
0600
0601 map = mem->map;
0602 if (map > 4)
0603 return -EINVAL;
0604
0605 if ((mem->card_start > 0x3ffffff) || (region.start > region.end) ||
0606 (mem->speed > 1000)) {
0607 dev_err(&sock_info->dev->dev,
0608 "invalid mem map for socket %i: %llx to %llx with a start of %x\n",
0609 sock,
0610 (unsigned long long)region.start,
0611 (unsigned long long)region.end,
0612 mem->card_start);
0613 return -EINVAL;
0614 }
0615
0616
0617 if (indirect_read(sock, I365_ADDRWIN) & I365_ENA_MEM(map))
0618 indirect_resetbit(sock, I365_ADDRWIN, I365_ENA_MEM(map));
0619
0620
0621 base = I365_MEM(map);
0622 i = (region.start >> 12) & 0x0fff;
0623 if (mem->flags & MAP_16BIT)
0624 i |= I365_MEM_16BIT;
0625 if (mem->flags & MAP_0WS)
0626 i |= I365_MEM_0WS;
0627 indirect_write16(sock, base+I365_W_START, i);
0628
0629
0630
0631 i = (region.end >> 12) & 0x0fff;
0632 switch (to_cycles(mem->speed)) {
0633 case 0:
0634 break;
0635 case 1:
0636 i |= I365_MEM_WS0;
0637 break;
0638 case 2:
0639 i |= I365_MEM_WS1;
0640 break;
0641 default:
0642 i |= I365_MEM_WS1 | I365_MEM_WS0;
0643 break;
0644 }
0645
0646 indirect_write16(sock, base+I365_W_STOP, i);
0647
0648
0649
0650 i = ((mem->card_start - region.start) >> 12) & 0x3fff;
0651 if (mem->flags & MAP_WRPROT)
0652 i |= I365_MEM_WRPROT;
0653 if (mem->flags & MAP_ATTRIB)
0654 i |= I365_MEM_REG;
0655 indirect_write16(sock, base+I365_W_OFF, i);
0656
0657
0658 if (mem->flags & MAP_ACTIVE)
0659 indirect_setbit(sock, I365_ADDRWIN, I365_ENA_MEM(map));
0660
0661 return 0;
0662 }
0663
0664 static int i82092aa_module_init(void)
0665 {
0666 return pci_register_driver(&i82092aa_pci_driver);
0667 }
0668
0669 static void i82092aa_module_exit(void)
0670 {
0671 pci_unregister_driver(&i82092aa_pci_driver);
0672 if (sockets[0].io_base > 0)
0673 release_region(sockets[0].io_base, 2);
0674 }
0675
0676 module_init(i82092aa_module_init);
0677 module_exit(i82092aa_module_exit);
0678