diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2012-06-23 13:59:43 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2012-06-23 13:59:43 -0400 |
commit | 35e7f73c32ad44a931d918d04e317a7fb0c63e6e (patch) | |
tree | e3cb8c89c8230aaa45a0f1b101decdc3b9831938 /drivers/pci/pci-sysfs.c | |
parent | e5028b52e46eb1379d78d136bd0890705f331183 (diff) | |
parent | 448bd857d48e69b33ef323739dc6d8ca20d4cda7 (diff) |
Merge branch 'topic/huang-d3cold-v7' into next
* topic/huang-d3cold-v7:
PCI/PM: add PCIe runtime D3cold support
PCI: do not call pci_set_power_state with PCI_D3cold
PCI/PM: add runtime PM support to PCIe port
ACPI/PM: specify lowest allowed state for device sleep state
Diffstat (limited to 'drivers/pci/pci-sysfs.c')
-rw-r--r-- | drivers/pci/pci-sysfs.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index a0b435f20bd6..6869009c7393 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/pci-aspm.h> | 28 | #include <linux/pci-aspm.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/vgaarb.h> | 30 | #include <linux/vgaarb.h> |
31 | #include <linux/pm_runtime.h> | ||
31 | #include "pci.h" | 32 | #include "pci.h" |
32 | 33 | ||
33 | static int sysfs_initialized; /* = 0 */ | 34 | static int sysfs_initialized; /* = 0 */ |
@@ -378,6 +379,31 @@ dev_bus_rescan_store(struct device *dev, struct device_attribute *attr, | |||
378 | 379 | ||
379 | #endif | 380 | #endif |
380 | 381 | ||
382 | #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) | ||
383 | static ssize_t d3cold_allowed_store(struct device *dev, | ||
384 | struct device_attribute *attr, | ||
385 | const char *buf, size_t count) | ||
386 | { | ||
387 | struct pci_dev *pdev = to_pci_dev(dev); | ||
388 | unsigned long val; | ||
389 | |||
390 | if (strict_strtoul(buf, 0, &val) < 0) | ||
391 | return -EINVAL; | ||
392 | |||
393 | pdev->d3cold_allowed = !!val; | ||
394 | pm_runtime_resume(dev); | ||
395 | |||
396 | return count; | ||
397 | } | ||
398 | |||
399 | static ssize_t d3cold_allowed_show(struct device *dev, | ||
400 | struct device_attribute *attr, char *buf) | ||
401 | { | ||
402 | struct pci_dev *pdev = to_pci_dev(dev); | ||
403 | return sprintf (buf, "%u\n", pdev->d3cold_allowed); | ||
404 | } | ||
405 | #endif | ||
406 | |||
381 | struct device_attribute pci_dev_attrs[] = { | 407 | struct device_attribute pci_dev_attrs[] = { |
382 | __ATTR_RO(resource), | 408 | __ATTR_RO(resource), |
383 | __ATTR_RO(vendor), | 409 | __ATTR_RO(vendor), |
@@ -402,6 +428,9 @@ struct device_attribute pci_dev_attrs[] = { | |||
402 | __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store), | 428 | __ATTR(remove, (S_IWUSR|S_IWGRP), NULL, remove_store), |
403 | __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_rescan_store), | 429 | __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_rescan_store), |
404 | #endif | 430 | #endif |
431 | #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) | ||
432 | __ATTR(d3cold_allowed, 0644, d3cold_allowed_show, d3cold_allowed_store), | ||
433 | #endif | ||
405 | __ATTR_NULL, | 434 | __ATTR_NULL, |
406 | }; | 435 | }; |
407 | 436 | ||