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

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
......@@ -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
......
......@@ -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);
}
......@@ -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_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment