diff options
-rw-r--r-- | drivers/net/phy/micrel.c | 24 | ||||
-rw-r--r-- | include/linux/micrel_phy.h | 16 |
2 files changed, 32 insertions, 8 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 0fd1678bc5a9..590f902deb6b 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -19,13 +19,7 @@ | |||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/phy.h> | 21 | #include <linux/phy.h> |
22 | 22 | #include <linux/micrel_phy.h> | |
23 | #define PHY_ID_KSZ9021 0x00221611 | ||
24 | #define PHY_ID_KS8737 0x00221720 | ||
25 | #define PHY_ID_KS8041 0x00221510 | ||
26 | #define PHY_ID_KS8051 0x00221550 | ||
27 | /* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */ | ||
28 | #define PHY_ID_KS8001 0x0022161A | ||
29 | 23 | ||
30 | /* general Interrupt control/status reg in vendor specific block. */ | 24 | /* general Interrupt control/status reg in vendor specific block. */ |
31 | #define MII_KSZPHY_INTCS 0x1B | 25 | #define MII_KSZPHY_INTCS 0x1B |
@@ -46,6 +40,7 @@ | |||
46 | #define KSZPHY_CTRL_INT_ACTIVE_HIGH (1 << 9) | 40 | #define KSZPHY_CTRL_INT_ACTIVE_HIGH (1 << 9) |
47 | #define KSZ9021_CTRL_INT_ACTIVE_HIGH (1 << 14) | 41 | #define KSZ9021_CTRL_INT_ACTIVE_HIGH (1 << 14) |
48 | #define KS8737_CTRL_INT_ACTIVE_HIGH (1 << 14) | 42 | #define KS8737_CTRL_INT_ACTIVE_HIGH (1 << 14) |
43 | #define KSZ8051_RMII_50MHZ_CLK (1 << 7) | ||
49 | 44 | ||
50 | static int kszphy_ack_interrupt(struct phy_device *phydev) | 45 | static int kszphy_ack_interrupt(struct phy_device *phydev) |
51 | { | 46 | { |
@@ -106,6 +101,19 @@ static int kszphy_config_init(struct phy_device *phydev) | |||
106 | return 0; | 101 | return 0; |
107 | } | 102 | } |
108 | 103 | ||
104 | static int ks8051_config_init(struct phy_device *phydev) | ||
105 | { | ||
106 | int regval; | ||
107 | |||
108 | if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { | ||
109 | regval = phy_read(phydev, MII_KSZPHY_CTRL); | ||
110 | regval |= KSZ8051_RMII_50MHZ_CLK; | ||
111 | phy_write(phydev, MII_KSZPHY_CTRL, regval); | ||
112 | } | ||
113 | |||
114 | return 0; | ||
115 | } | ||
116 | |||
109 | static struct phy_driver ks8737_driver = { | 117 | static struct phy_driver ks8737_driver = { |
110 | .phy_id = PHY_ID_KS8737, | 118 | .phy_id = PHY_ID_KS8737, |
111 | .phy_id_mask = 0x00fffff0, | 119 | .phy_id_mask = 0x00fffff0, |
@@ -142,7 +150,7 @@ static struct phy_driver ks8051_driver = { | |||
142 | .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | 150 | .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
143 | | SUPPORTED_Asym_Pause), | 151 | | SUPPORTED_Asym_Pause), |
144 | .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, | 152 | .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
145 | .config_init = kszphy_config_init, | 153 | .config_init = ks8051_config_init, |
146 | .config_aneg = genphy_config_aneg, | 154 | .config_aneg = genphy_config_aneg, |
147 | .read_status = genphy_read_status, | 155 | .read_status = genphy_read_status, |
148 | .ack_interrupt = kszphy_ack_interrupt, | 156 | .ack_interrupt = kszphy_ack_interrupt, |
diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h new file mode 100644 index 000000000000..dd8da342a991 --- /dev/null +++ b/include/linux/micrel_phy.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _MICREL_PHY_H | ||
2 | #define _MICREL_PHY_H | ||
3 | |||
4 | #define MICREL_PHY_ID_MASK 0x00fffff0 | ||
5 | |||
6 | #define PHY_ID_KSZ9021 0x00221611 | ||
7 | #define PHY_ID_KS8737 0x00221720 | ||
8 | #define PHY_ID_KS8041 0x00221510 | ||
9 | #define PHY_ID_KS8051 0x00221550 | ||
10 | /* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */ | ||
11 | #define PHY_ID_KS8001 0x0022161A | ||
12 | |||
13 | /* struct phy_device dev_flags definitions */ | ||
14 | #define MICREL_PHY_50MHZ_CLK 0x00000001 | ||
15 | |||
16 | #endif /* _MICREL_PHY_H */ | ||