37
37
#define EUSB2_TUNE_EUSB_EQU 0x5A
38
38
#define EUSB2_TUNE_EUSB_HS_COMP_CUR 0x5B
39
39
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 ,
90
62
};
91
63
92
64
struct eusb2_repeater_cfg {
@@ -98,21 +70,22 @@ struct eusb2_repeater_cfg {
98
70
99
71
struct eusb2_repeater {
100
72
struct device * dev ;
101
- struct regmap_field * regs [ F_NUM_FIELDS ] ;
73
+ struct regmap * regmap ;
102
74
struct phy * phy ;
103
75
struct regulator_bulk_data * vregs ;
104
76
const struct eusb2_repeater_cfg * cfg ;
77
+ u32 base ;
105
78
enum phy_mode mode ;
106
79
};
107
80
108
81
static const char * const pm8550b_vreg_l [] = {
109
82
"vdd18" , "vdd3" ,
110
83
};
111
84
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 ,
116
89
};
117
90
118
91
static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -140,47 +113,42 @@ static int eusb2_repeater_init_vregs(struct eusb2_repeater *rptr)
140
113
141
114
static int eusb2_repeater_init (struct phy * phy )
142
115
{
143
- struct reg_field * regfields = eusb2_repeater_tune_reg_fields ;
144
116
struct eusb2_repeater * rptr = phy_get_drvdata (phy );
145
117
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 ;
148
124
u32 val ;
149
125
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 );
151
130
152
131
ret = regulator_bulk_enable (rptr -> cfg -> num_vregs , rptr -> vregs );
153
132
if (ret )
154
133
return ret ;
155
134
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 );
157
136
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 ]);
169
146
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 );
172
150
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 );
184
152
if (ret )
185
153
dev_err (rptr -> dev , "initialization timed-out\n" );
186
154
@@ -191,6 +159,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
191
159
enum phy_mode mode , int submode )
192
160
{
193
161
struct eusb2_repeater * rptr = phy_get_drvdata (phy );
162
+ struct regmap * regmap = rptr -> regmap ;
163
+ u32 base = rptr -> base ;
194
164
195
165
switch (mode ) {
196
166
case PHY_MODE_USB_HOST :
@@ -199,10 +169,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
199
169
* per eUSB 1.2 Spec. Below implement software workaround until
200
170
* PHY and controller is fixing seen observation.
201
171
*/
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 );
206
174
break ;
207
175
case PHY_MODE_USB_DEVICE :
208
176
/*
@@ -211,10 +179,8 @@ static int eusb2_repeater_set_mode(struct phy *phy,
211
179
* repeater doesn't clear previous value due to shared
212
180
* regulators (say host <-> device mode switch).
213
181
*/
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 );
218
184
break ;
219
185
default :
220
186
return - EINVAL ;
@@ -243,9 +209,8 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
243
209
struct device * dev = & pdev -> dev ;
244
210
struct phy_provider * phy_provider ;
245
211
struct device_node * np = dev -> of_node ;
246
- struct regmap * regmap ;
247
- int i , ret ;
248
212
u32 res ;
213
+ int ret ;
249
214
250
215
rptr = devm_kzalloc (dev , sizeof (* rptr ), GFP_KERNEL );
251
216
if (!rptr )
@@ -258,22 +223,15 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
258
223
if (!rptr -> cfg )
259
224
return - EINVAL ;
260
225
261
- regmap = dev_get_regmap (dev -> parent , NULL );
262
- if (!regmap )
226
+ rptr -> regmap = dev_get_regmap (dev -> parent , NULL );
227
+ if (!rptr -> regmap )
263
228
return - ENODEV ;
264
229
265
230
ret = of_property_read_u32 (np , "reg" , & res );
266
231
if (ret < 0 )
267
232
return ret ;
268
233
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 ;
277
235
278
236
ret = eusb2_repeater_init_vregs (rptr );
279
237
if (ret < 0 ) {
0 commit comments