summaryrefslogtreecommitdiffstats
path: root/drivers/pci/pcie/aspm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pcie/aspm.c')
-rw-r--r--drivers/pci/pcie/aspm.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index 694ba5657758..0d0d3e630925 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -105,7 +105,7 @@ static int policy_to_clkpm_state(struct pcie_link_state *link)
return 0;
}
-static void pcie_set_clock_pm(struct pcie_link_state *link, int enable)
+static void pcie_set_clkpm_nocheck(struct pcie_link_state *link, int enable)
{
int pos;
u16 reg16;
@@ -126,6 +126,17 @@ static void pcie_set_clock_pm(struct pcie_link_state *link, int enable)
link->clkpm_enabled = !!enable;
}
+static void pcie_set_clkpm(struct pcie_link_state *link, int enable)
+{
+ /* Don't enable Clock PM if the link is not Clock PM capable */
+ if (!link->clkpm_capable && enable)
+ return;
+ /* Need nothing if the specified equals to current state */
+ if (link->clkpm_enabled == enable)
+ return;
+ pcie_set_clkpm_nocheck(link, enable);
+}
+
static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist)
{
int pos, capable = 1, enabled = 1;
@@ -660,7 +671,7 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
/* Setup initial Clock PM state */
state = (link->clkpm_capable) ? policy_to_clkpm_state(link) : 0;
- pcie_set_clock_pm(link, state);
+ pcie_set_clkpm(link, state);
unlock:
mutex_unlock(&aspm_lock);
out:
@@ -738,12 +749,11 @@ void pci_disable_link_state(struct pci_dev *pdev, int state)
mutex_lock(&aspm_lock);
link_state = parent->link_state;
link_state->aspm_support &= ~state;
- if (state & PCIE_LINK_STATE_CLKPM)
- link_state->clkpm_capable = 0;
-
__pcie_aspm_configure_link_state(link_state, link_state->aspm_enabled);
- if (!link_state->clkpm_capable && link_state->clkpm_enabled)
- pcie_set_clock_pm(link_state, 0);
+ if (state & PCIE_LINK_STATE_CLKPM) {
+ link_state->clkpm_capable = 0;
+ pcie_set_clkpm(link_state, 0);
+ }
mutex_unlock(&aspm_lock);
up_read(&pci_bus_sem);
}
@@ -768,11 +778,7 @@ static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp)
list_for_each_entry(link_state, &link_list, sibling) {
__pcie_aspm_configure_link_state(link_state,
policy_to_aspm_state(link_state));
- if (link_state->clkpm_capable &&
- link_state->clkpm_enabled != policy_to_clkpm_state(link_state))
- pcie_set_clock_pm(link_state,
- policy_to_clkpm_state(link_state));
-
+ pcie_set_clkpm(link_state, policy_to_clkpm_state(link_state));
}
mutex_unlock(&aspm_lock);
up_read(&pci_bus_sem);
@@ -839,7 +845,7 @@ static ssize_t clk_ctl_store(struct device *dev,
const char *buf,
size_t n)
{
- struct pci_dev *pci_device = to_pci_dev(dev);
+ struct pci_dev *pdev = to_pci_dev(dev);
int state;
if (n < 1)
@@ -848,7 +854,7 @@ static ssize_t clk_ctl_store(struct device *dev,
down_read(&pci_bus_sem);
mutex_lock(&aspm_lock);
- pcie_set_clock_pm(pci_device->link_state, !!state);
+ pcie_set_clkpm_nocheck(pdev->link_state, !!state);
mutex_unlock(&aspm_lock);
up_read(&pci_bus_sem);
OpenPOWER on IntegriCloud