forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branches 'pci/host-exynos', 'pci/host-iproc', 'pci/host-keyston…
…e', 'pci/host-layerscape', 'pci/host-mvebu', 'pci/host-rcar' and 'pci/host-versatile' into next * pci/host-exynos: PCI: exynos: Fix INTx enablement statement termination error * pci/host-iproc: PCI: iproc: Add Broadcom iProc PCIe support PCI: iproc: Add DT docs for Broadcom iProc PCIe driver PCI: Export symbols required for loadable host driver modules * pci/host-keystone: PCI: keystone: Don't dereference possible NULL pointer * pci/host-layerscape: PCI: layerscape: Simplify platform_get_resource_byname() failure checking * pci/host-mvebu: PCI: mvebu: Add suspend/resume support * pci/host-rcar: PCI: rcar: Verify that mem_res is 64K-aligned PCI: rcar: Change PCIEPARL and PCIEPARH to PCIEPALR and PCIEPAUR PCI: rcar: Write zeroes to reserved PCIEPARL bits PCI: rcar: Fix position of MSI enable bit * pci/host-versatile: PCI: versatile: Check for devm_ioremap_resource() failures
- Loading branch information
Showing
18 changed files
with
567 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
* Broadcom iProc PCIe controller with the platform bus interface | ||
|
||
Required properties: | ||
- compatible: Must be "brcm,iproc-pcie" | ||
- reg: base address and length of the PCIe controller I/O register space | ||
- #interrupt-cells: set to <1> | ||
- interrupt-map-mask and interrupt-map, standard PCI properties to define the | ||
mapping of the PCIe interface to interrupt numbers | ||
- linux,pci-domain: PCI domain ID. Should be unique for each host controller | ||
- bus-range: PCI bus numbers covered | ||
- #address-cells: set to <3> | ||
- #size-cells: set to <2> | ||
- device_type: set to "pci" | ||
- ranges: ranges for the PCI memory and I/O regions | ||
|
||
Optional properties: | ||
- phys: phandle of the PCIe PHY device | ||
- phy-names: must be "pcie-phy" | ||
|
||
Example: | ||
pcie0: pcie@18012000 { | ||
compatible = "brcm,iproc-pcie"; | ||
reg = <0x18012000 0x1000>; | ||
|
||
#interrupt-cells = <1>; | ||
interrupt-map-mask = <0 0 0 0>; | ||
interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_NONE>; | ||
|
||
linux,pci-domain = <0>; | ||
|
||
bus-range = <0x00 0xff>; | ||
|
||
#address-cells = <3>; | ||
#size-cells = <2>; | ||
device_type = "pci"; | ||
ranges = <0x81000000 0 0 0x28000000 0 0x00010000 | ||
0x82000000 0 0x20000000 0x20000000 0 0x04000000>; | ||
|
||
phys = <&phy 0 5>; | ||
phy-names = "pcie-phy"; | ||
}; | ||
|
||
pcie1: pcie@18013000 { | ||
compatible = "brcm,iproc-pcie"; | ||
reg = <0x18013000 0x1000>; | ||
|
||
#interrupt-cells = <1>; | ||
interrupt-map-mask = <0 0 0 0>; | ||
interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_NONE>; | ||
|
||
linux,pci-domain = <1>; | ||
|
||
bus-range = <0x00 0xff>; | ||
|
||
#address-cells = <3>; | ||
#size-cells = <2>; | ||
device_type = "pci"; | ||
ranges = <0x81000000 0 0 0x48000000 0 0x00010000 | ||
0x82000000 0 0x40000000 0x40000000 0 0x04000000>; | ||
|
||
phys = <&phy 1 6>; | ||
phy-names = "pcie-phy"; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
* Copyright (C) 2015 Broadcom Corporation | ||
* | ||
* 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 Software Foundation version 2. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/pci.h> | ||
#include <linux/clk.h> | ||
#include <linux/module.h> | ||
#include <linux/slab.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/of_address.h> | ||
#include <linux/of_pci.h> | ||
#include <linux/of_irq.h> | ||
#include <linux/of_platform.h> | ||
#include <linux/phy/phy.h> | ||
|
||
#include "pcie-iproc.h" | ||
|
||
static int iproc_pcie_pltfm_probe(struct platform_device *pdev) | ||
{ | ||
struct iproc_pcie *pcie; | ||
struct device_node *np = pdev->dev.of_node; | ||
struct resource reg; | ||
resource_size_t iobase = 0; | ||
LIST_HEAD(res); | ||
int ret; | ||
|
||
pcie = devm_kzalloc(&pdev->dev, sizeof(struct iproc_pcie), GFP_KERNEL); | ||
if (!pcie) | ||
return -ENOMEM; | ||
|
||
pcie->dev = &pdev->dev; | ||
platform_set_drvdata(pdev, pcie); | ||
|
||
ret = of_address_to_resource(np, 0, ®); | ||
if (ret < 0) { | ||
dev_err(pcie->dev, "unable to obtain controller resources\n"); | ||
return ret; | ||
} | ||
|
||
pcie->base = devm_ioremap(pcie->dev, reg.start, resource_size(®)); | ||
if (!pcie->base) { | ||
dev_err(pcie->dev, "unable to map controller registers\n"); | ||
return -ENOMEM; | ||
} | ||
|
||
/* PHY use is optional */ | ||
pcie->phy = devm_phy_get(&pdev->dev, "pcie-phy"); | ||
if (IS_ERR(pcie->phy)) { | ||
if (PTR_ERR(pcie->phy) == -EPROBE_DEFER) | ||
return -EPROBE_DEFER; | ||
pcie->phy = NULL; | ||
} | ||
|
||
ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res, &iobase); | ||
if (ret) { | ||
dev_err(pcie->dev, | ||
"unable to get PCI host bridge resources\n"); | ||
return ret; | ||
} | ||
|
||
pcie->resources = &res; | ||
|
||
ret = iproc_pcie_setup(pcie); | ||
if (ret) { | ||
dev_err(pcie->dev, "PCIe controller setup failed\n"); | ||
return ret; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static int iproc_pcie_pltfm_remove(struct platform_device *pdev) | ||
{ | ||
struct iproc_pcie *pcie = platform_get_drvdata(pdev); | ||
|
||
return iproc_pcie_remove(pcie); | ||
} | ||
|
||
static const struct of_device_id iproc_pcie_of_match_table[] = { | ||
{ .compatible = "brcm,iproc-pcie", }, | ||
{ /* sentinel */ } | ||
}; | ||
MODULE_DEVICE_TABLE(of, iproc_pcie_of_match_table); | ||
|
||
static struct platform_driver iproc_pcie_pltfm_driver = { | ||
.driver = { | ||
.name = "iproc-pcie", | ||
.of_match_table = of_match_ptr(iproc_pcie_of_match_table), | ||
}, | ||
.probe = iproc_pcie_pltfm_probe, | ||
.remove = iproc_pcie_pltfm_remove, | ||
}; | ||
module_platform_driver(iproc_pcie_pltfm_driver); | ||
|
||
MODULE_AUTHOR("Ray Jui <[email protected]>"); | ||
MODULE_DESCRIPTION("Broadcom iPROC PCIe platform driver"); | ||
MODULE_LICENSE("GPL v2"); |
Oops, something went wrong.