28
28
#define EUSB2_TUNE_SQUELCH_U 0x54
29
29
#define EUSB2_TUNE_USB2_PREEM 0x57
30
30
31
- #define QCOM_EUSB2_REPEATER_INIT_CFG (o , v ) \
31
+ #define QCOM_EUSB2_REPEATER_INIT_CFG (r , v ) \
32
32
{ \
33
- .offset = o , \
33
+ .reg = r , \
34
34
.val = v, \
35
35
}
36
36
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
+
37
65
struct eusb2_repeater_init_tbl {
38
- unsigned int offset ;
66
+ unsigned int reg ;
39
67
unsigned int val ;
40
68
};
41
69
@@ -48,11 +76,10 @@ struct eusb2_repeater_cfg {
48
76
49
77
struct eusb2_repeater {
50
78
struct device * dev ;
51
- struct regmap * regmap ;
79
+ struct regmap_field * regs [ F_NUM_FIELDS ] ;
52
80
struct phy * phy ;
53
81
struct regulator_bulk_data * vregs ;
54
82
const struct eusb2_repeater_cfg * cfg ;
55
- u16 base ;
56
83
enum phy_mode mode ;
57
84
};
58
85
@@ -61,9 +88,9 @@ static const char * const pm8550b_vreg_l[] = {
61
88
};
62
89
63
90
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 ),
67
94
};
68
95
69
96
static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -93,7 +120,6 @@ static int eusb2_repeater_init(struct phy *phy)
93
120
{
94
121
struct eusb2_repeater * rptr = phy_get_drvdata (phy );
95
122
const struct eusb2_repeater_init_tbl * init_tbl = rptr -> cfg -> init_tbl ;
96
- int num = rptr -> cfg -> init_tbl_num ;
97
123
u32 val ;
98
124
int ret ;
99
125
int i ;
@@ -102,17 +128,14 @@ static int eusb2_repeater_init(struct phy *phy)
102
128
if (ret )
103
129
return ret ;
104
130
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 );
107
132
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 );
112
136
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 );
116
139
if (ret )
117
140
dev_err (rptr -> dev , "initialization timed-out\n" );
118
141
@@ -131,10 +154,10 @@ static int eusb2_repeater_set_mode(struct phy *phy,
131
154
* per eUSB 1.2 Spec. Below implement software workaround until
132
155
* PHY and controller is fixing seen observation.
133
156
*/
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 );
138
161
break ;
139
162
case PHY_MODE_USB_DEVICE :
140
163
/*
@@ -143,10 +166,10 @@ static int eusb2_repeater_set_mode(struct phy *phy,
143
166
* repeater doesn't clear previous value due to shared
144
167
* regulators (say host <-> device mode switch).
145
168
*/
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 );
150
173
break ;
151
174
default :
152
175
return - EINVAL ;
@@ -175,8 +198,9 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
175
198
struct device * dev = & pdev -> dev ;
176
199
struct phy_provider * phy_provider ;
177
200
struct device_node * np = dev -> of_node ;
201
+ struct regmap * regmap ;
202
+ int i , ret ;
178
203
u32 res ;
179
- int ret ;
180
204
181
205
rptr = devm_kzalloc (dev , sizeof (* rptr ), GFP_KERNEL );
182
206
if (!rptr )
@@ -189,15 +213,22 @@ static int eusb2_repeater_probe(struct platform_device *pdev)
189
213
if (!rptr -> cfg )
190
214
return - EINVAL ;
191
215
192
- rptr -> regmap = dev_get_regmap (dev -> parent , NULL );
193
- if (!rptr -> regmap )
216
+ regmap = dev_get_regmap (dev -> parent , NULL );
217
+ if (!regmap )
194
218
return - ENODEV ;
195
219
196
220
ret = of_property_read_u32 (np , "reg" , & res );
197
221
if (ret < 0 )
198
222
return ret ;
199
223
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 ;
201
232
202
233
ret = eusb2_repeater_init_vregs (rptr );
203
234
if (ret < 0 ) {
0 commit comments