diff options
Diffstat (limited to 'drivers/char/pcmcia/synclink_cs.c')
-rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 47 |
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 | ||
776 | static 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 | |||
789 | static 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 | |||
776 | static int mgslpc_event(event_t event, int priority, | 803 | static 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 | ||
3100 | static struct tty_operations mgslpc_ops = { | 3111 | static struct tty_operations mgslpc_ops = { |