diff options
author | Jongsung Kim <neidhard.kim@lge.com> | 2014-06-09 23:50:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-11 18:17:27 -0400 |
commit | 71b9c4a8388f596b603a72c32404b39fe0f62588 (patch) | |
tree | 92a7a6a1f8d102255a503873a002d8a35c0c4b6e | |
parent | 1b72a0fc9c308d9f3255c177945cf383c3c82b0e (diff) |
net: phy: realtek: register/unregister multiple drivers properly
Using phy_drivers_register/_unregister functions is proper way to
handle multiple PHY drivers registration. For Realtek PHY drivers
module, it fixes incomplete current error-handlings up and adds
missed unregistration for the RTL8201CP driver.
Signed-off-by: Jongsung Kim <neidhard.kim@lge.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/phy/realtek.c | 88 |
1 files changed, 37 insertions, 51 deletions
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index fa1d69a38ccf..45483fdfbe06 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c | |||
@@ -64,65 +64,51 @@ static int rtl8211e_config_intr(struct phy_device *phydev) | |||
64 | return err; | 64 | return err; |
65 | } | 65 | } |
66 | 66 | ||
67 | /* RTL8201CP */ | 67 | static struct phy_driver realtek_drvs[] = { |
68 | static struct phy_driver rtl8201cp_driver = { | 68 | { |
69 | .phy_id = 0x00008201, | 69 | .phy_id = 0x00008201, |
70 | .name = "RTL8201CP Ethernet", | 70 | .name = "RTL8201CP Ethernet", |
71 | .phy_id_mask = 0x0000ffff, | 71 | .phy_id_mask = 0x0000ffff, |
72 | .features = PHY_BASIC_FEATURES, | 72 | .features = PHY_BASIC_FEATURES, |
73 | .flags = PHY_HAS_INTERRUPT, | 73 | .flags = PHY_HAS_INTERRUPT, |
74 | .config_aneg = &genphy_config_aneg, | 74 | .config_aneg = &genphy_config_aneg, |
75 | .read_status = &genphy_read_status, | 75 | .read_status = &genphy_read_status, |
76 | .driver = { .owner = THIS_MODULE,}, | 76 | .driver = { .owner = THIS_MODULE,}, |
77 | }; | 77 | }, { |
78 | 78 | .phy_id = 0x001cc912, | |
79 | /* RTL8211B */ | 79 | .name = "RTL8211B Gigabit Ethernet", |
80 | static struct phy_driver rtl8211b_driver = { | 80 | .phy_id_mask = 0x001fffff, |
81 | .phy_id = 0x001cc912, | 81 | .features = PHY_GBIT_FEATURES, |
82 | .name = "RTL8211B Gigabit Ethernet", | 82 | .flags = PHY_HAS_INTERRUPT, |
83 | .phy_id_mask = 0x001fffff, | 83 | .config_aneg = &genphy_config_aneg, |
84 | .features = PHY_GBIT_FEATURES, | 84 | .read_status = &genphy_read_status, |
85 | .flags = PHY_HAS_INTERRUPT, | 85 | .ack_interrupt = &rtl821x_ack_interrupt, |
86 | .config_aneg = &genphy_config_aneg, | 86 | .config_intr = &rtl8211b_config_intr, |
87 | .read_status = &genphy_read_status, | 87 | .driver = { .owner = THIS_MODULE,}, |
88 | .ack_interrupt = &rtl821x_ack_interrupt, | 88 | }, { |
89 | .config_intr = &rtl8211b_config_intr, | 89 | .phy_id = 0x001cc915, |
90 | .driver = { .owner = THIS_MODULE,}, | 90 | .name = "RTL8211E Gigabit Ethernet", |
91 | }; | 91 | .phy_id_mask = 0x001fffff, |
92 | 92 | .features = PHY_GBIT_FEATURES, | |
93 | /* RTL8211E */ | 93 | .flags = PHY_HAS_INTERRUPT, |
94 | static struct phy_driver rtl8211e_driver = { | 94 | .config_aneg = &genphy_config_aneg, |
95 | .phy_id = 0x001cc915, | 95 | .read_status = &genphy_read_status, |
96 | .name = "RTL8211E Gigabit Ethernet", | 96 | .ack_interrupt = &rtl821x_ack_interrupt, |
97 | .phy_id_mask = 0x001fffff, | 97 | .config_intr = &rtl8211e_config_intr, |
98 | .features = PHY_GBIT_FEATURES, | 98 | .suspend = genphy_suspend, |
99 | .flags = PHY_HAS_INTERRUPT, | 99 | .resume = genphy_resume, |
100 | .config_aneg = &genphy_config_aneg, | 100 | .driver = { .owner = THIS_MODULE,}, |
101 | .read_status = &genphy_read_status, | 101 | }, |
102 | .ack_interrupt = &rtl821x_ack_interrupt, | ||
103 | .config_intr = &rtl8211e_config_intr, | ||
104 | .suspend = genphy_suspend, | ||
105 | .resume = genphy_resume, | ||
106 | .driver = { .owner = THIS_MODULE,}, | ||
107 | }; | 102 | }; |
108 | 103 | ||
109 | static int __init realtek_init(void) | 104 | static int __init realtek_init(void) |
110 | { | 105 | { |
111 | int ret; | 106 | return phy_drivers_register(realtek_drvs, ARRAY_SIZE(realtek_drvs)); |
112 | |||
113 | ret = phy_driver_register(&rtl8201cp_driver); | ||
114 | if (ret < 0) | ||
115 | return -ENODEV; | ||
116 | ret = phy_driver_register(&rtl8211b_driver); | ||
117 | if (ret < 0) | ||
118 | return -ENODEV; | ||
119 | return phy_driver_register(&rtl8211e_driver); | ||
120 | } | 107 | } |
121 | 108 | ||
122 | static void __exit realtek_exit(void) | 109 | static void __exit realtek_exit(void) |
123 | { | 110 | { |
124 | phy_driver_unregister(&rtl8211b_driver); | 111 | phy_drivers_unregister(realtek_drvs, ARRAY_SIZE(realtek_drvs)); |
125 | phy_driver_unregister(&rtl8211e_driver); | ||
126 | } | 112 | } |
127 | 113 | ||
128 | module_init(realtek_init); | 114 | module_init(realtek_init); |