aboutsummaryrefslogtreecommitdiff
path: root/drivers/phy/qualcomm
diff options
context:
space:
mode:
authorGravatar Konrad Dybcio <konrad.dybcio@linaro.org> 2023-09-13 11:53:26 +0200
committerGravatar Vinod Koul <vkoul@kernel.org> 2023-09-21 16:38:51 +0200
commit56156a76e765d32009fee058697c591194d0829f (patch)
treee376a88194217938569bc8527a58d4d74f7b66fe /drivers/phy/qualcomm
parentphy: qualcomm: phy-qcom-eusb2-repeater: Zero out untouched tuning regs (diff)
downloadlinux-56156a76e765d32009fee058697c591194d0829f.tar.gz
linux-56156a76e765d32009fee058697c591194d0829f.tar.bz2
linux-56156a76e765d32009fee058697c591194d0829f.zip
phy: qualcomm: phy-qcom-eusb2-repeater: Add tuning overrides
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>
Diffstat (limited to 'drivers/phy/qualcomm')
-rw-r--r--drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c b/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
index d4fb85c20eb0..a623f092b11f 100644
--- a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
+++ b/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
@@ -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);