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
9264struct eusb2_repeater_cfg {
@@ -98,21 +70,22 @@ struct eusb2_repeater_cfg {
9870
9971struct 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
10881static 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
11891static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
@@ -140,47 +113,42 @@ static int eusb2_repeater_init_vregs(struct eusb2_repeater *rptr)
140113
141114static 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