diff options
Diffstat (limited to 'include/linux/mmc/sdhci.h')
| -rw-r--r-- | include/linux/mmc/sdhci.h | 71 | 
1 files changed, 60 insertions, 11 deletions
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 1fdc673f239..08abe994188 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -8,8 +8,8 @@   * the Free Software Foundation; either version 2 of the License, or (at   * your option) any later version.   */ -#ifndef __SDHCI_H -#define __SDHCI_H +#ifndef LINUX_MMC_SDHCI_H +#define LINUX_MMC_SDHCI_H  #include <linux/scatterlist.h>  #include <linux/compiler.h> @@ -57,12 +57,8 @@ struct sdhci_host {  #define SDHCI_QUIRK_BROKEN_CARD_DETECTION		(1<<15)  /* Controller reports inverted write-protect state */  #define SDHCI_QUIRK_INVERTED_WRITE_PROTECT		(1<<16) -/* Controller has nonstandard clock management */ -#define SDHCI_QUIRK_NONSTANDARD_CLOCK			(1<<17)  /* Controller does not like fast PIO transfers */  #define SDHCI_QUIRK_PIO_NEEDS_DELAY			(1<<18) -/* Controller losing signal/interrupt enable states after reset */ -#define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET		(1<<19)  /* Controller has to be forced to use block size of 2048 bytes */  #define SDHCI_QUIRK_FORCE_BLK_SZ_2048			(1<<20)  /* Controller cannot do multi-block transfers */ @@ -83,13 +79,33 @@ struct sdhci_host {  #define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12		(1<<28)  /* Controller doesn't have HISPD bit field in HI-SPEED SD card */  #define SDHCI_QUIRK_NO_HISPD_BIT			(1<<29) +/* Controller treats ADMA descriptors with length 0000h incorrectly */ +#define SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC		(1<<30) +/* The read-only detection via SDHCI_PRESENT_STATE register is unstable */ +#define SDHCI_QUIRK_UNSTABLE_RO_DETECT			(1<<31) + +	unsigned int quirks2;	/* More deviations from spec. */ + +#define SDHCI_QUIRK2_HOST_OFF_CARD_ON			(1<<0) +#define SDHCI_QUIRK2_HOST_NO_CMD23			(1<<1) +/* The system physically doesn't support 1.8v, even if the host does */ +#define SDHCI_QUIRK2_NO_1_8_V				(1<<2) +#define SDHCI_QUIRK2_PRESET_VALUE_BROKEN		(1<<3) +#define SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON		(1<<4) +/* Controller has a non-standard host control register */ +#define SDHCI_QUIRK2_BROKEN_HOST_CONTROL		(1<<5) +/* Controller does not support HS200 */ +#define SDHCI_QUIRK2_BROKEN_HS200			(1<<6) +/* Controller does not support DDR50 */ +#define SDHCI_QUIRK2_BROKEN_DDR50			(1<<7)  	int irq;		/* Device IRQ */  	void __iomem *ioaddr;	/* Mapped address */  	const struct sdhci_ops *ops;	/* Low level hw interface */ -	struct regulator *vmmc;	/* Power regulator */ +	struct regulator *vmmc;		/* Power regulator (vmmc) */ +	struct regulator *vqmmc;	/* Signaling regulator (vccq) */  	/* Internal data */  	struct mmc_host *mmc;	/* MMC structure */ @@ -107,15 +123,28 @@ struct sdhci_host {  #define SDHCI_USE_ADMA		(1<<1)	/* Host is ADMA capable */  #define SDHCI_REQ_USE_DMA	(1<<2)	/* Use DMA for this req. */  #define SDHCI_DEVICE_DEAD	(1<<3)	/* Device unresponsive */ +#define SDHCI_SDR50_NEEDS_TUNING (1<<4)	/* SDR50 needs tuning */ +#define SDHCI_NEEDS_RETUNING	(1<<5)	/* Host needs retuning */ +#define SDHCI_AUTO_CMD12	(1<<6)	/* Auto CMD12 support */ +#define SDHCI_AUTO_CMD23	(1<<7)	/* Auto CMD23 support */ +#define SDHCI_PV_ENABLED	(1<<8)	/* Preset value enabled */ +#define SDHCI_SDIO_IRQ_ENABLED	(1<<9)	/* SDIO irq enabled */ +#define SDHCI_SDR104_NEEDS_TUNING (1<<10)	/* SDR104/HS200 needs tuning */ +#define SDHCI_USING_RETUNING_TIMER (1<<11)	/* Host is using a retuning timer for the card */  	unsigned int version;	/* SDHCI spec. version */  	unsigned int max_clk;	/* Max possible freq (MHz) */  	unsigned int timeout_clk;	/* Timeout freq (KHz) */ +	unsigned int clk_mul;	/* Clock Muliplier value */  	unsigned int clock;	/* Current clock (MHz) */  	u8 pwr;			/* Current voltage */ +	bool runtime_suspended;	/* Host is runtime suspended */ +	bool bus_on;		/* Bus power prevents runtime suspend */ +	bool preset_enabled;	/* Preset is enabled */ +  	struct mmc_request *mrq;	/* Current request */  	struct mmc_command *cmd;	/* Current command */  	struct mmc_data *data;	/* Current data request */ @@ -132,13 +161,33 @@ struct sdhci_host {  	dma_addr_t adma_addr;	/* Mapped ADMA descr. table */  	dma_addr_t align_addr;	/* Mapped bounce buffer */ -	struct tasklet_struct card_tasklet;	/* Tasklet structures */ -	struct tasklet_struct finish_tasklet; +	struct tasklet_struct finish_tasklet;	/* Tasklet structures */  	struct timer_list timer;	/* Timer for timeouts */ -	unsigned int caps;	/* Alternative capabilities */ +	u32 caps;		/* Alternative CAPABILITY_0 */ +	u32 caps1;		/* Alternative CAPABILITY_1 */ + +	unsigned int            ocr_avail_sdio;	/* OCR bit masks */ +	unsigned int            ocr_avail_sd; +	unsigned int            ocr_avail_mmc; +	u32 ocr_mask;		/* available voltages */ + +	unsigned		timing;		/* Current timing */ + +	u32			thread_isr; + +	/* cached registers */ +	u32			ier; + +	wait_queue_head_t	buf_ready_int;	/* Waitqueue for Buffer Read Ready interrupt */ +	unsigned int		tuning_done;	/* Condition flag set when CMD19 succeeds */ + +	unsigned int		tuning_count;	/* Timer count for re-tuning */ +	unsigned int		tuning_mode;	/* Re-tuning mode supported by host */ +#define SDHCI_TUNING_MODE_1	0 +	struct timer_list	tuning_timer;	/* Timer for tuning */  	unsigned long private[0] ____cacheline_aligned;  }; -#endif /* __SDHCI_H */ +#endif /* LINUX_MMC_SDHCI_H */  | 
