11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * ti113x.h 1.16 1999/10/25 20:03:34 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * The contents of this file are subject to the Mozilla Public License 51da177e4SLinus Torvalds * Version 1.1 (the "License"); you may not use this file except in 61da177e4SLinus Torvalds * compliance with the License. You may obtain a copy of the License 71da177e4SLinus Torvalds * at http://www.mozilla.org/MPL/ 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * Software distributed under the License is distributed on an "AS IS" 101da177e4SLinus Torvalds * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 111da177e4SLinus Torvalds * the License for the specific language governing rights and 121da177e4SLinus Torvalds * limitations under the License. 131da177e4SLinus Torvalds * 141da177e4SLinus Torvalds * The initial developer of the original code is David A. Hinds 151da177e4SLinus Torvalds * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 161da177e4SLinus Torvalds * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds * Alternatively, the contents of this file may be used under the 191da177e4SLinus Torvalds * terms of the GNU General Public License version 2 (the "GPL"), in which 201da177e4SLinus Torvalds * case the provisions of the GPL are applicable instead of the 211da177e4SLinus Torvalds * above. If you wish to allow the use of your version of this file 221da177e4SLinus Torvalds * only under the terms of the GPL and not to allow others to use 231da177e4SLinus Torvalds * your version of this file under the MPL, indicate your decision by 241da177e4SLinus Torvalds * deleting the provisions above and replace them with the notice and 251da177e4SLinus Torvalds * other provisions required by the GPL. If you do not delete the 261da177e4SLinus Torvalds * provisions above, a recipient may use your version of this file 271da177e4SLinus Torvalds * under either the MPL or the GPL. 281da177e4SLinus Torvalds */ 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds #ifndef _LINUX_TI113X_H 311da177e4SLinus Torvalds #define _LINUX_TI113X_H 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds #include <linux/config.h> 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds /* Register definitions for TI 113X PCI-to-CardBus bridges */ 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds /* System Control Register */ 381da177e4SLinus Torvalds #define TI113X_SYSTEM_CONTROL 0x0080 /* 32 bit */ 391da177e4SLinus Torvalds #define TI113X_SCR_SMIROUTE 0x04000000 401da177e4SLinus Torvalds #define TI113X_SCR_SMISTATUS 0x02000000 411da177e4SLinus Torvalds #define TI113X_SCR_SMIENB 0x01000000 421da177e4SLinus Torvalds #define TI113X_SCR_VCCPROT 0x00200000 431da177e4SLinus Torvalds #define TI113X_SCR_REDUCEZV 0x00100000 441da177e4SLinus Torvalds #define TI113X_SCR_CDREQEN 0x00080000 451da177e4SLinus Torvalds #define TI113X_SCR_CDMACHAN 0x00070000 461da177e4SLinus Torvalds #define TI113X_SCR_SOCACTIVE 0x00002000 471da177e4SLinus Torvalds #define TI113X_SCR_PWRSTREAM 0x00000800 481da177e4SLinus Torvalds #define TI113X_SCR_DELAYUP 0x00000400 491da177e4SLinus Torvalds #define TI113X_SCR_DELAYDOWN 0x00000200 501da177e4SLinus Torvalds #define TI113X_SCR_INTERROGATE 0x00000100 511da177e4SLinus Torvalds #define TI113X_SCR_CLKRUN_SEL 0x00000080 521da177e4SLinus Torvalds #define TI113X_SCR_PWRSAVINGS 0x00000040 531da177e4SLinus Torvalds #define TI113X_SCR_SUBSYSRW 0x00000020 541da177e4SLinus Torvalds #define TI113X_SCR_CB_DPAR 0x00000010 551da177e4SLinus Torvalds #define TI113X_SCR_CDMA_EN 0x00000008 561da177e4SLinus Torvalds #define TI113X_SCR_ASYNC_IRQ 0x00000004 571da177e4SLinus Torvalds #define TI113X_SCR_KEEPCLK 0x00000002 581da177e4SLinus Torvalds #define TI113X_SCR_CLKRUN_ENA 0x00000001 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds #define TI122X_SCR_SER_STEP 0xc0000000 611da177e4SLinus Torvalds #define TI122X_SCR_INTRTIE 0x20000000 621da177e4SLinus Torvalds #define TI122X_SCR_CBRSVD 0x00400000 631da177e4SLinus Torvalds #define TI122X_SCR_MRBURSTDN 0x00008000 641da177e4SLinus Torvalds #define TI122X_SCR_MRBURSTUP 0x00004000 651da177e4SLinus Torvalds #define TI122X_SCR_RIMUX 0x00000001 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /* Multimedia Control Register */ 681da177e4SLinus Torvalds #define TI1250_MULTIMEDIA_CTL 0x0084 /* 8 bit */ 691da177e4SLinus Torvalds #define TI1250_MMC_ZVOUTEN 0x80 701da177e4SLinus Torvalds #define TI1250_MMC_PORTSEL 0x40 711da177e4SLinus Torvalds #define TI1250_MMC_ZVEN1 0x02 721da177e4SLinus Torvalds #define TI1250_MMC_ZVEN0 0x01 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds #define TI1250_GENERAL_STATUS 0x0085 /* 8 bit */ 751da177e4SLinus Torvalds #define TI1250_GPIO0_CONTROL 0x0088 /* 8 bit */ 761da177e4SLinus Torvalds #define TI1250_GPIO1_CONTROL 0x0089 /* 8 bit */ 771da177e4SLinus Torvalds #define TI1250_GPIO2_CONTROL 0x008a /* 8 bit */ 781da177e4SLinus Torvalds #define TI1250_GPIO3_CONTROL 0x008b /* 8 bit */ 791da177e4SLinus Torvalds #define TI1250_GPIO_MODE_MASK 0xc0 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds /* IRQMUX/MFUNC Register */ 821da177e4SLinus Torvalds #define TI122X_MFUNC 0x008c /* 32 bit */ 831da177e4SLinus Torvalds #define TI122X_MFUNC0_MASK 0x0000000f 841da177e4SLinus Torvalds #define TI122X_MFUNC1_MASK 0x000000f0 851da177e4SLinus Torvalds #define TI122X_MFUNC2_MASK 0x00000f00 861da177e4SLinus Torvalds #define TI122X_MFUNC3_MASK 0x0000f000 871da177e4SLinus Torvalds #define TI122X_MFUNC4_MASK 0x000f0000 881da177e4SLinus Torvalds #define TI122X_MFUNC5_MASK 0x00f00000 891da177e4SLinus Torvalds #define TI122X_MFUNC6_MASK 0x0f000000 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds #define TI122X_MFUNC0_INTA 0x00000002 921da177e4SLinus Torvalds #define TI125X_MFUNC0_INTB 0x00000001 931da177e4SLinus Torvalds #define TI122X_MFUNC1_INTB 0x00000020 941da177e4SLinus Torvalds #define TI122X_MFUNC3_IRQSER 0x00001000 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds /* Retry Status Register */ 981da177e4SLinus Torvalds #define TI113X_RETRY_STATUS 0x0090 /* 8 bit */ 991da177e4SLinus Torvalds #define TI113X_RSR_PCIRETRY 0x80 1001da177e4SLinus Torvalds #define TI113X_RSR_CBRETRY 0x40 1011da177e4SLinus Torvalds #define TI113X_RSR_TEXP_CBB 0x20 1021da177e4SLinus Torvalds #define TI113X_RSR_MEXP_CBB 0x10 1031da177e4SLinus Torvalds #define TI113X_RSR_TEXP_CBA 0x08 1041da177e4SLinus Torvalds #define TI113X_RSR_MEXP_CBA 0x04 1051da177e4SLinus Torvalds #define TI113X_RSR_TEXP_PCI 0x02 1061da177e4SLinus Torvalds #define TI113X_RSR_MEXP_PCI 0x01 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds /* Card Control Register */ 1091da177e4SLinus Torvalds #define TI113X_CARD_CONTROL 0x0091 /* 8 bit */ 1101da177e4SLinus Torvalds #define TI113X_CCR_RIENB 0x80 1111da177e4SLinus Torvalds #define TI113X_CCR_ZVENABLE 0x40 1121da177e4SLinus Torvalds #define TI113X_CCR_PCI_IRQ_ENA 0x20 1131da177e4SLinus Torvalds #define TI113X_CCR_PCI_IREQ 0x10 1141da177e4SLinus Torvalds #define TI113X_CCR_PCI_CSC 0x08 1151da177e4SLinus Torvalds #define TI113X_CCR_SPKROUTEN 0x02 1161da177e4SLinus Torvalds #define TI113X_CCR_IFG 0x01 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds #define TI1220_CCR_PORT_SEL 0x20 1191da177e4SLinus Torvalds #define TI122X_CCR_AUD2MUX 0x04 1201da177e4SLinus Torvalds 1211da177e4SLinus Torvalds /* Device Control Register */ 1221da177e4SLinus Torvalds #define TI113X_DEVICE_CONTROL 0x0092 /* 8 bit */ 1231da177e4SLinus Torvalds #define TI113X_DCR_5V_FORCE 0x40 1241da177e4SLinus Torvalds #define TI113X_DCR_3V_FORCE 0x20 1251da177e4SLinus Torvalds #define TI113X_DCR_IMODE_MASK 0x06 1261da177e4SLinus Torvalds #define TI113X_DCR_IMODE_ISA 0x02 1271da177e4SLinus Torvalds #define TI113X_DCR_IMODE_SERIAL 0x04 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvalds #define TI12XX_DCR_IMODE_PCI_ONLY 0x00 1301da177e4SLinus Torvalds #define TI12XX_DCR_IMODE_ALL_SERIAL 0x06 1311da177e4SLinus Torvalds 1321da177e4SLinus Torvalds /* Buffer Control Register */ 1331da177e4SLinus Torvalds #define TI113X_BUFFER_CONTROL 0x0093 /* 8 bit */ 1341da177e4SLinus Torvalds #define TI113X_BCR_CB_READ_DEPTH 0x08 1351da177e4SLinus Torvalds #define TI113X_BCR_CB_WRITE_DEPTH 0x04 1361da177e4SLinus Torvalds #define TI113X_BCR_PCI_READ_DEPTH 0x02 1371da177e4SLinus Torvalds #define TI113X_BCR_PCI_WRITE_DEPTH 0x01 1381da177e4SLinus Torvalds 1391da177e4SLinus Torvalds /* Diagnostic Register */ 1401da177e4SLinus Torvalds #define TI1250_DIAGNOSTIC 0x0093 /* 8 bit */ 1411da177e4SLinus Torvalds #define TI1250_DIAG_TRUE_VALUE 0x80 1421da177e4SLinus Torvalds #define TI1250_DIAG_PCI_IREQ 0x40 1431da177e4SLinus Torvalds #define TI1250_DIAG_PCI_CSC 0x20 1441da177e4SLinus Torvalds #define TI1250_DIAG_ASYNC_CSC 0x01 1451da177e4SLinus Torvalds 1461da177e4SLinus Torvalds /* DMA Registers */ 1471da177e4SLinus Torvalds #define TI113X_DMA_0 0x0094 /* 32 bit */ 1481da177e4SLinus Torvalds #define TI113X_DMA_1 0x0098 /* 32 bit */ 1491da177e4SLinus Torvalds 1501da177e4SLinus Torvalds /* ExCA IO offset registers */ 1511da177e4SLinus Torvalds #define TI113X_IO_OFFSET(map) (0x36+((map)<<1)) 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds /* EnE test register */ 1541da177e4SLinus Torvalds #define ENE_TEST_C9 0xc9 /* 8bit */ 1551da177e4SLinus Torvalds #define ENE_TEST_C9_TLTENABLE 0x02 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds #ifdef CONFIG_CARDBUS 1581da177e4SLinus Torvalds 1591da177e4SLinus Torvalds /* 1601da177e4SLinus Torvalds * Texas Instruments CardBus controller overrides. 1611da177e4SLinus Torvalds */ 1621da177e4SLinus Torvalds #define ti_sysctl(socket) ((socket)->private[0]) 1631da177e4SLinus Torvalds #define ti_cardctl(socket) ((socket)->private[1]) 1641da177e4SLinus Torvalds #define ti_devctl(socket) ((socket)->private[2]) 1651da177e4SLinus Torvalds #define ti_diag(socket) ((socket)->private[3]) 1661da177e4SLinus Torvalds #define ti_mfunc(socket) ((socket)->private[4]) 1671da177e4SLinus Torvalds #define ene_test_c9(socket) ((socket)->private[5]) 1681da177e4SLinus Torvalds 1691da177e4SLinus Torvalds /* 1701da177e4SLinus Torvalds * These are the TI specific power management handlers. 1711da177e4SLinus Torvalds */ 1721da177e4SLinus Torvalds static void ti_save_state(struct yenta_socket *socket) 1731da177e4SLinus Torvalds { 1741da177e4SLinus Torvalds ti_sysctl(socket) = config_readl(socket, TI113X_SYSTEM_CONTROL); 1751da177e4SLinus Torvalds ti_mfunc(socket) = config_readl(socket, TI122X_MFUNC); 1761da177e4SLinus Torvalds ti_cardctl(socket) = config_readb(socket, TI113X_CARD_CONTROL); 1771da177e4SLinus Torvalds ti_devctl(socket) = config_readb(socket, TI113X_DEVICE_CONTROL); 1781da177e4SLinus Torvalds ti_diag(socket) = config_readb(socket, TI1250_DIAGNOSTIC); 1791da177e4SLinus Torvalds 1801da177e4SLinus Torvalds if (socket->dev->vendor == PCI_VENDOR_ID_ENE) 1811da177e4SLinus Torvalds ene_test_c9(socket) = config_readb(socket, ENE_TEST_C9); 1821da177e4SLinus Torvalds } 1831da177e4SLinus Torvalds 1841da177e4SLinus Torvalds static void ti_restore_state(struct yenta_socket *socket) 1851da177e4SLinus Torvalds { 1861da177e4SLinus Torvalds config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket)); 1871da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, ti_mfunc(socket)); 1881da177e4SLinus Torvalds config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket)); 1891da177e4SLinus Torvalds config_writeb(socket, TI113X_DEVICE_CONTROL, ti_devctl(socket)); 1901da177e4SLinus Torvalds config_writeb(socket, TI1250_DIAGNOSTIC, ti_diag(socket)); 1911da177e4SLinus Torvalds 1921da177e4SLinus Torvalds if (socket->dev->vendor == PCI_VENDOR_ID_ENE) 1931da177e4SLinus Torvalds config_writeb(socket, ENE_TEST_C9, ene_test_c9(socket)); 1941da177e4SLinus Torvalds } 1951da177e4SLinus Torvalds 1961da177e4SLinus Torvalds /* 1971da177e4SLinus Torvalds * Zoom video control for TI122x/113x chips 1981da177e4SLinus Torvalds */ 1991da177e4SLinus Torvalds 2001da177e4SLinus Torvalds static void ti_zoom_video(struct pcmcia_socket *sock, int onoff) 2011da177e4SLinus Torvalds { 2021da177e4SLinus Torvalds u8 reg; 2031da177e4SLinus Torvalds struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); 2041da177e4SLinus Torvalds 2051da177e4SLinus Torvalds /* If we don't have a Zoom Video switch this is harmless, 2061da177e4SLinus Torvalds we just tristate the unused (ZV) lines */ 2071da177e4SLinus Torvalds reg = config_readb(socket, TI113X_CARD_CONTROL); 2081da177e4SLinus Torvalds if (onoff) 2091da177e4SLinus Torvalds /* Zoom zoom, we will all go together, zoom zoom, zoom zoom */ 2101da177e4SLinus Torvalds reg |= TI113X_CCR_ZVENABLE; 2111da177e4SLinus Torvalds else 2121da177e4SLinus Torvalds reg &= ~TI113X_CCR_ZVENABLE; 2131da177e4SLinus Torvalds config_writeb(socket, TI113X_CARD_CONTROL, reg); 2141da177e4SLinus Torvalds } 2151da177e4SLinus Torvalds 2161da177e4SLinus Torvalds /* 2171da177e4SLinus Torvalds * The 145x series can also use this. They have an additional 2181da177e4SLinus Torvalds * ZV autodetect mode we don't use but don't actually need. 2191da177e4SLinus Torvalds * FIXME: manual says its in func0 and func1 but disagrees with 2201da177e4SLinus Torvalds * itself about this - do we need to force func0, if so we need 2211da177e4SLinus Torvalds * to know a lot more about socket pairings in pcmcia_socket than 2221da177e4SLinus Torvalds * we do now.. uggh. 2231da177e4SLinus Torvalds */ 2241da177e4SLinus Torvalds 2251da177e4SLinus Torvalds static void ti1250_zoom_video(struct pcmcia_socket *sock, int onoff) 2261da177e4SLinus Torvalds { 2271da177e4SLinus Torvalds struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); 2281da177e4SLinus Torvalds int shift = 0; 2291da177e4SLinus Torvalds u8 reg; 2301da177e4SLinus Torvalds 2311da177e4SLinus Torvalds ti_zoom_video(sock, onoff); 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds reg = config_readb(socket, TI1250_MULTIMEDIA_CTL); 2341da177e4SLinus Torvalds reg |= TI1250_MMC_ZVOUTEN; /* ZV bus enable */ 2351da177e4SLinus Torvalds 2361da177e4SLinus Torvalds if(PCI_FUNC(socket->dev->devfn)==1) 2371da177e4SLinus Torvalds shift = 1; 2381da177e4SLinus Torvalds 2391da177e4SLinus Torvalds if(onoff) 2401da177e4SLinus Torvalds { 2411da177e4SLinus Torvalds reg &= ~(1<<6); /* Clear select bit */ 2421da177e4SLinus Torvalds reg |= shift<<6; /* Favour our socket */ 2431da177e4SLinus Torvalds reg |= 1<<shift; /* Socket zoom video on */ 2441da177e4SLinus Torvalds } 2451da177e4SLinus Torvalds else 2461da177e4SLinus Torvalds { 2471da177e4SLinus Torvalds reg &= ~(1<<6); /* Clear select bit */ 2481da177e4SLinus Torvalds reg |= (1^shift)<<6; /* Favour other socket */ 2491da177e4SLinus Torvalds reg &= ~(1<<shift); /* Socket zoon video off */ 2501da177e4SLinus Torvalds } 2511da177e4SLinus Torvalds 2521da177e4SLinus Torvalds config_writeb(socket, TI1250_MULTIMEDIA_CTL, reg); 2531da177e4SLinus Torvalds } 2541da177e4SLinus Torvalds 2551da177e4SLinus Torvalds static void ti_set_zv(struct yenta_socket *socket) 2561da177e4SLinus Torvalds { 2571da177e4SLinus Torvalds if(socket->dev->vendor == PCI_VENDOR_ID_TI) 2581da177e4SLinus Torvalds { 2591da177e4SLinus Torvalds switch(socket->dev->device) 2601da177e4SLinus Torvalds { 2611da177e4SLinus Torvalds /* There may be more .. */ 2621da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1220: 2631da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1221: 2641da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1225: 2651da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_4510: 2661da177e4SLinus Torvalds socket->socket.zoom_video = ti_zoom_video; 2671da177e4SLinus Torvalds break; 2681da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1250: 2691da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251A: 2701da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251B: 2711da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1450: 2721da177e4SLinus Torvalds socket->socket.zoom_video = ti1250_zoom_video; 2731da177e4SLinus Torvalds } 2741da177e4SLinus Torvalds } 2751da177e4SLinus Torvalds } 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds 2781da177e4SLinus Torvalds /* 2791da177e4SLinus Torvalds * Generic TI init - TI has an extension for the 2801da177e4SLinus Torvalds * INTCTL register that sets the PCI CSC interrupt. 2811da177e4SLinus Torvalds * Make sure we set it correctly at open and init 2821da177e4SLinus Torvalds * time 2831da177e4SLinus Torvalds * - override: disable the PCI CSC interrupt. This makes 2841da177e4SLinus Torvalds * it possible to use the CSC interrupt to probe the 2851da177e4SLinus Torvalds * ISA interrupts. 2861da177e4SLinus Torvalds * - init: set the interrupt to match our PCI state. 2871da177e4SLinus Torvalds * This makes us correctly get PCI CSC interrupt 2881da177e4SLinus Torvalds * events. 2891da177e4SLinus Torvalds */ 2901da177e4SLinus Torvalds static int ti_init(struct yenta_socket *socket) 2911da177e4SLinus Torvalds { 2921da177e4SLinus Torvalds u8 new, reg = exca_readb(socket, I365_INTCTL); 2931da177e4SLinus Torvalds 2941da177e4SLinus Torvalds new = reg & ~I365_INTR_ENA; 2951da177e4SLinus Torvalds if (socket->cb_irq) 2961da177e4SLinus Torvalds new |= I365_INTR_ENA; 2971da177e4SLinus Torvalds if (new != reg) 2981da177e4SLinus Torvalds exca_writeb(socket, I365_INTCTL, new); 2991da177e4SLinus Torvalds return 0; 3001da177e4SLinus Torvalds } 3011da177e4SLinus Torvalds 3021da177e4SLinus Torvalds static int ti_override(struct yenta_socket *socket) 3031da177e4SLinus Torvalds { 3041da177e4SLinus Torvalds u8 new, reg = exca_readb(socket, I365_INTCTL); 3051da177e4SLinus Torvalds 3061da177e4SLinus Torvalds new = reg & ~I365_INTR_ENA; 3071da177e4SLinus Torvalds if (new != reg) 3081da177e4SLinus Torvalds exca_writeb(socket, I365_INTCTL, new); 3091da177e4SLinus Torvalds 3101da177e4SLinus Torvalds ti_set_zv(socket); 3111da177e4SLinus Torvalds 3121da177e4SLinus Torvalds return 0; 3131da177e4SLinus Torvalds } 3141da177e4SLinus Torvalds 3151da177e4SLinus Torvalds static int ti113x_override(struct yenta_socket *socket) 3161da177e4SLinus Torvalds { 3171da177e4SLinus Torvalds u8 cardctl; 3181da177e4SLinus Torvalds 3191da177e4SLinus Torvalds cardctl = config_readb(socket, TI113X_CARD_CONTROL); 3201da177e4SLinus Torvalds cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC); 3211da177e4SLinus Torvalds if (socket->cb_irq) 3221da177e4SLinus Torvalds cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ; 3231da177e4SLinus Torvalds config_writeb(socket, TI113X_CARD_CONTROL, cardctl); 3241da177e4SLinus Torvalds 3251da177e4SLinus Torvalds return ti_override(socket); 3261da177e4SLinus Torvalds } 3271da177e4SLinus Torvalds 3281da177e4SLinus Torvalds 3291da177e4SLinus Torvalds /* irqrouting for func0, probes PCI interrupt and ISA interrupts */ 3301da177e4SLinus Torvalds static void ti12xx_irqroute_func0(struct yenta_socket *socket) 3311da177e4SLinus Torvalds { 3321da177e4SLinus Torvalds u32 mfunc, mfunc_old, devctl; 3331da177e4SLinus Torvalds u8 gpio3, gpio3_old; 3341da177e4SLinus Torvalds int pci_irq_status; 3351da177e4SLinus Torvalds 3361da177e4SLinus Torvalds mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC); 3371da177e4SLinus Torvalds devctl = config_readb(socket, TI113X_DEVICE_CONTROL); 3381da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s, mfunc 0x%08x, devctl 0x%02x\n", 3391da177e4SLinus Torvalds pci_name(socket->dev), mfunc, devctl); 3401da177e4SLinus Torvalds 3411da177e4SLinus Torvalds /* make sure PCI interrupts are enabled before probing */ 3421da177e4SLinus Torvalds ti_init(socket); 3431da177e4SLinus Torvalds 3441da177e4SLinus Torvalds /* test PCI interrupts first. only try fixing if return value is 0! */ 3451da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 3461da177e4SLinus Torvalds if (pci_irq_status) 3471da177e4SLinus Torvalds goto out; 3481da177e4SLinus Torvalds 3491da177e4SLinus Torvalds /* 3501da177e4SLinus Torvalds * We're here which means PCI interrupts are _not_ delivered. try to 3511da177e4SLinus Torvalds * find the right setting (all serial or parallel) 3521da177e4SLinus Torvalds */ 3531da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s probing PCI interrupt failed, trying to fix\n", 3541da177e4SLinus Torvalds pci_name(socket->dev)); 3551da177e4SLinus Torvalds 3561da177e4SLinus Torvalds /* for serial PCI make sure MFUNC3 is set to IRQSER */ 3571da177e4SLinus Torvalds if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) { 3581da177e4SLinus Torvalds switch (socket->dev->device) { 3591da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1250: 3601da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251A: 3611da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251B: 3621da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1450: 3631da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1451A: 3641da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_4450: 3651da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_4451: 3661da177e4SLinus Torvalds /* these chips have no IRQSER setting in MFUNC3 */ 3671da177e4SLinus Torvalds break; 3681da177e4SLinus Torvalds 3691da177e4SLinus Torvalds default: 3701da177e4SLinus Torvalds mfunc = (mfunc & ~TI122X_MFUNC3_MASK) | TI122X_MFUNC3_IRQSER; 3711da177e4SLinus Torvalds 3721da177e4SLinus Torvalds /* write down if changed, probe */ 3731da177e4SLinus Torvalds if (mfunc != mfunc_old) { 3741da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 3751da177e4SLinus Torvalds 3761da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 3771da177e4SLinus Torvalds if (pci_irq_status == 1) { 3781da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s all-serial interrupts ok\n", 3791da177e4SLinus Torvalds pci_name(socket->dev)); 3801da177e4SLinus Torvalds mfunc_old = mfunc; 3811da177e4SLinus Torvalds goto out; 3821da177e4SLinus Torvalds } 3831da177e4SLinus Torvalds 3841da177e4SLinus Torvalds /* not working, back to old value */ 3851da177e4SLinus Torvalds mfunc = mfunc_old; 3861da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 3871da177e4SLinus Torvalds 3881da177e4SLinus Torvalds if (pci_irq_status == -1) 3891da177e4SLinus Torvalds goto out; 3901da177e4SLinus Torvalds } 3911da177e4SLinus Torvalds } 3921da177e4SLinus Torvalds 3931da177e4SLinus Torvalds /* serial PCI interrupts not working fall back to parallel */ 3941da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s falling back to parallel PCI interrupts\n", 3951da177e4SLinus Torvalds pci_name(socket->dev)); 3961da177e4SLinus Torvalds devctl &= ~TI113X_DCR_IMODE_MASK; 3971da177e4SLinus Torvalds devctl |= TI113X_DCR_IMODE_SERIAL; /* serial ISA could be right */ 3981da177e4SLinus Torvalds config_writeb(socket, TI113X_DEVICE_CONTROL, devctl); 3991da177e4SLinus Torvalds } 4001da177e4SLinus Torvalds 4011da177e4SLinus Torvalds /* parallel PCI interrupts: route INTA */ 4021da177e4SLinus Torvalds switch (socket->dev->device) { 4031da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1250: 4041da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251A: 4051da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251B: 4061da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1450: 4071da177e4SLinus Torvalds /* make sure GPIO3 is set to INTA */ 4081da177e4SLinus Torvalds gpio3 = gpio3_old = config_readb(socket, TI1250_GPIO3_CONTROL); 4091da177e4SLinus Torvalds gpio3 &= ~TI1250_GPIO_MODE_MASK; 4101da177e4SLinus Torvalds if (gpio3 != gpio3_old) 4111da177e4SLinus Torvalds config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3); 4121da177e4SLinus Torvalds break; 4131da177e4SLinus Torvalds 4141da177e4SLinus Torvalds default: 4151da177e4SLinus Torvalds gpio3 = gpio3_old = 0; 4161da177e4SLinus Torvalds 4171da177e4SLinus Torvalds mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI122X_MFUNC0_INTA; 4181da177e4SLinus Torvalds if (mfunc != mfunc_old) 4191da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 4201da177e4SLinus Torvalds } 4211da177e4SLinus Torvalds 4221da177e4SLinus Torvalds /* time to probe again */ 4231da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 4241da177e4SLinus Torvalds if (pci_irq_status == 1) { 4251da177e4SLinus Torvalds mfunc_old = mfunc; 4261da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts ok\n", 4271da177e4SLinus Torvalds pci_name(socket->dev)); 4281da177e4SLinus Torvalds } else { 4291da177e4SLinus Torvalds /* not working, back to old value */ 4301da177e4SLinus Torvalds mfunc = mfunc_old; 4311da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 4321da177e4SLinus Torvalds if (gpio3 != gpio3_old) 4331da177e4SLinus Torvalds config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3_old); 4341da177e4SLinus Torvalds } 4351da177e4SLinus Torvalds 4361da177e4SLinus Torvalds out: 4371da177e4SLinus Torvalds if (pci_irq_status < 1) { 4381da177e4SLinus Torvalds socket->cb_irq = 0; 4391da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s no PCI interrupts. Fish. Please report.\n", 4401da177e4SLinus Torvalds pci_name(socket->dev)); 4411da177e4SLinus Torvalds } 4421da177e4SLinus Torvalds } 4431da177e4SLinus Torvalds 4441da177e4SLinus Torvalds 445c835a388SDaniel Ritz /* changes the irq of func1 to match that of func0 */ 446c835a388SDaniel Ritz static int ti12xx_align_irqs(struct yenta_socket *socket, int *old_irq) 447c835a388SDaniel Ritz { 448c835a388SDaniel Ritz struct pci_dev *func0; 449c835a388SDaniel Ritz 450c835a388SDaniel Ritz /* find func0 device */ 451c835a388SDaniel Ritz func0 = pci_get_slot(socket->dev->bus, socket->dev->devfn & ~0x07); 452c835a388SDaniel Ritz if (!func0) 453c835a388SDaniel Ritz return 0; 454c835a388SDaniel Ritz 455c835a388SDaniel Ritz if (old_irq) 456c835a388SDaniel Ritz *old_irq = socket->cb_irq; 457c835a388SDaniel Ritz socket->cb_irq = socket->dev->irq = func0->irq; 458c835a388SDaniel Ritz 459c835a388SDaniel Ritz pci_dev_put(func0); 460c835a388SDaniel Ritz 461c835a388SDaniel Ritz return 1; 462c835a388SDaniel Ritz } 463c835a388SDaniel Ritz 4641da177e4SLinus Torvalds /* 4651da177e4SLinus Torvalds * ties INTA and INTB together. also changes the devices irq to that of 4661da177e4SLinus Torvalds * the function 0 device. call from func1 only. 4671da177e4SLinus Torvalds * returns 1 if INTRTIE changed, 0 otherwise. 4681da177e4SLinus Torvalds */ 4691da177e4SLinus Torvalds static int ti12xx_tie_interrupts(struct yenta_socket *socket, int *old_irq) 4701da177e4SLinus Torvalds { 4711da177e4SLinus Torvalds u32 sysctl; 472c835a388SDaniel Ritz int ret; 4731da177e4SLinus Torvalds 4741da177e4SLinus Torvalds sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL); 4751da177e4SLinus Torvalds if (sysctl & TI122X_SCR_INTRTIE) 4761da177e4SLinus Torvalds return 0; 4771da177e4SLinus Torvalds 478c835a388SDaniel Ritz /* align */ 479c835a388SDaniel Ritz ret = ti12xx_align_irqs(socket, old_irq); 480c835a388SDaniel Ritz if (!ret) 4811da177e4SLinus Torvalds return 0; 4821da177e4SLinus Torvalds 483c835a388SDaniel Ritz /* tie */ 4841da177e4SLinus Torvalds sysctl |= TI122X_SCR_INTRTIE; 4851da177e4SLinus Torvalds config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl); 4861da177e4SLinus Torvalds 4871da177e4SLinus Torvalds return 1; 4881da177e4SLinus Torvalds } 4891da177e4SLinus Torvalds 4901da177e4SLinus Torvalds /* undo what ti12xx_tie_interrupts() did */ 4911da177e4SLinus Torvalds static void ti12xx_untie_interrupts(struct yenta_socket *socket, int old_irq) 4921da177e4SLinus Torvalds { 4931da177e4SLinus Torvalds u32 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL); 4941da177e4SLinus Torvalds sysctl &= ~TI122X_SCR_INTRTIE; 4951da177e4SLinus Torvalds config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl); 4961da177e4SLinus Torvalds 4971da177e4SLinus Torvalds socket->cb_irq = socket->dev->irq = old_irq; 4981da177e4SLinus Torvalds } 4991da177e4SLinus Torvalds 5001da177e4SLinus Torvalds /* 5011da177e4SLinus Torvalds * irqrouting for func1, plays with INTB routing 5021da177e4SLinus Torvalds * only touches MFUNC for INTB routing. all other bits are taken 5031da177e4SLinus Torvalds * care of in func0 already. 5041da177e4SLinus Torvalds */ 5051da177e4SLinus Torvalds static void ti12xx_irqroute_func1(struct yenta_socket *socket) 5061da177e4SLinus Torvalds { 507c835a388SDaniel Ritz u32 mfunc, mfunc_old, devctl, sysctl; 5081da177e4SLinus Torvalds int pci_irq_status; 5091da177e4SLinus Torvalds 5101da177e4SLinus Torvalds mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC); 5111da177e4SLinus Torvalds devctl = config_readb(socket, TI113X_DEVICE_CONTROL); 5121da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s, mfunc 0x%08x, devctl 0x%02x\n", 5131da177e4SLinus Torvalds pci_name(socket->dev), mfunc, devctl); 5141da177e4SLinus Torvalds 515c835a388SDaniel Ritz /* if IRQs are configured as tied, align irq of func1 with func0 */ 516c835a388SDaniel Ritz sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL); 517c835a388SDaniel Ritz if (sysctl & TI122X_SCR_INTRTIE) 518c835a388SDaniel Ritz ti12xx_align_irqs(socket, NULL); 519c835a388SDaniel Ritz 5201da177e4SLinus Torvalds /* make sure PCI interrupts are enabled before probing */ 5211da177e4SLinus Torvalds ti_init(socket); 5221da177e4SLinus Torvalds 5231da177e4SLinus Torvalds /* test PCI interrupts first. only try fixing if return value is 0! */ 5241da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 5251da177e4SLinus Torvalds if (pci_irq_status) 5261da177e4SLinus Torvalds goto out; 5271da177e4SLinus Torvalds 5281da177e4SLinus Torvalds /* 5291da177e4SLinus Torvalds * We're here which means PCI interrupts are _not_ delivered. try to 5301da177e4SLinus Torvalds * find the right setting 5311da177e4SLinus Torvalds */ 5321da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s probing PCI interrupt failed, trying to fix\n", 5331da177e4SLinus Torvalds pci_name(socket->dev)); 5341da177e4SLinus Torvalds 5351da177e4SLinus Torvalds 5361da177e4SLinus Torvalds /* if all serial: set INTRTIE, probe again */ 5371da177e4SLinus Torvalds if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) { 5381da177e4SLinus Torvalds int old_irq; 5391da177e4SLinus Torvalds 5401da177e4SLinus Torvalds if (ti12xx_tie_interrupts(socket, &old_irq)) { 5411da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 5421da177e4SLinus Torvalds if (pci_irq_status == 1) { 5431da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s all-serial interrupts, tied ok\n", 5441da177e4SLinus Torvalds pci_name(socket->dev)); 5451da177e4SLinus Torvalds goto out; 5461da177e4SLinus Torvalds } 5471da177e4SLinus Torvalds 5481da177e4SLinus Torvalds ti12xx_untie_interrupts(socket, old_irq); 5491da177e4SLinus Torvalds } 5501da177e4SLinus Torvalds } 5511da177e4SLinus Torvalds /* parallel PCI: route INTB, probe again */ 5521da177e4SLinus Torvalds else { 5531da177e4SLinus Torvalds int old_irq; 5541da177e4SLinus Torvalds 5551da177e4SLinus Torvalds switch (socket->dev->device) { 5561da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1250: 5571da177e4SLinus Torvalds /* the 1250 has one pin for IRQSER/INTB depending on devctl */ 5581da177e4SLinus Torvalds break; 5591da177e4SLinus Torvalds 5601da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251A: 5611da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1251B: 5621da177e4SLinus Torvalds case PCI_DEVICE_ID_TI_1450: 5631da177e4SLinus Torvalds /* 5641da177e4SLinus Torvalds * those have a pin for IRQSER/INTB plus INTB in MFUNC0 5651da177e4SLinus Torvalds * we alread probed the shared pin, now go for MFUNC0 5661da177e4SLinus Torvalds */ 5671da177e4SLinus Torvalds mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI125X_MFUNC0_INTB; 5681da177e4SLinus Torvalds break; 5691da177e4SLinus Torvalds 5701da177e4SLinus Torvalds default: 5711da177e4SLinus Torvalds mfunc = (mfunc & ~TI122X_MFUNC1_MASK) | TI122X_MFUNC1_INTB; 5721da177e4SLinus Torvalds break; 5731da177e4SLinus Torvalds } 5741da177e4SLinus Torvalds 5751da177e4SLinus Torvalds /* write, probe */ 5761da177e4SLinus Torvalds if (mfunc != mfunc_old) { 5771da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 5781da177e4SLinus Torvalds 5791da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 5801da177e4SLinus Torvalds if (pci_irq_status == 1) { 5811da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts ok\n", 5821da177e4SLinus Torvalds pci_name(socket->dev)); 5831da177e4SLinus Torvalds goto out; 5841da177e4SLinus Torvalds } 5851da177e4SLinus Torvalds 5861da177e4SLinus Torvalds mfunc = mfunc_old; 5871da177e4SLinus Torvalds config_writel(socket, TI122X_MFUNC, mfunc); 5881da177e4SLinus Torvalds 5891da177e4SLinus Torvalds if (pci_irq_status == -1) 5901da177e4SLinus Torvalds goto out; 5911da177e4SLinus Torvalds } 5921da177e4SLinus Torvalds 5931da177e4SLinus Torvalds /* still nothing: set INTRTIE */ 5941da177e4SLinus Torvalds if (ti12xx_tie_interrupts(socket, &old_irq)) { 5951da177e4SLinus Torvalds pci_irq_status = yenta_probe_cb_irq(socket); 5961da177e4SLinus Torvalds if (pci_irq_status == 1) { 5971da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts, tied ok\n", 5981da177e4SLinus Torvalds pci_name(socket->dev)); 5991da177e4SLinus Torvalds goto out; 6001da177e4SLinus Torvalds } 6011da177e4SLinus Torvalds 6021da177e4SLinus Torvalds ti12xx_untie_interrupts(socket, old_irq); 6031da177e4SLinus Torvalds } 6041da177e4SLinus Torvalds } 6051da177e4SLinus Torvalds 6061da177e4SLinus Torvalds out: 6071da177e4SLinus Torvalds if (pci_irq_status < 1) { 6081da177e4SLinus Torvalds socket->cb_irq = 0; 6091da177e4SLinus Torvalds printk(KERN_INFO "Yenta TI: socket %s no PCI interrupts. Fish. Please report.\n", 6101da177e4SLinus Torvalds pci_name(socket->dev)); 6111da177e4SLinus Torvalds } 6121da177e4SLinus Torvalds } 6131da177e4SLinus Torvalds 6141da177e4SLinus Torvalds static int ti12xx_override(struct yenta_socket *socket) 6151da177e4SLinus Torvalds { 6161da177e4SLinus Torvalds u32 val, val_orig; 6171da177e4SLinus Torvalds 6181da177e4SLinus Torvalds /* make sure that memory burst is active */ 6191da177e4SLinus Torvalds val_orig = val = config_readl(socket, TI113X_SYSTEM_CONTROL); 6201da177e4SLinus Torvalds if (disable_clkrun && PCI_FUNC(socket->dev->devfn) == 0) { 6211da177e4SLinus Torvalds printk(KERN_INFO "Yenta: Disabling CLKRUN feature\n"); 6221da177e4SLinus Torvalds val |= TI113X_SCR_KEEPCLK; 6231da177e4SLinus Torvalds } 6241da177e4SLinus Torvalds if (!(val & TI122X_SCR_MRBURSTUP)) { 6251da177e4SLinus Torvalds printk(KERN_INFO "Yenta: Enabling burst memory read transactions\n"); 6261da177e4SLinus Torvalds val |= TI122X_SCR_MRBURSTUP; 6271da177e4SLinus Torvalds } 6281da177e4SLinus Torvalds if (val_orig != val) 6291da177e4SLinus Torvalds config_writel(socket, TI113X_SYSTEM_CONTROL, val); 6301da177e4SLinus Torvalds 6311da177e4SLinus Torvalds /* 6321da177e4SLinus Torvalds * for EnE bridges only: clear testbit TLTEnable. this makes the 6331da177e4SLinus Torvalds * RME Hammerfall DSP sound card working. 6341da177e4SLinus Torvalds */ 6351da177e4SLinus Torvalds if (socket->dev->vendor == PCI_VENDOR_ID_ENE) { 6361da177e4SLinus Torvalds u8 test_c9 = config_readb(socket, ENE_TEST_C9); 6371da177e4SLinus Torvalds test_c9 &= ~ENE_TEST_C9_TLTENABLE; 6381da177e4SLinus Torvalds config_writeb(socket, ENE_TEST_C9, test_c9); 6391da177e4SLinus Torvalds } 6401da177e4SLinus Torvalds 6411da177e4SLinus Torvalds /* 6421da177e4SLinus Torvalds * Yenta expects controllers to use CSCINT to route 6431da177e4SLinus Torvalds * CSC interrupts to PCI rather than INTVAL. 6441da177e4SLinus Torvalds */ 6451da177e4SLinus Torvalds val = config_readb(socket, TI1250_DIAGNOSTIC); 6461da177e4SLinus Torvalds printk(KERN_INFO "Yenta: Using %s to route CSC interrupts to PCI\n", 6471da177e4SLinus Torvalds (val & TI1250_DIAG_PCI_CSC) ? "CSCINT" : "INTVAL"); 6481da177e4SLinus Torvalds printk(KERN_INFO "Yenta: Routing CardBus interrupts to %s\n", 6491da177e4SLinus Torvalds (val & TI1250_DIAG_PCI_IREQ) ? "PCI" : "ISA"); 6501da177e4SLinus Torvalds 6511da177e4SLinus Torvalds /* do irqrouting, depending on function */ 6521da177e4SLinus Torvalds if (PCI_FUNC(socket->dev->devfn) == 0) 6531da177e4SLinus Torvalds ti12xx_irqroute_func0(socket); 6541da177e4SLinus Torvalds else 6551da177e4SLinus Torvalds ti12xx_irqroute_func1(socket); 6561da177e4SLinus Torvalds 6571da177e4SLinus Torvalds return ti_override(socket); 6581da177e4SLinus Torvalds } 6591da177e4SLinus Torvalds 6601da177e4SLinus Torvalds 6611da177e4SLinus Torvalds static int ti1250_override(struct yenta_socket *socket) 6621da177e4SLinus Torvalds { 6631da177e4SLinus Torvalds u8 old, diag; 6641da177e4SLinus Torvalds 6651da177e4SLinus Torvalds old = config_readb(socket, TI1250_DIAGNOSTIC); 6661da177e4SLinus Torvalds diag = old & ~(TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ); 6671da177e4SLinus Torvalds if (socket->cb_irq) 6681da177e4SLinus Torvalds diag |= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ; 6691da177e4SLinus Torvalds 6701da177e4SLinus Torvalds if (diag != old) { 6711da177e4SLinus Torvalds printk(KERN_INFO "Yenta: adjusting diagnostic: %02x -> %02x\n", 6721da177e4SLinus Torvalds old, diag); 6731da177e4SLinus Torvalds config_writeb(socket, TI1250_DIAGNOSTIC, diag); 6741da177e4SLinus Torvalds } 6751da177e4SLinus Torvalds 6761da177e4SLinus Torvalds return ti12xx_override(socket); 6771da177e4SLinus Torvalds } 6781da177e4SLinus Torvalds 6791da177e4SLinus Torvalds #endif /* CONFIG_CARDBUS */ 6801da177e4SLinus Torvalds 6811da177e4SLinus Torvalds #endif /* _LINUX_TI113X_H */ 6821da177e4SLinus Torvalds 683