Skip to content

Commit

Permalink
pcmcia: simplify event callback
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Dominik Brodowski committed Jul 30, 2010
1 parent 5716d41 commit 216d7cd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 40 deletions.
44 changes: 10 additions & 34 deletions drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,8 +264,6 @@ EXPORT_SYMBOL(pcmcia_get_socket_by_nr);

static int send_event(struct pcmcia_socket *s, event_t event, int priority)
{
int ret;

if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL))
return 0;

Expand All @@ -274,14 +272,8 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)

if (!s->callback)
return 0;
if (!try_module_get(s->callback->owner))
return 0;

ret = s->callback->event(s, event, priority);

module_put(s->callback->owner);

return ret;
return s->callback->event(s, event, priority);
}

static int socket_reset(struct pcmcia_socket *skt)
Expand Down Expand Up @@ -494,7 +486,6 @@ static int socket_suspend(struct pcmcia_socket *skt)
mutex_lock(&skt->ops_mutex);
skt->suspended_state = skt->state;

send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
skt->socket = dead_socket;
skt->ops->set_socket(skt, &skt->socket);
if (skt->ops->suspend)
Expand Down Expand Up @@ -654,16 +645,8 @@ static int pccardd(void *__skt)
spin_unlock_irqrestore(&skt->thread_lock, flags);

mutex_lock(&skt->skt_mutex);
if (events) {
if (events & SS_DETECT)
socket_detect_change(skt);
if (events & SS_BATDEAD)
send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
if (events & SS_BATWARN)
send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
if (events & SS_READY)
send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
}
if (events & SS_DETECT)
socket_detect_change(skt);

if (sysfs_events) {
if (sysfs_events & PCMCIA_UEVENT_EJECT)
Expand Down Expand Up @@ -823,20 +806,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
break;
}

ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
if (ret == 0) {
send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
if (skt->callback)
skt->callback->suspend(skt);
mutex_lock(&skt->ops_mutex);
ret = socket_reset(skt);
mutex_unlock(&skt->ops_mutex);
if (ret == 0) {
send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
if (skt->callback)
skt->callback->resume(skt);
}
}
if (skt->callback)
skt->callback->suspend(skt);
mutex_lock(&skt->ops_mutex);
ret = socket_reset(skt);
mutex_unlock(&skt->ops_mutex);
if ((ret == 0) && (skt->callback))
skt->callback->resume(skt);

ret = 0;
} while (0);
Expand Down
6 changes: 0 additions & 6 deletions drivers/pcmcia/ds.c
Original file line number Diff line number Diff line change
Expand Up @@ -1253,9 +1253,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
pcmcia_card_add(skt);
break;

case CS_EVENT_EJECTION_REQUEST:
break;

case CS_EVENT_PM_RESUME:
if (verify_cis_cache(skt) != 0) {
dev_dbg(&skt->dev, "cis mismatch - different card\n");
Expand All @@ -1273,9 +1270,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
}
break;

case CS_EVENT_PM_SUSPEND:
case CS_EVENT_RESET_PHYSICAL:
case CS_EVENT_CARD_RESET:
default:
break;
}
Expand Down

0 comments on commit 216d7cd

Please sign in to comment.