Lines Matching +full:pm +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2003-2022, Intel Corporation. All rights reserved.
13 #include <linux/dma-mapping.h>
24 #include "hw-me-regs.h"
25 #include "hw-me.h"
27 /* mei_pci_tbl - PCI Device ID Table */
148 struct pci_dev *pdev = to_pci_dev(dev->parent); in mei_me_read_fws()
154 * mei_me_quirk_probe - probe for devices that doesn't valid ME interface
164 if (cfg->quirk_probe && cfg->quirk_probe(pdev)) { in mei_me_quirk_probe()
165 dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n"); in mei_me_quirk_probe()
173 * mei_me_probe - Device Initialization Routine
188 cfg = mei_me_get_cfg(ent->driver_data); in mei_me_probe()
190 return -ENODEV; in mei_me_probe()
193 return -ENODEV; in mei_me_probe()
198 dev_err(&pdev->dev, "failed to enable pci device.\n"); in mei_me_probe()
206 dev_err(&pdev->dev, "failed to get pci regions.\n"); in mei_me_probe()
210 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in mei_me_probe()
212 dev_err(&pdev->dev, "No usable DMA configuration, aborting\n"); in mei_me_probe()
217 dev = mei_me_dev_init(&pdev->dev, cfg, false); in mei_me_probe()
219 err = -ENOMEM; in mei_me_probe()
223 hw->mem_addr = pcim_iomap_table(pdev)[0]; in mei_me_probe()
224 hw->read_fws = mei_me_read_fws; in mei_me_probe()
226 err = mei_register(dev, &pdev->dev); in mei_me_probe()
232 hw->irq = pdev->irq; in mei_me_probe()
237 err = request_threaded_irq(pdev->irq, in mei_me_probe()
242 dev_err(&pdev->dev, "request_threaded_irq failure. irq = %d\n", in mei_me_probe()
243 pdev->irq); in mei_me_probe()
248 dev_err(&pdev->dev, "init hw failure.\n"); in mei_me_probe()
249 err = -ENODEV; in mei_me_probe()
253 pm_runtime_set_autosuspend_delay(&pdev->dev, MEI_ME_RPM_TIMEOUT); in mei_me_probe()
254 pm_runtime_use_autosuspend(&pdev->dev); in mei_me_probe()
262 dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); in mei_me_probe()
269 * To get around the PCI device native runtime pm, in mei_me_probe()
270 * ME uses runtime pm domain handlers which take precedence in mei_me_probe()
271 * over the driver's pm handlers. in mei_me_probe()
276 pm_runtime_put_noidle(&pdev->dev); in mei_me_probe()
277 if (hw->d0i3_supported) in mei_me_probe()
278 pm_runtime_allow(&pdev->dev); in mei_me_probe()
281 dev_dbg(&pdev->dev, "initialization successful.\n"); in mei_me_probe()
288 free_irq(pdev->irq, dev); in mei_me_probe()
291 dev_err(&pdev->dev, "initialization failed.\n"); in mei_me_probe()
296 * mei_me_shutdown - Device Removal Routine
308 dev_dbg(&pdev->dev, "shutdown\n"); in mei_me_shutdown()
314 free_irq(pdev->irq, dev); in mei_me_shutdown()
318 * mei_me_remove - Device Removal Routine
330 pm_runtime_get_noresume(&pdev->dev); in mei_me_remove()
332 dev_dbg(&pdev->dev, "stop\n"); in mei_me_remove()
339 free_irq(pdev->irq, dev); in mei_me_remove()
356 dev_dbg(&pdev->dev, "suspend\n"); in mei_me_pci_suspend()
362 free_irq(pdev->irq, dev); in mei_me_pci_suspend()
380 err = request_threaded_irq(pdev->irq, in mei_me_pci_resume()
386 dev_err(&pdev->dev, "request_threaded_irq failed: irq = %d.\n", in mei_me_pci_resume()
387 pdev->irq); in mei_me_pci_resume()
393 free_irq(pdev->irq, dev); in mei_me_pci_resume()
398 schedule_delayed_work(&dev->timer_work, HZ); in mei_me_pci_resume()
424 return -EBUSY; in mei_me_pm_runtime_idle()
434 mutex_lock(&dev->device_lock); in mei_me_pm_runtime_suspend()
439 ret = -EAGAIN; in mei_me_pm_runtime_suspend()
441 mutex_unlock(&dev->device_lock); in mei_me_pm_runtime_suspend()
445 if (ret && ret != -EAGAIN) in mei_me_pm_runtime_suspend()
446 schedule_work(&dev->reset_work); in mei_me_pm_runtime_suspend()
458 mutex_lock(&dev->device_lock); in mei_me_pm_runtime_resume()
462 mutex_unlock(&dev->device_lock); in mei_me_pm_runtime_resume()
467 schedule_work(&dev->reset_work); in mei_me_pm_runtime_resume()
473 * mei_me_set_pm_domain - fill and set pm domain structure for device
479 struct pci_dev *pdev = to_pci_dev(dev->parent); in mei_me_set_pm_domain()
481 if (pdev->dev.bus && pdev->dev.bus->pm) { in mei_me_set_pm_domain()
482 dev->pg_domain.ops = *pdev->dev.bus->pm; in mei_me_set_pm_domain()
484 dev->pg_domain.ops.runtime_suspend = mei_me_pm_runtime_suspend; in mei_me_set_pm_domain()
485 dev->pg_domain.ops.runtime_resume = mei_me_pm_runtime_resume; in mei_me_set_pm_domain()
486 dev->pg_domain.ops.runtime_idle = mei_me_pm_runtime_idle; in mei_me_set_pm_domain()
488 dev_pm_domain_set(&pdev->dev, &dev->pg_domain); in mei_me_set_pm_domain()
493 * mei_me_unset_pm_domain - clean pm domain structure for device
499 /* stop using pm callbacks if any */ in mei_me_unset_pm_domain()
500 dev_pm_domain_set(dev->parent, NULL); in mei_me_unset_pm_domain()
527 .driver.pm = MEI_ME_PM_OPS,