@ -10,6 +10,7 @@
*/
# include <common.h>
# include <clk.h>
# include <dm.h>
# include <errno.h>
# include <miiphy.h>
@ -661,6 +662,35 @@ int designware_eth_probe(struct udevice *dev)
u32 iobase = pdata - > iobase ;
ulong ioaddr ;
int ret ;
# ifdef CONFIG_CLK
int i , err , clock_nb ;
priv - > clock_count = 0 ;
clock_nb = dev_count_phandle_with_args ( dev , " clocks " , " #clock-cells " ) ;
if ( clock_nb > 0 ) {
priv - > clocks = devm_kcalloc ( dev , clock_nb , sizeof ( struct clk ) ,
GFP_KERNEL ) ;
if ( ! priv - > clocks )
return - ENOMEM ;
for ( i = 0 ; i < clock_nb ; i + + ) {
err = clk_get_by_index ( dev , i , & priv - > clocks [ i ] ) ;
if ( err < 0 )
break ;
err = clk_enable ( & priv - > clocks [ i ] ) ;
if ( err ) {
pr_err ( " failed to enable clock %d \n " , i ) ;
clk_free ( & priv - > clocks [ i ] ) ;
goto clk_err ;
}
priv - > clock_count + + ;
}
} else if ( clock_nb ! = - ENOENT ) {
pr_err ( " failed to get clock phandle(%d) \n " , clock_nb ) ;
return clock_nb ;
}
# endif
# if defined(CONFIG_DM_REGULATOR)
struct udevice * phy_supply ;
@ -707,6 +737,15 @@ int designware_eth_probe(struct udevice *dev)
debug ( " %s, ret=%d \n " , __func__ , ret ) ;
return ret ;
# ifdef CONFIG_CLK
clk_err :
ret = clk_release_all ( priv - > clocks , priv - > clock_count ) ;
if ( ret )
pr_err ( " failed to disable all clocks \n " ) ;
return err ;
# endif
}
static int designware_eth_remove ( struct udevice * dev )
@ -717,7 +756,11 @@ static int designware_eth_remove(struct udevice *dev)
mdio_unregister ( priv - > bus ) ;
mdio_free ( priv - > bus ) ;
# ifdef CONFIG_CLK
return clk_release_all ( priv - > clocks , priv - > clock_count ) ;
# else
return 0 ;
# endif
}
const struct eth_ops designware_eth_ops = {