70
70
#define RTLGEN_SPEED_MASK 0x0630
71
71
72
72
#define RTL_GENERIC_PHYID 0x001cc800
73
+ #define RTL_8211FVD_PHYID 0x001cc878
73
74
74
75
MODULE_DESCRIPTION ("Realtek PHY driver" );
75
76
MODULE_AUTHOR ("Johnson Leung" );
@@ -78,6 +79,7 @@ MODULE_LICENSE("GPL");
78
79
struct rtl821x_priv {
79
80
u16 phycr1 ;
80
81
u16 phycr2 ;
82
+ bool has_phycr2 ;
81
83
};
82
84
83
85
static int rtl821x_read_page (struct phy_device * phydev )
@@ -94,6 +96,7 @@ static int rtl821x_probe(struct phy_device *phydev)
94
96
{
95
97
struct device * dev = & phydev -> mdio .dev ;
96
98
struct rtl821x_priv * priv ;
99
+ u32 phy_id = phydev -> drv -> phy_id ;
97
100
int ret ;
98
101
99
102
priv = devm_kzalloc (dev , sizeof (* priv ), GFP_KERNEL );
@@ -108,13 +111,16 @@ static int rtl821x_probe(struct phy_device *phydev)
108
111
if (of_property_read_bool (dev -> of_node , "realtek,aldps-enable" ))
109
112
priv -> phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF ;
110
113
111
- ret = phy_read_paged (phydev , 0xa43 , RTL8211F_PHYCR2 );
112
- if (ret < 0 )
113
- return ret ;
114
+ priv -> has_phycr2 = !(phy_id == RTL_8211FVD_PHYID );
115
+ if (priv -> has_phycr2 ) {
116
+ ret = phy_read_paged (phydev , 0xa43 , RTL8211F_PHYCR2 );
117
+ if (ret < 0 )
118
+ return ret ;
114
119
115
- priv -> phycr2 = ret & RTL8211F_CLKOUT_EN ;
116
- if (of_property_read_bool (dev -> of_node , "realtek,clkout-disable" ))
117
- priv -> phycr2 &= ~RTL8211F_CLKOUT_EN ;
120
+ priv -> phycr2 = ret & RTL8211F_CLKOUT_EN ;
121
+ if (of_property_read_bool (dev -> of_node , "realtek,clkout-disable" ))
122
+ priv -> phycr2 &= ~RTL8211F_CLKOUT_EN ;
123
+ }
118
124
119
125
phydev -> priv = priv ;
120
126
@@ -400,12 +406,14 @@ static int rtl8211f_config_init(struct phy_device *phydev)
400
406
val_rxdly ? "enabled" : "disabled" );
401
407
}
402
408
403
- ret = phy_modify_paged (phydev , 0xa43 , RTL8211F_PHYCR2 ,
404
- RTL8211F_CLKOUT_EN , priv -> phycr2 );
405
- if (ret < 0 ) {
406
- dev_err (dev , "clkout configuration failed: %pe\n" ,
407
- ERR_PTR (ret ));
408
- return ret ;
409
+ if (priv -> has_phycr2 ) {
410
+ ret = phy_modify_paged (phydev , 0xa43 , RTL8211F_PHYCR2 ,
411
+ RTL8211F_CLKOUT_EN , priv -> phycr2 );
412
+ if (ret < 0 ) {
413
+ dev_err (dev , "clkout configuration failed: %pe\n" ,
414
+ ERR_PTR (ret ));
415
+ return ret ;
416
+ }
409
417
}
410
418
411
419
return genphy_soft_reset (phydev );
@@ -923,6 +931,18 @@ static struct phy_driver realtek_drvs[] = {
923
931
.resume = rtl821x_resume ,
924
932
.read_page = rtl821x_read_page ,
925
933
.write_page = rtl821x_write_page ,
934
+ }, {
935
+ PHY_ID_MATCH_EXACT (RTL_8211FVD_PHYID ),
936
+ .name = "RTL8211F-VD Gigabit Ethernet" ,
937
+ .probe = rtl821x_probe ,
938
+ .config_init = & rtl8211f_config_init ,
939
+ .read_status = rtlgen_read_status ,
940
+ .config_intr = & rtl8211f_config_intr ,
941
+ .handle_interrupt = rtl8211f_handle_interrupt ,
942
+ .suspend = genphy_suspend ,
943
+ .resume = rtl821x_resume ,
944
+ .read_page = rtl821x_read_page ,
945
+ .write_page = rtl821x_write_page ,
926
946
}, {
927
947
.name = "Generic FE-GE Realtek PHY" ,
928
948
.match_phy_device = rtlgen_match_phy_device ,
0 commit comments