net: dsa: microchip: ksz_common: add single led mode support for ksz9477
Signed-off-by: Heinrich Toews <ht@twx-software.de>
This commit is contained in:
@@ -447,6 +447,9 @@ static const u16 ksz9477_regs[] = {
|
||||
[S_MULTICAST_CTRL] = 0x0331,
|
||||
[P_XMII_CTRL_0] = 0x0300,
|
||||
[P_XMII_CTRL_1] = 0x0301,
|
||||
[P_PHY_MMD_SETUP] = 0x011A,
|
||||
[P_PHY_MMD_DATA] = 0x011C,
|
||||
[P_PHY_DIGITAL_DEBUG_3] = 0x013C,
|
||||
};
|
||||
|
||||
static const u32 ksz9477_masks[] = {
|
||||
@@ -2955,6 +2958,39 @@ static void ksz_set_gbit(struct ksz_device *dev, int port, bool gbit)
|
||||
ksz_pwrite8(dev, port, regs[P_XMII_CTRL_1], data8);
|
||||
}
|
||||
|
||||
static void ksz_enable_single_led_mode(struct ksz_device *dev, int port)
|
||||
{
|
||||
const u16 *regs = dev->info->regs;
|
||||
u16 data16;
|
||||
|
||||
dev_info(dev->dev, "port-%d: enable single-led mode.\n", port);
|
||||
|
||||
/* Set up register address for MMD */
|
||||
data16 = 0x0002;
|
||||
ksz_pwrite16(dev, port, regs[P_PHY_MMD_SETUP], data16);
|
||||
|
||||
/* Select Register 00h of MMD */
|
||||
data16 = 0x0000;
|
||||
ksz_pwrite16(dev, port, regs[P_PHY_MMD_DATA], data16);
|
||||
|
||||
/* Select register data for MMD */
|
||||
data16 = 0x4002;
|
||||
ksz_pwrite16(dev, port, regs[P_PHY_MMD_SETUP], data16);
|
||||
|
||||
/* Write value 0010h to MMD */
|
||||
data16 = 0x0011;
|
||||
ksz_pwrite16(dev, port, regs[P_PHY_MMD_DATA], data16);
|
||||
|
||||
/* Due to Errata Module 19 this workaround is needed to
|
||||
* enable single-led mode. It has also to be a 32bit
|
||||
* write.
|
||||
*/
|
||||
dev_info(dev->dev, "port-%d: applying errata (Module 19) " \
|
||||
"workaround.\n", port);
|
||||
data16 = 0xfa00;
|
||||
ksz_pwrite16(dev, port, regs[P_PHY_DIGITAL_DEBUG_3], data16);
|
||||
}
|
||||
|
||||
static void ksz_set_100_10mbit(struct ksz_device *dev, int port, int speed)
|
||||
{
|
||||
const u8 *bitval = dev->info->xmii_ctrl0;
|
||||
@@ -3020,6 +3056,9 @@ static void ksz9477_phylink_mac_link_up(struct ksz_device *dev, int port,
|
||||
{
|
||||
struct ksz_port *p;
|
||||
|
||||
if (dev->single_led_mode && port != dev->cpu_port)
|
||||
ksz_enable_single_led_mode(dev, port);
|
||||
|
||||
p = &dev->ports[port];
|
||||
|
||||
/* Internal PHYs */
|
||||
@@ -3744,6 +3783,8 @@ int ksz_switch_register(struct ksz_device *dev)
|
||||
ret = of_property_read_u8(dev->dev->of_node, "microchip,led-mode", &dev->led_mode);
|
||||
if (ret)
|
||||
dev->led_mode = 0;
|
||||
dev->single_led_mode = of_property_read_bool(dev->dev->of_node,
|
||||
"microchip,single-led-mode");
|
||||
}
|
||||
|
||||
ret = dsa_register_switch(dev->ds);
|
||||
|
||||
@@ -150,6 +150,7 @@ struct ksz_device {
|
||||
struct gpio_desc *reset_gpio; /* Optional reset GPIO */
|
||||
bool disable_internal_ldo; /* Disable internal 1.8V LDO */
|
||||
u8 led_mode;
|
||||
bool single_led_mode; /* Enable Single LED Mode */
|
||||
/* chip specific data */
|
||||
u32 chip_id;
|
||||
u8 chip_rev;
|
||||
@@ -232,6 +233,9 @@ enum ksz_regs {
|
||||
S_MULTICAST_CTRL,
|
||||
P_XMII_CTRL_0,
|
||||
P_XMII_CTRL_1,
|
||||
P_PHY_MMD_SETUP,
|
||||
P_PHY_MMD_DATA,
|
||||
P_PHY_DIGITAL_DEBUG_3,
|
||||
};
|
||||
|
||||
enum ksz_masks {
|
||||
|
||||
Reference in New Issue
Block a user