@ -18,6 +18,7 @@
*
* Copyright 2010 - 2011 Freescale Semiconductor , Inc .
* author Andy Fleming
* ( C ) 2012 NetModule AG , David Andrey , added KSZ9031
*
*/
# include <config.h>
@ -52,16 +53,46 @@ static struct phy_driver KS8721_driver = {
} ;
# endif
/**
* KSZ9021 - KSZ9031 common
*/
# define MII_KSZ90xx_PHY_CTL 0x1f
# define MIIM_KSZ90xx_PHYCTL_1000 (1 << 6)
# define MIIM_KSZ90xx_PHYCTL_100 (1 << 5)
# define MIIM_KSZ90xx_PHYCTL_10 (1 << 4)
# define MIIM_KSZ90xx_PHYCTL_DUPLEX (1 << 3)
static int ksz90xx_startup ( struct phy_device * phydev )
{
unsigned phy_ctl ;
genphy_update_link ( phydev ) ;
phy_ctl = phy_read ( phydev , MDIO_DEVAD_NONE , MII_KSZ90xx_PHY_CTL ) ;
if ( phy_ctl & MIIM_KSZ90xx_PHYCTL_DUPLEX )
phydev - > duplex = DUPLEX_FULL ;
else
phydev - > duplex = DUPLEX_HALF ;
if ( phy_ctl & MIIM_KSZ90xx_PHYCTL_1000 )
phydev - > speed = SPEED_1000 ;
else if ( phy_ctl & MIIM_KSZ90xx_PHYCTL_100 )
phydev - > speed = SPEED_100 ;
else if ( phy_ctl & MIIM_KSZ90xx_PHYCTL_10 )
phydev - > speed = SPEED_10 ;
return 0 ;
}
# ifdef CONFIG_PHY_MICREL_KSZ9021
/* ksz9021 PHY Registers */
/*
* KSZ9021
*/
/* PHY Registers */
# define MII_KSZ9021_EXTENDED_CTRL 0x0b
# define MII_KSZ9021_EXTENDED_DATAW 0x0c
# define MII_KSZ9021_EXTENDED_DATAR 0x0d
# define MII_KSZ9021_PHY_CTL 0x1f
# define MIIM_KSZ9021_PHYCTL_1000 (1 << 6)
# define MIIM_KSZ9021_PHYCTL_100 (1 << 5)
# define MIIM_KSZ9021_PHYCTL_10 (1 << 4)
# define MIIM_KSZ9021_PHYCTL_DUPLEX (1 << 3)
# define CTRL1000_PREFER_MASTER (1 << 10)
# define CTRL1000_CONFIG_MASTER (1 << 11)
@ -106,37 +137,30 @@ static int ksz9021_config(struct phy_device *phydev)
return 0 ;
}
static int ksz9021_startup ( struct phy_device * phydev )
{
unsigned phy_ctl ;
genphy_update_link ( phydev ) ;
phy_ctl = phy_read ( phydev , MDIO_DEVAD_NONE , MII_KSZ9021_PHY_CTL ) ;
if ( phy_ctl & MIIM_KSZ9021_PHYCTL_DUPLEX )
phydev - > duplex = DUPLEX_FULL ;
else
phydev - > duplex = DUPLEX_HALF ;
if ( phy_ctl & MIIM_KSZ9021_PHYCTL_1000 )
phydev - > speed = SPEED_1000 ;
else if ( phy_ctl & MIIM_KSZ9021_PHYCTL_100 )
phydev - > speed = SPEED_100 ;
else if ( phy_ctl & MIIM_KSZ9021_PHYCTL_10 )
phydev - > speed = SPEED_10 ;
return 0 ;
}
static struct phy_driver ksz9021_driver = {
. name = " Micrel ksz9021 " ,
. uid = 0x221610 ,
. mask = 0xfffff0 ,
. features = PHY_GBIT_FEATURES ,
. config = & ksz9021_config ,
. startup = & ksz9021 _startup ,
. startup = & ksz90xx_startup ,
. shutdown = & genphy_shutdown ,
} ;
# endif
/*
* KSZ9031
*/
static struct phy_driver ksz9031_driver = {
. name = " Micrel ksz9031 " ,
. uid = 0x221620 ,
. mask = 0xfffffe ,
. features = PHY_GBIT_FEATURES ,
. config = & genphy_config ,
. startup = & ksz90xx_startup ,
. shutdown = & genphy_shutdown ,
} ;
int phy_micrel_init ( void )
{
phy_register ( & KSZ804_driver ) ;
@ -145,5 +169,6 @@ int phy_micrel_init(void)
# else
phy_register ( & KS8721_driver ) ;
# endif
phy_register ( & ksz9031_driver ) ;
return 0 ;
}