Merge branch 'x86-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / usb / core / hcd-pci.c
1 /*
2  * (C) Copyright David Brownell 2000-2002
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the
6  * Free Software Foundation; either version 2 of the License, or (at your
7  * option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/pci.h>
22 #include <linux/usb.h>
23 #include <linux/usb/hcd.h>
24
25 #include <asm/io.h>
26 #include <asm/irq.h>
27
28 #ifdef CONFIG_PPC_PMAC
29 #include <asm/machdep.h>
30 #include <asm/pmac_feature.h>
31 #include <asm/prom.h>
32 #endif
33
34 #include "usb.h"
35
36
37 /* PCI-based HCs are common, but plenty of non-PCI HCs are used too */
38
39 /*
40  * Coordinate handoffs between EHCI and companion controllers
41  * during EHCI probing and system resume.
42  */
43
44 static DECLARE_RWSEM(companions_rwsem);
45
46 #define CL_UHCI         PCI_CLASS_SERIAL_USB_UHCI
47 #define CL_OHCI         PCI_CLASS_SERIAL_USB_OHCI
48 #define CL_EHCI         PCI_CLASS_SERIAL_USB_EHCI
49
50 static inline int is_ohci_or_uhci(struct pci_dev *pdev)
51 {
52         return pdev->class == CL_OHCI || pdev->class == CL_UHCI;
53 }
54
55 typedef void (*companion_fn)(struct pci_dev *pdev, struct usb_hcd *hcd,
56                 struct pci_dev *companion, struct usb_hcd *companion_hcd);
57
58 /* Iterate over PCI devices in the same slot as pdev and call fn for each */
59 static void for_each_companion(struct pci_dev *pdev, struct usb_hcd *hcd,
60                 companion_fn fn)
61 {
62         struct pci_dev          *companion;
63         struct usb_hcd          *companion_hcd;
64         unsigned int            slot = PCI_SLOT(pdev->devfn);
65
66         /*
67          * Iterate through other PCI functions in the same slot.
68          * If the function's drvdata isn't set then it isn't bound to
69          * a USB host controller driver, so skip it.
70          */
71         companion = NULL;
72         for_each_pci_dev(companion) {
73                 if (companion->bus != pdev->bus ||
74                                 PCI_SLOT(companion->devfn) != slot)
75                         continue;
76
77                 /*
78                  * Companion device should be either UHCI,OHCI or EHCI host
79                  * controller, otherwise skip.
80                  */
81                 if (companion->class != CL_UHCI && companion->class != CL_OHCI &&
82                                 companion->class != CL_EHCI)
83                         continue;
84
85                 companion_hcd = pci_get_drvdata(companion);
86                 if (!companion_hcd || !companion_hcd->self.root_hub)
87                         continue;
88                 fn(pdev, hcd, companion, companion_hcd);
89         }
90 }
91
92 /*
93  * We're about to add an EHCI controller, which will unceremoniously grab
94  * all the port connections away from its companions.  To prevent annoying
95  * error messages, lock the companion's root hub and gracefully unconfigure
96  * it beforehand.  Leave it locked until the EHCI controller is all set.
97  */
98 static void ehci_pre_add(struct pci_dev *pdev, struct usb_hcd *hcd,
99                 struct pci_dev *companion, struct usb_hcd *companion_hcd)
100 {
101         struct usb_device *udev;
102
103         if (is_ohci_or_uhci(companion)) {
104                 udev = companion_hcd->self.root_hub;
105                 usb_lock_device(udev);
106                 usb_set_configuration(udev, 0);
107         }
108 }
109
110 /*
111  * Adding the EHCI controller has either succeeded or failed.  Set the
112  * companion pointer accordingly, and in either case, reconfigure and
113  * unlock the root hub.
114  */
115 static void ehci_post_add(struct pci_dev *pdev, struct usb_hcd *hcd,
116                 struct pci_dev *companion, struct usb_hcd *companion_hcd)
117 {
118         struct usb_device *udev;
119
120         if (is_ohci_or_uhci(companion)) {
121                 if (dev_get_drvdata(&pdev->dev)) {      /* Succeeded */
122                         dev_dbg(&pdev->dev, "HS companion for %s\n",
123                                         dev_name(&companion->dev));
124                         companion_hcd->self.hs_companion = &hcd->self;
125                 }
126                 udev = companion_hcd->self.root_hub;
127                 usb_set_configuration(udev, 1);
128                 usb_unlock_device(udev);
129         }
130 }
131
132 /*
133  * We just added a non-EHCI controller.  Find the EHCI controller to
134  * which it is a companion, and store a pointer to the bus structure.
135  */
136 static void non_ehci_add(struct pci_dev *pdev, struct usb_hcd *hcd,
137                 struct pci_dev *companion, struct usb_hcd *companion_hcd)
138 {
139         if (is_ohci_or_uhci(pdev) && companion->class == CL_EHCI) {
140                 dev_dbg(&pdev->dev, "FS/LS companion for %s\n",
141                                 dev_name(&companion->dev));
142                 hcd->self.hs_companion = &companion_hcd->self;
143         }
144 }
145
146 /* We are removing an EHCI controller.  Clear the companions' pointers. */
147 static void ehci_remove(struct pci_dev *pdev, struct usb_hcd *hcd,
148                 struct pci_dev *companion, struct usb_hcd *companion_hcd)
149 {
150         if (is_ohci_or_uhci(companion))
151                 companion_hcd->self.hs_companion = NULL;
152 }
153
154 #ifdef  CONFIG_PM
155
156 /* An EHCI controller must wait for its companions before resuming. */
157 static void ehci_wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd,
158                 struct pci_dev *companion, struct usb_hcd *companion_hcd)
159 {
160         if (is_ohci_or_uhci(companion))
161                 device_pm_wait_for_dev(&pdev->dev, &companion->dev);
162 }
163
164 #endif  /* CONFIG_PM */
165
166 /*-------------------------------------------------------------------------*/
167
168 /* configure so an HC device and id are always provided */
169 /* always called with process context; sleeping is OK */
170
171 /**
172  * usb_hcd_pci_probe - initialize PCI-based HCDs
173  * @dev: USB Host Controller being probed
174  * @id: pci hotplug id connecting controller to HCD framework
175  * Context: !in_interrupt()
176  *
177  * Allocates basic PCI resources for this USB host controller, and
178  * then invokes the start() method for the HCD associated with it
179  * through the hotplug entry's driver_data.
180  *
181  * Store this function in the HCD's struct pci_driver as probe().
182  *
183  * Return: 0 if successful.
184  */
185 int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
186 {
187         struct hc_driver        *driver;
188         struct usb_hcd          *hcd;
189         int                     retval;
190         int                     hcd_irq = 0;
191
192         if (usb_disabled())
193                 return -ENODEV;
194
195         if (!id)
196                 return -EINVAL;
197         driver = (struct hc_driver *)id->driver_data;
198         if (!driver)
199                 return -EINVAL;
200
201         if (pci_enable_device(dev) < 0)
202                 return -ENODEV;
203
204         /*
205          * The xHCI driver has its own irq management
206          * make sure irq setup is not touched for xhci in generic hcd code
207          */
208         if ((driver->flags & HCD_MASK) < HCD_USB3) {
209                 if (!dev->irq) {
210                         dev_err(&dev->dev,
211                         "Found HC with no IRQ. Check BIOS/PCI %s setup!\n",
212                                 pci_name(dev));
213                         retval = -ENODEV;
214                         goto disable_pci;
215                 }
216                 hcd_irq = dev->irq;
217         }
218
219         hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev));
220         if (!hcd) {
221                 retval = -ENOMEM;
222                 goto disable_pci;
223         }
224
225         hcd->amd_resume_bug = (usb_hcd_amd_remote_wakeup_quirk(dev) &&
226                         driver->flags & (HCD_USB11 | HCD_USB3)) ? 1 : 0;
227
228         if (driver->flags & HCD_MEMORY) {
229                 /* EHCI, OHCI */
230                 hcd->rsrc_start = pci_resource_start(dev, 0);
231                 hcd->rsrc_len = pci_resource_len(dev, 0);
232                 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
233                                 driver->description)) {
234                         dev_dbg(&dev->dev, "controller already in use\n");
235                         retval = -EBUSY;
236                         goto put_hcd;
237                 }
238                 hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len);
239                 if (hcd->regs == NULL) {
240                         dev_dbg(&dev->dev, "error mapping memory\n");
241                         retval = -EFAULT;
242                         goto release_mem_region;
243                 }
244
245         } else {
246                 /* UHCI */
247                 int     region;
248
249                 for (region = 0; region < PCI_ROM_RESOURCE; region++) {
250                         if (!(pci_resource_flags(dev, region) &
251                                         IORESOURCE_IO))
252                                 continue;
253
254                         hcd->rsrc_start = pci_resource_start(dev, region);
255                         hcd->rsrc_len = pci_resource_len(dev, region);
256                         if (request_region(hcd->rsrc_start, hcd->rsrc_len,
257                                         driver->description))
258                                 break;
259                 }
260                 if (region == PCI_ROM_RESOURCE) {
261                         dev_dbg(&dev->dev, "no i/o regions available\n");
262                         retval = -EBUSY;
263                         goto put_hcd;
264                 }
265         }
266
267         pci_set_master(dev);
268
269         /* Note: dev_set_drvdata must be called while holding the rwsem */
270         if (dev->class == CL_EHCI) {
271                 down_write(&companions_rwsem);
272                 dev_set_drvdata(&dev->dev, hcd);
273                 for_each_companion(dev, hcd, ehci_pre_add);
274                 retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED);
275                 if (retval != 0)
276                         dev_set_drvdata(&dev->dev, NULL);
277                 for_each_companion(dev, hcd, ehci_post_add);
278                 up_write(&companions_rwsem);
279         } else {
280                 down_read(&companions_rwsem);
281                 dev_set_drvdata(&dev->dev, hcd);
282                 retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED);
283                 if (retval != 0)
284                         dev_set_drvdata(&dev->dev, NULL);
285                 else
286                         for_each_companion(dev, hcd, non_ehci_add);
287                 up_read(&companions_rwsem);
288         }
289
290         if (retval != 0)
291                 goto unmap_registers;
292         device_wakeup_enable(hcd->self.controller);
293
294         if (pci_dev_run_wake(dev))
295                 pm_runtime_put_noidle(&dev->dev);
296         return retval;
297
298 unmap_registers:
299         if (driver->flags & HCD_MEMORY) {
300                 iounmap(hcd->regs);
301 release_mem_region:
302                 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
303         } else
304                 release_region(hcd->rsrc_start, hcd->rsrc_len);
305 put_hcd:
306         usb_put_hcd(hcd);
307 disable_pci:
308         pci_disable_device(dev);
309         dev_err(&dev->dev, "init %s fail, %d\n", pci_name(dev), retval);
310         return retval;
311 }
312 EXPORT_SYMBOL_GPL(usb_hcd_pci_probe);
313
314
315 /* may be called without controller electrically present */
316 /* may be called with controller, bus, and devices active */
317
318 /**
319  * usb_hcd_pci_remove - shutdown processing for PCI-based HCDs
320  * @dev: USB Host Controller being removed
321  * Context: !in_interrupt()
322  *
323  * Reverses the effect of usb_hcd_pci_probe(), first invoking
324  * the HCD's stop() method.  It is always called from a thread
325  * context, normally "rmmod", "apmd", or something similar.
326  *
327  * Store this function in the HCD's struct pci_driver as remove().
328  */
329 void usb_hcd_pci_remove(struct pci_dev *dev)
330 {
331         struct usb_hcd          *hcd;
332
333         hcd = pci_get_drvdata(dev);
334         if (!hcd)
335                 return;
336
337         if (pci_dev_run_wake(dev))
338                 pm_runtime_get_noresume(&dev->dev);
339
340         /* Fake an interrupt request in order to give the driver a chance
341          * to test whether the controller hardware has been removed (e.g.,
342          * cardbus physical eject).
343          */
344         local_irq_disable();
345         usb_hcd_irq(0, hcd);
346         local_irq_enable();
347
348         /* Note: dev_set_drvdata must be called while holding the rwsem */
349         if (dev->class == CL_EHCI) {
350                 down_write(&companions_rwsem);
351                 for_each_companion(dev, hcd, ehci_remove);
352                 usb_remove_hcd(hcd);
353                 dev_set_drvdata(&dev->dev, NULL);
354                 up_write(&companions_rwsem);
355         } else {
356                 /* Not EHCI; just clear the companion pointer */
357                 down_read(&companions_rwsem);
358                 hcd->self.hs_companion = NULL;
359                 usb_remove_hcd(hcd);
360                 dev_set_drvdata(&dev->dev, NULL);
361                 up_read(&companions_rwsem);
362         }
363
364         if (hcd->driver->flags & HCD_MEMORY) {
365                 iounmap(hcd->regs);
366                 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
367         } else {
368                 release_region(hcd->rsrc_start, hcd->rsrc_len);
369         }
370
371         usb_put_hcd(hcd);
372         pci_disable_device(dev);
373 }
374 EXPORT_SYMBOL_GPL(usb_hcd_pci_remove);
375
376 /**
377  * usb_hcd_pci_shutdown - shutdown host controller
378  * @dev: USB Host Controller being shutdown
379  */
380 void usb_hcd_pci_shutdown(struct pci_dev *dev)
381 {
382         struct usb_hcd          *hcd;
383
384         hcd = pci_get_drvdata(dev);
385         if (!hcd)
386                 return;
387
388         if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) &&
389                         hcd->driver->shutdown) {
390                 hcd->driver->shutdown(hcd);
391                 if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)
392                         free_irq(hcd->irq, hcd);
393                 pci_disable_device(dev);
394         }
395 }
396 EXPORT_SYMBOL_GPL(usb_hcd_pci_shutdown);
397
398 #ifdef  CONFIG_PM
399
400 #ifdef  CONFIG_PPC_PMAC
401 static void powermac_set_asic(struct pci_dev *pci_dev, int enable)
402 {
403         /* Enanble or disable ASIC clocks for USB */
404         if (machine_is(powermac)) {
405                 struct device_node      *of_node;
406
407                 of_node = pci_device_to_OF_node(pci_dev);
408                 if (of_node)
409                         pmac_call_feature(PMAC_FTR_USB_ENABLE,
410                                         of_node, 0, enable);
411         }
412 }
413
414 #else
415
416 static inline void powermac_set_asic(struct pci_dev *pci_dev, int enable)
417 {}
418
419 #endif  /* CONFIG_PPC_PMAC */
420
421 static int check_root_hub_suspended(struct device *dev)
422 {
423         struct pci_dev          *pci_dev = to_pci_dev(dev);
424         struct usb_hcd          *hcd = pci_get_drvdata(pci_dev);
425
426         if (HCD_RH_RUNNING(hcd)) {
427                 dev_warn(dev, "Root hub is not suspended\n");
428                 return -EBUSY;
429         }
430         if (hcd->shared_hcd) {
431                 hcd = hcd->shared_hcd;
432                 if (HCD_RH_RUNNING(hcd)) {
433                         dev_warn(dev, "Secondary root hub is not suspended\n");
434                         return -EBUSY;
435                 }
436         }
437         return 0;
438 }
439
440 static int suspend_common(struct device *dev, bool do_wakeup)
441 {
442         struct pci_dev          *pci_dev = to_pci_dev(dev);
443         struct usb_hcd          *hcd = pci_get_drvdata(pci_dev);
444         int                     retval;
445
446         /* Root hub suspend should have stopped all downstream traffic,
447          * and all bus master traffic.  And done so for both the interface
448          * and the stub usb_device (which we check here).  But maybe it
449          * didn't; writing sysfs power/state files ignores such rules...
450          */
451         retval = check_root_hub_suspended(dev);
452         if (retval)
453                 return retval;
454
455         if (hcd->driver->pci_suspend && !HCD_DEAD(hcd)) {
456                 /* Optimization: Don't suspend if a root-hub wakeup is
457                  * pending and it would cause the HCD to wake up anyway.
458                  */
459                 if (do_wakeup && HCD_WAKEUP_PENDING(hcd))
460                         return -EBUSY;
461                 if (do_wakeup && hcd->shared_hcd &&
462                                 HCD_WAKEUP_PENDING(hcd->shared_hcd))
463                         return -EBUSY;
464                 retval = hcd->driver->pci_suspend(hcd, do_wakeup);
465                 suspend_report_result(hcd->driver->pci_suspend, retval);
466
467                 /* Check again in case wakeup raced with pci_suspend */
468                 if ((retval == 0 && do_wakeup && HCD_WAKEUP_PENDING(hcd)) ||
469                                 (retval == 0 && do_wakeup && hcd->shared_hcd &&
470                                  HCD_WAKEUP_PENDING(hcd->shared_hcd))) {
471                         if (hcd->driver->pci_resume)
472                                 hcd->driver->pci_resume(hcd, false);
473                         retval = -EBUSY;
474                 }
475                 if (retval)
476                         return retval;
477         }
478
479         /* If MSI-X is enabled, the driver will have synchronized all vectors
480          * in pci_suspend(). If MSI or legacy PCI is enabled, that will be
481          * synchronized here.
482          */
483         if (!hcd->msix_enabled)
484                 synchronize_irq(pci_dev->irq);
485
486         /* Downstream ports from this root hub should already be quiesced, so
487          * there will be no DMA activity.  Now we can shut down the upstream
488          * link (except maybe for PME# resume signaling).  We'll enter a
489          * low power state during suspend_noirq, if the hardware allows.
490          */
491         pci_disable_device(pci_dev);
492         return retval;
493 }
494
495 static int resume_common(struct device *dev, int event)
496 {
497         struct pci_dev          *pci_dev = to_pci_dev(dev);
498         struct usb_hcd          *hcd = pci_get_drvdata(pci_dev);
499         int                     retval;
500
501         if (HCD_RH_RUNNING(hcd) ||
502                         (hcd->shared_hcd &&
503                          HCD_RH_RUNNING(hcd->shared_hcd))) {
504                 dev_dbg(dev, "can't resume, not suspended!\n");
505                 return 0;
506         }
507
508         retval = pci_enable_device(pci_dev);
509         if (retval < 0) {
510                 dev_err(dev, "can't re-enable after resume, %d!\n", retval);
511                 return retval;
512         }
513
514         pci_set_master(pci_dev);
515
516         if (hcd->driver->pci_resume && !HCD_DEAD(hcd)) {
517
518                 /*
519                  * Only EHCI controllers have to wait for their companions.
520                  * No locking is needed because PCI controller drivers do not
521                  * get unbound during system resume.
522                  */
523                 if (pci_dev->class == CL_EHCI && event != PM_EVENT_AUTO_RESUME)
524                         for_each_companion(pci_dev, hcd,
525                                         ehci_wait_for_companions);
526
527                 retval = hcd->driver->pci_resume(hcd,
528                                 event == PM_EVENT_RESTORE);
529                 if (retval) {
530                         dev_err(dev, "PCI post-resume error %d!\n", retval);
531                         if (hcd->shared_hcd)
532                                 usb_hc_died(hcd->shared_hcd);
533                         usb_hc_died(hcd);
534                 }
535         }
536         return retval;
537 }
538
539 #ifdef  CONFIG_PM_SLEEP
540
541 static int hcd_pci_suspend(struct device *dev)
542 {
543         return suspend_common(dev, device_may_wakeup(dev));
544 }
545
546 static int hcd_pci_suspend_noirq(struct device *dev)
547 {
548         struct pci_dev          *pci_dev = to_pci_dev(dev);
549         struct usb_hcd          *hcd = pci_get_drvdata(pci_dev);
550         int                     retval;
551
552         retval = check_root_hub_suspended(dev);
553         if (retval)
554                 return retval;
555
556         pci_save_state(pci_dev);
557
558         /* If the root hub is dead rather than suspended, disallow remote
559          * wakeup.  usb_hc_died() should ensure that both hosts are marked as
560          * dying, so we only need to check the primary roothub.
561          */
562         if (HCD_DEAD(hcd))
563                 device_set_wakeup_enable(dev, 0);
564         dev_dbg(dev, "wakeup: %d\n", device_may_wakeup(dev));
565
566         /* Possibly enable remote wakeup,
567          * choose the appropriate low-power state, and go to that state.
568          */
569         retval = pci_prepare_to_sleep(pci_dev);
570         if (retval == -EIO) {           /* Low-power not supported */
571                 dev_dbg(dev, "--> PCI D0 legacy\n");
572                 retval = 0;
573         } else if (retval == 0) {
574                 dev_dbg(dev, "--> PCI %s\n",
575                                 pci_power_name(pci_dev->current_state));
576         } else {
577                 suspend_report_result(pci_prepare_to_sleep, retval);
578                 return retval;
579         }
580
581         powermac_set_asic(pci_dev, 0);
582         return retval;
583 }
584
585 static int hcd_pci_resume_noirq(struct device *dev)
586 {
587         struct pci_dev          *pci_dev = to_pci_dev(dev);
588
589         powermac_set_asic(pci_dev, 1);
590
591         /* Go back to D0 and disable remote wakeup */
592         pci_back_from_sleep(pci_dev);
593         return 0;
594 }
595
596 static int hcd_pci_resume(struct device *dev)
597 {
598         return resume_common(dev, PM_EVENT_RESUME);
599 }
600
601 static int hcd_pci_restore(struct device *dev)
602 {
603         return resume_common(dev, PM_EVENT_RESTORE);
604 }
605
606 #else
607
608 #define hcd_pci_suspend         NULL
609 #define hcd_pci_suspend_noirq   NULL
610 #define hcd_pci_resume_noirq    NULL
611 #define hcd_pci_resume          NULL
612 #define hcd_pci_restore         NULL
613
614 #endif  /* CONFIG_PM_SLEEP */
615
616 static int hcd_pci_runtime_suspend(struct device *dev)
617 {
618         int     retval;
619
620         retval = suspend_common(dev, true);
621         if (retval == 0)
622                 powermac_set_asic(to_pci_dev(dev), 0);
623         dev_dbg(dev, "hcd_pci_runtime_suspend: %d\n", retval);
624         return retval;
625 }
626
627 static int hcd_pci_runtime_resume(struct device *dev)
628 {
629         int     retval;
630
631         powermac_set_asic(to_pci_dev(dev), 1);
632         retval = resume_common(dev, PM_EVENT_AUTO_RESUME);
633         dev_dbg(dev, "hcd_pci_runtime_resume: %d\n", retval);
634         return retval;
635 }
636
637 const struct dev_pm_ops usb_hcd_pci_pm_ops = {
638         .suspend        = hcd_pci_suspend,
639         .suspend_noirq  = hcd_pci_suspend_noirq,
640         .resume_noirq   = hcd_pci_resume_noirq,
641         .resume         = hcd_pci_resume,
642         .freeze         = check_root_hub_suspended,
643         .freeze_noirq   = check_root_hub_suspended,
644         .thaw_noirq     = NULL,
645         .thaw           = NULL,
646         .poweroff       = hcd_pci_suspend,
647         .poweroff_noirq = hcd_pci_suspend_noirq,
648         .restore_noirq  = hcd_pci_resume_noirq,
649         .restore        = hcd_pci_restore,
650         .runtime_suspend = hcd_pci_runtime_suspend,
651         .runtime_resume = hcd_pci_runtime_resume,
652 };
653 EXPORT_SYMBOL_GPL(usb_hcd_pci_pm_ops);
654
655 #endif  /* CONFIG_PM */