Skip to content

Commit

Permalink
pcmcia: soc_common: restore previous socket state on error
Browse files Browse the repository at this point in the history
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: Russell King <rmk+kernel@armlinux.org.uk>
  • Loading branch information
Russell King committed Sep 22, 2016
1 parent 535e0ab commit 6ac95d8
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions drivers/pcmcia/soc_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,14 @@ static int soc_common_pcmcia_config_skt(
int ret;

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) {
struct gpio_desc *descs[2];
int values[2], n = 0;
Expand Down Expand Up @@ -318,10 +326,6 @@ static int soc_common_pcmcia_config_skt(
skt->cs_state = *state;
}

if (ret < 0)
printk(KERN_ERR "soc_common_pcmcia: unable to configure "
"socket %d\n", skt->nr);

return ret;
}

Expand Down Expand Up @@ -770,6 +774,8 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
{
int ret;

skt->cs_state = dead_socket;

setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event,
(unsigned long)skt);
skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
Expand Down

0 comments on commit 6ac95d8

Please sign in to comment.