0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #ifndef _LINUX_TI113X_H
0031 #define _LINUX_TI113X_H
0032
0033
0034
0035
0036
0037 #define TI113X_SYSTEM_CONTROL 0x0080
0038 #define TI113X_SCR_SMIROUTE 0x04000000
0039 #define TI113X_SCR_SMISTATUS 0x02000000
0040 #define TI113X_SCR_SMIENB 0x01000000
0041 #define TI113X_SCR_VCCPROT 0x00200000
0042 #define TI113X_SCR_REDUCEZV 0x00100000
0043 #define TI113X_SCR_CDREQEN 0x00080000
0044 #define TI113X_SCR_CDMACHAN 0x00070000
0045 #define TI113X_SCR_SOCACTIVE 0x00002000
0046 #define TI113X_SCR_PWRSTREAM 0x00000800
0047 #define TI113X_SCR_DELAYUP 0x00000400
0048 #define TI113X_SCR_DELAYDOWN 0x00000200
0049 #define TI113X_SCR_INTERROGATE 0x00000100
0050 #define TI113X_SCR_CLKRUN_SEL 0x00000080
0051 #define TI113X_SCR_PWRSAVINGS 0x00000040
0052 #define TI113X_SCR_SUBSYSRW 0x00000020
0053 #define TI113X_SCR_CB_DPAR 0x00000010
0054 #define TI113X_SCR_CDMA_EN 0x00000008
0055 #define TI113X_SCR_ASYNC_IRQ 0x00000004
0056 #define TI113X_SCR_KEEPCLK 0x00000002
0057 #define TI113X_SCR_CLKRUN_ENA 0x00000001
0058
0059 #define TI122X_SCR_SER_STEP 0xc0000000
0060 #define TI122X_SCR_INTRTIE 0x20000000
0061 #define TIXX21_SCR_TIEALL 0x10000000
0062 #define TI122X_SCR_CBRSVD 0x00400000
0063 #define TI122X_SCR_MRBURSTDN 0x00008000
0064 #define TI122X_SCR_MRBURSTUP 0x00004000
0065 #define TI122X_SCR_RIMUX 0x00000001
0066
0067
0068 #define TI1250_MULTIMEDIA_CTL 0x0084
0069 #define TI1250_MMC_ZVOUTEN 0x80
0070 #define TI1250_MMC_PORTSEL 0x40
0071 #define TI1250_MMC_ZVEN1 0x02
0072 #define TI1250_MMC_ZVEN0 0x01
0073
0074 #define TI1250_GENERAL_STATUS 0x0085
0075 #define TI1250_GPIO0_CONTROL 0x0088
0076 #define TI1250_GPIO1_CONTROL 0x0089
0077 #define TI1250_GPIO2_CONTROL 0x008a
0078 #define TI1250_GPIO3_CONTROL 0x008b
0079 #define TI1250_GPIO_MODE_MASK 0xc0
0080
0081
0082 #define TI122X_MFUNC 0x008c
0083 #define TI122X_MFUNC0_MASK 0x0000000f
0084 #define TI122X_MFUNC1_MASK 0x000000f0
0085 #define TI122X_MFUNC2_MASK 0x00000f00
0086 #define TI122X_MFUNC3_MASK 0x0000f000
0087 #define TI122X_MFUNC4_MASK 0x000f0000
0088 #define TI122X_MFUNC5_MASK 0x00f00000
0089 #define TI122X_MFUNC6_MASK 0x0f000000
0090
0091 #define TI122X_MFUNC0_INTA 0x00000002
0092 #define TI125X_MFUNC0_INTB 0x00000001
0093 #define TI122X_MFUNC1_INTB 0x00000020
0094 #define TI122X_MFUNC3_IRQSER 0x00001000
0095
0096
0097
0098 #define TI113X_RETRY_STATUS 0x0090
0099 #define TI113X_RSR_PCIRETRY 0x80
0100 #define TI113X_RSR_CBRETRY 0x40
0101 #define TI113X_RSR_TEXP_CBB 0x20
0102 #define TI113X_RSR_MEXP_CBB 0x10
0103 #define TI113X_RSR_TEXP_CBA 0x08
0104 #define TI113X_RSR_MEXP_CBA 0x04
0105 #define TI113X_RSR_TEXP_PCI 0x02
0106 #define TI113X_RSR_MEXP_PCI 0x01
0107
0108
0109 #define TI113X_CARD_CONTROL 0x0091
0110 #define TI113X_CCR_RIENB 0x80
0111 #define TI113X_CCR_ZVENABLE 0x40
0112 #define TI113X_CCR_PCI_IRQ_ENA 0x20
0113 #define TI113X_CCR_PCI_IREQ 0x10
0114 #define TI113X_CCR_PCI_CSC 0x08
0115 #define TI113X_CCR_SPKROUTEN 0x02
0116 #define TI113X_CCR_IFG 0x01
0117
0118 #define TI1220_CCR_PORT_SEL 0x20
0119 #define TI122X_CCR_AUD2MUX 0x04
0120
0121
0122 #define TI113X_DEVICE_CONTROL 0x0092
0123 #define TI113X_DCR_5V_FORCE 0x40
0124 #define TI113X_DCR_3V_FORCE 0x20
0125 #define TI113X_DCR_IMODE_MASK 0x06
0126 #define TI113X_DCR_IMODE_ISA 0x02
0127 #define TI113X_DCR_IMODE_SERIAL 0x04
0128
0129 #define TI12XX_DCR_IMODE_PCI_ONLY 0x00
0130 #define TI12XX_DCR_IMODE_ALL_SERIAL 0x06
0131
0132
0133 #define TI113X_BUFFER_CONTROL 0x0093
0134 #define TI113X_BCR_CB_READ_DEPTH 0x08
0135 #define TI113X_BCR_CB_WRITE_DEPTH 0x04
0136 #define TI113X_BCR_PCI_READ_DEPTH 0x02
0137 #define TI113X_BCR_PCI_WRITE_DEPTH 0x01
0138
0139
0140 #define TI1250_DIAGNOSTIC 0x0093
0141 #define TI1250_DIAG_TRUE_VALUE 0x80
0142 #define TI1250_DIAG_PCI_IREQ 0x40
0143 #define TI1250_DIAG_PCI_CSC 0x20
0144 #define TI1250_DIAG_ASYNC_CSC 0x01
0145
0146
0147 #define TI113X_DMA_0 0x0094
0148 #define TI113X_DMA_1 0x0098
0149
0150
0151 #define TI113X_IO_OFFSET(map) (0x36+((map)<<1))
0152
0153
0154 #define ENE_TEST_C9 0xc9
0155 #define ENE_TEST_C9_TLTENABLE 0x02
0156 #define ENE_TEST_C9_PFENABLE_F0 0x04
0157 #define ENE_TEST_C9_PFENABLE_F1 0x08
0158 #define ENE_TEST_C9_PFENABLE (ENE_TEST_C9_PFENABLE_F0 | ENE_TEST_C9_PFENABLE_F1)
0159 #define ENE_TEST_C9_WPDISALBLE_F0 0x40
0160 #define ENE_TEST_C9_WPDISALBLE_F1 0x80
0161 #define ENE_TEST_C9_WPDISALBLE (ENE_TEST_C9_WPDISALBLE_F0 | ENE_TEST_C9_WPDISALBLE_F1)
0162
0163
0164
0165
0166 #define ti_sysctl(socket) ((socket)->private[0])
0167 #define ti_cardctl(socket) ((socket)->private[1])
0168 #define ti_devctl(socket) ((socket)->private[2])
0169 #define ti_diag(socket) ((socket)->private[3])
0170 #define ti_mfunc(socket) ((socket)->private[4])
0171 #define ene_test_c9(socket) ((socket)->private[5])
0172
0173
0174
0175
0176 static void ti_save_state(struct yenta_socket *socket)
0177 {
0178 ti_sysctl(socket) = config_readl(socket, TI113X_SYSTEM_CONTROL);
0179 ti_mfunc(socket) = config_readl(socket, TI122X_MFUNC);
0180 ti_cardctl(socket) = config_readb(socket, TI113X_CARD_CONTROL);
0181 ti_devctl(socket) = config_readb(socket, TI113X_DEVICE_CONTROL);
0182 ti_diag(socket) = config_readb(socket, TI1250_DIAGNOSTIC);
0183
0184 if (socket->dev->vendor == PCI_VENDOR_ID_ENE)
0185 ene_test_c9(socket) = config_readb(socket, ENE_TEST_C9);
0186 }
0187
0188 static void ti_restore_state(struct yenta_socket *socket)
0189 {
0190 config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
0191 config_writel(socket, TI122X_MFUNC, ti_mfunc(socket));
0192 config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
0193 config_writeb(socket, TI113X_DEVICE_CONTROL, ti_devctl(socket));
0194 config_writeb(socket, TI1250_DIAGNOSTIC, ti_diag(socket));
0195
0196 if (socket->dev->vendor == PCI_VENDOR_ID_ENE)
0197 config_writeb(socket, ENE_TEST_C9, ene_test_c9(socket));
0198 }
0199
0200
0201
0202
0203
0204 static void ti_zoom_video(struct pcmcia_socket *sock, int onoff)
0205 {
0206 u8 reg;
0207 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
0208
0209
0210
0211 reg = config_readb(socket, TI113X_CARD_CONTROL);
0212 if (onoff)
0213
0214 reg |= TI113X_CCR_ZVENABLE;
0215 else
0216 reg &= ~TI113X_CCR_ZVENABLE;
0217 config_writeb(socket, TI113X_CARD_CONTROL, reg);
0218 }
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229 static void ti1250_zoom_video(struct pcmcia_socket *sock, int onoff)
0230 {
0231 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
0232 int shift = 0;
0233 u8 reg;
0234
0235 ti_zoom_video(sock, onoff);
0236
0237 reg = config_readb(socket, TI1250_MULTIMEDIA_CTL);
0238 reg |= TI1250_MMC_ZVOUTEN;
0239
0240 if(PCI_FUNC(socket->dev->devfn)==1)
0241 shift = 1;
0242
0243 if(onoff)
0244 {
0245 reg &= ~(1<<6);
0246 reg |= shift<<6;
0247 reg |= 1<<shift;
0248 }
0249 else
0250 {
0251 reg &= ~(1<<6);
0252 reg |= (1^shift)<<6;
0253 reg &= ~(1<<shift);
0254 }
0255
0256 config_writeb(socket, TI1250_MULTIMEDIA_CTL, reg);
0257 }
0258
0259 static void ti_set_zv(struct yenta_socket *socket)
0260 {
0261 if(socket->dev->vendor == PCI_VENDOR_ID_TI)
0262 {
0263 switch(socket->dev->device)
0264 {
0265
0266 case PCI_DEVICE_ID_TI_1220:
0267 case PCI_DEVICE_ID_TI_1221:
0268 case PCI_DEVICE_ID_TI_1225:
0269 case PCI_DEVICE_ID_TI_4510:
0270 socket->socket.zoom_video = ti_zoom_video;
0271 break;
0272 case PCI_DEVICE_ID_TI_1250:
0273 case PCI_DEVICE_ID_TI_1251A:
0274 case PCI_DEVICE_ID_TI_1251B:
0275 case PCI_DEVICE_ID_TI_1450:
0276 socket->socket.zoom_video = ti1250_zoom_video;
0277 }
0278 }
0279 }
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294 static int ti_init(struct yenta_socket *socket)
0295 {
0296 u8 new, reg = exca_readb(socket, I365_INTCTL);
0297
0298 new = reg & ~I365_INTR_ENA;
0299 if (socket->dev->irq)
0300 new |= I365_INTR_ENA;
0301 if (new != reg)
0302 exca_writeb(socket, I365_INTCTL, new);
0303 return 0;
0304 }
0305
0306 static int ti_override(struct yenta_socket *socket)
0307 {
0308 u8 new, reg = exca_readb(socket, I365_INTCTL);
0309
0310 new = reg & ~I365_INTR_ENA;
0311 if (new != reg)
0312 exca_writeb(socket, I365_INTCTL, new);
0313
0314 ti_set_zv(socket);
0315
0316 return 0;
0317 }
0318
0319 static void ti113x_use_isa_irq(struct yenta_socket *socket)
0320 {
0321 int isa_irq = -1;
0322 u8 intctl;
0323 u32 isa_irq_mask = 0;
0324
0325 if (!isa_probe)
0326 return;
0327
0328
0329 isa_irq_mask = yenta_probe_irq(socket, isa_interrupts);
0330 if (!isa_irq_mask)
0331 return;
0332
0333
0334 for (; isa_irq_mask; isa_irq++)
0335 isa_irq_mask >>= 1;
0336 socket->cb_irq = isa_irq;
0337
0338 exca_writeb(socket, I365_CSCINT, (isa_irq << 4));
0339
0340 intctl = exca_readb(socket, I365_INTCTL);
0341 intctl &= ~(I365_INTR_ENA | I365_IRQ_MASK);
0342 exca_writeb(socket, I365_INTCTL, intctl);
0343
0344 dev_info(&socket->dev->dev,
0345 "Yenta TI113x: using isa irq %d for CardBus\n", isa_irq);
0346 }
0347
0348
0349 static int ti113x_override(struct yenta_socket *socket)
0350 {
0351 u8 cardctl;
0352
0353 cardctl = config_readb(socket, TI113X_CARD_CONTROL);
0354 cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);
0355 if (socket->dev->irq)
0356 cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ;
0357 else
0358 ti113x_use_isa_irq(socket);
0359
0360 config_writeb(socket, TI113X_CARD_CONTROL, cardctl);
0361
0362 return ti_override(socket);
0363 }
0364
0365
0366
0367 static void ti12xx_irqroute_func0(struct yenta_socket *socket)
0368 {
0369 u32 mfunc, mfunc_old, devctl;
0370 u8 gpio3, gpio3_old;
0371 int pci_irq_status;
0372
0373 mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC);
0374 devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
0375 dev_info(&socket->dev->dev, "TI: mfunc 0x%08x, devctl 0x%02x\n",
0376 mfunc, devctl);
0377
0378
0379 ti_init(socket);
0380
0381
0382 pci_irq_status = yenta_probe_cb_irq(socket);
0383 if (pci_irq_status)
0384 goto out;
0385
0386
0387
0388
0389
0390 dev_info(&socket->dev->dev,
0391 "TI: probing PCI interrupt failed, trying to fix\n");
0392
0393
0394 if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) {
0395 switch (socket->dev->device) {
0396 case PCI_DEVICE_ID_TI_1250:
0397 case PCI_DEVICE_ID_TI_1251A:
0398 case PCI_DEVICE_ID_TI_1251B:
0399 case PCI_DEVICE_ID_TI_1450:
0400 case PCI_DEVICE_ID_TI_1451A:
0401 case PCI_DEVICE_ID_TI_4450:
0402 case PCI_DEVICE_ID_TI_4451:
0403
0404 break;
0405
0406 default:
0407 mfunc = (mfunc & ~TI122X_MFUNC3_MASK) | TI122X_MFUNC3_IRQSER;
0408
0409
0410 if (mfunc != mfunc_old) {
0411 config_writel(socket, TI122X_MFUNC, mfunc);
0412
0413 pci_irq_status = yenta_probe_cb_irq(socket);
0414 if (pci_irq_status == 1) {
0415 dev_info(&socket->dev->dev,
0416 "TI: all-serial interrupts ok\n");
0417 mfunc_old = mfunc;
0418 goto out;
0419 }
0420
0421
0422 mfunc = mfunc_old;
0423 config_writel(socket, TI122X_MFUNC, mfunc);
0424
0425 if (pci_irq_status == -1)
0426 goto out;
0427 }
0428 }
0429
0430
0431 dev_info(&socket->dev->dev,
0432 "TI: falling back to parallel PCI interrupts\n");
0433 devctl &= ~TI113X_DCR_IMODE_MASK;
0434 devctl |= TI113X_DCR_IMODE_SERIAL;
0435 config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
0436 }
0437
0438
0439 switch (socket->dev->device) {
0440 case PCI_DEVICE_ID_TI_1250:
0441 case PCI_DEVICE_ID_TI_1251A:
0442 case PCI_DEVICE_ID_TI_1251B:
0443 case PCI_DEVICE_ID_TI_1450:
0444
0445 gpio3 = gpio3_old = config_readb(socket, TI1250_GPIO3_CONTROL);
0446 gpio3 &= ~TI1250_GPIO_MODE_MASK;
0447 if (gpio3 != gpio3_old)
0448 config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3);
0449 break;
0450
0451 default:
0452 gpio3 = gpio3_old = 0;
0453
0454 mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI122X_MFUNC0_INTA;
0455 if (mfunc != mfunc_old)
0456 config_writel(socket, TI122X_MFUNC, mfunc);
0457 }
0458
0459
0460 pci_irq_status = yenta_probe_cb_irq(socket);
0461 if (pci_irq_status == 1) {
0462 mfunc_old = mfunc;
0463 dev_info(&socket->dev->dev, "TI: parallel PCI interrupts ok\n");
0464 } else {
0465
0466 mfunc = mfunc_old;
0467 config_writel(socket, TI122X_MFUNC, mfunc);
0468 if (gpio3 != gpio3_old)
0469 config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3_old);
0470 }
0471
0472 out:
0473 if (pci_irq_status < 1) {
0474 socket->cb_irq = 0;
0475 dev_info(&socket->dev->dev,
0476 "Yenta TI: no PCI interrupts. Fish. Please report.\n");
0477 }
0478 }
0479
0480
0481
0482 static int ti12xx_align_irqs(struct yenta_socket *socket, int *old_irq)
0483 {
0484 struct pci_dev *func0;
0485
0486
0487 func0 = pci_get_slot(socket->dev->bus, socket->dev->devfn & ~0x07);
0488 if (!func0)
0489 return 0;
0490
0491 if (old_irq)
0492 *old_irq = socket->cb_irq;
0493 socket->cb_irq = socket->dev->irq = func0->irq;
0494
0495 pci_dev_put(func0);
0496
0497 return 1;
0498 }
0499
0500
0501
0502
0503
0504
0505 static int ti12xx_tie_interrupts(struct yenta_socket *socket, int *old_irq)
0506 {
0507 u32 sysctl;
0508 int ret;
0509
0510 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
0511 if (sysctl & TI122X_SCR_INTRTIE)
0512 return 0;
0513
0514
0515 ret = ti12xx_align_irqs(socket, old_irq);
0516 if (!ret)
0517 return 0;
0518
0519
0520 sysctl |= TI122X_SCR_INTRTIE;
0521 config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl);
0522
0523 return 1;
0524 }
0525
0526
0527 static void ti12xx_untie_interrupts(struct yenta_socket *socket, int old_irq)
0528 {
0529 u32 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
0530 sysctl &= ~TI122X_SCR_INTRTIE;
0531 config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl);
0532
0533 socket->cb_irq = socket->dev->irq = old_irq;
0534 }
0535
0536
0537
0538
0539
0540
0541 static void ti12xx_irqroute_func1(struct yenta_socket *socket)
0542 {
0543 u32 mfunc, mfunc_old, devctl, sysctl;
0544 int pci_irq_status;
0545
0546 mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC);
0547 devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
0548 dev_info(&socket->dev->dev, "TI: mfunc 0x%08x, devctl 0x%02x\n",
0549 mfunc, devctl);
0550
0551
0552 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
0553 if (sysctl & TI122X_SCR_INTRTIE)
0554 ti12xx_align_irqs(socket, NULL);
0555
0556
0557 ti_init(socket);
0558
0559
0560 pci_irq_status = yenta_probe_cb_irq(socket);
0561 if (pci_irq_status)
0562 goto out;
0563
0564
0565
0566
0567
0568 dev_info(&socket->dev->dev,
0569 "TI: probing PCI interrupt failed, trying to fix\n");
0570
0571
0572 if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) {
0573 int old_irq;
0574
0575 if (ti12xx_tie_interrupts(socket, &old_irq)) {
0576 pci_irq_status = yenta_probe_cb_irq(socket);
0577 if (pci_irq_status == 1) {
0578 dev_info(&socket->dev->dev,
0579 "TI: all-serial interrupts, tied ok\n");
0580 goto out;
0581 }
0582
0583 ti12xx_untie_interrupts(socket, old_irq);
0584 }
0585 }
0586
0587 else {
0588 int old_irq;
0589
0590 switch (socket->dev->device) {
0591 case PCI_DEVICE_ID_TI_1250:
0592
0593 break;
0594
0595 case PCI_DEVICE_ID_TI_1251A:
0596 case PCI_DEVICE_ID_TI_1251B:
0597 case PCI_DEVICE_ID_TI_1450:
0598
0599
0600
0601
0602 mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI125X_MFUNC0_INTB;
0603 break;
0604
0605 default:
0606 mfunc = (mfunc & ~TI122X_MFUNC1_MASK) | TI122X_MFUNC1_INTB;
0607 break;
0608 }
0609
0610
0611 if (mfunc != mfunc_old) {
0612 config_writel(socket, TI122X_MFUNC, mfunc);
0613
0614 pci_irq_status = yenta_probe_cb_irq(socket);
0615 if (pci_irq_status == 1) {
0616 dev_info(&socket->dev->dev,
0617 "TI: parallel PCI interrupts ok\n");
0618 goto out;
0619 }
0620
0621 mfunc = mfunc_old;
0622 config_writel(socket, TI122X_MFUNC, mfunc);
0623
0624 if (pci_irq_status == -1)
0625 goto out;
0626 }
0627
0628
0629 if (ti12xx_tie_interrupts(socket, &old_irq)) {
0630 pci_irq_status = yenta_probe_cb_irq(socket);
0631 if (pci_irq_status == 1) {
0632 dev_info(&socket->dev->dev,
0633 "TI: parallel PCI interrupts, tied ok\n");
0634 goto out;
0635 }
0636
0637 ti12xx_untie_interrupts(socket, old_irq);
0638 }
0639 }
0640
0641 out:
0642 if (pci_irq_status < 1) {
0643 socket->cb_irq = 0;
0644 dev_info(&socket->dev->dev,
0645 "TI: no PCI interrupts. Fish. Please report.\n");
0646 }
0647 }
0648
0649
0650
0651 static int ti12xx_2nd_slot_empty(struct yenta_socket *socket)
0652 {
0653 struct pci_dev *func;
0654 struct yenta_socket *slot2;
0655 int devfn;
0656 unsigned int state;
0657 int ret = 1;
0658 u32 sysctl;
0659
0660
0661 switch (socket->dev->device) {
0662 case PCI_DEVICE_ID_TI_1220:
0663 case PCI_DEVICE_ID_TI_1221:
0664 case PCI_DEVICE_ID_TI_1225:
0665 case PCI_DEVICE_ID_TI_1251A:
0666 case PCI_DEVICE_ID_TI_1251B:
0667 case PCI_DEVICE_ID_TI_1420:
0668 case PCI_DEVICE_ID_TI_1450:
0669 case PCI_DEVICE_ID_TI_1451A:
0670 case PCI_DEVICE_ID_TI_1520:
0671 case PCI_DEVICE_ID_TI_1620:
0672 case PCI_DEVICE_ID_TI_4520:
0673 case PCI_DEVICE_ID_TI_4450:
0674 case PCI_DEVICE_ID_TI_4451:
0675
0676
0677
0678
0679 break;
0680
0681 case PCI_DEVICE_ID_TI_XX12:
0682 case PCI_DEVICE_ID_TI_X515:
0683 case PCI_DEVICE_ID_TI_X420:
0684 case PCI_DEVICE_ID_TI_X620:
0685 case PCI_DEVICE_ID_TI_XX21_XX11:
0686 case PCI_DEVICE_ID_TI_7410:
0687 case PCI_DEVICE_ID_TI_7610:
0688
0689
0690
0691
0692
0693
0694 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
0695 if (sysctl & TIXX21_SCR_TIEALL)
0696 return 0;
0697
0698 break;
0699
0700
0701 default:
0702 return 1;
0703 }
0704
0705
0706 devfn = socket->dev->devfn & ~0x07;
0707 func = pci_get_slot(socket->dev->bus,
0708 (socket->dev->devfn & 0x07) ? devfn : devfn | 0x01);
0709 if (!func)
0710 return 1;
0711
0712
0713
0714
0715
0716
0717
0718 if (socket->dev->device != func->device)
0719 goto out;
0720
0721 slot2 = pci_get_drvdata(func);
0722 if (!slot2)
0723 goto out;
0724
0725
0726 yenta_get_status(&slot2->socket, &state);
0727 if (state & SS_DETECT) {
0728 ret = 0;
0729 goto out;
0730 }
0731
0732 out:
0733 pci_dev_put(func);
0734 return ret;
0735 }
0736
0737
0738
0739
0740
0741
0742
0743
0744 static int ti12xx_power_hook(struct pcmcia_socket *sock, int operation)
0745 {
0746 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
0747 u32 mfunc, devctl, sysctl;
0748 u8 gpio3;
0749
0750
0751 if ((operation != HOOK_POWER_PRE) && (operation != HOOK_POWER_POST))
0752 return 0;
0753
0754 devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
0755 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
0756 mfunc = config_readl(socket, TI122X_MFUNC);
0757
0758
0759
0760
0761
0762
0763
0764
0765 if (((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) &&
0766 (pwr_irqs_off || ti12xx_2nd_slot_empty(socket))) {
0767 switch (socket->dev->device) {
0768 case PCI_DEVICE_ID_TI_1250:
0769 case PCI_DEVICE_ID_TI_1251A:
0770 case PCI_DEVICE_ID_TI_1251B:
0771 case PCI_DEVICE_ID_TI_1450:
0772 case PCI_DEVICE_ID_TI_1451A:
0773 case PCI_DEVICE_ID_TI_4450:
0774 case PCI_DEVICE_ID_TI_4451:
0775
0776 break;
0777
0778 default:
0779 if (operation == HOOK_POWER_PRE)
0780 mfunc = (mfunc & ~TI122X_MFUNC3_MASK);
0781 else
0782 mfunc = (mfunc & ~TI122X_MFUNC3_MASK) | TI122X_MFUNC3_IRQSER;
0783 }
0784
0785 return 0;
0786 }
0787
0788
0789 if ((PCI_FUNC(socket->dev->devfn) == 0) ||
0790 ((sysctl & TI122X_SCR_INTRTIE) &&
0791 (pwr_irqs_off || ti12xx_2nd_slot_empty(socket)))) {
0792
0793 switch (socket->dev->device) {
0794 case PCI_DEVICE_ID_TI_1250:
0795 case PCI_DEVICE_ID_TI_1251A:
0796 case PCI_DEVICE_ID_TI_1251B:
0797 case PCI_DEVICE_ID_TI_1450:
0798
0799 gpio3 = config_readb(socket, TI1250_GPIO3_CONTROL);
0800 if (operation == HOOK_POWER_PRE)
0801 gpio3 = (gpio3 & ~TI1250_GPIO_MODE_MASK) | 0x40;
0802 else
0803 gpio3 &= ~TI1250_GPIO_MODE_MASK;
0804 config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3);
0805 break;
0806
0807 default:
0808
0809 if (operation == HOOK_POWER_PRE)
0810 mfunc &= ~TI122X_MFUNC0_MASK;
0811 else
0812 mfunc |= TI122X_MFUNC0_INTA;
0813 config_writel(socket, TI122X_MFUNC, mfunc);
0814 }
0815 } else {
0816 switch (socket->dev->device) {
0817 case PCI_DEVICE_ID_TI_1251A:
0818 case PCI_DEVICE_ID_TI_1251B:
0819 case PCI_DEVICE_ID_TI_1450:
0820
0821 if (operation == HOOK_POWER_PRE)
0822 mfunc &= ~TI122X_MFUNC0_MASK;
0823 else
0824 mfunc |= TI125X_MFUNC0_INTB;
0825 config_writel(socket, TI122X_MFUNC, mfunc);
0826
0827 break;
0828
0829 default:
0830
0831 if (operation == HOOK_POWER_PRE)
0832 mfunc &= ~TI122X_MFUNC1_MASK;
0833 else
0834 mfunc |= TI122X_MFUNC1_INTB;
0835 config_writel(socket, TI122X_MFUNC, mfunc);
0836 }
0837 }
0838
0839 return 0;
0840 }
0841
0842 static int ti12xx_override(struct yenta_socket *socket)
0843 {
0844 u32 val, val_orig;
0845
0846
0847 val_orig = val = config_readl(socket, TI113X_SYSTEM_CONTROL);
0848 if (disable_clkrun && PCI_FUNC(socket->dev->devfn) == 0) {
0849 dev_info(&socket->dev->dev, "Disabling CLKRUN feature\n");
0850 val |= TI113X_SCR_KEEPCLK;
0851 }
0852 if (!(val & TI122X_SCR_MRBURSTUP)) {
0853 dev_info(&socket->dev->dev,
0854 "Enabling burst memory read transactions\n");
0855 val |= TI122X_SCR_MRBURSTUP;
0856 }
0857 if (val_orig != val)
0858 config_writel(socket, TI113X_SYSTEM_CONTROL, val);
0859
0860
0861
0862
0863
0864 val = config_readb(socket, TI1250_DIAGNOSTIC);
0865 dev_info(&socket->dev->dev, "Using %s to route CSC interrupts to PCI\n",
0866 (val & TI1250_DIAG_PCI_CSC) ? "CSCINT" : "INTVAL");
0867 dev_info(&socket->dev->dev, "Routing CardBus interrupts to %s\n",
0868 (val & TI1250_DIAG_PCI_IREQ) ? "PCI" : "ISA");
0869
0870
0871 if (PCI_FUNC(socket->dev->devfn) == 0)
0872 ti12xx_irqroute_func0(socket);
0873 else
0874 ti12xx_irqroute_func1(socket);
0875
0876
0877 socket->socket.power_hook = ti12xx_power_hook;
0878
0879 return ti_override(socket);
0880 }
0881
0882
0883 static int ti1250_override(struct yenta_socket *socket)
0884 {
0885 u8 old, diag;
0886
0887 old = config_readb(socket, TI1250_DIAGNOSTIC);
0888 diag = old & ~(TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ);
0889 if (socket->cb_irq)
0890 diag |= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ;
0891
0892 if (diag != old) {
0893 dev_info(&socket->dev->dev,
0894 "adjusting diagnostic: %02x -> %02x\n",
0895 old, diag);
0896 config_writeb(socket, TI1250_DIAGNOSTIC, diag);
0897 }
0898
0899 return ti12xx_override(socket);
0900 }
0901
0902
0903
0904
0905
0906
0907
0908
0909 #ifdef CONFIG_YENTA_ENE_TUNE
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919 #define DEVID(_vend,_dev,_subvend,_subdev,mask,bits) { \
0920 .vendor = _vend, \
0921 .device = _dev, \
0922 .subvendor = _subvend, \
0923 .subdevice = _subdev, \
0924 .driver_data = ((mask) << 8 | (bits)), \
0925 }
0926 static struct pci_device_id ene_tune_tbl[] = {
0927
0928 DEVID(PCI_VENDOR_ID_MOTOROLA, 0x1801, 0xECC0, PCI_ANY_ID,
0929 ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE),
0930 DEVID(PCI_VENDOR_ID_MOTOROLA, 0x3410, 0xECC0, PCI_ANY_ID,
0931 ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE),
0932
0933 {}
0934 };
0935
0936 static void ene_tune_bridge(struct pcmcia_socket *sock, struct pci_bus *bus)
0937 {
0938 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
0939 struct pci_dev *dev;
0940 struct pci_device_id *id = NULL;
0941 u8 test_c9, old_c9, mask, bits;
0942
0943 list_for_each_entry(dev, &bus->devices, bus_list) {
0944 id = (struct pci_device_id *) pci_match_id(ene_tune_tbl, dev);
0945 if (id)
0946 break;
0947 }
0948
0949 test_c9 = old_c9 = config_readb(socket, ENE_TEST_C9);
0950 if (id) {
0951 mask = (id->driver_data >> 8) & 0xFF;
0952 bits = id->driver_data & 0xFF;
0953
0954 test_c9 = (test_c9 & ~mask) | bits;
0955 }
0956 else
0957
0958 test_c9 &= ~ENE_TEST_C9_TLTENABLE;
0959
0960 dev_info(&socket->dev->dev,
0961 "EnE: changing testregister 0xC9, %02x -> %02x\n",
0962 old_c9, test_c9);
0963 config_writeb(socket, ENE_TEST_C9, test_c9);
0964 }
0965
0966 static int ene_override(struct yenta_socket *socket)
0967 {
0968
0969 socket->socket.tune_bridge = ene_tune_bridge;
0970
0971 return ti1250_override(socket);
0972 }
0973 #else
0974 # define ene_override ti1250_override
0975 #endif
0976
0977 #endif
0978