16
16
#include <linux/ethtool.h>
17
17
#include <linux/interrupt.h>
18
18
#include <linux/moduleparam.h>
19
+ #include <linux/of.h>
19
20
#include <linux/platform_device.h>
20
21
#include <linux/delay.h>
21
22
#include <linux/io.h>
22
23
#include <linux/slab.h>
23
24
24
- #include <linux/platform_data/eth-ep93xx.h>
25
-
26
25
#define DRV_MODULE_NAME "ep93xx-eth"
27
26
28
27
#define RX_QUEUE_ENTRIES 64
@@ -738,25 +737,6 @@ static const struct net_device_ops ep93xx_netdev_ops = {
738
737
.ndo_set_mac_address = eth_mac_addr ,
739
738
};
740
739
741
- static struct net_device * ep93xx_dev_alloc (struct ep93xx_eth_data * data )
742
- {
743
- struct net_device * dev ;
744
-
745
- dev = alloc_etherdev (sizeof (struct ep93xx_priv ));
746
- if (dev == NULL )
747
- return NULL ;
748
-
749
- eth_hw_addr_set (dev , data -> dev_addr );
750
-
751
- dev -> ethtool_ops = & ep93xx_ethtool_ops ;
752
- dev -> netdev_ops = & ep93xx_netdev_ops ;
753
-
754
- dev -> features |= NETIF_F_SG | NETIF_F_HW_CSUM ;
755
-
756
- return dev ;
757
- }
758
-
759
-
760
740
static void ep93xx_eth_remove (struct platform_device * pdev )
761
741
{
762
742
struct net_device * dev ;
@@ -786,27 +766,47 @@ static void ep93xx_eth_remove(struct platform_device *pdev)
786
766
787
767
static int ep93xx_eth_probe (struct platform_device * pdev )
788
768
{
789
- struct ep93xx_eth_data * data ;
790
769
struct net_device * dev ;
791
770
struct ep93xx_priv * ep ;
792
771
struct resource * mem ;
772
+ void __iomem * base_addr ;
773
+ struct device_node * np ;
774
+ u32 phy_id ;
793
775
int irq ;
794
776
int err ;
795
777
796
778
if (pdev == NULL )
797
779
return - ENODEV ;
798
- data = dev_get_platdata (& pdev -> dev );
799
780
800
781
mem = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
801
782
irq = platform_get_irq (pdev , 0 );
802
783
if (!mem || irq < 0 )
803
784
return - ENXIO ;
804
785
805
- dev = ep93xx_dev_alloc (data );
786
+ base_addr = ioremap (mem -> start , resource_size (mem ));
787
+ if (!base_addr )
788
+ return dev_err_probe (& pdev -> dev , - EIO , "Failed to ioremap ethernet registers\n" );
789
+
790
+ np = of_parse_phandle (pdev -> dev .of_node , "phy-handle" , 0 );
791
+ if (!np )
792
+ return dev_err_probe (& pdev -> dev , - ENODEV , "Please provide \"phy-handle\"\n" );
793
+
794
+ err = of_property_read_u32 (np , "reg" , & phy_id );
795
+ of_node_put (np );
796
+ if (err )
797
+ return dev_err_probe (& pdev -> dev , - ENOENT , "Failed to locate \"phy_id\"\n" );
798
+
799
+ dev = alloc_etherdev (sizeof (struct ep93xx_priv ));
806
800
if (dev == NULL ) {
807
801
err = - ENOMEM ;
808
802
goto err_out ;
809
803
}
804
+
805
+ eth_hw_addr_set (dev , base_addr + 0x50 );
806
+ dev -> ethtool_ops = & ep93xx_ethtool_ops ;
807
+ dev -> netdev_ops = & ep93xx_netdev_ops ;
808
+ dev -> features |= NETIF_F_SG | NETIF_F_HW_CSUM ;
809
+
810
810
ep = netdev_priv (dev );
811
811
ep -> dev = dev ;
812
812
SET_NETDEV_DEV (dev , & pdev -> dev );
@@ -822,15 +822,10 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
822
822
goto err_out ;
823
823
}
824
824
825
- ep -> base_addr = ioremap (mem -> start , resource_size (mem ));
826
- if (ep -> base_addr == NULL ) {
827
- dev_err (& pdev -> dev , "Failed to ioremap ethernet registers\n" );
828
- err = - EIO ;
829
- goto err_out ;
830
- }
825
+ ep -> base_addr = base_addr ;
831
826
ep -> irq = irq ;
832
827
833
- ep -> mii .phy_id = data -> phy_id ;
828
+ ep -> mii .phy_id = phy_id ;
834
829
ep -> mii .phy_id_mask = 0x1f ;
835
830
ep -> mii .reg_num_mask = 0x1f ;
836
831
ep -> mii .dev = dev ;
@@ -857,12 +852,18 @@ static int ep93xx_eth_probe(struct platform_device *pdev)
857
852
return err ;
858
853
}
859
854
855
+ static const struct of_device_id ep93xx_eth_of_ids [] = {
856
+ { .compatible = "cirrus,ep9301-eth" },
857
+ { /* sentinel */ }
858
+ };
859
+ MODULE_DEVICE_TABLE (of , ep93xx_eth_of_ids );
860
860
861
861
static struct platform_driver ep93xx_eth_driver = {
862
862
.probe = ep93xx_eth_probe ,
863
863
.remove_new = ep93xx_eth_remove ,
864
864
.driver = {
865
865
.name = "ep93xx-eth" ,
866
+ .of_match_table = ep93xx_eth_of_ids ,
866
867
},
867
868
};
868
869
0 commit comments