aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/pcmcia/synclink_cs.c
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2005-11-14 15:21:18 -0500
committerDominik Brodowski <linux@dominikbrodowski.net>2006-01-05 17:59:02 -0500
commit98e4c28b7ec390c2dad6a4c69d69629c0f7e8b10 (patch)
treeb3d46f0643352e541d6a39e6da09059687cf713d /drivers/char/pcmcia/synclink_cs.c
parent63e7ebd06402951bc8863ba5b7bc9b9f42044849 (diff)
[PATCH] pcmcia: new suspend core
Move the suspend and resume methods out of the event handler, and into special functions. Also use these functions for pre- and post-reset, as almost all drivers already do, and the remaining ones can easily be converted. Bugfix to include/pcmcia/ds.c Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/char/pcmcia/synclink_cs.c')
-rw-r--r--drivers/char/pcmcia/synclink_cs.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 2c326ea53421..776103e56042 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -773,11 +773,37 @@ static void mgslpc_detach(dev_link_t *link)
773 mgslpc_remove_device((MGSLPC_INFO *)link->priv); 773 mgslpc_remove_device((MGSLPC_INFO *)link->priv);
774} 774}
775 775
776static int mgslpc_suspend(struct pcmcia_device *dev)
777{
778 dev_link_t *link = dev_to_instance(dev);
779 MGSLPC_INFO *info = link->priv;
780
781 link->state |= DEV_SUSPEND;
782 info->stop = 1;
783 if (link->state & DEV_CONFIG)
784 pcmcia_release_configuration(link->handle);
785
786 return 0;
787}
788
789static int mgslpc_resume(struct pcmcia_device *dev)
790{
791 dev_link_t *link = dev_to_instance(dev);
792 MGSLPC_INFO *info = link->priv;
793
794 link->state &= ~DEV_SUSPEND;
795 if (link->state & DEV_CONFIG)
796 pcmcia_request_configuration(link->handle, &link->conf);
797 info->stop = 0;
798
799 return 0;
800}
801
802
776static int mgslpc_event(event_t event, int priority, 803static int mgslpc_event(event_t event, int priority,
777 event_callback_args_t *args) 804 event_callback_args_t *args)
778{ 805{
779 dev_link_t *link = args->client_data; 806 dev_link_t *link = args->client_data;
780 MGSLPC_INFO *info = link->priv;
781 807
782 if (debug_level >= DEBUG_LEVEL_INFO) 808 if (debug_level >= DEBUG_LEVEL_INFO)
783 printk("mgslpc_event(0x%06x)\n", event); 809 printk("mgslpc_event(0x%06x)\n", event);
@@ -794,23 +820,6 @@ static int mgslpc_event(event_t event, int priority,
794 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; 820 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
795 mgslpc_config(link); 821 mgslpc_config(link);
796 break; 822 break;
797 case CS_EVENT_PM_SUSPEND:
798 link->state |= DEV_SUSPEND;
799 /* Fall through... */
800 case CS_EVENT_RESET_PHYSICAL:
801 /* Mark the device as stopped, to block IO until later */
802 info->stop = 1;
803 if (link->state & DEV_CONFIG)
804 pcmcia_release_configuration(link->handle);
805 break;
806 case CS_EVENT_PM_RESUME:
807 link->state &= ~DEV_SUSPEND;
808 /* Fall through... */
809 case CS_EVENT_CARD_RESET:
810 if (link->state & DEV_CONFIG)
811 pcmcia_request_configuration(link->handle, &link->conf);
812 info->stop = 0;
813 break;
814 } 823 }
815 return 0; 824 return 0;
816} 825}
@@ -3095,6 +3104,8 @@ static struct pcmcia_driver mgslpc_driver = {
3095 .event = mgslpc_event, 3104 .event = mgslpc_event,
3096 .detach = mgslpc_detach, 3105 .detach = mgslpc_detach,
3097 .id_table = mgslpc_ids, 3106 .id_table = mgslpc_ids,
3107 .suspend = mgslpc_suspend,
3108 .resume = mgslpc_resume,
3098}; 3109};
3099 3110
3100static struct tty_operations mgslpc_ops = { 3111static struct tty_operations mgslpc_ops = {