Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 16255
b: refs/heads/master
c: 8e9e793
h: refs/heads/master
i:
  16253: d4460e9
  16251: 78bb10c
  16247: 00b0714
  16239: e27416c
  16223: 6b19d60
  16191: a68d7bc
  16127: b6a4d61
v: v3
  • Loading branch information
Dominik Brodowski committed Jan 5, 2006
1 parent 21a18a9 commit b69fd24
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 98e4c28b7ec390c2dad6a4c69d69629c0f7e8b10
refs/heads/master: 8e9e793d68fcda6cc84c18cedf85ca0f91d801a8
1 change: 1 addition & 0 deletions trunk/drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ int dpm_runtime_suspend(struct device * dev, pm_message_t state)
up(&dpm_sem);
return error;
}
EXPORT_SYMBOL(dpm_runtime_suspend);


#if 0
Expand Down
14 changes: 13 additions & 1 deletion trunk/drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -780,8 +780,13 @@ int pccard_reset_card(struct pcmcia_socket *skt)
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 (socket_reset(skt) == CS_SUCCESS)
if (skt->callback)
skt->callback->suspend(skt);
if (socket_reset(skt) == CS_SUCCESS) {
send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
if (skt->callback)
skt->callback->resume(skt);
}
}

ret = CS_SUCCESS;
Expand Down Expand Up @@ -812,6 +817,11 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt)
ret = CS_UNSUPPORTED_FUNCTION;
break;
}
if (skt->callback) {
ret = skt->callback->suspend(skt);
if (ret)
break;
}
ret = socket_suspend(skt);
} while (0);
up(&skt->skt_sem);
Expand All @@ -838,6 +848,8 @@ int pcmcia_resume_card(struct pcmcia_socket *skt)
break;
}
ret = socket_resume(skt);
if (!ret && skt->callback)
skt->callback->resume(skt);
} while (0);
up(&skt->skt_sem);

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/pcmcia/cs_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ struct pcmcia_callback{
struct module *owner;
int (*event) (struct pcmcia_socket *s, event_t event, int priority);
void (*requery) (struct pcmcia_socket *s);
int (*suspend) (struct pcmcia_socket *s);
int (*resume) (struct pcmcia_socket *s);
};

int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
Expand Down
94 changes: 84 additions & 10 deletions trunk/drivers/pcmcia/ds.c
Original file line number Diff line number Diff line change
Expand Up @@ -920,6 +920,78 @@ static struct device_attribute pcmcia_dev_attrs[] = {
__ATTR_NULL,
};

/* PM support, also needed for reset */

static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
{
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
struct pcmcia_driver *p_drv = NULL;

if (dev->driver)
p_drv = to_pcmcia_drv(dev->driver);

if (p_drv && p_drv->suspend)
return p_drv->suspend(p_dev);

return 0;
}


static int pcmcia_dev_resume(struct device * dev)
{
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
struct pcmcia_driver *p_drv = NULL;

if (dev->driver)
p_drv = to_pcmcia_drv(dev->driver);

if (p_drv && p_drv->resume)
return p_drv->resume(p_dev);

return 0;
}


static int pcmcia_bus_suspend_callback(struct device *dev, void * _data)
{
struct pcmcia_socket *skt = _data;
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);

if (p_dev->socket != skt)
return 0;

return dpm_runtime_suspend(dev, PMSG_SUSPEND);
}

static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
{
struct pcmcia_socket *skt = _data;
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);

if (p_dev->socket != skt)
return 0;

dpm_runtime_resume(dev);

return 0;
}

static int pcmcia_bus_resume(struct pcmcia_socket *skt)
{
bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
return 0;
}

static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
{
if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
pcmcia_bus_suspend_callback)) {
pcmcia_bus_resume(skt);
return -EIO;
}
return 0;
}


/*======================================================================
Expand Down Expand Up @@ -951,16 +1023,6 @@ static int send_event_callback(struct device *dev, void * _data)
if (p_dev->state & (CLIENT_UNBOUND|CLIENT_STALE))
return 0;

if ((data->event == CS_EVENT_PM_SUSPEND) ||
(data->event == CS_EVENT_RESET_PHYSICAL)) {
if (p_drv->suspend)
return p_drv->suspend(p_dev);
} else if ((data->event == CS_EVENT_PM_RESUME) ||
(data->event == CS_EVENT_CARD_RESET)) {
if (p_drv->resume)
return p_drv->resume(p_dev);
}

if (p_drv->event)
return p_drv->event(data->event, data->priority,
&p_dev->event_callback_args);
Expand Down Expand Up @@ -1012,6 +1074,13 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
ret = send_event(skt, event, priority);
break;

case CS_EVENT_PM_SUSPEND:
case CS_EVENT_PM_RESUME:
case CS_EVENT_RESET_PHYSICAL:
case CS_EVENT_CARD_RESET:
handle_event(skt, event);
break;

default:
handle_event(skt, event);
send_event(skt, event, priority);
Expand Down Expand Up @@ -1166,10 +1235,13 @@ int pcmcia_deregister_client(struct pcmcia_device *p_dev)
} /* deregister_client */
EXPORT_SYMBOL(pcmcia_deregister_client);


static struct pcmcia_callback pcmcia_bus_callback = {
.owner = THIS_MODULE,
.event = ds_event,
.requery = pcmcia_bus_rescan,
.suspend = pcmcia_bus_suspend,
.resume = pcmcia_bus_resume,
};

static int __devinit pcmcia_bus_add_socket(struct class_device *class_dev,
Expand Down Expand Up @@ -1238,6 +1310,8 @@ struct bus_type pcmcia_bus_type = {
.uevent = pcmcia_bus_uevent,
.match = pcmcia_bus_match,
.dev_attrs = pcmcia_dev_attrs,
.suspend = pcmcia_dev_suspend,
.resume = pcmcia_dev_resume,
};


Expand Down

0 comments on commit b69fd24

Please sign in to comment.