diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-kirin.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-kirin.c | 49 | 
1 files changed, 27 insertions, 22 deletions
diff --git a/drivers/pci/controller/dwc/pcie-kirin.c b/drivers/pci/controller/dwc/pcie-kirin.c index e496f51e0152..d0a6a2dee6f5 100644 --- a/drivers/pci/controller/dwc/pcie-kirin.c +++ b/drivers/pci/controller/dwc/pcie-kirin.c @@ -330,34 +330,37 @@ static void kirin_pcie_sideband_dbi_r_mode(struct kirin_pcie *kirin_pcie,  	kirin_apb_ctrl_writel(kirin_pcie, val, SOC_PCIECTRL_CTRL1_ADDR);  } -static int kirin_pcie_rd_own_conf(struct pcie_port *pp, +static int kirin_pcie_rd_own_conf(struct pci_bus *bus, unsigned int devfn,  				  int where, int size, u32 *val)  { -	struct dw_pcie *pci = to_dw_pcie_from_pp(pp); -	struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); -	int ret; +	struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); -	kirin_pcie_sideband_dbi_r_mode(kirin_pcie, true); -	ret = dw_pcie_read(pci->dbi_base + where, size, val); -	kirin_pcie_sideband_dbi_r_mode(kirin_pcie, false); +	if (PCI_SLOT(devfn)) { +		*val = ~0; +		return PCIBIOS_DEVICE_NOT_FOUND; +	} -	return ret; +	*val = dw_pcie_read_dbi(pci, where, size); +	return PCIBIOS_SUCCESSFUL;  } -static int kirin_pcie_wr_own_conf(struct pcie_port *pp, +static int kirin_pcie_wr_own_conf(struct pci_bus *bus, unsigned int devfn,  				  int where, int size, u32 val)  { -	struct dw_pcie *pci = to_dw_pcie_from_pp(pp); -	struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci); -	int ret; +	struct dw_pcie *pci = to_dw_pcie_from_pp(bus->sysdata); -	kirin_pcie_sideband_dbi_w_mode(kirin_pcie, true); -	ret = dw_pcie_write(pci->dbi_base + where, size, val); -	kirin_pcie_sideband_dbi_w_mode(kirin_pcie, false); +	if (PCI_SLOT(devfn)) +		return PCIBIOS_DEVICE_NOT_FOUND; -	return ret; +	dw_pcie_write_dbi(pci, where, size, val); +	return PCIBIOS_SUCCESSFUL;  } +static struct pci_ops kirin_pci_ops = { +	.read = kirin_pcie_rd_own_conf, +	.write = kirin_pcie_wr_own_conf, +}; +  static u32 kirin_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base,  			       u32 reg, size_t size)  { @@ -423,10 +426,10 @@ static int kirin_pcie_establish_link(struct pcie_port *pp)  static int kirin_pcie_host_init(struct pcie_port *pp)  { -	kirin_pcie_establish_link(pp); +	pp->bridge->ops = &kirin_pci_ops; -	if (IS_ENABLED(CONFIG_PCI_MSI)) -		dw_pcie_msi_init(pp); +	kirin_pcie_establish_link(pp); +	dw_pcie_msi_init(pp);  	return 0;  } @@ -438,8 +441,6 @@ static const struct dw_pcie_ops kirin_dw_pcie_ops = {  };  static const struct dw_pcie_host_ops kirin_pcie_host_ops = { -	.rd_own_conf = kirin_pcie_rd_own_conf, -	.wr_own_conf = kirin_pcie_wr_own_conf,  	.host_init = kirin_pcie_host_init,  }; @@ -507,8 +508,12 @@ static int kirin_pcie_probe(struct platform_device *pdev)  	kirin_pcie->gpio_id_reset = of_get_named_gpio(dev->of_node,  						      "reset-gpios", 0); -	if (kirin_pcie->gpio_id_reset < 0) +	if (kirin_pcie->gpio_id_reset == -EPROBE_DEFER) { +		return -EPROBE_DEFER; +	} else if (!gpio_is_valid(kirin_pcie->gpio_id_reset)) { +		dev_err(dev, "unable to get a valid gpio pin\n");  		return -ENODEV; +	}  	ret = kirin_pcie_power_on(kirin_pcie);  	if (ret)  | 
