Skip to content

Commit d606ef3

Browse files
baruchsiachdavem330
authored andcommitted
phy/micrel: add ability to support 50MHz RMII clock on KZS8051RNL
Platform code can now set the MICREL_PHY_50MHZ_CLK bit of dev_flags in a fixup routine (registered with phy_register_fixup_for_uid()), to make the KZS8051RNL PHY work with 50MHz RMII reference clock. Cc: David J. Choi <[email protected]> Signed-off-by: Baruch Siach <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 68aa3fd commit d606ef3

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

drivers/net/phy/micrel.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@
1919
#include <linux/kernel.h>
2020
#include <linux/module.h>
2121
#include <linux/phy.h>
22-
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
22+
#include <linux/micrel_phy.h>
2923

3024
/* general Interrupt control/status reg in vendor specific block. */
3125
#define MII_KSZPHY_INTCS 0x1B
@@ -46,6 +40,7 @@
4640
#define KSZPHY_CTRL_INT_ACTIVE_HIGH (1 << 9)
4741
#define KSZ9021_CTRL_INT_ACTIVE_HIGH (1 << 14)
4842
#define KS8737_CTRL_INT_ACTIVE_HIGH (1 << 14)
43+
#define KSZ8051_RMII_50MHZ_CLK (1 << 7)
4944

5045
static int kszphy_ack_interrupt(struct phy_device *phydev)
5146
{
@@ -106,6 +101,19 @@ static int kszphy_config_init(struct phy_device *phydev)
106101
return 0;
107102
}
108103

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+
109117
static struct phy_driver ks8737_driver = {
110118
.phy_id = PHY_ID_KS8737,
111119
.phy_id_mask = 0x00fffff0,
@@ -142,7 +150,7 @@ static struct phy_driver ks8051_driver = {
142150
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
143151
| SUPPORTED_Asym_Pause),
144152
.flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT,
145-
.config_init = kszphy_config_init,
153+
.config_init = ks8051_config_init,
146154
.config_aneg = genphy_config_aneg,
147155
.read_status = genphy_read_status,
148156
.ack_interrupt = kszphy_ack_interrupt,

include/linux/micrel_phy.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

0 commit comments

Comments
 (0)