Skip to contentSkip to conversation

mmc: tegra: use mmc_of_parse to get support of standard MMC DT binding

PATCH In review Joseph Lo 6 participants 17 messages Feb 20, 2013 – Feb 22, 2013 11 messages not in the archive

Subsystems (4)
lore
Share & tools
lore

Joseph Lo

author
#0 lore raw

cover mmc: tegra: use mmc_of_parse to get support of standard MMC DT binding

The 2nd patch of this series depends on two patches below.

"mmc: provide a standard MMC device-tree binding parser centrally" (available on next-20130219)
mmc: tegra: assume CONFIG_OF, remove platform data
(https://patchwork.kernel.org/patch/2150351/)

Verified on Seaboard and Cardhu.

Joseph Lo (2):
ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host
mmc: tegra: use mmc_of_parse to get the support of standard MMC DT
bindings

 arch/arm/boot/dts/tegra20-harmony.dts   |  4 +-
 arch/arm/boot/dts/tegra20-paz00.dts     |  2 +-
 arch/arm/boot/dts/tegra20-seaboard.dts  |  2 +-
 arch/arm/boot/dts/tegra20-trimslice.dts |  2 +-
 arch/arm/boot/dts/tegra20-ventana.dts   |  2 +-
 arch/arm/boot/dts/tegra20-whistler.dts  |  1 +
 arch/arm/boot/dts/tegra30-beaver.dts    |  2 +-
 arch/arm/boot/dts/tegra30-cardhu.dtsi   |  2 +-
 drivers/mmc/host/sdhci-tegra.c          | 85 +++------------------------------
 9 files changed, 16 insertions(+), 86 deletions(-)
Signature · 1 line
1.8.1.1
#1 lore raw

PATCH 1/2 ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host

The GPIO pin of SD slot card detection should active low.

---
 arch/arm/boot/dts/tegra20-harmony.dts   | 4 ++--
 arch/arm/boot/dts/tegra20-paz00.dts     | 2 +-
 arch/arm/boot/dts/tegra20-seaboard.dts  | 2 +-
 arch/arm/boot/dts/tegra20-trimslice.dts | 2 +-
 arch/arm/boot/dts/tegra20-ventana.dts   | 2 +-
 arch/arm/boot/dts/tegra20-whistler.dts  | 1 +
 arch/arm/boot/dts/tegra30-beaver.dts    | 2 +-
 arch/arm/boot/dts/tegra30-cardhu.dtsi   | 2 +-
 8 files changed, 9 insertions(+), 8 deletions(-)
arch/arm/boot/dts/tegra20-harmony.dts +2 -2
index 61d027f..1f79c0d 100644
@@ -437,7 +437,7 @@
 
 	sdhci@c8000200 {
 		status = "okay";
-		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 57 0>; /* gpio PH1 */
 		power-gpios = <&gpio 155 0>; /* gpio PT3 */
 		bus-width = <4>;
@@ -445,7 +445,7 @@
 
 	sdhci@c8000600 {
 		status = "okay";
-		cd-gpios = <&gpio 58 0>; /* gpio PH2 */
+		cd-gpios = <&gpio 58 1>; /* gpio PH2 */
 		wp-gpios = <&gpio 59 0>; /* gpio PH3 */
 		power-gpios = <&gpio 70 0>; /* gpio PI6 */
 		bus-width = <8>;
arch/arm/boot/dts/tegra20-paz00.dts +1 -1
index 54d6fce..9db36da 100644
@@ -436,7 +436,7 @@
 
 	sdhci@c8000000 {
 		status = "okay";
-		cd-gpios = <&gpio 173 0>; /* gpio PV5 */
+		cd-gpios = <&gpio 173 1>; /* gpio PV5 */
 		wp-gpios = <&gpio 57 0>;  /* gpio PH1 */
 		power-gpios = <&gpio 169 0>; /* gpio PV1 */
 		bus-width = <4>;
arch/arm/boot/dts/tegra20-seaboard.dts +1 -1
index 37b3a57..715a8b8 100644
@@ -584,7 +584,7 @@
 
 	sdhci@c8000400 {
 		status = "okay";
-		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 57 0>; /* gpio PH1 */
 		power-gpios = <&gpio 70 0>; /* gpio PI6 */
 		bus-width = <4>;
arch/arm/boot/dts/tegra20-trimslice.dts +1 -1
index 5d79e4f..98f3e44 100644
@@ -325,7 +325,7 @@
 
 	sdhci@c8000600 {
 		status = "okay";
-		cd-gpios = <&gpio 121 0>; /* gpio PP1 */
+		cd-gpios = <&gpio 121 1>; /* gpio PP1 */
 		wp-gpios = <&gpio 122 0>; /* gpio PP2 */
 		bus-width = <4>;
 	};
arch/arm/boot/dts/tegra20-ventana.dts +1 -1
index 425c890..4aef56f 100644
@@ -520,7 +520,7 @@
 
 	sdhci@c8000400 {
 		status = "okay";
-		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 57 0>; /* gpio PH1 */
 		power-gpios = <&gpio 70 0>; /* gpio PI6 */
 		bus-width = <4>;
arch/arm/boot/dts/tegra20-whistler.dts +1 -0
index ea57c0f..5762188 100644
@@ -510,6 +510,7 @@
 
 	sdhci@c8000400 {
 		status = "okay";
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 173 0>; /* gpio PV5 */
 		bus-width = <8>;
 	};
arch/arm/boot/dts/tegra30-beaver.dts +1 -1
index 8ff2ff2..0a2cd24 100644
@@ -257,7 +257,7 @@
 
 	sdhci@78000000 {
 		status = "okay";
-		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 155 0>; /* gpio PT3 */
 		power-gpios = <&gpio 31 0>; /* gpio PD7 */
 		bus-width = <4>;
arch/arm/boot/dts/tegra30-cardhu.dtsi +1 -1
index 1749927..3e2d210 100644
@@ -311,7 +311,7 @@
 
 	sdhci@78000000 {
 		status = "okay";
-		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		cd-gpios = <&gpio 69 1>; /* gpio PI5 */
 		wp-gpios = <&gpio 155 0>; /* gpio PT3 */
 		power-gpios = <&gpio 31 0>; /* gpio PD7 */
 		bus-width = <4>;
Signature · 1 line
1.8.1.1

A message that is not in the archive (sent off-list or not yet received): 1361343902-15223-2-git-send-email-josephl-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org

#3 lore raw

Re: [PATCH 1/2] ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host

Quoted 1 line · Joseph Lo

The GPIO pin of SD slot card detection should active low.

Thierry, Lucas, can you please check if the same change should be made to all the Avionic Design and Toradex boards? I assume MMC CD should be active low on all of them. Once you've confirmed this, Joseph can respin this first patch, and perhaps we can get it into 3.9/stable as a bug-fix. Thanks.

A message that is not in the archive (sent off-list or not yet received): [email protected]

#5 lore raw

Re: [PATCH 1/2] ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host

Quoted 8 lines · Stephen Warren
Quoted 1 line · Joseph Lo

The GPIO pin of SD slot card detection should active low.

Thierry, Lucas, can you please check if the same change should be made to all the Avionic Design and Toradex boards? I assume MMC CD should be active low on all of them. Once you've confirmed this, Joseph can respin this first patch, and perhaps we can get it into 3.9/stable as a bug-fix. Thanks.

The card-detect GPIO is certainly low-active on Tamonten. I'm not quite sure why things worked before, but I guess it was due to the MMC core assuming the CD GPIO to be low-active unless otherwise specified and the Tegra DT code didn't pass the GPIO flags to the core.

Anyway, I've verified that on Tamonten the same change doesn't break anything, card detect still works as expected with this patch series applied, so if Joseph could carry the Tamonten change as part of this patch it'd be great.

Thierry

A message that is not in the archive (sent off-list or not yet received): 20130221081809.GB7718-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/[email protected]

author
#7 lore raw

Re: [PATCH 1/2] ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host

Hi Thierry,

Thanks for your verification.

Quoted 12 lines · Thierry Reding

* PGP Signed by an unknown key

Quoted 8 lines · Stephen Warren
Quoted 1 line · Joseph Lo

The GPIO pin of SD slot card detection should active low.

Thierry, Lucas, can you please check if the same change should be made to all the Avionic Design and Toradex boards? I assume MMC CD should be active low on all of them. Once you've confirmed this, Joseph can respin this first patch, and perhaps we can get it into 3.9/stable as a bug-fix. Thanks.

Quoted 5 lines

The card-detect GPIO is certainly low-active on Tamonten. I'm not quite sure why things worked before, but I guess it was due to the MMC core assuming the CD GPIO to be low-active unless otherwise specified and the Tegra DT code didn't pass the GPIO flags to the core.

Yes. And the original sdhci-tegra driver didn't use the GPIO flag to config anything. After we use mmc_of_parse, it will be taken care in the core. So both of the cp-gpio and wp-gpio should be config right in DT.

Quoted 4 lines

Anyway, I've verified that on Tamonten the same change doesn't break anything, card detect still works as expected with this patch series applied, so if Joseph could carry the Tamonten change as part of this patch it'd be great.

Thanks. Will do.

#8 lore raw

PATCH 2/2 mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

In reply to Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support in generic MMC core.

---
 drivers/mmc/host/sdhci-tegra.c | 85 ++++--------------------------------------
 1 file changed, 7 insertions(+), 78 deletions(-)
drivers/mmc/host/sdhci-tegra.c +7 -78
index 08b06e9..4f6b5c4 100644
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 #include <linux/mmc/card.h>
 #include <linux/mmc/host.h>
+#include <linux/mmc/slot-gpio.h>
 
 #include <asm/gpio.h>
 
@@ -44,10 +45,7 @@ struct sdhci_tegra_soc_data {
 
 struct sdhci_tegra {
 	const struct sdhci_tegra_soc_data *soc_data;
-	int cd_gpio;
-	int wp_gpio;
 	int power_gpio;
-	int is_8bit;
 };
 
 static u32 tegra_sdhci_readl(struct sdhci_host *host, int reg)
@@ -107,23 +105,9 @@ static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
 
 static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
 {
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
-
-	if (!gpio_is_valid(tegra_host->wp_gpio))
-		return -1;
-
-	return gpio_get_value(tegra_host->wp_gpio);
+	return mmc_gpio_get_ro(host->mmc);
 }
 
-static irqreturn_t carddetect_irq(int irq, void *data)
-{
-	struct sdhci_host *sdhost = (struct sdhci_host *)data;
-
-	tasklet_schedule(&sdhost->card_tasklet);
-	return IRQ_HANDLED;
-};
-
 static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask)
 {
 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
@@ -145,12 +129,11 @@ static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask)
 
 static int tegra_sdhci_buswidth(struct sdhci_host *host, int bus_width)
 {
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 	u32 ctrl;
 
 	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
-	if (tegra_host->is_8bit && bus_width == MMC_BUS_WIDTH_8) {
+	if (host->mmc->caps == MMC_CAP_8_BIT_DATA &&
+	    bus_width == MMC_BUS_WIDTH_8) {
 		ctrl &= ~SDHCI_CTRL_4BITBUS;
 		ctrl |= SDHCI_CTRL_8BITBUS;
 	} else {
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {
 	struct device_node *np = dev->of_node;
-	u32 bus_width;
+	struct sdhci_host *host;
 
-	tegra_host->cd_gpio = of_get_named_gpio(np, "cd-gpios", 0);
-	tegra_host->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0);
 	tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios", 0);
 
-	if (of_property_read_u32(np, "bus-width", &bus_width) == 0 &&
-	    bus_width == 8)
-		tegra_host->is_8bit = 1;
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }
 
 static int sdhci_tegra_probe(struct platform_device *pdev)
@@ -272,37 +252,6 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
 		gpio_direction_output(tegra_host->power_gpio, 1);
 	}
 
-	if (gpio_is_valid(tegra_host->cd_gpio)) {
-		rc = gpio_request(tegra_host->cd_gpio, "sdhci_cd");
-		if (rc) {
-			dev_err(mmc_dev(host->mmc),
-				"failed to allocate cd gpio\n");
-			goto err_cd_req;
-		}
-		gpio_direction_input(tegra_host->cd_gpio);
-
-		rc = request_irq(gpio_to_irq(tegra_host->cd_gpio),
-				 carddetect_irq,
-				 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
-				 mmc_hostname(host->mmc), host);
-
-		if (rc)	{
-			dev_err(mmc_dev(host->mmc), "request irq error\n");
-			goto err_cd_irq_req;
-		}
-
-	}
-
-	if (gpio_is_valid(tegra_host->wp_gpio)) {
-		rc = gpio_request(tegra_host->wp_gpio, "sdhci_wp");
-		if (rc) {
-			dev_err(mmc_dev(host->mmc),
-				"failed to allocate wp gpio\n");
-			goto err_wp_req;
-		}
-		gpio_direction_input(tegra_host->wp_gpio);
-	}
-
 	clk = clk_get(mmc_dev(host->mmc), NULL);
 	if (IS_ERR(clk)) {
 		dev_err(mmc_dev(host->mmc), "clk err\n");
@@ -312,9 +261,6 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
 	clk_prepare_enable(clk);
 	pltfm_host->clk = clk;
 
-	if (tegra_host->is_8bit)
-		host->mmc->caps |= MMC_CAP_8_BIT_DATA;
-
 	rc = sdhci_add_host(host);
 	if (rc)
 		goto err_add_host;
@@ -325,15 +271,6 @@ err_add_host:
 	clk_disable_unprepare(pltfm_host->clk);
 	clk_put(pltfm_host->clk);
 err_clk_get:
-	if (gpio_is_valid(tegra_host->wp_gpio))
-		gpio_free(tegra_host->wp_gpio);
-err_wp_req:
-	if (gpio_is_valid(tegra_host->cd_gpio))
-		free_irq(gpio_to_irq(tegra_host->cd_gpio), host);
-err_cd_irq_req:
-	if (gpio_is_valid(tegra_host->cd_gpio))
-		gpio_free(tegra_host->cd_gpio);
-err_cd_req:
 	if (gpio_is_valid(tegra_host->power_gpio))
 		gpio_free(tegra_host->power_gpio);
 err_power_req:
@@ -351,14 +288,6 @@ static int sdhci_tegra_remove(struct platform_device *pdev)
 
 	sdhci_remove_host(host, dead);
 
-	if (gpio_is_valid(tegra_host->wp_gpio))
-		gpio_free(tegra_host->wp_gpio);
-
-	if (gpio_is_valid(tegra_host->cd_gpio)) {
-		free_irq(gpio_to_irq(tegra_host->cd_gpio), host);
-		gpio_free(tegra_host->cd_gpio);
-	}
-
 	if (gpio_is_valid(tegra_host->power_gpio))
 		gpio_free(tegra_host->power_gpio);
 
Signature · 1 line
1.8.1.1

A message that is not in the archive (sent off-list or not yet received): 1361343902-15223-3-git-send-email-josephl-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org

#10 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 5 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host) {

drivers/mmc/host/sdhci-tegra.c static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg) · line 109

Quoted 9 lines
drivers/mmc/host/sdhci-tegra.c +1 -7
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
-
-	if (!gpio_is_valid(tegra_host->wp_gpio))
-		return -1;
-
-	return gpio_get_value(tegra_host->wp_gpio);
+	return mmc_gpio_get_ro(host->mmc);
 }

It'd be nice if there was a standard version of this function that could be plugged directly into struct sdhci_ops, so that each individual driver doesn't have to re-invent this wrapper.

Quoted 3 lines
drivers/mmc/host/sdhci-tegra.c +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 1 line
drivers/mmc/host/sdhci-tegra.c +1 -0
+	struct sdhci_host *host;

...

drivers/mmc/host/sdhci-tegra.c static void sdhci_tegra_parse_dt(struct device *dev, · line 212

Quoted 3 lines
drivers/mmc/host/sdhci-tegra.c +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

A message that is not in the archive (sent off-list or not yet received): [email protected]

author
#12 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 24 lines · Stephen Warren
Quoted 5 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host) {

drivers/mmc/host/sdhci-tegra.c static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg) · line 109

Quoted 9 lines
drivers/mmc/host/sdhci-tegra.c +1 -7
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
-
-	if (!gpio_is_valid(tegra_host->wp_gpio))
-		return -1;
-
-	return gpio_get_value(tegra_host->wp_gpio);
+	return mmc_gpio_get_ro(host->mmc);
 }

It'd be nice if there was a standard version of this function that could be plugged directly into struct sdhci_ops, so that each individual driver doesn't have to re-invent this wrapper.

Quoted 3 lines
drivers/mmc/host/sdhci-tegra.c +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 8 lines
Quoted 1 line
drivers/mmc/host/sdhci-tegra.c +1 -0
+	struct sdhci_host *host;

...

drivers/mmc/host/sdhci-tegra.c static void sdhci_tegra_parse_dt(struct device *dev, · line 212

Quoted 3 lines
drivers/mmc/host/sdhci-tegra.c +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

Thanks,
Joseph

A message that is not in the archive (sent off-list or not yet received): 1361413425.5678.8.camel-yx3yKKdKkHfc7b1ADBJPm0n48jw8i0AO@public.gmane.org

#14 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 18 lines · Joseph Lo
Quoted 8 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

drivers/mmc/host/sdhci-tegra.c +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 8 lines
Quoted 1 line
drivers/mmc/host/sdhci-tegra.c +1 -0
+	struct sdhci_host *host;

...

drivers/mmc/host/sdhci-tegra.c static void sdhci_tegra_parse_dt(struct device *dev, · line 212

Quoted 3 lines
drivers/mmc/host/sdhci-tegra.c +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

Quoted 3 lines

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

A message that is not in the archive (sent off-list or not yet received): [email protected]

author
#16 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 19 lines · Stephen Warren
Quoted 18 lines · Joseph Lo
Quoted 16 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

(quoted diff) +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 1 line
(quoted diff) +1 -0
+	struct sdhci_host *host;

...

Review

Quoted 3 lines
(quoted diff) +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

Quoted 6 lines
Quoted 3 lines

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

Hmm. It might not too much different. Which version you prefer?

1. Original version

2.
static void sdhci_tegra_parse_dt(struct device *dev,
- struct sdhci_tegra *tegra_host)
+ struct sdhci_host *host)

 {
        struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);

}

@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)

        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;

- sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+ sdhci_tegra_parse_dt(&pdev->dev, host);

3.
-static void sdhci_tegra_parse_dt(struct device *dev,
- struct sdhci_tegra *tegra_host)
+static void sdhci_tegra_parse_dt(struct platform_device *pdev)
{

-       struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct device_node *np = pdev->dev.of_node;
+       struct sdhci_host *host = platform_get_drvdata(pdev);
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);

}

@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)

        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;

- sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+ sdhci_tegra_parse_dt(pdev);

#17 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 74 lines · Joseph Lo
Quoted 19 lines · Stephen Warren
Quoted 18 lines · Joseph Lo
Quoted 16 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

(quoted diff) +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 1 line
(quoted diff) +1 -0
+	struct sdhci_host *host;

...

Review

Quoted 3 lines
(quoted diff) +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

Quoted 6 lines
Quoted 3 lines

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

Hmm. It might not too much different. Which version you prefer?

1. Original version

2.
static void sdhci_tegra_parse_dt(struct device *dev,

(quoted diff) +4 -5
-                                       struct sdhci_tegra *tegra_host)
+                                       struct sdhci_host *host)
 {
        struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);
 }
@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device
 *pdev)
        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;
 
-       sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+       sdhci_tegra_parse_dt(&pdev->dev, host);
 

3.

(quoted diff) +5 -6
-static void sdhci_tegra_parse_dt(struct device *dev,
-                                       struct sdhci_tegra *tegra_host)
+static void sdhci_tegra_parse_dt(struct platform_device *pdev)
 {
-       struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct device_node *np = pdev->dev.of_node;
+       struct sdhci_host *host = platform_get_drvdata(pdev);
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);
 }

Review static int sdhci_tegra_probe(struct platform_device · line 244

Quoted 7 lines
(quoted diff) +1 -1
@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device
 *pdev)
        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;
 
-       sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+       sdhci_tegra_parse_dt(pdev);
 

or
4. This would be simpler.
@@ -203,12 +203,8 @@ static void sdhci_tegra_parse_dt(struct device *dev,
struct sdhci_tegra *tegra_host)

 {
        struct device_node *np = dev->of_node;

- struct sdhci_host *host;

        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);

-
- host = platform_get_drvdata(to_platform_device(dev));
- mmc_of_parse(host->mmc);
}

static int sdhci_tegra_probe(struct platform_device *pdev)
@@ -241,6 +237,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)

        pltfm_host->priv = tegra_host;
 
        sdhci_tegra_parse_dt(&pdev->dev, tegra_host);

+ mmc_of_parse(host->mmc);

#18 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

In reply to Joseph Lo
Quoted 48 lines · Joseph Lo
Quoted 19 lines · Stephen Warren
Quoted 18 lines · Joseph Lo
Quoted 16 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

(quoted diff) +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 1 line
(quoted diff) +1 -0
+	struct sdhci_host *host;

...

Review

Quoted 3 lines
(quoted diff) +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

Quoted 6 lines
Quoted 3 lines

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

