Commit 6ac95d82 authored by Russell King's avatar Russell King

pcmcia: soc_common: restore previous socket state on error

If an attempt to set a socket state returns an error, restore the
previous socket state.  If restoring the previous socket state
fails, warn about this.

This allows us to have simple error handling in the socket state
configuration handlers - there is no need for every handler
implementation to manually undo the updates, which can be complex
when regulators are involved.
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 535e0abc
...@@ -286,6 +286,14 @@ static int soc_common_pcmcia_config_skt( ...@@ -286,6 +286,14 @@ static int soc_common_pcmcia_config_skt(
int ret; int ret;
ret = skt->ops->configure_socket(skt, state); ret = skt->ops->configure_socket(skt, state);
if (ret < 0) {
pr_err("soc_common_pcmcia: unable to configure socket %d\n",
skt->nr);
/* restore the previous state */
WARN_ON(skt->ops->configure_socket(skt, &skt->cs_state));
return ret;
}
if (ret == 0) { if (ret == 0) {
struct gpio_desc *descs[2]; struct gpio_desc *descs[2];
int values[2], n = 0; int values[2], n = 0;
...@@ -318,10 +326,6 @@ static int soc_common_pcmcia_config_skt( ...@@ -318,10 +326,6 @@ static int soc_common_pcmcia_config_skt(
skt->cs_state = *state; skt->cs_state = *state;
} }
if (ret < 0)
printk(KERN_ERR "soc_common_pcmcia: unable to configure "
"socket %d\n", skt->nr);
return ret; return ret;
} }
...@@ -770,6 +774,8 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) ...@@ -770,6 +774,8 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
{ {
int ret; int ret;
skt->cs_state = dead_socket;
setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event, setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event,
(unsigned long)skt); (unsigned long)skt);
skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD; skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
......
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