aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-12-05 12:42:59 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-05 12:42:59 -0500
commitd9b2c4d0b03c721808c0d259e43a27f1e80205bc (patch)
treef17a4166f62ee14faa1401a6cbd353a4ab8c77cb /drivers/pcmcia
parent27d16d08717faeaa8afd1b736a096dbaab90f08e (diff)
parent5fa9167a1bf5f5a4b7282f5e7ac56a4a5a1fa044 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: (50 commits) pcmcia: rework the irq_req_t typedef pcmcia: remove deprecated handle_to_dev() macro pcmcia: pcmcia_request_window() doesn't need a pointer to a pointer pcmcia: remove unused "window_t" typedef pcmcia: move some window-related code to pcmcia_ioctl.c pcmcia: Change window_handle_t logic to unsigned long pcmcia: Pass struct pcmcia_socket to pcmcia_get_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_map_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_release_window() drivers/pcmcia: remove unnecessary kzalloc pcmcia: correct handling for Zoomed Video registers in topic.h pcmcia: fix printk formats pcmcia: autoload module pcmcia pcmcia/staging: update comedi drivers PCMCIA: stop duplicating pci_irq in soc_pcmcia_socket PCMCIA: ss: allow PCI IRQs > 255 PCMCIA: soc_common: remove 'dev' member from soc_pcmcia_socket PCMCIA: soc_common: constify soc_pcmcia_socket ops member PCMCIA: sa1111: remove duplicated initializers PCMCIA: sa1111: wrap soc_pcmcia_socket to contain sa1111 specific data ...
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r--drivers/pcmcia/Kconfig42
-rw-r--r--drivers/pcmcia/Makefile10
-rw-r--r--drivers/pcmcia/cardbus.c4
-rw-r--r--drivers/pcmcia/cirrus.h10
-rw-r--r--drivers/pcmcia/cistpl.c71
-rw-r--r--drivers/pcmcia/cs.c67
-rw-r--r--drivers/pcmcia/cs_internal.h42
-rw-r--r--drivers/pcmcia/ds.c188
-rw-r--r--drivers/pcmcia/i82365.c37
-rw-r--r--drivers/pcmcia/m32r_cfc.c105
-rw-r--r--drivers/pcmcia/m32r_pcc.c51
-rw-r--r--drivers/pcmcia/m8xx_pcmcia.c40
-rw-r--r--drivers/pcmcia/o2micro.h22
-rw-r--r--drivers/pcmcia/pcmcia_ioctl.c92
-rw-r--r--drivers/pcmcia/pcmcia_resource.c482
-rw-r--r--drivers/pcmcia/pd6729.c70
-rw-r--r--drivers/pcmcia/pd6729.h7
-rw-r--r--drivers/pcmcia/pxa2xx_base.c94
-rw-r--r--drivers/pcmcia/pxa2xx_base.h3
-rw-r--r--drivers/pcmcia/pxa2xx_cm_x255.c2
-rw-r--r--drivers/pcmcia/pxa2xx_cm_x270.c2
-rw-r--r--drivers/pcmcia/pxa2xx_e740.c2
-rw-r--r--drivers/pcmcia/pxa2xx_lubbock.c14
-rw-r--r--drivers/pcmcia/pxa2xx_mainstone.c2
-rw-r--r--drivers/pcmcia/pxa2xx_palmld.c2
-rw-r--r--drivers/pcmcia/pxa2xx_palmtx.c2
-rw-r--r--drivers/pcmcia/pxa2xx_sharpsl.c2
-rw-r--r--drivers/pcmcia/pxa2xx_trizeps4.c4
-rw-r--r--drivers/pcmcia/pxa2xx_viper.c2
-rw-r--r--drivers/pcmcia/rsrc_mgr.c1
-rw-r--r--drivers/pcmcia/sa1100_assabet.c2
-rw-r--r--drivers/pcmcia/sa1100_badge4.c11
-rw-r--r--drivers/pcmcia/sa1100_cerf.c2
-rw-r--r--drivers/pcmcia/sa1100_generic.c11
-rw-r--r--drivers/pcmcia/sa1100_h3600.c4
-rw-r--r--drivers/pcmcia/sa1100_jornada720.c42
-rw-r--r--drivers/pcmcia/sa1100_neponset.c13
-rw-r--r--drivers/pcmcia/sa1100_shannon.c2
-rw-r--r--drivers/pcmcia/sa1100_simpad.c2
-rw-r--r--drivers/pcmcia/sa1111_generic.c65
-rw-r--r--drivers/pcmcia/sa1111_generic.h17
-rw-r--r--drivers/pcmcia/sa11xx_base.c99
-rw-r--r--drivers/pcmcia/sa11xx_base.h2
-rw-r--r--drivers/pcmcia/soc_common.c225
-rw-r--r--drivers/pcmcia/soc_common.h10
-rw-r--r--drivers/pcmcia/tcic.c29
-rw-r--r--drivers/pcmcia/topic.h15
47 files changed, 1046 insertions, 977 deletions
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
index 17f38a781d47..f3ccbccf5f21 100644
--- a/drivers/pcmcia/Kconfig
+++ b/drivers/pcmcia/Kconfig
@@ -17,24 +17,6 @@ menuconfig PCCARD
17 17
18if PCCARD 18if PCCARD
19 19
20config PCMCIA_DEBUG
21 bool "Enable PCCARD debugging"
22 help
23 Say Y here to enable PCMCIA subsystem debugging. You
24 will need to choose the debugging level either via the
25 kernel command line, or module options depending whether
26 you build the PCMCIA as modules.
27
28 The kernel command line options are:
29 pcmcia_core.pc_debug=N
30 pcmcia.pc_debug=N
31 sa11xx_core.pc_debug=N
32
33 The module option is called pc_debug=N
34
35 In all the above examples, N is the debugging verbosity
36 level.
37
38config PCMCIA 20config PCMCIA
39 tristate "16-bit PCMCIA support" 21 tristate "16-bit PCMCIA support"
40 select CRC32 22 select CRC32
@@ -196,9 +178,13 @@ config PCMCIA_BCM63XX
196 tristate "bcm63xx pcmcia support" 178 tristate "bcm63xx pcmcia support"
197 depends on BCM63XX && PCMCIA 179 depends on BCM63XX && PCMCIA
198 180
181config PCMCIA_SOC_COMMON
182 bool
183
199config PCMCIA_SA1100 184config PCMCIA_SA1100
200 tristate "SA1100 support" 185 tristate "SA1100 support"
201 depends on ARM && ARCH_SA1100 && PCMCIA 186 depends on ARM && ARCH_SA1100 && PCMCIA
187 select PCMCIA_SOC_COMMON
202 help 188 help
203 Say Y here to include support for SA11x0-based PCMCIA or CF 189 Say Y here to include support for SA11x0-based PCMCIA or CF
204 sockets, found on HP iPAQs, Yopy, and other StrongARM(R)/ 190 sockets, found on HP iPAQs, Yopy, and other StrongARM(R)/
@@ -209,6 +195,7 @@ config PCMCIA_SA1100
209config PCMCIA_SA1111 195config PCMCIA_SA1111
210 tristate "SA1111 support" 196 tristate "SA1111 support"
211 depends on ARM && ARCH_SA1100 && SA1111 && PCMCIA 197 depends on ARM && ARCH_SA1100 && SA1111 && PCMCIA
198 select PCMCIA_SOC_COMMON
212 help 199 help
213 Say Y here to include support for SA1111-based PCMCIA or CF 200 Say Y here to include support for SA1111-based PCMCIA or CF
214 sockets, found on the Jornada 720, Graphicsmaster and other 201 sockets, found on the Jornada 720, Graphicsmaster and other
@@ -222,9 +209,28 @@ config PCMCIA_PXA2XX
222 depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ 209 depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
223 || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ 210 || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
224 || ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2) 211 || ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2)
212 select PCMCIA_SOC_COMMON
225 help 213 help
226 Say Y here to include support for the PXA2xx PCMCIA controller 214 Say Y here to include support for the PXA2xx PCMCIA controller
227 215
216config PCMCIA_DEBUG
217 bool "Enable debugging"
218 depends on (PCMCIA_SA1111 || PCMCIA_SA1100 || PCMCIA_PXA2XX)
219 help
220 Say Y here to enable debugging for the SoC PCMCIA layer.
221 You will need to choose the debugging level either via the
222 kernel command line, or module options depending whether
223 you build the drivers as modules.
224
225 The kernel command line options are:
226 sa11xx_core.pc_debug=N
227 pxa2xx_core.pc_debug=N
228
229 The module option is called pc_debug=N
230
231 In all the above examples, N is the debugging verbosity
232 level.
233
228config PCMCIA_PROBE 234config PCMCIA_PROBE
229 bool 235 bool
230 default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X && !PARISC 236 default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X && !PARISC
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
index a03a38acd77d..382938313991 100644
--- a/drivers/pcmcia/Makefile
+++ b/drivers/pcmcia/Makefile
@@ -22,8 +22,9 @@ obj-$(CONFIG_I82365) += i82365.o
22obj-$(CONFIG_I82092) += i82092.o 22obj-$(CONFIG_I82092) += i82092.o
23obj-$(CONFIG_TCIC) += tcic.o 23obj-$(CONFIG_TCIC) += tcic.o
24obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o 24obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o
25obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o 25obj-$(CONFIG_PCMCIA_SOC_COMMON) += soc_common.o
26obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o 26obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_base.o sa1100_cs.o
27obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_base.o sa1111_cs.o
27obj-$(CONFIG_M32R_PCC) += m32r_pcc.o 28obj-$(CONFIG_M32R_PCC) += m32r_pcc.o
28obj-$(CONFIG_M32R_CFC) += m32r_cfc.o 29obj-$(CONFIG_M32R_CFC) += m32r_cfc.o
29obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ss.o 30obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ss.o
@@ -35,9 +36,6 @@ obj-$(CONFIG_BFIN_CFPCMCIA) += bfin_cf_pcmcia.o
35obj-$(CONFIG_AT91_CF) += at91_cf.o 36obj-$(CONFIG_AT91_CF) += at91_cf.o
36obj-$(CONFIG_ELECTRA_CF) += electra_cf.o 37obj-$(CONFIG_ELECTRA_CF) += electra_cf.o
37 38
38sa11xx_core-y += soc_common.o sa11xx_base.o
39pxa2xx_core-y += soc_common.o pxa2xx_base.o
40
41au1x00_ss-y += au1000_generic.o 39au1x00_ss-y += au1000_generic.o
42au1x00_ss-$(CONFIG_MIPS_PB1000) += au1000_pb1x00.o 40au1x00_ss-$(CONFIG_MIPS_PB1000) += au1000_pb1x00.o
43au1x00_ss-$(CONFIG_MIPS_PB1100) += au1000_pb1x00.o 41au1x00_ss-$(CONFIG_MIPS_PB1100) += au1000_pb1x00.o
@@ -77,4 +75,4 @@ pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o
77pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o 75pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o
78pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o 76pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o
79 77
80obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) 78obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_base.o $(pxa2xx-obj-y)
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c
index db77e1f3309a..4cd70d056810 100644
--- a/drivers/pcmcia/cardbus.c
+++ b/drivers/pcmcia/cardbus.c
@@ -91,7 +91,7 @@ static u_int xlate_rom_addr(void __iomem *b, u_int addr)
91static void cb_release_cis_mem(struct pcmcia_socket * s) 91static void cb_release_cis_mem(struct pcmcia_socket * s)
92{ 92{
93 if (s->cb_cis_virt) { 93 if (s->cb_cis_virt) {
94 cs_dbg(s, 1, "cb_release_cis_mem()\n"); 94 dev_dbg(&s->dev, "cb_release_cis_mem()\n");
95 iounmap(s->cb_cis_virt); 95 iounmap(s->cb_cis_virt);
96 s->cb_cis_virt = NULL; 96 s->cb_cis_virt = NULL;
97 s->cb_cis_res = NULL; 97 s->cb_cis_res = NULL;
@@ -132,7 +132,7 @@ int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void
132 struct pci_dev *dev; 132 struct pci_dev *dev;
133 struct resource *res; 133 struct resource *res;
134 134
135 cs_dbg(s, 3, "read_cb_mem(%d, %#x, %u)\n", space, addr, len); 135 dev_dbg(&s->dev, "read_cb_mem(%d, %#x, %u)\n", space, addr, len);
136 136
137 dev = pci_get_slot(s->cb_dev->subordinate, 0); 137 dev = pci_get_slot(s->cb_dev->subordinate, 0);
138 if (!dev) 138 if (!dev)
diff --git a/drivers/pcmcia/cirrus.h b/drivers/pcmcia/cirrus.h
index ecd4fc7f666f..446a4576e73e 100644
--- a/drivers/pcmcia/cirrus.h
+++ b/drivers/pcmcia/cirrus.h
@@ -30,16 +30,6 @@
30#ifndef _LINUX_CIRRUS_H 30#ifndef _LINUX_CIRRUS_H
31#define _LINUX_CIRRUS_H 31#define _LINUX_CIRRUS_H
32 32
33#ifndef PCI_VENDOR_ID_CIRRUS
34#define PCI_VENDOR_ID_CIRRUS 0x1013
35#endif
36#ifndef PCI_DEVICE_ID_CIRRUS_6729
37#define PCI_DEVICE_ID_CIRRUS_6729 0x1100
38#endif
39#ifndef PCI_DEVICE_ID_CIRRUS_6832
40#define PCI_DEVICE_ID_CIRRUS_6832 0x1110
41#endif
42
43#define PD67_MISC_CTL_1 0x16 /* Misc control 1 */ 33#define PD67_MISC_CTL_1 0x16 /* Misc control 1 */
44#define PD67_FIFO_CTL 0x17 /* FIFO control */ 34#define PD67_FIFO_CTL 0x17 /* FIFO control */
45#define PD67_MISC_CTL_2 0x1E /* Misc control 2 */ 35#define PD67_MISC_CTL_2 0x1E /* Misc control 2 */
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c
index 6c4a4fc83630..8c1b73cf021b 100644
--- a/drivers/pcmcia/cistpl.c
+++ b/drivers/pcmcia/cistpl.c
@@ -138,7 +138,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
138 void __iomem *sys, *end; 138 void __iomem *sys, *end;
139 unsigned char *buf = ptr; 139 unsigned char *buf = ptr;
140 140
141 cs_dbg(s, 3, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len); 141 dev_dbg(&s->dev, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
142 142
143 if (attr & IS_INDIRECT) { 143 if (attr & IS_INDIRECT) {
144 /* Indirect accesses use a bunch of special registers at fixed 144 /* Indirect accesses use a bunch of special registers at fixed
@@ -190,7 +190,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
190 addr = 0; 190 addr = 0;
191 } 191 }
192 } 192 }
193 cs_dbg(s, 3, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n", 193 dev_dbg(&s->dev, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
194 *(u_char *)(ptr+0), *(u_char *)(ptr+1), 194 *(u_char *)(ptr+0), *(u_char *)(ptr+1),
195 *(u_char *)(ptr+2), *(u_char *)(ptr+3)); 195 *(u_char *)(ptr+2), *(u_char *)(ptr+3));
196 return 0; 196 return 0;
@@ -204,7 +204,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
204 void __iomem *sys, *end; 204 void __iomem *sys, *end;
205 unsigned char *buf = ptr; 205 unsigned char *buf = ptr;
206 206
207 cs_dbg(s, 3, "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr, addr, len); 207 dev_dbg(&s->dev, "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
208 208
209 if (attr & IS_INDIRECT) { 209 if (attr & IS_INDIRECT) {
210 /* Indirect accesses use a bunch of special registers at fixed 210 /* Indirect accesses use a bunch of special registers at fixed
@@ -584,7 +584,7 @@ int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, tuple_
584 ofs += link[1] + 2; 584 ofs += link[1] + 2;
585 } 585 }
586 if (i == MAX_TUPLES) { 586 if (i == MAX_TUPLES) {
587 cs_dbg(s, 1, "cs: overrun in pcmcia_get_next_tuple\n"); 587 dev_dbg(&s->dev, "cs: overrun in pcmcia_get_next_tuple\n");
588 return -ENOSPC; 588 return -ENOSPC;
589 } 589 }
590 590
@@ -1440,7 +1440,7 @@ int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse)
1440 break; 1440 break;
1441 } 1441 }
1442 if (ret) 1442 if (ret)
1443 __cs_dbg(0, "parse_tuple failed %d\n", ret); 1443 pr_debug("parse_tuple failed %d\n", ret);
1444 return ret; 1444 return ret;
1445} 1445}
1446EXPORT_SYMBOL(pcmcia_parse_tuple); 1446EXPORT_SYMBOL(pcmcia_parse_tuple);
@@ -1482,6 +1482,67 @@ done:
1482} 1482}
1483EXPORT_SYMBOL(pccard_read_tuple); 1483EXPORT_SYMBOL(pccard_read_tuple);
1484 1484
1485
1486/**
1487 * pccard_loop_tuple() - loop over tuples in the CIS
1488 * @s: the struct pcmcia_socket where the card is inserted
1489 * @function: the device function we loop for
1490 * @code: which CIS code shall we look for?
1491 * @parse: buffer where the tuple shall be parsed (or NULL, if no parse)
1492 * @priv_data: private data to be passed to the loop_tuple function.
1493 * @loop_tuple: function to call for each CIS entry of type @function. IT
1494 * gets passed the raw tuple, the paresed tuple (if @parse is
1495 * set) and @priv_data.
1496 *
1497 * pccard_loop_tuple() loops over all CIS entries of type @function, and
1498 * calls the @loop_tuple function for each entry. If the call to @loop_tuple
1499 * returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
1500 */
1501int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
1502 cisdata_t code, cisparse_t *parse, void *priv_data,
1503 int (*loop_tuple) (tuple_t *tuple,
1504 cisparse_t *parse,
1505 void *priv_data))
1506{
1507 tuple_t tuple;
1508 cisdata_t *buf;
1509 int ret;
1510
1511 buf = kzalloc(256, GFP_KERNEL);
1512 if (buf == NULL) {
1513 dev_printk(KERN_WARNING, &s->dev, "no memory to read tuple\n");
1514 return -ENOMEM;
1515 }
1516
1517 tuple.TupleData = buf;
1518 tuple.TupleDataMax = 255;
1519 tuple.TupleOffset = 0;
1520 tuple.DesiredTuple = code;
1521 tuple.Attributes = 0;
1522
1523 ret = pccard_get_first_tuple(s, function, &tuple);
1524 while (!ret) {
1525 if (pccard_get_tuple_data(s, &tuple))
1526 goto next_entry;
1527
1528 if (parse)
1529 if (pcmcia_parse_tuple(&tuple, parse))
1530 goto next_entry;
1531
1532 ret = loop_tuple(&tuple, parse, priv_data);
1533 if (!ret)
1534 break;
1535
1536next_entry:
1537 ret = pccard_get_next_tuple(s, function, &tuple);
1538 }
1539
1540 kfree(buf);
1541 return ret;
1542}
1543EXPORT_SYMBOL(pccard_loop_tuple);
1544
1545
1485/*====================================================================== 1546/*======================================================================
1486 1547
1487 This tries to determine if a card has a sensible CIS. It returns 1548 This tries to determine if a card has a sensible CIS. It returns
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index 698d75cda084..790af87a922f 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -61,17 +61,6 @@ INT_MODULE_PARM(unreset_limit, 30); /* unreset_check's */
61/* Access speed for attribute memory windows */ 61/* Access speed for attribute memory windows */
62INT_MODULE_PARM(cis_speed, 300); /* ns */ 62INT_MODULE_PARM(cis_speed, 300); /* ns */
63 63
64#ifdef CONFIG_PCMCIA_DEBUG
65static int pc_debug;
66
67module_param(pc_debug, int, 0644);
68
69int cs_debug_level(int level)
70{
71 return pc_debug > level;
72}
73#endif
74
75 64
76socket_state_t dead_socket = { 65socket_state_t dead_socket = {
77 .csc_mask = SS_DETECT, 66 .csc_mask = SS_DETECT,
@@ -190,7 +179,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
190 if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops) 179 if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops)
191 return -EINVAL; 180 return -EINVAL;
192 181
193 cs_dbg(socket, 0, "pcmcia_register_socket(0x%p)\n", socket->ops); 182 dev_dbg(&socket->dev, "pcmcia_register_socket(0x%p)\n", socket->ops);
194 183
195 spin_lock_init(&socket->lock); 184 spin_lock_init(&socket->lock);
196 185
@@ -262,6 +251,13 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
262 251
263 pcmcia_parse_events(socket, SS_DETECT); 252 pcmcia_parse_events(socket, SS_DETECT);
264 253
254 /*
255 * Let's try to get the PCMCIA module for 16-bit PCMCIA support.
256 * If it fails, it doesn't matter -- we still have 32-bit CardBus
257 * support to offer, so this is not a failure mode.
258 */
259 request_module_nowait("pcmcia");
260
265 return 0; 261 return 0;
266 262
267 err: 263 err:
@@ -282,7 +278,7 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket)
282 if (!socket) 278 if (!socket)
283 return; 279 return;
284 280
285 cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); 281 dev_dbg(&socket->dev, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
286 282
287 if (socket->thread) 283 if (socket->thread)
288 kthread_stop(socket->thread); 284 kthread_stop(socket->thread);
@@ -335,7 +331,7 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
335 if (s->state & SOCKET_CARDBUS) 331 if (s->state & SOCKET_CARDBUS)
336 return 0; 332 return 0;
337 333
338 cs_dbg(s, 1, "send_event(event %d, pri %d, callback 0x%p)\n", 334 dev_dbg(&s->dev, "send_event(event %d, pri %d, callback 0x%p)\n",
339 event, priority, s->callback); 335 event, priority, s->callback);
340 336
341 if (!s->callback) 337 if (!s->callback)
@@ -352,7 +348,7 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
352 348
353static void socket_remove_drivers(struct pcmcia_socket *skt) 349static void socket_remove_drivers(struct pcmcia_socket *skt)
354{ 350{
355 cs_dbg(skt, 4, "remove_drivers\n"); 351 dev_dbg(&skt->dev, "remove_drivers\n");
356 352
357 send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH); 353 send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
358} 354}
@@ -361,7 +357,7 @@ static int socket_reset(struct pcmcia_socket *skt)
361{ 357{
362 int status, i; 358 int status, i;
363 359
364 cs_dbg(skt, 4, "reset\n"); 360 dev_dbg(&skt->dev, "reset\n");
365 361
366 skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET; 362 skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
367 skt->ops->set_socket(skt, &skt->socket); 363 skt->ops->set_socket(skt, &skt->socket);
@@ -383,7 +379,7 @@ static int socket_reset(struct pcmcia_socket *skt)
383 msleep(unreset_check * 10); 379 msleep(unreset_check * 10);
384 } 380 }
385 381
386 cs_err(skt, "time out after reset.\n"); 382 dev_printk(KERN_ERR, &skt->dev, "time out after reset.\n");
387 return -ETIMEDOUT; 383 return -ETIMEDOUT;
388} 384}
389 385
@@ -397,7 +393,7 @@ static void socket_shutdown(struct pcmcia_socket *s)
397{ 393{
398 int status; 394 int status;
399 395
400 cs_dbg(s, 4, "shutdown\n"); 396 dev_dbg(&s->dev, "shutdown\n");
401 397
402 socket_remove_drivers(s); 398 socket_remove_drivers(s);
403 s->state &= SOCKET_INUSE | SOCKET_PRESENT; 399 s->state &= SOCKET_INUSE | SOCKET_PRESENT;
@@ -432,7 +428,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
432{ 428{
433 int status, i; 429 int status, i;
434 430
435 cs_dbg(skt, 4, "setup\n"); 431 dev_dbg(&skt->dev, "setup\n");
436 432
437 skt->ops->get_status(skt, &status); 433 skt->ops->get_status(skt, &status);
438 if (!(status & SS_DETECT)) 434 if (!(status & SS_DETECT))
@@ -452,13 +448,15 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
452 } 448 }
453 449
454 if (status & SS_PENDING) { 450 if (status & SS_PENDING) {
455 cs_err(skt, "voltage interrogation timed out.\n"); 451 dev_printk(KERN_ERR, &skt->dev,
452 "voltage interrogation timed out.\n");
456 return -ETIMEDOUT; 453 return -ETIMEDOUT;
457 } 454 }
458 455
459 if (status & SS_CARDBUS) { 456 if (status & SS_CARDBUS) {
460 if (!(skt->features & SS_CAP_CARDBUS)) { 457 if (!(skt->features & SS_CAP_CARDBUS)) {
461 cs_err(skt, "cardbus cards are not supported.\n"); 458 dev_printk(KERN_ERR, &skt->dev,
459 "cardbus cards are not supported.\n");
462 return -EINVAL; 460 return -EINVAL;
463 } 461 }
464 skt->state |= SOCKET_CARDBUS; 462 skt->state |= SOCKET_CARDBUS;
@@ -472,7 +470,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
472 else if (!(status & SS_XVCARD)) 470 else if (!(status & SS_XVCARD))
473 skt->socket.Vcc = skt->socket.Vpp = 50; 471 skt->socket.Vcc = skt->socket.Vpp = 50;
474 else { 472 else {
475 cs_err(skt, "unsupported voltage key.\n"); 473 dev_printk(KERN_ERR, &skt->dev, "unsupported voltage key.\n");
476 return -EIO; 474 return -EIO;
477 } 475 }
478 476
@@ -489,7 +487,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
489 487
490 skt->ops->get_status(skt, &status); 488 skt->ops->get_status(skt, &status);
491 if (!(status & SS_POWERON)) { 489 if (!(status & SS_POWERON)) {
492 cs_err(skt, "unable to apply power.\n"); 490 dev_printk(KERN_ERR, &skt->dev, "unable to apply power.\n");
493 return -EIO; 491 return -EIO;
494 } 492 }
495 493
@@ -509,7 +507,7 @@ static int socket_insert(struct pcmcia_socket *skt)
509{ 507{
510 int ret; 508 int ret;
511 509
512 cs_dbg(skt, 4, "insert\n"); 510 dev_dbg(&skt->dev, "insert\n");
513 511
514 if (!cs_socket_get(skt)) 512 if (!cs_socket_get(skt))
515 return -ENODEV; 513 return -ENODEV;
@@ -529,7 +527,7 @@ static int socket_insert(struct pcmcia_socket *skt)
529 skt->state |= SOCKET_CARDBUS_CONFIG; 527 skt->state |= SOCKET_CARDBUS_CONFIG;
530 } 528 }
531#endif 529#endif
532 cs_dbg(skt, 4, "insert done\n"); 530 dev_dbg(&skt->dev, "insert done\n");
533 531
534 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW); 532 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
535 } else { 533 } else {
@@ -576,7 +574,7 @@ static int socket_late_resume(struct pcmcia_socket *skt)
576 * FIXME: need a better check here for cardbus cards. 574 * FIXME: need a better check here for cardbus cards.
577 */ 575 */
578 if (verify_cis_cache(skt) != 0) { 576 if (verify_cis_cache(skt) != 0) {
579 cs_dbg(skt, 4, "cis mismatch - different card\n"); 577 dev_dbg(&skt->dev, "cis mismatch - different card\n");
580 socket_remove_drivers(skt); 578 socket_remove_drivers(skt);
581 destroy_cis_cache(skt); 579 destroy_cis_cache(skt);
582 /* 580 /*
@@ -587,7 +585,7 @@ static int socket_late_resume(struct pcmcia_socket *skt)
587 msleep(200); 585 msleep(200);
588 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW); 586 send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
589 } else { 587 } else {
590 cs_dbg(skt, 4, "cis matches cache\n"); 588 dev_dbg(&skt->dev, "cis matches cache\n");
591 send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW); 589 send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
592 } 590 }
593 } else { 591 } else {
@@ -723,7 +721,7 @@ static int pccardd(void *__skt)
723void pcmcia_parse_events(struct pcmcia_socket *s, u_int events) 721void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
724{ 722{
725 unsigned long flags; 723 unsigned long flags;
726 cs_dbg(s, 4, "parse_events: events %08x\n", events); 724 dev_dbg(&s->dev, "parse_events: events %08x\n", events);
727 if (s->thread) { 725 if (s->thread) {
728 spin_lock_irqsave(&s->thread_lock, flags); 726 spin_lock_irqsave(&s->thread_lock, flags);
729 s->thread_events |= events; 727 s->thread_events |= events;
@@ -773,19 +771,22 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
773{ 771{
774 int ret; 772 int ret;
775 773
776 cs_dbg(skt, 1, "resetting socket\n"); 774 dev_dbg(&skt->dev, "resetting socket\n");
777 775
778 mutex_lock(&skt->skt_mutex); 776 mutex_lock(&skt->skt_mutex);
779 do { 777 do {
780 if (!(skt->state & SOCKET_PRESENT)) { 778 if (!(skt->state & SOCKET_PRESENT)) {
779 dev_dbg(&skt->dev, "can't reset, not present\n");
781 ret = -ENODEV; 780 ret = -ENODEV;
782 break; 781 break;
783 } 782 }
784 if (skt->state & SOCKET_SUSPEND) { 783 if (skt->state & SOCKET_SUSPEND) {
784 dev_dbg(&skt->dev, "can't reset, suspended\n");
785 ret = -EBUSY; 785 ret = -EBUSY;
786 break; 786 break;
787 } 787 }
788 if (skt->state & SOCKET_CARDBUS) { 788 if (skt->state & SOCKET_CARDBUS) {
789 dev_dbg(&skt->dev, "can't reset, is cardbus\n");
789 ret = -EPERM; 790 ret = -EPERM;
790 break; 791 break;
791 } 792 }
@@ -818,7 +819,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt)
818{ 819{
819 int ret; 820 int ret;
820 821
821 cs_dbg(skt, 1, "suspending socket\n"); 822 dev_dbg(&skt->dev, "suspending socket\n");
822 823
823 mutex_lock(&skt->skt_mutex); 824 mutex_lock(&skt->skt_mutex);
824 do { 825 do {
@@ -848,7 +849,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt)
848{ 849{
849 int ret; 850 int ret;
850 851
851 cs_dbg(skt, 1, "waking up socket\n"); 852 dev_dbg(&skt->dev, "waking up socket\n");
852 853
853 mutex_lock(&skt->skt_mutex); 854 mutex_lock(&skt->skt_mutex);
854 do { 855 do {
@@ -876,7 +877,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt)
876{ 877{
877 int ret; 878 int ret;
878 879
879 cs_dbg(skt, 1, "user eject request\n"); 880 dev_dbg(&skt->dev, "user eject request\n");
880 881
881 mutex_lock(&skt->skt_mutex); 882 mutex_lock(&skt->skt_mutex);
882 do { 883 do {
@@ -905,7 +906,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt)
905{ 906{
906 int ret; 907 int ret;
907 908
908 cs_dbg(skt, 1, "user insert request\n"); 909 dev_dbg(&skt->dev, "user insert request\n");
909 910
910 mutex_lock(&skt->skt_mutex); 911 mutex_lock(&skt->skt_mutex);
911 do { 912 do {
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h
index 1f4098f1354d..3bc02d53a3a3 100644
--- a/drivers/pcmcia/cs_internal.h
+++ b/drivers/pcmcia/cs_internal.h
@@ -107,28 +107,6 @@ static inline void cs_socket_put(struct pcmcia_socket *skt)
107 } 107 }
108} 108}
109 109
110#ifdef CONFIG_PCMCIA_DEBUG
111extern int cs_debug_level(int);
112
113#define cs_dbg(skt, lvl, fmt, arg...) do { \
114 if (cs_debug_level(lvl)) \
115 dev_printk(KERN_DEBUG, &skt->dev, \
116 "cs: " fmt, ## arg); \
117} while (0)
118#define __cs_dbg(lvl, fmt, arg...) do { \
119 if (cs_debug_level(lvl)) \
120 printk(KERN_DEBUG \
121 "cs: " fmt, ## arg); \
122} while (0)
123
124#else
125#define cs_dbg(skt, lvl, fmt, arg...) do { } while (0)
126#define __cs_dbg(lvl, fmt, arg...) do { } while (0)
127#endif
128
129#define cs_err(skt, fmt, arg...) \
130 dev_printk(KERN_ERR, &skt->dev, "cs: " fmt, ## arg)
131
132 110
133/* 111/*
134 * Stuff internal to module "pcmcia_core": 112 * Stuff internal to module "pcmcia_core":
@@ -170,10 +148,6 @@ extern struct rw_semaphore pcmcia_socket_list_rwsem;
170extern struct list_head pcmcia_socket_list; 148extern struct list_head pcmcia_socket_list;
171extern struct class pcmcia_socket_class; 149extern struct class pcmcia_socket_class;
172 150
173int pcmcia_get_window(struct pcmcia_socket *s,
174 window_handle_t *handle,
175 int idx,
176 win_req_t *req);
177int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c); 151int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
178struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr); 152struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr);
179 153
@@ -199,6 +173,22 @@ int pcmcia_replace_cis(struct pcmcia_socket *s,
199 const u8 *data, const size_t len); 173 const u8 *data, const size_t len);
200int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); 174int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count);
201 175
176/* loop over CIS entries */
177int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
178 cisdata_t code, cisparse_t *parse, void *priv_data,
179 int (*loop_tuple) (tuple_t *tuple,
180 cisparse_t *parse,
181 void *priv_data));
182
183int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
184 tuple_t *tuple);
185
186int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
187 tuple_t *tuple);
188
189int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
190
191
202/* rsrc_mgr.c */ 192/* rsrc_mgr.c */
203int pcmcia_validate_mem(struct pcmcia_socket *s); 193int pcmcia_validate_mem(struct pcmcia_socket *s);
204struct resource *pcmcia_find_io_region(unsigned long base, 194struct resource *pcmcia_find_io_region(unsigned long base,
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index f5b7079f13d3..05893d41dd41 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -41,129 +41,11 @@ MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
41MODULE_DESCRIPTION("PCMCIA Driver Services"); 41MODULE_DESCRIPTION("PCMCIA Driver Services");
42MODULE_LICENSE("GPL"); 42MODULE_LICENSE("GPL");
43 43
44#ifdef CONFIG_PCMCIA_DEBUG
45int ds_pc_debug;
46
47module_param_named(pc_debug, ds_pc_debug, int, 0644);
48
49#define ds_dbg(lvl, fmt, arg...) do { \
50 if (ds_pc_debug > (lvl)) \
51 printk(KERN_DEBUG "ds: " fmt , ## arg); \
52} while (0)
53#define ds_dev_dbg(lvl, dev, fmt, arg...) do { \
54 if (ds_pc_debug > (lvl)) \
55 dev_printk(KERN_DEBUG, dev, "ds: " fmt , ## arg); \
56} while (0)
57#else
58#define ds_dbg(lvl, fmt, arg...) do { } while (0)
59#define ds_dev_dbg(lvl, dev, fmt, arg...) do { } while (0)
60#endif
61 44
62spinlock_t pcmcia_dev_list_lock; 45spinlock_t pcmcia_dev_list_lock;
63 46
64/*====================================================================*/ 47/*====================================================================*/
65 48
66/* code which was in cs.c before */
67
68/* String tables for error messages */
69
70typedef struct lookup_t {
71 const int key;
72 const char *msg;
73} lookup_t;
74
75static const lookup_t error_table[] = {
76 { 0, "Operation succeeded" },
77 { -EIO, "Input/Output error" },
78 { -ENODEV, "No card present" },
79 { -EINVAL, "Bad parameter" },
80 { -EACCES, "Configuration locked" },
81 { -EBUSY, "Resource in use" },
82 { -ENOSPC, "No more items" },
83 { -ENOMEM, "Out of resource" },
84};
85
86
87static const lookup_t service_table[] = {
88 { AccessConfigurationRegister, "AccessConfigurationRegister" },
89 { AddSocketServices, "AddSocketServices" },
90 { AdjustResourceInfo, "AdjustResourceInfo" },
91 { CheckEraseQueue, "CheckEraseQueue" },
92 { CloseMemory, "CloseMemory" },
93 { DeregisterClient, "DeregisterClient" },
94 { DeregisterEraseQueue, "DeregisterEraseQueue" },
95 { GetCardServicesInfo, "GetCardServicesInfo" },
96 { GetClientInfo, "GetClientInfo" },
97 { GetConfigurationInfo, "GetConfigurationInfo" },
98 { GetEventMask, "GetEventMask" },
99 { GetFirstClient, "GetFirstClient" },
100 { GetFirstRegion, "GetFirstRegion" },
101 { GetFirstTuple, "GetFirstTuple" },
102 { GetNextClient, "GetNextClient" },
103 { GetNextRegion, "GetNextRegion" },
104 { GetNextTuple, "GetNextTuple" },
105 { GetStatus, "GetStatus" },
106 { GetTupleData, "GetTupleData" },
107 { MapMemPage, "MapMemPage" },
108 { ModifyConfiguration, "ModifyConfiguration" },
109 { ModifyWindow, "ModifyWindow" },
110 { OpenMemory, "OpenMemory" },
111 { ParseTuple, "ParseTuple" },
112 { ReadMemory, "ReadMemory" },
113 { RegisterClient, "RegisterClient" },
114 { RegisterEraseQueue, "RegisterEraseQueue" },
115 { RegisterMTD, "RegisterMTD" },
116 { ReleaseConfiguration, "ReleaseConfiguration" },
117 { ReleaseIO, "ReleaseIO" },
118 { ReleaseIRQ, "ReleaseIRQ" },
119 { ReleaseWindow, "ReleaseWindow" },
120 { RequestConfiguration, "RequestConfiguration" },
121 { RequestIO, "RequestIO" },
122 { RequestIRQ, "RequestIRQ" },
123 { RequestSocketMask, "RequestSocketMask" },
124 { RequestWindow, "RequestWindow" },
125 { ResetCard, "ResetCard" },
126 { SetEventMask, "SetEventMask" },
127 { ValidateCIS, "ValidateCIS" },
128 { WriteMemory, "WriteMemory" },
129 { BindDevice, "BindDevice" },
130 { BindMTD, "BindMTD" },
131 { ReportError, "ReportError" },
132 { SuspendCard, "SuspendCard" },
133 { ResumeCard, "ResumeCard" },
134 { EjectCard, "EjectCard" },
135 { InsertCard, "InsertCard" },
136 { ReplaceCIS, "ReplaceCIS" }
137};
138
139const char *pcmcia_error_func(int func)
140{
141 int i;
142
143 for (i = 0; i < ARRAY_SIZE(service_table); i++)
144 if (service_table[i].key == func)
145 return service_table[i].msg;
146
147 return "Unknown service number";
148}
149EXPORT_SYMBOL(pcmcia_error_func);
150
151const char *pcmcia_error_ret(int ret)
152{
153 int i;
154
155 for (i = 0; i < ARRAY_SIZE(error_table); i++)
156 if (error_table[i].key == ret)
157 return error_table[i].msg;
158
159 return "unknown";
160}
161EXPORT_SYMBOL(pcmcia_error_ret);
162
163/*======================================================================*/
164
165
166
167static void pcmcia_check_driver(struct pcmcia_driver *p_drv) 49static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
168{ 50{
169 struct pcmcia_device_id *did = p_drv->id_table; 51 struct pcmcia_device_id *did = p_drv->id_table;
@@ -303,7 +185,7 @@ int pcmcia_register_driver(struct pcmcia_driver *driver)
303 spin_lock_init(&driver->dynids.lock); 185 spin_lock_init(&driver->dynids.lock);
304 INIT_LIST_HEAD(&driver->dynids.list); 186 INIT_LIST_HEAD(&driver->dynids.list);
305 187
306 ds_dbg(3, "registering driver %s\n", driver->drv.name); 188 pr_debug("registering driver %s\n", driver->drv.name);
307 189
308 error = driver_register(&driver->drv); 190 error = driver_register(&driver->drv);
309 if (error < 0) 191 if (error < 0)
@@ -323,7 +205,7 @@ EXPORT_SYMBOL(pcmcia_register_driver);
323 */ 205 */
324void pcmcia_unregister_driver(struct pcmcia_driver *driver) 206void pcmcia_unregister_driver(struct pcmcia_driver *driver)
325{ 207{
326 ds_dbg(3, "unregistering driver %s\n", driver->drv.name); 208 pr_debug("unregistering driver %s\n", driver->drv.name);
327 driver_unregister(&driver->drv); 209 driver_unregister(&driver->drv);
328 pcmcia_free_dynids(driver); 210 pcmcia_free_dynids(driver);
329} 211}
@@ -350,14 +232,14 @@ void pcmcia_put_dev(struct pcmcia_device *p_dev)
350static void pcmcia_release_function(struct kref *ref) 232static void pcmcia_release_function(struct kref *ref)
351{ 233{
352 struct config_t *c = container_of(ref, struct config_t, ref); 234 struct config_t *c = container_of(ref, struct config_t, ref);
353 ds_dbg(1, "releasing config_t\n"); 235 pr_debug("releasing config_t\n");
354 kfree(c); 236 kfree(c);
355} 237}
356 238
357static void pcmcia_release_dev(struct device *dev) 239static void pcmcia_release_dev(struct device *dev)
358{ 240{
359 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 241 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
360 ds_dev_dbg(1, dev, "releasing device\n"); 242 dev_dbg(dev, "releasing device\n");
361 pcmcia_put_socket(p_dev->socket); 243 pcmcia_put_socket(p_dev->socket);
362 kfree(p_dev->devname); 244 kfree(p_dev->devname);
363 kref_put(&p_dev->function_config->ref, pcmcia_release_function); 245 kref_put(&p_dev->function_config->ref, pcmcia_release_function);
@@ -367,7 +249,7 @@ static void pcmcia_release_dev(struct device *dev)
367static void pcmcia_add_device_later(struct pcmcia_socket *s, int mfc) 249static void pcmcia_add_device_later(struct pcmcia_socket *s, int mfc)
368{ 250{
369 if (!s->pcmcia_state.device_add_pending) { 251 if (!s->pcmcia_state.device_add_pending) {
370 ds_dev_dbg(1, &s->dev, "scheduling to add %s secondary" 252 dev_dbg(&s->dev, "scheduling to add %s secondary"
371 " device to %d\n", mfc ? "mfc" : "pfc", s->sock); 253 " device to %d\n", mfc ? "mfc" : "pfc", s->sock);
372 s->pcmcia_state.device_add_pending = 1; 254 s->pcmcia_state.device_add_pending = 1;
373 s->pcmcia_state.mfc_pfc = mfc; 255 s->pcmcia_state.mfc_pfc = mfc;
@@ -405,7 +287,7 @@ static int pcmcia_device_probe(struct device * dev)
405 */ 287 */
406 did = dev_get_drvdata(&p_dev->dev); 288 did = dev_get_drvdata(&p_dev->dev);
407 289
408 ds_dev_dbg(1, dev, "trying to bind to %s\n", p_drv->drv.name); 290 dev_dbg(dev, "trying to bind to %s\n", p_drv->drv.name);
409 291
410 if ((!p_drv->probe) || (!p_dev->function_config) || 292 if ((!p_drv->probe) || (!p_dev->function_config) ||
411 (!try_module_get(p_drv->owner))) { 293 (!try_module_get(p_drv->owner))) {
@@ -428,7 +310,7 @@ static int pcmcia_device_probe(struct device * dev)
428 310
429 ret = p_drv->probe(p_dev); 311 ret = p_drv->probe(p_dev);
430 if (ret) { 312 if (ret) {
431 ds_dev_dbg(1, dev, "binding to %s failed with %d\n", 313 dev_dbg(dev, "binding to %s failed with %d\n",
432 p_drv->drv.name, ret); 314 p_drv->drv.name, ret);
433 goto put_module; 315 goto put_module;
434 } 316 }
@@ -456,7 +338,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
456 struct pcmcia_device *tmp; 338 struct pcmcia_device *tmp;
457 unsigned long flags; 339 unsigned long flags;
458 340
459 ds_dev_dbg(2, leftover ? &leftover->dev : &s->dev, 341 dev_dbg(leftover ? &leftover->dev : &s->dev,
460 "pcmcia_card_remove(%d) %s\n", s->sock, 342 "pcmcia_card_remove(%d) %s\n", s->sock,
461 leftover ? leftover->devname : ""); 343 leftover ? leftover->devname : "");
462 344
@@ -475,7 +357,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
475 p_dev->_removed=1; 357 p_dev->_removed=1;
476 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); 358 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
477 359
478 ds_dev_dbg(2, &p_dev->dev, "unregistering device\n"); 360 dev_dbg(&p_dev->dev, "unregistering device\n");
479 device_unregister(&p_dev->dev); 361 device_unregister(&p_dev->dev);
480 } 362 }
481 363
@@ -492,7 +374,7 @@ static int pcmcia_device_remove(struct device * dev)
492 p_dev = to_pcmcia_dev(dev); 374 p_dev = to_pcmcia_dev(dev);
493 p_drv = to_pcmcia_drv(dev->driver); 375 p_drv = to_pcmcia_drv(dev->driver);
494 376
495 ds_dev_dbg(1, dev, "removing device\n"); 377 dev_dbg(dev, "removing device\n");
496 378
497 /* If we're removing the primary module driving a 379 /* If we're removing the primary module driving a
498 * pseudo multi-function card, we need to unbind 380 * pseudo multi-function card, we need to unbind
@@ -572,7 +454,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
572 } 454 }
573 if (!pccard_read_tuple(p_dev->socket, p_dev->func, 455 if (!pccard_read_tuple(p_dev->socket, p_dev->func,
574 CISTPL_DEVICE_GEO, devgeo)) { 456 CISTPL_DEVICE_GEO, devgeo)) {
575 ds_dev_dbg(0, &p_dev->dev, 457 dev_dbg(&p_dev->dev,
576 "mem device geometry probably means " 458 "mem device geometry probably means "
577 "FUNCID_MEMORY\n"); 459 "FUNCID_MEMORY\n");
578 p_dev->func_id = CISTPL_FUNCID_MEMORY; 460 p_dev->func_id = CISTPL_FUNCID_MEMORY;
@@ -628,7 +510,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
628 510
629 mutex_lock(&device_add_lock); 511 mutex_lock(&device_add_lock);
630 512
631 ds_dbg(3, "adding device to %d, function %d\n", s->sock, function); 513 pr_debug("adding device to %d, function %d\n", s->sock, function);
632 514
633 /* max of 4 devices per card */ 515 /* max of 4 devices per card */
634 if (s->device_count == 4) 516 if (s->device_count == 4)
@@ -654,7 +536,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
654 p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev)); 536 p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
655 if (!p_dev->devname) 537 if (!p_dev->devname)
656 goto err_free; 538 goto err_free;
657 ds_dev_dbg(3, &p_dev->dev, "devname is %s\n", p_dev->devname); 539 dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname);
658 540
659 spin_lock_irqsave(&pcmcia_dev_list_lock, flags); 541 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
660 542
@@ -677,7 +559,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
677 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); 559 spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
678 560
679 if (!p_dev->function_config) { 561 if (!p_dev->function_config) {
680 ds_dev_dbg(3, &p_dev->dev, "creating config_t\n"); 562 dev_dbg(&p_dev->dev, "creating config_t\n");
681 p_dev->function_config = kzalloc(sizeof(struct config_t), 563 p_dev->function_config = kzalloc(sizeof(struct config_t),
682 GFP_KERNEL); 564 GFP_KERNEL);
683 if (!p_dev->function_config) 565 if (!p_dev->function_config)
@@ -722,20 +604,20 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
722 int ret = 0; 604 int ret = 0;
723 605
724 if (!(s->resource_setup_done)) { 606 if (!(s->resource_setup_done)) {
725 ds_dev_dbg(3, &s->dev, 607 dev_dbg(&s->dev,
726 "no resources available, delaying card_add\n"); 608 "no resources available, delaying card_add\n");
727 return -EAGAIN; /* try again, but later... */ 609 return -EAGAIN; /* try again, but later... */
728 } 610 }
729 611
730 if (pcmcia_validate_mem(s)) { 612 if (pcmcia_validate_mem(s)) {
731 ds_dev_dbg(3, &s->dev, "validating mem resources failed, " 613 dev_dbg(&s->dev, "validating mem resources failed, "
732 "delaying card_add\n"); 614 "delaying card_add\n");
733 return -EAGAIN; /* try again, but later... */ 615 return -EAGAIN; /* try again, but later... */
734 } 616 }
735 617
736 ret = pccard_validate_cis(s, &no_chains); 618 ret = pccard_validate_cis(s, &no_chains);
737 if (ret || !no_chains) { 619 if (ret || !no_chains) {
738 ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n"); 620 dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
739 return -ENODEV; 621 return -ENODEV;
740 } 622 }
741 623
@@ -756,7 +638,7 @@ static void pcmcia_delayed_add_device(struct work_struct *work)
756{ 638{
757 struct pcmcia_socket *s = 639 struct pcmcia_socket *s =
758 container_of(work, struct pcmcia_socket, device_add); 640 container_of(work, struct pcmcia_socket, device_add);
759 ds_dev_dbg(1, &s->dev, "adding additional device to %d\n", s->sock); 641 dev_dbg(&s->dev, "adding additional device to %d\n", s->sock);
760 pcmcia_device_add(s, s->pcmcia_state.mfc_pfc); 642 pcmcia_device_add(s, s->pcmcia_state.mfc_pfc);
761 s->pcmcia_state.device_add_pending = 0; 643 s->pcmcia_state.device_add_pending = 0;
762 s->pcmcia_state.mfc_pfc = 0; 644 s->pcmcia_state.mfc_pfc = 0;
@@ -766,7 +648,7 @@ static int pcmcia_requery(struct device *dev, void * _data)
766{ 648{
767 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 649 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
768 if (!p_dev->dev.driver) { 650 if (!p_dev->dev.driver) {
769 ds_dev_dbg(1, dev, "update device information\n"); 651 dev_dbg(dev, "update device information\n");
770 pcmcia_device_query(p_dev); 652 pcmcia_device_query(p_dev);
771 } 653 }
772 654
@@ -780,7 +662,7 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt, int new_cis)
780 unsigned long flags; 662 unsigned long flags;
781 663
782 /* must be called with skt_mutex held */ 664 /* must be called with skt_mutex held */
783 ds_dev_dbg(0, &skt->dev, "re-scanning socket %d\n", skt->sock); 665 dev_dbg(&skt->dev, "re-scanning socket %d\n", skt->sock);
784 666
785 spin_lock_irqsave(&pcmcia_dev_list_lock, flags); 667 spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
786 if (list_empty(&skt->devices_list)) 668 if (list_empty(&skt->devices_list))
@@ -835,7 +717,7 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
835 if (!filename) 717 if (!filename)
836 return -EINVAL; 718 return -EINVAL;
837 719
838 ds_dev_dbg(1, &dev->dev, "trying to load CIS file %s\n", filename); 720 dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename);
839 721
840 if (request_firmware(&fw, filename, &dev->dev) == 0) { 722 if (request_firmware(&fw, filename, &dev->dev) == 0) {
841 if (fw->size >= CISTPL_MAX_CIS_SIZE) { 723 if (fw->size >= CISTPL_MAX_CIS_SIZE) {
@@ -953,14 +835,14 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
953 * after it has re-checked that there is no possible module 835 * after it has re-checked that there is no possible module
954 * with a prod_id/manf_id/card_id match. 836 * with a prod_id/manf_id/card_id match.
955 */ 837 */
956 ds_dev_dbg(0, &dev->dev, 838 dev_dbg(&dev->dev,
957 "skipping FUNC_ID match until userspace interaction\n"); 839 "skipping FUNC_ID match until userspace interaction\n");
958 if (!dev->allow_func_id_match) 840 if (!dev->allow_func_id_match)
959 return 0; 841 return 0;
960 } 842 }
961 843
962 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { 844 if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
963 ds_dev_dbg(0, &dev->dev, "device needs a fake CIS\n"); 845 dev_dbg(&dev->dev, "device needs a fake CIS\n");
964 if (!dev->socket->fake_cis) 846 if (!dev->socket->fake_cis)
965 pcmcia_load_firmware(dev, did->cisfile); 847 pcmcia_load_firmware(dev, did->cisfile);
966 848
@@ -992,9 +874,9 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
992 /* match dynamic devices first */ 874 /* match dynamic devices first */
993 spin_lock(&p_drv->dynids.lock); 875 spin_lock(&p_drv->dynids.lock);
994 list_for_each_entry(dynid, &p_drv->dynids.list, node) { 876 list_for_each_entry(dynid, &p_drv->dynids.list, node) {
995 ds_dev_dbg(3, dev, "trying to match to %s\n", drv->name); 877 dev_dbg(dev, "trying to match to %s\n", drv->name);
996 if (pcmcia_devmatch(p_dev, &dynid->id)) { 878 if (pcmcia_devmatch(p_dev, &dynid->id)) {
997 ds_dev_dbg(0, dev, "matched to %s\n", drv->name); 879 dev_dbg(dev, "matched to %s\n", drv->name);
998 spin_unlock(&p_drv->dynids.lock); 880 spin_unlock(&p_drv->dynids.lock);
999 return 1; 881 return 1;
1000 } 882 }
@@ -1004,15 +886,15 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
1004#ifdef CONFIG_PCMCIA_IOCTL 886#ifdef CONFIG_PCMCIA_IOCTL
1005 /* matching by cardmgr */ 887 /* matching by cardmgr */
1006 if (p_dev->cardmgr == p_drv) { 888 if (p_dev->cardmgr == p_drv) {
1007 ds_dev_dbg(0, dev, "cardmgr matched to %s\n", drv->name); 889 dev_dbg(dev, "cardmgr matched to %s\n", drv->name);
1008 return 1; 890 return 1;
1009 } 891 }
1010#endif 892#endif
1011 893
1012 while (did && did->match_flags) { 894 while (did && did->match_flags) {
1013 ds_dev_dbg(3, dev, "trying to match to %s\n", drv->name); 895 dev_dbg(dev, "trying to match to %s\n", drv->name);
1014 if (pcmcia_devmatch(p_dev, did)) { 896 if (pcmcia_devmatch(p_dev, did)) {
1015 ds_dev_dbg(0, dev, "matched to %s\n", drv->name); 897 dev_dbg(dev, "matched to %s\n", drv->name);
1016 return 1; 898 return 1;
1017 } 899 }
1018 did++; 900 did++;
@@ -1218,7 +1100,7 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
1218 if (p_dev->suspended) 1100 if (p_dev->suspended)
1219 return 0; 1101 return 0;
1220 1102
1221 ds_dev_dbg(2, dev, "suspending\n"); 1103 dev_dbg(dev, "suspending\n");
1222 1104
1223 if (dev->driver) 1105 if (dev->driver)
1224 p_drv = to_pcmcia_drv(dev->driver); 1106 p_drv = to_pcmcia_drv(dev->driver);
@@ -1238,7 +1120,7 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
1238 } 1120 }
1239 1121
1240 if (p_dev->device_no == p_dev->func) { 1122 if (p_dev->device_no == p_dev->func) {
1241 ds_dev_dbg(2, dev, "releasing configuration\n"); 1123 dev_dbg(dev, "releasing configuration\n");
1242 pcmcia_release_configuration(p_dev); 1124 pcmcia_release_configuration(p_dev);
1243 } 1125 }
1244 1126
@@ -1258,7 +1140,7 @@ static int pcmcia_dev_resume(struct device * dev)
1258 if (!p_dev->suspended) 1140 if (!p_dev->suspended)
1259 return 0; 1141 return 0;
1260 1142
1261 ds_dev_dbg(2, dev, "resuming\n"); 1143 dev_dbg(dev, "resuming\n");
1262 1144
1263 if (dev->driver) 1145 if (dev->driver)
1264 p_drv = to_pcmcia_drv(dev->driver); 1146 p_drv = to_pcmcia_drv(dev->driver);
@@ -1267,7 +1149,7 @@ static int pcmcia_dev_resume(struct device * dev)
1267 goto out; 1149 goto out;
1268 1150
1269 if (p_dev->device_no == p_dev->func) { 1151 if (p_dev->device_no == p_dev->func) {
1270 ds_dev_dbg(2, dev, "requesting configuration\n"); 1152 dev_dbg(dev, "requesting configuration\n");
1271 ret = pcmcia_request_configuration(p_dev, &p_dev->conf); 1153 ret = pcmcia_request_configuration(p_dev, &p_dev->conf);
1272 if (ret) 1154 if (ret)
1273 goto out; 1155 goto out;
@@ -1309,14 +1191,14 @@ static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
1309 1191
1310static int pcmcia_bus_resume(struct pcmcia_socket *skt) 1192static int pcmcia_bus_resume(struct pcmcia_socket *skt)
1311{ 1193{
1312 ds_dev_dbg(2, &skt->dev, "resuming socket %d\n", skt->sock); 1194 dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock);
1313 bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback); 1195 bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
1314 return 0; 1196 return 0;
1315} 1197}
1316 1198
1317static int pcmcia_bus_suspend(struct pcmcia_socket *skt) 1199static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
1318{ 1200{
1319 ds_dev_dbg(2, &skt->dev, "suspending socket %d\n", skt->sock); 1201 dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock);
1320 if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt, 1202 if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
1321 pcmcia_bus_suspend_callback)) { 1203 pcmcia_bus_suspend_callback)) {
1322 pcmcia_bus_resume(skt); 1204 pcmcia_bus_resume(skt);
@@ -1348,7 +1230,7 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
1348 return -ENODEV; 1230 return -ENODEV;
1349 } 1231 }
1350 1232
1351 ds_dev_dbg(1, &skt->dev, "ds_event(0x%06x, %d, 0x%p)\n", 1233 dev_dbg(&skt->dev, "ds_event(0x%06x, %d, 0x%p)\n",
1352 event, priority, skt); 1234 event, priority, skt);
1353 1235
1354 switch (event) { 1236 switch (event) {
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index a4aacb830b80..c13fd9360511 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -63,21 +63,6 @@
63#include "vg468.h" 63#include "vg468.h"
64#include "ricoh.h" 64#include "ricoh.h"
65 65
66#ifdef CONFIG_PCMCIA_DEBUG
67static const char version[] =
68"i82365.c 1.265 1999/11/10 18:36:21 (David Hinds)";
69
70static int pc_debug;
71
72module_param(pc_debug, int, 0644);
73
74#define debug(lvl, fmt, arg...) do { \
75 if (pc_debug > (lvl)) \
76 printk(KERN_DEBUG "i82365: " fmt , ## arg); \
77} while (0)
78#else
79#define debug(lvl, fmt, arg...) do { } while (0)
80#endif
81 66
82static irqreturn_t i365_count_irq(int, void *); 67static irqreturn_t i365_count_irq(int, void *);
83static inline int _check_irq(int irq, int flags) 68static inline int _check_irq(int irq, int flags)
@@ -501,13 +486,13 @@ static irqreturn_t i365_count_irq(int irq, void *dev)
501{ 486{
502 i365_get(irq_sock, I365_CSC); 487 i365_get(irq_sock, I365_CSC);
503 irq_hits++; 488 irq_hits++;
504 debug(2, "-> hit on irq %d\n", irq); 489 pr_debug("i82365: -> hit on irq %d\n", irq);
505 return IRQ_HANDLED; 490 return IRQ_HANDLED;
506} 491}
507 492
508static u_int __init test_irq(u_short sock, int irq) 493static u_int __init test_irq(u_short sock, int irq)
509{ 494{
510 debug(2, " testing ISA irq %d\n", irq); 495 pr_debug("i82365: testing ISA irq %d\n", irq);
511 if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan", 496 if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan",
512 i365_count_irq) != 0) 497 i365_count_irq) != 0)
513 return 1; 498 return 1;
@@ -515,7 +500,7 @@ static u_int __init test_irq(u_short sock, int irq)
515 msleep(10); 500 msleep(10);
516 if (irq_hits) { 501 if (irq_hits) {
517 free_irq(irq, i365_count_irq); 502 free_irq(irq, i365_count_irq);
518 debug(2, " spurious hit!\n"); 503 pr_debug("i82365: spurious hit!\n");
519 return 1; 504 return 1;
520 } 505 }
521 506
@@ -528,7 +513,7 @@ static u_int __init test_irq(u_short sock, int irq)
528 513
529 /* mask all interrupts */ 514 /* mask all interrupts */
530 i365_set(sock, I365_CSCINT, 0); 515 i365_set(sock, I365_CSCINT, 0);
531 debug(2, " hits = %d\n", irq_hits); 516 pr_debug("i82365: hits = %d\n", irq_hits);
532 517
533 return (irq_hits != 1); 518 return (irq_hits != 1);
534} 519}
@@ -854,7 +839,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
854 u_long flags = 0; 839 u_long flags = 0;
855 int handled = 0; 840 int handled = 0;
856 841
857 debug(4, "pcic_interrupt(%d)\n", irq); 842 pr_debug("pcic_interrupt(%d)\n", irq);
858 843
859 for (j = 0; j < 20; j++) { 844 for (j = 0; j < 20; j++) {
860 active = 0; 845 active = 0;
@@ -878,7 +863,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
878 events |= (csc & I365_CSC_READY) ? SS_READY : 0; 863 events |= (csc & I365_CSC_READY) ? SS_READY : 0;
879 } 864 }
880 ISA_UNLOCK(i, flags); 865 ISA_UNLOCK(i, flags);
881 debug(2, "socket %d event 0x%02x\n", i, events); 866 pr_debug("socket %d event 0x%02x\n", i, events);
882 867
883 if (events) 868 if (events)
884 pcmcia_parse_events(&socket[i].socket, events); 869 pcmcia_parse_events(&socket[i].socket, events);
@@ -890,7 +875,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
890 if (j == 20) 875 if (j == 20)
891 printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n"); 876 printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
892 877
893 debug(4, "interrupt done\n"); 878 pr_debug("pcic_interrupt done\n");
894 return IRQ_RETVAL(handled); 879 return IRQ_RETVAL(handled);
895} /* pcic_interrupt */ 880} /* pcic_interrupt */
896 881
@@ -932,7 +917,7 @@ static int i365_get_status(u_short sock, u_int *value)
932 } 917 }
933 } 918 }
934 919
935 debug(1, "GetStatus(%d) = %#4.4x\n", sock, *value); 920 pr_debug("GetStatus(%d) = %#4.4x\n", sock, *value);
936 return 0; 921 return 0;
937} /* i365_get_status */ 922} /* i365_get_status */
938 923
@@ -943,7 +928,7 @@ static int i365_set_socket(u_short sock, socket_state_t *state)
943 struct i82365_socket *t = &socket[sock]; 928 struct i82365_socket *t = &socket[sock];
944 u_char reg; 929 u_char reg;
945 930
946 debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 931 pr_debug("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
947 "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags, 932 "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
948 state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 933 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
949 934
@@ -1052,7 +1037,7 @@ static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
1052{ 1037{
1053 u_char map, ioctl; 1038 u_char map, ioctl;
1054 1039
1055 debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " 1040 pr_debug("SetIOMap(%d, %d, %#2.2x, %d ns, "
1056 "%#llx-%#llx)\n", sock, io->map, io->flags, io->speed, 1041 "%#llx-%#llx)\n", sock, io->map, io->flags, io->speed,
1057 (unsigned long long)io->start, (unsigned long long)io->stop); 1042 (unsigned long long)io->start, (unsigned long long)io->stop);
1058 map = io->map; 1043 map = io->map;
@@ -1082,7 +1067,7 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
1082 u_short base, i; 1067 u_short base, i;
1083 u_char map; 1068 u_char map;
1084 1069
1085 debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, " 1070 pr_debug("SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, "
1086 "%#x)\n", sock, mem->map, mem->flags, mem->speed, 1071 "%#x)\n", sock, mem->map, mem->flags, mem->speed,
1087 (unsigned long long)mem->res->start, 1072 (unsigned long long)mem->res->start,
1088 (unsigned long long)mem->res->end, mem->card_start); 1073 (unsigned long long)mem->res->end, mem->card_start);
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c
index 7dfbee1dcd76..26a621c9e2fc 100644
--- a/drivers/pcmcia/m32r_cfc.c
+++ b/drivers/pcmcia/m32r_cfc.c
@@ -38,17 +38,6 @@
38 38
39#include "m32r_cfc.h" 39#include "m32r_cfc.h"
40 40
41#ifdef CONFIG_PCMCIA_DEBUG
42static int m32r_cfc_debug;
43module_param(m32r_cfc_debug, int, 0644);
44#define debug(lvl, fmt, arg...) do { \
45 if (m32r_cfc_debug > (lvl)) \
46 printk(KERN_DEBUG "m32r_cfc: " fmt , ## arg); \
47} while (0)
48#else
49#define debug(n, args...) do { } while (0)
50#endif
51
52/* Poll status interval -- 0 means default to interrupt */ 41/* Poll status interval -- 0 means default to interrupt */
53static int poll_interval = 0; 42static int poll_interval = 0;
54 43
@@ -123,7 +112,7 @@ void pcc_ioread_byte(int sock, unsigned long port, void *buf, size_t size,
123 unsigned char *bp = (unsigned char *)buf; 112 unsigned char *bp = (unsigned char *)buf;
124 unsigned long flags; 113 unsigned long flags;
125 114
126 debug(3, "m32r_cfc: pcc_ioread_byte: sock=%d, port=%#lx, buf=%p, " 115 pr_debug("m32r_cfc: pcc_ioread_byte: sock=%d, port=%#lx, buf=%p, "
127 "size=%u, nmemb=%d, flag=%d\n", 116 "size=%u, nmemb=%d, flag=%d\n",
128 sock, port, buf, size, nmemb, flag); 117 sock, port, buf, size, nmemb, flag);
129 118
@@ -132,7 +121,7 @@ void pcc_ioread_byte(int sock, unsigned long port, void *buf, size_t size,
132 printk("m32r_cfc:ioread_byte null port :%#lx\n",port); 121 printk("m32r_cfc:ioread_byte null port :%#lx\n",port);
133 return; 122 return;
134 } 123 }
135 debug(3, "m32r_cfc: pcc_ioread_byte: addr=%#lx\n", addr); 124 pr_debug("m32r_cfc: pcc_ioread_byte: addr=%#lx\n", addr);
136 125
137 spin_lock_irqsave(&pcc_lock, flags); 126 spin_lock_irqsave(&pcc_lock, flags);
138 /* read Byte */ 127 /* read Byte */
@@ -148,7 +137,7 @@ void pcc_ioread_word(int sock, unsigned long port, void *buf, size_t size,
148 unsigned short *bp = (unsigned short *)buf; 137 unsigned short *bp = (unsigned short *)buf;
149 unsigned long flags; 138 unsigned long flags;
150 139
151 debug(3, "m32r_cfc: pcc_ioread_word: sock=%d, port=%#lx, " 140 pr_debug("m32r_cfc: pcc_ioread_word: sock=%d, port=%#lx, "
152 "buf=%p, size=%u, nmemb=%d, flag=%d\n", 141 "buf=%p, size=%u, nmemb=%d, flag=%d\n",
153 sock, port, buf, size, nmemb, flag); 142 sock, port, buf, size, nmemb, flag);
154 143
@@ -163,7 +152,7 @@ void pcc_ioread_word(int sock, unsigned long port, void *buf, size_t size,
163 printk("m32r_cfc:ioread_word null port :%#lx\n",port); 152 printk("m32r_cfc:ioread_word null port :%#lx\n",port);
164 return; 153 return;
165 } 154 }
166 debug(3, "m32r_cfc: pcc_ioread_word: addr=%#lx\n", addr); 155 pr_debug("m32r_cfc: pcc_ioread_word: addr=%#lx\n", addr);
167 156
168 spin_lock_irqsave(&pcc_lock, flags); 157 spin_lock_irqsave(&pcc_lock, flags);
169 /* read Word */ 158 /* read Word */
@@ -179,7 +168,7 @@ void pcc_iowrite_byte(int sock, unsigned long port, void *buf, size_t size,
179 unsigned char *bp = (unsigned char *)buf; 168 unsigned char *bp = (unsigned char *)buf;
180 unsigned long flags; 169 unsigned long flags;
181 170
182 debug(3, "m32r_cfc: pcc_iowrite_byte: sock=%d, port=%#lx, " 171 pr_debug("m32r_cfc: pcc_iowrite_byte: sock=%d, port=%#lx, "
183 "buf=%p, size=%u, nmemb=%d, flag=%d\n", 172 "buf=%p, size=%u, nmemb=%d, flag=%d\n",
184 sock, port, buf, size, nmemb, flag); 173 sock, port, buf, size, nmemb, flag);
185 174
@@ -189,7 +178,7 @@ void pcc_iowrite_byte(int sock, unsigned long port, void *buf, size_t size,
189 printk("m32r_cfc:iowrite_byte null port:%#lx\n",port); 178 printk("m32r_cfc:iowrite_byte null port:%#lx\n",port);
190 return; 179 return;
191 } 180 }
192 debug(3, "m32r_cfc: pcc_iowrite_byte: addr=%#lx\n", addr); 181 pr_debug("m32r_cfc: pcc_iowrite_byte: addr=%#lx\n", addr);
193 182
194 spin_lock_irqsave(&pcc_lock, flags); 183 spin_lock_irqsave(&pcc_lock, flags);
195 while (nmemb--) 184 while (nmemb--)
@@ -204,7 +193,7 @@ void pcc_iowrite_word(int sock, unsigned long port, void *buf, size_t size,
204 unsigned short *bp = (unsigned short *)buf; 193 unsigned short *bp = (unsigned short *)buf;
205 unsigned long flags; 194 unsigned long flags;
206 195
207 debug(3, "m32r_cfc: pcc_iowrite_word: sock=%d, port=%#lx, " 196 pr_debug("m32r_cfc: pcc_iowrite_word: sock=%d, port=%#lx, "
208 "buf=%p, size=%u, nmemb=%d, flag=%d\n", 197 "buf=%p, size=%u, nmemb=%d, flag=%d\n",
209 sock, port, buf, size, nmemb, flag); 198 sock, port, buf, size, nmemb, flag);
210 199
@@ -226,7 +215,7 @@ void pcc_iowrite_word(int sock, unsigned long port, void *buf, size_t size,
226 return; 215 return;
227 } 216 }
228#endif 217#endif
229 debug(3, "m32r_cfc: pcc_iowrite_word: addr=%#lx\n", addr); 218 pr_debug("m32r_cfc: pcc_iowrite_word: addr=%#lx\n", addr);
230 219
231 spin_lock_irqsave(&pcc_lock, flags); 220 spin_lock_irqsave(&pcc_lock, flags);
232 while (nmemb--) 221 while (nmemb--)
@@ -262,7 +251,7 @@ static struct timer_list poll_timer;
262static unsigned int pcc_get(u_short sock, unsigned int reg) 251static unsigned int pcc_get(u_short sock, unsigned int reg)
263{ 252{
264 unsigned int val = inw(reg); 253 unsigned int val = inw(reg);
265 debug(3, "m32r_cfc: pcc_get: reg(0x%08x)=0x%04x\n", reg, val); 254 pr_debug("m32r_cfc: pcc_get: reg(0x%08x)=0x%04x\n", reg, val);
266 return val; 255 return val;
267} 256}
268 257
@@ -270,7 +259,7 @@ static unsigned int pcc_get(u_short sock, unsigned int reg)
270static void pcc_set(u_short sock, unsigned int reg, unsigned int data) 259static void pcc_set(u_short sock, unsigned int reg, unsigned int data)
271{ 260{
272 outw(data, reg); 261 outw(data, reg);
273 debug(3, "m32r_cfc: pcc_set: reg(0x%08x)=0x%04x\n", reg, data); 262 pr_debug("m32r_cfc: pcc_set: reg(0x%08x)=0x%04x\n", reg, data);
274} 263}
275 264
276/*====================================================================== 265/*======================================================================
@@ -286,14 +275,14 @@ static int __init is_alive(u_short sock)
286{ 275{
287 unsigned int stat; 276 unsigned int stat;
288 277
289 debug(3, "m32r_cfc: is_alive:\n"); 278 pr_debug("m32r_cfc: is_alive:\n");
290 279
291 printk("CF: "); 280 printk("CF: ");
292 stat = pcc_get(sock, (unsigned int)PLD_CFSTS); 281 stat = pcc_get(sock, (unsigned int)PLD_CFSTS);
293 if (!stat) 282 if (!stat)
294 printk("No "); 283 printk("No ");
295 printk("Card is detected at socket %d : stat = 0x%08x\n", sock, stat); 284 printk("Card is detected at socket %d : stat = 0x%08x\n", sock, stat);
296 debug(3, "m32r_cfc: is_alive: sock stat is 0x%04x\n", stat); 285 pr_debug("m32r_cfc: is_alive: sock stat is 0x%04x\n", stat);
297 286
298 return 0; 287 return 0;
299} 288}
@@ -303,7 +292,7 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr,
303{ 292{
304 pcc_socket_t *t = &socket[pcc_sockets]; 293 pcc_socket_t *t = &socket[pcc_sockets];
305 294
306 debug(3, "m32r_cfc: add_pcc_socket: base=%#lx, irq=%d, " 295 pr_debug("m32r_cfc: add_pcc_socket: base=%#lx, irq=%d, "
307 "mapaddr=%#lx, ioaddr=%08x\n", 296 "mapaddr=%#lx, ioaddr=%08x\n",
308 base, irq, mapaddr, ioaddr); 297 base, irq, mapaddr, ioaddr);
309 298
@@ -358,7 +347,7 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr,
358 /* eject interrupt */ 347 /* eject interrupt */
359 request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt); 348 request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt);
360#endif 349#endif
361 debug(3, "m32r_cfc: enable CFMSK, RDYSEL\n"); 350 pr_debug("m32r_cfc: enable CFMSK, RDYSEL\n");
362 pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01); 351 pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01);
363#endif /* CONFIG_PLAT_USRV */ 352#endif /* CONFIG_PLAT_USRV */
364#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT) 353#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
@@ -378,26 +367,26 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
378 u_int events = 0; 367 u_int events = 0;
379 int handled = 0; 368 int handled = 0;
380 369
381 debug(3, "m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev); 370 pr_debug("m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev);
382 for (i = 0; i < pcc_sockets; i++) { 371 for (i = 0; i < pcc_sockets; i++) {
383 if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq) 372 if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq)
384 continue; 373 continue;
385 374
386 handled = 1; 375 handled = 1;
387 debug(3, "m32r_cfc: pcc_interrupt: socket %d irq 0x%02x ", 376 pr_debug("m32r_cfc: pcc_interrupt: socket %d irq 0x%02x ",
388 i, irq); 377 i, irq);
389 events |= SS_DETECT; /* insert or eject */ 378 events |= SS_DETECT; /* insert or eject */
390 if (events) 379 if (events)
391 pcmcia_parse_events(&socket[i].socket, events); 380 pcmcia_parse_events(&socket[i].socket, events);
392 } 381 }
393 debug(3, "m32r_cfc: pcc_interrupt: done\n"); 382 pr_debug("m32r_cfc: pcc_interrupt: done\n");
394 383
395 return IRQ_RETVAL(handled); 384 return IRQ_RETVAL(handled);
396} /* pcc_interrupt */ 385} /* pcc_interrupt */
397 386
398static void pcc_interrupt_wrapper(u_long data) 387static void pcc_interrupt_wrapper(u_long data)
399{ 388{
400 debug(3, "m32r_cfc: pcc_interrupt_wrapper:\n"); 389 pr_debug("m32r_cfc: pcc_interrupt_wrapper:\n");
401 pcc_interrupt(0, NULL); 390 pcc_interrupt(0, NULL);
402 init_timer(&poll_timer); 391 init_timer(&poll_timer);
403 poll_timer.expires = jiffies + poll_interval; 392 poll_timer.expires = jiffies + poll_interval;
@@ -410,17 +399,17 @@ static int _pcc_get_status(u_short sock, u_int *value)
410{ 399{
411 u_int status; 400 u_int status;
412 401
413 debug(3, "m32r_cfc: _pcc_get_status:\n"); 402 pr_debug("m32r_cfc: _pcc_get_status:\n");
414 status = pcc_get(sock, (unsigned int)PLD_CFSTS); 403 status = pcc_get(sock, (unsigned int)PLD_CFSTS);
415 *value = (status) ? SS_DETECT : 0; 404 *value = (status) ? SS_DETECT : 0;
416 debug(3, "m32r_cfc: _pcc_get_status: status=0x%08x\n", status); 405 pr_debug("m32r_cfc: _pcc_get_status: status=0x%08x\n", status);
417 406
418#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT) 407#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
419 if ( status ) { 408 if ( status ) {
420 /* enable CF power */ 409 /* enable CF power */
421 status = inw((unsigned int)PLD_CPCR); 410 status = inw((unsigned int)PLD_CPCR);
422 if (!(status & PLD_CPCR_CF)) { 411 if (!(status & PLD_CPCR_CF)) {
423 debug(3, "m32r_cfc: _pcc_get_status: " 412 pr_debug("m32r_cfc: _pcc_get_status: "
424 "power on (CPCR=0x%08x)\n", status); 413 "power on (CPCR=0x%08x)\n", status);
425 status |= PLD_CPCR_CF; 414 status |= PLD_CPCR_CF;
426 outw(status, (unsigned int)PLD_CPCR); 415 outw(status, (unsigned int)PLD_CPCR);
@@ -439,7 +428,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
439 status &= ~PLD_CPCR_CF; 428 status &= ~PLD_CPCR_CF;
440 outw(status, (unsigned int)PLD_CPCR); 429 outw(status, (unsigned int)PLD_CPCR);
441 udelay(100); 430 udelay(100);
442 debug(3, "m32r_cfc: _pcc_get_status: " 431 pr_debug("m32r_cfc: _pcc_get_status: "
443 "power off (CPCR=0x%08x)\n", status); 432 "power off (CPCR=0x%08x)\n", status);
444 } 433 }
445#elif defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3) 434#elif defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
@@ -465,13 +454,13 @@ static int _pcc_get_status(u_short sock, u_int *value)
465 /* disable CF power */ 454 /* disable CF power */
466 pcc_set(sock, (unsigned int)PLD_CPCR, 0); 455 pcc_set(sock, (unsigned int)PLD_CPCR, 0);
467 udelay(100); 456 udelay(100);
468 debug(3, "m32r_cfc: _pcc_get_status: " 457 pr_debug("m32r_cfc: _pcc_get_status: "
469 "power off (CPCR=0x%08x)\n", status); 458 "power off (CPCR=0x%08x)\n", status);
470 } 459 }
471#else 460#else
472#error no platform configuration 461#error no platform configuration
473#endif 462#endif
474 debug(3, "m32r_cfc: _pcc_get_status: GetStatus(%d) = %#4.4x\n", 463 pr_debug("m32r_cfc: _pcc_get_status: GetStatus(%d) = %#4.4x\n",
475 sock, *value); 464 sock, *value);
476 return 0; 465 return 0;
477} /* _get_status */ 466} /* _get_status */
@@ -480,7 +469,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
480 469
481static int _pcc_set_socket(u_short sock, socket_state_t *state) 470static int _pcc_set_socket(u_short sock, socket_state_t *state)
482{ 471{
483 debug(3, "m32r_cfc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 472 pr_debug("m32r_cfc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
484 "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags, 473 "io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
485 state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 474 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
486 475
@@ -492,41 +481,39 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
492 } 481 }
493#endif 482#endif
494 if (state->flags & SS_RESET) { 483 if (state->flags & SS_RESET) {
495 debug(3, ":RESET\n"); 484 pr_debug(":RESET\n");
496 pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x101); 485 pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x101);
497 }else{ 486 }else{
498 pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x100); 487 pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x100);
499 } 488 }
500 if (state->flags & SS_OUTPUT_ENA){ 489 if (state->flags & SS_OUTPUT_ENA){
501 debug(3, ":OUTPUT_ENA\n"); 490 pr_debug(":OUTPUT_ENA\n");
502 /* bit clear */ 491 /* bit clear */
503 pcc_set(sock,(unsigned int)PLD_CFBUFCR,0); 492 pcc_set(sock,(unsigned int)PLD_CFBUFCR,0);
504 } else { 493 } else {
505 pcc_set(sock,(unsigned int)PLD_CFBUFCR,1); 494 pcc_set(sock,(unsigned int)PLD_CFBUFCR,1);
506 } 495 }
507 496
508#ifdef CONFIG_PCMCIA_DEBUG
509 if(state->flags & SS_IOCARD){ 497 if(state->flags & SS_IOCARD){
510 debug(3, ":IOCARD"); 498 pr_debug(":IOCARD");
511 } 499 }
512 if (state->flags & SS_PWR_AUTO) { 500 if (state->flags & SS_PWR_AUTO) {
513 debug(3, ":PWR_AUTO"); 501 pr_debug(":PWR_AUTO");
514 } 502 }
515 if (state->csc_mask & SS_DETECT) 503 if (state->csc_mask & SS_DETECT)
516 debug(3, ":csc-SS_DETECT"); 504 pr_debug(":csc-SS_DETECT");
517 if (state->flags & SS_IOCARD) { 505 if (state->flags & SS_IOCARD) {
518 if (state->csc_mask & SS_STSCHG) 506 if (state->csc_mask & SS_STSCHG)
519 debug(3, ":STSCHG"); 507 pr_debug(":STSCHG");
520 } else { 508 } else {
521 if (state->csc_mask & SS_BATDEAD) 509 if (state->csc_mask & SS_BATDEAD)
522 debug(3, ":BATDEAD"); 510 pr_debug(":BATDEAD");
523 if (state->csc_mask & SS_BATWARN) 511 if (state->csc_mask & SS_BATWARN)
524 debug(3, ":BATWARN"); 512 pr_debug(":BATWARN");
525 if (state->csc_mask & SS_READY) 513 if (state->csc_mask & SS_READY)
526 debug(3, ":READY"); 514 pr_debug(":READY");
527 } 515 }
528 debug(3, "\n"); 516 pr_debug("\n");
529#endif
530 return 0; 517 return 0;
531} /* _set_socket */ 518} /* _set_socket */
532 519
@@ -536,7 +523,7 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io)
536{ 523{
537 u_char map; 524 u_char map;
538 525
539 debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, " 526 pr_debug("m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, "
540 "%#llx-%#llx)\n", sock, io->map, io->flags, 527 "%#llx-%#llx)\n", sock, io->map, io->flags,
541 io->speed, (unsigned long long)io->start, 528 io->speed, (unsigned long long)io->start,
542 (unsigned long long)io->stop); 529 (unsigned long long)io->stop);
@@ -554,7 +541,7 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem)
554 u_long addr; 541 u_long addr;
555 pcc_socket_t *t = &socket[sock]; 542 pcc_socket_t *t = &socket[sock];
556 543
557 debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, " 544 pr_debug("m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, "
558 "%#llx, %#x)\n", sock, map, mem->flags, 545 "%#llx, %#x)\n", sock, map, mem->flags,
559 mem->speed, (unsigned long long)mem->static_start, 546 mem->speed, (unsigned long long)mem->static_start,
560 mem->card_start); 547 mem->card_start);
@@ -640,11 +627,11 @@ static int pcc_get_status(struct pcmcia_socket *s, u_int *value)
640 unsigned int sock = container_of(s, struct pcc_socket, socket)->number; 627 unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
641 628
642 if (socket[sock].flags & IS_ALIVE) { 629 if (socket[sock].flags & IS_ALIVE) {
643 debug(3, "m32r_cfc: pcc_get_status: sock(%d) -EINVAL\n", sock); 630 dev_dbg(&s->dev, "pcc_get_status: sock(%d) -EINVAL\n", sock);
644 *value = 0; 631 *value = 0;
645 return -EINVAL; 632 return -EINVAL;
646 } 633 }
647 debug(3, "m32r_cfc: pcc_get_status: sock(%d)\n", sock); 634 dev_dbg(&s->dev, "pcc_get_status: sock(%d)\n", sock);
648 LOCKED(_pcc_get_status(sock, value)); 635 LOCKED(_pcc_get_status(sock, value));
649} 636}
650 637
@@ -653,10 +640,10 @@ static int pcc_set_socket(struct pcmcia_socket *s, socket_state_t *state)
653 unsigned int sock = container_of(s, struct pcc_socket, socket)->number; 640 unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
654 641
655 if (socket[sock].flags & IS_ALIVE) { 642 if (socket[sock].flags & IS_ALIVE) {
656 debug(3, "m32r_cfc: pcc_set_socket: sock(%d) -EINVAL\n", sock); 643 dev_dbg(&s->dev, "pcc_set_socket: sock(%d) -EINVAL\n", sock);
657 return -EINVAL; 644 return -EINVAL;
658 } 645 }
659 debug(3, "m32r_cfc: pcc_set_socket: sock(%d)\n", sock); 646 dev_dbg(&s->dev, "pcc_set_socket: sock(%d)\n", sock);
660 LOCKED(_pcc_set_socket(sock, state)); 647 LOCKED(_pcc_set_socket(sock, state));
661} 648}
662 649
@@ -665,10 +652,10 @@ static int pcc_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
665 unsigned int sock = container_of(s, struct pcc_socket, socket)->number; 652 unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
666 653
667 if (socket[sock].flags & IS_ALIVE) { 654 if (socket[sock].flags & IS_ALIVE) {
668 debug(3, "m32r_cfc: pcc_set_io_map: sock(%d) -EINVAL\n", sock); 655 dev_dbg(&s->dev, "pcc_set_io_map: sock(%d) -EINVAL\n", sock);
669 return -EINVAL; 656 return -EINVAL;
670 } 657 }
671 debug(3, "m32r_cfc: pcc_set_io_map: sock(%d)\n", sock); 658 dev_dbg(&s->dev, "pcc_set_io_map: sock(%d)\n", sock);
672 LOCKED(_pcc_set_io_map(sock, io)); 659 LOCKED(_pcc_set_io_map(sock, io));
673} 660}
674 661
@@ -677,16 +664,16 @@ static int pcc_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
677 unsigned int sock = container_of(s, struct pcc_socket, socket)->number; 664 unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
678 665
679 if (socket[sock].flags & IS_ALIVE) { 666 if (socket[sock].flags & IS_ALIVE) {
680 debug(3, "m32r_cfc: pcc_set_mem_map: sock(%d) -EINVAL\n", sock); 667 dev_dbg(&s->dev, "pcc_set_mem_map: sock(%d) -EINVAL\n", sock);
681 return -EINVAL; 668 return -EINVAL;
682 } 669 }
683 debug(3, "m32r_cfc: pcc_set_mem_map: sock(%d)\n", sock); 670 dev_dbg(&s->dev, "pcc_set_mem_map: sock(%d)\n", sock);
684 LOCKED(_pcc_set_mem_map(sock, mem)); 671 LOCKED(_pcc_set_mem_map(sock, mem));
685} 672}
686 673
687static int pcc_init(struct pcmcia_socket *s) 674static int pcc_init(struct pcmcia_socket *s)
688{ 675{
689 debug(3, "m32r_cfc: pcc_init()\n"); 676 dev_dbg(&s->dev, "pcc_init()\n");
690 return 0; 677 return 0;
691} 678}
692 679
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c
index c6524f99ccc3..72844c5a6d05 100644
--- a/drivers/pcmcia/m32r_pcc.c
+++ b/drivers/pcmcia/m32r_pcc.c
@@ -45,16 +45,6 @@
45 45
46#define PCC_DEBUG_DBEX 46#define PCC_DEBUG_DBEX
47 47
48#ifdef CONFIG_PCMCIA_DEBUG
49static int m32r_pcc_debug;
50module_param(m32r_pcc_debug, int, 0644);
51#define debug(lvl, fmt, arg...) do { \
52 if (m32r_pcc_debug > (lvl)) \
53 printk(KERN_DEBUG "m32r_pcc: " fmt , ## arg); \
54} while (0)
55#else
56#define debug(n, args...) do { } while (0)
57#endif
58 48
59/* Poll status interval -- 0 means default to interrupt */ 49/* Poll status interval -- 0 means default to interrupt */
60static int poll_interval = 0; 50static int poll_interval = 0;
@@ -358,7 +348,7 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
358 u_int events, active; 348 u_int events, active;
359 int handled = 0; 349 int handled = 0;
360 350
361 debug(4, "m32r: pcc_interrupt(%d)\n", irq); 351 pr_debug("m32r_pcc: pcc_interrupt(%d)\n", irq);
362 352
363 for (j = 0; j < 20; j++) { 353 for (j = 0; j < 20; j++) {
364 active = 0; 354 active = 0;
@@ -369,13 +359,14 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
369 handled = 1; 359 handled = 1;
370 irc = pcc_get(i, PCIRC); 360 irc = pcc_get(i, PCIRC);
371 irc >>=16; 361 irc >>=16;
372 debug(2, "m32r-pcc:interrupt: socket %d pcirc 0x%02x ", i, irc); 362 pr_debug("m32r_pcc: interrupt: socket %d pcirc 0x%02x ",
363 i, irc);
373 if (!irc) 364 if (!irc)
374 continue; 365 continue;
375 366
376 events = (irc) ? SS_DETECT : 0; 367 events = (irc) ? SS_DETECT : 0;
377 events |= (pcc_get(i,PCCR) & PCCR_PCEN) ? SS_READY : 0; 368 events |= (pcc_get(i,PCCR) & PCCR_PCEN) ? SS_READY : 0;
378 debug(2, " event 0x%02x\n", events); 369 pr_debug("m32r_pcc: event 0x%02x\n", events);
379 370
380 if (events) 371 if (events)
381 pcmcia_parse_events(&socket[i].socket, events); 372 pcmcia_parse_events(&socket[i].socket, events);
@@ -388,7 +379,7 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
388 if (j == 20) 379 if (j == 20)
389 printk(KERN_NOTICE "m32r-pcc: infinite loop in interrupt handler\n"); 380 printk(KERN_NOTICE "m32r-pcc: infinite loop in interrupt handler\n");
390 381
391 debug(4, "m32r-pcc: interrupt done\n"); 382 pr_debug("m32r_pcc: interrupt done\n");
392 383
393 return IRQ_RETVAL(handled); 384 return IRQ_RETVAL(handled);
394} /* pcc_interrupt */ 385} /* pcc_interrupt */
@@ -422,7 +413,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
422 status = pcc_get(sock,PCCSIGCR); 413 status = pcc_get(sock,PCCSIGCR);
423 *value |= (status & PCCSIGCR_VEN) ? SS_POWERON : 0; 414 *value |= (status & PCCSIGCR_VEN) ? SS_POWERON : 0;
424 415
425 debug(3, "m32r-pcc: GetStatus(%d) = %#4.4x\n", sock, *value); 416 pr_debug("m32r_pcc: GetStatus(%d) = %#4.4x\n", sock, *value);
426 return 0; 417 return 0;
427} /* _get_status */ 418} /* _get_status */
428 419
@@ -432,7 +423,7 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
432{ 423{
433 u_long reg = 0; 424 u_long reg = 0;
434 425
435 debug(3, "m32r-pcc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 426 pr_debug("m32r_pcc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
436 "io_irq %d, csc_mask %#2.2x)", sock, state->flags, 427 "io_irq %d, csc_mask %#2.2x)", sock, state->flags,
437 state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 428 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
438 429
@@ -448,11 +439,11 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
448 } 439 }
449 440
450 if (state->flags & SS_RESET) { 441 if (state->flags & SS_RESET) {
451 debug(3, ":RESET\n"); 442 pr_debug("m32r_pcc: :RESET\n");
452 reg |= PCCSIGCR_CRST; 443 reg |= PCCSIGCR_CRST;
453 } 444 }
454 if (state->flags & SS_OUTPUT_ENA){ 445 if (state->flags & SS_OUTPUT_ENA){
455 debug(3, ":OUTPUT_ENA\n"); 446 pr_debug("m32r_pcc: :OUTPUT_ENA\n");
456 /* bit clear */ 447 /* bit clear */
457 } else { 448 } else {
458 reg |= PCCSIGCR_SEN; 449 reg |= PCCSIGCR_SEN;
@@ -460,28 +451,26 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
460 451
461 pcc_set(sock,PCCSIGCR,reg); 452 pcc_set(sock,PCCSIGCR,reg);
462 453
463#ifdef CONFIG_PCMCIA_DEBUG
464 if(state->flags & SS_IOCARD){ 454 if(state->flags & SS_IOCARD){
465 debug(3, ":IOCARD"); 455 pr_debug("m32r_pcc: :IOCARD");
466 } 456 }
467 if (state->flags & SS_PWR_AUTO) { 457 if (state->flags & SS_PWR_AUTO) {
468 debug(3, ":PWR_AUTO"); 458 pr_debug("m32r_pcc: :PWR_AUTO");
469 } 459 }
470 if (state->csc_mask & SS_DETECT) 460 if (state->csc_mask & SS_DETECT)
471 debug(3, ":csc-SS_DETECT"); 461 pr_debug("m32r_pcc: :csc-SS_DETECT");
472 if (state->flags & SS_IOCARD) { 462 if (state->flags & SS_IOCARD) {
473 if (state->csc_mask & SS_STSCHG) 463 if (state->csc_mask & SS_STSCHG)
474 debug(3, ":STSCHG"); 464 pr_debug("m32r_pcc: :STSCHG");
475 } else { 465 } else {
476 if (state->csc_mask & SS_BATDEAD) 466 if (state->csc_mask & SS_BATDEAD)
477 debug(3, ":BATDEAD"); 467 pr_debug("m32r_pcc: :BATDEAD");
478 if (state->csc_mask & SS_BATWARN) 468 if (state->csc_mask & SS_BATWARN)
479 debug(3, ":BATWARN"); 469 pr_debug("m32r_pcc: :BATWARN");
480 if (state->csc_mask & SS_READY) 470 if (state->csc_mask & SS_READY)
481 debug(3, ":READY"); 471 pr_debug("m32r_pcc: :READY");
482 } 472 }
483 debug(3, "\n"); 473 pr_debug("m32r_pcc: \n");
484#endif
485 return 0; 474 return 0;
486} /* _set_socket */ 475} /* _set_socket */
487 476
@@ -491,7 +480,7 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io)
491{ 480{
492 u_char map; 481 u_char map;
493 482
494 debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, " 483 pr_debug("m32r_pcc: SetIOMap(%d, %d, %#2.2x, %d ns, "
495 "%#llx-%#llx)\n", sock, io->map, io->flags, 484 "%#llx-%#llx)\n", sock, io->map, io->flags,
496 io->speed, (unsigned long long)io->start, 485 io->speed, (unsigned long long)io->start,
497 (unsigned long long)io->stop); 486 (unsigned long long)io->stop);
@@ -515,7 +504,7 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem)
515#endif 504#endif
516#endif 505#endif
517 506
518 debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, " 507 pr_debug("m32r_pcc: SetMemMap(%d, %d, %#2.2x, %d ns, "
519 "%#llx, %#x)\n", sock, map, mem->flags, 508 "%#llx, %#x)\n", sock, map, mem->flags,
520 mem->speed, (unsigned long long)mem->static_start, 509 mem->speed, (unsigned long long)mem->static_start,
521 mem->card_start); 510 mem->card_start);
@@ -662,7 +651,7 @@ static int pcc_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
662 651
663static int pcc_init(struct pcmcia_socket *s) 652static int pcc_init(struct pcmcia_socket *s)
664{ 653{
665 debug(4, "m32r-pcc: init call\n"); 654 pr_debug("m32r_pcc: init call\n");
666 return 0; 655 return 0;
667} 656}
668 657
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c
index 403559ba49dd..7f79c4e169ae 100644
--- a/drivers/pcmcia/m8xx_pcmcia.c
+++ b/drivers/pcmcia/m8xx_pcmcia.c
@@ -64,14 +64,6 @@
64#include <pcmcia/cs.h> 64#include <pcmcia/cs.h>
65#include <pcmcia/ss.h> 65#include <pcmcia/ss.h>
66 66
67#ifdef CONFIG_PCMCIA_DEBUG
68static int pc_debug;
69module_param(pc_debug, int, 0);
70#define dprintk(args...) printk(KERN_DEBUG "m8xx_pcmcia: " args);
71#else
72#define dprintk(args...)
73#endif
74
75#define pcmcia_info(args...) printk(KERN_INFO "m8xx_pcmcia: "args) 67#define pcmcia_info(args...) printk(KERN_INFO "m8xx_pcmcia: "args)
76#define pcmcia_error(args...) printk(KERN_ERR "m8xx_pcmcia: "args) 68#define pcmcia_error(args...) printk(KERN_ERR "m8xx_pcmcia: "args)
77 69
@@ -565,7 +557,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
565 unsigned int i, events, pscr, pipr, per; 557 unsigned int i, events, pscr, pipr, per;
566 pcmconf8xx_t *pcmcia = socket[0].pcmcia; 558 pcmconf8xx_t *pcmcia = socket[0].pcmcia;
567 559
568 dprintk("Interrupt!\n"); 560 pr_debug("m8xx_pcmcia: Interrupt!\n");
569 /* get interrupt sources */ 561 /* get interrupt sources */
570 562
571 pscr = in_be32(&pcmcia->pcmc_pscr); 563 pscr = in_be32(&pcmcia->pcmc_pscr);
@@ -614,7 +606,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
614 606
615 /* call the handler */ 607 /* call the handler */
616 608
617 dprintk("slot %u: events = 0x%02x, pscr = 0x%08x, " 609 pr_debug("m8xx_pcmcia: slot %u: events = 0x%02x, pscr = 0x%08x, "
618 "pipr = 0x%08x\n", i, events, pscr, pipr); 610 "pipr = 0x%08x\n", i, events, pscr, pipr);
619 611
620 if (events) { 612 if (events) {
@@ -641,7 +633,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
641 /* clear the interrupt sources */ 633 /* clear the interrupt sources */
642 out_be32(&pcmcia->pcmc_pscr, pscr); 634 out_be32(&pcmcia->pcmc_pscr, pscr);
643 635
644 dprintk("Interrupt done.\n"); 636 pr_debug("m8xx_pcmcia: Interrupt done.\n");
645 637
646 return IRQ_HANDLED; 638 return IRQ_HANDLED;
647} 639}
@@ -815,7 +807,7 @@ static int m8xx_get_status(struct pcmcia_socket *sock, unsigned int *value)
815 }; 807 };
816 } 808 }
817 809
818 dprintk("GetStatus(%d) = %#2.2x\n", lsock, *value); 810 pr_debug("m8xx_pcmcia: GetStatus(%d) = %#2.2x\n", lsock, *value);
819 return 0; 811 return 0;
820} 812}
821 813
@@ -828,7 +820,7 @@ static int m8xx_set_socket(struct pcmcia_socket *sock, socket_state_t * state)
828 unsigned long flags; 820 unsigned long flags;
829 pcmconf8xx_t *pcmcia = socket[0].pcmcia; 821 pcmconf8xx_t *pcmcia = socket[0].pcmcia;
830 822
831 dprintk("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 823 pr_debug("m8xx_pcmcia: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
832 "io_irq %d, csc_mask %#2.2x)\n", lsock, state->flags, 824 "io_irq %d, csc_mask %#2.2x)\n", lsock, state->flags,
833 state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 825 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
834 826
@@ -974,7 +966,7 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
974#define M8XX_SIZE (io->stop - io->start + 1) 966#define M8XX_SIZE (io->stop - io->start + 1)
975#define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start) 967#define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start)
976 968
977 dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, " 969 pr_debug("m8xx_pcmcia: SetIOMap(%d, %d, %#2.2x, %d ns, "
978 "%#4.4llx-%#4.4llx)\n", lsock, io->map, io->flags, 970 "%#4.4llx-%#4.4llx)\n", lsock, io->map, io->flags,
979 io->speed, (unsigned long long)io->start, 971 io->speed, (unsigned long long)io->start,
980 (unsigned long long)io->stop); 972 (unsigned long long)io->stop);
@@ -988,7 +980,7 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
988 980
989 if (io->flags & MAP_ACTIVE) { 981 if (io->flags & MAP_ACTIVE) {
990 982
991 dprintk("io->flags & MAP_ACTIVE\n"); 983 pr_debug("m8xx_pcmcia: io->flags & MAP_ACTIVE\n");
992 984
993 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO) 985 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
994 + (lsock * PCMCIA_IO_WIN_NO) + io->map; 986 + (lsock * PCMCIA_IO_WIN_NO) + io->map;
@@ -1018,8 +1010,8 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
1018 1010
1019 out_be32(&w->or, reg); 1011 out_be32(&w->or, reg);
1020 1012
1021 dprintk("Socket %u: Mapped io window %u at %#8.8x, " 1013 pr_debug("m8xx_pcmcia: Socket %u: Mapped io window %u at "
1022 "OR = %#8.8x.\n", lsock, io->map, w->br, w->or); 1014 "%#8.8x, OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
1023 } else { 1015 } else {
1024 /* shutdown IO window */ 1016 /* shutdown IO window */
1025 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO) 1017 winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
@@ -1033,14 +1025,14 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
1033 out_be32(&w->or, 0); /* turn off window */ 1025 out_be32(&w->or, 0); /* turn off window */
1034 out_be32(&w->br, 0); /* turn off base address */ 1026 out_be32(&w->br, 0); /* turn off base address */
1035 1027
1036 dprintk("Socket %u: Unmapped io window %u at %#8.8x, " 1028 pr_debug("m8xx_pcmcia: Socket %u: Unmapped io window %u at "
1037 "OR = %#8.8x.\n", lsock, io->map, w->br, w->or); 1029 "%#8.8x, OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
1038 } 1030 }
1039 1031
1040 /* copy the struct and modify the copy */ 1032 /* copy the struct and modify the copy */
1041 s->io_win[io->map] = *io; 1033 s->io_win[io->map] = *io;
1042 s->io_win[io->map].flags &= (MAP_WRPROT | MAP_16BIT | MAP_ACTIVE); 1034 s->io_win[io->map].flags &= (MAP_WRPROT | MAP_16BIT | MAP_ACTIVE);
1043 dprintk("SetIOMap exit\n"); 1035 pr_debug("m8xx_pcmcia: SetIOMap exit\n");
1044 1036
1045 return 0; 1037 return 0;
1046} 1038}
@@ -1055,7 +1047,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
1055 unsigned int reg, winnr; 1047 unsigned int reg, winnr;
1056 pcmconf8xx_t *pcmcia = s->pcmcia; 1048 pcmconf8xx_t *pcmcia = s->pcmcia;
1057 1049
1058 dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " 1050 pr_debug("m8xx_pcmcia: SetMemMap(%d, %d, %#2.2x, %d ns, "
1059 "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, 1051 "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags,
1060 mem->speed, (unsigned long long)mem->static_start, 1052 mem->speed, (unsigned long long)mem->static_start,
1061 mem->card_start); 1053 mem->card_start);
@@ -1098,7 +1090,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
1098 1090
1099 out_be32(&w->or, reg); 1091 out_be32(&w->or, reg);
1100 1092
1101 dprintk("Socket %u: Mapped memory window %u at %#8.8x, " 1093 pr_debug("m8xx_pcmcia: Socket %u: Mapped memory window %u at %#8.8x, "
1102 "OR = %#8.8x.\n", lsock, mem->map, w->br, w->or); 1094 "OR = %#8.8x.\n", lsock, mem->map, w->br, w->or);
1103 1095
1104 if (mem->flags & MAP_ACTIVE) { 1096 if (mem->flags & MAP_ACTIVE) {
@@ -1108,7 +1100,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
1108 + mem->card_start; 1100 + mem->card_start;
1109 } 1101 }
1110 1102
1111 dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " 1103 pr_debug("m8xx_pcmcia: SetMemMap(%d, %d, %#2.2x, %d ns, "
1112 "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, 1104 "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags,
1113 mem->speed, (unsigned long long)mem->static_start, 1105 mem->speed, (unsigned long long)mem->static_start,
1114 mem->card_start); 1106 mem->card_start);
@@ -1129,7 +1121,7 @@ static int m8xx_sock_init(struct pcmcia_socket *sock)
1129 pccard_io_map io = { 0, 0, 0, 0, 1 }; 1121 pccard_io_map io = { 0, 0, 0, 0, 1 };
1130 pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 }; 1122 pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
1131 1123
1132 dprintk("sock_init(%d)\n", s); 1124 pr_debug("m8xx_pcmcia: sock_init(%d)\n", s);
1133 1125
1134 m8xx_set_socket(sock, &dead_socket); 1126 m8xx_set_socket(sock, &dead_socket);
1135 for (i = 0; i < PCMCIA_IO_WIN_NO; i++) { 1127 for (i = 0; i < PCMCIA_IO_WIN_NO; i++) {
diff --git a/drivers/pcmcia/o2micro.h b/drivers/pcmcia/o2micro.h
index 72188c462c9c..624442fc0d35 100644
--- a/drivers/pcmcia/o2micro.h
+++ b/drivers/pcmcia/o2micro.h
@@ -30,28 +30,6 @@
30#ifndef _LINUX_O2MICRO_H 30#ifndef _LINUX_O2MICRO_H
31#define _LINUX_O2MICRO_H 31#define _LINUX_O2MICRO_H
32 32
33#ifndef PCI_VENDOR_ID_O2
34#define PCI_VENDOR_ID_O2 0x1217
35#endif
36#ifndef PCI_DEVICE_ID_O2_6729
37#define PCI_DEVICE_ID_O2_6729 0x6729
38#endif
39#ifndef PCI_DEVICE_ID_O2_6730
40#define PCI_DEVICE_ID_O2_6730 0x673a
41#endif
42#ifndef PCI_DEVICE_ID_O2_6832
43#define PCI_DEVICE_ID_O2_6832 0x6832
44#endif
45#ifndef PCI_DEVICE_ID_O2_6836
46#define PCI_DEVICE_ID_O2_6836 0x6836
47#endif
48#ifndef PCI_DEVICE_ID_O2_6812
49#define PCI_DEVICE_ID_O2_6812 0x6872
50#endif
51#ifndef PCI_DEVICE_ID_O2_6933
52#define PCI_DEVICE_ID_O2_6933 0x6933
53#endif
54
55/* Additional PCI configuration registers */ 33/* Additional PCI configuration registers */
56 34
57#define O2_MUX_CONTROL 0x90 /* 32 bit */ 35#define O2_MUX_CONTROL 0x90 /* 32 bit */
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c
index 30cf71d2ee23..c4d7908fa37f 100644
--- a/drivers/pcmcia/pcmcia_ioctl.c
+++ b/drivers/pcmcia/pcmcia_ioctl.c
@@ -58,17 +58,6 @@ typedef struct user_info_t {
58} user_info_t; 58} user_info_t;
59 59
60 60
61#ifdef CONFIG_PCMCIA_DEBUG
62extern int ds_pc_debug;
63
64#define ds_dbg(lvl, fmt, arg...) do { \
65 if (ds_pc_debug >= lvl) \
66 printk(KERN_DEBUG "ds: " fmt , ## arg); \
67} while (0)
68#else
69#define ds_dbg(lvl, fmt, arg...) do { } while (0)
70#endif
71
72static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s, 61static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s,
73 unsigned int function) 62 unsigned int function)
74{ 63{
@@ -229,6 +218,61 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
229 return (ret); 218 return (ret);
230} 219}
231 220
221
222/** pcmcia_get_window
223 */
224static int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *wh_out,
225 window_handle_t wh, win_req_t *req)
226{
227 pccard_mem_map *win;
228 window_handle_t w;
229
230 wh--;
231 if (!s || !(s->state & SOCKET_PRESENT))
232 return -ENODEV;
233 if (wh >= MAX_WIN)
234 return -EINVAL;
235 for (w = wh; w < MAX_WIN; w++)
236 if (s->state & SOCKET_WIN_REQ(w))
237 break;
238 if (w == MAX_WIN)
239 return -EINVAL;
240 win = &s->win[w];
241 req->Base = win->res->start;
242 req->Size = win->res->end - win->res->start + 1;
243 req->AccessSpeed = win->speed;
244 req->Attributes = 0;
245 if (win->flags & MAP_ATTRIB)
246 req->Attributes |= WIN_MEMORY_TYPE_AM;
247 if (win->flags & MAP_ACTIVE)
248 req->Attributes |= WIN_ENABLE;
249 if (win->flags & MAP_16BIT)
250 req->Attributes |= WIN_DATA_WIDTH_16;
251 if (win->flags & MAP_USE_WAIT)
252 req->Attributes |= WIN_USE_WAIT;
253
254 *wh_out = w + 1;
255 return 0;
256} /* pcmcia_get_window */
257
258
259/** pcmcia_get_mem_page
260 *
261 * Change the card address of an already open memory window.
262 */
263static int pcmcia_get_mem_page(struct pcmcia_socket *skt, window_handle_t wh,
264 memreq_t *req)
265{
266 wh--;
267 if (wh >= MAX_WIN)
268 return -EINVAL;
269
270 req->Page = 0;
271 req->CardOffset = skt->win[wh].card_start;
272 return 0;
273} /* pcmcia_get_mem_page */
274
275
232/** pccard_get_status 276/** pccard_get_status
233 * 277 *
234 * Get the current socket state bits. We don't support the latched 278 * Get the current socket state bits. We don't support the latched
@@ -431,7 +475,7 @@ static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
431 if (!s) 475 if (!s)
432 return -EINVAL; 476 return -EINVAL;
433 477
434 ds_dbg(2, "bind_request(%d, '%s')\n", s->sock, 478 pr_debug("bind_request(%d, '%s')\n", s->sock,
435 (char *)bind_info->dev_info); 479 (char *)bind_info->dev_info);
436 480
437 p_drv = get_pcmcia_driver(&bind_info->dev_info); 481 p_drv = get_pcmcia_driver(&bind_info->dev_info);
@@ -623,7 +667,7 @@ static int ds_open(struct inode *inode, struct file *file)
623 static int warning_printed = 0; 667 static int warning_printed = 0;
624 int ret = 0; 668 int ret = 0;
625 669
626 ds_dbg(0, "ds_open(socket %d)\n", i); 670 pr_debug("ds_open(socket %d)\n", i);
627 671
628 lock_kernel(); 672 lock_kernel();
629 s = pcmcia_get_socket_by_nr(i); 673 s = pcmcia_get_socket_by_nr(i);
@@ -685,7 +729,7 @@ static int ds_release(struct inode *inode, struct file *file)
685 struct pcmcia_socket *s; 729 struct pcmcia_socket *s;
686 user_info_t *user, **link; 730 user_info_t *user, **link;
687 731
688 ds_dbg(0, "ds_release(socket %d)\n", iminor(inode)); 732 pr_debug("ds_release(socket %d)\n", iminor(inode));
689 733
690 user = file->private_data; 734 user = file->private_data;
691 if (CHECK_USER(user)) 735 if (CHECK_USER(user))
@@ -719,7 +763,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
719 user_info_t *user; 763 user_info_t *user;
720 int ret; 764 int ret;
721 765
722 ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode)); 766 pr_debug("ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
723 767
724 if (count < 4) 768 if (count < 4)
725 return -EINVAL; 769 return -EINVAL;
@@ -744,7 +788,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
744static ssize_t ds_write(struct file *file, const char __user *buf, 788static ssize_t ds_write(struct file *file, const char __user *buf,
745 size_t count, loff_t *ppos) 789 size_t count, loff_t *ppos)
746{ 790{
747 ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode)); 791 pr_debug("ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
748 792
749 if (count != 4) 793 if (count != 4)
750 return -EINVAL; 794 return -EINVAL;
@@ -762,7 +806,7 @@ static u_int ds_poll(struct file *file, poll_table *wait)
762 struct pcmcia_socket *s; 806 struct pcmcia_socket *s;
763 user_info_t *user; 807 user_info_t *user;
764 808
765 ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode)); 809 pr_debug("ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
766 810
767 user = file->private_data; 811 user = file->private_data;
768 if (CHECK_USER(user)) 812 if (CHECK_USER(user))
@@ -790,7 +834,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
790 ds_ioctl_arg_t *buf; 834 ds_ioctl_arg_t *buf;
791 user_info_t *user; 835 user_info_t *user;
792 836
793 ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg); 837 pr_debug("ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
794 838
795 user = file->private_data; 839 user = file->private_data;
796 if (CHECK_USER(user)) 840 if (CHECK_USER(user))
@@ -809,13 +853,13 @@ static int ds_ioctl(struct inode * inode, struct file * file,
809 853
810 if (cmd & IOC_IN) { 854 if (cmd & IOC_IN) {
811 if (!access_ok(VERIFY_READ, uarg, size)) { 855 if (!access_ok(VERIFY_READ, uarg, size)) {
812 ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT); 856 pr_debug("ds_ioctl(): verify_read = %d\n", -EFAULT);
813 return -EFAULT; 857 return -EFAULT;
814 } 858 }
815 } 859 }
816 if (cmd & IOC_OUT) { 860 if (cmd & IOC_OUT) {
817 if (!access_ok(VERIFY_WRITE, uarg, size)) { 861 if (!access_ok(VERIFY_WRITE, uarg, size)) {
818 ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT); 862 pr_debug("ds_ioctl(): verify_write = %d\n", -EFAULT);
819 return -EFAULT; 863 return -EFAULT;
820 } 864 }
821 } 865 }
@@ -927,15 +971,15 @@ static int ds_ioctl(struct inode * inode, struct file * file,
927 goto free_out; 971 goto free_out;
928 break; 972 break;
929 case DS_GET_FIRST_WINDOW: 973 case DS_GET_FIRST_WINDOW:
930 ret = pcmcia_get_window(s, &buf->win_info.handle, 0, 974 ret = pcmcia_get_window(s, &buf->win_info.handle, 1,
931 &buf->win_info.window); 975 &buf->win_info.window);
932 break; 976 break;
933 case DS_GET_NEXT_WINDOW: 977 case DS_GET_NEXT_WINDOW:
934 ret = pcmcia_get_window(s, &buf->win_info.handle, 978 ret = pcmcia_get_window(s, &buf->win_info.handle,
935 buf->win_info.handle->index + 1, &buf->win_info.window); 979 buf->win_info.handle + 1, &buf->win_info.window);
936 break; 980 break;
937 case DS_GET_MEM_PAGE: 981 case DS_GET_MEM_PAGE:
938 ret = pcmcia_get_mem_page(buf->win_info.handle, 982 ret = pcmcia_get_mem_page(s, buf->win_info.handle,
939 &buf->win_info.map); 983 &buf->win_info.map);
940 break; 984 break;
941 case DS_REPLACE_CIS: 985 case DS_REPLACE_CIS:
@@ -962,7 +1006,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
962 } 1006 }
963 1007
964 if ((err == 0) && (ret != 0)) { 1008 if ((err == 0) && (ret != 0)) {
965 ds_dbg(2, "ds_ioctl: ret = %d\n", ret); 1009 pr_debug("ds_ioctl: ret = %d\n", ret);
966 switch (ret) { 1010 switch (ret) {
967 case -ENODEV: 1011 case -ENODEV:
968 case -EINVAL: 1012 case -EINVAL:
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index d919e96c0afd..a8bf8c1b45ed 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -20,6 +20,7 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/pci.h> 21#include <linux/pci.h>
22#include <linux/device.h> 22#include <linux/device.h>
23#include <linux/netdevice.h>
23 24
24#include <pcmcia/cs_types.h> 25#include <pcmcia/cs_types.h>
25#include <pcmcia/ss.h> 26#include <pcmcia/ss.h>
@@ -43,21 +44,6 @@ static u8 pcmcia_used_irq[NR_IRQS];
43#endif 44#endif
44 45
45 46
46#ifdef CONFIG_PCMCIA_DEBUG
47extern int ds_pc_debug;
48
49#define ds_dbg(skt, lvl, fmt, arg...) do { \
50 if (ds_pc_debug >= lvl) \
51 dev_printk(KERN_DEBUG, &skt->dev, \
52 "pcmcia_resource: " fmt, \
53 ## arg); \
54} while (0)
55#else
56#define ds_dbg(skt, lvl, fmt, arg...) do { } while (0)
57#endif
58
59
60
61/** alloc_io_space 47/** alloc_io_space
62 * 48 *
63 * Special stuff for managing IO windows, because they are scarce 49 * Special stuff for managing IO windows, because they are scarce
@@ -72,14 +58,14 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr,
72 align = (*base) ? (lines ? 1<<lines : 0) : 1; 58 align = (*base) ? (lines ? 1<<lines : 0) : 1;
73 if (align && (align < num)) { 59 if (align && (align < num)) {
74 if (*base) { 60 if (*base) {
75 ds_dbg(s, 0, "odd IO request: num %#x align %#x\n", 61 dev_dbg(&s->dev, "odd IO request: num %#x align %#x\n",
76 num, align); 62 num, align);
77 align = 0; 63 align = 0;
78 } else 64 } else
79 while (align && (align < num)) align <<= 1; 65 while (align && (align < num)) align <<= 1;
80 } 66 }
81 if (*base & ~(align-1)) { 67 if (*base & ~(align-1)) {
82 ds_dbg(s, 0, "odd IO request: base %#x align %#x\n", 68 dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
83 *base, align); 69 *base, align);
84 align = 0; 70 align = 0;
85 } 71 }
@@ -173,8 +159,10 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
173 s = p_dev->socket; 159 s = p_dev->socket;
174 c = p_dev->function_config; 160 c = p_dev->function_config;
175 161
176 if (!(c->state & CONFIG_LOCKED)) 162 if (!(c->state & CONFIG_LOCKED)) {
163 dev_dbg(&s->dev, "Configuration isnt't locked\n");
177 return -EACCES; 164 return -EACCES;
165 }
178 166
179 addr = (c->ConfigBase + reg->Offset) >> 1; 167 addr = (c->ConfigBase + reg->Offset) >> 1;
180 168
@@ -188,6 +176,7 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
188 pcmcia_write_cis_mem(s, 1, addr, 1, &val); 176 pcmcia_write_cis_mem(s, 1, addr, 1, &val);
189 break; 177 break;
190 default: 178 default:
179 dev_dbg(&s->dev, "Invalid conf register request\n");
191 return -EINVAL; 180 return -EINVAL;
192 break; 181 break;
193 } 182 }
@@ -196,68 +185,21 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
196EXPORT_SYMBOL(pcmcia_access_configuration_register); 185EXPORT_SYMBOL(pcmcia_access_configuration_register);
197 186
198 187
199/** pcmcia_get_window 188int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh,
200 */ 189 memreq_t *req)
201int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle,
202 int idx, win_req_t *req)
203{
204 window_t *win;
205 int w;
206
207 if (!s || !(s->state & SOCKET_PRESENT))
208 return -ENODEV;
209 for (w = idx; w < MAX_WIN; w++)
210 if (s->state & SOCKET_WIN_REQ(w))
211 break;
212 if (w == MAX_WIN)
213 return -EINVAL;
214 win = &s->win[w];
215 req->Base = win->ctl.res->start;
216 req->Size = win->ctl.res->end - win->ctl.res->start + 1;
217 req->AccessSpeed = win->ctl.speed;
218 req->Attributes = 0;
219 if (win->ctl.flags & MAP_ATTRIB)
220 req->Attributes |= WIN_MEMORY_TYPE_AM;
221 if (win->ctl.flags & MAP_ACTIVE)
222 req->Attributes |= WIN_ENABLE;
223 if (win->ctl.flags & MAP_16BIT)
224 req->Attributes |= WIN_DATA_WIDTH_16;
225 if (win->ctl.flags & MAP_USE_WAIT)
226 req->Attributes |= WIN_USE_WAIT;
227 *handle = win;
228 return 0;
229} /* pcmcia_get_window */
230EXPORT_SYMBOL(pcmcia_get_window);
231
232
233/** pcmcia_get_mem_page
234 *
235 * Change the card address of an already open memory window.
236 */
237int pcmcia_get_mem_page(window_handle_t win, memreq_t *req)
238{ 190{
239 if ((win == NULL) || (win->magic != WINDOW_MAGIC)) 191 struct pcmcia_socket *s = p_dev->socket;
240 return -EINVAL;
241 req->Page = 0;
242 req->CardOffset = win->ctl.card_start;
243 return 0;
244} /* pcmcia_get_mem_page */
245EXPORT_SYMBOL(pcmcia_get_mem_page);
246
247 192
248int pcmcia_map_mem_page(window_handle_t win, memreq_t *req) 193 wh--;
249{ 194 if (wh >= MAX_WIN)
250 struct pcmcia_socket *s;
251 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
252 return -EINVAL; 195 return -EINVAL;
253 s = win->sock;
254 if (req->Page != 0) { 196 if (req->Page != 0) {
255 ds_dbg(s, 0, "failure: requested page is zero\n"); 197 dev_dbg(&s->dev, "failure: requested page is zero\n");
256 return -EINVAL; 198 return -EINVAL;
257 } 199 }
258 win->ctl.card_start = req->CardOffset; 200 s->win[wh].card_start = req->CardOffset;
259 if (s->ops->set_mem_map(s, &win->ctl) != 0) { 201 if (s->ops->set_mem_map(s, &s->win[wh]) != 0) {
260 ds_dbg(s, 0, "failed to set_mem_map\n"); 202 dev_dbg(&s->dev, "failed to set_mem_map\n");
261 return -EIO; 203 return -EIO;
262 } 204 }
263 return 0; 205 return 0;
@@ -278,10 +220,14 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
278 s = p_dev->socket; 220 s = p_dev->socket;
279 c = p_dev->function_config; 221 c = p_dev->function_config;
280 222
281 if (!(s->state & SOCKET_PRESENT)) 223 if (!(s->state & SOCKET_PRESENT)) {
224 dev_dbg(&s->dev, "No card present\n");
282 return -ENODEV; 225 return -ENODEV;
283 if (!(c->state & CONFIG_LOCKED)) 226 }
227 if (!(c->state & CONFIG_LOCKED)) {
228 dev_dbg(&s->dev, "Configuration isnt't locked\n");
284 return -EACCES; 229 return -EACCES;
230 }
285 231
286 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) { 232 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
287 if (mod->Attributes & CONF_ENABLE_IRQ) { 233 if (mod->Attributes & CONF_ENABLE_IRQ) {
@@ -295,7 +241,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
295 } 241 }
296 242
297 if (mod->Attributes & CONF_VCC_CHANGE_VALID) { 243 if (mod->Attributes & CONF_VCC_CHANGE_VALID) {
298 ds_dbg(s, 0, "changing Vcc is not allowed at this time\n"); 244 dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n");
299 return -EINVAL; 245 return -EINVAL;
300 } 246 }
301 247
@@ -303,7 +249,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
303 if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) && 249 if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
304 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { 250 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
305 if (mod->Vpp1 != mod->Vpp2) { 251 if (mod->Vpp1 != mod->Vpp2) {
306 ds_dbg(s, 0, "Vpp1 and Vpp2 must be the same\n"); 252 dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n");
307 return -EINVAL; 253 return -EINVAL;
308 } 254 }
309 s->socket.Vpp = mod->Vpp1; 255 s->socket.Vpp = mod->Vpp1;
@@ -314,7 +260,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
314 } 260 }
315 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || 261 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
316 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { 262 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
317 ds_dbg(s, 0, "changing Vcc is not allowed at this time\n"); 263 dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n");
318 return -EINVAL; 264 return -EINVAL;
319 } 265 }
320 266
@@ -425,11 +371,11 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
425 if (c->state & CONFIG_LOCKED) 371 if (c->state & CONFIG_LOCKED)
426 return -EACCES; 372 return -EACCES;
427 if (c->irq.Attributes != req->Attributes) { 373 if (c->irq.Attributes != req->Attributes) {
428 ds_dbg(s, 0, "IRQ attributes must match assigned ones\n"); 374 dev_dbg(&s->dev, "IRQ attributes must match assigned ones\n");
429 return -EINVAL; 375 return -EINVAL;
430 } 376 }
431 if (s->irq.AssignedIRQ != req->AssignedIRQ) { 377 if (s->irq.AssignedIRQ != req->AssignedIRQ) {
432 ds_dbg(s, 0, "IRQ must match assigned one\n"); 378 dev_dbg(&s->dev, "IRQ must match assigned one\n");
433 return -EINVAL; 379 return -EINVAL;
434 } 380 }
435 if (--s->irq.Config == 0) { 381 if (--s->irq.Config == 0) {
@@ -437,8 +383,8 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
437 s->irq.AssignedIRQ = 0; 383 s->irq.AssignedIRQ = 0;
438 } 384 }
439 385
440 if (req->Attributes & IRQ_HANDLE_PRESENT) { 386 if (req->Handler) {
441 free_irq(req->AssignedIRQ, req->Instance); 387 free_irq(req->AssignedIRQ, p_dev->priv);
442 } 388 }
443 389
444#ifdef CONFIG_PCMCIA_PROBE 390#ifdef CONFIG_PCMCIA_PROBE
@@ -449,30 +395,34 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
449} /* pcmcia_release_irq */ 395} /* pcmcia_release_irq */
450 396
451 397
452int pcmcia_release_window(window_handle_t win) 398int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
453{ 399{
454 struct pcmcia_socket *s; 400 struct pcmcia_socket *s = p_dev->socket;
401 pccard_mem_map *win;
455 402
456 if ((win == NULL) || (win->magic != WINDOW_MAGIC)) 403 wh--;
404 if (wh >= MAX_WIN)
457 return -EINVAL; 405 return -EINVAL;
458 s = win->sock; 406
459 if (!(win->handle->_win & CLIENT_WIN_REQ(win->index))) 407 win = &s->win[wh];
408
409 if (!(p_dev->_win & CLIENT_WIN_REQ(wh))) {
410 dev_dbg(&s->dev, "not releasing unknown window\n");
460 return -EINVAL; 411 return -EINVAL;
412 }
461 413
462 /* Shut down memory window */ 414 /* Shut down memory window */
463 win->ctl.flags &= ~MAP_ACTIVE; 415 win->flags &= ~MAP_ACTIVE;
464 s->ops->set_mem_map(s, &win->ctl); 416 s->ops->set_mem_map(s, win);
465 s->state &= ~SOCKET_WIN_REQ(win->index); 417 s->state &= ~SOCKET_WIN_REQ(wh);
466 418
467 /* Release system memory */ 419 /* Release system memory */
468 if (win->ctl.res) { 420 if (win->res) {
469 release_resource(win->ctl.res); 421 release_resource(win->res);
470 kfree(win->ctl.res); 422 kfree(win->res);
471 win->ctl.res = NULL; 423 win->res = NULL;
472 } 424 }
473 win->handle->_win &= ~CLIENT_WIN_REQ(win->index); 425 p_dev->_win &= ~CLIENT_WIN_REQ(wh);
474
475 win->magic = 0;
476 426
477 return 0; 427 return 0;
478} /* pcmcia_release_window */ 428} /* pcmcia_release_window */
@@ -492,12 +442,14 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
492 return -ENODEV; 442 return -ENODEV;
493 443
494 if (req->IntType & INT_CARDBUS) { 444 if (req->IntType & INT_CARDBUS) {
495 ds_dbg(p_dev->socket, 0, "IntType may not be INT_CARDBUS\n"); 445 dev_dbg(&s->dev, "IntType may not be INT_CARDBUS\n");
496 return -EINVAL; 446 return -EINVAL;
497 } 447 }
498 c = p_dev->function_config; 448 c = p_dev->function_config;
499 if (c->state & CONFIG_LOCKED) 449 if (c->state & CONFIG_LOCKED) {
450 dev_dbg(&s->dev, "Configuration is locked\n");
500 return -EACCES; 451 return -EACCES;
452 }
501 453
502 /* Do power control. We don't allow changes in Vcc. */ 454 /* Do power control. We don't allow changes in Vcc. */
503 s->socket.Vpp = req->Vpp; 455 s->socket.Vpp = req->Vpp;
@@ -609,40 +561,44 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
609 struct pcmcia_socket *s = p_dev->socket; 561 struct pcmcia_socket *s = p_dev->socket;
610 config_t *c; 562 config_t *c;
611 563
612 if (!(s->state & SOCKET_PRESENT)) 564 if (!(s->state & SOCKET_PRESENT)) {
565 dev_dbg(&s->dev, "No card present\n");
613 return -ENODEV; 566 return -ENODEV;
567 }
614 568
615 if (!req) 569 if (!req)
616 return -EINVAL; 570 return -EINVAL;
617 c = p_dev->function_config; 571 c = p_dev->function_config;
618 if (c->state & CONFIG_LOCKED) 572 if (c->state & CONFIG_LOCKED) {
573 dev_dbg(&s->dev, "Configuration is locked\n");
619 return -EACCES; 574 return -EACCES;
575 }
620 if (c->state & CONFIG_IO_REQ) { 576 if (c->state & CONFIG_IO_REQ) {
621 ds_dbg(s, 0, "IO already configured\n"); 577 dev_dbg(&s->dev, "IO already configured\n");
622 return -EBUSY; 578 return -EBUSY;
623 } 579 }
624 if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)) { 580 if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)) {
625 ds_dbg(s, 0, "bad attribute setting for IO region 1\n"); 581 dev_dbg(&s->dev, "bad attribute setting for IO region 1\n");
626 return -EINVAL; 582 return -EINVAL;
627 } 583 }
628 if ((req->NumPorts2 > 0) && 584 if ((req->NumPorts2 > 0) &&
629 (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))) { 585 (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))) {
630 ds_dbg(s, 0, "bad attribute setting for IO region 2\n"); 586 dev_dbg(&s->dev, "bad attribute setting for IO region 2\n");
631 return -EINVAL; 587 return -EINVAL;
632 } 588 }
633 589
634 ds_dbg(s, 1, "trying to allocate resource 1\n"); 590 dev_dbg(&s->dev, "trying to allocate resource 1\n");
635 if (alloc_io_space(s, req->Attributes1, &req->BasePort1, 591 if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
636 req->NumPorts1, req->IOAddrLines)) { 592 req->NumPorts1, req->IOAddrLines)) {
637 ds_dbg(s, 0, "allocation of resource 1 failed\n"); 593 dev_dbg(&s->dev, "allocation of resource 1 failed\n");
638 return -EBUSY; 594 return -EBUSY;
639 } 595 }
640 596
641 if (req->NumPorts2) { 597 if (req->NumPorts2) {
642 ds_dbg(s, 1, "trying to allocate resource 2\n"); 598 dev_dbg(&s->dev, "trying to allocate resource 2\n");
643 if (alloc_io_space(s, req->Attributes2, &req->BasePort2, 599 if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
644 req->NumPorts2, req->IOAddrLines)) { 600 req->NumPorts2, req->IOAddrLines)) {
645 ds_dbg(s, 0, "allocation of resource 2 failed\n"); 601 dev_dbg(&s->dev, "allocation of resource 2 failed\n");
646 release_io_space(s, req->BasePort1, req->NumPorts1); 602 release_io_space(s, req->BasePort1, req->NumPorts1);
647 return -EBUSY; 603 return -EBUSY;
648 } 604 }
@@ -680,13 +636,17 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
680 int ret = -EINVAL, irq = 0; 636 int ret = -EINVAL, irq = 0;
681 int type; 637 int type;
682 638
683 if (!(s->state & SOCKET_PRESENT)) 639 if (!(s->state & SOCKET_PRESENT)) {
640 dev_dbg(&s->dev, "No card present\n");
684 return -ENODEV; 641 return -ENODEV;
642 }
685 c = p_dev->function_config; 643 c = p_dev->function_config;
686 if (c->state & CONFIG_LOCKED) 644 if (c->state & CONFIG_LOCKED) {
645 dev_dbg(&s->dev, "Configuration is locked\n");
687 return -EACCES; 646 return -EACCES;
647 }
688 if (c->state & CONFIG_IRQ_REQ) { 648 if (c->state & CONFIG_IRQ_REQ) {
689 ds_dbg(s, 0, "IRQ already configured\n"); 649 dev_dbg(&s->dev, "IRQ already configured\n");
690 return -EBUSY; 650 return -EBUSY;
691 } 651 }
692 652
@@ -704,7 +664,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
704 /* if the underlying IRQ infrastructure allows for it, only allocate 664 /* if the underlying IRQ infrastructure allows for it, only allocate
705 * the IRQ, but do not enable it 665 * the IRQ, but do not enable it
706 */ 666 */
707 if (!(req->Attributes & IRQ_HANDLE_PRESENT)) 667 if (!(req->Handler))
708 type |= IRQ_NOAUTOEN; 668 type |= IRQ_NOAUTOEN;
709#endif /* IRQ_NOAUTOEN */ 669#endif /* IRQ_NOAUTOEN */
710 670
@@ -714,7 +674,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
714 } else { 674 } else {
715 int try; 675 int try;
716 u32 mask = s->irq_mask; 676 u32 mask = s->irq_mask;
717 void *data = &p_dev->dev.driver; /* something unique to this device */ 677 void *data = p_dev; /* something unique to this device */
718 678
719 for (try = 0; try < 64; try++) { 679 for (try = 0; try < 64; try++) {
720 irq = try % 32; 680 irq = try % 32;
@@ -731,12 +691,12 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
731 * registering a dummy handle works, i.e. if the IRQ isn't 691 * registering a dummy handle works, i.e. if the IRQ isn't
732 * marked as used by the kernel resource management core */ 692 * marked as used by the kernel resource management core */
733 ret = request_irq(irq, 693 ret = request_irq(irq,
734 (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action, 694 (req->Handler) ? req->Handler : test_action,
735 type, 695 type,
736 p_dev->devname, 696 p_dev->devname,
737 (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data); 697 (req->Handler) ? p_dev->priv : data);
738 if (!ret) { 698 if (!ret) {
739 if (!(req->Attributes & IRQ_HANDLE_PRESENT)) 699 if (!req->Handler)
740 free_irq(irq, data); 700 free_irq(irq, data);
741 break; 701 break;
742 } 702 }
@@ -745,17 +705,22 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
745#endif 705#endif
746 /* only assign PCI irq if no IRQ already assigned */ 706 /* only assign PCI irq if no IRQ already assigned */
747 if (ret && !s->irq.AssignedIRQ) { 707 if (ret && !s->irq.AssignedIRQ) {
748 if (!s->pci_irq) 708 if (!s->pci_irq) {
709 dev_printk(KERN_INFO, &s->dev, "no IRQ found\n");
749 return ret; 710 return ret;
711 }
750 type = IRQF_SHARED; 712 type = IRQF_SHARED;
751 irq = s->pci_irq; 713 irq = s->pci_irq;
752 } 714 }
753 715
754 if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) { 716 if (ret && req->Handler) {
755 ret = request_irq(irq, req->Handler, type, 717 ret = request_irq(irq, req->Handler, type,
756 p_dev->devname, req->Instance); 718 p_dev->devname, p_dev->priv);
757 if (ret) 719 if (ret) {
720 dev_printk(KERN_INFO, &s->dev,
721 "request_irq() failed\n");
758 return ret; 722 return ret;
723 }
759 } 724 }
760 725
761 /* Make sure the fact the request type was overridden is passed back */ 726 /* Make sure the fact the request type was overridden is passed back */
@@ -787,17 +752,19 @@ EXPORT_SYMBOL(pcmcia_request_irq);
787 * Request_window() establishes a mapping between card memory space 752 * Request_window() establishes a mapping between card memory space
788 * and system memory space. 753 * and system memory space.
789 */ 754 */
790int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_handle_t *wh) 755int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_handle_t *wh)
791{ 756{
792 struct pcmcia_socket *s = (*p_dev)->socket; 757 struct pcmcia_socket *s = p_dev->socket;
793 window_t *win; 758 pccard_mem_map *win;
794 u_long align; 759 u_long align;
795 int w; 760 int w;
796 761
797 if (!(s->state & SOCKET_PRESENT)) 762 if (!(s->state & SOCKET_PRESENT)) {
763 dev_dbg(&s->dev, "No card present\n");
798 return -ENODEV; 764 return -ENODEV;
765 }
799 if (req->Attributes & (WIN_PAGED | WIN_SHARED)) { 766 if (req->Attributes & (WIN_PAGED | WIN_SHARED)) {
800 ds_dbg(s, 0, "bad attribute setting for iomem region\n"); 767 dev_dbg(&s->dev, "bad attribute setting for iomem region\n");
801 return -EINVAL; 768 return -EINVAL;
802 } 769 }
803 770
@@ -808,12 +775,12 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h
808 (req->Attributes & WIN_STRICT_ALIGN)) ? 775 (req->Attributes & WIN_STRICT_ALIGN)) ?
809 req->Size : s->map_size); 776 req->Size : s->map_size);
810 if (req->Size & (s->map_size-1)) { 777 if (req->Size & (s->map_size-1)) {
811 ds_dbg(s, 0, "invalid map size\n"); 778 dev_dbg(&s->dev, "invalid map size\n");
812 return -EINVAL; 779 return -EINVAL;
813 } 780 }
814 if ((req->Base && (s->features & SS_CAP_STATIC_MAP)) || 781 if ((req->Base && (s->features & SS_CAP_STATIC_MAP)) ||
815 (req->Base & (align-1))) { 782 (req->Base & (align-1))) {
816 ds_dbg(s, 0, "invalid base address\n"); 783 dev_dbg(&s->dev, "invalid base address\n");
817 return -EINVAL; 784 return -EINVAL;
818 } 785 }
819 if (req->Base) 786 if (req->Base)
@@ -823,52 +790,48 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h
823 for (w = 0; w < MAX_WIN; w++) 790 for (w = 0; w < MAX_WIN; w++)
824 if (!(s->state & SOCKET_WIN_REQ(w))) break; 791 if (!(s->state & SOCKET_WIN_REQ(w))) break;
825 if (w == MAX_WIN) { 792 if (w == MAX_WIN) {
826 ds_dbg(s, 0, "all windows are used already\n"); 793 dev_dbg(&s->dev, "all windows are used already\n");
827 return -EINVAL; 794 return -EINVAL;
828 } 795 }
829 796
830 win = &s->win[w]; 797 win = &s->win[w];
831 win->magic = WINDOW_MAGIC;
832 win->index = w;
833 win->handle = *p_dev;
834 win->sock = s;
835 798
836 if (!(s->features & SS_CAP_STATIC_MAP)) { 799 if (!(s->features & SS_CAP_STATIC_MAP)) {
837 win->ctl.res = pcmcia_find_mem_region(req->Base, req->Size, align, 800 win->res = pcmcia_find_mem_region(req->Base, req->Size, align,
838 (req->Attributes & WIN_MAP_BELOW_1MB), s); 801 (req->Attributes & WIN_MAP_BELOW_1MB), s);
839 if (!win->ctl.res) { 802 if (!win->res) {
840 ds_dbg(s, 0, "allocating mem region failed\n"); 803 dev_dbg(&s->dev, "allocating mem region failed\n");
841 return -EINVAL; 804 return -EINVAL;
842 } 805 }
843 } 806 }
844 (*p_dev)->_win |= CLIENT_WIN_REQ(w); 807 p_dev->_win |= CLIENT_WIN_REQ(w);
845 808
846 /* Configure the socket controller */ 809 /* Configure the socket controller */
847 win->ctl.map = w+1; 810 win->map = w+1;
848 win->ctl.flags = 0; 811 win->flags = 0;
849 win->ctl.speed = req->AccessSpeed; 812 win->speed = req->AccessSpeed;
850 if (req->Attributes & WIN_MEMORY_TYPE) 813 if (req->Attributes & WIN_MEMORY_TYPE)
851 win->ctl.flags |= MAP_ATTRIB; 814 win->flags |= MAP_ATTRIB;
852 if (req->Attributes & WIN_ENABLE) 815 if (req->Attributes & WIN_ENABLE)
853 win->ctl.flags |= MAP_ACTIVE; 816 win->flags |= MAP_ACTIVE;
854 if (req->Attributes & WIN_DATA_WIDTH_16) 817 if (req->Attributes & WIN_DATA_WIDTH_16)
855 win->ctl.flags |= MAP_16BIT; 818 win->flags |= MAP_16BIT;
856 if (req->Attributes & WIN_USE_WAIT) 819 if (req->Attributes & WIN_USE_WAIT)
857 win->ctl.flags |= MAP_USE_WAIT; 820 win->flags |= MAP_USE_WAIT;
858 win->ctl.card_start = 0; 821 win->card_start = 0;
859 if (s->ops->set_mem_map(s, &win->ctl) != 0) { 822 if (s->ops->set_mem_map(s, win) != 0) {
860 ds_dbg(s, 0, "failed to set memory mapping\n"); 823 dev_dbg(&s->dev, "failed to set memory mapping\n");
861 return -EIO; 824 return -EIO;
862 } 825 }
863 s->state |= SOCKET_WIN_REQ(w); 826 s->state |= SOCKET_WIN_REQ(w);
864 827
865 /* Return window handle */ 828 /* Return window handle */
866 if (s->features & SS_CAP_STATIC_MAP) { 829 if (s->features & SS_CAP_STATIC_MAP) {
867 req->Base = win->ctl.static_start; 830 req->Base = win->static_start;
868 } else { 831 } else {
869 req->Base = win->ctl.res->start; 832 req->Base = win->res->start;
870 } 833 }
871 *wh = win; 834 *wh = w + 1;
872 835
873 return 0; 836 return 0;
874} /* pcmcia_request_window */ 837} /* pcmcia_request_window */
@@ -879,19 +842,46 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev) {
879 pcmcia_release_io(p_dev, &p_dev->io); 842 pcmcia_release_io(p_dev, &p_dev->io);
880 pcmcia_release_irq(p_dev, &p_dev->irq); 843 pcmcia_release_irq(p_dev, &p_dev->irq);
881 if (p_dev->win) 844 if (p_dev->win)
882 pcmcia_release_window(p_dev->win); 845 pcmcia_release_window(p_dev, p_dev->win);
883} 846}
884EXPORT_SYMBOL(pcmcia_disable_device); 847EXPORT_SYMBOL(pcmcia_disable_device);
885 848
886 849
887struct pcmcia_cfg_mem { 850struct pcmcia_cfg_mem {
888 tuple_t tuple; 851 struct pcmcia_device *p_dev;
852 void *priv_data;
853 int (*conf_check) (struct pcmcia_device *p_dev,
854 cistpl_cftable_entry_t *cfg,
855 cistpl_cftable_entry_t *dflt,
856 unsigned int vcc,
857 void *priv_data);
889 cisparse_t parse; 858 cisparse_t parse;
890 u8 buf[256];
891 cistpl_cftable_entry_t dflt; 859 cistpl_cftable_entry_t dflt;
892}; 860};
893 861
894/** 862/**
863 * pcmcia_do_loop_config() - internal helper for pcmcia_loop_config()
864 *
865 * pcmcia_do_loop_config() is the internal callback for the call from
866 * pcmcia_loop_config() to pccard_loop_tuple(). Data is transferred
867 * by a struct pcmcia_cfg_mem.
868 */
869static int pcmcia_do_loop_config(tuple_t *tuple, cisparse_t *parse, void *priv)
870{
871 cistpl_cftable_entry_t *cfg = &parse->cftable_entry;
872 struct pcmcia_cfg_mem *cfg_mem = priv;
873
874 /* default values */
875 cfg_mem->p_dev->conf.ConfigIndex = cfg->index;
876 if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
877 cfg_mem->dflt = *cfg;
878
879 return cfg_mem->conf_check(cfg_mem->p_dev, cfg, &cfg_mem->dflt,
880 cfg_mem->p_dev->socket->socket.Vcc,
881 cfg_mem->priv_data);
882}
883
884/**
895 * pcmcia_loop_config() - loop over configuration options 885 * pcmcia_loop_config() - loop over configuration options
896 * @p_dev: the struct pcmcia_device which we need to loop for. 886 * @p_dev: the struct pcmcia_device which we need to loop for.
897 * @conf_check: function to call for each configuration option. 887 * @conf_check: function to call for each configuration option.
@@ -913,48 +903,174 @@ int pcmcia_loop_config(struct pcmcia_device *p_dev,
913 void *priv_data) 903 void *priv_data)
914{ 904{
915 struct pcmcia_cfg_mem *cfg_mem; 905 struct pcmcia_cfg_mem *cfg_mem;
916
917 tuple_t *tuple;
918 int ret; 906 int ret;
919 unsigned int vcc;
920 907
921 cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL); 908 cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL);
922 if (cfg_mem == NULL) 909 if (cfg_mem == NULL)
923 return -ENOMEM; 910 return -ENOMEM;
924 911
925 /* get the current Vcc setting */ 912 cfg_mem->p_dev = p_dev;
926 vcc = p_dev->socket->socket.Vcc; 913 cfg_mem->conf_check = conf_check;
914 cfg_mem->priv_data = priv_data;
927 915
928 tuple = &cfg_mem->tuple; 916 ret = pccard_loop_tuple(p_dev->socket, p_dev->func,
929 tuple->TupleData = cfg_mem->buf; 917 CISTPL_CFTABLE_ENTRY, &cfg_mem->parse,
930 tuple->TupleDataMax = 255; 918 cfg_mem, pcmcia_do_loop_config);
931 tuple->TupleOffset = 0;
932 tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
933 tuple->Attributes = 0;
934 919
935 ret = pcmcia_get_first_tuple(p_dev, tuple); 920 kfree(cfg_mem);
936 while (!ret) { 921 return ret;
937 cistpl_cftable_entry_t *cfg = &cfg_mem->parse.cftable_entry; 922}
923EXPORT_SYMBOL(pcmcia_loop_config);
924
925
926struct pcmcia_loop_mem {
927 struct pcmcia_device *p_dev;
928 void *priv_data;
929 int (*loop_tuple) (struct pcmcia_device *p_dev,
930 tuple_t *tuple,
931 void *priv_data);
932};
933
934/**
935 * pcmcia_do_loop_tuple() - internal helper for pcmcia_loop_config()
936 *
937 * pcmcia_do_loop_tuple() is the internal callback for the call from
938 * pcmcia_loop_tuple() to pccard_loop_tuple(). Data is transferred
939 * by a struct pcmcia_cfg_mem.
940 */
941static int pcmcia_do_loop_tuple(tuple_t *tuple, cisparse_t *parse, void *priv)
942{
943 struct pcmcia_loop_mem *loop = priv;
944
945 return loop->loop_tuple(loop->p_dev, tuple, loop->priv_data);
946};
947
948/**
949 * pcmcia_loop_tuple() - loop over tuples in the CIS
950 * @p_dev: the struct pcmcia_device which we need to loop for.
951 * @code: which CIS code shall we look for?
952 * @priv_data: private data to be passed to the loop_tuple function.
953 * @loop_tuple: function to call for each CIS entry of type @function. IT
954 * gets passed the raw tuple and @priv_data.
955 *
956 * pcmcia_loop_tuple() loops over all CIS entries of type @function, and
957 * calls the @loop_tuple function for each entry. If the call to @loop_tuple
958 * returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
959 */
960int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
961 int (*loop_tuple) (struct pcmcia_device *p_dev,
962 tuple_t *tuple,
963 void *priv_data),
964 void *priv_data)
965{
966 struct pcmcia_loop_mem loop = {
967 .p_dev = p_dev,
968 .loop_tuple = loop_tuple,
969 .priv_data = priv_data};
938 970
939 if (pcmcia_get_tuple_data(p_dev, tuple)) 971 return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
940 goto next_entry; 972 &loop, pcmcia_do_loop_tuple);
973};
974EXPORT_SYMBOL(pcmcia_loop_tuple);
941 975
942 if (pcmcia_parse_tuple(tuple, &cfg_mem->parse))
943 goto next_entry;
944 976
945 /* default values */ 977struct pcmcia_loop_get {
946 p_dev->conf.ConfigIndex = cfg->index; 978 size_t len;
947 if (cfg->flags & CISTPL_CFTABLE_DEFAULT) 979 cisdata_t **buf;
948 cfg_mem->dflt = *cfg; 980};
949 981
950 ret = conf_check(p_dev, cfg, &cfg_mem->dflt, vcc, priv_data); 982/**
951 if (!ret) 983 * pcmcia_do_get_tuple() - internal helper for pcmcia_get_tuple()
952 break; 984 *
985 * pcmcia_do_get_tuple() is the internal callback for the call from
986 * pcmcia_get_tuple() to pcmcia_loop_tuple(). As we're only interested in
987 * the first tuple, return 0 unconditionally. Create a memory buffer large
988 * enough to hold the content of the tuple, and fill it with the tuple data.
989 * The caller is responsible to free the buffer.
990 */
991static int pcmcia_do_get_tuple(struct pcmcia_device *p_dev, tuple_t *tuple,
992 void *priv)
993{
994 struct pcmcia_loop_get *get = priv;
995
996 *get->buf = kzalloc(tuple->TupleDataLen, GFP_KERNEL);
997 if (*get->buf) {
998 get->len = tuple->TupleDataLen;
999 memcpy(*get->buf, tuple->TupleData, tuple->TupleDataLen);
1000 } else
1001 dev_dbg(&p_dev->dev, "do_get_tuple: out of memory\n");
1002 return 0;
1003};
953 1004
954next_entry: 1005/**
955 ret = pcmcia_get_next_tuple(p_dev, tuple); 1006 * pcmcia_get_tuple() - get first tuple from CIS
1007 * @p_dev: the struct pcmcia_device which we need to loop for.
1008 * @code: which CIS code shall we look for?
1009 * @buf: pointer to store the buffer to.
1010 *
1011 * pcmcia_get_tuple() gets the content of the first CIS entry of type @code.
1012 * It returns the buffer length (or zero). The caller is responsible to free
1013 * the buffer passed in @buf.
1014 */
1015size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
1016 unsigned char **buf)
1017{
1018 struct pcmcia_loop_get get = {
1019 .len = 0,
1020 .buf = buf,
1021 };
1022
1023 *get.buf = NULL;
1024 pcmcia_loop_tuple(p_dev, code, pcmcia_do_get_tuple, &get);
1025
1026 return get.len;
1027};
1028EXPORT_SYMBOL(pcmcia_get_tuple);
1029
1030
1031/**
1032 * pcmcia_do_get_mac() - internal helper for pcmcia_get_mac_from_cis()
1033 *
1034 * pcmcia_do_get_mac() is the internal callback for the call from
1035 * pcmcia_get_mac_from_cis() to pcmcia_loop_tuple(). We check whether the
1036 * tuple contains a proper LAN_NODE_ID of length 6, and copy the data
1037 * to struct net_device->dev_addr[i].
1038 */
1039static int pcmcia_do_get_mac(struct pcmcia_device *p_dev, tuple_t *tuple,
1040 void *priv)
1041{
1042 struct net_device *dev = priv;
1043 int i;
1044
1045 if (tuple->TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID)
1046 return -EINVAL;
1047 if (tuple->TupleDataLen < ETH_ALEN + 2) {
1048 dev_warn(&p_dev->dev, "Invalid CIS tuple length for "
1049 "LAN_NODE_ID\n");
1050 return -EINVAL;
956 } 1051 }
957 1052
958 return ret; 1053 if (tuple->TupleData[1] != ETH_ALEN) {
959} 1054 dev_warn(&p_dev->dev, "Invalid header for LAN_NODE_ID\n");
960EXPORT_SYMBOL(pcmcia_loop_config); 1055 return -EINVAL;
1056 }
1057 for (i = 0; i < 6; i++)
1058 dev->dev_addr[i] = tuple->TupleData[i+2];
1059 return 0;
1060};
1061
1062/**
1063 * pcmcia_get_mac_from_cis() - read out MAC address from CISTPL_FUNCE
1064 * @p_dev: the struct pcmcia_device for which we want the address.
1065 * @dev: a properly prepared struct net_device to store the info to.
1066 *
1067 * pcmcia_get_mac_from_cis() reads out the hardware MAC address from
1068 * CISTPL_FUNCE and stores it into struct net_device *dev->dev_addr which
1069 * must be set up properly by the driver (see examples!).
1070 */
1071int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, struct net_device *dev)
1072{
1073 return pcmcia_loop_tuple(p_dev, CISTPL_FUNCE, pcmcia_do_get_mac, dev);
1074};
1075EXPORT_SYMBOL(pcmcia_get_mac_from_cis);
1076
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c
index 70a33468bcd0..e1741cd875aa 100644
--- a/drivers/pcmcia/pd6729.c
+++ b/drivers/pcmcia/pd6729.c
@@ -213,7 +213,8 @@ static irqreturn_t pd6729_interrupt(int irq, void *dev)
213 213
214 if (csc & I365_CSC_DETECT) { 214 if (csc & I365_CSC_DETECT) {
215 events |= SS_DETECT; 215 events |= SS_DETECT;
216 dprintk("Card detected in socket %i!\n", i); 216 dev_vdbg(&socket[i].socket.dev,
217 "Card detected in socket %i!\n", i);
217 } 218 }
218 219
219 if (indirect_read(&socket[i], I365_INTCTL) 220 if (indirect_read(&socket[i], I365_INTCTL)
@@ -331,11 +332,11 @@ static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
331 reg = I365_PWR_NORESET; /* default: disable resetdrv on resume */ 332 reg = I365_PWR_NORESET; /* default: disable resetdrv on resume */
332 333
333 if (state->flags & SS_PWR_AUTO) { 334 if (state->flags & SS_PWR_AUTO) {
334 dprintk("Auto power\n"); 335 dev_dbg(&sock->dev, "Auto power\n");
335 reg |= I365_PWR_AUTO; /* automatic power mngmnt */ 336 reg |= I365_PWR_AUTO; /* automatic power mngmnt */
336 } 337 }
337 if (state->flags & SS_OUTPUT_ENA) { 338 if (state->flags & SS_OUTPUT_ENA) {
338 dprintk("Power Enabled\n"); 339 dev_dbg(&sock->dev, "Power Enabled\n");
339 reg |= I365_PWR_OUT; /* enable power */ 340 reg |= I365_PWR_OUT; /* enable power */
340 } 341 }
341 342
@@ -343,40 +344,44 @@ static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
343 case 0: 344 case 0:
344 break; 345 break;
345 case 33: 346 case 33:
346 dprintk("setting voltage to Vcc to 3.3V on socket %i\n", 347 dev_dbg(&sock->dev,
348 "setting voltage to Vcc to 3.3V on socket %i\n",
347 socket->number); 349 socket->number);
348 reg |= I365_VCC_5V; 350 reg |= I365_VCC_5V;
349 indirect_setbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); 351 indirect_setbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
350 break; 352 break;
351 case 50: 353 case 50:
352 dprintk("setting voltage to Vcc to 5V on socket %i\n", 354 dev_dbg(&sock->dev,
355 "setting voltage to Vcc to 5V on socket %i\n",
353 socket->number); 356 socket->number);
354 reg |= I365_VCC_5V; 357 reg |= I365_VCC_5V;
355 indirect_resetbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V); 358 indirect_resetbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
356 break; 359 break;
357 default: 360 default:
358 dprintk("pd6729: pd6729_set_socket called with " 361 dev_dbg(&sock->dev,
359 "invalid VCC power value: %i\n", 362 "pd6729_set_socket called with invalid VCC power "
360 state->Vcc); 363 "value: %i\n", state->Vcc);
361 return -EINVAL; 364 return -EINVAL;
362 } 365 }
363 366
364 switch (state->Vpp) { 367 switch (state->Vpp) {
365 case 0: 368 case 0:
366 dprintk("not setting Vpp on socket %i\n", socket->number); 369 dev_dbg(&sock->dev, "not setting Vpp on socket %i\n",
370 socket->number);
367 break; 371 break;
368 case 33: 372 case 33:
369 case 50: 373 case 50:
370 dprintk("setting Vpp to Vcc for socket %i\n", socket->number); 374 dev_dbg(&sock->dev, "setting Vpp to Vcc for socket %i\n",
375 socket->number);
371 reg |= I365_VPP1_5V; 376 reg |= I365_VPP1_5V;
372 break; 377 break;
373 case 120: 378 case 120:
374 dprintk("setting Vpp to 12.0\n"); 379 dev_dbg(&sock->dev, "setting Vpp to 12.0\n");
375 reg |= I365_VPP1_12V; 380 reg |= I365_VPP1_12V;
376 break; 381 break;
377 default: 382 default:
378 dprintk("pd6729: pd6729_set_socket called with invalid VPP power value: %i\n", 383 dev_dbg(&sock->dev, "pd6729: pd6729_set_socket called with "
379 state->Vpp); 384 "invalid VPP power value: %i\n", state->Vpp);
380 return -EINVAL; 385 return -EINVAL;
381 } 386 }
382 387
@@ -438,7 +443,7 @@ static int pd6729_set_io_map(struct pcmcia_socket *sock,
438 443
439 /* Check error conditions */ 444 /* Check error conditions */
440 if (map > 1) { 445 if (map > 1) {
441 dprintk("pd6729_set_io_map with invalid map"); 446 dev_dbg(&sock->dev, "pd6729_set_io_map with invalid map\n");
442 return -EINVAL; 447 return -EINVAL;
443 } 448 }
444 449
@@ -446,7 +451,7 @@ static int pd6729_set_io_map(struct pcmcia_socket *sock,
446 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map)) 451 if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map))
447 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map)); 452 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map));
448 453
449 /* dprintk("set_io_map: Setting range to %x - %x\n", 454 /* dev_dbg(&sock->dev, "set_io_map: Setting range to %x - %x\n",
450 io->start, io->stop);*/ 455 io->start, io->stop);*/
451 456
452 /* write the new values */ 457 /* write the new values */
@@ -478,12 +483,12 @@ static int pd6729_set_mem_map(struct pcmcia_socket *sock,
478 483
479 map = mem->map; 484 map = mem->map;
480 if (map > 4) { 485 if (map > 4) {
481 printk("pd6729_set_mem_map: invalid map"); 486 dev_warn(&sock->dev, "invalid map requested\n");
482 return -EINVAL; 487 return -EINVAL;
483 } 488 }
484 489
485 if ((mem->res->start > mem->res->end) || (mem->speed > 1000)) { 490 if ((mem->res->start > mem->res->end) || (mem->speed > 1000)) {
486 printk("pd6729_set_mem_map: invalid address / speed"); 491 dev_warn(&sock->dev, "invalid invalid address / speed\n");
487 return -EINVAL; 492 return -EINVAL;
488 } 493 }
489 494
@@ -529,12 +534,12 @@ static int pd6729_set_mem_map(struct pcmcia_socket *sock,
529 if (mem->flags & MAP_WRPROT) 534 if (mem->flags & MAP_WRPROT)
530 i |= I365_MEM_WRPROT; 535 i |= I365_MEM_WRPROT;
531 if (mem->flags & MAP_ATTRIB) { 536 if (mem->flags & MAP_ATTRIB) {
532 /* dprintk("requesting attribute memory for socket %i\n", 537 /* dev_dbg(&sock->dev, "requesting attribute memory for "
533 socket->number);*/ 538 "socket %i\n", socket->number);*/
534 i |= I365_MEM_REG; 539 i |= I365_MEM_REG;
535 } else { 540 } else {
536 /* dprintk("requesting normal memory for socket %i\n", 541 /* dev_dbg(&sock->dev, "requesting normal memory for "
537 socket->number);*/ 542 "socket %i\n", socket->number);*/
538 } 543 }
539 indirect_write16(socket, base + I365_W_OFF, i); 544 indirect_write16(socket, base + I365_W_OFF, i);
540 545
@@ -577,7 +582,7 @@ static struct pccard_operations pd6729_operations = {
577 582
578static irqreturn_t pd6729_test(int irq, void *dev) 583static irqreturn_t pd6729_test(int irq, void *dev)
579{ 584{
580 dprintk("-> hit on irq %d\n", irq); 585 pr_devel("-> hit on irq %d\n", irq);
581 return IRQ_HANDLED; 586 return IRQ_HANDLED;
582} 587}
583 588
@@ -642,13 +647,13 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
642 goto err_out_free_mem; 647 goto err_out_free_mem;
643 648
644 if (!pci_resource_start(dev, 0)) { 649 if (!pci_resource_start(dev, 0)) {
645 printk(KERN_INFO "pd6729: refusing to load the driver " 650 dev_warn(&dev->dev, "refusing to load the driver as the "
646 "as the io_base is 0.\n"); 651 "io_base is NULL.\n");
647 goto err_out_free_mem; 652 goto err_out_free_mem;
648 } 653 }
649 654
650 printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " 655 dev_info(&dev->dev, "Cirrus PD6729 PCI to PCMCIA Bridge at 0x%llx "
651 "at 0x%llx on irq %d\n", 656 "on irq %d\n",
652 (unsigned long long)pci_resource_start(dev, 0), dev->irq); 657 (unsigned long long)pci_resource_start(dev, 0), dev->irq);
653 /* 658 /*
654 * Since we have no memory BARs some firmware may not 659 * Since we have no memory BARs some firmware may not
@@ -656,14 +661,14 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
656 */ 661 */
657 pci_read_config_byte(dev, PCI_COMMAND, &configbyte); 662 pci_read_config_byte(dev, PCI_COMMAND, &configbyte);
658 if (!(configbyte & PCI_COMMAND_MEMORY)) { 663 if (!(configbyte & PCI_COMMAND_MEMORY)) {
659 printk(KERN_DEBUG "pd6729: Enabling PCI_COMMAND_MEMORY.\n"); 664 dev_dbg(&dev->dev, "pd6729: Enabling PCI_COMMAND_MEMORY.\n");
660 configbyte |= PCI_COMMAND_MEMORY; 665 configbyte |= PCI_COMMAND_MEMORY;
661 pci_write_config_byte(dev, PCI_COMMAND, configbyte); 666 pci_write_config_byte(dev, PCI_COMMAND, configbyte);
662 } 667 }
663 668
664 ret = pci_request_regions(dev, "pd6729"); 669 ret = pci_request_regions(dev, "pd6729");
665 if (ret) { 670 if (ret) {
666 printk(KERN_INFO "pd6729: pci request region failed.\n"); 671 dev_warn(&dev->dev, "pci request region failed.\n");
667 goto err_out_disable; 672 goto err_out_disable;
668 } 673 }
669 674
@@ -672,7 +677,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
672 677
673 mask = pd6729_isa_scan(); 678 mask = pd6729_isa_scan();
674 if (irq_mode == 0 && mask == 0) { 679 if (irq_mode == 0 && mask == 0) {
675 printk(KERN_INFO "pd6729: no ISA interrupt is available.\n"); 680 dev_warn(&dev->dev, "no ISA interrupt is available.\n");
676 goto err_out_free_res; 681 goto err_out_free_res;
677 } 682 }
678 683
@@ -697,8 +702,8 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
697 /* Register the interrupt handler */ 702 /* Register the interrupt handler */
698 if ((ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED, 703 if ((ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED,
699 "pd6729", socket))) { 704 "pd6729", socket))) {
700 printk(KERN_ERR "pd6729: Failed to register irq %d, " 705 dev_err(&dev->dev, "Failed to register irq %d\n",
701 "aborting\n", dev->irq); 706 dev->irq);
702 goto err_out_free_res; 707 goto err_out_free_res;
703 } 708 }
704 } else { 709 } else {
@@ -713,8 +718,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
713 for (i = 0; i < MAX_SOCKETS; i++) { 718 for (i = 0; i < MAX_SOCKETS; i++) {
714 ret = pcmcia_register_socket(&socket[i].socket); 719 ret = pcmcia_register_socket(&socket[i].socket);
715 if (ret) { 720 if (ret) {
716 printk(KERN_INFO "pd6729: pcmcia_register_socket " 721 dev_warn(&dev->dev, "pcmcia_register_socket failed.\n");
717 "failed.\n");
718 for (j = 0; j < i ; j++) 722 for (j = 0; j < i ; j++)
719 pcmcia_unregister_socket(&socket[j].socket); 723 pcmcia_unregister_socket(&socket[j].socket);
720 goto err_out_free_res2; 724 goto err_out_free_res2;
diff --git a/drivers/pcmcia/pd6729.h b/drivers/pcmcia/pd6729.h
index f392e458cdfd..41418d394c55 100644
--- a/drivers/pcmcia/pd6729.h
+++ b/drivers/pcmcia/pd6729.h
@@ -1,13 +1,6 @@
1#ifndef _INCLUDE_GUARD_PD6729_H_ 1#ifndef _INCLUDE_GUARD_PD6729_H_
2#define _INCLUDE_GUARD_PD6729_H_ 2#define _INCLUDE_GUARD_PD6729_H_
3 3
4/* Debuging defines */
5#ifdef NOTRACE
6#define dprintk(fmt, args...) printk(fmt , ## args)
7#else
8#define dprintk(fmt, args...) do {} while (0)
9#endif
10
11/* Flags for I365_GENCTL */ 4/* Flags for I365_GENCTL */
12#define I365_DF_VS1 0x40 /* DF-step Voltage Sense */ 5#define I365_DF_VS1 0x40 /* DF-step Voltage Sense */
13#define I365_DF_VS2 0x80 6#define I365_DF_VS2 0x80
diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
index 0e35acb1366b..84dde7768ad5 100644
--- a/drivers/pcmcia/pxa2xx_base.c
+++ b/drivers/pcmcia/pxa2xx_base.c
@@ -228,9 +228,43 @@ static const char *skt_names[] = {
228#define SKT_DEV_INFO_SIZE(n) \ 228#define SKT_DEV_INFO_SIZE(n) \
229 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket)) 229 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
230 230
231int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
232{
233 skt->res_skt.start = _PCMCIA(skt->nr);
234 skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
235 skt->res_skt.name = skt_names[skt->nr];
236 skt->res_skt.flags = IORESOURCE_MEM;
237
238 skt->res_io.start = _PCMCIAIO(skt->nr);
239 skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
240 skt->res_io.name = "io";
241 skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
242
243 skt->res_mem.start = _PCMCIAMem(skt->nr);
244 skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
245 skt->res_mem.name = "memory";
246 skt->res_mem.flags = IORESOURCE_MEM;
247
248 skt->res_attr.start = _PCMCIAAttr(skt->nr);
249 skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
250 skt->res_attr.name = "attribute";
251 skt->res_attr.flags = IORESOURCE_MEM;
252
253 return soc_pcmcia_add_one(skt);
254}
255
256void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops)
257{
258 /* Provide our PXA2xx specific timing routines. */
259 ops->set_timing = pxa2xx_pcmcia_set_timing;
260#ifdef CONFIG_CPU_FREQ
261 ops->frequency_change = pxa2xx_pcmcia_frequency_change;
262#endif
263}
264
231int __pxa2xx_drv_pcmcia_probe(struct device *dev) 265int __pxa2xx_drv_pcmcia_probe(struct device *dev)
232{ 266{
233 int i, ret; 267 int i, ret = 0;
234 struct pcmcia_low_level *ops; 268 struct pcmcia_low_level *ops;
235 struct skt_dev_info *sinfo; 269 struct skt_dev_info *sinfo;
236 struct soc_pcmcia_socket *skt; 270 struct soc_pcmcia_socket *skt;
@@ -240,6 +274,8 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
240 274
241 ops = (struct pcmcia_low_level *)dev->platform_data; 275 ops = (struct pcmcia_low_level *)dev->platform_data;
242 276
277 pxa2xx_drv_pcmcia_ops(ops);
278
243 sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL); 279 sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
244 if (!sinfo) 280 if (!sinfo)
245 return -ENOMEM; 281 return -ENOMEM;
@@ -250,40 +286,25 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
250 for (i = 0; i < ops->nr; i++) { 286 for (i = 0; i < ops->nr; i++) {
251 skt = &sinfo->skt[i]; 287 skt = &sinfo->skt[i];
252 288
253 skt->nr = ops->first + i; 289 skt->nr = ops->first + i;
254 skt->irq = NO_IRQ; 290 skt->ops = ops;
255 291 skt->socket.owner = ops->owner;
256 skt->res_skt.start = _PCMCIA(skt->nr); 292 skt->socket.dev.parent = dev;
257 skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 293 skt->socket.pci_irq = NO_IRQ;
258 skt->res_skt.name = skt_names[skt->nr];
259 skt->res_skt.flags = IORESOURCE_MEM;
260
261 skt->res_io.start = _PCMCIAIO(skt->nr);
262 skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
263 skt->res_io.name = "io";
264 skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
265 294
266 skt->res_mem.start = _PCMCIAMem(skt->nr); 295 ret = pxa2xx_drv_pcmcia_add_one(skt);
267 skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 296 if (ret)
268 skt->res_mem.name = "memory"; 297 break;
269 skt->res_mem.flags = IORESOURCE_MEM;
270
271 skt->res_attr.start = _PCMCIAAttr(skt->nr);
272 skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
273 skt->res_attr.name = "attribute";
274 skt->res_attr.flags = IORESOURCE_MEM;
275 } 298 }
276 299
277 /* Provide our PXA2xx specific timing routines. */ 300 if (ret) {
278 ops->set_timing = pxa2xx_pcmcia_set_timing; 301 while (--i >= 0)
279#ifdef CONFIG_CPU_FREQ 302 soc_pcmcia_remove_one(&sinfo->skt[i]);
280 ops->frequency_change = pxa2xx_pcmcia_frequency_change; 303 kfree(sinfo);
281#endif 304 } else {
282
283 ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo);
284
285 if (!ret)
286 pxa2xx_configure_sockets(dev); 305 pxa2xx_configure_sockets(dev);
306 dev_set_drvdata(dev, sinfo);
307 }
287 308
288 return ret; 309 return ret;
289} 310}
@@ -297,7 +318,16 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
297 318
298static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev) 319static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
299{ 320{
300 return soc_common_drv_pcmcia_remove(&dev->dev); 321 struct skt_dev_info *sinfo = platform_get_drvdata(dev);
322 int i;
323
324 platform_set_drvdata(dev, NULL);
325
326 for (i = 0; i < sinfo->nskt; i++)
327 soc_pcmcia_remove_one(&sinfo->skt[i]);
328
329 kfree(sinfo);
330 return 0;
301} 331}
302 332
303static int pxa2xx_drv_pcmcia_suspend(struct device *dev) 333static int pxa2xx_drv_pcmcia_suspend(struct device *dev)
diff --git a/drivers/pcmcia/pxa2xx_base.h b/drivers/pcmcia/pxa2xx_base.h
index 235d681652c3..cb5efaec886f 100644
--- a/drivers/pcmcia/pxa2xx_base.h
+++ b/drivers/pcmcia/pxa2xx_base.h
@@ -1,3 +1,6 @@
1/* temporary measure */ 1/* temporary measure */
2extern int __pxa2xx_drv_pcmcia_probe(struct device *); 2extern int __pxa2xx_drv_pcmcia_probe(struct device *);
3 3
4int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
5void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
6
diff --git a/drivers/pcmcia/pxa2xx_cm_x255.c b/drivers/pcmcia/pxa2xx_cm_x255.c
index 5143a760153b..05913d0bbdbe 100644
--- a/drivers/pcmcia/pxa2xx_cm_x255.c
+++ b/drivers/pcmcia/pxa2xx_cm_x255.c
@@ -44,7 +44,7 @@ static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
44 return ret; 44 return ret;
45 gpio_direction_output(GPIO_PCMCIA_RESET, 0); 45 gpio_direction_output(GPIO_PCMCIA_RESET, 0);
46 46
47 skt->irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT; 47 skt->socket.pci_irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
48 ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 48 ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
49 if (!ret) 49 if (!ret)
50 gpio_free(GPIO_PCMCIA_RESET); 50 gpio_free(GPIO_PCMCIA_RESET);
diff --git a/drivers/pcmcia/pxa2xx_cm_x270.c b/drivers/pcmcia/pxa2xx_cm_x270.c
index a7b943d01e34..5662646b84da 100644
--- a/drivers/pcmcia/pxa2xx_cm_x270.c
+++ b/drivers/pcmcia/pxa2xx_cm_x270.c
@@ -38,7 +38,7 @@ static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
38 return ret; 38 return ret;
39 gpio_direction_output(GPIO_PCMCIA_RESET, 0); 39 gpio_direction_output(GPIO_PCMCIA_RESET, 0);
40 40
41 skt->irq = PCMCIA_S0_RDYINT; 41 skt->socket.pci_irq = PCMCIA_S0_RDYINT;
42 ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 42 ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
43 if (!ret) 43 if (!ret)
44 gpio_free(GPIO_PCMCIA_RESET); 44 gpio_free(GPIO_PCMCIA_RESET);
diff --git a/drivers/pcmcia/pxa2xx_e740.c b/drivers/pcmcia/pxa2xx_e740.c
index d09c0dc4a31a..8bfbd4dca131 100644
--- a/drivers/pcmcia/pxa2xx_e740.c
+++ b/drivers/pcmcia/pxa2xx_e740.c
@@ -38,7 +38,7 @@ static struct pcmcia_irqs cd_irqs[] = {
38 38
39static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 39static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
40{ 40{
41 skt->irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) : 41 skt->socket.pci_irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) :
42 IRQ_GPIO(GPIO_E740_PCMCIA_RDY1); 42 IRQ_GPIO(GPIO_E740_PCMCIA_RDY1);
43 43
44 return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1); 44 return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1);
diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c
index 6cbb1b1f7cfd..b9f8c8fb42bd 100644
--- a/drivers/pcmcia/pxa2xx_lubbock.c
+++ b/drivers/pcmcia/pxa2xx_lubbock.c
@@ -32,6 +32,7 @@ static int
32lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, 32lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
33 const socket_state_t *state) 33 const socket_state_t *state)
34{ 34{
35 struct sa1111_pcmcia_socket *s = to_skt(skt);
35 unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set; 36 unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
36 int ret = 0; 37 int ret = 0;
37 38
@@ -149,7 +150,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
149 150
150 if (ret == 0) { 151 if (ret == 0) {
151 lubbock_set_misc_wr(misc_mask, misc_set); 152 lubbock_set_misc_wr(misc_mask, misc_set);
152 sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); 153 sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
153 } 154 }
154 155
155#if 1 156#if 1
@@ -175,7 +176,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
175 * Switch to 5V, Configure socket with 5V voltage 176 * Switch to 5V, Configure socket with 5V voltage
176 */ 177 */
177 lubbock_set_misc_wr(misc_mask, 0); 178 lubbock_set_misc_wr(misc_mask, 0);
178 sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0); 179 sa1111_set_io(s->dev, pa_dwr_mask, 0);
179 180
180 /* 181 /*
181 * It takes about 100ms to turn off Vcc. 182 * It takes about 100ms to turn off Vcc.
@@ -200,12 +201,8 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
200 201
201static struct pcmcia_low_level lubbock_pcmcia_ops = { 202static struct pcmcia_low_level lubbock_pcmcia_ops = {
202 .owner = THIS_MODULE, 203 .owner = THIS_MODULE,
203 .hw_init = sa1111_pcmcia_hw_init,
204 .hw_shutdown = sa1111_pcmcia_hw_shutdown,
205 .socket_state = sa1111_pcmcia_socket_state,
206 .configure_socket = lubbock_pcmcia_configure_socket, 204 .configure_socket = lubbock_pcmcia_configure_socket,
207 .socket_init = sa1111_pcmcia_socket_init, 205 .socket_init = sa1111_pcmcia_socket_init,
208 .socket_suspend = sa1111_pcmcia_socket_suspend,
209 .first = 0, 206 .first = 0,
210 .nr = 2, 207 .nr = 2,
211}; 208};
@@ -228,8 +225,9 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)
228 /* Set CF Socket 1 power to standby mode. */ 225 /* Set CF Socket 1 power to standby mode. */
229 lubbock_set_misc_wr((1 << 15) | (1 << 14), 0); 226 lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
230 227
231 sadev->dev.platform_data = &lubbock_pcmcia_ops; 228 pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
232 ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev); 229 ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
230 pxa2xx_drv_pcmcia_add_one);
233 } 231 }
234 232
235 return ret; 233 return ret;
diff --git a/drivers/pcmcia/pxa2xx_mainstone.c b/drivers/pcmcia/pxa2xx_mainstone.c
index 1138551ba8f6..92016fe932b4 100644
--- a/drivers/pcmcia/pxa2xx_mainstone.c
+++ b/drivers/pcmcia/pxa2xx_mainstone.c
@@ -44,7 +44,7 @@ static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
44 * before we enable them as outputs. 44 * before we enable them as outputs.
45 */ 45 */
46 46
47 skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ; 47 skt->socket.pci_irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
48 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 48 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
49} 49}
50 50
diff --git a/drivers/pcmcia/pxa2xx_palmld.c b/drivers/pcmcia/pxa2xx_palmld.c
index 5ba9b3664a00..6fb6f7f0672e 100644
--- a/drivers/pcmcia/pxa2xx_palmld.c
+++ b/drivers/pcmcia/pxa2xx_palmld.c
@@ -45,7 +45,7 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
45 if (ret) 45 if (ret)
46 goto err4; 46 goto err4;
47 47
48 skt->irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY); 48 skt->socket.pci_irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);
49 return 0; 49 return 0;
50 50
51err4: 51err4:
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c
index e07b5c51ec5b..b07b247a399f 100644
--- a/drivers/pcmcia/pxa2xx_palmtx.c
+++ b/drivers/pcmcia/pxa2xx_palmtx.c
@@ -53,7 +53,7 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
53 if (ret) 53 if (ret)
54 goto err5; 54 goto err5;
55 55
56 skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY); 56 skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
57 return 0; 57 return 0;
58 58
59err5: 59err5:
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c
index bc43f78f6f0b..0ea3b29440e6 100644
--- a/drivers/pcmcia/pxa2xx_sharpsl.c
+++ b/drivers/pcmcia/pxa2xx_sharpsl.c
@@ -66,7 +66,7 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
66 } 66 }
67 } 67 }
68 68
69 skt->irq = SCOOP_DEV[skt->nr].irq; 69 skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq;
70 70
71 return 0; 71 return 0;
72} 72}
diff --git a/drivers/pcmcia/pxa2xx_trizeps4.c b/drivers/pcmcia/pxa2xx_trizeps4.c
index e0e5cb339b4a..b7e596620db1 100644
--- a/drivers/pcmcia/pxa2xx_trizeps4.c
+++ b/drivers/pcmcia/pxa2xx_trizeps4.c
@@ -53,7 +53,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
53 gpio_free(GPIO_PRDY); 53 gpio_free(GPIO_PRDY);
54 return -EINVAL; 54 return -EINVAL;
55 } 55 }
56 skt->irq = IRQ_GPIO(GPIO_PRDY); 56 skt->socket.pci_irq = IRQ_GPIO(GPIO_PRDY);
57 break; 57 break;
58 58
59#ifndef CONFIG_MACH_TRIZEPS_CONXS 59#ifndef CONFIG_MACH_TRIZEPS_CONXS
@@ -63,7 +63,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
63 break; 63 break;
64 } 64 }
65 /* release the reset of this card */ 65 /* release the reset of this card */
66 pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->irq); 66 pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->socket.pci_irq);
67 67
68 /* supplementory irqs for the socket */ 68 /* supplementory irqs for the socket */
69 for (i = 0; i < ARRAY_SIZE(irqs); i++) { 69 for (i = 0; i < ARRAY_SIZE(irqs); i++) {
diff --git a/drivers/pcmcia/pxa2xx_viper.c b/drivers/pcmcia/pxa2xx_viper.c
index 17871360fe99..27be2e154df2 100644
--- a/drivers/pcmcia/pxa2xx_viper.c
+++ b/drivers/pcmcia/pxa2xx_viper.c
@@ -40,7 +40,7 @@ static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
40{ 40{
41 unsigned long flags; 41 unsigned long flags;
42 42
43 skt->irq = gpio_to_irq(VIPER_CF_RDY_GPIO); 43 skt->socket.pci_irq = gpio_to_irq(VIPER_CF_RDY_GPIO);
44 44
45 if (gpio_request(VIPER_CF_CD_GPIO, "CF detect")) 45 if (gpio_request(VIPER_CF_CD_GPIO, "CF detect"))
46 goto err_request_cd; 46 goto err_request_cd;
diff --git a/drivers/pcmcia/rsrc_mgr.c b/drivers/pcmcia/rsrc_mgr.c
index e592e0e0d7ed..de0e770ce6a3 100644
--- a/drivers/pcmcia/rsrc_mgr.c
+++ b/drivers/pcmcia/rsrc_mgr.c
@@ -18,6 +18,7 @@
18#include <pcmcia/cs_types.h> 18#include <pcmcia/cs_types.h>
19#include <pcmcia/ss.h> 19#include <pcmcia/ss.h>
20#include <pcmcia/cs.h> 20#include <pcmcia/cs.h>
21#include <pcmcia/cistpl.h>
21#include "cs_internal.h" 22#include "cs_internal.h"
22 23
23 24
diff --git a/drivers/pcmcia/sa1100_assabet.c b/drivers/pcmcia/sa1100_assabet.c
index ac8aa09ba0da..fd013a1ef47a 100644
--- a/drivers/pcmcia/sa1100_assabet.c
+++ b/drivers/pcmcia/sa1100_assabet.c
@@ -27,7 +27,7 @@ static struct pcmcia_irqs irqs[] = {
27 27
28static int assabet_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 28static int assabet_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
29{ 29{
30 skt->irq = ASSABET_IRQ_GPIO_CF_IRQ; 30 skt->socket.pci_irq = ASSABET_IRQ_GPIO_CF_IRQ;
31 31
32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
33} 33}
diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c
index 1ca9737ea79e..1ce53f493bef 100644
--- a/drivers/pcmcia/sa1100_badge4.c
+++ b/drivers/pcmcia/sa1100_badge4.c
@@ -127,13 +127,10 @@ badge4_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state
127 127
128static struct pcmcia_low_level badge4_pcmcia_ops = { 128static struct pcmcia_low_level badge4_pcmcia_ops = {
129 .owner = THIS_MODULE, 129 .owner = THIS_MODULE,
130 .hw_init = sa1111_pcmcia_hw_init,
131 .hw_shutdown = sa1111_pcmcia_hw_shutdown,
132 .socket_state = sa1111_pcmcia_socket_state,
133 .configure_socket = badge4_pcmcia_configure_socket, 130 .configure_socket = badge4_pcmcia_configure_socket,
134
135 .socket_init = sa1111_pcmcia_socket_init, 131 .socket_init = sa1111_pcmcia_socket_init,
136 .socket_suspend = sa1111_pcmcia_socket_suspend, 132 .first = 0,
133 .nr = 2,
137}; 134};
138 135
139int pcmcia_badge4_init(struct device *dev) 136int pcmcia_badge4_init(struct device *dev)
@@ -146,7 +143,9 @@ int pcmcia_badge4_init(struct device *dev)
146 __func__, 143 __func__,
147 badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc); 144 badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);
148 145
149 ret = sa11xx_drv_pcmcia_probe(dev, &badge4_pcmcia_ops, 0, 2); 146 sa11xx_drv_pcmcia_ops(&badge4_pcmcia_ops);
147 ret = sa1111_pcmcia_add(dev, &badge4_pcmcia_ops,
148 sa11xx_drv_pcmcia_add_one);
150 } 149 }
151 150
152 return ret; 151 return ret;
diff --git a/drivers/pcmcia/sa1100_cerf.c b/drivers/pcmcia/sa1100_cerf.c
index 63e6bc431a0d..9bf088b17275 100644
--- a/drivers/pcmcia/sa1100_cerf.c
+++ b/drivers/pcmcia/sa1100_cerf.c
@@ -27,7 +27,7 @@ static struct pcmcia_irqs irqs[] = {
27 27
28static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 28static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
29{ 29{
30 skt->irq = CERF_IRQ_GPIO_CF_IRQ; 30 skt->socket.pci_irq = CERF_IRQ_GPIO_CF_IRQ;
31 31
32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
33} 33}
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c
index 2d0e99751530..11cc3ba1260a 100644
--- a/drivers/pcmcia/sa1100_generic.c
+++ b/drivers/pcmcia/sa1100_generic.c
@@ -83,7 +83,16 @@ static int sa11x0_drv_pcmcia_probe(struct platform_device *dev)
83 83
84static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) 84static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
85{ 85{
86 return soc_common_drv_pcmcia_remove(&dev->dev); 86 struct skt_dev_info *sinfo = platform_get_drvdata(dev);
87 int i;
88
89 platform_set_drvdata(dev, NULL);
90
91 for (i = 0; i < sinfo->nskt; i++)
92 soc_pcmcia_remove_one(&sinfo->skt[i]);
93
94 kfree(sinfo);
95 return 0;
87} 96}
88 97
89static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev, 98static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev,
diff --git a/drivers/pcmcia/sa1100_h3600.c b/drivers/pcmcia/sa1100_h3600.c
index 0cc3748f3758..3a121ac697d6 100644
--- a/drivers/pcmcia/sa1100_h3600.c
+++ b/drivers/pcmcia/sa1100_h3600.c
@@ -25,8 +25,8 @@ static struct pcmcia_irqs irqs[] = {
25 25
26static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 26static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
27{ 27{
28 skt->irq = skt->nr ? IRQ_GPIO_H3600_PCMCIA_IRQ1 28 skt->socket.pci_irq = skt->nr ? IRQ_GPIO_H3600_PCMCIA_IRQ1
29 : IRQ_GPIO_H3600_PCMCIA_IRQ0; 29 : IRQ_GPIO_H3600_PCMCIA_IRQ0;
30 30
31 31
32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 32 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
diff --git a/drivers/pcmcia/sa1100_jornada720.c b/drivers/pcmcia/sa1100_jornada720.c
index 7eedb42f800c..6bcabee6bde4 100644
--- a/drivers/pcmcia/sa1100_jornada720.c
+++ b/drivers/pcmcia/sa1100_jornada720.c
@@ -22,25 +22,10 @@
22#define SOCKET1_POWER (GPIO_GPIO1 | GPIO_GPIO3) 22#define SOCKET1_POWER (GPIO_GPIO1 | GPIO_GPIO3)
23#define SOCKET1_3V GPIO_GPIO3 23#define SOCKET1_3V GPIO_GPIO3
24 24
25static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
26{
27 unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
28
29 /*
30 * What is all this crap for?
31 */
32 GRER |= 0x00000002;
33 /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
34 sa1111_set_io_dir(SA1111_DEV(skt->dev), pin, 0, 0);
35 sa1111_set_io(SA1111_DEV(skt->dev), pin, 0);
36 sa1111_set_sleep_io(SA1111_DEV(skt->dev), pin, 0);
37
38 return sa1111_pcmcia_hw_init(skt);
39}
40
41static int 25static int
42jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) 26jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
43{ 27{
28 struct sa1111_pcmcia_socket *s = to_skt(skt);
44 unsigned int pa_dwr_mask, pa_dwr_set; 29 unsigned int pa_dwr_mask, pa_dwr_set;
45 int ret; 30 int ret;
46 31
@@ -97,7 +82,7 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
97 unsigned long flags; 82 unsigned long flags;
98 83
99 local_irq_save(flags); 84 local_irq_save(flags);
100 sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); 85 sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
101 local_irq_restore(flags); 86 local_irq_restore(flags);
102 } 87 }
103 88
@@ -106,21 +91,30 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
106 91
107static struct pcmcia_low_level jornada720_pcmcia_ops = { 92static struct pcmcia_low_level jornada720_pcmcia_ops = {
108 .owner = THIS_MODULE, 93 .owner = THIS_MODULE,
109 .hw_init = jornada720_pcmcia_hw_init,
110 .hw_shutdown = sa1111_pcmcia_hw_shutdown,
111 .socket_state = sa1111_pcmcia_socket_state,
112 .configure_socket = jornada720_pcmcia_configure_socket, 94 .configure_socket = jornada720_pcmcia_configure_socket,
113
114 .socket_init = sa1111_pcmcia_socket_init, 95 .socket_init = sa1111_pcmcia_socket_init,
115 .socket_suspend = sa1111_pcmcia_socket_suspend, 96 .first = 0,
97 .nr = 2,
116}; 98};
117 99
118int __devinit pcmcia_jornada720_init(struct device *dev) 100int __devinit pcmcia_jornada720_init(struct device *dev)
119{ 101{
120 int ret = -ENODEV; 102 int ret = -ENODEV;
121 103
122 if (machine_is_jornada720()) 104 if (machine_is_jornada720()) {
123 ret = sa11xx_drv_pcmcia_probe(dev, &jornada720_pcmcia_ops, 0, 2); 105 unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
106
107 GRER |= 0x00000002;
108
109 /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
110 sa1111_set_io_dir(dev, pin, 0, 0);
111 sa1111_set_io(dev, pin, 0);
112 sa1111_set_sleep_io(dev, pin, 0);
113
114 sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops);
115 ret = sa1111_pcmcia_add(dev, &jornada720_pcmcia_ops,
116 sa11xx_drv_pcmcia_add_one);
117 }
124 118
125 return ret; 119 return ret;
126} 120}
diff --git a/drivers/pcmcia/sa1100_neponset.c b/drivers/pcmcia/sa1100_neponset.c
index 0c76d337815b..c95639b5f2a0 100644
--- a/drivers/pcmcia/sa1100_neponset.c
+++ b/drivers/pcmcia/sa1100_neponset.c
@@ -43,6 +43,7 @@
43static int 43static int
44neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) 44neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
45{ 45{
46 struct sa1111_pcmcia_socket *s = to_skt(skt);
46 unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set; 47 unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set;
47 int ret; 48 int ret;
48 49
@@ -99,7 +100,7 @@ neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_sta
99 NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set; 100 NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set;
100 101
101 local_irq_restore(flags); 102 local_irq_restore(flags);
102 sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); 103 sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
103 } 104 }
104 105
105 return 0; 106 return 0;
@@ -115,12 +116,10 @@ static void neponset_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
115 116
116static struct pcmcia_low_level neponset_pcmcia_ops = { 117static struct pcmcia_low_level neponset_pcmcia_ops = {
117 .owner = THIS_MODULE, 118 .owner = THIS_MODULE,
118 .hw_init = sa1111_pcmcia_hw_init,
119 .hw_shutdown = sa1111_pcmcia_hw_shutdown,
120 .socket_state = sa1111_pcmcia_socket_state,
121 .configure_socket = neponset_pcmcia_configure_socket, 119 .configure_socket = neponset_pcmcia_configure_socket,
122 .socket_init = neponset_pcmcia_socket_init, 120 .socket_init = neponset_pcmcia_socket_init,
123 .socket_suspend = sa1111_pcmcia_socket_suspend, 121 .first = 0,
122 .nr = 2,
124}; 123};
125 124
126int pcmcia_neponset_init(struct sa1111_dev *sadev) 125int pcmcia_neponset_init(struct sa1111_dev *sadev)
@@ -135,7 +134,9 @@ int pcmcia_neponset_init(struct sa1111_dev *sadev)
135 sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0); 134 sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0);
136 sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); 135 sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
137 sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); 136 sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
138 ret = sa11xx_drv_pcmcia_probe(&sadev->dev, &neponset_pcmcia_ops, 0, 2); 137 sa11xx_drv_pcmcia_ops(&neponset_pcmcia_ops);
138 ret = sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
139 sa11xx_drv_pcmcia_add_one);
139 } 140 }
140 141
141 return ret; 142 return ret;
diff --git a/drivers/pcmcia/sa1100_shannon.c b/drivers/pcmcia/sa1100_shannon.c
index 46d8c1977c2a..c4d51867a050 100644
--- a/drivers/pcmcia/sa1100_shannon.c
+++ b/drivers/pcmcia/sa1100_shannon.c
@@ -28,7 +28,7 @@ static int shannon_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
28 GAFR &= ~(SHANNON_GPIO_EJECT_0 | SHANNON_GPIO_EJECT_1 | 28 GAFR &= ~(SHANNON_GPIO_EJECT_0 | SHANNON_GPIO_EJECT_1 |
29 SHANNON_GPIO_RDY_0 | SHANNON_GPIO_RDY_1); 29 SHANNON_GPIO_RDY_0 | SHANNON_GPIO_RDY_1);
30 30
31 skt->irq = skt->nr ? SHANNON_IRQ_GPIO_RDY_1 : SHANNON_IRQ_GPIO_RDY_0; 31 skt->socket.pci_irq = skt->nr ? SHANNON_IRQ_GPIO_RDY_1 : SHANNON_IRQ_GPIO_RDY_0;
32 32
33 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 33 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
34} 34}
diff --git a/drivers/pcmcia/sa1100_simpad.c b/drivers/pcmcia/sa1100_simpad.c
index 33a08ae09fdf..05bd504e6f18 100644
--- a/drivers/pcmcia/sa1100_simpad.c
+++ b/drivers/pcmcia/sa1100_simpad.c
@@ -28,7 +28,7 @@ static int simpad_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
28 28
29 clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1); 29 clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1);
30 30
31 skt->irq = IRQ_GPIO_CF_IRQ; 31 skt->socket.pci_irq = IRQ_GPIO_CF_IRQ;
32 32
33 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 33 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
34} 34}
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c
index 4be4e172ffa1..de6bc333d299 100644
--- a/drivers/pcmcia/sa1111_generic.c
+++ b/drivers/pcmcia/sa1111_generic.c
@@ -28,23 +28,20 @@ static struct pcmcia_irqs irqs[] = {
28 { 1, IRQ_S1_BVD1_STSCHG, "SA1111 CF BVD1" }, 28 { 1, IRQ_S1_BVD1_STSCHG, "SA1111 CF BVD1" },
29}; 29};
30 30
31int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt) 31static int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
32{ 32{
33 if (skt->irq == NO_IRQ)
34 skt->irq = skt->nr ? IRQ_S1_READY_NINT : IRQ_S0_READY_NINT;
35
36 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); 33 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
37} 34}
38 35
39void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) 36static void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
40{ 37{
41 soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); 38 soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
42} 39}
43 40
44void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) 41void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
45{ 42{
46 struct sa1111_dev *sadev = SA1111_DEV(skt->dev); 43 struct sa1111_pcmcia_socket *s = to_skt(skt);
47 unsigned long status = sa1111_readl(sadev->mapbase + SA1111_PCSR); 44 unsigned long status = sa1111_readl(s->dev->mapbase + SA1111_PCSR);
48 45
49 switch (skt->nr) { 46 switch (skt->nr) {
50 case 0: 47 case 0:
@@ -71,7 +68,7 @@ void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_sta
71 68
72int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) 69int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
73{ 70{
74 struct sa1111_dev *sadev = SA1111_DEV(skt->dev); 71 struct sa1111_pcmcia_socket *s = to_skt(skt);
75 unsigned int pccr_skt_mask, pccr_set_mask, val; 72 unsigned int pccr_skt_mask, pccr_set_mask, val;
76 unsigned long flags; 73 unsigned long flags;
77 74
@@ -100,10 +97,10 @@ int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
100 pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT; 97 pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT;
101 98
102 local_irq_save(flags); 99 local_irq_save(flags);
103 val = sa1111_readl(sadev->mapbase + SA1111_PCCR); 100 val = sa1111_readl(s->dev->mapbase + SA1111_PCCR);
104 val &= ~pccr_skt_mask; 101 val &= ~pccr_skt_mask;
105 val |= pccr_set_mask & pccr_skt_mask; 102 val |= pccr_set_mask & pccr_skt_mask;
106 sa1111_writel(val, sadev->mapbase + SA1111_PCCR); 103 sa1111_writel(val, s->dev->mapbase + SA1111_PCCR);
107 local_irq_restore(flags); 104 local_irq_restore(flags);
108 105
109 return 0; 106 return 0;
@@ -114,15 +111,51 @@ void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
114 soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs)); 111 soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
115} 112}
116 113
117void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) 114static void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
118{ 115{
119 soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs)); 116 soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
120} 117}
121 118
119int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
120 int (*add)(struct soc_pcmcia_socket *))
121{
122 struct sa1111_pcmcia_socket *s;
123 int i, ret = 0;
124
125 ops->hw_init = sa1111_pcmcia_hw_init;
126 ops->hw_shutdown = sa1111_pcmcia_hw_shutdown;
127 ops->socket_state = sa1111_pcmcia_socket_state;
128 ops->socket_suspend = sa1111_pcmcia_socket_suspend;
129
130 for (i = 0; i < ops->nr; i++) {
131 s = kzalloc(sizeof(*s), GFP_KERNEL);
132 if (!s)
133 return -ENOMEM;
134
135 s->soc.nr = ops->first + i;
136 s->soc.ops = ops;
137 s->soc.socket.owner = ops->owner;
138 s->soc.socket.dev.parent = &dev->dev;
139 s->soc.socket.pci_irq = s->soc.nr ? IRQ_S1_READY_NINT : IRQ_S0_READY_NINT;
140 s->dev = dev;
141
142 ret = add(&s->soc);
143 if (ret == 0) {
144 s->next = dev_get_drvdata(&dev->dev);
145 dev_set_drvdata(&dev->dev, s);
146 } else
147 kfree(s);
148 }
149
150 return ret;
151}
152
122static int pcmcia_probe(struct sa1111_dev *dev) 153static int pcmcia_probe(struct sa1111_dev *dev)
123{ 154{
124 void __iomem *base; 155 void __iomem *base;
125 156
157 dev_set_drvdata(&dev->dev, NULL);
158
126 if (!request_mem_region(dev->res.start, 512, 159 if (!request_mem_region(dev->res.start, 512,
127 SA1111_DRIVER_NAME(dev))) 160 SA1111_DRIVER_NAME(dev)))
128 return -EBUSY; 161 return -EBUSY;
@@ -152,7 +185,15 @@ static int pcmcia_probe(struct sa1111_dev *dev)
152 185
153static int __devexit pcmcia_remove(struct sa1111_dev *dev) 186static int __devexit pcmcia_remove(struct sa1111_dev *dev)
154{ 187{
155 soc_common_drv_pcmcia_remove(&dev->dev); 188 struct sa1111_pcmcia_socket *next, *s = dev_get_drvdata(&dev->dev);
189
190 dev_set_drvdata(&dev->dev, NULL);
191
192 for (; next = s->next, s; s = next) {
193 soc_pcmcia_remove_one(&s->soc);
194 kfree(s);
195 }
196
156 release_mem_region(dev->res.start, 512); 197 release_mem_region(dev->res.start, 512);
157 return 0; 198 return 0;
158} 199}
diff --git a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h
index 10ced4a210d7..02dc8577cdaf 100644
--- a/drivers/pcmcia/sa1111_generic.h
+++ b/drivers/pcmcia/sa1111_generic.h
@@ -1,12 +1,23 @@
1#include "soc_common.h" 1#include "soc_common.h"
2#include "sa11xx_base.h" 2#include "sa11xx_base.h"
3 3
4extern int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *); 4struct sa1111_pcmcia_socket {
5extern void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *); 5 struct soc_pcmcia_socket soc;
6 struct sa1111_dev *dev;
7 struct sa1111_pcmcia_socket *next;
8};
9
10static inline struct sa1111_pcmcia_socket *to_skt(struct soc_pcmcia_socket *s)
11{
12 return container_of(s, struct sa1111_pcmcia_socket, soc);
13}
14
15int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
16 int (*add)(struct soc_pcmcia_socket *));
17
6extern void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *, struct pcmcia_state *); 18extern void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *, struct pcmcia_state *);
7extern int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *, const socket_state_t *); 19extern int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *, const socket_state_t *);
8extern void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *); 20extern void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *);
9extern void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *);
10 21
11extern int pcmcia_badge4_init(struct device *); 22extern int pcmcia_badge4_init(struct device *);
12extern int pcmcia_jornada720_init(struct device *); 23extern int pcmcia_jornada720_init(struct device *);
diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c
index e15d59f2d8a9..fc9a6527019b 100644
--- a/drivers/pcmcia/sa11xx_base.c
+++ b/drivers/pcmcia/sa11xx_base.c
@@ -171,12 +171,58 @@ static const char *skt_names[] = {
171#define SKT_DEV_INFO_SIZE(n) \ 171#define SKT_DEV_INFO_SIZE(n) \
172 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket)) 172 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
173 173
174int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
175{
176 skt->res_skt.start = _PCMCIA(skt->nr);
177 skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
178 skt->res_skt.name = skt_names[skt->nr];
179 skt->res_skt.flags = IORESOURCE_MEM;
180
181 skt->res_io.start = _PCMCIAIO(skt->nr);
182 skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
183 skt->res_io.name = "io";
184 skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
185
186 skt->res_mem.start = _PCMCIAMem(skt->nr);
187 skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
188 skt->res_mem.name = "memory";
189 skt->res_mem.flags = IORESOURCE_MEM;
190
191 skt->res_attr.start = _PCMCIAAttr(skt->nr);
192 skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
193 skt->res_attr.name = "attribute";
194 skt->res_attr.flags = IORESOURCE_MEM;
195
196 return soc_pcmcia_add_one(skt);
197}
198EXPORT_SYMBOL(sa11xx_drv_pcmcia_add_one);
199
200void sa11xx_drv_pcmcia_ops(struct pcmcia_low_level *ops)
201{
202 /*
203 * set default MECR calculation if the board specific
204 * code did not specify one...
205 */
206 if (!ops->get_timing)
207 ops->get_timing = sa1100_pcmcia_default_mecr_timing;
208
209 /* Provide our SA11x0 specific timing routines. */
210 ops->set_timing = sa1100_pcmcia_set_timing;
211 ops->show_timing = sa1100_pcmcia_show_timing;
212#ifdef CONFIG_CPU_FREQ
213 ops->frequency_change = sa1100_pcmcia_frequency_change;
214#endif
215}
216EXPORT_SYMBOL(sa11xx_drv_pcmcia_ops);
217
174int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, 218int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
175 int first, int nr) 219 int first, int nr)
176{ 220{
177 struct skt_dev_info *sinfo; 221 struct skt_dev_info *sinfo;
178 struct soc_pcmcia_socket *skt; 222 struct soc_pcmcia_socket *skt;
179 int i; 223 int i, ret = 0;
224
225 sa11xx_drv_pcmcia_ops(ops);
180 226
181 sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL); 227 sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
182 if (!sinfo) 228 if (!sinfo)
@@ -188,45 +234,26 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
188 for (i = 0; i < nr; i++) { 234 for (i = 0; i < nr; i++) {
189 skt = &sinfo->skt[i]; 235 skt = &sinfo->skt[i];
190 236
191 skt->nr = first + i; 237 skt->nr = first + i;
192 skt->irq = NO_IRQ; 238 skt->ops = ops;
193 239 skt->socket.owner = ops->owner;
194 skt->res_skt.start = _PCMCIA(skt->nr); 240 skt->socket.dev.parent = dev;
195 skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 241 skt->socket.pci_irq = NO_IRQ;
196 skt->res_skt.name = skt_names[skt->nr];
197 skt->res_skt.flags = IORESOURCE_MEM;
198
199 skt->res_io.start = _PCMCIAIO(skt->nr);
200 skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
201 skt->res_io.name = "io";
202 skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
203 242
204 skt->res_mem.start = _PCMCIAMem(skt->nr); 243 ret = sa11xx_drv_pcmcia_add_one(skt);
205 skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 244 if (ret)
206 skt->res_mem.name = "memory"; 245 break;
207 skt->res_mem.flags = IORESOURCE_MEM;
208
209 skt->res_attr.start = _PCMCIAAttr(skt->nr);
210 skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
211 skt->res_attr.name = "attribute";
212 skt->res_attr.flags = IORESOURCE_MEM;
213 } 246 }
214 247
215 /* 248 if (ret) {
216 * set default MECR calculation if the board specific 249 while (--i >= 0)
217 * code did not specify one... 250 soc_pcmcia_remove_one(&sinfo->skt[i]);
218 */ 251 kfree(sinfo);
219 if (!ops->get_timing) 252 } else {
220 ops->get_timing = sa1100_pcmcia_default_mecr_timing; 253 dev_set_drvdata(dev, sinfo);
221 254 }
222 /* Provide our SA11x0 specific timing routines. */
223 ops->set_timing = sa1100_pcmcia_set_timing;
224 ops->show_timing = sa1100_pcmcia_show_timing;
225#ifdef CONFIG_CPU_FREQ
226 ops->frequency_change = sa1100_pcmcia_frequency_change;
227#endif
228 255
229 return soc_common_drv_pcmcia_probe(dev, ops, sinfo); 256 return ret;
230} 257}
231EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe); 258EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe);
232 259
diff --git a/drivers/pcmcia/sa11xx_base.h b/drivers/pcmcia/sa11xx_base.h
index 7bc208280527..3d76d720f463 100644
--- a/drivers/pcmcia/sa11xx_base.h
+++ b/drivers/pcmcia/sa11xx_base.h
@@ -118,6 +118,8 @@ static inline unsigned int sa1100_pcmcia_cmd_time(unsigned int cpu_clock_khz,
118} 118}
119 119
120 120
121int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
122void sa11xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
121extern int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr); 123extern int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr);
122 124
123#endif /* !defined(_PCMCIA_SA1100_H) */ 125#endif /* !defined(_PCMCIA_SA1100_H) */
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index ef7e9e58782b..6f1a86b43c60 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -144,10 +144,10 @@ soc_common_pcmcia_config_skt(struct soc_pcmcia_socket *skt, socket_state_t *stat
144 */ 144 */
145 if (skt->irq_state != 1 && state->io_irq) { 145 if (skt->irq_state != 1 && state->io_irq) {
146 skt->irq_state = 1; 146 skt->irq_state = 1;
147 set_irq_type(skt->irq, IRQ_TYPE_EDGE_FALLING); 147 set_irq_type(skt->socket.pci_irq, IRQ_TYPE_EDGE_FALLING);
148 } else if (skt->irq_state == 1 && state->io_irq == 0) { 148 } else if (skt->irq_state == 1 && state->io_irq == 0) {
149 skt->irq_state = 0; 149 skt->irq_state = 0;
150 set_irq_type(skt->irq, IRQ_TYPE_NONE); 150 set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE);
151 } 151 }
152 152
153 skt->cs_state = *state; 153 skt->cs_state = *state;
@@ -492,7 +492,8 @@ static ssize_t show_status(struct device *dev, struct device_attribute *attr, ch
492 492
493 p+=sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc); 493 p+=sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
494 p+=sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp); 494 p+=sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
495 p+=sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq, skt->irq); 495 p+=sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq,
496 skt->socket.pci_irq);
496 if (skt->ops->show_timing) 497 if (skt->ops->show_timing)
497 p+=skt->ops->show_timing(skt, p); 498 p+=skt->ops->show_timing(skt, p);
498 499
@@ -574,7 +575,7 @@ void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt,
574EXPORT_SYMBOL(soc_pcmcia_enable_irqs); 575EXPORT_SYMBOL(soc_pcmcia_enable_irqs);
575 576
576 577
577LIST_HEAD(soc_pcmcia_sockets); 578static LIST_HEAD(soc_pcmcia_sockets);
578static DEFINE_MUTEX(soc_pcmcia_sockets_lock); 579static DEFINE_MUTEX(soc_pcmcia_sockets_lock);
579 580
580#ifdef CONFIG_CPU_FREQ 581#ifdef CONFIG_CPU_FREQ
@@ -609,177 +610,137 @@ static int soc_pcmcia_cpufreq_register(void)
609 "notifier for PCMCIA (%d)\n", ret); 610 "notifier for PCMCIA (%d)\n", ret);
610 return ret; 611 return ret;
611} 612}
613fs_initcall(soc_pcmcia_cpufreq_register);
612 614
613static void soc_pcmcia_cpufreq_unregister(void) 615static void soc_pcmcia_cpufreq_unregister(void)
614{ 616{
615 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); 617 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
616} 618}
619module_exit(soc_pcmcia_cpufreq_unregister);
617 620
618#else
619static int soc_pcmcia_cpufreq_register(void) { return 0; }
620static void soc_pcmcia_cpufreq_unregister(void) {}
621#endif 621#endif
622 622
623int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, 623void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
624 struct skt_dev_info *sinfo)
625{ 624{
626 struct soc_pcmcia_socket *skt;
627 int ret, i;
628
629 mutex_lock(&soc_pcmcia_sockets_lock); 625 mutex_lock(&soc_pcmcia_sockets_lock);
626 del_timer_sync(&skt->poll_timer);
630 627
631 /* 628 pcmcia_unregister_socket(&skt->socket);
632 * Initialise the per-socket structure.
633 */
634 for (i = 0; i < sinfo->nskt; i++) {
635 skt = &sinfo->skt[i];
636 629
637 skt->socket.ops = &soc_common_pcmcia_operations; 630 flush_scheduled_work();
638 skt->socket.owner = ops->owner;
639 skt->socket.dev.parent = dev;
640 631
641 init_timer(&skt->poll_timer); 632 skt->ops->hw_shutdown(skt);
642 skt->poll_timer.function = soc_common_pcmcia_poll_event;
643 skt->poll_timer.data = (unsigned long)skt;
644 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
645 633
646 skt->dev = dev; 634 soc_common_pcmcia_config_skt(skt, &dead_socket);
647 skt->ops = ops;
648 635
649 ret = request_resource(&iomem_resource, &skt->res_skt); 636 list_del(&skt->node);
650 if (ret) 637 mutex_unlock(&soc_pcmcia_sockets_lock);
651 goto out_err_1;
652 638
653 ret = request_resource(&skt->res_skt, &skt->res_io); 639 iounmap(skt->virt_io);
654 if (ret) 640 skt->virt_io = NULL;
655 goto out_err_2; 641 release_resource(&skt->res_attr);
642 release_resource(&skt->res_mem);
643 release_resource(&skt->res_io);
644 release_resource(&skt->res_skt);
645}
646EXPORT_SYMBOL(soc_pcmcia_remove_one);
656 647
657 ret = request_resource(&skt->res_skt, &skt->res_mem); 648int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
658 if (ret) 649{
659 goto out_err_3; 650 int ret;
660 651
661 ret = request_resource(&skt->res_skt, &skt->res_attr); 652 init_timer(&skt->poll_timer);
662 if (ret) 653 skt->poll_timer.function = soc_common_pcmcia_poll_event;
663 goto out_err_4; 654 skt->poll_timer.data = (unsigned long)skt;
655 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
664 656
665 skt->virt_io = ioremap(skt->res_io.start, 0x10000); 657 ret = request_resource(&iomem_resource, &skt->res_skt);
666 if (skt->virt_io == NULL) { 658 if (ret)
667 ret = -ENOMEM; 659 goto out_err_1;
668 goto out_err_5;
669 }
670 660
671 if (list_empty(&soc_pcmcia_sockets)) 661 ret = request_resource(&skt->res_skt, &skt->res_io);
672 soc_pcmcia_cpufreq_register(); 662 if (ret)
663 goto out_err_2;
673 664
674 list_add(&skt->node, &soc_pcmcia_sockets); 665 ret = request_resource(&skt->res_skt, &skt->res_mem);
666 if (ret)
667 goto out_err_3;
675 668
676 /* 669 ret = request_resource(&skt->res_skt, &skt->res_attr);
677 * We initialize default socket timing here, because 670 if (ret)
678 * we are not guaranteed to see a SetIOMap operation at 671 goto out_err_4;
679 * runtime.
680 */
681 ops->set_timing(skt);
682 672
683 ret = ops->hw_init(skt); 673 skt->virt_io = ioremap(skt->res_io.start, 0x10000);
684 if (ret) 674 if (skt->virt_io == NULL) {
685 goto out_err_6; 675 ret = -ENOMEM;
676 goto out_err_5;
677 }
686 678
687 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD; 679 mutex_lock(&soc_pcmcia_sockets_lock);
688 skt->socket.resource_ops = &pccard_static_ops;
689 skt->socket.irq_mask = 0;
690 skt->socket.map_size = PAGE_SIZE;
691 skt->socket.pci_irq = skt->irq;
692 skt->socket.io_offset = (unsigned long)skt->virt_io;
693 680
694 skt->status = soc_common_pcmcia_skt_state(skt); 681 list_add(&skt->node, &soc_pcmcia_sockets);
695 682
696 ret = pcmcia_register_socket(&skt->socket); 683 /*
697 if (ret) 684 * We initialize default socket timing here, because
698 goto out_err_7; 685 * we are not guaranteed to see a SetIOMap operation at
686 * runtime.
687 */
688 skt->ops->set_timing(skt);
699 689
700 WARN_ON(skt->socket.sock != i); 690 ret = skt->ops->hw_init(skt);
691 if (ret)
692 goto out_err_6;
701 693
702 add_timer(&skt->poll_timer); 694 skt->socket.ops = &soc_common_pcmcia_operations;
695 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
696 skt->socket.resource_ops = &pccard_static_ops;
697 skt->socket.irq_mask = 0;
698 skt->socket.map_size = PAGE_SIZE;
699 skt->socket.io_offset = (unsigned long)skt->virt_io;
703 700
704 ret = device_create_file(&skt->socket.dev, &dev_attr_status); 701 skt->status = soc_common_pcmcia_skt_state(skt);
705 if (ret)
706 goto out_err_8;
707 }
708 702
709 dev_set_drvdata(dev, sinfo); 703 ret = pcmcia_register_socket(&skt->socket);
710 ret = 0; 704 if (ret)
711 goto out; 705 goto out_err_7;
712 706
713 do { 707 add_timer(&skt->poll_timer);
714 skt = &sinfo->skt[i]; 708
709 mutex_unlock(&soc_pcmcia_sockets_lock);
710
711 ret = device_create_file(&skt->socket.dev, &dev_attr_status);
712 if (ret)
713 goto out_err_8;
714
715 return ret;
715 716
716 device_remove_file(&skt->socket.dev, &dev_attr_status);
717 out_err_8: 717 out_err_8:
718 del_timer_sync(&skt->poll_timer); 718 mutex_lock(&soc_pcmcia_sockets_lock);
719 pcmcia_unregister_socket(&skt->socket); 719 del_timer_sync(&skt->poll_timer);
720 pcmcia_unregister_socket(&skt->socket);
720 721
721 out_err_7: 722 out_err_7:
722 flush_scheduled_work(); 723 flush_scheduled_work();
723 724
724 ops->hw_shutdown(skt); 725 skt->ops->hw_shutdown(skt);
725 out_err_6: 726 out_err_6:
726 list_del(&skt->node); 727 list_del(&skt->node);
727 iounmap(skt->virt_io); 728 mutex_unlock(&soc_pcmcia_sockets_lock);
729 iounmap(skt->virt_io);
728 out_err_5: 730 out_err_5:
729 release_resource(&skt->res_attr); 731 release_resource(&skt->res_attr);
730 out_err_4: 732 out_err_4:
731 release_resource(&skt->res_mem); 733 release_resource(&skt->res_mem);
732 out_err_3: 734 out_err_3:
733 release_resource(&skt->res_io); 735 release_resource(&skt->res_io);
734 out_err_2: 736 out_err_2:
735 release_resource(&skt->res_skt); 737 release_resource(&skt->res_skt);
736 out_err_1: 738 out_err_1:
737 i--;
738 } while (i > 0);
739 739
740 kfree(sinfo);
741
742 out:
743 mutex_unlock(&soc_pcmcia_sockets_lock);
744 return ret; 740 return ret;
745} 741}
742EXPORT_SYMBOL(soc_pcmcia_add_one);
746 743
747int soc_common_drv_pcmcia_remove(struct device *dev) 744MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
748{ 745MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
749 struct skt_dev_info *sinfo = dev_get_drvdata(dev); 746MODULE_LICENSE("Dual MPL/GPL");
750 int i;
751
752 dev_set_drvdata(dev, NULL);
753
754 mutex_lock(&soc_pcmcia_sockets_lock);
755 for (i = 0; i < sinfo->nskt; i++) {
756 struct soc_pcmcia_socket *skt = &sinfo->skt[i];
757
758 del_timer_sync(&skt->poll_timer);
759
760 pcmcia_unregister_socket(&skt->socket);
761
762 flush_scheduled_work();
763
764 skt->ops->hw_shutdown(skt);
765
766 soc_common_pcmcia_config_skt(skt, &dead_socket);
767
768 list_del(&skt->node);
769 iounmap(skt->virt_io);
770 skt->virt_io = NULL;
771 release_resource(&skt->res_attr);
772 release_resource(&skt->res_mem);
773 release_resource(&skt->res_io);
774 release_resource(&skt->res_skt);
775 }
776 if (list_empty(&soc_pcmcia_sockets))
777 soc_pcmcia_cpufreq_unregister();
778
779 mutex_unlock(&soc_pcmcia_sockets_lock);
780
781 kfree(sinfo);
782
783 return 0;
784}
785EXPORT_SYMBOL(soc_common_drv_pcmcia_remove);
diff --git a/drivers/pcmcia/soc_common.h b/drivers/pcmcia/soc_common.h
index 290e143839ee..e40824ce6b0b 100644
--- a/drivers/pcmcia/soc_common.h
+++ b/drivers/pcmcia/soc_common.h
@@ -30,14 +30,12 @@ struct soc_pcmcia_socket {
30 /* 30 /*
31 * Info from low level handler 31 * Info from low level handler
32 */ 32 */
33 struct device *dev;
34 unsigned int nr; 33 unsigned int nr;
35 unsigned int irq;
36 34
37 /* 35 /*
38 * Core PCMCIA state 36 * Core PCMCIA state
39 */ 37 */
40 struct pcmcia_low_level *ops; 38 const struct pcmcia_low_level *ops;
41 39
42 unsigned int status; 40 unsigned int status;
43 socket_state_t cs_state; 41 socket_state_t cs_state;
@@ -135,10 +133,8 @@ extern void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_
135extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *); 133extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *);
136 134
137 135
138extern struct list_head soc_pcmcia_sockets; 136void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
139 137int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
140extern int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, struct skt_dev_info *sinfo);
141extern int soc_common_drv_pcmcia_remove(struct device *dev);
142 138
143 139
144#ifdef CONFIG_PCMCIA_DEBUG 140#ifdef CONFIG_PCMCIA_DEBUG
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c
index 6918849d511e..12c49ee135e1 100644
--- a/drivers/pcmcia/tcic.c
+++ b/drivers/pcmcia/tcic.c
@@ -55,21 +55,6 @@
55#include <pcmcia/ss.h> 55#include <pcmcia/ss.h>
56#include "tcic.h" 56#include "tcic.h"
57 57
58#ifdef CONFIG_PCMCIA_DEBUG
59static int pc_debug;
60
61module_param(pc_debug, int, 0644);
62static const char version[] =
63"tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
64
65#define debug(lvl, fmt, arg...) do { \
66 if (pc_debug > (lvl)) \
67 printk(KERN_DEBUG "tcic: " fmt , ## arg); \
68} while (0)
69#else
70#define debug(lvl, fmt, arg...) do { } while (0)
71#endif
72
73MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>"); 58MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
74MODULE_DESCRIPTION("Databook TCIC-2 PCMCIA socket driver"); 59MODULE_DESCRIPTION("Databook TCIC-2 PCMCIA socket driver");
75MODULE_LICENSE("Dual MPL/GPL"); 60MODULE_LICENSE("Dual MPL/GPL");
@@ -574,7 +559,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev)
574 } else 559 } else
575 active = 1; 560 active = 1;
576 561
577 debug(2, "tcic_interrupt()\n"); 562 pr_debug("tcic_interrupt()\n");
578 563
579 for (i = 0; i < sockets; i++) { 564 for (i = 0; i < sockets; i++) {
580 psock = socket_table[i].psock; 565 psock = socket_table[i].psock;
@@ -611,13 +596,13 @@ static irqreturn_t tcic_interrupt(int irq, void *dev)
611 } 596 }
612 active = 0; 597 active = 0;
613 598
614 debug(2, "interrupt done\n"); 599 pr_debug("interrupt done\n");
615 return IRQ_HANDLED; 600 return IRQ_HANDLED;
616} /* tcic_interrupt */ 601} /* tcic_interrupt */
617 602
618static void tcic_timer(u_long data) 603static void tcic_timer(u_long data)
619{ 604{
620 debug(2, "tcic_timer()\n"); 605 pr_debug("tcic_timer()\n");
621 tcic_timer_pending = 0; 606 tcic_timer_pending = 0;
622 tcic_interrupt(0, NULL); 607 tcic_interrupt(0, NULL);
623} /* tcic_timer */ 608} /* tcic_timer */
@@ -644,7 +629,7 @@ static int tcic_get_status(struct pcmcia_socket *sock, u_int *value)
644 reg = tcic_getb(TCIC_PWR); 629 reg = tcic_getb(TCIC_PWR);
645 if (reg & (TCIC_PWR_VCC(psock)|TCIC_PWR_VPP(psock))) 630 if (reg & (TCIC_PWR_VCC(psock)|TCIC_PWR_VPP(psock)))
646 *value |= SS_POWERON; 631 *value |= SS_POWERON;
647 debug(1, "GetStatus(%d) = %#2.2x\n", psock, *value); 632 dev_dbg(&sock->dev, "GetStatus(%d) = %#2.2x\n", psock, *value);
648 return 0; 633 return 0;
649} /* tcic_get_status */ 634} /* tcic_get_status */
650 635
@@ -656,7 +641,7 @@ static int tcic_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
656 u_char reg; 641 u_char reg;
657 u_short scf1, scf2; 642 u_short scf1, scf2;
658 643
659 debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, " 644 dev_dbg(&sock->dev, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
660 "io_irq %d, csc_mask %#2.2x)\n", psock, state->flags, 645 "io_irq %d, csc_mask %#2.2x)\n", psock, state->flags,
661 state->Vcc, state->Vpp, state->io_irq, state->csc_mask); 646 state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
662 tcic_setw(TCIC_ADDR+2, (psock << TCIC_SS_SHFT) | TCIC_ADR2_INDREG); 647 tcic_setw(TCIC_ADDR+2, (psock << TCIC_SS_SHFT) | TCIC_ADR2_INDREG);
@@ -731,7 +716,7 @@ static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
731 u_int addr; 716 u_int addr;
732 u_short base, len, ioctl; 717 u_short base, len, ioctl;
733 718
734 debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " 719 dev_dbg(&sock->dev, "SetIOMap(%d, %d, %#2.2x, %d ns, "
735 "%#llx-%#llx)\n", psock, io->map, io->flags, io->speed, 720 "%#llx-%#llx)\n", psock, io->map, io->flags, io->speed,
736 (unsigned long long)io->start, (unsigned long long)io->stop); 721 (unsigned long long)io->start, (unsigned long long)io->stop);
737 if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || 722 if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
@@ -768,7 +753,7 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m
768 u_short addr, ctl; 753 u_short addr, ctl;
769 u_long base, len, mmap; 754 u_long base, len, mmap;
770 755
771 debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " 756 dev_dbg(&sock->dev, "SetMemMap(%d, %d, %#2.2x, %d ns, "
772 "%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags, 757 "%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags,
773 mem->speed, (unsigned long long)mem->res->start, 758 mem->speed, (unsigned long long)mem->res->start,
774 (unsigned long long)mem->res->end, mem->card_start); 759 (unsigned long long)mem->res->end, mem->card_start);
diff --git a/drivers/pcmcia/topic.h b/drivers/pcmcia/topic.h
index edccfa5bb400..615a45a8fe86 100644
--- a/drivers/pcmcia/topic.h
+++ b/drivers/pcmcia/topic.h
@@ -114,22 +114,17 @@ static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
114 reg_zv |= TOPIC97_ZV_CONTROL_ENABLE; 114 reg_zv |= TOPIC97_ZV_CONTROL_ENABLE;
115 config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv); 115 config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
116 116
117 reg = config_readb(socket, TOPIC97_MISC2);
118 reg |= TOPIC97_MISC2_ZV_ENABLE;
119 config_writeb(socket, TOPIC97_MISC2, reg);
120
121 /* not sure this is needed, doc is unclear */
122#if 0
123 reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH); 117 reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
124 reg |= TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL; 118 reg |= TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL;
125 config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg); 119 config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
126#endif 120 } else {
127 }
128 else {
129 reg_zv &= ~TOPIC97_ZV_CONTROL_ENABLE; 121 reg_zv &= ~TOPIC97_ZV_CONTROL_ENABLE;
130 config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv); 122 config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
131 }
132 123
124 reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
125 reg &= ~(TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL);
126 config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
127 }
133} 128}
134 129
135static int topic97_override(struct yenta_socket *socket) 130static int topic97_override(struct yenta_socket *socket)