linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2
@ 2019-05-04 10:24 NeilBrown
  2019-05-04 10:24 ` [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: NeilBrown @ 2019-05-04 10:24 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

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


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs.
  2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
  2019-05-04 10:24 ` [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
@ 2019-05-04 10:24 ` NeilBrown
  2019-05-05  7:49   ` Chaotian Jing
  2019-05-04 10:24 ` [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic NeilBrown
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: NeilBrown @ 2019-05-04 10:24 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

mt7620 family MIPS SOCs contain the mtk-sd silicon.
Add support for this.

Signed-off-by: NeilBrown <neil@brown.name>
---
 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);



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
@ 2019-05-04 10:24 ` NeilBrown
  2019-05-05  7:43   ` Chaotian Jing
  2019-05-04 10:24 ` [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: NeilBrown @ 2019-05-04 10:24 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
---
 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;
 



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic.
  2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
  2019-05-04 10:24 ` [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
  2019-05-04 10:24 ` [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
@ 2019-05-04 10:24 ` NeilBrown
  2019-05-05  7:52   ` Chaotian Jing
  2019-05-04 10:24 ` [PATCH 4/4] mmc: mtk-sd: select REGULATOR NeilBrown
  2019-05-06  9:51 ` [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 Ulf Hansson
  4 siblings, 1 reply; 10+ messages in thread
From: NeilBrown @ 2019-05-04 10:24 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
---
 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;
 



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] mmc: mtk-sd: select REGULATOR
  2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
                   ` (2 preceding siblings ...)
  2019-05-04 10:24 ` [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic NeilBrown
@ 2019-05-04 10:24 ` NeilBrown
  2019-05-05  7:52   ` Chaotian Jing
  2019-05-06  9:51 ` [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 Ulf Hansson
  4 siblings, 1 reply; 10+ messages in thread
From: NeilBrown @ 2019-05-04 10:24 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
---
 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.



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-05-04 10:24 ` [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
@ 2019-05-05  7:43   ` Chaotian Jing
  0 siblings, 0 replies; 10+ messages in thread
From: Chaotian Jing @ 2019-05-05  7:43 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
 Reviewed-by:Chaotian Jing <chaotian.jing@mediatek.com>
> ---
>  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;
>  
> 
> 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs.
  2019-05-04 10:24 ` [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
@ 2019-05-05  7:49   ` Chaotian Jing
  0 siblings, 0 replies; 10+ messages in thread
From: Chaotian Jing @ 2019-05-05  7:49 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
 Reviewed-by:Chaotian Jing <chaotian.jing@mediatek.com>
> ---
>  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);
> 
> 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic.
  2019-05-04 10:24 ` [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic NeilBrown
@ 2019-05-05  7:52   ` Chaotian Jing
  0 siblings, 0 replies; 10+ messages in thread
From: Chaotian Jing @ 2019-05-05  7:52 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
 Reviewed-by:Chaotian Jing <chaotian.jing@mediatek.com>
> ---
>  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;
>  
> 
> 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] mmc: mtk-sd: select REGULATOR
  2019-05-04 10:24 ` [PATCH 4/4] mmc: mtk-sd: select REGULATOR NeilBrown
@ 2019-05-05  7:52   ` Chaotian Jing
  0 siblings, 0 replies; 10+ messages in thread
From: Chaotian Jing @ 2019-05-05  7:52 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

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 <neil@brown.name>
 Reviewed-by:Chaotian Jing <chaotian.jing@mediatek.com>
> ---
>  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.
> 
> 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2
  2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
                   ` (3 preceding siblings ...)
  2019-05-04 10:24 ` [PATCH 4/4] mmc: mtk-sd: select REGULATOR NeilBrown
@ 2019-05-06  9:51 ` Ulf Hansson
  4 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2019-05-06  9:51 UTC (permalink / raw)
  To: NeilBrown
  Cc: Chaotian Jing, linux-mmc, Linux Kernel Mailing List, thirtythreeforty

On Sat, 4 May 2019 at 12:25, NeilBrown <neil@brown.name> 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
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-05-06  9:52 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-04 10:24 [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 NeilBrown
2019-05-04 10:24 ` [PATCH 1/4] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
2019-05-05  7:43   ` Chaotian Jing
2019-05-04 10:24 ` [PATCH 2/4] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
2019-05-05  7:49   ` Chaotian Jing
2019-05-04 10:24 ` [PATCH 3/4] mmc: mtk-sd: enable internal card-detect logic NeilBrown
2019-05-05  7:52   ` Chaotian Jing
2019-05-04 10:24 ` [PATCH 4/4] mmc: mtk-sd: select REGULATOR NeilBrown
2019-05-05  7:52   ` Chaotian Jing
2019-05-06  9:51 ` [PATCH 0/4] mtk-sd enhancement to support MT7621 - V2 Ulf Hansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).