{"id":2223376,"url":"http://patchwork.ozlabs.org/api/patches/2223376/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/patch/20260415-ultrarisc-pcie-v3-3-73f06e972616@ultrarisc.com/","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/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,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260415-ultrarisc-pcie-v3-3-73f06e972616@ultrarisc.com>","list_archive_url":null,"date":"2026-04-15T07:21:19","name":"[v3,3/3] PCI: ultrarisc: Add UltraRISC DP1000 PCIe Root Complex driver","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"2ff7cce33adb5cdc9f721d09c02598fab25d804a","submitter":{"id":92886,"url":"http://patchwork.ozlabs.org/api/people/92886/?format=json","name":"Jia Wang","email":"wangjia@ultrarisc.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/20260415-ultrarisc-pcie-v3-3-73f06e972616@ultrarisc.com/mbox/","series":[{"id":499935,"url":"http://patchwork.ozlabs.org/api/series/499935/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/list/?series=499935","date":"2026-04-15T07:21:17","name":"riscv: Add PCIe support for UltraRISC DP1000 SoC","version":3,"mbox":"http://patchwork.ozlabs.org/series/499935/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2223376/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2223376/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <linux-pci+bounces-52532-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=dsb3TjNj;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-52532-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=\"dsb3TjNj\"","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=none smtp.mailfrom=ultrarisc.com"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fwXhv417Qz1yDF\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 17:24:47 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id E6A5530E7348\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 07:21:53 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id E0F9639A7E1;\n\tWed, 15 Apr 2026 07:21:51 +0000 (UTC)","from ultrarisc.com (unknown [218.76.62.146])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 728653A3E78;\n\tWed, 15 Apr 2026 07:21:48 +0000 (UTC)","from [127.0.0.1] (unknown [192.168.100.1])\n\tby localhost.localdomain (Coremail) with SMTP id\n AQAAfwAnYUKdPN9poSgCAA--.1324S5;\n\tWed, 15 Apr 2026 15:22:15 +0800 (CST)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776237711; cv=none;\n b=pgHoDH8EWpGs6/sOFC9v7GHlobfL2hEQhwzd6pg2JaBvKClgOFqrwwFxy2HtHMD49QHDsPmzzwaeYm13mprfNLu/ke/k/oRP+j3pcxv5Q58jic7hk7UanqxrrrvMsPp94UjUof7VwLuiiWBiV4D4Go/NWItgzZtI5sK+TzI4cTg=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776237711; c=relaxed/simple;\n\tbh=Df6Z0BC/fmcCgTmIaQKmJpeKdDfOcTPZf4FzR5Uuh8Y=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=UEkgQmCKddOiQfq5fh9e9/pSrd+zkda0Sdl/SrkGqEBCcFBEKMstPCTUAb84+cuJV5Z6m/8V/r0NO9AoTLtad7vMqP1vih9wCMmCwSTM81gdU0PdmlQD/skEdSSIc6e6B+/S+oMav0vmcTcLFwAxYrtxonKbSYkJCFVBY845tt8=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=ultrarisc.com;\n spf=none smtp.mailfrom=ultrarisc.com;\n dkim=pass (1024-bit key) header.d=ultrarisc.com header.i=@ultrarisc.com\n header.b=dsb3TjNj; 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=aAl20ajiw8N51DI4yylnwCBG45C9mJu\n\tXRKbkQeSIosU=; b=dsb3TjNjWiJcMUY3pnuc0fKFXfTlQm6xrMUAE89FaY9og9J\n\tNZr9KUBy8vkizKVjb6jfSJohEbscvjd/ILgaPfT/72/N6Ccfp9Clt8PEHBQm99q2\n\tOZnQ3I2I5Ox1P/yMLgXofpwdoBOkKv6CODDgJizXwLkBtcFgi8Qs3B7FNd5s=","From":"Jia Wang <wangjia@ultrarisc.com>","Date":"Wed, 15 Apr 2026 15:21:19 +0800","Subject":"[PATCH v3 3/3] 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":"<20260415-ultrarisc-pcie-v3-3-73f06e972616@ultrarisc.com>","References":"<20260415-ultrarisc-pcie-v3-0-73f06e972616@ultrarisc.com>","In-Reply-To":"<20260415-ultrarisc-pcie-v3-0-73f06e972616@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=1776237679; l=9299;\n i=wangjia@ultrarisc.com; s=20260309; h=from:subject:message-id;\n bh=ogV9+SfPCI2fWh594Lcx5NPt0KYv8PFn/JafQ/WgrSY=;\n b=AmpWM5ThgaEpmYpPz7KpGw7i18UCIVBcFIovm86cxZ76u8WHvKfH8uh7yWtAhBvZdQjz71/Bi\n PRSFW+B/Y+xDZXruVupls8SRwcAmdAYxt+gzp/xVejdnQg9RXGsVXfb","X-Developer-Key":"i=wangjia@ultrarisc.com; a=ed25519;\n pk=XvYkrelqJIIzobY7j+nIg8rsfv5kzaOzuc1UPhd087U=","X-CM-TRANSID":"AQAAfwAnYUKdPN9poSgCAA--.1324S5","X-Coremail-Antispam":"1UD129KBjvJXoW3JFyktr4fuF47Gry5JrWfuFg_yoWftr18pa\n\t15CFWFyF4UJF45uF4Skas5AF1aq3ZxurWUGFZFgw12g3ZIyryDXFyvg34ayFn7GF4jgry3\n\tKw1jya4UGan8XwUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n\t9KBjDU0xBIdaVrnRJUUUmC14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0\n\trVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2\n\tx26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0\n\tY4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UM2\n\t8EF7xvwVC2z280aVAFwI0_Gr0_Cr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4UJVWxJr1l\n\te2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI\n\t8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r4j6F4UMcvjeVCFs4IE7xkEbVWUJVW8JwAC\n\tjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lFIxGxcIEc7CjxVA2Y2ka0x\n\tkIwI1lc7CjxVAaw2AFwI0_GFv_Wrylc2xSY4AK6svPMxAIw28IcxkI7VAKI48JMxC20s02\n\t6xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_Jr\n\tI_JrWlx4CE17CEb7AF67AKxVW8ZVWrXwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v2\n\t6r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWxJVW8Jr1lIxAIcVCF04k26cxKx2IYs7\n\txG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_\n\tGr1UYxBIdaVFxhVjvjDU0xZFpf9x0pRQAwsUUUUU=","X-CM-SenderInfo":"pzdqwylld63zxwud2x1vfou0bp/1tbiAQASEWnfCz0AGAAAsa"},"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 MAINTAINERS                                  |   1 +\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  | 186 +++++++++++++++++++++++++++\n 5 files changed, 222 insertions(+)","diff":"diff --git a/MAINTAINERS b/MAINTAINERS\nindex 2ec02d8443dd..c8159670a14d 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -20588,6 +20588,7 @@ M:\tJia Wang <wangjia@ultrarisc.com>\n L:\tlinux-pci@vger.kernel.org\n S:\tMaintained\n F:\tDocumentation/devicetree/bindings/pci/ultrarisc,dp1000-pcie.yaml\n+F:\tdrivers/pci/controller/dwc/pcie-ultrarisc.c\n \n PCIE ENDPOINT DRIVER FOR QUALCOMM\n M:\tManivannan Sadhasivam <mani@kernel.org>\ndiff --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..7094ee8c532f\n--- /dev/null\n+++ b/drivers/pci/controller/dwc/pcie-ultrarisc.c\n@@ -0,0 +1,186 @@\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/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+};\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+\tpci->max_link_speed = 4;\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":["v3","3/3"]}