diff options
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/cs_internal.h | 1 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 61 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 68 |
3 files changed, 61 insertions, 69 deletions
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index 0a9e420defda..63dc1a28bda2 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h | |||
@@ -118,7 +118,6 @@ extern struct list_head pcmcia_socket_list; | |||
118 | int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle, int idx, win_req_t *req); | 118 | int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle, int idx, win_req_t *req); |
119 | int pccard_get_configuration_info(struct pcmcia_socket *s, struct pcmcia_device *p_dev, config_info_t *config); | 119 | int pccard_get_configuration_info(struct pcmcia_socket *s, struct pcmcia_device *p_dev, config_info_t *config); |
120 | int pccard_reset_card(struct pcmcia_socket *skt); | 120 | int pccard_reset_card(struct pcmcia_socket *skt); |
121 | int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, cs_status_t *status); | ||
122 | 121 | ||
123 | 122 | ||
124 | struct pcmcia_callback{ | 123 | struct pcmcia_callback{ |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 2d0521019536..afd00e7bbbef 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <pcmcia/cs_types.h> | 32 | #include <pcmcia/cs_types.h> |
33 | #include <pcmcia/cs.h> | 33 | #include <pcmcia/cs.h> |
34 | #include <pcmcia/cistpl.h> | 34 | #include <pcmcia/cistpl.h> |
35 | #include <pcmcia/cisreg.h> | ||
35 | #include <pcmcia/ds.h> | 36 | #include <pcmcia/ds.h> |
36 | #include <pcmcia/ss.h> | 37 | #include <pcmcia/ss.h> |
37 | 38 | ||
@@ -224,6 +225,66 @@ static int pcmcia_adjust_resource_info(adjust_t *adj) | |||
224 | return (ret); | 225 | return (ret); |
225 | } | 226 | } |
226 | 227 | ||
228 | /** pccard_get_status | ||
229 | * | ||
230 | * Get the current socket state bits. We don't support the latched | ||
231 | * SocketState yet: I haven't seen any point for it. | ||
232 | */ | ||
233 | |||
234 | static int pccard_get_status(struct pcmcia_socket *s, | ||
235 | struct pcmcia_device *p_dev, | ||
236 | cs_status_t *status) | ||
237 | { | ||
238 | config_t *c; | ||
239 | int val; | ||
240 | |||
241 | s->ops->get_status(s, &val); | ||
242 | status->CardState = status->SocketState = 0; | ||
243 | status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0; | ||
244 | status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0; | ||
245 | status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0; | ||
246 | status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0; | ||
247 | if (s->state & SOCKET_SUSPEND) | ||
248 | status->CardState |= CS_EVENT_PM_SUSPEND; | ||
249 | if (!(s->state & SOCKET_PRESENT)) | ||
250 | return CS_NO_CARD; | ||
251 | |||
252 | c = (p_dev) ? p_dev->function_config : NULL; | ||
253 | |||
254 | if ((c != NULL) && (c->state & CONFIG_LOCKED) && | ||
255 | (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) { | ||
256 | u_char reg; | ||
257 | if (c->CardValues & PRESENT_PIN_REPLACE) { | ||
258 | pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®); | ||
259 | status->CardState |= | ||
260 | (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0; | ||
261 | status->CardState |= | ||
262 | (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0; | ||
263 | status->CardState |= | ||
264 | (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0; | ||
265 | status->CardState |= | ||
266 | (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0; | ||
267 | } else { | ||
268 | /* No PRR? Then assume we're always ready */ | ||
269 | status->CardState |= CS_EVENT_READY_CHANGE; | ||
270 | } | ||
271 | if (c->CardValues & PRESENT_EXT_STATUS) { | ||
272 | pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®); | ||
273 | status->CardState |= | ||
274 | (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0; | ||
275 | } | ||
276 | return CS_SUCCESS; | ||
277 | } | ||
278 | status->CardState |= | ||
279 | (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0; | ||
280 | status->CardState |= | ||
281 | (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0; | ||
282 | status->CardState |= | ||
283 | (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0; | ||
284 | status->CardState |= | ||
285 | (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0; | ||
286 | return CS_SUCCESS; | ||
287 | } /* pccard_get_status */ | ||
227 | 288 | ||
228 | /*====================================================================== | 289 | /*====================================================================== |
229 | 290 | ||
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index cb6b5da3f29a..4884a18cf9e6 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -309,74 +309,6 @@ int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle, | |||
309 | EXPORT_SYMBOL(pcmcia_get_window); | 309 | EXPORT_SYMBOL(pcmcia_get_window); |
310 | 310 | ||
311 | 311 | ||
312 | /** pccard_get_status | ||
313 | * | ||
314 | * Get the current socket state bits. We don't support the latched | ||
315 | * SocketState yet: I haven't seen any point for it. | ||
316 | */ | ||
317 | |||
318 | int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, | ||
319 | cs_status_t *status) | ||
320 | { | ||
321 | config_t *c; | ||
322 | int val; | ||
323 | |||
324 | s->ops->get_status(s, &val); | ||
325 | status->CardState = status->SocketState = 0; | ||
326 | status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0; | ||
327 | status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0; | ||
328 | status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0; | ||
329 | status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0; | ||
330 | if (s->state & SOCKET_SUSPEND) | ||
331 | status->CardState |= CS_EVENT_PM_SUSPEND; | ||
332 | if (!(s->state & SOCKET_PRESENT)) | ||
333 | return CS_NO_CARD; | ||
334 | |||
335 | c = (p_dev) ? p_dev->function_config : NULL; | ||
336 | |||
337 | if ((c != NULL) && (c->state & CONFIG_LOCKED) && | ||
338 | (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) { | ||
339 | u_char reg; | ||
340 | if (c->CardValues & PRESENT_PIN_REPLACE) { | ||
341 | pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®); | ||
342 | status->CardState |= | ||
343 | (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0; | ||
344 | status->CardState |= | ||
345 | (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0; | ||
346 | status->CardState |= | ||
347 | (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0; | ||
348 | status->CardState |= | ||
349 | (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0; | ||
350 | } else { | ||
351 | /* No PRR? Then assume we're always ready */ | ||
352 | status->CardState |= CS_EVENT_READY_CHANGE; | ||
353 | } | ||
354 | if (c->CardValues & PRESENT_EXT_STATUS) { | ||
355 | pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®); | ||
356 | status->CardState |= | ||
357 | (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0; | ||
358 | } | ||
359 | return CS_SUCCESS; | ||
360 | } | ||
361 | status->CardState |= | ||
362 | (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0; | ||
363 | status->CardState |= | ||
364 | (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0; | ||
365 | status->CardState |= | ||
366 | (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0; | ||
367 | status->CardState |= | ||
368 | (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0; | ||
369 | return CS_SUCCESS; | ||
370 | } /* pccard_get_status */ | ||
371 | |||
372 | int pcmcia_get_status(struct pcmcia_device *p_dev, cs_status_t *status) | ||
373 | { | ||
374 | return pccard_get_status(p_dev->socket, p_dev, status); | ||
375 | } | ||
376 | EXPORT_SYMBOL(pcmcia_get_status); | ||
377 | |||
378 | |||
379 | |||
380 | /** pcmcia_get_mem_page | 312 | /** pcmcia_get_mem_page |
381 | * | 313 | * |
382 | * Change the card address of an already open memory window. | 314 | * Change the card address of an already open memory window. |