Hmm. It might not too much different. Which version you prefer?

1. Original version

2.
static void sdhci_tegra_parse_dt(struct device *dev,

(quoted diff) +3 -4
-                                       struct sdhci_tegra *tegra_host)
+                                       struct sdhci_host *host)
 {
        struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);
 }

Review static int sdhci_tegra_probe(struct platform_device · line 244

Quoted 7 lines
(quoted diff) +1 -1
@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device
 *pdev)
        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;
 
-       sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+       sdhci_tegra_parse_dt(&pdev->dev, host);
 

I personally prefer this second version. It keeps with the tradition to pass a struct device into the *_parse_dt() and also provides easy access to the sdhci_host.

And on a side-note:

	host = platform_get_drvdata(to_platform_device(dev));

can be more simply written as:

	host = dev_get_drvdata(dev);

Thierry

A message that is not in the archive (sent off-list or not yet received): 20130221080306.GA7718-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/[email protected]

author
#20 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 63 lines · Thierry Reding

* PGP Signed by an unknown key

Quoted 48 lines · Joseph Lo
Quoted 19 lines · Stephen Warren
Quoted 18 lines · Joseph Lo
Quoted 16 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

(quoted diff) +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 1 line
(quoted diff) +1 -0
+	struct sdhci_host *host;

...

Review

Quoted 3 lines
(quoted diff) +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

Quoted 6 lines
Quoted 3 lines

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

Hmm. It might not too much different. Which version you prefer?

1. Original version

2.
static void sdhci_tegra_parse_dt(struct device *dev,

(quoted diff) +3 -4
-                                       struct sdhci_tegra *tegra_host)
+                                       struct sdhci_host *host)
 {
        struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);
 }

Review static int sdhci_tegra_probe(struct platform_device · line 244

Quoted 7 lines
(quoted diff) +1 -1
@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device
 *pdev)
        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;
 
-       sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+       sdhci_tegra_parse_dt(&pdev->dev, host);
 

I personally prefer this second version. It keeps with the tradition to pass a struct device into the *_parse_dt() and also provides easy access to the sdhci_host.

Quoted 8 lines

And on a side-note:

	host = platform_get_drvdata(to_platform_device(dev));

can be more simply written as:

	host = dev_get_drvdata(dev);

Indeed, it's simpler and works. Thanks for sharing. :)

A message that is not in the archive (sent off-list or not yet received): 1361427997.5678.59.camel-yx3yKKdKkHfc7b1ADBJPm0n48jw8i0AO@public.gmane.org

#22 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 24 lines · Joseph Lo
Quoted 23 lines · Stephen Warren
Quoted 21 lines · Joseph Lo
Quoted 8 lines · Stephen Warren
Quoted 6 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support

