@ -9,7 +9,9 @@
*/
# include <common.h>
# include <ahci.h>
# include <dm.h>
# include <dwc_ahsata.h>
# include <fsl_esdhc.h>
# include <miiphy.h>
# include <mtd_node.h>
@ -29,6 +31,7 @@
# include <asm/io.h>
# include <asm/gpio.h>
# include <dm/platform_data/serial_mxc.h>
# include <dm/device-internal.h>
# include <jffs2/load_kernel.h>
# include "common.h"
# include "../common/eeprom.h"
@ -206,6 +209,8 @@ static int cm_fx6_setup_issd(void)
}
# define CM_FX6_SATA_INIT_RETRIES 10
# if !CONFIG_IS_ENABLED(AHCI)
int sata_initialize ( void )
{
int err , i ;
@ -246,6 +251,7 @@ int sata_stop(void)
return 0 ;
}
# endif
# else
static int cm_fx6_setup_issd ( void ) { return 0 ; }
# endif
@ -757,3 +763,66 @@ U_BOOT_DEVICE(cm_fx6_serial) = {
. name = " serial_mxc " ,
. platdata = & cm_fx6_mxc_serial_plat ,
} ;
# if CONFIG_IS_ENABLED(AHCI)
static int sata_imx_probe ( struct udevice * dev )
{
int i , err ;
/* Make sure this gpio has logical 0 value */
gpio_direction_output ( CM_FX6_SATA_PWLOSS_INT , 0 ) ;
udelay ( 100 ) ;
cm_fx6_sata_power ( 1 ) ;
for ( i = 0 ; i < CM_FX6_SATA_INIT_RETRIES ; i + + ) {
err = setup_sata ( ) ;
if ( err ) {
printf ( " SATA setup failed: %d \n " , err ) ;
return err ;
}
udelay ( 100 ) ;
err = dwc_ahsata_probe ( dev ) ;
if ( ! err )
break ;
/* There is no device on the SATA port */
if ( sata_dm_port_status ( 0 , 0 ) = = 0 )
break ;
/* There's a device, but link not established. Retry */
device_remove ( dev , DM_REMOVE_NORMAL ) ;
}
return 0 ;
}
static int sata_imx_remove ( struct udevice * dev )
{
cm_fx6_sata_power ( 0 ) ;
mdelay ( 250 ) ;
return 0 ;
}
struct ahci_ops sata_imx_ops = {
. port_status = dwc_ahsata_port_status ,
. reset = dwc_ahsata_bus_reset ,
. scan = dwc_ahsata_scan ,
} ;
static const struct udevice_id sata_imx_ids [ ] = {
{ . compatible = " fsl,imx6q-ahci " } ,
{ }
} ;
U_BOOT_DRIVER ( sata_imx ) = {
. name = " dwc_ahci " ,
. id = UCLASS_AHCI ,
. of_match = sata_imx_ids ,
. ops = & sata_imx_ops ,
. probe = sata_imx_probe ,
. remove = sata_imx_remove , /* reset bus to stop it */
} ;
# endif /* AHCI */