net: txgbe: Add SFP module identify
authorJiawen Wu <jiawenwu@trustnetic.com>
Tue, 6 Jun 2023 09:21:03 +0000 (17:21 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 8 Jun 2023 11:25:10 +0000 (13:25 +0200)
Register SFP platform device to get modules information.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/wangxun/Kconfig
drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c
drivers/net/ethernet/wangxun/txgbe/txgbe_type.h

index 128cc1c..59f3a3f 100644 (file)
@@ -44,6 +44,9 @@ config TXGBE
        select REGMAP
        select I2C
        select I2C_DESIGNWARE_PLATFORM
+       select PHYLINK
+       select HWMON if TXGBE=y
+       select SFP
        select LIBWX
        help
          This driver supports Wangxun(R) 10GbE PCI Express family of
index 24a7291..d95dc13 100644 (file)
@@ -158,6 +158,25 @@ static int txgbe_i2c_register(struct txgbe *txgbe)
        return 0;
 }
 
+static int txgbe_sfp_register(struct txgbe *txgbe)
+{
+       struct pci_dev *pdev = txgbe->wx->pdev;
+       struct platform_device_info info = {};
+       struct platform_device *sfp_dev;
+
+       info.parent = &pdev->dev;
+       info.fwnode = software_node_fwnode(txgbe->nodes.group[SWNODE_SFP]);
+       info.name = "sfp";
+       info.id = (pdev->bus->number << 8) | pdev->devfn;
+       sfp_dev = platform_device_register_full(&info);
+       if (IS_ERR(sfp_dev))
+               return PTR_ERR(sfp_dev);
+
+       txgbe->sfp_dev = sfp_dev;
+
+       return 0;
+}
+
 int txgbe_init_phy(struct txgbe *txgbe)
 {
        int ret;
@@ -180,8 +199,16 @@ int txgbe_init_phy(struct txgbe *txgbe)
                goto err_unregister_clk;
        }
 
+       ret = txgbe_sfp_register(txgbe);
+       if (ret) {
+               wx_err(txgbe->wx, "failed to register sfp\n");
+               goto err_unregister_i2c;
+       }
+
        return 0;
 
+err_unregister_i2c:
+       platform_device_unregister(txgbe->i2c_dev);
 err_unregister_clk:
        clkdev_drop(txgbe->clock);
        clk_unregister(txgbe->clk);
@@ -193,6 +220,7 @@ err_unregister_swnode:
 
 void txgbe_remove_phy(struct txgbe *txgbe)
 {
+       platform_device_unregister(txgbe->sfp_dev);
        platform_device_unregister(txgbe->i2c_dev);
        clkdev_drop(txgbe->clock);
        clk_unregister(txgbe->clk);
index 6e471a4..f420e25 100644 (file)
@@ -150,6 +150,7 @@ struct txgbe_nodes {
 struct txgbe {
        struct wx *wx;
        struct txgbe_nodes nodes;
+       struct platform_device *sfp_dev;
        struct platform_device *i2c_dev;
        struct clk_lookup *clock;
        struct clk *clk;