aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiuseppe CAVALLARO <peppe.cavallaro@st.com>2013-01-22 19:30:03 -0500
committerDavid S. Miller <davem@davemloft.net>2013-01-28 18:34:53 -0500
commitef3d90491a15f0d5cf1ec39a38a45dac6968fb2a (patch)
treed0c2e75577e410b2e282d3d5acd474f13e03c559
parent556e6256c813063b95a9f4e55109f77c1a7d3fdd (diff)
net: phy: realtek: add rtl8211e driver
This patch adds the minimal driver to manage the Realtek RTL8211E 10/100/1000 Transceivers. Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/realtek.c50
1 files changed, 44 insertions, 6 deletions
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 72f93470ea35..8e7af8354342 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -23,6 +23,8 @@
23#define RTL821x_INER_INIT 0x6400 23#define RTL821x_INER_INIT 0x6400
24#define RTL821x_INSR 0x13 24#define RTL821x_INSR 0x13
25 25
26#define RTL8211E_INER_LINK_STAT 0x10
27
26MODULE_DESCRIPTION("Realtek PHY driver"); 28MODULE_DESCRIPTION("Realtek PHY driver");
27MODULE_AUTHOR("Johnson Leung"); 29MODULE_AUTHOR("Johnson Leung");
28MODULE_LICENSE("GPL"); 30MODULE_LICENSE("GPL");
@@ -36,7 +38,7 @@ static int rtl821x_ack_interrupt(struct phy_device *phydev)
36 return (err < 0) ? err : 0; 38 return (err < 0) ? err : 0;
37} 39}
38 40
39static int rtl821x_config_intr(struct phy_device *phydev) 41static int rtl8211b_config_intr(struct phy_device *phydev)
40{ 42{
41 int err; 43 int err;
42 44
@@ -49,28 +51,63 @@ static int rtl821x_config_intr(struct phy_device *phydev)
49 return err; 51 return err;
50} 52}
51 53
54static int rtl8211e_config_intr(struct phy_device *phydev)
55{
56 int err;
57
58 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
59 err = phy_write(phydev, RTL821x_INER,
60 RTL8211E_INER_LINK_STAT);
61 else
62 err = phy_write(phydev, RTL821x_INER, 0);
63
64 return err;
65}
66
52/* RTL8211B */ 67/* RTL8211B */
53static struct phy_driver rtl821x_driver = { 68static struct phy_driver rtl8211b_driver = {
54 .phy_id = 0x001cc912, 69 .phy_id = 0x001cc912,
55 .name = "RTL821x Gigabit Ethernet", 70 .name = "RTL8211B Gigabit Ethernet",
56 .phy_id_mask = 0x001fffff, 71 .phy_id_mask = 0x001fffff,
57 .features = PHY_GBIT_FEATURES, 72 .features = PHY_GBIT_FEATURES,
58 .flags = PHY_HAS_INTERRUPT, 73 .flags = PHY_HAS_INTERRUPT,
59 .config_aneg = &genphy_config_aneg, 74 .config_aneg = &genphy_config_aneg,
60 .read_status = &genphy_read_status, 75 .read_status = &genphy_read_status,
61 .ack_interrupt = &rtl821x_ack_interrupt, 76 .ack_interrupt = &rtl821x_ack_interrupt,
62 .config_intr = &rtl821x_config_intr, 77 .config_intr = &rtl8211b_config_intr,
78 .driver = { .owner = THIS_MODULE,},
79};
80
81/* RTL8211E */
82static struct phy_driver rtl8211e_driver = {
83 .phy_id = 0x001cc915,
84 .name = "RTL8211E Gigabit Ethernet",
85 .phy_id_mask = 0x001fffff,
86 .features = PHY_GBIT_FEATURES,
87 .flags = PHY_HAS_INTERRUPT,
88 .config_aneg = &genphy_config_aneg,
89 .read_status = &genphy_read_status,
90 .ack_interrupt = &rtl821x_ack_interrupt,
91 .config_intr = &rtl8211e_config_intr,
92 .suspend = genphy_suspend,
93 .resume = genphy_resume,
63 .driver = { .owner = THIS_MODULE,}, 94 .driver = { .owner = THIS_MODULE,},
64}; 95};
65 96
66static int __init realtek_init(void) 97static int __init realtek_init(void)
67{ 98{
68 return phy_driver_register(&rtl821x_driver); 99 int ret;
100
101 ret = phy_driver_register(&rtl8211b_driver);
102 if (ret < 0)
103 return -ENODEV;
104 return phy_driver_register(&rtl8211e_driver);
69} 105}
70 106
71static void __exit realtek_exit(void) 107static void __exit realtek_exit(void)
72{ 108{
73 phy_driver_unregister(&rtl821x_driver); 109 phy_driver_unregister(&rtl8211b_driver);
110 phy_driver_unregister(&rtl8211e_driver);
74} 111}
75 112
76module_init(realtek_init); 113module_init(realtek_init);
@@ -78,6 +115,7 @@ module_exit(realtek_exit);
78 115
79static struct mdio_device_id __maybe_unused realtek_tbl[] = { 116static struct mdio_device_id __maybe_unused realtek_tbl[] = {
80 { 0x001cc912, 0x001fffff }, 117 { 0x001cc912, 0x001fffff },
118 { 0x001cc915, 0x001fffff },
81 { } 119 { }
82}; 120};
83 121