lkml.org 
[lkml]   [2023]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v1 20/43] net: cirrus: add DT support for Cirrus EP93xx
    From
    Date
    Hi!

    On Thu, 2023-06-01 at 08:45 +0300, Nikita Shubin wrote:
    > - find register range from the device tree
    > - get "copy_addr" from the device tree
    > - get phy_id from the device tree
    >
    > Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>

    Works fine on EDB9302

    Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>

    > ---
    >
    > Notes:
    >     v0 -> v1:
    >    
    >     - dropped platform data entirely
    >     - dropped copy_addr
    >     - use phy-handle instead of using non-conventional phy-id
    >
    >  arch/arm/mach-ep93xx/platform.h          |  2 +-
    >  drivers/net/ethernet/cirrus/ep93xx_eth.c | 67 +++++++++++++-----------
    >  2 files changed, 37 insertions(+), 32 deletions(-)
    >
    > diff --git a/arch/arm/mach-ep93xx/platform.h b/arch/arm/mach-ep93xx/platform.h
    > index 5fb1b919133f..3cf2113491d8 100644
    > --- a/arch/arm/mach-ep93xx/platform.h
    > +++ b/arch/arm/mach-ep93xx/platform.h
    > @@ -5,8 +5,8 @@
    >  
    >  #ifndef __ASSEMBLY__
    >  
    > -#include <linux/platform_data/eth-ep93xx.h>
    >  #include <linux/reboot.h>
    > +#include <linux/platform_data/eth-ep93xx.h>
    >  
    >  struct device;
    >  struct i2c_board_info;
    > diff --git a/drivers/net/ethernet/cirrus/ep93xx_eth.c b/drivers/net/ethernet/cirrus/ep93xx_eth.c
    > index 8627ab19d470..41096d4830ff 100644
    > --- a/drivers/net/ethernet/cirrus/ep93xx_eth.c
    > +++ b/drivers/net/ethernet/cirrus/ep93xx_eth.c
    > @@ -17,12 +17,11 @@
    >  #include <linux/interrupt.h>
    >  #include <linux/moduleparam.h>
    >  #include <linux/platform_device.h>
    > +#include <linux/of.h>
    >  #include <linux/delay.h>
    >  #include <linux/io.h>
    >  #include <linux/slab.h>
    >  
    > -#include <linux/platform_data/eth-ep93xx.h>
    > -
    >  #define DRV_MODULE_NAME                "ep93xx-eth"
    >  
    >  #define RX_QUEUE_ENTRIES       64
    > @@ -738,25 +737,6 @@ static const struct net_device_ops ep93xx_netdev_ops = {
    >         .ndo_set_mac_address    = eth_mac_addr,
    >  };
    >  
    > -static struct net_device *ep93xx_dev_alloc(struct ep93xx_eth_data *data)
    > -{
    > -       struct net_device *dev;
    > -
    > -       dev = alloc_etherdev(sizeof(struct ep93xx_priv));
    > -       if (dev == NULL)
    > -               return NULL;
    > -
    > -       eth_hw_addr_set(dev, data->dev_addr);
    > -
    > -       dev->ethtool_ops = &ep93xx_ethtool_ops;
    > -       dev->netdev_ops = &ep93xx_netdev_ops;
    > -
    > -       dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
    > -
    > -       return dev;
    > -}
    > -
    > -
    >  static int ep93xx_eth_remove(struct platform_device *pdev)
    >  {
    >         struct net_device *dev;
    > @@ -788,27 +768,51 @@ static int ep93xx_eth_remove(struct platform_device *pdev)
    >  
    >  static int ep93xx_eth_probe(struct platform_device *pdev)
    >  {
    > -       struct ep93xx_eth_data *data;
    >         struct net_device *dev;
    >         struct ep93xx_priv *ep;
    >         struct resource *mem;
    > +       void __iomem *base_addr;
    > +       struct device_node *np;
    > +       u32 phy_id;
    >         int irq;
    >         int err;
    >  
    >         if (pdev == NULL)
    >                 return -ENODEV;
    > -       data = dev_get_platdata(&pdev->dev);
    >  
    >         mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    >         irq = platform_get_irq(pdev, 0);
    >         if (!mem || irq < 0)
    >                 return -ENXIO;
    >  
    > -       dev = ep93xx_dev_alloc(data);
    > +       base_addr = ioremap(mem->start, resource_size(mem));
    > +       if (!base_addr) {
    > +               dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
    > +               return -EIO;
    > +       }
    > +
    > +       np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
    > +       if (!np) {
    > +               dev_err(&pdev->dev, "Please provide \"phy-handle\"\n");
    > +               return -ENODEV;
    > +       }
    > +
    > +       if (of_property_read_u32(np, "reg", &phy_id)) {
    > +               dev_err(&pdev->dev, "Failed to locate \"phy_id\"\n");
    > +               return -ENOENT;
    > +       }
    > +
    > +       dev = alloc_etherdev(sizeof(struct ep93xx_priv));
    >         if (dev == NULL) {
    >                 err = -ENOMEM;
    >                 goto err_out;
    >         }
    > +
    > +       eth_hw_addr_set(dev, base_addr + 0x50);
    > +       dev->ethtool_ops = &ep93xx_ethtool_ops;
    > +       dev->netdev_ops = &ep93xx_netdev_ops;
    > +       dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
    > +
    >         ep = netdev_priv(dev);
    >         ep->dev = dev;
    >         SET_NETDEV_DEV(dev, &pdev->dev);
    > @@ -824,15 +828,10 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
    >                 goto err_out;
    >         }
    >  
    > -       ep->base_addr = ioremap(mem->start, resource_size(mem));
    > -       if (ep->base_addr == NULL) {
    > -               dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
    > -               err = -EIO;
    > -               goto err_out;
    > -       }
    > +       ep->base_addr = base_addr;
    >         ep->irq = irq;
    >  
    > -       ep->mii.phy_id = data->phy_id;
    > +       ep->mii.phy_id = phy_id;
    >         ep->mii.phy_id_mask = 0x1f;
    >         ep->mii.reg_num_mask = 0x1f;
    >         ep->mii.dev = dev;
    > @@ -859,12 +858,18 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
    >         return err;
    >  }
    >  
    > +static const struct of_device_id ep93xx_eth_of_ids[] = {
    > +       { .compatible = "cirrus,ep9301-eth" },
    > +       { /* sentinel */ }
    > +};
    > +MODULE_DEVICE_TABLE(of, ep93xx_eth_of_ids);
    >  
    >  static struct platform_driver ep93xx_eth_driver = {
    >         .probe          = ep93xx_eth_probe,
    >         .remove         = ep93xx_eth_remove,
    >         .driver         = {
    >                 .name   = "ep93xx-eth",
    > +               .of_match_table = ep93xx_eth_of_ids,
    >         },
    >  };
    >  

    --
    Alexander Sverdlin.

    \
     
     \ /
      Last update: 2023-06-04 17:52    [W:2.074 / U:0.540 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site