@@ -101,6 +101,7 @@ struct eusb2_repeater {
struct regmap_field *regs[F_NUM_FIELDS];
struct phy *phy;
struct regulator_bulk_data *vregs;
+ struct reg_field *regfields;
const struct eusb2_repeater_cfg *cfg;
enum phy_mode mode;
};
@@ -140,8 +141,8 @@ static int eusb2_repeater_init_vregs(struct eusb2_repeater *rptr)
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);
+ struct reg_field *regfields = rptr->regfields;
struct device_node *np = rptr->dev->of_node;
u32 init_tbl[F_NUM_TUNE_FIELDS] = { 0 };
u8 override;
@@ -262,15 +263,21 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
if (!regmap)
return -ENODEV;
+ rptr->regfields = devm_kmemdup(dev, eusb2_repeater_tune_reg_fields,
+ sizeof(eusb2_repeater_tune_reg_fields),
+ GFP_KERNEL);
+ if (!rptr->regfields)
+ return -ENOMEM;
+
ret = of_property_read_u32(np, "reg", &res);
if (ret < 0)
return ret;
for (i = 0; i < F_NUM_FIELDS; i++)
- eusb2_repeater_tune_reg_fields[i].reg += res;
+ rptr->regfields[i].reg += res;
ret = devm_regmap_field_bulk_alloc(dev, regmap, rptr->regs,
- eusb2_repeater_tune_reg_fields,
+ rptr->regfields,
F_NUM_FIELDS);
if (ret)
return ret;
The global regmap fields offsets currently get incremented with the base address of the repeater. This issue doesn't get noticed unless the probe defers or there are multiple repeaters on that platform. So instead of incrementing the global ones, copy them for each instance of the repeater. Fixes: 4ba2e52718c0 ("phy: qualcomm: phy-qcom-eusb2-repeater: Use regmap_fields") Signed-off-by: Abel Vesa <abel.vesa@linaro.org> --- drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)