From nobody Tue Feb 10 09:57:48 2026 Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B17252868AD for ; Wed, 7 Jan 2026 08:06:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767773185; cv=none; b=aI528fEZukRELAoXcm5izS0B/H9DRqKHvR5Z8zBdDKwu7l96mLLISpHPHkD8okAe5d6uNaI6YYZZ/MFgPHzjljfRdX/4Itxvi+sFX57jYjdEq2t7bSduJ2GBDkyK8Sdts3WYoZR9ZDATtgqDME+vXj1t/8XO1B0PPPEu85Cw7Ik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767773185; c=relaxed/simple; bh=bHh04W/0vELAuCHcjtX3ifGUTw+2i261MFTX84iycNY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iqzoIH6OSvx4V1S+uC1lDnrlZ0toeckUti5/j9wPsY7xVX0HRraPb0lO/7BR5H7deoH8e80tmtJ7zu+gLXYp372DFIFOF7VzKQ0G471RMxxLGGEx/C6DiMjqnAyNhvpccgrHJshjvdNeQSSrKTPNpE3tnKPFSLUwqdeCrnsiBWY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com; spf=pass smtp.mailfrom=fairphone.com; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b=cuK5J/65; arc=none smtp.client-ip=209.85.208.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=fairphone.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fairphone.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fairphone.com header.i=@fairphone.com header.b="cuK5J/65" Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-6505cac9879so2901259a12.1 for ; Wed, 07 Jan 2026 00:06:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fairphone.com; s=fair; t=1767773177; x=1768377977; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=lJ5EWUUmLzRb+utl6t1NKCUS1M8QU0YnYVmCjHIU+Nw=; b=cuK5J/65sCX++2ifundsyZvsYwqjuX7cbdB3X30ziOXAeo8OHBIfzpv94aVewmZqg8 2tyRd5fxIdlwWZSyPbSf/1/7vwLYcOrUtLLAAYJVWeUyE0CwBDTVLYNrq9QP/RSVcJM3 V6P0LDWDZ5QqiYhMYTt8LeR7oDaDvmVvIkHU9iZalrkhIP7GT2wkC1rx2u+oBAfnLwJb NMDlSiMGw11CbeezCj52AfkM97At14nf7euS2wdKOjnEPWh57i8hyOFNABT9WXMX23Rk TlbpCQVFjYVPPCTeOErlI9ILe0QKFGcLykYG5NFPrnf6p7O21T60zJmonBpIoOuVFr0K UrYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767773177; x=1768377977; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=lJ5EWUUmLzRb+utl6t1NKCUS1M8QU0YnYVmCjHIU+Nw=; b=sNfnAjZZpS4sRcYEbhwEBg+rv59Vsi/sE1F700YPy/l/825kSPVH76apcvcrFR1/B9 fTEQJMtOYlWpCUTm41P8ZHvU/Wf69PAd2T5CN8aZNr9OTaTtlOAsNeWlN0nY8M9XIebU 1DodqsKIDW395Mslhsn95BiGYpLFZN+8hY4HNreqEkA5Ka8McRVGUlqxUVoBggCXCuqq bOUWdwNSe2zcZxFwlpjRUvSq1XVkbcP4kmFQMCd26T+Bl48hh03bZj4FRtFl58LCF/xs BebNp15uZr/wQ8YRAM4m/YG+pK1ZaJihzF9aDY1NWsA1XfBeIW2MkrGwN80JPLjwl3jP MrMw== X-Forwarded-Encrypted: i=1; AJvYcCXNsFMNlzySEKS2AghyycPtdjrUsmyuu8opviR9wdof32Y502qJ7d2/XpJn5PSWoEwahdvQgSR1if2Cp4M=@vger.kernel.org X-Gm-Message-State: AOJu0YxTF9dBQwBNN4gXNxMo/TgB6ZOv28uGPIlDXqGOv2Y8IrPcBm5t slVvAxkX2OJLD9Eu4GSq+WkYY2vbO+o3R4O++uQ/MKN1OV6SBQ30nEPnuJwsHaCSZ+A= X-Gm-Gg: AY/fxX7wcj3P9aj/PqxDzyB+rTmoLf1M8x3GGpVsGxOIY6EIS/6OpMBUNMamnMfVUzO rhsRqhC/ElVLK2kveJ5K/y8hRNAt23/eR5cGazzZYLa3G+V5Kw3ZUWG5ZIRiOeridQiUX6Afe/P axNU4hr17wVMmCFZOEWgEmJjoUQj6GlUOp24oQEurXga9mOX1vzl1Jv/MdTPvg4YJMLpUq5XdKg Cma9j4f71BnJXNain0irXT2wE/F2N+k9KV+P7S+rCB+bTxQEKxlLnIkHdYriNHXDBh7DVpfGJs8 MCF4E8b4fyeOvDmc7yhFQom/eJstBpXVlVhpS07ylpXeAiJ+1qL1tIrYRIX6gRDv18YXWsxSO1F CDzxBXuEKwbPboN8oDpu2eaAczWbTJYnATHhnDhHaGccT+Ste6OG95gCvDcr/CPgE04Y3vzMu7r vnVbc4CrGY7XtQf01MpbwgwX9puA== X-Google-Smtp-Source: AGHT+IHCtl/neZN8RJgQrIftPxJFsI49J2n/CJkcTAVr+l3llGLI2c7o6Za7k6yWduE/t6naRaqX0g== X-Received: by 2002:a05:6402:2108:b0:650:8c82:ad4c with SMTP id 4fb4d7f45d1cf-65097e46ad7mr1477210a12.20.1767773176991; Wed, 07 Jan 2026 00:06:16 -0800 (PST) Received: from [192.168.224.78] ([213.208.157.247]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6507bf6d5absm3941299a12.33.2026.01.07.00.06.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 00:06:16 -0800 (PST) From: Luca Weiss Date: Wed, 07 Jan 2026 09:05:54 +0100 Subject: [PATCH 4/6] phy: qcom-qmp-ufs: Add Milos support 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: <20260107-milos-ufs-v1-4-6982ab20d0ac@fairphone.com> References: <20260107-milos-ufs-v1-0-6982ab20d0ac@fairphone.com> In-Reply-To: <20260107-milos-ufs-v1-0-6982ab20d0ac@fairphone.com> To: Herbert Xu , "David S. Miller" , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Alim Akhtar , Avri Altman , Bart Van Assche , Vinod Koul , Neil Armstrong , Konrad Dybcio Cc: ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-crypto@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-phy@lists.infradead.org, Luca Weiss X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1767773155; l=5906; i=luca.weiss@fairphone.com; s=20250611; h=from:subject:message-id; bh=bHh04W/0vELAuCHcjtX3ifGUTw+2i261MFTX84iycNY=; b=C67TOyQ1kjDTY9+r1vT0OZ4OWnds46xbZtbMaQ9IHVEFvsS85tmYxJ/ngRU3+HrWHKBJeSxG/ v8IAWwy765UCTfJwjB21tIr5/HDU96e5uqr/ui6WgCT0HCG4RMQDWjX X-Developer-Key: i=luca.weiss@fairphone.com; a=ed25519; pk=O1aw+AAust5lEmgrNJ1Bs7PTY0fEsJm+mdkjExA69q8= Add the init sequence tables and config for the UFS QMP phy found in the Milos SoC. Signed-off-by: Luca Weiss Reviewed-by: Abel Vesa Reviewed-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/phy/qualcomm/phy-qcom-qmp-ufs.c | 96 +++++++++++++++++++++++++++++= ++++ 1 file changed, 96 insertions(+) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c b/drivers/phy/qualcomm= /phy-qcom-qmp-ufs.c index 8a280433a42b..df138a5442eb 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c @@ -84,6 +84,68 @@ static const unsigned int ufsphy_v6_regs_layout[QPHY_LAY= OUT_SIZE] =3D { [QPHY_PCS_POWER_DOWN_CONTROL] =3D QPHY_V6_PCS_UFS_POWER_DOWN_CONTROL, }; =20 +static const struct qmp_phy_init_tbl milos_ufsphy_serdes[] =3D { + QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0xd9), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IETRIM, 0x0a), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IPTRIM, 0x17), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0e), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x82), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x14), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x18), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0xff), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0c), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x98), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x14), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x18), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x18), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x32), + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x0f), +}; + +static const struct qmp_phy_init_tbl milos_ufsphy_tx[] =3D { + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_LANE_MODE_1, 0x05), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0e), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_FR_DCC_CTRL, 0xcc), +}; + +static const struct qmp_phy_init_tbl milos_ufsphy_rx[] =3D { + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2, 0x0c), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x3e), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0f), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xce), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xce), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B2, 0x18), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3, 0x1a), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B4, 0x0f), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6, 0x60), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B3, 0x9e), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B6, 0x60), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B3, 0x9e), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B4, 0x0e), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B5, 0x36), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02), + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_PI_CTRL1, 0x94), +}; + +static const struct qmp_phy_init_tbl milos_ufsphy_pcs[] =3D { + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x0b), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x68), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x04), + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x04), +}; + static const struct qmp_phy_init_tbl msm8996_ufsphy_serdes[] =3D { QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e), QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xd7), @@ -1165,6 +1227,11 @@ static inline void qphy_clrbits(void __iomem *base, = u32 offset, u32 val) } =20 /* Regulator bulk data with load values for specific configurations */ +static const struct regulator_bulk_data milos_ufsphy_vreg_l[] =3D { + { .supply =3D "vdda-phy", .init_load_uA =3D 140120 }, + { .supply =3D "vdda-pll", .init_load_uA =3D 18340 }, +}; + static const struct regulator_bulk_data msm8996_ufsphy_vreg_l[] =3D { { .supply =3D "vdda-phy", .init_load_uA =3D 51400 }, { .supply =3D "vdda-pll", .init_load_uA =3D 14600 }, @@ -1258,6 +1325,32 @@ static const struct qmp_ufs_offsets qmp_ufs_offsets_= v6 =3D { .rx2 =3D 0x1a00, }; =20 +static const struct qmp_phy_cfg milos_ufsphy_cfg =3D { + .lanes =3D 2, + + .offsets =3D &qmp_ufs_offsets_v6, + .max_supported_gear =3D UFS_HS_G4, + + .tbls =3D { + .serdes =3D milos_ufsphy_serdes, + .serdes_num =3D ARRAY_SIZE(milos_ufsphy_serdes), + .tx =3D milos_ufsphy_tx, + .tx_num =3D ARRAY_SIZE(milos_ufsphy_tx), + .rx =3D milos_ufsphy_rx, + .rx_num =3D ARRAY_SIZE(milos_ufsphy_rx), + .pcs =3D milos_ufsphy_pcs, + .pcs_num =3D ARRAY_SIZE(milos_ufsphy_pcs), + }, + .tbls_hs_b =3D { + .serdes =3D sm8550_ufsphy_hs_b_serdes, + .serdes_num =3D ARRAY_SIZE(sm8550_ufsphy_hs_b_serdes), + }, + + .vreg_list =3D milos_ufsphy_vreg_l, + .num_vregs =3D ARRAY_SIZE(milos_ufsphy_vreg_l), + .regs =3D ufsphy_v6_regs_layout, +}; + static const struct qmp_phy_cfg msm8996_ufsphy_cfg =3D { .lanes =3D 1, =20 @@ -2166,6 +2259,9 @@ static int qmp_ufs_probe(struct platform_device *pdev) =20 static const struct of_device_id qmp_ufs_of_match_table[] =3D { { + .compatible =3D "qcom,milos-qmp-ufs-phy", + .data =3D &milos_ufsphy_cfg, + }, { .compatible =3D "qcom,msm8996-qmp-ufs-phy", .data =3D &msm8996_ufsphy_cfg, }, { --=20 2.52.0