{"id":2220365,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220365/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/patch/20260407-ultrarisc-pcie-v2-4-2aa2a19a7fb3@ultrarisc.com/","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/1.1/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260407-ultrarisc-pcie-v2-4-2aa2a19a7fb3@ultrarisc.com>","date":"2026-04-07T02:40:55","name":"[v2,4/4] PCI: ultrarisc: Add UltraRISC DP1000 PCIe Root Complex driver","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"0f631638924f112190ad565c979f695e7147ff5f","submitter":{"id":92886,"url":"http://patchwork.ozlabs.org/api/1.1/people/92886/?format=json","name":"Jia Wang","email":"wangjia@ultrarisc.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/20260407-ultrarisc-pcie-v2-4-2aa2a19a7fb3@ultrarisc.com/mbox/","series":[{"id":498910,"url":"http://patchwork.ozlabs.org/api/1.1/series/498910/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/list/?series=498910","date":"2026-04-07T02:40:55","name":"riscv: Add PCIe support for UltraRISC DP1000 SoC","version":2,"mbox":"http://patchwork.ozlabs.org/series/498910/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220365/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220365/checks/","tags":{},"headers":{"Return-Path":"\n <linux-pci+bounces-51984-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=ultrarisc.com header.i=@ultrarisc.com\n header.a=rsa-sha256 header.s=dkim header.b=UhphyyQE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c15:e001:75::12fc:5321; helo=sin.lore.kernel.org;\n envelope-from=linux-pci+bounces-51984-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=ultrarisc.com header.i=@ultrarisc.com\n header.b=\"UhphyyQE\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=218.76.62.146","smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=ultrarisc.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=ultrarisc.com"],"Received":["from sin.lore.kernel.org (sin.lore.kernel.org\n [IPv6:2600:3c15:e001:75::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fqVpH65BGz1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 07 Apr 2026 12:41:59 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sin.lore.kernel.org (Postfix) with ESMTP id 8BA4E3007205\n\tfor <incoming@patchwork.ozlabs.org>; Tue,  7 Apr 2026 02:41:56 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 40C3134E779;\n\tTue,  7 Apr 2026 02:41:53 +0000 (UTC)","from ultrarisc.com (unknown [218.76.62.146])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 3C7124964F;\n\tTue,  7 Apr 2026 02:41:48 +0000 (UTC)","from [127.0.0.1] (unknown [192.168.100.1])\n\tby localhost.localdomain (Coremail) with SMTP id\n AQAAfwDXEELwbtRpBZsBAA--.862S6;\n\tTue, 07 Apr 2026 10:42:16 +0800 (CST)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775529713; cv=none;\n b=emwQ8XMsGOCUoVdiR0cBRB9tPMb91F2Q4Ugq8tCZlUevYbRuZ5A4OApg01GUr9OBP4EohgQI7u1KmlfqWMkRAj0LBOeo4ESAAI41A1a/b6O3Xe/6QIyLuQcm3MmyVa/l4cLZPDHAx2z9XbP2MPG9F4axQl4JQ8ZL5c3nQqmnmdM=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775529713; c=relaxed/simple;\n\tbh=7wH4CUVSABYbyxJiVvKBz9fZ4ImUCjDKwqKg5zvqdYo=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=tRE2ScukQHzYXuDd/cMsjCnS9RDUfaTo/UohOta7ZRWgcPD+oNxkhwQMsNrzwa08GPXt/3FuTNb8br2lxfmOERDKbyFxwSkmagfMUgD/q0R4b6qL0DWFsvZBzSF/rXYcaWSgMI0t7qJaRHUXAqufGsSQs/vKmOZDI6c3xGyeoRk=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=ultrarisc.com;\n spf=pass smtp.mailfrom=ultrarisc.com;\n dkim=pass (1024-bit key) header.d=ultrarisc.com header.i=@ultrarisc.com\n header.b=UhphyyQE; arc=none smtp.client-ip=218.76.62.146","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ultrarisc.com; s=dkim; h=Received:From:Date:Subject:\n\tMIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:\n\tReferences:In-Reply-To:To:Cc; bh=o1FGTaF3dcPMsxY42oExBawsES1XeSE\n\tiAjyQXxbaZuQ=; b=UhphyyQE78aFm89gACKrDQ3CssbuIvSn22hDsKFY0dLGeb7\n\tP+/QY4uxntZ+5tRZtlzD7CsTFndQOseWlDsgHuJRyWIgvgyq3kmp6zeJAZ3roOG2\n\to3pEgZ7jFyV5l7Gnqdadgre1M81SN+KdpAEOfpdIQ3nfl42P0EzfvpDwUvo0=","From":"Jia Wang <wangjia@ultrarisc.com>","Date":"Tue, 07 Apr 2026 10:40:55 +0800","Subject":"[PATCH v2 4/4] PCI: ultrarisc: Add UltraRISC DP1000 PCIe Root\n Complex driver","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260407-ultrarisc-pcie-v2-4-2aa2a19a7fb3@ultrarisc.com>","References":"<20260407-ultrarisc-pcie-v2-0-2aa2a19a7fb3@ultrarisc.com>","In-Reply-To":"<20260407-ultrarisc-pcie-v2-0-2aa2a19a7fb3@ultrarisc.com>","To":"Paul Walmsley <pjw@kernel.org>, Palmer Dabbelt <palmer@dabbelt.com>,\n  Albert Ou <aou@eecs.berkeley.edu>, Alexandre Ghiti <alex@ghiti.fr>,\n  Lorenzo Pieralisi <lpieralisi@kernel.org>, =?utf-8?q?Krzysztof_Wilczy?=\n\t=?utf-8?q?=C5=84ski?= <kwilczynski@kernel.org>,\n  Manivannan Sadhasivam <mani@kernel.org>, Rob Herring <robh@kernel.org>,\n  Bjorn Helgaas <bhelgaas@google.com>, Jingoo Han <jingoohan1@gmail.com>,\n  Xincheng Zhang <zhangxincheng@ultrarisc.com>,\n  Krzysztof Kozlowski <krzk+dt@kernel.org>,\n  Conor Dooley <conor+dt@kernel.org>","Cc":"linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,\n linux-pci@vger.kernel.org, devicetree@vger.kernel.org,\n Jia Wang <wangjia@ultrarisc.com>","X-Mailer":"b4 0.15-dev","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1775529665; l=8849;\n i=wangjia@ultrarisc.com; s=20260309; h=from:subject:message-id;\n bh=fs0I1ayH8Xs+O7/3QcQeWEBF1CQvjtgkc+Ct9VHp04Q=;\n b=sbTT0D/+mLIJccApso6Xb3AfVDXU4KLBdQbFlIWQGRIhls9mvqWWNVQV3oxskUDaTKbm1xjwk\n LRAlqul582aC3kOHLN+vRxI1fGQXGV3hllpKOWBlX1bI3e00zfyY/Mh","X-Developer-Key":"i=wangjia@ultrarisc.com; a=ed25519;\n pk=XvYkrelqJIIzobY7j+nIg8rsfv5kzaOzuc1UPhd087U=","X-CM-TRANSID":"AQAAfwDXEELwbtRpBZsBAA--.862S6","X-Coremail-Antispam":"1UD129KBjvJXoW3JFyktr43Xr45KryrGw1kuFg_yoWfAF1rpa\n\t15CFWFyF4UJF45uF4Skas5AF1aq3ZxurWUGFZFgw12g3ZIyryDXFyv9343tF97GF4jgry3\n\tK3Wjka4UGan8XwUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n\t9KBjDU0xBIdaVrnRJUUUQj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0\n\trVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI\n\tkIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2\n\tz4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr\n\t1UM28EF7xvwVC2z280aVAFwI0_Gr0_Cr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4UJVWx\n\tJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2I\n\tx0cI8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8\n\tJwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lFIxGxcIEc7CjxVA2Y2\n\tka0xkIwI1lc7CjxVAaw2AFwI0_GFv_Wrylc2xSY4AK6svPMxAIw28IcxkI7VAKI48JMxC2\n\t0s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI\n\t0_JrI_JrWlx4CE17CEb7AF67AKxVW8ZVWrXwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE\n\t14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWxJVW8Jr1lIxAIcVCF04k26cxKx2\n\tIYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_\n\tGr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0pRiF4iUUUUU=","X-CM-SenderInfo":"pzdqwylld63zxwud2x1vfou0bp/1tbiAQAKEWnTLbsAJgAAsQ"},"content":"From: Xincheng Zhang <zhangxincheng@ultrarisc.com>\n\nAdd DP1000 SoC PCIe Root Complex driver.\n\nSigned-off-by: Xincheng Zhang <zhangxincheng@ultrarisc.com>\nSigned-off-by: Jia Wang <wangjia@ultrarisc.com>\n---\n drivers/pci/controller/dwc/Kconfig           |  12 ++\n drivers/pci/controller/dwc/Makefile          |   1 +\n drivers/pci/controller/dwc/pcie-designware.h |  22 ++++\n drivers/pci/controller/dwc/pcie-ultrarisc.c  | 188 +++++++++++++++++++++++++++\n 4 files changed, 223 insertions(+)","diff":"diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig\nindex d0aa031397fa..06f7d98259cd 100644\n--- a/drivers/pci/controller/dwc/Kconfig\n+++ b/drivers/pci/controller/dwc/Kconfig\n@@ -548,4 +548,16 @@ config PCIE_VISCONTI_HOST\n \t  Say Y here if you want PCIe controller support on Toshiba Visconti SoC.\n \t  This driver supports TMPV7708 SoC.\n \n+config PCIE_ULTRARISC\n+\ttristate \"UltraRISC PCIe host controller\"\n+\tdepends on ARCH_ULTRARISC || COMPILE_TEST\n+\tselect PCIE_DW_HOST\n+\tselect PCI_MSI\n+\tdefault y if ARCH_ULTRARISC\n+\thelp\n+\t  Enables support for the PCIe controller in the UltraRISC SoC.\n+\t  This driver supports UR-DP1000 SoC.\n+\t  By default, this symbol is enabled when ARCH_ULTRARISC is active,\n+\t  requiring no further configuration on that platform.\n+\n endmenu\ndiff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile\nindex 67ba59c02038..884c46b78e01 100644\n--- a/drivers/pci/controller/dwc/Makefile\n+++ b/drivers/pci/controller/dwc/Makefile\n@@ -38,6 +38,7 @@ obj-$(CONFIG_PCIE_RCAR_GEN4) += pcie-rcar-gen4.o\n obj-$(CONFIG_PCIE_SPACEMIT_K1) += pcie-spacemit-k1.o\n obj-$(CONFIG_PCIE_STM32_HOST) += pcie-stm32.o\n obj-$(CONFIG_PCIE_STM32_EP) += pcie-stm32-ep.o\n+obj-$(CONFIG_PCIE_ULTRARISC) += pcie-ultrarisc.o\n \n # The following drivers are for devices that use the generic ACPI\n # pci_root.c driver but don't support standard ECAM config access.\ndiff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h\nindex ae6389dd9caa..88dcb0e7943a 100644\n--- a/drivers/pci/controller/dwc/pcie-designware.h\n+++ b/drivers/pci/controller/dwc/pcie-designware.h\n@@ -69,6 +69,8 @@\n \n /* Synopsys-specific PCIe configuration registers */\n #define PCIE_PORT_FORCE\t\t\t0x708\n+/* Bit[7:0] LINK_NUM: Link Number. Not used for endpoint */\n+#define PORT_LINK_NUM_MASK\t\tGENMASK(7, 0)\n #define PORT_FORCE_DO_DESKEW_FOR_SRIS\tBIT(23)\n \n #define PCIE_PORT_AFR\t\t\t0x70C\n@@ -96,6 +98,26 @@\n #define PCIE_PORT_LANE_SKEW\t\t0x714\n #define PORT_LANE_SKEW_INSERT_MASK\tGENMASK(23, 0)\n \n+/*\n+ * PCIE_TIMER_CTRL_MAX_FUNC_NUM: Timer Control and Max Function Number\n+ * Register.\n+ * This register holds the ack frequency, latency, replay, fast link\n+ * scaling timers, and max function number values.\n+ * Bit[30:29] FAST_LINK_SCALING_FACTOR: Fast Link Timer Scaling Factor.\n+ *   0x0 (SF_1024):Scaling Factor is 1024 (1ms is 1us).\n+ *     When the LTSSM is in Config or L12 Entry State, 1ms\n+ *     timer is 2us, 2ms timer is 4us and 3ms timer is 6us.\n+ *   0x1 (SF_256): Scaling Factor is 256 (1ms is 4us)\n+ *   0x2 (SF_64): Scaling Factor is 64 (1ms is 16us)\n+ *   0x3 (SF_16): Scaling Factor is 16 (1ms is 64us)\n+ */\n+#define PCIE_TIMER_CTRL_MAX_FUNC_NUM\t0x718\n+#define PORT_FLT_SF_MASK\tGENMASK(30, 29)\n+#define PORT_FLT_SF_VAL_1024\t0x0\n+#define PORT_FLT_SF_VAL_256\t0x1\n+#define PORT_FLT_SF_VAL_64\t0x2\n+#define PORT_FLT_SF_VAL_16\t0x3\n+\n #define PCIE_PORT_DEBUG0\t\t0x728\n #define PORT_LOGIC_LTSSM_STATE_MASK\t0x3f\n #define PORT_LOGIC_LTSSM_STATE_L0\t0x11\ndiff --git a/drivers/pci/controller/dwc/pcie-ultrarisc.c b/drivers/pci/controller/dwc/pcie-ultrarisc.c\nnew file mode 100644\nindex 000000000000..0da37efa8680\n--- /dev/null\n+++ b/drivers/pci/controller/dwc/pcie-ultrarisc.c\n@@ -0,0 +1,188 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * DWC PCIe RC driver for UltraRISC DP1000 SoC\n+ *\n+ * Copyright (C) 2026 UltraRISC Technology (Shanghai) Co., Ltd.\n+ */\n+\n+#include <linux/clk.h>\n+#include <linux/delay.h>\n+#include <linux/interrupt.h>\n+#include <linux/init.h>\n+#include <linux/kernel.h>\n+#include <linux/module.h>\n+#include <linux/of_device.h>\n+#include <linux/pci.h>\n+#include <linux/platform_device.h>\n+#include <linux/resource.h>\n+#include <linux/regmap.h>\n+#include <linux/types.h>\n+\n+#include \"pcie-designware.h\"\n+\n+#define PCIE_CUS_CORE          0x400000\n+\n+#define LTSSM_ENABLE           BIT(7)\n+#define FAST_LINK_MODE         BIT(12)\n+#define HOLD_PHY_RST           BIT(14)\n+#define L1SUB_DISABLE          BIT(15)\n+\n+struct ultrarisc_pcie {\n+\tstruct dw_pcie *pci;\n+\tu32 irq_mask[MAX_MSI_CTRLS];\n+};\n+\n+static struct pci_ops ultrarisc_pci_ops = {\n+\t.map_bus = dw_pcie_own_conf_map_bus,\n+\t.read = pci_generic_config_read32,\n+\t.write = pci_generic_config_write32,\n+};\n+\n+static int ultrarisc_pcie_host_init(struct dw_pcie_rp *pp)\n+{\n+\tstruct pci_host_bridge *bridge = pp->bridge;\n+\n+\tbridge->ops = &ultrarisc_pci_ops;\n+\n+\treturn 0;\n+}\n+\n+static void ultrarisc_pcie_pme_turn_off(struct dw_pcie_rp *pp)\n+{\n+\t/*\n+\t * DP1000 does not support sending PME_Turn_Off from the RC.\n+\t * Keep this callback empty to skip the generic MSG TLP path.\n+\t */\n+}\n+\n+static const struct dw_pcie_host_ops ultrarisc_pcie_host_ops = {\n+\t.init = ultrarisc_pcie_host_init,\n+\t.pme_turn_off = ultrarisc_pcie_pme_turn_off,\n+};\n+\n+static int ultrarisc_pcie_start_link(struct dw_pcie *pci)\n+{\n+\tu32 val;\n+\tu8 cap_exp;\n+\n+\tval = dw_pcie_readl_dbi(pci, PCIE_CUS_CORE);\n+\tval &= ~FAST_LINK_MODE;\n+\tdw_pcie_writel_dbi(pci, PCIE_CUS_CORE, val);\n+\n+\tval = dw_pcie_readl_dbi(pci, PCIE_TIMER_CTRL_MAX_FUNC_NUM);\n+\tFIELD_MODIFY(PORT_FLT_SF_MASK, &val, PORT_FLT_SF_VAL_64);\n+\tdw_pcie_writel_dbi(pci, PCIE_TIMER_CTRL_MAX_FUNC_NUM, val);\n+\n+\tcap_exp = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);\n+\tval = dw_pcie_readl_dbi(pci, cap_exp + PCI_EXP_LNKCTL2);\n+\tFIELD_MODIFY(PCI_EXP_LNKCTL2_TLS, &val, PCI_EXP_LNKCTL2_TLS_16_0GT);\n+\tdw_pcie_writel_dbi(pci, cap_exp + PCI_EXP_LNKCTL2, val);\n+\n+\tval = dw_pcie_readl_dbi(pci, PCIE_PORT_FORCE);\n+\tFIELD_MODIFY(PORT_LINK_NUM_MASK, &val, 0);\n+\tdw_pcie_writel_dbi(pci, PCIE_PORT_FORCE, val);\n+\n+\tval = dw_pcie_readl_dbi(pci, cap_exp + PCI_EXP_DEVCTL2);\n+\tFIELD_MODIFY(PCI_EXP_DEVCTL2_COMP_TIMEOUT, &val, 0x6);\n+\tdw_pcie_writel_dbi(pci, cap_exp + PCI_EXP_DEVCTL2, val);\n+\n+\tval = dw_pcie_readl_dbi(pci, PCIE_CUS_CORE);\n+\tval &= ~(HOLD_PHY_RST | L1SUB_DISABLE);\n+\tval |= LTSSM_ENABLE;\n+\tdw_pcie_writel_dbi(pci, PCIE_CUS_CORE, val);\n+\n+\treturn 0;\n+}\n+\n+static const struct dw_pcie_ops dw_pcie_ops = {\n+\t.start_link = ultrarisc_pcie_start_link,\n+};\n+\n+static int ultrarisc_pcie_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct ultrarisc_pcie *pcie;\n+\tstruct dw_pcie *pci;\n+\tstruct dw_pcie_rp *pp;\n+\tint ret;\n+\n+\tpcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);\n+\tif (!pcie)\n+\t\treturn -ENOMEM;\n+\n+\tpci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);\n+\tif (!pci)\n+\t\treturn -ENOMEM;\n+\n+\tpci->dev = dev;\n+\tpci->ops = &dw_pcie_ops;\n+\n+\t/* Set a default value suitable for at most 16 in and 16 out windows */\n+\tpci->atu_size = SZ_8K;\n+\n+\tpcie->pci = pci;\n+\n+\tpp = &pci->pp;\n+\n+\tplatform_set_drvdata(pdev, pcie);\n+\n+\tpp->irq = platform_get_irq(pdev, 1);\n+\tif (pp->irq < 0)\n+\t\treturn pp->irq;\n+\n+\tpp->num_vectors = MAX_MSI_IRQS;\n+\t/* No L2/L3 Ready indication is available on this platform. */\n+\tpp->skip_l23_ready = true;\n+\tpp->ops = &ultrarisc_pcie_host_ops;\n+\n+\tret = dw_pcie_host_init(pp);\n+\tif (ret) {\n+\t\tdev_err(dev, \"Failed to initialize host\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int ultrarisc_pcie_suspend_noirq(struct device *dev)\n+{\n+\tstruct ultrarisc_pcie *pcie = dev_get_drvdata(dev);\n+\tstruct dw_pcie *pci = pcie->pci;\n+\n+\treturn dw_pcie_suspend_noirq(pci);\n+}\n+\n+static int ultrarisc_pcie_resume_noirq(struct device *dev)\n+{\n+\tstruct ultrarisc_pcie *pcie = dev_get_drvdata(dev);\n+\tstruct dw_pcie *pci = pcie->pci;\n+\n+\treturn dw_pcie_resume_noirq(pci);\n+}\n+\n+static const struct dev_pm_ops ultrarisc_pcie_pm_ops = {\n+\tNOIRQ_SYSTEM_SLEEP_PM_OPS(ultrarisc_pcie_suspend_noirq,\n+\t\t\t\t  ultrarisc_pcie_resume_noirq)\n+};\n+\n+static const struct of_device_id ultrarisc_pcie_of_match[] = {\n+\t{\n+\t\t.compatible = \"ultrarisc,dp1000-pcie\",\n+\t},\n+\t{},\n+};\n+MODULE_DEVICE_TABLE(of, ultrarisc_pcie_of_match);\n+\n+static struct platform_driver ultrarisc_pcie_driver = {\n+\t.driver = {\n+\t\t.name\t= \"ultrarisc-pcie\",\n+\t\t.of_match_table = ultrarisc_pcie_of_match,\n+\t\t.suppress_bind_attrs = true,\n+\t\t.pm = &ultrarisc_pcie_pm_ops,\n+\t},\n+\t.probe = ultrarisc_pcie_probe,\n+};\n+module_platform_driver(ultrarisc_pcie_driver);\n+\n+MODULE_DESCRIPTION(\"UltraRISC DP1000 DWC PCIe host controller\");\n+MODULE_LICENSE(\"GPL\");\n","prefixes":["v2","4/4"]}