@@ -393,6 +393,154 @@ static int rockchip_combphy_probe(struct platform_device *pdev)
393
393
return PTR_ERR_OR_ZERO (phy_provider );
394
394
}
395
395
396
+ static int rk3562_combphy_cfg (struct rockchip_combphy_priv * priv )
397
+ {
398
+ const struct rockchip_combphy_grfcfg * cfg = priv -> cfg -> grfcfg ;
399
+ unsigned long rate ;
400
+ u32 val ;
401
+
402
+ switch (priv -> type ) {
403
+ case PHY_TYPE_PCIE :
404
+ /* Set SSC downward spread spectrum */
405
+ rockchip_combphy_updatel (priv , PHYREG32_SSC_MASK ,
406
+ PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT ,
407
+ PHYREG32 );
408
+
409
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> con0_for_pcie , true);
410
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> con1_for_pcie , true);
411
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> con2_for_pcie , true);
412
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> con3_for_pcie , true);
413
+ break ;
414
+ case PHY_TYPE_USB3 :
415
+ /* Set SSC downward spread spectrum */
416
+ rockchip_combphy_updatel (priv , PHYREG32_SSC_MASK ,
417
+ PHYREG32_SSC_DOWNWARD << PHYREG32_SSC_DIR_SHIFT ,
418
+ PHYREG32 );
419
+
420
+ /* Enable adaptive CTLE for USB3.0 Rx */
421
+ rockchip_combphy_updatel (priv , PHYREG15_CTLE_EN ,
422
+ PHYREG15_CTLE_EN , PHYREG15 );
423
+
424
+ /* Set PLL KVCO fine tuning signals */
425
+ rockchip_combphy_updatel (priv , PHYREG33_PLL_KVCO_MASK , BIT (3 ), PHYREG33 );
426
+
427
+ /* Set PLL LPF R1 to su_trim[10:7]=1001 */
428
+ writel (PHYREG12_PLL_LPF_ADJ_VALUE , priv -> mmio + PHYREG12 );
429
+
430
+ /* Set PLL input clock divider 1/2 */
431
+ val = FIELD_PREP (PHYREG6_PLL_DIV_MASK , PHYREG6_PLL_DIV_2 );
432
+ rockchip_combphy_updatel (priv , PHYREG6_PLL_DIV_MASK , val , PHYREG6 );
433
+
434
+ /* Set PLL loop divider */
435
+ writel (PHYREG18_PLL_LOOP , priv -> mmio + PHYREG18 );
436
+
437
+ /* Set PLL KVCO to min and set PLL charge pump current to max */
438
+ writel (PHYREG11_SU_TRIM_0_7 , priv -> mmio + PHYREG11 );
439
+
440
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_sel_usb , true);
441
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_txcomp_sel , false);
442
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_txelec_sel , false);
443
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> usb_mode_set , true);
444
+ break ;
445
+ default :
446
+ dev_err (priv -> dev , "incompatible PHY type\n" );
447
+ return - EINVAL ;
448
+ }
449
+
450
+ rate = clk_get_rate (priv -> refclk );
451
+
452
+ switch (rate ) {
453
+ case REF_CLOCK_24MHz :
454
+ if (priv -> type == PHY_TYPE_USB3 ) {
455
+ /* Set ssc_cnt[9:0]=0101111101 & 31.5KHz */
456
+ val = FIELD_PREP (PHYREG15_SSC_CNT_MASK , PHYREG15_SSC_CNT_VALUE );
457
+ rockchip_combphy_updatel (priv , PHYREG15_SSC_CNT_MASK ,
458
+ val , PHYREG15 );
459
+
460
+ writel (PHYREG16_SSC_CNT_VALUE , priv -> mmio + PHYREG16 );
461
+ }
462
+ break ;
463
+ case REF_CLOCK_25MHz :
464
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_clk_25m , true);
465
+ break ;
466
+ case REF_CLOCK_100MHz :
467
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_clk_100m , true);
468
+ if (priv -> type == PHY_TYPE_PCIE ) {
469
+ /* PLL KVCO tuning fine */
470
+ val = FIELD_PREP (PHYREG33_PLL_KVCO_MASK , PHYREG33_PLL_KVCO_VALUE );
471
+ rockchip_combphy_updatel (priv , PHYREG33_PLL_KVCO_MASK ,
472
+ val , PHYREG33 );
473
+
474
+ /* Enable controlling random jitter, aka RMJ */
475
+ writel (0x4 , priv -> mmio + PHYREG12 );
476
+
477
+ val = PHYREG6_PLL_DIV_2 << PHYREG6_PLL_DIV_SHIFT ;
478
+ rockchip_combphy_updatel (priv , PHYREG6_PLL_DIV_MASK ,
479
+ val , PHYREG6 );
480
+
481
+ writel (0x32 , priv -> mmio + PHYREG18 );
482
+ writel (0xf0 , priv -> mmio + PHYREG11 );
483
+ }
484
+ break ;
485
+ default :
486
+ dev_err (priv -> dev , "Unsupported rate: %lu\n" , rate );
487
+ return - EINVAL ;
488
+ }
489
+
490
+ if (priv -> ext_refclk ) {
491
+ rockchip_combphy_param_write (priv -> phy_grf , & cfg -> pipe_clk_ext , true);
492
+ if (priv -> type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz ) {
493
+ val = PHYREG13_RESISTER_HIGH_Z << PHYREG13_RESISTER_SHIFT ;
494
+ val |= PHYREG13_CKRCV_AMP0 ;
495
+ rockchip_combphy_updatel (priv , PHYREG13_RESISTER_MASK , val , PHYREG13 );
496
+
497
+ val = readl (priv -> mmio + PHYREG14 );
498
+ val |= PHYREG14_CKRCV_AMP1 ;
499
+ writel (val , priv -> mmio + PHYREG14 );
500
+ }
501
+ }
502
+
503
+ if (priv -> enable_ssc ) {
504
+ val = readl (priv -> mmio + PHYREG8 );
505
+ val |= PHYREG8_SSC_EN ;
506
+ writel (val , priv -> mmio + PHYREG8 );
507
+ }
508
+
509
+ return 0 ;
510
+ }
511
+
512
+ static const struct rockchip_combphy_grfcfg rk3562_combphy_grfcfgs = {
513
+ /* pipe-phy-grf */
514
+ .pcie_mode_set = { 0x0000 , 5 , 0 , 0x00 , 0x11 },
515
+ .usb_mode_set = { 0x0000 , 5 , 0 , 0x00 , 0x04 },
516
+ .pipe_rxterm_set = { 0x0000 , 12 , 12 , 0x00 , 0x01 },
517
+ .pipe_txelec_set = { 0x0004 , 1 , 1 , 0x00 , 0x01 },
518
+ .pipe_txcomp_set = { 0x0004 , 4 , 4 , 0x00 , 0x01 },
519
+ .pipe_clk_25m = { 0x0004 , 14 , 13 , 0x00 , 0x01 },
520
+ .pipe_clk_100m = { 0x0004 , 14 , 13 , 0x00 , 0x02 },
521
+ .pipe_phymode_sel = { 0x0008 , 1 , 1 , 0x00 , 0x01 },
522
+ .pipe_rate_sel = { 0x0008 , 2 , 2 , 0x00 , 0x01 },
523
+ .pipe_rxterm_sel = { 0x0008 , 8 , 8 , 0x00 , 0x01 },
524
+ .pipe_txelec_sel = { 0x0008 , 12 , 12 , 0x00 , 0x01 },
525
+ .pipe_txcomp_sel = { 0x0008 , 15 , 15 , 0x00 , 0x01 },
526
+ .pipe_clk_ext = { 0x000c , 9 , 8 , 0x02 , 0x01 },
527
+ .pipe_sel_usb = { 0x000c , 14 , 13 , 0x00 , 0x01 },
528
+ .pipe_phy_status = { 0x0034 , 6 , 6 , 0x01 , 0x00 },
529
+ .con0_for_pcie = { 0x0000 , 15 , 0 , 0x00 , 0x1000 },
530
+ .con1_for_pcie = { 0x0004 , 15 , 0 , 0x00 , 0x0000 },
531
+ .con2_for_pcie = { 0x0008 , 15 , 0 , 0x00 , 0x0101 },
532
+ .con3_for_pcie = { 0x000c , 15 , 0 , 0x00 , 0x0200 },
533
+ };
534
+
535
+ static const struct rockchip_combphy_cfg rk3562_combphy_cfgs = {
536
+ .num_phys = 1 ,
537
+ .phy_ids = {
538
+ 0xff750000
539
+ },
540
+ .grfcfg = & rk3562_combphy_grfcfgs ,
541
+ .combphy_cfg = rk3562_combphy_cfg ,
542
+ };
543
+
396
544
static int rk3568_combphy_cfg (struct rockchip_combphy_priv * priv )
397
545
{
398
546
const struct rockchip_combphy_grfcfg * cfg = priv -> cfg -> grfcfg ;
@@ -1046,6 +1194,10 @@ static const struct rockchip_combphy_cfg rk3588_combphy_cfgs = {
1046
1194
};
1047
1195
1048
1196
static const struct of_device_id rockchip_combphy_of_match [] = {
1197
+ {
1198
+ .compatible = "rockchip,rk3562-naneng-combphy" ,
1199
+ .data = & rk3562_combphy_cfgs ,
1200
+ },
1049
1201
{
1050
1202
.compatible = "rockchip,rk3568-naneng-combphy" ,
1051
1203
.data = & rk3568_combphy_cfgs ,
0 commit comments