From nobody Tue Feb 10 04:08:09 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 295C4C83F20 for ; Wed, 30 Aug 2023 02:41:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241755AbjH3Ckb (ORCPT ); Tue, 29 Aug 2023 22:40:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241738AbjH3CkY (ORCPT ); Tue, 29 Aug 2023 22:40:24 -0400 Received: from mail-lf1-x129.google.com (mail-lf1-x129.google.com [IPv6:2a00:1450:4864:20::129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 19B31CD8 for ; Tue, 29 Aug 2023 19:40:21 -0700 (PDT) Received: by mail-lf1-x129.google.com with SMTP id 2adb3069b0e04-5007abb15e9so7966190e87.0 for ; Tue, 29 Aug 2023 19:40:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1693363219; x=1693968019; 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=AqhtzcGyFHDluGDjY5bQjlFxQW1yi0cE3p4JZH8FKz0=; b=GRX8mvWPNnXmxTYU68Ksm6d1xtkXk5pDG32vjLUfxzRybSOibWJKmFqV8WaYS2JuwU F7N2nWMQ7CKMWMJ6S7sCH8AyZiFiOjPxS54lDNIKtPaZKCf0yRmuhOwO/fEiqnIvjMq5 9zG6LjAsLcA8SkgS64v0SmzVnIkSDy4iCRL5craaHbO40A7XW14gVRrGM5Ukly6ZR8Fs 5xGVvn+UlzWQbIIks4CzSQ3guEeE799KQOs6lvU18qYqD4A7qPRKPTb/kuM27qnR5yob dm/U5bcoFy0FQKuvwitlLVpmKF/i7rko+j7FMgqZE/Z5rftqukdR4fd2NbxwP6ifaXLL iTDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693363219; x=1693968019; 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=AqhtzcGyFHDluGDjY5bQjlFxQW1yi0cE3p4JZH8FKz0=; b=VbUTlgWjWSTOGG3Lq+97PJkRytTN3laTQyEbkxlyiEp/vur86Yp9foeJcWhYAH2/sh /Uqd+YoRAjMUKnvoH/WNcJ7SFMdZ63LwlqmdwB8NZCarSecumJlSA38q+oQZvhCkkLd3 3zEkuFaEV0iwKI+78IHSEyJf3P70kuAvRnV1AHNhEARwe7JBk1VJGeKLUjGfKhIXr1hV 4nFkLaeuEf4G9azwXIEh+cZ+9P9SOyS2q0ldJKllN5vGWiMI+Rn5rka032NeFLclbFOi NXj8xPvWgROOzsIse4IIM7mrgm3427Y93pXbyyrjQRepmVTc9C51ukvoCqVl8GrCPn7d tEew== X-Gm-Message-State: AOJu0Yw6WW5YKJWQOaMRNjNXTxERZTf6D2eIuyPeVPSqQAc/TYhkqCXg ISa8DD1yzvYc69tDHjDrZUi8Pg== X-Google-Smtp-Source: AGHT+IFpBDe1bzQ/cK5vCouexaMPmERPp/g75Tb3Qz47U7S6slLNMI13E0TDLktmOPGAUr6ny71NYg== X-Received: by 2002:a19:2d57:0:b0:4fb:7675:1c16 with SMTP id t23-20020a192d57000000b004fb76751c16mr428572lft.49.1693363219478; Tue, 29 Aug 2023 19:40:19 -0700 (PDT) Received: from [192.168.1.101] (abyl195.neoplus.adsl.tpnet.pl. [83.9.31.195]) by smtp.gmail.com with ESMTPSA id w7-20020ac254a7000000b004fb99da37e3sm2183878lfk.220.2023.08.29.19.40.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Aug 2023 19:40:19 -0700 (PDT) From: Konrad Dybcio Date: Wed, 30 Aug 2023 04:40:16 +0200 Subject: [PATCH 2/4] phy: qualcomm: phy-qcom-eusb2-repeater: Use regmap_fields MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20230830-topic-eusb2_override-v1-2-ab23825385a8@linaro.org> References: <20230830-topic-eusb2_override-v1-0-ab23825385a8@linaro.org> In-Reply-To: <20230830-topic-eusb2_override-v1-0-ab23825385a8@linaro.org> To: Andy Gross , Bjorn Andersson , Vinod Koul , Kishon Vijay Abraham I , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Abel Vesa Cc: Marijn Suijten , linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Konrad Dybcio X-Mailer: b4 0.12.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1693363215; l=6150; i=konrad.dybcio@linaro.org; s=20230215; h=from:subject:message-id; bh=LovaKfaqbkXiJ4az1PcPQZkH3FJdcJGz/pvW4OALguE=; b=a1geA4S8J2PTY4afb36vvk6SABGZSBl3BzJ58jL28SAunNSUJTSIThBvWtY/k3frdhxgqX9Er 6Pzctxcx9efBmMgVVRoGbJildXxxJjFaq9yznlfbyMmi1UDDIbYyDdr X-Developer-Key: i=konrad.dybcio@linaro.org; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Switch to regmap_fields, so that the values written into registers are sanitized by their explicit sizes and the different registers are structured in an iterable object to make external changes to the init sequence simpler. Signed-off-by: Konrad Dybcio --- drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c | 91 +++++++++++++++++-----= ---- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c b/drivers/phy/q= ualcomm/phy-qcom-eusb2-repeater.c index 52c275fbb2a1..7561da01e633 100644 --- a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c +++ b/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c @@ -28,14 +28,42 @@ #define EUSB2_TUNE_SQUELCH_U 0x54 #define EUSB2_TUNE_USB2_PREEM 0x57 =20 -#define QCOM_EUSB2_REPEATER_INIT_CFG(o, v) \ +#define QCOM_EUSB2_REPEATER_INIT_CFG(r, v) \ { \ - .offset =3D o, \ + .reg =3D r, \ .val =3D v, \ } =20 +enum reg_fields { + F_TUNE_USB2_PREEM, + F_TUNE_SQUELCH_U, + F_TUNE_IUSB2, + F_NUM_TUNE_FIELDS, + + F_FORCE_VAL_5 =3D F_NUM_TUNE_FIELDS, + F_FORCE_EN_5, + + F_EN_CTL1, + + F_RPTR_STATUS, + F_NUM_FIELDS, +}; + +static struct reg_field eusb2_repeater_tune_reg_fields[F_NUM_FIELDS] =3D { + [F_TUNE_USB2_PREEM] =3D REG_FIELD(EUSB2_TUNE_USB2_PREEM, 0, 2), + [F_TUNE_SQUELCH_U] =3D REG_FIELD(EUSB2_TUNE_SQUELCH_U, 0, 2), + [F_TUNE_IUSB2] =3D REG_FIELD(EUSB2_TUNE_IUSB2, 0, 3), + + [F_FORCE_VAL_5] =3D REG_FIELD(EUSB2_FORCE_VAL_5, 0, 7), + [F_FORCE_EN_5] =3D REG_FIELD(EUSB2_FORCE_EN_5, 0, 7), + + [F_EN_CTL1] =3D REG_FIELD(EUSB2_EN_CTL1, 0, 7), + + [F_RPTR_STATUS] =3D REG_FIELD(EUSB2_RPTR_STATUS, 0, 7), +}; + struct eusb2_repeater_init_tbl { - unsigned int offset; + unsigned int reg; unsigned int val; }; =20 @@ -48,11 +76,10 @@ struct eusb2_repeater_cfg { =20 struct eusb2_repeater { struct device *dev; - struct regmap *regmap; + struct regmap_field *regs[F_NUM_FIELDS]; struct phy *phy; struct regulator_bulk_data *vregs; const struct eusb2_repeater_cfg *cfg; - u16 base; enum phy_mode mode; }; =20 @@ -61,9 +88,9 @@ static const char * const pm8550b_vreg_l[] =3D { }; =20 static const struct eusb2_repeater_init_tbl pm8550b_init_tbl[] =3D { - QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_IUSB2, 0x8), - QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_SQUELCH_U, 0x3), - QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_USB2_PREEM, 0x5), + QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_IUSB2, 0x8), + QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_SQUELCH_U, 0x3), + QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_USB2_PREEM, 0x5), }; =20 static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg =3D { @@ -93,7 +120,6 @@ static int eusb2_repeater_init(struct phy *phy) { struct eusb2_repeater *rptr =3D phy_get_drvdata(phy); const struct eusb2_repeater_init_tbl *init_tbl =3D rptr->cfg->init_tbl; - int num =3D rptr->cfg->init_tbl_num; u32 val; int ret; int i; @@ -102,17 +128,14 @@ static int eusb2_repeater_init(struct phy *phy) if (ret) return ret; =20 - regmap_update_bits(rptr->regmap, rptr->base + EUSB2_EN_CTL1, - EUSB2_RPTR_EN, EUSB2_RPTR_EN); + regmap_field_update_bits(rptr->regs[F_EN_CTL1], EUSB2_RPTR_EN, EUSB2_RPTR= _EN); =20 - for (i =3D 0; i < num; i++) - regmap_update_bits(rptr->regmap, - rptr->base + init_tbl[i].offset, - init_tbl[i].val, init_tbl[i].val); + for (i =3D 0; i < rptr->cfg->init_tbl_num; i++) + regmap_field_update_bits(rptr->regs[init_tbl[i].reg], + init_tbl[i].val, init_tbl[i].val); =20 - ret =3D regmap_read_poll_timeout(rptr->regmap, - rptr->base + EUSB2_RPTR_STATUS, val, - val & RPTR_OK, 10, 5); + ret =3D regmap_field_read_poll_timeout(rptr->regs[F_RPTR_STATUS], + val, val & RPTR_OK, 10, 5); if (ret) dev_err(rptr->dev, "initialization timed-out\n"); =20 @@ -131,10 +154,10 @@ static int eusb2_repeater_set_mode(struct phy *phy, * per eUSB 1.2 Spec. Below implement software workaround until * PHY and controller is fixing seen observation. */ - regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5, - F_CLK_19P2M_EN, F_CLK_19P2M_EN); - regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5, - V_CLK_19P2M_EN, V_CLK_19P2M_EN); + regmap_field_update_bits(rptr->regs[F_FORCE_EN_5], + F_CLK_19P2M_EN, F_CLK_19P2M_EN); + regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5], + V_CLK_19P2M_EN, V_CLK_19P2M_EN); break; case PHY_MODE_USB_DEVICE: /* @@ -143,10 +166,10 @@ static int eusb2_repeater_set_mode(struct phy *phy, * repeater doesn't clear previous value due to shared * regulators (say host <-> device mode switch). */ - regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5, - F_CLK_19P2M_EN, 0); - regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5, - V_CLK_19P2M_EN, 0); + regmap_field_update_bits(rptr->regs[F_FORCE_EN_5], + F_CLK_19P2M_EN, 0); + regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5], + V_CLK_19P2M_EN, 0); break; default: return -EINVAL; @@ -175,8 +198,9 @@ static int eusb2_repeater_probe(struct platform_device = *pdev) struct device *dev =3D &pdev->dev; struct phy_provider *phy_provider; struct device_node *np =3D dev->of_node; + struct regmap *regmap; + int i, ret; u32 res; - int ret; =20 rptr =3D devm_kzalloc(dev, sizeof(*rptr), GFP_KERNEL); if (!rptr) @@ -189,15 +213,22 @@ static int eusb2_repeater_probe(struct platform_devic= e *pdev) if (!rptr->cfg) return -EINVAL; =20 - rptr->regmap =3D dev_get_regmap(dev->parent, NULL); - if (!rptr->regmap) + regmap =3D dev_get_regmap(dev->parent, NULL); + if (!regmap) return -ENODEV; =20 ret =3D of_property_read_u32(np, "reg", &res); if (ret < 0) return ret; =20 - rptr->base =3D res; + for (i =3D 0; i < F_NUM_FIELDS; i++) + eusb2_repeater_tune_reg_fields[i].reg +=3D res; + + ret =3D devm_regmap_field_bulk_alloc(dev, regmap, rptr->regs, + eusb2_repeater_tune_reg_fields, + F_NUM_FIELDS); + if (ret) + return ret; =20 ret =3D eusb2_repeater_init_vregs(rptr); if (ret < 0) { --=20 2.42.0