diff options
Diffstat (limited to 'drivers/net/phy/marvell.c')
| -rw-r--r-- | drivers/net/phy/marvell.c | 83 | 
1 files changed, 77 insertions, 6 deletions
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 63a3644d86c9..43b6cb725551 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -144,11 +144,15 @@  /* WOL Event Interrupt Enable */  #define MII_88E1318S_PHY_CSIER_WOL_EIE			BIT(7) -/* LED Timer Control Register */ -#define MII_88E1318S_PHY_LED_TCR			0x12 -#define MII_88E1318S_PHY_LED_TCR_FORCE_INT		BIT(15) -#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE		BIT(7) -#define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW		BIT(11) +#define MII_88E1318S_PHY_LED_FUNC		0x10 +#define MII_88E1318S_PHY_LED_FUNC_OFF		(0x8) +#define MII_88E1318S_PHY_LED_FUNC_ON		(0x9) +#define MII_88E1318S_PHY_LED_FUNC_HI_Z		(0xa) +#define MII_88E1318S_PHY_LED_FUNC_BLINK		(0xb) +#define MII_88E1318S_PHY_LED_TCR		0x12 +#define MII_88E1318S_PHY_LED_TCR_FORCE_INT	BIT(15) +#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE	BIT(7) +#define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW	BIT(11)  /* Magic Packet MAC address registers */  #define MII_88E1318S_PHY_MAGIC_PACKET_WORD2		0x17 @@ -2735,7 +2739,7 @@ static const struct hwmon_channel_info marvell_hwmon_temp = {  	.config = marvell_hwmon_temp_config,  }; -static const struct hwmon_channel_info *marvell_hwmon_info[] = { +static const struct hwmon_channel_info * const marvell_hwmon_info[] = {  	&marvell_hwmon_chip,  	&marvell_hwmon_temp,  	NULL @@ -2832,6 +2836,63 @@ static int marvell_hwmon_probe(struct phy_device *phydev)  }  #endif +static int m88e1318_led_brightness_set(struct phy_device *phydev, +				       u8 index, enum led_brightness value) +{ +	int reg; + +	reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE, +			     MII_88E1318S_PHY_LED_FUNC); +	if (reg < 0) +		return reg; + +	switch (index) { +	case 0: +	case 1: +	case 2: +		reg &= ~(0xf << (4 * index)); +		if (value == LED_OFF) +			reg |= MII_88E1318S_PHY_LED_FUNC_OFF << (4 * index); +		else +			reg |= MII_88E1318S_PHY_LED_FUNC_ON << (4 * index); +		break; +	default: +		return -EINVAL; +	} + +	return phy_write_paged(phydev, MII_MARVELL_LED_PAGE, +			       MII_88E1318S_PHY_LED_FUNC, reg); +} + +static int m88e1318_led_blink_set(struct phy_device *phydev, u8 index, +				  unsigned long *delay_on, +				  unsigned long *delay_off) +{ +	int reg; + +	reg = phy_read_paged(phydev, MII_MARVELL_LED_PAGE, +			     MII_88E1318S_PHY_LED_FUNC); +	if (reg < 0) +		return reg; + +	switch (index) { +	case 0: +	case 1: +	case 2: +		reg &= ~(0xf << (4 * index)); +		reg |= MII_88E1318S_PHY_LED_FUNC_BLINK << (4 * index); +		/* Reset default is 84ms */ +		*delay_on = 84 / 2; +		*delay_off = 84 / 2; +		break; +	default: +		return -EINVAL; +	} + +	return phy_write_paged(phydev, MII_MARVELL_LED_PAGE, +			       MII_88E1318S_PHY_LED_FUNC, reg); +} +  static int marvell_probe(struct phy_device *phydev)  {  	struct marvell_priv *priv; @@ -3081,6 +3142,8 @@ static struct phy_driver marvell_drivers[] = {  		.get_sset_count = marvell_get_sset_count,  		.get_strings = marvell_get_strings,  		.get_stats = marvell_get_stats, +		.led_brightness_set = m88e1318_led_brightness_set, +		.led_blink_set = m88e1318_led_blink_set,  	},  	{  		.phy_id = MARVELL_PHY_ID_88E1145, @@ -3187,6 +3250,8 @@ static struct phy_driver marvell_drivers[] = {  		.cable_test_start = marvell_vct7_cable_test_start,  		.cable_test_tdr_start = marvell_vct5_cable_test_tdr_start,  		.cable_test_get_status = marvell_vct7_cable_test_get_status, +		.led_brightness_set = m88e1318_led_brightness_set, +		.led_blink_set = m88e1318_led_blink_set,  	},  	{  		.phy_id = MARVELL_PHY_ID_88E1540, @@ -3213,6 +3278,8 @@ static struct phy_driver marvell_drivers[] = {  		.cable_test_start = marvell_vct7_cable_test_start,  		.cable_test_tdr_start = marvell_vct5_cable_test_tdr_start,  		.cable_test_get_status = marvell_vct7_cable_test_get_status, +		.led_brightness_set = m88e1318_led_brightness_set, +		.led_blink_set = m88e1318_led_blink_set,  	},  	{  		.phy_id = MARVELL_PHY_ID_88E1545, @@ -3239,6 +3306,8 @@ static struct phy_driver marvell_drivers[] = {  		.cable_test_start = marvell_vct7_cable_test_start,  		.cable_test_tdr_start = marvell_vct5_cable_test_tdr_start,  		.cable_test_get_status = marvell_vct7_cable_test_get_status, +		.led_brightness_set = m88e1318_led_brightness_set, +		.led_blink_set = m88e1318_led_blink_set,  	},  	{  		.phy_id = MARVELL_PHY_ID_88E3016, @@ -3380,6 +3449,8 @@ static struct phy_driver marvell_drivers[] = {  		.get_stats = marvell_get_stats,  		.get_tunable = m88e1540_get_tunable,  		.set_tunable = m88e1540_set_tunable, +		.led_brightness_set = m88e1318_led_brightness_set, +		.led_blink_set = m88e1318_led_blink_set,  	},  };  |