|
26 | 26 | #define MII_DP83867_MICR 0x12
|
27 | 27 | #define MII_DP83867_ISR 0x13
|
28 | 28 | #define DP83867_CFG2 0x14
|
| 29 | +#define DP83867_LEDCR1 0x18 |
| 30 | +#define DP83867_LEDCR2 0x19 |
29 | 31 | #define DP83867_CFG3 0x1e
|
30 | 32 | #define DP83867_CTRL 0x1f
|
31 | 33 |
|
|
150 | 152 | /* FLD_THR_CFG */
|
151 | 153 | #define DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK 0x7
|
152 | 154 |
|
| 155 | +#define DP83867_LED_COUNT 4 |
| 156 | + |
| 157 | +/* LED_DRV bits */ |
| 158 | +#define DP83867_LED_DRV_EN(x) BIT((x) * 4) |
| 159 | +#define DP83867_LED_DRV_VAL(x) BIT((x) * 4 + 1) |
| 160 | + |
153 | 161 | enum {
|
154 | 162 | DP83867_PORT_MIRROING_KEEP,
|
155 | 163 | DP83867_PORT_MIRROING_EN,
|
@@ -969,6 +977,27 @@ static int dp83867_loopback(struct phy_device *phydev, bool enable)
|
969 | 977 | enable ? BMCR_LOOPBACK : 0);
|
970 | 978 | }
|
971 | 979 |
|
| 980 | +static int |
| 981 | +dp83867_led_brightness_set(struct phy_device *phydev, |
| 982 | + u8 index, enum led_brightness brightness) |
| 983 | +{ |
| 984 | + u32 val; |
| 985 | + |
| 986 | + if (index >= DP83867_LED_COUNT) |
| 987 | + return -EINVAL; |
| 988 | + |
| 989 | + /* DRV_EN==1: output is DRV_VAL */ |
| 990 | + val = DP83867_LED_DRV_EN(index); |
| 991 | + |
| 992 | + if (brightness) |
| 993 | + val |= DP83867_LED_DRV_VAL(index); |
| 994 | + |
| 995 | + return phy_modify(phydev, DP83867_LEDCR2, |
| 996 | + DP83867_LED_DRV_VAL(index) | |
| 997 | + DP83867_LED_DRV_EN(index), |
| 998 | + val); |
| 999 | +} |
| 1000 | + |
972 | 1001 | static struct phy_driver dp83867_driver[] = {
|
973 | 1002 | {
|
974 | 1003 | .phy_id = DP83867_PHY_ID,
|
@@ -996,6 +1025,8 @@ static struct phy_driver dp83867_driver[] = {
|
996 | 1025 |
|
997 | 1026 | .link_change_notify = dp83867_link_change_notify,
|
998 | 1027 | .set_loopback = dp83867_loopback,
|
| 1028 | + |
| 1029 | + .led_brightness_set = dp83867_led_brightness_set, |
999 | 1030 | },
|
1000 | 1031 | };
|
1001 | 1032 | module_phy_driver(dp83867_driver);
|
|
0 commit comments