@ -78,7 +78,16 @@ static int mmc_read_data(struct hsmmc *mmc_base, char *buf, unsigned int size);
static int mmc_write_data ( struct hsmmc * mmc_base , const char * buf ,
unsigned int siz ) ;
# if defined(OMAP_HSMMC_USE_GPIO) && !defined(CONFIG_DM_MMC)
static inline struct omap_hsmmc_data * omap_hsmmc_get_data ( struct mmc * mmc )
{
# ifdef CONFIG_DM_MMC
return dev_get_priv ( mmc - > dev ) ;
# else
return ( struct omap_hsmmc_data * ) mmc - > priv ;
# endif
}
# if defined(OMAP_HSMMC_USE_GPIO) && !defined(CONFIG_DM_MMC)
static int omap_mmc_setup_gpio_in ( int gpio , const char * label )
{
int ret ;
@ -194,12 +203,13 @@ void mmc_init_stream(struct hsmmc *mmc_base)
static int omap_hsmmc_init_setup ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
struct hsmmc * mmc_base ;
unsigned int reg_val ;
unsigned int dsor ;
ulong start ;
mmc_base = ( ( struct omap_hsmmc_data * ) mmc - > priv ) - > base_addr ;
mmc_base = priv - > base_addr ;
mmc_board_init ( mmc ) ;
writel ( readl ( & mmc_base - > sysconfig ) | MMC_SOFTRESET ,
@ -304,11 +314,12 @@ static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
static int omap_hsmmc_send_cmd ( struct mmc * mmc , struct mmc_cmd * cmd ,
struct mmc_data * data )
{
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
struct hsmmc * mmc_base ;
unsigned int flags , mmc_stat ;
ulong start ;
mmc_base = ( ( struct omap_hsmmc_data * ) mmc - > priv ) - > base_addr ;
mmc_base = priv - > base_addr ;
start = get_timer ( 0 ) ;
while ( ( readl ( & mmc_base - > pstate ) & ( DATI_MASK | CMDI_MASK ) ) ! = 0 ) {
if ( get_timer ( 0 ) - start > MAX_RETRY_MS ) {
@ -533,11 +544,12 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
static int omap_hsmmc_set_ios ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
struct hsmmc * mmc_base ;
unsigned int dsor = 0 ;
ulong start ;
mmc_base = ( ( struct omap_hsmmc_data * ) mmc - > priv ) - > base_addr ;
mmc_base = priv - > base_addr ;
/* configue bus width */
switch ( mmc - > bus_width ) {
case 8 :
@ -591,7 +603,7 @@ static int omap_hsmmc_set_ios(struct mmc *mmc)
# ifdef CONFIG_DM_MMC
static int omap_hsmmc_getcd ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv = mmc - > priv ;
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
int value ;
value = dm_gpio_get_value ( & priv - > cd_gpio ) ;
@ -606,7 +618,7 @@ static int omap_hsmmc_getcd(struct mmc *mmc)
static int omap_hsmmc_getwp ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv = mmc - > priv ;
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
int value ;
value = dm_gpio_get_value ( & priv - > wp_gpio ) ;
@ -618,11 +630,11 @@ static int omap_hsmmc_getwp(struct mmc *mmc)
# else
static int omap_hsmmc_getcd ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv_data = mmc - > priv ;
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
int cd_gpio ;
/* if no CD return as 1 */
cd_gpio = priv_data - > cd_gpio ;
cd_gpio = priv - > cd_gpio ;
if ( cd_gpio < 0 )
return 1 ;
@ -632,11 +644,11 @@ static int omap_hsmmc_getcd(struct mmc *mmc)
static int omap_hsmmc_getwp ( struct mmc * mmc )
{
struct omap_hsmmc_data * priv_data = mmc - > priv ;
struct omap_hsmmc_data * priv = omap_hsmmc_get_data ( mmc ) ;
int wp_gpio ;
/* if no WP return as 0 */
wp_gpio = priv_data - > wp_gpio ;
wp_gpio = priv - > wp_gpio ;
if ( wp_gpio < 0 )
return 0 ;
@ -661,23 +673,23 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
int wp_gpio )
{
struct mmc * mmc ;
struct omap_hsmmc_data * priv_data ;
struct omap_hsmmc_data * priv ;
struct mmc_config * cfg ;
uint host_caps_val ;
priv_data = malloc ( sizeof ( * priv_data ) ) ;
if ( priv_data = = NULL )
priv = malloc ( sizeof ( * priv ) ) ;
if ( priv = = NULL )
return - 1 ;
host_caps_val = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS ;
switch ( dev_index ) {
case 0 :
priv_data - > base_addr = ( struct hsmmc * ) OMAP_HSMMC1_BASE ;
priv - > base_addr = ( struct hsmmc * ) OMAP_HSMMC1_BASE ;
break ;
# ifdef OMAP_HSMMC2_BASE
case 1 :
priv_data - > base_addr = ( struct hsmmc * ) OMAP_HSMMC2_BASE ;
priv - > base_addr = ( struct hsmmc * ) OMAP_HSMMC2_BASE ;
# if (defined(CONFIG_OMAP44XX) || defined(CONFIG_OMAP54XX) || \
defined ( CONFIG_DRA7XX ) | | defined ( CONFIG_AM33XX ) | | \
defined ( CONFIG_AM43XX ) | | defined ( CONFIG_SOC_KEYSTONE ) ) & & \
@ -689,7 +701,7 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
# endif
# ifdef OMAP_HSMMC3_BASE
case 2 :
priv_data - > base_addr = ( struct hsmmc * ) OMAP_HSMMC3_BASE ;
priv - > base_addr = ( struct hsmmc * ) OMAP_HSMMC3_BASE ;
# if defined(CONFIG_DRA7XX) && defined(CONFIG_HSMMC3_8BIT)
/* Enable 8-bit interface for eMMC on DRA7XX */
host_caps_val | = MMC_MODE_8BIT ;
@ -697,16 +709,16 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
break ;
# endif
default :
priv_data - > base_addr = ( struct hsmmc * ) OMAP_HSMMC1_BASE ;
priv - > base_addr = ( struct hsmmc * ) OMAP_HSMMC1_BASE ;
return 1 ;
}
# ifdef OMAP_HSMMC_USE_GPIO
/* on error gpio values are set to -1, which is what we want */
priv_data - > cd_gpio = omap_mmc_setup_gpio_in ( cd_gpio , " mmc_cd " ) ;
priv_data - > wp_gpio = omap_mmc_setup_gpio_in ( wp_gpio , " mmc_wp " ) ;
priv - > cd_gpio = omap_mmc_setup_gpio_in ( cd_gpio , " mmc_cd " ) ;
priv - > wp_gpio = omap_mmc_setup_gpio_in ( wp_gpio , " mmc_wp " ) ;
# endif
cfg = & priv_data - > cfg ;
cfg = & priv - > cfg ;
cfg - > name = " OMAP SD/MMC " ;
cfg - > ops = & omap_hsmmc_ops ;
@ -737,7 +749,7 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
if ( ( get_cpu_family ( ) = = CPU_OMAP34XX ) & & ( get_cpu_rev ( ) < = CPU_3XX_ES21 ) )
cfg - > b_max = 1 ;
# endif
mmc = mmc_create ( cfg , priv_data ) ;
mmc = mmc_create ( cfg , priv ) ;
if ( mmc = = NULL )
return - 1 ;