diff mbox series

[net-next,v9,4/9] net: txgbe: Register I2C platform device

Message ID 20230524091722.522118-5-jiawenwu@trustnetic.com
State New
Headers show
Series None | expand

Commit Message

Jiawen Wu May 24, 2023, 9:17 a.m. UTC
Register the platform device to use Designware I2C bus master driver.
Use regmap to read/write I2C device region from given base offset.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Piotr Raczynski <piotr.raczynski@intel.com>
---
 drivers/net/ethernet/wangxun/Kconfig          |  2 +
 .../net/ethernet/wangxun/txgbe/txgbe_phy.c    | 70 +++++++++++++++++++
 .../net/ethernet/wangxun/txgbe/txgbe_type.h   |  4 ++
 3 files changed, 76 insertions(+)

Comments

kernel test robot May 26, 2023, 9:35 a.m. UTC | #1
Hi Jiawen,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Jiawen-Wu/net-txgbe-Add-software-nodes-to-support-phylink/20230524-173221
base:   net-next/main
patch link:    https://lore.kernel.org/r/20230524091722.522118-5-jiawenwu%40trustnetic.com
patch subject: [PATCH net-next v9 4/9] net: txgbe: Register I2C platform device
config: csky-randconfig-r003-20230525 (https://download.01.org/0day-ci/archive/20230526/202305261703.MVtcjtyn-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        mkdir -p ~/bin
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/c1ecc61d2d3c17aeaa4992b8f30a2ddca4eebe83
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Jiawen-Wu/net-txgbe-Add-software-nodes-to-support-phylink/20230524-173221
        git checkout c1ecc61d2d3c17aeaa4992b8f30a2ddca4eebe83
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky SHELL=/bin/bash drivers/i2c/busses/ drivers/net/phy/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202305261703.MVtcjtyn-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/i2c/busses/i2c-designware-platdrv.c: In function 'dw_i2c_plat_probe':
>> drivers/i2c/busses/i2c-designware-platdrv.c:310:9: error: implicit declaration of function 'i2c_parse_fw_timings' [-Werror=implicit-function-declaration]
     310 |         i2c_parse_fw_timings(&pdev->dev, t, false);
         |         ^~~~~~~~~~~~~~~~~~~~
   drivers/i2c/busses/i2c-designware-platdrv.c: In function 'dw_i2c_plat_remove':
>> drivers/i2c/busses/i2c-designware-platdrv.c:408:9: error: implicit declaration of function 'i2c_del_adapter'; did you mean 'i2c_verify_adapter'? [-Werror=implicit-function-declaration]
     408 |         i2c_del_adapter(&dev->adapter);
         |         ^~~~~~~~~~~~~~~
         |         i2c_verify_adapter
   cc1: some warnings being treated as errors

Kconfig warnings: (for reference only)
   WARNING: unmet direct dependencies detected for I2C_DESIGNWARE_PLATFORM
   Depends on [n]: I2C [=n] && HAS_IOMEM [=y] && (ACPI && COMMON_CLK [=y] || !ACPI)
   Selected by [y]:
   - TXGBE [=y] && NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_WANGXUN [=y] && PCI [=y]


vim +/i2c_parse_fw_timings +310 drivers/i2c/busses/i2c-designware-platdrv.c

78d5e9e299e31b Jan Dabros         2022-02-08  275  
6ad6fde3970c98 Jarkko Nikula      2015-08-31  276  static int dw_i2c_plat_probe(struct platform_device *pdev)
2373f6b9744d53 Dirk Brandewie     2011-10-29  277  {
2373f6b9744d53 Dirk Brandewie     2011-10-29  278  	struct i2c_adapter *adap;
e393f674c5fedc Luis Oliveira      2017-06-14  279  	struct dw_i2c_dev *dev;
e3ea52b578be22 Andy Shevchenko    2018-07-25  280  	struct i2c_timings *t;
f9288fcc5c6154 Andy Shevchenko    2020-05-19  281  	int irq, ret;
2373f6b9744d53 Dirk Brandewie     2011-10-29  282  
2373f6b9744d53 Dirk Brandewie     2011-10-29  283  	irq = platform_get_irq(pdev, 0);
b20d386485e259 Alexey Brodkin     2015-03-09  284  	if (irq < 0)
b20d386485e259 Alexey Brodkin     2015-03-09  285  		return irq;
2373f6b9744d53 Dirk Brandewie     2011-10-29  286  
1cb715ca46946b Andy Shevchenko    2013-04-10  287  	dev = devm_kzalloc(&pdev->dev, sizeof(struct dw_i2c_dev), GFP_KERNEL);
1cb715ca46946b Andy Shevchenko    2013-04-10  288  	if (!dev)
1cb715ca46946b Andy Shevchenko    2013-04-10  289  		return -ENOMEM;
2373f6b9744d53 Dirk Brandewie     2011-10-29  290  
fac25d7aaa03c4 Serge Semin        2020-05-28  291  	dev->flags = (uintptr_t)device_get_match_data(&pdev->dev);
b91dbec563d413 Jiawen Wu          2023-05-24  292  	if (device_property_present(&pdev->dev, "wx,i2c-snps-model"))
b91dbec563d413 Jiawen Wu          2023-05-24  293  		dev->flags |= MODEL_WANGXUN_SP;
b91dbec563d413 Jiawen Wu          2023-05-24  294  
1cb715ca46946b Andy Shevchenko    2013-04-10  295  	dev->dev = &pdev->dev;
2373f6b9744d53 Dirk Brandewie     2011-10-29  296  	dev->irq = irq;
2373f6b9744d53 Dirk Brandewie     2011-10-29  297  	platform_set_drvdata(pdev, dev);
2373f6b9744d53 Dirk Brandewie     2011-10-29  298  
b7c3d0777808cd Serge Semin        2020-05-28  299  	ret = dw_i2c_plat_request_regs(dev);
b7c3d0777808cd Serge Semin        2020-05-28  300  	if (ret)
b7c3d0777808cd Serge Semin        2020-05-28  301  		return ret;
b7c3d0777808cd Serge Semin        2020-05-28  302  
ab809fd81fde3d Zhangfei Gao       2016-12-27  303  	dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
a6af48ec0712a0 Andy Shevchenko    2019-08-19  304  	if (IS_ERR(dev->rst))
a6af48ec0712a0 Andy Shevchenko    2019-08-19  305  		return PTR_ERR(dev->rst);
a6af48ec0712a0 Andy Shevchenko    2019-08-19  306  
ab809fd81fde3d Zhangfei Gao       2016-12-27  307  	reset_control_deassert(dev->rst);
ab809fd81fde3d Zhangfei Gao       2016-12-27  308  
e3ea52b578be22 Andy Shevchenko    2018-07-25  309  	t = &dev->timings;
e3ea52b578be22 Andy Shevchenko    2018-07-25 @310  	i2c_parse_fw_timings(&pdev->dev, t, false);
8e5f6b2a289c43 Romain Baeriswyl   2014-08-20  311  
852f71942ce71f Andy Shevchenko    2020-06-23  312  	i2c_dw_adjust_bus_speed(dev);
1732c22abca8f4 Alexandre Belloni  2018-08-31  313  
1bb39959623b43 Alexandre Belloni  2018-08-31  314  	if (pdev->dev.of_node)
1bb39959623b43 Alexandre Belloni  2018-08-31  315  		dw_i2c_of_configure(pdev);
1bb39959623b43 Alexandre Belloni  2018-08-31  316  
4c5301abbf81f4 Mika Westerberg    2015-11-30  317  	if (has_acpi_companion(&pdev->dev))
f9288fcc5c6154 Andy Shevchenko    2020-05-19  318  		i2c_dw_acpi_configure(&pdev->dev);
4c5301abbf81f4 Mika Westerberg    2015-11-30  319  
20ee1d9020c923 Andy Shevchenko    2020-05-19  320  	ret = i2c_dw_validate_speed(dev);
20ee1d9020c923 Andy Shevchenko    2020-05-19  321  	if (ret)
ab809fd81fde3d Zhangfei Gao       2016-12-27  322  		goto exit_reset;
9803f868944e87 Christian Ruppert  2013-06-26  323  
e393f674c5fedc Luis Oliveira      2017-06-14  324  	ret = i2c_dw_probe_lock_support(dev);
e393f674c5fedc Luis Oliveira      2017-06-14  325  	if (ret)
ab809fd81fde3d Zhangfei Gao       2016-12-27  326  		goto exit_reset;
894acb2f823b13 David Box          2015-01-15  327  
3ebe40ed1c3901 Andy Shevchenko    2020-04-25  328  	i2c_dw_configure(dev);
2fa8326b4b1e5f Dirk Brandewie     2011-10-06  329  
c62ebb3d5f0d0e Phil Edworthy      2019-02-28  330  	/* Optional interface clock */
c62ebb3d5f0d0e Phil Edworthy      2019-02-28  331  	dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
71dc297ca9ab63 Andy Shevchenko    2019-08-19  332  	if (IS_ERR(dev->pclk)) {
71dc297ca9ab63 Andy Shevchenko    2019-08-19  333  		ret = PTR_ERR(dev->pclk);
71dc297ca9ab63 Andy Shevchenko    2019-08-19  334  		goto exit_reset;
71dc297ca9ab63 Andy Shevchenko    2019-08-19  335  	}
c62ebb3d5f0d0e Phil Edworthy      2019-02-28  336  
27071b5cbca59d Serge Semin        2022-06-10  337  	dev->clk = devm_clk_get_optional(&pdev->dev, NULL);
27071b5cbca59d Serge Semin        2022-06-10  338  	if (IS_ERR(dev->clk)) {
27071b5cbca59d Serge Semin        2022-06-10  339  		ret = PTR_ERR(dev->clk);
27071b5cbca59d Serge Semin        2022-06-10  340  		goto exit_reset;
27071b5cbca59d Serge Semin        2022-06-10  341  	}
27071b5cbca59d Serge Semin        2022-06-10  342  
27071b5cbca59d Serge Semin        2022-06-10  343  	ret = i2c_dw_prepare_clk(dev, true);
27071b5cbca59d Serge Semin        2022-06-10  344  	if (ret)
27071b5cbca59d Serge Semin        2022-06-10  345  		goto exit_reset;
27071b5cbca59d Serge Semin        2022-06-10  346  
27071b5cbca59d Serge Semin        2022-06-10  347  	if (dev->clk) {
e3ea52b578be22 Andy Shevchenko    2018-07-25  348  		u64 clk_khz;
e3ea52b578be22 Andy Shevchenko    2018-07-25  349  
925ddb240d6c76 Mika Westerberg    2014-09-30  350  		dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
e3ea52b578be22 Andy Shevchenko    2018-07-25  351  		clk_khz = dev->get_clk_rate_khz(dev);
925ddb240d6c76 Mika Westerberg    2014-09-30  352  
e3ea52b578be22 Andy Shevchenko    2018-07-25  353  		if (!dev->sda_hold_time && t->sda_hold_ns)
e3ea52b578be22 Andy Shevchenko    2018-07-25  354  			dev->sda_hold_time =
c045214a0f31dd Andy Shevchenko    2021-07-12  355  				DIV_S64_ROUND_CLOSEST(clk_khz * t->sda_hold_ns, MICRO);
925ddb240d6c76 Mika Westerberg    2014-09-30  356  	}
925ddb240d6c76 Mika Westerberg    2014-09-30  357  
2373f6b9744d53 Dirk Brandewie     2011-10-29  358  	adap = &dev->adapter;
2373f6b9744d53 Dirk Brandewie     2011-10-29  359  	adap->owner = THIS_MODULE;
db2a8b6f1df93d Ricardo Ribalda    2020-07-02  360  	adap->class = dmi_check_system(dw_i2c_hwmon_class_dmi) ?
db2a8b6f1df93d Ricardo Ribalda    2020-07-02  361  					I2C_CLASS_HWMON : I2C_CLASS_DEPRECATED;
8eb5c87a92c065 Dustin Byford      2015-10-23  362  	ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));
af71100c7acf3c Rob Herring        2011-11-08  363  	adap->dev.of_node = pdev->dev.of_node;
77f3381a83c2f6 Hans de Goede      2019-03-12  364  	adap->nr = -1;
2373f6b9744d53 Dirk Brandewie     2011-10-29  365  
d79294d0de12dd Hans de Goede      2020-04-07  366  	if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
d79294d0de12dd Hans de Goede      2020-04-07  367  		dev_pm_set_driver_flags(&pdev->dev,
75507a319876ab Richard Fitzgerald 2022-12-19  368  					DPM_FLAG_SMART_PREPARE);
d79294d0de12dd Hans de Goede      2020-04-07  369  	} else {
02e45646d53bdb Rafael J. Wysocki  2018-01-03  370  		dev_pm_set_driver_flags(&pdev->dev,
02e45646d53bdb Rafael J. Wysocki  2018-01-03  371  					DPM_FLAG_SMART_PREPARE |
75507a319876ab Richard Fitzgerald 2022-12-19  372  					DPM_FLAG_SMART_SUSPEND);
d79294d0de12dd Hans de Goede      2020-04-07  373  	}
422cb781e0d0f8 Rafael J. Wysocki  2018-01-03  374  
7c5b3c158b38dc Rajat Jain         2021-10-25  375  	device_enable_async_suspend(&pdev->dev);
7c5b3c158b38dc Rajat Jain         2021-10-25  376  
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  377  	/* The code below assumes runtime PM to be disabled. */
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  378  	WARN_ON(pm_runtime_enabled(&pdev->dev));
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  379  
43452335224bc0 Mika Westerberg    2013-04-10  380  	pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
43452335224bc0 Mika Westerberg    2013-04-10  381  	pm_runtime_use_autosuspend(&pdev->dev);
7272194ed391f9 Mika Westerberg    2013-01-17  382  	pm_runtime_set_active(&pdev->dev);
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  383  
9cbeeca05049b1 Hans de Goede      2018-09-05  384  	if (dev->shared_with_punit)
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  385  		pm_runtime_get_noresume(&pdev->dev);
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  386  
7272194ed391f9 Mika Westerberg    2013-01-17  387  	pm_runtime_enable(&pdev->dev);
7272194ed391f9 Mika Westerberg    2013-01-17  388  
e393f674c5fedc Luis Oliveira      2017-06-14  389  	ret = i2c_dw_probe(dev);
e393f674c5fedc Luis Oliveira      2017-06-14  390  	if (ret)
ab809fd81fde3d Zhangfei Gao       2016-12-27  391  		goto exit_probe;
ab809fd81fde3d Zhangfei Gao       2016-12-27  392  
e393f674c5fedc Luis Oliveira      2017-06-14  393  	return ret;
36d48fb5766aee Wolfram Sang       2015-10-09  394  
ab809fd81fde3d Zhangfei Gao       2016-12-27  395  exit_probe:
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  396  	dw_i2c_plat_pm_cleanup(dev);
ab809fd81fde3d Zhangfei Gao       2016-12-27  397  exit_reset:
ab809fd81fde3d Zhangfei Gao       2016-12-27  398  	reset_control_assert(dev->rst);
e393f674c5fedc Luis Oliveira      2017-06-14  399  	return ret;
2373f6b9744d53 Dirk Brandewie     2011-10-29  400  }
2373f6b9744d53 Dirk Brandewie     2011-10-29  401  
6ad6fde3970c98 Jarkko Nikula      2015-08-31  402  static int dw_i2c_plat_remove(struct platform_device *pdev)
2373f6b9744d53 Dirk Brandewie     2011-10-29  403  {
2373f6b9744d53 Dirk Brandewie     2011-10-29  404  	struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
2373f6b9744d53 Dirk Brandewie     2011-10-29  405  
7272194ed391f9 Mika Westerberg    2013-01-17  406  	pm_runtime_get_sync(&pdev->dev);
7272194ed391f9 Mika Westerberg    2013-01-17  407  
2373f6b9744d53 Dirk Brandewie     2011-10-29 @408  	i2c_del_adapter(&dev->adapter);
2373f6b9744d53 Dirk Brandewie     2011-10-29  409  
90312351fd1e47 Luis Oliveira      2017-06-14  410  	dev->disable(dev);
2373f6b9744d53 Dirk Brandewie     2011-10-29  411  
edfc39012364a6 Mika Westerberg    2015-06-17  412  	pm_runtime_dont_use_autosuspend(&pdev->dev);
edfc39012364a6 Mika Westerberg    2015-06-17  413  	pm_runtime_put_sync(&pdev->dev);
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  414  	dw_i2c_plat_pm_cleanup(dev);
126dbc6b49c867 Rafael J. Wysocki  2017-09-25  415  
78d5e9e299e31b Jan Dabros         2022-02-08  416  	i2c_dw_remove_lock_support(dev);
78d5e9e299e31b Jan Dabros         2022-02-08  417  
ab809fd81fde3d Zhangfei Gao       2016-12-27  418  	reset_control_assert(dev->rst);
7272194ed391f9 Mika Westerberg    2013-01-17  419  
2373f6b9744d53 Dirk Brandewie     2011-10-29  420  	return 0;
2373f6b9744d53 Dirk Brandewie     2011-10-29  421  }
2373f6b9744d53 Dirk Brandewie     2011-10-29  422
Andy Shevchenko May 27, 2023, 8:38 a.m. UTC | #2
On Wed, May 24, 2023 at 05:17:17PM +0800, Jiawen Wu wrote:
> Register the platform device to use Designware I2C bus master driver.
> Use regmap to read/write I2C device region from given base offset.

...

> +#include <linux/platform_device.h>

Can this be ordered (to some extent), please?

>  #include <linux/gpio/property.h>
>  #include <linux/clk-provider.h>
>  #include <linux/clkdev.h>
> +#include <linux/regmap.h>

This too.

>  #include <linux/i2c.h>
>  #include <linux/pci.h>

Somewhere here...

...

Otherwise looks good, thank you.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/wangxun/Kconfig b/drivers/net/ethernet/wangxun/Kconfig
index a62614eeed2e..ec058a72afb6 100644
--- a/drivers/net/ethernet/wangxun/Kconfig
+++ b/drivers/net/ethernet/wangxun/Kconfig
@@ -40,6 +40,8 @@  config NGBE
 config TXGBE
 	tristate "Wangxun(R) 10GbE PCI Express adapters support"
 	depends on PCI
+	select I2C_DESIGNWARE_PLATFORM
+	select REGMAP
 	select COMMON_CLK
 	select LIBWX
 	help
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c
index 06506cfb8d06..6ea33e753df4 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c
@@ -1,9 +1,11 @@ 
 // SPDX-License-Identifier: GPL-2.0
 /* Copyright (c) 2015 - 2023 Beijing WangXun Technology Co., Ltd. */
 
+#include <linux/platform_device.h>
 #include <linux/gpio/property.h>
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
+#include <linux/regmap.h>
 #include <linux/i2c.h>
 #include <linux/pci.h>
 
@@ -98,6 +100,64 @@  static int txgbe_clock_register(struct txgbe *txgbe)
 	return 0;
 }
 
+static int txgbe_i2c_read(void *context, unsigned int reg, unsigned int *val)
+{
+	struct wx *wx = context;
+
+	*val = rd32(wx, reg + TXGBE_I2C_BASE);
+
+	return 0;
+}
+
+static int txgbe_i2c_write(void *context, unsigned int reg, unsigned int val)
+{
+	struct wx *wx = context;
+
+	wr32(wx, reg + TXGBE_I2C_BASE, val);
+
+	return 0;
+}
+
+static const struct regmap_config i2c_regmap_config = {
+	.reg_bits = 32,
+	.val_bits = 32,
+	.reg_read = txgbe_i2c_read,
+	.reg_write = txgbe_i2c_write,
+	.fast_io = true,
+};
+
+static int txgbe_i2c_register(struct txgbe *txgbe)
+{
+	struct platform_device_info info = {};
+	struct platform_device *i2c_dev;
+	struct regmap *i2c_regmap;
+	struct pci_dev *pdev;
+	struct wx *wx;
+
+	wx = txgbe->wx;
+	pdev = wx->pdev;
+	i2c_regmap = devm_regmap_init(&pdev->dev, NULL, wx, &i2c_regmap_config);
+	if (IS_ERR(i2c_regmap)) {
+		wx_err(wx, "failed to init I2C regmap\n");
+		return PTR_ERR(i2c_regmap);
+	}
+
+	info.parent = &pdev->dev;
+	info.fwnode = software_node_fwnode(txgbe->nodes.group[SWNODE_I2C]);
+	info.name = "i2c_designware";
+	info.id = (pdev->bus->number << 8) | pdev->devfn;
+
+	info.res = &DEFINE_RES_IRQ(pdev->irq);
+	info.num_res = 1;
+	i2c_dev = platform_device_register_full(&info);
+	if (IS_ERR(i2c_dev))
+		return PTR_ERR(i2c_dev);
+
+	txgbe->i2c_dev = i2c_dev;
+
+	return 0;
+}
+
 int txgbe_init_phy(struct txgbe *txgbe)
 {
 	int ret;
@@ -114,8 +174,17 @@  int txgbe_init_phy(struct txgbe *txgbe)
 		goto err_unregister_swnode;
 	}
 
+	ret = txgbe_i2c_register(txgbe);
+	if (ret) {
+		wx_err(txgbe->wx, "failed to init i2c interface: %d\n", ret);
+		goto err_unregister_clk;
+	}
+
 	return 0;
 
+err_unregister_clk:
+	clkdev_drop(txgbe->clock);
+	clk_unregister(txgbe->clk);
 err_unregister_swnode:
 	software_node_unregister_node_group(txgbe->nodes.group);
 
@@ -124,6 +193,7 @@  int txgbe_init_phy(struct txgbe *txgbe)
 
 void txgbe_remove_phy(struct txgbe *txgbe)
 {
+	platform_device_unregister(txgbe->i2c_dev);
 	clkdev_drop(txgbe->clock);
 	clk_unregister(txgbe->clk);
 	software_node_unregister_node_group(txgbe->nodes.group);
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
index cdbc4b37f832..55979abf01f2 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
@@ -55,6 +55,9 @@ 
 #define TXGBE_TS_CTL                            0x10300
 #define TXGBE_TS_CTL_EVAL_MD                    BIT(31)
 
+/* I2C registers */
+#define TXGBE_I2C_BASE                          0x14900
+
 /* Part Number String Length */
 #define TXGBE_PBANUM_LENGTH                     32
 
@@ -146,6 +149,7 @@  struct txgbe_nodes {
 struct txgbe {
 	struct wx *wx;
 	struct txgbe_nodes nodes;
+	struct platform_device *i2c_dev;
 	struct clk_lookup *clock;
 	struct clk *clk;
 };