diff options
author | Lucas Stach <dev@lynxeye.de> | 2019-11-09 15:28:26 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-11-11 09:15:55 +0100 |
commit | 269b39454d5929e3352ab02761df63f0e2fbae79 (patch) | |
tree | 1bb2cbbc4ebab3737c6643259bf8f8ef19f365cd | |
parent | 667f2367d35ef967fd766b134b0746fa3a17e3f4 (diff) | |
download | barebox-269b39454d5929e3352ab02761df63f0e2fbae79.tar.gz barebox-269b39454d5929e3352ab02761df63f0e2fbae79.tar.xz |
net: macb: handle more clocks
Both pclk and hclk are required clocks in the DT binding.
rx_clk and tx_clk are optional, but must be enabled if a system
has separate gates for them.
Signed-off-by: Lucas Stach <dev@lynxeye.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/net/macb.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index c4ab9efb63..df1e606454 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -69,7 +69,7 @@ struct macb_device { int phy_addr; - struct clk *pclk; + struct clk *pclk, *hclk, *txclk, *rxclk; const struct device_d *dev; struct eth_device netdev; @@ -653,7 +653,7 @@ static int macb_probe(struct device_d *dev) struct resource *iores; struct eth_device *edev; struct macb_device *macb; - const char *pclk_name; + const char *pclk_name, *hclk_name; u32 ncfgr; macb = xzalloc(sizeof(*macb)); @@ -689,6 +689,7 @@ static int macb_probe(struct device_d *dev) macb->phy_addr = pdata->phy_addr; macb->phy_flags = pdata->phy_flags; pclk_name = "macb_clk"; + hclk_name = NULL; } else if (IS_ENABLED(CONFIG_OFDEVICE) && dev->device_node) { int ret; struct device_node *mdiobus; @@ -705,6 +706,7 @@ static int macb_probe(struct device_d *dev) macb->phy_addr = -1; pclk_name = "pclk"; + hclk_name = "hclk"; } else { dev_err(dev, "macb: no platform_data\n"); return -ENODEV; @@ -727,6 +729,24 @@ static int macb_probe(struct device_d *dev) clk_enable(macb->pclk); + if (hclk_name) { + macb->hclk = clk_get(dev, pclk_name); + if (IS_ERR(macb->pclk)) { + dev_err(dev, "no hclk\n"); + return PTR_ERR(macb->hclk); + } + + clk_enable(macb->hclk); + } + + macb->txclk = clk_get(dev, "tx_clk"); + if (!IS_ERR(macb->txclk)) + clk_enable(macb->txclk); + + macb->rxclk = clk_get(dev, "rx_clk"); + if (!IS_ERR(macb->rxclk)) + clk_enable(macb->rxclk); + macb->is_gem = read_is_gem(macb); if (macb_is_gem(macb)) |