The MT7621 MIPS-based SOC contains an sdhci unit that is
much the same as the units supported by mtk-sd.c.
These patches enhance the driver so that I can use it on my MT7621
board (gnubee.org).
This series have been revised based on feedback from Chaotian.
Thanks,
NeilBrown
---
NeilBrown (4):
mmc: mtk-sd: don't hard-code interrupt trigger type
mmc: mtk-sd: add support for config found in mt7620 family SOCs.
mmc: mtk-sd: enable internal card-detect logic.
mmc: mtk-sd: select REGULATOR
Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1
drivers/mmc/host/Kconfig | 1
drivers/mmc/host/mtk-sd.c | 78 +++++++++++++++++++++-
3 files changed, 75 insertions(+), 5 deletions(-)
--
Signature
mt7620 family MIPS SOCs contain the mtk-sd silicon.
Add support for this.
Signed-off-by: NeilBrown <[email protected]>
---
Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 +
drivers/mmc/host/mtk-sd.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
index 91a2ec59e497..8a532f4453f2 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
@@ -16,6 +16,7 @@ Required properties:
"mediatek,mt2712-mmc": for mmc host ip compatible with mt2712
"mediatek,mt7622-mmc": for MT7622 SoC
"mediatek,mt7623-mmc", "mediatek,mt2701-mmc": for MT7623 SoC
+ "mediatek,mt7620-mmc", for MT7621 SoC (and others)
- reg: physical base address of the controller and length
- interrupts: Should contain MSDC interrupt number
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 469d4a717175..0c2be4f54b1f 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -517,6 +517,17 @@ static const struct mtk_mmc_compatible mt8516_compat = {
.stop_clk_fix = true,
};
+static const struct mtk_mmc_compatible mt7620_compat = {
+ .clk_div_bits = 8,
+ .hs400_tune = false,
+ .pad_tune_reg = MSDC_PAD_TUNE,
+ .async_fifo = false,
+ .data_tune = false,
+ .busy_check = false,
+ .stop_clk_fix = false,
+ .enhance_rx = false,
+};
+
static const struct of_device_id msdc_of_ids[] = {
{ .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat},
{ .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat},
@@ -525,6 +536,7 @@ static const struct of_device_id msdc_of_ids[] = {
{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
{ .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat},
{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
+ { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat},
{}
};
MODULE_DEVICE_TABLE(of, msdc_of_ids);
The mtk-sd driver requires a regulator to be present, even if it is
the "fixed" regulator. So select REGULATOR to make it hard to build
unusable configurations.
Signed-off-by: NeilBrown <[email protected]>
---
drivers/mmc/host/Kconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 9c01310a0d2e..1249cde7004d 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -941,6 +941,7 @@ config MMC_BCM2835
config MMC_MTK
tristate "MediaTek SD/MMC Card Interface support"
depends on HAS_DMA
+ select REGULATOR
help
This selects the MediaTek(R) Secure digital and Multimedia card Interface.
If you have a machine with a integrated SD/MMC card reader, say Y or M here.
The mtk-sd silicon has integrated card-detect logic that is
enabled on the MT7621. The circuit is phased out on newer hardware so
we should be careful to only enabled it on hardware known to support
it. This a new "use_internal_cd" flag in struct mtk_mmc_compatible.
If the sdhci isn't marked non-removable and doesn't have a
cd-gpio configured, and if use_internal_cd is set, then assume the
internal cd logic should be used as recommended by
Documentation/devicetree/bindings/mmc/mmc.txt
Signed-off-by: NeilBrown <[email protected]>
---
drivers/mmc/host/mtk-sd.c | 64 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 60 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 0c2be4f54b1f..c518cc208a1f 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -300,6 +300,8 @@
#define CMD_TIMEOUT (HZ/10 * 5) /* 100ms x5 */
#define DAT_TIMEOUT (HZ * 5) /* 1000ms x5 */
+#define DEFAULT_DEBOUNCE (8) /* 8 cycles CD debounce */
+
#define PAD_DELAY_MAX 32 /* PAD delay cells */
/*--------------------------------------------------------------------------*/
/* Descriptor Structure */
@@ -372,6 +374,7 @@ struct mtk_mmc_compatible {
bool stop_clk_fix;
bool enhance_rx;
bool support_64g;
+ bool use_internal_cd;
};
struct msdc_tune_para {
@@ -430,6 +433,7 @@ struct msdc_host {
bool hs400_cmd_resp_sel_rising;
/* cmd response sample selection for HS400 */
bool hs400_mode; /* current eMMC will run at hs400 mode */
+ bool internal_cd; /* Use internal card-detect logic */
struct msdc_save_para save_para; /* used when gate HCLK */
struct msdc_tune_para def_tune_para; /* default tune setting */
struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
@@ -526,6 +530,7 @@ static const struct mtk_mmc_compatible mt7620_compat = {
.busy_check = false,
.stop_clk_fix = false,
.enhance_rx = false,
+ .use_internal_cd = true,
};
static const struct of_device_id msdc_of_ids[] = {
@@ -1430,6 +1435,12 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
sdio_signal_irq(host->mmc);
}
+ if ((events & event_mask) & MSDC_INT_CDSC) {
+ if (host->internal_cd)
+ mmc_detect_change(host->mmc, msecs_to_jiffies(20));
+ events &= ~MSDC_INT_CDSC;
+ }
+
if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ)))
break;
@@ -1463,14 +1474,24 @@ static void msdc_init_hw(struct msdc_host *host)
/* Reset */
msdc_reset_hw(host);
- /* Disable card detection */
- sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
-
/* Disable and clear all interrupts */
writel(0, host->base + MSDC_INTEN);
val = readl(host->base + MSDC_INT);
writel(val, host->base + MSDC_INT);
+ /* Configure card detection */
+ if (host->internal_cd) {
+ sdr_set_field(host->base + MSDC_PS, MSDC_PS_CDDEBOUNCE,
+ DEFAULT_DEBOUNCE);
+ sdr_set_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
+ sdr_set_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
+ sdr_set_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
+ } else {
+ sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
+ sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
+ sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
+ }
+
if (host->top_base) {
writel(0, host->top_base + EMMC_TOP_CONTROL);
writel(0, host->top_base + EMMC_TOP_CMD);
@@ -1580,6 +1601,13 @@ static void msdc_init_hw(struct msdc_host *host)
static void msdc_deinit_hw(struct msdc_host *host)
{
u32 val;
+
+ if (host->internal_cd) {
+ /* Disabled card-detect */
+ sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
+ sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
+ }
+
/* Disable and clear all interrupts */
writel(0, host->base + MSDC_INTEN);
@@ -2078,13 +2106,31 @@ static void msdc_ack_sdio_irq(struct mmc_host *mmc)
__msdc_enable_sdio_irq(mmc, 1);
}
+static int msdc_get_cd(struct mmc_host *mmc)
+{
+ struct msdc_host *host = mmc_priv(mmc);
+ int val;
+
+ if (mmc->caps & MMC_CAP_NONREMOVABLE)
+ return 1;
+
+ if (!host->internal_cd)
+ return mmc_gpio_get_cd(mmc);
+
+ val = readl(host->base + MSDC_PS) & MSDC_PS_CDSTS;
+ if (mmc->caps2 & MMC_CAP2_CD_ACTIVE_HIGH)
+ return !!val;
+ else
+ return !val;
+}
+
static const struct mmc_host_ops mt_msdc_ops = {
.post_req = msdc_post_req,
.pre_req = msdc_pre_req,
.request = msdc_ops_request,
.set_ios = msdc_ops_set_ios,
.get_ro = mmc_gpio_get_ro,
- .get_cd = mmc_gpio_get_cd,
+ .get_cd = msdc_get_cd,
.enable_sdio_irq = msdc_enable_sdio_irq,
.ack_sdio_irq = msdc_ack_sdio_irq,
.start_signal_voltage_switch = msdc_ops_switch_volt,
@@ -2216,6 +2262,16 @@ static int msdc_drv_probe(struct platform_device *pdev)
else
mmc->f_min = DIV_ROUND_UP(host->src_clk_freq, 4 * 4095);
+ if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
+ !mmc_can_gpio_cd(mmc) &&
+ host->dev_comp->use_internal_cd) {
+ /*
+ * Is removable but no GPIO declared, so
+ * use internal functionality.
+ */
+ host->internal_cd = true;
+ }
+
if (mmc->caps & MMC_CAP_SDIO_IRQ)
mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD;
When using devicetree for configuration, interrupt trigger type
should be described in the dts file, not hard-coded in the C code.
The mtk-sd silicon in the mt7621 soc uses an active-high interrupt
and so cannot be used with the current code.
So replace IRQF_TRIGGER_LOW with IRQF_TRIGGER_NONE.
Also IRQF_ONESHOT is not needed - it is used for threaded interrupt
handlers, and this driver does not used a threaded interrupt handler.
So remove that setting.
Signed-off-by: NeilBrown <[email protected]>
---
drivers/mmc/host/mtk-sd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 0798f0ba6d34..469d4a717175 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2240,7 +2240,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
msdc_init_hw(host);
ret = devm_request_irq(&pdev->dev, host->irq, msdc_irq,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT, pdev->name, host);
+ IRQF_TRIGGER_NONE, pdev->name, host);
if (ret)
goto release;
On Sat, 2019-05-04 at 20:24 +1000, NeilBrown wrote:
> When using devicetree for configuration, interrupt trigger type
> should be described in the dts file, not hard-coded in the C code.
>
> The mtk-sd silicon in the mt7621 soc uses an active-high interrupt
> and so cannot be used with the current code.
>
> So replace IRQF_TRIGGER_LOW with IRQF_TRIGGER_NONE.
>
> Also IRQF_ONESHOT is not needed - it is used for threaded interrupt
> handlers, and this driver does not used a threaded interrupt handler.
> So remove that setting.
>
> Signed-off-by: NeilBrown <[email protected]>
Reviewed-by:Chaotian Jing <[email protected]>
> ---
> drivers/mmc/host/mtk-sd.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 0798f0ba6d34..469d4a717175 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -2240,7 +2240,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
> msdc_init_hw(host);
>
> ret = devm_request_irq(&pdev->dev, host->irq, msdc_irq,
> - IRQF_TRIGGER_LOW | IRQF_ONESHOT, pdev->name, host);
> + IRQF_TRIGGER_NONE, pdev->name, host);
> if (ret)
> goto release;
>
>
>
On Sat, 2019-05-04 at 20:24 +1000, NeilBrown wrote:
> The mtk-sd driver requires a regulator to be present, even if it is
> the "fixed" regulator. So select REGULATOR to make it hard to build
> unusable configurations.
>
> Signed-off-by: NeilBrown <[email protected]>
Reviewed-by:Chaotian Jing <[email protected]>
> ---
> drivers/mmc/host/Kconfig | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index 9c01310a0d2e..1249cde7004d 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -941,6 +941,7 @@ config MMC_BCM2835
> config MMC_MTK
> tristate "MediaTek SD/MMC Card Interface support"
> depends on HAS_DMA
> + select REGULATOR
> help
> This selects the MediaTek(R) Secure digital and Multimedia card Interface.
> If you have a machine with a integrated SD/MMC card reader, say Y or M here.
>
>
On Sat, 2019-05-04 at 20:24 +1000, NeilBrown wrote:
> The mtk-sd silicon has integrated card-detect logic that is
> enabled on the MT7621. The circuit is phased out on newer hardware so
> we should be careful to only enabled it on hardware known to support
> it. This a new "use_internal_cd" flag in struct mtk_mmc_compatible.
>
> If the sdhci isn't marked non-removable and doesn't have a
> cd-gpio configured, and if use_internal_cd is set, then assume the
> internal cd logic should be used as recommended by
> Documentation/devicetree/bindings/mmc/mmc.txt
>
> Signed-off-by: NeilBrown <[email protected]>
Reviewed-by:Chaotian Jing <[email protected]>
> ---
> drivers/mmc/host/mtk-sd.c | 64 ++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 60 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 0c2be4f54b1f..c518cc208a1f 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -300,6 +300,8 @@
> #define CMD_TIMEOUT (HZ/10 * 5) /* 100ms x5 */
> #define DAT_TIMEOUT (HZ * 5) /* 1000ms x5 */
>
> +#define DEFAULT_DEBOUNCE (8) /* 8 cycles CD debounce */
> +
> #define PAD_DELAY_MAX 32 /* PAD delay cells */
> /*--------------------------------------------------------------------------*/
> /* Descriptor Structure */
> @@ -372,6 +374,7 @@ struct mtk_mmc_compatible {
> bool stop_clk_fix;
> bool enhance_rx;
> bool support_64g;
> + bool use_internal_cd;
> };
>
> struct msdc_tune_para {
> @@ -430,6 +433,7 @@ struct msdc_host {
> bool hs400_cmd_resp_sel_rising;
> /* cmd response sample selection for HS400 */
> bool hs400_mode; /* current eMMC will run at hs400 mode */
> + bool internal_cd; /* Use internal card-detect logic */
> struct msdc_save_para save_para; /* used when gate HCLK */
> struct msdc_tune_para def_tune_para; /* default tune setting */
> struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
> @@ -526,6 +530,7 @@ static const struct mtk_mmc_compatible mt7620_compat = {
> .busy_check = false,
> .stop_clk_fix = false,
> .enhance_rx = false,
> + .use_internal_cd = true,
> };
>
> static const struct of_device_id msdc_of_ids[] = {
> @@ -1430,6 +1435,12 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
> sdio_signal_irq(host->mmc);
> }
>
> + if ((events & event_mask) & MSDC_INT_CDSC) {
> + if (host->internal_cd)
> + mmc_detect_change(host->mmc, msecs_to_jiffies(20));
> + events &= ~MSDC_INT_CDSC;
> + }
> +
> if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ)))
> break;
>
> @@ -1463,14 +1474,24 @@ static void msdc_init_hw(struct msdc_host *host)
> /* Reset */
> msdc_reset_hw(host);
>
> - /* Disable card detection */
> - sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
> -
> /* Disable and clear all interrupts */
> writel(0, host->base + MSDC_INTEN);
> val = readl(host->base + MSDC_INT);
> writel(val, host->base + MSDC_INT);
>
> + /* Configure card detection */
> + if (host->internal_cd) {
> + sdr_set_field(host->base + MSDC_PS, MSDC_PS_CDDEBOUNCE,
> + DEFAULT_DEBOUNCE);
> + sdr_set_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
> + sdr_set_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
> + sdr_set_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
> + } else {
> + sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
> + sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
> + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
> + }
> +
> if (host->top_base) {
> writel(0, host->top_base + EMMC_TOP_CONTROL);
> writel(0, host->top_base + EMMC_TOP_CMD);
> @@ -1580,6 +1601,13 @@ static void msdc_init_hw(struct msdc_host *host)
> static void msdc_deinit_hw(struct msdc_host *host)
> {
> u32 val;
> +
> + if (host->internal_cd) {
> + /* Disabled card-detect */
> + sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
> + sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
> + }
> +
> /* Disable and clear all interrupts */
> writel(0, host->base + MSDC_INTEN);
>
> @@ -2078,13 +2106,31 @@ static void msdc_ack_sdio_irq(struct mmc_host *mmc)
> __msdc_enable_sdio_irq(mmc, 1);
> }
>
> +static int msdc_get_cd(struct mmc_host *mmc)
> +{
> + struct msdc_host *host = mmc_priv(mmc);
> + int val;
> +
> + if (mmc->caps & MMC_CAP_NONREMOVABLE)
> + return 1;
> +
> + if (!host->internal_cd)
> + return mmc_gpio_get_cd(mmc);
> +
> + val = readl(host->base + MSDC_PS) & MSDC_PS_CDSTS;
> + if (mmc->caps2 & MMC_CAP2_CD_ACTIVE_HIGH)
> + return !!val;
> + else
> + return !val;
> +}
> +
> static const struct mmc_host_ops mt_msdc_ops = {
> .post_req = msdc_post_req,
> .pre_req = msdc_pre_req,
> .request = msdc_ops_request,
> .set_ios = msdc_ops_set_ios,
> .get_ro = mmc_gpio_get_ro,
> - .get_cd = mmc_gpio_get_cd,
> + .get_cd = msdc_get_cd,
> .enable_sdio_irq = msdc_enable_sdio_irq,
> .ack_sdio_irq = msdc_ack_sdio_irq,
> .start_signal_voltage_switch = msdc_ops_switch_volt,
> @@ -2216,6 +2262,16 @@ static int msdc_drv_probe(struct platform_device *pdev)
> else
> mmc->f_min = DIV_ROUND_UP(host->src_clk_freq, 4 * 4095);
>
> + if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
> + !mmc_can_gpio_cd(mmc) &&
> + host->dev_comp->use_internal_cd) {
> + /*
> + * Is removable but no GPIO declared, so
> + * use internal functionality.
> + */
> + host->internal_cd = true;
> + }
> +
> if (mmc->caps & MMC_CAP_SDIO_IRQ)
> mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD;
>
>
>
On Sat, 2019-05-04 at 20:24 +1000, NeilBrown wrote:
> mt7620 family MIPS SOCs contain the mtk-sd silicon.
> Add support for this.
>
> Signed-off-by: NeilBrown <[email protected]>
Reviewed-by:Chaotian Jing <[email protected]>
> ---
> Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 +
> drivers/mmc/host/mtk-sd.c | 12 ++++++++++++
> 2 files changed, 13 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
> index 91a2ec59e497..8a532f4453f2 100644
> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt
> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
> @@ -16,6 +16,7 @@ Required properties:
> "mediatek,mt2712-mmc": for mmc host ip compatible with mt2712
> "mediatek,mt7622-mmc": for MT7622 SoC
> "mediatek,mt7623-mmc", "mediatek,mt2701-mmc": for MT7623 SoC
> + "mediatek,mt7620-mmc", for MT7621 SoC (and others)
>
> - reg: physical base address of the controller and length
> - interrupts: Should contain MSDC interrupt number
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 469d4a717175..0c2be4f54b1f 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -517,6 +517,17 @@ static const struct mtk_mmc_compatible mt8516_compat = {
> .stop_clk_fix = true,
> };
>
> +static const struct mtk_mmc_compatible mt7620_compat = {
> + .clk_div_bits = 8,
> + .hs400_tune = false,
> + .pad_tune_reg = MSDC_PAD_TUNE,
> + .async_fifo = false,
> + .data_tune = false,
> + .busy_check = false,
> + .stop_clk_fix = false,
> + .enhance_rx = false,
> +};
> +
> static const struct of_device_id msdc_of_ids[] = {
> { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat},
> { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat},
> @@ -525,6 +536,7 @@ static const struct of_device_id msdc_of_ids[] = {
> { .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
> { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat},
> { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
> + { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat},
> {}
> };
> MODULE_DEVICE_TABLE(of, msdc_of_ids);
>
>
On Sat, 4 May 2019 at 12:25, NeilBrown <[email protected]> wrote:
>
> The MT7621 MIPS-based SOC contains an sdhci unit that is
> much the same as the units supported by mtk-sd.c.
>
> These patches enhance the driver so that I can use it on my MT7621
> board (gnubee.org).
>
> This series have been revised based on feedback from Chaotian.
Applied for next, thanks!
Kind regards
Uffe
>
> Thanks,
> NeilBrown
>
> ---
>
> NeilBrown (4):
> mmc: mtk-sd: don't hard-code interrupt trigger type
> mmc: mtk-sd: add support for config found in mt7620 family SOCs.
> mmc: mtk-sd: enable internal card-detect logic.
> mmc: mtk-sd: select REGULATOR
>
>
> Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1
> drivers/mmc/host/Kconfig | 1
> drivers/mmc/host/mtk-sd.c | 78 +++++++++++++++++++++-
> 3 files changed, 75 insertions(+), 5 deletions(-)
>
> --
> Signature
>