mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-06-24 15:42:48 +00:00
mmc: zynq_sdhci: Use Mask writes for Tap delays
Restrict tap_delay value to the allowed size(8bits for itap and 6 bits for otap) before writing to the tap delay register. Clear ITAP and OTAP delay bits before updating with the new tap value for Versal platform. Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
affcba728b
commit
ee9ae005dc
1 changed files with 31 additions and 27 deletions
|
@ -20,10 +20,12 @@
|
||||||
#include <zynqmp_tap_delay.h>
|
#include <zynqmp_tap_delay.h>
|
||||||
|
|
||||||
#define SDHCI_ARASAN_ITAPDLY_REGISTER 0xF0F8
|
#define SDHCI_ARASAN_ITAPDLY_REGISTER 0xF0F8
|
||||||
|
#define SDHCI_ARASAN_ITAPDLY_SEL_MASK GENMASK(7, 0)
|
||||||
#define SDHCI_ARASAN_OTAPDLY_REGISTER 0xF0FC
|
#define SDHCI_ARASAN_OTAPDLY_REGISTER 0xF0FC
|
||||||
#define SDHCI_ITAPDLY_CHGWIN 0x200
|
#define SDHCI_ARASAN_OTAPDLY_SEL_MASK GENMASK(5, 0)
|
||||||
#define SDHCI_ITAPDLY_ENABLE 0x100
|
#define SDHCI_ITAPDLY_CHGWIN BIT(9)
|
||||||
#define SDHCI_OTAPDLY_ENABLE 0x40
|
#define SDHCI_ITAPDLY_ENABLE BIT(8)
|
||||||
|
#define SDHCI_OTAPDLY_ENABLE BIT(6)
|
||||||
|
|
||||||
#define SDHCI_TUNING_LOOP_COUNT 40
|
#define SDHCI_TUNING_LOOP_COUNT 40
|
||||||
#define MMC_BANK2 0x2
|
#define MMC_BANK2 0x2
|
||||||
|
@ -297,6 +299,7 @@ static int sdhci_versal_sdcardclk_set_phase(struct sdhci_host *host,
|
||||||
struct mmc *mmc = (struct mmc *)host->mmc;
|
struct mmc *mmc = (struct mmc *)host->mmc;
|
||||||
u8 tap_delay, tap_max = 0;
|
u8 tap_delay, tap_max = 0;
|
||||||
int timing = mode2timing[mmc->selected_mode];
|
int timing = mode2timing[mmc->selected_mode];
|
||||||
|
u32 regval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is applicable for SDHCI_SPEC_300 and above
|
* This is applicable for SDHCI_SPEC_300 and above
|
||||||
|
@ -329,16 +332,16 @@ static int sdhci_versal_sdcardclk_set_phase(struct sdhci_host *host,
|
||||||
|
|
||||||
tap_delay = (degrees * tap_max) / 360;
|
tap_delay = (degrees * tap_max) / 360;
|
||||||
|
|
||||||
/* Set the Clock Phase */
|
/* Limit output tap_delay value to 6 bits */
|
||||||
if (tap_delay) {
|
tap_delay &= SDHCI_ARASAN_OTAPDLY_SEL_MASK;
|
||||||
u32 regval;
|
|
||||||
|
|
||||||
|
/* Set the Clock Phase */
|
||||||
regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||||
regval |= SDHCI_OTAPDLY_ENABLE;
|
regval |= SDHCI_OTAPDLY_ENABLE;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||||
|
regval &= ~SDHCI_ARASAN_OTAPDLY_SEL_MASK;
|
||||||
regval |= tap_delay;
|
regval |= tap_delay;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -358,6 +361,7 @@ static int sdhci_versal_sampleclk_set_phase(struct sdhci_host *host,
|
||||||
struct mmc *mmc = (struct mmc *)host->mmc;
|
struct mmc *mmc = (struct mmc *)host->mmc;
|
||||||
u8 tap_delay, tap_max = 0;
|
u8 tap_delay, tap_max = 0;
|
||||||
int timing = mode2timing[mmc->selected_mode];
|
int timing = mode2timing[mmc->selected_mode];
|
||||||
|
u32 regval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is applicable for SDHCI_SPEC_300 and above
|
* This is applicable for SDHCI_SPEC_300 and above
|
||||||
|
@ -390,20 +394,20 @@ static int sdhci_versal_sampleclk_set_phase(struct sdhci_host *host,
|
||||||
|
|
||||||
tap_delay = (degrees * tap_max) / 360;
|
tap_delay = (degrees * tap_max) / 360;
|
||||||
|
|
||||||
/* Set the Clock Phase */
|
/* Limit input tap_delay value to 8 bits */
|
||||||
if (tap_delay) {
|
tap_delay &= SDHCI_ARASAN_ITAPDLY_SEL_MASK;
|
||||||
u32 regval;
|
|
||||||
|
|
||||||
|
/* Set the Clock Phase */
|
||||||
regval = sdhci_readl(host, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
regval = sdhci_readl(host, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||||
regval |= SDHCI_ITAPDLY_CHGWIN;
|
regval |= SDHCI_ITAPDLY_CHGWIN;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||||
regval |= SDHCI_ITAPDLY_ENABLE;
|
regval |= SDHCI_ITAPDLY_ENABLE;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||||
|
regval &= ~SDHCI_ARASAN_ITAPDLY_SEL_MASK;
|
||||||
regval |= tap_delay;
|
regval |= tap_delay;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||||
regval &= ~SDHCI_ITAPDLY_CHGWIN;
|
regval &= ~SDHCI_ITAPDLY_CHGWIN;
|
||||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue