diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 17:25:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 17:25:16 -0400 |
commit | b65378898c2eefb20f419632c1199bc0592e2f79 (patch) | |
tree | 052bb72d329c44790f91fc8097b8500d4774d02c /drivers/isdn/hisax | |
parent | 157b6ceb13e4b4148ee03dd517dbe88748943125 (diff) | |
parent | 5b917a1420d3d1a9c8da49fb0090692dc9aaee86 (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: (22 commits)
pcmcia: synclink_cs: fix information leak to userland
pcmcia: don't call flush_scheduled_work() spuriously
serial_cs: drop spurious flush_scheduled_work() call
pcmcia/yenta: guide users in case of problems with O2-bridges
pcmcia: fix unused function compile warning
pcmcia: vrc4173_cardu: Fix error path for pci_release_regions and pci_disable_device
pcmcia: add a few debug statements
pcmcia: remove obsolete and wrong comments
pcmcia: avoid messages on module (un)loading
pcmcia: move driver name to struct pcmcia_driver
pcmcia: remove the "Finally, report what we've done" message
pcmcia: use autoconfiguration feature for ioports and iomem
pcmcia: introduce autoconfiguration feature
pcmcia: Documentation update
pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device
pcmcia: move config_{base,index,regs} to struct pcmcia_device
pcmcia: simplify IntType
pcmcia: simplify Status, ExtStatus register access
pcmcia: remove Pin, Copy configuration register access
pcmcia: move Vpp setup to struct pcmcia_device
...
Diffstat (limited to 'drivers/isdn/hisax')
-rw-r--r-- | drivers/isdn/hisax/avma1_cs.c | 97 | ||||
-rw-r--r-- | drivers/isdn/hisax/elsa_cs.c | 100 | ||||
-rw-r--r-- | drivers/isdn/hisax/sedlbauer_cs.c | 168 | ||||
-rw-r--r-- | drivers/isdn/hisax/teles_cs.c | 98 |
4 files changed, 38 insertions, 425 deletions
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index 94263c22b874..ac4dd7857cbd 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
21 | #include <asm/system.h> | 21 | #include <asm/system.h> |
22 | 22 | ||
23 | #include <pcmcia/cs.h> | ||
24 | #include <pcmcia/cistpl.h> | 23 | #include <pcmcia/cistpl.h> |
25 | #include <pcmcia/ds.h> | 24 | #include <pcmcia/ds.h> |
26 | #include "hisax_cfg.h" | 25 | #include "hisax_cfg.h" |
@@ -40,67 +39,22 @@ module_param(isdnprot, int, 0); | |||
40 | 39 | ||
41 | /*====================================================================*/ | 40 | /*====================================================================*/ |
42 | 41 | ||
43 | /* | ||
44 | The event() function is this driver's Card Services event handler. | ||
45 | It will be called by Card Services when an appropriate card status | ||
46 | event is received. The config() and release() entry points are | ||
47 | used to configure or release a socket, in response to card insertion | ||
48 | and ejection events. They are invoked from the skeleton event | ||
49 | handler. | ||
50 | */ | ||
51 | |||
52 | static int avma1cs_config(struct pcmcia_device *link) __devinit ; | 42 | static int avma1cs_config(struct pcmcia_device *link) __devinit ; |
53 | static void avma1cs_release(struct pcmcia_device *link); | 43 | static void avma1cs_release(struct pcmcia_device *link); |
54 | |||
55 | /* | ||
56 | The attach() and detach() entry points are used to create and destroy | ||
57 | "instances" of the driver, where each instance represents everything | ||
58 | needed to manage one actual PCMCIA card. | ||
59 | */ | ||
60 | |||
61 | static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit ; | 44 | static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit ; |
62 | 45 | ||
63 | |||
64 | /*====================================================================== | ||
65 | |||
66 | avma1cs_attach() creates an "instance" of the driver, allocating | ||
67 | local data structures for one device. The device is registered | ||
68 | with Card Services. | ||
69 | |||
70 | The dev_link structure is initialized, but we don't actually | ||
71 | configure the card at this point -- we wait until we receive a | ||
72 | card insertion event. | ||
73 | |||
74 | ======================================================================*/ | ||
75 | |||
76 | static int __devinit avma1cs_probe(struct pcmcia_device *p_dev) | 46 | static int __devinit avma1cs_probe(struct pcmcia_device *p_dev) |
77 | { | 47 | { |
78 | dev_dbg(&p_dev->dev, "avma1cs_attach()\n"); | 48 | dev_dbg(&p_dev->dev, "avma1cs_attach()\n"); |
79 | 49 | ||
80 | /* The io structure describes IO port mapping */ | ||
81 | p_dev->resource[0]->end = 16; | ||
82 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
83 | p_dev->resource[1]->end = 16; | ||
84 | p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; | ||
85 | |||
86 | /* General socket configuration */ | 50 | /* General socket configuration */ |
87 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 51 | p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; |
88 | p_dev->conf.IntType = INT_MEMORY_AND_IO; | 52 | p_dev->config_index = 1; |
89 | p_dev->conf.ConfigIndex = 1; | 53 | p_dev->config_regs = PRESENT_OPTION; |
90 | p_dev->conf.Present = PRESENT_OPTION; | ||
91 | 54 | ||
92 | return avma1cs_config(p_dev); | 55 | return avma1cs_config(p_dev); |
93 | } /* avma1cs_attach */ | 56 | } /* avma1cs_attach */ |
94 | 57 | ||
95 | /*====================================================================== | ||
96 | |||
97 | This deletes a driver "instance". The device is de-registered | ||
98 | with Card Services. If it has been released, all local data | ||
99 | structures are freed. Otherwise, the structures will be freed | ||
100 | when the device is released. | ||
101 | |||
102 | ======================================================================*/ | ||
103 | |||
104 | static void __devexit avma1cs_detach(struct pcmcia_device *link) | 58 | static void __devexit avma1cs_detach(struct pcmcia_device *link) |
105 | { | 59 | { |
106 | dev_dbg(&link->dev, "avma1cs_detach(0x%p)\n", link); | 60 | dev_dbg(&link->dev, "avma1cs_detach(0x%p)\n", link); |
@@ -108,26 +62,13 @@ static void __devexit avma1cs_detach(struct pcmcia_device *link) | |||
108 | kfree(link->priv); | 62 | kfree(link->priv); |
109 | } /* avma1cs_detach */ | 63 | } /* avma1cs_detach */ |
110 | 64 | ||
111 | /*====================================================================== | 65 | static int avma1cs_configcheck(struct pcmcia_device *p_dev, void *priv_data) |
112 | |||
113 | avma1cs_config() is scheduled to run after a CARD_INSERTION event | ||
114 | is received, to configure the PCMCIA socket, and to make the | ||
115 | ethernet device available to the system. | ||
116 | |||
117 | ======================================================================*/ | ||
118 | |||
119 | static int avma1cs_configcheck(struct pcmcia_device *p_dev, | ||
120 | cistpl_cftable_entry_t *cf, | ||
121 | cistpl_cftable_entry_t *dflt, | ||
122 | unsigned int vcc, | ||
123 | void *priv_data) | ||
124 | { | 66 | { |
125 | if (cf->io.nwin <= 0) | 67 | p_dev->resource[0]->end = 16; |
126 | return -ENODEV; | 68 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
127 | 69 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | |
128 | p_dev->resource[0]->start = cf->io.win[0].base; | ||
129 | p_dev->resource[0]->end = cf->io.win[0].len; | ||
130 | p_dev->io_lines = 5; | 70 | p_dev->io_lines = 5; |
71 | |||
131 | return pcmcia_request_io(p_dev); | 72 | return pcmcia_request_io(p_dev); |
132 | } | 73 | } |
133 | 74 | ||
@@ -161,7 +102,7 @@ static int __devinit avma1cs_config(struct pcmcia_device *link) | |||
161 | /* | 102 | /* |
162 | * configure the PCMCIA socket | 103 | * configure the PCMCIA socket |
163 | */ | 104 | */ |
164 | i = pcmcia_request_configuration(link, &link->conf); | 105 | i = pcmcia_enable_device(link); |
165 | if (i != 0) { | 106 | if (i != 0) { |
166 | pcmcia_disable_device(link); | 107 | pcmcia_disable_device(link); |
167 | break; | 108 | break; |
@@ -175,9 +116,6 @@ static int __devinit avma1cs_config(struct pcmcia_device *link) | |||
175 | return -ENODEV; | 116 | return -ENODEV; |
176 | } | 117 | } |
177 | 118 | ||
178 | printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n", | ||
179 | (unsigned int) link->resource[0]->start, link->irq); | ||
180 | |||
181 | icard.para[0] = link->irq; | 119 | icard.para[0] = link->irq; |
182 | icard.para[1] = link->resource[0]->start; | 120 | icard.para[1] = link->resource[0]->start; |
183 | icard.protocol = isdnprot; | 121 | icard.protocol = isdnprot; |
@@ -196,14 +134,6 @@ static int __devinit avma1cs_config(struct pcmcia_device *link) | |||
196 | return 0; | 134 | return 0; |
197 | } /* avma1cs_config */ | 135 | } /* avma1cs_config */ |
198 | 136 | ||
199 | /*====================================================================== | ||
200 | |||
201 | After a card is removed, avma1cs_release() will unregister the net | ||
202 | device, and release the PCMCIA configuration. If the device is | ||
203 | still open, this will be postponed until it is closed. | ||
204 | |||
205 | ======================================================================*/ | ||
206 | |||
207 | static void avma1cs_release(struct pcmcia_device *link) | 137 | static void avma1cs_release(struct pcmcia_device *link) |
208 | { | 138 | { |
209 | unsigned long minor = (unsigned long) link->priv; | 139 | unsigned long minor = (unsigned long) link->priv; |
@@ -216,7 +146,6 @@ static void avma1cs_release(struct pcmcia_device *link) | |||
216 | pcmcia_disable_device(link); | 146 | pcmcia_disable_device(link); |
217 | } /* avma1cs_release */ | 147 | } /* avma1cs_release */ |
218 | 148 | ||
219 | |||
220 | static struct pcmcia_device_id avma1cs_ids[] = { | 149 | static struct pcmcia_device_id avma1cs_ids[] = { |
221 | PCMCIA_DEVICE_PROD_ID12("AVM", "ISDN A", 0x95d42008, 0xadc9d4bb), | 150 | PCMCIA_DEVICE_PROD_ID12("AVM", "ISDN A", 0x95d42008, 0xadc9d4bb), |
222 | PCMCIA_DEVICE_PROD_ID12("ISDN", "CARD", 0x8d9761c8, 0x01c5aa7b), | 151 | PCMCIA_DEVICE_PROD_ID12("ISDN", "CARD", 0x8d9761c8, 0x01c5aa7b), |
@@ -226,19 +155,15 @@ MODULE_DEVICE_TABLE(pcmcia, avma1cs_ids); | |||
226 | 155 | ||
227 | static struct pcmcia_driver avma1cs_driver = { | 156 | static struct pcmcia_driver avma1cs_driver = { |
228 | .owner = THIS_MODULE, | 157 | .owner = THIS_MODULE, |
229 | .drv = { | 158 | .name = "avma1_cs", |
230 | .name = "avma1_cs", | ||
231 | }, | ||
232 | .probe = avma1cs_probe, | 159 | .probe = avma1cs_probe, |
233 | .remove = __devexit_p(avma1cs_detach), | 160 | .remove = __devexit_p(avma1cs_detach), |
234 | .id_table = avma1cs_ids, | 161 | .id_table = avma1cs_ids, |
235 | }; | 162 | }; |
236 | 163 | ||
237 | /*====================================================================*/ | ||
238 | |||
239 | static int __init init_avma1_cs(void) | 164 | static int __init init_avma1_cs(void) |
240 | { | 165 | { |
241 | return(pcmcia_register_driver(&avma1cs_driver)); | 166 | return pcmcia_register_driver(&avma1cs_driver); |
242 | } | 167 | } |
243 | 168 | ||
244 | static void __exit exit_avma1_cs(void) | 169 | static void __exit exit_avma1_cs(void) |
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index b3c08aaf41c4..496d477af0f8 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c | |||
@@ -46,7 +46,6 @@ | |||
46 | #include <asm/io.h> | 46 | #include <asm/io.h> |
47 | #include <asm/system.h> | 47 | #include <asm/system.h> |
48 | 48 | ||
49 | #include <pcmcia/cs.h> | ||
50 | #include <pcmcia/cistpl.h> | 49 | #include <pcmcia/cistpl.h> |
51 | #include <pcmcia/cisreg.h> | 50 | #include <pcmcia/cisreg.h> |
52 | #include <pcmcia/ds.h> | 51 | #include <pcmcia/ds.h> |
@@ -64,26 +63,8 @@ MODULE_LICENSE("Dual MPL/GPL"); | |||
64 | static int protocol = 2; /* EURO-ISDN Default */ | 63 | static int protocol = 2; /* EURO-ISDN Default */ |
65 | module_param(protocol, int, 0); | 64 | module_param(protocol, int, 0); |
66 | 65 | ||
67 | /*====================================================================*/ | ||
68 | |||
69 | /* | ||
70 | The event() function is this driver's Card Services event handler. | ||
71 | It will be called by Card Services when an appropriate card status | ||
72 | event is received. The config() and release() entry points are | ||
73 | used to configure or release a socket, in response to card insertion | ||
74 | and ejection events. They are invoked from the elsa_cs event | ||
75 | handler. | ||
76 | */ | ||
77 | |||
78 | static int elsa_cs_config(struct pcmcia_device *link) __devinit ; | 66 | static int elsa_cs_config(struct pcmcia_device *link) __devinit ; |
79 | static void elsa_cs_release(struct pcmcia_device *link); | 67 | static void elsa_cs_release(struct pcmcia_device *link); |
80 | |||
81 | /* | ||
82 | The attach() and detach() entry points are used to create and destroy | ||
83 | "instances" of the driver, where each instance represents everything | ||
84 | needed to manage one actual PCMCIA card. | ||
85 | */ | ||
86 | |||
87 | static void elsa_cs_detach(struct pcmcia_device *p_dev) __devexit; | 68 | static void elsa_cs_detach(struct pcmcia_device *p_dev) __devexit; |
88 | 69 | ||
89 | typedef struct local_info_t { | 70 | typedef struct local_info_t { |
@@ -92,18 +73,6 @@ typedef struct local_info_t { | |||
92 | int cardnr; | 73 | int cardnr; |
93 | } local_info_t; | 74 | } local_info_t; |
94 | 75 | ||
95 | /*====================================================================== | ||
96 | |||
97 | elsa_cs_attach() creates an "instance" of the driver, allocatingx | ||
98 | local data structures for one device. The device is registered | ||
99 | with Card Services. | ||
100 | |||
101 | The dev_link structure is initialized, but we don't actually | ||
102 | configure the card at this point -- we wait until we receive a | ||
103 | card insertion event. | ||
104 | |||
105 | ======================================================================*/ | ||
106 | |||
107 | static int __devinit elsa_cs_probe(struct pcmcia_device *link) | 76 | static int __devinit elsa_cs_probe(struct pcmcia_device *link) |
108 | { | 77 | { |
109 | local_info_t *local; | 78 | local_info_t *local; |
@@ -119,31 +88,9 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link) | |||
119 | 88 | ||
120 | local->cardnr = -1; | 89 | local->cardnr = -1; |
121 | 90 | ||
122 | /* | ||
123 | General socket configuration defaults can go here. In this | ||
124 | client, we assume very little, and rely on the CIS for almost | ||
125 | everything. In most clients, many details (i.e., number, sizes, | ||
126 | and attributes of IO windows) are fixed by the nature of the | ||
127 | device, and can be hard-wired here. | ||
128 | */ | ||
129 | link->resource[0]->end = 8; | ||
130 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
131 | |||
132 | link->conf.Attributes = CONF_ENABLE_IRQ; | ||
133 | link->conf.IntType = INT_MEMORY_AND_IO; | ||
134 | |||
135 | return elsa_cs_config(link); | 91 | return elsa_cs_config(link); |
136 | } /* elsa_cs_attach */ | 92 | } /* elsa_cs_attach */ |
137 | 93 | ||
138 | /*====================================================================== | ||
139 | |||
140 | This deletes a driver "instance". The device is de-registered | ||
141 | with Card Services. If it has been released, all local data | ||
142 | structures are freed. Otherwise, the structures will be freed | ||
143 | when the device is released. | ||
144 | |||
145 | ======================================================================*/ | ||
146 | |||
147 | static void __devexit elsa_cs_detach(struct pcmcia_device *link) | 94 | static void __devexit elsa_cs_detach(struct pcmcia_device *link) |
148 | { | 95 | { |
149 | local_info_t *info = link->priv; | 96 | local_info_t *info = link->priv; |
@@ -156,27 +103,17 @@ static void __devexit elsa_cs_detach(struct pcmcia_device *link) | |||
156 | kfree(info); | 103 | kfree(info); |
157 | } /* elsa_cs_detach */ | 104 | } /* elsa_cs_detach */ |
158 | 105 | ||
159 | /*====================================================================== | 106 | static int elsa_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data) |
160 | |||
161 | elsa_cs_config() is scheduled to run after a CARD_INSERTION event | ||
162 | is received, to configure the PCMCIA socket, and to make the | ||
163 | device available to the system. | ||
164 | |||
165 | ======================================================================*/ | ||
166 | |||
167 | static int elsa_cs_configcheck(struct pcmcia_device *p_dev, | ||
168 | cistpl_cftable_entry_t *cf, | ||
169 | cistpl_cftable_entry_t *dflt, | ||
170 | unsigned int vcc, | ||
171 | void *priv_data) | ||
172 | { | 107 | { |
173 | int j; | 108 | int j; |
174 | 109 | ||
175 | p_dev->io_lines = 3; | 110 | p_dev->io_lines = 3; |
111 | p_dev->resource[0]->end = 8; | ||
112 | p_dev->resource[0]->flags &= IO_DATA_PATH_WIDTH; | ||
113 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
176 | 114 | ||
177 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { | 115 | if ((p_dev->resource[0]->end) && p_dev->resource[0]->start) { |
178 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); | 116 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); |
179 | p_dev->resource[0]->start = cf->io.win[0].base; | ||
180 | if (!pcmcia_request_io(p_dev)) | 117 | if (!pcmcia_request_io(p_dev)) |
181 | return 0; | 118 | return 0; |
182 | } else { | 119 | } else { |
@@ -199,6 +136,8 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link) | |||
199 | dev_dbg(&link->dev, "elsa_config(0x%p)\n", link); | 136 | dev_dbg(&link->dev, "elsa_config(0x%p)\n", link); |
200 | dev = link->priv; | 137 | dev = link->priv; |
201 | 138 | ||
139 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; | ||
140 | |||
202 | i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL); | 141 | i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL); |
203 | if (i != 0) | 142 | if (i != 0) |
204 | goto failed; | 143 | goto failed; |
@@ -206,21 +145,10 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link) | |||
206 | if (!link->irq) | 145 | if (!link->irq) |
207 | goto failed; | 146 | goto failed; |
208 | 147 | ||
209 | i = pcmcia_request_configuration(link, &link->conf); | 148 | i = pcmcia_enable_device(link); |
210 | if (i != 0) | 149 | if (i != 0) |
211 | goto failed; | 150 | goto failed; |
212 | 151 | ||
213 | /* Finally, report what we've done */ | ||
214 | dev_info(&link->dev, "index 0x%02x: ", | ||
215 | link->conf.ConfigIndex); | ||
216 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | ||
217 | printk(", irq %d", link->irq); | ||
218 | if (link->resource[0]) | ||
219 | printk(" & %pR", link->resource[0]); | ||
220 | if (link->resource[1]) | ||
221 | printk(" & %pR", link->resource[1]); | ||
222 | printk("\n"); | ||
223 | |||
224 | icard.para[0] = link->irq; | 152 | icard.para[0] = link->irq; |
225 | icard.para[1] = link->resource[0]->start; | 153 | icard.para[1] = link->resource[0]->start; |
226 | icard.protocol = protocol; | 154 | icard.protocol = protocol; |
@@ -240,14 +168,6 @@ failed: | |||
240 | return -ENODEV; | 168 | return -ENODEV; |
241 | } /* elsa_cs_config */ | 169 | } /* elsa_cs_config */ |
242 | 170 | ||
243 | /*====================================================================== | ||
244 | |||
245 | After a card is removed, elsa_cs_release() will unregister the net | ||
246 | device, and release the PCMCIA configuration. If the device is | ||
247 | still open, this will be postponed until it is closed. | ||
248 | |||
249 | ======================================================================*/ | ||
250 | |||
251 | static void elsa_cs_release(struct pcmcia_device *link) | 171 | static void elsa_cs_release(struct pcmcia_device *link) |
252 | { | 172 | { |
253 | local_info_t *local = link->priv; | 173 | local_info_t *local = link->priv; |
@@ -291,9 +211,7 @@ MODULE_DEVICE_TABLE(pcmcia, elsa_ids); | |||
291 | 211 | ||
292 | static struct pcmcia_driver elsa_cs_driver = { | 212 | static struct pcmcia_driver elsa_cs_driver = { |
293 | .owner = THIS_MODULE, | 213 | .owner = THIS_MODULE, |
294 | .drv = { | 214 | .name = "elsa_cs", |
295 | .name = "elsa_cs", | ||
296 | }, | ||
297 | .probe = elsa_cs_probe, | 215 | .probe = elsa_cs_probe, |
298 | .remove = __devexit_p(elsa_cs_detach), | 216 | .remove = __devexit_p(elsa_cs_detach), |
299 | .id_table = elsa_ids, | 217 | .id_table = elsa_ids, |
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index a024192b672a..360204bc2777 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c | |||
@@ -46,7 +46,6 @@ | |||
46 | #include <asm/io.h> | 46 | #include <asm/io.h> |
47 | #include <asm/system.h> | 47 | #include <asm/system.h> |
48 | 48 | ||
49 | #include <pcmcia/cs.h> | ||
50 | #include <pcmcia/cistpl.h> | 49 | #include <pcmcia/cistpl.h> |
51 | #include <pcmcia/cisreg.h> | 50 | #include <pcmcia/cisreg.h> |
52 | #include <pcmcia/ds.h> | 51 | #include <pcmcia/ds.h> |
@@ -64,26 +63,9 @@ MODULE_LICENSE("Dual MPL/GPL"); | |||
64 | static int protocol = 2; /* EURO-ISDN Default */ | 63 | static int protocol = 2; /* EURO-ISDN Default */ |
65 | module_param(protocol, int, 0); | 64 | module_param(protocol, int, 0); |
66 | 65 | ||
67 | /*====================================================================*/ | ||
68 | |||
69 | /* | ||
70 | The event() function is this driver's Card Services event handler. | ||
71 | It will be called by Card Services when an appropriate card status | ||
72 | event is received. The config() and release() entry points are | ||
73 | used to configure or release a socket, in response to card | ||
74 | insertion and ejection events. They are invoked from the sedlbauer | ||
75 | event handler. | ||
76 | */ | ||
77 | |||
78 | static int sedlbauer_config(struct pcmcia_device *link) __devinit ; | 66 | static int sedlbauer_config(struct pcmcia_device *link) __devinit ; |
79 | static void sedlbauer_release(struct pcmcia_device *link); | 67 | static void sedlbauer_release(struct pcmcia_device *link); |
80 | 68 | ||
81 | /* | ||
82 | The attach() and detach() entry points are used to create and destroy | ||
83 | "instances" of the driver, where each instance represents everything | ||
84 | needed to manage one actual PCMCIA card. | ||
85 | */ | ||
86 | |||
87 | static void sedlbauer_detach(struct pcmcia_device *p_dev) __devexit; | 69 | static void sedlbauer_detach(struct pcmcia_device *p_dev) __devexit; |
88 | 70 | ||
89 | typedef struct local_info_t { | 71 | typedef struct local_info_t { |
@@ -92,18 +74,6 @@ typedef struct local_info_t { | |||
92 | int cardnr; | 74 | int cardnr; |
93 | } local_info_t; | 75 | } local_info_t; |
94 | 76 | ||
95 | /*====================================================================== | ||
96 | |||
97 | sedlbauer_attach() creates an "instance" of the driver, allocating | ||
98 | local data structures for one device. The device is registered | ||
99 | with Card Services. | ||
100 | |||
101 | The dev_link structure is initialized, but we don't actually | ||
102 | configure the card at this point -- we wait until we receive a | ||
103 | card insertion event. | ||
104 | |||
105 | ======================================================================*/ | ||
106 | |||
107 | static int __devinit sedlbauer_probe(struct pcmcia_device *link) | 77 | static int __devinit sedlbauer_probe(struct pcmcia_device *link) |
108 | { | 78 | { |
109 | local_info_t *local; | 79 | local_info_t *local; |
@@ -118,35 +88,9 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link) | |||
118 | local->p_dev = link; | 88 | local->p_dev = link; |
119 | link->priv = local; | 89 | link->priv = local; |
120 | 90 | ||
121 | /* | ||
122 | General socket configuration defaults can go here. In this | ||
123 | client, we assume very little, and rely on the CIS for almost | ||
124 | everything. In most clients, many details (i.e., number, sizes, | ||
125 | and attributes of IO windows) are fixed by the nature of the | ||
126 | device, and can be hard-wired here. | ||
127 | */ | ||
128 | |||
129 | /* from old sedl_cs | ||
130 | */ | ||
131 | /* The io structure describes IO port mapping */ | ||
132 | link->resource[0]->end = 8; | ||
133 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
134 | |||
135 | link->conf.Attributes = 0; | ||
136 | link->conf.IntType = INT_MEMORY_AND_IO; | ||
137 | |||
138 | return sedlbauer_config(link); | 91 | return sedlbauer_config(link); |
139 | } /* sedlbauer_attach */ | 92 | } /* sedlbauer_attach */ |
140 | 93 | ||
141 | /*====================================================================== | ||
142 | |||
143 | This deletes a driver "instance". The device is de-registered | ||
144 | with Card Services. If it has been released, all local data | ||
145 | structures are freed. Otherwise, the structures will be freed | ||
146 | when the device is released. | ||
147 | |||
148 | ======================================================================*/ | ||
149 | |||
150 | static void __devexit sedlbauer_detach(struct pcmcia_device *link) | 94 | static void __devexit sedlbauer_detach(struct pcmcia_device *link) |
151 | { | 95 | { |
152 | dev_dbg(&link->dev, "sedlbauer_detach(0x%p)\n", link); | 96 | dev_dbg(&link->dev, "sedlbauer_detach(0x%p)\n", link); |
@@ -158,70 +102,15 @@ static void __devexit sedlbauer_detach(struct pcmcia_device *link) | |||
158 | kfree(link->priv); | 102 | kfree(link->priv); |
159 | } /* sedlbauer_detach */ | 103 | } /* sedlbauer_detach */ |
160 | 104 | ||
161 | /*====================================================================== | 105 | static int sedlbauer_config_check(struct pcmcia_device *p_dev, void *priv_data) |
162 | |||
163 | sedlbauer_config() is scheduled to run after a CARD_INSERTION event | ||
164 | is received, to configure the PCMCIA socket, and to make the | ||
165 | device available to the system. | ||
166 | |||
167 | ======================================================================*/ | ||
168 | static int sedlbauer_config_check(struct pcmcia_device *p_dev, | ||
169 | cistpl_cftable_entry_t *cfg, | ||
170 | cistpl_cftable_entry_t *dflt, | ||
171 | unsigned int vcc, | ||
172 | void *priv_data) | ||
173 | { | 106 | { |
174 | if (cfg->index == 0) | 107 | if (p_dev->config_index == 0) |
175 | return -ENODEV; | 108 | return -EINVAL; |
176 | |||
177 | /* Does this card need audio output? */ | ||
178 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) { | ||
179 | p_dev->conf.Attributes |= CONF_ENABLE_SPKR; | ||
180 | p_dev->conf.Status = CCSR_AUDIO_ENA; | ||
181 | } | ||
182 | 109 | ||
183 | /* Use power settings for Vcc and Vpp if present */ | 110 | p_dev->io_lines = 3; |
184 | /* Note that the CIS values need to be rescaled */ | 111 | return pcmcia_request_io(p_dev); |
185 | if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) { | ||
186 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) | ||
187 | return -ENODEV; | ||
188 | } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) { | ||
189 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000) | ||
190 | return -ENODEV; | ||
191 | } | ||
192 | |||
193 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
194 | p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
195 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
196 | p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
197 | |||
198 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | ||
199 | |||
200 | /* IO window settings */ | ||
201 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; | ||
202 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | ||
203 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | ||
204 | p_dev->resource[0]->start = io->win[0].base; | ||
205 | p_dev->resource[0]->end = io->win[0].len; | ||
206 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; | ||
207 | p_dev->resource[0]->flags |= | ||
208 | pcmcia_io_cfg_data_width(io->flags); | ||
209 | if (io->nwin > 1) { | ||
210 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; | ||
211 | p_dev->resource[1]->start = io->win[1].base; | ||
212 | p_dev->resource[1]->end = io->win[1].len; | ||
213 | } | ||
214 | /* This reserves IO space but doesn't actually enable it */ | ||
215 | p_dev->io_lines = 3; | ||
216 | if (pcmcia_request_io(p_dev) != 0) | ||
217 | return -ENODEV; | ||
218 | } | ||
219 | |||
220 | return 0; | ||
221 | } | 112 | } |
222 | 113 | ||
223 | |||
224 | |||
225 | static int __devinit sedlbauer_config(struct pcmcia_device *link) | 114 | static int __devinit sedlbauer_config(struct pcmcia_device *link) |
226 | { | 115 | { |
227 | int ret; | 116 | int ret; |
@@ -229,44 +118,17 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link) | |||
229 | 118 | ||
230 | dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link); | 119 | dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link); |
231 | 120 | ||
232 | /* | 121 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC | |
233 | In this loop, we scan the CIS for configuration table entries, | 122 | CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; |
234 | each of which describes a valid card configuration, including | 123 | |
235 | voltage, IO window, memory window, and interrupt settings. | ||
236 | |||
237 | We make no assumptions about the card to be configured: we use | ||
238 | just the information available in the CIS. In an ideal world, | ||
239 | this would work for any PCMCIA card, but it requires a complete | ||
240 | and accurate CIS. In practice, a driver usually "knows" most of | ||
241 | these things without consulting the CIS, and most client drivers | ||
242 | will only use the CIS to fill in implementation-defined details. | ||
243 | */ | ||
244 | ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL); | 124 | ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL); |
245 | if (ret) | 125 | if (ret) |
246 | goto failed; | 126 | goto failed; |
247 | 127 | ||
248 | /* | 128 | ret = pcmcia_enable_device(link); |
249 | This actually configures the PCMCIA socket -- setting up | ||
250 | the I/O windows and the interrupt mapping, and putting the | ||
251 | card and host interface into "Memory and IO" mode. | ||
252 | */ | ||
253 | ret = pcmcia_request_configuration(link, &link->conf); | ||
254 | if (ret) | 129 | if (ret) |
255 | goto failed; | 130 | goto failed; |
256 | 131 | ||
257 | /* Finally, report what we've done */ | ||
258 | dev_info(&link->dev, "index 0x%02x:", | ||
259 | link->conf.ConfigIndex); | ||
260 | if (link->conf.Vpp) | ||
261 | printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); | ||
262 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | ||
263 | printk(", irq %d", link->irq); | ||
264 | if (link->resource[0]) | ||
265 | printk(" & %pR", link->resource[0]); | ||
266 | if (link->resource[1]) | ||
267 | printk(" & %pR", link->resource[1]); | ||
268 | printk("\n"); | ||
269 | |||
270 | icard.para[0] = link->irq; | 132 | icard.para[0] = link->irq; |
271 | icard.para[1] = link->resource[0]->start; | 133 | icard.para[1] = link->resource[0]->start; |
272 | icard.protocol = protocol; | 134 | icard.protocol = protocol; |
@@ -290,14 +152,6 @@ failed: | |||
290 | 152 | ||
291 | } /* sedlbauer_config */ | 153 | } /* sedlbauer_config */ |
292 | 154 | ||
293 | /*====================================================================== | ||
294 | |||
295 | After a card is removed, sedlbauer_release() will unregister the | ||
296 | device, and release the PCMCIA configuration. If the device is | ||
297 | still open, this will be postponed until it is closed. | ||
298 | |||
299 | ======================================================================*/ | ||
300 | |||
301 | static void sedlbauer_release(struct pcmcia_device *link) | 155 | static void sedlbauer_release(struct pcmcia_device *link) |
302 | { | 156 | { |
303 | local_info_t *local = link->priv; | 157 | local_info_t *local = link->priv; |
@@ -346,9 +200,7 @@ MODULE_DEVICE_TABLE(pcmcia, sedlbauer_ids); | |||
346 | 200 | ||
347 | static struct pcmcia_driver sedlbauer_driver = { | 201 | static struct pcmcia_driver sedlbauer_driver = { |
348 | .owner = THIS_MODULE, | 202 | .owner = THIS_MODULE, |
349 | .drv = { | 203 | .name = "sedlbauer_cs", |
350 | .name = "sedlbauer_cs", | ||
351 | }, | ||
352 | .probe = sedlbauer_probe, | 204 | .probe = sedlbauer_probe, |
353 | .remove = __devexit_p(sedlbauer_detach), | 205 | .remove = __devexit_p(sedlbauer_detach), |
354 | .id_table = sedlbauer_ids, | 206 | .id_table = sedlbauer_ids, |
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index 7296102ca255..282a4467ef19 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <asm/io.h> | 27 | #include <asm/io.h> |
28 | #include <asm/system.h> | 28 | #include <asm/system.h> |
29 | 29 | ||
30 | #include <pcmcia/cs.h> | ||
31 | #include <pcmcia/cistpl.h> | 30 | #include <pcmcia/cistpl.h> |
32 | #include <pcmcia/cisreg.h> | 31 | #include <pcmcia/cisreg.h> |
33 | #include <pcmcia/ds.h> | 32 | #include <pcmcia/ds.h> |
@@ -45,26 +44,8 @@ MODULE_LICENSE("GPL"); | |||
45 | static int protocol = 2; /* EURO-ISDN Default */ | 44 | static int protocol = 2; /* EURO-ISDN Default */ |
46 | module_param(protocol, int, 0); | 45 | module_param(protocol, int, 0); |
47 | 46 | ||
48 | /*====================================================================*/ | ||
49 | |||
50 | /* | ||
51 | The event() function is this driver's Card Services event handler. | ||
52 | It will be called by Card Services when an appropriate card status | ||
53 | event is received. The config() and release() entry points are | ||
54 | used to configure or release a socket, in response to card insertion | ||
55 | and ejection events. They are invoked from the teles_cs event | ||
56 | handler. | ||
57 | */ | ||
58 | |||
59 | static int teles_cs_config(struct pcmcia_device *link) __devinit ; | 47 | static int teles_cs_config(struct pcmcia_device *link) __devinit ; |
60 | static void teles_cs_release(struct pcmcia_device *link); | 48 | static void teles_cs_release(struct pcmcia_device *link); |
61 | |||
62 | /* | ||
63 | The attach() and detach() entry points are used to create and destroy | ||
64 | "instances" of the driver, where each instance represents everything | ||
65 | needed to manage one actual PCMCIA card. | ||
66 | */ | ||
67 | |||
68 | static void teles_detach(struct pcmcia_device *p_dev) __devexit ; | 49 | static void teles_detach(struct pcmcia_device *p_dev) __devexit ; |
69 | 50 | ||
70 | typedef struct local_info_t { | 51 | typedef struct local_info_t { |
@@ -73,18 +54,6 @@ typedef struct local_info_t { | |||
73 | int cardnr; | 54 | int cardnr; |
74 | } local_info_t; | 55 | } local_info_t; |
75 | 56 | ||
76 | /*====================================================================== | ||
77 | |||
78 | teles_attach() creates an "instance" of the driver, allocatingx | ||
79 | local data structures for one device. The device is registered | ||
80 | with Card Services. | ||
81 | |||
82 | The dev_link structure is initialized, but we don't actually | ||
83 | configure the card at this point -- we wait until we receive a | ||
84 | card insertion event. | ||
85 | |||
86 | ======================================================================*/ | ||
87 | |||
88 | static int __devinit teles_probe(struct pcmcia_device *link) | 57 | static int __devinit teles_probe(struct pcmcia_device *link) |
89 | { | 58 | { |
90 | local_info_t *local; | 59 | local_info_t *local; |
@@ -99,31 +68,11 @@ static int __devinit teles_probe(struct pcmcia_device *link) | |||
99 | local->p_dev = link; | 68 | local->p_dev = link; |
100 | link->priv = local; | 69 | link->priv = local; |
101 | 70 | ||
102 | /* | 71 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; |
103 | General socket configuration defaults can go here. In this | ||
104 | client, we assume very little, and rely on the CIS for almost | ||
105 | everything. In most clients, many details (i.e., number, sizes, | ||
106 | and attributes of IO windows) are fixed by the nature of the | ||
107 | device, and can be hard-wired here. | ||
108 | */ | ||
109 | link->resource[0]->end = 96; | ||
110 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
111 | |||
112 | link->conf.Attributes = CONF_ENABLE_IRQ; | ||
113 | link->conf.IntType = INT_MEMORY_AND_IO; | ||
114 | 72 | ||
115 | return teles_cs_config(link); | 73 | return teles_cs_config(link); |
116 | } /* teles_attach */ | 74 | } /* teles_attach */ |
117 | 75 | ||
118 | /*====================================================================== | ||
119 | |||
120 | This deletes a driver "instance". The device is de-registered | ||
121 | with Card Services. If it has been released, all local data | ||
122 | structures are freed. Otherwise, the structures will be freed | ||
123 | when the device is released. | ||
124 | |||
125 | ======================================================================*/ | ||
126 | |||
127 | static void __devexit teles_detach(struct pcmcia_device *link) | 76 | static void __devexit teles_detach(struct pcmcia_device *link) |
128 | { | 77 | { |
129 | local_info_t *info = link->priv; | 78 | local_info_t *info = link->priv; |
@@ -136,27 +85,17 @@ static void __devexit teles_detach(struct pcmcia_device *link) | |||
136 | kfree(info); | 85 | kfree(info); |
137 | } /* teles_detach */ | 86 | } /* teles_detach */ |
138 | 87 | ||
139 | /*====================================================================== | 88 | static int teles_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data) |
140 | |||
141 | teles_cs_config() is scheduled to run after a CARD_INSERTION event | ||
142 | is received, to configure the PCMCIA socket, and to make the | ||
143 | device available to the system. | ||
144 | |||
145 | ======================================================================*/ | ||
146 | |||
147 | static int teles_cs_configcheck(struct pcmcia_device *p_dev, | ||
148 | cistpl_cftable_entry_t *cf, | ||
149 | cistpl_cftable_entry_t *dflt, | ||
150 | unsigned int vcc, | ||
151 | void *priv_data) | ||
152 | { | 89 | { |
153 | int j; | 90 | int j; |
154 | 91 | ||
155 | p_dev->io_lines = 5; | 92 | p_dev->io_lines = 5; |
93 | p_dev->resource[0]->end = 96; | ||
94 | p_dev->resource[0]->flags &= IO_DATA_PATH_WIDTH; | ||
95 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
156 | 96 | ||
157 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { | 97 | if ((p_dev->resource[0]->end) && p_dev->resource[0]->start) { |
158 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); | 98 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); |
159 | p_dev->resource[0]->start = cf->io.win[0].base; | ||
160 | if (!pcmcia_request_io(p_dev)) | 99 | if (!pcmcia_request_io(p_dev)) |
161 | return 0; | 100 | return 0; |
162 | } else { | 101 | } else { |
@@ -186,21 +125,10 @@ static int __devinit teles_cs_config(struct pcmcia_device *link) | |||
186 | if (!link->irq) | 125 | if (!link->irq) |
187 | goto cs_failed; | 126 | goto cs_failed; |
188 | 127 | ||
189 | i = pcmcia_request_configuration(link, &link->conf); | 128 | i = pcmcia_enable_device(link); |
190 | if (i != 0) | 129 | if (i != 0) |
191 | goto cs_failed; | 130 | goto cs_failed; |
192 | 131 | ||
193 | /* Finally, report what we've done */ | ||
194 | dev_info(&link->dev, "index 0x%02x:", | ||
195 | link->conf.ConfigIndex); | ||
196 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | ||
197 | printk(", irq %d", link->irq); | ||
198 | if (link->resource[0]) | ||
199 | printk(" & %pR", link->resource[0]); | ||
200 | if (link->resource[1]) | ||
201 | printk(" & %pR", link->resource[1]); | ||
202 | printk("\n"); | ||
203 | |||
204 | icard.para[0] = link->irq; | 132 | icard.para[0] = link->irq; |
205 | icard.para[1] = link->resource[0]->start; | 133 | icard.para[1] = link->resource[0]->start; |
206 | icard.protocol = protocol; | 134 | icard.protocol = protocol; |
@@ -222,14 +150,6 @@ cs_failed: | |||
222 | return -ENODEV; | 150 | return -ENODEV; |
223 | } /* teles_cs_config */ | 151 | } /* teles_cs_config */ |
224 | 152 | ||
225 | /*====================================================================== | ||
226 | |||
227 | After a card is removed, teles_cs_release() will unregister the net | ||
228 | device, and release the PCMCIA configuration. If the device is | ||
229 | still open, this will be postponed until it is closed. | ||
230 | |||
231 | ======================================================================*/ | ||
232 | |||
233 | static void teles_cs_release(struct pcmcia_device *link) | 153 | static void teles_cs_release(struct pcmcia_device *link) |
234 | { | 154 | { |
235 | local_info_t *local = link->priv; | 155 | local_info_t *local = link->priv; |
@@ -273,9 +193,7 @@ MODULE_DEVICE_TABLE(pcmcia, teles_ids); | |||
273 | 193 | ||
274 | static struct pcmcia_driver teles_cs_driver = { | 194 | static struct pcmcia_driver teles_cs_driver = { |
275 | .owner = THIS_MODULE, | 195 | .owner = THIS_MODULE, |
276 | .drv = { | 196 | .name = "teles_cs", |
277 | .name = "teles_cs", | ||
278 | }, | ||
279 | .probe = teles_probe, | 197 | .probe = teles_probe, |
280 | .remove = __devexit_p(teles_detach), | 198 | .remove = __devexit_p(teles_detach), |
281 | .id_table = teles_ids, | 199 | .id_table = teles_ids, |