diff options
Diffstat (limited to 'drivers/pci/fsl_pci_init.c')
| -rw-r--r-- | drivers/pci/fsl_pci_init.c | 30 | 
1 files changed, 16 insertions, 14 deletions
| diff --git a/drivers/pci/fsl_pci_init.c b/drivers/pci/fsl_pci_init.c index 0d46c9631..20dabf36f 100644 --- a/drivers/pci/fsl_pci_init.c +++ b/drivers/pci/fsl_pci_init.c @@ -1,5 +1,5 @@  /* - * Copyright 2007-2011 Freescale Semiconductor, Inc. + * Copyright 2007-2012 Freescale Semiconductor, Inc.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the Free @@ -499,13 +499,7 @@ void fsl_pci_init(struct pci_controller *hose, struct fsl_pci_info *pci_info)  	}  #ifndef CONFIG_PCI_NOSCAN -	pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &temp8); - -	/* Programming Interface (PCI_CLASS_PROG) -	 * 0 == pci host or pcie root-complex, -	 * 1 == pci agent or pcie end-point -	 */ -	if (!temp8) { +	if (!fsl_is_pci_agent(hose)) {  		debug("           Scanning PCI bus %02x\n",  			hose->current_busno);  		hose->last_busno = pci_hose_scan_bus(hose, hose->current_busno); @@ -543,12 +537,22 @@ void fsl_pci_init(struct pci_controller *hose, struct fsl_pci_info *pci_info)  int fsl_is_pci_agent(struct pci_controller *hose)  { -	u8 prog_if; +	u8 pcie_cap;  	pci_dev_t dev = PCI_BDF(hose->first_busno, 0, 0); -	pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &prog_if); +	pci_hose_read_config_byte(hose, dev, FSL_PCIE_CAP_ID, &pcie_cap); +	if (pcie_cap == PCI_CAP_ID_EXP) { +		u8 header_type; + +		pci_hose_read_config_byte(hose, dev, PCI_HEADER_TYPE, +					  &header_type); +		return (header_type & 0x7f) == PCI_HEADER_TYPE_NORMAL; +	} else { +		u8 prog_if; -	return (prog_if == FSL_PROG_IF_AGENT); +		pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &prog_if); +		return (prog_if == FSL_PROG_IF_AGENT); +	}  }  int fsl_pci_init_port(struct fsl_pci_info *pci_info, @@ -618,12 +622,10 @@ int fsl_pci_init_port(struct fsl_pci_info *pci_info,  void fsl_pci_config_unlock(struct pci_controller *hose)  {  	pci_dev_t dev = PCI_BDF(hose->first_busno,0,0); -	u8 agent;  	u8 pcie_cap;  	u16 pbfr; -	pci_hose_read_config_byte(hose, dev, PCI_CLASS_PROG, &agent); -	if (!agent) +	if (!fsl_is_pci_agent(hose))  		return;  	pci_hose_read_config_byte(hose, dev, FSL_PCIE_CAP_ID, &pcie_cap); |