Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /**
0003  * DOC: emac_arc.c - ARC EMAC specific glue layer
0004  *
0005  * Copyright (C) 2014 Romain Perier
0006  *
0007  * Romain Perier  <romain.perier@gmail.com>
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     { /* Sentinel */ }
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");