mirror of
https://github.com/torvalds/linux.git
synced 2026-10-17 14:30:03 +02:00
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>
53 lines
1.3 KiB
C
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);
|