fsl/pci: The new pci suspend/resume implementation
If we do nothing in suspend/resume, some platform PCIe ip-block can't guarantee the link back to L0 state from sleep, then, when we read the EP device will hang. Only we send pme turnoff message in pci controller suspend, and send pme exit message in resume, the link state will be normal. When we send pme turnoff message in pci controller suspend, the links will into l2/l3 ready, then, host cannot communicate with ep device, but pci-driver will call back EP device to save them state. So we need to change platform_driver->suspend/resume to syscore->suspend/resume. So the new suspend/resume implementation, send pme turnoff message in suspend, and send pme exit message in resume. And add a PME handler, to response PME & message interrupt. Change platform_driver->suspend/resume to syscore->suspend/resume. pci-driver will call back EP device, to save EP state in pci_pm_suspend_noirq, so we need to keep the link, until pci_pm_suspend_noirq finish. Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com> Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
Родитель
0939437357
Коммит
48b16180d0
|
@ -68,6 +68,7 @@ define_machine(c293_pcie) {
|
|||
.init_IRQ = c293_pcie_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -179,6 +179,7 @@ define_machine(corenet_generic) {
|
|||
.init_IRQ = corenet_gen_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_coreint_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -215,6 +215,7 @@ define_machine(ge_imp3a) {
|
|||
.show_cpuinfo = ge_imp3a_show_cpuinfo,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -76,6 +76,7 @@ define_machine(mpc8536_ds) {
|
|||
.init_IRQ = mpc8536_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -385,6 +385,7 @@ define_machine(mpc85xx_cds) {
|
|||
#ifdef CONFIG_PCI
|
||||
.restart = mpc85xx_cds_restart,
|
||||
.pcibios_fixup_bus = mpc85xx_cds_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#else
|
||||
.restart = fsl_rstcr_restart,
|
||||
#endif
|
||||
|
|
|
@ -209,6 +209,7 @@ define_machine(mpc8544_ds) {
|
|||
.init_IRQ = mpc85xx_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -223,6 +224,7 @@ define_machine(mpc8572_ds) {
|
|||
.init_IRQ = mpc85xx_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -237,6 +239,7 @@ define_machine(p2020_ds) {
|
|||
.init_IRQ = mpc85xx_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -392,6 +392,7 @@ define_machine(mpc8568_mds) {
|
|||
.progress = udbg_progress,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -413,6 +414,7 @@ define_machine(mpc8569_mds) {
|
|||
.progress = udbg_progress,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -435,6 +437,7 @@ define_machine(p1021_mds) {
|
|||
.progress = udbg_progress,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -231,6 +231,7 @@ define_machine(p2020_rdb) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -245,6 +246,7 @@ define_machine(p1020_rdb) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -259,6 +261,7 @@ define_machine(p1021_rdb_pc) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -273,6 +276,7 @@ define_machine(p2020_rdb_pc) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -287,6 +291,7 @@ define_machine(p1025_rdb) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -301,6 +306,7 @@ define_machine(p1020_mbg_pc) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -315,6 +321,7 @@ define_machine(p1020_utm_pc) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -329,6 +336,7 @@ define_machine(p1020_rdb_pc) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -343,6 +351,7 @@ define_machine(p1020_rdb_pd) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -357,6 +366,7 @@ define_machine(p1024_rdb) {
|
|||
.init_IRQ = mpc85xx_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -78,6 +78,7 @@ define_machine(p1010_rdb) {
|
|||
.init_IRQ = p1010_rdb_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -567,6 +567,7 @@ define_machine(p1022_ds) {
|
|||
.init_IRQ = p1022_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -147,6 +147,7 @@ define_machine(p1022_rdk) {
|
|||
.init_IRQ = p1022_rdk_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -126,6 +126,7 @@ define_machine(p1023_rds) {
|
|||
.progress = udbg_progress,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -140,5 +141,6 @@ define_machine(p1023_rdb) {
|
|||
.progress = udbg_progress,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -66,6 +66,7 @@ define_machine(qemu_e500) {
|
|||
.init_IRQ = qemu_e500_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_coreint_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -135,6 +135,7 @@ define_machine(sbc8548) {
|
|||
.restart = fsl_rstcr_restart,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.progress = udbg_progress,
|
||||
|
|
|
@ -170,6 +170,7 @@ define_machine(xes_mpc8572) {
|
|||
.init_IRQ = xes_mpc85xx_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -184,6 +185,7 @@ define_machine(xes_mpc8548) {
|
|||
.init_IRQ = xes_mpc85xx_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
@ -198,6 +200,7 @@ define_machine(xes_mpc8540) {
|
|||
.init_IRQ = xes_mpc85xx_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
.pcibios_fixup_phb = fsl_pcibios_fixup_phb,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
|
|
|
@ -22,10 +22,13 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
@ -1094,10 +1097,159 @@ void fsl_pci_assign_primary(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static irqreturn_t fsl_pci_pme_handle(int irq, void *dev_id)
|
||||
{
|
||||
struct pci_controller *hose = dev_id;
|
||||
struct ccsr_pci __iomem *pci = hose->private_data;
|
||||
u32 dr;
|
||||
|
||||
dr = in_be32(&pci->pex_pme_mes_dr);
|
||||
if (!dr)
|
||||
return IRQ_NONE;
|
||||
|
||||
out_be32(&pci->pex_pme_mes_dr, dr);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int fsl_pci_pme_probe(struct pci_controller *hose)
|
||||
{
|
||||
struct ccsr_pci __iomem *pci;
|
||||
struct pci_dev *dev;
|
||||
int pme_irq;
|
||||
int res;
|
||||
u16 pms;
|
||||
|
||||
/* Get hose's pci_dev */
|
||||
dev = list_first_entry(&hose->bus->devices, typeof(*dev), bus_list);
|
||||
|
||||
/* PME Disable */
|
||||
pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pms);
|
||||
pms &= ~PCI_PM_CTRL_PME_ENABLE;
|
||||
pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pms);
|
||||
|
||||
pme_irq = irq_of_parse_and_map(hose->dn, 0);
|
||||
if (!pme_irq) {
|
||||
dev_err(&dev->dev, "Failed to map PME interrupt.\n");
|
||||
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
res = devm_request_irq(hose->parent, pme_irq,
|
||||
fsl_pci_pme_handle,
|
||||
IRQF_SHARED,
|
||||
"[PCI] PME", hose);
|
||||
if (res < 0) {
|
||||
dev_err(&dev->dev, "Unable to requiest irq %d for PME\n", pme_irq);
|
||||
irq_dispose_mapping(pme_irq);
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pci = hose->private_data;
|
||||
|
||||
/* Enable PTOD, ENL23D & EXL23D */
|
||||
out_be32(&pci->pex_pme_mes_disr, 0);
|
||||
setbits32(&pci->pex_pme_mes_disr,
|
||||
PME_DISR_EN_PTOD | PME_DISR_EN_ENL23D | PME_DISR_EN_EXL23D);
|
||||
|
||||
out_be32(&pci->pex_pme_mes_ier, 0);
|
||||
setbits32(&pci->pex_pme_mes_ier,
|
||||
PME_DISR_EN_PTOD | PME_DISR_EN_ENL23D | PME_DISR_EN_EXL23D);
|
||||
|
||||
/* PME Enable */
|
||||
pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pms);
|
||||
pms |= PCI_PM_CTRL_PME_ENABLE;
|
||||
pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pms);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void send_pme_turnoff_message(struct pci_controller *hose)
|
||||
{
|
||||
struct ccsr_pci __iomem *pci = hose->private_data;
|
||||
u32 dr;
|
||||
int i;
|
||||
|
||||
/* Send PME_Turn_Off Message Request */
|
||||
setbits32(&pci->pex_pmcr, PEX_PMCR_PTOMR);
|
||||
|
||||
/* Wait trun off done */
|
||||
for (i = 0; i < 150; i++) {
|
||||
dr = in_be32(&pci->pex_pme_mes_dr);
|
||||
if (dr) {
|
||||
out_be32(&pci->pex_pme_mes_dr, dr);
|
||||
break;
|
||||
}
|
||||
|
||||
udelay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
static void fsl_pci_syscore_do_suspend(struct pci_controller *hose)
|
||||
{
|
||||
send_pme_turnoff_message(hose);
|
||||
}
|
||||
|
||||
static int fsl_pci_syscore_suspend(void)
|
||||
{
|
||||
struct pci_controller *hose, *tmp;
|
||||
|
||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||
fsl_pci_syscore_do_suspend(hose);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fsl_pci_syscore_do_resume(struct pci_controller *hose)
|
||||
{
|
||||
struct ccsr_pci __iomem *pci = hose->private_data;
|
||||
u32 dr;
|
||||
int i;
|
||||
|
||||
/* Send Exit L2 State Message */
|
||||
setbits32(&pci->pex_pmcr, PEX_PMCR_EXL2S);
|
||||
|
||||
/* Wait exit done */
|
||||
for (i = 0; i < 150; i++) {
|
||||
dr = in_be32(&pci->pex_pme_mes_dr);
|
||||
if (dr) {
|
||||
out_be32(&pci->pex_pme_mes_dr, dr);
|
||||
break;
|
||||
}
|
||||
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
setup_pci_atmu(hose);
|
||||
}
|
||||
|
||||
static void fsl_pci_syscore_resume(void)
|
||||
{
|
||||
struct pci_controller *hose, *tmp;
|
||||
|
||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||
fsl_pci_syscore_do_resume(hose);
|
||||
}
|
||||
|
||||
static struct syscore_ops pci_syscore_pm_ops = {
|
||||
.suspend = fsl_pci_syscore_suspend,
|
||||
.resume = fsl_pci_syscore_resume,
|
||||
};
|
||||
#endif
|
||||
|
||||
void fsl_pcibios_fixup_phb(struct pci_controller *phb)
|
||||
{
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
fsl_pci_pme_probe(phb);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int fsl_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
struct device_node *node;
|
||||
int ret;
|
||||
|
||||
node = pdev->dev.of_node;
|
||||
ret = fsl_add_bridge(pdev, fsl_pci_primary == node);
|
||||
|
@ -1107,42 +1259,9 @@ static int fsl_pci_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int fsl_pci_resume(struct device *dev)
|
||||
{
|
||||
struct pci_controller *hose;
|
||||
struct resource pci_rsrc;
|
||||
|
||||
hose = pci_find_hose_for_OF_device(dev->of_node);
|
||||
if (!hose)
|
||||
return -ENODEV;
|
||||
|
||||
if (of_address_to_resource(dev->of_node, 0, &pci_rsrc)) {
|
||||
dev_err(dev, "Get pci register base failed.");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
setup_pci_atmu(hose);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops pci_pm_ops = {
|
||||
.resume = fsl_pci_resume,
|
||||
};
|
||||
|
||||
#define PCI_PM_OPS (&pci_pm_ops)
|
||||
|
||||
#else
|
||||
|
||||
#define PCI_PM_OPS NULL
|
||||
|
||||
#endif
|
||||
|
||||
static struct platform_driver fsl_pci_driver = {
|
||||
.driver = {
|
||||
.name = "fsl-pci",
|
||||
.pm = PCI_PM_OPS,
|
||||
.of_match_table = pci_ids,
|
||||
},
|
||||
.probe = fsl_pci_probe,
|
||||
|
@ -1150,6 +1269,9 @@ static struct platform_driver fsl_pci_driver = {
|
|||
|
||||
static int __init fsl_pci_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
register_syscore_ops(&pci_syscore_pm_ops);
|
||||
#endif
|
||||
return platform_driver_register(&fsl_pci_driver);
|
||||
}
|
||||
arch_initcall(fsl_pci_init);
|
||||
|
|
|
@ -32,6 +32,13 @@ struct platform_device;
|
|||
#define PIWAR_WRITE_SNOOP 0x00005000
|
||||
#define PIWAR_SZ_MASK 0x0000003f
|
||||
|
||||
#define PEX_PMCR_PTOMR 0x1
|
||||
#define PEX_PMCR_EXL2S 0x2
|
||||
|
||||
#define PME_DISR_EN_PTOD 0x00008000
|
||||
#define PME_DISR_EN_ENL23D 0x00002000
|
||||
#define PME_DISR_EN_EXL23D 0x00001000
|
||||
|
||||
/* PCI/PCI Express outbound window reg */
|
||||
struct pci_outbound_window_regs {
|
||||
__be32 potar; /* 0x.0 - Outbound translation address register */
|
||||
|
@ -111,6 +118,7 @@ struct ccsr_pci {
|
|||
|
||||
extern int fsl_add_bridge(struct platform_device *pdev, int is_primary);
|
||||
extern void fsl_pcibios_fixup_bus(struct pci_bus *bus);
|
||||
extern void fsl_pcibios_fixup_phb(struct pci_controller *phb);
|
||||
extern int mpc83xx_add_bridge(struct device_node *dev);
|
||||
u64 fsl_pci_immrbar_base(struct pci_controller *hose);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче