forked from mirrors/linux
		
	mmc: meson-gx: add signal resampling
With some eMMC devices, there is still issues with the new phase settings. Enabling signal resampling seems to solve the problem for these. Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
		
							parent
							
								
									c5e1766d3a
								
							
						
					
					
						commit
						71645e6572
					
				
					 1 changed files with 11 additions and 1 deletions
				
			
		| 
						 | 
					@ -66,6 +66,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SD_EMMC_DELAY 0x4
 | 
					#define SD_EMMC_DELAY 0x4
 | 
				
			||||||
#define SD_EMMC_ADJUST 0x8
 | 
					#define SD_EMMC_ADJUST 0x8
 | 
				
			||||||
 | 
					#define   ADJUST_ADJ_DELAY_MASK GENMASK(21, 16)
 | 
				
			||||||
 | 
					#define   ADJUST_DS_EN BIT(15)
 | 
				
			||||||
 | 
					#define   ADJUST_ADJ_EN BIT(13)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SD_EMMC_DELAY1 0x4
 | 
					#define SD_EMMC_DELAY1 0x4
 | 
				
			||||||
#define SD_EMMC_DELAY2 0x8
 | 
					#define SD_EMMC_DELAY2 0x8
 | 
				
			||||||
| 
						 | 
					@ -143,6 +146,7 @@ struct meson_mmc_data {
 | 
				
			||||||
	unsigned int tx_delay_mask;
 | 
						unsigned int tx_delay_mask;
 | 
				
			||||||
	unsigned int rx_delay_mask;
 | 
						unsigned int rx_delay_mask;
 | 
				
			||||||
	unsigned int always_on;
 | 
						unsigned int always_on;
 | 
				
			||||||
 | 
						unsigned int adjust;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sd_emmc_desc {
 | 
					struct sd_emmc_desc {
 | 
				
			||||||
| 
						 | 
					@ -1162,7 +1166,7 @@ static int meson_mmc_get_cd(struct mmc_host *mmc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void meson_mmc_cfg_init(struct meson_host *host)
 | 
					static void meson_mmc_cfg_init(struct meson_host *host)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 cfg = 0;
 | 
						u32 cfg = 0, adj = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg |= FIELD_PREP(CFG_RESP_TIMEOUT_MASK,
 | 
						cfg |= FIELD_PREP(CFG_RESP_TIMEOUT_MASK,
 | 
				
			||||||
			  ilog2(SD_EMMC_CFG_RESP_TIMEOUT));
 | 
								  ilog2(SD_EMMC_CFG_RESP_TIMEOUT));
 | 
				
			||||||
| 
						 | 
					@ -1173,6 +1177,10 @@ static void meson_mmc_cfg_init(struct meson_host *host)
 | 
				
			||||||
	cfg |= CFG_ERR_ABORT;
 | 
						cfg |= CFG_ERR_ABORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writel(cfg, host->regs + SD_EMMC_CFG);
 | 
						writel(cfg, host->regs + SD_EMMC_CFG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* enable signal resampling w/o delay */
 | 
				
			||||||
 | 
						adj = ADJUST_ADJ_EN;
 | 
				
			||||||
 | 
						writel(adj, host->regs + host->data->adjust);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int meson_mmc_card_busy(struct mmc_host *mmc)
 | 
					static int meson_mmc_card_busy(struct mmc_host *mmc)
 | 
				
			||||||
| 
						 | 
					@ -1396,12 +1404,14 @@ static const struct meson_mmc_data meson_gx_data = {
 | 
				
			||||||
	.tx_delay_mask	= CLK_V2_TX_DELAY_MASK,
 | 
						.tx_delay_mask	= CLK_V2_TX_DELAY_MASK,
 | 
				
			||||||
	.rx_delay_mask	= CLK_V2_RX_DELAY_MASK,
 | 
						.rx_delay_mask	= CLK_V2_RX_DELAY_MASK,
 | 
				
			||||||
	.always_on	= CLK_V2_ALWAYS_ON,
 | 
						.always_on	= CLK_V2_ALWAYS_ON,
 | 
				
			||||||
 | 
						.adjust		= SD_EMMC_ADJUST,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct meson_mmc_data meson_axg_data = {
 | 
					static const struct meson_mmc_data meson_axg_data = {
 | 
				
			||||||
	.tx_delay_mask	= CLK_V3_TX_DELAY_MASK,
 | 
						.tx_delay_mask	= CLK_V3_TX_DELAY_MASK,
 | 
				
			||||||
	.rx_delay_mask	= CLK_V3_RX_DELAY_MASK,
 | 
						.rx_delay_mask	= CLK_V3_RX_DELAY_MASK,
 | 
				
			||||||
	.always_on	= CLK_V3_ALWAYS_ON,
 | 
						.always_on	= CLK_V3_ALWAYS_ON,
 | 
				
			||||||
 | 
						.adjust		= SD_EMMC_V3_ADJUST,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct of_device_id meson_mmc_of_match[] = {
 | 
					static const struct of_device_id meson_mmc_of_match[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue