Skip to content

Commit 4ba2e52

Browse files
konradybciovinodkoul
authored andcommitted
phy: qualcomm: phy-qcom-eusb2-repeater: Use regmap_fields
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent c20b59b commit 4ba2e52

File tree

1 file changed

+61
-30
lines changed

1 file changed

+61
-30
lines changed

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

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,42 @@
2828
#define EUSB2_TUNE_SQUELCH_U 0x54
2929
#define EUSB2_TUNE_USB2_PREEM 0x57
3030

31-
#define QCOM_EUSB2_REPEATER_INIT_CFG(o, v) \
31+
#define QCOM_EUSB2_REPEATER_INIT_CFG(r, v) \
3232
{ \
33-
.offset = o, \
33+
.reg = r, \
3434
.val = v, \
3535
}
3636

37+
enum reg_fields {
38+
F_TUNE_USB2_PREEM,
39+
F_TUNE_SQUELCH_U,
40+
F_TUNE_IUSB2,
41+
F_NUM_TUNE_FIELDS,
42+
43+
F_FORCE_VAL_5 = F_NUM_TUNE_FIELDS,
44+
F_FORCE_EN_5,
45+
46+
F_EN_CTL1,
47+
48+
F_RPTR_STATUS,
49+
F_NUM_FIELDS,
50+
};
51+
52+
static struct reg_field eusb2_repeater_tune_reg_fields[F_NUM_FIELDS] = {
53+
[F_TUNE_USB2_PREEM] = REG_FIELD(EUSB2_TUNE_USB2_PREEM, 0, 2),
54+
[F_TUNE_SQUELCH_U] = REG_FIELD(EUSB2_TUNE_SQUELCH_U, 0, 2),
55+
[F_TUNE_IUSB2] = REG_FIELD(EUSB2_TUNE_IUSB2, 0, 3),
56+
57+
[F_FORCE_VAL_5] = REG_FIELD(EUSB2_FORCE_VAL_5, 0, 7),
58+
[F_FORCE_EN_5] = REG_FIELD(EUSB2_FORCE_EN_5, 0, 7),
59+
60+
[F_EN_CTL1] = REG_FIELD(EUSB2_EN_CTL1, 0, 7),
61+
62+
[F_RPTR_STATUS] = REG_FIELD(EUSB2_RPTR_STATUS, 0, 7),
63+
};
64+
3765
struct eusb2_repeater_init_tbl {
38-
unsigned int offset;
66+
unsigned int reg;
3967
unsigned int val;
4068
};
4169

@@ -48,11 +76,10 @@ struct eusb2_repeater_cfg {
4876

4977
struct eusb2_repeater {
5078
struct device *dev;
51-
struct regmap *regmap;
79+
struct regmap_field *regs[F_NUM_FIELDS];
5280
struct phy *phy;
5381
struct regulator_bulk_data *vregs;
5482
const struct eusb2_repeater_cfg *cfg;
55-
u16 base;
5683
enum phy_mode mode;
5784
};
5885

@@ -61,9 +88,9 @@ static const char * const pm8550b_vreg_l[] = {
6188
};
6289

6390
static const struct eusb2_repeater_init_tbl pm8550b_init_tbl[] = {
64-
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_IUSB2, 0x8),
65-
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_SQUELCH_U, 0x3),
66-
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_USB2_PREEM, 0x5),
91+
QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_IUSB2, 0x8),
92+
QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_SQUELCH_U, 0x3),
93+
QCOM_EUSB2_REPEATER_INIT_CFG(F_TUNE_USB2_PREEM, 0x5),
6794
};
6895

6996
static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -93,7 +120,6 @@ static int eusb2_repeater_init(struct phy *phy)
93120
{
94121
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
95122
const struct eusb2_repeater_init_tbl *init_tbl = rptr->cfg->init_tbl;
96-
int num = rptr->cfg->init_tbl_num;
97123
u32 val;
98124
int ret;
99125
int i;
@@ -102,17 +128,14 @@ static int eusb2_repeater_init(struct phy *phy)
102128
if (ret)
103129
return ret;
104130

105-
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_EN_CTL1,
106-
EUSB2_RPTR_EN, EUSB2_RPTR_EN);
131+
regmap_field_update_bits(rptr->regs[F_EN_CTL1], EUSB2_RPTR_EN, EUSB2_RPTR_EN);
107132

