From nobody Wed Sep 10 06:04:35 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 25C1D1EC006 for ; Sun, 7 Sep 2025 14:52:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256742; cv=none; b=GdgLsQxyyb8RW6txMmZqlKqX68Dywm2z9zL71wEYz34CWH/YKXq8cUx8wmt/a8ON+PYcbvtc3U9XlJcP+Dq8WpLN2WEnT/xDwvdD6BZvJfksCs7YH1W82GZGy+fL+ml5CHW4ET6DNe91BkTzUWpbgf7QSy6Y2RWY5Pny+EafOJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256742; c=relaxed/simple; bh=q8/D+ukM0Z8xbt2NzOinEuwjlyUq60k42C13C/W8iPg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RN/0Ty7AJ6IZwtWOz+FC8KRbiOPLeJwzgMG7FFtiIzdnUbtfyhWjw+k0P6qGrz0+BR2SV7OcDHBOa1o1nmTkq7eZ+JDtnO6+aEFchkWyEaHfiuOrEOcjEaw2jXKpp7iQRi73ljjW+yhQXWMgtGNUCkzJtSyQu8cfQkM68mRyBcc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=LV/byqxI; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="LV/byqxI" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 587AUq1O024433 for ; Sun, 7 Sep 2025 14:52:20 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ZNffsrN8dmCEs7HAgfangQEaiQquRtqWha57sIIZbzU=; b=LV/byqxIELLLV8Wt PIucgDdkvSiw+ADNd6dsCnOoVXjpSsd3e7y0+uzzz7P8BHWCiXbS3WHHfTghrreK NH8UOqkGVjTWkETnEXWmC1pddlecVzrD1ZHrsFRpZHXNueCAw5jZAIGjWJ+lXero 98j+98G2+ziy7fExLuVU+WKhovILxBuXmlF1FFf0cDT1iqWRpN+KUYp3SrU7c2S4 6wO/GETmZkuwBuhUMNgud83yfvCD3H8Ov7nvTtRA4iagVDisIxhzL1z/PJmUWNDP hd73S9Fx7XNRLvZztPUhUDfjc9c6I6Q17BcD5Aru4BbjoA/yq4F7y6q6RwKz0aDH iP0KoA== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 490d63a6ka-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sun, 07 Sep 2025 14:52:20 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-4b49666c8b8so79863761cf.3 for ; Sun, 07 Sep 2025 07:52:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757256739; x=1757861539; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZNffsrN8dmCEs7HAgfangQEaiQquRtqWha57sIIZbzU=; b=kBWC5LqNmhzpjg1mJP3aTPfah64gax3DU/E1JODhtPfNd8MHkSu5DJfLdoQ+jb7BYJ WW0k1ob1eS0Npj9+klzJ+fbxwnoJn4RIRYa2mJx/Uc+3Hzfj3ze9FxYokSqzEeAldB/A w9tFmoIFQPfOsCUAfsAI+I8TZFFM8P4D9I9tRC/6nWEf+7pUVCgj2kKTEkVxXf0aRYmW FTz9KNKvJlF3jGdRMIn56U9sEbiYraODwqUPdZRY046yChm8qaIM3+v7l/lrtsmfWWjm iXUpKFTvSdfeyqikU7M87xgRjrsAUB2xFxM4/5SCoOf6uJtS4gFi3/KG50EDMAiBXIdM f6Lg== X-Forwarded-Encrypted: i=1; AJvYcCUVgOYvtiSyfhBFeR4rmyp/DpkKAnvdBDKDpF64GElZRoxn2tmDiyvkCEZyC0E3x2Lq4xFim3t/is+K2f8=@vger.kernel.org X-Gm-Message-State: AOJu0Yyb4fQEd/IQY8cW6Mq+AQZqOjLtmPn5DIFcFg2mmBRn9EN8rdG2 lz2DDRZS9Ci6ITJIHElcTKVjoze8C5HXOdedeG1iJclFp4akrplaATVC0J9Z0YxfzeMX9dnlO8A H2e/UJhcIclwRxZ3bTuxz1bozZ2fqMGDcC5YkRcx/4pqrF4UNHIW4odoDXKjqgGD30D8= X-Gm-Gg: ASbGncunCjil/6HihG+xGBiIMAINU43BYIMVDpcLKrNGJTX6/7A5MaLTHFJE+p5MdRf 1uyXrv6dag/xxpwcLNuEW07JVi1ZDsnIHhrqeyDXMjiIGhv/IKdIZ7v9lCPJC2d6DydOvke/0T4 NdTrlBN8c21uQyel3NCx7eP7qWS47eAt4W/d0M8svS4spJETqQccg/kr1FPveRq0O7++/1w+E9H IgRaPzmZi8UrwY1+d0ZaQJJnS8rMTnfsb/W7Sp15aD/3eHCS7kR3Ih0kYcll/tgLdQJpmgY7OqS wdeuKWtUFuZToJu4i84OCThFEwLpbI6ea4qYGOfVnKJzA2zYZ0ETFnNi9mR+DgdQE+/WLUgeYmD uYyiPLdhVTdUcjbzGk+mr/aQBU7qyBFwnH+orkRh1/XvyoCYCbONi X-Received: by 2002:a05:622a:1823:b0:4b4:9084:d003 with SMTP id d75a77b69052e-4b5f844d4d8mr46652051cf.40.1757256738927; Sun, 07 Sep 2025 07:52:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH7WElD3JmL2LHfSpTpNmNOEL8oEqj3NvSXEnxSgRINrKywiinX54RHXhg9TR6yFPcmw+sgyQ== X-Received: by 2002:a05:622a:1823:b0:4b4:9084:d003 with SMTP id d75a77b69052e-4b5f844d4d8mr46651891cf.40.1757256738457; Sun, 07 Sep 2025 07:52:18 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5608ab939d5sm2936738e87.46.2025.09.07.07.52.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 07 Sep 2025 07:52:17 -0700 (PDT) From: Dmitry Baryshkov Date: Sun, 07 Sep 2025 17:52:10 +0300 Subject: [PATCH 1/4] phy: qcom: qmp-usb-legacy: switch to common helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250907-qcom-dp-phy-v1-1-46634a6a980b@oss.qualcomm.com> References: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> In-Reply-To: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> To: Vinod Koul , Kishon Vijay Abraham I Cc: linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3537; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=q8/D+ukM0Z8xbt2NzOinEuwjlyUq60k42C13C/W8iPg=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBovZwftYjKqkW+00RmQtqC0KhBlt2jfoXYBgS3A /rpxiFSJfuJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaL2cHwAKCRCLPIo+Aiko 1dSoB/9jtszJionNXNnZ+AaJemPRe2skJQAhLH9BcZxp34aGVp32MUdJfEUkHw3JSKEe/XlKSwP kEW/aO/Qc2lrvpZhgceKuvz2a9jw9jPjsR76Fzr0TmhHo3/XGmSsaqhQ6LBjH2OwE/UBZqzKGnF Id89N2qu+GVmJ+6hu8FX3Pw3bD7kkwcbT9M5Y7mkwBlUviVUg1LRYSJCMPWhW5KR/bf+wYXwjqd kR5UCSG2UNO7OByDakClnQleBg1nUHk/DrlcUo94soHRd5K6FMMnNL5iP360bgU/qOwfwKqqkep u5wKXh0hUpXEHZP9ijpFIcf99GIamcmG7tDToI+cfdaypTNu X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA2MDAyOSBTYWx0ZWRfXw6j3BkQvIsb6 M12dKecEAOzY95j7hJmqR+0MJhLgjCvg+fI4JmBYKP5sy4H92lpXymrcjliKu47tT96Ft2kp9LO rhi5CbvXT6qi7urS0KFlPpIqDPMz//90DjNViKIZT9QgsP3BE/MnFqn/aQ4oZEKHBvMmZcP3Uiw IIUIbQ1Bx+gEa4CRdXwvnkpHLdmrbMNYslp/1onFUcNwG5p/HlRpOxEhwVuBA1pmj11hiryGG+G G4XcskbHB51wBw0On8cInTGoJKKIBDnsVEMtQxPz6I6qLllVZ4xORlYIxx+EIenb4sDzfpXay1d E/hoBFbTm3UFct2PBYhA6+q+4gkZk40tO0TRpil0XVyv40gmWQb3czVKjOIEjvOBzXWuo5zTrhp FyNdWGM3 X-Proofpoint-GUID: 2Yo6QAjIw_HEHXVSyZ8cmrWi08_qY8bS X-Proofpoint-ORIG-GUID: 2Yo6QAjIw_HEHXVSyZ8cmrWi08_qY8bS X-Authority-Analysis: v=2.4 cv=DYgXqutW c=1 sm=1 tr=0 ts=68bd9c24 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=AjFrHIIk6tpMehmkB6kA:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-07_05,2025-09-04_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 suspectscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509060029 Instead of having a copy of the common definitions and functions inside the usb-legacy PHY driver, use the phy-qcom-qmp-common.h header. Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c | 64 ++++------------------= ---- 1 file changed, 8 insertions(+), 56 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c b/drivers/phy/q= ualcomm/phy-qcom-qmp-usb-legacy.c index 8bf951b0490cfd811635df8940de1b789e21b46c..ddb52c1812dd02e15a840deee93= 4c849405c2a98 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c @@ -20,6 +20,8 @@ #include #include =20 +#include "phy-qcom-qmp-common.h" + #include "phy-qcom-qmp.h" #include "phy-qcom-qmp-pcs-misc-v3.h" #include "phy-qcom-qmp-pcs-usb-v4.h" @@ -43,30 +45,6 @@ =20 #define PHY_INIT_COMPLETE_TIMEOUT 10000 =20 -struct qmp_phy_init_tbl { - unsigned int offset; - unsigned int val; - /* - * mask of lanes for which this register is written - * for cases when second lane needs different values - */ - u8 lane_mask; -}; - -#define QMP_PHY_INIT_CFG(o, v) \ - { \ - .offset =3D o, \ - .val =3D v, \ - .lane_mask =3D 0xff, \ - } - -#define QMP_PHY_INIT_CFG_LANE(o, v, l) \ - { \ - .offset =3D o, \ - .val =3D v, \ - .lane_mask =3D l, \ - } - /* set of registers with offsets different per-PHY */ enum qphy_reg_layout { /* PCS registers */ @@ -698,32 +676,6 @@ static const struct qmp_phy_cfg sm8350_usb3phy_cfg =3D= { .pcs_usb_offset =3D 0x300, }; =20 -static void qmp_usb_legacy_configure_lane(void __iomem *base, - const struct qmp_phy_init_tbl tbl[], - int num, - u8 lane_mask) -{ - int i; - const struct qmp_phy_init_tbl *t =3D tbl; - - if (!t) - return; - - for (i =3D 0; i < num; i++, t++) { - if (!(t->lane_mask & lane_mask)) - continue; - - writel(t->val, base + t->offset); - } -} - -static void qmp_usb_legacy_configure(void __iomem *base, - const struct qmp_phy_init_tbl tbl[], - int num) -{ - qmp_usb_legacy_configure_lane(base, tbl, num, 0xff); -} - static int qmp_usb_legacy_serdes_init(struct qmp_usb *qmp) { const struct qmp_phy_cfg *cfg =3D qmp->cfg; @@ -731,7 +683,7 @@ static int qmp_usb_legacy_serdes_init(struct qmp_usb *q= mp) const struct qmp_phy_init_tbl *serdes_tbl =3D cfg->serdes_tbl; int serdes_tbl_num =3D cfg->serdes_tbl_num; =20 - qmp_usb_legacy_configure(serdes, serdes_tbl, serdes_tbl_num); + qmp_configure(qmp->dev, serdes, serdes_tbl, serdes_tbl_num); =20 return 0; } @@ -840,13 +792,13 @@ static int qmp_usb_legacy_power_on(struct phy *phy) } =20 /* Tx, Rx, and PCS configurations */ - qmp_usb_legacy_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1); - qmp_usb_legacy_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1); + qmp_configure_lane(qmp->dev, tx, cfg->tx_tbl, cfg->tx_tbl_num, 1); + qmp_configure_lane(qmp->dev, rx, cfg->rx_tbl, cfg->rx_tbl_num, 1); =20 - qmp_usb_legacy_configure_lane(qmp->tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2); - qmp_usb_legacy_configure_lane(qmp->rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2); + qmp_configure_lane(qmp->dev, qmp->tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2); + qmp_configure_lane(qmp->dev, qmp->rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2); =20 - qmp_usb_legacy_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num); + qmp_configure(qmp->dev, pcs, cfg->pcs_tbl, cfg->pcs_tbl_num); =20 usleep_range(10, 20); =20 --=20 2.47.3 From nobody Wed Sep 10 06:04:35 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 9F9A027F182 for ; Sun, 7 Sep 2025 14:52:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256746; cv=none; b=AOFE0sunzJ2BdWMd2Rrfxqvs4e+k8m8iIIsodLmqNOF2jJ2KOuVUF+X8bVnKhcqiXgvo+nxgtoGWzU7Ryd0fCaSO4cyi/YKV6+ltJqfZXOMPp5UVXEh1uphj641uTQlJ2iQ7aGVZE3xuC7musUzVVOgghs1/XtB7Riz1rk9kj5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256746; c=relaxed/simple; bh=Nf1s/PhEXHXo8aFyYDttuLdpXnvksenJa+qmRK/vJes=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ca2tDM6ul9NQOX5o++lZoEknEIABeUykSTrRQ2x83IN2moWyDYcRo5eP/yyPT5+4n9EIZswJnd+wRyFTSB+MwxPwHg10ytgp5wfOvpN8JLj8HK8ICA1BrJHpKKMmLr05gQKvpyBLXGvCvJCXUpN+aJNk6SRD9NtAZEGIqXLMMq8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=WQ0JhCdl; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="WQ0JhCdl" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 587EmipK029847 for ; Sun, 7 Sep 2025 14:52:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= /XIqAkAydaF2HysR2i0jalHW8uI70wZ4L0rHiq97FcI=; b=WQ0JhCdl+4P26S18 FL2Q3orsNqAvmDMv4MtfZYaeosQ+UqdW4pYqzlSLU25kqM1PNKUfaRWwx72VLMAg xWQruyu+dHb4vyRuNcvxDMO1L6vn/poo7IrZT6FR7Y77RgyzKjj0tZP7w/Rvo3rt Dp7NKsmarixj55fVIP9/PybRU4j7DUh83zxs1XngHT2Hp3qzGAPya45hyWYL+8St 3pvOktQ1hIKoSq2zH4lCRblivAoti5+Dp/qzuWOd4edx7gvKncVG+ilCiP1QwIaD sV+aAuDRJSGqx9pDTtJpYf7lFN9zJAVefV8LldnAWCvRABtY/xVoa1AYOZeKMe64 wYHCRg== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 490d63a6kc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sun, 07 Sep 2025 14:52:23 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-72048b6e864so36783196d6.3 for ; Sun, 07 Sep 2025 07:52:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757256741; x=1757861541; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/XIqAkAydaF2HysR2i0jalHW8uI70wZ4L0rHiq97FcI=; b=hbEVyyF0gnVG9gokHZMCTpRFUvphU3Z16pllC39hzcPKkylYkROWg5NBZU9F9cPtRG PZ3GpbSmOK6Nj3QrYRHt1cubiNpxQ9kV7iGqP0QJPNOjmBH3GScve86MstvrxPDQjJsk FUXOTxK4hVe/GZ4Mi0+bxc7zazkXaOzq8Z3MIGemGYlaqhWDGq+2DPWoaJ03jhWuVdhD QfwrXuiosRAz0NoTpWU5kzs0XoQHmBYOPofaUh9cD1Cz4WktT8F1LOJD7MShXUOXKRTt ZxwJbvizYczeITUmnjxDJkp6tG/rPnmoVTfIjEoV4RoJ1B1MLbb0VWwF0DRf4w/UR+2H I+UA== X-Forwarded-Encrypted: i=1; AJvYcCUJfjGGAA56x2F5wAzEYXV9GKX/yVzZVfQ5HWfizSL+x+6+2+/Nkyja43B1aEl7yPuOx0FBWbh6i84DcZ4=@vger.kernel.org X-Gm-Message-State: AOJu0YwQQxMB7FJu4weKKhcx6bdbAa55rjOM3uwlOc31ZRlTMEnEFPcN xH55PYqiVHK9wsiiTkd+82kF8CJWQQlsnpm8Kvm3f3ahG9TM3JHPCa77dZW8F9+5c4Ed5+GX7g0 IM6oyyOqBY+mTyO62MJklSJK/PSX1xK4IR4nHgK/CBxfmyUh14Fg2CSWYJRQ2pChzhuMJ71Wppx E= X-Gm-Gg: ASbGncvhXzPBp0NVvmVdCXeoTA1wAViqd5SdGXR6QQE/b+/OpLlwnlJTHjZELzhQUl9 Hcj9DGoB8XPf1tuezIfPV6ygViRzpydVp4uyqkN9BS8Zj1btMiHDiZdV+RaOTsamh4xKwILBoOT Ps4A/coKIXMvksWHaXMeSSlivugVcFIax6J5CNvM9Z6uaDcqN4t6V6Fc8oCamBmwcNoSnXoE2zL XKhLB01spPDkuoD+ALl0QO8pm5EST7cB+ucaIHPxuwkVJg7Hi+PxGUfdd9yigjfSh9D2uDQJImz ObwsWUZp4T4TAw9awsNbpVMSqGEKWxFvmsgx4S6elwS1j0FXrMpaBuTlyTgqtF764y1bxQes0/s WSYJll1bS1SRi5u37foqNUn0WSYh0tIkR4sGrfInkUpzro1U5livM X-Received: by 2002:a05:6214:acf:b0:720:b2a:adf0 with SMTP id 6a1803df08f44-739336399cfmr57253536d6.30.1757256741018; Sun, 07 Sep 2025 07:52:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGZ7BpzdmfRxSJ4iPWNPxFzR24KLl0eNrbDfQ7kNZIkt44v3QFEXN+68rqb20Oo4OxU0W8Rgw== X-Received: by 2002:a05:6214:acf:b0:720:b2a:adf0 with SMTP id 6a1803df08f44-739336399cfmr57253366d6.30.1757256740346; Sun, 07 Sep 2025 07:52:20 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5608ab939d5sm2936738e87.46.2025.09.07.07.52.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 07 Sep 2025 07:52:18 -0700 (PDT) From: Dmitry Baryshkov Date: Sun, 07 Sep 2025 17:52:11 +0300 Subject: [PATCH 2/4] phy: qcom: qmp: extract common PIPE clock helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250907-qcom-dp-phy-v1-2-46634a6a980b@oss.qualcomm.com> References: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> In-Reply-To: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> To: Vinod Koul , Kishon Vijay Abraham I Cc: linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=23326; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=Nf1s/PhEXHXo8aFyYDttuLdpXnvksenJa+qmRK/vJes=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBovZwfCkHF28rSlsLQ9CGbnty7aFu3iBXCT7agh 5GE3rqn3y2JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaL2cHwAKCRCLPIo+Aiko 1S2YCACsds6BQnyNj7TiVUIHaLJTe9q9ddmYeb++/PKSAKx23+PgtgXweKl8wAmQFB4OO3GnWvq CTu/RTyKQ/+cc592NWgEGDff7a8GJItTr7XEwcRcT+0zFlT3R4pIB6ZRkQcb/ukqo0X3Rz++aOi Mo5R8h/OIJFD1j6k6lunEFmId5M9MUcXc8AKy9FktOHh+fUZYRTtA7awDcLG5M2ptqLfTMzD3+X 08YoUfYyoEGAE4U12Pwf3ehyomoIN1BCxA27hYUXmC6amd/bOnca+VLceqk4rG4xN7+EweAxInl QRTrsV6piFqWn2H80jWxszrjVvNYtWilYRRCanOU/39KYkeZ X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA2MDAyOSBTYWx0ZWRfXyN2xzacObh99 Yhdmgn7MwbguCRYyyZWve8VwzOVJr/X6b8gxyAPoTaSyq8eLrnS2D2+l2KVZ+bQHaRc6TBsgMbM TFTWnWRfspCCSM9LPbEP+gakBjiPIC6Hr+xKWwQjK8fH9g8LKV6O9WtTCYsqiWBSJDQuzBoRFVi MbnHKNk7uRupxeRaQoEXoUkwHN095UoLYWyJ4PgPR0Ysdac7KnulYsw6Li/PoQxR7alhdcFCqF8 N0lrKmmAysFSU2Px+B6LPiq2SZXygS5UsLSesLkoUPI8/GKB+kUJhUYooa0JW6KANIH7jqocfPf lNuzS3iGcSruA2zZQw2PkD4tjLnuLFffjkcz9ATemo66NOZ+pYhG6xbSBDRnPE309ZRqNlFunsh ma/kdCl2 X-Proofpoint-GUID: xGANbHd0UAXR4OgJ1PoESXB2e2iPiy6A X-Proofpoint-ORIG-GUID: xGANbHd0UAXR4OgJ1PoESXB2e2iPiy6A X-Authority-Analysis: v=2.4 cv=DYgXqutW c=1 sm=1 tr=0 ts=68bd9c27 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=o8b8T06iM2j7pLjo7BIA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-07_05,2025-09-04_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 suspectscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509060029 Extract the code common to (almost) all QMP PHY drivers, which handles the 125 MHz PIPE clock. Drop unused pipe_clk_fixed fields from the QMP PHY structures, using pipe_clk_hw instead (where required). Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 56 +++----------------- drivers/phy/qualcomm/phy-qcom-qmp-common.h | 67 ++++++++++++++++++++= ++++ drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c | 62 +-------------------= -- drivers/phy/qualcomm/phy-qcom-qmp-pcie.c | 67 +++-----------------= ---- drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c | 60 +-------------------- drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 60 +-------------------- drivers/phy/qualcomm/phy-qcom-qmp-usbc.c | 60 +-------------------- 7 files changed, 87 insertions(+), 345 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c b/drivers/phy/qualco= mm/phy-qcom-qmp-combo.c index 7b5af30f1d028c592500e723ecd27b54ed554709..baf25ae442478ac01a5428fa426= 8470e6b5211e3 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c @@ -1863,7 +1863,7 @@ struct qmp_combo { unsigned int dp_init_count; bool dp_powered_on; =20 - struct clk_fixed_rate pipe_clk_fixed; + struct clk_hw *pipe_clk_hw; struct clk_hw dp_link_hw; struct clk_hw dp_pixel_hw; =20 @@ -3512,46 +3512,6 @@ static int qmp_combo_clk_init(struct qmp_combo *qmp) return devm_clk_bulk_get_optional(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qmp_combo *qmp, struct device_node= *np) -{ - struct clk_fixed_rate *fixed =3D &qmp->pipe_clk_fixed; - struct clk_init_data init =3D { }; - char name[64]; - - snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(qmp->dev)); - init.name =3D name; - init.ops =3D &clk_fixed_rate_ops; - - /* controllers using QMP phys use 125MHz pipe clock interface */ - fixed->fixed_rate =3D 125000000; - fixed->hw.init =3D &init; - - return devm_clk_hw_register(qmp->dev, &fixed->hw); -} - /* * Display Port PLL driver block diagram for branch clocks * @@ -3724,7 +3684,7 @@ static struct clk_hw *qmp_combo_clk_hw_get(struct of_= phandle_args *clkspec, void =20 switch (clkspec->args[0]) { case QMP_USB43DP_USB3_PIPE_CLK: - return &qmp->pipe_clk_fixed.hw; + return qmp->pipe_clk_hw; case QMP_USB43DP_DP_LINK_CLK: return &qmp->dp_link_hw; case QMP_USB43DP_DP_VCO_DIV_CLK: @@ -3739,9 +3699,9 @@ static int qmp_combo_register_clocks(struct qmp_combo= *qmp, struct device_node * { int ret; =20 - ret =3D phy_pipe_clk_register(qmp, usb_np); - if (ret) - return ret; + qmp->pipe_clk_hw =3D devm_qmp_register_pipe_clock(qmp->dev, usb_np); + if (IS_ERR(qmp->pipe_clk_hw)) + return PTR_ERR(qmp->pipe_clk_hw); =20 ret =3D phy_dp_clks_register(qmp, dp_np); if (ret) @@ -3757,7 +3717,7 @@ static int qmp_combo_register_clocks(struct qmp_combo= *qmp, struct device_node * * Register multiple providers for legacy bindings with child nodes. */ ret =3D of_clk_add_hw_provider(usb_np, of_clk_hw_simple_get, - &qmp->pipe_clk_fixed.hw); + qmp->pipe_clk_hw); if (ret) return ret; =20 @@ -3765,7 +3725,7 @@ static int qmp_combo_register_clocks(struct qmp_combo= *qmp, struct device_node * * Roll a devm action because the clock provider is the child node, but * the child node is not actually a device. */ - ret =3D devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, usb_= np); + ret =3D devm_add_action_or_reset(qmp->dev, qmp_clk_release_provider, usb_= np); if (ret) return ret; =20 @@ -3773,7 +3733,7 @@ static int qmp_combo_register_clocks(struct qmp_combo= *qmp, struct device_node * if (ret) return ret; =20 - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, dp_np= ); + return devm_add_action_or_reset(qmp->dev, qmp_clk_release_provider, dp_np= ); } =20 #if IS_ENABLED(CONFIG_TYPEC) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-common.h b/drivers/phy/qualc= omm/phy-qcom-qmp-common.h index b945fc14cecec4ef00143e144cea4e10225d5947..00041892d9ec7a45e21b0b15301= ab65ed996bd45 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-common.h +++ b/drivers/phy/qualcomm/phy-qcom-qmp-common.h @@ -6,6 +6,10 @@ #ifndef QCOM_PHY_QMP_COMMON_H_ #define QCOM_PHY_QMP_COMMON_H_ =20 +#include +#include +#include + struct qmp_phy_init_tbl { unsigned int offset; unsigned int val; @@ -59,4 +63,67 @@ static inline void qmp_configure(struct device *dev, voi= d __iomem *base, qmp_configure_lane(dev, base, tbl, num, 0xff); } =20 +/* + * Register a fixed rate pipe clock. + * + * The _pipe_clksrc generated by PHY goes to the GCC that gate + * controls it. The _pipe_clk coming out of the GCC is requested + * by the PHY driver for its operations. + * We register the _pipe_clksrc here. The gcc driver takes care + * of assigning this _pipe_clksrc as parent to _pipe_clk. + * Below picture shows this relationship. + * + * +---------------+ + * | PHY block |<<---------------------------------------+ + * | | | + * | +-------+ | +-----+ | + * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ + * clk | +-------+ | +-----+ + * +---------------+ + */ +static inline struct clk_hw *devm_qmp_register_pipe_clock(struct device *d= ev, + struct device_node *np) +{ + const char *pname =3D NULL; + char name[64]; + + /* ignore if the property is not present */ + if (np) + of_property_read_string(np, "clock-output-names", &pname); + + if (!pname) { + snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(dev)); + pname =3D name; + } + + /* controllers using QMP phys use 125MHz pipe clock interface */ + return devm_clk_hw_register_fixed_rate(dev, pname, NULL, 0, 125000000); +} + +static inline void qmp_clk_release_provider(void *res) +{ + of_clk_del_provider(res); +} + +static inline int devm_qmp_register_pipe_clock_provider(struct device *dev, + struct device_node *np) +{ + struct clk_hw *fixed; + int ret; + + fixed =3D devm_qmp_register_pipe_clock(dev, np); + if (IS_ERR(fixed)) + return PTR_ERR(fixed); + + ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, fixed); + if (ret) + return ret; + + /* + * Roll a devm action because the clock provider is the child node, but + * the child node is not actually a device. + */ + return devm_add_action_or_reset(dev, qmp_clk_release_provider, np); +} + #endif diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c b/drivers/phy= /qualcomm/phy-qcom-qmp-pcie-msm8996.c index a7c65cfe31dfb80d8b1058d3c519a324a309d1c2..226d893c198bdce0ecd3d7d31ed= 65199fc360ecf 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c @@ -579,66 +579,6 @@ static int qmp_pcie_msm8996_clk_init(struct device *de= v, const struct qmp_phy_cf return devm_clk_bulk_get(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qcom_qmp *qmp, struct device_node = *np) -{ - struct clk_fixed_rate *fixed; - struct clk_init_data init =3D { }; - int ret; - - ret =3D of_property_read_string(np, "clock-output-names", &init.name); - if (ret) { - dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); - return ret; - } - - fixed =3D devm_kzalloc(qmp->dev, sizeof(*fixed), GFP_KERNEL); - if (!fixed) - return -ENOMEM; - - init.ops =3D &clk_fixed_rate_ops; - - /* controllers using QMP phys use 125MHz pipe clock interface */ - fixed->fixed_rate =3D 125000000; - fixed->hw.init =3D &init; - - ret =3D devm_clk_hw_register(qmp->dev, &fixed->hw); - if (ret) - return ret; - - ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw); - if (ret) - return ret; - - /* - * Roll a devm action because the clock provider is the child node, but - * the child node is not actually a device. - */ - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); -} - static const struct phy_ops qmp_pcie_msm8996_ops =3D { .power_on =3D qmp_pcie_msm8996_enable, .power_off =3D qmp_pcie_msm8996_disable, @@ -785,7 +725,7 @@ static int qmp_pcie_msm8996_probe(struct platform_devic= e *pdev) * Register the pipe clock provided by phy. * See function description to see details of this pipe clock. */ - ret =3D phy_pipe_clk_register(qmp, child); + ret =3D devm_qmp_register_pipe_clock_provider(dev, child); if (ret) { dev_err(qmp->dev, "failed to register pipe clock source\n"); diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c b/drivers/phy/qualcom= m/phy-qcom-qmp-pcie.c index 62b1c845b6275d924fa501ac64e69db5f58844aa..dad44cc0648355fc1533c9afd17= 6b7d37cfa9018 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c @@ -3172,7 +3172,7 @@ struct qmp_pcie { struct phy *phy; int mode; =20 - struct clk_fixed_rate pipe_clk_fixed; + struct clk_hw *pipe_clk_hw; struct clk_fixed_rate aux_clk_fixed; }; =20 @@ -4789,57 +4789,6 @@ static int qmp_pcie_clk_init(struct qmp_pcie *qmp) return devm_clk_bulk_get_optional(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qmp_pcie *qmp, struct device_node = *np) -{ - struct clk_fixed_rate *fixed =3D &qmp->pipe_clk_fixed; - struct clk_init_data init =3D { }; - int ret; - - ret =3D of_property_read_string_index(np, "clock-output-names", 0, &init.= name); - if (ret) { - dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); - return ret; - } - - init.ops =3D &clk_fixed_rate_ops; - - /* - * Controllers using QMP PHY-s use 125MHz pipe clock interface - * unless other frequency is specified in the PHY config. - */ - if (qmp->cfg->pipe_clock_rate) - fixed->fixed_rate =3D qmp->cfg->pipe_clock_rate; - else - fixed->fixed_rate =3D 125000000; - - fixed->hw.init =3D &init; - - return devm_clk_hw_register(qmp->dev, &fixed->hw); -} - /* * Register a fixed rate PHY aux clock. * @@ -4881,11 +4830,11 @@ static struct clk_hw *qmp_pcie_clk_hw_get(struct of= _phandle_args *clkspec, void =20 /* Support legacy bindings */ if (!clkspec->args_count) - return &qmp->pipe_clk_fixed.hw; + return qmp->pipe_clk_hw; =20 switch (clkspec->args[0]) { case QMP_PCIE_PIPE_CLK: - return &qmp->pipe_clk_fixed.hw; + return qmp->pipe_clk_hw; case QMP_PCIE_PHY_AUX_CLK: return &qmp->aux_clk_fixed.hw; } @@ -4897,9 +4846,9 @@ static int qmp_pcie_register_clocks(struct qmp_pcie *= qmp, struct device_node *np { int ret; =20 - ret =3D phy_pipe_clk_register(qmp, np); - if (ret) - return ret; + qmp->pipe_clk_hw =3D devm_qmp_register_pipe_clock(qmp->dev, np); + if (IS_ERR(qmp->pipe_clk_hw)) + return PTR_ERR(qmp->pipe_clk_hw); =20 if (qmp->cfg->aux_clock_rate) { ret =3D phy_aux_clk_register(qmp, np); @@ -4910,7 +4859,7 @@ static int qmp_pcie_register_clocks(struct qmp_pcie *= qmp, struct device_node *np if (ret) return ret; } else { - ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, &qmp->pipe_clk_= fixed.hw); + ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, qmp->pipe_clk_h= w); if (ret) return ret; } @@ -4919,7 +4868,7 @@ static int qmp_pcie_register_clocks(struct qmp_pcie *= qmp, struct device_node *np * Roll a devm action because the clock provider is the child node, but * the child node is not actually a device. */ - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); + return devm_add_action_or_reset(qmp->dev, qmp_clk_release_provider, np); } =20 static int qmp_pcie_parse_dt_legacy(struct qmp_pcie *qmp, struct device_no= de *np) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c b/drivers/phy/q= ualcomm/phy-qcom-qmp-usb-legacy.c index ddb52c1812dd02e15a840deee934c849405c2a98..0e775671054ed02024d01e3a11c= 6d3e2f973a097 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c @@ -521,8 +521,6 @@ struct qmp_usb { enum phy_mode mode; =20 struct phy *phy; - - struct clk_fixed_rate pipe_clk_fixed; }; =20 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val) @@ -1043,62 +1041,6 @@ static int qmp_usb_legacy_clk_init(struct qmp_usb *q= mp) return devm_clk_bulk_get(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qmp_usb *qmp, struct device_node *= np) -{ - struct clk_fixed_rate *fixed =3D &qmp->pipe_clk_fixed; - struct clk_init_data init =3D { }; - int ret; - - ret =3D of_property_read_string(np, "clock-output-names", &init.name); - if (ret) { - dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); - return ret; - } - - init.ops =3D &clk_fixed_rate_ops; - - /* controllers using QMP phys use 125MHz pipe clock interface */ - fixed->fixed_rate =3D 125000000; - fixed->hw.init =3D &init; - - ret =3D devm_clk_hw_register(qmp->dev, &fixed->hw); - if (ret) - return ret; - - ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw); - if (ret) - return ret; - - /* - * Roll a devm action because the clock provider is the child node, but - * the child node is not actually a device. - */ - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); -} - static int qmp_usb_legacy_parse_dt_legacy(struct qmp_usb *qmp, struct devi= ce_node *np) { struct platform_device *pdev =3D to_platform_device(qmp->dev); @@ -1239,7 +1181,7 @@ static int qmp_usb_legacy_probe(struct platform_devic= e *pdev) */ pm_runtime_forbid(dev); =20 - ret =3D phy_pipe_clk_register(qmp, np); + ret =3D devm_qmp_register_pipe_clock_provider(dev, np); if (ret) goto err_node_put; =20 diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c b/drivers/phy/qualcomm= /phy-qcom-qmp-usb.c index ed646a7e705ba3259708775ed5fedbbbada13735..7040b53e482d667f90eef09e3c4= a93cb6c01f934 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c @@ -1301,8 +1301,6 @@ struct qmp_usb { enum phy_mode mode; =20 struct phy *phy; - - struct clk_fixed_rate pipe_clk_fixed; }; =20 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val) @@ -2046,62 +2044,6 @@ static int qmp_usb_clk_init(struct qmp_usb *qmp) return devm_clk_bulk_get_optional(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qmp_usb *qmp, struct device_node *= np) -{ - struct clk_fixed_rate *fixed =3D &qmp->pipe_clk_fixed; - struct clk_init_data init =3D { }; - int ret; - - ret =3D of_property_read_string(np, "clock-output-names", &init.name); - if (ret) { - dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); - return ret; - } - - init.ops =3D &clk_fixed_rate_ops; - - /* controllers using QMP phys use 125MHz pipe clock interface */ - fixed->fixed_rate =3D 125000000; - fixed->hw.init =3D &init; - - ret =3D devm_clk_hw_register(qmp->dev, &fixed->hw); - if (ret) - return ret; - - ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw); - if (ret) - return ret; - - /* - * Roll a devm action because the clock provider is the child node, but - * the child node is not actually a device. - */ - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); -} - static void __iomem *qmp_usb_iomap(struct device *dev, struct device_node = *np, int index, bool exclusive) { @@ -2276,7 +2218,7 @@ static int qmp_usb_probe(struct platform_device *pdev) */ pm_runtime_forbid(dev); =20 - ret =3D phy_pipe_clk_register(qmp, np); + ret =3D devm_qmp_register_pipe_clock_provider(dev, np); if (ret) goto err_node_put; =20 diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c b/drivers/phy/qualcom= m/phy-qcom-qmp-usbc.c index 5e7fcb26744a4401c3076960df9c0dcbec7fdef7..83f3011a93c0cd53f59a1a45406= bf4d9107e7ea9 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c @@ -347,8 +347,6 @@ struct qmp_usbc { =20 struct phy *phy; =20 - struct clk_fixed_rate pipe_clk_fixed; - struct typec_switch_dev *sw; enum typec_orientation orientation; }; @@ -796,62 +794,6 @@ static int qmp_usbc_clk_init(struct qmp_usbc *qmp) return devm_clk_bulk_get_optional(dev, num, qmp->clks); } =20 -static void phy_clk_release_provider(void *res) -{ - of_clk_del_provider(res); -} - -/* - * Register a fixed rate pipe clock. - * - * The _pipe_clksrc generated by PHY goes to the GCC that gate - * controls it. The _pipe_clk coming out of the GCC is requested - * by the PHY driver for its operations. - * We register the _pipe_clksrc here. The gcc driver takes care - * of assigning this _pipe_clksrc as parent to _pipe_clk. - * Below picture shows this relationship. - * - * +---------------+ - * | PHY block |<<---------------------------------------+ - * | | | - * | +-------+ | +-----+ | - * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ - * clk | +-------+ | +-----+ - * +---------------+ - */ -static int phy_pipe_clk_register(struct qmp_usbc *qmp, struct device_node = *np) -{ - struct clk_fixed_rate *fixed =3D &qmp->pipe_clk_fixed; - struct clk_init_data init =3D { }; - int ret; - - ret =3D of_property_read_string(np, "clock-output-names", &init.name); - if (ret) { - dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); - return ret; - } - - init.ops =3D &clk_fixed_rate_ops; - - /* controllers using QMP phys use 125MHz pipe clock interface */ - fixed->fixed_rate =3D 125000000; - fixed->hw.init =3D &init; - - ret =3D devm_clk_hw_register(qmp->dev, &fixed->hw); - if (ret) - return ret; - - ret =3D of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw); - if (ret) - return ret; - - /* - * Roll a devm action because the clock provider is the child node, but - * the child node is not actually a device. - */ - return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); -} - #if IS_ENABLED(CONFIG_TYPEC) static int qmp_usbc_typec_switch_set(struct typec_switch_dev *sw, enum typec_orientation orientation) @@ -1093,7 +1035,7 @@ static int qmp_usbc_probe(struct platform_device *pde= v) */ pm_runtime_forbid(dev); =20 - ret =3D phy_pipe_clk_register(qmp, np); + ret =3D devm_qmp_register_pipe_clock_provider(dev, np); if (ret) goto err_node_put; =20 --=20 2.47.3 From nobody Wed Sep 10 06:04:35 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 AB4B627FB0E for ; Sun, 7 Sep 2025 14:52:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256747; cv=none; b=byW89ne5pO7tARrb8RF2h43HG5CpSwsNRtd478Ao+yNi7Aym+mx3F6kC3qgrRDLXYvM+WUXeWXcZWsdPHucwsR2EaDMW5Qv1EUhfBQdTkM+QDi4Yv0cDX2IB6rU4h0cZaowUW/lB0QMKhXSY39UvDfUgO+9JNH04iFRo2rcwlwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256747; c=relaxed/simple; bh=/UGpwgqLbcHspMjEQhf+040bOSKXnckhqkr7K5HPcSw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Rh1/x4een/lLd67RalSM6/LXU8Z9XsVgR6Lwl6XNO+qvZ0Pcsq5nbzOPk9P5WuxRIjgpGfR8o9/PFmTWUO9RokVxyhPg4u34nSUU4r2yINvvDGyOhrxLJ4xLFamN4KUZptIsVi04/ReMmcscHTgCfvtDHW6lK/jVza52YctpqHE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=k+5/s9Yq; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="k+5/s9Yq" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5878kAD7020355 for ; Sun, 7 Sep 2025 14:52:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= uXEvIWnbOkICzt6MJ22YL53UMQf8f9LrhVZWM6rbuZM=; b=k+5/s9Yq0AystLw0 z47uMBoFuMyOgGp2TvjsW8HNhZa5GFeciREo216E552wXVaExN9H8eKhlPcw42Ch UULoZ8wNMc5aRnmqO/VMVzxqDzYvD6Jj2qPthu0p+Mq/EkHTg6ApEbSxHIkqMXTH Ml/0WlrthOzud/kTqmwGDVybMz5PO7mTLW0L2u3I04rus1nsAiGcGNmRZDd6fBKr VYMhjeqHe/+laUCWSlUdHVa256M35rA4r61HPcbc6ww70BNRT58KIX+s6LqCeMOy 7/WlZKWRFKCqlvb5T1Ylc8ILFNcEFsEBwdJGaff+x8+zxwFYWjOi9/2gC02Vzqtk 1FZFhw== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 490anfae2a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sun, 07 Sep 2025 14:52:23 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-718c2590e94so110174826d6.1 for ; Sun, 07 Sep 2025 07:52:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757256742; x=1757861542; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uXEvIWnbOkICzt6MJ22YL53UMQf8f9LrhVZWM6rbuZM=; b=l6clkxDpW00EYgFJqZt+MZJwAjOup1AlkmOxFhatNBUnATLl6jHUApAer5sWH9LGPB 9CYRaDj4jCGzzwdsHF9LAQjuDNygkcDgTwvZdsaqVCZArA/b0qFJN2JQKHKYsxTSQXjv aTZJ6vhEip5z5RmuGaYCpm46tbtSQOiIKAt9VEvGJhppBLV8y8mI//xGUbFBP+PLd9Uf AreUmlmsTFac9XvjLP0qapFxQnwUdm1jI3GN23TNtL2HMAbiRHpxaGxCBOt8kAoqcQUR 3ItfUEbufgpWULNsuRwwlphvQ5CpeZ8veMHtAwSBTAGPedOW58s7bO7S7rlUAC8iZ47E /5tg== X-Forwarded-Encrypted: i=1; AJvYcCWM5Ftcm+5wSumlSxBGeJfu+UeT7ma5E5QocXOluvxbTEhro7YWvtZ3tJD13Sj0SrWyocvLu5pS5V2bpA4=@vger.kernel.org X-Gm-Message-State: AOJu0YwTx2o9hT2FYWuNbmVG1K+pZktqeoZVLOh25F3aJ5HLj8S3Iu+y kX204obRbuUVCIewegrxPxMrv21/AWPksnK5hXPWCluGDc1B9c8lnUVvuWxydLloe4fyfZev0Vo atCsPOJUbcjGsrh2kMz7yO6QpntbgNu1eZwKwjfGsq9dD75fw+XJBMhvC+bS1Gg2bMHB5xXGwlt E= X-Gm-Gg: ASbGnct+GoAqZR6XcDgkILNJgt4mLZo2RDXcWk5WLg8hTpIK2Q5a6ALck5SWkP7CkwT JnkM3LY+wZaInKDZcMqePZaBAguZ4KdHp/xLxzGs7R/RYX6o8ueXJQASbotqOAK0zspy338wa8o Mo3UwvFKGDJ6WM95xmUASz1YGoz3lsTHSXmQPMNdlUT7uV/2s6R7+AG44MNm/376KBimR+9VFJS lEyR/YHpiyVLCSlOrwrKIX5nfiIN8+tHrKAEtBTJ6S7/6cDbNHaJuzAjE6C/hyjiu8Lar/GKQ5Q 8JGxBEbGnmQM6awEl0Prf7/4QPRqA+t0eom2HEW30zCsk6J60UtY/E1aXA9GsuN5eoqKsss/L2V pn3Ss4CAXCEt4niM+Da9ioecnnm7vz8yMFcRoJ8PjJHVZ7X+3+7Uj X-Received: by 2002:ad4:5de2:0:b0:722:2301:315 with SMTP id 6a1803df08f44-72bc4f93957mr111576566d6.29.1757256741906; Sun, 07 Sep 2025 07:52:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEJHVWmsQlKEwtB5F5SiO5c82N/76wI2OG3Sj8gZLObDi88o8+yPn/Ihsm5i+eJImPr0TQ8pQ== X-Received: by 2002:ad4:5de2:0:b0:722:2301:315 with SMTP id 6a1803df08f44-72bc4f93957mr111576406d6.29.1757256741535; Sun, 07 Sep 2025 07:52:21 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5608ab939d5sm2936738e87.46.2025.09.07.07.52.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 07 Sep 2025 07:52:20 -0700 (PDT) From: Dmitry Baryshkov Date: Sun, 07 Sep 2025 17:52:12 +0300 Subject: [PATCH 3/4] phy: qcom: qmp-pcie: simplify AUX clock registration Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250907-qcom-dp-phy-v1-3-46634a6a980b@oss.qualcomm.com> References: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> In-Reply-To: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> To: Vinod Koul , Kishon Vijay Abraham I Cc: linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1929; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=/UGpwgqLbcHspMjEQhf+040bOSKXnckhqkr7K5HPcSw=; b=kA0DAAoBizyKPgIpKNUByyZiAGi9nB+i9+O9rWaagO59RyRA3FTS3nlrOFKSSJecf0T6cqpxR okBMwQAAQoAHRYhBExwhJVcsmNW8LiVf4s8ij4CKSjVBQJovZwfAAoJEIs8ij4CKSjVJ0MH/174 EKbry2VSI0M+MUUSLJmimpY5GH7+VCNsepDpKLUGeAx9epYlURX1qqEWtMLgZhnC7fxl0Ms9Gj6 vEsnSYED1WugA8B07PptbGtGULT/ZaoymEJPZmnNnLiOf7NcxrLlH0/+5TK1CdmIjNKRyfwe/hU hFXMuLJ00qiU4O0Qy2SD6/IW0EDyFgGIVOM/Mf//WKD/DHNbPv+I0TZUKbTqn1r++ftc3Ni2hAe fzXhjUvgpFuviZhcT+f/CdsuGoyWtgBGZ/ljCPqlgSjhig+dtejUKa0dPa4zHD6VUDU1t8kAbEc 0EptjSVcqQXN+SDvHcdet2KL7Ua/DOSCmOM5vks= X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: BXu4tE0JQG5FRzUv_4nZhlwomknC-TWa X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA2MDAwNCBTYWx0ZWRfX7mAugcXKN7Kv 85sLOzOx/D1eU07n9qI8MqrllUfG4Af5/yhm5erSefdj/9/x/IrJAd2rHF8dYzwsMfzpheQ+bf3 tzfD9AfsF9fgaVFPT5UK9wXEDjvtuFn0rKOpahq0NRiVkVdTB+HS5FG6CS3PxhkJCw9jTH+i7G0 6LotPN7fJQi6f8V2xzvEjBjCYyXdVkIw6fldsOVB8duOawOUBiHkvtFKKsj1e1EOjklw0HZe+v/ /xvQGCHFx/y5c4pzsicORxwOFdmzFsp1iW0ZcE8o7MsI7DnToB49zrtpl6LbJ5FreyC1WBmv7RU Wq7VYDhLgXEBBQY6fE4+VJckP5bdbj6y8dEVHZduZGIDmHbyf+GRHbvVP99+gWvB3/yo42v8e99 30Pa9QKq X-Proofpoint-GUID: BXu4tE0JQG5FRzUv_4nZhlwomknC-TWa X-Authority-Analysis: v=2.4 cv=CaoI5Krl c=1 sm=1 tr=0 ts=68bd9c27 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=UpTUyc56fgFd2ZLN3CkA:9 a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-07_05,2025-09-04_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 clxscore=1015 malwarescore=0 adultscore=0 impostorscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509060004 Instead of hand-coding it, use devm_clk_hw_register_fixed_rate() to register the PHY AUX clock. Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/phy/qualcomm/phy-qcom-qmp-pcie.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c b/drivers/phy/qualcom= m/phy-qcom-qmp-pcie.c index dad44cc0648355fc1533c9afd176b7d37cfa9018..a81facec7e45304f26ca3ce165a= f90aa5ff56f4e 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c @@ -3173,7 +3173,7 @@ struct qmp_pcie { int mode; =20 struct clk_hw *pipe_clk_hw; - struct clk_fixed_rate aux_clk_fixed; + struct clk_hw *aux_clk_hw; }; =20 static bool qphy_checkbits(const void __iomem *base, u32 offset, u32 val) @@ -4809,19 +4809,13 @@ static int qmp_pcie_clk_init(struct qmp_pcie *qmp) */ static int phy_aux_clk_register(struct qmp_pcie *qmp, struct device_node *= np) { - struct clk_fixed_rate *fixed =3D &qmp->aux_clk_fixed; - struct clk_init_data init =3D { }; char name[64]; =20 snprintf(name, sizeof(name), "%s::phy_aux_clk", dev_name(qmp->dev)); =20 - init.name =3D name; - init.ops =3D &clk_fixed_rate_ops; - - fixed->fixed_rate =3D qmp->cfg->aux_clock_rate; - fixed->hw.init =3D &init; - - return devm_clk_hw_register(qmp->dev, &fixed->hw); + qmp->aux_clk_hw =3D devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL,= 0, + qmp->cfg->aux_clock_rate); + return PTR_ERR_OR_ZERO(qmp->aux_clk_hw); } =20 static struct clk_hw *qmp_pcie_clk_hw_get(struct of_phandle_args *clkspec,= void *data) @@ -4836,7 +4830,7 @@ static struct clk_hw *qmp_pcie_clk_hw_get(struct of_p= handle_args *clkspec, void case QMP_PCIE_PIPE_CLK: return qmp->pipe_clk_hw; case QMP_PCIE_PHY_AUX_CLK: - return &qmp->aux_clk_fixed.hw; + return qmp->aux_clk_hw; } =20 return ERR_PTR(-EINVAL); --=20 2.47.3 From nobody Wed Sep 10 06:04:35 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 52C62280023 for ; Sun, 7 Sep 2025 14:52:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256750; cv=none; b=juX36+uj8qx8WWi7m0G8V4XNP7Fcc0arGCvLV56snOPwkg1Bfu7yv4fps7bYgKh4BdaDHHu7/21rCGpvffc1aQmo4MqnT4qxMedlhRimogPiA5g0Ayr1nEemN8hIx4jit4a9Az2wa6+xT0zqypoq8yRiTJNbVlw9Zh47Todg6t4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757256750; c=relaxed/simple; bh=+lxZy5wSWHwn4dkXG8qEVFxp6y7sBJ88wefm48Ftm6A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D51GKz6YWNQ6V1ejPh+wAWEvls/ADIJHW4KVlQPC8SN+pvCPGbTKId3rKH15VlYGrkusg3A5u2rnjBrEXjOKNCe1woCQRH/qpoHbvvaCQZ7dLpB3E5QPthBe0voBQPSDJ5ibB5RH1iYO/snlF4cpuznoQmZ6eJiNaQOcrZErjm8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=dOR9vFVN; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="dOR9vFVN" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 587AeIDK026612 for ; Sun, 7 Sep 2025 14:52:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Jp17008N9EcjHAl9t0HpxgMYKb1MSuNaJ/ECZEHaOsI=; b=dOR9vFVNUXkIvFLZ MdOHB1REzE3CMiD4c6Es8COU9ElqQgJaBkKpUqdnSHLpmmQngdlAU+KamQXvf9TF CAeHDZ8de6fS2s+6Qduo2fsHdYPLRqRYToHVLhfnm0GpzRtz8sWQkGFmpyTtWlM5 VvQd5l5gnfTiZakQLOaSk+H9QemqBu3FKM/h0detOWhf/0Z37FdFmcs0gkQDdpJX gEwcYL04WXmAP5OyLhX0s+hVPKNvbSrGYoR2M7R/00d5Wuo9EB4dZ6AZLS3OKdfi tSysHQkSfDBbiB0H1OHqnPx5rFYYxYHCuWxNLYWlAqAZGStFxuZIB+IIhgCaquEF z0iZJA== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 490e4kt4bu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sun, 07 Sep 2025 14:52:26 +0000 (GMT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-72048b6e865so75967746d6.2 for ; Sun, 07 Sep 2025 07:52:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757256744; x=1757861544; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Jp17008N9EcjHAl9t0HpxgMYKb1MSuNaJ/ECZEHaOsI=; b=ohLiSZsjzZ7iQtTSG/DgzTUIFu9G0I8Q1k9X3ab1fFFQM7moZAhwSz/ynjHhfyru5i jyAGlay5x3w2TGgGNropNnfDQM+4nLnipJFzDp/TdbzwGFg3mnm/KCLdwVYdvwNCruPr Y4ZO0UzA8dIsa40ku8Io76194mCp/9LzHq7bqvxqGWwVrzXZXsIhGleUonnCSEqs2dph n1bRrFA6ADuFKxNiqRHBwCYPspzES/jx+PTVRX0JzNvFeoihQADvBXRR0Sb8SvZ0GaEt HeO/xwO0RlkGope3jIgHPS6Q2JcuWC83pUebQM8/n9xMRRj66SaxJcwrUQko/Go8Mqj7 QuQg== X-Forwarded-Encrypted: i=1; AJvYcCVCKKEB/vZQ5Wv52psqc3CgCn73EbwG77NaZ2zcbvUnu9UqoXx8WHjIvacwtaGIyB/d93zWkG2XCnqVPIY=@vger.kernel.org X-Gm-Message-State: AOJu0Ywup774BkLMs1DN4qWwbIfEi/ELFViZN2OZFO0RbUl7nQ/eHxEZ Jw9dQoFAoqdpaE0UKHbN7NaNiASmaO7pHnRnRyInkTwxWdE6i44RqSFpPAk2P8tzYfQALNiek3r bxT8pMtFdA4R9e50E+ujqlxRhJdLZI0lYNmZtf2ZwleBHvCPKUO6CKMx+ooervbVAtfYr8lWDYO Q= X-Gm-Gg: ASbGncvSgZMq1T67Wou25XXCdyPNAhirwp9bxEFJghyz04uf3kEu8lNpOWf0B1mwVQU 6CGtSfSbmqo6NNaDiSynv6mA6LHYBHTJVReosD7EikPoTycsVwJsZ3XtihlCbN0kRQJwd3r5gxy 0TlsMxCjSQHooy017dde5u/ljic8/LWObc3JRk9jyqOo744hXBGkKSyThwWAisuIx19RzzXJXTM RtDQMJI21ufSADTI/Ei2LAsLQAJjRPknCTDpYXGcNDNDthRCrnWRcJYQVpyFFImAa/MV3G/kEe+ 0ws1MupvwcIt+e9VRjMKsidA4NvsM5nAriFo9HSmsG4fymacnE+M7thOfrLEf2vk7f8piAfi69h mzAU68gfv3YT2lwpNLFoYC2FXwIz88JOJQmEyGOs0AoauyAq+5CN+ X-Received: by 2002:a05:6214:1256:b0:725:cd10:3d1d with SMTP id 6a1803df08f44-7391f9bb4bbmr54357316d6.16.1757256743869; Sun, 07 Sep 2025 07:52:23 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEywULK/o5gerneWOtP1Ftmr2zD7HJNj5pRL52f8+t/P7CaGR9+Im7V1oAQiPv0G7huvf6Ujw== X-Received: by 2002:a05:6214:1256:b0:725:cd10:3d1d with SMTP id 6a1803df08f44-7391f9bb4bbmr54357116d6.16.1757256743245; Sun, 07 Sep 2025 07:52:23 -0700 (PDT) Received: from umbar.lan (2001-14ba-a0c3-3a00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a0c3:3a00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5608ab939d5sm2936738e87.46.2025.09.07.07.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 07 Sep 2025 07:52:21 -0700 (PDT) From: Dmitry Baryshkov Date: Sun, 07 Sep 2025 17:52:13 +0300 Subject: [PATCH 4/4] phy: qcom: extract common code for DP clocks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250907-qcom-dp-phy-v1-4-46634a6a980b@oss.qualcomm.com> References: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> In-Reply-To: <20250907-qcom-dp-phy-v1-0-46634a6a980b@oss.qualcomm.com> To: Vinod Koul , Kishon Vijay Abraham I Cc: linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=29309; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=+lxZy5wSWHwn4dkXG8qEVFxp6y7sBJ88wefm48Ftm6A=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBovZwf/x9GbApPNr7nxVQY7pgb/vVpLaJ/mLIzf PsvmV0CE5mJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaL2cHwAKCRCLPIo+Aiko 1WUACACzu3HvaSE30G/lbXlO/P7/gengB+spGgEV1FxAiky/nLWnUfwoIYw0HbmT93+LPa90ha4 4DlUSLYRPaQseDYH/YMvkI+VmGy1iGXX9USQ/Rhlf2AG/L9yv51e5el377e+sRVAJDIW0l8hcHm ifFPl9lPtn79QMzXpa3WHMypqzpG3pZ95LMq9KwUyZUG6tGGjTnvKbrjDDubmFzkp0kljYKQh2s c0oZ+0a3kpxmalVsUS+KAYE9LCRG8vnd6pZoym6hQe5iLdkieMjMpeje+qMl66lqYBCK0xKQ6+I 2TNhBl3EK8qsv0SzzjUePoqJ/wyxKqoioBraMWvWeOsE1Sq7 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA2MDAzOCBTYWx0ZWRfX4TiBsfJZNnmX mE/GTA+J3P/+taHSqe/yyOGac/74L+HB8dYEnEN+jC22LD2jwZs1EaxPDw5kqQPKQkqo5aGJC5n wBBuJKlFf/zSFhQ0hSdTAHUlYoSZcAuduh1M60IHCw4oG3KMXztR6hYkHUo3+dkpK0xJ8qHjxFy vYxUDL5QTpPZSOy4HHzS/GlXocm0ncc3nFgwU0Sk4WHlJDTMBry8ywMtZmowpCIPqlBI7o8z+bj zS4eCcFqWzbsGyy8d++CCgICTwNK1Vw3+k2y7WaH/tuWbTpvBa65azsL2nk7/qHfhpmwKZLSF5g Bg6t6u2CHuwkPIlbYIB7xIB6Uly9awsIEdll7UyLXLW2igYBWFBx9ADbuPNLkG+iRBqHNteJROI tnMWGP/W X-Authority-Analysis: v=2.4 cv=J66q7BnS c=1 sm=1 tr=0 ts=68bd9c2a cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=yJojWOMRYYMA:10 a=EUspDBNiAAAA:8 a=nQ43Eca3DgWIm8wGIFMA:9 a=co8bklLMP2XZkljK:21 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-GUID: rSVl6mecRtxMlcehDaGmNN4dBw42JYqE X-Proofpoint-ORIG-GUID: rSVl6mecRtxMlcehDaGmNN4dBw42JYqE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-07_05,2025-09-04_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 malwarescore=0 clxscore=1015 spamscore=0 phishscore=0 adultscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509060038 The combo QMP PHY and eDP PHY share DP clocks implementation. With the USBC PHY gaining DP support it is going to get yet another copy of the same code. Extract common DP clock implementation to a separate module. In future we might want to extract more common functions. Signed-off-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/phy/qualcomm/Kconfig | 8 ++ drivers/phy/qualcomm/Makefile | 1 + drivers/phy/qualcomm/phy-qcom-dp-common.c | 164 ++++++++++++++++++++++++++ drivers/phy/qualcomm/phy-qcom-dp-common.h | 22 ++++ drivers/phy/qualcomm/phy-qcom-edp.c | 181 ++++----------------------= -- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 188 +++-----------------------= ---- 6 files changed, 234 insertions(+), 330 deletions(-) diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig index 60a0ead127fa9f08749e1bc686e15cc5eb341c28..a4da90124f57cf6260d24e1dd45= 033cfdfbeb087 100644 --- a/drivers/phy/qualcomm/Kconfig +++ b/drivers/phy/qualcomm/Kconfig @@ -18,12 +18,19 @@ config PHY_QCOM_APQ8064_SATA depends on OF select GENERIC_PHY =20 +config PHY_QCOM_DP_COMMON + tristate + help + A library implementation of DP / eDP functions common to all Qualcomm + DisplayPort / eDP PHYs + config PHY_QCOM_EDP tristate "Qualcomm eDP PHY driver" depends on ARCH_QCOM || COMPILE_TEST depends on OF depends on COMMON_CLK select GENERIC_PHY + select PHY_QCOM_DP_COMMON help Enable this driver to support the Qualcomm eDP PHY found in various Qualcomm chipsets. @@ -64,6 +71,7 @@ config PHY_QCOM_QMP_COMBO select GENERIC_PHY select MFD_SYSCON select DRM_AUX_BRIDGE if DRM_BRIDGE + select PHY_QCOM_DP_COMMON help Enable this to support the QMP Combo PHY transceiver that is used with USB3 and DisplayPort controllers on Qualcomm chips. diff --git a/drivers/phy/qualcomm/Makefile b/drivers/phy/qualcomm/Makefile index b71a6a0bed3f1489b1d07664ecd728f1db145986..1491348ed2139481634f8a54096= 4194485126eb5 100644 --- a/drivers/phy/qualcomm/Makefile +++ b/drivers/phy/qualcomm/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_PHY_ATH79_USB) +=3D phy-ath79-usb.o obj-$(CONFIG_PHY_QCOM_APQ8064_SATA) +=3D phy-qcom-apq8064-sata.o obj-$(CONFIG_PHY_QCOM_EDP) +=3D phy-qcom-edp.o +obj-$(CONFIG_PHY_QCOM_DP_COMMON) +=3D phy-qcom-dp-common.o obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) +=3D phy-qcom-ipq4019-usb.o obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) +=3D phy-qcom-ipq806x-sata.o obj-$(CONFIG_PHY_QCOM_M31_USB) +=3D phy-qcom-m31.o diff --git a/drivers/phy/qualcomm/phy-qcom-dp-common.c b/drivers/phy/qualco= mm/phy-qcom-dp-common.c new file mode 100644 index 0000000000000000000000000000000000000000..601f7bed956759367d1ebac8b24= 444f09b9e9e96 --- /dev/null +++ b/drivers/phy/qualcomm/phy-qcom-dp-common.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2021, Linaro Ltd. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include + +#include "phy-qcom-dp-common.h" + +/* + * Display Port PLL driver block diagram for branch clocks + * + * +------------------------------+ + * | DP_VCO_CLK | + * | | + * | +-------------------+ | + * | | (DP PLL/VCO) | | + * | +---------+---------+ | + * | v | + * | +----------+-----------+ | + * | | hsclk_divsel_clk_src | | + * | +----------+-----------+ | + * +------------------------------+ + * | + * +---------<---------v------------>----------+ + * | | + * +--------v----------------+ | + * | dp_phy_pll_link_clk | | + * | link_clk | | + * +--------+----------------+ | + * | | + * | | + * v v + * Input to DISPCC block | + * for link clk, crypto clk | + * and interface clock | + * | + * | + * +--------<------------+-----------------+---<---+ + * | | | + * +----v---------+ +--------v-----+ +--------v------+ + * | vco_divided | | vco_divided | | vco_divided | + * | _clk_src | | _clk_src | | _clk_src | + * | | | | | | + * |divsel_six | | divsel_two | | divsel_four | + * +-------+------+ +-----+--------+ +--------+------+ + * | | | + * v---->----------v-------------<------v + * | + * +----------+-----------------+ + * | dp_phy_pll_vco_div_clk | + * +---------+------------------+ + * | + * v + * Input to DISPCC block + * for DP pixel clock + * + */ +static int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_r= ate_request *req) +{ + switch (req->rate) { + case 1620000000UL / 2: + case 2700000000UL / 2: + /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */ + return 0; + default: + return -EINVAL; + } +} + +static unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsig= ned long parent_rate) +{ + const struct qcom_dp_common *common; + const struct phy_configure_opts_dp *dp_opts; + + common =3D container_of(hw, struct qcom_dp_common, pixel_hw); + dp_opts =3D &common->dp_opts; + + switch (dp_opts->link_rate) { + case 1620: + return 1620000000UL / 2; + case 2700: + return 2700000000UL / 2; + case 5400: + return 5400000000UL / 4; + case 8100: + return 8100000000UL / 6; + default: + return 0; + } +} + +static const struct clk_ops qmp_dp_pixel_clk_ops =3D { + .determine_rate =3D qmp_dp_pixel_clk_determine_rate, + .recalc_rate =3D qmp_dp_pixel_clk_recalc_rate, +}; + +static int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_ra= te_request *req) +{ + switch (req->rate) { + case 162000000: + case 270000000: + case 540000000: + case 810000000: + return 0; + default: + return -EINVAL; + } +} + +static unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsign= ed long parent_rate) +{ + const struct qcom_dp_common *common; + const struct phy_configure_opts_dp *dp_opts; + + common =3D container_of(hw, struct qcom_dp_common, link_hw); + dp_opts =3D &common->dp_opts; + + switch (dp_opts->link_rate) { + case 1620: + case 2700: + case 5400: + case 8100: + return dp_opts->link_rate * 100000; + default: + return 0; + } +} + +static const struct clk_ops qmp_dp_link_clk_ops =3D { + .determine_rate =3D qmp_dp_link_clk_determine_rate, + .recalc_rate =3D qmp_dp_link_clk_recalc_rate, +}; + +int devm_qcom_dp_clks_register(struct device *dev, + struct qcom_dp_common *dp) +{ + struct clk_init_data init =3D { }; + char name[64]; + int ret; + + snprintf(name, sizeof(name), "%s::link_clk", dev_name(dev)); + init.ops =3D &qmp_dp_link_clk_ops; + init.name =3D name; + dp->link_hw.init =3D &init; + ret =3D devm_clk_hw_register(dev, &dp->link_hw); + if (ret) + return ret; + + snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(dev)); + init.ops =3D &qmp_dp_pixel_clk_ops; + init.name =3D name; + dp->pixel_hw.init =3D &init; + ret =3D devm_clk_hw_register(dev, &dp->pixel_hw); + if (ret) + return ret; + + return 0; +} +EXPORT_SYMBOL_GPL(devm_qcom_dp_clks_register); diff --git a/drivers/phy/qualcomm/phy-qcom-dp-common.h b/drivers/phy/qualco= mm/phy-qcom-dp-common.h new file mode 100644 index 0000000000000000000000000000000000000000..3d176aafa243176b9f6f92c6e18= 519f53564efb2 --- /dev/null +++ b/drivers/phy/qualcomm/phy-qcom-dp-common.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef PHY_QCOM_QMP_DP_COMMON_H +#define PHY_QCOM_QMP_DP_COMMON_H + +#include +#include + +struct qcom_dp_common { + struct phy_configure_opts_dp dp_opts; + struct clk_hw link_hw; + struct clk_hw pixel_hw; +}; + +int devm_qcom_dp_clks_register(struct device *dev, + struct qcom_dp_common *dp); + +#endif diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy= -qcom-edp.c index f1b51018683d51df064f60440864c6031638670c..bf456b45bf8608127c7e702ab70= ee8312f296af4 100644 --- a/drivers/phy/qualcomm/phy-qcom-edp.c +++ b/drivers/phy/qualcomm/phy-qcom-edp.c @@ -22,6 +22,8 @@ =20 #include =20 +#include "phy-qcom-dp-common.h" + #include "phy-qcom-qmp-dp-phy.h" #include "phy-qcom-qmp-qserdes-com-v4.h" #include "phy-qcom-qmp-qserdes-com-v6.h" @@ -98,10 +100,7 @@ struct qcom_edp { void __iomem *tx1; void __iomem *pll; =20 - struct clk_hw dp_link_hw; - struct clk_hw dp_pixel_hw; - - struct phy_configure_opts_dp dp_opts; + struct qcom_dp_common dp_common; =20 struct clk_bulk_data clks[2]; struct regulator_bulk_data supplies[2]; @@ -318,7 +317,7 @@ static int qcom_edp_phy_configure(struct phy *phy, unio= n phy_configure_opts *opt struct qcom_edp *edp =3D phy_get_drvdata(phy); int ret =3D 0; =20 - memcpy(&edp->dp_opts, dp_opts, sizeof(*dp_opts)); + memcpy(&edp->dp_common.dp_opts, dp_opts, sizeof(*dp_opts)); =20 if (dp_opts->set_voltages) ret =3D qcom_edp_set_voltages(edp, dp_opts); @@ -338,7 +337,7 @@ static int qcom_edp_configure_pll(const struct qcom_edp= *edp) =20 static int qcom_edp_set_vco_div(const struct qcom_edp *edp, unsigned long = *pixel_freq) { - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_common.dp_opts; u32 vco_div; =20 switch (dp_opts->link_rate) { @@ -406,7 +405,7 @@ static int qcom_edp_com_bias_en_clkbuflr_v4(const struc= t qcom_edp *edp) =20 static int qcom_edp_com_configure_ssc_v4(const struct qcom_edp *edp) { - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_common.dp_opts; u32 step1; u32 step2; =20 @@ -440,7 +439,7 @@ static int qcom_edp_com_configure_ssc_v4(const struct q= com_edp *edp) =20 static int qcom_edp_com_configure_pll_v4(const struct qcom_edp *edp) { - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_common.dp_opts; u32 div_frac_start2_mode0; u32 div_frac_start3_mode0; u32 dec_start_mode0; @@ -591,7 +590,7 @@ static int qcom_edp_com_bias_en_clkbuflr_v6(const struc= t qcom_edp *edp) =20 static int qcom_edp_com_configure_ssc_v6(const struct qcom_edp *edp) { - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_common.dp_opts; u32 step1; u32 step2; =20 @@ -625,7 +624,7 @@ static int qcom_edp_com_configure_ssc_v6(const struct q= com_edp *edp) =20 static int qcom_edp_com_configure_pll_v6(const struct qcom_edp *edp) { - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_common.dp_opts; u32 div_frac_start2_mode0; u32 div_frac_start3_mode0; u32 dec_start_mode0; @@ -758,7 +757,7 @@ static int qcom_edp_phy_power_on(struct phy *phy) writel(0x00, edp->tx0 + TXn_LANE_MODE_1); writel(0x00, edp->tx1 + TXn_LANE_MODE_1); =20 - if (edp->dp_opts.ssc) { + if (edp->dp_common.dp_opts.ssc) { ret =3D qcom_edp_configure_ssc(edp); if (ret) return ret; @@ -818,13 +817,13 @@ static int qcom_edp_phy_power_on(struct phy *phy) writel(0x1f, edp->tx0 + TXn_TX_DRV_LVL); writel(0x1f, edp->tx1 + TXn_TX_DRV_LVL); =20 - if (edp->dp_opts.lanes =3D=3D 1) { + if (edp->dp_common.dp_opts.lanes =3D=3D 1) { bias0_en =3D 0x01; bias1_en =3D 0x00; drvr0_en =3D 0x06; drvr1_en =3D 0x07; cfg1 =3D 0x1; - } else if (edp->dp_opts.lanes =3D=3D 2) { + } else if (edp->dp_common.dp_opts.lanes =3D=3D 2) { bias0_en =3D 0x03; bias1_en =3D 0x00; drvr0_en =3D 0x04; @@ -854,8 +853,8 @@ static int qcom_edp_phy_power_on(struct phy *phy) if (ret) return ret; =20 - clk_set_rate(edp->dp_link_hw.clk, edp->dp_opts.link_rate * 100000); - clk_set_rate(edp->dp_pixel_hw.clk, pixel_freq); + clk_set_rate(edp->dp_common.link_hw.clk, edp->dp_common.dp_opts.link_rate= * 100000); + clk_set_rate(edp->dp_common.pixel_hw.clk, pixel_freq); =20 return 0; } @@ -901,162 +900,22 @@ static const struct phy_ops qcom_edp_ops =3D { .owner =3D THIS_MODULE, }; =20 -/* - * Embedded Display Port PLL driver block diagram for branch clocks - * - * +------------------------------+ - * | EDP_VCO_CLK | - * | | - * | +-------------------+ | - * | | (EDP PLL/VCO) | | - * | +---------+---------+ | - * | v | - * | +----------+-----------+ | - * | | hsclk_divsel_clk_src | | - * | +----------+-----------+ | - * +------------------------------+ - * | - * +---------<---------v------------>----------+ - * | | - * +--------v----------------+ | - * | edp_phy_pll_link_clk | | - * | link_clk | | - * +--------+----------------+ | - * | | - * | | - * v v - * Input to DISPCC block | - * for link clk, crypto clk | - * and interface clock | - * | - * | - * +--------<------------+-----------------+---<---+ - * | | | - * +----v---------+ +--------v-----+ +--------v------+ - * | vco_divided | | vco_divided | | vco_divided | - * | _clk_src | | _clk_src | | _clk_src | - * | | | | | | - * |divsel_six | | divsel_two | | divsel_four | - * +-------+------+ +-----+--------+ +--------+------+ - * | | | - * v---->----------v-------------<------v - * | - * +----------+-----------------+ - * | edp_phy_pll_vco_div_clk | - * +---------+------------------+ - * | - * v - * Input to DISPCC block - * for EDP pixel clock - * - */ -static int qcom_edp_dp_pixel_clk_determine_rate(struct clk_hw *hw, - struct clk_rate_request *req) -{ - switch (req->rate) { - case 1620000000UL / 2: - case 2700000000UL / 2: - /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */ - return 0; - - default: - return -EINVAL; - } -} - -static unsigned long -qcom_edp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_= rate) -{ - const struct qcom_edp *edp =3D container_of(hw, struct qcom_edp, dp_pixel= _hw); - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; - - switch (dp_opts->link_rate) { - case 1620: - return 1620000000UL / 2; - case 2700: - return 2700000000UL / 2; - case 5400: - return 5400000000UL / 4; - case 8100: - return 8100000000UL / 6; - default: - return 0; - } -} - -static const struct clk_ops qcom_edp_dp_pixel_clk_ops =3D { - .determine_rate =3D qcom_edp_dp_pixel_clk_determine_rate, - .recalc_rate =3D qcom_edp_dp_pixel_clk_recalc_rate, -}; - -static int qcom_edp_dp_link_clk_determine_rate(struct clk_hw *hw, - struct clk_rate_request *req) -{ - switch (req->rate) { - case 162000000: - case 270000000: - case 540000000: - case 810000000: - return 0; - - default: - return -EINVAL; - } -} - -static unsigned long -qcom_edp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_r= ate) -{ - const struct qcom_edp *edp =3D container_of(hw, struct qcom_edp, dp_link_= hw); - const struct phy_configure_opts_dp *dp_opts =3D &edp->dp_opts; - - switch (dp_opts->link_rate) { - case 1620: - case 2700: - case 5400: - case 8100: - return dp_opts->link_rate * 100000; - - default: - return 0; - } -} - -static const struct clk_ops qcom_edp_dp_link_clk_ops =3D { - .determine_rate =3D qcom_edp_dp_link_clk_determine_rate, - .recalc_rate =3D qcom_edp_dp_link_clk_recalc_rate, -}; - static int qcom_edp_clks_register(struct qcom_edp *edp, struct device_node= *np) { struct clk_hw_onecell_data *data; - struct clk_init_data init =3D { }; - char name[64]; int ret; =20 + ret =3D devm_qcom_dp_clks_register(edp->dev, &edp->dp_common); + if (ret) + return ret; + data =3D devm_kzalloc(edp->dev, struct_size(data, hws, 2), GFP_KERNEL); if (!data) return -ENOMEM; data->num =3D 2; =20 - snprintf(name, sizeof(name), "%s::link_clk", dev_name(edp->dev)); - init.ops =3D &qcom_edp_dp_link_clk_ops; - init.name =3D name; - edp->dp_link_hw.init =3D &init; - ret =3D devm_clk_hw_register(edp->dev, &edp->dp_link_hw); - if (ret) - return ret; - - snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(edp->dev)); - init.ops =3D &qcom_edp_dp_pixel_clk_ops; - init.name =3D name; - edp->dp_pixel_hw.init =3D &init; - ret =3D devm_clk_hw_register(edp->dev, &edp->dp_pixel_hw); - if (ret) - return ret; - - data->hws[0] =3D &edp->dp_link_hw; - data->hws[1] =3D &edp->dp_pixel_hw; + data->hws[0] =3D &edp->dp_common.link_hw; + data->hws[1] =3D &edp->dp_common.pixel_hw; =20 return devm_of_clk_add_hw_provider(edp->dev, of_clk_hw_onecell_get, data); } diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c b/drivers/phy/qualco= mm/phy-qcom-qmp-combo.c index baf25ae442478ac01a5428fa4268470e6b5211e3..8b6a27464b3303eb0d66b97f7d7= cfb10687821e4 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-combo.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-combo.c @@ -26,6 +26,8 @@ =20 #include =20 +#include "phy-qcom-dp-common.h" + #include "phy-qcom-qmp-common.h" =20 #include "phy-qcom-qmp.h" @@ -1859,13 +1861,11 @@ struct qmp_combo { =20 struct phy *dp_phy; unsigned int dp_aux_cfg; - struct phy_configure_opts_dp dp_opts; unsigned int dp_init_count; bool dp_powered_on; =20 struct clk_hw *pipe_clk_hw; - struct clk_hw dp_link_hw; - struct clk_hw dp_pixel_hw; + struct qcom_dp_common dp_common; =20 struct typec_switch_dev *sw; enum typec_orientation orientation; @@ -2515,7 +2515,7 @@ static int qmp_combo_dp_serdes_init(struct qmp_combo = *qmp) { const struct qmp_phy_cfg *cfg =3D qmp->cfg; void __iomem *serdes =3D qmp->dp_serdes; - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; =20 qmp_configure(qmp->dev, serdes, cfg->dp_serdes_tbl, cfg->dp_serdes_tbl_num); @@ -2592,7 +2592,7 @@ static void qmp_v3_dp_aux_init(struct qmp_combo *qmp) =20 static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp) { - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; const struct qmp_phy_cfg *cfg =3D qmp->cfg; unsigned int v_level =3D 0, p_level =3D 0; u8 voltage_swing_cfg, pre_emphasis_cfg; @@ -2629,7 +2629,7 @@ static int qmp_combo_configure_dp_swing(struct qmp_co= mbo *qmp) =20 static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp) { - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; u32 bias_en, drvr_en; =20 if (qmp_combo_configure_dp_swing(qmp) < 0) @@ -2652,7 +2652,7 @@ static void qmp_v3_configure_dp_tx(struct qmp_combo *= qmp) static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp) { bool reverse =3D (qmp->orientation =3D=3D TYPEC_ORIENTATION_REVERSE); - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; u32 val; =20 val =3D DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | @@ -2675,7 +2675,7 @@ static bool qmp_combo_configure_dp_mode(struct qmp_co= mbo *qmp) =20 static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp) { - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; u32 phy_vco_div; unsigned long pixel_freq; const struct qmp_phy_cfg *cfg =3D qmp->cfg; @@ -2703,8 +2703,8 @@ static int qmp_combo_configure_dp_clocks(struct qmp_c= ombo *qmp) } writel(phy_vco_div, qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_VCO_DIV]); =20 - clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000); - clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq); + clk_set_rate(qmp->dp_common.link_hw.clk, dp_opts->link_rate * 100000); + clk_set_rate(qmp->dp_common.pixel_hw.clk, pixel_freq); =20 return 0; } @@ -2891,7 +2891,7 @@ static int qmp_v4_configure_dp_phy(struct qmp_combo *= qmp) { const struct qmp_phy_cfg *cfg =3D qmp->cfg; bool reverse =3D (qmp->orientation =3D=3D TYPEC_ORIENTATION_REVERSE); - const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_opts; + const struct phy_configure_opts_dp *dp_opts =3D &qmp->dp_common.dp_opts; u32 bias0_en, drvr0_en, bias1_en, drvr1_en; u32 status; int ret; @@ -2976,10 +2976,10 @@ static int qmp_combo_dp_configure(struct phy *phy, = union phy_configure_opts *opt =20 mutex_lock(&qmp->phy_mutex); =20 - memcpy(&qmp->dp_opts, dp_opts, sizeof(*dp_opts)); - if (qmp->dp_opts.set_voltages) { + memcpy(&qmp->dp_common.dp_opts, dp_opts, sizeof(*dp_opts)); + if (qmp->dp_common.dp_opts.set_voltages) { cfg->configure_dp_tx(qmp); - qmp->dp_opts.set_voltages =3D 0; + qmp->dp_common.dp_opts.set_voltages =3D 0; } =20 mutex_unlock(&qmp->phy_mutex); @@ -3512,131 +3512,6 @@ static int qmp_combo_clk_init(struct qmp_combo *qmp) return devm_clk_bulk_get_optional(dev, num, qmp->clks); } =20 -/* - * Display Port PLL driver block diagram for branch clocks - * - * +------------------------------+ - * | DP_VCO_CLK | - * | | - * | +-------------------+ | - * | | (DP PLL/VCO) | | - * | +---------+---------+ | - * | v | - * | +----------+-----------+ | - * | | hsclk_divsel_clk_src | | - * | +----------+-----------+ | - * +------------------------------+ - * | - * +---------<---------v------------>----------+ - * | | - * +--------v----------------+ | - * | dp_phy_pll_link_clk | | - * | link_clk | | - * +--------+----------------+ | - * | | - * | | - * v v - * Input to DISPCC block | - * for link clk, crypto clk | - * and interface clock | - * | - * | - * +--------<------------+-----------------+---<---+ - * | | | - * +----v---------+ +--------v-----+ +--------v------+ - * | vco_divided | | vco_divided | | vco_divided | - * | _clk_src | | _clk_src | | _clk_src | - * | | | | | | - * |divsel_six | | divsel_two | | divsel_four | - * +-------+------+ +-----+--------+ +--------+------+ - * | | | - * v---->----------v-------------<------v - * | - * +----------+-----------------+ - * | dp_phy_pll_vco_div_clk | - * +---------+------------------+ - * | - * v - * Input to DISPCC block - * for DP pixel clock - * - */ -static int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_r= ate_request *req) -{ - switch (req->rate) { - case 1620000000UL / 2: - case 2700000000UL / 2: - /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */ - return 0; - default: - return -EINVAL; - } -} - -static unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsig= ned long parent_rate) -{ - const struct qmp_combo *qmp; - const struct phy_configure_opts_dp *dp_opts; - - qmp =3D container_of(hw, struct qmp_combo, dp_pixel_hw); - dp_opts =3D &qmp->dp_opts; - - switch (dp_opts->link_rate) { - case 1620: - return 1620000000UL / 2; - case 2700: - return 2700000000UL / 2; - case 5400: - return 5400000000UL / 4; - case 8100: - return 8100000000UL / 6; - default: - return 0; - } -} - -static const struct clk_ops qmp_dp_pixel_clk_ops =3D { - .determine_rate =3D qmp_dp_pixel_clk_determine_rate, - .recalc_rate =3D qmp_dp_pixel_clk_recalc_rate, -}; - -static int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_ra= te_request *req) -{ - switch (req->rate) { - case 162000000: - case 270000000: - case 540000000: - case 810000000: - return 0; - default: - return -EINVAL; - } -} - -static unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsign= ed long parent_rate) -{ - const struct qmp_combo *qmp; - const struct phy_configure_opts_dp *dp_opts; - - qmp =3D container_of(hw, struct qmp_combo, dp_link_hw); - dp_opts =3D &qmp->dp_opts; - - switch (dp_opts->link_rate) { - case 1620: - case 2700: - case 5400: - case 8100: - return dp_opts->link_rate * 100000; - default: - return 0; - } -} - -static const struct clk_ops qmp_dp_link_clk_ops =3D { - .determine_rate =3D qmp_dp_link_clk_determine_rate, - .recalc_rate =3D qmp_dp_link_clk_recalc_rate, -}; - static struct clk_hw *qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, = void *data) { struct qmp_combo *qmp =3D data; @@ -3648,34 +3523,9 @@ static struct clk_hw *qmp_dp_clks_hw_get(struct of_p= handle_args *clkspec, void * } =20 if (idx =3D=3D 0) - return &qmp->dp_link_hw; - - return &qmp->dp_pixel_hw; -} - -static int phy_dp_clks_register(struct qmp_combo *qmp, struct device_node = *np) -{ - struct clk_init_data init =3D { }; - char name[64]; - int ret; + return &qmp->dp_common.link_hw; =20 - snprintf(name, sizeof(name), "%s::link_clk", dev_name(qmp->dev)); - init.ops =3D &qmp_dp_link_clk_ops; - init.name =3D name; - qmp->dp_link_hw.init =3D &init; - ret =3D devm_clk_hw_register(qmp->dev, &qmp->dp_link_hw); - if (ret) - return ret; - - snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(qmp->dev)); - init.ops =3D &qmp_dp_pixel_clk_ops; - init.name =3D name; - qmp->dp_pixel_hw.init =3D &init; - ret =3D devm_clk_hw_register(qmp->dev, &qmp->dp_pixel_hw); - if (ret) - return ret; - - return 0; + return &qmp->dp_common.pixel_hw; } =20 static struct clk_hw *qmp_combo_clk_hw_get(struct of_phandle_args *clkspec= , void *data) @@ -3686,9 +3536,9 @@ static struct clk_hw *qmp_combo_clk_hw_get(struct of_= phandle_args *clkspec, void case QMP_USB43DP_USB3_PIPE_CLK: return qmp->pipe_clk_hw; case QMP_USB43DP_DP_LINK_CLK: - return &qmp->dp_link_hw; + return &qmp->dp_common.link_hw; case QMP_USB43DP_DP_VCO_DIV_CLK: - return &qmp->dp_pixel_hw; + return &qmp->dp_common.pixel_hw; } =20 return ERR_PTR(-EINVAL); @@ -3703,7 +3553,7 @@ static int qmp_combo_register_clocks(struct qmp_combo= *qmp, struct device_node * if (IS_ERR(qmp->pipe_clk_hw)) return PTR_ERR(qmp->pipe_clk_hw); =20 - ret =3D phy_dp_clks_register(qmp, dp_np); + ret =3D devm_qcom_dp_clks_register(qmp->dev, &qmp->dp_common); if (ret) return ret; =20 --=20 2.47.3