0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/etherdevice.h>
0011 #include <linux/module.h>
0012 #include <linux/of_net.h>
0013 #include <linux/platform_device.h>
0014
0015 #include "emac.h"
0016
0017 #define DRV_NAME "emac_arc"
0018
0019 static int emac_arc_probe(struct platform_device *pdev)
0020 {
0021 struct device *dev = &pdev->dev;
0022 struct arc_emac_priv *priv;
0023 phy_interface_t interface;
0024 struct net_device *ndev;
0025 int err;
0026
0027 if (!dev->of_node)
0028 return -ENODEV;
0029
0030 ndev = alloc_etherdev(sizeof(struct arc_emac_priv));
0031 if (!ndev)
0032 return -ENOMEM;
0033 platform_set_drvdata(pdev, ndev);
0034 SET_NETDEV_DEV(ndev, dev);
0035
0036 priv = netdev_priv(ndev);
0037 priv->drv_name = DRV_NAME;
0038
0039 err = of_get_phy_mode(dev->of_node, &interface);
0040 if (err) {
0041 if (err == -ENODEV)
0042 interface = PHY_INTERFACE_MODE_MII;
0043 else
0044 goto out_netdev;
0045 }
0046
0047 priv->clk = devm_clk_get(dev, "hclk");
0048 if (IS_ERR(priv->clk)) {
0049 dev_err(dev, "failed to retrieve host clock from device tree\n");
0050 err = -EINVAL;
0051 goto out_netdev;
0052 }
0053
0054 err = arc_emac_probe(ndev, interface);
0055 out_netdev:
0056 if (err)
0057 free_netdev(ndev);
0058 return err;
0059 }
0060
0061 static int emac_arc_remove(struct platform_device *pdev)
0062 {
0063 struct net_device *ndev = platform_get_drvdata(pdev);
0064 int err;
0065
0066 err = arc_emac_remove(ndev);
0067 free_netdev(ndev);
0068 return err;
0069 }
0070
0071 static const struct of_device_id emac_arc_dt_ids[] = {
0072 { .compatible = "snps,arc-emac" },
0073 { }
0074 };
0075 MODULE_DEVICE_TABLE(of, emac_arc_dt_ids);
0076
0077 static struct platform_driver emac_arc_driver = {
0078 .probe = emac_arc_probe,
0079 .remove = emac_arc_remove,
0080 .driver = {
0081 .name = DRV_NAME,
0082 .of_match_table = emac_arc_dt_ids,
0083 },
0084 };
0085
0086 module_platform_driver(emac_arc_driver);
0087
0088 MODULE_AUTHOR("Romain Perier <romain.perier@gmail.com>");
0089 MODULE_DESCRIPTION("ARC EMAC platform driver");
0090 MODULE_LICENSE("GPL");