diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-07-11 04:04:59 -0400 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-07-30 15:07:32 -0400 |
commit | 216d7cdd3b060518a2d4faf584eb15ef5af862b6 (patch) | |
tree | 5ab7b1de96ee277f5b1932ba192e9c80fd2418a7 /drivers/pcmcia | |
parent | 5716d415f8c5a17d44f6e1d5a1e4998f7306a93b (diff) |
pcmcia: simplify event callback
The event callback for handling 16bit PCMCIA cards only needs to be
informed about a few events. Furthermore, send_event may already
only be called with skt->skt_mutex held, which also protects against
the module being removed behind the callback's back.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/cs.c | 44 | ||||
-rw-r--r-- | drivers/pcmcia/ds.c | 6 |
2 files changed, 10 insertions, 40 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 976d80706eae..5ea196724f5b 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -264,8 +264,6 @@ EXPORT_SYMBOL(pcmcia_get_socket_by_nr); | |||
264 | 264 | ||
265 | static int send_event(struct pcmcia_socket *s, event_t event, int priority) | 265 | static int send_event(struct pcmcia_socket *s, event_t event, int priority) |
266 | { | 266 | { |
267 | int ret; | ||
268 | |||
269 | if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL)) | 267 | if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL)) |
270 | return 0; | 268 | return 0; |
271 | 269 | ||
@@ -274,14 +272,8 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority) | |||
274 | 272 | ||
275 | if (!s->callback) | 273 | if (!s->callback) |
276 | return 0; | 274 | return 0; |
277 | if (!try_module_get(s->callback->owner)) | ||
278 | return 0; | ||
279 | 275 | ||
280 | ret = s->callback->event(s, event, priority); | 276 | return s->callback->event(s, event, priority); |
281 | |||
282 | module_put(s->callback->owner); | ||
283 | |||
284 | return ret; | ||
285 | } | 277 | } |
286 | 278 | ||
287 | static int socket_reset(struct pcmcia_socket *skt) | 279 | static int socket_reset(struct pcmcia_socket *skt) |
@@ -494,7 +486,6 @@ static int socket_suspend(struct pcmcia_socket *skt) | |||
494 | mutex_lock(&skt->ops_mutex); | 486 | mutex_lock(&skt->ops_mutex); |
495 | skt->suspended_state = skt->state; | 487 | skt->suspended_state = skt->state; |
496 | 488 | ||
497 | send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW); | ||
498 | skt->socket = dead_socket; | 489 | skt->socket = dead_socket; |
499 | skt->ops->set_socket(skt, &skt->socket); | 490 | skt->ops->set_socket(skt, &skt->socket); |
500 | if (skt->ops->suspend) | 491 | if (skt->ops->suspend) |
@@ -654,16 +645,8 @@ static int pccardd(void *__skt) | |||
654 | spin_unlock_irqrestore(&skt->thread_lock, flags); | 645 | spin_unlock_irqrestore(&skt->thread_lock, flags); |
655 | 646 | ||
656 | mutex_lock(&skt->skt_mutex); | 647 | mutex_lock(&skt->skt_mutex); |
657 | if (events) { | 648 | if (events & SS_DETECT) |
658 | if (events & SS_DETECT) | 649 | socket_detect_change(skt); |
659 | socket_detect_change(skt); | ||
660 | if (events & SS_BATDEAD) | ||
661 | send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW); | ||
662 | if (events & SS_BATWARN) | ||
663 | send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW); | ||
664 | if (events & SS_READY) | ||
665 | send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW); | ||
666 | } | ||
667 | 650 | ||
668 | if (sysfs_events) { | 651 | if (sysfs_events) { |
669 | if (sysfs_events & PCMCIA_UEVENT_EJECT) | 652 | if (sysfs_events & PCMCIA_UEVENT_EJECT) |
@@ -823,20 +806,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt) | |||
823 | break; | 806 | break; |
824 | } | 807 | } |
825 | 808 | ||
826 | ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW); | 809 | if (skt->callback) |
827 | if (ret == 0) { | 810 | skt->callback->suspend(skt); |
828 | send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW); | 811 | mutex_lock(&skt->ops_mutex); |
829 | if (skt->callback) | 812 | ret = socket_reset(skt); |
830 | skt->callback->suspend(skt); | 813 | mutex_unlock(&skt->ops_mutex); |
831 | mutex_lock(&skt->ops_mutex); | 814 | if ((ret == 0) && (skt->callback)) |
832 | ret = socket_reset(skt); | 815 | skt->callback->resume(skt); |
833 | mutex_unlock(&skt->ops_mutex); | ||
834 | if (ret == 0) { | ||
835 | send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW); | ||
836 | if (skt->callback) | ||
837 | skt->callback->resume(skt); | ||
838 | } | ||
839 | } | ||
840 | 816 | ||
841 | ret = 0; | 817 | ret = 0; |
842 | } while (0); | 818 | } while (0); |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index d2ec45848413..bd58650b2736 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -1253,9 +1253,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) | |||
1253 | pcmcia_card_add(skt); | 1253 | pcmcia_card_add(skt); |
1254 | break; | 1254 | break; |
1255 | 1255 | ||
1256 | case CS_EVENT_EJECTION_REQUEST: | ||
1257 | break; | ||
1258 | |||
1259 | case CS_EVENT_PM_RESUME: | 1256 | case CS_EVENT_PM_RESUME: |
1260 | if (verify_cis_cache(skt) != 0) { | 1257 | if (verify_cis_cache(skt) != 0) { |
1261 | dev_dbg(&skt->dev, "cis mismatch - different card\n"); | 1258 | dev_dbg(&skt->dev, "cis mismatch - different card\n"); |
@@ -1273,9 +1270,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) | |||
1273 | } | 1270 | } |
1274 | break; | 1271 | break; |
1275 | 1272 | ||
1276 | case CS_EVENT_PM_SUSPEND: | ||
1277 | case CS_EVENT_RESET_PHYSICAL: | ||
1278 | case CS_EVENT_CARD_RESET: | ||
1279 | default: | 1273 | default: |
1280 | break; | 1274 | break; |
1281 | } | 1275 | } |