-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ethernet: arc: Add support for specific SoC layer device tree bindings
Some platforms have special bank registers which might be used to select the correct clock or the right mode for Media Indepent Interface controllers. Sometimes, it is also required to activate vcc regulators in the right order to supply the ethernet controller at the right time. This patch is an architecture refactoring of the arc-emac device driver. It adds a new software design which allows to add specific platform glue layer. Each platform has now its own module which performs custom initialization and remove for the target and then calls to the core driver. Signed-off-by: Romain Perier <romain.perier@gmail.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Romain Perier
authored and
David S. Miller
committed
Aug 27, 2014
1 parent
93e91b3
commit 23d2d9a
Showing
5 changed files
with
129 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/** | ||
* emac_arc.c - ARC EMAC specific glue layer | ||
* | ||
* Copyright (C) 2014 Romain Perier | ||
* | ||
* Romain Perier <romain.perier@gmail.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#include <linux/etherdevice.h> | ||
#include <linux/module.h> | ||
#include <linux/of_net.h> | ||
#include <linux/platform_device.h> | ||
|
||
#include "emac.h" | ||
|
||
#define DRV_NAME "emac_arc" | ||
#define DRV_VERSION "1.0" | ||
|
||
static int emac_arc_probe(struct platform_device *pdev) | ||
{ | ||
struct device *dev = &pdev->dev; | ||
struct net_device *ndev; | ||
struct arc_emac_priv *priv; | ||
int interface, err; | ||
|
||
if (!dev->of_node) | ||
return -ENODEV; | ||
|
||
ndev = alloc_etherdev(sizeof(struct arc_emac_priv)); | ||
if (!ndev) | ||
return -ENOMEM; | ||
platform_set_drvdata(pdev, ndev); | ||
SET_NETDEV_DEV(ndev, dev); | ||
|
||
priv = netdev_priv(ndev); | ||
priv->drv_name = DRV_NAME; | ||
priv->drv_version = DRV_VERSION; | ||
|
||
interface = of_get_phy_mode(dev->of_node); | ||
if (interface < 0) | ||
interface = PHY_INTERFACE_MODE_MII; | ||
|
||
priv->clk = devm_clk_get(dev, "hclk"); | ||
if (IS_ERR(priv->clk)) { | ||
dev_err(dev, "failed to retrieve host clock from device tree\n"); | ||
err = -EINVAL; | ||
goto out_netdev; | ||
} | ||
|
||
err = arc_emac_probe(ndev, interface); | ||
out_netdev: | ||
if (err) | ||
free_netdev(ndev); | ||
return err; | ||
} | ||
|
||
static int emac_arc_remove(struct platform_device *pdev) | ||
{ | ||
struct net_device *ndev = platform_get_drvdata(pdev); | ||
int err; | ||
|
||
err = arc_emac_remove(ndev); | ||
free_netdev(ndev); | ||
return err; | ||
} | ||
|
||
static const struct of_device_id emac_arc_dt_ids[] = { | ||
{ .compatible = "snps,arc-emac" }, | ||
{ /* Sentinel */ } | ||
}; | ||
|
||
static struct platform_driver emac_arc_driver = { | ||
.probe = emac_arc_probe, | ||
.remove = emac_arc_remove, | ||
.driver = { | ||
.name = DRV_NAME, | ||
.of_match_table = emac_arc_dt_ids, | ||
}, | ||
}; | ||
|
||
module_platform_driver(emac_arc_driver); | ||
|
||
MODULE_AUTHOR("Romain Perier <romain.perier@gmail.com>"); | ||
MODULE_DESCRIPTION("ARC EMAC platform driver"); | ||
MODULE_LICENSE("GPL"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters