30
30
#include <linux/usb/role.h>
31
31
#include <linux/regulator/consumer.h>
32
32
33
- /* USB2 Ports Control Registers */
33
+ /* USB2 Ports Control Registers, offsets are per-port */
34
34
35
35
#define U2P_REG_SIZE 0x20
36
36
50
50
51
51
/* USB Glue Control Registers */
52
52
53
- #define USB_R0 0x80
53
+ #define G12A_GLUE_OFFSET 0x80
54
+
55
+ #define USB_R0 0x00
54
56
#define USB_R0_P30_LANE0_TX2RX_LOOPBACK BIT(17)
55
57
#define USB_R0_P30_LANE0_EXT_PCLK_REQ BIT(18)
56
58
#define USB_R0_P30_PCS_RX_LOS_MASK_VAL_MASK GENMASK(28, 19)
57
59
#define USB_R0_U2D_SS_SCALEDOWN_MODE_MASK GENMASK(30, 29)
58
60
#define USB_R0_U2D_ACT BIT(31)
59
61
60
- #define USB_R1 0x84
62
+ #define USB_R1 0x04
61
63
#define USB_R1_U3H_BIGENDIAN_GS BIT(0)
62
64
#define USB_R1_U3H_PME_ENABLE BIT(1)
63
65
#define USB_R1_U3H_HUB_PORT_OVERCURRENT_MASK GENMASK(4, 2)
69
71
#define USB_R1_U3H_FLADJ_30MHZ_REG_MASK GENMASK(24, 19)
70
72
#define USB_R1_P30_PCS_TX_SWING_FULL_MASK GENMASK(31, 25)
71
73
72
- #define USB_R2 0x88
74
+ #define USB_R2 0x08
73
75
#define USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK GENMASK(25, 20)
74
76
#define USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK GENMASK(31, 26)
75
77
76
- #define USB_R3 0x8c
78
+ #define USB_R3 0x0c
77
79
#define USB_R3_P30_SSC_ENABLE BIT(0)
78
80
#define USB_R3_P30_SSC_RANGE_MASK GENMASK(3, 1)
79
81
#define USB_R3_P30_SSC_REF_CLK_SEL_MASK GENMASK(12, 4)
80
82
#define USB_R3_P30_REF_SSP_EN BIT(13)
81
83
82
- #define USB_R4 0x90
84
+ #define USB_R4 0x10
83
85
#define USB_R4_P21_PORT_RESET_0 BIT(0)
84
86
#define USB_R4_P21_SLEEP_M0 BIT(1)
85
87
#define USB_R4_MEM_PD_MASK GENMASK(3, 2)
86
88
#define USB_R4_P21_ONLY BIT(4)
87
89
88
- #define USB_R5 0x94
90
+ #define USB_R5 0x14
89
91
#define USB_R5_ID_DIG_SYNC BIT(0)
90
92
#define USB_R5_ID_DIG_REG BIT(1)
91
93
#define USB_R5_ID_DIG_CFG_MASK GENMASK(3, 2)
@@ -125,20 +127,27 @@ static const char *meson_a1_phy_names[] = {
125
127
"usb2-phy0" , "usb2-phy1"
126
128
};
127
129
130
+ struct dwc3_meson_g12a ;
131
+
128
132
struct dwc3_meson_g12a_drvdata {
129
133
bool otg_switch_supported ;
130
134
struct clk_bulk_data * clks ;
131
135
int num_clks ;
132
136
const char * * phy_names ;
133
137
int num_phys ;
138
+ int (* setup_regmaps )(struct dwc3_meson_g12a * priv , void __iomem * base );
134
139
};
135
140
141
+ static int dwc3_meson_g12a_setup_regmaps (struct dwc3_meson_g12a * priv ,
142
+ void __iomem * base );
143
+
136
144
static struct dwc3_meson_g12a_drvdata g12a_drvdata = {
137
145
.otg_switch_supported = true,
138
146
.clks = meson_g12a_clocks ,
139
147
.num_clks = ARRAY_SIZE (meson_g12a_clocks ),
140
148
.phy_names = meson_g12a_phy_names ,
141
149
.num_phys = ARRAY_SIZE (meson_g12a_phy_names ),
150
+ .setup_regmaps = dwc3_meson_g12a_setup_regmaps ,
142
151
};
143
152
144
153
static struct dwc3_meson_g12a_drvdata a1_drvdata = {
@@ -147,11 +156,13 @@ static struct dwc3_meson_g12a_drvdata a1_drvdata = {
147
156
.num_clks = ARRAY_SIZE (meson_a1_clocks ),
148
157
.phy_names = meson_a1_phy_names ,
149
158
.num_phys = ARRAY_SIZE (meson_a1_phy_names ),
159
+ .setup_regmaps = dwc3_meson_g12a_setup_regmaps ,
150
160
};
151
161
152
162
struct dwc3_meson_g12a {
153
163
struct device * dev ;
154
- struct regmap * regmap ;
164
+ struct regmap * u2p_regmap [PHY_COUNT ];
165
+ struct regmap * usb_glue_regmap ;
155
166
struct reset_control * reset ;
156
167
struct phy * phys [PHY_COUNT ];
157
168
enum usb_dr_mode otg_mode ;
@@ -168,11 +179,11 @@ static void dwc3_meson_g12a_usb2_set_mode(struct dwc3_meson_g12a *priv,
168
179
int i , enum phy_mode mode )
169
180
{
170
181
if (mode == PHY_MODE_USB_HOST )
171
- regmap_update_bits (priv -> regmap , U2P_R0 + ( U2P_REG_SIZE * i ) ,
182
+ regmap_update_bits (priv -> u2p_regmap [ i ] , U2P_R0 ,
172
183
U2P_R0_HOST_DEVICE ,
173
184
U2P_R0_HOST_DEVICE );
174
185
else
175
- regmap_update_bits (priv -> regmap , U2P_R0 + ( U2P_REG_SIZE * i ) ,
186
+ regmap_update_bits (priv -> u2p_regmap [ i ] , U2P_R0 ,
176
187
U2P_R0_HOST_DEVICE , 0 );
177
188
}
178
189
@@ -192,13 +203,12 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
192
203
if (!strstr (priv -> drvdata -> phy_names [i ], "usb2" ))
193
204
continue ;
194
205
195
- regmap_update_bits (priv -> regmap , U2P_R0 + ( U2P_REG_SIZE * i ) ,
206
+ regmap_update_bits (priv -> u2p_regmap [ i ] , U2P_R0 ,
196
207
U2P_R0_POWER_ON_RESET ,
197
208
U2P_R0_POWER_ON_RESET );
198
209
199
210
if (priv -> drvdata -> otg_switch_supported && i == USB2_OTG_PHY ) {
200
- regmap_update_bits (priv -> regmap ,
201
- U2P_R0 + (U2P_REG_SIZE * i ),
211
+ regmap_update_bits (priv -> u2p_regmap [i ], U2P_R0 ,
202
212
U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS ,
203
213
U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS );
204
214
@@ -208,7 +218,7 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
208
218
dwc3_meson_g12a_usb2_set_mode (priv , i ,
209
219
PHY_MODE_USB_HOST );
210
220
211
- regmap_update_bits (priv -> regmap , U2P_R0 + ( U2P_REG_SIZE * i ) ,
221
+ regmap_update_bits (priv -> u2p_regmap [ i ] , U2P_R0 ,
212
222
U2P_R0_POWER_ON_RESET , 0 );
213
223
}
214
224
@@ -217,46 +227,46 @@ static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv)
217
227
218
228
static void dwc3_meson_g12a_usb3_init (struct dwc3_meson_g12a * priv )
219
229
{
220
- regmap_update_bits (priv -> regmap , USB_R3 ,
230
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R3 ,
221
231
USB_R3_P30_SSC_RANGE_MASK |
222
232
USB_R3_P30_REF_SSP_EN ,
223
233
USB_R3_P30_SSC_ENABLE |
224
234
FIELD_PREP (USB_R3_P30_SSC_RANGE_MASK , 2 ) |
225
235
USB_R3_P30_REF_SSP_EN );
226
236
udelay (2 );
227
237
228
- regmap_update_bits (priv -> regmap , USB_R2 ,
238
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R2 ,
229
239
USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK ,
230
240
FIELD_PREP (USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK , 0x15 ));
231
241
232
- regmap_update_bits (priv -> regmap , USB_R2 ,
242
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R2 ,
233
243
USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK ,
234
244
FIELD_PREP (USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK , 0x20 ));
235
245
236
246
udelay (2 );
237
247
238
- regmap_update_bits (priv -> regmap , USB_R1 ,
248
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R1 ,
239
249
USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT ,
240
250
USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT );
241
251
242
- regmap_update_bits (priv -> regmap , USB_R1 ,
252
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R1 ,
243
253
USB_R1_P30_PCS_TX_SWING_FULL_MASK ,
244
254
FIELD_PREP (USB_R1_P30_PCS_TX_SWING_FULL_MASK , 127 ));
245
255
}
246
256
247
257
static void dwc3_meson_g12a_usb_otg_apply_mode (struct dwc3_meson_g12a * priv )
248
258
{
249
259
if (priv -> otg_phy_mode == PHY_MODE_USB_DEVICE ) {
250
- regmap_update_bits (priv -> regmap , USB_R0 ,
260
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R0 ,
251
261
USB_R0_U2D_ACT , USB_R0_U2D_ACT );
252
- regmap_update_bits (priv -> regmap , USB_R0 ,
262
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R0 ,
253
263
USB_R0_U2D_SS_SCALEDOWN_MODE_MASK , 0 );
254
- regmap_update_bits (priv -> regmap , USB_R4 ,
264
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R4 ,
255
265
USB_R4_P21_SLEEP_M0 , USB_R4_P21_SLEEP_M0 );
256
266
} else {
257
- regmap_update_bits (priv -> regmap , USB_R0 ,
267
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R0 ,
258
268
USB_R0_U2D_ACT , 0 );
259
- regmap_update_bits (priv -> regmap , USB_R4 ,
269
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R4 ,
260
270
USB_R4_P21_SLEEP_M0 , 0 );
261
271
}
262
272
}
@@ -269,17 +279,17 @@ static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv)
269
279
if (ret )
270
280
return ret ;
271
281
272
- regmap_update_bits (priv -> regmap , USB_R1 ,
282
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R1 ,
273
283
USB_R1_U3H_FLADJ_30MHZ_REG_MASK ,
274
284
FIELD_PREP (USB_R1_U3H_FLADJ_30MHZ_REG_MASK , 0x20 ));
275
285
276
- regmap_update_bits (priv -> regmap , USB_R5 ,
286
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R5 ,
277
287
USB_R5_ID_DIG_EN_0 ,
278
288
USB_R5_ID_DIG_EN_0 );
279
- regmap_update_bits (priv -> regmap , USB_R5 ,
289
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R5 ,
280
290
USB_R5_ID_DIG_EN_1 ,
281
291
USB_R5_ID_DIG_EN_1 );
282
- regmap_update_bits (priv -> regmap , USB_R5 ,
292
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R5 ,
283
293
USB_R5_ID_DIG_TH_MASK ,
284
294
FIELD_PREP (USB_R5_ID_DIG_TH_MASK , 0xff ));
285
295
@@ -292,7 +302,8 @@ static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv)
292
302
return 0 ;
293
303
}
294
304
295
- static const struct regmap_config phy_meson_g12a_usb3_regmap_conf = {
305
+ static const struct regmap_config phy_meson_g12a_usb_glue_regmap_conf = {
306
+ .name = "usb-glue" ,
296
307
.reg_bits = 8 ,
297
308
.val_bits = 32 ,
298
309
.reg_stride = 4 ,
@@ -329,7 +340,7 @@ static enum phy_mode dwc3_meson_g12a_get_id(struct dwc3_meson_g12a *priv)
329
340
{
330
341
u32 reg ;
331
342
332
- regmap_read (priv -> regmap , USB_R5 , & reg );
343
+ regmap_read (priv -> usb_glue_regmap , USB_R5 , & reg );
333
344
334
345
if (reg & (USB_R5_ID_DIG_SYNC | USB_R5_ID_DIG_REG ))
335
346
return PHY_MODE_USB_DEVICE ;
@@ -405,7 +416,8 @@ static irqreturn_t dwc3_meson_g12a_irq_thread(int irq, void *data)
405
416
dev_warn (priv -> dev , "Failed to switch OTG mode\n" );
406
417
}
407
418
408
- regmap_update_bits (priv -> regmap , USB_R5 , USB_R5_ID_DIG_IRQ , 0 );
419
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R5 ,
420
+ USB_R5_ID_DIG_IRQ , 0 );
409
421
410
422
return IRQ_HANDLED ;
411
423
}
@@ -440,7 +452,7 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
440
452
441
453
if (priv -> otg_mode == USB_DR_MODE_OTG ) {
442
454
/* Ack irq before registering */
443
- regmap_update_bits (priv -> regmap , USB_R5 ,
455
+ regmap_update_bits (priv -> usb_glue_regmap , USB_R5 ,
444
456
USB_R5_ID_DIG_IRQ , 0 );
445
457
446
458
irq = platform_get_irq (pdev , 0 );
@@ -476,6 +488,41 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
476
488
return 0 ;
477
489
}
478
490
491
+ static int dwc3_meson_g12a_setup_regmaps (struct dwc3_meson_g12a * priv ,
492
+ void __iomem * base )
493
+ {
494
+ int i ;
495
+
496
+ priv -> usb_glue_regmap = devm_regmap_init_mmio (priv -> dev ,
497
+ base + G12A_GLUE_OFFSET ,
498
+ & phy_meson_g12a_usb_glue_regmap_conf );
499
+ if (IS_ERR (priv -> usb_glue_regmap ))
500
+ return PTR_ERR (priv -> usb_glue_regmap );
501
+
502
+ /* Create a regmap for each USB2 PHY control register set */
503
+ for (i = 0 ; i < priv -> usb2_ports ; i ++ ) {
504
+ struct regmap_config u2p_regmap_config = {
505
+ .reg_bits = 8 ,
506
+ .val_bits = 32 ,
507
+ .reg_stride = 4 ,
508
+ .max_register = U2P_R1 ,
509
+ };
510
+
511
+ u2p_regmap_config .name = devm_kasprintf (priv -> dev , GFP_KERNEL ,
512
+ "u2p-%d" , i );
513
+ if (!u2p_regmap_config .name )
514
+ return - ENOMEM ;
515
+
516
+ priv -> u2p_regmap [i ] = devm_regmap_init_mmio (priv -> dev ,
517
+ base + (i * U2P_REG_SIZE ),
518
+ & u2p_regmap_config );
519
+ if (IS_ERR (priv -> u2p_regmap [i ]))
520
+ return PTR_ERR (priv -> u2p_regmap [i ]);
521
+ }
522
+
523
+ return 0 ;
524
+ }
525
+
479
526
static int dwc3_meson_g12a_probe (struct platform_device * pdev )
480
527
{
481
528
struct dwc3_meson_g12a * priv ;
@@ -492,10 +539,12 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
492
539
if (IS_ERR (base ))
493
540
return PTR_ERR (base );
494
541
495
- priv -> regmap = devm_regmap_init_mmio (dev , base ,
496
- & phy_meson_g12a_usb3_regmap_conf );
497
- if (IS_ERR (priv -> regmap ))
498
- return PTR_ERR (priv -> regmap );
542
+ priv -> drvdata = of_device_get_match_data (& pdev -> dev );
543
+
544
+ priv -> dev = dev ;
545
+ ret = priv -> drvdata -> setup_regmaps (priv , base );
546
+ if (ret )
547
+ return ret ;
499
548
500
549
priv -> vbus = devm_regulator_get_optional (dev , "vbus" );
501
550
if (IS_ERR (priv -> vbus )) {
@@ -504,8 +553,6 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
504
553
priv -> vbus = NULL ;
505
554
}
506
555
507
- priv -> drvdata = of_device_get_match_data (& pdev -> dev );
508
-
509
556
ret = devm_clk_bulk_get (dev ,
510
557
priv -> drvdata -> num_clks ,
511
558
priv -> drvdata -> clks );
@@ -518,7 +565,6 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
518
565
return ret ;
519
566
520
567
platform_set_drvdata (pdev , priv );
521
- priv -> dev = dev ;
522
568
523
569
priv -> reset = devm_reset_control_get (dev , NULL );
524
570
if (IS_ERR (priv -> reset )) {
0 commit comments