diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-13 17:12:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-13 17:12:40 -0400 |
commit | 2be4ff2f084842839b041b793ed6237e8d1d315a (patch) | |
tree | 1d776ac1717edeff4ee7d59ab0aea2782cb86dba /drivers/isdn | |
parent | cf2fa66055d718ae13e62451bb546505f63906a2 (diff) | |
parent | a45b3fb19ba1e4dfc3fc53563a072612092930a9 (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: (49 commits)
pcmcia: ioctl-internal definitions
pcmcia: cistpl header cleanup
pcmcia: remove unused argument to pcmcia_parse_tuple()
pcmcia: card services header cleanup
pcmcia: device_id header cleanup
pcmcia: encapsulate ioaddr_t
pcmcia: cleanup device driver header file
pcmcia: cleanup socket services header file
pcmcia: merge ds_internal.h into cs_internal.h
pcmcia: cleanup cs_internal.h
pcmcia: cs_internal.h is internal
pcmcia: use dev_printk for cs_error()
pcmcia: remove CS_ error codes alltogether
pcmcia: deprecate CS_BAD_TUPLE
pcmcia: deprecate CS_BAD_ARGS
pcmcia: deprecate CS_BAD_BASE, CS_BAD_IRQ, CS_BAD_OFFSET and CS_BAD_SIZE
pcmcia: deprecate CS_BAD_ATTRIBUTE, CS_BAD_TYPE and CS_BAD_PAGE
pcmcia: deprecate CS_NO_MORE_ITEMS
pcmcia: deprecate CS_IN_USE
pcmcia: deprecate CS_CONFIGURATION_LOCKED
...
Fix trivial conflict in drivers/pcmcia/ds.c manually
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/hardware/avm/avm_cs.c | 85 | ||||
-rw-r--r-- | drivers/isdn/hisax/avma1_cs.c | 81 | ||||
-rw-r--r-- | drivers/isdn/hisax/elsa_cs.c | 79 | ||||
-rw-r--r-- | drivers/isdn/hisax/sedlbauer_cs.c | 197 | ||||
-rw-r--r-- | drivers/isdn/hisax/teles_cs.c | 79 |
5 files changed, 192 insertions, 329 deletions
diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c index a5b941c327f..c72565520e4 100644 --- a/drivers/isdn/hardware/avm/avm_cs.c +++ b/drivers/isdn/hardware/avm/avm_cs.c | |||
@@ -154,83 +154,50 @@ static void avmcs_detach(struct pcmcia_device *link) | |||
154 | 154 | ||
155 | ======================================================================*/ | 155 | ======================================================================*/ |
156 | 156 | ||
157 | static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, | 157 | static int avmcs_configcheck(struct pcmcia_device *p_dev, |
158 | cisparse_t *parse) | 158 | cistpl_cftable_entry_t *cf, |
159 | cistpl_cftable_entry_t *dflt, | ||
160 | unsigned int vcc, | ||
161 | void *priv_data) | ||
159 | { | 162 | { |
160 | int i = pcmcia_get_tuple_data(handle, tuple); | 163 | if (cf->io.nwin <= 0) |
161 | if (i != CS_SUCCESS) return i; | 164 | return -ENODEV; |
162 | return pcmcia_parse_tuple(handle, tuple, parse); | 165 | |
163 | } | 166 | p_dev->io.BasePort1 = cf->io.win[0].base; |
164 | 167 | p_dev->io.NumPorts1 = cf->io.win[0].len; | |
165 | static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, | 168 | p_dev->io.NumPorts2 = 0; |
166 | cisparse_t *parse) | 169 | printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n", |
167 | { | 170 | p_dev->io.BasePort1, |
168 | int i = pcmcia_get_first_tuple(handle, tuple); | 171 | p_dev->io.BasePort1+p_dev->io.NumPorts1-1); |
169 | if (i != CS_SUCCESS) return i; | 172 | return pcmcia_request_io(p_dev, &p_dev->io); |
170 | return get_tuple(handle, tuple, parse); | ||
171 | } | ||
172 | |||
173 | static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
174 | cisparse_t *parse) | ||
175 | { | ||
176 | int i = pcmcia_get_next_tuple(handle, tuple); | ||
177 | if (i != CS_SUCCESS) return i; | ||
178 | return get_tuple(handle, tuple, parse); | ||
179 | } | 173 | } |
180 | 174 | ||
181 | static int avmcs_config(struct pcmcia_device *link) | 175 | static int avmcs_config(struct pcmcia_device *link) |
182 | { | 176 | { |
183 | tuple_t tuple; | ||
184 | cisparse_t parse; | ||
185 | cistpl_cftable_entry_t *cf = &parse.cftable_entry; | ||
186 | local_info_t *dev; | 177 | local_info_t *dev; |
187 | int i; | 178 | int i; |
188 | u_char buf[64]; | ||
189 | char devname[128]; | 179 | char devname[128]; |
190 | int cardtype; | 180 | int cardtype; |
191 | int (*addcard)(unsigned int port, unsigned irq); | 181 | int (*addcard)(unsigned int port, unsigned irq); |
192 | 182 | ||
193 | dev = link->priv; | 183 | dev = link->priv; |
194 | 184 | ||
195 | do { | 185 | devname[0] = 0; |
196 | devname[0] = 0; | 186 | if (link->prod_id[1]) |
197 | if (link->prod_id[1]) | 187 | strlcpy(devname, link->prod_id[1], sizeof(devname)); |
198 | strlcpy(devname, link->prod_id[1], sizeof(devname)); | ||
199 | 188 | ||
200 | /* | 189 | /* |
201 | * find IO port | 190 | * find IO port |
202 | */ | 191 | */ |
203 | tuple.TupleData = (cisdata_t *)buf; | 192 | if (pcmcia_loop_config(link, avmcs_configcheck, NULL)) |
204 | tuple.TupleOffset = 0; tuple.TupleDataMax = 255; | 193 | return -ENODEV; |
205 | tuple.Attributes = 0; | ||
206 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
207 | i = first_tuple(link, &tuple, &parse); | ||
208 | while (i == CS_SUCCESS) { | ||
209 | if (cf->io.nwin > 0) { | ||
210 | link->conf.ConfigIndex = cf->index; | ||
211 | link->io.BasePort1 = cf->io.win[0].base; | ||
212 | link->io.NumPorts1 = cf->io.win[0].len; | ||
213 | link->io.NumPorts2 = 0; | ||
214 | printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n", | ||
215 | link->io.BasePort1, | ||
216 | link->io.BasePort1+link->io.NumPorts1-1); | ||
217 | i = pcmcia_request_io(link, &link->io); | ||
218 | if (i == CS_SUCCESS) goto found_port; | ||
219 | } | ||
220 | i = next_tuple(link, &tuple, &parse); | ||
221 | } | ||
222 | |||
223 | found_port: | ||
224 | if (i != CS_SUCCESS) { | ||
225 | cs_error(link, RequestIO, i); | ||
226 | break; | ||
227 | } | ||
228 | 194 | ||
195 | do { | ||
229 | /* | 196 | /* |
230 | * allocate an interrupt line | 197 | * allocate an interrupt line |
231 | */ | 198 | */ |
232 | i = pcmcia_request_irq(link, &link->irq); | 199 | i = pcmcia_request_irq(link, &link->irq); |
233 | if (i != CS_SUCCESS) { | 200 | if (i != 0) { |
234 | cs_error(link, RequestIRQ, i); | 201 | cs_error(link, RequestIRQ, i); |
235 | /* undo */ | 202 | /* undo */ |
236 | pcmcia_disable_device(link); | 203 | pcmcia_disable_device(link); |
@@ -241,7 +208,7 @@ found_port: | |||
241 | * configure the PCMCIA socket | 208 | * configure the PCMCIA socket |
242 | */ | 209 | */ |
243 | i = pcmcia_request_configuration(link, &link->conf); | 210 | i = pcmcia_request_configuration(link, &link->conf); |
244 | if (i != CS_SUCCESS) { | 211 | if (i != 0) { |
245 | cs_error(link, RequestConfiguration, i); | 212 | cs_error(link, RequestConfiguration, i); |
246 | pcmcia_disable_device(link); | 213 | pcmcia_disable_device(link); |
247 | break; | 214 | break; |
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index fc6cc2c065b..23560c897ec 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c | |||
@@ -174,38 +174,29 @@ static void avma1cs_detach(struct pcmcia_device *link) | |||
174 | 174 | ||
175 | ======================================================================*/ | 175 | ======================================================================*/ |
176 | 176 | ||
177 | static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, | 177 | static int avma1cs_configcheck(struct pcmcia_device *p_dev, |
178 | cisparse_t *parse) | 178 | cistpl_cftable_entry_t *cf, |
179 | cistpl_cftable_entry_t *dflt, | ||
180 | unsigned int vcc, | ||
181 | void *priv_data) | ||
179 | { | 182 | { |
180 | int i = pcmcia_get_tuple_data(handle, tuple); | 183 | if (cf->io.nwin <= 0) |
181 | if (i != CS_SUCCESS) return i; | 184 | return -ENODEV; |
182 | return pcmcia_parse_tuple(handle, tuple, parse); | 185 | |
186 | p_dev->io.BasePort1 = cf->io.win[0].base; | ||
187 | p_dev->io.NumPorts1 = cf->io.win[0].len; | ||
188 | p_dev->io.NumPorts2 = 0; | ||
189 | printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n", | ||
190 | p_dev->io.BasePort1, | ||
191 | p_dev->io.BasePort1+p_dev->io.NumPorts1-1); | ||
192 | return pcmcia_request_io(p_dev, &p_dev->io); | ||
183 | } | 193 | } |
184 | 194 | ||
185 | static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
186 | cisparse_t *parse) | ||
187 | { | ||
188 | int i = pcmcia_get_first_tuple(handle, tuple); | ||
189 | if (i != CS_SUCCESS) return i; | ||
190 | return get_tuple(handle, tuple, parse); | ||
191 | } | ||
192 | |||
193 | static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
194 | cisparse_t *parse) | ||
195 | { | ||
196 | int i = pcmcia_get_next_tuple(handle, tuple); | ||
197 | if (i != CS_SUCCESS) return i; | ||
198 | return get_tuple(handle, tuple, parse); | ||
199 | } | ||
200 | 195 | ||
201 | static int avma1cs_config(struct pcmcia_device *link) | 196 | static int avma1cs_config(struct pcmcia_device *link) |
202 | { | 197 | { |
203 | tuple_t tuple; | ||
204 | cisparse_t parse; | ||
205 | cistpl_cftable_entry_t *cf = &parse.cftable_entry; | ||
206 | local_info_t *dev; | 198 | local_info_t *dev; |
207 | int i; | 199 | int i; |
208 | u_char buf[64]; | ||
209 | char devname[128]; | 200 | char devname[128]; |
210 | IsdnCard_t icard; | 201 | IsdnCard_t icard; |
211 | int busy = 0; | 202 | int busy = 0; |
@@ -214,45 +205,19 @@ static int avma1cs_config(struct pcmcia_device *link) | |||
214 | 205 | ||
215 | DEBUG(0, "avma1cs_config(0x%p)\n", link); | 206 | DEBUG(0, "avma1cs_config(0x%p)\n", link); |
216 | 207 | ||
217 | do { | 208 | devname[0] = 0; |
218 | devname[0] = 0; | 209 | if (link->prod_id[1]) |
219 | if (link->prod_id[1]) | 210 | strlcpy(devname, link->prod_id[1], sizeof(devname)); |
220 | strlcpy(devname, link->prod_id[1], sizeof(devname)); | ||
221 | 211 | ||
222 | /* | 212 | if (pcmcia_loop_config(link, avma1cs_configcheck, NULL)) |
223 | * find IO port | 213 | return -ENODEV; |
224 | */ | ||
225 | tuple.TupleData = (cisdata_t *)buf; | ||
226 | tuple.TupleOffset = 0; tuple.TupleDataMax = 255; | ||
227 | tuple.Attributes = 0; | ||
228 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
229 | i = first_tuple(link, &tuple, &parse); | ||
230 | while (i == CS_SUCCESS) { | ||
231 | if (cf->io.nwin > 0) { | ||
232 | link->conf.ConfigIndex = cf->index; | ||
233 | link->io.BasePort1 = cf->io.win[0].base; | ||
234 | link->io.NumPorts1 = cf->io.win[0].len; | ||
235 | link->io.NumPorts2 = 0; | ||
236 | printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n", | ||
237 | link->io.BasePort1, | ||
238 | link->io.BasePort1+link->io.NumPorts1 - 1); | ||
239 | i = pcmcia_request_io(link, &link->io); | ||
240 | if (i == CS_SUCCESS) goto found_port; | ||
241 | } | ||
242 | i = next_tuple(link, &tuple, &parse); | ||
243 | } | ||
244 | 214 | ||
245 | found_port: | 215 | do { |
246 | if (i != CS_SUCCESS) { | ||
247 | cs_error(link, RequestIO, i); | ||
248 | break; | ||
249 | } | ||
250 | |||
251 | /* | 216 | /* |
252 | * allocate an interrupt line | 217 | * allocate an interrupt line |
253 | */ | 218 | */ |
254 | i = pcmcia_request_irq(link, &link->irq); | 219 | i = pcmcia_request_irq(link, &link->irq); |
255 | if (i != CS_SUCCESS) { | 220 | if (i != 0) { |
256 | cs_error(link, RequestIRQ, i); | 221 | cs_error(link, RequestIRQ, i); |
257 | /* undo */ | 222 | /* undo */ |
258 | pcmcia_disable_device(link); | 223 | pcmcia_disable_device(link); |
@@ -263,7 +228,7 @@ found_port: | |||
263 | * configure the PCMCIA socket | 228 | * configure the PCMCIA socket |
264 | */ | 229 | */ |
265 | i = pcmcia_request_configuration(link, &link->conf); | 230 | i = pcmcia_request_configuration(link, &link->conf); |
266 | if (i != CS_SUCCESS) { | 231 | if (i != 0) { |
267 | cs_error(link, RequestConfiguration, i); | 232 | cs_error(link, RequestConfiguration, i); |
268 | pcmcia_disable_device(link); | 233 | pcmcia_disable_device(link); |
269 | break; | 234 | break; |
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index db7e64424af..f4d0fe29bcf 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c | |||
@@ -203,82 +203,55 @@ static void elsa_cs_detach(struct pcmcia_device *link) | |||
203 | device available to the system. | 203 | device available to the system. |
204 | 204 | ||
205 | ======================================================================*/ | 205 | ======================================================================*/ |
206 | static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
207 | cisparse_t *parse) | ||
208 | { | ||
209 | int i = pcmcia_get_tuple_data(handle, tuple); | ||
210 | if (i != CS_SUCCESS) return i; | ||
211 | return pcmcia_parse_tuple(handle, tuple, parse); | ||
212 | } | ||
213 | |||
214 | static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
215 | cisparse_t *parse) | ||
216 | { | ||
217 | int i = pcmcia_get_first_tuple(handle, tuple); | ||
218 | if (i != CS_SUCCESS) return i; | ||
219 | return get_tuple(handle, tuple, parse); | ||
220 | } | ||
221 | 206 | ||
222 | static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, | 207 | static int elsa_cs_configcheck(struct pcmcia_device *p_dev, |
223 | cisparse_t *parse) | 208 | cistpl_cftable_entry_t *cf, |
209 | cistpl_cftable_entry_t *dflt, | ||
210 | unsigned int vcc, | ||
211 | void *priv_data) | ||
224 | { | 212 | { |
225 | int i = pcmcia_get_next_tuple(handle, tuple); | 213 | int j; |
226 | if (i != CS_SUCCESS) return i; | 214 | |
227 | return get_tuple(handle, tuple, parse); | 215 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { |
216 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); | ||
217 | p_dev->io.BasePort1 = cf->io.win[0].base; | ||
218 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
219 | return 0; | ||
220 | } else { | ||
221 | printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n"); | ||
222 | for (j = 0x2f0; j > 0x100; j -= 0x10) { | ||
223 | p_dev->io.BasePort1 = j; | ||
224 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
225 | return 0; | ||
226 | } | ||
227 | } | ||
228 | return -ENODEV; | ||
228 | } | 229 | } |
229 | 230 | ||
230 | static int elsa_cs_config(struct pcmcia_device *link) | 231 | static int elsa_cs_config(struct pcmcia_device *link) |
231 | { | 232 | { |
232 | tuple_t tuple; | ||
233 | cisparse_t parse; | ||
234 | local_info_t *dev; | 233 | local_info_t *dev; |
235 | int i, j, last_fn; | 234 | int i, last_fn; |
236 | u_short buf[128]; | ||
237 | cistpl_cftable_entry_t *cf = &parse.cftable_entry; | ||
238 | IsdnCard_t icard; | 235 | IsdnCard_t icard; |
239 | 236 | ||
240 | DEBUG(0, "elsa_config(0x%p)\n", link); | 237 | DEBUG(0, "elsa_config(0x%p)\n", link); |
241 | dev = link->priv; | 238 | dev = link->priv; |
242 | 239 | ||
243 | tuple.TupleData = (cisdata_t *)buf; | 240 | i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL); |
244 | tuple.TupleOffset = 0; tuple.TupleDataMax = 255; | 241 | if (i != 0) { |
245 | tuple.Attributes = 0; | ||
246 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
247 | i = first_tuple(link, &tuple, &parse); | ||
248 | while (i == CS_SUCCESS) { | ||
249 | if ( (cf->io.nwin > 0) && cf->io.win[0].base) { | ||
250 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); | ||
251 | link->conf.ConfigIndex = cf->index; | ||
252 | link->io.BasePort1 = cf->io.win[0].base; | ||
253 | i = pcmcia_request_io(link, &link->io); | ||
254 | if (i == CS_SUCCESS) break; | ||
255 | } else { | ||
256 | printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n"); | ||
257 | link->conf.ConfigIndex = cf->index; | ||
258 | for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) { | ||
259 | link->io.BasePort1 = j; | ||
260 | i = pcmcia_request_io(link, &link->io); | ||
261 | if (i == CS_SUCCESS) break; | ||
262 | } | ||
263 | break; | ||
264 | } | ||
265 | i = next_tuple(link, &tuple, &parse); | ||
266 | } | ||
267 | |||
268 | if (i != CS_SUCCESS) { | ||
269 | last_fn = RequestIO; | 242 | last_fn = RequestIO; |
270 | goto cs_failed; | 243 | goto cs_failed; |
271 | } | 244 | } |
272 | 245 | ||
273 | i = pcmcia_request_irq(link, &link->irq); | 246 | i = pcmcia_request_irq(link, &link->irq); |
274 | if (i != CS_SUCCESS) { | 247 | if (i != 0) { |
275 | link->irq.AssignedIRQ = 0; | 248 | link->irq.AssignedIRQ = 0; |
276 | last_fn = RequestIRQ; | 249 | last_fn = RequestIRQ; |
277 | goto cs_failed; | 250 | goto cs_failed; |
278 | } | 251 | } |
279 | 252 | ||
280 | i = pcmcia_request_configuration(link, &link->conf); | 253 | i = pcmcia_request_configuration(link, &link->conf); |
281 | if (i != CS_SUCCESS) { | 254 | if (i != 0) { |
282 | last_fn = RequestConfiguration; | 255 | last_fn = RequestConfiguration; |
283 | goto cs_failed; | 256 | goto cs_failed; |
284 | } | 257 | } |
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index 439cb530def..9a3c9f5e4fe 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c | |||
@@ -217,101 +217,61 @@ static void sedlbauer_detach(struct pcmcia_device *link) | |||
217 | #define CS_CHECK(fn, ret) \ | 217 | #define CS_CHECK(fn, ret) \ |
218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
219 | 219 | ||
220 | static int sedlbauer_config(struct pcmcia_device *link) | 220 | static int sedlbauer_config_check(struct pcmcia_device *p_dev, |
221 | cistpl_cftable_entry_t *cfg, | ||
222 | cistpl_cftable_entry_t *dflt, | ||
223 | unsigned int vcc, | ||
224 | void *priv_data) | ||
221 | { | 225 | { |
222 | local_info_t *dev = link->priv; | 226 | win_req_t *req = priv_data; |
223 | tuple_t tuple; | ||
224 | cisparse_t parse; | ||
225 | int last_fn, last_ret; | ||
226 | u8 buf[64]; | ||
227 | config_info_t conf; | ||
228 | win_req_t req; | ||
229 | memreq_t map; | ||
230 | IsdnCard_t icard; | ||
231 | |||
232 | DEBUG(0, "sedlbauer_config(0x%p)\n", link); | ||
233 | |||
234 | tuple.Attributes = 0; | ||
235 | tuple.TupleData = buf; | ||
236 | tuple.TupleDataMax = sizeof(buf); | ||
237 | tuple.TupleOffset = 0; | ||
238 | 227 | ||
239 | CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf)); | 228 | if (cfg->index == 0) |
229 | return -ENODEV; | ||
240 | 230 | ||
241 | /* | ||
242 | In this loop, we scan the CIS for configuration table entries, | ||
243 | each of which describes a valid card configuration, including | ||
244 | voltage, IO window, memory window, and interrupt settings. | ||
245 | |||
246 | We make no assumptions about the card to be configured: we use | ||
247 | just the information available in the CIS. In an ideal world, | ||
248 | this would work for any PCMCIA card, but it requires a complete | ||
249 | and accurate CIS. In practice, a driver usually "knows" most of | ||
250 | these things without consulting the CIS, and most client drivers | ||
251 | will only use the CIS to fill in implementation-defined details. | ||
252 | */ | ||
253 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
254 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); | ||
255 | while (1) { | ||
256 | cistpl_cftable_entry_t dflt = { 0 }; | ||
257 | cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); | ||
258 | if (pcmcia_get_tuple_data(link, &tuple) != 0 || | ||
259 | pcmcia_parse_tuple(link, &tuple, &parse) != 0) | ||
260 | goto next_entry; | ||
261 | |||
262 | if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; | ||
263 | if (cfg->index == 0) goto next_entry; | ||
264 | link->conf.ConfigIndex = cfg->index; | ||
265 | |||
266 | /* Does this card need audio output? */ | 231 | /* Does this card need audio output? */ |
267 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) { | 232 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) { |
268 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 233 | p_dev->conf.Attributes |= CONF_ENABLE_SPKR; |
269 | link->conf.Status = CCSR_AUDIO_ENA; | 234 | p_dev->conf.Status = CCSR_AUDIO_ENA; |
270 | } | 235 | } |
271 | 236 | ||
272 | /* Use power settings for Vcc and Vpp if present */ | 237 | /* Use power settings for Vcc and Vpp if present */ |
273 | /* Note that the CIS values need to be rescaled */ | 238 | /* Note that the CIS values need to be rescaled */ |
274 | if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) { | 239 | if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) { |
275 | if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) | 240 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) |
276 | goto next_entry; | 241 | return -ENODEV; |
277 | } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) { | 242 | } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) { |
278 | if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) | 243 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000) |
279 | goto next_entry; | 244 | return -ENODEV; |
280 | } | 245 | } |
281 | 246 | ||
282 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | 247 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) |
283 | link->conf.Vpp = | 248 | p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; |
284 | cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | 249 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) |
285 | else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM)) | 250 | p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; |
286 | link->conf.Vpp = | 251 | |
287 | dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
288 | |||
289 | /* Do we need to allocate an interrupt? */ | 252 | /* Do we need to allocate an interrupt? */ |
290 | if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) | 253 | if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1) |
291 | link->conf.Attributes |= CONF_ENABLE_IRQ; | 254 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
292 | 255 | ||
293 | /* IO window settings */ | 256 | /* IO window settings */ |
294 | link->io.NumPorts1 = link->io.NumPorts2 = 0; | 257 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; |
295 | if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { | 258 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
296 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; | 259 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
297 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 260 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; |
298 | if (!(io->flags & CISTPL_IO_8BIT)) | 261 | if (!(io->flags & CISTPL_IO_8BIT)) |
299 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 262 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; |
300 | if (!(io->flags & CISTPL_IO_16BIT)) | 263 | if (!(io->flags & CISTPL_IO_16BIT)) |
301 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 264 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
302 | /* new in dummy.cs 2001/01/28 MN | 265 | p_dev->io.BasePort1 = io->win[0].base; |
303 | link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 266 | p_dev->io.NumPorts1 = io->win[0].len; |
304 | */ | 267 | if (io->nwin > 1) { |
305 | link->io.BasePort1 = io->win[0].base; | 268 | p_dev->io.Attributes2 = p_dev->io.Attributes1; |
306 | link->io.NumPorts1 = io->win[0].len; | 269 | p_dev->io.BasePort2 = io->win[1].base; |
307 | if (io->nwin > 1) { | 270 | p_dev->io.NumPorts2 = io->win[1].len; |
308 | link->io.Attributes2 = link->io.Attributes1; | 271 | } |
309 | link->io.BasePort2 = io->win[1].base; | 272 | /* This reserves IO space but doesn't actually enable it */ |
310 | link->io.NumPorts2 = io->win[1].len; | 273 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) |
311 | } | 274 | return -ENODEV; |
312 | /* This reserves IO space but doesn't actually enable it */ | ||
313 | if (pcmcia_request_io(link, &link->io) != 0) | ||
314 | goto next_entry; | ||
315 | } | 275 | } |
316 | 276 | ||
317 | /* | 277 | /* |
@@ -325,30 +285,54 @@ static int sedlbauer_config(struct pcmcia_device *link) | |||
325 | needs to be mapped to virtual space with ioremap() before it | 285 | needs to be mapped to virtual space with ioremap() before it |
326 | is used. | 286 | is used. |
327 | */ | 287 | */ |
328 | if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) { | 288 | if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) { |
329 | cistpl_mem_t *mem = | 289 | cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem; |
330 | (cfg->mem.nwin) ? &cfg->mem : &dflt.mem; | 290 | memreq_t map; |
331 | req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; | 291 | req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; |
332 | req.Attributes |= WIN_ENABLE; | 292 | req->Attributes |= WIN_ENABLE; |
333 | req.Base = mem->win[0].host_addr; | 293 | req->Base = mem->win[0].host_addr; |
334 | req.Size = mem->win[0].len; | 294 | req->Size = mem->win[0].len; |
335 | /* new in dummy.cs 2001/01/28 MN | 295 | req->AccessSpeed = 0; |
336 | if (req.Size < 0x1000) | 296 | if (pcmcia_request_window(&p_dev, req, &p_dev->win) != 0) |
337 | req.Size = 0x1000; | 297 | return -ENODEV; |
338 | */ | 298 | map.Page = 0; |
339 | req.AccessSpeed = 0; | 299 | map.CardOffset = mem->win[0].card_addr; |
340 | if (pcmcia_request_window(&link, &req, &link->win) != 0) | 300 | if (pcmcia_map_mem_page(p_dev->win, &map) != 0) |
341 | goto next_entry; | 301 | return -ENODEV; |
342 | map.Page = 0; map.CardOffset = mem->win[0].card_addr; | ||
343 | if (pcmcia_map_mem_page(link->win, &map) != 0) | ||
344 | goto next_entry; | ||
345 | } | 302 | } |
346 | /* If we got this far, we're cool! */ | 303 | return 0; |
347 | break; | 304 | } |
348 | 305 | ||
349 | next_entry: | 306 | |
350 | CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); | 307 | |
351 | } | 308 | static int sedlbauer_config(struct pcmcia_device *link) |
309 | { | ||
310 | local_info_t *dev = link->priv; | ||
311 | win_req_t *req; | ||
312 | int last_fn, last_ret; | ||
313 | IsdnCard_t icard; | ||
314 | |||
315 | DEBUG(0, "sedlbauer_config(0x%p)\n", link); | ||
316 | |||
317 | req = kzalloc(sizeof(win_req_t), GFP_KERNEL); | ||
318 | if (!req) | ||
319 | return -ENOMEM; | ||
320 | |||
321 | /* | ||
322 | In this loop, we scan the CIS for configuration table entries, | ||
323 | each of which describes a valid card configuration, including | ||
324 | voltage, IO window, memory window, and interrupt settings. | ||
325 | |||
326 | We make no assumptions about the card to be configured: we use | ||
327 | just the information available in the CIS. In an ideal world, | ||
328 | this would work for any PCMCIA card, but it requires a complete | ||
329 | and accurate CIS. In practice, a driver usually "knows" most of | ||
330 | these things without consulting the CIS, and most client drivers | ||
331 | will only use the CIS to fill in implementation-defined details. | ||
332 | */ | ||
333 | last_ret = pcmcia_loop_config(link, sedlbauer_config_check, req); | ||
334 | if (last_ret) | ||
335 | goto failed; | ||
352 | 336 | ||
353 | /* | 337 | /* |
354 | Allocate an interrupt line. Note that this does not assign a | 338 | Allocate an interrupt line. Note that this does not assign a |
@@ -387,8 +371,8 @@ static int sedlbauer_config(struct pcmcia_device *link) | |||
387 | printk(" & 0x%04x-0x%04x", link->io.BasePort2, | 371 | printk(" & 0x%04x-0x%04x", link->io.BasePort2, |
388 | link->io.BasePort2+link->io.NumPorts2-1); | 372 | link->io.BasePort2+link->io.NumPorts2-1); |
389 | if (link->win) | 373 | if (link->win) |
390 | printk(", mem 0x%06lx-0x%06lx", req.Base, | 374 | printk(", mem 0x%06lx-0x%06lx", req->Base, |
391 | req.Base+req.Size-1); | 375 | req->Base+req->Size-1); |
392 | printk("\n"); | 376 | printk("\n"); |
393 | 377 | ||
394 | icard.para[0] = link->irq.AssignedIRQ; | 378 | icard.para[0] = link->irq.AssignedIRQ; |
@@ -409,6 +393,7 @@ static int sedlbauer_config(struct pcmcia_device *link) | |||
409 | 393 | ||
410 | cs_failed: | 394 | cs_failed: |
411 | cs_error(link, last_fn, last_ret); | 395 | cs_error(link, last_fn, last_ret); |
396 | failed: | ||
412 | sedlbauer_release(link); | 397 | sedlbauer_release(link); |
413 | return -ENODEV; | 398 | return -ENODEV; |
414 | 399 | ||
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index ab4bd455450..623d111544d 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c | |||
@@ -193,82 +193,55 @@ static void teles_detach(struct pcmcia_device *link) | |||
193 | device available to the system. | 193 | device available to the system. |
194 | 194 | ||
195 | ======================================================================*/ | 195 | ======================================================================*/ |
196 | static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
197 | cisparse_t *parse) | ||
198 | { | ||
199 | int i = pcmcia_get_tuple_data(handle, tuple); | ||
200 | if (i != CS_SUCCESS) return i; | ||
201 | return pcmcia_parse_tuple(handle, tuple, parse); | ||
202 | } | ||
203 | |||
204 | static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, | ||
205 | cisparse_t *parse) | ||
206 | { | ||
207 | int i = pcmcia_get_first_tuple(handle, tuple); | ||
208 | if (i != CS_SUCCESS) return i; | ||
209 | return get_tuple(handle, tuple, parse); | ||
210 | } | ||
211 | 196 | ||
212 | static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, | 197 | static int teles_cs_configcheck(struct pcmcia_device *p_dev, |
213 | cisparse_t *parse) | 198 | cistpl_cftable_entry_t *cf, |
199 | cistpl_cftable_entry_t *dflt, | ||
200 | unsigned int vcc, | ||
201 | void *priv_data) | ||
214 | { | 202 | { |
215 | int i = pcmcia_get_next_tuple(handle, tuple); | 203 | int j; |
216 | if (i != CS_SUCCESS) return i; | 204 | |
217 | return get_tuple(handle, tuple, parse); | 205 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { |
206 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); | ||
207 | p_dev->io.BasePort1 = cf->io.win[0].base; | ||
208 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
209 | return 0; | ||
210 | } else { | ||
211 | printk(KERN_INFO "(teles_cs: looks like the 97 model)\n"); | ||
212 | for (j = 0x2f0; j > 0x100; j -= 0x10) { | ||
213 | p_dev->io.BasePort1 = j; | ||
214 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
215 | return 0; | ||
216 | } | ||
217 | } | ||
218 | return -ENODEV; | ||
218 | } | 219 | } |
219 | 220 | ||
220 | static int teles_cs_config(struct pcmcia_device *link) | 221 | static int teles_cs_config(struct pcmcia_device *link) |
221 | { | 222 | { |
222 | tuple_t tuple; | ||
223 | cisparse_t parse; | ||
224 | local_info_t *dev; | 223 | local_info_t *dev; |
225 | int i, j, last_fn; | 224 | int i, last_fn; |
226 | u_short buf[128]; | ||
227 | cistpl_cftable_entry_t *cf = &parse.cftable_entry; | ||
228 | IsdnCard_t icard; | 225 | IsdnCard_t icard; |
229 | 226 | ||
230 | DEBUG(0, "teles_config(0x%p)\n", link); | 227 | DEBUG(0, "teles_config(0x%p)\n", link); |
231 | dev = link->priv; | 228 | dev = link->priv; |
232 | 229 | ||
233 | tuple.TupleData = (cisdata_t *)buf; | 230 | i = pcmcia_loop_config(link, teles_cs_configcheck, NULL); |
234 | tuple.TupleOffset = 0; tuple.TupleDataMax = 255; | 231 | if (i != 0) { |
235 | tuple.Attributes = 0; | ||
236 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
237 | i = first_tuple(link, &tuple, &parse); | ||
238 | while (i == CS_SUCCESS) { | ||
239 | if ( (cf->io.nwin > 0) && cf->io.win[0].base) { | ||
240 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); | ||
241 | link->conf.ConfigIndex = cf->index; | ||
242 | link->io.BasePort1 = cf->io.win[0].base; | ||
243 | i = pcmcia_request_io(link, &link->io); | ||
244 | if (i == CS_SUCCESS) break; | ||
245 | } else { | ||
246 | printk(KERN_INFO "(teles_cs: looks like the 97 model)\n"); | ||
247 | link->conf.ConfigIndex = cf->index; | ||
248 | for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) { | ||
249 | link->io.BasePort1 = j; | ||
250 | i = pcmcia_request_io(link, &link->io); | ||
251 | if (i == CS_SUCCESS) break; | ||
252 | } | ||
253 | break; | ||
254 | } | ||
255 | i = next_tuple(link, &tuple, &parse); | ||
256 | } | ||
257 | |||
258 | if (i != CS_SUCCESS) { | ||
259 | last_fn = RequestIO; | 232 | last_fn = RequestIO; |
260 | goto cs_failed; | 233 | goto cs_failed; |
261 | } | 234 | } |
262 | 235 | ||
263 | i = pcmcia_request_irq(link, &link->irq); | 236 | i = pcmcia_request_irq(link, &link->irq); |
264 | if (i != CS_SUCCESS) { | 237 | if (i != 0) { |
265 | link->irq.AssignedIRQ = 0; | 238 | link->irq.AssignedIRQ = 0; |
266 | last_fn = RequestIRQ; | 239 | last_fn = RequestIRQ; |
267 | goto cs_failed; | 240 | goto cs_failed; |
268 | } | 241 | } |
269 | 242 | ||
270 | i = pcmcia_request_configuration(link, &link->conf); | 243 | i = pcmcia_request_configuration(link, &link->conf); |
271 | if (i != CS_SUCCESS) { | 244 | if (i != 0) { |
272 | last_fn = RequestConfiguration; | 245 | last_fn = RequestConfiguration; |
273 | goto cs_failed; | 246 | goto cs_failed; |
274 | } | 247 | } |