Commit 9c1fe834 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6

* 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
  PM / yenta: Fix cardbus suspend/resume regression
  PM / PCMCIA: Drop second argument of pcmcia_socket_dev_suspend()
parents 5a4c8d75 0c570cde
...@@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) ...@@ -363,7 +363,7 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
struct at91_cf_socket *cf = platform_get_drvdata(pdev); struct at91_cf_socket *cf = platform_get_drvdata(pdev);
struct at91_cf_data *board = cf->board; struct at91_cf_data *board = cf->board;
pcmcia_socket_dev_suspend(&pdev->dev, mesg); pcmcia_socket_dev_suspend(&pdev->dev);
if (device_may_wakeup(&pdev->dev)) { if (device_may_wakeup(&pdev->dev)) {
enable_irq_wake(board->det_pin); enable_irq_wake(board->det_pin);
if (board->irq_pin) if (board->irq_pin)
......
...@@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struct platform_device *dev) ...@@ -515,7 +515,7 @@ static int au1x00_drv_pcmcia_probe(struct platform_device *dev)
static int au1x00_drv_pcmcia_suspend(struct platform_device *dev, static int au1x00_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int au1x00_drv_pcmcia_resume(struct platform_device *dev) static int au1x00_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(struct platform_device *pdev) ...@@ -302,7 +302,7 @@ static int __devexit bfin_cf_remove(struct platform_device *pdev)
static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg) static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
{ {
return pcmcia_socket_dev_suspend(&pdev->dev, mesg); return pcmcia_socket_dev_suspend(&pdev->dev);
} }
static int bfin_cf_resume(struct platform_device *pdev) static int bfin_cf_resume(struct platform_device *pdev)
......
...@@ -101,7 +101,7 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem); ...@@ -101,7 +101,7 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem);
static int socket_resume(struct pcmcia_socket *skt); static int socket_resume(struct pcmcia_socket *skt);
static int socket_suspend(struct pcmcia_socket *skt); static int socket_suspend(struct pcmcia_socket *skt);
int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state) int pcmcia_socket_dev_suspend(struct device *dev)
{ {
struct pcmcia_socket *socket; struct pcmcia_socket *socket;
......
...@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); ...@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids);
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int i82092aa_socket_resume (struct pci_dev *dev) static int i82092aa_socket_resume (struct pci_dev *dev)
......
...@@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socket *s) ...@@ -1241,7 +1241,7 @@ static int pcic_init(struct pcmcia_socket *s)
static int i82365_drv_pcmcia_suspend(struct platform_device *dev, static int i82365_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int i82365_drv_pcmcia_resume(struct platform_device *dev) static int i82365_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -699,7 +699,7 @@ static struct pccard_operations pcc_operations = { ...@@ -699,7 +699,7 @@ static struct pccard_operations pcc_operations = {
static int cfc_drv_pcmcia_suspend(struct platform_device *dev, static int cfc_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int cfc_drv_pcmcia_resume(struct platform_device *dev) static int cfc_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -675,7 +675,7 @@ static struct pccard_operations pcc_operations = { ...@@ -675,7 +675,7 @@ static struct pccard_operations pcc_operations = {
static int pcc_drv_pcmcia_suspend(struct platform_device *dev, static int pcc_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int pcc_drv_pcmcia_resume(struct platform_device *dev) static int pcc_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device *ofdev) ...@@ -1296,7 +1296,7 @@ static int m8xx_remove(struct of_device *ofdev)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int m8xx_suspend(struct platform_device *pdev, pm_message_t state) static int m8xx_suspend(struct platform_device *pdev, pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&pdev->dev, state); return pcmcia_socket_dev_suspend(&pdev->dev);
} }
static int m8xx_resume(struct platform_device *pdev) static int m8xx_resume(struct platform_device *pdev)
......
...@@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct platform_device *pdev) ...@@ -334,7 +334,7 @@ static int __exit omap_cf_remove(struct platform_device *pdev)
static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg) static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
{ {
return pcmcia_socket_dev_suspend(&pdev->dev, mesg); return pcmcia_socket_dev_suspend(&pdev->dev);
} }
static int omap_cf_resume(struct platform_device *pdev) static int omap_cf_resume(struct platform_device *pdev)
......
...@@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev) ...@@ -758,7 +758,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int pd6729_socket_resume(struct pci_dev *dev) static int pd6729_socket_resume(struct pci_dev *dev)
......
...@@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev) ...@@ -302,7 +302,7 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
static int pxa2xx_drv_pcmcia_suspend(struct device *dev) static int pxa2xx_drv_pcmcia_suspend(struct device *dev)
{ {
return pcmcia_socket_dev_suspend(dev, PMSG_SUSPEND); return pcmcia_socket_dev_suspend(dev);
} }
static int pxa2xx_drv_pcmcia_resume(struct device *dev) static int pxa2xx_drv_pcmcia_resume(struct device *dev)
......
...@@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) ...@@ -89,7 +89,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev, static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int sa11x0_drv_pcmcia_resume(struct platform_device *dev) static int sa11x0_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev) ...@@ -159,7 +159,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev)
static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state) static int pcmcia_suspend(struct sa1111_dev *dev, pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int pcmcia_resume(struct sa1111_dev *dev) static int pcmcia_resume(struct sa1111_dev *dev)
......
...@@ -366,7 +366,7 @@ static int __init get_tcic_id(void) ...@@ -366,7 +366,7 @@ static int __init get_tcic_id(void)
static int tcic_drv_pcmcia_suspend(struct platform_device *dev, static int tcic_drv_pcmcia_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int tcic_drv_pcmcia_resume(struct platform_device *dev) static int tcic_drv_pcmcia_resume(struct platform_device *dev)
......
...@@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_setup); ...@@ -707,7 +707,7 @@ __setup("vrc4171_card=", vrc4171_card_setup);
static int vrc4171_card_suspend(struct platform_device *dev, static int vrc4171_card_suspend(struct platform_device *dev,
pm_message_t state) pm_message_t state)
{ {
return pcmcia_socket_dev_suspend(&dev->dev, state); return pcmcia_socket_dev_suspend(&dev->dev);
} }
static int vrc4171_card_resume(struct platform_device *dev) static int vrc4171_card_resume(struct platform_device *dev)
......
...@@ -1225,60 +1225,71 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i ...@@ -1225,60 +1225,71 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) static int yenta_dev_suspend_noirq(struct device *dev)
{ {
struct yenta_socket *socket = pci_get_drvdata(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct yenta_socket *socket = pci_get_drvdata(pdev);
int ret; int ret;
ret = pcmcia_socket_dev_suspend(&dev->dev, state); ret = pcmcia_socket_dev_suspend(dev);
if (socket) { if (!socket)
if (socket->type && socket->type->save_state) return ret;
socket->type->save_state(socket);
/* FIXME: pci_save_state needs to have a better interface */ if (socket->type && socket->type->save_state)
pci_save_state(dev); socket->type->save_state(socket);
pci_read_config_dword(dev, 16*4, &socket->saved_state[0]);
pci_read_config_dword(dev, 17*4, &socket->saved_state[1]);
pci_disable_device(dev);
/* pci_save_state(pdev);
* Some laptops (IBM T22) do not like us putting the Cardbus pci_read_config_dword(pdev, 16*4, &socket->saved_state[0]);
* bridge into D3. At a guess, some other laptop will pci_read_config_dword(pdev, 17*4, &socket->saved_state[1]);
* probably require this, so leave it commented out for now. pci_disable_device(pdev);
*/
/* pci_set_power_state(dev, 3); */ /*
} * Some laptops (IBM T22) do not like us putting the Cardbus
* bridge into D3. At a guess, some other laptop will
* probably require this, so leave it commented out for now.
*/
/* pci_set_power_state(dev, 3); */
return ret; return ret;
} }
static int yenta_dev_resume_noirq(struct device *dev)
static int yenta_dev_resume (struct pci_dev *dev)
{ {
struct yenta_socket *socket = pci_get_drvdata(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct yenta_socket *socket = pci_get_drvdata(pdev);
int ret;
if (socket) { if (!socket)
int rc; return 0;
pci_set_power_state(dev, 0); pci_write_config_dword(pdev, 16*4, socket->saved_state[0]);
/* FIXME: pci_restore_state needs to have a better interface */ pci_write_config_dword(pdev, 17*4, socket->saved_state[1]);
pci_restore_state(dev);
pci_write_config_dword(dev, 16*4, socket->saved_state[0]);
pci_write_config_dword(dev, 17*4, socket->saved_state[1]);
rc = pci_enable_device(dev); ret = pci_enable_device(pdev);
if (rc) if (ret)
return rc; return ret;
pci_set_master(dev); pci_set_master(pdev);
if (socket->type && socket->type->restore_state) if (socket->type && socket->type->restore_state)
socket->type->restore_state(socket); socket->type->restore_state(socket);
}
return pcmcia_socket_dev_resume(&dev->dev); return pcmcia_socket_dev_resume(dev);
} }
static struct dev_pm_ops yenta_pm_ops = {
.suspend_noirq = yenta_dev_suspend_noirq,
.resume_noirq = yenta_dev_resume_noirq,
.freeze_noirq = yenta_dev_suspend_noirq,
.thaw_noirq = yenta_dev_resume_noirq,
.poweroff_noirq = yenta_dev_suspend_noirq,
.restore_noirq = yenta_dev_resume_noirq,
};
#define YENTA_PM_OPS (&yenta_pm_ops)
#else
#define YENTA_PM_OPS NULL
#endif #endif
#define CB_ID(vend,dev,type) \ #define CB_ID(vend,dev,type) \
...@@ -1376,10 +1387,7 @@ static struct pci_driver yenta_cardbus_driver = { ...@@ -1376,10 +1387,7 @@ static struct pci_driver yenta_cardbus_driver = {
.id_table = yenta_table, .id_table = yenta_table,
.probe = yenta_probe, .probe = yenta_probe,
.remove = __devexit_p(yenta_close), .remove = __devexit_p(yenta_close),
#ifdef CONFIG_PM .driver.pm = YENTA_PM_OPS,
.suspend = yenta_dev_suspend,
.resume = yenta_dev_resume,
#endif
}; };
......
...@@ -279,7 +279,7 @@ extern struct pccard_resource_ops pccard_iodyn_ops; ...@@ -279,7 +279,7 @@ extern struct pccard_resource_ops pccard_iodyn_ops;
extern struct pccard_resource_ops pccard_nonstatic_ops; extern struct pccard_resource_ops pccard_nonstatic_ops;
/* socket drivers are expected to use these callbacks in their .drv struct */ /* socket drivers are expected to use these callbacks in their .drv struct */
extern int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state); extern int pcmcia_socket_dev_suspend(struct device *dev);
extern int pcmcia_socket_dev_resume(struct device *dev); extern int pcmcia_socket_dev_resume(struct device *dev);
/* socket drivers use this callback in their IRQ handler */ /* socket drivers use this callback in their IRQ handler */
......
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