From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 678E63DD877 for ; Wed, 8 Jul 2026 10:23:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783506239; cv=none; b=W4AfKKh4eqX0u45N2890xUNMKO9jHhWhM+l59MsdhDuSA9Xr3DxLWhw6Dv6GICQ5YF30ddaL90Tyx8guNTfZKKRMAkYheWouaV/7CGV+XN/6bbBdBCsshXTpRJhv7WwW0EJCfHQw+6mPmLnGSf5D5Y2Rt76KybnL+8ce94x61MA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783506239; c=relaxed/simple; bh=PLCvoyLmY28+uC1kH3ifxpVTAqd50MlYof2lDGnkaa4=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HzU9LNNZ5J44vNqung8w9wZcNETMUFjWaDKPYRc7qmns/rX/UroJIVrt58Gi3ZRIiw5I4fZkqesqALvsO279d4A+SyGmADIGrFr9Xjup6v3Wac6lS8ZyDq5lL9QpOW9qxpm+dTC3F33LLTurU06P5vIdoqrxVEb5V2H5cgqb1XQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=f5L9wtae; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f5L9wtae" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-493b77b150aso3795595e9.2 for ; Wed, 08 Jul 2026 03:23:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783506234; x=1784111034; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=PebJc2ke4pYHFsZpPm71QD5ECG+JVGmpQAxgLNjBuQk=; b=f5L9wtaemTMZwnCdJQcW5M1MneD+eY5qbb5GUZSdLsHPkRNcd6kF8gfg8A8KToEiox IvPuqtHdXTA8KmnYaQzLO42k1CpSkvqjTT3EE2f6e4yuccr55QMJcBv1bow6z9U0F8+T o6Bbi1ZQlehj80zsuRERgw6VWaxXYYhbNeJSO4QIELZuZpp0L5b5po7qXg00KJFwv5Qf nmPB0aZHVYEOxAMYMfZhb52b1aUYMKNe4vznBZ1NlXDiKZrCQmVGWR9ppO0Uh72cRUrx CyS9xz83xz1bIqVS/gR9SSIF/RnT5lwcjZ1sSomS305HjLenooikRqdTMj3rnUAMCnfO +cdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783506234; x=1784111034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=PebJc2ke4pYHFsZpPm71QD5ECG+JVGmpQAxgLNjBuQk=; b=swKHhTpWLOK2W0Jle7sZrg8Ty+l730GI9TAh8ZEma/x8cSa/38cfBbWnJotSTcgLu5 3ku6UjgAzxXi+lzHd+2I5U9w7G8u7rP/76JwXKyH1jv2BQ9g4MvhpXIUrnbMuiogSXnl 8D0NfMJ3oIEdOIS4zTBVbBlk2Prp4FZqi5Wne+fw/fGZFdJ9MjG2exeJMCySPtEz+Y9d dwM3GSo3n5QtS/Z+GrKKeaTX+Zp+7Y8Nk1FMq13kaAm/2mNhfzYDzBjIXDnSMhn9ZE28 UFicNgqzkQPez0YM2eTIAkYiScM33xi2HiioZzIPpIWR+diYww5YDEfbAvUCjsGlMZ5+ hqJw== X-Forwarded-Encrypted: i=1; AHgh+Rq4v8WqkL7BHxiIg6sfjJzZ8+u0ZBWXiWxpzXJwTZrjg+G/l3ho9+E3HSDi+8yufkSaYjn2nurFZa2pYZ0=@vger.kernel.org X-Gm-Message-State: AOJu0YwIcpu8kCfhUjCNa7IbrYCXJNbnEpJXzuFH2dqNr0gKUvN05Tm1 WOLlhT2Y6D2H0CnJ2pZbMHyWpeaxnQgelvfl6wDObZgCKFXGvbO1WdWt X-Gm-Gg: AfdE7cnM/9Kg7Z6q0AcV/wAdB1sl9UsJeh7QfTVbTkws82iW6duLtrXpo/6k7aZRub1 pVBPCUzcCpVn8RuKREZC1x6re6SaPl8w4I2B9/PP36zu4bydJqSQP1wIVaVbRtVhDiRT9vdbKM4 9da3MVT9HSTvgY1vg6DVnyywHG5pgr4FQDvEyALx6bv8q4SKb+WlGWXmHLAQWRkh+JXnv4ETtVf m1rgQHpDCoR11tOHsqd80t3KAMABPnzjEcYg11121AABv/sVfNxB9t9QrP+3IMbcMvl+1Xx9kOe mqbJk29T1QMaaMWT4k+k5Y65uXcxDPAxvp4d53w8fbQG9qve7QwrLtypY5AIfqgcbOqGOj1US/b bQHDsRRCi4xJlWdjFo6Z+cx+xlkQJtpzYvKuVKNK3gOHR5915UpZ+d2fgKbaknIBliSNE5vVIJn SnKvw4X3tCUorcSOp/kQvr+/FxjXR1Y9JnCp9orwnnEkmIVMujd8ILBIKR64qs8JMPJnOkIRo/k dQLb7Pon0MzPELnc0c= X-Received: by 2002:a05:600c:c4a7:b0:493:c845:bc20 with SMTP id 5b1f17b1804b1-493e688c7c9mr18708135e9.4.1783506234285; Wed, 08 Jul 2026 03:23:54 -0700 (PDT) Received: from Ansuel-XPS24.localdomain (host-95-248-227-210.retail.telecomitalia.it. [95.248.227.210]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-47aa0f2186bsm40660248f8f.36.2026.07.08.03.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2026 03:23:53 -0700 (PDT) From: Christian Marangi To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Christian Marangi , Daniel Golle , Qingfang Deng , SkyLake Huang , Matthias Brugger , AngeloGioacchino Del Regno , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH net-next 3/5] net: phy: mediatek: split Airoha code to dedicated source Date: Wed, 8 Jul 2026 12:23:29 +0200 Message-ID: <20260708102341.53919-4-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260708102341.53919-1-ansuelsmth@gmail.com> References: <20260708102341.53919-1-ansuelsmth@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit In preparation for Airoha PHYs software calibration support, split the Airoha code to dedicated source following Mediatek naming pattern of "ge-soc". This is to tidy things up and not overload the mediatek driver of specific Airoha code and ship a bigger PHY kernel module with dead code. Move the shared LEDs function to mtk-phy-lib to permit the split instead of duplicating the code. Also add myself as MAINTAINER of the now new airoha-ge-soc driver. Signed-off-by: Christian Marangi --- MAINTAINERS | 8 ++ drivers/net/phy/mediatek/Kconfig | 16 ++- drivers/net/phy/mediatek/Makefile | 1 + drivers/net/phy/mediatek/airoha-ge-soc.c | 102 ++++++++++++++++ drivers/net/phy/mediatek/mtk-ge-soc.c | 146 ----------------------- drivers/net/phy/mediatek/mtk-ge-soc.h | 4 +- drivers/net/phy/mediatek/mtk-phy-lib.c | 72 +++++++++++ drivers/net/phy/mediatek/mtk.h | 12 ++ 8 files changed, 211 insertions(+), 150 deletions(-) create mode 100644 drivers/net/phy/mediatek/airoha-ge-soc.c diff --git a/MAINTAINERS b/MAINTAINERS index 16e47aea84c3..e914bccf5cbb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -760,6 +760,14 @@ S: Maintained F: Documentation/devicetree/bindings/net/airoha,en7581-eth.yaml F: drivers/net/ethernet/airoha/ +AIROHA ETHERNET PHY DRIVER +M: Christian Marangi +L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +L: linux-mediatek@lists.infradead.org (moderated for non-subscribers) +L: netdev@vger.kernel.org +S: Maintained +F: drivers/net/phy/mediatek/airoha-ge-soc.c + AIROHA PCIE PHY DRIVER M: Lorenzo Bianconi L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) diff --git a/drivers/net/phy/mediatek/Kconfig b/drivers/net/phy/mediatek/Kconfig index bb7dc876271e..fe51f4616c54 100644 --- a/drivers/net/phy/mediatek/Kconfig +++ b/drivers/net/phy/mediatek/Kconfig @@ -1,4 +1,17 @@ # SPDX-License-Identifier: GPL-2.0-only +config AIROHA_GE_SOC_PHY + tristate "Airoha SoC Ethernet PHYs" + depends on ARM64 || COMPILE_TEST + depends on ARCH_AIROHA || COMPILE_TEST + select MTK_NET_PHYLIB + select PHY_PACKAGE + help + Supports Airoha SoC built-in Gigabit Ethernet PHYs. + + Include support for built-in Ethernet PHYs which are present in + the AN7581 and AN7583 SoCs. These PHYs d will dynamically + calibrate during startup. + config MEDIATEK_2P5GE_PHY tristate "MediaTek 2.5Gb Ethernet PHYs" depends on (ARM64 && ARCH_MEDIATEK) || COMPILE_TEST @@ -24,8 +37,7 @@ config MEDIATEK_GE_PHY config MEDIATEK_GE_SOC_PHY tristate "MediaTek SoC Ethernet PHYs" depends on ARM64 || COMPILE_TEST - depends on ARCH_AIROHA || (ARCH_MEDIATEK && NVMEM_MTK_EFUSE) || \ - COMPILE_TEST + depends on (ARCH_MEDIATEK && NVMEM_MTK_EFUSE) || COMPILE_TEST select MTK_NET_PHYLIB select PHY_PACKAGE help diff --git a/drivers/net/phy/mediatek/Makefile b/drivers/net/phy/mediatek/Makefile index ac57ecc799fc..eb430f008169 100644 --- a/drivers/net/phy/mediatek/Makefile +++ b/drivers/net/phy/mediatek/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_AIROHA_GE_SOC_PHY) += airoha-ge-soc.o obj-$(CONFIG_MEDIATEK_2P5GE_PHY) += mtk-2p5ge.o obj-$(CONFIG_MEDIATEK_GE_PHY) += mtk-ge.o obj-$(CONFIG_MEDIATEK_GE_SOC_PHY) += mtk-ge-soc.o diff --git a/drivers/net/phy/mediatek/airoha-ge-soc.c b/drivers/net/phy/mediatek/airoha-ge-soc.c new file mode 100644 index 000000000000..429594f27792 --- /dev/null +++ b/drivers/net/phy/mediatek/airoha-ge-soc.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0+ +#include +#include + +#include "mtk.h" +#include "mtk-ge-soc.h" + +#define AIROHA_PHY_MAX_LEDS 2 + +static int an7581_phy_probe(struct phy_device *phydev) +{ + struct mtk_socphy_priv *priv; + struct pinctrl *pinctrl; + + /* Toggle pinctrl to enable PHY LED */ + pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "gbe-led"); + if (IS_ERR(pinctrl)) + dev_err(&phydev->mdio.bus->dev, + "Failed to setup PHY LED pinctrl\n"); + + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + phydev->priv = priv; + + return 0; +} + +static int an7581_phy_led_polarity_set(struct phy_device *phydev, int index, + unsigned long modes) +{ + u16 val = 0; + u32 mode; + + if (index >= AIROHA_PHY_MAX_LEDS) + return -EINVAL; + + for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) { + switch (mode) { + case PHY_LED_ACTIVE_LOW: + val = MTK_PHY_LED_ON_POLARITY; + break; + case PHY_LED_ACTIVE_HIGH: + break; + default: + return -EINVAL; + } + } + + return phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ? + MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL, + MTK_PHY_LED_ON_POLARITY, val); +} + +static int an7583_phy_config_init(struct phy_device *phydev) +{ + /* BMCR_PDOWN is enabled by default */ + return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); +} + +static struct phy_driver mtk_socphy_driver[] = { + { + PHY_ID_MATCH_EXACT(AIROHA_GPHY_ID_AN7581), + .name = "Airoha AN7581 PHY", + .config_intr = genphy_no_config_intr, + .handle_interrupt = genphy_handle_interrupt_no_ack, + .probe = an7581_phy_probe, + .led_blink_set = mt798x_phy_led_blink_set, + .led_brightness_set = mt798x_phy_led_brightness_set, + .led_hw_is_supported = mt798x_phy_led_hw_is_supported, + .led_hw_control_set = mt798x_phy_led_hw_control_set, + .led_hw_control_get = mt798x_phy_led_hw_control_get, + .led_polarity_set = an7581_phy_led_polarity_set, + }, + { + PHY_ID_MATCH_EXACT(AIROHA_GPHY_ID_AN7583), + .name = "Airoha AN7583 PHY", + .config_init = an7583_phy_config_init, + .probe = an7581_phy_probe, + .led_blink_set = mt798x_phy_led_blink_set, + .led_brightness_set = mt798x_phy_led_brightness_set, + .led_hw_is_supported = mt798x_phy_led_hw_is_supported, + .led_hw_control_set = mt798x_phy_led_hw_control_set, + .led_hw_control_get = mt798x_phy_led_hw_control_get, + .led_polarity_set = an7581_phy_led_polarity_set, + }, +}; + +module_phy_driver(mtk_socphy_driver); + +static const struct mdio_device_id __maybe_unused airoha_socphy_tbl[] = { + { PHY_ID_MATCH_EXACT(AIROHA_GPHY_ID_AN7581) }, + { PHY_ID_MATCH_EXACT(AIROHA_GPHY_ID_AN7583) }, + { } +}; + +MODULE_DESCRIPTION("Airoha SoC Gigabit Ethernet PHY driver"); +MODULE_AUTHOR("Christian Marangi "); +MODULE_LICENSE("GPL"); + +MODULE_DEVICE_TABLE(mdio, airoha_socphy_tbl); diff --git a/drivers/net/phy/mediatek/mtk-ge-soc.c b/drivers/net/phy/mediatek/mtk-ge-soc.c index 46bae11ad740..868ae089013d 100644 --- a/drivers/net/phy/mediatek/mtk-ge-soc.c +++ b/drivers/net/phy/mediatek/mtk-ge-soc.c @@ -886,73 +886,6 @@ static int mt798x_phy_config_init(struct phy_device *phydev) return mt798x_phy_calibration(phydev); } -static int mt798x_phy_led_blink_set(struct phy_device *phydev, u8 index, - unsigned long *delay_on, - unsigned long *delay_off) -{ - bool blinking = false; - int err; - - err = mtk_phy_led_num_dly_cfg(index, delay_on, delay_off, &blinking); - if (err < 0) - return err; - - err = mtk_phy_hw_led_blink_set(phydev, index, blinking); - if (err) - return err; - - return mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK, - false); -} - -static int mt798x_phy_led_brightness_set(struct phy_device *phydev, - u8 index, enum led_brightness value) -{ - int err; - - err = mtk_phy_hw_led_blink_set(phydev, index, false); - if (err) - return err; - - return mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK, - (value != LED_OFF)); -} - -static const unsigned long supported_triggers = - BIT(TRIGGER_NETDEV_FULL_DUPLEX) | - BIT(TRIGGER_NETDEV_HALF_DUPLEX) | - BIT(TRIGGER_NETDEV_LINK) | - BIT(TRIGGER_NETDEV_LINK_10) | - BIT(TRIGGER_NETDEV_LINK_100) | - BIT(TRIGGER_NETDEV_LINK_1000) | - BIT(TRIGGER_NETDEV_RX) | - BIT(TRIGGER_NETDEV_TX); - -static int mt798x_phy_led_hw_is_supported(struct phy_device *phydev, u8 index, - unsigned long rules) -{ - return mtk_phy_led_hw_is_supported(phydev, index, rules, - supported_triggers); -} - -static int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index, - unsigned long *rules) -{ - return mtk_phy_led_hw_ctrl_get(phydev, index, rules, - MTK_GPHY_LED_ON_SET, - MTK_GPHY_LED_RX_BLINK_SET, - MTK_GPHY_LED_TX_BLINK_SET); -}; - -static int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index, - unsigned long rules) -{ - return mtk_phy_led_hw_ctrl_set(phydev, index, rules, - MTK_GPHY_LED_ON_SET, - MTK_GPHY_LED_RX_BLINK_SET, - MTK_GPHY_LED_TX_BLINK_SET); -}; - static bool mt7988_phy_led_get_polarity(struct phy_device *phydev, int led_num) { struct mtk_socphy_shared *priv = phy_package_get_priv(phydev); @@ -1089,58 +1022,6 @@ static int mt7981_phy_probe(struct phy_device *phydev) return mt798x_phy_calibration(phydev); } -static int an7581_phy_probe(struct phy_device *phydev) -{ - struct mtk_socphy_priv *priv; - struct pinctrl *pinctrl; - - /* Toggle pinctrl to enable PHY LED */ - pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "gbe-led"); - if (IS_ERR(pinctrl)) - dev_err(&phydev->mdio.bus->dev, - "Failed to setup PHY LED pinctrl\n"); - - priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - phydev->priv = priv; - - return 0; -} - -static int an7581_phy_led_polarity_set(struct phy_device *phydev, int index, - unsigned long modes) -{ - u16 val = 0; - u32 mode; - - if (index >= MTK_PHY_MAX_LEDS) - return -EINVAL; - - for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) { - switch (mode) { - case PHY_LED_ACTIVE_LOW: - val = MTK_PHY_LED_ON_POLARITY; - break; - case PHY_LED_ACTIVE_HIGH: - break; - default: - return -EINVAL; - } - } - - return phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ? - MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL, - MTK_PHY_LED_ON_POLARITY, val); -} - -static int an7583_phy_config_init(struct phy_device *phydev) -{ - /* BMCR_PDOWN is enabled by default */ - return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); -} - static struct phy_driver mtk_socphy_driver[] = { { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981), @@ -1176,31 +1057,6 @@ static struct phy_driver mtk_socphy_driver[] = { .led_hw_control_set = mt798x_phy_led_hw_control_set, .led_hw_control_get = mt798x_phy_led_hw_control_get, }, - { - PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7581), - .name = "Airoha AN7581 PHY", - .config_intr = genphy_no_config_intr, - .handle_interrupt = genphy_handle_interrupt_no_ack, - .probe = an7581_phy_probe, - .led_blink_set = mt798x_phy_led_blink_set, - .led_brightness_set = mt798x_phy_led_brightness_set, - .led_hw_is_supported = mt798x_phy_led_hw_is_supported, - .led_hw_control_set = mt798x_phy_led_hw_control_set, - .led_hw_control_get = mt798x_phy_led_hw_control_get, - .led_polarity_set = an7581_phy_led_polarity_set, - }, - { - PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7583), - .name = "Airoha AN7583 PHY", - .config_init = an7583_phy_config_init, - .probe = an7581_phy_probe, - .led_blink_set = mt798x_phy_led_blink_set, - .led_brightness_set = mt798x_phy_led_brightness_set, - .led_hw_is_supported = mt798x_phy_led_hw_is_supported, - .led_hw_control_set = mt798x_phy_led_hw_control_set, - .led_hw_control_get = mt798x_phy_led_hw_control_get, - .led_polarity_set = an7581_phy_led_polarity_set, - }, }; module_phy_driver(mtk_socphy_driver); @@ -1208,8 +1064,6 @@ module_phy_driver(mtk_socphy_driver); static const struct mdio_device_id __maybe_unused mtk_socphy_tbl[] = { { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981) }, { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7988) }, - { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7581) }, - { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_AN7583) }, { } }; diff --git a/drivers/net/phy/mediatek/mtk-ge-soc.h b/drivers/net/phy/mediatek/mtk-ge-soc.h index 9aaa7e3caa41..507e68343576 100644 --- a/drivers/net/phy/mediatek/mtk-ge-soc.h +++ b/drivers/net/phy/mediatek/mtk-ge-soc.h @@ -7,8 +7,8 @@ #define MTK_GPHY_ID_MT7981 0x03a29461 #define MTK_GPHY_ID_MT7988 0x03a29481 -#define MTK_GPHY_ID_AN7581 0x03a294c1 -#define MTK_GPHY_ID_AN7583 0xc0ff0420 +#define AIROHA_GPHY_ID_AN7581 0x03a294c1 +#define AIROHA_GPHY_ID_AN7583 0xc0ff0420 #define MTK_EXT_PAGE_ACCESS 0x1f #define MTK_PHY_PAGE_STANDARD 0x0000 diff --git a/drivers/net/phy/mediatek/mtk-phy-lib.c b/drivers/net/phy/mediatek/mtk-phy-lib.c index 78b998af5238..8c2b26f9b840 100644 --- a/drivers/net/phy/mediatek/mtk-phy-lib.c +++ b/drivers/net/phy/mediatek/mtk-phy-lib.c @@ -342,6 +342,78 @@ void mtk_phy_leds_state_init(struct phy_device *phydev) } EXPORT_SYMBOL_GPL(mtk_phy_leds_state_init); +int mt798x_phy_led_blink_set(struct phy_device *phydev, u8 index, + unsigned long *delay_on, + unsigned long *delay_off) +{ + bool blinking = false; + int err; + + err = mtk_phy_led_num_dly_cfg(index, delay_on, delay_off, &blinking); + if (err < 0) + return err; + + err = mtk_phy_hw_led_blink_set(phydev, index, blinking); + if (err) + return err; + + return mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK, + false); +} +EXPORT_SYMBOL_GPL(mt798x_phy_led_blink_set); + +int mt798x_phy_led_brightness_set(struct phy_device *phydev, + u8 index, enum led_brightness value) +{ + int err; + + err = mtk_phy_hw_led_blink_set(phydev, index, false); + if (err) + return err; + + return mtk_phy_hw_led_on_set(phydev, index, MTK_GPHY_LED_ON_MASK, + (value != LED_OFF)); +} +EXPORT_SYMBOL_GPL(mt798x_phy_led_brightness_set); + +static const unsigned long supported_triggers = + BIT(TRIGGER_NETDEV_FULL_DUPLEX) | + BIT(TRIGGER_NETDEV_HALF_DUPLEX) | + BIT(TRIGGER_NETDEV_LINK) | + BIT(TRIGGER_NETDEV_LINK_10) | + BIT(TRIGGER_NETDEV_LINK_100) | + BIT(TRIGGER_NETDEV_LINK_1000) | + BIT(TRIGGER_NETDEV_RX) | + BIT(TRIGGER_NETDEV_TX); + +int mt798x_phy_led_hw_is_supported(struct phy_device *phydev, u8 index, + unsigned long rules) +{ + return mtk_phy_led_hw_is_supported(phydev, index, rules, + supported_triggers); +} +EXPORT_SYMBOL_GPL(mt798x_phy_led_hw_is_supported); + +int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index, + unsigned long *rules) +{ + return mtk_phy_led_hw_ctrl_get(phydev, index, rules, + MTK_GPHY_LED_ON_SET, + MTK_GPHY_LED_RX_BLINK_SET, + MTK_GPHY_LED_TX_BLINK_SET); +}; +EXPORT_SYMBOL_GPL(mt798x_phy_led_hw_control_get); + +int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index, + unsigned long rules) +{ + return mtk_phy_led_hw_ctrl_set(phydev, index, rules, + MTK_GPHY_LED_ON_SET, + MTK_GPHY_LED_RX_BLINK_SET, + MTK_GPHY_LED_TX_BLINK_SET); +}; +EXPORT_SYMBOL_GPL(mt798x_phy_led_hw_control_set); + MODULE_DESCRIPTION("MediaTek Ethernet PHY driver common"); MODULE_AUTHOR("Sky Huang "); MODULE_AUTHOR("Daniel Golle "); diff --git a/drivers/net/phy/mediatek/mtk.h b/drivers/net/phy/mediatek/mtk.h index f172f7d671c9..c690aaf38124 100644 --- a/drivers/net/phy/mediatek/mtk.h +++ b/drivers/net/phy/mediatek/mtk.h @@ -103,4 +103,16 @@ int mtk_phy_hw_led_blink_set(struct phy_device *phydev, u8 index, bool blinking); void mtk_phy_leds_state_init(struct phy_device *phydev); +int mt798x_phy_led_blink_set(struct phy_device *phydev, u8 index, + unsigned long *delay_on, + unsigned long *delay_off); +int mt798x_phy_led_brightness_set(struct phy_device *phydev, + u8 index, enum led_brightness value); +int mt798x_phy_led_hw_is_supported(struct phy_device *phydev, u8 index, + unsigned long rules); +int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index, + unsigned long *rules); +int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index, + unsigned long rules); + #endif /* _MTK_EPHY_H_ */ -- 2.53.0