108-
for (i = 0; i < num; i++)
109-
regmap_update_bits(rptr->regmap,
110-
rptr->base + init_tbl[i].offset,
111-
init_tbl[i].val, init_tbl[i].val);
133+
for (i = 0; i < rptr->cfg->init_tbl_num; i++)
134+
regmap_field_update_bits(rptr->regs[init_tbl[i].reg],
135+
init_tbl[i].val, init_tbl[i].val);
112136

113-
ret = regmap_read_poll_timeout(rptr->regmap,
114-
rptr->base + EUSB2_RPTR_STATUS, val,
115-
val & RPTR_OK, 10, 5);
137+
ret = regmap_field_read_poll_timeout(rptr->regs[F_RPTR_STATUS],
138+
val, val & RPTR_OK, 10, 5);
116139
if (ret)
117140
dev_err(rptr->dev, "initialization timed-out\n");
118141

@@ -131,10 +154,10 @@ static int eusb2_repeater_set_mode(struct phy *phy,
131154
* per eUSB 1.2 Spec. Below implement software workaround until
132155
* PHY and controller is fixing seen observation.
133156
*/
134-
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5,
135-
F_CLK_19P2M_EN, F_CLK_19P2M_EN);
136-
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5,
137-
V_CLK_19P2M_EN, V_CLK_19P2M_EN);
157+
regmap_field_update_bits(rptr->regs[F_FORCE_EN_5],
158+
F_CLK_19P2M_EN, F_CLK_19P2M_EN);
159+
regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5],
160+
V_CLK_19P2M_EN, V_CLK_19P2M_EN);
138161
break;
139162
case PHY_MODE_USB_DEVICE:
140163
/*
@@ -143,10 +166,10 @@ static int eusb2_repeater_set_mode(struct phy *phy,
143166
* repeater doesn't clear previous value due to shared
144167
* regulators (say host <-> device mode switch).
145168
*/
146-
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5,
147-
F_CLK_19P2M_EN, 0);
148-
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5,
149-
V_CLK_19P2M_EN, 0);
169+
regmap_field_update_bits(rptr->regs[F_FORCE_EN_5],
170+
F_CLK_19P2M_EN, 0);
171+
regmap_field_update_bits(rptr->regs[F_FORCE_VAL_5],
172+
V_CLK_19P2M_EN, 0);
150173
break;
151174
default:
152175
return -EINVAL;
@@ -175,8 +198,9 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
175198
struct device *dev = &pdev->dev;
176199
struct phy_provider *phy_provider;
177200
struct device_node *np = dev->of_node;
201+
struct regmap *regmap;
202+
int i, ret;
178203
u32 res;
179-
int ret;
180204

181205
rptr = devm_kzalloc(dev, sizeof(*rptr), GFP_KERNEL);
182206
if (!rptr)
@@ -189,15 +213,22 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
189213
if (!rptr->cfg)
190214
return -EINVAL;
191215

192-
rptr->regmap = dev_get_regmap(dev->parent, NULL);
193-
if (!rptr->regmap)
216+
regmap = dev_get_regmap(dev->parent, NULL);
217+
if (!regmap)
194218
return -ENODEV;
195219

196220
ret = of_property_read_u32(np, "reg", &res);
197221
if (ret < 0)
198222
return ret;
199223

200-
rptr->base = res;
224+
for (i = 0; i < F_NUM_FIELDS; i++)
225+
eusb2_repeater_tune_reg_fields[i].reg += res;
226+
227+
ret = devm_regmap_field_bulk_alloc(dev, regmap, rptr->regs,
228+
eusb2_repeater_tune_reg_fields,
229+
F_NUM_FIELDS);
230+
if (ret)
231+
return ret;
201232

202233
ret = eusb2_repeater_init_vregs(rptr);
203234
if (ret < 0) {

0 commit comments

Comments
 (0)