Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 9060935

Browse files
abelvesagregkh
authored andcommitted
phy: qualcomm: eusb2-repeater: Rework init to drop redundant zero-out loop
[ Upstream commit 734550d ] Instead of incrementing the base of the global reg fields, which renders the second instance of the repeater broken due to wrong offsets, use regmap with base and offset. As for zeroing out the rest of the tuning regs, avoid looping though the table and just use the table as is, as it is already zero initialized. Fixes: 99a517a ("phy: qualcomm: phy-qcom-eusb2-repeater: Zero out untouched tuning regs") Tested-by: Elliot Berman <[email protected]> # sm8650-qrd Signed-off-by: Abel Vesa <[email protected]> Link: https://lore.kernel.org/r/20240201-phy-qcom-eusb2-repeater-fixes-v4-1-cf18c8cef6d7@linaro.org Signed-off-by: Vinod Koul <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent fa3532b commit 9060935

File tree

1 file changed

+62
-104
lines changed

1 file changed

+62
-104
lines changed

drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c

Lines changed: 62 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -37,56 +37,28 @@
3737
#define EUSB2_TUNE_EUSB_EQU 0x5A
3838
#define EUSB2_TUNE_EUSB_HS_COMP_CUR 0x5B
3939

40-
#define QCOM_EUSB2_REPEATER_INIT_CFG(r, v) \
41-
{ \
42-
.reg = r, \
43-
.val = v, \
44-
}
45-
46-
enum reg_fields {
47-
F_TUNE_EUSB_HS_COMP_CUR,
48-
F_TUNE_EUSB_EQU,
49-
F_TUNE_EUSB_SLEW,
50-
F_TUNE_USB2_HS_COMP_CUR,
51-
F_TUNE_USB2_PREEM,
52-
F_TUNE_USB2_EQU,
53-
F_TUNE_USB2_SLEW,
54-
F_TUNE_SQUELCH_U,
55-
F_TUNE_HSDISC,
56-
F_TUNE_RES_FSDIF,
57-
F_TUNE_IUSB2,
58-
F_TUNE_USB2_CROSSOVER,
59-
F_NUM_TUNE_FIELDS,
60-
61-
F_FORCE_VAL_5 = F_NUM_TUNE_FIELDS,
62-
F_FORCE_EN_5,
63-
64-
F_EN_CTL1,
65-
66-
F_RPTR_STATUS,
67-
F_NUM_FIELDS,
68-
};
69-
70-
static struct reg_field eusb2_repeater_tune_reg_fields[F_NUM_FIELDS] = {
71-
[F_TUNE_EUSB_HS_COMP_CUR] = REG_FIELD(EUSB2_TUNE_EUSB_HS_COMP_CUR, 0, 1),
72-
[F_TUNE_EUSB_EQU] = REG_FIELD(EUSB2_TUNE_EUSB_EQU, 0, 1),
73-
[F_TUNE_EUSB_SLEW] = REG_FIELD(EUSB2_TUNE_EUSB_SLEW, 0, 1),
74-
[F_TUNE_USB2_HS_COMP_CUR] = REG_FIELD(EUSB2_TUNE_USB2_HS_COMP_CUR, 0, 1),
75-
[F_TUNE_USB2_PREEM] = REG_FIELD(EUSB2_TUNE_USB2_PREEM, 0, 2),
76-
[F_TUNE_USB2_EQU] = REG_FIELD(EUSB2_TUNE_USB2_EQU, 0, 1),
77-
[F_TUNE_USB2_SLEW] = REG_FIELD(EUSB2_TUNE_USB2_SLEW, 0, 1),
78-
[F_TUNE_SQUELCH_U] = REG_FIELD(EUSB2_TUNE_SQUELCH_U, 0, 2),
79-
[F_TUNE_HSDISC] = REG_FIELD(EUSB2_TUNE_HSDISC, 0, 2),
80-
[F_TUNE_RES_FSDIF] = REG_FIELD(EUSB2_TUNE_RES_FSDIF, 0, 2),
81-
[F_TUNE_IUSB2] = REG_FIELD(EUSB2_TUNE_IUSB2, 0, 3),
82-
[F_TUNE_USB2_CROSSOVER] = REG_FIELD(EUSB2_TUNE_USB2_CROSSOVER, 0, 2),
83-
84-
[F_FORCE_VAL_5] = REG_FIELD(EUSB2_FORCE_VAL_5, 0, 7),
85-
[F_FORCE_EN_5] = REG_FIELD(EUSB2_FORCE_EN_5, 0, 7),
86-
87-
[F_EN_CTL1] = REG_FIELD(EUSB2_EN_CTL1, 0, 7),
88-
89-
[F_RPTR_STATUS] = REG_FIELD(EUSB2_RPTR_STATUS, 0, 7),
40+
enum eusb2_reg_layout {
41+
TUNE_EUSB_HS_COMP_CUR,
42+
TUNE_EUSB_EQU,
43+
TUNE_EUSB_SLEW,
44+
TUNE_USB2_HS_COMP_CUR,
45+
TUNE_USB2_PREEM,
46+
TUNE_USB2_EQU,
47+
TUNE_USB2_SLEW,
48+
TUNE_SQUELCH_U,
49+
TUNE_HSDISC,
50+
TUNE_RES_FSDIF,
51+
TUNE_IUSB2,
52+
TUNE_USB2_CROSSOVER,
53+
NUM_TUNE_FIELDS,
54+
55+
FORCE_VAL_5 = NUM_TUNE_FIELDS,
56+
FORCE_EN_5,
57+
58+
EN_CTL1,
59+
60+
RPTR_STATUS,
61+
LAYOUT_SIZE,
9062
};
9163

9264
struct eusb2_repeater_cfg {
@@ -98,21 +70,22 @@ struct eusb2_repeater_cfg {
9870

9971
struct eusb2_repeater {
10072
struct device *dev;
101-
struct regmap_field *regs[F_NUM_FIELDS];
73+
struct regmap *regmap;
10274
struct phy *phy;
10375
struct regulator_bulk_data *vregs;
10476
const struct eusb2_repeater_cfg *cfg;
77+
u32 base;
10578
enum phy_mode mode;
10679
};
10780

10881
static const char * const pm8550b_vreg_l[] = {
10982
"vdd18", "vdd3",
11083
};
11184

112-
static const u32 pm8550b_init_tbl[F_NUM_TUNE_FIELDS] = {
113-
[F_TUNE_IUSB2] = 0x8,
114-
[F_TUNE_SQUELCH_U] = 0x3,
115-
[F_TUNE_USB2_PREEM] = 0x5,
85+
static const u32 pm8550b_init_tbl[NUM_TUNE_FIELDS] = {
86+
[TUNE_IUSB2] = 0x8,
87+
[TUNE_SQUELCH_U] = 0x3,
88+
[TUNE_USB2_PREEM] = 0x5,
11689
};
11790

11891
static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -140,47 +113,42 @@ static int eusb2_repeater_init_vregs(struct eusb2_repeater *rptr)
140113

141114
static int eusb2_repeater_init(struct phy *phy)
142115
{
143-
struct reg_field *regfields = eusb2_repeater_tune_reg_fields;
144116
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
145117
struct device_node *np = rptr->dev->of_node;
146-
u32 init_tbl[F_NUM_TUNE_FIELDS] = { 0 };
147-
u8 override;
118+
struct regmap *regmap = rptr->regmap;
119+
const u32 *init_tbl = rptr->cfg->init_tbl;
120+
u8 tune_usb2_preem = init_tbl[TUNE_USB2_PREEM];
121+
u8 tune_hsdisc = init_tbl[TUNE_HSDISC];
122+
u8 tune_iusb2 = init_tbl[TUNE_IUSB2];
123+
u32 base = rptr->base;
148124
u32 val;
149125
int ret;
150-
int i;
126+
127+
of_property_read_u8(np, "qcom,tune-usb2-amplitude", &tune_iusb2);
128+
of_property_read_u8(np, "qcom,tune-usb2-disc-thres", &tune_hsdisc);
129+
of_property_read_u8(np, "qcom,tune-usb2-preem", &tune_usb2_preem);
151130

152131
ret = regulator_bulk_enable(rptr->cfg->num_vregs, rptr->vregs);
153132
if (ret)
154133
return ret;
155134

156-
regmap_field_update_bits(rptr->regs[F_EN_CTL1], EUSB2_RPTR_EN, EUSB2_RPTR_EN);
135+
regmap_write(regmap, base + EUSB2_EN_CTL1, EUSB2_RPTR_EN);
157136

158-
for (i = 0; i < F_NUM_TUNE_FIELDS; i++) {
159-
if (init_tbl[i]) {
160-
regmap_field_update_bits(rptr->regs[i], init_tbl[i], init_tbl[i]);
161-
} else {
162-
/* Write 0 if there's no value set */
163-
u32 mask = GENMASK(regfields[i].msb, regfields[i].lsb);
164-
165-
regmap_field_update_bits(rptr->regs[i], mask, 0);
166-
}
167-
}
168-
memcpy(init_tbl, rptr->cfg->init_tbl, sizeof(init_tbl));
137+
regmap_write(regmap, base + EUSB2_TUNE_EUSB_HS_COMP_CUR, init_tbl[TUNE_EUSB_HS_COMP_CUR]);
138+
regmap_write(regmap, base + EUSB2_TUNE_EUSB_EQU, init_tbl[TUNE_EUSB_EQU]);
139+
regmap_write(regmap, base + EUSB2_TUNE_EUSB_SLEW, init_tbl[TUNE_EUSB_SLEW]);
140+
regmap_write(regmap, base + EUSB2_TUNE_USB2_HS_COMP_CUR, init_tbl[TUNE_USB2_HS_COMP_CUR]);
141+
regmap_write(regmap, base + EUSB2_TUNE_USB2_EQU, init_tbl[TUNE_USB2_EQU]);
142+
regmap_write(regmap, base + EUSB2_TUNE_USB2_SLEW, init_tbl[TUNE_USB2_SLEW]);
143+
regmap_write(regmap, base + EUSB2_TUNE_SQUELCH_U, init_tbl[TUNE_SQUELCH_U]);
144+
regmap_write(regmap, base + EUSB2_TUNE_RES_FSDIF, init_tbl[TUNE_RES_FSDIF]);
145+
regmap_write(regmap, base + EUSB2_TUNE_USB2_CROSSOVER, init_tbl[TUNE_USB2_CROSSOVER]);
169146

170-
if (!of_property_read_u8(np, "qcom,tune-usb2-amplitude", &override))
171-
init_tbl[F_TUNE_IUSB2] = override;
147+
regmap_write(regmap, base + EUSB2_TUNE_USB2_PREEM, tune_usb2_preem);
148+
regmap_write(regmap, base + EUSB2_TUNE_HSDISC, tune_hsdisc);
149+
regmap_write(regmap, base + EUSB2_TUNE_IUSB2, tune_iusb2);
172150

173-
if (!of_property_read_u8(np, "qcom,tune-usb2-disc-thres", &override))
174-
init_tbl[F_TUNE_HSDISC] = override;
175-
176-
if (!of_property_read_u8(np, "qcom,tune-usb2-preem", &override))
177-
init_tbl[F_TUNE_USB2_PREEM] = override;
178-
179-
for (i = 0; i < F_NUM_TUNE_FIELDS; i++)
180-
regmap_field_update_bits(rptr->regs[i], init_tbl[i], init_tbl[i]);
181-
182-
ret = regmap_field_read_poll_timeout(rptr->regs[F_RPTR_STATUS],
183-
val, val & RPTR_OK, 10, 5);
151+
ret = regmap_read_poll_timeout(regmap, base + EUSB2_RPTR_STATUS, val, val & RPTR_OK, 10, 5);
184152
if (ret)
185153
dev_err(rptr->dev, "initialization timed-out\n");
186154

@@ -191,6 +159,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
191159
enum phy_mode mode, int submode)
192160
{
193161
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
162+
struct regmap *regmap = rptr->regmap;
163+
u32 base = rptr->base;
194164

195165
switch (mode) {
196166
case PHY_MODE_USB_HOST:
@@ -199,10 +169,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
199169
* per eUSB 1.2 Spec. Below implement software workaround until
200170
* PHY and controller is fixing seen observation.
201171
*/
202-
regmap_field_update_bits(rptr->regs[F_FORCE_EN_5],
203-
F_CLK_19P2M_EN, F_CLK_19P2M_EN);
204-
regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5],
205-
V_CLK_19P2M_EN, V_CLK_19P2M_EN);
172+
regmap_write(regmap, base + EUSB2_FORCE_EN_5, F_CLK_19P2M_EN);
173+
regmap_write(regmap, base + EUSB2_FORCE_VAL_5, V_CLK_19P2M_EN);
206174
break;
207175
case PHY_MODE_USB_DEVICE:
208176
/*
@@ -211,10 +179,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
211179
* repeater doesn't clear previous value due to shared
212180
* regulators (say host <-> device mode switch).
213181
*/
214-
regmap_field_update_bits(rptr->regs[F_FORCE_EN_5],
215-
F_CLK_19P2M_EN, 0);
216-
regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5],
217-
V_CLK_19P2M_EN, 0);
182+
regmap_write(regmap, base + EUSB2_FORCE_EN_5, 0);
183+
regmap_write(regmap, base + EUSB2_FORCE_VAL_5, 0);
218184
break;
219185
default:
220186
return -EINVAL;
@@ -243,9 +209,8 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
243209
struct device *dev = &pdev->dev;
244210
struct phy_provider *phy_provider;
245211
struct device_node *np = dev->of_node;
246-
struct regmap *regmap;
247-
int i, ret;
248212
u32 res;
213+
int ret;
249214

250215
rptr = devm_kzalloc(dev, sizeof(*rptr), GFP_KERNEL);
251216
if (!rptr)
@@ -258,22 +223,15 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
258223
if (!rptr->cfg)
259224
return -EINVAL;
260225

261-
regmap = dev_get_regmap(dev->parent, NULL);
262-
if (!regmap)
226+
rptr->regmap = dev_get_regmap(dev->parent, NULL);
227+
if (!rptr->regmap)
263228
return -ENODEV;
264229

265230
ret = of_property_read_u32(np, "reg", &res);
266231
if (ret < 0)
267232
return ret;
268233

269-
for (i = 0; i < F_NUM_FIELDS; i++)
270-
eusb2_repeater_tune_reg_fields[i].reg += res;
271-
272-
ret = devm_regmap_field_bulk_alloc(dev, regmap, rptr->regs,
273-
eusb2_repeater_tune_reg_fields,
274-
F_NUM_FIELDS);
275-
if (ret)
276-
return ret;
234+
rptr->base = res;
277235

278236
ret = eusb2_repeater_init_vregs(rptr);
279237
if (ret < 0) {

0 commit comments

Comments
 (0)