linux/drivers/net/phy/mediatek/mtk-fe-soc.c
Joris Vaisvila c9c235775b net: phy: mediatek: add phy driver for MT7628 built-in Fast Ethernet PHYs
The Fast Ethernet PHYs present in the MT7628 SoCs require an
undocumented bit to be set before they can establish 100mbps links.

This commit adds the Kconfig option MEDIATEK_FE_SOC_PHY and the
corresponding driver mtk-fe-soc.c.

Signed-off-by: Joris Vaisvila <joey@tinyisr.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Link: https://patch.msgid.link/20260813190241.789323-3-joey@tinyisr.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2026-08-18 15:50:13 +02:00

53 lines
1.3 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Driver for MT7628 Embedded Switch internal Fast Ethernet PHYs
*/
#include <linux/module.h>
#include <linux/phy.h>
#define MTK_FPHY_ID_MT7628 0x03a29410
#define MTK_EXT_PAGE_ACCESS 0x1f
static int mt7628_phy_read_page(struct phy_device *phydev)
{
return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
}
static int mt7628_phy_write_page(struct phy_device *phydev, int page)
{
return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
}
static int mt7628_phy_config_init(struct phy_device *phydev)
{
/*
* This undocumented bit is required for the PHYs to be able to
* establish 100mbps links.
*/
return phy_modify_paged(phydev, 0x8000, 30, BIT(13), BIT(13));
}
static struct phy_driver mtk_soc_fe_phy_driver[] = {
{
PHY_ID_MATCH_EXACT(MTK_FPHY_ID_MT7628),
.name = "MediaTek MT7628 PHY",
.config_init = mt7628_phy_config_init,
.read_page = mt7628_phy_read_page,
.write_page = mt7628_phy_write_page,
.suspend = genphy_suspend,
.resume = genphy_resume,
},
};
module_phy_driver(mtk_soc_fe_phy_driver);
static const struct mdio_device_id __maybe_unused mtk_soc_fe_phy_tbl[] = {
{ PHY_ID_MATCH_EXACT(MTK_FPHY_ID_MT7628) },
{ }
};
MODULE_DESCRIPTION("MediaTek SoC Fast Ethernet PHY driver");
MODULE_AUTHOR("Joris Vaisvila <joey@tinyisr.com>");
MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(mdio, mtk_soc_fe_phy_tbl);