@@ -159,9 +159,9 @@ DEFINE_MUTEX(rtmdio_lock);
159159DEFINE_MUTEX (rtmdio_lock_sds );
160160
161161struct rtmdio_bus_priv {
162+ const struct rtmdio_config * cfg ;
162163 u16 id ;
163164 u16 family_id ;
164- int rawpage ;
165165 int cpu_port ;
166166 int page [RTMDIO_MAX_PORT ];
167167 bool raw [RTMDIO_MAX_PORT ];
@@ -179,6 +179,10 @@ struct rtmdio_bus_priv {
179179 int (* write_sds_phy )(int sds , int page , int regnum , u16 val );
180180};
181181
182+ struct rtmdio_config {
183+ int raw_page ;
184+ };
185+
182186/* SerDes reader/writer functions for the ports without external phy. */
183187
184188/*
@@ -1150,10 +1154,10 @@ static int rtmdio_read(struct mii_bus *bus, int addr, int regnum)
11501154 if (addr >= priv -> cpu_port )
11511155 return - ENODEV ;
11521156
1153- if (regnum == RTMDIO_PAGE_SELECT && priv -> page [addr ] != priv -> rawpage )
1157+ if (regnum == RTMDIO_PAGE_SELECT && priv -> page [addr ] != priv -> cfg -> raw_page )
11541158 return priv -> page [addr ];
11551159
1156- priv -> raw [addr ] = (priv -> page [addr ] == priv -> rawpage );
1160+ priv -> raw [addr ] = (priv -> page [addr ] == priv -> cfg -> raw_page );
11571161 if ((priv -> phy_is_internal [addr ]) && (priv -> sds_id [addr ] >= 0 ))
11581162 return rtmdio_read_sds_phy (priv , priv -> sds_id [addr ],
11591163 priv -> page [addr ], regnum );
@@ -1191,8 +1195,8 @@ static int rtmdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
11911195 if (regnum == RTMDIO_PAGE_SELECT )
11921196 priv -> page [addr ] = val ;
11931197
1194- if (!priv -> raw [addr ] && (regnum != RTMDIO_PAGE_SELECT || page == priv -> rawpage )) {
1195- priv -> raw [addr ] = (page == priv -> rawpage );
1198+ if (!priv -> raw [addr ] && (regnum != RTMDIO_PAGE_SELECT || page == priv -> cfg -> raw_page )) {
1199+ priv -> raw [addr ] = (page == priv -> cfg -> raw_page );
11961200 if (priv -> phy_is_internal [addr ] && priv -> sds_id [addr ] >= 0 )
11971201 return rtmdio_write_sds_phy (priv , priv -> sds_id [addr ],
11981202 priv -> page [addr ], regnum , val );
@@ -1446,6 +1450,8 @@ static int rtmdio_probe(struct platform_device *pdev)
14461450 priv -> raw [i ] = false;
14471451 }
14481452
1453+ priv -> cfg = (const struct rtmdio_config * )device_get_match_data (dev );
1454+
14491455 switch (family ) {
14501456 case RTMDIO_838X_FAMILY_ID :
14511457 bus -> name = "rtl838x-eth-mdio" ;
@@ -1459,7 +1465,6 @@ static int rtmdio_probe(struct platform_device *pdev)
14591465 priv -> read_phy = rtmdio_838x_read_phy ;
14601466 priv -> write_phy = rtmdio_838x_write_phy ;
14611467 priv -> cpu_port = RTMDIO_838X_CPU_PORT ;
1462- priv -> rawpage = 0xfff ;
14631468 break ;
14641469 case RTMDIO_839X_FAMILY_ID :
14651470 bus -> name = "rtl839x-eth-mdio" ;
@@ -1473,7 +1478,6 @@ static int rtmdio_probe(struct platform_device *pdev)
14731478 priv -> read_phy = rtmdio_839x_read_phy ;
14741479 priv -> write_phy = rtmdio_839x_write_phy ;
14751480 priv -> cpu_port = RTMDIO_839X_CPU_PORT ;
1476- priv -> rawpage = 0x1fff ;
14771481 break ;
14781482 case RTMDIO_930X_FAMILY_ID :
14791483 bus -> name = "rtl930x-eth-mdio" ;
@@ -1487,7 +1491,6 @@ static int rtmdio_probe(struct platform_device *pdev)
14871491 priv -> read_phy = rtmdio_930x_read_phy ;
14881492 priv -> write_phy = rtmdio_930x_write_phy ;
14891493 priv -> cpu_port = RTMDIO_930X_CPU_PORT ;
1490- priv -> rawpage = 0xfff ;
14911494 break ;
14921495 case RTMDIO_931X_FAMILY_ID :
14931496 bus -> name = "rtl931x-eth-mdio" ;
@@ -1501,7 +1504,6 @@ static int rtmdio_probe(struct platform_device *pdev)
15011504 priv -> read_phy = rtmdio_931x_read_phy ;
15021505 priv -> write_phy = rtmdio_931x_write_phy ;
15031506 priv -> cpu_port = RTMDIO_931X_CPU_PORT ;
1504- priv -> rawpage = 0x1fff ;
15051507 break ;
15061508 }
15071509 bus -> read_c45 = rtmdio_read_c45 ;
@@ -1576,12 +1578,40 @@ static int rtmdio_probe(struct platform_device *pdev)
15761578 return devm_of_mdiobus_register (dev , bus , mii_np );
15771579}
15781580
1581+ static const struct rtmdio_config rtmdio_838x_cfg = {
1582+ .raw_page = 4095 ,
1583+ };
1584+
1585+ static const struct rtmdio_config rtmdio_839x_cfg = {
1586+ .raw_page = 8191 ,
1587+ };
1588+
1589+ static const struct rtmdio_config rtmdio_930x_cfg = {
1590+ .raw_page = 4095 ,
1591+ };
1592+
1593+ static const struct rtmdio_config rtmdio_931x_cfg = {
1594+ .raw_page = 8191 ,
1595+ };
1596+
15791597static const struct of_device_id rtmdio_ids [] = {
1580- { .compatible = "realtek,rtl8380-mdio" },
1581- { .compatible = "realtek,rtl8392-mdio" },
1582- { .compatible = "realtek,rtl9301-mdio" },
1583- { .compatible = "realtek,rtl9311-mdio" },
1584- {}
1598+ {
1599+ .compatible = "realtek,rtl8380-mdio" ,
1600+ .data = & rtmdio_838x_cfg ,
1601+ },
1602+ {
1603+ .compatible = "realtek,rtl8392-mdio" ,
1604+ .data = & rtmdio_839x_cfg ,
1605+ },
1606+ {
1607+ .compatible = "realtek,rtl9301-mdio" ,
1608+ .data = & rtmdio_930x_cfg ,
1609+ },
1610+ {
1611+ .compatible = "realtek,rtl9311-mdio" ,
1612+ .data = & rtmdio_931x_cfg ,
1613+ },
1614+ { /* sentinel */ }
15851615};
15861616MODULE_DEVICE_TABLE (of , rtmdio_ids );
15871617
0 commit comments