37
37
38
38
/* INT_ENABLE */
39
39
#define USB2_INT_ENABLE_UCOM_INTEN BIT(3)
40
- #define USB2_INT_ENABLE_USBH_INTB_EN BIT(2)
41
- #define USB2_INT_ENABLE_USBH_INTA_EN BIT(1)
42
- #define USB2_INT_ENABLE_INIT (USB2_INT_ENABLE_UCOM_INTEN | \
43
- USB2_INT_ENABLE_USBH_INTB_EN | \
44
- USB2_INT_ENABLE_USBH_INTA_EN)
40
+ #define USB2_INT_ENABLE_USBH_INTB_EN BIT(2) /* For EHCI */
41
+ #define USB2_INT_ENABLE_USBH_INTA_EN BIT(1) /* For OHCI */
45
42
46
43
/* USBCTR */
47
44
#define USB2_USBCTR_DIRPD BIT(2)
78
75
#define USB2_ADPCTRL_IDPULLUP BIT(5) /* 1 = ID sampling is enabled */
79
76
#define USB2_ADPCTRL_DRVVBUS BIT(4)
80
77
78
+ #define NUM_OF_PHYS 4
79
+ enum rcar_gen3_phy_index {
80
+ PHY_INDEX_BOTH_HC ,
81
+ PHY_INDEX_OHCI ,
82
+ PHY_INDEX_EHCI ,
83
+ PHY_INDEX_HSUSB
84
+ };
85
+
86
+ static const u32 rcar_gen3_int_enable [NUM_OF_PHYS ] = {
87
+ USB2_INT_ENABLE_USBH_INTB_EN | USB2_INT_ENABLE_USBH_INTA_EN ,
88
+ USB2_INT_ENABLE_USBH_INTA_EN ,
89
+ USB2_INT_ENABLE_USBH_INTB_EN ,
90
+ 0
91
+ };
92
+
93
+ struct rcar_gen3_phy {
94
+ struct phy * phy ;
95
+ struct rcar_gen3_chan * ch ;
96
+ u32 int_enable_bits ;
97
+ bool initialized ;
98
+ bool otg_initialized ;
99
+ bool powered ;
100
+ };
101
+
81
102
struct rcar_gen3_chan {
82
103
void __iomem * base ;
83
104
struct device * dev ; /* platform_device's device */
84
105
struct extcon_dev * extcon ;
85
- struct phy * phy ;
106
+ struct rcar_gen3_phy rphys [ NUM_OF_PHYS ] ;
86
107
struct regulator * vbus ;
87
108
struct work_struct work ;
88
109
enum usb_dr_mode dr_mode ;
@@ -250,14 +271,50 @@ static enum phy_mode rcar_gen3_get_phy_mode(struct rcar_gen3_chan *ch)
250
271
return PHY_MODE_USB_DEVICE ;
251
272
}
252
273
274
+ static bool rcar_gen3_is_any_rphy_initialized (struct rcar_gen3_chan * ch )
275
+ {
276
+ int i ;
277
+
278
+ for (i = 0 ; i < NUM_OF_PHYS ; i ++ ) {
279
+ if (ch -> rphys [i ].initialized )
280
+ return true;
281
+ }
282
+
283
+ return false;
284
+ }
285
+
286
+ static bool rcar_gen3_needs_init_otg (struct rcar_gen3_chan * ch )
287
+ {
288
+ int i ;
289
+
290
+ for (i = 0 ; i < NUM_OF_PHYS ; i ++ ) {
291
+ if (ch -> rphys [i ].otg_initialized )
292
+ return false;
293
+ }
294
+
295
+ return true;
296
+ }
297
+
298
+ static bool rcar_gen3_are_all_rphys_power_off (struct rcar_gen3_chan * ch )
299
+ {
300
+ int i ;
301
+
302
+ for (i = 0 ; i < NUM_OF_PHYS ; i ++ ) {
303
+ if (ch -> rphys [i ].powered )
304
+ return false;
305
+ }
306
+
307
+ return true;
308
+ }
309
+
253
310
static ssize_t role_store (struct device * dev , struct device_attribute * attr ,
254
311
const char * buf , size_t count )
255
312
{
256
313
struct rcar_gen3_chan * ch = dev_get_drvdata (dev );
257
314
bool is_b_device ;
258
315
enum phy_mode cur_mode , new_mode ;
259
316
260
- if (!ch -> is_otg_channel || !ch -> phy -> init_count )
317
+ if (!ch -> is_otg_channel || !rcar_gen3_is_any_rphy_initialized ( ch ) )
261
318
return - EIO ;
262
319
263
320
if (!strncmp (buf , "host" , strlen ("host" )))
@@ -295,7 +352,7 @@ static ssize_t role_show(struct device *dev, struct device_attribute *attr,
295
352
{
296
353
struct rcar_gen3_chan * ch = dev_get_drvdata (dev );
297
354
298
- if (!ch -> is_otg_channel || !ch -> phy -> init_count )
355
+ if (!ch -> is_otg_channel || !rcar_gen3_is_any_rphy_initialized ( ch ) )
299
356
return - EIO ;
300
357
301
358
return sprintf (buf , "%s\n" , rcar_gen3_is_host (ch ) ? "host" :
@@ -329,37 +386,62 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
329
386
330
387
static int rcar_gen3_phy_usb2_init (struct phy * p )
331
388
{
332
- struct rcar_gen3_chan * channel = phy_get_drvdata (p );
389
+ struct rcar_gen3_phy * rphy = phy_get_drvdata (p );
390
+ struct rcar_gen3_chan * channel = rphy -> ch ;
333
391
void __iomem * usb2_base = channel -> base ;
392
+ u32 val ;
334
393
335
394
/* Initialize USB2 part */
336
- writel (USB2_INT_ENABLE_INIT , usb2_base + USB2_INT_ENABLE );
395
+ val = readl (usb2_base + USB2_INT_ENABLE );
396
+ val |= USB2_INT_ENABLE_UCOM_INTEN | rphy -> int_enable_bits ;
397
+ writel (val , usb2_base + USB2_INT_ENABLE );
337
398
writel (USB2_SPD_RSM_TIMSET_INIT , usb2_base + USB2_SPD_RSM_TIMSET );
338
399
writel (USB2_OC_TIMSET_INIT , usb2_base + USB2_OC_TIMSET );
339
400
340
401
/* Initialize otg part */
341
- if (channel -> is_otg_channel )
342
- rcar_gen3_init_otg (channel );
402
+ if (channel -> is_otg_channel ) {
403
+ if (rcar_gen3_needs_init_otg (channel ))
404
+ rcar_gen3_init_otg (channel );
405
+ rphy -> otg_initialized = true;
406
+ }
407
+
408
+ rphy -> initialized = true;
343
409
344
410
return 0 ;
345
411
}
346
412
347
413
static int rcar_gen3_phy_usb2_exit (struct phy * p )
348
414
{
349
- struct rcar_gen3_chan * channel = phy_get_drvdata (p );
415
+ struct rcar_gen3_phy * rphy = phy_get_drvdata (p );
416
+ struct rcar_gen3_chan * channel = rphy -> ch ;
417
+ void __iomem * usb2_base = channel -> base ;
418
+ u32 val ;
419
+
420
+ rphy -> initialized = false;
350
421
351
- writel (0 , channel -> base + USB2_INT_ENABLE );
422
+ if (channel -> is_otg_channel )
423
+ rphy -> otg_initialized = false;
424
+
425
+ val = readl (usb2_base + USB2_INT_ENABLE );
426
+ val &= ~rphy -> int_enable_bits ;
427
+ if (!rcar_gen3_is_any_rphy_initialized (channel ))
428
+ val &= ~USB2_INT_ENABLE_UCOM_INTEN ;
429
+ writel (val , usb2_base + USB2_INT_ENABLE );
352
430
353
431
return 0 ;
354
432
}
355
433
356
434
static int rcar_gen3_phy_usb2_power_on (struct phy * p )
357
435
{
358
- struct rcar_gen3_chan * channel = phy_get_drvdata (p );
436
+ struct rcar_gen3_phy * rphy = phy_get_drvdata (p );
437
+ struct rcar_gen3_chan * channel = rphy -> ch ;
359
438
void __iomem * usb2_base = channel -> base ;
360
439
u32 val ;
361
440
int ret ;
362
441
442
+ if (!rcar_gen3_are_all_rphys_power_off (channel ))
443
+ return 0 ;
444
+
363
445
if (channel -> vbus ) {
364
446
ret = regulator_enable (channel -> vbus );
365
447
if (ret )
@@ -372,14 +454,22 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p)
372
454
val &= ~USB2_USBCTR_PLL_RST ;
373
455
writel (val , usb2_base + USB2_USBCTR );
374
456
457
+ rphy -> powered = true;
458
+
375
459
return 0 ;
376
460
}
377
461
378
462
static int rcar_gen3_phy_usb2_power_off (struct phy * p )
379
463
{
380
- struct rcar_gen3_chan * channel = phy_get_drvdata (p );
464
+ struct rcar_gen3_phy * rphy = phy_get_drvdata (p );
465
+ struct rcar_gen3_chan * channel = rphy -> ch ;
381
466
int ret = 0 ;
382
467
468
+ rphy -> powered = false;
469
+
470
+ if (!rcar_gen3_are_all_rphys_power_off (channel ))
471
+ return 0 ;
472
+
383
473
if (channel -> vbus )
384
474
ret = regulator_disable (channel -> vbus );
385
475
@@ -448,14 +538,54 @@ static const unsigned int rcar_gen3_phy_cable[] = {
448
538
EXTCON_NONE ,
449
539
};
450
540
541
+ static struct phy * rcar_gen3_phy_usb2_xlate (struct device * dev ,
542
+ struct of_phandle_args * args )
543
+ {
544
+ struct rcar_gen3_chan * ch = dev_get_drvdata (dev );
545
+
546
+ if (args -> args_count == 0 ) /* For old version dts */
547
+ return ch -> rphys [PHY_INDEX_BOTH_HC ].phy ;
548
+ else if (args -> args_count > 1 ) /* Prevent invalid args count */
549
+ return ERR_PTR (- ENODEV );
550
+
551
+ if (args -> args [0 ] >= NUM_OF_PHYS )
552
+ return ERR_PTR (- ENODEV );
553
+
554
+ return ch -> rphys [args -> args [0 ]].phy ;
555
+ }
556
+
557
+ static enum usb_dr_mode rcar_gen3_get_dr_mode (struct device_node * np )
558
+ {
559
+ enum usb_dr_mode candidate = USB_DR_MODE_UNKNOWN ;
560
+ int i ;
561
+
562
+ /*
563
+ * If one of device nodes has other dr_mode except UNKNOWN,
564
+ * this function returns UNKNOWN. To achieve backward compatibility,
565
+ * this loop starts the index as 0.
566
+ */
567
+ for (i = 0 ; i < NUM_OF_PHYS ; i ++ ) {
568
+ enum usb_dr_mode mode = of_usb_get_dr_mode_by_phy (np , i );
569
+
570
+ if (mode != USB_DR_MODE_UNKNOWN ) {
571
+ if (candidate == USB_DR_MODE_UNKNOWN )
572
+ candidate = mode ;
573
+ else if (candidate != mode )
574
+ return USB_DR_MODE_UNKNOWN ;
575
+ }
576
+ }
577
+
578
+ return candidate ;
579
+ }
580
+
451
581
static int rcar_gen3_phy_usb2_probe (struct platform_device * pdev )
452
582
{
453
583
struct device * dev = & pdev -> dev ;
454
584
struct rcar_gen3_chan * channel ;
455
585
struct phy_provider * provider ;
456
586
struct resource * res ;
457
587
const struct phy_ops * phy_usb2_ops ;
458
- int irq , ret = 0 ;
588
+ int irq , ret = 0 , i ;
459
589
460
590
if (!dev -> of_node ) {
461
591
dev_err (dev , "This driver needs device tree\n" );
@@ -481,7 +611,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
481
611
dev_err (dev , "No irq handler (%d)\n" , irq );
482
612
}
483
613
484
- channel -> dr_mode = of_usb_get_dr_mode_by_phy (dev -> of_node , 0 );
614
+ channel -> dr_mode = rcar_gen3_get_dr_mode (dev -> of_node );
485
615
if (channel -> dr_mode != USB_DR_MODE_UNKNOWN ) {
486
616
int ret ;
487
617
@@ -509,11 +639,17 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
509
639
if (!phy_usb2_ops )
510
640
return - EINVAL ;
511
641
512
- channel -> phy = devm_phy_create (dev , NULL , phy_usb2_ops );
513
- if (IS_ERR (channel -> phy )) {
514
- dev_err (dev , "Failed to create USB2 PHY\n" );
515
- ret = PTR_ERR (channel -> phy );
516
- goto error ;
642
+ for (i = 0 ; i < NUM_OF_PHYS ; i ++ ) {
643
+ channel -> rphys [i ].phy = devm_phy_create (dev , NULL ,
644
+ phy_usb2_ops );
645
+ if (IS_ERR (channel -> rphys [i ].phy )) {
646
+ dev_err (dev , "Failed to create USB2 PHY\n" );
647
+ ret = PTR_ERR (channel -> rphys [i ].phy );
648
+ goto error ;
649
+ }
650
+ channel -> rphys [i ].ch = channel ;
651
+ channel -> rphys [i ].int_enable_bits = rcar_gen3_int_enable [i ];
652
+ phy_set_drvdata (channel -> rphys [i ].phy , & channel -> rphys [i ]);
517
653
}
518
654
519
655
channel -> vbus = devm_regulator_get_optional (dev , "vbus" );
@@ -526,10 +662,9 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
526
662
}
527
663
528
664
platform_set_drvdata (pdev , channel );
529
- phy_set_drvdata (channel -> phy , channel );
530
665
channel -> dev = dev ;
531
666
532
- provider = devm_of_phy_provider_register (dev , of_phy_simple_xlate );
667
+ provider = devm_of_phy_provider_register (dev , rcar_gen3_phy_usb2_xlate );
533
668
if (IS_ERR (provider )) {
534
669
dev_err (dev , "Failed to register PHY provider\n" );
535
670
ret = PTR_ERR (provider );
0 commit comments