From patchwork Mon Sep 7 11:41:03 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Minghuan Lian X-Patchwork-Id: 7134001 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id A6A7DBEEC1 for ; Mon, 7 Sep 2015 11:43:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7307120639 for ; Mon, 7 Sep 2015 11:43:16 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D8C5D20620 for ; Mon, 7 Sep 2015 11:43:14 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZYunG-0003Fz-QM; Mon, 07 Sep 2015 11:41:02 +0000 Received: from mail-bl2on0101.outbound.protection.outlook.com ([65.55.169.101] helo=na01-bl2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZYunD-0003Bf-9j for linux-arm-kernel@lists.infradead.org; Mon, 07 Sep 2015 11:41:00 +0000 Received: from BLUPR03CA006.namprd03.prod.outlook.com (10.255.124.23) by DM2PR03MB575.namprd03.prod.outlook.com (10.141.84.151) with Microsoft SMTP Server (TLS) id 15.1.262.15; Mon, 7 Sep 2015 11:40:36 +0000 Received: from BL2FFO11FD017.protection.gbl (10.255.124.4) by BLUPR03CA006.outlook.office365.com (10.255.124.23) with Microsoft SMTP Server (TLS) id 15.1.262.15 via Frontend Transport; Mon, 7 Sep 2015 11:40:36 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11FD017.mail.protection.outlook.com (10.173.161.35) with Microsoft SMTP Server (TLS) id 15.1.262.18 via Frontend Transport; Mon, 7 Sep 2015 11:40:35 +0000 Received: from lmh.ap.freescale.net (lmh.ap.freescale.net [10.193.20.20]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t87BeQEk017028; Mon, 7 Sep 2015 04:40:28 -0700 From: Minghuan Lian To: Subject: [PATCH] PCI: layerscape: Add PCIe support for LS1043a and LS2085a Date: Mon, 7 Sep 2015 19:41:03 +0800 Message-ID: <1441626063-13624-1-git-send-email-Minghuan.Lian@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD017; 1:DynjWnFn0f7UWKfabEUjQApmZ7Tja0sgDawHom+Ni3MzKjGx7IbRYXy1j5z03uynkJ8SyQf2OSjn6Tu+fG+1GavBp/y7dmA3KH8NNV4tumGtor1ox06sb0uGQPOq7D63dmGonKK34PfOQ+x6s8iKckTWuNW4tIfASlae+dJnuc7J13NSiiKzLsaGVU+QYkO3UVOq5Tp2mW4kL/HVDWpHmzkYVXAqngkvVZeBVsHRVGxWhtyF7wwGy8AUn3THfRf4bfslAQS8aW8493yfFSrYHpMQoZ9GePdYRQ/3sX6sVTFhqOrPWiviV9bgIfdr1mRYo/kRFQDLOUtusLNv/9j8fKNrd1a3VvvzKrl++T3fkNeiYlmjWfaCU8sjv78Oq1LFAdp3xrhVWrXoodf7Tm45I60rEBwk8yS64iNzDJQRIyQ= X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1109001)(339900001)(199003)(189002)(110136002)(62966003)(105606002)(50986999)(5001960100002)(64706001)(69596002)(92566002)(87936001)(6806004)(77096005)(50466002)(19580395003)(229853001)(19580405001)(106466001)(189998001)(77156002)(46102003)(107886002)(85426001)(5001860100001)(50226001)(2351001)(86362001)(5001920100001)(47776003)(68736005)(5007970100001)(104016003)(36756003)(48376002)(97736004)(4001540100001)(81156007)(5001830100001)(5003940100001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR03MB575; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB575; 2:UQ0w952hVaSgfT3BUFlAvryzvfQhLfUw++CUA0FnxybfkBk3UNk20LqOs4ydw5X3vw8ryH4fiflYaTTp9ztAsylMebinUnBaTVGSOtcAJFuLe3pDXv0btKLyVmwh7RC2IpyM7fS1Ny0MP3mYHuR69zZlhmeEGRomD9Jy8tjqqwA=; 3:NPzOGwgzXxSMJOSexfJSyL43I2A7O8FxeQYJq+cMX8VucvG69SLklHBEatEqZ868YxfSLFJxIMUAMX1Tuy8Y+A9xjR0Eu6NBZ9UvjrcQ+LCR2syPpzE5nuMTTvbVRxEaev1F+fxF5CY+PFYWpftDJZQ/Fm84tjE1Za1aiGR+R9afvHMGJ08TF1HUaWBVMn3T69kxJwJ/QH25ZeOPC68EvzjD7+x3DKJNB389y1w1Inw=; 25:xM/SQP8grqKXKbpS2JbOlnQyhLd7DmHxk2/YciEiwjmkxiQJRu8N66FjKgsWCXXhtBiYBWgIDnw8kWx7+vO7Byrkb6D7X6CvSr/hnTps04kBdIy/WIaNl4SqDGpV3lJK8YmOjWtL+Sz7aUrS076Ohf3S0ok9W8YseaP1rCcA+J2pFgyNfiXXnfpxp5jbXCEDDQa75uEP3RYkR8DnCWW8Q48iQt4IHSHwV+bEjVcGBpbdZnYXREdsSz6uzIQly/lB X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR03MB575; X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB575; 20:jyjQ5GDofwUxtVrUUVNWbc8nYn2/KlSkBK1GP8rtYO5TbF93L/S1TkL+TluEKEOi2AN9RpaBD9Z3iUlB5tw/ZNes6RldKqHEhPAvtW1meRCmXlwAlNG5pTdeU54OilkQEXjQbOHwyx+M3ppXAhYlwGRtYL6wOkFGfHJHysH2C5CvYzmB58rfQuTg4UUTNJw/8a5R6wbEbPwCHceMR/vo+X6uOWxK2ofRkkMCP8GdnxMplSIT0bXhZEwbSZKXy1n8E/UhigWlAAf+Xw8RUQCiftQS+Ysll7e0ZfkCPs4X1a7iaLtLedKSCtuq07UYCjM6G2JK29q33dBq+9AetChq1IvW/NEqJrUooEDcJ967nQA=; 4:gCNHsynrpPUkHd4rLVbFX/aa9K8yZcYFKHSnVUHsTbF1C6ZvG2i1n1Js0McrrTD9r1CkGoRWZsX7KGMGkqfvNQP4rwvmjLK+OrpdwT1lglcQlpjWEwKs1x1u0wWK8uBIWojrdURxWrEliTT+dO0ltIxFIMWbhzzBaOBG08MkfOUiUruTKp+Pekke6yVB1K220/yOqJnxqEcVxw2HgeaOFbDhiBVHGbj43Gu5fRVuc1O4uSOiIbL4z6XHatXOz8syZ/ra22Bc8lonxlezmBb2m4yaoj/gYZyZsESgBPU3HYCaQIpp17sbeqZ60OMGLtRT X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(8121501046)(5005006)(3002001); SRVR:DM2PR03MB575; BCL:0; PCL:0; RULEID:; SRVR:DM2PR03MB575; X-Forefront-PRVS: 069255B8B8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR03MB575; 23:7DMrUPkQZs7OTQtpKEzmeKKqkr+HcOZpnkWPXJ+iVm?= =?us-ascii?Q?n/wCBGr0UonaRtwf3a37B7V/1Yxd1vFw3r1VKerjKXX5cWQnM0FLDVu5zILa?= =?us-ascii?Q?kMwOxll/hk/UAc0+kNuT82rbsoP6ArvOC6kCy3wJaeLt0jNtxhv6kO6OKOb2?= =?us-ascii?Q?kfLgFPp2Q7GVtMn9p/ccc+oj/UDArCcXNqzNQoxvOd+iftboO0452uf0m5Eo?= =?us-ascii?Q?J9+fVvMAxzMtrld091AvWGdB2mFIl+cAVWAGiFbOUNq9hwRj0mZEJ0D7LxGk?= =?us-ascii?Q?ajORMc5S3YbLP+RF1kjYenAyEs/ugY1/CYW/G1QtFbcHZ2hp43RNvB5aXurk?= =?us-ascii?Q?o3X/Y6HBogtz4zNhiidVZMoFVqCU7IB7Y9AcPDEuTFcFkepZY6MYeuTMYsos?= =?us-ascii?Q?yT6FKCi5yLBtL39kyuWe2AwLkiobXQUeVuVU9VpRIaF8Q7PzQvPCP/L+ffSl?= =?us-ascii?Q?iaccrL1hFjZbGESLtTNfznjWWikOZ6nW6ec1D1clarAwCAlL7+Fcn5rsg4i3?= =?us-ascii?Q?/2A89h8VpKYQet4scg3OKql/2gWiuh1bKdMG6jz6P7onszik/ghZvCKcIw8/?= =?us-ascii?Q?OvPcggGDKhw1cRcAQ8Rx35hq+blrc0T1Kun7jupdb6qLDYkV/lbNtpsFG+Rf?= =?us-ascii?Q?yq8QZmdSh0Y4XwV0wW58Ug4g813Lt3BSuIV4vB5e1+159bGMN3p6LbBiHsig?= =?us-ascii?Q?CJvIgiwr/FI+pOxVaxwCEnxRkP9Oj9pd0zJ0GOq9Czfj8amslot7VfKwllqS?= =?us-ascii?Q?kDZTtlxQgSU0ixZS2fAuytTeIReQVM90wnA4R6WZlRk+5Wjd6vb0Supn6Dor?= =?us-ascii?Q?YBP61jRyq42VYwJewZPv6qGVHdWjAgnRsx047/uOEDCvNTceKHhVigdp8w7h?= =?us-ascii?Q?P5ErcMTsLzr0dEseNkc6hZAEzHWwWt2n17VtlYQlFamzgCYmecEqM1h9bwqK?= =?us-ascii?Q?Qm6OS1G4ddOEzYkQyeW6FrA4Yu3BObaxozBy2FDGH2nNmnBMIOKQaix600zp?= =?us-ascii?Q?+0/zHS/iKFSwrwyIsQT/KIvZvBZIrf6z447HxqgqSi04IL5dTNGhVkqmJGn9?= =?us-ascii?Q?qNgpfLgAip7K4mgwJxH7qZ0Hf95lyj0RWvdcmcGEKSAcf0PIADtwha9/tUV6?= =?us-ascii?Q?fvNNtZK6J59FXgd9x5qEIdZrsiKOF8M3Ld4VI4Dy7cIIWNMVutLF0CcRE6+H?= =?us-ascii?Q?xeVyRqBk3dJfMiZ0OsiHm10RYk9Y4nOGPa?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB575; 5:HFZVppvcRCsvUnQ9f+jKI6TR6LpbpJaoQu51oOTEwC0D1cJz9aDPc8twBodtnpyUVdjfVbiNNjdbT5tTW95wFASC6oMtwPsVLttzBHiypgMzsM/AdcdVsHijjbKIIWrIZg1YxiBY4OYj+XbKyxII0g==; 24:JkYYg+vGMCeVzTmPiqtjqNZKt23uXz9D0QwEQBj2U+SA+6F1gBNnDzxC+Zt7jat11XqL76fEnX/Lc9WapLzSVJJgRTAUcDptSGxatLee7Lk=; 20:hoRUIBm4OJSR/UpRGgqeI2s7IjKPVejfTV+qPMEWpaGldpvIf2pImblNhn3giVwjw5ZgYqHSE8MIHM/DL3XpGg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Sep 2015 11:40:35.6461 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR03MB575 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150907_044059_685846_1D145998 X-CRM114-Status: GOOD ( 23.40 ) X-Spam-Score: -1.9 (-) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Arnd Bergmann , Jingoo Han , Hu Mingkai-B21284 , Zang Roy-R61911 , Yoder Stuart-B08248 , Minghuan Lian , Zhou Wang , Bjorn Helgaas , Li Yang , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The patch adds PCIe support for LS1043a and LS2085a. Signed-off-by: Minghuan Lian --- This patch is based on v4.2-rc2 and [PATCH v8 0/6] PCI: hisi: Add PCIe host support for HiSilicon SoC Hip05 patchset from Zhou Wang. drivers/pci/host/Kconfig | 2 +- drivers/pci/host/pci-layerscape.c | 212 +++++++++++++++++++++++++------------- 2 files changed, 141 insertions(+), 73 deletions(-) diff --git a/drivers/pci/host/Kconfig b/drivers/pci/host/Kconfig index a9238ef..9efb6d3 100644 --- a/drivers/pci/host/Kconfig +++ b/drivers/pci/host/Kconfig @@ -105,7 +105,7 @@ config PCI_XGENE_MSI config PCI_LAYERSCAPE bool "Freescale Layerscape PCIe controller" - depends on OF && ARM + depends on OF && (ARM || ARM64) select PCIE_DW select MFD_SYSCON help diff --git a/drivers/pci/host/pci-layerscape.c b/drivers/pci/host/pci-layerscape.c index b2328ea1..7b3618f 100644 --- a/drivers/pci/host/pci-layerscape.c +++ b/drivers/pci/host/pci-layerscape.c @@ -11,7 +11,6 @@ */ #include -#include #include #include #include @@ -32,27 +31,68 @@ #define LTSSM_STATE_MASK 0x3f #define LTSSM_PCIE_L0 0x11 /* L0 state */ -/* Symbol Timer Register and Filter Mask Register 1 */ -#define PCIE_STRFMR1 0x71c +/* PEX Internal Configuration Registers */ +#define PCIE_STRFMR1 0x71c /* Symbol Timer & Filter Mask Register1 */ +#define PCIE_DBI_RO_WR_EN 0x8bc /* DBI Read-Only Write Enable Register */ + +/* PEX LUT registers */ +#define PCIE_LUT_DBG 0x7FC /* PEX LUT Debug Register */ + +struct ls_pcie_drvdata { + u32 lut_offset; + u32 ltssm_shift; + struct pcie_host_ops *ops; +}; struct ls_pcie { - struct list_head node; - struct device *dev; - struct pci_bus *bus; - void __iomem *dbi; - struct regmap *scfg; struct pcie_port pp; + const struct ls_pcie_drvdata *drvdata; + void __iomem *regs; + void __iomem *lut; + struct regmap *scfg; int index; - int msi_irq; }; #define to_ls_pcie(x) container_of(x, struct ls_pcie, pp) -static int ls_pcie_link_up(struct pcie_port *pp) +static bool ls_pcie_is_bridge(struct ls_pcie *pcie) +{ + u32 header_type; + + header_type = ioread32(pcie->regs + (PCI_HEADER_TYPE & ~0x3)); + header_type = (header_type >> (8 * (PCI_HEADER_TYPE & 0x3))) & 0x7f; + + return header_type == PCI_HEADER_TYPE_BRIDGE; +} + +/* Clean multi-function bit */ +static void ls_pcie_clean_multifunction(struct ls_pcie *pcie) +{ + u32 val; + + val = ioread32(pcie->regs + (PCI_HEADER_TYPE & ~0x3)); + val &= ~(1 << 23); + iowrite32(val, pcie->regs + (PCI_HEADER_TYPE & ~0x3)); +} + +/* Fix class value */ +static void ls_pcie_fix_class(struct ls_pcie *pcie) +{ + u32 val; + + val = ioread32(pcie->regs + PCI_CLASS_REVISION); + val = (val & 0x0000ffff) | (PCI_CLASS_BRIDGE_PCI << 16); + iowrite32(val, pcie->regs + PCI_CLASS_REVISION); +} + +static int ls1021_pcie_link_up(struct pcie_port *pp) { u32 state; struct ls_pcie *pcie = to_ls_pcie(pp); + if (!pcie->scfg) + return 0; + regmap_read(pcie->scfg, SCFG_PEXMSCPORTSR(pcie->index), &state); state = (state >> LTSSM_STATE_SHIFT) & LTSSM_STATE_MASK; @@ -62,110 +102,138 @@ static int ls_pcie_link_up(struct pcie_port *pp) return 1; } -static int ls_pcie_establish_link(struct pcie_port *pp) +static void ls1021_pcie_host_init(struct pcie_port *pp) { - unsigned int retries; + struct ls_pcie *pcie = to_ls_pcie(pp); + u32 val, index[2]; - for (retries = 0; retries < 200; retries++) { - if (dw_pcie_link_up(pp)) - return 0; - usleep_range(100, 1000); + pcie->scfg = syscon_regmap_lookup_by_phandle(pp->dev->of_node, + "fsl,pcie-scfg"); + if (IS_ERR(pcie->scfg)) { + dev_err(pp->dev, "No syscfg phandle specified\n"); + pcie->scfg = NULL; + return; } - dev_err(pp->dev, "phy link never came up\n"); - return -EINVAL; -} - -static void ls_pcie_host_init(struct pcie_port *pp) -{ - struct ls_pcie *pcie = to_ls_pcie(pp); - u32 val; - - dw_pcie_setup_rc(pp); - ls_pcie_establish_link(pp); + if (of_property_read_u32_array(pp->dev->of_node, + "fsl,pcie-scfg", index, 2)) { + pcie->scfg = NULL; + return; + } + pcie->index = index[1]; /* * LS1021A Workaround for internal TKT228622 * to fix the INTx hang issue */ - val = ioread32(pcie->dbi + PCIE_STRFMR1); + val = ioread32(pcie->regs + PCIE_STRFMR1); val &= 0xffff; - iowrite32(val, pcie->dbi + PCIE_STRFMR1); + iowrite32(val, pcie->regs + PCIE_STRFMR1); } +static int ls_pcie_link_up(struct pcie_port *pp) +{ + struct ls_pcie *pcie = to_ls_pcie(pp); + u32 state; + + state = (ioread32(pcie->lut + PCIE_LUT_DBG) >> + pcie->drvdata->ltssm_shift) & + LTSSM_STATE_MASK; + + if (state < LTSSM_PCIE_L0) + return 0; + + return 1; +} + +static void ls_pcie_host_init(struct pcie_port *pp) +{ + struct ls_pcie *pcie = to_ls_pcie(pp); + + iowrite32(1, pcie->regs + PCIE_DBI_RO_WR_EN); + ls_pcie_fix_class(pcie); + ls_pcie_clean_multifunction(pcie); + iowrite32(0, pcie->regs + PCIE_DBI_RO_WR_EN); +} + +static struct pcie_host_ops ls1021_pcie_host_ops = { + .link_up = ls1021_pcie_link_up, + .host_init = ls1021_pcie_host_init, +}; + static struct pcie_host_ops ls_pcie_host_ops = { .link_up = ls_pcie_link_up, .host_init = ls_pcie_host_init, }; -static int ls_add_pcie_port(struct ls_pcie *pcie) -{ - struct pcie_port *pp; - int ret; +static struct ls_pcie_drvdata ls1021_drvdata = { + .ops = &ls1021_pcie_host_ops, +}; - pp = &pcie->pp; - pp->dev = pcie->dev; - pp->dbi_base = pcie->dbi; - pp->root_bus_nr = -1; - pp->ops = &ls_pcie_host_ops; +static struct ls_pcie_drvdata ls1043_drvdata = { + .lut_offset = 0x10000, + .ltssm_shift = 24, + .ops = &ls_pcie_host_ops, +}; - ret = dw_pcie_host_init(pp); - if (ret) { - dev_err(pp->dev, "failed to initialize host\n"); - return ret; - } +static struct ls_pcie_drvdata ls2085_drvdata = { + .lut_offset = 0x80000, + .ltssm_shift = 0, + .ops = &ls_pcie_host_ops, +}; - return 0; -} +static const struct of_device_id ls_pcie_of_match[] = { + { .compatible = "fsl,ls1021a-pcie", .data = &ls1021_drvdata }, + { .compatible = "fsl,ls1043a-pcie", .data = &ls1043_drvdata }, + { .compatible = "fsl,ls2085a-pcie", .data = &ls2085_drvdata }, + { }, +}; +MODULE_DEVICE_TABLE(of, ls_pcie_of_match); static int __init ls_pcie_probe(struct platform_device *pdev) { + const struct of_device_id *match; struct ls_pcie *pcie; - struct resource *dbi_base; - u32 index[2]; + struct pcie_port *pp; + struct resource *res; int ret; + match = of_match_device(ls_pcie_of_match, &pdev->dev); + if (!match) + return -ENODEV; + pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL); if (!pcie) return -ENOMEM; - pcie->dev = &pdev->dev; - - dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); - pcie->dbi = devm_ioremap_resource(&pdev->dev, dbi_base); - if (IS_ERR(pcie->dbi)) { + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); + pcie->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(pcie->regs)) { dev_err(&pdev->dev, "missing *regs* space\n"); - return PTR_ERR(pcie->dbi); + return PTR_ERR(pcie->regs); } - pcie->scfg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, - "fsl,pcie-scfg"); - if (IS_ERR(pcie->scfg)) { - dev_err(&pdev->dev, "No syscfg phandle specified\n"); - return PTR_ERR(pcie->scfg); - } + pcie->drvdata = match->data; + pcie->lut = pcie->regs + pcie->drvdata->lut_offset; + pp = &pcie->pp; + pp->dev = &pdev->dev; + pp->dbi_base = pcie->regs; + pp->ops = pcie->drvdata->ops; - ret = of_property_read_u32_array(pdev->dev.of_node, - "fsl,pcie-scfg", index, 2); - if (ret) - return ret; - pcie->index = index[1]; + if (!ls_pcie_is_bridge(pcie)) + return -ENODEV; - ret = ls_add_pcie_port(pcie); - if (ret < 0) + ret = dw_pcie_host_init(pp); + if (ret) { + dev_err(&pdev->dev, "failed to initialize host\n"); return ret; + } platform_set_drvdata(pdev, pcie); return 0; } -static const struct of_device_id ls_pcie_of_match[] = { - { .compatible = "fsl,ls1021a-pcie" }, - { }, -}; -MODULE_DEVICE_TABLE(of, ls_pcie_of_match); - static struct platform_driver ls_pcie_driver = { .driver = { .name = "layerscape-pcie",