From nobody Thu Oct 9 10:58:42 2025 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (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 622AB2ED85C for ; Wed, 18 Jun 2025 14:33:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750257212; cv=none; b=gy17wEfu7o07hZBeOCsh8daqkIcRInFCMefU0za7m9tk30h8ZZujfvTdjXMxCpAtDVf0NpFQRbPmiyDqVc8AjIWRFlp9IDYId8AtTsSAFOvbCWHa7DjbimDb4AscNYhCDCvp4wuzcrvYgsmFfqEDxuYzwDudlKrBGp1tI+wScKk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750257212; c=relaxed/simple; bh=bDt93fOPMIU1TrFk4w98DkGoRUoI6srG26oyPVGDWKo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=otkZikAPV3QXYv02L7ihHVYvvofibD6+nSYsW3mUygVjjozhw766Viz0lRL5HJrt3yT82JZD7q6vCEgLWi8ipZk9Tl0lkri8qOPWVvfzSBpYeT1YJ5FibKvE5+CFwzaHTWX50tpr5AOChe0p2CUvl8COITELhRGftJEEG7x9i84= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=VsXK0Z5i; arc=none smtp.client-ip=209.85.218.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="VsXK0Z5i" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-adb4c022f77so106460066b.2 for ; Wed, 18 Jun 2025 07:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1750257208; x=1750862008; 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=8Puo1BSKXfvASrz8ngnnVFm2/cTt2FMnvm9GvL4gi3c=; b=VsXK0Z5i+r5/3dfNuAd+ZGV/O+iUi6+5qjKeRK33xqDe6XZhXc/l4CO5lTNT+YgTvy Nx2CK//R0t/vn3aJ1mfOm4OcmMwzOPV6KtOr5BWsfnTGzXZ6l7GyTUnDIqZLH1WH0ZR0 cVpH5UDgONByRBMSazp2UWfsBk/ZGI/AYleh1c1EARC92njO2zMwBIivSrcxdXJz8RsD 3ddzBNqxwDHkP1RaTpfqGsqK5PFFQS2DtZHJ/r1aFEU/zttiTXCiwV/AN25ecuVVR9w3 p/pPWIi6Y0vWY+Z9/7MSOxXTAck6kS1BmDEP1dSmc6uPAwwt1PlbJQGa7ssNserh1Q+o tllw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750257208; x=1750862008; 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=8Puo1BSKXfvASrz8ngnnVFm2/cTt2FMnvm9GvL4gi3c=; b=UPuPG8zWvoifqzK44zrv9N5J098YW12jTEbnT7qS0YrsRWtlDVZiU+osXCnTnfENNx dAKu600gX94mTWjCr2zSB10yXp+43MQvmmVZi8RTWxCM8nK21zHhqOnwns7gAXWR0xTq T74fy02aUGShY6T7Bn7srziffIC1T7wEcSd/9dd5Cpy0pozHbQLdjqH3QcbggHOFp4TB 6VyFc3nYacwRQtFjvnesGqc+Zv3ZDLz2re6ReE3LaX9mssrTtOSH8gg9JJsmfd9lm2nA WFTccUOYc43H2QtQwXFyQR8Cd3YzaT/A/JuVPuR3c6/7i4/53BxQGblq7u6eUNA6455n 7m5A== X-Forwarded-Encrypted: i=1; AJvYcCXWQwzlUajjbYifY0bcAU0RijuK086EBQ71/N+EdCqJZPTQgEnVdkyBaX8MWZ8vH1mU1/jkwnhOLNXyCgY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx86TKbTrQQGtCZLOI0YcariX7875d1wb8x/WPX8bt1pgo5pGBY gM9nUzaV/Bl0E+6dFxnWbGdANfuF5ajk+SMHeXkdZq/CL/Go53n6krzVmJhqW2bzWu4= X-Gm-Gg: ASbGncu8YkCbVApFZ3xmaqYQ++hgt5c8ZPXxbaTuRp90bT2IcLuPEt+CKupcu9b95XN Ym3XN9WQjQuVQUuqGF4KpARrdIsaMUP2uPr5H5ULJPCCvYgolGv+MB9T/geFO+PhXYKXfV7jD0V UnBDcBXEws5eUVmejVsLkwzQbsVd1TPe+Wd+/3p5usKG8dWMa7n4OLgbdLk+snaK9TQWnCAY5nL fvG/4bi6x24MYjTuky6b6meXOBqhBaZTCLcVIrECgXZBO0LvOa5XTa9PPnYRBLeI5WIADyIj/Wp Ujaj//nRJebo1IRVroxsTnD9nwExVGImumpAbE1zCAOPEnaNfWM9td/GqxA5Y9FcljQKq5jySZy NhyhfIiU= X-Google-Smtp-Source: AGHT+IGgN/aWMMV9BGSGvQ6W4soFxE3Wti2T2mPFLqBAEOnqGEalMHBUa3BErX1TKSwWTfe2YaGW9Q== X-Received: by 2002:a17:907:3c94:b0:ad2:23d0:cde3 with SMTP id a640c23a62f3a-adffb27b554mr273348666b.15.1750257207559; Wed, 18 Jun 2025 07:33:27 -0700 (PDT) Received: from [192.168.1.29] ([178.197.223.125]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-adec81c0135sm1052257566b.47.2025.06.18.07.33.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Jun 2025 07:33:27 -0700 (PDT) From: Krzysztof Kozlowski Date: Wed, 18 Jun 2025 16:32:35 +0200 Subject: [PATCH v7 06/13] drm/msm/dsi/phy: Add support for SM8750 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: <20250618-b4-sm8750-display-v7-6-a591c609743d@linaro.org> References: <20250618-b4-sm8750-display-v7-0-a591c609743d@linaro.org> In-Reply-To: <20250618-b4-sm8750-display-v7-0-a591c609743d@linaro.org> To: Abhinav Kumar , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Krishna Manikandan , Jonathan Marek , Kuogee Hsieh , Neil Armstrong , Dmitry Baryshkov , Bjorn Andersson , Michael Turquette , Stephen Boyd , Rob Clark Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , linux-clk@vger.kernel.org, Abel Vesa , Srinivas Kandagatla , Rob Clark , Dmitry Baryshkov X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10151; i=krzysztof.kozlowski@linaro.org; h=from:subject:message-id; bh=bDt93fOPMIU1TrFk4w98DkGoRUoI6srG26oyPVGDWKo=; b=owEBbQKS/ZANAwAKAcE3ZuaGi4PXAcsmYgBoUs4e5zKy91RDvgwO12wZAfsNu2ncXHVq1uV6s sOwGdCjTJeJAjMEAAEKAB0WIQTd0mIoPREbIztuuKjBN2bmhouD1wUCaFLOHgAKCRDBN2bmhouD 10+XD/9d+4rtqtoafs5le+CiKjfqovjTm98978QrxZxd8ZmpKB2cU14lYFoftKFTXAVJOypHwQU UOUfhcaPzo0d2JB00TdhZZp28LTUWrpDW9fHSHu9Ynq5ZfwY4py9Y3DCkibh0buzPYonTBVE44Y OzlQkMwetzFrLMiMZIxSYivTAzeu9ldYGEvSgK3Mu6oOCJRqSMfQlYJVS5zKhlWV0jrkA2NoXfk Nn7AoNRzXUzRskN7nO+m55DALGOP6HpRoZRf3WepGkgz1tHslvtYkx4TQDzxZlOxu/x5JBgSYam dqeIpa3c7fgC7kokFg4/kfrjbCvK/FGCoueqk0BBEEFn6IUENK5NoOwy3u5Xh/8yVVaU9DNViOR q7Ma/cN4q33qxH/yrqaiJpq+g+A90wpxP8QXDoooarozYA8vZe2DDcvqnMkQho3Cz5QjavpaK30 7kF1TX8SV4ukql+OJh4w9+wLicVlhy886t8Owv9aoNwIeX0OdPxt+iPZci/jzTXbVtcWNVPRZxf ZZh5fy6AMAmBmdv+svpjTftf9i3OfxmGLAX8OpqFjLJsQk8ZhTAMoPhemtPTY6WbzxizkDu8yKc gZ3nsZFrXDf/VPBfEmfy4BKDvhTh0bVd+WlI4RifeoJV/o6+zNX5p8LEOU5bj/RlYn0RLvteeWC pBCumR6VdFEISqQ== X-Developer-Key: i=krzysztof.kozlowski@linaro.org; a=openpgp; fpr=9BD07E0E0C51F8D59677B7541B93437D3B41629B Add support for DSI PHY v7.0 on Qualcomm SM8750 SoC which comes with an incompatible hardware interface change: ICODE_ACCUM_STATUS_LOW and ALOG_OBSV_BUS_STATUS_1 registers - their offsets were just switched. Currently these registers are not used in the driver, so the easiest is to document both but keep them commented out to avoid conflict. Reviewed-by: Dmitry Baryshkov Signed-off-by: Krzysztof Kozlowski --- Changes in v2: 1. Fix pll freq check for clock inverters 160000000ULL -> 163000000ULL --- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 2 + drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 1 + drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 79 ++++++++++++++++++= ++-- .../gpu/drm/msm/registers/display/dsi_phy_7nm.xml | 14 ++++ 4 files changed, 90 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/ds= i/phy/dsi_phy.c index 5973d7325699bf5fc67c4cf93fcaf04abb618b46..221f12db5f8b7686b2f37524322= ea3e118f503b1 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c @@ -597,6 +597,8 @@ static const struct of_device_id dsi_phy_dt_match[] =3D= { .data =3D &dsi_phy_4nm_8550_cfgs }, { .compatible =3D "qcom,sm8650-dsi-phy-4nm", .data =3D &dsi_phy_4nm_8650_cfgs }, + { .compatible =3D "qcom,sm8750-dsi-phy-3nm", + .data =3D &dsi_phy_3nm_8750_cfgs }, #endif {} }; diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/ds= i/phy/dsi_phy.h index 7ea608f620fe17ae4ccc41ba9e52ba043af0c022..c558f8df168479fb91b65186ab9= 6cb3de4e33d9c 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h @@ -63,6 +63,7 @@ extern const struct msm_dsi_phy_cfg dsi_phy_5nm_8775p_cfg= s; extern const struct msm_dsi_phy_cfg dsi_phy_5nm_sar2130p_cfgs; extern const struct msm_dsi_phy_cfg dsi_phy_4nm_8550_cfgs; extern const struct msm_dsi_phy_cfg dsi_phy_4nm_8650_cfgs; +extern const struct msm_dsi_phy_cfg dsi_phy_3nm_8750_cfgs; =20 struct msm_dsi_dphy_timing { u32 clk_zero; diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c b/drivers/gpu/drm/ms= m/dsi/phy/dsi_phy_7nm.c index c19890358b7479c85c793aa7470904127c2d0206..8c98f91a5930c9f2563a6b48246= 90ceef56987c0 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c @@ -51,6 +51,8 @@ #define DSI_PHY_7NM_QUIRK_V4_3 BIT(3) /* Hardware is V5.2 */ #define DSI_PHY_7NM_QUIRK_V5_2 BIT(4) +/* Hardware is V7.0 */ +#define DSI_PHY_7NM_QUIRK_V7_0 BIT(5) =20 struct dsi_pll_config { bool enable_ssc; @@ -129,9 +131,30 @@ static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *= pll, struct dsi_pll_config dec_multiple =3D div_u64(pll_freq * multiplier, divider); dec =3D div_u64_rem(dec_multiple, multiplier, &frac); =20 - if (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_PRE_V4_1) + if (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_PRE_V4_1) { config->pll_clock_inverters =3D 0x28; - else if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { + } else if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) { + if (pll_freq < 163000000ULL) + config->pll_clock_inverters =3D 0xa0; + else if (pll_freq < 175000000ULL) + config->pll_clock_inverters =3D 0x20; + else if (pll_freq < 325000000ULL) + config->pll_clock_inverters =3D 0xa0; + else if (pll_freq < 350000000ULL) + config->pll_clock_inverters =3D 0x20; + else if (pll_freq < 650000000ULL) + config->pll_clock_inverters =3D 0xa0; + else if (pll_freq < 700000000ULL) + config->pll_clock_inverters =3D 0x20; + else if (pll_freq < 1300000000ULL) + config->pll_clock_inverters =3D 0xa0; + else if (pll_freq < 2500000000ULL) + config->pll_clock_inverters =3D 0x20; + else if (pll_freq < 4000000000ULL) + config->pll_clock_inverters =3D 0x00; + else + config->pll_clock_inverters =3D 0x40; + } else if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { if (pll_freq <=3D 1300000000ULL) config->pll_clock_inverters =3D 0xa0; else if (pll_freq <=3D 2500000000ULL) @@ -250,7 +273,8 @@ static void dsi_pll_config_hzindep_reg(struct dsi_pll_7= nm *pll) vco_config_1 =3D 0x01; } =20 - if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { + if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) || + (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) { if (pll->vco_current_rate < 1557000000ULL) vco_config_1 =3D 0x08; else @@ -620,6 +644,7 @@ static int dsi_7nm_pll_restore_state(struct msm_dsi_phy= *phy) static int dsi_7nm_set_usecase(struct msm_dsi_phy *phy) { struct dsi_pll_7nm *pll_7nm =3D to_pll_7nm(phy->vco_hw); + void __iomem *base =3D phy->base; u32 data =3D 0x0; /* internal PLL */ =20 DBG("DSI PLL%d", pll_7nm->phy->id); @@ -629,6 +654,9 @@ static int dsi_7nm_set_usecase(struct msm_dsi_phy *phy) break; case MSM_DSI_PHY_MASTER: pll_7nm->slave =3D pll_7nm_list[(pll_7nm->phy->id + 1) % DSI_MAX]; + /* v7.0: Enable ATB_EN0 and alternate clock output to external phy */ + if (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0) + writel(0x07, base + REG_DSI_7nm_PHY_CMN_CTRL_5); break; case MSM_DSI_PHY_SLAVE: data =3D 0x1; /* external PLL */ @@ -907,7 +935,8 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, =20 /* Request for REFGEN READY */ if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_3) || - (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { + (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) || + (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) { writel(0x1, phy->base + REG_DSI_7nm_PHY_CMN_GLBL_DIGTOP_SPARE10); udelay(500); } @@ -941,7 +970,20 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, lane_ctrl0 =3D 0x1f; } =20 - if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { + if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) { + if (phy->cphy_mode) { + /* TODO: different for second phy */ + vreg_ctrl_0 =3D 0x57; + vreg_ctrl_1 =3D 0x41; + glbl_rescode_top_ctrl =3D 0x3d; + glbl_rescode_bot_ctrl =3D 0x38; + } else { + vreg_ctrl_0 =3D 0x56; + vreg_ctrl_1 =3D 0x19; + glbl_rescode_top_ctrl =3D less_than_1500_mhz ? 0x3c : 0x03; + glbl_rescode_bot_ctrl =3D less_than_1500_mhz ? 0x38 : 0x3c; + } + } else if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { if (phy->cphy_mode) { vreg_ctrl_0 =3D 0x45; vreg_ctrl_1 =3D 0x41; @@ -1003,6 +1045,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, =20 /* program CMN_CTRL_4 for minor_ver 2 chipsets*/ if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) || + (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0) || (readl(base + REG_DSI_7nm_PHY_CMN_REVISION_ID0) & (0xf0)) =3D=3D 0x20) writel(0x04, base + REG_DSI_7nm_PHY_CMN_CTRL_4); =20 @@ -1117,7 +1160,8 @@ static void dsi_7nm_phy_disable(struct msm_dsi_phy *p= hy) =20 /* Turn off REFGEN Vote */ if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_3) || - (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { + (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) || + (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) { writel(0x0, base + REG_DSI_7nm_PHY_CMN_GLBL_DIGTOP_SPARE10); wmb(); /* Delay to ensure HW removes vote before PHY shut down */ @@ -1384,3 +1428,26 @@ const struct msm_dsi_phy_cfg dsi_phy_4nm_8650_cfgs = =3D { .num_dsi_phy =3D 2, .quirks =3D DSI_PHY_7NM_QUIRK_V5_2, }; + +const struct msm_dsi_phy_cfg dsi_phy_3nm_8750_cfgs =3D { + .has_phy_lane =3D true, + .regulator_data =3D dsi_phy_7nm_98000uA_regulators, + .num_regulators =3D ARRAY_SIZE(dsi_phy_7nm_98000uA_regulators), + .ops =3D { + .enable =3D dsi_7nm_phy_enable, + .disable =3D dsi_7nm_phy_disable, + .pll_init =3D dsi_pll_7nm_init, + .save_pll_state =3D dsi_7nm_pll_save_state, + .restore_pll_state =3D dsi_7nm_pll_restore_state, + .set_continuous_clock =3D dsi_7nm_set_continuous_clock, + }, + .min_pll_rate =3D 600000000UL, +#ifdef CONFIG_64BIT + .max_pll_rate =3D 5000000000UL, +#else + .max_pll_rate =3D ULONG_MAX, +#endif + .io_start =3D { 0xae95000, 0xae97000 }, + .num_dsi_phy =3D 2, + .quirks =3D DSI_PHY_7NM_QUIRK_V7_0, +}; diff --git a/drivers/gpu/drm/msm/registers/display/dsi_phy_7nm.xml b/driver= s/gpu/drm/msm/registers/display/dsi_phy_7nm.xml index d2c8c46bb04159da6e539bfe80a4b5dc9ffdf367..4e5ac0f25dea856a49a1523f59c= 60b7f7769c1c2 100644 --- a/drivers/gpu/drm/msm/registers/display/dsi_phy_7nm.xml +++ b/drivers/gpu/drm/msm/registers/display/dsi_phy_7nm.xml @@ -26,6 +26,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/free= dreno/ rules-fd.xsd"> + @@ -191,11 +192,24 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> + + --=20 2.45.2