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>
This commit is contained in:
parent
5716d415f8
commit
216d7cdd3b
2 changed files with 10 additions and 40 deletions
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CS_EVENT_PM_SUSPEND:
|
|
||||||
case CS_EVENT_RESET_PHYSICAL:
|
|
||||||
case CS_EVENT_CARD_RESET:
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue