[PATCH] input: i8042: add quirk to implement i8042 detect for AMD

2015-10-16 Thread Vincent Wan
Detecting platform supports i8042 or not, AMD resorted to
BIOS's FADT i8042 flag.

Signed-off-by: Vincent Wan 
---
 drivers/input/serio/i8042-x86ia64io.h | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/input/serio/i8042-x86ia64io.h 
b/drivers/input/serio/i8042-x86ia64io.h
index c115565..bf3a605 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -9,6 +9,7 @@
 
 #ifdef CONFIG_X86
 #include 
+#include 
 #endif
 
 /*
@@ -1047,6 +1048,11 @@ static int __init i8042_platform_init(void)
/* Just return if pre-detection shows no i8042 controller exist */
if (!x86_platform.i8042_detect())
return -ENODEV;
+
+   if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
+   if (!(acpi_gbl_FADT.boot_flags & ACPI_FADT_8042))
+   return -ENODEV;
+   }
 #endif
 
 /*
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] input: i8042: add quirk to implement i8042 detect for AMD

2015-10-16 Thread Vincent Wan
Detecting platform supports i8042 or not, AMD resorted to
BIOS's FADT i8042 flag.

Signed-off-by: Vincent Wan <vincent@amd.com>
---
 drivers/input/serio/i8042-x86ia64io.h | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/input/serio/i8042-x86ia64io.h 
b/drivers/input/serio/i8042-x86ia64io.h
index c115565..bf3a605 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -9,6 +9,7 @@
 
 #ifdef CONFIG_X86
 #include 
+#include 
 #endif
 
 /*
@@ -1047,6 +1048,11 @@ static int __init i8042_platform_init(void)
/* Just return if pre-detection shows no i8042 controller exist */
if (!x86_platform.i8042_detect())
return -ENODEV;
+
+   if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
+   if (!(acpi_gbl_FADT.boot_flags & ACPI_FADT_8042))
+   return -ENODEV;
+   }
 #endif
 
 /*
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 2/3] mmc:sdhci-pci: enable the clear transfer mode register quirk for AMD sdhci

2014-11-04 Thread Vincent Wan
This patch is to enable the quirk for AMD sdhci requiring transfer
mode register need to be cleared for commands without data

Signed-off-by: Vincent Wan 
Signed-off-by: Wan Zongshun 
---
 drivers/mmc/host/sdhci-pci.c | 27 ++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index c25639b..5a77f18 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };
 
+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev && (smbus_dev->revision < 0x51))
+   chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1044,7 +1061,15 @@ static const struct pci_device_id pci_ids[] = {
.subdevice  = PCI_ANY_ID,
.driver_data= (kernel_ulong_t)_o2,
},
-
+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI << 8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)_amd,
+   },
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0x00)
},
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 3/3] mmc:sdhci-pci: enable sdhci doesn't support hs200 quirk for AMD sdhci

2014-11-04 Thread Vincent Wan
AMD SD controller supports the SDR104 mode, but caps2 can not
be promoted to support hs200 for eMMC.

Signed-off-by: Vincent Wan 
Signed-off-by: Wan Zongshun 
---
 drivers/mmc/host/sdhci-pci.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 5a77f18..c1ecd20 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -652,8 +652,10 @@ static int amd_probe(struct sdhci_pci_chip *chip)
smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
 
-   if (smbus_dev && (smbus_dev->revision < 0x51))
+   if (smbus_dev && (smbus_dev->revision < 0x51)) {
chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+   chip->quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
+   }
 
return 0;
 }
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 1/3] mmc:sdhci: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan
SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms

Signed-off-by: Vincent Wan 
Signed-off-by: Wan Zongshun 
Signed-off-by: Arindam Nath 
Tested-by: Vikram B 
Tested-by: Raghavendra Swamy 
---
 drivers/mmc/host/sdhci.c  | 9 +++--
 include/linux/mmc/sdhci.h | 2 ++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index f895ab0..a743d52 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -915,10 +915,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host 
*host,
struct mmc_data *data = cmd->data;
 
if (data == NULL) {
+   if (host->quirks2 &
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
/* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}
 
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index 931ac5e..ae7f357 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -102,6 +102,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_STOP_WITH_TC  (1<<8)
 /* Controller does not support 64-bit DMA */
 #define SDHCI_QUIRK2_BROKEN_64_BIT_DMA (1<<9)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (1<<10)
 
int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] mmc: Add a quirk for AMD SD controller doesn't support HS200

2014-11-04 Thread Vincent Wan
AMD SD controller support the SDR104 mode, but caps2 can not
be promoted to support hs200 for eMMC.

Signed-off-by: Vincent Wan 
---
 drivers/mmc/host/sdhci-pci.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 8f5c998..6b4e84c 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -652,8 +652,10 @@ static int amd_probe(struct sdhci_pci_chip *chip)
smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
 
-   if (smbus_dev && (smbus_dev->revision < 0x51))
+   if (smbus_dev && (smbus_dev->revision < 0x51)) {
chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+   chip->quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
+   }
 
return 0;
 }
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan

On 2014年11月04日 15:51, Ulf Hansson wrote:

On 30 October 2014 05:06, Vincent Wan  wrote:

SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan 
Signed-off-by: Arindam Nath 
Tested-by: Vikram B 
Tested-by: Raghavendra Swamy 


Hi Vincent,

This looks good to me, but the patch has checkpatch errors.

Could you check at your side and re-send?

Kind regards
Uffe



Hi Ulf,

My email tool causes this issue, so I have already sent patch v2 to you.

Thanks!
Vincent Wan.


---
  drivers/mmc/host/sdhci-pci.c | 27 +++
  drivers/mmc/host/sdhci.c | 11 ---
  include/linux/mmc/sdhci.h|  2 ++
  3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
 .probe_slot = rtsx_probe_slot,
  };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev && (smbus_dev->revision < 0x51))
+   chip->quirks2 |=
SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
  static const struct pci_device_id pci_ids[] = {
 {
 .vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
 .driver_data= (kernel_ulong_t)_o2,
 },

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI << 8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)_amd,
+   },
+
 {   /* Generic SD host controller */
 PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0x00)
 },
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host
*host,
 struct mmc_data *data = cmd->data;

 if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host->quirks2 &
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
 SDHCI_TRNS_AUTO_CMD23),
SDHCI_TRANSFER_MODE);
+   }
 return;
 }

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
  #define SDHCI_QUIRK2_BROKEN_DDR50  (1<<7)
  /* Stop command (CMD12) can set Transfer Complete when not using
MMC_RSP_BUSY */
  #define SDHCI_QUIRK2_STOP_WITH_TC  (1<<8)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (1<<9)

 int irq;/* Device IRQ */
 void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan
SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan 
Signed-off-by: Arindam Nath 
Cc: Huang Rui 
Tested-by: Vikram B 
Tested-by: Raghavendra Swamy 
---
 drivers/mmc/host/sdhci-pci.c | 27 +++
 drivers/mmc/host/sdhci.c | 11 ---
 include/linux/mmc/sdhci.h|  2 ++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev && (smbus_dev->revision < 0x51))
+   chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
.driver_data= (kernel_ulong_t)_o2,
},

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI << 8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)_amd,
+   },
+
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0x00)
},
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host 
*host,
struct mmc_data *data = cmd->data;

if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host->quirks2 &
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_BROKEN_DDR50  (1<<7)
 /* Stop command (CMD12) can set Transfer Complete when not using MMC_RSP_BUSY 
*/
 #define SDHCI_QUIRK2_STOP_WITH_TC  (1<<8)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (1<<9)

int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan
SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Arindam Nath arindam.n...@amd.com
Cc: Huang Rui ray.hu...@amd.com
Tested-by: Vikram B vikra...@amd.com
Tested-by: Raghavendra Swamy raghavendra.sw...@amd.com
---
 drivers/mmc/host/sdhci-pci.c | 27 +++
 drivers/mmc/host/sdhci.c | 11 ---
 include/linux/mmc/sdhci.h|  2 ++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev  (smbus_dev-revision  0x51))
+   chip-quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
.driver_data= (kernel_ulong_t)sdhci_o2,
},

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI  8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)sdhci_amd,
+   },
+
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI  8), 0x00)
},
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host 
*host,
struct mmc_data *data = cmd-data;

if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host-quirks2 
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_BROKEN_DDR50  (17)
 /* Stop command (CMD12) can set Transfer Complete when not using MMC_RSP_BUSY 
*/
 #define SDHCI_QUIRK2_STOP_WITH_TC  (18)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (19)

int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan

On 2014年11月04日 15:51, Ulf Hansson wrote:

On 30 October 2014 05:06, Vincent Wan vincent@amd.com wrote:

SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Arindam Nath arindam.n...@amd.com
Tested-by: Vikram B vikra...@amd.com
Tested-by: Raghavendra Swamy raghavendra.sw...@amd.com


Hi Vincent,

This looks good to me, but the patch has checkpatch errors.

Could you check at your side and re-send?

Kind regards
Uffe



Hi Ulf,

My email tool causes this issue, so I have already sent patch v2 to you.

Thanks!
Vincent Wan.


---
  drivers/mmc/host/sdhci-pci.c | 27 +++
  drivers/mmc/host/sdhci.c | 11 ---
  include/linux/mmc/sdhci.h|  2 ++
  3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
 .probe_slot = rtsx_probe_slot,
  };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev  (smbus_dev-revision  0x51))
+   chip-quirks2 |=
SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
  static const struct pci_device_id pci_ids[] = {
 {
 .vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
 .driver_data= (kernel_ulong_t)sdhci_o2,
 },

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI  8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)sdhci_amd,
+   },
+
 {   /* Generic SD host controller */
 PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI  8), 0x00)
 },
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host
*host,
 struct mmc_data *data = cmd-data;

 if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host-quirks2 
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
 SDHCI_TRNS_AUTO_CMD23),
SDHCI_TRANSFER_MODE);
+   }
 return;
 }

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
  #define SDHCI_QUIRK2_BROKEN_DDR50  (17)
  /* Stop command (CMD12) can set Transfer Complete when not using
MMC_RSP_BUSY */
  #define SDHCI_QUIRK2_STOP_WITH_TC  (18)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (19)

 int irq;/* Device IRQ */
 void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2



--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] mmc: Add a quirk for AMD SD controller doesn't support HS200

2014-11-04 Thread Vincent Wan
AMD SD controller support the SDR104 mode, but caps2 can not
be promoted to support hs200 for eMMC.

Signed-off-by: Vincent Wan vincent@amd.com
---
 drivers/mmc/host/sdhci-pci.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 8f5c998..6b4e84c 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -652,8 +652,10 @@ static int amd_probe(struct sdhci_pci_chip *chip)
smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
 
-   if (smbus_dev  (smbus_dev-revision  0x51))
+   if (smbus_dev  (smbus_dev-revision  0x51)) {
chip-quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+   chip-quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
+   }
 
return 0;
 }
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 1/3] mmc:sdhci: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-11-04 Thread Vincent Wan
SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Wan Zongshun mcuos@gmail.com
Signed-off-by: Arindam Nath arindam.n...@amd.com
Tested-by: Vikram B vikra...@amd.com
Tested-by: Raghavendra Swamy raghavendra.sw...@amd.com
---
 drivers/mmc/host/sdhci.c  | 9 +++--
 include/linux/mmc/sdhci.h | 2 ++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index f895ab0..a743d52 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -915,10 +915,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host 
*host,
struct mmc_data *data = cmd-data;
 
if (data == NULL) {
+   if (host-quirks2 
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
/* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}
 
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index 931ac5e..ae7f357 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -102,6 +102,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_STOP_WITH_TC  (18)
 /* Controller does not support 64-bit DMA */
 #define SDHCI_QUIRK2_BROKEN_64_BIT_DMA (19)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (110)
 
int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 3/3] mmc:sdhci-pci: enable sdhci doesn't support hs200 quirk for AMD sdhci

2014-11-04 Thread Vincent Wan
AMD SD controller supports the SDR104 mode, but caps2 can not
be promoted to support hs200 for eMMC.

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Wan Zongshun mcuos@gmail.com
---
 drivers/mmc/host/sdhci-pci.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 5a77f18..c1ecd20 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -652,8 +652,10 @@ static int amd_probe(struct sdhci_pci_chip *chip)
smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
 
-   if (smbus_dev  (smbus_dev-revision  0x51))
+   if (smbus_dev  (smbus_dev-revision  0x51)) {
chip-quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+   chip-quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
+   }
 
return 0;
 }
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 2/3] mmc:sdhci-pci: enable the clear transfer mode register quirk for AMD sdhci

2014-11-04 Thread Vincent Wan
This patch is to enable the quirk for AMD sdhci requiring transfer
mode register need to be cleared for commands without data

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Wan Zongshun mcuos@gmail.com
---
 drivers/mmc/host/sdhci-pci.c | 27 ++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index c25639b..5a77f18 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };
 
+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev  (smbus_dev-revision  0x51))
+   chip-quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1044,7 +1061,15 @@ static const struct pci_device_id pci_ids[] = {
.subdevice  = PCI_ANY_ID,
.driver_data= (kernel_ulong_t)sdhci_o2,
},
-
+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI  8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)sdhci_amd,
+   },
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI  8), 0x00)
},
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-10-29 Thread Vincent Wan

SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan 
Signed-off-by: Arindam Nath 
Tested-by: Vikram B 
Tested-by: Raghavendra Swamy 

---
 drivers/mmc/host/sdhci-pci.c | 27 +++
 drivers/mmc/host/sdhci.c | 11 ---
 include/linux/mmc/sdhci.h|  2 ++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev && (smbus_dev->revision < 0x51))
+   chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
.driver_data= (kernel_ulong_t)_o2,
},

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI << 8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)_amd,
+   },
+
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0x00)
},
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct 
sdhci_host *host,

struct mmc_data *data = cmd->data;

if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host->quirks2 &
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_BROKEN_DDR50  (1<<7)
 /* Stop command (CMD12) can set Transfer Complete when not using 
MMC_RSP_BUSY */

 #define SDHCI_QUIRK2_STOP_WITH_TC  (1<<8)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (1<<9)

int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] mmc: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data

2014-10-29 Thread Vincent Wan

SDHC controller in AMD chipsets require SDHC transfer mode
register to be cleared for commands without data. The issue was
uncovered during testing eMMC cards on KB/ML based platforms.

Signed-off-by: Vincent Wan vincent@amd.com
Signed-off-by: Arindam Nath arindam.n...@amd.com
Tested-by: Vikram B vikra...@amd.com
Tested-by: Raghavendra Swamy raghavendra.sw...@amd.com

---
 drivers/mmc/host/sdhci-pci.c | 27 +++
 drivers/mmc/host/sdhci.c | 11 ---
 include/linux/mmc/sdhci.h|  2 ++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index 6119297..8f5c998 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -645,6 +645,23 @@ static const struct sdhci_pci_fixes sdhci_rtsx = {
.probe_slot = rtsx_probe_slot,
 };

+static int amd_probe(struct sdhci_pci_chip *chip)
+{
+   struct pci_dev  *smbus_dev;
+
+   smbus_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+   PCI_DEVICE_ID_AMD_HUDSON2_SMBUS, NULL);
+
+   if (smbus_dev  (smbus_dev-revision  0x51))
+   chip-quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
+
+   return 0;
+}
+
+static const struct sdhci_pci_fixes sdhci_amd = {
+   .probe  = amd_probe,
+};
+
 static const struct pci_device_id pci_ids[] = {
{
.vendor = PCI_VENDOR_ID_RICOH,
@@ -1045,6 +1062,16 @@ static const struct pci_device_id pci_ids[] = {
.driver_data= (kernel_ulong_t)sdhci_o2,
},

+   {
+   .vendor = PCI_VENDOR_ID_AMD,
+   .device = PCI_ANY_ID,
+   .class  = PCI_CLASS_SYSTEM_SDHCI  8,
+   .class_mask = 0x00,
+   .subvendor  = PCI_ANY_ID,
+   .subdevice  = PCI_ANY_ID,
+   .driver_data= (kernel_ulong_t)sdhci_amd,
+   },
+
{   /* Generic SD host controller */
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI  8), 0x00)
},
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ada1a3e..8085f26 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -889,10 +889,15 @@ static void sdhci_set_transfer_mode(struct 
sdhci_host *host,

struct mmc_data *data = cmd-data;

if (data == NULL) {
-   /* clear Auto CMD settings for no data CMDs */
-   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
-   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
+   if (host-quirks2 
+   SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) {
+   sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
+   } else {
+   /* clear Auto CMD settings for no data CMDs */
+   mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
+   sdhci_writew(host, mode  ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
+   }
return;
}

diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index dba793e..0a287aa 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -100,6 +100,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_BROKEN_DDR50  (17)
 /* Stop command (CMD12) can set Transfer Complete when not using 
MMC_RSP_BUSY */

 #define SDHCI_QUIRK2_STOP_WITH_TC  (18)
+/* need clear transfer mode register before send cmd */
+#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (19)

int irq;/* Device IRQ */
void __iomem *ioaddr;   /* Mapped address */
--
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/