[PATCH 2.6.32]: Add new device IDs and registers forMULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) cards.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Issue Description:
SD/MMC card can't be recognized by O2 chip.

Root cause:
O2Micro's ADMA and related functions can't work by default Linux SD
driver. We need mark those related registers.

Patch description:
  - SET MULTI 3 to VCC3V#
  - Disable CLK_REQ# support after media DET.
  - Choose programmable settings
  - Enable SDMA
  - Disable ADMA1
  - Disable ADMA2
  - Disable the infinite transfer mode

Supplement:
We are trying to add the enable ADMA patch later.

PATCH content:

Pci_ids.h

--- ../untitled folder/linux-2.6.32/include/linux/pci_ids.h
2009-12-03 11:51:21.000000000 +0800
+++ ./pci_ids.h	2010-11-15 17:56:26.103132569 +0800
@@ -2694,3 +2694,14 @@
 #define PCI_DEVICE_ID_RME_DIGI32	0x9896
 #define PCI_DEVICE_ID_RME_DIGI32_PRO	0x9897
 #define PCI_DEVICE_ID_RME_DIGI32_8	0x9898
+
+#define PCI_VENDOR_ID_O2		0x1217
+#define PCI_DEVICE_ID_O2_6729		0x6729
+#define PCI_DEVICE_ID_O2_6730		0x673a
+#define PCI_DEVICE_ID_O2_6832		0x6832
+#define PCI_DEVICE_ID_O2_6836		0x6836
+#define PCI_DEVICE_ID_O2_8120		0x8120
+#define PCI_DEVICE_ID_O2_8220		0x8220
+#define PCI_DEVICE_ID_O2_8320		0x8320
+#define PCI_DEVICE_ID_O2_8321		0x8321
+#define PCI_DEVICE_ID_O2_8221		0x8221


Sdhci-pci.c

--- ../linux-2.6.32/drivers/mmc/host/sdhci-pci.c	2009-12-03
11:51:21.000000000 +0800
+++ sdhci-pci.c	2010-11-16 11:42:00.000000000 +0800
@@ -38,6 +38,13 @@

 #define MAX_SLOTS			8

+#define O2_SDMMC_LOCK_WP 0xD3
+#define O2_SDMMC_MULTI_VCC3V 0xEE
+#define O2_SDMMC_CLKREQ 0xEC
+#define O2_SDMMC_CAPABILITIES 0xE0
+#define O2_SDMMC_ADMA1 0xE2
+#define O2_SDMMC_ADMA2 0xE7
+#define O2_SDMMC_INFINITE_MODE 0xF1
 struct sdhci_pci_chip;
 struct sdhci_pci_slot;

@@ -112,6 +119,94 @@ static const struct sdhci_pci_fixes sdhc
 			  SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
 };

+static int o2_probe(struct sdhci_pci_chip *chip)
+{
+	int ret;
+	u8 scratch;
+
+	if ((chip->pdev->device == PCI_DEVICE_ID_O2_8220) ||
+	    (chip->pdev->device == PCI_DEVICE_ID_O2_8320) ||
+	    (chip->pdev->device == PCI_DEVICE_ID_O2_8321) ||
+	    (chip->pdev->device == PCI_DEVICE_ID_O2_8221))
+	    {
+		/* O2Micro's ADMA and releated function can't work on
default Linux SD driver.
+         * We need mark those related registers.
+         * - SET MULTI 3 to VCC3V#
+         * - Disable CLK_REQ# support after media DET.
+         * - Choose programmable settings
+         * - Enable SDMA
+         * - Disable ADMA1
+         * - Disable ADMA2
+         * - Disable the infinite transfer mode
+         */
+		ret = pci_read_config_byte(chip->pdev, O2_SDMMC_LOCK_WP,
&scratch);
+		if (ret)
+			return ret;
+
+		scratch &= 0x7f;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_LOCK_WP, scratch);
+
+		ret = pci_read_config_byte(chip->pdev,
O2_SDMMC_MULTI_VCC3V, &scratch);
+		if (ret)
+			return ret;
+
+		scratch = 0x08;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_MULTI_VCC3V, scratch);
+
+
+		ret = pci_read_config_byte(chip->pdev, O2_SDMMC_CLKREQ,
&scratch);
+		if (ret)
+			return ret;
+
+		scratch |= 0x20;
+		ret = pci_write_config_byte(chip->pdev, O2_SDMMC_CLKREQ,
scratch);
+
+		ret = pci_read_config_byte(chip->pdev,
O2_SDMMC_CAPABILITIES, &scratch);
+		if (ret)
+			return ret;
+
+		scratch |= 0x01;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_CAPABILITIES, scratch);
+
+		ret = pci_read_config_byte(chip->pdev,
O2_SDMMC_CAPABILITIES, &scratch);
+		if (ret)
+			return ret;
+
+		scratch = 0x73;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_CAPABILITIES, scratch);
+
+		ret = pci_read_config_byte(chip->pdev, O2_SDMMC_ADMA1,
&scratch);
+		if (ret)
+			return ret;
+
+		scratch = 0x39;
+		ret = pci_write_config_byte(chip->pdev, O2_SDMMC_ADMA1,
scratch);
+
+		ret = pci_read_config_byte(chip->pdev, O2_SDMMC_ADMA2,
&scratch);
+		if (ret)
+			return ret;
+
+		scratch = 0x08;
+		ret = pci_write_config_byte(chip->pdev, O2_SDMMC_ADMA2,
scratch);
+
+		ret = pci_read_config_byte(chip->pdev,
O2_SDMMC_INFINITE_MODE, &scratch);
+		if (ret)
+			return ret;
+
+		scratch |= 0x08;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_INFINITE_MODE, scratch);
+
+		ret = pci_read_config_byte(chip->pdev, O2_SDMMC_LOCK_WP,
&scratch);
+		if (ret)
+			return ret;
+
+		scratch |= 0x80;
+		ret = pci_write_config_byte(chip->pdev,
O2_SDMMC_LOCK_WP, scratch);
+
+		}
+	return 0;
+}
+
 static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
 {
 	u8 scratch;
@@ -275,6 +370,10 @@ static int jmicron_resume(struct sdhci_p
 	return 0;
 }

+static const struct sdhci_pci_fixes sdhci_o2 = {
+	.probe		= o2_probe,
+};
+
 static const struct sdhci_pci_fixes sdhci_jmicron = {
 	.probe		= jmicron_probe,

@@ -370,6 +469,46 @@ static const struct pci_device_id pci_id
 		.driver_data	= (kernel_ulong_t)&sdhci_via,
 	},

+	{
+		.vendor		= PCI_VENDOR_ID_O2,
+		.device		= PCI_DEVICE_ID_O2_8120,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= (kernel_ulong_t)&sdhci_o2,
+	},
+
+	{
+		.vendor		= PCI_VENDOR_ID_O2,
+		.device		= PCI_DEVICE_ID_O2_8220,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= (kernel_ulong_t)&sdhci_o2,
+	},
+
+	{
+		.vendor		= PCI_VENDOR_ID_O2,
+		.device		= PCI_DEVICE_ID_O2_8320,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= (kernel_ulong_t)&sdhci_o2,
+	},
+
+	{
+		.vendor		= PCI_VENDOR_ID_O2,
+		.device		= PCI_DEVICE_ID_O2_8221,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= (kernel_ulong_t)&sdhci_o2,
+	},
+
+	{
+		.vendor		= PCI_VENDOR_ID_O2,
+		.device		= PCI_DEVICE_ID_O2_8321,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= (kernel_ulong_t)&sdhci_o2,
+	},
+
 	{	/* Generic SD host controller */
 		PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8),
0xFFFF00)
 	},



Signed-off-by: Jennifer Li Developer <Jennifer.li@xxxxxxxxxxx>


Best regards,
Jennifer




Unless otherwise stated, this e-mail message does not constitute a solicitation to buy or sell any products or services, or to participate in any particular trading strategy. This e-mail message and any attachments are intended solely for the use of the individual or entity to which it is addressed and may contain information that is confidential or legally privileged. If you are not the intended recipient, you are hereby notified that any dissemination, distribution, copying or other use of this message or its attachments is strictly prohibited. If you have received this message in error, please notify the sender immediately and permanently delete this message and any attachments. O2Micro International Ltd., and its subsidiaries and affiliates, are neither liable for the proper and complete transmission of the information contained in this communication, the accuracy of the information contained therein, nor for any delay in its receipt.






Unless otherwise stated, this e-mail message does not constitute a solicitation to buy or sell any products or services, or to participate in any particular trading strategy. This e-mail message and any attachments are intended solely for the use of the individual or entity to which it is addressed and may contain information that is confidential or legally privileged. If you are not the intended recipient, you are hereby notified that any dissemination, distribution, copying or other use of this message or its attachments is strictly prohibited. If you have received this message in error, please notify the sender immediately and permanently delete this message and any attachments. O2Micro International Ltd., and its subsidiaries and affiliates, are neither liable for the proper and complete transmission of the information contained in this communication, the accuracy of the information contained therein, nor for any delay in its receipt.


Attachment: sdhci-pci_patch
Description: sdhci-pci_patch

Attachment: pci_ids_patch
Description: pci_ids_patch


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux