Commit b63f2048 authored by Jiawen Wu's avatar Jiawen Wu Committed by Paolo Abeni
Browse files

net: txgbe: Register fixed rate clock



In order for I2C to be able to work in standard mode, register a fixed
rate clock for each I2C device.

Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent c3e382ad
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ config NGBE
config TXGBE
	tristate "Wangxun(R) 10GbE PCI Express adapters support"
	depends on PCI
	depends on COMMON_CLK
	select LIBWX
	help
	  This driver supports Wangxun(R) 10GbE PCI Express family of
+41 −0
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@
/* Copyright (c) 2015 - 2023 Beijing WangXun Technology Co., Ltd. */

#include <linux/gpio/property.h>
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/i2c.h>
#include <linux/pci.h>

@@ -70,6 +72,32 @@ static int txgbe_swnodes_register(struct txgbe *txgbe)
	return software_node_register_node_group(nodes->group);
}

static int txgbe_clock_register(struct txgbe *txgbe)
{
	struct pci_dev *pdev = txgbe->wx->pdev;
	struct clk_lookup *clock;
	char clk_name[32];
	struct clk *clk;

	snprintf(clk_name, sizeof(clk_name), "i2c_designware.%d",
		 (pdev->bus->number << 8) | pdev->devfn);

	clk = clk_register_fixed_rate(NULL, clk_name, NULL, 0, 156250000);
	if (IS_ERR(clk))
		return PTR_ERR(clk);

	clock = clkdev_create(clk, NULL, clk_name);
	if (!clock) {
		clk_unregister(clk);
		return -ENOMEM;
	}

	txgbe->clk = clk;
	txgbe->clock = clock;

	return 0;
}

int txgbe_init_phy(struct txgbe *txgbe)
{
	int ret;
@@ -80,10 +108,23 @@ int txgbe_init_phy(struct txgbe *txgbe)
		return ret;
	}

	ret = txgbe_clock_register(txgbe);
	if (ret) {
		wx_err(txgbe->wx, "failed to register clock: %d\n", ret);
		goto err_unregister_swnode;
	}

	return 0;

err_unregister_swnode:
	software_node_unregister_node_group(txgbe->nodes.group);

	return ret;
}

void txgbe_remove_phy(struct txgbe *txgbe)
{
	clkdev_drop(txgbe->clock);
	clk_unregister(txgbe->clk);
	software_node_unregister_node_group(txgbe->nodes.group);
}
+2 −0
Original line number Diff line number Diff line
@@ -147,6 +147,8 @@ struct txgbe_nodes {
struct txgbe {
	struct wx *wx;
	struct txgbe_nodes nodes;
	struct clk_lookup *clock;
	struct clk *clk;
};

#endif /* _TXGBE_TYPE_H_ */