mirror of
https://github.com/libretro/Lakka-LibreELEC.git
synced 2025-04-02 10:41:46 -04:00
197 lines
5.9 KiB
Diff
197 lines
5.9 KiB
Diff
From 95ad58d671ddc3b20f6de9a90659a12bfed01548 Mon Sep 17 00:00:00 2001
|
|
From: Christian Hewitt <christianshewitt@gmail.com>
|
|
Date: Sat, 14 Jan 2023 12:25:33 +0000
|
|
Subject: [PATCH 12/92] REVERT: mmc: meson-gx: add SDIO interrupt support
|
|
|
|
This reverts commit 066ecde6d826b443f492570e080cba3f2212280d.
|
|
|
|
See https://lore.kernel.org/linux-amlogic/52861a84-0fe2-37f0-d66a-145f2ebe1d79@gmail.com/T/#m9c6a0aa6b221bcbf51457e612456c6fff5eeacfa
|
|
---
|
|
drivers/mmc/host/meson-gx-mmc.c | 70 +++++----------------------------
|
|
1 file changed, 10 insertions(+), 60 deletions(-)
|
|
|
|
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
|
index 6e5ea0213b47..a8258ea5364c 100644
|
|
--- a/drivers/mmc/host/meson-gx-mmc.c
|
|
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
|
@@ -41,17 +41,14 @@
|
|
#define CLK_V2_TX_DELAY_MASK GENMASK(19, 16)
|
|
#define CLK_V2_RX_DELAY_MASK GENMASK(23, 20)
|
|
#define CLK_V2_ALWAYS_ON BIT(24)
|
|
-#define CLK_V2_IRQ_SDIO_SLEEP BIT(25)
|
|
|
|
#define CLK_V3_TX_DELAY_MASK GENMASK(21, 16)
|
|
#define CLK_V3_RX_DELAY_MASK GENMASK(27, 22)
|
|
#define CLK_V3_ALWAYS_ON BIT(28)
|
|
-#define CLK_V3_IRQ_SDIO_SLEEP BIT(29)
|
|
|
|
#define CLK_TX_DELAY_MASK(h) (h->data->tx_delay_mask)
|
|
#define CLK_RX_DELAY_MASK(h) (h->data->rx_delay_mask)
|
|
#define CLK_ALWAYS_ON(h) (h->data->always_on)
|
|
-#define CLK_IRQ_SDIO_SLEEP(h) (h->data->irq_sdio_sleep)
|
|
|
|
#define SD_EMMC_DELAY 0x4
|
|
#define SD_EMMC_ADJUST 0x8
|
|
@@ -138,7 +135,6 @@ struct meson_mmc_data {
|
|
unsigned int rx_delay_mask;
|
|
unsigned int always_on;
|
|
unsigned int adjust;
|
|
- unsigned int irq_sdio_sleep;
|
|
};
|
|
|
|
struct sd_emmc_desc {
|
|
@@ -178,7 +174,6 @@ struct meson_host {
|
|
bool vqmmc_enabled;
|
|
bool needs_pre_post_req;
|
|
|
|
- spinlock_t lock;
|
|
};
|
|
|
|
#define CMD_CFG_LENGTH_MASK GENMASK(8, 0)
|
|
@@ -435,7 +430,6 @@ static int meson_mmc_clk_init(struct meson_host *host)
|
|
clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180);
|
|
clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0);
|
|
clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0);
|
|
- clk_reg |= CLK_IRQ_SDIO_SLEEP(host);
|
|
writel(clk_reg, host->regs + SD_EMMC_CLOCK);
|
|
|
|
/* get the mux parents */
|
|
@@ -934,54 +928,32 @@ static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
|
|
}
|
|
}
|
|
|
|
-static void __meson_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
-{
|
|
- struct meson_host *host = mmc_priv(mmc);
|
|
- u32 reg_irqen = IRQ_EN_MASK;
|
|
-
|
|
- if (enable)
|
|
- reg_irqen |= IRQ_SDIO;
|
|
- writel(reg_irqen, host->regs + SD_EMMC_IRQ_EN);
|
|
-}
|
|
-
|
|
static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
|
{
|
|
struct meson_host *host = dev_id;
|
|
struct mmc_command *cmd;
|
|
+ struct mmc_data *data;
|
|
u32 status, raw_status;
|
|
irqreturn_t ret = IRQ_NONE;
|
|
|
|
raw_status = readl(host->regs + SD_EMMC_STATUS);
|
|
- status = raw_status & (IRQ_EN_MASK | IRQ_SDIO);
|
|
+ status = raw_status & IRQ_EN_MASK;
|
|
|
|
if (!status) {
|
|
dev_dbg(host->dev,
|
|
"Unexpected IRQ! irq_en 0x%08lx - status 0x%08x\n",
|
|
- IRQ_EN_MASK | IRQ_SDIO, raw_status);
|
|
+ IRQ_EN_MASK, raw_status);
|
|
return IRQ_NONE;
|
|
}
|
|
|
|
- if (WARN_ON(!host))
|
|
+ if (WARN_ON(!host) || WARN_ON(!host->cmd))
|
|
return IRQ_NONE;
|
|
|
|
/* ack all raised interrupts */
|
|
writel(status, host->regs + SD_EMMC_STATUS);
|
|
|
|
cmd = host->cmd;
|
|
-
|
|
- if (status & IRQ_SDIO) {
|
|
- spin_lock(&host->lock);
|
|
- __meson_mmc_enable_sdio_irq(host->mmc, 0);
|
|
- sdio_signal_irq(host->mmc);
|
|
- spin_unlock(&host->lock);
|
|
- status &= ~IRQ_SDIO;
|
|
- if (!status)
|
|
- return IRQ_HANDLED;
|
|
- }
|
|
-
|
|
- if (WARN_ON(!cmd))
|
|
- return IRQ_NONE;
|
|
-
|
|
+ data = cmd->data;
|
|
cmd->error = 0;
|
|
if (status & IRQ_CRC_ERR) {
|
|
dev_dbg(host->dev, "CRC Error - status 0x%08x\n", status);
|
|
@@ -999,9 +971,12 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
|
|
|
meson_mmc_read_resp(host->mmc, cmd);
|
|
|
|
- if (status & (IRQ_END_OF_CHAIN | IRQ_RESP_STATUS)) {
|
|
- struct mmc_data *data = cmd->data;
|
|
+ if (status & IRQ_SDIO) {
|
|
+ dev_dbg(host->dev, "IRQ: SDIO TODO.\n");
|
|
+ ret = IRQ_HANDLED;
|
|
+ }
|
|
|
|
+ if (status & (IRQ_END_OF_CHAIN | IRQ_RESP_STATUS)) {
|
|
if (data && !cmd->error)
|
|
data->bytes_xfered = data->blksz * data->blocks;
|
|
if (meson_mmc_bounce_buf_read(data) ||
|
|
@@ -1144,21 +1119,6 @@ static int meson_mmc_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
return -EINVAL;
|
|
}
|
|
|
|
-static void meson_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
-{
|
|
- struct meson_host *host = mmc_priv(mmc);
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&host->lock, flags);
|
|
- __meson_mmc_enable_sdio_irq(mmc, enable);
|
|
- spin_unlock_irqrestore(&host->lock, flags);
|
|
-}
|
|
-
|
|
-static void meson_mmc_ack_sdio_irq(struct mmc_host *mmc)
|
|
-{
|
|
- meson_mmc_enable_sdio_irq(mmc, 1);
|
|
-}
|
|
-
|
|
static const struct mmc_host_ops meson_mmc_ops = {
|
|
.request = meson_mmc_request,
|
|
.set_ios = meson_mmc_set_ios,
|
|
@@ -1168,8 +1128,6 @@ static const struct mmc_host_ops meson_mmc_ops = {
|
|
.execute_tuning = meson_mmc_resampling_tuning,
|
|
.card_busy = meson_mmc_card_busy,
|
|
.start_signal_voltage_switch = meson_mmc_voltage_switch,
|
|
- .enable_sdio_irq = meson_mmc_enable_sdio_irq,
|
|
- .ack_sdio_irq = meson_mmc_ack_sdio_irq,
|
|
};
|
|
|
|
static int meson_mmc_probe(struct platform_device *pdev)
|
|
@@ -1275,13 +1233,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
goto err_init_clk;
|
|
|
|
- spin_lock_init(&host->lock);
|
|
-
|
|
mmc->caps |= MMC_CAP_CMD23;
|
|
-
|
|
- if (mmc->caps & MMC_CAP_SDIO_IRQ)
|
|
- mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD;
|
|
-
|
|
if (host->dram_access_quirk) {
|
|
/* Limit segments to 1 due to low available sram memory */
|
|
mmc->max_segs = 1;
|
|
@@ -1374,7 +1326,6 @@ static const struct meson_mmc_data meson_gx_data = {
|
|
.rx_delay_mask = CLK_V2_RX_DELAY_MASK,
|
|
.always_on = CLK_V2_ALWAYS_ON,
|
|
.adjust = SD_EMMC_ADJUST,
|
|
- .irq_sdio_sleep = CLK_V2_IRQ_SDIO_SLEEP,
|
|
};
|
|
|
|
static const struct meson_mmc_data meson_axg_data = {
|
|
@@ -1382,7 +1333,6 @@ static const struct meson_mmc_data meson_axg_data = {
|
|
.rx_delay_mask = CLK_V3_RX_DELAY_MASK,
|
|
.always_on = CLK_V3_ALWAYS_ON,
|
|
.adjust = SD_EMMC_V3_ADJUST,
|
|
- .irq_sdio_sleep = CLK_V3_IRQ_SDIO_SLEEP,
|
|
};
|
|
|
|
static const struct of_device_id meson_mmc_of_match[] = {
|
|
--
|
|
2.34.1
|
|
|