aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/pcmcia/cm4000_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/cm4000_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/cm4000_cs.c')
-rw-r--r--drivers/char/pcmcia/cm4000_cs.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index 61681c9f3f72..05e93054c98c 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -1893,33 +1893,6 @@ static int cm4000_event(event_t event, int priority,
1893 link->state &= ~DEV_PRESENT; 1893 link->state &= ~DEV_PRESENT;
1894 stop_monitor(dev); 1894 stop_monitor(dev);
1895 break; 1895 break;
1896 case CS_EVENT_PM_SUSPEND:
1897 DEBUGP(5, dev, "CS_EVENT_PM_SUSPEND "
1898 "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
1899 link->state |= DEV_SUSPEND;
1900 /* fall-through */
1901 case CS_EVENT_RESET_PHYSICAL:
1902 DEBUGP(5, dev, "CS_EVENT_RESET_PHYSICAL\n");
1903 if (link->state & DEV_CONFIG) {
1904 DEBUGP(5, dev, "ReleaseConfiguration\n");
1905 pcmcia_release_configuration(link->handle);
1906 }
1907 stop_monitor(dev);
1908 break;
1909 case CS_EVENT_PM_RESUME:
1910 DEBUGP(5, dev, "CS_EVENT_PM_RESUME "
1911 "(fall-through to CS_EVENT_CARD_RESET)\n");
1912 link->state &= ~DEV_SUSPEND;
1913 /* fall-through */
1914 case CS_EVENT_CARD_RESET:
1915 DEBUGP(5, dev, "CS_EVENT_CARD_RESET\n");
1916 if ((link->state & DEV_CONFIG)) {
1917 DEBUGP(5, dev, "RequestConfiguration\n");
1918 pcmcia_request_configuration(link->handle, &link->conf);
1919 }
1920 if (link->open)
1921 start_monitor(dev);
1922 break;
1923 default: 1896 default:
1924 DEBUGP(5, dev, "unknown event %.2x\n", event); 1897 DEBUGP(5, dev, "unknown event %.2x\n", event);
1925 break; 1898 break;
@@ -1928,6 +1901,38 @@ static int cm4000_event(event_t event, int priority,
1928 return CS_SUCCESS; 1901 return CS_SUCCESS;
1929} 1902}
1930 1903
1904static int cm4000_suspend(struct pcmcia_device *p_dev)
1905{
1906 dev_link_t *link = dev_to_instance(p_dev);
1907 struct cm4000_dev *dev;
1908
1909 dev = link->priv;
1910
1911 link->state |= DEV_SUSPEND;
1912 if (link->state & DEV_CONFIG)
1913 pcmcia_release_configuration(link->handle);
1914 stop_monitor(dev);
1915
1916 return 0;
1917}
1918
1919static int cm4000_resume(struct pcmcia_device *p_dev)
1920{
1921 dev_link_t *link = dev_to_instance(p_dev);
1922 struct cm4000_dev *dev;
1923
1924 dev = link->priv;
1925
1926 link->state &= ~DEV_SUSPEND;
1927 if (link->state & DEV_CONFIG)
1928 pcmcia_request_configuration(link->handle, &link->conf);
1929
1930 if (link->open)
1931 start_monitor(dev);
1932
1933 return 0;
1934}
1935
1931static void cm4000_release(dev_link_t *link) 1936static void cm4000_release(dev_link_t *link)
1932{ 1937{
1933 cmm_cm4000_release(link->priv); /* delay release until device closed */ 1938 cmm_cm4000_release(link->priv); /* delay release until device closed */
@@ -2044,6 +2049,8 @@ static struct pcmcia_driver cm4000_driver = {
2044 }, 2049 },
2045 .attach = cm4000_attach, 2050 .attach = cm4000_attach,
2046 .detach = cm4000_detach, 2051 .detach = cm4000_detach,
2052 .suspend = cm4000_suspend,
2053 .resume = cm4000_resume,
2047 .event = cm4000_event, 2054 .event = cm4000_event,
2048 .id_table = cm4000_ids, 2055 .id_table = cm4000_ids,
2049}; 2056};