2019-04-26 20:12:23 +03:00
// SPDX-License-Identifier: GPL-2.0+
2015-01-28 11:33:04 -08:00
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/of.h>
# include <linux/of_device.h>
# include <linux/regmap.h>
# include <linux/mfd/syscon.h>
2015-02-04 12:31:28 +00:00
# include "cpsw.h"
2015-09-21 15:56:50 +05:30
# define CTRL_MAC_LO_REG(offset, id) ((offset) + 0x8 * (id))
# define CTRL_MAC_HI_REG(offset, id) ((offset) + 0x8 * (id) + 0x4)
2015-01-28 11:33:04 -08:00
2015-09-21 15:56:50 +05:30
static int davinci_emac_3517_get_macid ( struct device * dev , u16 offset ,
int slave , u8 * mac_addr )
{
u32 macid_lsb ;
u32 macid_msb ;
struct regmap * syscon ;
syscon = syscon_regmap_lookup_by_phandle ( dev - > of_node , " syscon " ) ;
if ( IS_ERR ( syscon ) ) {
if ( PTR_ERR ( syscon ) = = - ENODEV )
return 0 ;
return PTR_ERR ( syscon ) ;
}
regmap_read ( syscon , CTRL_MAC_LO_REG ( offset , slave ) , & macid_lsb ) ;
regmap_read ( syscon , CTRL_MAC_HI_REG ( offset , slave ) , & macid_msb ) ;
mac_addr [ 0 ] = ( macid_msb > > 16 ) & 0xff ;
mac_addr [ 1 ] = ( macid_msb > > 8 ) & 0xff ;
mac_addr [ 2 ] = macid_msb & 0xff ;
mac_addr [ 3 ] = ( macid_lsb > > 16 ) & 0xff ;
mac_addr [ 4 ] = ( macid_lsb > > 8 ) & 0xff ;
mac_addr [ 5 ] = macid_lsb & 0xff ;
return 0 ;
}
static int cpsw_am33xx_cm_get_macid ( struct device * dev , u16 offset , int slave ,
u8 * mac_addr )
2015-01-28 11:33:04 -08:00
{
u32 macid_lo ;
u32 macid_hi ;
struct regmap * syscon ;
syscon = syscon_regmap_lookup_by_phandle ( dev - > of_node , " syscon " ) ;
if ( IS_ERR ( syscon ) ) {
if ( PTR_ERR ( syscon ) = = - ENODEV )
return 0 ;
return PTR_ERR ( syscon ) ;
}
2015-09-21 15:56:50 +05:30
regmap_read ( syscon , CTRL_MAC_LO_REG ( offset , slave ) , & macid_lo ) ;
regmap_read ( syscon , CTRL_MAC_HI_REG ( offset , slave ) , & macid_hi ) ;
2015-01-28 11:33:04 -08:00
mac_addr [ 5 ] = ( macid_lo > > 8 ) & 0xff ;
mac_addr [ 4 ] = macid_lo & 0xff ;
mac_addr [ 3 ] = ( macid_hi > > 24 ) & 0xff ;
mac_addr [ 2 ] = ( macid_hi > > 16 ) & 0xff ;
mac_addr [ 1 ] = ( macid_hi > > 8 ) & 0xff ;
mac_addr [ 0 ] = macid_hi & 0xff ;
return 0 ;
}
2015-09-21 15:56:50 +05:30
int ti_cm_get_macid ( struct device * dev , int slave , u8 * mac_addr )
{
2015-11-18 17:27:25 -08:00
if ( of_machine_is_compatible ( " ti,dm8148 " ) )
return cpsw_am33xx_cm_get_macid ( dev , 0x630 , slave , mac_addr ) ;
2015-09-21 15:56:50 +05:30
if ( of_machine_is_compatible ( " ti,am33xx " ) )
return cpsw_am33xx_cm_get_macid ( dev , 0x630 , slave , mac_addr ) ;
if ( of_device_is_compatible ( dev - > of_node , " ti,am3517-emac " ) )
return davinci_emac_3517_get_macid ( dev , 0x110 , slave , mac_addr ) ;
if ( of_device_is_compatible ( dev - > of_node , " ti,dm816-emac " ) )
return cpsw_am33xx_cm_get_macid ( dev , 0x30 , slave , mac_addr ) ;
2017-06-21 14:12:04 +05:30
if ( of_machine_is_compatible ( " ti,am43 " ) )
2015-09-21 15:56:51 +05:30
return cpsw_am33xx_cm_get_macid ( dev , 0x630 , slave , mac_addr ) ;
if ( of_machine_is_compatible ( " ti,dra7 " ) )
return davinci_emac_3517_get_macid ( dev , 0x514 , slave , mac_addr ) ;
2017-08-30 13:37:13 +05:30
dev_info ( dev , " incompatible machine/device type for reading mac address \n " ) ;
2015-09-21 15:56:50 +05:30
return - ENOENT ;
}
EXPORT_SYMBOL_GPL ( ti_cm_get_macid ) ;
2015-01-28 11:33:04 -08:00
MODULE_LICENSE ( " GPL " ) ;