Skip to content

Commit 1fec161

Browse files
committed
Merge branch 'pm-pci'
Merge PCI device power management updates for 5.16-rc1: - Make the association of ACPI device objects with PCI devices more straightforward and simplify the code doing that for all devices in general (Rafael Wysocki). - Eliminate struct pci_platform_pm_ops and handle the both of its users (PCI and Intel MID) directly in the PCI bus code (Rafael Wysocki). - Simplify and clarify ACPI PCI device PM helpers (Rafael Wysocki). - Fix ordering of operations in pci_back_from_sleep() (Rafael Wysocki). * pm-pci: PCI: PM: Fix ordering of operations in pci_back_from_sleep() PCI: PM: Do not call platform_pci_power_manageable() unnecessarily PCI: PM: Make pci_choose_state() call pci_target_state() PCI: PM: Rearrange pci_target_state() PCI: PM: Simplify acpi_pci_power_manageable() PCI: PM: Drop struct pci_platform_pm_ops PCI: ACPI: PM: Do not use pci_platform_pm_ops for ACPI PCI: PM: Do not use pci_platform_pm_ops for Intel MID PM ACPI: glue: Look for ACPI bus type only if ACPI companion is not known ACPI: glue: Drop cleanup callback from struct acpi_bus_type PCI: ACPI: Drop acpi_pci_bus
2 parents 031eda1 + 6f9f0ee commit 1fec161

File tree

7 files changed

+181
-223
lines changed

7 files changed

+181
-223
lines changed

drivers/acpi/glue.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <linux/rwsem.h>
1818
#include <linux/acpi.h>
1919
#include <linux/dma-mapping.h>
20+
#include <linux/pci.h>
21+
#include <linux/pci-acpi.h>
2022
#include <linux/platform_device.h>
2123

2224
#include "internal.h"
@@ -287,12 +289,13 @@ EXPORT_SYMBOL_GPL(acpi_unbind_one);
287289

288290
void acpi_device_notify(struct device *dev)
289291
{
290-
struct acpi_bus_type *type = acpi_get_bus_type(dev);
291292
struct acpi_device *adev;
292293
int ret;
293294

294295
ret = acpi_bind_one(dev, NULL);
295296
if (ret) {
297+
struct acpi_bus_type *type = acpi_get_bus_type(dev);
298+
296299
if (!type)
297300
goto err;
298301

@@ -304,17 +307,26 @@ void acpi_device_notify(struct device *dev)
304307
ret = acpi_bind_one(dev, adev);
305308
if (ret)
306309
goto err;
307-
}
308-
adev = ACPI_COMPANION(dev);
309310

310-
if (dev_is_platform(dev))
311-
acpi_configure_pmsi_domain(dev);
311+
if (type->setup) {
312+
type->setup(dev);
313+
goto done;
314+
}
315+
} else {
316+
adev = ACPI_COMPANION(dev);
317+
318+
if (dev_is_pci(dev)) {
319+
pci_acpi_setup(dev, adev);
320+
goto done;
321+
} else if (dev_is_platform(dev)) {
322+
acpi_configure_pmsi_domain(dev);
323+
}
324+
}
312325

313-
if (type && type->setup)
314-
type->setup(dev);
315-
else if (adev->handler && adev->handler->bind)
326+
if (adev->handler && adev->handler->bind)
316327
adev->handler->bind(dev);
317328

329+
done:
318330
acpi_handle_debug(ACPI_HANDLE(dev), "Bound to device %s\n",
319331
dev_name(dev));
320332

@@ -327,14 +339,12 @@ void acpi_device_notify(struct device *dev)
327339
void acpi_device_notify_remove(struct device *dev)
328340
{
329341
struct acpi_device *adev = ACPI_COMPANION(dev);
330-
struct acpi_bus_type *type;
331342

332343
if (!adev)
333344
return;
334345

335-
type = acpi_get_bus_type(dev);
336-
if (type && type->cleanup)
337-
type->cleanup(dev);
346+
if (dev_is_pci(dev))
347+
pci_acpi_cleanup(dev, adev);
338348
else if (adev->handler && adev->handler->unbind)
339349
adev->handler->unbind(dev);
340350

drivers/pci/pci-acpi.c

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@ acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev,
906906
* choose highest power _SxD or any lower power
907907
*/
908908

909-
static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev)
909+
pci_power_t acpi_pci_choose_state(struct pci_dev *pdev)
910910
{
911911
int acpi_state, d_max;
912912

@@ -965,22 +965,20 @@ int pci_dev_acpi_reset(struct pci_dev *dev, bool probe)
965965
return 0;
966966
}
967967

