Skip to content

Commit d3e32f8

Browse files
blarson866Ulf Hansson
authored andcommitted
mmc: sdhci-cadence: Enable device specific override of writel()
SoCs with device specific Cadence implementation, such as setting byte-enables before the write, need to override writel(). Add a callback where the default is writel() for all existing chips. Signed-off-by: Brad Larson <blarson@amd.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Link: https://lore.kernel.org/r/20230410184526.15990-12-blarson@amd.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent 82e4726 commit d3e32f8

1 file changed

Lines changed: 13 additions & 5 deletions

File tree

drivers/mmc/host/sdhci-cadence.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ struct sdhci_cdns_phy_param {
6767
struct sdhci_cdns_priv {
6868
void __iomem *hrs_addr;
6969
bool enhanced_strobe;
70+
void (*priv_writel)(struct sdhci_cdns_priv *priv, u32 val, void __iomem *reg);
7071
unsigned int nr_phy_params;
7172
struct sdhci_cdns_phy_param phy_params[];
7273
};
@@ -90,6 +91,12 @@ static const struct sdhci_cdns_phy_cfg sdhci_cdns_phy_cfgs[] = {
9091
{ "cdns,phy-dll-delay-strobe", SDHCI_CDNS_PHY_DLY_STROBE, },
9192
};
9293

94+
static inline void cdns_writel(struct sdhci_cdns_priv *priv, u32 val,
95+
void __iomem *reg)
96+
{
97+
writel(val, reg);
98+
}
99+
93100
static int sdhci_cdns_write_phy_reg(struct sdhci_cdns_priv *priv,
94101
u8 addr, u8 data)
95102
{
@@ -104,17 +111,17 @@ static int sdhci_cdns_write_phy_reg(struct sdhci_cdns_priv *priv,
104111

105112
tmp = FIELD_PREP(SDHCI_CDNS_HRS04_WDATA, data) |
106113
FIELD_PREP(SDHCI_CDNS_HRS04_ADDR, addr);
107-
writel(tmp, reg);
114+
priv->priv_writel(priv, tmp, reg);
108115

109116
tmp |= SDHCI_CDNS_HRS04_WR;
110-
writel(tmp, reg);
117+
priv->priv_writel(priv, tmp, reg);
111118

112119
ret = readl_poll_timeout(reg, tmp, tmp & SDHCI_CDNS_HRS04_ACK, 0, 10);
113120
if (ret)
114121
return ret;
115122

116123
tmp &= ~SDHCI_CDNS_HRS04_WR;
117-
writel(tmp, reg);
124+
priv->priv_writel(priv, tmp, reg);
118125

119126
ret = readl_poll_timeout(reg, tmp, !(tmp & SDHCI_CDNS_HRS04_ACK),
120127
0, 10);
@@ -191,7 +198,7 @@ static void sdhci_cdns_set_emmc_mode(struct sdhci_cdns_priv *priv, u32 mode)
191198
tmp = readl(priv->hrs_addr + SDHCI_CDNS_HRS06);
192199
tmp &= ~SDHCI_CDNS_HRS06_MODE;
193200
tmp |= FIELD_PREP(SDHCI_CDNS_HRS06_MODE, mode);
194-
writel(tmp, priv->hrs_addr + SDHCI_CDNS_HRS06);
201+
priv->priv_writel(priv, tmp, priv->hrs_addr + SDHCI_CDNS_HRS06);
195202
}
196203

197204
static u32 sdhci_cdns_get_emmc_mode(struct sdhci_cdns_priv *priv)
@@ -223,7 +230,7 @@ static int sdhci_cdns_set_tune_val(struct sdhci_host *host, unsigned int val)
223230
*/
224231
for (i = 0; i < 2; i++) {
225232
tmp |= SDHCI_CDNS_HRS06_TUNE_UP;
226-
writel(tmp, reg);
233+
priv->priv_writel(priv, tmp, reg);
227234

228235
ret = readl_poll_timeout(reg, tmp,
229236
!(tmp & SDHCI_CDNS_HRS06_TUNE_UP),
@@ -386,6 +393,7 @@ static int sdhci_cdns_probe(struct platform_device *pdev)
386393
priv->nr_phy_params = nr_phy_params;
387394
priv->hrs_addr = host->ioaddr;
388395
priv->enhanced_strobe = false;
396+
priv->priv_writel = cdns_writel;
389397
host->ioaddr += SDHCI_CDNS_SRS_BASE;
390398
host->mmc_host_ops.hs400_enhanced_strobe =
391399
sdhci_cdns_hs400_enhanced_strobe;

0 commit comments

Comments
 (0)