[PATCH v6 2/9] phy: phy-can-transceiver: Introduce can_transceiver_priv
From: Peng Fan <peng.fan@nxp.com>
Date: 2025-09-09 05:40:48
Also in:
imx, linux-can, linux-devicetree, linux-phy, lkml
Subsystem:
can network drivers, generic phy framework, the rest · Maintainers:
Marc Kleine-Budde, Vincent Mailhol, Vinod Koul, Linus Torvalds
To prepare for dual-channel phy support, introduce can_transceiver_priv as a higher level encapsulation for phy and mux_state. No functional changes. Reviewed-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com> --- drivers/phy/phy-can-transceiver.c | 41 ++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/phy/phy-can-transceiver.c b/drivers/phy/phy-can-transceiver.c
index f59caff4b3d4c267feca4220bf1547b6fad08f95..6415c6af0e8414a6cc8d15958a17ee749a3f28e9 100644
--- a/drivers/phy/phy-can-transceiver.c
+++ b/drivers/phy/phy-can-transceiver.c@@ -23,6 +23,11 @@ struct can_transceiver_phy { struct phy *generic_phy; struct gpio_desc *standby_gpio; struct gpio_desc *enable_gpio; + struct can_transceiver_priv *priv; +}; + +struct can_transceiver_priv { + struct can_transceiver_phy *can_transceiver_phy; struct mux_state *mux_state; };
@@ -32,8 +37,8 @@ static int can_transceiver_phy_power_on(struct phy *phy) struct can_transceiver_phy *can_transceiver_phy = phy_get_drvdata(phy); int ret; - if (can_transceiver_phy->mux_state) { - ret = mux_state_select(can_transceiver_phy->mux_state); + if (can_transceiver_phy->priv->mux_state) { + ret = mux_state_select(can_transceiver_phy->priv->mux_state); if (ret) { dev_err(&phy->dev, "Failed to select CAN mux: %d\n", ret); return ret;
@@ -56,8 +61,8 @@ static int can_transceiver_phy_power_off(struct phy *phy) gpiod_set_value_cansleep(can_transceiver_phy->standby_gpio, 1); if (can_transceiver_phy->enable_gpio) gpiod_set_value_cansleep(can_transceiver_phy->enable_gpio, 0); - if (can_transceiver_phy->mux_state) - mux_state_deselect(can_transceiver_phy->mux_state); + if (can_transceiver_phy->priv->mux_state) + mux_state_deselect(can_transceiver_phy->priv->mux_state); return 0; }
@@ -107,7 +112,7 @@ static int can_transceiver_phy_probe(struct platform_device *pdev) { struct phy_provider *phy_provider; struct device *dev = &pdev->dev; - struct can_transceiver_phy *can_transceiver_phy; + struct can_transceiver_priv *priv; const struct can_transceiver_data *drvdata; const struct of_device_id *match; struct phy *phy;
@@ -117,18 +122,25 @@ static int can_transceiver_phy_probe(struct platform_device *pdev) u32 max_bitrate = 0; int err; - can_transceiver_phy = devm_kzalloc(dev, sizeof(struct can_transceiver_phy), GFP_KERNEL); - if (!can_transceiver_phy) - return -ENOMEM; - match = of_match_node(can_transceiver_phy_ids, pdev->dev.of_node); drvdata = match->data; + priv = devm_kzalloc(dev, sizeof(struct can_transceiver_priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + platform_set_drvdata(pdev, priv); + + priv->can_transceiver_phy = devm_kzalloc(dev, sizeof(struct can_transceiver_phy), + GFP_KERNEL); + if (!priv->can_transceiver_phy) + return -ENOMEM; + mux_state = devm_mux_state_get_optional(dev, NULL); if (IS_ERR(mux_state)) return PTR_ERR(mux_state); - can_transceiver_phy->mux_state = mux_state; + priv->mux_state = mux_state; phy = devm_phy_create(dev, dev->of_node, &can_transceiver_phy_ops);
@@ -142,23 +154,24 @@ static int can_transceiver_phy_probe(struct platform_device *pdev) dev_warn(dev, "Invalid value for transceiver max bitrate. Ignoring bitrate limit\n"); phy->attrs.max_link_rate = max_bitrate; - can_transceiver_phy->generic_phy = phy; + priv->can_transceiver_phy->generic_phy = phy; + priv->can_transceiver_phy->priv = priv; if (drvdata->flags & CAN_TRANSCEIVER_STB_PRESENT) { standby_gpio = devm_gpiod_get_optional(dev, "standby", GPIOD_OUT_HIGH); if (IS_ERR(standby_gpio)) return PTR_ERR(standby_gpio); - can_transceiver_phy->standby_gpio = standby_gpio; + priv->can_transceiver_phy->standby_gpio = standby_gpio; } if (drvdata->flags & CAN_TRANSCEIVER_EN_PRESENT) { enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW); if (IS_ERR(enable_gpio)) return PTR_ERR(enable_gpio); - can_transceiver_phy->enable_gpio = enable_gpio; + priv->can_transceiver_phy->enable_gpio = enable_gpio; } - phy_set_drvdata(can_transceiver_phy->generic_phy, can_transceiver_phy); + phy_set_drvdata(priv->can_transceiver_phy->generic_phy, priv->can_transceiver_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
--
2.37.1