From nobody Sat Sep 26 19:35:30 2026 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11023143.outbound.protection.outlook.com [52.101.127.143]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A640870830; Wed, 2 Sep 2026 03:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.143 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319305; cv=fail; b=YdYO7bT+feJrSqSCytwQnkj+lJufEk3N4HyL/pcsUlN12W/Z9NwR9o4/kEYe03KePKPz+6TPqgG7nYDia+mxQ8XSKyICpY8l/ZII3rmNau6prhbe5KpzkFB9jpwbngTRaMpr+f8NTJIjMOmCy0HHneilRV1NdpBksJrsMiSbai4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319305; c=relaxed/simple; bh=hv+IrMUbkRdQmPk9mu0jDmITKr/DjC547ipVw+Lf8Yw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ol8N+Rl3ULgGjSWffc+yXpATW+fW/PYfkyzfap8MUqVGRkdl3eFO7E0S32JJm5aNoOLKqcUNixE8NIeKq4PwjM575lSU2neZMwqC/oo2zNSah/jS3CsjYKokoEku4KWpwVEvDCEjscNKgBnzcfiJGKD0cboL/g1DYlD9WMUsApc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.127.143 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wyc0XBrQBrchcMNAZSt+eutHOM4vp9/XqeN5YNvkwXOar/waNTvd4KCrg6zzLWHtSPtxGHqZtWBIhbr+uLdzcUrXl8DN9R2enXmahL7LxNU7p/hg5BqHpl48/taqZPX+ljIDPdE2h5KP74wfB79IhLzLTi4bR0qBIZ8W8Tumu2Eq7ArZc192whL5U4MyFHUC/cDYJ6or+wqbx3poC7jAyQCTv71rfZ9fa3rdOVcU7GFUkxRYYwxnaFwtVlSD7j/yc0HL5kHvQ0V5KPZ80Sfq8dpBkefRLI41mSEH5ZDuP0XwU82Yt4HhL8+RImnvFor+hr3rMPB2WGQqklJ13w3BOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=i8WtX0k4EqwDh/TgPkcMz1aEkAtxppzLjZYw7yZxlbs=; b=IUSRcPN2PG9K0EEDfnyT5o0uQd9o7tsMGxhzeRKO2MSpbpBm74ufgY1875KY6qiM9VpsUyeL5BYb9xxfDIj10aefeH5k0W9edkknI0Ku+jB2hIwkLQ7le6RByXnf0y+JAvMGEHi6MPEceHvMNt7uQizqE8u6AslxLdlPD40oeFxRwJFYOOZXNWFXd2fXMUn4loszpsw9YdwsnSJRqNyOdMgYXoD3Er6RDJps2Xv08U6uiqMFUYuGDTaZSy1xgcoUW5DwAMISPHcFh3Vo21AVpBlwo/HdjN2+LD8Dz7stEPvUKqphZwR1Kxa3jiTt86GuZcYG9/gc62/arMwIu5devw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from PS2PR03CA0006.apcprd03.prod.outlook.com (2603:1096:300:5b::18) by JH0PR06MB6740.apcprd06.prod.outlook.com (2603:1096:990:37::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 03:21:38 +0000 Received: from TY2PEPF0000AB87.apcprd03.prod.outlook.com (2603:1096:300:5b:cafe::95) by PS2PR03CA0006.outlook.office365.com (2603:1096:300:5b::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Wed, 2 Sep 2026 03:21:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by TY2PEPF0000AB87.mail.protection.outlook.com (10.167.253.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 03:21:37 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 8C47E4092106; Wed, 2 Sep 2026 11:21:35 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v2 1/5] dt-bindings: phy: Add CIX Sky1 USB3 PHY Date: Wed, 2 Sep 2026 11:21:30 +0800 Message-ID: <20260902032134.1182634-2-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PEPF0000AB87:EE_|JH0PR06MB6740:EE_ X-MS-Office365-Filtering-Correlation-Id: ac051b3f-0dc2-40db-a7df-08df08a14c54 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|36860700016|23010399003|82310400026|56012099006|10067099003|3023799007|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: Fe09M9LcpZEQUHsd1489xfEB0TndOQAeUSWJn9BQyU1RBFYnnPwR0UYCyu2sq28Cl8ymKrIXe9ZJzCso0Asd3T/60f0IpztNkA2wh7QNMSNTQyCgUEwmxlnvRaELxNI4LIBiKiO3ow01ID0VoLZB84BgUSV6GzYbMuNYgciT++E/qmX6npZKZ5zvOWw7+ZdVFP4bp6Z2AP28ctpwyl+1Ay8cQI7Ix4UZtp2ITx1UD2CGKmiPzcFMEniHPbTALB1ZYxpqS8XKGgxWqNnNYhKRWRChQbS1BSWCVfSEILUZ2Rq9qt+W12w1edeW/4gVkc+/8elrfRyBG+f+07YqANKOC4LMTOBEJ44tGdHhn+SxgyHXlw/twOk0W3xj5c1ws5LvXCRYWc3oldhGuTW/g/jYJHm7y+B31zRvPHmsan1nn/2cfxli/Fcv7SGdvyHLoq6cnWpTxU/Dj4JHEkfDNogds4FuwWJEULWM94Qi6exBCwEhQS+4fd5dBDeueck226Vdx5ATgyImXXubR88wVHNEJTxUe2/wz0rvWXl/dsnY6PTQ37a6U9UeLQ+i2cbWJRNWyjni6aVGU1ieggbbY25DkSW3p63UaXnTG+0lypvDqKmHhQy9R8bzfqIMP6LDFG1RouwXSNMGKaAjFpjp+bJajQ== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(36860700016)(23010399003)(82310400026)(56012099006)(10067099003)(3023799007)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: fkvGPCXzH2wZ6lMAeyi/0/GJYjDHHlvD46SoAfcWJHIWlOnvzeaOxdL3QsXDBiwCSgg0pUJLUtXnZo8biI8Xnq6SQflYzL7qzB4kteBlipq+s+1OJ6jch80pM8qJaTwE7jvfMmK2regw2X0KkNuPItHrxZQYAvmcjIyeH3+rgfMSURZu6kNEFnUaJN7M77pY+eUUbjHjKyo03ynJNf9nQRXjr7UMMfu2f9EsS9wxfIQ05Vwr0gVOBqJLI+UM4iMWpjVTbUCwL3+2qUSlUruCnk8JTKbCQLmBYisWESVXdeVho7cOfhdE5OKb83b0/yXItTBVXswiNb39IxGgILxLp/GzvGUsyiVf3irA5D629zdzj5P2Swi/POtNl8SCyO0g2oyB4I+Q6bUTr9z0/ZWWYToM1hIgx9RpKx9/TMSzLp3/xDHX/HLCjfvPOcbNCb+F X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 03:21:37.1229 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ac051b3f-0dc2-40db-a7df-08df08a14c54 X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: TY2PEPF0000AB87.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: JH0PR06MB6740 Content-Type: text/plain; charset="utf-8" Add device tree binding for the CIX Sky1 USB3 PHY, a multi-port SuperSpeedPlus PHY supporting up to two USB3 lanes. Signed-off-by: Hongliang Yang --- .../bindings/phy/cix,sky1-usb3-phy.yaml | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy= .yaml diff --git a/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml b= /Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml new file mode 100644 index 000000000000..5b025a48c844 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/cix,sky1-usb3-phy.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: CIX Sky1 USB3 PHY + +maintainers: + - Hongliang Yang + +description: + The CIX Sky1 USB3 PHY is a multi-port SuperSpeedPlus PHY that + supports up to two USB3 lanes. Each port is represented as a + child node of the PHY controller. + +properties: + compatible: + const: cix,sky1-usb3-phy + + reg: + maxItems: 1 + + clocks: + items: + - description: APB register interface clock + - description: PHY reference clock + + clock-names: + items: + - const: apb + - const: ref + + resets: + items: + - description: PHY reset + - description: PHY APB preset + + reset-names: + items: + - const: core + - const: apb + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + +patternProperties: + "^usb-port@[0-9a-f]+$": + type: object + description: + A single USB3 PHY port/lane. + + properties: + reg: + maxItems: 1 + + "#phy-cells": + const: 0 + + required: + - reg + - "#phy-cells" + + additionalProperties: false + +required: + - compatible + - reg + - clocks + - clock-names + - resets + - reset-names + - "#address-cells" + - "#size-cells" + +additionalProperties: false + +examples: + - | + #include + #include + + usb-phy@9210000 { + compatible =3D "cix,sky1-usb3-phy"; + reg =3D <0x9210000 0x40000>; + #address-cells =3D <1>; + clocks =3D <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>, + <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>; + clock-names =3D "apb", "ref"; + resets =3D <&s5_syscon SKY1_USBPHY_SS_RST_N>, + <&s5_syscon SKY1_USBPHY_SS_PST_N>; + reset-names =3D "core", "apb"; + #size-cells =3D <0>; + + usb-port@0 { + reg =3D <0>; + #phy-cells =3D <0>; + }; + + usb-port@1 { + reg =3D <1>; + #phy-cells =3D <0>; + }; + }; --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022093.outbound.protection.outlook.com [40.107.75.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4ECCC3515E9; Mon, 31 Aug 2026 08:23:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.93 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164602; cv=fail; b=Hh20w9ItIi+LM/jd6KllvStaBKygvN4bS1889w1YDWaZt2tDt1UBsfKgF2ko+xTH1J9nke8bKBRfme6MOOAsrA9vHbzmi9dEkCOZI3Gg/+UmVvH0nybPJev9KhL2ssdw4NJRoyziKTfuHErVVeEVe1Dy03q4cG69RsYbyXnNLMM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164602; c=relaxed/simple; bh=TmWd8KFS7tjGmtP/zSJ77ijkBnQjTGG+d8IhujhpkBA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tJKfLfYKqayX1TOPSVnBVT5iu+ctT1k+NCGLrPYqtf0zgTn/SpO/9jhhtMR/gbpAVXxFno3Zn04ozQq38BzOz8aQMaRDuAV2mfUHChhBJSuta8pEzN/IJCRfynCQSmK/ho+rC7iSJZGI2iQCpR1x0gYLA46qVWyvo5Lyi1OcbRg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=40.107.75.93 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IRoFD+l/dAVVzCGqNZghDrYyMcpd+DJqwpdQSm5JJudb4o0Q2ShQ09u9VFZ9oljtdYqcW4+TlHr21eTk7sfFGpd6+v9SNF3k9vovgVyMsbiazxgvIt7U0r3TaBekD0S0d/qhMs1H8G0/hSnwQrn7Owl3BJzenMlkMSFUyWJQYOIW3j01+dZ4XxcloaGdFjmLsyBERKUR3hFyfd+sN5IwOmPw00CLpwQufff0TOJk98MYJYnIiIXfRdfPhN2edsqSRGTZ7hYySXCNgm2spfuWE59DqUxeYnoGyHJBSbRrajh17vOfV9M//3T31sMJy50XF+jevi5v54uG1d1r54hXXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=B55+arUK3YkHN/MAPMahJGjzFPVfakFNLdAKRzFm5XY=; b=CURrQzS72Ckd8Jfg+WUXcI0yFcBUo0sQQW1CIrsIOFK+0HKpHBJx9J97+wzo7Ccb67ZKz0EX2WFAwudWfU7aEO8LE43giD6GixHDSY4HzSoITbiN1YKFOX/dRhVft2LV76tP+eNnpdfSQPBcloh1kNA+f+TSNDRLPJkMnLVh/Yslyjc0YFWIy35BIHwVMPNvyxJUK+UEpYectjo+lwakIYPaHx56gxTz3dZPdaje3WP5wmtNiRczQxIqMIO0SuMJ/07R0ds9n0cX9pSOyu1da4HXYK4D4F7Q0ZqPefqPLMdkIrZ3HtAlFkVKEJl0DWtW0MVlORFxM7GwpSyKU7yWJw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from JH0PR04CA0011.apcprd04.prod.outlook.com (2603:1096:990:4::8) by KUYPR06MB9205.apcprd06.prod.outlook.com (2603:1096:d10:8f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 08:23:12 +0000 Received: from SG2PEPF000B66C9.apcprd03.prod.outlook.com (2603:1096:990:4:cafe::44) by JH0PR04CA0011.outlook.office365.com (2603:1096:990:4::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 08:23:12 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by SG2PEPF000B66C9.mail.protection.outlook.com (10.167.240.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 08:23:11 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 2B3A84092109; Mon, 31 Aug 2026 16:23:10 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v1 1/4] dt-bindings: Add CIX Sky1 USB bindings Date: Mon, 31 Aug 2026 16:23:05 +0800 Message-ID: <20260831082309.3854507-2-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SG2PEPF000B66C9:EE_|KUYPR06MB9205:EE_ X-MS-Office365-Filtering-Correlation-Id: 33fb1285-9594-450d-775e-08df0739189b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|1800799024|82310400026|7416014|23010399003|6133799003|10067099003|56012099006|22082099003|18002099003|13003099007|3023799007; X-Microsoft-Antispam-Message-Info: /kiRrZf6+DlR4cFjjgduupO2rntpJKkadYFuNkUrqz57F3/gZJNVipvF/bvzmQxWmDZcF99mB7+VrzJD9gr4AYr5jMndnJbo0ureiaW1qprXcL7llLy/63rszh56wHOyIhm9MODPSOPlSOg1sMJTxwhwEDC0u1CE1bJDyeEL0eunYWETZC44f/PzHQ53Q5bYWTld+BQ0v2L/55V0ODcGteoX8K8EJTvtBx1mDeztyE8lvTNTFFlKJdevAVbnK8xOXtdF34wt25Rz4HNWQyFhBT6l7RkhHgUHprHQgyJtvdWh+Zu9VcFWLLZRgLXBtDwo8W3QO5TCegaH2dtYlA8WFxs8/srCOeFwlrgbfPKngbOCnHvYzh3ILPWbYIXvlxVAM1XzW9gnJNJN2+ARMsbZZi1a618mOlcIwgB/cBCYQmF2M4WluYaDYeV5aGHkB+QGCX3GjibQCW7yEPZ8j5OxcjsYcpD2WX28i97LDxcvzBy/hGkFrUgd9nZ02fMEgt/na6pXt3VQ5uDRfHq+3CSg/9sG5pISnbFEKwJrOlc5jprfLtnm992McxOSwCFIkO1ypG7GA/P4fDb9iMI3d0Sxba7bjBd2ThsoulfwOgxB4mEed5m0k4GNJtJMQN6BcertKU0c5hOJM2Wj+DF67V6H/Q== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(376014)(1800799024)(82310400026)(7416014)(23010399003)(6133799003)(10067099003)(56012099006)(22082099003)(18002099003)(13003099007)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4y84oh43pa+ozhPbEf0Cq3BW3OW6KpGGOuI5a1GnV/x/oxi9EHCfIJ6IV7fdkQsgZnD+HuAZqcGGXnHoaubZZzYJOtZH6uigEjFK/M7aoOz+yhAQ6XNBiGQWtO5YM4Ya9nu7+oOd4fuf9j2iwI4iq4S4WExDnBqaFE7/wwBy6A+01IAh1O6D/bxkUsq3DRHttho/m1+V+DDPNhu1xLXu39elrnp4XGHd0hFeBWg7oRGxTpkp/Gchj4fpOxjpK7RVldpA7IHglZrulC9quEGlIiYc5NqE2P2DBQFTNP0oF10UNnYNcSr4KArGregIWwF9o8khvLUepFCNl+XkRIkB7NxF+To0x/f/jgRgfgOuEvFQHF7OClxayzjG1BBs1acpp7tgYsBdCLc/7YpZSDOpr7Hk7UZ7+O9shWPJF6gjr54+oOMbb9GR6TUwJKrdug0G X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 08:23:11.4963 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 33fb1285-9594-450d-775e-08df0739189b X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: SG2PEPF000B66C9.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: KUYPR06MB9205 Content-Type: text/plain; charset="utf-8" Add device tree bindings for CIX Sky1 USB3 PHY and Cadence USBSSP controller glue layer. Signed-off-by: Hongliang Yang --- .../bindings/phy/cix,sky1-usb3-phy.yaml | 109 +++++++++++++ .../bindings/usb/cix,sky1-usbssp.yaml | 153 ++++++++++++++++++ MAINTAINERS | 3 + 3 files changed, 265 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy= .yaml create mode 100644 Documentation/devicetree/bindings/usb/cix,sky1-usbssp.y= aml diff --git a/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml b= /Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml new file mode 100644 index 000000000000..76d020df72dd --- /dev/null +++ b/Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/cix,sky1-usb3-phy.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: CIX Sky1 USB3 PHY + +maintainers: + - Hongliang Yang + +description: + The CIX Sky1 USB3 PHY is a multi-port SuperSpeedPlus PHY that + supports up to two USB3 lanes. Each port is represented as a + child node of the PHY controller. + +properties: + compatible: + const: cix,sky1-usb3-phy + + reg: + maxItems: 1 + + clocks: + items: + - description: APB register interface clock + - description: PHY reference clock + + clock-names: + items: + - const: apb_clk + - const: ref_clk + + resets: + items: + - description: PHY reset + - description: PHY APB preset + + reset-names: + items: + - const: reset + - const: preset + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + +patternProperties: + "^usb-port@[0-9a-f]+$": + type: object + description: + A single USB3 PHY port/lane. + + properties: + reg: + maxItems: 1 + + "#phy-cells": + const: 0 + + required: + - reg + - "#phy-cells" + + additionalProperties: false + +required: + - compatible + - reg + - clocks + - clock-names + - resets + - reset-names + - "#address-cells" + - "#size-cells" + +unevaluatedProperties: false + +examples: + - | + #include + #include + + usb-phy@9210000 { + compatible =3D "cix,sky1-usb3-phy"; + reg =3D <0x09210000 0x40000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + + resets =3D <&s5_syscon SKY1_USBPHY_SS_RST_N>, + <&s5_syscon SKY1_USBPHY_SS_PST_N>; + reset-names =3D "reset", "preset"; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>, + <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>; + clock-names =3D "apb_clk", "ref_clk"; + + usb-port@0 { + reg =3D <0>; + #phy-cells =3D <0>; + }; + + usb-port@1 { + reg =3D <1>; + #phy-cells =3D <0>; + }; + }; diff --git a/Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml b/D= ocumentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml new file mode 100644 index 000000000000..47202ff5b9e5 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml @@ -0,0 +1,153 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/usb/cix,sky1-usbssp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: CIX Sky1 Cadence USBSSP Controller + +maintainers: + - Hongliang Yang + +description: + The CIX Sky1 USBSSP controller is based on the Cadence USBSSP DRD + controller. The integration adds glue registers and mode strap controls + in the Sky1 S5 system controller. The CIX glue node wraps a Cadence + USBSSP core as a child node. + +properties: + compatible: + const: cix,sky1-usbssp + + reg: + items: + - description: AXI property configuration register + - description: Controller status register + + reg-names: + items: + - const: axi_property + - const: controller_status + + clocks: + items: + - description: Start-of-frame clock + - description: AXI bus clock + - description: Low-power mode clock + - description: APB register interface clock + + clock-names: + items: + - const: sof_clk + - const: usb_aclk + - const: lpm_clk + - const: usb_pclk + + resets: + items: + - description: APB register reset + - description: Controller reset + + reset-names: + items: + - const: usb_preset + - const: usb_reset + + cix,usb_syscon: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to the Sky1 S5 system controller used to program USB mode + strap controls. + + axi_bmax_value: + $ref: /schemas/types.yaml#/definitions/uint32 + default: 0x7 + description: + AXI bus maximum burst length configuration value. + + "#address-cells": + const: 2 + + "#size-cells": + const: 2 + + ranges: true + +patternProperties: + "^usb-controller@[0-9a-f]+$": + $ref: cdns,usb3.yaml# + description: + The Cadence USBSSP core controller node. See cdns,usb3.yaml + for properties such as dr_mode, maximum-speed, phys, and interrupts. + unevaluatedProperties: false + +required: + - compatible + - reg + - reg-names + - clocks + - clock-names + - resets + - reset-names + - cix,usb_syscon + - "#address-cells" + - "#size-cells" + - ranges + +unevaluatedProperties: false + +examples: + - | + #include + #include + #include + + soc { + #address-cells =3D <2>; + #size-cells =3D <2>; + + usb@91c0300 { + compatible =3D "cix,sky1-usbssp"; + #address-cells =3D <2>; + #size-cells =3D <2>; + ranges; + + reg =3D <0x00 0x091c0314 0x00 0x4>, + <0x00 0x091c0400 0x00 0x4>; + reg-names =3D "axi_property", "controller_status"; + + resets =3D <&src SKY1_USBC_SS2_PRST_N>, + <&src SKY1_USBC_SS2_RST_N>; + reset-names =3D "usb_preset", "usb_reset"; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_H0_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_0_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H0_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_0_APB_GATE>; + clock-names =3D "sof_clk", "usb_aclk", "lpm_clk", "usb_pclk"; + + cix,usb_syscon =3D <&src>; + axi_bmax_value =3D <0x7>; + + usb-controller@91d0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91d0000 0x00 0x4000>, + <0x00 0x91d8000 0x00 0x8000>, + <0x00 0x91d4000 0x00 0x4000>; + reg-names =3D "otg", "xhci", "dev"; + + interrupts =3D , + , + , + ; + interrupt-names =3D "host", "peripheral", "otg", "wakeup"; + + /* Cadence USBSSP core properties - see cdns,usb3.yaml */ + maximum-speed =3D "super-speed-plus"; + dr_mode =3D "otg"; + + phys =3D <&usb3_phy4_0>, <&usb2_phy6>; + phy-names =3D "cdns3,usb3-phy", "cdns3,usb2-phy"; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 15011f5752a9..4c5f6cbe9124 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2775,8 +2775,11 @@ S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/cix.git F: Documentation/devicetree/bindings/arm/cix.yaml F: Documentation/devicetree/bindings/mailbox/cix,sky1-mbox.yaml +F: Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml +F: Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml F: arch/arm64/boot/dts/cix/ F: drivers/mailbox/cix-mailbox.c +F: drivers/phy/cix/ K: \bcix\b =20 ARM/CLKDEV SUPPORT --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022115.outbound.protection.outlook.com [40.107.75.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F23BA3AD52A; Mon, 31 Aug 2026 08:23:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.115 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164599; cv=fail; b=aq9TxN9Du0SXsdqi427E7Z/ZTdQFLARXHvyEH9R97m6PzSOfffEXvzzWK7ERUJB093b9iCLIeZIoOuZ+KqUD+UssjBAL9MU/R+M5aM/B0WFs6/0VzNvJFoSLqAWBJKqk8dNfhKdxb80cwasqrV+B/rsTcWgHk6SX2i1U5SnVG1I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164599; c=relaxed/simple; bh=2WCqszCGVenwaG7ni4InTSeU4GQxPSgDrQ/urVzWSgA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sI0JPh3YsEMH3/3BJR4ucs2TXECzCmpTwWLoE6JXa23ZJVNKlYPCAD394vUVr/uueufoZRz1B7L5f/6H/L1mKy3cJFeiNPXRToO5OCD+7FXfs5NAi4OoxC/4FDIb/ERFniRgP9q+Sc6dKYONFfbfI2vktzos4b1s0Y+DMzNbz+w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=40.107.75.115 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WQlD/7Jt8HYjvyhwjPxh9CS6qh+z2/rEoGpME4PY54IqEbpF4+xKAt5GFgL3kefjsT29u9SSxUNgADOg9/NS5gqMcH369Qd3NAO4+ciop9AbBWpDuAWAj0AsDrPG5uxAPMvnjxMlvo1vDFIhj4jjcCLj39Qmz31VAQH6Y90bCoW7KlYCDjVfD8htmraWeUu/QLYbxK3RuoS6zqigyMIqF/FCWv40GE68Ek+pJDZ1+DmXoMWG7p2PydxtQ03RvmcB3f1+0WPUhKCtWe61SZp/9+Jj3qYPxR6SQv30n5KAkPU6/l8z8HF3KEZyuvOa6/Ceh7+4JVLGjizg/+6HUUiQvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sz98qGDHdt+Kfk45+bX2G+9NmhJKPs97mujp3xADqjo=; b=GYz+Mu9MTnyFBxOmRlOHLXKLpZGhtx4QKnbXJLyPPCuzMPIlLa5tLf9BCxoStgSDqEdygBpnbfHHqFOPSHwyjzVEpWEekV9fy7bhkTO4kiJLAX0sSF9kowxUTU6JCuKAcKDo40Ckp3E91o2rm8CWk2wcPOkicdfhfP/FAxVpeTacOpFBS2rTyflrCXyIT9Rx7Dy7OdJzVoNEecfEcZ0/v4iBDysNu0mEcWdONY++Aqbq6g++UHDdl+TaTBkPMmjaAYt4lu4h1VjX8rqCzOxSoKygE4bZWkdWJj52qXjAtFfdjkJQHlmN6ItmcnwJDLT4EvUXb6szLW1jXmMuD8OItw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SG2P153CA0030.APCP153.PROD.OUTLOOK.COM (2603:1096:4:c7::17) by PS1PPFFB12092EB.apcprd06.prod.outlook.com (2603:1096:308::271) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 08:23:13 +0000 Received: from SG2PEPF000B66CD.apcprd03.prod.outlook.com (2603:1096:4:c7:cafe::55) by SG2P153CA0030.outlook.office365.com (2603:1096:4:c7::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Mon, 31 Aug 2026 08:23:13 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by SG2PEPF000B66CD.mail.protection.outlook.com (10.167.240.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 08:23:12 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id B6685409210B; Mon, 31 Aug 2026 16:23:10 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang , Gary Yang Subject: [PATCH v1 2/4] phy: cix: Add CIX Sky1 USB3 PHY driver Date: Mon, 31 Aug 2026 16:23:06 +0800 Message-ID: <20260831082309.3854507-3-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SG2PEPF000B66CD:EE_|PS1PPFFB12092EB:EE_ X-MS-Office365-Filtering-Correlation-Id: 5a2e3afc-2453-4607-36b3-08df0739190b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|23010399003|7416014|1800799024|82310400026|36860700016|10067099003|56012099006|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: 3ZMO5MUvaGJqhcUxFc0pVJc4T5ls44wV9L4zI0yDzPmcAKlCeSGs39OXhuu0agPSFy/Zysqn2FaBcR2kfCSBoPZ55jEszFJPwLjn/UyS+ryR90/O6hN6MTM7O1oEcIP0h+CGyIYZM4UYx0xrApaXnRuGwdobB9pISAJIKUfoC8EVw2HzpXuk84CgJcMgmFRMEvWlKIuC/j/Kiq6MT4rKwUm6Cz/IQe1HlSXtPSlPYH11UB5JzgeCIQnual/p09LMWKhOrGTjGNk2Qo3CSTZyK3ZWg4BT/VX1HnZYTClFtiuNmG5CT0vg7vYU+Mu9KROPpvN3OSK+kAEDHHbkdhqUtwHDhHjhHRHurk+RcYJOq62gwcjLY0DDByo4JH6Z4ha/CMhC8yW0DUpjYeyFzuksNyynHuGqbTuV5hsf4a5nhMskiWai1G7UUjNvSmyXUvKY8RcWlTJoEMSe3pO1mzcXKl4TbKZKEAVRINZLNcf3D2Kbc9cCOsBLHj1Q5a9udEd9iNWJ+oIpxLjqEjZQnvVuhYVVMvdvLJLtPxztBrP6xKL05lBGu/EnRMt/yjASQauK/etfi7jLGtthVmnQFYuSqRtiznyORH2ipvKab4Wc1rQoV49x27Xzgrvnzr91m+aA7HBmHAt65ivn0jer3SujbPI9QLMSDKs/z/x8HOCyhkSh9Cz+n6hKpYyr7qhJiFWGmLG6WTLFxQ6FYNOqwubvGA== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(23010399003)(7416014)(1800799024)(82310400026)(36860700016)(10067099003)(56012099006)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: W+ZBQrM/WrRNKj4+Z850fX7uAM6VWH6k6MJY6z6k8S5sB8v+152IsmF07ZjVuc/ENfhCijVKuj6S2bP0EJ+txd7bgxhCDGrpthb9z5Wc1nxFGmZ4eyHJLHcfIGZ5BdLGbCrdHL9mYsshD2yWCjFi0gl7pucdeeeL0PkLV+SSZ32jGHpE9LxczYQRSTtfjPJJVo/RaPjAI0PtM+xi71rJ3zun8Sjo//VW/mC4TjDfpw9ImGoyXL4Jme+3fyxjt9YUxJIqj59WRPn5XbwfavCuRaNbMs53Hygh1f82cMsmlvMWHpFOL5bNe04fipFzbi+XTz95GfPbVtEmCRHHt0IHEE0CUwU9rVfdbtSFZ7hMypTjvm7IpZ4AkSzeSFvpNg7l35jUqVDEHMUX+89s9yWuR7TfRSmGHL3K2WAkk3spEdVjgu6rqJEOfuNMYd3F9Hpz X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 08:23:12.2014 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5a2e3afc-2453-4607-36b3-08df0739190b X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: SG2PEPF000B66CD.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PS1PPFFB12092EB Content-Type: text/plain; charset="utf-8" Add PHY driver for the USB3 PHY found on CIX Sky1 SoCs. This driver handles PHY initialization, reset, and clock management for the multi-port USB3 PHY. Signed-off-by: Hongliang Yang Reviewed-by: Gary Yang --- drivers/phy/Kconfig | 1 + drivers/phy/Makefile | 1 + drivers/phy/cix/Kconfig | 20 ++ drivers/phy/cix/Makefile | 6 + drivers/phy/cix/phy-cix-usb3.c | 410 ++++++++++++++++++++++++++++++++ drivers/phy/cix/phy-cix-usbdp.h | 310 ++++++++++++++++++++++++ 6 files changed, 748 insertions(+) create mode 100644 drivers/phy/cix/Kconfig create mode 100644 drivers/phy/cix/Makefile create mode 100644 drivers/phy/cix/phy-cix-usb3.c create mode 100644 drivers/phy/cix/phy-cix-usbdp.h diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 19f3b7d12b7d..cb0d4be47628 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -175,6 +175,7 @@ source "drivers/phy/axiado/Kconfig" source "drivers/phy/broadcom/Kconfig" source "drivers/phy/cadence/Kconfig" source "drivers/phy/canaan/Kconfig" +source "drivers/phy/cix/Kconfig" source "drivers/phy/eswin/Kconfig" source "drivers/phy/freescale/Kconfig" source "drivers/phy/hisilicon/Kconfig" diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index d7aa516bcc49..6fd0f3910018 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_GENERIC_PHY) +=3D allwinner/ \ broadcom/ \ cadence/ \ canaan/ \ + cix/ \ eswin/ \ freescale/ \ hisilicon/ \ diff --git a/drivers/phy/cix/Kconfig b/drivers/phy/cix/Kconfig new file mode 100644 index 000000000000..aaa2eb9d4552 --- /dev/null +++ b/drivers/phy/cix/Kconfig @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Phy drivers for Cix PHYs +# + +if ARCH_CIX || COMPILE_TEST + +config PHY_CIX_USB3 + tristate "Cix USB3 PHY Driver" + depends on OF && HAS_IOMEM + select GENERIC_PHY + help + Enable this to support the CIX USB3 PHY for TYPEA Connection. + + This driver provides initialization and power management for + the USB3 PHY found on CIX Sky1 SoCs. + + If unsure, say N. + +endif # ARCH_CIX || COMPILE_TEST diff --git a/drivers/phy/cix/Makefile b/drivers/phy/cix/Makefile new file mode 100644 index 000000000000..b46b1059b2ab --- /dev/null +++ b/drivers/phy/cix/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the Cix phy drivers. +# + +obj-$(CONFIG_PHY_CIX_USB3) +=3D phy-cix-usb3.o diff --git a/drivers/phy/cix/phy-cix-usb3.c b/drivers/phy/cix/phy-cix-usb3.c new file mode 100644 index 000000000000..3b6e2669b09d --- /dev/null +++ b/drivers/phy/cix/phy-cix-usb3.c @@ -0,0 +1,410 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * phy driver for cdn_sd0803_t7g_typea + * + * Author: Hongliang Yang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "phy-cix-usbdp.h" + +struct cix_u3phy; + +struct cix_u3phy_cfg { + int (*u3phy_init)(struct cix_u3phy *u3phy); + int (*u3phy_exit)(struct cix_u3phy *u3phy); +}; + +static const struct reg_sequence sky1_u3phy_conf[] =3D { + {CMN_SSM_BIAS_TMR, 0x0018}, + {CMN_PLLSM0_PLLPRE_TMR, 0x0030}, + {CMN_PLLSM0_PLLLOCK_TMR, 0x00f0}, + {CMN_PLLSM1_PLLPRE_TMR, 0x0030}, + {CMN_PLLSM1_PLLLOCK_TMR, 0x00f0}, + {CMN_BGCAL_INIT_TMR, 0x0078}, + {CMN_BGCAL_ITER_TMR, 0x0078}, + {CMN_IBCAL_INIT_TMR, 0x0018}, + {CMN_TXPUCAL_INIT_TMR, 0x001d}, + {CMN_TXPDCAL_INIT_TMR, 0x001d}, + {CMN_RXCAL_INIT_TMR, 0x02d0}, + {CMN_SD_CAL_PLLCNT_START, 0x0137}, + {RX_SDCAL0_INIT_TMR_LANE0, 0x0018}, + {RX_SDCAL0_INIT_TMR_LANE1, 0x0018}, + {RX_SDCAL0_ITER_TMR_LANE0, 0x0078}, + {RX_SDCAL0_ITER_TMR_LANE1, 0x0078}, + {RX_SDCAL1_INIT_TMR_LANE0, 0x0018}, + {RX_SDCAL1_INIT_TMR_LANE1, 0x0018}, + {RX_SDCAL1_ITER_TMR_LANE0, 0x0078}, + {RX_SDCAL1_ITER_TMR_LANE1, 0x0078}, + {TX_RCVDET_ST_TMR_LANE0, 0x0960}, + {TX_RCVDET_ST_TMR_LANE1, 0x0960}, + + {PHY_PLL_CFG_0803, 0x0000}, + {CMN_PDIAG_PLL0_CLK_SEL_M0, 0x8600}, + {XCVR_DIAG_HSCLK_SEL_LANE0, 0x0000}, + {XCVR_DIAG_HSCLK_SEL_LANE1, 0x0000}, + {XCVR_DIAG_HSCLK_DIV_LANE0, 0x0001}, + {XCVR_DIAG_HSCLK_DIV_LANE1, 0x0001}, + {XCVR_DIAG_PLLDRC_CTRL_LANE0, 0x0041}, + {XCVR_DIAG_PLLDRC_CTRL_LANE1, 0x0041}, + {CMN_PLL0_DSM_DIAG_M0, 0x0004}, + {CMN_PLL1_DSM_DIAG_M0, 0x0004}, + {CMN_PDIAG_PLL1_ITRIM_M0, 0x003f}, + {CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0b17}, + {CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0b17}, + {CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0e01}, + {CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0e01}, + {CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0d05}, + {CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0d05}, + {CMN_PLL0_INTDIV_M0, 0x01a0}, + {CMN_PLL1_INTDIV_M0, 0x01a0}, + {CMN_PLL0_FRACDIVL_M0, 0xaaab}, + {CMN_PLL1_FRACDIVL_M0, 0xaaab}, + {CMN_PLL0_FRACDIVH_M0, 0x0002}, + {CMN_PLL1_FRACDIVH_M0, 0x0002}, + {CMN_PLL0_HIGH_THR_M0, 0x0116}, + {CMN_PLL1_HIGH_THR_M0, 0x0116}, + {CMN_PDIAG_PLL0_CTRL_M0, 0x1002}, + {CMN_PDIAG_PLL1_CTRL_M0, 0x1002}, + {CMN_PLL0_SS_CTRL1_M0, 0x0001}, /* SSC enabled */ + {CMN_PLL0_VCOCAL_INIT_TMR, 0x00f0}, + {CMN_PLL1_VCOCAL_INIT_TMR, 0x00f0}, + {CMN_PLL0_VCOCAL_ITER_TMR, 0x0004}, + {CMN_PLL1_VCOCAL_ITER_TMR, 0x0004}, + {CMN_PLL0_VCOCAL_REFTIM_START, 0x02f8}, + {CMN_PLL1_VCOCAL_REFTIM_START, 0x02f8}, + {CMN_PLL0_VCOCAL_PLLCNT_START, 0x02f8}, + {CMN_PLL1_VCOCAL_PLLCNT_START, 0x02f8}, + {CMN_PLL0_VCOCAL_TCTRL, 0x0003}, + {CMN_PLL1_VCOCAL_TCTRL, 0x0003}, + {CMN_PLL0_LOCK_REFCNT_START, 0x00bf}, + {CMN_PLL1_LOCK_REFCNT_START, 0x00bf}, + {CMN_PLL0_LOCK_PLLCNT_START, 0x00bf}, + {CMN_PLL1_LOCK_PLLCNT_START, 0x00bf}, + {CMN_PLL0_LOCK_PLLCNT_THR, 0x0003}, + {CMN_PLL1_LOCK_PLLCNT_THR, 0x0003}, + {PHY_PIPE_USB3_GEN2_PRE_CFG0_0803, 0x0a0a}, + {PHY_PIPE_USB3_GEN2_POST_CFG0_0803, 0x1000}, + {PHY_PIPE_USB3_GEN2_POST_CFG1_0803, 0x0010}, + {CMN_CDIAG_CDB_PWRI_OVRD, 0x8200}, + {CMN_CDIAG_XCVRC_PWRI_OVRD, 0x8200}, + {TX_PSC_A0_LANE0, 0x02ff}, + {TX_PSC_A0_LANE1, 0x02ff}, + {TX_PSC_A1_LANE0, 0x06af}, + {TX_PSC_A1_LANE1, 0x06af}, + {TX_PSC_A2_LANE0, 0x06ae}, + {TX_PSC_A2_LANE1, 0x06ae}, + {TX_PSC_A3_LANE0, 0x06ae}, + {TX_PSC_A3_LANE1, 0x06ae}, + {RX_PSC_A0_LANE0, 0x0d1d}, + {RX_PSC_A0_LANE1, 0x0d1d}, + {RX_PSC_A1_LANE0, 0x0d1d}, + {RX_PSC_A1_LANE1, 0x0d1d}, + {RX_PSC_A2_LANE0, 0x0d00}, + {RX_PSC_A2_LANE1, 0x0d00}, + {RX_PSC_A3_LANE0, 0x0500}, + {RX_PSC_A3_LANE1, 0x0500}, + {TX_TXCC_CTRL_LANE0, 0x2a82}, + {TX_TXCC_CTRL_LANE1, 0x2a82}, + {TX_TXCC_CPOST_MULT_01_LANE0, 0x0014}, + {TX_TXCC_CPOST_MULT_01_LANE1, 0x0014}, + {TX_TXCC_MGNFS_MULT_000_LANE0, 0x0002}, + {TX_TXCC_MGNFS_MULT_000_LANE1, 0x0002}, + {RX_SIGDET_HL_FILT_TMR_LANE0, 0x0013}, + {RX_SIGDET_HL_FILT_TMR_LANE1, 0x0013}, + {RX_REE_GCSM1_CTRL_LANE0, 0x0000}, + {RX_REE_GCSM1_CTRL_LANE1, 0x0000}, + {RX_REE_ATTEN_THR_LANE0, 0x0c02}, + {RX_REE_ATTEN_THR_LANE1, 0x0c02}, + {RX_REE_SMGM_CTRL1_LANE0, 0x0330}, + {RX_REE_SMGM_CTRL1_LANE1, 0x0330}, + {RX_REE_SMGM_CTRL2_LANE0, 0x0300}, + {RX_REE_SMGM_CTRL2_LANE1, 0x0300}, + {XCVR_DIAG_PSC_OVRD_LANE0, 0x0003}, + {XCVR_DIAG_PSC_OVRD_LANE1, 0x0003}, + {RX_DIAG_SIGDET_TUNE_LANE0, 0x1004}, + {RX_DIAG_SIGDET_TUNE_LANE1, 0x1004}, + {RX_DIAG_NQST_CTRL_LANE0, 0x00f9}, + {RX_DIAG_NQST_CTRL_LANE1, 0x00f9}, + {RX_DIAG_DFE_AMP_TUNE_2_LANE0, 0x0c01}, + {RX_DIAG_DFE_AMP_TUNE_2_LANE1, 0x0c01}, + {RX_DIAG_DFE_AMP_TUNE_3_LANE0, 0x0002}, + {RX_DIAG_DFE_AMP_TUNE_3_LANE1, 0x0002}, + {RX_DIAG_PI_CAP_LANE0, 0x0000}, + {RX_DIAG_PI_CAP_LANE1, 0x0000}, + {RX_DIAG_PI_RATE_LANE0, 0x0031}, + {RX_DIAG_PI_RATE_LANE1, 0x0031}, + {RX_CDRLF_CNFG_LANE0, 0x018c}, + {RX_CDRLF_CNFG_LANE1, 0x018c}, + {RX_CDRLF_CNFG3_LANE0, 0x0003}, + {RX_CDRLF_CNFG3_LANE1, 0x0003} +}; + +struct cix_u3phy { + struct device *dev; + void __iomem *base; + struct regmap *phy_regmap; + struct reset_control *preset; + struct reset_control *reset; + struct clk *apb_clk; + struct clk *ref_clk; + struct mutex mutex; /* mutex to protect access to individual PHYs */ + bool init; + int init_count; + const struct cix_u3phy_cfg *cfg; +}; + +static int sky1_u3phy_exit(struct cix_u3phy *u3phy) +{ + u3phy->init_count--; + if (u3phy->init && u3phy->init_count =3D=3D 0) { + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + clk_disable_unprepare(u3phy->apb_clk); + clk_disable_unprepare(u3phy->ref_clk); + u3phy->init =3D false; + } + return 0; +} + +static int sky1_u3phy_init(struct cix_u3phy *u3phy) +{ + int ret; + + if (!u3phy->init) { + /* usb rcsu reset is default deassert */ + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + ret =3D clk_prepare_enable(u3phy->apb_clk); + if (ret) { + dev_err(u3phy->dev, "Failed to prepare_enable u3phy apb clock\n"); + goto assert_reset_preset; + } + ret =3D clk_prepare_enable(u3phy->ref_clk); + if (ret) { + dev_err(u3phy->dev, "Failed to prepare_enable u3phy ref clock\n"); + goto disable_apb_clk; + } + reset_control_deassert(u3phy->preset); + ret =3D regmap_multi_reg_write(u3phy->phy_regmap, sky1_u3phy_conf, + ARRAY_SIZE(sky1_u3phy_conf)); + if (ret) { + dev_err(u3phy->dev, "Failed to write the reg sequence\n"); + goto disable_ref_clk; + } + u3phy->init =3D true; + reset_control_deassert(u3phy->reset); + } + u3phy->init_count++; + return 0; + +disable_ref_clk: + clk_disable_unprepare(u3phy->ref_clk); +disable_apb_clk: + clk_disable_unprepare(u3phy->apb_clk); +assert_reset_preset: + reset_control_deassert(u3phy->preset); + reset_control_deassert(u3phy->reset); + u3phy->init =3D false; + return ret; +} + +static const struct cix_u3phy_cfg sky1_u3phy_cfg =3D { + .u3phy_init =3D sky1_u3phy_init, + .u3phy_exit =3D sky1_u3phy_exit +}; + +static int u3phy_regmap_write(void *context, unsigned int reg, unsigned in= t val) +{ + struct cix_u3phy *u3phy =3D context; + u32 offset =3D reg << 2; + + writel(val, u3phy->base + offset); + return 0; +} + +static int u3phy_regmap_read(void *context, unsigned int reg, unsigned int= *val) +{ + struct cix_u3phy *u3phy =3D context; + u32 offset =3D reg << 2; + + *val =3D readl(u3phy->base + offset); + return 0; +} + +static const struct regmap_config cix_u3phy_regmap_cfg =3D { + .reg_bits =3D 32, + .reg_stride =3D 1, + .val_bits =3D 16, + .fast_io =3D true, + .reg_write =3D u3phy_regmap_write, + .reg_read =3D u3phy_regmap_read, +}; + +static int cix_usb3_phy_power_on(struct cix_u3phy *u3phy) +{ + int ret; + const struct cix_u3phy_cfg *phy_cfgs =3D u3phy->cfg; + + if (phy_cfgs->u3phy_init) { + ret =3D phy_cfgs->u3phy_init(u3phy); + if (ret) { + dev_err(u3phy->dev, "failed to init udphy\n"); + return ret; + } + } + return 0; +} + +static int cix_usb3_phy_power_off(struct cix_u3phy *u3phy) +{ + int ret; + const struct cix_u3phy_cfg *phy_cfgs =3D u3phy->cfg; + + if (phy_cfgs->u3phy_exit) { + ret =3D phy_cfgs->u3phy_exit(u3phy); + if (ret) { + dev_err(u3phy->dev, "failed to exit udphy\n"); + return ret; + } + } + return 0; +} + +static int cix_u3phy_init(struct phy *phy) +{ + struct cix_u3phy *u3phy =3D phy_get_drvdata(phy); + int ret =3D 0; + + mutex_lock(&u3phy->mutex); + ret =3D cix_usb3_phy_power_on(u3phy); + mutex_unlock(&u3phy->mutex); + return ret; +} + +static int cix_u3phy_exit(struct phy *phy) +{ + struct cix_u3phy *u3phy =3D phy_get_drvdata(phy); + int ret =3D 0; + + mutex_lock(&u3phy->mutex); + ret =3D cix_usb3_phy_power_off(u3phy); + mutex_unlock(&u3phy->mutex); + return ret; +} + +static const struct phy_ops cix_u3phy_ops =3D { + .init =3D cix_u3phy_init, + .exit =3D cix_u3phy_exit, + .owner =3D THIS_MODULE, +}; + +static int cix_u3phy_probe(struct platform_device *pdev) +{ + struct cix_u3phy *u3phy; + struct device *dev =3D &pdev->dev; + struct phy_provider *phy_provider; + struct device_node *np =3D dev->of_node; + struct device_node *child_np; + struct fwnode_handle *child_fn; + struct phy *phy; + int ret =3D 0; + + u3phy =3D devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL); + if (!u3phy) + return -ENOMEM; + dev_set_drvdata(dev, u3phy); + u3phy->dev =3D dev; + u3phy->cfg =3D device_get_match_data(dev); + if (!u3phy->cfg) { + dev_err(dev, "no OF data can be matched with %p node\n", np); + return -EINVAL; + } + u3phy->reset =3D devm_reset_control_get(dev, "reset"); + if (IS_ERR(u3phy->reset)) { + dev_err(dev, "failed to get reset\n"); + return PTR_ERR(u3phy->reset); + } + u3phy->preset =3D devm_reset_control_get(dev, "preset"); + if (IS_ERR(u3phy->preset)) { + dev_err(dev, "failed to get preset\n"); + return PTR_ERR(u3phy->preset); + } + u3phy->apb_clk =3D devm_clk_get(dev, "apb_clk"); + if (IS_ERR(u3phy->apb_clk)) { + dev_err(dev, "phy apb clock not found\n"); + return PTR_ERR(u3phy->apb_clk); + } + u3phy->ref_clk =3D devm_clk_get(dev, "ref_clk"); + if (IS_ERR(u3phy->ref_clk)) { + dev_err(dev, "phy ref clock not found\n"); + return PTR_ERR(u3phy->ref_clk); + } + u3phy->base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(u3phy->base)) + return PTR_ERR(u3phy->base); + u3phy->phy_regmap =3D devm_regmap_init(dev, NULL, u3phy, &cix_u3phy_regma= p_cfg); + if (IS_ERR(u3phy->phy_regmap)) { + dev_err(dev, "failed to remap phy register\n"); + return PTR_ERR(u3phy->phy_regmap); + } + mutex_init(&u3phy->mutex); + device_for_each_child_node(dev, child_fn) { + child_np =3D to_of_node(child_fn); + if (!strncmp(fwnode_get_name(child_fn), "usb-port", 8) || + !strncmp(fwnode_get_name(child_fn), "USB", 3)) + phy =3D devm_phy_create(dev, child_np, &cix_u3phy_ops); + else + continue; + if (IS_ERR(phy)) { + dev_err(dev, "failed to create phy: %s\n", + fwnode_get_name(child_fn)); + goto put_child; + } + phy_set_drvdata(phy, u3phy); + phy_create_lookup(phy, fwnode_get_name(child_fn), dev_name(dev)); + } + phy_provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (IS_ERR(phy_provider)) { + dev_err(dev, "failed to register phy provider\n"); + goto put_child; + } + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + return 0; + +put_child: + of_node_put(child_np); + return ret; +} + +static const struct of_device_id cix_u3phy_dt_match[] =3D { + { + .compatible =3D "cix,sky1-usb3-phy", + .data =3D &sky1_u3phy_cfg + }, + { /* sentinel */ } +}; + +static struct platform_driver cix_usb3_phy_driver =3D { + .probe =3D cix_u3phy_probe, + .driver =3D { + .name =3D "cix-usb3-phy", + .of_match_table =3D cix_u3phy_dt_match, + }, +}; + +module_platform_driver(cix_usb3_phy_driver); + +MODULE_AUTHOR("Hongliang Yang "); +MODULE_DESCRIPTION("Cix USB3 Only PHY driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/phy/cix/phy-cix-usbdp.h b/drivers/phy/cix/phy-cix-usbd= p.h new file mode 100644 index 000000000000..6ec7eb5c81aa --- /dev/null +++ b/drivers/phy/cix/phy-cix-usbdp.h @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _PHY_CIX_USBDP_H +#define _PHY_CIX_USBDP_H + +#define CMN_SSM_BIAS_TMR 0x0022 +#define CMN_PLLSM0_PLLPRE_TMR 0x002a +#define CMN_PLLSM0_PLLLOCK_TMR 0x002c +#define CMN_PLLSM1_PLLPRE_TMR 0x0032 +#define CMN_PLLSM1_PLLLOCK_TMR 0x0034 +#define CMN_BGCAL_INIT_TMR 0x0064 +#define CMN_BGCAL_ITER_TMR 0x0065 +#define CMN_IBCAL_INIT_TMR 0x0074 +#define CMN_PLL0_SS_CTRL1_M0 0x0098 +#define CMN_PLL0_SS_CTRL2_M0 0x0099 +#define CMN_PLL0_SS_CTRL3_M0 0x009a +#define CMN_PLL0_SS_CTRL4_M0 0x009b +#define CMN_PLL1_SS_CTRL1_M0 0x00d8 +#define CMN_PLL1_SS_CTRL2_M0 0x00d9 +#define CMN_PLL1_SS_CTRL3_M0 0x00da +#define CMN_PLL1_SS_CTRL4_M0 0x00db +#define CMN_TXPUCAL_INIT_TMR 0x0104 +#define CMN_TXPDCAL_INIT_TMR 0x010c +#define CMN_RXCAL_INIT_TMR 0x0114 +#define CMN_SD_CAL_PLLCNT_START 0x0128 +#define CMN_PDIAG_PLL1_ITRIM_M0 0x01c3 +#define CMN_DIAG_GPANA_0 0x01f0 + +#define RX_SDCAL0_INIT_TMR_LANE0 0x8044 +#define RX_SDCAL0_INIT_TMR_LANE1 0x8244 +#define RX_SDCAL0_INIT_TMR_LANE2 0x8444 +#define RX_SDCAL0_INIT_TMR_LANE3 0x8644 + +#define RX_SDCAL0_ITER_TMR_LANE0 0x8045 +#define RX_SDCAL0_ITER_TMR_LANE1 0x8245 +#define RX_SDCAL0_ITER_TMR_LANE2 0x8445 +#define RX_SDCAL0_ITER_TMR_LANE3 0x8645 + +#define RX_SDCAL1_INIT_TMR_LANE0 0x804c +#define RX_SDCAL1_INIT_TMR_LANE1 0x824c +#define RX_SDCAL1_INIT_TMR_LANE2 0x844c +#define RX_SDCAL1_INIT_TMR_LANE3 0x864c + +#define RX_SDCAL1_ITER_TMR_LANE0 0x804d +#define RX_SDCAL1_ITER_TMR_LANE1 0x824d +#define RX_SDCAL1_ITER_TMR_LANE2 0x844d +#define RX_SDCAL1_ITER_TMR_LANE3 0x864d + +#define TX_RCVDET_ST_TMR_LANE0 0x4123 +#define TX_RCVDET_ST_TMR_LANE1 0x4323 +#define TX_RCVDET_ST_TMR_LANE2 0x4523 +#define TX_RCVDET_ST_TMR_LANE3 0x4723 + +#define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01a1 +#define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01c1 + +#define XCVR_DIAG_HSCLK_SEL_LANE0 0x40e6 +#define XCVR_DIAG_HSCLK_SEL_LANE1 0x42e6 +#define XCVR_DIAG_HSCLK_SEL_LANE2 0x44e6 +#define XCVR_DIAG_HSCLK_SEL_LANE3 0x46e6 + +#define XCVR_DIAG_HSCLK_DIV_LANE0 0x40e7 +#define XCVR_DIAG_HSCLK_DIV_LANE1 0x42e7 +#define XCVR_DIAG_HSCLK_DIV_LANE2 0x44e7 +#define XCVR_DIAG_HSCLK_DIV_LANE3 0x46e7 + +#define XCVR_DIAG_PLLDRC_CTRL_LANE0 0x40e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE1 0x42e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE2 0x44e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE3 0x46e5 + +#define XCVR_DIAG_BIDI_CTRL_LANE0 0x40ea +#define XCVR_DIAG_BIDI_CTRL_LANE1 0x42ea +#define XCVR_DIAG_BIDI_CTRL_LANE2 0x44ea +#define XCVR_DIAG_BIDI_CTRL_LANE3 0x46ea + +#define CMN_PLL0_DSM_DIAG_M0 0x0094 +#define CMN_PLL1_DSM_DIAG_M0 0x00d4 +#define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01a4 +#define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01c4 + +#define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01a5 +#define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01c5 +#define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01a6 +#define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01c6 + +#define CMN_PLL0_INTDIV_M0 0x0090 +#define CMN_PLL1_INTDIV_M0 0x00d0 +#define CMN_PLL0_FRACDIVL_M0 0x0091 +#define CMN_PLL1_FRACDIVL_M0 0x00d1 + +#define CMN_PLL0_FRACDIVH_M0 0x0092 +#define CMN_PLL1_FRACDIVH_M0 0x00d2 +#define CMN_PLL0_HIGH_THR_M0 0x0093 +#define CMN_PLL1_HIGH_THR_M0 0x00d3 + +#define CMN_PDIAG_PLL0_CTRL_M0 0x01a0 +#define CMN_PDIAG_PLL1_CTRL_M0 0x01c0 + +#define CMN_PLL0_VCOCAL_TCTRL 0x0082 +#define CMN_PLL1_VCOCAL_TCTRL 0x00c2 + +#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084 +#define CMN_PLL1_VCOCAL_INIT_TMR 0x00c4 + +#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085 +#define CMN_PLL1_VCOCAL_ITER_TMR 0x00c5 + +#define CMN_PLL0_VCOCAL_REFTIM_START 0x0086 +#define CMN_PLL1_VCOCAL_REFTIM_START 0x00c6 + +#define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088 +#define CMN_PLL1_VCOCAL_PLLCNT_START 0x00c8 + +#define CMN_PLL0_LOCK_REFCNT_START 0x009c +#define CMN_PLL1_LOCK_REFCNT_START 0x00dc + +#define CMN_PLL0_LOCK_PLLCNT_START 0x009e +#define CMN_PLL1_LOCK_PLLCNT_START 0x00de + +#define CMN_PLL0_LOCK_PLLCNT_THR 0x009f +#define CMN_PLL1_LOCK_PLLCNT_THR 0x00df + +#define PHY_PMA_LANE_MAP 0xc010 +#define PHY_LANE_OFF_CTRL 0xc011 + +#define PHY_PIPE_USB3_GEN2_PRE_CFG0 0xc018 +#define PHY_PIPE_USB3_GEN2_POST_CFG0 0xc01a +#define PHY_PIPE_USB3_GEN2_POST_CFG1 0xc01b + +#define CMN_CDIAG_CDB_PWRI_OVRD 0x0041 +#define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047 + +#define TX_PSC_A0_LANE0 0x4100 +#define TX_PSC_A0_LANE1 0x4300 +#define TX_PSC_A0_LANE2 0x4500 +#define TX_PSC_A0_LANE3 0x4700 + +#define TX_PSC_A1_LANE0 0x4101 +#define TX_PSC_A1_LANE1 0x4301 +#define TX_PSC_A1_LANE3 0x4701 + +#define TX_PSC_A2_LANE0 0x4102 +#define TX_PSC_A2_LANE1 0x4302 +#define TX_PSC_A2_LANE2 0x4502 +#define TX_PSC_A2_LANE3 0x4702 + +#define TX_PSC_A3_LANE0 0x4103 +#define TX_PSC_A3_LANE1 0x4303 +#define TX_PSC_A3_LANE2 0x4503 +#define TX_PSC_A3_LANE3 0x4703 + +#define RX_PSC_A0_LANE0 0x8000 +#define RX_PSC_A0_LANE1 0x8200 +#define RX_PSC_A0_LANE2 0x8400 +#define RX_PSC_A0_LANE3 0x8600 + +#define RX_PSC_A1_LANE0 0x8001 +#define RX_PSC_A1_LANE1 0x8201 +#define RX_PSC_A1_LANE2 0x8401 + +#define RX_PSC_A2_LANE0 0x8002 +#define RX_PSC_A2_LANE1 0x8202 +#define RX_PSC_A2_LANE2 0x8402 +#define RX_PSC_A2_LANE3 0x8602 + +#define RX_PSC_A3_LANE0 0x8003 +#define RX_PSC_A3_LANE1 0x8203 +#define RX_PSC_A3_LANE2 0x8403 +#define RX_PSC_A3_LANE3 0x8603 + +#define RX_PSC_CAL_LANE0 0x8006 +#define RX_PSC_CAL_LANE1 0x8206 +#define RX_PSC_CAL_LANE2 0x8406 +#define RX_PSC_CAL_LANE3 0x8606 + +#define TX_TXCC_CTRL_LANE0 0x4040 +#define TX_TXCC_CTRL_LANE1 0x4240 +#define TX_TXCC_CTRL_LANE2 0x4440 +#define TX_TXCC_CTRL_LANE3 0x4640 + +#define TX_TXCC_CPOST_MULT_00_LANE0 0x404c +#define TX_TXCC_CPOST_MULT_00_LANE1 0x424c +#define TX_TXCC_CPOST_MULT_00_LANE2 0x444c +#define TX_TXCC_CPOST_MULT_00_LANE3 0x464c + +#define TX_TXCC_CPOST_MULT_01_LANE0 0x404d +#define TX_TXCC_CPOST_MULT_01_LANE1 0x424d +#define TX_TXCC_CPOST_MULT_01_LANE3 0x464d + +#define TX_TXCC_MGNFS_MULT_000_LANE0 0x4050 +#define TX_TXCC_MGNFS_MULT_000_LANE1 0x4250 +#define TX_TXCC_MGNFS_MULT_000_LANE2 0x4450 +#define TX_TXCC_MGNFS_MULT_000_LANE3 0x4650 + +#define TX_DIAG_ACYA_LANE0 0x41E7 +#define TX_DIAG_ACYA_LANE1 0x43E7 +#define TX_DIAG_ACYA_LANE2 0x45E7 +#define TX_DIAG_ACYA_LANE3 0x47E7 + +#define DRV_DIAG_TX_DRV_LANE0 0x40c6 +#define DRV_DIAG_TX_DRV_LANE1 0x42c6 +#define DRV_DIAG_TX_DRV_LANE2 0x44c6 +#define DRV_DIAG_TX_DRV_LANE3 0x46c6 + +#define RX_SIGDET_HL_FILT_TMR_LANE0 0x8090 +#define RX_SIGDET_HL_FILT_TMR_LANE1 0x8290 +#define RX_SIGDET_HL_FILT_TMR_LANE2 0x8490 + +#define RX_REE_GCSM1_CTRL_LANE0 0x8108 +#define RX_REE_GCSM1_CTRL_LANE1 0x8308 +#define RX_REE_GCSM1_CTRL_LANE2 0x8508 +#define RX_REE_GCSM1_CTRL_LANE3 0x8708 + +#define RX_REE_GCSM2_CTRL_LANE0 0x8110 +#define RX_REE_GCSM2_CTRL_LANE1 0x8310 +#define RX_REE_GCSM2_CTRL_LANE2 0x8510 +#define RX_REE_GCSM2_CTRL_LANE3 0x8710 + +#define RX_REE_PERGCSM_CTRL_LANE0 0x8118 +#define RX_REE_PERGCSM_CTRL_LANE1 0x8318 +#define RX_REE_PERGCSM_CTRL_LANE2 0x8518 +#define RX_REE_PERGCSM_CTRL_LANE3 0x8718 + +#define RX_REE_ATTEN_THR_LANE0 0x8149 +#define RX_REE_ATTEN_THR_LANE1 0x8349 +#define RX_REE_ATTEN_THR_LANE2 0x8549 + +#define RX_REE_SMGM_CTRL1_LANE0 0x8177 +#define RX_REE_SMGM_CTRL1_LANE1 0x8377 +#define RX_REE_SMGM_CTRL1_LANE2 0x8577 + +#define RX_REE_SMGM_CTRL2_LANE0 0x8178 +#define RX_REE_SMGM_CTRL2_LANE1 0x8378 +#define RX_REE_SMGM_CTRL2_LANE2 0x8578 + +#define XCVR_DIAG_PSC_OVRD_LANE0 0x40eb +#define XCVR_DIAG_PSC_OVRD_LANE1 0x42eb +#define XCVR_DIAG_PSC_OVRD_LANE2 0x44eb + +#define RX_DIAG_SIGDET_TUNE_LANE0 0x81e8 +#define RX_DIAG_SIGDET_TUNE_LANE1 0x83e8 +#define RX_DIAG_SIGDET_TUNE_LANE2 0x85e8 + +#define RX_DIAG_NQST_CTRL_LANE0 0x81e5 +#define RX_DIAG_NQST_CTRL_LANE1 0x83e5 +#define RX_DIAG_NQST_CTRL_LANE2 0x85e5 + +#define RX_DIAG_DFE_AMP_TUNE_2_LANE0 0x81e2 +#define RX_DIAG_DFE_AMP_TUNE_2_LANE1 0x83e2 +#define RX_DIAG_DFE_AMP_TUNE_2_LANE2 0x85e2 + +#define RX_DIAG_DFE_AMP_TUNE_3_LANE0 0x81e3 +#define RX_DIAG_DFE_AMP_TUNE_3_LANE1 0x83e3 +#define RX_DIAG_DFE_AMP_TUNE_3_LANE2 0x85e3 + +#define RX_DIAG_PI_CAP_LANE0 0x81f5 +#define RX_DIAG_PI_CAP_LANE1 0x83f5 +#define RX_DIAG_PI_CAP_LANE2 0x85f5 + +#define RX_DIAG_PI_RATE_LANE0 0x81f4 +#define RX_DIAG_PI_RATE_LANE1 0x83f4 +#define RX_DIAG_PI_RATE_LANE2 0x85f4 + +#define RX_DIAG_ACYA_LANE0 0x81ff +#define RX_DIAG_ACYA_LANE3 0x87ff + +#define RX_CDRLF_CNFG_LANE0 0x8080 +#define RX_CDRLF_CNFG_LANE1 0x8280 +#define RX_CDRLF_CNFG_LANE2 0x8480 + +#define RX_CDRLF_CNFG3_LANE0 0x8082 +#define RX_CDRLF_CNFG3_LANE1 0x8282 +#define RX_CDRLF_CNFG3_LANE2 0x8482 + +#define PHY_PMA_PLL_CTRL 0xe003 + +#define PHY_PMA_ISO_PLL_CTRL0 0xe005 +#define PHY_PMA_ISO_PLL_CTRL1 0xe006 + +/* Bits */ + +#define PHY_PLL_CFG_0803 0xC00E +/* 0803 phy register */ +#define PHY_PIPE_USB3_GEN2_PRE_CFG0_0803 0xc01c +#define PHY_PIPE_USB3_GEN2_POST_CFG0_0803 0xc01e +#define PHY_PIPE_USB3_GEN2_POST_CFG1_0803 0xc01f + +/* gop status address */ +#define GOP_STATUS_ADDRESS 0x83E05000 +#define GOP_STATUS_SIZE 0x04 + +struct gop_status { + unsigned char phy_status[4]; +}; + +/* + * 0: usb + * 1: 2 lane usb+ 2 lane dp + * 2: usb device + * 3: usb2.0 + 4 lane dp + */ +enum phy_role { + USB_ROLE_NONE, + USB_ROLE_HOST, + USB_ROLE_DEVICE, + USB_ROLE_HOST_20, +}; + +#endif --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022087.outbound.protection.outlook.com [52.101.126.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD4B524DFF9; Wed, 2 Sep 2026 03:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.87 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319307; cv=fail; b=h6jhAgTdF9Ae3lzURY+QT7wwISocmCfOSI0yB2te8o7Hz1rG9BJKsqm1q1udnBzR6j+bW+fJOVDAneopsVNsXVHfaItvF0tV73JRsqlG3hXJN+rL09sMOP2Au6MYvKJOjp8M31UnU6Cq34yjrci2t/dj+LmEZtGEGLQIUj/XuvU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319307; c=relaxed/simple; bh=nvAQMsQ0B8QeCJ7BHM7OrPRB6i6MoILeQWILuuHdWpQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EkQffDb5aONSOf6jdsZSX933RgOuwckYC7OO38L8TB/yGan86rQGiASjDqQn4AodlwOf+kruIMDmqT41zLStYReaKtBDwtmiBTCMYjTOarCGBiXXgHA9wra/wbhz3FTlWi1R9rxjE0V2abB36ZjjFYaSVGcqtTVqOGfozerNEws= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.126.87 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TsTGNpb0rx25/E49ag9JzNouaY95lZferlg181IRm38qYLTKus69WuakaVT7EJ7vejPwcKnSuquKRtRkOvRBJV6/Gp6HHapgkqEbghOk9nBbxBIJPTi44uIFCVmJkTGC7+ICseDywFd/CCWjaWfKgPFp45Mi3IiLVNPkJdFjkxPTfwXPT7OHgVh4h819qAflXYXWYYL61W7/h8yaCykRUvy3NARuvJGzLRgdRx5oLcqNt6rJ35vZTCQgnzZbaCSI9Os2I5dJmEqpoFdxNPO5czPrV1zJrWlBEzM7oJLQqirD2m3STgwzKUxQGiH7z5MnQH08dTQP0MWxVScdFgAy7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dlHZyN2fPM5TUY64AyRcXs5BLF8phoQH4+JdQXV8uBY=; b=G0QlPPMnSaw6Xr7pclTWCLPXPuzOFmSn10piftQM6uI6s/OCgFnkkd9WF7AOz8k3F6Opts4Nw2qOSTRpL6CO9tAooAxfeZzZdSX9iclm1jvsOrC+PUNWA3M1/7Mo9/lk8uqosgEGRbGfj8erEX80A+K5qxkdTr3ZbsFe7NwS0FwpA3fg0TW6p2RzgXKHWkE7InAdQ1MNPxLmJKyPW7BA0QAXpCSTyCG/DxvzE0VAVFVNQKfgKhLmDxKWt3FuEe8myjCd2/gNhLvcENmLkE8SgTxUbCVLbyu8n7mS4VWHDBo4wywKZpAs3qCCKw8ZleMQWK2yr9H8bDsvuxnSHoc2Aw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from OS0PR01CA0191.jpnprd01.prod.outlook.com (2603:1096:604:1c5::9) by TY0PR06MB5442.apcprd06.prod.outlook.com (2603:1096:400:31e::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 03:21:38 +0000 Received: from OSA0EPF000000C6.apcprd02.prod.outlook.com (2603:1096:604:1c5:cafe::33) by OS0PR01CA0191.outlook.office365.com (2603:1096:604:1c5::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.11 via Frontend Transport; Wed, 2 Sep 2026 03:21:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by OSA0EPF000000C6.mail.protection.outlook.com (10.167.240.52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 03:21:37 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 27B32409210F; Wed, 2 Sep 2026 11:21:36 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v2 2/5] dt-bindings: usb: Add CIX Sky1 USBSSP controller Date: Wed, 2 Sep 2026 11:21:31 +0800 Message-ID: <20260902032134.1182634-3-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSA0EPF000000C6:EE_|TY0PR06MB5442:EE_ X-MS-Office365-Filtering-Correlation-Id: 86f2eadc-9c65-41ca-55b8-08df08a14cac X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|7416014|376014|23010399003|36860700016|22082099003|18002099003|3023799007|56012099006|6133799003|10067099003; X-Microsoft-Antispam-Message-Info: YvQxbJbPD5d2jYEreNsDbKR4rE4UnIiUz5aJlcUyp/r1xNZh9saJYtZCItEa4XgPhnt+H6iOobIkBXW/FWHG7ZDNf9e5OcX/HXhiHqXr4uOatgzOvUOpgqFvlJwuGarLpuATqUQAh8ZeYJ2prlXRuFVsxJbJbjbMXoMaA2KdjgyRVhwqtNyfL8Rdj0qY8uHB/0obrQVoT9A3DidENlyelAU7TtPtX2094uQpZvxu9SA8WlrspKOTJmLE2ixUGhvilHId7li5VJPIqPZUv8QOQpaXOi002HevYAFVRjcWO7F8JVYflPJXevuik7s/dYaz74voiobdarlfzMBDU8VhwXSVZJiQ+UK2B4YPu28m9gAqkDMdnBPMDNL3uNV/TvdtvHeiv9EWT7zirRimYJB5vbI1NM9rjIjBMkGdSIn/Bp3Alg3I7XaL0kTDJaIhCL/8rye1cn55wvHBKmmONmly4QTD7CfLu+NPl8mQ/fCnYl+YG2MjiFrEepmdmeMKrzjUdYJwIGZNMdaR2zY14IVEWGzuqVM0WJLFNoJbJoY9X7hxif7BbEiBXuRB/LH7yIFRGyQWFlQE5Z8NoFWWXR5gP66mngCC//hDGTk9tjyBmZoRMZjYnjMwRKdEx3yLFuti+oVjnZVNtX0+DBi39hik6g== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(7416014)(376014)(23010399003)(36860700016)(22082099003)(18002099003)(3023799007)(56012099006)(6133799003)(10067099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hd/RkgSkeswdpqKYYE5OPLFqYhs5KSVKLMErUth36kg8FBKx1GRJAvACRp7oVKOcVH0duaJCJsSX4Y7AVEBiUj8+PNB1UHGNX2mpqE1PSO/1rQPkdf2EXtpLYP6ZJk6sA+8Ff4WPwjXqtxTW6TqUB/0S29FdIR6bh5QF5cQ6EXqhClP7OSgCwjSbudvxkkNzPXbO7zYXQmRUCaXgM8yz8QWqNEZ7rGWlpz+BfT2EndwqP1S8CjHv2+Kts8/WbpyOuNIgTDRwhwMhKmkZXNweFxvhus7ZWfnkkYdtTabFRjnU4PY3cxeZRIFSh/00tKfP9ht1cxsgm7MeWsJqT26Vu0dAF6QLK1TCuqcIdiy0XUcfb4hSXHnUs6ThKVeqvG4+Ri53ioFvcT+7FXSS9+xzuZYsTzRuBPL9gZTxRBIzkKyA5TLwrlKwQ9l63/5KTih0 X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 03:21:37.6321 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 86f2eadc-9c65-41ca-55b8-08df08a14cac X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: OSA0EPF000000C6.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR06MB5442 Content-Type: text/plain; charset="utf-8" Add device tree binding for the CIX Sky1 Cadence USBSSP controller glue layer. The integration adds glue registers and mode strap controls in the Sky1 S5 system controller. The CIX glue node wraps a Cadence USBSSP core as a child node. Signed-off-by: Hongliang Yang --- .../bindings/usb/cix,sky1-usbssp.yaml | 137 ++++++++++++++++++ MAINTAINERS | 3 + 2 files changed, 140 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/cix,sky1-usbssp.y= aml diff --git a/Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml b/D= ocumentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml new file mode 100644 index 000000000000..73231a2741bc --- /dev/null +++ b/Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml @@ -0,0 +1,137 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/usb/cix,sky1-usbssp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: CIX Sky1 Cadence USBSSP Controller + +maintainers: + - Hongliang Yang + +description: + The CIX Sky1 USBSSP controller is based on the Cadence USBSSP DRD + controller. The integration adds glue registers and mode strap controls + in the Sky1 S5 system controller. The CIX glue node wraps a Cadence + USBSSP core as a child node. + +properties: + compatible: + const: cix,sky1-usbssp + + reg: + items: + - description: AXI property configuration register + - description: Controller status register + + reg-names: + items: + - const: axi + - const: controller + + clocks: + items: + - description: Start-of-frame clock + - description: AXI bus clock + - description: Low-power mode clock + - description: APB register interface clock + + clock-names: + items: + - const: sof + - const: axi + - const: lpm + - const: apb + + resets: + items: + - description: APB register reset + - description: Controller reset + + reset-names: + items: + - const: apb + - const: core + + cix,usb-syscon: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to the Sky1 S5 system controller used to program USB mode + strap controls. + + "#address-cells": + const: 2 + + "#size-cells": + const: 2 + + ranges: true + +patternProperties: + "^usb@[0-9a-f]+$": + $ref: cdns,usb3.yaml# + +required: + - compatible + - reg + - reg-names + - clocks + - clock-names + - resets + - reset-names + - cix,usb-syscon + - "#address-cells" + - "#size-cells" + - ranges + +unevaluatedProperties: false + +examples: + - | + #include + #include + #include + + soc { + #address-cells =3D <2>; + #size-cells =3D <2>; + + usb@91c0314 { + compatible =3D "cix,sky1-usbssp"; + reg =3D <0x00 0x091c0314 0x00 0x4>, + <0x00 0x091c0400 0x00 0x4>; + reg-names =3D "axi", "controller"; + ranges; + #address-cells =3D <2>; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_H0_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_0_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H0_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_0_APB_GATE>; + clock-names =3D "sof", "axi", "lpm", "apb"; + resets =3D <&src SKY1_USBC_SS2_PRST_N>, + <&src SKY1_USBC_SS2_RST_N>; + reset-names =3D "apb", "core"; + #size-cells =3D <2>; + cix,usb-syscon =3D <&src>; + + usb@91d0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91d0000 0x00 0x4000>, + <0x00 0x91d8000 0x00 0x8000>, + <0x00 0x91d4000 0x00 0x4000>; + reg-names =3D "otg", "xhci", "dev"; + dr_mode =3D "otg"; + + interrupts =3D , + , + , + ; + interrupt-names =3D "host", "peripheral", "otg", "wakeup"; + maximum-speed =3D "super-speed-plus"; + + phys =3D <&usb3_phy4_0>, <&usb2_phy6>; + phy-names =3D "cdns3,usb3-phy", "cdns3,usb2-phy"; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 15011f5752a9..4c5f6cbe9124 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2775,8 +2775,11 @@ S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/cix.git F: Documentation/devicetree/bindings/arm/cix.yaml F: Documentation/devicetree/bindings/mailbox/cix,sky1-mbox.yaml +F: Documentation/devicetree/bindings/phy/cix,sky1-usb3-phy.yaml +F: Documentation/devicetree/bindings/usb/cix,sky1-usbssp.yaml F: arch/arm64/boot/dts/cix/ F: drivers/mailbox/cix-mailbox.c +F: drivers/phy/cix/ K: \bcix\b =20 ARM/CLKDEV SUPPORT --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022082.outbound.protection.outlook.com [40.107.75.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85A8F2609C5; Wed, 2 Sep 2026 03:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.82 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319306; cv=fail; b=FxeP5Lh7tDzJ0FpKc3ExvRUhXt8llo9DLxzX2YxTCQscpNXAaxrmb25yYdNDCpADSPWDbe0OHqpsad2YQ2YDGh5WmvMNBYbJwvu8tpbxWB7tfN1Gj89ajzn/3wWWGegdfI5zJ6oNrFfrCkmQkLUvcoO08Vo+LdzN0LFO0k5dF5M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319306; c=relaxed/simple; bh=g9/yaZR7qUKD6CzsSpZfikPCtH3/TNKBeYSZtaqOyrI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kmBII6i4cHf5EWAoGBr7yf/sax87zs6OO3P2HzTR4BmfDF+vt6rmCAiBwMY5MDmAhEAr0dNp/nP0j6QSzmex7Lia99nu4dD3qb24MBhAMK23/G1v9Nbj58K4wk5atwjQufyfPHZO6ccmGa3jcyqBoZ6+IxK4NZ0aTgYYU/7qr3M= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=40.107.75.82 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=s0FAD6ulPhoG38jiXP/LEbZFnRJNH3fbhOGvFnoxq3Wv1y2phhxpHZkqNO1hfRh+GcYw/OBjS7RItzZW0WPeCtr6hhyJmi9bqnqfVcoSeXPw6PpzgkERiI0Mftn8pJlN8+eUmK6c3dCT+ClUmOgVS5Nfvxym2xkNs5Ag1DlK1VFJW6IKU74IdUsM391PUpTdKawHH9KvvwEWUpLJJkpslbGoMnvyIn7VuOr3iOjEcsnMIhznzK/ljArX231j95/KyK/fkg7f2DfgWi8PvwudghqaBZ9zNBmp5ZAQOi2Gk0ett591vOBInGQW4PdVC7Yce9BDXj3OIzizOiMD7FYyKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=birJ6MgIrgE4Qw77J+j3d6agDGWJ2rBq0xcI78csoLc=; b=hJW0tLNob+nUrzSYSDaPSAqmHQkDzRVwoe5qI9E296xhL5AfhHekgU48mCUnBEkpyZk7XrYLcBa7w/jLNM1wVncfQUlwzb99n+8LkcoK7PkPZD2Hn2CPRrrT0ez/OTKlwVLYAYNKXcXPLBhp6LhECEae1iyXq7yf7DPZaCqYsd+cMvuh862+iic7jnFTSwiZUIdLJUnLaUEyk8MTY3JokAxHwOYrXJNhW913nGayk9ONP2zKAzfHZ9EN+83AmOUx8IaZKezBzWolieHoZtyu2Eml+T1BYENbgMkgFUYm5fwKK/18IGtAf041upF2f85ve3jC8zi2a0dwbgZjAFB/1Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from PS2PR02CA0062.apcprd02.prod.outlook.com (2603:1096:300:5a::26) by SEYPR06MB5373.apcprd06.prod.outlook.com (2603:1096:101:6a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 03:21:39 +0000 Received: from TY2PEPF0000AB89.apcprd03.prod.outlook.com (2603:1096:300:5a:cafe::e) by PS2PR02CA0062.outlook.office365.com (2603:1096:300:5a::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Wed, 2 Sep 2026 03:21:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by TY2PEPF0000AB89.mail.protection.outlook.com (10.167.253.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 03:21:38 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id B86CE4092110; Wed, 2 Sep 2026 11:21:36 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v2 3/5] phy: cix: Add CIX Sky1 USB3 PHY driver Date: Wed, 2 Sep 2026 11:21:32 +0800 Message-ID: <20260902032134.1182634-4-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PEPF0000AB89:EE_|SEYPR06MB5373:EE_ X-MS-Office365-Filtering-Correlation-Id: 91bb29d3-7af7-44f0-c8bd-08df08a14d1f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|23010399003|7416014|36860700016|1800799024|82310400026|10067099003|6133799003|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: 7g1v5RMX2euLtR8CDhWnW7/GbFAu9GGPl3XFmSzeh5+8+wrW+xpDVHOqvt3FT/iBah5Crlg0tAwq1NEc0FmS6w64KBoJF10NWBGBeGSS938tZJU19kx4E/Ekcmytenwi/1NSFs13YIKkkPmSvTw+oH9YsKOuMjxS1HRiqxwhOSbpA+K8dVGsoZJWm5qZKt7hCGvitz1thhPFgkd9ksBqKa9RC9gHdKGO5DynqUDVWw+2rIqFf6b4CXyi6JRw7GNyiVO8EVL5a2NUxUrLb8/cQbys8pEt/1J0c3AavNJ4tgzQ5JsUBYiOvvzKQJ3s/jA9vr4Cg3Uh7OKzbUTPoH70PiIYZZZEqxepvCWlX8I+NmFo6N0jJdh3T0RszPfGcvel/Ux8HhRDSbtp7ta5bO8ao8K2AvHA5gG+306EgcSwADm055lihHPLXD7PwQXSbqOojWH6qib2iHqN6KUL1Ql5BB7ucnFCT0oHxiZdsmKO64cVf+H3jh5x0gQINMQ1Jx+4LT/65QLla9/d3SDlO+LV0/GRO/tulvzc94m/3QO0WOegWDzbqBDXS8KdSQsper4a9u1F8ytzmPWcVQxBGZQnFvyCfJITy6SNM1kR8j2918p7VwfI+KMFVbqNcTw9QXyaSwXHSkvWaz266bnvams/pgM6WRRMrmwJlQ4O7pai9KnhLrHEJQZAj+Lc8hKP7FnT7nKjaXc5njxHi+Gn5apuwg== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(23010399003)(7416014)(36860700016)(1800799024)(82310400026)(10067099003)(6133799003)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: VZekeSJLPS4a4hBg7GusuPZNHulcRuXmBSON8s17+vgdFRePruz/7AEm3bqZiT86zCOoGpwG7ILFRykEqSlnBIpEcryWy0AGYuNsSToek3t3Ym+5aj6F5YFxdPqzK6fP7ZOoVi4cQihMMp3CXsI6/MvHdxwZ3LXs/lOCZv6bBx3ab+PbM/PZOV01lYqwPheWA7iaUd/bufb0iZxVH046+Ab3yh0m03i1pOhBLFtth5+xPw/ZQnNk5RKeRb+8orQ2shKVyKay55PvIjQgAkr6YyMhU96ZV7Yoq/YtDcjStuQsAxPNguWa5tvjc+MlT+kOHII/UdZRvlqQhhuwqgegPgtjlacng+4TNUd9afgpFbcxXQUqEQti84SH7md3fqY2wXdTs9DBuB7g4lQ2Ol7YsFsm80vYsHhPOqXNHKyywqgpdXGLQQO3uTxr2vd3sGUG X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 03:21:38.1860 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 91bb29d3-7af7-44f0-c8bd-08df08a14d1f X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: TY2PEPF0000AB89.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB5373 Content-Type: text/plain; charset="utf-8" Add PHY driver for the USB3 PHY found on CIX Sky1 SoCs. The driver handles initialization, reset, and clock management for the multi-port USB3 PHY. Signed-off-by: Hongliang Yang --- drivers/phy/Kconfig | 1 + drivers/phy/Makefile | 1 + drivers/phy/cix/Kconfig | 20 ++ drivers/phy/cix/Makefile | 6 + drivers/phy/cix/phy-cix-usb3.c | 407 ++++++++++++++++++++++++++++++++ drivers/phy/cix/phy-cix-usbdp.h | 310 ++++++++++++++++++++++++ 6 files changed, 745 insertions(+) create mode 100644 drivers/phy/cix/Kconfig create mode 100644 drivers/phy/cix/Makefile create mode 100644 drivers/phy/cix/phy-cix-usb3.c create mode 100644 drivers/phy/cix/phy-cix-usbdp.h diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 19f3b7d12b7d..cb0d4be47628 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -175,6 +175,7 @@ source "drivers/phy/axiado/Kconfig" source "drivers/phy/broadcom/Kconfig" source "drivers/phy/cadence/Kconfig" source "drivers/phy/canaan/Kconfig" +source "drivers/phy/cix/Kconfig" source "drivers/phy/eswin/Kconfig" source "drivers/phy/freescale/Kconfig" source "drivers/phy/hisilicon/Kconfig" diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index d7aa516bcc49..6fd0f3910018 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_GENERIC_PHY) +=3D allwinner/ \ broadcom/ \ cadence/ \ canaan/ \ + cix/ \ eswin/ \ freescale/ \ hisilicon/ \ diff --git a/drivers/phy/cix/Kconfig b/drivers/phy/cix/Kconfig new file mode 100644 index 000000000000..aaa2eb9d4552 --- /dev/null +++ b/drivers/phy/cix/Kconfig @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Phy drivers for Cix PHYs +# + +if ARCH_CIX || COMPILE_TEST + +config PHY_CIX_USB3 + tristate "Cix USB3 PHY Driver" + depends on OF && HAS_IOMEM + select GENERIC_PHY + help + Enable this to support the CIX USB3 PHY for TYPEA Connection. + + This driver provides initialization and power management for + the USB3 PHY found on CIX Sky1 SoCs. + + If unsure, say N. + +endif # ARCH_CIX || COMPILE_TEST diff --git a/drivers/phy/cix/Makefile b/drivers/phy/cix/Makefile new file mode 100644 index 000000000000..b46b1059b2ab --- /dev/null +++ b/drivers/phy/cix/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for the Cix phy drivers. +# + +obj-$(CONFIG_PHY_CIX_USB3) +=3D phy-cix-usb3.o diff --git a/drivers/phy/cix/phy-cix-usb3.c b/drivers/phy/cix/phy-cix-usb3.c new file mode 100644 index 000000000000..22bc1b4630a4 --- /dev/null +++ b/drivers/phy/cix/phy-cix-usb3.c @@ -0,0 +1,407 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * phy driver for cdn_sd0803_t7g_typea + * + * Author: Hongliang Yang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "phy-cix-usbdp.h" + +struct cix_u3phy; + +struct cix_u3phy_cfg { + int (*u3phy_init)(struct cix_u3phy *u3phy); + int (*u3phy_exit)(struct cix_u3phy *u3phy); +}; + +static const struct reg_sequence sky1_u3phy_conf[] =3D { + {CMN_SSM_BIAS_TMR, 0x0018}, + {CMN_PLLSM0_PLLPRE_TMR, 0x0030}, + {CMN_PLLSM0_PLLLOCK_TMR, 0x00f0}, + {CMN_PLLSM1_PLLPRE_TMR, 0x0030}, + {CMN_PLLSM1_PLLLOCK_TMR, 0x00f0}, + {CMN_BGCAL_INIT_TMR, 0x0078}, + {CMN_BGCAL_ITER_TMR, 0x0078}, + {CMN_IBCAL_INIT_TMR, 0x0018}, + {CMN_TXPUCAL_INIT_TMR, 0x001d}, + {CMN_TXPDCAL_INIT_TMR, 0x001d}, + {CMN_RXCAL_INIT_TMR, 0x02d0}, + {CMN_SD_CAL_PLLCNT_START, 0x0137}, + {RX_SDCAL0_INIT_TMR_LANE0, 0x0018}, + {RX_SDCAL0_INIT_TMR_LANE1, 0x0018}, + {RX_SDCAL0_ITER_TMR_LANE0, 0x0078}, + {RX_SDCAL0_ITER_TMR_LANE1, 0x0078}, + {RX_SDCAL1_INIT_TMR_LANE0, 0x0018}, + {RX_SDCAL1_INIT_TMR_LANE1, 0x0018}, + {RX_SDCAL1_ITER_TMR_LANE0, 0x0078}, + {RX_SDCAL1_ITER_TMR_LANE1, 0x0078}, + {TX_RCVDET_ST_TMR_LANE0, 0x0960}, + {TX_RCVDET_ST_TMR_LANE1, 0x0960}, + + {PHY_PLL_CFG_0803, 0x0000}, + {CMN_PDIAG_PLL0_CLK_SEL_M0, 0x8600}, + {XCVR_DIAG_HSCLK_SEL_LANE0, 0x0000}, + {XCVR_DIAG_HSCLK_SEL_LANE1, 0x0000}, + {XCVR_DIAG_HSCLK_DIV_LANE0, 0x0001}, + {XCVR_DIAG_HSCLK_DIV_LANE1, 0x0001}, + {XCVR_DIAG_PLLDRC_CTRL_LANE0, 0x0041}, + {XCVR_DIAG_PLLDRC_CTRL_LANE1, 0x0041}, + {CMN_PLL0_DSM_DIAG_M0, 0x0004}, + {CMN_PLL1_DSM_DIAG_M0, 0x0004}, + {CMN_PDIAG_PLL1_ITRIM_M0, 0x003f}, + {CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0b17}, + {CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0b17}, + {CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0e01}, + {CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0e01}, + {CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0d05}, + {CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0d05}, + {CMN_PLL0_INTDIV_M0, 0x01a0}, + {CMN_PLL1_INTDIV_M0, 0x01a0}, + {CMN_PLL0_FRACDIVL_M0, 0xaaab}, + {CMN_PLL1_FRACDIVL_M0, 0xaaab}, + {CMN_PLL0_FRACDIVH_M0, 0x0002}, + {CMN_PLL1_FRACDIVH_M0, 0x0002}, + {CMN_PLL0_HIGH_THR_M0, 0x0116}, + {CMN_PLL1_HIGH_THR_M0, 0x0116}, + {CMN_PDIAG_PLL0_CTRL_M0, 0x1002}, + {CMN_PDIAG_PLL1_CTRL_M0, 0x1002}, + {CMN_PLL0_SS_CTRL1_M0, 0x0001}, /* SSC enabled */ + {CMN_PLL0_VCOCAL_INIT_TMR, 0x00f0}, + {CMN_PLL1_VCOCAL_INIT_TMR, 0x00f0}, + {CMN_PLL0_VCOCAL_ITER_TMR, 0x0004}, + {CMN_PLL1_VCOCAL_ITER_TMR, 0x0004}, + {CMN_PLL0_VCOCAL_REFTIM_START, 0x02f8}, + {CMN_PLL1_VCOCAL_REFTIM_START, 0x02f8}, + {CMN_PLL0_VCOCAL_PLLCNT_START, 0x02f8}, + {CMN_PLL1_VCOCAL_PLLCNT_START, 0x02f8}, + {CMN_PLL0_VCOCAL_TCTRL, 0x0003}, + {CMN_PLL1_VCOCAL_TCTRL, 0x0003}, + {CMN_PLL0_LOCK_REFCNT_START, 0x00bf}, + {CMN_PLL1_LOCK_REFCNT_START, 0x00bf}, + {CMN_PLL0_LOCK_PLLCNT_START, 0x00bf}, + {CMN_PLL1_LOCK_PLLCNT_START, 0x00bf}, + {CMN_PLL0_LOCK_PLLCNT_THR, 0x0003}, + {CMN_PLL1_LOCK_PLLCNT_THR, 0x0003}, + {PHY_PIPE_USB3_GEN2_PRE_CFG0_0803, 0x0a0a}, + {PHY_PIPE_USB3_GEN2_POST_CFG0_0803, 0x1000}, + {PHY_PIPE_USB3_GEN2_POST_CFG1_0803, 0x0010}, + {CMN_CDIAG_CDB_PWRI_OVRD, 0x8200}, + {CMN_CDIAG_XCVRC_PWRI_OVRD, 0x8200}, + {TX_PSC_A0_LANE0, 0x02ff}, + {TX_PSC_A0_LANE1, 0x02ff}, + {TX_PSC_A1_LANE0, 0x06af}, + {TX_PSC_A1_LANE1, 0x06af}, + {TX_PSC_A2_LANE0, 0x06ae}, + {TX_PSC_A2_LANE1, 0x06ae}, + {TX_PSC_A3_LANE0, 0x06ae}, + {TX_PSC_A3_LANE1, 0x06ae}, + {RX_PSC_A0_LANE0, 0x0d1d}, + {RX_PSC_A0_LANE1, 0x0d1d}, + {RX_PSC_A1_LANE0, 0x0d1d}, + {RX_PSC_A1_LANE1, 0x0d1d}, + {RX_PSC_A2_LANE0, 0x0d00}, + {RX_PSC_A2_LANE1, 0x0d00}, + {RX_PSC_A3_LANE0, 0x0500}, + {RX_PSC_A3_LANE1, 0x0500}, + {TX_TXCC_CTRL_LANE0, 0x2a82}, + {TX_TXCC_CTRL_LANE1, 0x2a82}, + {TX_TXCC_CPOST_MULT_01_LANE0, 0x0014}, + {TX_TXCC_CPOST_MULT_01_LANE1, 0x0014}, + {TX_TXCC_MGNFS_MULT_000_LANE0, 0x0002}, + {TX_TXCC_MGNFS_MULT_000_LANE1, 0x0002}, + {RX_SIGDET_HL_FILT_TMR_LANE0, 0x0013}, + {RX_SIGDET_HL_FILT_TMR_LANE1, 0x0013}, + {RX_REE_GCSM1_CTRL_LANE0, 0x0000}, + {RX_REE_GCSM1_CTRL_LANE1, 0x0000}, + {RX_REE_ATTEN_THR_LANE0, 0x0c02}, + {RX_REE_ATTEN_THR_LANE1, 0x0c02}, + {RX_REE_SMGM_CTRL1_LANE0, 0x0330}, + {RX_REE_SMGM_CTRL1_LANE1, 0x0330}, + {RX_REE_SMGM_CTRL2_LANE0, 0x0300}, + {RX_REE_SMGM_CTRL2_LANE1, 0x0300}, + {XCVR_DIAG_PSC_OVRD_LANE0, 0x0003}, + {XCVR_DIAG_PSC_OVRD_LANE1, 0x0003}, + {RX_DIAG_SIGDET_TUNE_LANE0, 0x1004}, + {RX_DIAG_SIGDET_TUNE_LANE1, 0x1004}, + {RX_DIAG_NQST_CTRL_LANE0, 0x00f9}, + {RX_DIAG_NQST_CTRL_LANE1, 0x00f9}, + {RX_DIAG_DFE_AMP_TUNE_2_LANE0, 0x0c01}, + {RX_DIAG_DFE_AMP_TUNE_2_LANE1, 0x0c01}, + {RX_DIAG_DFE_AMP_TUNE_3_LANE0, 0x0002}, + {RX_DIAG_DFE_AMP_TUNE_3_LANE1, 0x0002}, + {RX_DIAG_PI_CAP_LANE0, 0x0000}, + {RX_DIAG_PI_CAP_LANE1, 0x0000}, + {RX_DIAG_PI_RATE_LANE0, 0x0031}, + {RX_DIAG_PI_RATE_LANE1, 0x0031}, + {RX_CDRLF_CNFG_LANE0, 0x018c}, + {RX_CDRLF_CNFG_LANE1, 0x018c}, + {RX_CDRLF_CNFG3_LANE0, 0x0003}, + {RX_CDRLF_CNFG3_LANE1, 0x0003} +}; + +struct cix_u3phy { + struct device *dev; + void __iomem *base; + struct regmap *phy_regmap; + struct reset_control *preset; + struct reset_control *reset; + struct clk *apb_clk; + struct clk *ref_clk; + struct mutex mutex; /* mutex to protect access to individual PHYs */ + bool init; + int init_count; + const struct cix_u3phy_cfg *cfg; +}; + +static int sky1_u3phy_exit(struct cix_u3phy *u3phy) +{ + u3phy->init_count--; + if (u3phy->init && u3phy->init_count =3D=3D 0) { + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + clk_disable_unprepare(u3phy->apb_clk); + clk_disable_unprepare(u3phy->ref_clk); + u3phy->init =3D false; + } + return 0; +} + +static int sky1_u3phy_init(struct cix_u3phy *u3phy) +{ + int ret; + + if (!u3phy->init) { + /* usb rcsu reset is default deassert */ + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + ret =3D clk_prepare_enable(u3phy->apb_clk); + if (ret) { + dev_err(u3phy->dev, "Failed to prepare_enable u3phy apb clock\n"); + goto assert_reset_preset; + } + ret =3D clk_prepare_enable(u3phy->ref_clk); + if (ret) { + dev_err(u3phy->dev, "Failed to prepare_enable u3phy ref clock\n"); + goto disable_apb_clk; + } + reset_control_deassert(u3phy->preset); + ret =3D regmap_multi_reg_write(u3phy->phy_regmap, sky1_u3phy_conf, + ARRAY_SIZE(sky1_u3phy_conf)); + if (ret) { + dev_err(u3phy->dev, "Failed to write the reg sequence\n"); + goto disable_ref_clk; + } + u3phy->init =3D true; + reset_control_deassert(u3phy->reset); + } + u3phy->init_count++; + return 0; + +disable_ref_clk: + clk_disable_unprepare(u3phy->ref_clk); +disable_apb_clk: + clk_disable_unprepare(u3phy->apb_clk); +assert_reset_preset: + reset_control_assert(u3phy->preset); + reset_control_assert(u3phy->reset); + u3phy->init =3D false; + return ret; +} + +static const struct cix_u3phy_cfg sky1_u3phy_cfg =3D { + .u3phy_init =3D sky1_u3phy_init, + .u3phy_exit =3D sky1_u3phy_exit +}; + +static int u3phy_regmap_write(void *context, unsigned int reg, unsigned in= t val) +{ + struct cix_u3phy *u3phy =3D context; + u32 offset =3D reg << 2; + + writel(val, u3phy->base + offset); + return 0; +} + +static int u3phy_regmap_read(void *context, unsigned int reg, unsigned int= *val) +{ + struct cix_u3phy *u3phy =3D context; + u32 offset =3D reg << 2; + + *val =3D readl(u3phy->base + offset); + return 0; +} + +static const struct regmap_config cix_u3phy_regmap_cfg =3D { + .reg_bits =3D 32, + .reg_stride =3D 1, + .val_bits =3D 16, + .fast_io =3D true, + .reg_write =3D u3phy_regmap_write, + .reg_read =3D u3phy_regmap_read, +}; + +static int cix_usb3_phy_power_on(struct cix_u3phy *u3phy) +{ + int ret; + const struct cix_u3phy_cfg *phy_cfgs =3D u3phy->cfg; + + if (phy_cfgs->u3phy_init) { + ret =3D phy_cfgs->u3phy_init(u3phy); + if (ret) { + dev_err(u3phy->dev, "failed to init udphy\n"); + return ret; + } + } + return 0; +} + +static int cix_usb3_phy_power_off(struct cix_u3phy *u3phy) +{ + int ret; + const struct cix_u3phy_cfg *phy_cfgs =3D u3phy->cfg; + + if (phy_cfgs->u3phy_exit) { + ret =3D phy_cfgs->u3phy_exit(u3phy); + if (ret) { + dev_err(u3phy->dev, "failed to exit udphy\n"); + return ret; + } + } + return 0; +} + +static int cix_u3phy_init(struct phy *phy) +{ + struct cix_u3phy *u3phy =3D phy_get_drvdata(phy); + int ret =3D 0; + + mutex_lock(&u3phy->mutex); + ret =3D cix_usb3_phy_power_on(u3phy); + mutex_unlock(&u3phy->mutex); + return ret; +} + +static int cix_u3phy_exit(struct phy *phy) +{ + struct cix_u3phy *u3phy =3D phy_get_drvdata(phy); + int ret =3D 0; + + mutex_lock(&u3phy->mutex); + ret =3D cix_usb3_phy_power_off(u3phy); + mutex_unlock(&u3phy->mutex); + return ret; +} + +static const struct phy_ops cix_u3phy_ops =3D { + .init =3D cix_u3phy_init, + .exit =3D cix_u3phy_exit, + .owner =3D THIS_MODULE, +}; + +static int cix_u3phy_probe(struct platform_device *pdev) +{ + struct cix_u3phy *u3phy; + struct device *dev =3D &pdev->dev; + struct phy_provider *phy_provider; + struct device_node *np =3D dev->of_node; + struct device_node *child_np; + struct phy *phy; + int ret; + + u3phy =3D devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL); + if (!u3phy) + return -ENOMEM; + dev_set_drvdata(dev, u3phy); + u3phy->dev =3D dev; + u3phy->cfg =3D device_get_match_data(dev); + if (!u3phy->cfg) { + dev_err(dev, "no OF data can be matched with %p node\n", np); + return -EINVAL; + } + u3phy->reset =3D devm_reset_control_get_exclusive(dev, "core"); + if (IS_ERR(u3phy->reset)) { + dev_err(dev, "failed to get reset\n"); + return PTR_ERR(u3phy->reset); + } + u3phy->preset =3D devm_reset_control_get_exclusive(dev, "apb"); + if (IS_ERR(u3phy->preset)) { + dev_err(dev, "failed to get preset\n"); + return PTR_ERR(u3phy->preset); + } + u3phy->apb_clk =3D devm_clk_get(dev, "apb"); + if (IS_ERR(u3phy->apb_clk)) { + dev_err(dev, "phy apb clock not found\n"); + return PTR_ERR(u3phy->apb_clk); + } + u3phy->ref_clk =3D devm_clk_get(dev, "ref"); + if (IS_ERR(u3phy->ref_clk)) { + dev_err(dev, "phy ref clock not found\n"); + return PTR_ERR(u3phy->ref_clk); + } + u3phy->base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(u3phy->base)) + return PTR_ERR(u3phy->base); + u3phy->phy_regmap =3D devm_regmap_init(dev, NULL, u3phy, &cix_u3phy_regma= p_cfg); + if (IS_ERR(u3phy->phy_regmap)) { + dev_err(dev, "failed to remap phy register\n"); + return PTR_ERR(u3phy->phy_regmap); + } + mutex_init(&u3phy->mutex); + device_for_each_child_node_scoped(dev, child_fn) { + child_np =3D to_of_node(child_fn); + if (!strncmp(fwnode_get_name(child_fn), "usb-port", 8) || + !strncmp(fwnode_get_name(child_fn), "USB", 3)) + phy =3D devm_phy_create(dev, child_np, &cix_u3phy_ops); + else + continue; + if (IS_ERR(phy)) { + ret =3D PTR_ERR(phy); + dev_err(dev, "failed to create phy: %s\n", + fwnode_get_name(child_fn)); + return ret; + } + phy_set_drvdata(phy, u3phy); + } + phy_provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (IS_ERR(phy_provider)) { + ret =3D PTR_ERR(phy_provider); + dev_err(dev, "failed to register phy provider\n"); + return ret; + } + reset_control_assert(u3phy->reset); + reset_control_assert(u3phy->preset); + return 0; +} + +static const struct of_device_id cix_u3phy_dt_match[] =3D { + { + .compatible =3D "cix,sky1-usb3-phy", + .data =3D &sky1_u3phy_cfg + }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, cix_u3phy_dt_match); + +static struct platform_driver cix_usb3_phy_driver =3D { + .probe =3D cix_u3phy_probe, + .driver =3D { + .name =3D "cix-usb3-phy", + .of_match_table =3D cix_u3phy_dt_match, + }, +}; + +module_platform_driver(cix_usb3_phy_driver); + +MODULE_AUTHOR("Hongliang Yang "); +MODULE_DESCRIPTION("Cix USB3 Only PHY driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/phy/cix/phy-cix-usbdp.h b/drivers/phy/cix/phy-cix-usbd= p.h new file mode 100644 index 000000000000..6ec7eb5c81aa --- /dev/null +++ b/drivers/phy/cix/phy-cix-usbdp.h @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _PHY_CIX_USBDP_H +#define _PHY_CIX_USBDP_H + +#define CMN_SSM_BIAS_TMR 0x0022 +#define CMN_PLLSM0_PLLPRE_TMR 0x002a +#define CMN_PLLSM0_PLLLOCK_TMR 0x002c +#define CMN_PLLSM1_PLLPRE_TMR 0x0032 +#define CMN_PLLSM1_PLLLOCK_TMR 0x0034 +#define CMN_BGCAL_INIT_TMR 0x0064 +#define CMN_BGCAL_ITER_TMR 0x0065 +#define CMN_IBCAL_INIT_TMR 0x0074 +#define CMN_PLL0_SS_CTRL1_M0 0x0098 +#define CMN_PLL0_SS_CTRL2_M0 0x0099 +#define CMN_PLL0_SS_CTRL3_M0 0x009a +#define CMN_PLL0_SS_CTRL4_M0 0x009b +#define CMN_PLL1_SS_CTRL1_M0 0x00d8 +#define CMN_PLL1_SS_CTRL2_M0 0x00d9 +#define CMN_PLL1_SS_CTRL3_M0 0x00da +#define CMN_PLL1_SS_CTRL4_M0 0x00db +#define CMN_TXPUCAL_INIT_TMR 0x0104 +#define CMN_TXPDCAL_INIT_TMR 0x010c +#define CMN_RXCAL_INIT_TMR 0x0114 +#define CMN_SD_CAL_PLLCNT_START 0x0128 +#define CMN_PDIAG_PLL1_ITRIM_M0 0x01c3 +#define CMN_DIAG_GPANA_0 0x01f0 + +#define RX_SDCAL0_INIT_TMR_LANE0 0x8044 +#define RX_SDCAL0_INIT_TMR_LANE1 0x8244 +#define RX_SDCAL0_INIT_TMR_LANE2 0x8444 +#define RX_SDCAL0_INIT_TMR_LANE3 0x8644 + +#define RX_SDCAL0_ITER_TMR_LANE0 0x8045 +#define RX_SDCAL0_ITER_TMR_LANE1 0x8245 +#define RX_SDCAL0_ITER_TMR_LANE2 0x8445 +#define RX_SDCAL0_ITER_TMR_LANE3 0x8645 + +#define RX_SDCAL1_INIT_TMR_LANE0 0x804c +#define RX_SDCAL1_INIT_TMR_LANE1 0x824c +#define RX_SDCAL1_INIT_TMR_LANE2 0x844c +#define RX_SDCAL1_INIT_TMR_LANE3 0x864c + +#define RX_SDCAL1_ITER_TMR_LANE0 0x804d +#define RX_SDCAL1_ITER_TMR_LANE1 0x824d +#define RX_SDCAL1_ITER_TMR_LANE2 0x844d +#define RX_SDCAL1_ITER_TMR_LANE3 0x864d + +#define TX_RCVDET_ST_TMR_LANE0 0x4123 +#define TX_RCVDET_ST_TMR_LANE1 0x4323 +#define TX_RCVDET_ST_TMR_LANE2 0x4523 +#define TX_RCVDET_ST_TMR_LANE3 0x4723 + +#define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01a1 +#define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01c1 + +#define XCVR_DIAG_HSCLK_SEL_LANE0 0x40e6 +#define XCVR_DIAG_HSCLK_SEL_LANE1 0x42e6 +#define XCVR_DIAG_HSCLK_SEL_LANE2 0x44e6 +#define XCVR_DIAG_HSCLK_SEL_LANE3 0x46e6 + +#define XCVR_DIAG_HSCLK_DIV_LANE0 0x40e7 +#define XCVR_DIAG_HSCLK_DIV_LANE1 0x42e7 +#define XCVR_DIAG_HSCLK_DIV_LANE2 0x44e7 +#define XCVR_DIAG_HSCLK_DIV_LANE3 0x46e7 + +#define XCVR_DIAG_PLLDRC_CTRL_LANE0 0x40e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE1 0x42e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE2 0x44e5 +#define XCVR_DIAG_PLLDRC_CTRL_LANE3 0x46e5 + +#define XCVR_DIAG_BIDI_CTRL_LANE0 0x40ea +#define XCVR_DIAG_BIDI_CTRL_LANE1 0x42ea +#define XCVR_DIAG_BIDI_CTRL_LANE2 0x44ea +#define XCVR_DIAG_BIDI_CTRL_LANE3 0x46ea + +#define CMN_PLL0_DSM_DIAG_M0 0x0094 +#define CMN_PLL1_DSM_DIAG_M0 0x00d4 +#define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01a4 +#define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01c4 + +#define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01a5 +#define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01c5 +#define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01a6 +#define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01c6 + +#define CMN_PLL0_INTDIV_M0 0x0090 +#define CMN_PLL1_INTDIV_M0 0x00d0 +#define CMN_PLL0_FRACDIVL_M0 0x0091 +#define CMN_PLL1_FRACDIVL_M0 0x00d1 + +#define CMN_PLL0_FRACDIVH_M0 0x0092 +#define CMN_PLL1_FRACDIVH_M0 0x00d2 +#define CMN_PLL0_HIGH_THR_M0 0x0093 +#define CMN_PLL1_HIGH_THR_M0 0x00d3 + +#define CMN_PDIAG_PLL0_CTRL_M0 0x01a0 +#define CMN_PDIAG_PLL1_CTRL_M0 0x01c0 + +#define CMN_PLL0_VCOCAL_TCTRL 0x0082 +#define CMN_PLL1_VCOCAL_TCTRL 0x00c2 + +#define CMN_PLL0_VCOCAL_INIT_TMR 0x0084 +#define CMN_PLL1_VCOCAL_INIT_TMR 0x00c4 + +#define CMN_PLL0_VCOCAL_ITER_TMR 0x0085 +#define CMN_PLL1_VCOCAL_ITER_TMR 0x00c5 + +#define CMN_PLL0_VCOCAL_REFTIM_START 0x0086 +#define CMN_PLL1_VCOCAL_REFTIM_START 0x00c6 + +#define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088 +#define CMN_PLL1_VCOCAL_PLLCNT_START 0x00c8 + +#define CMN_PLL0_LOCK_REFCNT_START 0x009c +#define CMN_PLL1_LOCK_REFCNT_START 0x00dc + +#define CMN_PLL0_LOCK_PLLCNT_START 0x009e +#define CMN_PLL1_LOCK_PLLCNT_START 0x00de + +#define CMN_PLL0_LOCK_PLLCNT_THR 0x009f +#define CMN_PLL1_LOCK_PLLCNT_THR 0x00df + +#define PHY_PMA_LANE_MAP 0xc010 +#define PHY_LANE_OFF_CTRL 0xc011 + +#define PHY_PIPE_USB3_GEN2_PRE_CFG0 0xc018 +#define PHY_PIPE_USB3_GEN2_POST_CFG0 0xc01a +#define PHY_PIPE_USB3_GEN2_POST_CFG1 0xc01b + +#define CMN_CDIAG_CDB_PWRI_OVRD 0x0041 +#define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047 + +#define TX_PSC_A0_LANE0 0x4100 +#define TX_PSC_A0_LANE1 0x4300 +#define TX_PSC_A0_LANE2 0x4500 +#define TX_PSC_A0_LANE3 0x4700 + +#define TX_PSC_A1_LANE0 0x4101 +#define TX_PSC_A1_LANE1 0x4301 +#define TX_PSC_A1_LANE3 0x4701 + +#define TX_PSC_A2_LANE0 0x4102 +#define TX_PSC_A2_LANE1 0x4302 +#define TX_PSC_A2_LANE2 0x4502 +#define TX_PSC_A2_LANE3 0x4702 + +#define TX_PSC_A3_LANE0 0x4103 +#define TX_PSC_A3_LANE1 0x4303 +#define TX_PSC_A3_LANE2 0x4503 +#define TX_PSC_A3_LANE3 0x4703 + +#define RX_PSC_A0_LANE0 0x8000 +#define RX_PSC_A0_LANE1 0x8200 +#define RX_PSC_A0_LANE2 0x8400 +#define RX_PSC_A0_LANE3 0x8600 + +#define RX_PSC_A1_LANE0 0x8001 +#define RX_PSC_A1_LANE1 0x8201 +#define RX_PSC_A1_LANE2 0x8401 + +#define RX_PSC_A2_LANE0 0x8002 +#define RX_PSC_A2_LANE1 0x8202 +#define RX_PSC_A2_LANE2 0x8402 +#define RX_PSC_A2_LANE3 0x8602 + +#define RX_PSC_A3_LANE0 0x8003 +#define RX_PSC_A3_LANE1 0x8203 +#define RX_PSC_A3_LANE2 0x8403 +#define RX_PSC_A3_LANE3 0x8603 + +#define RX_PSC_CAL_LANE0 0x8006 +#define RX_PSC_CAL_LANE1 0x8206 +#define RX_PSC_CAL_LANE2 0x8406 +#define RX_PSC_CAL_LANE3 0x8606 + +#define TX_TXCC_CTRL_LANE0 0x4040 +#define TX_TXCC_CTRL_LANE1 0x4240 +#define TX_TXCC_CTRL_LANE2 0x4440 +#define TX_TXCC_CTRL_LANE3 0x4640 + +#define TX_TXCC_CPOST_MULT_00_LANE0 0x404c +#define TX_TXCC_CPOST_MULT_00_LANE1 0x424c +#define TX_TXCC_CPOST_MULT_00_LANE2 0x444c +#define TX_TXCC_CPOST_MULT_00_LANE3 0x464c + +#define TX_TXCC_CPOST_MULT_01_LANE0 0x404d +#define TX_TXCC_CPOST_MULT_01_LANE1 0x424d +#define TX_TXCC_CPOST_MULT_01_LANE3 0x464d + +#define TX_TXCC_MGNFS_MULT_000_LANE0 0x4050 +#define TX_TXCC_MGNFS_MULT_000_LANE1 0x4250 +#define TX_TXCC_MGNFS_MULT_000_LANE2 0x4450 +#define TX_TXCC_MGNFS_MULT_000_LANE3 0x4650 + +#define TX_DIAG_ACYA_LANE0 0x41E7 +#define TX_DIAG_ACYA_LANE1 0x43E7 +#define TX_DIAG_ACYA_LANE2 0x45E7 +#define TX_DIAG_ACYA_LANE3 0x47E7 + +#define DRV_DIAG_TX_DRV_LANE0 0x40c6 +#define DRV_DIAG_TX_DRV_LANE1 0x42c6 +#define DRV_DIAG_TX_DRV_LANE2 0x44c6 +#define DRV_DIAG_TX_DRV_LANE3 0x46c6 + +#define RX_SIGDET_HL_FILT_TMR_LANE0 0x8090 +#define RX_SIGDET_HL_FILT_TMR_LANE1 0x8290 +#define RX_SIGDET_HL_FILT_TMR_LANE2 0x8490 + +#define RX_REE_GCSM1_CTRL_LANE0 0x8108 +#define RX_REE_GCSM1_CTRL_LANE1 0x8308 +#define RX_REE_GCSM1_CTRL_LANE2 0x8508 +#define RX_REE_GCSM1_CTRL_LANE3 0x8708 + +#define RX_REE_GCSM2_CTRL_LANE0 0x8110 +#define RX_REE_GCSM2_CTRL_LANE1 0x8310 +#define RX_REE_GCSM2_CTRL_LANE2 0x8510 +#define RX_REE_GCSM2_CTRL_LANE3 0x8710 + +#define RX_REE_PERGCSM_CTRL_LANE0 0x8118 +#define RX_REE_PERGCSM_CTRL_LANE1 0x8318 +#define RX_REE_PERGCSM_CTRL_LANE2 0x8518 +#define RX_REE_PERGCSM_CTRL_LANE3 0x8718 + +#define RX_REE_ATTEN_THR_LANE0 0x8149 +#define RX_REE_ATTEN_THR_LANE1 0x8349 +#define RX_REE_ATTEN_THR_LANE2 0x8549 + +#define RX_REE_SMGM_CTRL1_LANE0 0x8177 +#define RX_REE_SMGM_CTRL1_LANE1 0x8377 +#define RX_REE_SMGM_CTRL1_LANE2 0x8577 + +#define RX_REE_SMGM_CTRL2_LANE0 0x8178 +#define RX_REE_SMGM_CTRL2_LANE1 0x8378 +#define RX_REE_SMGM_CTRL2_LANE2 0x8578 + +#define XCVR_DIAG_PSC_OVRD_LANE0 0x40eb +#define XCVR_DIAG_PSC_OVRD_LANE1 0x42eb +#define XCVR_DIAG_PSC_OVRD_LANE2 0x44eb + +#define RX_DIAG_SIGDET_TUNE_LANE0 0x81e8 +#define RX_DIAG_SIGDET_TUNE_LANE1 0x83e8 +#define RX_DIAG_SIGDET_TUNE_LANE2 0x85e8 + +#define RX_DIAG_NQST_CTRL_LANE0 0x81e5 +#define RX_DIAG_NQST_CTRL_LANE1 0x83e5 +#define RX_DIAG_NQST_CTRL_LANE2 0x85e5 + +#define RX_DIAG_DFE_AMP_TUNE_2_LANE0 0x81e2 +#define RX_DIAG_DFE_AMP_TUNE_2_LANE1 0x83e2 +#define RX_DIAG_DFE_AMP_TUNE_2_LANE2 0x85e2 + +#define RX_DIAG_DFE_AMP_TUNE_3_LANE0 0x81e3 +#define RX_DIAG_DFE_AMP_TUNE_3_LANE1 0x83e3 +#define RX_DIAG_DFE_AMP_TUNE_3_LANE2 0x85e3 + +#define RX_DIAG_PI_CAP_LANE0 0x81f5 +#define RX_DIAG_PI_CAP_LANE1 0x83f5 +#define RX_DIAG_PI_CAP_LANE2 0x85f5 + +#define RX_DIAG_PI_RATE_LANE0 0x81f4 +#define RX_DIAG_PI_RATE_LANE1 0x83f4 +#define RX_DIAG_PI_RATE_LANE2 0x85f4 + +#define RX_DIAG_ACYA_LANE0 0x81ff +#define RX_DIAG_ACYA_LANE3 0x87ff + +#define RX_CDRLF_CNFG_LANE0 0x8080 +#define RX_CDRLF_CNFG_LANE1 0x8280 +#define RX_CDRLF_CNFG_LANE2 0x8480 + +#define RX_CDRLF_CNFG3_LANE0 0x8082 +#define RX_CDRLF_CNFG3_LANE1 0x8282 +#define RX_CDRLF_CNFG3_LANE2 0x8482 + +#define PHY_PMA_PLL_CTRL 0xe003 + +#define PHY_PMA_ISO_PLL_CTRL0 0xe005 +#define PHY_PMA_ISO_PLL_CTRL1 0xe006 + +/* Bits */ + +#define PHY_PLL_CFG_0803 0xC00E +/* 0803 phy register */ +#define PHY_PIPE_USB3_GEN2_PRE_CFG0_0803 0xc01c +#define PHY_PIPE_USB3_GEN2_POST_CFG0_0803 0xc01e +#define PHY_PIPE_USB3_GEN2_POST_CFG1_0803 0xc01f + +/* gop status address */ +#define GOP_STATUS_ADDRESS 0x83E05000 +#define GOP_STATUS_SIZE 0x04 + +struct gop_status { + unsigned char phy_status[4]; +}; + +/* + * 0: usb + * 1: 2 lane usb+ 2 lane dp + * 2: usb device + * 3: usb2.0 + 4 lane dp + */ +enum phy_role { + USB_ROLE_NONE, + USB_ROLE_HOST, + USB_ROLE_DEVICE, + USB_ROLE_HOST_20, +}; + +#endif --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022127.outbound.protection.outlook.com [52.101.126.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6820A3D2FFC; Mon, 31 Aug 2026 08:23:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.127 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164601; cv=fail; b=qTSFoxEhe3nRGLo9wbNa1L4s5C++CZ4id7SgzWKxLw5xVei7y7wwHDykJKQoDA1rvVI538VAq4CoXU6VoT9o5VJQhXH3F/ESWQLK/gHiTFHWqDlLLp1Hh6nuO/F4HmLvgT6wHkSLYAtwBY0RxtP1x626EsFe3kPJ96Abl4JdURk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164601; c=relaxed/simple; bh=c/BXHNUZRQMFJolCxqq9JeKaXXDzJ58Kkro8FbmxwGg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aMXKFphYhiGH2pOhJEFFsAixCEhjygF0RpAdLSyCaZh2fYEkuGK25nstPAo20i4jYuxe/VyPl8byPjVHJRx8xforQKZA1z5N77J4kvmeTY6fZNHYK1xeADhgxphYuPxwTr31n4ojpUF/6Tach16yQkNC6LvWozS/MFeqBDyXY3c= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.126.127 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CTEe+BHJ+oK7DSuRIPm49a+3wc12CK4vPQimCwIBXlMyF23/RREBSXxOOntl1oMP9uV9RtfTy6TOqNCAL9w4ljUqLm2cdutd+g2V8v9lm7TexjLFg3SXa23ZYRImNC0O80D9lgFsLIcN2Pb1Zv8SHTHyH2TdFZOw01IBOVoE1yVZQ/eKqewB9a2NMpY8gyeERCuNp6S6vRz9Uk+7vQATvWN8CK50eo7HLrGHpMhAiI6uN9oS3VvFRo6/JyvC4CVhFZ8cOdfGMSsvq3JbfzGg0NmK07OaxM835aGriQU9Cr9Xz9eDZbQDi+fgtILKRF6KxbRJtfcljDB1New70VuCAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JH3pqfFgYMOMyd9Rs2AO8OmYXJR4H7yfKbIzOpkAinU=; b=kc+gCXnnE/l9wwGdX8tWyiFTw8nVMtm09826c9Kchb9MYZwpYV3AeZZKeuW1rvNNvkm+211RTQX3nP0bo12VgICW+DqA3WUjib+8rIZXondBNIiolGcFwAy5PI37T1Ave5rcuI5sk4182shx4wfEY9nhoaZ/KB/ZUuiJ1EVk+CM0o8UHArzyhk4GyjkffNBWSPzaZWkSnyIVxUxFWr7QpCRj6nFvV3qlmrc9KnCkZ3zvD/e9hOYMftbdH3rvR81Zq45d8L06mbAp8RB4EJNOoLv60oMtvlf63zRFlCrbi70eC0rDEoMiIlUcsn3A27uUXgGw/LpA79oIVj/GByCrOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SG2P153CA0034.APCP153.PROD.OUTLOOK.COM (2603:1096:4:c7::21) by TYSPR06MB6362.apcprd06.prod.outlook.com (2603:1096:400:415::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 08:23:14 +0000 Received: from SG2PEPF000B66CD.apcprd03.prod.outlook.com (2603:1096:4:c7:cafe::4) by SG2P153CA0034.outlook.office365.com (2603:1096:4:c7::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Mon, 31 Aug 2026 08:23:13 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by SG2PEPF000B66CD.mail.protection.outlook.com (10.167.240.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 08:23:12 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 5AFB9409210C; Mon, 31 Aug 2026 16:23:11 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang , Gary Yang Subject: [PATCH v1 3/4] usb: cdns3: Add CIX Sky1 glue driver Date: Mon, 31 Aug 2026 16:23:07 +0800 Message-ID: <20260831082309.3854507-4-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SG2PEPF000B66CD:EE_|TYSPR06MB6362:EE_ X-MS-Office365-Filtering-Correlation-Id: e934a2e7-a6db-4781-e879-08df0739192c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|36860700016|82310400026|23010399003|10067099003|5023799004|6133799003|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: 039mdtLniNqgcg36BTuUH7kJa8KEBD72C8uJJ4U10RTUO+d3SRMFOClUOuttI9gLmje3iX0FMLPpSUaHTB1H4oa65W9e44NEyy8qX24rSCdfsP+eiFAjo7sVEiX4/gONFJHj+fPKCpQ7mQP9IsJgpwSFmgX+owJzbHoC10VkzADItLWOgzUyNKje0YjeK2Y3T2IdQi0HToJ8hefs7TMMPyMKNlzTiuALuhrTp7B2+1rR+CwZV4MbTxVkM79NNtaKsV5Kxu+ViXdnv+V09lKo5ezgMkaQ8I8dK9DIvpiMhiCwHmXWZNNez3Ykp+h9oXkchB8TyGtdHog8E6L394XA78qOQQKF0l+JW+qab2BKj3oe8yFlPd/tIeGtihFjiFEdiWK6854abx4KIOQbx6DKjX1X2G0H82I9WrqXWuG436y9UHPfF2RNFxfB4MFA8BDYNQcKjKhOuEUUCB2SY2mGUMdk2N4GhWhPhEXUQszj8mHag0ZSSW/dyLPh6GdZgRHyffcz3HnHBnCNJERqcpLe7PFMYoZ2hXpVWBw+BqTGEg3gU8IGgXd8fYND2v/zC+xFAC4VXrHuAqrjt+G4Lz1Gn659/eF93/xUz6Zi4jJn/VUwtJndrAFbqDCXF1paoRuBQokj7e5XFzn+48M5wj443WQnVkNR6xR3ApLyrwCjhtmKDSeWTajI7ma3/h9KeMbW X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(36860700016)(82310400026)(23010399003)(10067099003)(5023799004)(6133799003)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tW9hDG1p5mXVl1hK4o4SOQ316UbXRtvEwvqNLkj48AJTDUVTh82bdKFZ/V0ZIWChlj7XlpST7/0WhBczHmlBH9aLGWzp41FwG0i4DAMDCJpHNsxipioYmJcS0EAzIl04a5i2Z4aZPSfumKWw32NpTHpP8On1+y6YLb4M0YrphG1hVX26gxsmIo90mUesIBVRlpTvs9lr00jWyhp1piHUe7TgxT3/SIR5WFrmsDBLL6VokwRvE23F1nM5iQvBAQVJZVaIIS2IdN139DFjl+DOgggbqDoo3KrGI9r9HbBNk00XrvgnTqd+eQh9lqf+pTvQ1LnqLqGEDqhpsr1cHKpnU9iVZSUVrM+zipRXgsNtUFFjS3OPdW+EWBr4m32iS2fMRh0LhSLRZcXVuZpBtQaJSbeF8jTvkLg2ywkPAexyc7QVyQphkLEVsMiMQxdo/wAs X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 08:23:12.4485 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e934a2e7-a6db-4781-e879-08df0739192c X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: SG2PEPF000B66CD.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYSPR06MB6362 Content-Type: text/plain; charset="utf-8" Add glue layer for the Cadence USBSSP DRD controller on CIX Sky1 SoCs. The glue driver handles platform-specific initialization including clocks, resets, and PHY configuration. Signed-off-by: Hongliang Yang Reviewed-by: Gary Yang --- drivers/usb/cdns3/Kconfig | 13 + drivers/usb/cdns3/Makefile | 1 + drivers/usb/cdns3/cdnsp-sky1.c | 682 +++++++++++++++++++++++++++++++++ drivers/usb/cdns3/cdnsp-sky1.h | 127 ++++++ 4 files changed, 823 insertions(+) create mode 100644 drivers/usb/cdns3/cdnsp-sky1.c create mode 100644 drivers/usb/cdns3/cdnsp-sky1.h diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig index 39ad23d1ada8..03d8e170a98a 100644 --- a/drivers/usb/cdns3/Kconfig +++ b/drivers/usb/cdns3/Kconfig @@ -77,6 +77,19 @@ config USB_CDNSP_PCI If you choose to build this driver as module it will be dynamically linked and module will be called cdnsp-pci.ko =20 +config USB_CDNSP_SKY1 + tristate "Cadence USB3 support on CIX Sky1 SoC platforms" + depends on USB_CDNS3 + depends on ARCH_CIX || COMPILE_TEST + default USB_CDNS3 + help + Glue driver for the Cadence USB dual-role controllers on CIX Sky1 + (device tree compatible cix,sky1-usb3). It enables clocks and resets + from the SoC, then uses the shared cdns3 platform core (cdns.ko). + + If built as a module, the module is named cdnsp-sky1.ko and must be + loaded after the cdns core module when both are loadable modules. + config USB_CDNS3_TI tristate "Cadence USB3 support on TI platforms" depends on ARCH_K3 || COMPILE_TEST diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile index b2e4ba6a49a3..ab813aaf9940 100644 --- a/drivers/usb/cdns3/Makefile +++ b/drivers/usb/cdns3/Makefile @@ -28,3 +28,4 @@ obj-$(CONFIG_USB_CDNSP_PCI) +=3D cdnsp-pci.o obj-$(CONFIG_USB_CDNS3_TI) +=3D cdns3-ti.o obj-$(CONFIG_USB_CDNS3_IMX) +=3D cdns3-imx.o obj-$(CONFIG_USB_CDNS3_STARFIVE) +=3D cdns3-starfive.o +obj-$(CONFIG_USB_CDNSP_SKY1) +=3D cdnsp-sky1.o diff --git a/drivers/usb/cdns3/cdnsp-sky1.c b/drivers/usb/cdns3/cdnsp-sky1.c new file mode 100644 index 000000000000..3dd20451569e --- /dev/null +++ b/drivers/usb/cdns3/cdnsp-sky1.c @@ -0,0 +1,682 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * cdnsp-sky1.c - CIX Sky1 glue for Cadence USBSSP DRD controller + * + * Copyright (C) 2026 CIX Technology Group Co., Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cdnsp-sky1.h" +#include "core.h" + +static const char *cix_usb_clk_names[CIX_USB_CLK_NUM] =3D { + "sof_clk", + "usb_aclk", + "lpm_clk", + "usb_pclk", +}; + +struct cdnsp_sky1_strap_signal { + unsigned int offset, bit; +}; + +static const struct cdnsp_sky1_strap_signal strap_signals[SKY1_USB_S5_NUM]= =3D { + /* usb config in s5 domain */ + [U3_TYPEC_DRD_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_DRD_MODE_STRAP= _BIT }, + [U3_TYPEC_HOST0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST0_MODE_S= TRAP_BIT }, + [U3_TYPEC_HOST1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST1_MODE_S= TRAP_BIT }, + [U3_TYPEC_HOST2_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST2_MODE_S= TRAP_BIT }, + [U3_TYPEA_CTRL0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEA_CTRL0_MODE_S= TRAP_BIT }, + [U3_TYPEA_CTRL1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEA_CTRL1_MODE_S= TRAP_BIT}, + [U2_HOST0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST0_MODE_STRAP_BIT }, + [U2_HOST1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST1_MODE_STRAP_BIT }, + [U2_HOST2_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST2_MODE_STRAP_BIT }, + [U2_HOST3_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST3_MODE_STRAP_BIT }, +}; + +static int cdnsp_sky1_set_mode_by_id(struct device *dev, int mode) +{ + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + return regmap_update_bits(data->usb_syscon, + strap_signals[data->id].offset, + GENMASK(strap_signals[data->id].bit + 1, + strap_signals[data->id].bit), + mode << strap_signals[data->id].bit); +} + +/** + * cdnsp_sky1_clk_enable_all() - enable all clocks for usb controller + * @dev: Pointer to the device of platform_device + * + */ + +static int cdnsp_sky1_clk_enable_all(struct device *dev) +{ + int i, ret =3D 0; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_NUM; i++) { + cix_usb_clks[i] =3D devm_clk_get(dev, cix_usb_clk_names[i]); + if (IS_ERR(cix_usb_clks[i])) { + ret =3D dev_err_probe(dev, PTR_ERR(cix_usb_clks[i]), + "could not get %s clock\n", + cix_usb_clk_names[i]); + goto err_usb_clks; + } + ret =3D clk_prepare_enable(cix_usb_clks[i]); + if (ret) { + dev_err(dev, "%s enable failed:%d\n", cix_usb_clk_names[i], ret); + goto err_usb_clks; + } + } + dev_dbg(dev, "enable sky1 USB clock done\n"); + return ret; + +err_usb_clks: + cix_usb_clks[i] =3D NULL; + while (--i >=3D 0) { + clk_disable_unprepare(cix_usb_clks[i]); + cix_usb_clks[i] =3D NULL; + } + return ret; +}; + +/** + * cdnsp_sky1_clk_disable_all() - disable all clocks for usb controller + * @dev: Pointer to the device of platform_device + * + */ + +static void cdnsp_sky1_clk_disable_all(struct device *dev) +{ + int i; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_NUM; i++) + clk_disable_unprepare(cix_usb_clks[i]); +}; + +/** + * cdnsp_sky1_clk_enable_resume() - enable the clocks that are turned + * off while suspend + * @dev: Pointer to the device of platform_device + * + */ + +static int cdnsp_sky1_clk_enable_resume(struct device *dev) +{ + int i, ret; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_OFF_NUM; i++) { + ret =3D clk_prepare_enable(cix_usb_clks[i]); + if (ret) { + dev_err(dev, "failed to enable clock %s: %d\n", + cix_usb_clk_names[i], ret); + goto err_usb_clks; + } + } + return 0; + +err_usb_clks: + cix_usb_clks[i] =3D NULL; + while (--i >=3D 0) { + clk_disable_unprepare(cix_usb_clks[i]); + cix_usb_clks[i] =3D NULL; + } + return ret; +}; + +/** + * cdnsp_sky1_clk_disable_suspend() - disable the clocks which are not + * needed when suspend + * @dev: Pointer to the device of platform_device + * + */ + +static void cdnsp_sky1_clk_disable_suspend(struct device *dev) +{ + int i; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_OFF_NUM; i++) + clk_disable_unprepare(cix_usb_clks[i]); +}; + +static int sky1_handshake(void __iomem *ptr, u32 mask, u32 done, u64 timeo= ut_us) +{ + u32 result; + int ret; + + ret =3D readl_poll_timeout(ptr, result, + (result & mask) =3D=3D done || result =3D=3D U32_MAX, + 10, timeout_us); + if (result =3D=3D U32_MAX) /* card removed */ + return -ENODEV; + return ret; +} + +static int cdns_sky1_platform_suspend(struct device *dev, + bool suspend, bool wakeup) +{ + struct cdns *cdns =3D dev_get_drvdata(dev); + struct platform_device *xhci_dev =3D cdns->host_dev; + struct usb_hcd *hcd; + struct device *parent =3D cdns->dev->parent; + struct cdnsp_sky1 *data =3D dev_get_drvdata(parent); + u32 value; + int ret =3D 0; + int count =3D 3; + + data->wakeup =3D wakeup; + + if (cdns->role !=3D USB_ROLE_HOST) + return 0; + + hcd =3D dev_get_drvdata(&xhci_dev->dev); + if (!hcd) { + dev_dbg(dev, "host controller have not registered\n"); + return 0; + } + + if (suspend) { + while (count--) { + value =3D readl(hcd->regs + XECP_PM_PMCSR); + value &=3D ~PS_MASK; + value |=3D PS_D3 | PS_PME_En; + writel(value, hcd->regs + XECP_PM_PMCSR); + /* After controller enters D3, disable AXI and SOF + * until AXI valid flag changes to 0. + */ + if (sky1_handshake(data->ctst_base, AXI_CLOCK_VALID, 0, 100ULL * 1000)) + dev_dbg(dev, "enter D3 failed,register value:%x\n", + readl(data->ctst_base)); + else + break; + } + if (count < 0) { + dev_err(dev, "enter D3 failed after retries, register value:%x\n", + readl(data->ctst_base)); + } + } else { + while (count--) { + value =3D readl(hcd->regs + XECP_PM_PMCSR); + value &=3D ~PS_MASK; + value |=3D PS_D0; + value &=3D ~PS_PME_En; + writel(value, hcd->regs + XECP_PM_PMCSR); + /* Wait power state back to D0 */ + if (sky1_handshake(hcd->regs + XECP_PM_PMCSR, PS_MASK, 0, 100ULL * 1000= )) { + dev_dbg(dev, "exit D3 timeout, power state=3D0x%lx\n", + readl(hcd->regs + XECP_PM_PMCSR) & PS_MASK); + } else { + break; + } + } + if (count < 0) { + dev_err(dev, "exit D3 timeout after retries, power state=3D0x%lx\n", + readl(hcd->regs + XECP_PM_PMCSR) & PS_MASK); + } + } + + return ret; +} + +static void cdnsp_sky1_configure_controller(struct cdnsp_sky1 *data) +{ + int clk; + int v0, v1, v2; + u32 val =3D 0; + + if (data->u3_disable) { + dev_dbg(data->dev, "disable u3 port\n"); + writel(D_XEC_CFG_3XPORT_MODE_VALUE, data->device_base + + D_XEC_CFG_3XPORT_MODE); + } + writel(AXI_HALT, data->device_base + D_XEC_AXI_CAP); + writel(AXI_HALT, data->xhci_base + D_XEC_AXI_CAP); + writel(data->axi_bmax_value, data->device_base + D_XEC_AXI_CTRL0); + writel(data->axi_bmax_value, data->xhci_base + D_XEC_AXI_CTRL0); + writel((~(u32)(AXI_HALT)), data->device_base + D_XEC_AXI_CAP); + writel((~(u32)(AXI_HALT)), data->xhci_base + D_XEC_AXI_CAP); + clk =3D data->sof_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 1), data->device_base + + D_XEC_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 1), + data->device_base + D_XEC_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 1), + data->device_base + D_XEC_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 1), data->device_base + + D_XEC_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 1), + data->device_base + D_XEC_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 1), data->device_base + + D_XEC_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 1), data->device_base + + D_XEC_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 1), data->device_base + + D_XEC_PRE_REG_100MS); + dev_dbg(data->dev, "readl:%x, %x ,%x, %x, %x, %x, %x, %x\n", + readl(data->device_base + D_XEC_PRE_REG_250NS), + readl(data->device_base + D_XEC_PRE_REG_1US), + readl(data->device_base + D_XEC_PRE_REG_10US), + readl(data->device_base + D_XEC_PRE_REG_100US), + readl(data->device_base + D_XEC_PRE_REG_125US), + readl(data->device_base + D_XEC_PRE_REG_1MS), + readl(data->device_base + D_XEC_PRE_REG_10MS), + readl(data->device_base + D_XEC_PRE_REG_100MS)); + clk =3D data->lpm_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 1), data->dev= ice_base + + D_XEC_LPM_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 1), data->devic= e_base + + D_XEC_LPM_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 1), + data->device_base + D_XEC_LPM_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_100MS); + v0 =3D readl(data->xhci_base + XEC_USBSSP_CHICKEN_BITS_3); + v0 &=3D ~(CFG_APB_TIMEOUT_PSLVERR_EN | CFG_APB_PSLVERR_EN); + writel(v0, data->xhci_base + XEC_USBSSP_CHICKEN_BITS_3); + if (data->u3_disable) { + dev_dbg(data->dev, "disable u3 port\n"); + writel(XEC_CFG_3XPORT_MODE_VALUE, data->xhci_base + + XEC_CFG_3XPORT_MODE); + } else if (data->ssp_disable) { + dev_dbg(data->dev, "disable ssp\n"); + v0 =3D readl(data->xhci_base + XEC_CFG_3XPORT_MODE); + writel(v0 & CFG_3XPORT_MODE_DIS_SSP, data->xhci_base + + XEC_CFG_3XPORT_MODE); + } + clk =3D data->sof_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 0), data->xhci_base + + XEC_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 0), data->xhc= i_base + + XEC_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 0), data->xhci_= base + + XEC_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 0), data->xhci_base + + XEC_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 0), + data->xhci_base + XEC_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 0), data->xhci_base + + XEC_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 0), data->xhci_base + + XEC_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 0), data->xhci_base + + XEC_PRE_REG_100MS); + clk =3D data->lpm_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 0), data->xhc= i_base + + XEC_LPM_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 0), data->xhci_= base + + XEC_LPM_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 0), + data->xhci_base + XEC_LPM_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_100MS); + val =3D readl(data->xhci_base + XEC_USBSSP_CLK_GATING_CTRL); + val |=3D HOST20_ACLK_GATING_DISABLE | HOST20_UTMI_GATING_DISABLE; + writel(val, data->xhci_base + XEC_USBSSP_CLK_GATING_CTRL); +} + +static int cdnsp_sky1_drd_init(struct cdnsp_sky1 *data) +{ + int ret =3D 0; + + reset_control_assert(data->reset); + reset_control_assert(data->preset); + cdnsp_sky1_clk_disable_all(data->dev); + ret =3D cdnsp_sky1_clk_enable_all(data->dev); + if (ret) + return ret; + writel(CIX_USB_AXI_WR_CACHE_VALUE, data->axi_base); + cdnsp_sky1_set_mode_by_id(data->dev, MODE_STRAP_OTG); + reset_control_deassert(data->preset); + cdnsp_sky1_configure_controller(data); + reset_control_deassert(data->reset); + return ret; +} + +static void *sky1_of_get_addr_by_name(struct device_node *parent, char *na= me) +{ + struct device_node *node; + int index; + + node =3D of_get_next_child(parent, NULL); + if (node) { + index =3D of_property_match_string(node, "reg-names", name); + if (index >=3D 0) + return of_iomap(node, index); + } + return NULL; +} + +static void *sky1_get_addr_by_name(struct device *dev, char *name) +{ + return sky1_of_get_addr_by_name(dev->of_node, name); +} + +static void sky1_put_addr(void __iomem *regs) +{ + if (regs) + iounmap(regs); +} + +static struct of_dev_auxdata cdns_sky1_auxdata[] =3D { + { + .compatible =3D "cdns,usb3", + }, + {}, +}; + +static int cdnsp_sky1_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct device_node *node =3D dev->of_node; + struct cdnsp_sky1 *data; + int ret =3D 0; + struct cdns3_platform_data *cdns_sky1_pdata; + + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + data->axi_base =3D devm_platform_ioremap_resource_byname(pdev, "axi_prope= rty"); + if (IS_ERR(data->axi_base)) { + dev_err(dev, "can't map IOMEM resource\n"); + return PTR_ERR(data->axi_base); + } + data->ctst_base =3D devm_platform_ioremap_resource_byname(pdev, "controll= er_status"); + if (IS_ERR(data->ctst_base)) { + dev_err(dev, "can't map IOMEM resource\n"); + return PTR_ERR(data->ctst_base); + } + data->reset =3D devm_reset_control_get(&pdev->dev, "usb_reset"); + if (IS_ERR(data->reset)) { + ret =3D PTR_ERR(data->reset); + dev_err(dev, "get reset error:%d\n", ret); + return ret; + } + data->preset =3D devm_reset_control_get(&pdev->dev, "usb_preset"); + if (IS_ERR(data->preset)) { + ret =3D PTR_ERR(data->preset); + dev_err(dev, "get reset error:%d\n", ret); + return ret; + } + platform_set_drvdata(pdev, data); + data->dev =3D dev; + ret =3D of_alias_get_id(dev->of_node, "usb"); + if (ret =3D=3D -ENODEV) { + if (device_property_read_u32(dev, "id", &ret)) + ret =3D -ENODEV; + } + if (ret < 0 || ret >=3D SKY1_USB_S5_NUM) { + dev_err(dev, "get alias failed.\n"); + return ret; + } + data->id =3D ret; + data->usb_syscon =3D syscon_regmap_lookup_by_phandle(dev->of_node, + "cix,usb_syscon"); + if (IS_ERR(data->usb_syscon)) { + dev_err(dev, "Unable to get cix,usb_syscon regmap"); + return PTR_ERR(data->usb_syscon); + } + data->u3_disable =3D device_property_read_bool(dev, "u3-port-disable"); + data->ssp_disable =3D device_property_read_bool(dev, "ssp-disable"); + if (!device_property_read_u32(dev, "sof_clk_freq", &ret)) + data->sof_clk_freq =3D ret; + else + data->sof_clk_freq =3D CIX_USB_CLK_32K; + if (!device_property_read_u32(dev, "lpm_clk_freq", &ret)) + data->lpm_clk_freq =3D ret; + else + data->lpm_clk_freq =3D CIX_USB_CLK_8M; + if (!device_property_read_u32(dev, "axi_bmax_value", &ret)) + data->axi_bmax_value =3D ret; + else + data->axi_bmax_value =3D AXI_BMAX_VALUE_DEFAULT; + data->xhci_base =3D sky1_get_addr_by_name(dev, "xhci"); + if (!data->xhci_base) + return -ENODEV; + data->device_base =3D sky1_get_addr_by_name(dev, "dev"); + if (!data->device_base) + return -ENODEV; + ret =3D cdnsp_sky1_drd_init(data); + if (ret =3D=3D -ETIMEDOUT) + return -EPROBE_DEFER; + if (ret) + return ret; + data->oc_gpio =3D devm_gpiod_get_optional(data->dev, "oc", GPIOD_IN); + if (IS_ERR(data->oc_gpio)) { + dev_err(data->dev, "can not get oc_gpio\n"); + ret =3D PTR_ERR(data->oc_gpio); + return ret; + } + if (data->oc_gpio) { + ret =3D gpiod_direction_input(data->oc_gpio); + if (ret < 0) + dev_err(data->dev, "set oc_gpio input failed:%d\n", ret); + } + /* release by platform_device_release */ + cdns_sky1_pdata =3D kzalloc(sizeof(*cdns_sky1_pdata), GFP_KERNEL); + if (!cdns_sky1_pdata) + return -ENOMEM; + cdns_sky1_pdata->platform_suspend =3D cdns_sky1_platform_suspend; + cdns_sky1_pdata->quirks =3D CDNS3_DEFAULT_PM_RUNTIME_ALLOW; + cdns_sky1_auxdata->platform_data =3D cdns_sky1_pdata; + ret =3D of_platform_populate(node, NULL, cdns_sky1_auxdata, dev); + if (ret) { + dev_err(dev, "failed to create children: %d\n", ret); + goto err; + } + device_set_wakeup_capable(dev, true); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + return 0; +err: + kfree(cdns_sky1_pdata); + return ret; +} + +static void cdnsp_sky1_remove(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + pm_runtime_get_sync(dev); + of_platform_depopulate(dev); + sky1_put_addr(data->xhci_base); + sky1_put_addr(data->device_base); + reset_control_deassert(data->reset); + reset_control_deassert(data->preset); + cdnsp_sky1_clk_disable_all(dev); + platform_set_drvdata(pdev, NULL); +} + +#ifdef CONFIG_PM +/* Because the wake-up interrupt and host interrupt are the same interrupt= , closing the axi + * and sof clock will result in the inability to generate port status chan= ge interrupt. + */ + +static int cdnsp_sky1_system_suspend(struct device *dev) +{ + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + if (!data->wakeup) { + reset_control_assert(data->reset); + reset_control_assert(data->preset); + } + cdnsp_sky1_clk_disable_suspend(dev); + return 0; +} + +static int cdnsp_sky1_system_resume(struct device *dev) +{ + int ret =3D 0; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + ret =3D cdnsp_sky1_clk_enable_resume(dev); + if (ret) + return ret; + if (!data->wakeup) { + writel(CIX_USB_AXI_WR_CACHE_VALUE, data->axi_base); + cdnsp_sky1_set_mode_by_id(data->dev, MODE_STRAP_OTG); + reset_control_deassert(data->preset); + cdnsp_sky1_configure_controller(data); + reset_control_deassert(data->reset); + } + return 0; +} + +static const struct dev_pm_ops cdnsp_sky1_pm_ops =3D { + .suspend =3D cdnsp_sky1_system_suspend, + .resume =3D cdnsp_sky1_system_resume, +}; +#endif /* CONFIG_PM */ + +static const struct of_device_id cdns_sky1_of_match[] =3D { + { .compatible =3D "cix,sky1-usbssp", }, + {}, +}; +MODULE_DEVICE_TABLE(of, cdns_sky1_of_match); + +static int cdnsp_sky1_find_cdns(struct device *dev, void *data) +{ + struct cdns **cdns_ptr =3D data; + + if (dev->of_node && of_device_is_compatible(dev->of_node, "cdns,usb3")) { + *cdns_ptr =3D dev_get_drvdata(dev); + return 1; + } + return 0; +} + +static int cdnsp_sky1_find_gadget_match(struct device *dev, void *data) +{ + struct device **gadget_dev =3D data; + const char *name =3D dev_name(dev); + static const char gadget_prefix[] =3D "gadget."; + + /* + * The gadget device is registered on the gadget bus with name + * "gadget.%d" (see usb_add_gadget_udc -> dev_set_name). + * It sits on the gadget bus and has the function driver bound to it. + * Verify the device is on the gadget bus by checking the bus name. + * This prevents matching devices that happen to have "gadget." prefix + * in their name but are not real gadget devices, and also avoids + * NULL pointer dereference when device bus is being removed. + */ + if (name && dev->bus && !strcmp(dev->bus->name, "gadget") && + !strncmp(name, gadget_prefix, sizeof(gadget_prefix) - 1)) { + *gadget_dev =3D dev; + return 1; + } + return 0; +} + +static void cdnsp_sky1_shutdown(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct cdns *cdns =3D NULL; + struct device *gadget_dev =3D NULL; + + if (!device_may_wakeup(dev)) { + /* + * Find the cdns3 child device, then find its gadget device + * and release the function driver before disabling clocks. + * This ensures all register accesses in gadget_unbind_driver + * complete before clocks are turned off. + */ + device_for_each_child(dev, &cdns, cdnsp_sky1_find_cdns); + if (cdns) + device_for_each_child(cdns->dev, &gadget_dev, + cdnsp_sky1_find_gadget_match); + if (gadget_dev) + device_release_driver(gadget_dev); + if (cdns && cdns->host_dev) { + struct usb_hcd *hcd =3D platform_get_drvdata(cdns->host_dev); + + if (hcd && hcd->irq > 0) { + disable_irq(hcd->irq); + synchronize_irq(hcd->irq); + /* + * Clear HCD_FLAG_HW_ACCESSIBLE before disable_irq. + * This prevents usb_hcd_irq from calling xhci_irq + * (which reads USBSTS) after clocks are disabled. + */ + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + } + } + reset_control_assert(data->reset); + reset_control_assert(data->preset); + cdnsp_sky1_clk_disable_all(dev); + } +} + +static struct platform_driver cdnsp_sky1_driver =3D { + .probe =3D cdnsp_sky1_probe, + .remove =3D cdnsp_sky1_remove, + .shutdown =3D cdnsp_sky1_shutdown, + .driver =3D { + .name =3D "cdnsp-sky1", + .of_match_table =3D cdns_sky1_of_match, + .pm =3D pm_ptr(&cdnsp_sky1_pm_ops), + }, +}; + +module_platform_driver(cdnsp_sky1_driver); + +MODULE_ALIAS("platform:cdnsp-sky1"); +MODULE_DESCRIPTION("CIX Sky1 Cadence USBSSP DRD glue driver"); +MODULE_AUTHOR("Hongliang Yang "); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/cdns3/cdnsp-sky1.h b/drivers/usb/cdns3/cdnsp-sky1.h new file mode 100644 index 000000000000..49c3d5eab174 --- /dev/null +++ b/drivers/usb/cdns3/cdnsp-sky1.h @@ -0,0 +1,127 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _CDNSP_SKY1_H +#define _CDNSP_SKY1_H +#include +#include +#include + +#define USB_MODE_STRAP_S5_DOMAIN 0x424 + +#define MODE_STRAP_OTG 0 + +#define U3_TYPEC_DRD_ID 0 +#define U3_TYPEC_HOST0_ID 1 +#define U3_TYPEC_HOST1_ID 2 +#define U3_TYPEC_HOST2_ID 3 +#define U3_TYPEA_CTRL0_ID 4 +#define U3_TYPEA_CTRL1_ID 5 +#define U2_HOST0_ID 6 +#define U2_HOST1_ID 7 +#define U2_HOST2_ID 8 +#define U2_HOST3_ID 9 +#define SKY1_USB_S5_NUM 10 + +#define U3_TYPEC_DRD_MODE_STRAP_BIT 12 +#define U3_TYPEC_HOST0_MODE_STRAP_BIT 14 +#define U3_TYPEC_HOST1_MODE_STRAP_BIT 16 +#define U3_TYPEC_HOST2_MODE_STRAP_BIT 18 +#define U3_TYPEA_CTRL0_MODE_STRAP_BIT 8 +#define U3_TYPEA_CTRL1_MODE_STRAP_BIT 10 +#define U2_HOST0_MODE_STRAP_BIT 0 +#define U2_HOST1_MODE_STRAP_BIT 2 +#define U2_HOST2_MODE_STRAP_BIT 4 +#define U2_HOST3_MODE_STRAP_BIT 6 + +#define AXI_HALT BIT(31) +#define AXI_BMAX_VALUE_DEFAULT 0x7 + +#define D_XEC_CFG_3XPORT_MODE 0x2040 +#define D_XEC_AXI_CAP 0x2174 +#define D_XEC_AXI_CTRL0 0x217C +#define D_XEC_PRE_REG_250NS 0x21E8 +#define D_XEC_PRE_REG_1US 0x21EC +#define D_XEC_PRE_REG_10US 0x21F0 +#define D_XEC_PRE_REG_100US 0x21F4 +#define D_XEC_PRE_REG_125US 0x21F8 +#define D_XEC_PRE_REG_1MS 0x21FC +#define D_XEC_PRE_REG_10MS 0x2200 +#define D_XEC_PRE_REG_100MS 0x2204 +#define D_XEC_LPM_PRE_REG_250NS 0x2208 +#define D_XEC_LPM_PRE_REG_1US 0x220C +#define D_XEC_LPM_PRE_REG_10US 0x2210 +#define D_XEC_LPM_PRE_REG_100US 0x2214 +#define D_XEC_LPM_PRE_REG_125US 0x2218 +#define D_XEC_LPM_PRE_REG_1MS 0x221C +#define D_XEC_LPM_PRE_REG_10MS 0x2220 +#define D_XEC_LPM_PRE_REG_100MS 0x2224 + +#define XEC_CFG_3XPORT_MODE 0x2040 +#define XEC_PRE_REG_250NS 0x21E8 +#define XEC_PRE_REG_1US 0x21EC +#define XEC_PRE_REG_10US 0x21F0 +#define XEC_PRE_REG_100US 0x21F4 +#define XEC_PRE_REG_125US 0x21F8 +#define XEC_PRE_REG_1MS 0x21FC +#define XEC_PRE_REG_10MS 0x2200 +#define XEC_PRE_REG_100MS 0x2204 +#define XEC_LPM_PRE_REG_250NS 0x2208 +#define XEC_LPM_PRE_REG_1US 0x220C +#define XEC_LPM_PRE_REG_10US 0x2210 +#define XEC_LPM_PRE_REG_100US 0x2214 +#define XEC_LPM_PRE_REG_125US 0x2218 +#define XEC_LPM_PRE_REG_1MS 0x221C +#define XEC_LPM_PRE_REG_10MS 0x2220 +#define XEC_LPM_PRE_REG_100MS 0x2224 +#define XEC_USBSSP_CHICKEN_BITS_3 0x2230 +#define XEC_USBSSP_CLK_GATING_CTRL 0x2234 +#define XECP_PM_PMCSR 0x2240 + +/* XEC_USBSSP_CLK_GATING_CTRL */ +#define HOST20_ACLK_GATING_DISABLE BIT(4) +#define HOST20_UTMI_GATING_DISABLE BIT(5) + +/* XECP_PM_PMCSR */ +#define PS_MASK GENMASK(1, 0) +#define PS_D0 0 +#define PS_D3 3 +#define PS_PME_En BIT(8) + +#define D_XEC_CFG_3XPORT_MODE_VALUE 0xa0031e07 +#define XEC_CFG_3XPORT_MODE_VALUE 0xa0031e07 +#define CFG_3XPORT_MODE_DIS_SSP (~(1 << 31)) + +#define CFG_APB_TIMEOUT_PSLVERR_EN BIT(22) +#define CFG_APB_PSLVERR_EN BIT(23) + +#define CIX_USB_CLK_NUM (4) +#define CIX_USB_CLK_OFF_NUM (2) +#define CIX_USB_AXI_WR_CACHE_VALUE 0x33 +#define CIX_USB_CLK_32K 32000 +#define CIX_USB_CLK_8M 8000000 + +#define AXI_CLOCK_VALID BIT(1) + +struct cdnsp_sky1 { + struct device *dev; + void __iomem *axi_base; + void __iomem *ctst_base; + void __iomem *dr_base; + void __iomem *xhci_base; + void __iomem *device_base; + struct platform_device *cdnsp_pdev; + struct reset_control *reset; + struct reset_control *preset; + struct clk *cix_usb_clks[CIX_USB_CLK_NUM]; + int id; + struct regmap *usb_syscon; + int lpm_clk_freq; + int sof_clk_freq; + bool u3_disable; + bool ssp_disable; + int axi_bmax_value; + struct gpio_desc *oc_gpio; + bool wakeup; +}; + +#endif /* _CDNSP_SKY1_H */ --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022105.outbound.protection.outlook.com [40.107.75.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C874D3D1CBE; Mon, 31 Aug 2026 08:23:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164599; cv=fail; b=NDAORGXQzbxktwIQJR+gz8az8ldX0exJZrMRGOrphhkiOrRo0zXHhZ4/7/pkt/T37/VOe5C+ybrohPvprCBkW9+vx3+YI69j6gtD1ZqgFgVHtH4cd9fa9JOnwS27uQoAfs2LsHQyS0KEpgvlCSRjjSeIAj6F25phgxk3pK7QZVw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164599; c=relaxed/simple; bh=4zmOIma6CG1f7MboAGZzS/etRBPSv2/enZ3E30BTym0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pc3uQWkiBauzL1vqPy08VBVWltNtsuNRfkhqW9YzHHvmF6+Oz+hhLiadp3Ri3u5oKBmyJfRRa2VUJ2cQL6RtpJwTAv1+2ehhAsS8ndzPLfAu8u4JSjz6Hrfbae1IF/Hy2vzmtVJDFpmadX6O3jLx6eioH95Aficbn1IWKnNxjrQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=40.107.75.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lE1PvmjkUVi4Q0OsWABLy92F70LuFlY+7nmofcWOh5Obe0fI+872iZIFlF+BZUd8JHbUH/Oo1r30dEHSOygmRhrWoiJn3FW9Wa6v1RH+26XbNCOl84hcl9vsYu9/GroqxBwDcsi0xcpEwmEm3NlWphePXxpUGWX1O90VLh081yc3kspIFnvTePvOGlQj8r2HufmzeXGx1o8bZ6vGyyAyl8BZJ0AttaMIdWoCKnZ+mCnR+KlzyqCP/3dbYYBei++CcBOCKTsRmZXDXRN/GBKw3lRVyPmv8JoNxkxRpIrfofaiYgVL9lriPoxg2gcYXHqEyc5uH/2PALYCWseMCYRGZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1GFuSqhzb2adpCqyR50iZnG4aJEoaKym8aRjqQf2xwY=; b=XtjJEe2RX49z8mraFdypxIUoo4LBPdiUuwr5JYtN8XJaeexv89n/0QaaEZKZ3Fb3X/HXX3qUJWauGl/S/ubnbJ3gFFfW24ksT7XrE0wZwGB1gu3Cf4vfbURi5w7wkeuTt1vYOSVWAzcWmYJkRQoJ57nJRhEyBnToSNOMFV5D9MXT3gcSAXHXMTQdZrsxfxfd2eRIR7myvIvH65pC/8czk9PhY7+zPEo65M7pztNS1WU5KPlZQTL4/a79U5rAkToF9Pj4c+ujyxqkLCU27c7UAcO/Wh1Xp4hWjSEeTlW/FeFIanKSvdVviELOCpX0dD6qA8Xt2oI+khx8D0aoiIMw0Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SG2P153CA0036.APCP153.PROD.OUTLOOK.COM (2603:1096:4:c7::23) by SEZPR06MB5959.apcprd06.prod.outlook.com (2603:1096:101:e3::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 08:23:14 +0000 Received: from SG2PEPF000B66CD.apcprd03.prod.outlook.com (2603:1096:4:c7:cafe::c1) by SG2P153CA0036.outlook.office365.com (2603:1096:4:c7::23) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Mon, 31 Aug 2026 08:23:14 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by SG2PEPF000B66CD.mail.protection.outlook.com (10.167.240.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 08:23:13 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 3563D409210F; Mon, 31 Aug 2026 16:23:12 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v1 4/4] arm64: dts: cix: Add USB4/USB5 nodes for Sky1 Date: Mon, 31 Aug 2026 16:23:08 +0800 Message-ID: <20260831082309.3854507-5-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SG2PEPF000B66CD:EE_|SEZPR06MB5959:EE_ X-MS-Office365-Filtering-Correlation-Id: 6b904db2-f1b9-4369-754a-08df07391a12 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|7416014|1800799024|82310400026|376014|36860700016|18002099003|22082099003|56012099006|10067099003; X-Microsoft-Antispam-Message-Info: v+x/5p5gLY6jqyoBREGCYQts902t8t+ohC71l2KX/wbOgAOBlCKJckMFfrQqN9kPczfNNKhfy5JhFg/tu6uChgjGeAPD6MwF/tM3WL7VmJ421OdvbmVi9pTs8TRqoXY9KlJHwfVHiuo23SeMmQnxUsISYlhCTqImK/cNWqoXkeuV7lHGE+oDR0ftRYD8dtDhyBxG4rfI+tKd/XFZY2jmYj3be1NhI7sLWXbowVWuQtfNcqZZxtdTVGee+6LmloN2pjgZN4Aw3BLnKgg/5SLtJig4tc503MR9kgThla+PWahX4vHgjAOfbJ7Sx1dyCdA7ZAiHJQcsfSZk8k7OMqvkwOAiXTWGh5Sts+Pk+l7wOc45RMkTTAwC8/Z2bhJ0cfUNc8p5x9Wx9kMJR1eV9fERJsIszfY9d9wNvsxjIgVXhO/7zRJLq0NPUvx36O2iXmUHHQ71c+/+tXkJ0sGZ/6+iF6Lcvp2cQSzapfKK2FVa2qhbLcXUAqxTa9djuF60LxUlT8hNdLiuTnvadcSljO/E9Bji/NAAERR+5UbmsWX8//gycciWA6f2fp5T3vaZ5UvIVDkzYNmVf1hSoBs+/KOHnUpxYM8aE2DKO+WMQGvO3kAcaCR1Q+jejnp+FDWAmvaLRqNMwXvSRCT1vc9g3N3WUyC0uaSUFHzi9Lu5HctunvbELkE+yW5Mw8SraG92/sFdFCxLdsEQHvIexfEUit//QQ== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(23010399003)(7416014)(1800799024)(82310400026)(376014)(36860700016)(18002099003)(22082099003)(56012099006)(10067099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8nT+ujzEz58waYtn1pzXDBS8M88spschGWxodp4xm4uX2GoU35BOuWzDN0aC0u/XMBc6KZ1nyTPtIoPZJE/naxeBSNuORZzkHa20oOc7AR75Czwq/YTRu/41A8VrBTCG9rfwLiH4OGirE0Ia1ndIKJb8ipnd52J5+U/1fozLuE6C+lk5LIUv1yWHoPbdDaQX4eE20WihTLt0pDScp6zQjDulGnjWs53fQvDUdc6jykt/g0D7F/OT2E3K+UBXPdo1eYynmvTj9Y4SDHvdA7j2jD3XECGkPlK9HISm2mhpyzmFu3e/o/zf7sHTVaYo9N2HgVHlj744eDxAiW/u/LL6aqVD7tSEYEL2Izqn9FrTPsF59CL4h49EhpvM9FVEWXCkWC/xciUk0WarNiLLsWhUZhlzXcheiLtliVelnma48rlbmFkc2eWpaUENTfljmiYk X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 08:23:13.6390 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6b904db2-f1b9-4369-754a-08df07391a12 X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: SG2PEPF000B66CD.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR06MB5959 Content-Type: text/plain; charset="utf-8" Add USB4 and USB5 controller nodes (based on Cadence USBSSP DRD) and their associated USB3 PHY nodes for the CIX Sky1 SoC. Enable USB4 and USB5 in host mode on the Radxa Orion O6 board. Signed-off-by: Hongliang Yang --- arch/arm64/boot/dts/cix/sky1-orion-o6.dts | 36 ++++++ arch/arm64/boot/dts/cix/sky1.dtsi | 133 ++++++++++++++++++++++ 2 files changed, 169 insertions(+) diff --git a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts b/arch/arm64/boot/dt= s/cix/sky1-orion-o6.dts index e39c87774c12..33d3ffdc3f9e 100644 --- a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts +++ b/arch/arm64/boot/dts/cix/sky1-orion-o6.dts @@ -80,6 +80,22 @@ pins { =20 }; }; + + pinctrl_usb4: usb4-power-on-cfg { + pins { + pinmux =3D ; + bias-pull-down; + drive-strength =3D <8>; + }; + }; + + pinctrl_usb5: usb5-power-on-cfg { + pins { + pinmux =3D ; + bias-pull-down; + drive-strength =3D <8>; + }; + }; }; =20 &pcie_x8_rc { @@ -117,3 +133,23 @@ &s5_gpio2 { &uart2 { status =3D "okay"; }; + +&usb4 { + pinctrl-names =3D "default"; + pinctrl-0 =3D <&pinctrl_usb4>; +}; + +&usbss_4 { + status =3D "okay"; + dr_mode =3D "host"; +}; + +&usb5 { + pinctrl-names =3D "default"; + pinctrl-0 =3D <&pinctrl_usb5>; +}; + +&usbss_5 { + status =3D "okay"; + dr_mode =3D "host"; +}; diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sk= y1.dtsi index a77c52296ebd..44736c071573 100644 --- a/arch/arm64/boot/dts/cix/sky1.dtsi +++ b/arch/arm64/boot/dts/cix/sky1.dtsi @@ -6,6 +6,8 @@ =20 #include #include +#include +#include #include "sky1-power.h" =20 / { @@ -13,6 +15,11 @@ / { #address-cells =3D <2>; #size-cells =3D <2>; =20 + aliases { + usb4 =3D &usb4; + usb5 =3D &usb5; + }; + cpus { #address-cells =3D <2>; #size-cells =3D <0>; @@ -574,6 +581,132 @@ mbox_ap2sfh: mailbox@80a0000 { cix,mbox-dir =3D "tx"; }; =20 + usb4: usb@91c0300 { + compatible =3D "cix,sky1-usbssp"; + #address-cells =3D <2>; + #size-cells =3D <2>; + ranges; + + reg =3D <0x00 0x091c0314 0x00 0x4>, + <0x00 0x091c0400 0x00 0x4>; + reg-names =3D "axi_property", "controller_status"; + + resets =3D <&s5_syscon SKY1_USBC_SS2_PRST_N>, + <&s5_syscon SKY1_USBC_SS2_RST_N>; + reset-names =3D "usb_preset", "usb_reset"; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_H0_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_0_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H0_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_0_APB_GATE>; + clock-names =3D "sof_clk", "usb_aclk", "lpm_clk", "usb_pclk"; + + cix,usb_syscon =3D <&s5_syscon>; + axi_bmax_value =3D <0x7>; + sof_clk_freq =3D <8000000>; + lpm_clk_freq =3D <32000>; + status =3D "disabled"; + + usbss_4: usb-controller@91d0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91d0000 0x00 0x4000>, + <0x00 0x91d4000 0x00 0x4000>, + <0x00 0x91d8000 0x00 0x8000>; + reg-names =3D "otg", "dev", "xhci"; + + interrupts =3D , + , + , + ; + interrupt-names =3D "host", + "peripheral", + "otg", + "wakeup"; + + maximum-speed =3D "super-speed-plus"; + dr_mode =3D "otg"; + phys =3D <&usb3_phy4_0>; + phy-names =3D "cdns3,usb3-phy"; + status =3D "disabled"; + }; + }; + + usb5: usb@91c0304 { + compatible =3D "cix,sky1-usbssp"; + #address-cells =3D <2>; + #size-cells =3D <2>; + ranges; + + reg =3D <0x00 0x091c0324 0x00 0x4>, + <0x00 0x091c0410 0x00 0x4>; + reg-names =3D "axi_property", "controller_status"; + + resets =3D <&s5_syscon SKY1_USBC_SS3_PRST_N>, + <&s5_syscon SKY1_USBC_SS3_RST_N>; + reset-names =3D "usb_preset", "usb_reset"; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_H1_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_1_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H1_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_1_APB_GATE>; + clock-names =3D "sof_clk", "usb_aclk", "lpm_clk", "usb_pclk"; + + cix,usb_syscon =3D <&s5_syscon>; + axi_bmax_value =3D <0x7>; + sof_clk_freq =3D <8000000>; + lpm_clk_freq =3D <32000>; + status =3D "disabled"; + + usbss_5: usb-controller@91e0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91e0000 0x00 0x4000>, + <0x00 0x91e4000 0x00 0x4000>, + <0x00 0x91e8000 0x00 0x8000>; + reg-names =3D "otg", "dev", "xhci"; + + interrupts =3D , + , + , + ; + interrupt-names =3D "host", + "peripheral", + "otg", + "wakeup"; + + maximum-speed =3D "super-speed-plus"; + dr_mode =3D "otg"; + phys =3D <&usb3_phy4_1>; + phy-names =3D "cdns3,usb3-phy"; + status =3D "disabled"; + }; + }; + + usb3_phy4: usb-phy@9210000 { + #address-cells =3D <1>; + #size-cells =3D <0>; + compatible =3D "cix,sky1-usb3-phy"; + reg =3D <0x00 0x09210000 0x00 0x40000>; + status =3D "disabled"; + + resets =3D <&s5_syscon SKY1_USBPHY_SS_RST_N>, + <&s5_syscon SKY1_USBPHY_SS_PST_N>; + reset-names =3D "reset", "preset"; + + clocks =3D <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>, + <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>; + clock-names =3D "apb_clk", "ref_clk"; + + usb3_phy4_0: usb-port@0 { + #phy-cells =3D <0>; + status =3D "disabled"; + }; + + usb3_phy4_1: usb-port@1 { + #phy-cells =3D <0>; + status =3D "disabled"; + }; + }; + pcie_x8_rc: pcie@a010000 { compatible =3D "cix,sky1-pcie-host"; reg =3D <0x00 0x0a010000 0x00 0x10000>, --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11023117.outbound.protection.outlook.com [52.101.127.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB38E233134; Wed, 2 Sep 2026 03:21:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.117 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319305; cv=fail; b=RlIMh5KILZFGPYgtwPsbftD5nBfOyT3Yzptl0vHDGBvIYtyZP8ZgXA1NOmKju0LZ4KsILdB1khjMQbVztbVB2a23lhIx+bQ11DdUfxI4gLkRQ0fpNQyjmKTPngX3vVuUxowW5G0RX64IcJRoQiuWUUyswF8unbNETSwTBczOIpI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319305; c=relaxed/simple; bh=Sm/WA41RfZEUssTPIalfCN7z/2xt3S0YnXj/GrNwxEE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GkmObgFfB8hFRUWdumZGckW9OD5dkMo8iFrosxsNwXSHSIisNGxftmP/6SEXi83WY/qnZGQ51tIsmwtLGtRPyP74ErdLuovZt1We107qYhRm4nVsIjOjhd7lDNaggLPdufFS+HP19PnW+1LmAF5GiVHWMWtFpQSld+TVnvd/hao= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.127.117 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ir7WJ/XpxUrDl9frbLw2m4hvMBJdvUMLeD+XCoe36e4SbllchI0dJmIJb8HKxI0aJnyUt9p+yEkP7oNWxVW7uffGNTsAR/yKmGKabaf51XpQxZXZMbQW2oQtMrxESBevifbMxCuCUm0iN/afOAxVQxSpv8E2dqojRT61krJXkUGqAhcDh5u2QqAWA2xTbp99YAs56e+NLjahCWVTQ7mjUPVLR0CVI7LAd2kACLc9dIJihtJXdq3dfbPUpyMjn3ArWm0/eS4wv0x/s/JjAhftQhLCXOFTW3RzZ5Ezzl7IMKJHjCGOB2QffdrUlQ8cljfGQa2r3YVVKYc+2FdCROVpBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=NKUhy4na6Oh92YTXqsuYYgcOcCrh2ir4ImfQcjbi2S8=; b=Cbw7MvYyhw8R7zv4bXM887hLmFL3lcZST0Hsy0HBh1y61+eaB9/e5s578ltTQFZMVsVdN1dDKfD67MIFVkGm3eWhQip0qWWQ9J+LaLCwmtlnn0xg1bh8kzjNgMhH+l+12kcGY35Ou9NVxOcD41j66M1SfODFQI+ZC1Aw8lXheef7mEMtQ7oEHZ9D7oQWq64UDs3cke+4rVvPjN6RZraHbGjpH201C6GSgssENzCQI3LvNDFFyFI/spqp5P5RDwAjXS2eqY4zS8wnNXgnVkja49OB7SVcJox3LgzLY6wnPnljCAj0CuTuKAboJT2i6oXT3RbWggnXX9C+QRyZSpd2hA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from PS2PR02CA0070.apcprd02.prod.outlook.com (2603:1096:300:5a::34) by SEYPR06MB8123.apcprd06.prod.outlook.com (2603:1096:101:2f3::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 03:21:39 +0000 Received: from TY2PEPF0000AB85.apcprd03.prod.outlook.com (2603:1096:300:5a:cafe::7f) by PS2PR02CA0070.outlook.office365.com (2603:1096:300:5a::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Wed, 2 Sep 2026 03:21:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by TY2PEPF0000AB85.mail.protection.outlook.com (10.167.253.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 03:21:38 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 5AABF4092111; Wed, 2 Sep 2026 11:21:37 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v2 4/5] usb: cdns3: Add CIX Sky1 glue driver Date: Wed, 2 Sep 2026 11:21:33 +0800 Message-ID: <20260902032134.1182634-5-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PEPF0000AB85:EE_|SEYPR06MB8123:EE_ X-MS-Office365-Filtering-Correlation-Id: caead45f-9a7e-40f8-4c4e-08df08a14d45 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|23010399003|36860700016|82310400026|1800799024|10067099003|5023799004|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: KMV9ZDiibXiqcCePfQWYDdbtfO8DcN49bXC50jN7INYRRJKjQSjF8RnIVaAcCoRnDCTxozQsgKef/P8/cQOQ+Ejg5WR5JLCmk8l9jqtCPv861BNyrfVtXGyOPRrm1ALdzlLIDUVywfROEGrtYrvv5PQs/PPekyHsRg40fxMc3UaBKOlG8QrNsRGsMWOvdW2wS+vCyHiJl+iVa9oyHOLnU8Q229Yz9zqTv3VBM+xdqVQLFO30K4jKup5sds29X9OqoIounLW5PmrEm5dPB6lswqr4UZyV29okvcqCRnzjFKtShjj8/hVBLHVIhNjecGkQLEYhDoCoerdtfVJ77YuLWvEh4AavdhbsB+NydCrue4LD5kvWMhx79aLDhlnRELmodahFBatDDm/mziYd4FKLSmfs53pVb9PiKw1v1rtT4ouPISpMtpkHEDyDGTBYg6TcG+lDGrZCJKcm9ywlndO4dt75/e1ycPv7OzdtaQPWZ/FdWxWN4QORrlbmxBIQWYUZPmCgl0uFucJ4cK36wKPGfGB/E/A0vTbbOi9X7yjypom+n4Uo0jDOZWaSsS9iww2Zuer67/Tr/lRSOl0Mf5izFaWQ/30fCRz3wfwkli5x2EEIMHjKkQg/SAHklSvK9JTd0X3+Sm48cVLMBGSXVUGNQ9HIWsyCNiWdvrdC5XqQK9+PDyzvYvIbvgx/NeHzxUOv+NAZDPvJqPWiTOMrY6/oEQ== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(23010399003)(36860700016)(82310400026)(1800799024)(10067099003)(5023799004)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: h+e2hzdeeNBpol854aVWsxrzCCMLXYPSlGspVffez8SPwRs73s9qi2rn3UJpRNQ9ro/05vjchzUn2XJoPAQD7qLOTKDF4CZJFNYGIdfWxM5DrznOHuWREopnyNjc0d5ziFLzb4PF9G0GUFmY//dLeab3gxcjwtKggtKAcOChkEbV5cjeQ5Djm9XHWYYF7nqcMnM5sJPV1tdD0IY8uwYC+pwlnNoXQIBQsDDqcpAcee+UXt2meDFEq6OAe1kXZjvrOVYNJxOaQzWlSiwestDtSxOCFwUfPop+IxihJF/rJm8wif7pYceOocZSARudPE/NDzpeSmN9+B65/YCNx6pJXU54FEdfI/0EJSrsWpA4feiv31KK6dDY/rW4hQBdOArsXzA9vbX1oeB2668UVqwDJyJ3AasVIyAK8JZtoitsvUweJ3p1ZqkneAgDmiot3/DX X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 03:21:38.6256 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: caead45f-9a7e-40f8-4c4e-08df08a14d45 X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: TY2PEPF0000AB85.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB8123 Content-Type: text/plain; charset="utf-8" Add a glue layer driver for the Cadence USBSSP controller integrated in the CIX Sky1 SoC. The driver manages the controller clocks, resets, and the mode strap controls located in the Sky1 S5 system controller. Signed-off-by: Hongliang Yang --- drivers/usb/cdns3/Kconfig | 13 + drivers/usb/cdns3/Makefile | 1 + drivers/usb/cdns3/cdnsp-sky1.c | 673 +++++++++++++++++++++++++++++++++ drivers/usb/cdns3/cdnsp-sky1.h | 127 +++++++ 4 files changed, 814 insertions(+) create mode 100644 drivers/usb/cdns3/cdnsp-sky1.c create mode 100644 drivers/usb/cdns3/cdnsp-sky1.h diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig index 39ad23d1ada8..03d8e170a98a 100644 --- a/drivers/usb/cdns3/Kconfig +++ b/drivers/usb/cdns3/Kconfig @@ -77,6 +77,19 @@ config USB_CDNSP_PCI If you choose to build this driver as module it will be dynamically linked and module will be called cdnsp-pci.ko =20 +config USB_CDNSP_SKY1 + tristate "Cadence USB3 support on CIX Sky1 SoC platforms" + depends on USB_CDNS3 + depends on ARCH_CIX || COMPILE_TEST + default USB_CDNS3 + help + Glue driver for the Cadence USB dual-role controllers on CIX Sky1 + (device tree compatible cix,sky1-usb3). It enables clocks and resets + from the SoC, then uses the shared cdns3 platform core (cdns.ko). + + If built as a module, the module is named cdnsp-sky1.ko and must be + loaded after the cdns core module when both are loadable modules. + config USB_CDNS3_TI tristate "Cadence USB3 support on TI platforms" depends on ARCH_K3 || COMPILE_TEST diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile index b2e4ba6a49a3..ab813aaf9940 100644 --- a/drivers/usb/cdns3/Makefile +++ b/drivers/usb/cdns3/Makefile @@ -28,3 +28,4 @@ obj-$(CONFIG_USB_CDNSP_PCI) +=3D cdnsp-pci.o obj-$(CONFIG_USB_CDNS3_TI) +=3D cdns3-ti.o obj-$(CONFIG_USB_CDNS3_IMX) +=3D cdns3-imx.o obj-$(CONFIG_USB_CDNS3_STARFIVE) +=3D cdns3-starfive.o +obj-$(CONFIG_USB_CDNSP_SKY1) +=3D cdnsp-sky1.o diff --git a/drivers/usb/cdns3/cdnsp-sky1.c b/drivers/usb/cdns3/cdnsp-sky1.c new file mode 100644 index 000000000000..447c683b726c --- /dev/null +++ b/drivers/usb/cdns3/cdnsp-sky1.c @@ -0,0 +1,673 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * cdnsp-sky1.c - CIX Sky1 glue for Cadence USBSSP DRD controller + * + * Copyright (C) 2026 CIX Technology Group Co., Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cdnsp-sky1.h" +#include "core.h" + +static const char *cix_usb_clk_names[CIX_USB_CLK_NUM] =3D { + "sof", + "axi", + "lpm", + "apb", +}; + +struct cdnsp_sky1_strap_signal { + unsigned int offset, bit; +}; + +static const struct cdnsp_sky1_strap_signal strap_signals[SKY1_USB_S5_NUM]= =3D { + /* usb config in s5 domain */ + [U3_TYPEC_DRD_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_DRD_MODE_STRAP= _BIT }, + [U3_TYPEC_HOST0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST0_MODE_S= TRAP_BIT }, + [U3_TYPEC_HOST1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST1_MODE_S= TRAP_BIT }, + [U3_TYPEC_HOST2_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEC_HOST2_MODE_S= TRAP_BIT }, + [U3_TYPEA_CTRL0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEA_CTRL0_MODE_S= TRAP_BIT }, + [U3_TYPEA_CTRL1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U3_TYPEA_CTRL1_MODE_S= TRAP_BIT}, + [U2_HOST0_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST0_MODE_STRAP_BIT }, + [U2_HOST1_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST1_MODE_STRAP_BIT }, + [U2_HOST2_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST2_MODE_STRAP_BIT }, + [U2_HOST3_ID] =3D { USB_MODE_STRAP_S5_DOMAIN, U2_HOST3_MODE_STRAP_BIT }, +}; + +static int cdnsp_sky1_set_mode_by_id(struct device *dev, int mode) +{ + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + return regmap_update_bits(data->usb_syscon, + strap_signals[data->id].offset, + GENMASK(strap_signals[data->id].bit + 1, + strap_signals[data->id].bit), + mode << strap_signals[data->id].bit); +} + +/** + * cdnsp_sky1_clk_enable_all() - enable all clocks for usb controller + * @dev: Pointer to the device of platform_device + * + */ + +static int cdnsp_sky1_clk_enable_all(struct device *dev) +{ + int i, ret =3D 0; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_NUM; i++) { + cix_usb_clks[i] =3D devm_clk_get(dev, cix_usb_clk_names[i]); + if (IS_ERR(cix_usb_clks[i])) { + ret =3D dev_err_probe(dev, PTR_ERR(cix_usb_clks[i]), + "could not get %s clock\n", + cix_usb_clk_names[i]); + goto err_usb_clks; + } + ret =3D clk_prepare_enable(cix_usb_clks[i]); + if (ret) { + dev_err(dev, "%s enable failed:%d\n", cix_usb_clk_names[i], ret); + goto err_usb_clks; + } + } + dev_dbg(dev, "enable sky1 USB clock done\n"); + return ret; + +err_usb_clks: + cix_usb_clks[i] =3D NULL; + while (--i >=3D 0) { + clk_disable_unprepare(cix_usb_clks[i]); + cix_usb_clks[i] =3D NULL; + } + return ret; +}; + +/** + * cdnsp_sky1_clk_disable_all() - disable all clocks for usb controller + * @dev: Pointer to the device of platform_device + * + */ + +static void cdnsp_sky1_clk_disable_all(struct device *dev) +{ + int i; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_NUM; i++) + clk_disable_unprepare(cix_usb_clks[i]); +}; + +/** + * cdnsp_sky1_clk_enable_resume() - enable the clocks that are turned + * off while suspend + * @dev: Pointer to the device of platform_device + * + */ + +static int cdnsp_sky1_clk_enable_resume(struct device *dev) +{ + int i, ret; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_OFF_NUM; i++) { + ret =3D clk_prepare_enable(cix_usb_clks[i]); + if (ret) { + dev_err(dev, "failed to enable clock %s: %d\n", + cix_usb_clk_names[i], ret); + goto err_usb_clks; + } + } + return 0; + +err_usb_clks: + cix_usb_clks[i] =3D NULL; + while (--i >=3D 0) { + clk_disable_unprepare(cix_usb_clks[i]); + cix_usb_clks[i] =3D NULL; + } + return ret; +}; + +/** + * cdnsp_sky1_clk_disable_suspend() - disable the clocks which are not + * needed when suspend + * @dev: Pointer to the device of platform_device + * + */ + +static void cdnsp_sky1_clk_disable_suspend(struct device *dev) +{ + int i; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct clk **cix_usb_clks =3D data->cix_usb_clks; + + for (i =3D 0; i < CIX_USB_CLK_OFF_NUM; i++) + clk_disable_unprepare(cix_usb_clks[i]); +}; + +static int sky1_handshake(void __iomem *ptr, u32 mask, u32 done, u64 timeo= ut_us) +{ + u32 result; + int ret; + + ret =3D readl_poll_timeout(ptr, result, + (result & mask) =3D=3D done || result =3D=3D U32_MAX, + 10, timeout_us); + if (result =3D=3D U32_MAX) /* card removed */ + return -ENODEV; + return ret; +} + +static int cdns_sky1_platform_suspend(struct device *dev, + bool suspend, bool wakeup) +{ + struct cdns *cdns =3D dev_get_drvdata(dev); + struct platform_device *xhci_dev =3D cdns->host_dev; + struct usb_hcd *hcd; + struct device *parent =3D cdns->dev->parent; + struct cdnsp_sky1 *data =3D dev_get_drvdata(parent); + u32 value; + int ret =3D 0; + int count =3D 3; + + data->wakeup =3D wakeup; + + if (cdns->role !=3D USB_ROLE_HOST) + return 0; + + hcd =3D dev_get_drvdata(&xhci_dev->dev); + if (!hcd) { + dev_dbg(dev, "host controller have not registered\n"); + return 0; + } + + if (suspend) { + while (count--) { + value =3D readl(hcd->regs + XECP_PM_PMCSR); + value &=3D ~PS_MASK; + value |=3D PS_D3 | PS_PME_En; + writel(value, hcd->regs + XECP_PM_PMCSR); + /* After controller enters D3, disable AXI and SOF + * until AXI valid flag changes to 0. + */ + if (sky1_handshake(data->ctst_base, AXI_CLOCK_VALID, 0, 100ULL * 1000)) + dev_dbg(dev, "enter D3 failed,register value:%x\n", + readl(data->ctst_base)); + else + break; + } + if (count < 0) { + dev_err(dev, "enter D3 failed after retries, register value:%x\n", + readl(data->ctst_base)); + } + } else { + while (count--) { + value =3D readl(hcd->regs + XECP_PM_PMCSR); + value &=3D ~PS_MASK; + value |=3D PS_D0; + value &=3D ~PS_PME_En; + writel(value, hcd->regs + XECP_PM_PMCSR); + /* Wait power state back to D0 */ + if (sky1_handshake(hcd->regs + XECP_PM_PMCSR, PS_MASK, 0, 100ULL * 1000= )) { + dev_dbg(dev, "exit D3 timeout, power state=3D0x%lx\n", + readl(hcd->regs + XECP_PM_PMCSR) & PS_MASK); + } else { + break; + } + } + if (count < 0) { + dev_err(dev, "exit D3 timeout after retries, power state=3D0x%lx\n", + readl(hcd->regs + XECP_PM_PMCSR) & PS_MASK); + } + } + + return ret; +} + +static void cdnsp_sky1_configure_controller(struct cdnsp_sky1 *data) +{ + int clk; + int v0, v1, v2; + u32 val =3D 0; + + if (data->u3_disable) { + dev_dbg(data->dev, "disable u3 port\n"); + writel(D_XEC_CFG_3XPORT_MODE_VALUE, data->device_base + + D_XEC_CFG_3XPORT_MODE); + } + writel(AXI_HALT, data->device_base + D_XEC_AXI_CAP); + writel(AXI_HALT, data->xhci_base + D_XEC_AXI_CAP); + writel(data->axi_bmax_value, data->device_base + D_XEC_AXI_CTRL0); + writel(data->axi_bmax_value, data->xhci_base + D_XEC_AXI_CTRL0); + writel((~(u32)(AXI_HALT)), data->device_base + D_XEC_AXI_CAP); + writel((~(u32)(AXI_HALT)), data->xhci_base + D_XEC_AXI_CAP); + clk =3D data->sof_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 1), data->device_base + + D_XEC_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 1), + data->device_base + D_XEC_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 1), + data->device_base + D_XEC_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 1), data->device_base + + D_XEC_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 1), + data->device_base + D_XEC_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 1), data->device_base + + D_XEC_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 1), data->device_base + + D_XEC_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 1), data->device_base + + D_XEC_PRE_REG_100MS); + dev_dbg(data->dev, "readl:%x, %x ,%x, %x, %x, %x, %x, %x\n", + readl(data->device_base + D_XEC_PRE_REG_250NS), + readl(data->device_base + D_XEC_PRE_REG_1US), + readl(data->device_base + D_XEC_PRE_REG_10US), + readl(data->device_base + D_XEC_PRE_REG_100US), + readl(data->device_base + D_XEC_PRE_REG_125US), + readl(data->device_base + D_XEC_PRE_REG_1MS), + readl(data->device_base + D_XEC_PRE_REG_10MS), + readl(data->device_base + D_XEC_PRE_REG_100MS)); + clk =3D data->lpm_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 1), data->dev= ice_base + + D_XEC_LPM_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 1), data->devic= e_base + + D_XEC_LPM_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 1), + data->device_base + D_XEC_LPM_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 1), data->device_base + + D_XEC_LPM_PRE_REG_100MS); + v0 =3D readl(data->xhci_base + XEC_USBSSP_CHICKEN_BITS_3); + v0 &=3D ~(CFG_APB_TIMEOUT_PSLVERR_EN | CFG_APB_PSLVERR_EN); + writel(v0, data->xhci_base + XEC_USBSSP_CHICKEN_BITS_3); + if (data->u3_disable) { + dev_dbg(data->dev, "disable u3 port\n"); + writel(XEC_CFG_3XPORT_MODE_VALUE, data->xhci_base + + XEC_CFG_3XPORT_MODE); + } else if (data->ssp_disable) { + dev_dbg(data->dev, "disable ssp\n"); + v0 =3D readl(data->xhci_base + XEC_CFG_3XPORT_MODE); + writel(v0 & CFG_3XPORT_MODE_DIS_SSP, data->xhci_base + + XEC_CFG_3XPORT_MODE); + } + clk =3D data->sof_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 0), data->xhci_base + + XEC_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 0), data->xhc= i_base + + XEC_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 0), data->xhci_= base + + XEC_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 0), data->xhci_base + + XEC_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 0), + data->xhci_base + XEC_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 0), data->xhci_base + + XEC_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 0), data->xhci_base + + XEC_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 0), data->xhci_base + + XEC_PRE_REG_100MS); + clk =3D data->lpm_clk_freq; + v0 =3D 25 * clk / 100000000; + v1 =3D clk / 10000; + v2 =3D clk / 10; + writel(((v0 > 1) ? v0 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_250NS); + writel((unsigned int)((v1 / 100 > 1) > 0 ? (v1 / 100) - 1 : 0), data->xhc= i_base + + XEC_LPM_PRE_REG_1US); + writel((unsigned int)((v1 / 10 > 1) > 0 ? (v1 / 10) - 1 : 0), data->xhci_= base + + XEC_LPM_PRE_REG_10US); + writel(((v1) > 1 ? v1 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_100US); + writel((unsigned int)((125 * clk / 1000000) > 1 ? (125 * clk / 1000000) := 0), + data->xhci_base + XEC_LPM_PRE_REG_125US); + writel(((v2 / 100 > 1) ? (v2 / 100) - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_1MS); + writel(((v2 / 10 > 1) ? (v2 / 10) - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_10MS); + writel((v2 > 1 ? v2 - 1 : 0), data->xhci_base + + XEC_LPM_PRE_REG_100MS); + val =3D readl(data->xhci_base + XEC_USBSSP_CLK_GATING_CTRL); + val |=3D HOST20_ACLK_GATING_DISABLE | HOST20_UTMI_GATING_DISABLE; + writel(val, data->xhci_base + XEC_USBSSP_CLK_GATING_CTRL); +} + +static int cdnsp_sky1_drd_init(struct cdnsp_sky1 *data) +{ + int ret =3D 0; + + reset_control_assert(data->reset); + reset_control_assert(data->preset); + cdnsp_sky1_clk_disable_all(data->dev); + ret =3D cdnsp_sky1_clk_enable_all(data->dev); + if (ret) + return ret; + writel(CIX_USB_AXI_WR_CACHE_VALUE, data->axi_base); + cdnsp_sky1_set_mode_by_id(data->dev, MODE_STRAP_OTG); + reset_control_deassert(data->preset); + cdnsp_sky1_configure_controller(data); + reset_control_deassert(data->reset); + return ret; +} + +static void *sky1_of_get_addr_by_name(struct device_node *parent, char *na= me) +{ + struct device_node *node; + int index; + + node =3D of_get_next_child(parent, NULL); + if (node) { + index =3D of_property_match_string(node, "reg-names", name); + if (index >=3D 0) + return of_iomap(node, index); + } + return NULL; +} + +static void *sky1_get_addr_by_name(struct device *dev, char *name) +{ + return sky1_of_get_addr_by_name(dev->of_node, name); +} + +static void sky1_put_addr(void __iomem *regs) +{ + if (regs) + iounmap(regs); +} + +static struct of_dev_auxdata cdns_sky1_auxdata[] =3D { + { + .compatible =3D "cdns,usb3", + }, + {}, +}; + +static int cdnsp_sky1_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct device_node *node =3D dev->of_node; + struct cdnsp_sky1 *data; + int ret =3D 0; + struct cdns3_platform_data *cdns_sky1_pdata; + + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + data->axi_base =3D devm_platform_ioremap_resource_byname(pdev, "axi"); + if (IS_ERR(data->axi_base)) { + dev_err(dev, "can't map IOMEM resource\n"); + return PTR_ERR(data->axi_base); + } + data->ctst_base =3D devm_platform_ioremap_resource_byname(pdev, "controll= er"); + if (IS_ERR(data->ctst_base)) { + dev_err(dev, "can't map IOMEM resource\n"); + return PTR_ERR(data->ctst_base); + } + data->reset =3D devm_reset_control_get_exclusive(&pdev->dev, "core"); + if (IS_ERR(data->reset)) { + ret =3D PTR_ERR(data->reset); + dev_err(dev, "get reset error:%d\n", ret); + return ret; + } + data->preset =3D devm_reset_control_get_exclusive(&pdev->dev, "apb"); + if (IS_ERR(data->preset)) { + ret =3D PTR_ERR(data->preset); + dev_err(dev, "get reset error:%d\n", ret); + return ret; + } + platform_set_drvdata(pdev, data); + data->dev =3D dev; + ret =3D of_alias_get_id(dev->of_node, "usb"); + if (ret =3D=3D -ENODEV) { + if (device_property_read_u32(dev, "id", &ret)) + ret =3D -ENODEV; + } + if (ret < 0 || ret >=3D SKY1_USB_S5_NUM) { + dev_err(dev, "get alias failed.\n"); + return ret; + } + data->id =3D ret; + data->usb_syscon =3D syscon_regmap_lookup_by_phandle(dev->of_node, + "cix,usb-syscon"); + if (IS_ERR(data->usb_syscon)) { + dev_err(dev, "Unable to get cix,usb-syscon regmap"); + return PTR_ERR(data->usb_syscon); + } + data->u3_disable =3D device_property_read_bool(dev, "u3-port-disable"); + data->ssp_disable =3D device_property_read_bool(dev, "ssp-disable"); + data->sof_clk_freq =3D CIX_USB_CLK_8M; + data->lpm_clk_freq =3D CIX_USB_CLK_32K; + data->axi_bmax_value =3D AXI_BMAX_VALUE_DEFAULT; + data->xhci_base =3D sky1_get_addr_by_name(dev, "xhci"); + if (!data->xhci_base) + return -ENODEV; + data->device_base =3D sky1_get_addr_by_name(dev, "dev"); + if (!data->device_base) + return -ENODEV; + ret =3D cdnsp_sky1_drd_init(data); + if (ret =3D=3D -ETIMEDOUT) + return -EPROBE_DEFER; + if (ret) + return ret; + data->oc_gpio =3D devm_gpiod_get_optional(data->dev, "oc", GPIOD_IN); + if (IS_ERR(data->oc_gpio)) { + dev_err(data->dev, "can not get oc_gpio\n"); + ret =3D PTR_ERR(data->oc_gpio); + return ret; + } + if (data->oc_gpio) { + ret =3D gpiod_direction_input(data->oc_gpio); + if (ret < 0) + dev_err(data->dev, "set oc_gpio input failed:%d\n", ret); + } + /* release by platform_device_release */ + cdns_sky1_pdata =3D kzalloc(sizeof(*cdns_sky1_pdata), GFP_KERNEL); + if (!cdns_sky1_pdata) + return -ENOMEM; + cdns_sky1_pdata->platform_suspend =3D cdns_sky1_platform_suspend; + cdns_sky1_pdata->quirks =3D CDNS3_DEFAULT_PM_RUNTIME_ALLOW; + cdns_sky1_auxdata->platform_data =3D cdns_sky1_pdata; + ret =3D of_platform_populate(node, NULL, cdns_sky1_auxdata, dev); + if (ret) { + dev_err(dev, "failed to create children: %d\n", ret); + goto err; + } + device_set_wakeup_capable(dev, true); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + return 0; +err: + kfree(cdns_sky1_pdata); + return ret; +} + +static void cdnsp_sky1_remove(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + pm_runtime_get_sync(dev); + of_platform_depopulate(dev); + sky1_put_addr(data->xhci_base); + sky1_put_addr(data->device_base); + reset_control_deassert(data->reset); + reset_control_deassert(data->preset); + cdnsp_sky1_clk_disable_all(dev); + platform_set_drvdata(pdev, NULL); +} + +#ifdef CONFIG_PM +/* Because the wake-up interrupt and host interrupt are the same interrupt= , closing the axi + * and sof clock will result in the inability to generate port status chan= ge interrupt. + */ + +static int cdnsp_sky1_system_suspend(struct device *dev) +{ + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + if (!data->wakeup) { + reset_control_assert(data->reset); + reset_control_assert(data->preset); + } + cdnsp_sky1_clk_disable_suspend(dev); + return 0; +} + +static int cdnsp_sky1_system_resume(struct device *dev) +{ + int ret =3D 0; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + + ret =3D cdnsp_sky1_clk_enable_resume(dev); + if (ret) + return ret; + if (!data->wakeup) { + writel(CIX_USB_AXI_WR_CACHE_VALUE, data->axi_base); + cdnsp_sky1_set_mode_by_id(data->dev, MODE_STRAP_OTG); + reset_control_deassert(data->preset); + cdnsp_sky1_configure_controller(data); + reset_control_deassert(data->reset); + } + return 0; +} + +static const struct dev_pm_ops cdnsp_sky1_pm_ops =3D { + .suspend =3D cdnsp_sky1_system_suspend, + .resume =3D cdnsp_sky1_system_resume, +}; +#endif /* CONFIG_PM */ + +static const struct of_device_id cdns_sky1_of_match[] =3D { + { .compatible =3D "cix,sky1-usbssp", }, + {}, +}; +MODULE_DEVICE_TABLE(of, cdns_sky1_of_match); + +static int cdnsp_sky1_find_cdns(struct device *dev, void *data) +{ + struct cdns **cdns_ptr =3D data; + + if (dev->of_node && of_device_is_compatible(dev->of_node, "cdns,usb3")) { + *cdns_ptr =3D dev_get_drvdata(dev); + return 1; + } + return 0; +} + +static int cdnsp_sky1_find_gadget_match(struct device *dev, void *data) +{ + struct device **gadget_dev =3D data; + const char *name =3D dev_name(dev); + static const char gadget_prefix[] =3D "gadget."; + + /* + * The gadget device is registered on the gadget bus with name + * "gadget.%d" (see usb_add_gadget_udc -> dev_set_name). + * It sits on the gadget bus and has the function driver bound to it. + * Verify the device is on the gadget bus by checking the bus name. + * This prevents matching devices that happen to have "gadget." prefix + * in their name but are not real gadget devices, and also avoids + * NULL pointer dereference when device bus is being removed. + */ + if (name && dev->bus && !strcmp(dev->bus->name, "gadget") && + !strncmp(name, gadget_prefix, sizeof(gadget_prefix) - 1)) { + *gadget_dev =3D dev; + return 1; + } + return 0; +} + +static void cdnsp_sky1_shutdown(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); + struct cdns *cdns =3D NULL; + struct device *gadget_dev =3D NULL; + + if (!device_may_wakeup(dev)) { + /* + * Find the cdns3 child device, then find its gadget device + * and release the function driver before disabling clocks. + * This ensures all register accesses in gadget_unbind_driver + * complete before clocks are turned off. + */ + device_for_each_child(dev, &cdns, cdnsp_sky1_find_cdns); + if (cdns) + device_for_each_child(cdns->dev, &gadget_dev, + cdnsp_sky1_find_gadget_match); + if (gadget_dev) + device_release_driver(gadget_dev); + if (cdns && cdns->host_dev) { + struct usb_hcd *hcd =3D platform_get_drvdata(cdns->host_dev); + + if (hcd && hcd->irq > 0) { + disable_irq(hcd->irq); + synchronize_irq(hcd->irq); + /* + * Clear HCD_FLAG_HW_ACCESSIBLE before disable_irq. + * This prevents usb_hcd_irq from calling xhci_irq + * (which reads USBSTS) after clocks are disabled. + */ + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + } + } + reset_control_assert(data->reset); + reset_control_assert(data->preset); + cdnsp_sky1_clk_disable_all(dev); + } +} + +static struct platform_driver cdnsp_sky1_driver =3D { + .probe =3D cdnsp_sky1_probe, + .remove =3D cdnsp_sky1_remove, + .shutdown =3D cdnsp_sky1_shutdown, + .driver =3D { + .name =3D "cdnsp-sky1", + .of_match_table =3D cdns_sky1_of_match, + .pm =3D pm_ptr(&cdnsp_sky1_pm_ops), + }, +}; + +module_platform_driver(cdnsp_sky1_driver); + +MODULE_ALIAS("platform:cdnsp-sky1"); +MODULE_DESCRIPTION("CIX Sky1 Cadence USBSSP DRD glue driver"); +MODULE_AUTHOR("Hongliang Yang "); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/cdns3/cdnsp-sky1.h b/drivers/usb/cdns3/cdnsp-sky1.h new file mode 100644 index 000000000000..49c3d5eab174 --- /dev/null +++ b/drivers/usb/cdns3/cdnsp-sky1.h @@ -0,0 +1,127 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _CDNSP_SKY1_H +#define _CDNSP_SKY1_H +#include +#include +#include + +#define USB_MODE_STRAP_S5_DOMAIN 0x424 + +#define MODE_STRAP_OTG 0 + +#define U3_TYPEC_DRD_ID 0 +#define U3_TYPEC_HOST0_ID 1 +#define U3_TYPEC_HOST1_ID 2 +#define U3_TYPEC_HOST2_ID 3 +#define U3_TYPEA_CTRL0_ID 4 +#define U3_TYPEA_CTRL1_ID 5 +#define U2_HOST0_ID 6 +#define U2_HOST1_ID 7 +#define U2_HOST2_ID 8 +#define U2_HOST3_ID 9 +#define SKY1_USB_S5_NUM 10 + +#define U3_TYPEC_DRD_MODE_STRAP_BIT 12 +#define U3_TYPEC_HOST0_MODE_STRAP_BIT 14 +#define U3_TYPEC_HOST1_MODE_STRAP_BIT 16 +#define U3_TYPEC_HOST2_MODE_STRAP_BIT 18 +#define U3_TYPEA_CTRL0_MODE_STRAP_BIT 8 +#define U3_TYPEA_CTRL1_MODE_STRAP_BIT 10 +#define U2_HOST0_MODE_STRAP_BIT 0 +#define U2_HOST1_MODE_STRAP_BIT 2 +#define U2_HOST2_MODE_STRAP_BIT 4 +#define U2_HOST3_MODE_STRAP_BIT 6 + +#define AXI_HALT BIT(31) +#define AXI_BMAX_VALUE_DEFAULT 0x7 + +#define D_XEC_CFG_3XPORT_MODE 0x2040 +#define D_XEC_AXI_CAP 0x2174 +#define D_XEC_AXI_CTRL0 0x217C +#define D_XEC_PRE_REG_250NS 0x21E8 +#define D_XEC_PRE_REG_1US 0x21EC +#define D_XEC_PRE_REG_10US 0x21F0 +#define D_XEC_PRE_REG_100US 0x21F4 +#define D_XEC_PRE_REG_125US 0x21F8 +#define D_XEC_PRE_REG_1MS 0x21FC +#define D_XEC_PRE_REG_10MS 0x2200 +#define D_XEC_PRE_REG_100MS 0x2204 +#define D_XEC_LPM_PRE_REG_250NS 0x2208 +#define D_XEC_LPM_PRE_REG_1US 0x220C +#define D_XEC_LPM_PRE_REG_10US 0x2210 +#define D_XEC_LPM_PRE_REG_100US 0x2214 +#define D_XEC_LPM_PRE_REG_125US 0x2218 +#define D_XEC_LPM_PRE_REG_1MS 0x221C +#define D_XEC_LPM_PRE_REG_10MS 0x2220 +#define D_XEC_LPM_PRE_REG_100MS 0x2224 + +#define XEC_CFG_3XPORT_MODE 0x2040 +#define XEC_PRE_REG_250NS 0x21E8 +#define XEC_PRE_REG_1US 0x21EC +#define XEC_PRE_REG_10US 0x21F0 +#define XEC_PRE_REG_100US 0x21F4 +#define XEC_PRE_REG_125US 0x21F8 +#define XEC_PRE_REG_1MS 0x21FC +#define XEC_PRE_REG_10MS 0x2200 +#define XEC_PRE_REG_100MS 0x2204 +#define XEC_LPM_PRE_REG_250NS 0x2208 +#define XEC_LPM_PRE_REG_1US 0x220C +#define XEC_LPM_PRE_REG_10US 0x2210 +#define XEC_LPM_PRE_REG_100US 0x2214 +#define XEC_LPM_PRE_REG_125US 0x2218 +#define XEC_LPM_PRE_REG_1MS 0x221C +#define XEC_LPM_PRE_REG_10MS 0x2220 +#define XEC_LPM_PRE_REG_100MS 0x2224 +#define XEC_USBSSP_CHICKEN_BITS_3 0x2230 +#define XEC_USBSSP_CLK_GATING_CTRL 0x2234 +#define XECP_PM_PMCSR 0x2240 + +/* XEC_USBSSP_CLK_GATING_CTRL */ +#define HOST20_ACLK_GATING_DISABLE BIT(4) +#define HOST20_UTMI_GATING_DISABLE BIT(5) + +/* XECP_PM_PMCSR */ +#define PS_MASK GENMASK(1, 0) +#define PS_D0 0 +#define PS_D3 3 +#define PS_PME_En BIT(8) + +#define D_XEC_CFG_3XPORT_MODE_VALUE 0xa0031e07 +#define XEC_CFG_3XPORT_MODE_VALUE 0xa0031e07 +#define CFG_3XPORT_MODE_DIS_SSP (~(1 << 31)) + +#define CFG_APB_TIMEOUT_PSLVERR_EN BIT(22) +#define CFG_APB_PSLVERR_EN BIT(23) + +#define CIX_USB_CLK_NUM (4) +#define CIX_USB_CLK_OFF_NUM (2) +#define CIX_USB_AXI_WR_CACHE_VALUE 0x33 +#define CIX_USB_CLK_32K 32000 +#define CIX_USB_CLK_8M 8000000 + +#define AXI_CLOCK_VALID BIT(1) + +struct cdnsp_sky1 { + struct device *dev; + void __iomem *axi_base; + void __iomem *ctst_base; + void __iomem *dr_base; + void __iomem *xhci_base; + void __iomem *device_base; + struct platform_device *cdnsp_pdev; + struct reset_control *reset; + struct reset_control *preset; + struct clk *cix_usb_clks[CIX_USB_CLK_NUM]; + int id; + struct regmap *usb_syscon; + int lpm_clk_freq; + int sof_clk_freq; + bool u3_disable; + bool ssp_disable; + int axi_bmax_value; + struct gpio_desc *oc_gpio; + bool wakeup; +}; + +#endif /* _CDNSP_SKY1_H */ --=20 2.54.0 From nobody Sat Sep 26 19:35:30 2026 Received: from OS8PR02CU002.outbound.protection.outlook.com (mail-japanwestazon11022078.outbound.protection.outlook.com [40.107.75.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B2D4413B293; Wed, 2 Sep 2026 03:21:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.75.78 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319307; cv=fail; b=n6d8FDzHXAnGW42H+POB47OyGkrYdcufa5atfhXrIC0mMe92uDAe8FN7pNa8XVohi674EgG+Ua1+MMWXoVfr9Odx2Au1KTxz8oRpHKWPzw0w4kmNDhCCCl3zS4ajWM/hUv5Ge45FElPpkgJq24e+qRyUM6RPTT8yeOczozcHB2I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788319307; c=relaxed/simple; bh=BRjVkH1+QIJKTul3FISk1DZwZAqP9itY9bqRVTJG6A8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Aq3yOuU3O55CU7jl/bQk2HsNpPGB+bVzdOD/DmZbvSPcMNi7V3WmPggsd2Uqaweo0vcmEWJJAt+Frm7LMrxKrO5C83eQK1JrMjTfG1mM1O0aaZSME4DE+kVgwaDMzXzJ9wd+A+8ITCUfQtPjvVYiupSvgJKPven6RZHxb/7DfFg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=40.107.75.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uPzc/0rnUvtpBXC5R4TaW3dvltJ5SNeMs5Hmn6zUd/ZUZQRAfSOK5ro78vzlpAuimzLDc8MgO/Ye2r3O5Y9HIB6le+nc5LhhM312FK5E4lEEY+/QRJdIC5gYb0kJObg2gGbXbJyj1nwOdK3/iCb7vjL/34UOMUBaI+Ne7tLhJRr/B4sTY12GdgFKDDvqS7ad/bKXQUQ34kzgS4eYqk6gHTeeBobCtIjnjg5ofafSUfMLLjysagxQXwZp1g/AKeFeN4P1veOM4ArDdl3Pk8+dSbKtBXKViHHnEbGbUC2TWxYOCXTuigLA13ENMP9aGaHv4SafuYaHFrgsPUIUFBapaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Tnib1AXW9ZIDsEM2nFmOqjwYQkawDxBoIKzNV75KWws=; b=ygAkY6DOysOIbmiR2WL5h5kKuJwKUHBRfBPrCHx8a045cAiLvM35cWywkxoi5xbbtfZl79usPWIbt1Xhi4uT2Q8v9viE8ibv0aVRKj2seQfpQYn7fXzxD1sfClpcvqDhES6l4qhMhGgvrhbwfsBlsWQP945e3Mg+zhbwwsvT99tESuSHKKXdysuA+kl0mT/XZvSiNJT0srBweOwMMpAmZYtbWzbwqv1aUaLhVusi2HuKkO01vz+jWQ81YrnO2T1Yx9K+ZuxNfQ/OcggrFLu45E6x0S1ms4UbsDdTsRk0TISNyluriEtoIPQGtsMh8kYslzccqPPFXIQAEkKNTQ0Klw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SG2P153CA0030.APCP153.PROD.OUTLOOK.COM (2603:1096:4:c7::17) by SE3PR06MB9116.apcprd06.prod.outlook.com (2603:1096:101:321::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 03:21:42 +0000 Received: from OSA0EPF000000CC.apcprd02.prod.outlook.com (2603:1096:4:c7:cafe::a1) by SG2P153CA0030.outlook.office365.com (2603:1096:4:c7::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.3 via Frontend Transport; Wed, 2 Sep 2026 03:21:41 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by OSA0EPF000000CC.mail.protection.outlook.com (10.167.240.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Wed, 2 Sep 2026 03:21:39 +0000 Received: from hongliang-System-Product-Name (unknown [172.20.64.180]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id F0E234092113; Wed, 2 Sep 2026 11:21:37 +0800 (CST) From: Hongliang Yang To: peter.chen@kernel.org, pawell@cadence.com, vkoul@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: gregkh@linuxfoundation.org, rogerq@kernel.org, neil.armstrong@linaro.org, p.zabel@pengutronix.de, fugang.duan@cixtech.com, cix-kernel-upstream@cixtech.com, linux-usb@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Hongliang Yang Subject: [PATCH v2 5/5] arm64: dts: cix: Add USB4/USB5 nodes for Sky1 Date: Wed, 2 Sep 2026 11:21:34 +0800 Message-ID: <20260902032134.1182634-6-hongliang.yang@cixtech.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260831082309.3854507-1-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSA0EPF000000CC:EE_|SE3PR06MB9116:EE_ X-MS-Office365-Filtering-Correlation-Id: 26ad01ed-1c6a-4354-76fe-08df08a14dec X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|23010399003|36860700016|82310400026|1800799024|10067099003|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: LC7IjzUrd7gMfjHLPvFnUC+oXT5CIl4mb7Si8l6Z6dlW4oZ7ogTznruh2YtrH9yCpkgf7lhMLQX4xSDEsclVsnz3G7NseZvLDRF7pij3nO378smf/RdZbLnIQzcjicXoegBUjVOi2NITVsxBclFhfooXXnhWYONXQkIEJwCO1hfkvWsQLIWQzQqKblgxDUeZfEEBTTvbzo+G2okVbcQqC9QAXoXeFt360zsvkb3WcXxIWCXW5nBFAO1f6HgNKHP24USqJ4CgdVQLS5f+3yb+6n6nNahrJf7MmUSUWxuoNB8hVWjVmCGNpLXcdSD2+f1lrI+4Wx1pu2qRzFGx4+8kODrSyORo8UZZuCEouzdvdFEYCpK2b13hXan6TMMazH0Svy9e9f9QjpEHfpcoOBRNRYXRZ4zCK4Sr7uc8HMG38U+v5gM2JuTpN4SBrptX2/62h+5BnP5nQYv/YMb9enG8SOH6Ysm1TD3aWG27y23UwsYAvmP9bkHpZadPWOIjvVqF1Cw9xU+kyCOSmV9X3+FFs8hIrAScfLWWn1JvXNGBtYx5pjE8rLj0QYP+LYfwD7n9ykT8ZrHirhIPqhxjIaa+9H0T2XDsw7MP5MWBFewDnULt4goCjLEkkPj6vlwo1kXl67bHwtCiOJWuz62Cn4XMzmgB49z/S0KjcDrrywjrVZCoEBvG+b5ro/TmlS6RQcjeQji70mHi7jczt5yaGvJJVQ== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(7416014)(23010399003)(36860700016)(82310400026)(1800799024)(10067099003)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Lj4oheoDoRmks+7VS8yJLfGFuejwOP+ySLwS8CraQbtezZKQkDRpnbcXclgo/OA+9GNthN41SgMlvWGzmiwNup7WjNguGL9KVsHerwzWBY+HKOD23Fvh261QwzmDAt6LrCbyakBp1dfcSp6wEH9eafxKXBHyGjzVBtyf+arUdYu50sjWzk/y8KWwThsK1l3RnKvK/3rXjqr/eB1tWoLJmlx3AuLUSxl2AOqBcXn+lwtKxIj/ZLT345rDCILg+uM9mdDAWkSqTcIfnlerHLSorXGswFaK9am6332WbThzoc6DahybVhddeyMu1aKmjzQX2VsajclLYNeURItsNUx/3anSoApFj6eqKNRJB0rR9K7pYOzJo7dLZS16XJ89dD8GeLI/Z6NjGVtgsl+TeoPSVYjBrvaiNLspEOtehRX0GmlAxRvNqZ6ojF57GTwW24b/ X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 03:21:39.6060 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 26ad01ed-1c6a-4354-76fe-08df08a14dec X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: OSA0EPF000000CC.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SE3PR06MB9116 Content-Type: text/plain; charset="utf-8" Add USB4 and USB5 controller nodes and their associated USB3 PHY nodes for the CIX Sky1 SoC. Enable USB4 and USB5 in host mode on the Radxa Orion O6 board. Signed-off-by: Hongliang Yang --- arch/arm64/boot/dts/cix/sky1-orion-o6.dts | 54 ++++++++++ arch/arm64/boot/dts/cix/sky1.dtsi | 118 ++++++++++++++++++++++ 2 files changed, 172 insertions(+) diff --git a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts b/arch/arm64/boot/dt= s/cix/sky1-orion-o6.dts index e39c87774c12..4f47e8cd70fc 100644 --- a/arch/arm64/boot/dts/cix/sky1-orion-o6.dts +++ b/arch/arm64/boot/dts/cix/sky1-orion-o6.dts @@ -80,6 +80,22 @@ pins { =20 }; }; + + pinctrl_usb4: usb4-power-on-cfg { + pins { + bias-pull-down; + drive-strength =3D <8>; + pinmux =3D ; + }; + }; + + pinctrl_usb5: usb5-power-on-cfg { + pins { + bias-pull-down; + drive-strength =3D <8>; + pinmux =3D ; + }; + }; }; =20 &pcie_x8_rc { @@ -117,3 +133,41 @@ &s5_gpio2 { &uart2 { status =3D "okay"; }; + +&usb4 { + pinctrl-0 =3D <&pinctrl_usb4>; + pinctrl-names =3D "default"; + + status =3D "okay"; +}; + +&usbss_4 { + dr_mode =3D "host"; + + status =3D "okay"; +}; + +&usb5 { + pinctrl-0 =3D <&pinctrl_usb5>; + pinctrl-names =3D "default"; + + status =3D "okay"; +}; + +&usbss_5 { + dr_mode =3D "host"; + + status =3D "okay"; +}; + +&usb3_phy4 { + status =3D "okay"; + + usb-port@0 { + status =3D "okay"; + }; + + usb-port@1 { + status =3D "okay"; + }; +}; diff --git a/arch/arm64/boot/dts/cix/sky1.dtsi b/arch/arm64/boot/dts/cix/sk= y1.dtsi index a77c52296ebd..661251765d22 100644 --- a/arch/arm64/boot/dts/cix/sky1.dtsi +++ b/arch/arm64/boot/dts/cix/sky1.dtsi @@ -6,6 +6,8 @@ =20 #include #include +#include +#include #include "sky1-power.h" =20 / { @@ -13,6 +15,11 @@ / { #address-cells =3D <2>; #size-cells =3D <2>; =20 + aliases { + usb4 =3D &usb4; + usb5 =3D &usb5; + }; + cpus { #address-cells =3D <2>; #size-cells =3D <0>; @@ -574,6 +581,117 @@ mbox_ap2sfh: mailbox@80a0000 { cix,mbox-dir =3D "tx"; }; =20 + usb4: usb@91c0314 { + compatible =3D "cix,sky1-usbssp"; + reg =3D <0x00 0x091c0314 0x00 0x4>, + <0x00 0x091c0400 0x00 0x4>; + reg-names =3D "axi", "controller"; + ranges; + #address-cells =3D <2>; + clocks =3D <&scmi_clk CLK_TREE_USB3A_H0_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_0_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H0_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_0_APB_GATE>; + clock-names =3D "sof", "axi", "lpm", "apb"; + resets =3D <&s5_syscon SKY1_USBC_SS2_PRST_N>, + <&s5_syscon SKY1_USBC_SS2_RST_N>; + reset-names =3D "apb", "core"; + #size-cells =3D <2>; + cix,usb-syscon =3D <&s5_syscon>; + + status =3D "disabled"; + + usbss_4: usb@91d0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91d0000 0x00 0x4000>, + <0x00 0x91d8000 0x00 0x8000>, + <0x00 0x91d4000 0x00 0x4000>; + reg-names =3D "otg", "xhci", "dev"; + dr_mode =3D "otg"; + interrupts =3D , + , + , + ; + interrupt-names =3D "host", "peripheral", + "otg", "wakeup"; + maximum-speed =3D "super-speed-plus"; + phys =3D <&usb3_phy4_0>; + phy-names =3D "cdns3,usb3-phy"; + + status =3D "disabled"; + }; + }; + + usb5: usb@91c0324 { + compatible =3D "cix,sky1-usbssp"; + reg =3D <0x00 0x091c0324 0x00 0x4>, + <0x00 0x091c0410 0x00 0x4>; + reg-names =3D "axi", "controller"; + ranges; + #address-cells =3D <2>; + clocks =3D <&scmi_clk CLK_TREE_USB3A_H1_CLK_SOF>, + <&scmi_clk CLK_TREE_USB3A_1_AXI_GATE>, + <&scmi_clk CLK_TREE_USB3A_H1_CLK_LPM>, + <&scmi_clk CLK_TREE_USB3A_1_APB_GATE>; + clock-names =3D "sof", "axi", "lpm", "apb"; + resets =3D <&s5_syscon SKY1_USBC_SS3_PRST_N>, + <&s5_syscon SKY1_USBC_SS3_RST_N>; + reset-names =3D "apb", "core"; + #size-cells =3D <2>; + cix,usb-syscon =3D <&s5_syscon>; + + status =3D "disabled"; + + usbss_5: usb@91e0000 { + compatible =3D "cdns,usb3"; + reg =3D <0x00 0x91e0000 0x00 0x4000>, + <0x00 0x91e8000 0x00 0x8000>, + <0x00 0x91e4000 0x00 0x4000>; + reg-names =3D "otg", "xhci", "dev"; + dr_mode =3D "otg"; + interrupts =3D , + , + , + ; + interrupt-names =3D "host", "peripheral", + "otg", "wakeup"; + maximum-speed =3D "super-speed-plus"; + phys =3D <&usb3_phy4_1>; + phy-names =3D "cdns3,usb3-phy"; + + status =3D "disabled"; + }; + }; + + usb3_phy4: usb-phy@9210000 { + compatible =3D "cix,sky1-usb3-phy"; + reg =3D <0x00 0x09210000 0x00 0x40000>; + #address-cells =3D <1>; + clocks =3D <&scmi_clk CLK_TREE_USB3A_PHY3_GATE>, + <&scmi_clk CLK_TREE_USB3A_PHY_x2_REF>; + clock-names =3D "apb", "ref"; + resets =3D <&s5_syscon SKY1_USBPHY_SS_RST_N>, + <&s5_syscon SKY1_USBPHY_SS_PST_N>; + reset-names =3D "core", "apb"; + #size-cells =3D <0>; + + status =3D "disabled"; + + usb3_phy4_0: usb-port@0 { + reg =3D <0>; + #phy-cells =3D <0>; + + status =3D "disabled"; + }; + + usb3_phy4_1: usb-port@1 { + reg =3D <1>; + #phy-cells =3D <0>; + + status =3D "disabled"; + }; + }; + pcie_x8_rc: pcie@a010000 { compatible =3D "cix,sky1-pcie-host"; reg =3D <0x00 0x0a010000 0x00 0x10000>, --=20 2.54.0