@ -5,6 +5,7 @@
*/
# include <common.h>
# include <dm.h>
# include <i2c.h>
# include <asm/io.h>
# include <asm/arch/cpu.h>
@ -12,6 +13,11 @@
DECLARE_GLOBAL_DATA_PTR ;
/*
* Information specific to the DB - 88F 7040 eval board . We strive to use
* DT for such platform specfic configurations . At some point , this
* might be removed here and implemented via DT .
*/
/* IO expander I2C device */
# define I2C_IO_EXP_ADDR 0x21
# define I2C_IO_CFG_REG_0 0x6
@ -44,45 +50,47 @@ int board_xhci_config(void)
int ret ;
u8 buf [ 8 ] ;
/* Configure IO exander PCA9555: 7bit address 0x21 */
ret = i2c_get_chip_for_busnum ( 0 , I2C_IO_EXP_ADDR , 1 , & dev ) ;
if ( ret ) {
printf ( " Cannot find PCA9555: %d \n " , ret ) ;
return 0 ;
}
/*
* Read configuration ( direction ) and set VBUS pin as output
* ( reset pin = output )
*/
ret = dm_i2c_read ( dev , I2C_IO_CFG_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
}
buf [ 0 ] & = ~ I2C_IO_REG_VBUS ;
buf [ 0 ] & = ~ I2C_IO_REG_CL ;
ret = dm_i2c_write ( dev , I2C_IO_CFG_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
/* Read output value and configure it */
ret = dm_i2c_read ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
if ( of_machine_is_compatible ( " marvell,armada7040-db " ) ) {
/* Configure IO exander PCA9555: 7bit address 0x21 */
ret = i2c_get_chip_for_busnum ( 0 , I2C_IO_EXP_ADDR , 1 , & dev ) ;
if ( ret ) {
printf ( " Cannot find PCA9555: %d \n " , ret ) ;
return 0 ;
}
/*
* Read configuration ( direction ) and set VBUS pin as output
* ( reset pin = output )
*/
ret = dm_i2c_read ( dev , I2C_IO_CFG_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
}
buf [ 0 ] & = ~ I2C_IO_REG_VBUS ;
buf [ 0 ] & = ~ I2C_IO_REG_CL ;
ret = dm_i2c_write ( dev , I2C_IO_CFG_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
/* Read output value and configure it */
ret = dm_i2c_read ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
}
buf [ 0 ] & = ~ I2C_IO_REG_VBUS ;
buf [ 0 ] | = I2C_IO_REG_CL ;
ret = dm_i2c_write ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
mdelay ( 500 ) ; /* required delay to let output value settle */
}
buf [ 0 ] & = ~ I2C_IO_REG_VBUS ;
buf [ 0 ] | = I2C_IO_REG_CL ;
ret = dm_i2c_write ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
mdelay ( 500 ) ; /* required delay to let output value settle */
return 0 ;
}
@ -93,38 +101,40 @@ int board_xhci_enable(void)
int ret ;
u8 buf [ 8 ] ;
/*
* This function enables all USB ports simultaniously ,
* it only needs to get called once
*/
if ( usb_enabled )
return 0 ;
/* Configure IO exander PCA9555: 7bit address 0x21 */
ret = i2c_get_chip_for_busnum ( 0 , I2C_IO_EXP_ADDR , 1 , & dev ) ;
if ( ret ) {
printf ( " Cannot find PCA9555: %d \n " , ret ) ;
return 0 ;
}
/* Read VBUS output value */
ret = dm_i2c_read ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
if ( of_machine_is_compatible ( " marvell,armada7040-db " ) ) {
/*
* This function enables all USB ports simultaniously ,
* it only needs to get called once
*/
if ( usb_enabled )
return 0 ;
/* Configure IO exander PCA9555: 7bit address 0x21 */
ret = i2c_get_chip_for_busnum ( 0 , I2C_IO_EXP_ADDR , 1 , & dev ) ;
if ( ret ) {
printf ( " Cannot find PCA9555: %d \n " , ret ) ;
return 0 ;
}
/* Read VBUS output value */
ret = dm_i2c_read ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to read IO expander value via I2C \n " ) ;
return - EIO ;
}
/* Enable VBUS power: Set output value of VBUS pin as enabled */
buf [ 0 ] | = I2C_IO_REG_VBUS ;
ret = dm_i2c_write ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
mdelay ( 500 ) ; /* required delay to let output value settle */
usb_enabled = 1 ;
}
/* Enable VBUS power: Set output value of VBUS pin as enabled */
buf [ 0 ] | = I2C_IO_REG_VBUS ;
ret = dm_i2c_write ( dev , I2C_IO_DATA_OUT_REG_0 , buf , 1 ) ;
if ( ret ) {
printf ( " Failed to set IO expander via I2C \n " ) ;
return - EIO ;
}
mdelay ( 500 ) ; /* required delay to let output value settle */
usb_enabled = 1 ;
return 0 ;
}