2007-01-27 00:14:34 +03:00
/*
* MMC definitions for OMAP2
*
* Copyright ( C ) 2006 Nokia Corporation
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef __OMAP2_MMC_H
# define __OMAP2_MMC_H
# include <linux/types.h>
# include <linux/device.h>
# include <linux/mmc/host.h>
2009-10-20 20:40:47 +04:00
# include <plat/board.h>
2008-05-09 02:30:33 +04:00
2008-12-11 04:37:16 +03:00
# define OMAP15XX_NR_MMC 1
# define OMAP16XX_NR_MMC 2
# define OMAP1_MMC_SIZE 0x080
# define OMAP1_MMC1_BASE 0xfffb7800
# define OMAP1_MMC2_BASE 0xfffb7c00 /* omap16xx only */
# define OMAP24XX_NR_MMC 2
# define OMAP34XX_NR_MMC 3
2009-09-23 03:45:25 +04:00
# define OMAP44XX_NR_MMC 5
2008-12-11 04:37:16 +03:00
# define OMAP2420_MMC_SIZE OMAP1_MMC_SIZE
2009-09-23 03:45:25 +04:00
# define OMAP3_HSMMC_SIZE 0x200
# define OMAP4_HSMMC_SIZE 0x1000
2008-12-11 04:37:16 +03:00
# define OMAP2_MMC1_BASE 0x4809c000
# define OMAP2_MMC2_BASE 0x480b4000
# define OMAP3_MMC3_BASE 0x480ad000
2009-09-23 03:45:25 +04:00
# define OMAP4_MMC4_BASE 0x480d1000
# define OMAP4_MMC5_BASE 0x480d5000
# define OMAP4_MMC_REG_OFFSET 0x100
# define HSMMC5 (1 << 4)
# define HSMMC4 (1 << 3)
2008-12-11 04:37:16 +03:00
# define HSMMC3 (1 << 2)
# define HSMMC2 (1 << 1)
# define HSMMC1 (1 << 0)
2007-01-27 00:14:34 +03:00
# define OMAP_MMC_MAX_SLOTS 2
struct omap_mmc_platform_data {
2009-03-24 04:23:47 +03:00
/* back-link to device */
struct device * dev ;
2008-03-26 23:08:57 +03:00
2008-12-11 04:37:16 +03:00
/* number of slots per controller */
2007-01-27 00:14:34 +03:00
unsigned nr_slots : 2 ;
2008-05-09 02:30:33 +04:00
2007-01-27 00:14:34 +03:00
/* set if your board has components or wiring that limits the
* maximum frequency on the MMC bus */
unsigned int max_freq ;
/* switch the bus to a new slot */
2010-02-15 21:03:34 +03:00
int ( * switch_slot ) ( struct device * dev , int slot ) ;
2007-01-27 00:14:34 +03:00
/* initialize board-specific MMC functionality, can be NULL if
* not supported */
2010-02-15 21:03:34 +03:00
int ( * init ) ( struct device * dev ) ;
void ( * cleanup ) ( struct device * dev ) ;
void ( * shutdown ) ( struct device * dev ) ;
2008-05-09 02:30:33 +04:00
/* To handle board related suspend/resume functionality for MMC */
int ( * suspend ) ( struct device * dev , int slot ) ;
int ( * resume ) ( struct device * dev , int slot ) ;
2007-01-27 00:14:34 +03:00
2009-09-23 03:44:40 +04:00
/* Return context loss count due to PM states changing */
int ( * get_context_loss_count ) ( struct device * dev ) ;
2008-12-11 04:37:16 +03:00
u64 dma_mask ;
2007-01-27 00:14:34 +03:00
struct omap_mmc_slot_data {
2008-12-11 04:37:16 +03:00
2010-09-15 18:49:23 +04:00
/* 4/8 wires and any additional host capabilities
* need to OR ' d all capabilities ( ref . linux / mmc / host . h ) */
u32 caps ;
2008-12-11 04:37:17 +03:00
2008-12-11 04:37:16 +03:00
/*
* nomux means " standard " muxing is wrong on this board , and
* that board - specific code handled it before common init logic .
*/
unsigned nomux : 1 ;
/* switch pin can be for card detect (default) or card cover */
unsigned cover : 1 ;
/* use the internal clock */
unsigned internal_clock : 1 ;
2008-12-11 04:37:17 +03:00
2009-09-23 03:44:48 +04:00
/* nonremovable e.g. eMMC */
unsigned nonremovable : 1 ;
2009-09-23 03:44:49 +04:00
/* Try to sleep or power off when possible */
unsigned power_saving : 1 ;
2010-02-15 21:03:34 +03:00
/* If using power_saving and the MMC power is not to go off */
unsigned no_off : 1 ;
2010-02-15 21:03:34 +03:00
/* Regulator off remapped to sleep */
unsigned vcc_aux_disable_is_sleep : 1 ;
2010-05-13 16:39:31 +04:00
/* we can put the features above into this variable */
# define HSMMC_HAS_PBIAS (1 << 0)
unsigned features ;
2008-12-11 04:37:17 +03:00
int switch_pin ; /* gpio (card detect) */
int gpio_wp ; /* gpio (write protect) */
2008-12-11 04:37:16 +03:00
2010-02-15 21:03:34 +03:00
int ( * set_bus_mode ) ( struct device * dev , int slot , int bus_mode ) ;
int ( * set_power ) ( struct device * dev , int slot ,
int power_on , int vdd ) ;
int ( * get_ro ) ( struct device * dev , int slot ) ;
2009-09-23 03:44:50 +04:00
int ( * set_sleep ) ( struct device * dev , int slot , int sleep ,
int vdd , int cardsleep ) ;
2010-02-15 21:03:34 +03:00
void ( * remux ) ( struct device * dev , int slot , int power_on ) ;
2010-02-15 21:03:34 +03:00
/* Call back before enabling / disabling regulators */
void ( * before_set_reg ) ( struct device * dev , int slot ,
int power_on , int vdd ) ;
/* Call back after enabling / disabling regulators */
void ( * after_set_reg ) ( struct device * dev , int slot ,
int power_on , int vdd ) ;
2010-08-11 05:01:52 +04:00
/* if we have special card, init it using this callback */
void ( * init_card ) ( struct mmc_card * card ) ;
2007-01-27 00:14:34 +03:00
/* return MMC cover switch state, can be NULL if not supported.
*
* possible return values :
2008-12-11 04:37:16 +03:00
* 0 - closed
* 1 - open
2007-01-27 00:14:34 +03:00
*/
2010-02-15 21:03:34 +03:00
int ( * get_cover_state ) ( struct device * dev , int slot ) ;
2007-01-27 00:14:34 +03:00
const char * name ;
u32 ocr_mask ;
2008-05-09 02:30:33 +04:00
/* Card detection IRQs */
int card_detect_irq ;
2010-02-15 21:03:34 +03:00
int ( * card_detect ) ( struct device * dev , int slot ) ;
2008-05-09 02:30:33 +04:00
unsigned int ban_openended : 1 ;
2007-01-27 00:14:34 +03:00
} slots [ OMAP_MMC_MAX_SLOTS ] ;
} ;
/* called from board-specific card detection service routine */
2010-02-15 21:03:34 +03:00
extern void omap_mmc_notify_cover_event ( struct device * dev , int slot ,
int is_closed ) ;
2007-01-27 00:14:34 +03:00
2008-12-11 04:37:16 +03:00
# if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
defined ( CONFIG_MMC_OMAP_HS ) | | defined ( CONFIG_MMC_OMAP_HS_MODULE )
void omap1_init_mmc ( struct omap_mmc_platform_data * * mmc_data ,
int nr_controllers ) ;
void omap2_init_mmc ( struct omap_mmc_platform_data * * mmc_data ,
int nr_controllers ) ;
2009-01-29 19:57:16 +03:00
int omap_mmc_add ( const char * name , int id , unsigned long base ,
unsigned long size , unsigned int irq ,
struct omap_mmc_platform_data * data ) ;
2008-12-11 04:37:16 +03:00
# else
static inline void omap1_init_mmc ( struct omap_mmc_platform_data * * mmc_data ,
int nr_controllers )
{
}
static inline void omap2_init_mmc ( struct omap_mmc_platform_data * * mmc_data ,
int nr_controllers )
{
}
2009-01-29 19:57:16 +03:00
static inline int omap_mmc_add ( const char * name , int id , unsigned long base ,
unsigned long size , unsigned int irq ,
struct omap_mmc_platform_data * data )
2008-12-11 04:37:16 +03:00
{
return 0 ;
}
# endif
2007-01-27 00:14:34 +03:00
# endif