2010-10-27 02:07:13 +04:00
/*
* OF helpers for network devices .
*
* This file is released under the GPLv2
*
* Initially copied out of arch / powerpc / kernel / prom_parse . c
*/
# include <linux/etherdevice.h>
# include <linux/kernel.h>
# include <linux/of_net.h>
2011-07-04 10:03:17 +04:00
# include <linux/phy.h>
2011-07-29 10:05:38 +04:00
# include <linux/export.h>
2011-07-04 10:03:17 +04:00
/**
* It maps ' enum phy_interface_t ' found in include / linux / phy . h
* into the device tree binding of ' phy - mode ' , so that Ethernet
* device driver can get phy interface from device tree .
*/
static const char * phy_modes [ ] = {
2011-07-05 12:42:09 +04:00
[ PHY_INTERFACE_MODE_NA ] = " " ,
2011-07-04 10:03:17 +04:00
[ PHY_INTERFACE_MODE_MII ] = " mii " ,
[ PHY_INTERFACE_MODE_GMII ] = " gmii " ,
[ PHY_INTERFACE_MODE_SGMII ] = " sgmii " ,
[ PHY_INTERFACE_MODE_TBI ] = " tbi " ,
2013-05-28 08:07:21 +04:00
[ PHY_INTERFACE_MODE_REVMII ] = " rev-mii " ,
2011-07-04 10:03:17 +04:00
[ PHY_INTERFACE_MODE_RMII ] = " rmii " ,
[ PHY_INTERFACE_MODE_RGMII ] = " rgmii " ,
[ PHY_INTERFACE_MODE_RGMII_ID ] = " rgmii-id " ,
[ PHY_INTERFACE_MODE_RGMII_RXID ] = " rgmii-rxid " ,
[ PHY_INTERFACE_MODE_RGMII_TXID ] = " rgmii-txid " ,
[ PHY_INTERFACE_MODE_RTBI ] = " rtbi " ,
2011-07-05 12:42:09 +04:00
[ PHY_INTERFACE_MODE_SMII ] = " smii " ,
2011-07-04 10:03:17 +04:00
} ;
/**
* of_get_phy_mode - Get phy mode for given device_node
* @ np : Pointer to the given device_node
*
* The function gets phy interface string from property ' phy - mode ' ,
* and return its index in phy_modes table , or errno in error case .
*/
2013-08-18 15:01:30 +04:00
int of_get_phy_mode ( struct device_node * np )
2011-07-04 10:03:17 +04:00
{
const char * pm ;
int err , i ;
err = of_property_read_string ( np , " phy-mode " , & pm ) ;
if ( err < 0 )
return err ;
for ( i = 0 ; i < ARRAY_SIZE ( phy_modes ) ; i + + )
if ( ! strcasecmp ( pm , phy_modes [ i ] ) )
return i ;
return - ENODEV ;
}
EXPORT_SYMBOL_GPL ( of_get_phy_mode ) ;
2010-10-27 02:07:13 +04:00
/**
* Search the device tree for the best MAC address to use . ' mac - address ' is
* checked first , because that is supposed to contain to " most recent " MAC
* address . If that isn ' t set , then ' local - mac - address ' is checked next ,
* because that is the default address . If that isn ' t set , then the obsolete
* ' address ' is checked , just in case we ' re using an old device tree .
*
* Note that the ' address ' property is supposed to contain a virtual address of
* the register set , but some DTS files have redefined that property to be the
* MAC address .
*
* All - zero MAC addresses are rejected , because those could be properties that
* exist in the device tree , but were not set by U - Boot . For example , the
* DTS could define ' mac - address ' and ' local - mac - address ' , with zero MAC
* addresses . Some older U - Boots only initialized ' local - mac - address ' . In
* this case , the real MAC is in ' local - mac - address ' , and ' mac - address ' exists
* but is all zeros .
*/
const void * of_get_mac_address ( struct device_node * np )
{
struct property * pp ;
pp = of_find_property ( np , " mac-address " , NULL ) ;
if ( pp & & ( pp - > length = = 6 ) & & is_valid_ether_addr ( pp - > value ) )
return pp - > value ;
pp = of_find_property ( np , " local-mac-address " , NULL ) ;
if ( pp & & ( pp - > length = = 6 ) & & is_valid_ether_addr ( pp - > value ) )
return pp - > value ;
pp = of_find_property ( np , " address " , NULL ) ;
if ( pp & & ( pp - > length = = 6 ) & & is_valid_ether_addr ( pp - > value ) )
return pp - > value ;
return NULL ;
}
EXPORT_SYMBOL ( of_get_mac_address ) ;