diff options
author | Lukas Wunner <lukas@wunner.de> | 2018-07-19 18:27:52 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-07-31 12:07:59 -0400 |
commit | 6ccb127ba6dff251b75fa72e8c7777eaf12d9675 (patch) | |
tree | 88fc1e49c13757ac4eab9de15fa34f55e11ea406 | |
parent | 5b3f7b7d062bc839fe0744bdfd0cfd7e8d1c4cd9 (diff) |
PCI: portdrv: Deduplicate PM callback iterator
Replace suspend_iter() and resume_iter() with a single function pm_iter()
to allow addition of port service callbacks for further power management
phases without having to add another iterator each time.
No functional change intended.
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r-- | drivers/pci/pcie/portdrv_core.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index e0261ad4bcdd..13a248575a14 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c | |||
@@ -353,14 +353,19 @@ error_disable: | |||
353 | } | 353 | } |
354 | 354 | ||
355 | #ifdef CONFIG_PM | 355 | #ifdef CONFIG_PM |
356 | static int suspend_iter(struct device *dev, void *data) | 356 | typedef int (*pcie_pm_callback_t)(struct pcie_device *); |
357 | |||
358 | static int pm_iter(struct device *dev, void *data) | ||
357 | { | 359 | { |
358 | struct pcie_port_service_driver *service_driver; | 360 | struct pcie_port_service_driver *service_driver; |
361 | size_t offset = *(size_t *)data; | ||
362 | pcie_pm_callback_t cb; | ||
359 | 363 | ||
360 | if ((dev->bus == &pcie_port_bus_type) && dev->driver) { | 364 | if ((dev->bus == &pcie_port_bus_type) && dev->driver) { |
361 | service_driver = to_service_driver(dev->driver); | 365 | service_driver = to_service_driver(dev->driver); |
362 | if (service_driver->suspend) | 366 | cb = *(pcie_pm_callback_t *)((void *)service_driver + offset); |
363 | service_driver->suspend(to_pcie_device(dev)); | 367 | if (cb) |
368 | return cb(to_pcie_device(dev)); | ||
364 | } | 369 | } |
365 | return 0; | 370 | return 0; |
366 | } | 371 | } |
@@ -371,20 +376,8 @@ static int suspend_iter(struct device *dev, void *data) | |||
371 | */ | 376 | */ |
372 | int pcie_port_device_suspend(struct device *dev) | 377 | int pcie_port_device_suspend(struct device *dev) |
373 | { | 378 | { |
374 | return device_for_each_child(dev, NULL, suspend_iter); | 379 | size_t off = offsetof(struct pcie_port_service_driver, suspend); |
375 | } | 380 | return device_for_each_child(dev, &off, pm_iter); |
376 | |||
377 | static int resume_iter(struct device *dev, void *data) | ||
378 | { | ||
379 | struct pcie_port_service_driver *service_driver; | ||
380 | |||
381 | if ((dev->bus == &pcie_port_bus_type) && | ||
382 | (dev->driver)) { | ||
383 | service_driver = to_service_driver(dev->driver); | ||
384 | if (service_driver->resume) | ||
385 | service_driver->resume(to_pcie_device(dev)); | ||
386 | } | ||
387 | return 0; | ||
388 | } | 381 | } |
389 | 382 | ||
390 | /** | 383 | /** |
@@ -393,7 +386,8 @@ static int resume_iter(struct device *dev, void *data) | |||
393 | */ | 386 | */ |
394 | int pcie_port_device_resume(struct device *dev) | 387 | int pcie_port_device_resume(struct device *dev) |
395 | { | 388 | { |
396 | return device_for_each_child(dev, NULL, resume_iter); | 389 | size_t off = offsetof(struct pcie_port_service_driver, resume); |
390 | return device_for_each_child(dev, &off, pm_iter); | ||
397 | } | 391 | } |
398 | #endif /* PM */ | 392 | #endif /* PM */ |
399 | 393 | ||