phy: qualcomm: phy-qcom-eusb2-repeater: Add tuning overrides
authorKonrad Dybcio <konrad.dybcio@linaro.org>
Wed, 13 Sep 2023 09:53:26 +0000 (11:53 +0200)
committerVinod Koul <vkoul@kernel.org>
Thu, 21 Sep 2023 14:38:51 +0000 (16:38 +0200)
There are devices in the wild, like the Sony Xperia 1 V that *require*
different tuning than the base design for USB to work.

Add support for overriding the necessary tuning values.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Link: https://lore.kernel.org/r/20230830-topic-eusb2_override-v2-4-7d8c893d93f6@linaro.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c

index d4fb85c20eb0f10b04708fc892cf6dd57c60c08b..a623f092b11f642bd3d35655e162a94a454bb14f 100644 (file)
@@ -142,7 +142,9 @@ static int eusb2_repeater_init(struct phy *phy)
 {
        struct reg_field *regfields = eusb2_repeater_tune_reg_fields;
        struct eusb2_repeater *rptr = phy_get_drvdata(phy);
-       const u32 *init_tbl = rptr->cfg->init_tbl;
+       struct device_node *np = rptr->dev->of_node;
+       u32 init_tbl[F_NUM_TUNE_FIELDS] = { 0 };
+       u8 override;
        u32 val;
        int ret;
        int i;
@@ -163,6 +165,19 @@ static int eusb2_repeater_init(struct phy *phy)
                        regmap_field_update_bits(rptr->regs[i], mask, 0);
                }
        }
+       memcpy(init_tbl, rptr->cfg->init_tbl, sizeof(init_tbl));
+
+       if (!of_property_read_u8(np, "qcom,tune-usb2-amplitude", &override))
+               init_tbl[F_TUNE_IUSB2] = override;
+
+       if (!of_property_read_u8(np, "qcom,tune-usb2-disc-thres", &override))
+               init_tbl[F_TUNE_HSDISC] = override;
+
+       if (!of_property_read_u8(np, "qcom,tune-usb2-preem", &override))
+               init_tbl[F_TUNE_USB2_PREEM] = override;
+
+       for (i = 0; i < F_NUM_TUNE_FIELDS; i++)
+               regmap_field_update_bits(rptr->regs[i], init_tbl[i], init_tbl[i]);
 
        ret = regmap_field_read_poll_timeout(rptr->regs[F_RPTR_STATUS],
                                             val, val & RPTR_OK, 10, 5);