From nobody Mon Feb 9 20:51:54 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 86ACD3396F4 for ; Wed, 12 Nov 2025 13:57:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955861; cv=none; b=fhGshvF6NJpCacqCVRF7vZ8IlMgWQDhDGa/omjO330zZZ1YcNEwdfaAZ7siIZDKA4Eo7r9GYqtXa8b92AN+f0oCFGwa8LtX6zVpjnk4TOorE4F2jMf1bz1EMVB7nsvGc6V/3OBFoUReKfoZHPGgDTsce59NyrHyAoDwYcPnK9Ac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955861; c=relaxed/simple; bh=x1YSbtYbRyTPSIhv0/6W+8ceVWJJTyabUu/t8xJbjYY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KejPZ4qj/zUQWcxbWBeFdAVSQp2kbu12zREpjgn4QPhXpbd2R0XAolvSXUq580Xn0nGvXkWJLzvHZrRQRlyEHtBjx9QSrexsXpF2vZqC+xOr7HTBNVtRFgf3un2DK2m3yf658mNKb62DbXLHracp0QXaZee0OuJGDYt6FlYi0MU= 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=mH5g/mvo; arc=none smtp.client-ip=209.85.210.177 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="mH5g/mvo" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7b22ffa2a88so634334b3a.1 for ; Wed, 12 Nov 2025 05:57:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762955860; x=1763560660; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iSrL1EoqDUfnyHQYh0k/jlWwCZWampIQnukH68EzSFQ=; b=mH5g/mvo8k/a/WwAJJt9PSQAQFLYAC0cqhaA7TwV5ElIHX0pTFAN1/MG2YyiIQdPrM ay44YH6e2Wb9fzij2PfoWALQ0QeaG4v9QWJVTOPb+yTKbKnxFQmXRxjjfigIwIXBaa6L Oxtpw8Q6mDm8O/GGFFFpykzAzutcWkw2chJbckiChhLl+JvKr9o4IqRDovJviMq8zlEk RZx6HAoMrKM7dL8wNQE9bG2NcCQfKVZYHz/btbIXhd3vJZnvEi35/kLM8VKnNl01DQeL YRRmI0MhbVjjJMjF3zSu1lYePRqfBBQRl6ZbIlAOtc1Wcl1aj+9MM9F9cSXdMgtkYsd5 GT0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762955860; x=1763560660; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=iSrL1EoqDUfnyHQYh0k/jlWwCZWampIQnukH68EzSFQ=; b=USpeZKHEfOuvQV2VrR4rtqeM+8kSNSnSeDYxGCOTYt3OFq9zEEdPAzIFrlcBuyqFxg LGVF4jsecDcXI0TxL6WGTcKMzq9TRC+s7yAGaf0hJKNQgXxM0orIC6sxfzKuJP4a06qI KYYYoW7sclSS9GGU6VjuX7WyIO/Qq13Ix15Wl+WJ+ZDipyauh3IKQ6wvBexRtb0C9ZTi eNiojh0W3EnEOAz6Nui9O7TscLr1+5Hx7RhBkWucFk69JOWuLRbW4oO5QKqyTJX9/FyC HBxrls6OMRUX3Otvkkpb0MPKcETGqAH/uBbMiWPHV+HmtQnmuaaKUvG6Kkvjh/7kqJ1Q JACg== X-Forwarded-Encrypted: i=1; AJvYcCVWbLzEACvjAeGYIkOOlu/btwMcuWUiO3VrHTAhCGFvhHA8Z1A9HLhfYyzdPTLFFOdr81/0TBrnRi2oAjs=@vger.kernel.org X-Gm-Message-State: AOJu0YzBRtrL24Mtu6jw9bybYEJVGYJfsO+cQm0v18wtoNFvK3vnNxWc OMpTNY8129IxVvZysqpTrKRcSFivI2pIGGxsZhn2Pssa6vXAIA92kVJ8 X-Gm-Gg: ASbGnctDcfeDJvyE8sdGWOd3Bz3dSPGybkkV4EO65XtJfQzcomJG3Tv6g/+gW/Zn7eJ ItKVGp2DhrW4j7Wr52Fa39WO0ndj0ttaE93tXQlUYFYs1BjaYBsYr6anZZet2rjT2kX8ixx7eaG stFid7PR6UWIyq8lkPHNUF+O46bJeUHTrqODd2yaN4BDCi7FdCX7TkSnqurS0pc1F1K9zczFobG vqPwu01TqAv2SRkbJx4pzGDAe1BNqnYmVxBQqGH8/zA4ArEBp1U4+Ns+5BV25AHYL3lxstTZEeK URooWAaBNC3AsJlyVBHoCJXpgcQaEO9H/zUJOFUE0xWxCAW50idPt9UpoVbY6flO0ePDlGPOn+0 3ua7XzdvuvRlAcB+pCl9jT1Qa0ur0WWRoC8n3Nvtqfa8Mlj5iijicv1UmCIPpH4mndkDmvlt6ZC aH1yHIAtjBZxU1fceJ1K4d X-Google-Smtp-Source: AGHT+IH8wA3xt+CQCkNui2Syc/fmlLx07b5o60cQDt4Q0PQIytlU1FHXoiYwxMvPJRREYg1Iq4EEZg== X-Received: by 2002:a05:6a00:855:b0:7ab:78be:3212 with SMTP id d2e1a72fcca58-7b7a4af65bdmr3263452b3a.19.1762955859786; Wed, 12 Nov 2025 05:57:39 -0800 (PST) Received: from iku.. ([2401:4900:1c07:5748:1c6:5ce6:4f04:5b55]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7b0f9aabfc0sm18361299b3a.13.2025.11.12.05.57.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 05:57:39 -0800 (PST) From: Prabhakar X-Google-Original-From: Prabhakar To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Horatiu Vultur , Geert Uytterhoeven , Vladimir Oltean , Vadim Fedorenko , Parthiban.Veerasooran@microchip.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar , Biju Das , Fabrizio Castro , Lad Prabhakar Subject: [PATCH net-next v4 1/4] net: phy: mscc: Simplify LED mode update using phy_modify() Date: Wed, 12 Nov 2025 13:57:12 +0000 Message-ID: <20251112135715.1017117-2-prabhakar.mahadev-lad.rj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> References: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lad Prabhakar The vsc85xx_led_cntl_set() function currently performs a manual read-modify-write sequence protected by the PHY lock to update the LED mode register (MSCC_PHY_LED_MODE_SEL). Replace this sequence with a call to phy_modify(), which already handles read-modify-write operations with proper locking inside the PHY core. Signed-off-by: Lad Prabhakar Reviewed-by: Andrew Lunn Reviewed-by: Russell King (Oracle) --- v3->v4: - No change v2->v3: - Added Reviewed-by tag. v1->v2: - New patch --- drivers/net/phy/mscc/mscc_main.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_m= ain.c index 8678ebf89cca..032050ec0bc9 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -177,17 +177,10 @@ static int vsc85xx_led_cntl_set(struct phy_device *ph= ydev, u8 led_num, u8 mode) { - int rc; - u16 reg_val; + u16 mask =3D LED_MODE_SEL_MASK(led_num); + u16 val =3D LED_MODE_SEL(led_num, mode); =20 - mutex_lock(&phydev->lock); - reg_val =3D phy_read(phydev, MSCC_PHY_LED_MODE_SEL); - reg_val &=3D ~LED_MODE_SEL_MASK(led_num); - reg_val |=3D LED_MODE_SEL(led_num, (u16)mode); - rc =3D phy_write(phydev, MSCC_PHY_LED_MODE_SEL, reg_val); - mutex_unlock(&phydev->lock); - - return rc; + return phy_modify(phydev, MSCC_PHY_LED_MODE_SEL, mask, val); } =20 static int vsc85xx_mdix_get(struct phy_device *phydev, u8 *mdix) --=20 2.43.0 From nobody Mon Feb 9 20:51:54 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 692ED3396F4 for ; Wed, 12 Nov 2025 13:57:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955870; cv=none; b=A1R3hoCWsbFlMR9fDgsFo3/a1Idnc7J2VxrUuJ8pI1egK+4+TzicNf1tZKNPH+Shb613QsaJ5GLYxi7R2Fr0wPFJCH58zmpEaYX5tNRzDv2BaRH8n5VpdmO6B849z4hiONwr0Atss+hpqr50vhH3pabuX4L62MHNvWOMKesgOlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955870; c=relaxed/simple; bh=23QlQz+zs9PHFsYcswdn+r1XmyTyK/xNQuLkNn3HPq0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o+xDieLR3gypmnkz42gsL8jvUiA2K6/gYCjCaB9qAuO7XhNAXF/yDvQWJnnMYMLZ8aOMYm2u38+wmxVsdwpHzlYkI/6OQ2zPKzxScr1m+4hMwNkr1OKPHEmBp71cXcpsxjGRGff8zL7wfI5smsIh6vgj2eGuAHP1fxzzL2bhAMs= 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=KHxYHW/m; arc=none smtp.client-ip=209.85.210.171 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="KHxYHW/m" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-7a9c64dfa8aso771885b3a.3 for ; Wed, 12 Nov 2025 05:57:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762955867; x=1763560667; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1H0xRoQG8ViuwO6I8BquWLVy3PUMYUeJxgJX4MPAhk4=; b=KHxYHW/mrQOQUBM7Y93QpsI70BFZ5pY0ItuxDLj6VOg6xwV84CppidFb8xUC1Ms6/t ODV/1lYRwq06f4q9Z5zQuadsjPKKytoc+CFVb48Ozw7p6lqEnajLndUtoy5ApLQQpO96 Jpcwi263pSjBmp2NK7aWFSlMvYJaDEJhUZV8eLa94kLvTWtteR0Ni35Eqxi4P7nDFGww HtvwpDBnRWeILkwyazu0qrt++AWggCQtZk2BXYp48/Vv79G8+4Pi2WYFA00XcpMJhv3B cs9q1ML8/e99ZKonqZdC6TBduunVhxB8vGo5D+Qs40WFRls5u1MLkvODLIiM3ciAM47X Ep1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762955867; x=1763560667; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1H0xRoQG8ViuwO6I8BquWLVy3PUMYUeJxgJX4MPAhk4=; b=HQPx7+B0YRQU1zRChe68C+q8uomqBGFfbUMTEfIq4a42Cx0Tu+ejmFmmO69Qoiwtgi /LNPxssDynoMSgZfayPkmU2pWUgzokPpy4OSrHch0A5PkkNILBj94BWdiZ8NB2S1yXnS RdnqP6bCURpxa2TnGt0bH6ASguPJTl0TmZH0gjBFtarnlaPuRbtLKPXevUCoLzX87u8H IjLtZRSRvzubOxsI9Eyr0YsDKeVU4qdxkRuRw904dDcoEeIF8FITWl9g4g/tltjQH+KE u6TIP+tQwK46cXLBlLzrjOugXd9FpdBM+6GnHDiUuIZPU9vjKnkhU/rTXeraS/LGGazZ AjkQ== X-Forwarded-Encrypted: i=1; AJvYcCX1XF+l6xc5OCS+sPhRCbihFI8QO/89Y6hJkI6iUDfW/Bkkbbxh9F/I3Lesd5Dr7y3/AgIYQ+2cIzJxy/Q=@vger.kernel.org X-Gm-Message-State: AOJu0YwPcEE1TcjApqvUVVH6asZr+AcXu0/dZTjidCfIZfyRWKp4KlMr iEAdJ/kVbGKdHu75w2akbmryIN1hzJTv67vrD/Y+QVODClBo7lJyHeE/ X-Gm-Gg: ASbGnculyZ5BQb0uVHsa8Q1ulxYUHrVuq4lowR9dVEGENaoRNp/hMx+s6DSt6bhq+yN BDJGzhwAXCRHPwq7LYamuJxQw2ifzbjVK4k416mo56Dl1LcmZKczqmdDTQ/g1nBRIb9TTmMSNAp f23+rs+zckhZ1uJPAMtx7roMUPB0IdwEJvYuShMQB4pNo5FvbVpny0KSkwW7cyAmwqushYd9c20 HSe8LitDE/m1rJOpjETWxBNUlVU0DaF7Fbb6fz6PZVaejXBzVoHXnKmuNxjybkRX4T5f4np+pEt TIr9dKfEZ3OV4G0+XPinHEsh/IOz6Dn+11HUh6H5cHZQjfmU48lWvFf9RmiqRQS1JL9PIaKLpZt Mx7gHM8gfLsFs2d+gvS98k4f9rFZy8N8gZENtfNk3UHLeNXgVZdFwm7m/O7zAYO1/qVOw6uX8ZC 0ppo2vg6sKk2cLhZetGk4O X-Google-Smtp-Source: AGHT+IFyV3OGmqKTWGpoQhI78vd2P2dms83JvHBMJR/EUJ5aAXoRgNZBfGCO2eD7j6JhcHfR8ZeP/g== X-Received: by 2002:a05:6a20:3950:b0:2b6:3182:be1e with SMTP id adf61e73a8af0-35908c8d228mr4301362637.12.1762955866727; Wed, 12 Nov 2025 05:57:46 -0800 (PST) Received: from iku.. ([2401:4900:1c07:5748:1c6:5ce6:4f04:5b55]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7b0f9aabfc0sm18361299b3a.13.2025.11.12.05.57.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 05:57:46 -0800 (PST) From: Prabhakar X-Google-Original-From: Prabhakar To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Horatiu Vultur , Geert Uytterhoeven , Vladimir Oltean , Vadim Fedorenko , Parthiban.Veerasooran@microchip.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar , Biju Das , Fabrizio Castro , Lad Prabhakar Subject: [PATCH net-next v4 2/4] net: phy: mscc: Consolidate probe functions into a common helper Date: Wed, 12 Nov 2025 13:57:13 +0000 Message-ID: <20251112135715.1017117-3-prabhakar.mahadev-lad.rj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> References: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lad Prabhakar Unify the probe implementations of the VSC85xx PHY family into a single vsc85xx_probe_common() helper. The existing probe functions for the vsc85xx, vsc8514, vsc8574, and vsc8584 variants contained almost identical initialization logic, differing only in configuration parameters such as the number of LEDs, supported LED modes, hardware statistics, and PTP support. Introduce a vsc85xx_probe_config structure to describe the per-variant parameters, and move all common setup code into the shared helper. Each variant's probe function now defines a constant configuration instance and calls vsc85xx_probe_common(). Also mark the default LED mode array parameter as const to match its usage. Signed-off-by: Lad Prabhakar Reviewed-by: Andrew Lunn --- v3->v4: - Sorted the members of vsc85xx_probe_config struct to avoid the holes - Added Reviewed-by tag v2->v3: - Grouped check_rate_magic check v1->v2: - New patch --- drivers/net/phy/mscc/mscc_main.c | 237 ++++++++++++++++--------------- 1 file changed, 124 insertions(+), 113 deletions(-) diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_m= ain.c index 032050ec0bc9..052e68d1cd97 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -22,6 +22,24 @@ #include "mscc_serdes.h" #include "mscc.h" =20 +struct vsc85xx_probe_config { + const struct vsc85xx_hw_stat *hw_stats; + size_t shared_size; + size_t nstats; + u16 supp_led_modes; + u8 nleds; + bool check_rate_magic; + bool use_package; + bool has_ptp; +}; + +static const u32 vsc85xx_default_led_modes_4[] =3D { + VSC8531_LINK_1000_ACTIVITY, + VSC8531_LINK_100_ACTIVITY, + VSC8531_LINK_ACTIVITY, + VSC8531_DUPLEX_COLLISION +}; + static const struct vsc85xx_hw_stat vsc85xx_hw_stats[] =3D { { .string =3D "phy_receive_errors", @@ -436,7 +454,7 @@ static int vsc85xx_dt_led_mode_get(struct phy_device *p= hydev, #endif /* CONFIG_OF_MDIO */ =20 static int vsc85xx_dt_led_modes_get(struct phy_device *phydev, - u32 *default_mode) + const u32 *default_mode) { struct vsc8531_private *priv =3D phydev->priv; char led_dt_prop[28]; @@ -2211,132 +2229,125 @@ static int vsc85xx_config_inband(struct phy_devic= e *phydev, unsigned int modes) reg_val); } =20 +static int vsc85xx_probe_common(struct phy_device *phydev, + const struct vsc85xx_probe_config *cfg, + const u32 *default_led_mode) +{ + struct vsc8531_private *vsc8531; + int ret; + + vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); + if (!vsc8531) + return -ENOMEM; + + phydev->priv =3D vsc8531; + + /* Check rate magic if needed (only for non-package PHYs) */ + if (cfg->check_rate_magic) { + ret =3D vsc85xx_edge_rate_magic_get(phydev); + if (ret < 0) + return ret; + + vsc8531->rate_magic =3D ret; + } + + /* Set up package if needed */ + if (cfg->use_package) { + vsc8584_get_base_addr(phydev); + devm_phy_package_join(&phydev->mdio.dev, phydev, + vsc8531->base_addr, cfg->shared_size); + } + + /* Configure LED settings */ + vsc8531->nleds =3D cfg->nleds; + vsc8531->supp_led_modes =3D cfg->supp_led_modes; + + /* Configure hardware stats */ + vsc8531->hw_stats =3D cfg->hw_stats; + vsc8531->nstats =3D cfg->nstats; + vsc8531->stats =3D devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, + sizeof(u64), GFP_KERNEL); + if (!vsc8531->stats) + return -ENOMEM; + + /* PTP setup for VSC8584 */ + if (cfg->has_ptp) { + if (phy_package_probe_once(phydev)) { + ret =3D vsc8584_ptp_probe_once(phydev); + if (ret) + return ret; + } + + ret =3D vsc8584_ptp_probe(phydev); + if (ret) + return ret; + } + + /* Parse LED modes from device tree */ + return vsc85xx_dt_led_modes_get(phydev, default_led_mode); +} + static int vsc8514_probe(struct phy_device *phydev) { - struct vsc8531_private *vsc8531; - u32 default_mode[4] =3D {VSC8531_LINK_1000_ACTIVITY, - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, - VSC8531_DUPLEX_COLLISION}; - - vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); - if (!vsc8531) - return -ENOMEM; - - phydev->priv =3D vsc8531; - - vsc8584_get_base_addr(phydev); - devm_phy_package_join(&phydev->mdio.dev, phydev, - vsc8531->base_addr, 0); - - vsc8531->nleds =3D 4; - vsc8531->supp_led_modes =3D VSC85XX_SUPP_LED_MODES; - vsc8531->hw_stats =3D vsc85xx_hw_stats; - vsc8531->nstats =3D ARRAY_SIZE(vsc85xx_hw_stats); - vsc8531->stats =3D devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, - sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - - return vsc85xx_dt_led_modes_get(phydev, default_mode); + static const struct vsc85xx_probe_config vsc8514_cfg =3D { + .nleds =3D 4, + .supp_led_modes =3D VSC85XX_SUPP_LED_MODES, + .hw_stats =3D vsc85xx_hw_stats, + .nstats =3D ARRAY_SIZE(vsc85xx_hw_stats), + .use_package =3D true, + .shared_size =3D 0, + .has_ptp =3D false, + .check_rate_magic =3D false, + }; + + return vsc85xx_probe_common(phydev, &vsc8514_cfg, vsc85xx_default_led_mod= es_4); } =20 static int vsc8574_probe(struct phy_device *phydev) { - struct vsc8531_private *vsc8531; - u32 default_mode[4] =3D {VSC8531_LINK_1000_ACTIVITY, - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, - VSC8531_DUPLEX_COLLISION}; - - vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); - if (!vsc8531) - return -ENOMEM; - - phydev->priv =3D vsc8531; - - vsc8584_get_base_addr(phydev); - devm_phy_package_join(&phydev->mdio.dev, phydev, - vsc8531->base_addr, 0); - - vsc8531->nleds =3D 4; - vsc8531->supp_led_modes =3D VSC8584_SUPP_LED_MODES; - vsc8531->hw_stats =3D vsc8584_hw_stats; - vsc8531->nstats =3D ARRAY_SIZE(vsc8584_hw_stats); - vsc8531->stats =3D devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, - sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - - return vsc85xx_dt_led_modes_get(phydev, default_mode); + static const struct vsc85xx_probe_config vsc8574_cfg =3D { + .nleds =3D 4, + .supp_led_modes =3D VSC8584_SUPP_LED_MODES, + .hw_stats =3D vsc8584_hw_stats, + .nstats =3D ARRAY_SIZE(vsc8584_hw_stats), + .use_package =3D true, + .shared_size =3D 0, + .has_ptp =3D false, + .check_rate_magic =3D false, + }; + + return vsc85xx_probe_common(phydev, &vsc8574_cfg, vsc85xx_default_led_mod= es_4); } =20 static int vsc8584_probe(struct phy_device *phydev) { - struct vsc8531_private *vsc8531; - u32 default_mode[4] =3D {VSC8531_LINK_1000_ACTIVITY, - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, - VSC8531_DUPLEX_COLLISION}; - int ret; - - vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); - if (!vsc8531) - return -ENOMEM; - - phydev->priv =3D vsc8531; - - vsc8584_get_base_addr(phydev); - devm_phy_package_join(&phydev->mdio.dev, phydev, vsc8531->base_addr, - sizeof(struct vsc85xx_shared_private)); - - vsc8531->nleds =3D 4; - vsc8531->supp_led_modes =3D VSC8584_SUPP_LED_MODES; - vsc8531->hw_stats =3D vsc8584_hw_stats; - vsc8531->nstats =3D ARRAY_SIZE(vsc8584_hw_stats); - vsc8531->stats =3D devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, - sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - - if (phy_package_probe_once(phydev)) { - ret =3D vsc8584_ptp_probe_once(phydev); - if (ret) - return ret; - } - - ret =3D vsc8584_ptp_probe(phydev); - if (ret) - return ret; - - return vsc85xx_dt_led_modes_get(phydev, default_mode); + static const struct vsc85xx_probe_config vsc8584_cfg =3D { + .nleds =3D 4, + .supp_led_modes =3D VSC8584_SUPP_LED_MODES, + .hw_stats =3D vsc8584_hw_stats, + .nstats =3D ARRAY_SIZE(vsc8584_hw_stats), + .use_package =3D true, + .shared_size =3D sizeof(struct vsc85xx_shared_private), + .has_ptp =3D true, + .check_rate_magic =3D false, + }; + + return vsc85xx_probe_common(phydev, &vsc8584_cfg, vsc85xx_default_led_mod= es_4); } =20 static int vsc85xx_probe(struct phy_device *phydev) { - struct vsc8531_private *vsc8531; - int rate_magic; - u32 default_mode[2] =3D {VSC8531_LINK_1000_ACTIVITY, - VSC8531_LINK_100_ACTIVITY}; - - rate_magic =3D vsc85xx_edge_rate_magic_get(phydev); - if (rate_magic < 0) - return rate_magic; - - vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); - if (!vsc8531) - return -ENOMEM; - - phydev->priv =3D vsc8531; - - vsc8531->rate_magic =3D rate_magic; - vsc8531->nleds =3D 2; - vsc8531->supp_led_modes =3D VSC85XX_SUPP_LED_MODES; - vsc8531->hw_stats =3D vsc85xx_hw_stats; - vsc8531->nstats =3D ARRAY_SIZE(vsc85xx_hw_stats); - vsc8531->stats =3D devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, - sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - - return vsc85xx_dt_led_modes_get(phydev, default_mode); + static const struct vsc85xx_probe_config vsc85xx_cfg =3D { + .nleds =3D 2, + .supp_led_modes =3D VSC85XX_SUPP_LED_MODES, + .hw_stats =3D vsc85xx_hw_stats, + .nstats =3D ARRAY_SIZE(vsc85xx_hw_stats), + .use_package =3D false, + .has_ptp =3D false, + .check_rate_magic =3D true, + }; + + return vsc85xx_probe_common(phydev, &vsc85xx_cfg, vsc85xx_default_led_mod= es_4); } =20 static void vsc85xx_remove(struct phy_device *phydev) --=20 2.43.0 From nobody Mon Feb 9 20:51:54 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 2E46533F375 for ; Wed, 12 Nov 2025 13:57:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955877; cv=none; b=Zsr4nIExClN+HWGy4kdQE2Xsb1MOIP36ndsc9FglIU0z3jd3eTKVGqFPGiNI9uakNo2b7AhCAgRZZNyAOVqyvwx1u6gtJRM1vjFDNB6tKU4nYfpMMD7fVPb8E+qqAqolNyL024T9iATqMyLiIpQFl4tr9OtbB01qB12X/FrV+RE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955877; c=relaxed/simple; bh=T2/e2Gmlu43WWyfuAjfVohUZ3GMOqelx3YMnBSPTqcs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p7SKV0quLP0j+5pMPATqJrhGdwcHx5R7VaW7YWC0xrPvzDZnd7+uV4x9bMjhGV+wfkn+mzMr0Eqz5Y7m7W9haRscRq3n0H8j8qcEdM/12JrgBBOJhzjL8UF1Ge8zwmHrTkXTCi3C+0F/+WqnyImVLC+7ZY1ebCIHR9AGZN3lSXk= 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=dCopNgIq; arc=none smtp.client-ip=209.85.210.169 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="dCopNgIq" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-7aa9be9f03aso844499b3a.2 for ; Wed, 12 Nov 2025 05:57:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762955873; x=1763560673; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zU3bZBHadWVOw+Fks3m9fohk5BGP2sEVKr03MZ2Xr8A=; b=dCopNgIqKBm2jN/zUoOz1uysnIg9xnxLF29aswGeUruxDSHNyW3Dkh0jEO096FUN+c fiX8ro+sweAVxQPoystskiLf/VSb0IOEGMkbvyZ3c+FabfloUhTH13wsQcOapUQ1YR18 +CVTmsEQsisuHIyKYL6d1L1M2xgBGx/B3MR23a6bq5mfvQPTEoYpUyof/VNg4iP2RXDL ObN0SQg93exph4etDUP3iqAfDeOUkP75m2onxixZu8KUlcDtgWRZTAPO3sQyDijDAaNy m2Q3oj6mzDzjFh9Gw7zkl6gcjjciM0Wr7ISSL0R0u/FLcgSSFqMT0ECB+YG+G7Y7yG7m Y/YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762955873; x=1763560673; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zU3bZBHadWVOw+Fks3m9fohk5BGP2sEVKr03MZ2Xr8A=; b=PaRF8bS5rKUuDsRa6fw86iXBzgA2A3S+qq8yhGoNfnvYIN75OXfrjE/+zg+iXeYzNB h8NTbgoB49tO/ZFvhF2HgPBCsN1x2w2LqOOgRDSQdwjD43+IChK2+bwakhiR4p4vHUvD bPC4Er9rDjbYYAMKpzYtXAehPXWq65oiSgxlcKXXyfNWQZkQBKooxMRCo0y+KD3vxblV osqK6A7A2l6b/Zp6lEfWpzsTu0oxDMXFD7eqg4lyaL6rto5rceIzMkd5/Yu7vm0Z7an+ 3W79T13WavxrFZE1U1QWYECCrxOhFinFXNNXnWYM+du2fH3nPxLuz8SQDuCZ04k2PTTD XCfg== X-Forwarded-Encrypted: i=1; AJvYcCVzyU/vBOmLxYA+IavY6YVoaPLiWzLnrr08I89x1IQT0CI3EOpom+Cc2UV5RqLdVDRhdw+Ea9elLfrKFPU=@vger.kernel.org X-Gm-Message-State: AOJu0YwJNaprlCi9+Sb7tBn+yU7BbDwV9zKl7P7KjYw6nAaHJXD9tqIL d697iEwps42iy+rxHZGncI+LLPfgHUJKWtVUfYqihFQrPyjoYTohscSD X-Gm-Gg: ASbGncssOtlclcKiAgowENFFiJ/JI8yHO8UfnUNF975lrde6pwekVNtdGyfC9XCHiZK KHOdS6OLHGkvqyVH753zJpykZzwBI9rf6Xu70FOUkP+bjuYSrl6JPLY1nrDkKBcwViqoqHvw4oN rXqPqrBjCsHWtLN4d/RBD2da8Nj3nZa2qspV8NtbQ4zzR3D+6owUnc5YHK09Crk3+nEanQPBDcE ISLTzrqxoj1a4R3xoz3Wa0TkOBRvHRWHIZ/CiTOwand3k6Vsr2R4cSJ5rvFbAGhqZlShz6FpHLg 7iPgeeo2+jFNlT8/+FhmVxkkDKoOJuBIAAhmSqOLpzjCeIrpOqM517Sgap/8aQdTZN8lZbK4u2N yx73KMc/suRcqXlS27VsfRA+rPh5Gohy3upqA/Ca06WXfvG3p5VozJ1glRxX8BrMFtH+YUy/HAe Hxe7qISkqlhDzaX+EcbMYz+S2mGKo8vkQ= X-Google-Smtp-Source: AGHT+IFycCLd+NxCyu+DObpOlP9sfZymYIFxP/cceXD8Bym4EQorCE2Dnuw8SpJNcro4DmaBpDemvQ== X-Received: by 2002:a05:6a00:b8b:b0:7ab:88:e397 with SMTP id d2e1a72fcca58-7b7a4fd9098mr3486264b3a.24.1762955873412; Wed, 12 Nov 2025 05:57:53 -0800 (PST) Received: from iku.. ([2401:4900:1c07:5748:1c6:5ce6:4f04:5b55]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7b0f9aabfc0sm18361299b3a.13.2025.11.12.05.57.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 05:57:52 -0800 (PST) From: Prabhakar X-Google-Original-From: Prabhakar To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Horatiu Vultur , Geert Uytterhoeven , Vladimir Oltean , Vadim Fedorenko , Parthiban.Veerasooran@microchip.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar , Biju Das , Fabrizio Castro , Lad Prabhakar Subject: [PATCH net-next v4 3/4] net: phy: mscc: Add support for PHY LED control Date: Wed, 12 Nov 2025 13:57:14 +0000 Message-ID: <20251112135715.1017117-4-prabhakar.mahadev-lad.rj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> References: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lad Prabhakar Add support for the PHY LED controller in the MSCC VSC85xx driver. The implementation provides LED brightness and hardware control through the LED subsystem and integrates with the standard 'netdev' trigger. Introduce new register definitions for the LED behavior register (MSCC_PHY_LED_BEHAVIOR =3D 30) and the LED combine disable bits, which control whether LEDs indicate link-only or combined link and activity status. Implement a helper, vsc8541_led_combine_disable_set(), to update these bits safely using phy_modify(). Add support for LED brightness control and hardware mode configuration. The new callbacks implement the standard LED class operations, allowing user control through sysfs. The brightness control maps to PHY LED force on/off modes. The hardware control get and set functions translate between the PHY-specific LED mode encodings and the LED subsystem TRIGGER_NETDEV_* rules. The combine feature is managed automatically based on the selected rules. When both RX and TX activity are disabled, the combine feature is turned off, causing LEDs to indicate link-only status. When either RX or TX activity is enabled, the combine feature remains active and LEDs indicate combined link and activity. Register the LED callbacks for all VSC85xx PHY variants so that the LED subsystem can manage their indicators consistently. Existing device tree LED configuration and default behavior are preserved. Signed-off-by: Lad Prabhakar Reviewed-by: Andrew Lunn --- v3->v4: - Fixed Reverse Christmas tree in vsc85xx_led_combine_disable_set() v2->v3: - Added Reviewed-by tag. v1->v2: - Added LED control support to all VSC85xx PHY variants. - Renamed led callbacks to vsc85xx_* for consistency. - Defaulted the LEDs on probe to the default array before parsing DT. - Used phy_modify() in vsc85xx_led_brightness_set() - Return value of phy_read() checked in vsc85xx_led_hw_control_get() - Reverse Christmas tree in vsc85xx_led_hw_is_supported() - Updated the commit message to clarify the LED combine feature behavior. --- drivers/net/phy/mscc/mscc.h | 4 + drivers/net/phy/mscc/mscc_main.c | 246 +++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h index 2eef5956b9cc..65c9d7bd9315 100644 --- a/drivers/net/phy/mscc/mscc.h +++ b/drivers/net/phy/mscc/mscc.h @@ -85,6 +85,10 @@ enum rgmii_clock_delay { #define LED_MODE_SEL_MASK(x) (GENMASK(3, 0) << LED_MODE_SEL_POS(x)) #define LED_MODE_SEL(x, mode) (((mode) << LED_MODE_SEL_POS(x)) & LED_MO= DE_SEL_MASK(x)) =20 +#define MSCC_PHY_LED_BEHAVIOR 30 +#define LED_COMBINE_DIS_MASK(x) BIT(x) +#define LED_COMBINE_DIS(x, dis) (((dis) ? 1 : 0) << (x)) + #define MSCC_EXT_PAGE_CSR_CNTL_17 17 #define MSCC_EXT_PAGE_CSR_CNTL_18 18 =20 diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_m= ain.c index 052e68d1cd97..21fcaf07bc6d 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -201,6 +201,15 @@ static int vsc85xx_led_cntl_set(struct phy_device *phy= dev, return phy_modify(phydev, MSCC_PHY_LED_MODE_SEL, mask, val); } =20 +static int vsc85xx_led_combine_disable_set(struct phy_device *phydev, + u8 led_num, bool combine_disable) +{ + u16 val =3D LED_COMBINE_DIS(led_num, combine_disable); + u16 mask =3D LED_COMBINE_DIS_MASK(led_num); + + return phy_modify(phydev, MSCC_PHY_LED_BEHAVIOR, mask, val); +} + static int vsc85xx_mdix_get(struct phy_device *phydev, u8 *mdix) { u16 reg_val; @@ -2234,6 +2243,7 @@ static int vsc85xx_probe_common(struct phy_device *ph= ydev, const u32 *default_led_mode) { struct vsc8531_private *vsc8531; + struct device_node *np; int ret; =20 vsc8531 =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); @@ -2283,10 +2293,186 @@ static int vsc85xx_probe_common(struct phy_device = *phydev, return ret; } =20 + /* + * Check for LED configuration in device tree if available + * or fall back to default `vsc8531,led-x-mode` DT properties. + */ + np =3D of_get_child_by_name(phydev->mdio.dev.of_node, "leds"); + if (np) { + of_node_put(np); + + /* Force to defaults */ + for (unsigned int i =3D 0; i < vsc8531->nleds; i++) + vsc8531->leds_mode[i] =3D default_led_mode[i]; + + return 0; + } + /* Parse LED modes from device tree */ return vsc85xx_dt_led_modes_get(phydev, default_led_mode); } =20 +static int vsc85xx_led_brightness_set(struct phy_device *phydev, + u8 index, enum led_brightness value) +{ + struct vsc8531_private *vsc8531 =3D phydev->priv; + + if (index >=3D vsc8531->nleds) + return -EINVAL; + + return vsc85xx_led_cntl_set(phydev, index, value =3D=3D LED_OFF ? + VSC8531_FORCE_LED_OFF : VSC8531_FORCE_LED_ON); +} + +static int vsc85xx_led_hw_is_supported(struct phy_device *phydev, u8 index, + unsigned long rules) +{ + static const unsigned long supported =3D BIT(TRIGGER_NETDEV_LINK_1000) | + BIT(TRIGGER_NETDEV_LINK_100) | + BIT(TRIGGER_NETDEV_LINK_10) | + BIT(TRIGGER_NETDEV_LINK) | + BIT(TRIGGER_NETDEV_RX) | + BIT(TRIGGER_NETDEV_TX); + struct vsc8531_private *vsc8531 =3D phydev->priv; + + if (index >=3D vsc8531->nleds) + return -EINVAL; + + if (rules & ~supported) + return -EOPNOTSUPP; + + return 0; +} + +static int vsc85xx_led_hw_control_get(struct phy_device *phydev, u8 index, + unsigned long *rules) +{ + struct vsc8531_private *vsc8531 =3D phydev->priv; + u8 mode, behavior; + int rc; + + if (index >=3D vsc8531->nleds) + return -EINVAL; + + rc =3D phy_read(phydev, MSCC_PHY_LED_MODE_SEL); + if (rc < 0) + return rc; + mode =3D (rc & LED_MODE_SEL_MASK(index)) >> LED_MODE_SEL_POS(index); + + rc =3D phy_read(phydev, MSCC_PHY_LED_BEHAVIOR); + if (rc < 0) + return rc; + behavior =3D (rc & LED_COMBINE_DIS_MASK(index)) >> index; + + switch (mode) { + case VSC8531_LINK_ACTIVITY: + case VSC8531_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_1000_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_1000) | + BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_100_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_100) | + BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_10_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_10) | + BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_100_1000_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_1000) | + BIT(TRIGGER_NETDEV_LINK_100) | + BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_10_1000_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_1000) | + BIT(TRIGGER_NETDEV_LINK_10) | + BIT(TRIGGER_NETDEV_LINK); + break; + + case VSC8531_LINK_10_100_ACTIVITY: + *rules =3D BIT(TRIGGER_NETDEV_LINK_100) | + BIT(TRIGGER_NETDEV_LINK_10) | + BIT(TRIGGER_NETDEV_LINK); + break; + + default: + *rules =3D 0; + break; + } + + if (!behavior && *rules) + *rules |=3D BIT(TRIGGER_NETDEV_RX) | BIT(TRIGGER_NETDEV_TX); + + return 0; +} + +static int vsc85xx_led_hw_control_set(struct phy_device *phydev, u8 index, + unsigned long rules) +{ + struct vsc8531_private *vsc8531 =3D phydev->priv; + u8 mode =3D VSC8531_FORCE_LED_ON; + bool combine_disable =3D false; + bool has_rx, has_tx; + int ret; + + if (index >=3D vsc8531->nleds) + return -EINVAL; + + if (rules & BIT(TRIGGER_NETDEV_LINK)) + mode =3D VSC8531_LINK_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_10)) + mode =3D VSC8531_LINK_10_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_100)) + mode =3D VSC8531_LINK_100_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_1000)) + mode =3D VSC8531_LINK_1000_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_100) && + rules & BIT(TRIGGER_NETDEV_LINK_1000)) + mode =3D VSC8531_LINK_100_1000_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_10) && + rules & BIT(TRIGGER_NETDEV_LINK_1000)) + mode =3D VSC8531_LINK_10_1000_ACTIVITY; + + if (rules & BIT(TRIGGER_NETDEV_LINK_10) && + rules & BIT(TRIGGER_NETDEV_LINK_100)) + mode =3D VSC8531_LINK_10_100_ACTIVITY; + + /* + * The VSC85xx PHYs provides an option to control LED behavior. By + * default, the LEDx combine function is enabled, meaning the LED + * will be on when there is link/activity or duplex/collision. If + * the combine function is disabled, the LED will be on only for + * link or duplex. + * + * To control this behavior, we check the selected rules. If both + * RX and TX activity are not selected, the LED combine function + * is disabled; otherwise, it remains enabled. + */ + has_rx =3D !!(rules & BIT(TRIGGER_NETDEV_RX)); + has_tx =3D !!(rules & BIT(TRIGGER_NETDEV_TX)); + if (!has_rx && !has_tx) + combine_disable =3D true; + + ret =3D vsc85xx_led_combine_disable_set(phydev, index, combine_disable); + if (ret < 0) + return ret; + + return vsc85xx_led_cntl_set(phydev, index, mode); +} + static int vsc8514_probe(struct phy_device *phydev) { static const struct vsc85xx_probe_config vsc8514_cfg =3D { @@ -2380,6 +2566,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8502, @@ -2404,6 +2594,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8504, @@ -2431,6 +2625,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8514, @@ -2456,6 +2654,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8530, @@ -2480,6 +2682,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8531, @@ -2504,6 +2710,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8540, @@ -2528,6 +2738,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8541, @@ -2552,6 +2766,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_sset_count =3D &vsc85xx_get_sset_count, .get_strings =3D &vsc85xx_get_strings, .get_stats =3D &vsc85xx_get_stats, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8552, @@ -2578,6 +2796,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { PHY_ID_MATCH_EXACT(PHY_ID_VSC856X), @@ -2601,6 +2823,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8572, @@ -2629,6 +2855,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { .phy_id =3D PHY_ID_VSC8574, @@ -2657,6 +2887,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { PHY_ID_MATCH_EXACT(PHY_ID_VSC8575), @@ -2682,6 +2916,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { PHY_ID_MATCH_EXACT(PHY_ID_VSC8582), @@ -2707,6 +2945,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .get_stats =3D &vsc85xx_get_stats, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, }, { PHY_ID_MATCH_EXACT(PHY_ID_VSC8584), @@ -2733,6 +2975,10 @@ static struct phy_driver vsc85xx_driver[] =3D { .link_change_notify =3D &vsc85xx_link_change_notify, .inband_caps =3D vsc85xx_inband_caps, .config_inband =3D vsc85xx_config_inband, + .led_brightness_set =3D vsc85xx_led_brightness_set, + .led_hw_is_supported =3D vsc85xx_led_hw_is_supported, + .led_hw_control_get =3D vsc85xx_led_hw_control_get, + .led_hw_control_set =3D vsc85xx_led_hw_control_set, } =20 }; --=20 2.43.0 From nobody Mon Feb 9 20:51:54 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 8AB9A26A088 for ; Wed, 12 Nov 2025 13:58:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955881; cv=none; b=aEvlyrS9tq/iR2sT9QlQ5wUUTDtD6ExIoOjQBwS0MECETCQrelXEgw5g/y1y3+zP7CzaTPlyN9EHPFTzHxwSySOTrQCvAw1W0MVZCebvdDiaXQcLPlXLxpFdph35UiInAFLa12ToMlAo4E9DMhDZwUSQGinx0oZzYREArp3BRMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762955881; c=relaxed/simple; bh=TVib8KoMScZCb+KPT85+QmKKvlCH8lixAtnRmNJ3Neg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F8L8LwZQbaLwilY0MN2LqlDK7dUunUHxDn8J/iZn80o7HQib8OOu1NLd75kQ/ObtEIwmGquFzCXLD5pJgcZ/M1lZFFxVwrs0fI7XBXyM1aX72Lyw9ubSD7EYJxDxrHaeaCuo3X1nACdPHMrN+nC7lDGqak92AVeYchaLpGigiWg= 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=lKuYFh16; arc=none smtp.client-ip=209.85.210.169 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="lKuYFh16" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-7a9cdf62d31so1074677b3a.3 for ; Wed, 12 Nov 2025 05:58:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762955880; x=1763560680; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=j1/MI7fuOzyKPjB007+f1We8KvicofZrvdYQ3ilyzeo=; b=lKuYFh16/6rkyavH4eqTg6FQaEhDKqJQ9T7YdWTLOsH2HVZAG4cmn6wTPORrzSaa76 YZv6hKrXeQrk64ik8lj1cD1PduE4FtX/J2EjCEOTboCTi0XqeA3/yJ80z98r58pNfCup 8bLYppRSnhhG4vLiT+SlznkSaqncHb7c/r9j8GQUwBCn3AFtai4U1CmbLVw8C+7HcqMf E0TGmlGCAlvSpnJrk5+YtYmEaYjhLblAGsTkRdjtnuBPS0Nq05cpKSYJ2YMee+hEvovE kqqdDLSbQttumlkIt4DWZLGexew1tmzChcqLiNfKf/7sIbkOINlRQBsjU8R2VTt+Ky0t Rf6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762955880; x=1763560680; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=j1/MI7fuOzyKPjB007+f1We8KvicofZrvdYQ3ilyzeo=; b=JT2QN/Hkx8OUAz5qmLMGiKnzSntxQVNcHZSdcHFy96aQltr8AlhohZIaK3+DOm8EPO UW+RK8gOjisVA0oNNVUrCpWF+yJjYzsO9rHLR2tQxAgTrU1CBPKlHNzXxUXCNy7kQleI KipT5nZRH74iGpVR9/LTyV+PW7pmmFTTnBwGIWM2T2xOWC5O/6DQetY3Ij1mElcXOULO XiPgqcC2k0WEQT+TfI7qJoXWCz3kvfRCPdjU5TiXhGaAirZfy9NGRhYpOUjJ25Tev7lz 7xPEltHaPqB4TZzRsDZxOEu8fkjpXpE/EzqHF3owKGldj4CRbKlf1UDyQlKweE7jhufK OAJA== X-Forwarded-Encrypted: i=1; AJvYcCWbBwZJe10jfWb0CJnQrwYumsX7y89qfS4NPTti0x78YmxY5tcRx1RuLGhyr2zwM6A6REhRqUswEK4+nho=@vger.kernel.org X-Gm-Message-State: AOJu0YwMl1xU9VMUZj0SPsVaLzb8QmiAV+5w2/rVzFyferU67BZWqm1T CfFphy/M3Bx7C3JINaTGue9C58198NpQdE04Ts3Yb/gzEOcjdOkFbQYZ X-Gm-Gg: ASbGncsSCV2drBp/lXlfahMKkmJvMNJslNBQ7HsTkqxhma9wlmQ2iBL4Bft/07sjO6H kWOFJi0ySymIxsRdJ5igv0r3e3UvQFGATfLhV5tbBztl9fcmNOJ6KwpnSlXiOjnxEexQqJJy8fg p4lomoh4RXY/cHjsVpvcqROTIdZkZc4MLhFunxH3flTpWA64ZgIbhCtCeKy9+f46P4wnE1iWnh2 6lE/rRK4JUQoU6u8cZe/B8+jhGy/JrR84iwJUMBBfcN29uLJO58mRwg78e+Z6SQTmFL8z9QzJPn 7khl0UQaCTShQu3JUzStCi0ax8fOqLQTZT2XlAPyuHvC+mayLSYipjt98YckWaWSlxHtzmTThF8 /y5I74DATMyPbK0TUp7iYxpIeo69i3yZnb7v+0Z9ug+QUWqDIJid+IiHULhfJ+MZVSJDtSTvVl2 nvaqOj1NMqMl76RWsVWDIz X-Google-Smtp-Source: AGHT+IHyp9NWySH+cDzcnVvq8I6ZIzBl9JYoz2ufTq/3+N/RimV2Z+kLAg6PlRzSKztugHPQfUdG5g== X-Received: by 2002:a05:6a00:88f:b0:7aa:d1d4:bb68 with SMTP id d2e1a72fcca58-7b7a46ff44bmr3401593b3a.20.1762955879820; Wed, 12 Nov 2025 05:57:59 -0800 (PST) Received: from iku.. ([2401:4900:1c07:5748:1c6:5ce6:4f04:5b55]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7b0f9aabfc0sm18361299b3a.13.2025.11.12.05.57.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 05:57:59 -0800 (PST) From: Prabhakar X-Google-Original-From: Prabhakar To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Horatiu Vultur , Geert Uytterhoeven , Vladimir Oltean , Vadim Fedorenko , Parthiban.Veerasooran@microchip.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar , Biju Das , Fabrizio Castro , Lad Prabhakar Subject: [PATCH net-next v4 4/4] net: phy: mscc: Handle devm_phy_package_join() failure in vsc85xx_probe_common() Date: Wed, 12 Nov 2025 13:57:15 +0000 Message-ID: <20251112135715.1017117-5-prabhakar.mahadev-lad.rj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> References: <20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lad Prabhakar devm_phy_package_join() may fail and return a negative error code. Update vsc85xx_probe_common() to properly handle this failure by checking the return value and propagating the error to the caller. Signed-off-by: Lad Prabhakar --- v3->v4: - New patch --- drivers/net/phy/mscc/mscc_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_m= ain.c index 21fcaf07bc6d..2b9fb8a675a6 100644 --- a/drivers/net/phy/mscc/mscc_main.c +++ b/drivers/net/phy/mscc/mscc_main.c @@ -2264,8 +2264,11 @@ static int vsc85xx_probe_common(struct phy_device *p= hydev, /* Set up package if needed */ if (cfg->use_package) { vsc8584_get_base_addr(phydev); - devm_phy_package_join(&phydev->mdio.dev, phydev, - vsc8531->base_addr, cfg->shared_size); + ret =3D devm_phy_package_join(&phydev->mdio.dev, phydev, + vsc8531->base_addr, + cfg->shared_size); + if (ret) + return ret; } =20 /* Configure LED settings */ --=20 2.43.0