(quoted diff) +0 -0
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {

...

Quoted 8 lines
Quoted 1 line
(quoted diff) +1 -0
+	struct sdhci_host *host;

...

Review

Quoted 3 lines
(quoted diff) +2 -0
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }

It might be simpler to change the function prototype to simply pass in the host object too.

It's a interface problem that I can't fix now. If sdhci core is going to integrate mmc_of_parse into sdhci_get_of_property and mmc_gpio_get_ro into somethere sdhci_do_get_ro, then we can refine later.

Quoted 8 lines
Quoted 2 lines

I meant to change the prototype of sdhci_tegra_parse_dt(). It would be simple to change that function in this patch.

Hmm. It might not too much different. Which version you prefer?

1. Original version

2.

sdhci_tegra_probe() already has all the values you need; I was thinking of just passing in all of the values that this function needs, rather than deriving anything within the function.

Quoted 16 lines

static void sdhci_tegra_parse_dt(struct device *dev,

(quoted diff) +3 -4
-                                       struct sdhci_tegra *tegra_host)
+                                       struct sdhci_host *host)
 {
        struct device_node *np = dev->of_node;
-       struct sdhci_host *host;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
 
        tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios",0);
-
-       host = platform_get_drvdata(to_platform_device(dev));
        mmc_of_parse(host->mmc);
 }

Review static int sdhci_tegra_probe(struct platform_device · line 243

Quoted 6 lines
(quoted diff) +1 -1
@@ -240,7 +239,7 @@ static int sdhci_tegra_probe(struct platform_device
 *pdev)
        tegra_host->soc_data = soc_data;
        pltfm_host->priv = tegra_host;
 
-       sdhci_tegra_parse_dt(&pdev->dev, tegra_host);
+       sdhci_tegra_parse_dt(&pdev->dev, host);

That seems fairly direct though. Is "dev" available inside host, platfm_host or tegra_host? You could obtain it from there if you wanted to reduce the number of parameters passed to the function.

#23 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

In reply to a message not in the archive

Hi Joseph

Quoted 58 lines · Joseph Lo

Updating the sdhci-tegra driver to use mmc_of_parse to support standard MMC DT bindings. Then we can remove the redundant code that already support in generic MMC core.

---
 drivers/mmc/host/sdhci-tegra.c | 85 ++++--------------------------------------
 1 file changed, 7 insertions(+), 78 deletions(-)
drivers/mmc/host/sdhci-tegra.c +2 -18
index 08b06e9..4f6b5c4 100644
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 #include <linux/mmc/card.h>
 #include <linux/mmc/host.h>
+#include <linux/mmc/slot-gpio.h>
 
 #include <asm/gpio.h>
 
@@ -44,10 +45,7 @@ struct sdhci_tegra_soc_data {
 
 struct sdhci_tegra {
 	const struct sdhci_tegra_soc_data *soc_data;
-	int cd_gpio;
-	int wp_gpio;
 	int power_gpio;
-	int is_8bit;
 };
 
 static u32 tegra_sdhci_readl(struct sdhci_host *host, int reg)
@@ -107,23 +105,9 @@ static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
 
 static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host)
 {
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
-
-	if (!gpio_is_valid(tegra_host->wp_gpio))
-		return -1;
-
-	return gpio_get_value(tegra_host->wp_gpio);
+	return mmc_gpio_get_ro(host->mmc);
 }
 
-static irqreturn_t carddetect_irq(int irq, void *data)
-{
-	struct sdhci_host *sdhost = (struct sdhci_host *)data;
-
-	tasklet_schedule(&sdhost->card_tasklet);
-	return IRQ_HANDLED;
-};
-
 static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask)
 {
 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);

drivers/mmc/host/sdhci-tegra.c static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask) · line 135

Quoted 10 lines
drivers/mmc/host/sdhci-tegra.c +1 -3
@@ -145,12 +129,11 @@ static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask)
 
 static int tegra_sdhci_buswidth(struct sdhci_host *host, int bus_width)
 {
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 	u32 ctrl;
 
 	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
-	if (tegra_host->is_8bit && bus_width == MMC_BUS_WIDTH_8) {
+	if (host->mmc->caps == MMC_CAP_8_BIT_DATA &&

Don't you want to check for just one bit? -Šcaps can contain multiple flags set:

+ if ((host->mmc->caps & MMC_CAP_8_BIT_DATA) &&

Thanks
Guennadi

Quoted 110 lines
drivers/mmc/host/sdhci-tegra.c +4 -57
+	    bus_width == MMC_BUS_WIDTH_8) {
 		ctrl &= ~SDHCI_CTRL_4BITBUS;
 		ctrl |= SDHCI_CTRL_8BITBUS;
 	} else {
@@ -220,15 +203,12 @@ static void sdhci_tegra_parse_dt(struct device *dev,
 					struct sdhci_tegra *tegra_host)
 {
 	struct device_node *np = dev->of_node;
-	u32 bus_width;
+	struct sdhci_host *host;
 
-	tegra_host->cd_gpio = of_get_named_gpio(np, "cd-gpios", 0);
-	tegra_host->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0);
 	tegra_host->power_gpio = of_get_named_gpio(np, "power-gpios", 0);
 
-	if (of_property_read_u32(np, "bus-width", &bus_width) == 0 &&
-	    bus_width == 8)
-		tegra_host->is_8bit = 1;
+	host = platform_get_drvdata(to_platform_device(dev));
+	mmc_of_parse(host->mmc);
 }
 
 static int sdhci_tegra_probe(struct platform_device *pdev)
@@ -272,37 +252,6 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
 		gpio_direction_output(tegra_host->power_gpio, 1);
 	}
 
-	if (gpio_is_valid(tegra_host->cd_gpio)) {
-		rc = gpio_request(tegra_host->cd_gpio, "sdhci_cd");
-		if (rc) {
-			dev_err(mmc_dev(host->mmc),
-				"failed to allocate cd gpio\n");
-			goto err_cd_req;
-		}
-		gpio_direction_input(tegra_host->cd_gpio);
-
-		rc = request_irq(gpio_to_irq(tegra_host->cd_gpio),
-				 carddetect_irq,
-				 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
-				 mmc_hostname(host->mmc), host);
-
-		if (rc)	{
-			dev_err(mmc_dev(host->mmc), "request irq error\n");
-			goto err_cd_irq_req;
-		}
-
-	}
-
-	if (gpio_is_valid(tegra_host->wp_gpio)) {
-		rc = gpio_request(tegra_host->wp_gpio, "sdhci_wp");
-		if (rc) {
-			dev_err(mmc_dev(host->mmc),
-				"failed to allocate wp gpio\n");
-			goto err_wp_req;
-		}
-		gpio_direction_input(tegra_host->wp_gpio);
-	}
-
 	clk = clk_get(mmc_dev(host->mmc), NULL);
 	if (IS_ERR(clk)) {
 		dev_err(mmc_dev(host->mmc), "clk err\n");
@@ -312,9 +261,6 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
 	clk_prepare_enable(clk);
 	pltfm_host->clk = clk;
 
-	if (tegra_host->is_8bit)
-		host->mmc->caps |= MMC_CAP_8_BIT_DATA;
-
 	rc = sdhci_add_host(host);
 	if (rc)
 		goto err_add_host;
@@ -325,15 +271,6 @@ err_add_host:
 	clk_disable_unprepare(pltfm_host->clk);
 	clk_put(pltfm_host->clk);
 err_clk_get:
-	if (gpio_is_valid(tegra_host->wp_gpio))
-		gpio_free(tegra_host->wp_gpio);
-err_wp_req:
-	if (gpio_is_valid(tegra_host->cd_gpio))
-		free_irq(gpio_to_irq(tegra_host->cd_gpio), host);
-err_cd_irq_req:
-	if (gpio_is_valid(tegra_host->cd_gpio))
-		gpio_free(tegra_host->cd_gpio);
-err_cd_req:
 	if (gpio_is_valid(tegra_host->power_gpio))
 		gpio_free(tegra_host->power_gpio);
 err_power_req:
@@ -351,14 +288,6 @@ static int sdhci_tegra_remove(struct platform_device *pdev)
 
 	sdhci_remove_host(host, dead);
 
-	if (gpio_is_valid(tegra_host->wp_gpio))
-		gpio_free(tegra_host->wp_gpio);
-
-	if (gpio_is_valid(tegra_host->cd_gpio)) {
-		free_irq(gpio_to_irq(tegra_host->cd_gpio), host);
-		gpio_free(tegra_host->cd_gpio);
-	}
-
 	if (gpio_is_valid(tegra_host->power_gpio))
 		gpio_free(tegra_host->power_gpio);
 
Signature · 6 lines
1.8.1.1

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/

A message that is not in the archive (sent off-list or not yet received): Pine.LNX.4.64.1302212333330.10403-0199iw4Nj15frtckUFj5Ag@public.gmane.org

author
#25 lore raw

Re: [PATCH 2/2] mmc: tegra: use mmc_of_parse to get the support of standard MMC DT bindings

Quoted 17 lines · Guennadi Liakhovetski

Hi Joseph

drivers/mmc/host/sdhci-tegra.c static void tegra_sdhci_reset_exit(struct sdhci_host *host, u8 mask) · line 135

Quoted 9 lines · Joseph Lo

static int tegra_sdhci_buswidth(struct sdhci_host *host, int bus_width) {

drivers/mmc/host/sdhci-tegra.c +1 -3
-	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-	struct sdhci_tegra *tegra_host = pltfm_host->priv;
 	u32 ctrl;
 
 	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
-	if (tegra_host->is_8bit && bus_width == MMC_BUS_WIDTH_8) {
+	if (host->mmc->caps == MMC_CAP_8_BIT_DATA &&

Don't you want to check for just one bit? -Šcaps can contain multiple flags set:

Review

Quoted 1 line
(quoted diff) +1 -0
+	if ((host->mmc->caps & MMC_CAP_8_BIT_DATA) &&

Ah, yes. Thanks for your review.

Joseph

A message that is not in the archive (sent off-list or not yet received): 1361343902-15223-1-git-send-email-josephl-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org

Tested-by
#27 lore raw
Quoted 14 lines · Joseph Lo

The 2nd patch of this series depends on two patches below.

"mmc: provide a standard MMC device-tree binding parser centrally" (available on next-20130219)
mmc: tegra: assume CONFIG_OF, remove platform data
(https://patchwork.kernel.org/patch/2150351/)

Verified on Seaboard and Cardhu.

Joseph Lo (2):
ARM: dts: tegra: fix the activate polarity of cd-gpio in mmc host
mmc: tegra: use mmc_of_parse to get the support of standard MMC DT
bindings

Quoted 10 lines
 arch/arm/boot/dts/tegra20-harmony.dts   |  4 +-
 arch/arm/boot/dts/tegra20-paz00.dts     |  2 +-
 arch/arm/boot/dts/tegra20-seaboard.dts  |  2 +-
 arch/arm/boot/dts/tegra20-trimslice.dts |  2 +-
 arch/arm/boot/dts/tegra20-ventana.dts   |  2 +-
 arch/arm/boot/dts/tegra20-whistler.dts  |  1 +
 arch/arm/boot/dts/tegra30-beaver.dts    |  2 +-
 arch/arm/boot/dts/tegra30-cardhu.dtsi   |  2 +-
 drivers/mmc/host/sdhci-tegra.c          | 85 +++------------------------------
 9 files changed, 16 insertions(+), 86 deletions(-)

With the same DTS change for Tamonten, the series: