Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8352260 authored by Leandro Dorileo's avatar Leandro Dorileo Committed by Pierre Ossman
Browse files

sdhci: add support to ENE-CB714



Added its pci_id and implemented a quirk for it because this
controller needs to reset cmd and data when setting ios.

Signed-off-by: default avatarLeandro Dorileo <dorileo@ossystems.com.br>
Signed-off-by: default avatarOtavio Salvador <otavio@ossystems.com.br>
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 43b58b36
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ static unsigned int debug_quirks = 0;
/* Controller doesn't like some resets when there is no card inserted. */
#define SDHCI_QUIRK_NO_CARD_NO_RESET			(1<<2)
#define SDHCI_QUIRK_SINGLE_POWER_WRITE			(1<<3)
#define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS		(1<<4)

static const struct pci_device_id pci_ids[] __devinitdata = {
	{
@@ -78,6 +79,24 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
		.driver_data	= SDHCI_QUIRK_SINGLE_POWER_WRITE,
	},

	{
		.vendor         = PCI_VENDOR_ID_ENE,
		.device         = PCI_DEVICE_ID_ENE_CB714_SD,
		.subvendor      = PCI_ANY_ID,
		.subdevice      = PCI_ANY_ID,
		.driver_data    = SDHCI_QUIRK_SINGLE_POWER_WRITE |
				  SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS,
	},

	{
		.vendor         = PCI_VENDOR_ID_ENE,
		.device         = PCI_DEVICE_ID_ENE_CB714_SD_2,
		.subvendor      = PCI_ANY_ID,
		.subdevice      = PCI_ANY_ID,
		.driver_data    = SDHCI_QUIRK_SINGLE_POWER_WRITE |
				  SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS,
	},

	{	/* Generic SD host controller */
		PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0xFFFF00)
	},
@@ -759,6 +778,14 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)

	writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);

	/*
	 * Some (ENE) controllers go apeshit on some ios operation,
	 * signalling timeout and CRC errors even on CMD0. Resetting
	 * it on each ios seems to solve the problem.
	 */
	if(host->chip->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS)
		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);

	mmiowb();
	spin_unlock_irqrestore(&host->lock, flags);
}
+2 −0
Original line number Diff line number Diff line
@@ -1972,6 +1972,8 @@
#define PCI_VENDOR_ID_ENE		0x1524
#define PCI_DEVICE_ID_ENE_CB712_SD	0x0550
#define PCI_DEVICE_ID_ENE_CB712_SD_2	0x0551
#define PCI_DEVICE_ID_ENE_CB714_SD	0x0750
#define PCI_DEVICE_ID_ENE_CB714_SD_2	0x0751
#define PCI_DEVICE_ID_ENE_1211		0x1211
#define PCI_DEVICE_ID_ENE_1225		0x1225
#define PCI_DEVICE_ID_ENE_1410		0x1410