Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pcmcia: honor saved flags in yenta_socket's I365_CSCINT register

Instead of overwriting the I365_CSCINT register, save the old value and
merely change the bits we care about.

Part 1 of a series to allow the ISA irq to be used for Cardbus devices
if the socket's PCI irq is unusable.

[linux@dominikbrodowski.net: split up the original patch, commit message]

Signed-off-by: Jens Kuenzer <Jens.Kuenzer@fpga.homeip.net>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>

authored by

Jens Künzer and committed by
Dominik Brodowski
28ca8dd7 b416cd8e

+12 -4
+1
drivers/pcmcia/i82365.h
··· 95 95 #define I365_CSC_DETECT 0x08 96 96 #define I365_CSC_ANY 0x0F 97 97 #define I365_CSC_GPI 0x10 98 + #define I365_CSC_IRQ_MASK 0xF0 98 99 99 100 /* Flags for I365_ADDRWIN */ 100 101 #define I365_ENA_IO(map) (0x40 << (map))
+11 -4
drivers/pcmcia/yenta_socket.c
··· 356 356 exca_writeb(socket, I365_POWER, reg); 357 357 358 358 /* CSC interrupt: no ISA irq for CSC */ 359 - reg = I365_CSC_DETECT; 359 + reg = exca_readb(socket, I365_CSCINT); 360 + reg &= I365_CSC_IRQ_MASK; 361 + reg |= I365_CSC_DETECT; 360 362 if (state->flags & SS_IOCARD) { 361 363 if (state->csc_mask & SS_STSCHG) 362 364 reg |= I365_CSC_STSCHG; ··· 914 912 int i; 915 913 unsigned long val; 916 914 u32 mask; 915 + u8 reg; 917 916 918 917 /* 919 918 * Probe for usable interrupts using the force ··· 922 919 */ 923 920 cb_writel(socket, CB_SOCKET_EVENT, -1); 924 921 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); 922 + reg = exca_readb(socket, I365_CSCINT); 925 923 exca_writeb(socket, I365_CSCINT, 0); 926 924 val = probe_irq_on() & isa_irq_mask; 927 925 for (i = 1; i < 16; i++) { ··· 934 930 cb_writel(socket, CB_SOCKET_EVENT, -1); 935 931 } 936 932 cb_writel(socket, CB_SOCKET_MASK, 0); 937 - exca_writeb(socket, I365_CSCINT, 0); 933 + exca_writeb(socket, I365_CSCINT, reg); 938 934 939 935 mask = probe_irq_mask(val) & 0xffff; 940 936 ··· 971 967 /* probes the PCI interrupt, use only on override functions */ 972 968 static int yenta_probe_cb_irq(struct yenta_socket *socket) 973 969 { 970 + u8 reg; 971 + 974 972 if (!socket->cb_irq) 975 973 return -1; 976 974 ··· 985 979 } 986 980 987 981 /* generate interrupt, wait */ 988 - exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG); 982 + reg = exca_readb(socket, I365_CSCINT); 983 + exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); 989 984 cb_writel(socket, CB_SOCKET_EVENT, -1); 990 985 cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); 991 986 cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); ··· 995 988 996 989 /* disable interrupts */ 997 990 cb_writel(socket, CB_SOCKET_MASK, 0); 998 - exca_writeb(socket, I365_CSCINT, 0); 991 + exca_writeb(socket, I365_CSCINT, reg); 999 992 cb_writel(socket, CB_SOCKET_EVENT, -1); 1000 993 exca_readb(socket, I365_CSC); 1001 994