now that we can finally read the new registers for new versions of the mmc IP, we can set max_blk_size correctly depending on the version of the IP we're running on. Signed-off-by: Felipe Balbi <balbi@xxxxxx> --- drivers/mmc/host/omap_hsmmc.c | 45 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index d32f6ac..ae5583e 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -62,6 +62,18 @@ #define OMAP_HSMMC_AC12 0x013C #define OMAP_HSMMC_CAPA 0x0140 +/* OMAP HSMMC Host Controller Register (NEW) + * + * NOTE: DO NOT READ THESE WITH OFFSET + */ +#define OMAP_HSMMC_HL_REV 0x0000 +#define OMAP_HSMMC_HL_HWINFO 0x0004 +# define OMAP_HSMMC_HL_HWINFO_MADMA_EN (1 << 0) +# define OMAP_HSMMC_HL_HWINFO_MERGE_MEM (1 << 1) +# define OMAP_HSMMC_HL_HWINFO_MEM_SIZE(x) (((x) & (0x0f << 2)) >> 2) +# define OMAP_HSMMC_HL_HWINFO_RETMODE (1 << 6) +#define OMAP_HSMMC_HL_SYSCONFIG 0x0010 + #define VS18 (1 << 26) #define VS30 (1 << 25) #define HSS (1 << 21) @@ -1867,6 +1879,37 @@ static inline struct omap_mmc_platform_data } #endif +static void omap_hsmmc_set_max_blk_size(struct omap_hsmmc_host *host) +{ + struct mmc_host *mmc = host->mmc; + + if (of_device_is_compatible(host->dev->of_node, "ti,omap4-hsmmc")) { + u32 mem; + u32 reg; + + reg = omap_hsmmc_read_no_offset(host, OMAP_HSMMC_HL_HWINFO); + mem = OMAP_HSMMC_HL_HWINFO_MEM_SIZE(reg); + + switch (mem) { + case 1: + mmc->max_blk_size = 512; + break; + case 2: + mmc->max_blk_size = 1024; + break; + case 4: + /* FALLTHROUGH */ + case 8: + /* FALLTHROUGH */ + default: + mmc->max_blk_size = 2048; + break; + } + } else { + mmc->max_blk_size = 512; /* Block Length at max can be 1024 */ + } +} + static int omap_hsmmc_probe(struct platform_device *pdev) { struct omap_mmc_platform_data *pdata = pdev->dev.platform_data; @@ -1986,7 +2029,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev) * as we want. */ mmc->max_segs = 1024; - mmc->max_blk_size = 512; /* Block Length at max can be 1024 */ + omap_hsmmc_set_max_blk_size(host); mmc->max_blk_count = 0xFFFF; /* No. of Blocks is 16 bits */ mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; mmc->max_seg_size = mmc->max_req_size; -- 1.9.1.286.g5172cb3 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html