All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] mtk-sd enhancement to support MT7621
@ 2019-04-16  4:47 NeilBrown
  2019-04-16  4:47 ` [PATCH 1/5] mmc: mtk-sd: support "voltage-ranges" setting NeilBrown
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 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).

Some thoughts:
- I wonder if voltage-ranges should be a standard option, processed
    by mmc_of_parse(), rather than requiring mmc_of_parse_voltage()
    to be called as well?

- the "compatible" name "ralink,mt7620-sdhci" doesn't fit the pattern
  of other names.  It is a name I found in openwrt - I was previously
  using a driver from there.  I have no objection to changing it,
  but I have no way to determine what the "correct" name it.

- I have tested the card-detect logic but not the write-protect, as
  that doesn't seem to be wired on this board.

- My SOC doesn't have software-controlled clocks (that I can find).
  To get the clocks that the driver requires, I define a "fixed-clock"
  with the appropriate frequency and use that for both  "source" and
  "hclk".  Many these clocks should be optional - at least hclk ??

- I don't need to reconfigure the pins for "uhs" so I just use the
  same pinctrl setting for "default" and for "state_uhs".  Maybe
  "state_uhs" should be optional?


For reference, excerpts from my dts file are below.

Thanks,
NeilBrown


       mmc_clock: mmc_clock@0 {
               #clock-cells = <0>;
               compatible = "fixed-clock";
               clock-frequency = <48000000>;
       };

and

       sdhci: sdhci@1E130000 {
               status = "disabled";

               compatible = "ralink,mt7620-sdhci";
               reg = <0x1E130000 0x4000>;

               bus-width = <4>;
               max-frequency = <48000000>;
               cap-sd-highspeed;
               cap-mmc-highspeed;
               voltage-ranges = <2800 3300>;

               pinctrl-names = "default", "state_uhs";
               pinctrl-0 = <&sdhci_pins>;
               pinctrl-1 = <&sdhci_pins>;
               clocks = <&mmc_clock &mmc_clock>;
               clock-names = "source", "hclk";

               interrupt-parent = <&gic>;
               interrupts = <GIC_SHARED 20 IRQ_TYPE_LEVEL_HIGH>;
       };

---

NeilBrown (5):
      mmc: mtk-sd: support "voltage-ranges" setting.
      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: enable internal write-protect logic.


 Documentation/devicetree/bindings/mmc/mtk-sd.txt |    7 +
 drivers/mmc/host/mtk-sd.c                        |  105 +++++++++++++++++++++-
 2 files changed, 104 insertions(+), 8 deletions(-)

--
Signature


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

* [PATCH 1/5] mmc: mtk-sd: support "voltage-ranges" setting.
  2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
@ 2019-04-16  4:47 ` NeilBrown
  2019-04-16  4:47 ` [PATCH 5/5] mmc: mtk-sd: enable internal write-protect logic NeilBrown
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

If the mtk-sd silicon is used in a context where there is no explicit
regulator, it is not currently possible to specify the voltage
ranges.  This is true for the MT7621 MIPS Soc.

So add a called to mmc_of_parse_voltage() so that voltage-ranges can
be given.

Signed-off-by: NeilBrown <neil@brown.name>
---
 Documentation/devicetree/bindings/mmc/mtk-sd.txt |    6 ++++--
 drivers/mmc/host/mtk-sd.c                        |    3 +++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
index f5bcda3980cc..ed61cd5a5b8f 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
@@ -27,10 +27,12 @@ Required properties:
 - pinctrl-names: should be "default", "state_uhs"
 - pinctrl-0: should contain default/high speed pin ctrl
 - pinctrl-1: should contain uhs mode pin ctrl
-- vmmc-supply: power to the Core
-- vqmmc-supply: power to the IO
 
 Optional properties:
+- vmmc-supply: power to the Core
+- vqmmc-supply: power to the IO
+- voltage-ranges: if vmmc-supply not present, this can specify pairs
+	of millivolt numbers to describe available ranged.
 - assigned-clocks: PLL of the source clock
 - assigned-clock-parents: parent of source clock, used for HS400 mode to get 400Mhz source clock
 - hs400-ds-delay: HS400 DS delay setting
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 0798f0ba6d34..4492a4465c0e 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2125,6 +2125,9 @@ static int msdc_drv_probe(struct platform_device *pdev)
 	ret = mmc_of_parse(mmc);
 	if (ret)
 		goto host_free;
+	ret = mmc_of_parse_voltage(pdev->dev.of_node, &mmc->ocr_avail);
+	if (ret < 0)
+		goto host_free;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	host->base = devm_ioremap_resource(&pdev->dev, res);



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

* [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
                   ` (2 preceding siblings ...)
  2019-04-16  4:47 ` [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic NeilBrown
@ 2019-04-16  4:47 ` NeilBrown
  2019-04-16  8:11     ` Chaotian Jing
  2019-04-16  4:47 ` [PATCH 3/5] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
  4 siblings, 1 reply; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 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 remove the trigger and leave it to be set from devicetree.

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 4492a4465c0e..14e048239143 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2243,7 +2243,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);
+			       0, pdev->name, host);
 	if (ret)
 		goto release;
 



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

* [PATCH 3/5] mmc: mtk-sd: add support for config found in mt7620 family SOCs.
  2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
                   ` (3 preceding siblings ...)
  2019-04-16  4:47 ` [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
@ 2019-04-16  4:47 ` NeilBrown
  4 siblings, 0 replies; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 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>

# Conflicts:
#	drivers/mmc/host/mtk-sd.c
---
 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 ed61cd5a5b8f..b6daa9773b25 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt
@@ -15,6 +15,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
+	"ralink,mt7620-sdhci", 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 14e048239143..d379f2ece305 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 = "ralink,mt7620-sdhci", .data = &mt7620_compat},
 	{}
 };
 MODULE_DEVICE_TABLE(of, msdc_of_ids);



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

* [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic.
  2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
  2019-04-16  4:47 ` [PATCH 1/5] mmc: mtk-sd: support "voltage-ranges" setting NeilBrown
  2019-04-16  4:47 ` [PATCH 5/5] mmc: mtk-sd: enable internal write-protect logic NeilBrown
@ 2019-04-16  4:47 ` NeilBrown
  2019-04-18  6:39     ` Chaotian Jing
  2019-04-16  4:47 ` [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
  2019-04-16  4:47 ` [PATCH 3/5] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown
  4 siblings, 1 reply; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 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, at least, on the MT7621 as used in the GNUBEE NAS.

If the sdhci isn't marked non-removable and doesn't have a
cd-gpio configured, assume the internal cd logic should be used.

Signed-off-by: NeilBrown <neil@brown.name>
---
 drivers/mmc/host/mtk-sd.c |   58 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index d379f2ece305..341cf5f03429 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                                                     */
@@ -430,6 +432,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 */
@@ -1430,6 +1433,11 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
 			sdio_signal_irq(host->mmc);
 		}
 
+		if ((events & event_mask) & MSDC_INT_CDSC) {
+			mmc_detect_change(host->mmc, msecs_to_jiffies(20));
+			events &= ~MSDC_INT_CDSC;
+		}
+
 		if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ)))
 			break;
 
@@ -1463,14 +1471,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 +1598,11 @@ static void msdc_init_hw(struct msdc_host *host)
 static void msdc_deinit_hw(struct msdc_host *host)
 {
 	u32 val;
+
+	/* 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 +2101,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,
@@ -2206,6 +2247,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
 		goto host_free;
 	}
 
+	if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
+	    !mmc_can_gpio_cd(mmc)) {
+		/*
+		 * Is removable but no GPIO declared, so
+		 * use internal functionality.
+		 */
+		host->internal_cd = true;
+	}
+
 	msdc_of_property_parse(pdev, host);
 
 	host->dev = &pdev->dev;



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

* [PATCH 5/5] mmc: mtk-sd: enable internal write-protect logic.
  2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
  2019-04-16  4:47 ` [PATCH 1/5] mmc: mtk-sd: support "voltage-ranges" setting NeilBrown
@ 2019-04-16  4:47 ` NeilBrown
  2019-04-16  4:47 ` [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic NeilBrown
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: NeilBrown @ 2019-04-16  4:47 UTC (permalink / raw)
  To: Ulf Hansson, Chaotian Jing; +Cc: linux-mmc, linux-kernel, thirtythreeforty

The mtk-sd silicon has integrated write-protect detection logic.

If the sdhci isn't marked no-write-protect and doesn't have a
ro-gpio configured, assume the internal wp logic should be used.

Signed-off-by: NeilBrown <neil@brown.name>
---
 drivers/mmc/host/mtk-sd.c |   30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 341cf5f03429..d63d6b62f49a 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -433,6 +433,7 @@ struct msdc_host {
 				 /* cmd response sample selection for HS400 */
 	bool hs400_mode;	/* current eMMC will run at hs400 mode */
 	bool internal_cd;	/* Use internal card-detect logic */
+	bool internal_ro;	/* Use internal write-protect 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 */
@@ -2119,12 +2120,30 @@ static int msdc_get_cd(struct mmc_host *mmc)
 		return !val;
 }
 
+static int msdc_get_ro(struct mmc_host *mmc)
+{
+	struct msdc_host *host = mmc_priv(mmc);
+	int val;
+
+	if (mmc->caps2 & MMC_CAP2_NO_WRITE_PROTECT)
+		return 0;
+
+	if (!host->internal_ro)
+		return mmc_gpio_get_ro(mmc);
+
+	val = readl(host->base + MSDC_PS) & MSDC_PS_WP;
+	if (mmc->caps2 & MMC_CAP2_RO_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_ro = msdc_get_ro,
 	.get_cd = msdc_get_cd,
 	.enable_sdio_irq = msdc_enable_sdio_irq,
 	.ack_sdio_irq = msdc_ack_sdio_irq,
@@ -2256,6 +2275,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
 		host->internal_cd = true;
 	}
 
+	if (!(mmc->caps2 & MMC_CAP2_NO_WRITE_PROTECT) &&
+	    !mmc_can_gpio_ro(mmc)) {
+		/*
+		 * Has write-protect but no GPIO declared, so
+		 * use internal functionality.
+		 */
+		host->internal_ro = true;
+	}
+
 	msdc_of_property_parse(pdev, host);
 
 	host->dev = &pdev->dev;



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

* Re: [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-04-16  4:47 ` [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
@ 2019-04-16  8:11     ` Chaotian Jing
  0 siblings, 0 replies; 14+ messages in thread
From: Chaotian Jing @ 2019-04-16  8:11 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

On Tue, 2019-04-16 at 14:47 +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 remove the trigger and leave it to be set from devicetree.
> 
> 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 4492a4465c0e..14e048239143 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -2243,7 +2243,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);
> +
change it to IRQF_TRIGGER_NONE | IRQF_ONESHOT
> 			       0, pdev->name, host);
>  	if (ret)
>  		goto release;
>  
> 
> 



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

* Re: [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
@ 2019-04-16  8:11     ` Chaotian Jing
  0 siblings, 0 replies; 14+ messages in thread
From: Chaotian Jing @ 2019-04-16  8:11 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

On Tue, 2019-04-16 at 14:47 +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 remove the trigger and leave it to be set from devicetree.
> 
> 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 4492a4465c0e..14e048239143 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -2243,7 +2243,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);
> +
change it to IRQF_TRIGGER_NONE | IRQF_ONESHOT
> 			       0, pdev->name, host);
>  	if (ret)
>  		goto release;
>  
> 
> 

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

* Re: [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-04-16  8:11     ` Chaotian Jing
  (?)
@ 2019-04-16 22:12     ` NeilBrown
  2019-04-18  6:36         ` Chaotian Jing
  -1 siblings, 1 reply; 14+ messages in thread
From: NeilBrown @ 2019-04-16 22:12 UTC (permalink / raw)
  To: Chaotian Jing; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

[-- Attachment #1: Type: text/plain, Size: 1320 bytes --]

On Tue, Apr 16 2019, Chaotian Jing wrote:

> On Tue, 2019-04-16 at 14:47 +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 remove the trigger and leave it to be set from devicetree.
>> 
>> 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 4492a4465c0e..14e048239143 100644
>> --- a/drivers/mmc/host/mtk-sd.c
>> +++ b/drivers/mmc/host/mtk-sd.c
>> @@ -2243,7 +2243,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);
>> +
> change it to IRQF_TRIGGER_NONE | IRQF_ONESHOT

Why do we need IRQF_ONESHOT.  That is for threaded interrupted
handlers...
msdc_irq() clears the interrupts, so ONESHOT isn't needed.

???

NeilBrown


>> 			       0, pdev->name, host);
>>  	if (ret)
>>  		goto release;
>>  
>> 
>> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

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

* Re: [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
  2019-04-16 22:12     ` NeilBrown
@ 2019-04-18  6:36         ` Chaotian Jing
  0 siblings, 0 replies; 14+ messages in thread
From: Chaotian Jing @ 2019-04-18  6:36 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

On Wed, 2019-04-17 at 08:12 +1000, NeilBrown wrote:
> On Tue, Apr 16 2019, Chaotian Jing wrote:
> 
> > On Tue, 2019-04-16 at 14:47 +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 remove the trigger and leave it to be set from devicetree.
> >> 
> >> 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 4492a4465c0e..14e048239143 100644
> >> --- a/drivers/mmc/host/mtk-sd.c
> >> +++ b/drivers/mmc/host/mtk-sd.c
> >> @@ -2243,7 +2243,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);
> >> +
> > change it to IRQF_TRIGGER_NONE | IRQF_ONESHOT
> 
> Why do we need IRQF_ONESHOT.  That is for threaded interrupted
> handlers...
> msdc_irq() clears the interrupts, so ONESHOT isn't needed.
> 
> ???
> 
> NeilBrown
> 
> 
I just want to change it to IRQF_TRIGGER_NONE, Since IRQF_TRIGGER_NONE
is defined as 0, it's ok to use 0 instead of it.
> >> 			       0, pdev->name, host);
> >>  	if (ret)
> >>  		goto release;
> >>  
> >> 
> >> 



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

* Re: [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type
@ 2019-04-18  6:36         ` Chaotian Jing
  0 siblings, 0 replies; 14+ messages in thread
From: Chaotian Jing @ 2019-04-18  6:36 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

On Wed, 2019-04-17 at 08:12 +1000, NeilBrown wrote:
> On Tue, Apr 16 2019, Chaotian Jing wrote:
> 
> > On Tue, 2019-04-16 at 14:47 +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 remove the trigger and leave it to be set from devicetree.
> >> 
> >> 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 4492a4465c0e..14e048239143 100644
> >> --- a/drivers/mmc/host/mtk-sd.c
> >> +++ b/drivers/mmc/host/mtk-sd.c
> >> @@ -2243,7 +2243,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);
> >> +
> > change it to IRQF_TRIGGER_NONE | IRQF_ONESHOT
> 
> Why do we need IRQF_ONESHOT.  That is for threaded interrupted
> handlers...
> msdc_irq() clears the interrupts, so ONESHOT isn't needed.
> 
> ???
> 
> NeilBrown
> 
> 
I just want to change it to IRQF_TRIGGER_NONE, Since IRQF_TRIGGER_NONE
is defined as 0, it's ok to use 0 instead of it.
> >> 			       0, pdev->name, host);
> >>  	if (ret)
> >>  		goto release;
> >>  
> >> 
> >> 

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

* Re: [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic.
  2019-04-16  4:47 ` [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic NeilBrown
@ 2019-04-18  6:39     ` Chaotian Jing
  0 siblings, 0 replies; 14+ messages in thread
From: Chaotian Jing @ 2019-04-18  6:39 UTC (permalink / raw)
  To: NeilBrown; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

On Tue, 2019-04-16 at 14:47 +1000, NeilBrown wrote:
> The mtk-sd silicon has integrated card-detect logic that is
> enabled, at least, on the MT7621 as used in the GNUBEE NAS.
> 
> If the sdhci isn't marked non-removable and doesn't have a
> cd-gpio configured, assume the internal cd logic should be used.
> 
> Signed-off-by: NeilBrown <neil@brown.name>
> ---
>  drivers/mmc/host/mtk-sd.c |   58 ++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 54 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index d379f2ece305..341cf5f03429 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                                                     */
> @@ -430,6 +432,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 */
> @@ -1430,6 +1433,11 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
>  			sdio_signal_irq(host->mmc);
>  		}
>  
> +		if ((events & event_mask) & MSDC_INT_CDSC) {
> +			mmc_detect_change(host->mmc, msecs_to_jiffies(20));
> +			events &= ~MSDC_INT_CDSC;
> +		}
> +
>  		if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ)))
>  			break;
>  
> @@ -1463,14 +1471,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 +1598,11 @@ static void msdc_init_hw(struct msdc_host *host)
>  static void msdc_deinit_hw(struct msdc_host *host)
>  {
>  	u32 val;
> +
> +	/* 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 +2101,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,
> @@ -2206,6 +2247,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
>  		goto host_free;
>  	}
>  
> +	if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
> +	    !mmc_can_gpio_cd(mmc)) {

Should not do this assume!
better to add "mediatek,internal-cd" in your DTS, then no impact to
other Soc.
> +		/*
> +		 * Is removable but no GPIO declared, so
> +		 * use internal functionality.
> +		 */
> +		host->internal_cd = true;
> +	}
> +
>  	msdc_of_property_parse(pdev, host);
>  
>  	host->dev = &pdev->dev;
> 
> 



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

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

On Tue, 2019-04-16 at 14:47 +1000, NeilBrown wrote:
> The mtk-sd silicon has integrated card-detect logic that is
> enabled, at least, on the MT7621 as used in the GNUBEE NAS.
> 
> If the sdhci isn't marked non-removable and doesn't have a
> cd-gpio configured, assume the internal cd logic should be used.
> 
> Signed-off-by: NeilBrown <neil@brown.name>
> ---
>  drivers/mmc/host/mtk-sd.c |   58 ++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 54 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index d379f2ece305..341cf5f03429 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                                                     */
> @@ -430,6 +432,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 */
> @@ -1430,6 +1433,11 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
>  			sdio_signal_irq(host->mmc);
>  		}
>  
> +		if ((events & event_mask) & MSDC_INT_CDSC) {
> +			mmc_detect_change(host->mmc, msecs_to_jiffies(20));
> +			events &= ~MSDC_INT_CDSC;
> +		}
> +
>  		if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ)))
>  			break;
>  
> @@ -1463,14 +1471,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 +1598,11 @@ static void msdc_init_hw(struct msdc_host *host)
>  static void msdc_deinit_hw(struct msdc_host *host)
>  {
>  	u32 val;
> +
> +	/* 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 +2101,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,
> @@ -2206,6 +2247,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
>  		goto host_free;
>  	}
>  
> +	if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
> +	    !mmc_can_gpio_cd(mmc)) {

Should not do this assume!
better to add "mediatek,internal-cd" in your DTS, then no impact to
other Soc.
> +		/*
> +		 * Is removable but no GPIO declared, so
> +		 * use internal functionality.
> +		 */
> +		host->internal_cd = true;
> +	}
> +
>  	msdc_of_property_parse(pdev, host);
>  
>  	host->dev = &pdev->dev;
> 
> 

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

* Re: [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic.
  2019-04-18  6:39     ` Chaotian Jing
  (?)
@ 2019-05-04  8:18     ` NeilBrown
  -1 siblings, 0 replies; 14+ messages in thread
From: NeilBrown @ 2019-05-04  8:18 UTC (permalink / raw)
  To: Chaotian Jing; +Cc: Ulf Hansson, linux-mmc, linux-kernel, thirtythreeforty

[-- Attachment #1: Type: text/plain, Size: 1099 bytes --]

On Thu, Apr 18 2019, Chaotian Jing wrote:

> On Tue, 2019-04-16 at 14:47 +1000, NeilBrown wrote:
>> The mtk-sd silicon has integrated card-detect logic that is
>> enabled, at least, on the MT7621 as used in the GNUBEE NAS.
>> 
>> If the sdhci isn't marked non-removable and doesn't have a
>> cd-gpio configured, assume the internal cd logic should be used.
>> 
>> Signed-off-by: NeilBrown <neil@brown.name>
...

>> @@ -2206,6 +2247,15 @@ static int msdc_drv_probe(struct platform_device *pdev)
>>  		goto host_free;
>>  	}
>>  
>> +	if (!(mmc->caps & MMC_CAP_NONREMOVABLE) &&
>> +	    !mmc_can_gpio_cd(mmc)) {
>
> Should not do this assume!
> better to add "mediatek,internal-cd" in your DTS, then no impact to
> other Soc.

(Sorry for the delay).

Documentation/devicetree/bindings/mmc/mmc.txt

says:
   If no property below is supplied, host native card detect is used.

So this assumption is *exactly* what the documentation said we should
do.

How about I limit this assumption to mt7621 using a flag in the
mtk_mmc_compatible structure?

Thanks,
NeilBrown

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

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

end of thread, other threads:[~2019-05-04  8:18 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-16  4:47 [PATCH 0/5] mtk-sd enhancement to support MT7621 NeilBrown
2019-04-16  4:47 ` [PATCH 1/5] mmc: mtk-sd: support "voltage-ranges" setting NeilBrown
2019-04-16  4:47 ` [PATCH 5/5] mmc: mtk-sd: enable internal write-protect logic NeilBrown
2019-04-16  4:47 ` [PATCH 4/5] mmc: mtk-sd: enable internal card-detect logic NeilBrown
2019-04-18  6:39   ` Chaotian Jing
2019-04-18  6:39     ` Chaotian Jing
2019-05-04  8:18     ` NeilBrown
2019-04-16  4:47 ` [PATCH 2/5] mmc: mtk-sd: don't hard-code interrupt trigger type NeilBrown
2019-04-16  8:11   ` Chaotian Jing
2019-04-16  8:11     ` Chaotian Jing
2019-04-16 22:12     ` NeilBrown
2019-04-18  6:36       ` Chaotian Jing
2019-04-18  6:36         ` Chaotian Jing
2019-04-16  4:47 ` [PATCH 3/5] mmc: mtk-sd: add support for config found in mt7620 family SOCs NeilBrown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.