Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ff1c259 authored by Cyril Chemparathy's avatar Cyril Chemparathy Committed by David S. Miller
Browse files

phy/marvell: add 88ec048 support



Marvell 88ec048 is a derivative of its 88e1121r device.  From the programmer's
perspective, the one major difference is the addition of an additional control
bit in Page 2 Register 16 - used to control the padding of odd nibble
preambles.

This patch adds support for this new device, while inheriting as much code as
possible from the existing 88e1121r implementation.

Signed-off-by: default avatarCyril Chemparathy <cyril@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 99870a73
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -75,6 +75,9 @@
#define MII_88E1121_PHY_MSCR_TX_DELAY	BIT(4)
#define MII_88E1121_PHY_MSCR_DELAY_MASK	(~(0x3 << 4))

#define MII_88EC048_PHY_MSCR1_REG	16
#define MII_88EC048_PHY_MSCR1_PAD_ODD	BIT(6)

#define MII_88E1121_PHY_LED_CTRL	16
#define MII_88E1121_PHY_LED_PAGE	3
#define MII_88E1121_PHY_LED_DEF		0x0030
@@ -231,6 +234,31 @@ static int m88e1121_config_aneg(struct phy_device *phydev)
	return err;
}

static int m88ec048_config_aneg(struct phy_device *phydev)
{
	int err, oldpage, mscr;

	oldpage = phy_read(phydev, MII_88E1121_PHY_PAGE);

	err = phy_write(phydev, MII_88E1121_PHY_PAGE,
			MII_88E1121_PHY_MSCR_PAGE);
	if (err < 0)
		return err;

	mscr = phy_read(phydev, MII_88EC048_PHY_MSCR1_REG);
	mscr |= MII_88EC048_PHY_MSCR1_PAD_ODD;

	err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr);
	if (err < 0)
		return err;

	err = phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage);
	if (err < 0)
		return err;

	return m88e1121_config_aneg(phydev);
}

static int m88e1111_config_init(struct phy_device *phydev)
{
	int err;
@@ -621,6 +649,19 @@ static struct phy_driver marvell_drivers[] = {
		.did_interrupt = &m88e1121_did_interrupt,
		.driver = { .owner = THIS_MODULE },
	},
	{
		.phy_id = 0x01410e90,
		.phy_id_mask = 0xfffffff0,
		.name = "Marvell 88EC048",
		.features = PHY_GBIT_FEATURES,
		.flags = PHY_HAS_INTERRUPT,
		.config_aneg = &m88ec048_config_aneg,
		.read_status = &marvell_read_status,
		.ack_interrupt = &marvell_ack_interrupt,
		.config_intr = &marvell_config_intr,
		.did_interrupt = &m88e1121_did_interrupt,
		.driver = { .owner = THIS_MODULE },
	},
	{
		.phy_id = 0x01410cd0,
		.phy_id_mask = 0xfffffff0,
@@ -686,6 +727,7 @@ static struct mdio_device_id marvell_tbl[] = {
	{ 0x01410cb0, 0xfffffff0 },
	{ 0x01410cd0, 0xfffffff0 },
	{ 0x01410e30, 0xfffffff0 },
	{ 0x01410e90, 0xfffffff0 },
	{ }
};