X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=include%2Fsdhci.h;h=88f1917480b66e85ef4015cc6ce6a008be150235;hb=46b5c8ed017958fc387ab86c71ae6c90abb6793c;hp=3dcbc1496595325fd849572e0aaf4939c8571378;hpb=a8185c50d384c0a4eb8ff5a542cc96cd8c4bb57e;p=platform%2Fkernel%2Fu-boot.git diff --git a/include/sdhci.h b/include/sdhci.h index 3dcbc14..88f1917 100644 --- a/include/sdhci.h +++ b/include/sdhci.h @@ -9,6 +9,8 @@ #ifndef __SDHCI_HW_H #define __SDHCI_HW_H +#include +#include #include #include #include @@ -63,6 +65,8 @@ #define SDHCI_CARD_STATE_STABLE BIT(17) #define SDHCI_CARD_DETECT_PIN_LEVEL BIT(18) #define SDHCI_WRITE_PROTECT BIT(19) +#define SDHCI_DATA_LVL_MASK 0x00F00000 +#define SDHCI_DATA_0_LVL_MASK BIT(20) #define SDHCI_HOST_CONTROL 0x28 #define SDHCI_CTRL_LED BIT(0) @@ -144,7 +148,23 @@ #define SDHCI_ACMD12_ERR 0x3C -/* 3E-3F reserved */ +#define SDHCI_HOST_CONTROL2 0x3E +#define SDHCI_CTRL_UHS_MASK 0x0007 +#define SDHCI_CTRL_UHS_SDR12 0x0000 +#define SDHCI_CTRL_UHS_SDR25 0x0001 +#define SDHCI_CTRL_UHS_SDR50 0x0002 +#define SDHCI_CTRL_UHS_SDR104 0x0003 +#define SDHCI_CTRL_UHS_DDR50 0x0004 +#define SDHCI_CTRL_HS400 0x0005 /* Non-standard */ +#define SDHCI_CTRL_VDD_180 0x0008 +#define SDHCI_CTRL_DRV_TYPE_MASK 0x0030 +#define SDHCI_CTRL_DRV_TYPE_B 0x0000 +#define SDHCI_CTRL_DRV_TYPE_A 0x0010 +#define SDHCI_CTRL_DRV_TYPE_C 0x0020 +#define SDHCI_CTRL_DRV_TYPE_D 0x0030 +#define SDHCI_CTRL_EXEC_TUNING 0x0040 +#define SDHCI_CTRL_TUNED_CLK 0x0080 +#define SDHCI_CTRL_PRESET_VAL_ENABLE 0x8000 #define SDHCI_CAPABILITIES 0x40 #define SDHCI_TIMEOUT_CLK_MASK 0x0000003F @@ -250,10 +270,22 @@ struct sdhci_ops { int (*set_ios_post)(struct sdhci_host *host); void (*set_clock)(struct sdhci_host *host, u32 div); int (*platform_execute_tuning)(struct mmc *host, u8 opcode); - void (*set_delay)(struct sdhci_host *host); + int (*set_delay)(struct sdhci_host *host); + int (*deferred_probe)(struct sdhci_host *host); + + /** + * set_enhanced_strobe() - Set HS400 Enhanced Strobe config + * + * This is called after setting the card speed and mode to + * HS400 ES, and should set any host-specific configuration + * necessary for it. + * + * @host: SDHCI host structure + * Return: 0 if successful, -ve on error + */ + int (*set_enhanced_strobe)(struct sdhci_host *host); }; -#if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA) #define ADMA_MAX_LEN 65532 #ifdef CONFIG_DMA_ADDR_T_64BIT #define ADMA_DESC_LEN 16 @@ -284,7 +316,7 @@ struct sdhci_adma_desc { u32 addr_hi; #endif } __packed; -#endif + struct sdhci_host { const char *name; void *ioaddr; @@ -305,6 +337,8 @@ struct sdhci_host { uint voltages; struct mmc_config cfg; + void *align_buffer; + bool force_align_buffer; dma_addr_t start_addr; int flags; #define USE_SDMA (0x1 << 0) @@ -314,7 +348,6 @@ struct sdhci_host { dma_addr_t adma_addr; #if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA) struct sdhci_adma_desc *adma_desc_table; - uint desc_slot; #endif }; @@ -421,10 +454,10 @@ static inline u8 sdhci_readb(struct sdhci_host *host, int reg) * ... * * Inside U_BOOT_DRIVER(): - * .platdata_auto_alloc_size = sizeof(struct msm_sdhc_plat), + * .plat_auto = sizeof(struct msm_sdhc_plat), * * To access platform data: - * struct msm_sdhc_plat *plat = dev_get_platdata(dev); + * struct msm_sdhc_plat *plat = dev_get_plat(dev); * * See msm_sdhci.c for an example. * @@ -449,7 +482,7 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host, * @cfg: Empty configuration structure (generally &plat->cfg). This is * normally all zeroes at this point. The only purpose of passing * this in is to set mmc->cfg to it. - * @return 0 if OK, -ve if the block device could not be created + * Return: 0 if OK, -ve if the block device could not be created */ int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg); #else @@ -462,17 +495,32 @@ int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg); * @host: SDHCI host structure * @f_max: Maximum supported clock frequency in HZ (0 for default) * @f_min: Minimum supported clock frequency in HZ (0 for default) - * @return 0 if OK, -ve on error + * Return: 0 if OK, -ve on error */ int add_sdhci(struct sdhci_host *host, u32 f_max, u32 f_min); #endif /* !CONFIG_BLK */ +void sdhci_set_uhs_timing(struct sdhci_host *host); #ifdef CONFIG_DM_MMC /* Export the operations to drivers */ int sdhci_probe(struct udevice *dev); int sdhci_set_clock(struct mmc *mmc, unsigned int clock); + +/** + * sdhci_set_control_reg - Set control registers + * + * This is used set up control registers for voltage level and UHS speed + * mode. + * + * @host: SDHCI host structure + */ +void sdhci_set_control_reg(struct sdhci_host *host); extern const struct dm_mmc_ops sdhci_ops; #else #endif +struct sdhci_adma_desc *sdhci_adma_init(void); +void sdhci_prepare_adma_table(struct sdhci_adma_desc *table, + struct mmc_data *data, dma_addr_t addr); + #endif /* __SDHCI_HW_H */