aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-10-21 18:21:52 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2011-10-21 18:21:52 -0400
commitd033e078566faed8c8f59baf97ee57ce2524ef5c (patch)
tree46a98bf6a555ecbc8178baf6dd3a81553c3c3654
parent081a9d043c983f161b78fdc4671324d1342b86bc (diff)
parent382414b93ac1e8ee7693be710e60c83eacc97c6f (diff)
Merge branch 'pm-domains' into pm-for-linus
* pm-domains: ARM: mach-shmobile: sh7372 A4R support (v4) ARM: mach-shmobile: sh7372 A3SP support (v4) PM / Sleep: Mark devices involved in wakeup signaling during suspend
-rw-r--r--arch/arm/mach-shmobile/board-ap4evb.c5
-rw-r--r--arch/arm/mach-shmobile/board-mackerel.c9
-rw-r--r--arch/arm/mach-shmobile/include/mach/sh7372.h10
-rw-r--r--arch/arm/mach-shmobile/intc-sh7372.c52
-rw-r--r--arch/arm/mach-shmobile/pm-sh7372.c57
-rw-r--r--arch/arm/mach-shmobile/setup-sh7372.c22
-rw-r--r--drivers/base/power/domain.c4
-rw-r--r--drivers/base/power/main.c8
-rw-r--r--include/linux/pm.h1
9 files changed, 159 insertions, 9 deletions
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c
index d6c8ae813175..7e90d064ebcb 100644
--- a/arch/arm/mach-shmobile/board-ap4evb.c
+++ b/arch/arm/mach-shmobile/board-ap4evb.c
@@ -1409,6 +1409,11 @@ static void __init ap4evb_init(void)
1409 sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device); 1409 sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device);
1410 sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device); 1410 sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device);
1411 1411
1412 sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device);
1413 sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device);
1414 sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi1_device);
1415 sh7372_add_device_to_domain(&sh7372_a4r, &ceu_device);
1416
1412 hdmi_init_pm_clock(); 1417 hdmi_init_pm_clock();
1413 fsi_init_pm_clock(); 1418 fsi_init_pm_clock();
1414 sh7372_pm_init(); 1419 sh7372_pm_init();
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c
index 19f5d4922e2c..56d4fed6f03a 100644
--- a/arch/arm/mach-shmobile/board-mackerel.c
+++ b/arch/arm/mach-shmobile/board-mackerel.c
@@ -1588,6 +1588,15 @@ static void __init mackerel_init(void)
1588 sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device); 1588 sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device);
1589 sh7372_add_device_to_domain(&sh7372_a4lc, &hdmi_lcdc_device); 1589 sh7372_add_device_to_domain(&sh7372_a4lc, &hdmi_lcdc_device);
1590 sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device); 1590 sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device);
1591 sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs0_device);
1592 sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs1_device);
1593 sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device);
1594 sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device);
1595#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1596 sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi1_device);
1597#endif
1598 sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi2_device);
1599 sh7372_add_device_to_domain(&sh7372_a4r, &ceu_device);
1591 1600
1592 hdmi_init_pm_clock(); 1601 hdmi_init_pm_clock();
1593 sh7372_pm_init(); 1602 sh7372_pm_init();
diff --git a/arch/arm/mach-shmobile/include/mach/sh7372.h b/arch/arm/mach-shmobile/include/mach/sh7372.h
index efc984c4cef3..84532f9629b2 100644
--- a/arch/arm/mach-shmobile/include/mach/sh7372.h
+++ b/arch/arm/mach-shmobile/include/mach/sh7372.h
@@ -479,7 +479,12 @@ struct platform_device;
479 479
480struct sh7372_pm_domain { 480struct sh7372_pm_domain {
481 struct generic_pm_domain genpd; 481 struct generic_pm_domain genpd;
482 struct dev_power_governor *gov;
483 void (*suspend)(void);
484 void (*resume)(void);
482 unsigned int bit_shift; 485 unsigned int bit_shift;
486 bool no_debug;
487 bool stay_on;
483}; 488};
484 489
485static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d) 490static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d)
@@ -491,8 +496,10 @@ static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d)
491extern struct sh7372_pm_domain sh7372_a4lc; 496extern struct sh7372_pm_domain sh7372_a4lc;
492extern struct sh7372_pm_domain sh7372_a4mp; 497extern struct sh7372_pm_domain sh7372_a4mp;
493extern struct sh7372_pm_domain sh7372_d4; 498extern struct sh7372_pm_domain sh7372_d4;
499extern struct sh7372_pm_domain sh7372_a4r;
494extern struct sh7372_pm_domain sh7372_a3rv; 500extern struct sh7372_pm_domain sh7372_a3rv;
495extern struct sh7372_pm_domain sh7372_a3ri; 501extern struct sh7372_pm_domain sh7372_a3ri;
502extern struct sh7372_pm_domain sh7372_a3sp;
496extern struct sh7372_pm_domain sh7372_a3sg; 503extern struct sh7372_pm_domain sh7372_a3sg;
497 504
498extern void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd); 505extern void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd);
@@ -506,4 +513,7 @@ extern void sh7372_pm_add_subdomain(struct sh7372_pm_domain *sh7372_pd,
506#define sh7372_pm_add_subdomain(pd, sd) do { } while(0) 513#define sh7372_pm_add_subdomain(pd, sd) do { } while(0)
507#endif /* CONFIG_PM */ 514#endif /* CONFIG_PM */
508 515
516extern void sh7372_intcs_suspend(void);
517extern void sh7372_intcs_resume(void);
518
509#endif /* __ASM_SH7372_H__ */ 519#endif /* __ASM_SH7372_H__ */
diff --git a/arch/arm/mach-shmobile/intc-sh7372.c b/arch/arm/mach-shmobile/intc-sh7372.c
index 739315e30eb9..29cdc0522d9c 100644
--- a/arch/arm/mach-shmobile/intc-sh7372.c
+++ b/arch/arm/mach-shmobile/intc-sh7372.c
@@ -606,9 +606,16 @@ static void intcs_demux(unsigned int irq, struct irq_desc *desc)
606 generic_handle_irq(intcs_evt2irq(evtcodeas)); 606 generic_handle_irq(intcs_evt2irq(evtcodeas));
607} 607}
608 608
609static void __iomem *intcs_ffd2;
610static void __iomem *intcs_ffd5;
611
609void __init sh7372_init_irq(void) 612void __init sh7372_init_irq(void)
610{ 613{
611 void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE); 614 void __iomem *intevtsa;
615
616 intcs_ffd2 = ioremap_nocache(0xffd20000, PAGE_SIZE);
617 intevtsa = intcs_ffd2 + 0x100;
618 intcs_ffd5 = ioremap_nocache(0xffd50000, PAGE_SIZE);
612 619
613 register_intc_controller(&intca_desc); 620 register_intc_controller(&intca_desc);
614 register_intc_controller(&intcs_desc); 621 register_intc_controller(&intcs_desc);
@@ -617,3 +624,46 @@ void __init sh7372_init_irq(void)
617 irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa); 624 irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa);
618 irq_set_chained_handler(evt2irq(0xf80), intcs_demux); 625 irq_set_chained_handler(evt2irq(0xf80), intcs_demux);
619} 626}
627
628static unsigned short ffd2[0x200];
629static unsigned short ffd5[0x100];
630
631void sh7372_intcs_suspend(void)
632{
633 int k;
634
635 for (k = 0x00; k <= 0x30; k += 4)
636 ffd2[k] = __raw_readw(intcs_ffd2 + k);
637
638 for (k = 0x80; k <= 0xb0; k += 4)
639 ffd2[k] = __raw_readb(intcs_ffd2 + k);
640
641 for (k = 0x180; k <= 0x188; k += 4)
642 ffd2[k] = __raw_readb(intcs_ffd2 + k);
643
644 for (k = 0x00; k <= 0x3c; k += 4)
645 ffd5[k] = __raw_readw(intcs_ffd5 + k);
646
647 for (k = 0x80; k <= 0x9c; k += 4)
648 ffd5[k] = __raw_readb(intcs_ffd5 + k);
649}
650
651void sh7372_intcs_resume(void)
652{
653 int k;
654
655 for (k = 0x00; k <= 0x30; k += 4)
656 __raw_writew(ffd2[k], intcs_ffd2 + k);
657
658 for (k = 0x80; k <= 0xb0; k += 4)
659 __raw_writeb(ffd2[k], intcs_ffd2 + k);
660
661 for (k = 0x180; k <= 0x188; k += 4)
662 __raw_writeb(ffd2[k], intcs_ffd2 + k);
663
664 for (k = 0x00; k <= 0x3c; k += 4)
665 __raw_writew(ffd5[k], intcs_ffd5 + k);
666
667 for (k = 0x80; k <= 0x9c; k += 4)
668 __raw_writeb(ffd5[k], intcs_ffd5 + k);
669}
diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c
index 8e0944f96ba1..79612737c5b2 100644
--- a/arch/arm/mach-shmobile/pm-sh7372.c
+++ b/arch/arm/mach-shmobile/pm-sh7372.c
@@ -44,6 +44,7 @@
44#define SPDCR 0xe6180008 44#define SPDCR 0xe6180008
45#define SWUCR 0xe6180014 45#define SWUCR 0xe6180014
46#define SBAR 0xe6180020 46#define SBAR 0xe6180020
47#define WUPRMSK 0xe6180028
47#define WUPSMSK 0xe618002c 48#define WUPSMSK 0xe618002c
48#define WUPSMSK2 0xe6180048 49#define WUPSMSK2 0xe6180048
49#define PSTR 0xe6180080 50#define PSTR 0xe6180080
@@ -80,6 +81,12 @@ static int pd_power_down(struct generic_pm_domain *genpd)
80 struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd); 81 struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd);
81 unsigned int mask = 1 << sh7372_pd->bit_shift; 82 unsigned int mask = 1 << sh7372_pd->bit_shift;
82 83
84 if (sh7372_pd->suspend)
85 sh7372_pd->suspend();
86
87 if (sh7372_pd->stay_on)
88 return 0;
89
83 if (__raw_readl(PSTR) & mask) { 90 if (__raw_readl(PSTR) & mask) {
84 unsigned int retry_count; 91 unsigned int retry_count;
85 92
@@ -92,8 +99,9 @@ static int pd_power_down(struct generic_pm_domain *genpd)
92 } 99 }
93 } 100 }
94 101
95 pr_debug("sh7372 power domain down 0x%08x -> PSTR = 0x%08x\n", 102 if (!sh7372_pd->no_debug)
96 mask, __raw_readl(PSTR)); 103 pr_debug("sh7372 power domain down 0x%08x -> PSTR = 0x%08x\n",
104 mask, __raw_readl(PSTR));
97 105
98 return 0; 106 return 0;
99} 107}
@@ -105,6 +113,9 @@ static int pd_power_up(struct generic_pm_domain *genpd)
105 unsigned int retry_count; 113 unsigned int retry_count;
106 int ret = 0; 114 int ret = 0;
107 115
116 if (sh7372_pd->stay_on)
117 goto out;
118
108 if (__raw_readl(PSTR) & mask) 119 if (__raw_readl(PSTR) & mask)
109 goto out; 120 goto out;
110 121
@@ -121,23 +132,42 @@ static int pd_power_up(struct generic_pm_domain *genpd)
121 if (__raw_readl(SWUCR) & mask) 132 if (__raw_readl(SWUCR) & mask)
122 ret = -EIO; 133 ret = -EIO;
123 134
135 if (!sh7372_pd->no_debug)
136 pr_debug("sh7372 power domain up 0x%08x -> PSTR = 0x%08x\n",
137 mask, __raw_readl(PSTR));
138
124 out: 139 out:
125 pr_debug("sh7372 power domain up 0x%08x -> PSTR = 0x%08x\n", 140 if (ret == 0 && sh7372_pd->resume)
126 mask, __raw_readl(PSTR)); 141 sh7372_pd->resume();
127 142
128 return ret; 143 return ret;
129} 144}
130 145
146static void sh7372_a4r_suspend(void)
147{
148 sh7372_intcs_suspend();
149 __raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */
150}
151
131static bool pd_active_wakeup(struct device *dev) 152static bool pd_active_wakeup(struct device *dev)
132{ 153{
133 return true; 154 return true;
134} 155}
135 156
157static bool sh7372_power_down_forbidden(struct dev_pm_domain *domain)
158{
159 return false;
160}
161
162struct dev_power_governor sh7372_always_on_gov = {
163 .power_down_ok = sh7372_power_down_forbidden,
164};
165
136void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd) 166void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd)
137{ 167{
138 struct generic_pm_domain *genpd = &sh7372_pd->genpd; 168 struct generic_pm_domain *genpd = &sh7372_pd->genpd;
139 169
140 pm_genpd_init(genpd, NULL, false); 170 pm_genpd_init(genpd, sh7372_pd->gov, false);
141 genpd->stop_device = pm_clk_suspend; 171 genpd->stop_device = pm_clk_suspend;
142 genpd->start_device = pm_clk_resume; 172 genpd->start_device = pm_clk_resume;
143 genpd->dev_irq_safe = true; 173 genpd->dev_irq_safe = true;
@@ -175,6 +205,14 @@ struct sh7372_pm_domain sh7372_d4 = {
175 .bit_shift = 3, 205 .bit_shift = 3,
176}; 206};
177 207
208struct sh7372_pm_domain sh7372_a4r = {
209 .bit_shift = 5,
210 .gov = &sh7372_always_on_gov,
211 .suspend = sh7372_a4r_suspend,
212 .resume = sh7372_intcs_resume,
213 .stay_on = true,
214};
215
178struct sh7372_pm_domain sh7372_a3rv = { 216struct sh7372_pm_domain sh7372_a3rv = {
179 .bit_shift = 6, 217 .bit_shift = 6,
180}; 218};
@@ -183,6 +221,12 @@ struct sh7372_pm_domain sh7372_a3ri = {
183 .bit_shift = 8, 221 .bit_shift = 8,
184}; 222};
185 223
224struct sh7372_pm_domain sh7372_a3sp = {
225 .bit_shift = 11,
226 .gov = &sh7372_always_on_gov,
227 .no_debug = true,
228};
229
186struct sh7372_pm_domain sh7372_a3sg = { 230struct sh7372_pm_domain sh7372_a3sg = {
187 .bit_shift = 13, 231 .bit_shift = 13,
188}; 232};
@@ -422,6 +466,9 @@ void __init sh7372_pm_init(void)
422 __raw_writel(0x0000a501, DBGREG9); 466 __raw_writel(0x0000a501, DBGREG9);
423 __raw_writel(0x00000000, DBGREG1); 467 __raw_writel(0x00000000, DBGREG1);
424 468
469 /* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
470 __raw_writel(0, PDNSEL);
471
425 sh7372_suspend_init(); 472 sh7372_suspend_init();
426 sh7372_cpuidle_init(); 473 sh7372_cpuidle_init();
427} 474}
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c
index d317c224ed63..2380389e6ac5 100644
--- a/arch/arm/mach-shmobile/setup-sh7372.c
+++ b/arch/arm/mach-shmobile/setup-sh7372.c
@@ -991,11 +991,14 @@ void __init sh7372_add_standard_devices(void)
991 sh7372_init_pm_domain(&sh7372_a4lc); 991 sh7372_init_pm_domain(&sh7372_a4lc);
992 sh7372_init_pm_domain(&sh7372_a4mp); 992 sh7372_init_pm_domain(&sh7372_a4mp);
993 sh7372_init_pm_domain(&sh7372_d4); 993 sh7372_init_pm_domain(&sh7372_d4);
994 sh7372_init_pm_domain(&sh7372_a4r);
994 sh7372_init_pm_domain(&sh7372_a3rv); 995 sh7372_init_pm_domain(&sh7372_a3rv);
995 sh7372_init_pm_domain(&sh7372_a3ri); 996 sh7372_init_pm_domain(&sh7372_a3ri);
996 sh7372_init_pm_domain(&sh7372_a3sg); 997 sh7372_init_pm_domain(&sh7372_a3sg);
998 sh7372_init_pm_domain(&sh7372_a3sp);
997 999
998 sh7372_pm_add_subdomain(&sh7372_a4lc, &sh7372_a3rv); 1000 sh7372_pm_add_subdomain(&sh7372_a4lc, &sh7372_a3rv);
1001 sh7372_pm_add_subdomain(&sh7372_a4r, &sh7372_a4lc);
999 1002
1000 platform_add_devices(sh7372_early_devices, 1003 platform_add_devices(sh7372_early_devices,
1001 ARRAY_SIZE(sh7372_early_devices)); 1004 ARRAY_SIZE(sh7372_early_devices));
@@ -1006,6 +1009,25 @@ void __init sh7372_add_standard_devices(void)
1006 sh7372_add_device_to_domain(&sh7372_a3rv, &vpu_device); 1009 sh7372_add_device_to_domain(&sh7372_a3rv, &vpu_device);
1007 sh7372_add_device_to_domain(&sh7372_a4mp, &spu0_device); 1010 sh7372_add_device_to_domain(&sh7372_a4mp, &spu0_device);
1008 sh7372_add_device_to_domain(&sh7372_a4mp, &spu1_device); 1011 sh7372_add_device_to_domain(&sh7372_a4mp, &spu1_device);
1012 sh7372_add_device_to_domain(&sh7372_a3sp, &scif0_device);
1013 sh7372_add_device_to_domain(&sh7372_a3sp, &scif1_device);
1014 sh7372_add_device_to_domain(&sh7372_a3sp, &scif2_device);
1015 sh7372_add_device_to_domain(&sh7372_a3sp, &scif3_device);
1016 sh7372_add_device_to_domain(&sh7372_a3sp, &scif4_device);
1017 sh7372_add_device_to_domain(&sh7372_a3sp, &scif5_device);
1018 sh7372_add_device_to_domain(&sh7372_a3sp, &scif6_device);
1019 sh7372_add_device_to_domain(&sh7372_a3sp, &iic1_device);
1020 sh7372_add_device_to_domain(&sh7372_a3sp, &dma0_device);
1021 sh7372_add_device_to_domain(&sh7372_a3sp, &dma1_device);
1022 sh7372_add_device_to_domain(&sh7372_a3sp, &dma2_device);
1023 sh7372_add_device_to_domain(&sh7372_a3sp, &usb_dma0_device);
1024 sh7372_add_device_to_domain(&sh7372_a3sp, &usb_dma1_device);
1025 sh7372_add_device_to_domain(&sh7372_a4r, &iic0_device);
1026 sh7372_add_device_to_domain(&sh7372_a4r, &veu0_device);
1027 sh7372_add_device_to_domain(&sh7372_a4r, &veu1_device);
1028 sh7372_add_device_to_domain(&sh7372_a4r, &veu2_device);
1029 sh7372_add_device_to_domain(&sh7372_a4r, &veu3_device);
1030 sh7372_add_device_to_domain(&sh7372_a4r, &jpu_device);
1009} 1031}
1010 1032
1011void __init sh7372_add_early_devices(void) 1033void __init sh7372_add_early_devices(void)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 22fe029ca212..6790cf7eba5a 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -714,7 +714,7 @@ static int pm_genpd_suspend_noirq(struct device *dev)
714 if (ret) 714 if (ret)
715 return ret; 715 return ret;
716 716
717 if (device_may_wakeup(dev) 717 if (dev->power.wakeup_path
718 && genpd->active_wakeup && genpd->active_wakeup(dev)) 718 && genpd->active_wakeup && genpd->active_wakeup(dev))
719 return 0; 719 return 0;
720 720
@@ -938,7 +938,7 @@ static int pm_genpd_dev_poweroff_noirq(struct device *dev)
938 if (ret) 938 if (ret)
939 return ret; 939 return ret;
940 940
941 if (device_may_wakeup(dev) 941 if (dev->power.wakeup_path
942 && genpd->active_wakeup && genpd->active_wakeup(dev)) 942 && genpd->active_wakeup && genpd->active_wakeup(dev))
943 return 0; 943 return 0;
944 944
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index b1b58260b4ff..59f8ab235486 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -917,7 +917,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
917 } 917 }
918 918
919 End: 919 End:
920 dev->power.is_suspended = !error; 920 if (!error) {
921 dev->power.is_suspended = true;
922 if (dev->power.wakeup_path && dev->parent)
923 dev->parent->power.wakeup_path = true;
924 }
921 925
922 device_unlock(dev); 926 device_unlock(dev);
923 complete_all(&dev->power.completion); 927 complete_all(&dev->power.completion);
@@ -1020,6 +1024,8 @@ static int device_prepare(struct device *dev, pm_message_t state)
1020 1024
1021 device_lock(dev); 1025 device_lock(dev);
1022 1026
1027 dev->power.wakeup_path = device_may_wakeup(dev);
1028
1023 if (dev->pm_domain) { 1029 if (dev->pm_domain) {
1024 pm_dev_dbg(dev, state, "preparing power domain "); 1030 pm_dev_dbg(dev, state, "preparing power domain ");
1025 if (dev->pm_domain->ops.prepare) 1031 if (dev->pm_domain->ops.prepare)
diff --git a/include/linux/pm.h b/include/linux/pm.h
index 91f248bbe4fe..f15acb646813 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -452,6 +452,7 @@ struct dev_pm_info {
452 struct list_head entry; 452 struct list_head entry;
453 struct completion completion; 453 struct completion completion;
454 struct wakeup_source *wakeup; 454 struct wakeup_source *wakeup;
455 bool wakeup_path:1;
455#else 456#else
456 unsigned int should_wakeup:1; 457 unsigned int should_wakeup:1;
457#endif 458#endif