Commit 216d7cdd authored by Dominik Brodowski's avatar Dominik Brodowski

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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent 5716d415
...@@ -264,8 +264,6 @@ EXPORT_SYMBOL(pcmcia_get_socket_by_nr); ...@@ -264,8 +264,6 @@ EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
static int send_event(struct pcmcia_socket *s, event_t event, int priority) 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)) if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL))
return 0; return 0;
...@@ -274,14 +272,8 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority) ...@@ -274,14 +272,8 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
if (!s->callback) if (!s->callback)
return 0; return 0;
if (!try_module_get(s->callback->owner))
return 0;
ret = s->callback->event(s, event, priority); return s->callback->event(s, event, priority);
module_put(s->callback->owner);
return ret;
} }
static int socket_reset(struct pcmcia_socket *skt) static int socket_reset(struct pcmcia_socket *skt)
...@@ -494,7 +486,6 @@ static int socket_suspend(struct pcmcia_socket *skt) ...@@ -494,7 +486,6 @@ static int socket_suspend(struct pcmcia_socket *skt)
mutex_lock(&skt->ops_mutex); mutex_lock(&skt->ops_mutex);
skt->suspended_state = skt->state; skt->suspended_state = skt->state;
send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
skt->socket = dead_socket; skt->socket = dead_socket;
skt->ops->set_socket(skt, &skt->socket); skt->ops->set_socket(skt, &skt->socket);
if (skt->ops->suspend) if (skt->ops->suspend)
...@@ -654,16 +645,8 @@ static int pccardd(void *__skt) ...@@ -654,16 +645,8 @@ static int pccardd(void *__skt)
spin_unlock_irqrestore(&skt->thread_lock, flags); spin_unlock_irqrestore(&skt->thread_lock, flags);
mutex_lock(&skt->skt_mutex); mutex_lock(&skt->skt_mutex);
if (events) { if (events & SS_DETECT)
if (events & SS_DETECT) socket_detect_change(skt);
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 (sysfs_events) { if (sysfs_events) {
if (sysfs_events & PCMCIA_UEVENT_EJECT) if (sysfs_events & PCMCIA_UEVENT_EJECT)
...@@ -823,20 +806,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt) ...@@ -823,20 +806,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
break; break;
} }
ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW); if (skt->callback)
if (ret == 0) { skt->callback->suspend(skt);
send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW); mutex_lock(&skt->ops_mutex);
if (skt->callback) ret = socket_reset(skt);
skt->callback->suspend(skt); mutex_unlock(&skt->ops_mutex);
mutex_lock(&skt->ops_mutex); if ((ret == 0) && (skt->callback))
ret = socket_reset(skt); skt->callback->resume(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);
}
}
ret = 0; ret = 0;
} while (0); } while (0);
......
...@@ -1253,9 +1253,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) ...@@ -1253,9 +1253,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
pcmcia_card_add(skt); pcmcia_card_add(skt);
break; break;
case CS_EVENT_EJECTION_REQUEST:
break;
case CS_EVENT_PM_RESUME: case CS_EVENT_PM_RESUME:
if (verify_cis_cache(skt) != 0) { if (verify_cis_cache(skt) != 0) {
dev_dbg(&skt->dev, "cis mismatch - different card\n"); 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,9 +1270,6 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
} }
break; break;
case CS_EVENT_PM_SUSPEND:
case CS_EVENT_RESET_PHYSICAL:
case CS_EVENT_CARD_RESET:
default: default:
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment