Merge commit 'v3.6-rc5' into pci/gavin-window-alignment
* commit 'v3.6-rc5': (1098 commits) Linux 3.6-rc5 HID: tpkbd: work even if the new Lenovo Keyboard driver is not configured Remove user-triggerable BUG from mpol_to_str xen/pciback: Fix proper FLR steps. uml: fix compile error in deliver_alarm() dj: memory scribble in logi_dj Fix order of arguments to compat_put_time[spec|val] xen: Use correct masking in xen_swiotlb_alloc_coherent. xen: fix logical error in tlb flushing xen/p2m: Fix one-off error in checking the P2M tree directory. powerpc: Don't use __put_user() in patch_instruction powerpc: Make sure IPI handlers see data written by IPI senders powerpc: Restore correct DSCR in context switch powerpc: Fix DSCR inheritance in copy_thread() powerpc: Keep thread.dscr and thread.dscr_inherit in sync powerpc: Update DSCR on all CPUs when writing sysfs dscr_default powerpc/powernv: Always go into nap mode when CPU is offline powerpc: Give hypervisor decrementer interrupts their own handler powerpc/vphn: Fix arch_update_cpu_topology() return value ARM: gemini: fix the gemini build ... Conflicts: drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c drivers/rapidio/devices/tsi721.c
This commit is contained in:
@@ -266,8 +266,8 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
}
|
||||
|
||||
if (!error)
|
||||
dev_printk(KERN_INFO, &dev->dev,
|
||||
"power state changed by ACPI to D%d\n", state);
|
||||
dev_info(&dev->dev, "power state changed by ACPI to %s\n",
|
||||
pci_power_name(state));
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@@ -280,8 +280,12 @@ static long local_pci_probe(void *_ddi)
|
||||
{
|
||||
struct drv_dev_and_id *ddi = _ddi;
|
||||
struct device *dev = &ddi->dev->dev;
|
||||
struct device *parent = dev->parent;
|
||||
int rc;
|
||||
|
||||
/* The parent bridge must be in active state when probing */
|
||||
if (parent)
|
||||
pm_runtime_get_sync(parent);
|
||||
/* Unbound PCI devices are always set to disabled and suspended.
|
||||
* During probe, the device is set to enabled and active and the
|
||||
* usage count is incremented. If the driver supports runtime PM,
|
||||
@@ -298,6 +302,8 @@ static long local_pci_probe(void *_ddi)
|
||||
pm_runtime_set_suspended(dev);
|
||||
pm_runtime_put_noidle(dev);
|
||||
}
|
||||
if (parent)
|
||||
pm_runtime_put(parent);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -959,6 +965,13 @@ static int pci_pm_poweroff_noirq(struct device *dev)
|
||||
if (!pci_dev->state_saved && !pci_is_bridge(pci_dev))
|
||||
pci_prepare_to_sleep(pci_dev);
|
||||
|
||||
/*
|
||||
* The reason for doing this here is the same as for the analogous code
|
||||
* in pci_pm_suspend_noirq().
|
||||
*/
|
||||
if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
|
||||
pci_write_config_word(pci_dev, PCI_COMMAND, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -458,6 +458,40 @@ boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
}
|
||||
struct device_attribute vga_attr = __ATTR_RO(boot_vga);
|
||||
|
||||
static void
|
||||
pci_config_pm_runtime_get(struct pci_dev *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device *parent = dev->parent;
|
||||
|
||||
if (parent)
|
||||
pm_runtime_get_sync(parent);
|
||||
pm_runtime_get_noresume(dev);
|
||||
/*
|
||||
* pdev->current_state is set to PCI_D3cold during suspending,
|
||||
* so wait until suspending completes
|
||||
*/
|
||||
pm_runtime_barrier(dev);
|
||||
/*
|
||||
* Only need to resume devices in D3cold, because config
|
||||
* registers are still accessible for devices suspended but
|
||||
* not in D3cold.
|
||||
*/
|
||||
if (pdev->current_state == PCI_D3cold)
|
||||
pm_runtime_resume(dev);
|
||||
}
|
||||
|
||||
static void
|
||||
pci_config_pm_runtime_put(struct pci_dev *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device *parent = dev->parent;
|
||||
|
||||
pm_runtime_put(dev);
|
||||
if (parent)
|
||||
pm_runtime_put_sync(parent);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
pci_read_config(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
@@ -484,6 +518,8 @@ pci_read_config(struct file *filp, struct kobject *kobj,
|
||||
size = count;
|
||||
}
|
||||
|
||||
pci_config_pm_runtime_get(dev);
|
||||
|
||||
if ((off & 1) && size) {
|
||||
u8 val;
|
||||
pci_user_read_config_byte(dev, off, &val);
|
||||
@@ -529,6 +565,8 @@ pci_read_config(struct file *filp, struct kobject *kobj,
|
||||
--size;
|
||||
}
|
||||
|
||||
pci_config_pm_runtime_put(dev);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -549,6 +587,8 @@ pci_write_config(struct file* filp, struct kobject *kobj,
|
||||
count = size;
|
||||
}
|
||||
|
||||
pci_config_pm_runtime_get(dev);
|
||||
|
||||
if ((off & 1) && size) {
|
||||
pci_user_write_config_byte(dev, off, data[off - init_off]);
|
||||
off++;
|
||||
@@ -587,6 +627,8 @@ pci_write_config(struct file* filp, struct kobject *kobj,
|
||||
--size;
|
||||
}
|
||||
|
||||
pci_config_pm_runtime_put(dev);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@@ -1869,6 +1869,7 @@ void pci_pm_init(struct pci_dev *dev)
|
||||
dev->pm_cap = pm;
|
||||
dev->d3_delay = PCI_PM_D3_WAIT;
|
||||
dev->d3cold_delay = PCI_PM_D3COLD_WAIT;
|
||||
dev->d3cold_allowed = true;
|
||||
|
||||
dev->d1_support = false;
|
||||
dev->d2_support = false;
|
||||
|
@@ -133,9 +133,17 @@ static int pcie_port_runtime_resume(struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcie_port_runtime_idle(struct device *dev)
|
||||
{
|
||||
/* Delay for a short while to prevent too frequent suspend/resume */
|
||||
pm_schedule_suspend(dev, 10);
|
||||
return -EBUSY;
|
||||
}
|
||||
#else
|
||||
#define pcie_port_runtime_suspend NULL
|
||||
#define pcie_port_runtime_resume NULL
|
||||
#define pcie_port_runtime_idle NULL
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops pcie_portdrv_pm_ops = {
|
||||
@@ -148,6 +156,7 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = {
|
||||
.resume_noirq = pcie_port_resume_noirq,
|
||||
.runtime_suspend = pcie_port_runtime_suspend,
|
||||
.runtime_resume = pcie_port_runtime_resume,
|
||||
.runtime_idle = pcie_port_runtime_idle,
|
||||
};
|
||||
|
||||
#define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops)
|
||||
@@ -193,6 +202,11 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev,
|
||||
return status;
|
||||
|
||||
pci_save_state(dev);
|
||||
/*
|
||||
* D3cold may not work properly on some PCIe port, so disable
|
||||
* it by default.
|
||||
*/
|
||||
dev->d3cold_allowed = false;
|
||||
if (!pci_match_id(port_runtime_pm_black_list, dev))
|
||||
pm_runtime_put_noidle(&dev->dev);
|
||||
|
||||
|
@@ -144,15 +144,13 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
|
||||
case PCI_BASE_ADDRESS_MEM_TYPE_32:
|
||||
break;
|
||||
case PCI_BASE_ADDRESS_MEM_TYPE_1M:
|
||||
dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR\n");
|
||||
/* 1M mem BAR treated as 32-bit BAR */
|
||||
break;
|
||||
case PCI_BASE_ADDRESS_MEM_TYPE_64:
|
||||
flags |= IORESOURCE_MEM_64;
|
||||
break;
|
||||
default:
|
||||
dev_warn(&dev->dev,
|
||||
"mem unknown type %x treated as 32-bit BAR\n",
|
||||
mem_type);
|
||||
/* mem unknown type treated as 32-bit BAR */
|
||||
break;
|
||||
}
|
||||
return flags;
|
||||
@@ -173,9 +171,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
u32 l, sz, mask;
|
||||
u16 orig_cmd;
|
||||
struct pci_bus_region region;
|
||||
bool bar_too_big = false, bar_disabled = false;
|
||||
|
||||
mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
|
||||
|
||||
/* No printks while decoding is disabled! */
|
||||
if (!dev->mmio_always_on) {
|
||||
pci_read_config_word(dev, PCI_COMMAND, &orig_cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND,
|
||||
@@ -240,8 +240,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
goto fail;
|
||||
|
||||
if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
|
||||
dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
|
||||
pos);
|
||||
bar_too_big = true;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -252,12 +251,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
region.start = 0;
|
||||
region.end = sz64;
|
||||
pcibios_bus_to_resource(dev, res, ®ion);
|
||||
bar_disabled = true;
|
||||
} else {
|
||||
region.start = l64;
|
||||
region.end = l64 + sz64;
|
||||
pcibios_bus_to_resource(dev, res, ®ion);
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
|
||||
pos, res);
|
||||
}
|
||||
} else {
|
||||
sz = pci_size(l, sz, mask);
|
||||
@@ -268,18 +266,23 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
region.start = l;
|
||||
region.end = l + sz;
|
||||
pcibios_bus_to_resource(dev, res, ®ion);
|
||||
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
|
||||
}
|
||||
|
||||
out:
|
||||
goto out;
|
||||
|
||||
|
||||
fail:
|
||||
res->flags = 0;
|
||||
out:
|
||||
if (!dev->mmio_always_on)
|
||||
pci_write_config_word(dev, PCI_COMMAND, orig_cmd);
|
||||
|
||||
if (bar_too_big)
|
||||
dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n", pos);
|
||||
if (res->flags && !bar_disabled)
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
|
||||
|
||||
return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
|
||||
fail:
|
||||
res->flags = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
|
||||
|
Reference in New Issue
Block a user