968-
static bool acpi_pci_power_manageable(struct pci_dev *dev)
968+
bool acpi_pci_power_manageable(struct pci_dev *dev)
969969
{
970970
struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
971971

972-
if (!adev)
973-
return false;
974-
return acpi_device_power_manageable(adev);
972+
return adev && acpi_device_power_manageable(adev);
975973
}
976974

977-
static bool acpi_pci_bridge_d3(struct pci_dev *dev)
975+
bool acpi_pci_bridge_d3(struct pci_dev *dev)
978976
{
979977
const union acpi_object *obj;
980978
struct acpi_device *adev;
981979
struct pci_dev *rpdev;
982980

983-
if (!dev->is_hotplug_bridge)
981+
if (acpi_pci_disabled || !dev->is_hotplug_bridge)
984982
return false;
985983

986984
/* Assume D3 support if the bridge is power-manageable by ACPI. */
@@ -1008,7 +1006,7 @@ static bool acpi_pci_bridge_d3(struct pci_dev *dev)
10081006
return obj->integer.value == 1;
10091007
}
10101008

1011-
static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
1009+
int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
10121010
{
10131011
struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
10141012
static const u8 state_conv[] = {
@@ -1046,7 +1044,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
10461044
return error;
10471045
}
10481046

1049-
static pci_power_t acpi_pci_get_power_state(struct pci_dev *dev)
1047+
pci_power_t acpi_pci_get_power_state(struct pci_dev *dev)
10501048
{
10511049
struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
10521050
static const pci_power_t state_conv[] = {
@@ -1068,7 +1066,7 @@ static pci_power_t acpi_pci_get_power_state(struct pci_dev *dev)
10681066
return state_conv[state];
10691067
}
10701068

1071-
static void acpi_pci_refresh_power_state(struct pci_dev *dev)
1069+
void acpi_pci_refresh_power_state(struct pci_dev *dev)
10721070
{
10731071
struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
10741072

@@ -1093,17 +1091,23 @@ static int acpi_pci_propagate_wakeup(struct pci_bus *bus, bool enable)
10931091
return 0;
10941092
}
10951093

1096-
static int acpi_pci_wakeup(struct pci_dev *dev, bool enable)
1094+
int acpi_pci_wakeup(struct pci_dev *dev, bool enable)
10971095
{
1096+
if (acpi_pci_disabled)
1097+
return 0;
1098+
10981099
if (acpi_pm_device_can_wakeup(&dev->dev))
10991100
return acpi_pm_set_device_wakeup(&dev->dev, enable);
11001101

11011102
return acpi_pci_propagate_wakeup(dev->bus, enable);
11021103
}
11031104

1104-
static bool acpi_pci_need_resume(struct pci_dev *dev)
1105+
bool acpi_pci_need_resume(struct pci_dev *dev)
11051106
{
1106-
struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
1107+
struct acpi_device *adev;
1108+
1109+
if (acpi_pci_disabled)
1110+
return false;
11071111

11081112
/*
11091113
* In some cases (eg. Samsung 305V4A) leaving a bridge in suspend over
@@ -1115,6 +1119,7 @@ static bool acpi_pci_need_resume(struct pci_dev *dev)
11151119
if (pci_is_bridge(dev) && acpi_target_system_state() != ACPI_STATE_S0)
11161120
return true;
11171121

1122+
adev = ACPI_COMPANION(&dev->dev);
11181123
if (!adev || !acpi_device_power_manageable(adev))
11191124
return false;
11201125

@@ -1128,17 +1133,6 @@ static bool acpi_pci_need_resume(struct pci_dev *dev)
11281133
return !!adev->power.flags.dsw_present;
11291134
}
11301135

1131-
static const struct pci_platform_pm_ops acpi_pci_platform_pm = {
1132-
.bridge_d3 = acpi_pci_bridge_d3,
1133-
.is_manageable = acpi_pci_power_manageable,
1134-
.set_state = acpi_pci_set_power_state,
1135-
.get_state = acpi_pci_get_power_state,
1136-
.refresh_state = acpi_pci_refresh_power_state,
1137-
.choose_state = acpi_pci_choose_state,
1138-
.set_wakeup = acpi_pci_wakeup,
1139-
.need_resume = acpi_pci_need_resume,
1140-
};
1141-
11421136
void acpi_pci_add_bus(struct pci_bus *bus)
11431137
{
11441138
union acpi_object *obj;
@@ -1356,13 +1350,9 @@ static void pci_acpi_set_external_facing(struct pci_dev *dev)
13561350
dev->external_facing = 1;
13571351
}
13581352

1359-
static void pci_acpi_setup(struct device *dev)
1353+
void pci_acpi_setup(struct device *dev, struct acpi_device *adev)
13601354
{
13611355
struct pci_dev *pci_dev = to_pci_dev(dev);
1362-
struct acpi_device *adev = ACPI_COMPANION(dev);
1363-
1364-
if (!adev)
1365-
return;
13661356

13671357
pci_acpi_optimize_delay(pci_dev, adev->handle);
13681358
pci_acpi_set_external_facing(pci_dev);
@@ -1386,14 +1376,10 @@ static void pci_acpi_setup(struct device *dev)
13861376
acpi_device_power_add_dependent(adev, dev);
13871377
}
13881378

1389-
static void pci_acpi_cleanup(struct device *dev)
1379+
void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev)
13901380
{
1391-
struct acpi_device *adev = ACPI_COMPANION(dev);
13921381
struct pci_dev *pci_dev = to_pci_dev(dev);
13931382

1394-
if (!adev)
1395-
return;
1396-
13971383
pci_acpi_remove_edr_notifier(pci_dev);
13981384
pci_acpi_remove_pm_notifier(adev);
13991385
if (adev->wakeup.flags.valid) {
@@ -1405,20 +1391,6 @@ static void pci_acpi_cleanup(struct device *dev)
14051391
}
14061392
}
14071393

1408-
static bool pci_acpi_bus_match(struct device *dev)
1409-
{
1410-
return dev_is_pci(dev);
1411-
}
1412-
1413-
static struct acpi_bus_type acpi_pci_bus = {
1414-
.name = "PCI",
1415-
.match = pci_acpi_bus_match,
1416-
.find_companion = acpi_pci_find_companion,
1417-
.setup = pci_acpi_setup,
1418-
.cleanup = pci_acpi_cleanup,
1419-
};
1420-
1421-
14221394
static struct fwnode_handle *(*pci_msi_get_fwnode_cb)(struct device *dev);
14231395

14241396
/**
@@ -1460,8 +1432,6 @@ struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus)
14601432

14611433
static int __init acpi_pci_init(void)
14621434
{
1463-
int ret;
1464-
14651435
if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) {
14661436
pr_info("ACPI FADT declares the system doesn't support MSI, so disable it\n");
14671437
pci_no_msi();
@@ -1472,11 +1442,9 @@ static int __init acpi_pci_init(void)
14721442
pcie_no_aspm();
14731443
}
14741444

1475-
ret = register_acpi_bus_type(&acpi_pci_bus);
1476-
if (ret)
1445+
if (acpi_pci_disabled)
14771446
return 0;
14781447

1479-
pci_set_platform_pm(&acpi_pci_platform_pm);
14801448
acpi_pci_slot_init();
14811449
acpiphp_init();
14821450

drivers/pci/pci-mid.c

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,45 +16,23 @@
1616

1717
#include "pci.h"
1818

19-
static bool mid_pci_power_manageable(struct pci_dev *dev)
19+
static bool pci_mid_pm_enabled __read_mostly;
20+
21+
bool pci_use_mid_pm(void)
2022
{
21-
return true;
23+
return pci_mid_pm_enabled;
2224
}
2325

24-
static int mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state)
26+
int mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state)
2527
{
2628
return intel_mid_pci_set_power_state(pdev, state);
2729
}
2830

29-
static pci_power_t mid_pci_get_power_state(struct pci_dev *pdev)
31+
pci_power_t mid_pci_get_power_state(struct pci_dev *pdev)
3032
{
3133
return intel_mid_pci_get_power_state(pdev);
3234
}
3335

34-
static pci_power_t mid_pci_choose_state(struct pci_dev *pdev)
35-
{
36-
return PCI_D3hot;
37-
}
38-
39-
static int mid_pci_wakeup(struct pci_dev *dev, bool enable)
40-
{
41-
return 0;
42-
}
43-
44-
static bool mid_pci_need_resume(struct pci_dev *dev)
45-
{
46-
return false;
47-
}
48-
49-
static const struct pci_platform_pm_ops mid_pci_platform_pm = {
50-
.is_manageable = mid_pci_power_manageable,
51-
.set_state = mid_pci_set_power_state,
52-
.get_state = mid_pci_get_power_state,
53-
.choose_state = mid_pci_choose_state,
54-
.set_wakeup = mid_pci_wakeup,
55-
.need_resume = mid_pci_need_resume,
56-
};
57-
5836
/*
5937
* This table should be in sync with the one in
6038
* arch/x86/platform/intel-mid/pwr.c.
@@ -71,7 +49,8 @@ static int __init mid_pci_init(void)
7149

7250
id = x86_match_cpu(lpss_cpu_ids);
7351
if (id)
74-
pci_set_platform_pm(&mid_pci_platform_pm);
52+
pci_mid_pm_enabled = true;
53+
7554
return 0;
7655
}
7756
arch_initcall(mid_pci_init);

0 commit comments

Comments
 (0)